diff --git a/GUT.Schedule/GUT.Schedule.UWP/App.xaml b/GUT.Schedule/GUT.Schedule.UWP/App.xaml
deleted file mode 100644
index c653146..0000000
--- a/GUT.Schedule/GUT.Schedule.UWP/App.xaml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/GUT.Schedule/GUT.Schedule.UWP/MainPage.xaml.cs b/GUT.Schedule/GUT.Schedule.UWP/MainPage.xaml.cs
deleted file mode 100644
index 4a18192..0000000
--- a/GUT.Schedule/GUT.Schedule.UWP/MainPage.xaml.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using Windows.UI.Xaml.Controls;
-
-// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
-
-namespace GUTSchedule.UWP
-{
- ///
- /// An empty page that can be used on its own or navigated to within a Frame.
- ///
- public sealed partial class MainPage : Page
- {
- public MainPage()
- {
- InitializeComponent();
- }
- }
-}
\ No newline at end of file
diff --git a/GUT.Schedule/GUT.Schedule.UWP/MainPage.xaml b/GUT.Schedule/GUTSchedule.UWP/AboutPage.xaml
similarity index 54%
rename from GUT.Schedule/GUT.Schedule.UWP/MainPage.xaml
rename to GUT.Schedule/GUTSchedule.UWP/AboutPage.xaml
index 0fa2eb6..4c3305d 100644
--- a/GUT.Schedule/GUT.Schedule.UWP/MainPage.xaml
+++ b/GUT.Schedule/GUTSchedule.UWP/AboutPage.xaml
@@ -1,5 +1,5 @@
+
+
+
+
+
+
+
+
diff --git a/GUT.Schedule/GUTSchedule.UWP/AboutPage.xaml.cs b/GUT.Schedule/GUTSchedule.UWP/AboutPage.xaml.cs
new file mode 100644
index 0000000..0044457
--- /dev/null
+++ b/GUT.Schedule/GUTSchedule.UWP/AboutPage.xaml.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Navigation;
+
+// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace GUTSchedule.UWP
+{
+ ///
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ ///
+ public sealed partial class AboutPage : Page
+ {
+ public AboutPage()
+ {
+ this.InitializeComponent();
+ }
+ }
+}
diff --git a/GUT.Schedule/GUTSchedule.UWP/App.xaml b/GUT.Schedule/GUTSchedule.UWP/App.xaml
new file mode 100644
index 0000000..90e3fb9
--- /dev/null
+++ b/GUT.Schedule/GUTSchedule.UWP/App.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+ #ff8000
+
+
\ No newline at end of file
diff --git a/GUT.Schedule/GUT.Schedule.UWP/App.xaml.cs b/GUT.Schedule/GUTSchedule.UWP/App.xaml.cs
similarity index 92%
rename from GUT.Schedule/GUT.Schedule.UWP/App.xaml.cs
rename to GUT.Schedule/GUTSchedule.UWP/App.xaml.cs
index c62a7f4..eae0be4 100644
--- a/GUT.Schedule/GUT.Schedule.UWP/App.xaml.cs
+++ b/GUT.Schedule/GUTSchedule.UWP/App.xaml.cs
@@ -1,6 +1,7 @@
using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
+using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
@@ -20,6 +21,14 @@ namespace GUTSchedule.UWP
{
InitializeComponent();
Suspending += OnSuspending;
+ UnhandledException += OnError;
+ }
+
+ private async void OnError(object sender, UnhandledExceptionEventArgs e)
+ {
+ e.Handled = true;
+
+ await new MessageDialog(e.Message, e.GetType().ToString()).ShowAsync();
}
///
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Assets/LockScreenLogo.scale-200.png b/GUT.Schedule/GUTSchedule.UWP/Assets/LockScreenLogo.scale-200.png
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Assets/LockScreenLogo.scale-200.png
rename to GUT.Schedule/GUTSchedule.UWP/Assets/LockScreenLogo.scale-200.png
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Assets/SplashScreen.scale-200.png b/GUT.Schedule/GUTSchedule.UWP/Assets/SplashScreen.scale-200.png
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Assets/SplashScreen.scale-200.png
rename to GUT.Schedule/GUTSchedule.UWP/Assets/SplashScreen.scale-200.png
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Assets/Square150x150Logo.scale-200.png b/GUT.Schedule/GUTSchedule.UWP/Assets/Square150x150Logo.scale-200.png
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Assets/Square150x150Logo.scale-200.png
rename to GUT.Schedule/GUTSchedule.UWP/Assets/Square150x150Logo.scale-200.png
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Assets/Square44x44Logo.scale-200.png b/GUT.Schedule/GUTSchedule.UWP/Assets/Square44x44Logo.scale-200.png
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Assets/Square44x44Logo.scale-200.png
rename to GUT.Schedule/GUTSchedule.UWP/Assets/Square44x44Logo.scale-200.png
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/GUT.Schedule/GUTSchedule.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
rename to GUT.Schedule/GUTSchedule.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Assets/StoreLogo.png b/GUT.Schedule/GUTSchedule.UWP/Assets/StoreLogo.png
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Assets/StoreLogo.png
rename to GUT.Schedule/GUTSchedule.UWP/Assets/StoreLogo.png
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Assets/Wide310x150Logo.scale-200.png b/GUT.Schedule/GUTSchedule.UWP/Assets/Wide310x150Logo.scale-200.png
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Assets/Wide310x150Logo.scale-200.png
rename to GUT.Schedule/GUTSchedule.UWP/Assets/Wide310x150Logo.scale-200.png
diff --git a/GUT.Schedule/GUTSchedule.UWP/Calendar.cs b/GUT.Schedule/GUTSchedule.UWP/Calendar.cs
new file mode 100644
index 0000000..6d83946
--- /dev/null
+++ b/GUT.Schedule/GUTSchedule.UWP/Calendar.cs
@@ -0,0 +1,17 @@
+using GUTSchedule.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace GUTSchedule.UWP
+{
+ public static class Calendar
+ {
+ public static void Export(List schedule)
+ {
+
+ }
+ }
+}
diff --git a/GUT.Schedule/GUT.Schedule.UWP/GUTSchedule.UWP.csproj b/GUT.Schedule/GUTSchedule.UWP/GUTSchedule.UWP.csproj
similarity index 96%
rename from GUT.Schedule/GUT.Schedule.UWP/GUTSchedule.UWP.csproj
rename to GUT.Schedule/GUTSchedule.UWP/GUTSchedule.UWP.csproj
index d5ba151..f102441 100644
--- a/GUT.Schedule/GUT.Schedule.UWP/GUTSchedule.UWP.csproj
+++ b/GUT.Schedule/GUTSchedule.UWP/GUTSchedule.UWP.csproj
@@ -116,9 +116,13 @@
PackageReference
+
+ AboutPage.xaml
+
App.xaml
+
MainPage.xaml
@@ -144,6 +148,10 @@
MSBuild:Compile
Designer
+
+ Designer
+ MSBuild:Compile
+
MSBuild:Compile
Designer
diff --git a/GUT.Schedule/GUTSchedule.UWP/MainPage.xaml b/GUT.Schedule/GUTSchedule.UWP/MainPage.xaml
new file mode 100644
index 0000000..6fcf634
--- /dev/null
+++ b/GUT.Schedule/GUTSchedule.UWP/MainPage.xaml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GUT.Schedule/GUTSchedule.UWP/MainPage.xaml.cs b/GUT.Schedule/GUTSchedule.UWP/MainPage.xaml.cs
new file mode 100644
index 0000000..5727ada
--- /dev/null
+++ b/GUT.Schedule/GUTSchedule.UWP/MainPage.xaml.cs
@@ -0,0 +1,219 @@
+using GUTSchedule.Models;
+using System;
+using Windows.Security.Credentials;
+using Windows.System;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using Windows.UI.Popups;
+using System.Threading.Tasks;
+using Windows.ApplicationModel.Resources;
+using Windows.Storage;
+
+// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
+
+namespace GUTSchedule.UWP
+{
+ ///
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ ///
+ public sealed partial class MainPage : Page
+ {
+ private readonly PasswordVault vault = new PasswordVault();
+ private readonly ResourceLoader resources = ResourceLoader.GetForCurrentView();
+ static readonly ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
+
+ public static List<(string id, string name)> Faculties { get; set; }
+
+ public MainPage()
+ {
+ InitializeComponent();
+ startDate.Date = DateTime.Today;
+ endDate.Date = startDate.Date.Value.AddDays(6);
+
+ if (vault.FindAllByResource("xfox111.gutschedule") is IReadOnlyList credentials && credentials.Count > 0)
+ {
+ email.Text = credentials.First().UserName;
+ credentials.First().RetrievePassword();
+ password.Password = credentials.First().Password;
+ }
+
+ authorize.IsChecked = (bool?)settings.Values["Authorize"] ?? true;
+ rememberCredential.IsChecked = (bool?)settings.Values["RememberCredential"] ?? true;
+ reminder.SelectedIndex = (int?)settings.Values["Reminder"] ?? 1;
+ addGroupToTitle.IsChecked = (bool?)settings.Values["AddGroupToTitle"] ?? false;
+
+ faculty.ItemsSource = Faculties.Select(i => new ComboBoxItem
+ {
+ Content = i.name,
+ Tag = i.id
+ });
+ faculty.SelectedIndex = (int?)settings.Values["Faculty"] ?? 0;
+ course.SelectedIndex = (int?)settings.Values["Course"] ?? 0;
+ }
+
+ private async void AppBarButton_Click(object sender, RoutedEventArgs e)
+ {
+ switch (((FrameworkElement)sender).Tag)
+ {
+ case "clear":
+ break;
+ case "about":
+ Frame.Navigate(typeof(AboutPage));
+ break;
+ case "report":
+ await Launcher.LaunchUriAsync(new Uri("mailto:feedback@xfox111.net"));
+ break;
+ }
+ }
+
+ private void ChangeAuthorizationMethod(object sender, RoutedEventArgs e)
+ {
+ if (authorize.IsChecked.Value)
+ {
+ credentialMethod.Visibility = Visibility.Visible;
+ credentialMethod.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ credentialMethod.Visibility = Visibility.Collapsed;
+ credentialMethod.Visibility = Visibility.Visible;
+ }
+ }
+
+ private void SetTodayDate(object sender, RoutedEventArgs e) =>
+ startDate.Date = DateTime.Today;
+
+ private void SetEndDate(object sender, RoutedEventArgs e) =>
+ endDate.Date = startDate.Date.Value.AddDays((int)((FrameworkElement)sender).Tag);
+
+ private void SetForSemester(object sender, RoutedEventArgs e)
+ {
+ if (DateTime.Today.Month == 1)
+ endDate.Date = new DateTime(DateTime.Today.Year, 1, 31);
+ else if (DateTime.Today.Month > 8)
+ endDate.Date = new DateTime(DateTime.Today.Year + 1, 1, 31);
+ else
+ endDate.Date = new DateTime(DateTime.Today.Year, 8, 31);
+ }
+
+ private async void Export(object sender, RoutedEventArgs args)
+ {
+ errorPlaceholder.Visibility = Visibility.Collapsed;
+
+ if (startDate.Date > endDate.Date)
+ {
+ errorPlaceholder.Text = resources.GetString("invalidDateRangeError");
+ errorPlaceholder.Visibility = Visibility.Visible;
+ return;
+ }
+
+ ExportParameters exportParameters;
+
+ if (authorize.IsChecked.Value)
+ {
+ if (string.IsNullOrWhiteSpace(email.Text) || string.IsNullOrWhiteSpace(password.Password))
+ {
+ errorPlaceholder.Text = resources.GetString("invalidAuthorizationError");
+ errorPlaceholder.Visibility = Visibility.Visible;
+ return;
+ }
+
+ exportParameters = new CabinetExportParameters
+ {
+ Email = email.Text,
+ Password = password.Password,
+ EndDate = endDate.Date.Value.DateTime,
+ StartDate = startDate.Date.Value.DateTime
+ };
+
+ if (rememberCredential.IsChecked.Value)
+ vault.Add(new PasswordCredential("xfox111.gutschedule", email.Text, password.Password));
+ else
+ foreach (PasswordCredential credential in vault.FindAllByResource("xfox111.gutschedule"))
+ vault.Remove(credential);
+ }
+ else
+ {
+ if (group.Items.Count < 1)
+ {
+ errorPlaceholder.Text = resources.GetString("groupSelectionError");
+ errorPlaceholder.Visibility = Visibility.Visible;
+ return;
+ }
+
+ exportParameters = new DefaultExportParameters
+ {
+ EndDate = endDate.Date.Value.DateTime,
+ StartDate = startDate.Date.Value.DateTime,
+ Course = (course.SelectedIndex + 1).ToString(),
+ FacultyId = ((ComboBoxItem)faculty.SelectedItem).Tag as string,
+ GroupId = ((ComboBoxItem)group.SelectedItem).Tag as string
+ };
+ }
+
+ AddGroupToTitle = addGroupToTitle.IsChecked;
+ SelectedCalendarIndex = calendar.SelectedItemPosition;
+ Reminder = (reminder.SelectedIndex - 1) * 5;
+
+ loading.Visibility = Visibility.Visible;
+ try
+ {
+ status.Text = resources.GetString("loadingStatus");
+
+ List schedule = await Parser.GetSchedule(exportParameters);
+
+ status.Text = resources.GetString("calendarExportStatus");
+ Calendar.Export(schedule);
+
+ status.Text = resources.GetString("doneStatus");
+ await Task.Delay(1000);
+ }
+ catch (HttpRequestException e)
+ {
+ MessageDialog dialog = new MessageDialog(resources.GetString("connectionFailMessage"), e.Message);
+ dialog.Commands.Add(new UICommand(resources.GetString("repeat"), (command) => Export(sender, args)));
+ dialog.Commands.Add(new UICommand("OK", (command) => loading.Visibility = Visibility.Collapsed));
+
+ dialog.CancelCommandIndex = 1;
+ dialog.DefaultCommandIndex = 0;
+
+ await dialog.ShowAsync();
+ return;
+ }
+ catch (Exception e)
+ {
+ MessageDialog dialog = new MessageDialog(e.Message, e.GetType().ToString());
+ dialog.Commands.Add(new UICommand("OK", (command) => loading.Visibility = Visibility.Collapsed));
+
+ await dialog.ShowAsync();
+ }
+
+ loading.Visibility = Visibility.Collapsed;
+ }
+
+ private void Faculty_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+
+ }
+
+ private void Course_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+
+ }
+
+ private async void UpdateGroupsList()
+ {
+ List<(string id, string name)> groups = await Parser.GetGroups(Faculties[faculty.SelectedIndex].id, (course.SelectedIndex + 1).ToString());
+ group.ItemsSource = groups.Select(i => new ComboBoxItem
+ {
+ Content = i.name,
+ Tag = i.id
+ });
+
+ group.SelectedIndex = (int?)settings.Values["Group"] ?? 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Package.appxmanifest b/GUT.Schedule/GUTSchedule.UWP/Package.appxmanifest
similarity index 86%
rename from GUT.Schedule/GUT.Schedule.UWP/Package.appxmanifest
rename to GUT.Schedule/GUTSchedule.UWP/Package.appxmanifest
index 5be27c9..4ca5b5e 100644
--- a/GUT.Schedule/GUT.Schedule.UWP/Package.appxmanifest
+++ b/GUT.Schedule/GUTSchedule.UWP/Package.appxmanifest
@@ -15,7 +15,7 @@
GUT.Schedule.UWP
- Michael Gordeev
+ Michael "XFox" Gordeev
Assets\StoreLogo.png
@@ -32,10 +32,10 @@
Executable="$targetnametoken$.exe"
EntryPoint="GUT.Schedule.UWP.App">
@@ -45,5 +45,6 @@
+
\ No newline at end of file
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Properties/AssemblyInfo.cs b/GUT.Schedule/GUTSchedule.UWP/Properties/AssemblyInfo.cs
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Properties/AssemblyInfo.cs
rename to GUT.Schedule/GUTSchedule.UWP/Properties/AssemblyInfo.cs
diff --git a/GUT.Schedule/GUT.Schedule.UWP/Properties/Default.rd.xml b/GUT.Schedule/GUTSchedule.UWP/Properties/Default.rd.xml
similarity index 100%
rename from GUT.Schedule/GUT.Schedule.UWP/Properties/Default.rd.xml
rename to GUT.Schedule/GUTSchedule.UWP/Properties/Default.rd.xml
diff --git a/GUT.Schedule/GUT.Schedule.sln b/GUT.Schedule/GUTSchedule.sln
similarity index 97%
rename from GUT.Schedule/GUT.Schedule.sln
rename to GUT.Schedule/GUTSchedule.sln
index 0f3e3b8..beff3d0 100644
--- a/GUT.Schedule/GUT.Schedule.sln
+++ b/GUT.Schedule/GUTSchedule.sln
@@ -5,7 +5,7 @@ VisualStudioVersion = 16.0.29609.76
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUTSchedule.Droid", "GUTSchedule.Droid\GUTSchedule.Droid.csproj", "{A0471165-37F5-4309-8A92-42F1A6589EEE}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUTSchedule.UWP", "GUT.Schedule.UWP\GUTSchedule.UWP.csproj", "{AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUTSchedule.UWP", "GUTSchedule.UWP\GUTSchedule.UWP.csproj", "{AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GUTSchedule", "GUTSchedule\GUTSchedule.csproj", "{A6F6DE35-0EB4-4D11-9FF9-F4601595B639}"
EndProject
@@ -74,6 +74,8 @@ Global
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|x86.Build.0 = Release|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|x86.Deploy.0 = Release|Any CPU
{AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}.Debug|Any CPU.Build.0 = Debug|x86
+ {AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}.Debug|Any CPU.Deploy.0 = Debug|x86
{AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}.Debug|ARM.ActiveCfg = Debug|ARM
{AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}.Debug|ARM.Build.0 = Debug|ARM
{AC7E8D95-1E2A-409C-9A95-477C2AC8E47F}.Debug|ARM.Deploy.0 = Debug|ARM