Changes in core, HTML export added

This commit is contained in:
2023-05-28 17:43:48 +02:00
Unverified
parent 7fc6fc6229
commit 93cc11bd01
23 changed files with 165 additions and 103 deletions

View File

@@ -6,11 +6,11 @@ using System.Threading.Tasks;
namespace TimetableDesigner.Core namespace TimetableDesigner.Core
{ {
public abstract class BaseGroup : IUnit [Serializable]
public abstract class BaseGroup : Unit
{ {
#region FIELDS #region FIELDS
private string _name;
private string _shortName; private string _shortName;
#endregion #endregion
@@ -19,11 +19,6 @@ namespace TimetableDesigner.Core
#region PROPERTIES #region PROPERTIES
public string Name
{
get => _name;
set => _name = value;
}
public string ShortName public string ShortName
{ {
get => _shortName; get => _shortName;
@@ -36,9 +31,8 @@ namespace TimetableDesigner.Core
#region CONSTRUCTORS #region CONSTRUCTORS
public BaseGroup() public BaseGroup(ulong id) : base(id)
{ {
_name = string.Empty;
_shortName = string.Empty; _shortName = string.Empty;
} }

View File

@@ -8,11 +8,10 @@ using System.Threading.Tasks;
namespace TimetableDesigner.Core namespace TimetableDesigner.Core
{ {
[Serializable] [Serializable]
public class Classroom : IUnit public class Classroom : Unit
{ {
#region FIELDS #region FIELDS
private string _name;
private string _shortName; private string _shortName;
private string _description; private string _description;
private bool _isCapacityLimited; private bool _isCapacityLimited;
@@ -24,11 +23,6 @@ namespace TimetableDesigner.Core
#region PROPERTIES #region PROPERTIES
public string Name
{
get => _name;
set => _name = value;
}
public string ShortName public string ShortName
{ {
get => _shortName; get => _shortName;
@@ -56,9 +50,8 @@ namespace TimetableDesigner.Core
#region CONSTRUCTORS #region CONSTRUCTORS
public Classroom() public Classroom(ulong id) : base(id)
{ {
_name = string.Empty;
_shortName = string.Empty; _shortName = string.Empty;
_description = string.Empty; _description = string.Empty;
_isCapacityLimited = false; _isCapacityLimited = false;

View File

@@ -33,7 +33,7 @@ namespace TimetableDesigner.Core
#region CONSTRUCTORS #region CONSTRUCTORS
public Group() : base() public Group(ulong id) : base(id)
{ {
_description = string.Empty; _description = string.Empty;
_assignedSubgroups = new HashSet<Subgroup>(); _assignedSubgroups = new HashSet<Subgroup>();

View File

@@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TimetableDesigner.Core
{
public interface IUnit
{
#region PROPERTIES
string Name { get; }
#endregion
}
}

View File

@@ -11,7 +11,7 @@ namespace TimetableDesigner.Core
{ {
#region CONSTRUCTORS #region CONSTRUCTORS
public Subgroup() : base() public Subgroup(ulong id) : base(id)
{ } { }
#endregion #endregion

View File

@@ -8,11 +8,10 @@ using TimetableDesigner.Customs;
namespace TimetableDesigner.Core namespace TimetableDesigner.Core
{ {
[Serializable] [Serializable]
public class Teacher : IUnit public class Teacher : Unit
{ {
#region FIELDS #region FIELDS
private string _name;
private string _shortName; private string _shortName;
private string _description; private string _description;
private JsonSerializableDictionary<TimetableDay, TimetableSpanCollection> _availabilityHours; private JsonSerializableDictionary<TimetableDay, TimetableSpanCollection> _availabilityHours;
@@ -23,11 +22,6 @@ namespace TimetableDesigner.Core
#region PROPERTIES #region PROPERTIES
public string Name
{
get => _name;
set => _name = value;
}
public string ShortName public string ShortName
{ {
get => _shortName; get => _shortName;
@@ -38,7 +32,7 @@ namespace TimetableDesigner.Core
get => _description; get => _description;
set => _description = value; set => _description = value;
} }
public IDictionary<TimetableDay, TimetableSpanCollection> AvailabilityHours => _availabilityHours; public JsonSerializableDictionary<TimetableDay, TimetableSpanCollection> AvailabilityHours => _availabilityHours;
#endregion #endregion
@@ -46,9 +40,8 @@ namespace TimetableDesigner.Core
#region CONSTRUCTORS #region CONSTRUCTORS
public Teacher() public Teacher(ulong id) : base(id)
{ {
_name = string.Empty;
_shortName = string.Empty; _shortName = string.Empty;
_description = string.Empty; _description = string.Empty;
_availabilityHours = new JsonSerializableDictionary<TimetableDay, TimetableSpanCollection>(); _availabilityHours = new JsonSerializableDictionary<TimetableDay, TimetableSpanCollection>();

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>

View File

@@ -11,6 +11,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimetableDesigner.Tests", "
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimetableDesigner.Customs", "TimetableDesigner.Customs\TimetableDesigner.Customs.csproj", "{BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimetableDesigner.Customs", "TimetableDesigner.Customs\TimetableDesigner.Customs.csproj", "{BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TimetableDesigner.Export", "TimetableDesigner.Export\TimetableDesigner.Export.csproj", "{C97DB09E-CB48-432A-8BA4-108B21F2DF94}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -51,6 +53,14 @@ Global
{BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}.Release|Any CPU.Build.0 = Release|Any CPU {BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}.Release|Any CPU.Build.0 = Release|Any CPU
{BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}.Release|x64.ActiveCfg = Release|Any CPU {BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}.Release|x64.ActiveCfg = Release|Any CPU
{BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}.Release|x64.Build.0 = Release|Any CPU {BCA4CD04-FD49-4C28-9743-F4F6C1888E7E}.Release|x64.Build.0 = Release|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Debug|x64.ActiveCfg = Debug|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Debug|x64.Build.0 = Debug|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Release|Any CPU.Build.0 = Release|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Release|x64.ActiveCfg = Release|Any CPU
{C97DB09E-CB48-432A-8BA4-108B21F2DF94}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -26,6 +26,7 @@ namespace TimetableDesigner.Converters
{ typeof(TeacherEditorViewVM), typeof(TeacherEditorView) }, { typeof(TeacherEditorViewVM), typeof(TeacherEditorView) },
{ typeof(GroupEditorViewVM), typeof(GroupEditorView) }, { typeof(GroupEditorViewVM), typeof(GroupEditorView) },
{ typeof(TimetableEditorViewVM), typeof(TimetableEditorView) }, { typeof(TimetableEditorViewVM), typeof(TimetableEditorView) },
{ typeof(ExportHTMLViewVM), typeof(ExportHTMLView) },
}; };
#endregion #endregion

View File

@@ -538,6 +538,15 @@ namespace TimetableDesigner.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to HTML.
/// </summary>
public static string Main_Ribbon_Export_Timetable_HTML {
get {
return ResourceManager.GetString("Main.Ribbon.Export.Timetable.HTML", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to PDF. /// Looks up a localized string similar to PDF.
/// </summary> /// </summary>
@@ -664,24 +673,6 @@ namespace TimetableDesigner.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Import groups.
/// </summary>
public static string Main_Ribbon_Project_Import_ImportGroups {
get {
return ResourceManager.GetString("Main.Ribbon.Project.Import.ImportGroups", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Import teachers.
/// </summary>
public static string Main_Ribbon_Project_Import_ImportTeachers {
get {
return ResourceManager.GetString("Main.Ribbon.Project.Import.ImportTeachers", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to New. /// Looks up a localized string similar to New.
/// </summary> /// </summary>
@@ -988,6 +979,15 @@ namespace TimetableDesigner.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Export to HTML.
/// </summary>
public static string Tabs_ExportHTML {
get {
return ResourceManager.GetString("Tabs.ExportHTML", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Group editing. /// Looks up a localized string similar to Group editing.
/// </summary> /// </summary>
@@ -997,6 +997,15 @@ namespace TimetableDesigner.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Import classrooms.
/// </summary>
public static string Tabs_ImportClassroom {
get {
return ResourceManager.GetString("Tabs.ImportClassroom", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Project settings. /// Looks up a localized string similar to Project settings.
/// </summary> /// </summary>

View File

@@ -276,6 +276,9 @@
<data name="Main.Ribbon.Export.Timetable" xml:space="preserve"> <data name="Main.Ribbon.Export.Timetable" xml:space="preserve">
<value>Timetable</value> <value>Timetable</value>
</data> </data>
<data name="Main.Ribbon.Export.Timetable.HTML" xml:space="preserve">
<value>HTML</value>
</data>
<data name="Main.Ribbon.Export.Timetable.PDF" xml:space="preserve"> <data name="Main.Ribbon.Export.Timetable.PDF" xml:space="preserve">
<value>PDF</value> <value>PDF</value>
</data> </data>
@@ -318,12 +321,6 @@
<data name="Main.Ribbon.Project.Import.ImportClassrooms" xml:space="preserve"> <data name="Main.Ribbon.Project.Import.ImportClassrooms" xml:space="preserve">
<value>Import classrooms</value> <value>Import classrooms</value>
</data> </data>
<data name="Main.Ribbon.Project.Import.ImportGroups" xml:space="preserve">
<value>Import groups</value>
</data>
<data name="Main.Ribbon.Project.Import.ImportTeachers" xml:space="preserve">
<value>Import teachers</value>
</data>
<data name="Main.Ribbon.Project.New" xml:space="preserve"> <data name="Main.Ribbon.Project.New" xml:space="preserve">
<value>New</value> <value>New</value>
</data> </data>
@@ -426,9 +423,15 @@
<data name="Tabs.ClassroomEdit" xml:space="preserve"> <data name="Tabs.ClassroomEdit" xml:space="preserve">
<value>Classroom editing</value> <value>Classroom editing</value>
</data> </data>
<data name="Tabs.ExportHTML" xml:space="preserve">
<value>Export to HTML</value>
</data>
<data name="Tabs.GroupEdit" xml:space="preserve"> <data name="Tabs.GroupEdit" xml:space="preserve">
<value>Group editing</value> <value>Group editing</value>
</data> </data>
<data name="Tabs.ImportClassroom" xml:space="preserve">
<value>Import classrooms</value>
</data>
<data name="Tabs.ProjectSettings" xml:space="preserve"> <data name="Tabs.ProjectSettings" xml:space="preserve">
<value>Project settings</value> <value>Project settings</value>
</data> </data>

View File

@@ -4,6 +4,7 @@
<BitmapImage x:Key="CloseImage" UriSource="Images/Close.png"/> <BitmapImage x:Key="CloseImage" UriSource="Images/Close.png"/>
<BitmapImage x:Key="AutoscheduleImage" UriSource="Images/Autoschedule.png"/> <BitmapImage x:Key="AutoscheduleImage" UriSource="Images/Autoschedule.png"/>
<BitmapImage x:Key="AddImage" UriSource="Images/Add.png"/> <BitmapImage x:Key="AddImage" UriSource="Images/Add.png"/>
<BitmapImage x:Key="ImportImage" UriSource="Images/Import.png"/>
<BitmapImage x:Key="ProjectImage" UriSource="Images/Project.png"/> <BitmapImage x:Key="ProjectImage" UriSource="Images/Project.png"/>
<BitmapImage x:Key="ProjectSettingsImage" UriSource="Images/ProjectSettings.png"/> <BitmapImage x:Key="ProjectSettingsImage" UriSource="Images/ProjectSettings.png"/>
<BitmapImage x:Key="ClassroomImage" UriSource="Images/Classroom.png"/> <BitmapImage x:Key="ClassroomImage" UriSource="Images/Classroom.png"/>
@@ -33,4 +34,5 @@
<BitmapImage x:Key="RemoveWhiteImage" UriSource="Images/RemoveWhite.png"/> <BitmapImage x:Key="RemoveWhiteImage" UriSource="Images/RemoveWhite.png"/>
<BitmapImage x:Key="EditBlackImage" UriSource="Images/EditBlack.png"/> <BitmapImage x:Key="EditBlackImage" UriSource="Images/EditBlack.png"/>
<BitmapImage x:Key="EditWhiteImage" UriSource="Images/EditWhite.png"/> <BitmapImage x:Key="EditWhiteImage" UriSource="Images/EditWhite.png"/>
<BitmapImage x:Key="HTMLImage" UriSource="Images/HTML.png"/>
</ResourceDictionary> </ResourceDictionary>

View File

@@ -57,7 +57,7 @@ namespace TimetableDesigner.Services.FileDialog
List<string> extensionStrings = new List<string>(); List<string> extensionStrings = new List<string>();
foreach (string extension in type.Value) foreach (string extension in type.Value)
{ {
extensionStrings.Add($"*.{extension}"); extensionStrings.Add($"*.{extension.ToLower()}");
} }
sb.Append(string.Join(';', extensionStrings)); sb.Append(string.Join(';', extensionStrings));

View File

@@ -35,6 +35,8 @@
<None Remove="Resources\Images\GroupBlack.png" /> <None Remove="Resources\Images\GroupBlack.png" />
<None Remove="Resources\Images\GroupGrey.png" /> <None Remove="Resources\Images\GroupGrey.png" />
<None Remove="Resources\Images\GroupWhite.png" /> <None Remove="Resources\Images\GroupWhite.png" />
<None Remove="Resources\Images\HTML.png" />
<None Remove="Resources\Images\Import.png" />
<None Remove="Resources\Images\Info.png" /> <None Remove="Resources\Images\Info.png" />
<None Remove="Resources\Images\New.png" /> <None Remove="Resources\Images\New.png" />
<None Remove="Resources\Images\Open.png" /> <None Remove="Resources\Images\Open.png" />
@@ -91,6 +93,12 @@
<Content Include="Resources\Images\GroupWhite.png"> <Content Include="Resources\Images\GroupWhite.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Include="Resources\Images\HTML.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resources\Images\Import.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resources\Images\Info.png"> <Content Include="Resources\Images\Info.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
@@ -170,6 +178,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\TimetableDesigner.Core\TimetableDesigner.Core.csproj" /> <ProjectReference Include="..\TimetableDesigner.Core\TimetableDesigner.Core.csproj" />
<ProjectReference Include="..\TimetableDesigner.Customs\TimetableDesigner.Customs.csproj" /> <ProjectReference Include="..\TimetableDesigner.Customs\TimetableDesigner.Customs.csproj" />
<ProjectReference Include="..\TimetableDesigner.Export\TimetableDesigner.Export.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -11,7 +11,9 @@ namespace TimetableDesigner.ViewModels.Models.Base
{ {
#region PROPERTIES #region PROPERTIES
IUnit Unit { get; } Unit Unit { get; }
Guid Guid { get; }
ulong Id { get; }
string Name { get; } string Name { get; }
#endregion #endregion

View File

@@ -21,9 +21,11 @@ namespace TimetableDesigner.ViewModels.Models
#region PROPERTIES #region PROPERTIES
IUnit IUnitVM.Unit => _baseGroup; Unit IUnitVM.Unit => _baseGroup;
public BaseGroup BaseGroup => _baseGroup; public BaseGroup BaseGroup => _baseGroup;
public ulong Id => _baseGroup.Id;
public Guid Guid => _baseGroup.Guid;
public string Name public string Name
{ {
get => _baseGroup.Name; get => _baseGroup.Name;

View File

@@ -21,9 +21,11 @@ namespace TimetableDesigner.ViewModels.Models
#region PROPERTIES #region PROPERTIES
IUnit IUnitVM.Unit => _classroom; Unit IUnitVM.Unit => _classroom;
public Classroom Classroom => _classroom; public Classroom Classroom => _classroom;
public Guid Guid => _classroom.Guid;
public ulong Id => _classroom.Id;
public string Name public string Name
{ {
get => _classroom.Name; get => _classroom.Name;

View File

@@ -24,9 +24,11 @@ namespace TimetableDesigner.ViewModels.Models
#region PROPERTIES #region PROPERTIES
IUnit IUnitVM.Unit => _teacher; Unit IUnitVM.Unit => _teacher;
public Teacher Teacher => _teacher; public Teacher Teacher => _teacher;
public Guid Guid => _teacher.Guid;
public ulong Id => _teacher.Id;
public string Name public string Name
{ {
get => _teacher.Name; get => _teacher.Name;

View File

@@ -64,7 +64,7 @@ namespace TimetableDesigner.ViewModels.Views
#region CONSTRUCTORS #region CONSTRUCTORS
public ClassroomEditorViewVM() : this(new ClassroomVM(new Classroom())) public ClassroomEditorViewVM() : this(new ClassroomVM(new Classroom(0)))
{ } { }
public ClassroomEditorViewVM(ClassroomVM classroom) public ClassroomEditorViewVM(ClassroomVM classroom)

View File

@@ -93,7 +93,7 @@ namespace TimetableDesigner.ViewModels.Views
#region CONSTRUCTORS #region CONSTRUCTORS
public GroupEditorViewVM() : this(new GroupVM(new Group())) public GroupEditorViewVM() : this(new GroupVM(new Group(0)))
{ } { }
public GroupEditorViewVM(GroupVM group) public GroupEditorViewVM(GroupVM group)
@@ -117,7 +117,13 @@ namespace TimetableDesigner.ViewModels.Views
private void AddSubgroup() private void AddSubgroup()
{ {
Subgroup subgroup = new Subgroup() ulong id = 0;
if (_projectService.ProjectViewModel.Subgroups.Count() > 0)
{
id = _projectService.ProjectViewModel.Subgroups.Select(x => x.Id).Max() + 1;
}
Subgroup subgroup = new Subgroup(id)
{ {
Name = NewSubgroupName Name = NewSubgroupName
}; };

View File

@@ -29,6 +29,7 @@ using System.Windows.Forms;
using TimetableDesigner.Services.FileDialog; using TimetableDesigner.Services.FileDialog;
using TimetableDesigner.Services.Scheduler; using TimetableDesigner.Services.Scheduler;
using static TimetableDesigner.ViewModels.Views.TimetableEditorViewVM; using static TimetableDesigner.ViewModels.Views.TimetableEditorViewVM;
using TimetableDesigner.Views;
namespace TimetableDesigner.ViewModels.Views namespace TimetableDesigner.ViewModels.Views
{ {
@@ -80,6 +81,7 @@ namespace TimetableDesigner.ViewModels.Views
public ICommand RemoveSubgroupCommand { get; set; } public ICommand RemoveSubgroupCommand { get; set; }
public ICommand EditTimetableCommand { get; set; } public ICommand EditTimetableCommand { get; set; }
public ICommand AutoScheduleCommand { get; set; } public ICommand AutoScheduleCommand { get; set; }
public ICommand ExportHTMLCommand { get; set; }
// Others // Others
public string? Version { get; set; } public string? Version { get; set; }
@@ -116,6 +118,7 @@ namespace TimetableDesigner.ViewModels.Views
RemoveSubgroupCommand = new RelayCommand<SubgroupVM>(RemoveSubgroup); RemoveSubgroupCommand = new RelayCommand<SubgroupVM>(RemoveSubgroup);
EditTimetableCommand = new RelayCommand<IUnitVM>(EditTimetable); EditTimetableCommand = new RelayCommand<IUnitVM>(EditTimetable);
AutoScheduleCommand = new RelayCommand<object>(param => AutoSchedule()); AutoScheduleCommand = new RelayCommand<object>(param => AutoSchedule());
ExportHTMLCommand = new RelayCommand<object>(param => ExportHTML());
Version = Assembly.GetExecutingAssembly().GetName().Version?.ToString(); Version = Assembly.GetExecutingAssembly().GetName().Version?.ToString();
} }
@@ -212,7 +215,13 @@ namespace TimetableDesigner.ViewModels.Views
{ {
if (ProjectService.ProjectViewModel is not null) if (ProjectService.ProjectViewModel is not null)
{ {
Classroom classroom = new Classroom() ulong id = 0;
if (ProjectService.ProjectViewModel.Classrooms.Count() > 0)
{
id = ProjectService.ProjectViewModel.Classrooms.Select(x => x.Id).Max() + 1;
}
Classroom classroom = new Classroom(id)
{ {
Name = Resources.Global_DefaultClassroomName Name = Resources.Global_DefaultClassroomName
}; };
@@ -225,7 +234,13 @@ namespace TimetableDesigner.ViewModels.Views
{ {
if (ProjectService.ProjectViewModel is not null) if (ProjectService.ProjectViewModel is not null)
{ {
Teacher teacher = new Teacher() ulong id = 0;
if (ProjectService.ProjectViewModel.Teachers.Count() > 0)
{
id = ProjectService.ProjectViewModel.Teachers.Select(x => x.Id).Max() + 1;
}
Teacher teacher = new Teacher(id)
{ {
Name = Resources.Global_DefaultTeacherName Name = Resources.Global_DefaultTeacherName
}; };
@@ -238,7 +253,13 @@ namespace TimetableDesigner.ViewModels.Views
{ {
if (ProjectService.ProjectViewModel is not null) if (ProjectService.ProjectViewModel is not null)
{ {
Group group = new Group() ulong id = 0;
if (ProjectService.ProjectViewModel.Groups.Count() > 0)
{
id = ProjectService.ProjectViewModel.Groups.Select(x => x.Id).Max() + 1;
}
Group group = new Group(id)
{ {
Name = Resources.Global_DefaultGroupName Name = Resources.Global_DefaultGroupName
}; };
@@ -382,6 +403,20 @@ namespace TimetableDesigner.ViewModels.Views
} }
} }
private void ExportHTML()
{
if (ProjectService.ProjectViewModel is not null)
{
TabItem exportHTMLTab = new TabItem()
{
Title = Resources.Tabs_ExportHTML,
IsClosable = true,
ViewModel = new ExportHTMLViewVM()
};
_tabNavigationService.AddAndActivate(exportHTMLTab);
}
}
#endregion #endregion
} }
} }

View File

@@ -132,7 +132,7 @@ namespace TimetableDesigner.ViewModels.Views
#region CONSTRUCTORS #region CONSTRUCTORS
public TeacherEditorViewVM() : this(new TeacherVM(new Teacher())) public TeacherEditorViewVM() : this(new TeacherVM(new Teacher(0)))
{ } { }
public TeacherEditorViewVM(TeacherVM teacher) public TeacherEditorViewVM(TeacherVM teacher)

View File

@@ -9,7 +9,7 @@
<rib:RibbonWindow.Title> <rib:RibbonWindow.Title>
<MultiBinding StringFormat="Timetable Designer {0} ({1})"> <MultiBinding StringFormat="Timetable Designer {0} ({1})">
<Binding Path="Version"/> <Binding Path="Version"/>
<Binding Path="ProjectService.Project.Name" FallbackValue="{x:Static p:Resources.Global_NoProjectLoadedTitle}"/> <Binding Path="ProjectService.ProjectViewModel.Name" FallbackValue="{x:Static p:Resources.Global_NoProjectLoadedTitle}"/>
</MultiBinding> </MultiBinding>
</rib:RibbonWindow.Title> </rib:RibbonWindow.Title>
<rib:RibbonWindow.DataContext> <rib:RibbonWindow.DataContext>
@@ -50,39 +50,55 @@
</rib:DropDownButton.ItemContainerStyle> </rib:DropDownButton.ItemContainerStyle>
</rib:DropDownButton> </rib:DropDownButton>
</rib:RibbonGroupBox> </rib:RibbonGroupBox>
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_File_Save}" IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}"> <rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_File_Save}"
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_Save}" Icon="{StaticResource SaveImage}" Command="{Binding SaveProjectCommand}"/> IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_SaveAs}" Icon="{StaticResource SaveAsImage}" Command="{Binding SaveAsProjectCommand}"/> <rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_Save}"
Icon="{StaticResource SaveImage}"
Command="{Binding SaveProjectCommand}"/>
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_File_Save_SaveAs}"
Icon="{StaticResource SaveAsImage}"
Command="{Binding SaveAsProjectCommand}"/>
</rib:RibbonGroupBox> </rib:RibbonGroupBox>
</rib:RibbonTabItem> </rib:RibbonTabItem>
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Project}" IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}"> <rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Project}"
IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_Settings}"> <rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_Settings}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Settings_ProjectSettings}" <rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Settings_ProjectSettings}"
Command="{Binding ProjectSettingsCommand}" Command="{Binding ProjectSettingsCommand}"
Icon="{StaticResource ProjectSettingsImage}"/> Icon="{StaticResource ProjectSettingsImage}"/>
</rib:RibbonGroupBox> </rib:RibbonGroupBox>
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_New}"> <rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_New}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewClassroom}" Icon="{StaticResource ClassroomAddImage}" Command="{Binding NewClassroomCommand}"/> <rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewClassroom}"
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewTeacher}" Icon="{StaticResource TeacherAddImage}" Command="{Binding NewTeacherCommand}"/> Icon="{StaticResource ClassroomAddImage}"
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewGroup}" Icon="{StaticResource GroupAddImage}" Command="{Binding NewGroupCommand}"/> Command="{Binding NewClassroomCommand}"/>
</rib:RibbonGroupBox> <rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewTeacher}"
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_Import}"> Icon="{StaticResource TeacherAddImage}"
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Import_ImportClassrooms}"/> Command="{Binding NewTeacherCommand}"/>
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Import_ImportTeachers}"/> <rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_New_NewGroup}"
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Import_ImportGroups}"/> Icon="{StaticResource GroupAddImage}"
Command="{Binding NewGroupCommand}"/>
</rib:RibbonGroupBox> </rib:RibbonGroupBox>
<!--rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Project_Import}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Project_Import_ImportClassrooms}"
Icon="{StaticResource ImportImage}"
Command="{Binding ImportClassroomCommand}"/>
</rib:RibbonGroupBox-->
</rib:RibbonTabItem> </rib:RibbonTabItem>
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Edit}" IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}"> <rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Edit}"
IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Edit_Timetable}"> <rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Edit_Timetable}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Edit_Timetable_Autoschedule}" <rib:Button Header="{x:Static p:Resources.Main_Ribbon_Edit_Timetable_Autoschedule}"
Icon="{StaticResource AutoscheduleImage}" Icon="{StaticResource AutoscheduleImage}"
Command="{Binding AutoScheduleCommand}"/> Command="{Binding AutoScheduleCommand}"/>
</rib:RibbonGroupBox> </rib:RibbonGroupBox>
</rib:RibbonTabItem> </rib:RibbonTabItem>
<rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Export}" IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}"> <rib:RibbonTabItem Header="{x:Static p:Resources.Main_Ribbon_Export}"
IsEnabled="{Binding ProjectService.ProjectViewModel, Converter={StaticResource IsNotNullToBooleanConverter}}">
<rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable}"> <rib:RibbonGroupBox Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable}">
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable_PDF}"/> <rib:Button Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable_HTML}"
<rib:Button Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable_XLS}"/> Icon="{StaticResource HTMLImage}"
Command="{Binding ExportHTMLCommand}"/>
<!--rib:Button Header="{x:Static p:Resources.Main_Ribbon_Export_Timetable_XLS}"/-->
</rib:RibbonGroupBox> </rib:RibbonGroupBox>
</rib:RibbonTabItem> </rib:RibbonTabItem>
</rib:Ribbon> </rib:Ribbon>
@@ -258,7 +274,7 @@
CommandParameter="{Binding ProjectService.Errors/Unit}"/> CommandParameter="{Binding ProjectService.Errors/Unit}"/>
</DataGrid.InputBindings> </DataGrid.InputBindings>
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTemplateColumn Width="25"> <DataGridTemplateColumn Width="25" SortMemberPath="Type">
<DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellTemplate>
<DataTemplate> <DataTemplate>
<Image Width="20" Height="20"> <Image Width="20" Height="20">
@@ -281,7 +297,7 @@
</DataTemplate> </DataTemplate>
</DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> </DataGridTemplateColumn>
<DataGridTextColumn Header="{x:Static p:Resources.Main_Errors_Source}"> <DataGridTextColumn Header="{x:Static p:Resources.Main_Errors_Source}" SortMemberPath="Unit.Name">
<DataGridTextColumn.ElementStyle> <DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock"> <Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>