From 4b6604df5bce63caee7b01fb4d2972569d83ef3f Mon Sep 17 00:00:00 2001 From: Gary Sharp Date: Tue, 26 Aug 2014 16:27:37 +1000 Subject: [PATCH] Feature #69 #72: Noticeboard themes and filtering --- .../Modules/JobPreferencesConfiguration.cs | 16 + Disco.Services/Extensions/UIHelpers.cs | 24 + .../Jobs/Noticeboards/HeldDevices.cs | 2 +- .../Jobs/Noticeboards/HeldDevicesForUsers.cs | 2 +- .../Noticeboards/NoticeboardUpdatesHub.cs | 5 + .../Controllers/JobPreferencesController.cs | 14 + .../Controllers/JobPreferencesController.cs | 1 + .../Models/JobPreferences/IndexModel.cs | 28 +- .../Config/Views/JobPreferences/Index.cshtml | 1 + .../Views/JobPreferences/Index.generated.cs | 1 + .../Views/JobPreferences/Parts/Reports.cshtml | 249 ++++++ .../JobPreferences/Parts/Reports.generated.cs | 728 ++++++++++++++++++ .../Controllers/HeldDevicesController.cs | 33 +- .../Controllers/UserHeldDevicesController.cs | 33 +- .../UserHeldDevices/NoticeboardModel.cs | 8 + .../Views/HeldDevices/Noticeboard.cshtml | 72 +- .../HeldDevices/Noticeboard.generated.cs | 336 ++++---- .../Views/UserHeldDevices/Noticeboard.cshtml | 74 +- .../UserHeldDevices/Noticeboard.generated.cs | 334 ++++---- Disco.Web/ClientSource/Style/Config.css | 205 +++++ Disco.Web/ClientSource/Style/Config.less | 190 ++++- Disco.Web/ClientSource/Style/Config.min.css | 2 +- .../Style/Public/HeldDevicesNoticeboard.css | 307 +++++++- .../Style/Public/HeldDevicesNoticeboard.less | 111 ++- .../Public/HeldDevicesNoticeboard.min.css | 2 +- Disco.Web/Disco.Web.csproj | 10 + .../API.JobPreferencesController.generated.cs | 30 + ...nfig.JobPreferencesController.generated.cs | 2 + .../Public.HeldDevicesController.generated.cs | 27 +- ...lic.UserHeldDevicesController.generated.cs | 27 +- 30 files changed, 2491 insertions(+), 383 deletions(-) create mode 100644 Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.cshtml create mode 100644 Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.generated.cs create mode 100644 Disco.Web/Areas/Public/Models/UserHeldDevices/NoticeboardModel.cs diff --git a/Disco.Data/Configuration/Modules/JobPreferencesConfiguration.cs b/Disco.Data/Configuration/Modules/JobPreferencesConfiguration.cs index 04d6786e..784dde15 100644 --- a/Disco.Data/Configuration/Modules/JobPreferencesConfiguration.cs +++ b/Disco.Data/Configuration/Modules/JobPreferencesConfiguration.cs @@ -41,6 +41,22 @@ namespace Disco.Data.Configuration.Modules } } + /// + /// Theme used in noticeboards by default. + /// + /// + public string DefaultNoticeboardTheme + { + get { return Get("default"); } + set + { + if (string.IsNullOrWhiteSpace(value)) + throw new ArgumentNullException("DefaultNoticeboardTheme"); + + Set(value); + } + } + public LocationModes LocationMode { get { return Get(LocationModes.Unrestricted); } diff --git a/Disco.Services/Extensions/UIHelpers.cs b/Disco.Services/Extensions/UIHelpers.cs index fda11315..3a700f8a 100644 --- a/Disco.Services/Extensions/UIHelpers.cs +++ b/Disco.Services/Extensions/UIHelpers.cs @@ -17,6 +17,10 @@ namespace Disco.Services.Extensions /// User-selectable Colour Themes /// public static ReadOnlyCollection> ThemeColours { get; private set; } + /// + /// Noticeboard Colour Themes + /// + public static ReadOnlyCollection> NoticeboardThemes { get; private set; } /// /// Returns a randomly selected Icon using . @@ -221,6 +225,26 @@ namespace Disco.Services.Extensions new KeyValuePair("mauve" , "Mauve"), new KeyValuePair("sienna" , "Sienna") }.AsReadOnly(); + + // Noticeboard Themes + NoticeboardThemes = new List>(){ + new KeyValuePair("default" , "Default Blue"), + new KeyValuePair("default-soft" , "Default Blue Soft"), + new KeyValuePair("green" , "Green"), + new KeyValuePair("green-soft" , "Green Soft"), + new KeyValuePair("violet" , "Violet"), + new KeyValuePair("violet-soft" , "Violet Soft"), + new KeyValuePair("magenta" , "Magenta"), + new KeyValuePair("magenta-soft" , "Magenta Soft"), + new KeyValuePair("crimson" , "Crimson"), + new KeyValuePair("crimson-soft" , "Crimson Soft"), + new KeyValuePair("amber" , "Amber"), + new KeyValuePair("amber-soft" , "Amber Soft"), + new KeyValuePair("brown" , "Brown"), + new KeyValuePair("brown-soft" , "Brown Soft"), + new KeyValuePair("steel" , "Steel"), + new KeyValuePair("steel-soft" , "Steel Soft") + }.AsReadOnly(); } } } diff --git a/Disco.Services/Jobs/Noticeboards/HeldDevices.cs b/Disco.Services/Jobs/Noticeboards/HeldDevices.cs index e508f414..cbf330fd 100644 --- a/Disco.Services/Jobs/Noticeboards/HeldDevices.cs +++ b/Disco.Services/Jobs/Noticeboards/HeldDevices.cs @@ -209,7 +209,7 @@ namespace Disco.Services.Jobs.Noticeboards } } - private static IEnumerable GetHeldDevices(IQueryable query) + public static IEnumerable GetHeldDevices(IQueryable query) { var jobs = query .Where(j => diff --git a/Disco.Services/Jobs/Noticeboards/HeldDevicesForUsers.cs b/Disco.Services/Jobs/Noticeboards/HeldDevicesForUsers.cs index 3326020e..86aaa90c 100644 --- a/Disco.Services/Jobs/Noticeboards/HeldDevicesForUsers.cs +++ b/Disco.Services/Jobs/Noticeboards/HeldDevicesForUsers.cs @@ -38,7 +38,7 @@ namespace Disco.Services.Jobs.Noticeboards } } - private static IEnumerable GetHeldDevicesForUsers(IQueryable query) + public static IEnumerable GetHeldDevicesForUsers(IQueryable query) { var jobs = query .Where(j => diff --git a/Disco.Services/Jobs/Noticeboards/NoticeboardUpdatesHub.cs b/Disco.Services/Jobs/Noticeboards/NoticeboardUpdatesHub.cs index c1c537d7..eb81d052 100644 --- a/Disco.Services/Jobs/Noticeboards/NoticeboardUpdatesHub.cs +++ b/Disco.Services/Jobs/Noticeboards/NoticeboardUpdatesHub.cs @@ -36,5 +36,10 @@ namespace Disco.Services.Jobs.Noticeboards return base.OnConnected(); } + + public static void SetTheme(string ThemeName) + { + HubContext.Clients.All.setTheme(ThemeName); + } } } diff --git a/Disco.Web/Areas/API/Controllers/JobPreferencesController.cs b/Disco.Web/Areas/API/Controllers/JobPreferencesController.cs index 812bf925..4e4f6d0a 100644 --- a/Disco.Web/Areas/API/Controllers/JobPreferencesController.cs +++ b/Disco.Web/Areas/API/Controllers/JobPreferencesController.cs @@ -35,6 +35,20 @@ namespace Disco.Web.Areas.API.Controllers return Json("OK", JsonRequestBehavior.AllowGet); } + [DiscoAuthorize(Claims.Config.JobPreferences.Configure)] + public virtual ActionResult UpdateDefaultNoticeboardTheme(string DefaultNoticeboardTheme, bool redirect = false) + { + Database.DiscoConfiguration.JobPreferences.DefaultNoticeboardTheme = DefaultNoticeboardTheme; + Database.SaveChanges(); + + Disco.Services.Jobs.Noticeboards.NoticeboardUpdatesHub.SetTheme(DefaultNoticeboardTheme); + + if (redirect) + return RedirectToAction(MVC.Config.JobPreferences.Index()); + else + return Json("OK", JsonRequestBehavior.AllowGet); + } + [DiscoAuthorize(Claims.Config.JobPreferences.Configure)] public virtual ActionResult UpdateLocationMode(LocationModes LocationMode, bool redirect = false) { diff --git a/Disco.Web/Areas/Config/Controllers/JobPreferencesController.cs b/Disco.Web/Areas/Config/Controllers/JobPreferencesController.cs index 6c621ee0..b726286e 100644 --- a/Disco.Web/Areas/Config/Controllers/JobPreferencesController.cs +++ b/Disco.Web/Areas/Config/Controllers/JobPreferencesController.cs @@ -19,6 +19,7 @@ namespace Disco.Web.Areas.Config.Controllers { LongRunningJobDaysThreshold = Database.DiscoConfiguration.JobPreferences.LongRunningJobDaysThreshold, StaleJobMinutesThreshold = Database.DiscoConfiguration.JobPreferences.StaleJobMinutesThreshold, + DefaultNoticeboardTheme = Database.DiscoConfiguration.JobPreferences.DefaultNoticeboardTheme, LocationMode = Database.DiscoConfiguration.JobPreferences.LocationMode, LocationList = Database.DiscoConfiguration.JobPreferences.LocationList }; diff --git a/Disco.Web/Areas/Config/Models/JobPreferences/IndexModel.cs b/Disco.Web/Areas/Config/Models/JobPreferences/IndexModel.cs index 9e473880..1ea59e87 100644 --- a/Disco.Web/Areas/Config/Models/JobPreferences/IndexModel.cs +++ b/Disco.Web/Areas/Config/Models/JobPreferences/IndexModel.cs @@ -1,11 +1,11 @@ -using Disco.Models.BI.Job; +using Disco.Data.Repository; +using Disco.Models.BI.Job; using Disco.Models.UI.Config.JobPreferences; +using Disco.Services.Extensions; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; -using System.Web; -using System.Web.Mvc; namespace Disco.Web.Areas.Config.Models.JobPreferences { @@ -13,9 +13,31 @@ namespace Disco.Web.Areas.Config.Models.JobPreferences { public int LongRunningJobDaysThreshold { get; set; } public int StaleJobMinutesThreshold { get; set; } + public string DefaultNoticeboardTheme { get; set; } public LocationModes LocationMode { get; set; } public List LocationList { get; set; } + public List> DefaultNoticeboardThemeOptions() + { + return UIHelpers.NoticeboardThemes.ToList(); + } + + public Lazy> DeviceProfiles = new Lazy>(() => + { + using (var database = new DiscoDataContext()) + { + return database.DeviceProfiles.OrderBy(a => a.Description).ToList(); + } + }); + + public Lazy> OrganisationAddresses = new Lazy>(() => + { + using (var database = new DiscoDataContext()) + { + return database.DiscoConfiguration.OrganisationAddresses.Addresses.OrderBy(a => a.Name).ToList(); + } + }); + public List> LongRunningJobDaysThresholdOptions() { var options = new List>() { diff --git a/Disco.Web/Areas/Config/Views/JobPreferences/Index.cshtml b/Disco.Web/Areas/Config/Views/JobPreferences/Index.cshtml index 07bc2b9d..1543b397 100644 --- a/Disco.Web/Areas/Config/Views/JobPreferences/Index.cshtml +++ b/Disco.Web/Areas/Config/Views/JobPreferences/Index.cshtml @@ -12,5 +12,6 @@ Html.BundleDeferred("~/ClientScripts/Modules/Disco-AjaxHelperIcons"); } Html.RenderPartial(MVC.Config.JobPreferences.Views.Parts.General); + Html.RenderPartial(MVC.Config.JobPreferences.Views.Parts.Reports); Html.RenderPartial(MVC.Config.JobPreferences.Views.Parts.Locations); } \ No newline at end of file diff --git a/Disco.Web/Areas/Config/Views/JobPreferences/Index.generated.cs b/Disco.Web/Areas/Config/Views/JobPreferences/Index.generated.cs index d80bec31..bed7e9c1 100644 --- a/Disco.Web/Areas/Config/Views/JobPreferences/Index.generated.cs +++ b/Disco.Web/Areas/Config/Views/JobPreferences/Index.generated.cs @@ -59,6 +59,7 @@ namespace Disco.Web.Areas.Config.Views.JobPreferences Html.BundleDeferred("~/ClientScripts/Modules/Disco-AjaxHelperIcons"); } Html.RenderPartial(MVC.Config.JobPreferences.Views.Parts.General); + Html.RenderPartial(MVC.Config.JobPreferences.Views.Parts.Reports); Html.RenderPartial(MVC.Config.JobPreferences.Views.Parts.Locations); diff --git a/Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.cshtml b/Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.cshtml new file mode 100644 index 00000000..ca30eada --- /dev/null +++ b/Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.cshtml @@ -0,0 +1,249 @@ +@model Disco.Web.Areas.Config.Models.JobPreferences.IndexModel +@{ + Authorization.Require(Claims.Config.JobPreferences.Show); + + var canConfig = Authorization.Has(Claims.Config.JobPreferences.Configure); +} +
+

Report Preferences

+ + + + + + + + + +
Noticeboard Default Theme: + @if (canConfig) + { + @Html.DropDownListFor(model => model.DefaultNoticeboardTheme, Model.DefaultNoticeboardThemeOptions().Select(o => new SelectListItem() { Value = o.Key, Text = o.Value })) + @AjaxHelpers.AjaxSave() + @AjaxHelpers.AjaxLoader() + + } + else + { + @Model.DefaultNoticeboardThemeOptions().First(o => o.Key == Model.DefaultNoticeboardTheme).Value + } +
+
Noticeboard Heading
+
Column One
+
Column Two
+
Column Three
+
+
+
+
+
  + +
+

+ Report Links can be created which override the default theme and filter the data shown. +

+
+
+
+
+

Report

+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+

Noticeboard Theme

+ @Html.DropDownList("Config_ReportPrefs_Builder_Theme", new SelectListItem[] { new SelectListItem() { Value = "", Text = "", Selected = true } }.Concat(Model.DefaultNoticeboardThemeOptions().Select(o => new SelectListItem() { Value = o.Key, Text = o.Value }))) +
+
+

Filter

+ +
+
+ + +
+
+
    + @foreach (var deviceProfile in Model.DeviceProfiles.Value) + { +
  • +
  • + } +
+
+
+
    + @foreach (var address in Model.OrganisationAddresses.Value) + { +
  • +
  • + } +
+
+
+
+
+
+ + + +
+
+ +
+
diff --git a/Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.generated.cs b/Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.generated.cs new file mode 100644 index 00000000..40b135d0 --- /dev/null +++ b/Disco.Web/Areas/Config/Views/JobPreferences/Parts/Reports.generated.cs @@ -0,0 +1,728 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34014 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Disco.Web.Areas.Config.Views.JobPreferences.Parts +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using System.Web; + using System.Web.Helpers; + using System.Web.Mvc; + using System.Web.Mvc.Ajax; + using System.Web.Mvc.Html; + using System.Web.Routing; + using System.Web.Security; + using System.Web.UI; + using System.Web.WebPages; + using Disco; + using Disco.BI.Extensions; + using Disco.Models.Repository; + using Disco.Services; + using Disco.Services.Authorization; + using Disco.Services.Web; + using Disco.Web; + using Disco.Web.Extensions; + + [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")] + [System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/JobPreferences/Parts/Reports.cshtml")] + public partial class Reports : Disco.Services.Web.WebViewPage + { + public Reports() + { + } + public override void Execute() + { + + #line 2 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + + Authorization.Require(Claims.Config.JobPreferences.Show); + + var canConfig = Authorization.Has(Claims.Config.JobPreferences.Configure); + + + #line default + #line hidden +WriteLiteral("\r\n\r\n

Report Preferences

\r\n \r\n \r\n Noticeboard Default Theme:\r\n \r\n \r\n \r\n \r\n " + +" \r\n \r\n \r\n
"); + + + #line 13 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + if (canConfig) + { + + + #line default + #line hidden + + #line 15 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(Html.DropDownListFor(model => model.DefaultNoticeboardTheme, Model.DefaultNoticeboardThemeOptions().Select(o => new SelectListItem() { Value = o.Key, Text = o.Value }))); + + + #line default + #line hidden + + #line 15 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + + + + #line default + #line hidden + + #line 16 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(AjaxHelpers.AjaxSave()); + + + #line default + #line hidden + + #line 16 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + + + + #line default + #line hidden + + #line 17 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(AjaxHelpers.AjaxLoader()); + + + #line default + #line hidden + + #line 17 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + + + + #line default + #line hidden +WriteLiteral(" + $(function () { + $element = $('#DefaultNoticeboardTheme'); + + document.DiscoFunctions.PropertyChangeHelper( + $element, + null, + '"); + + + #line 25 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(Url.Action(MVC.API.JobPreferences.UpdateDefaultNoticeboardTheme())); + + + #line default + #line hidden +WriteLiteral(@"', + 'DefaultNoticeboardTheme'); + + $element.change(function () { + $('#Config_ReportPrefs_Preview').attr('class', 'theme-' + $(this).val()); + }); + }); + +"); + + + #line 33 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + } + else + { + + + #line default + #line hidden + + #line 36 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(Model.DefaultNoticeboardThemeOptions().First(o => o.Key == Model.DefaultNoticeboardTheme).Value); + + + #line default + #line hidden + + #line 36 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + + } + + + #line default + #line hidden +WriteLiteral(" (Model.DefaultNoticeboardTheme + + #line default + #line hidden +, 1708), false) +); + +WriteLiteral(">\r\n Noticeboard Heading\r\n Column One\r\n Column Two\r\n Column Three\r\n \r\n \r\n \r\n" + +" \r\n
 \r\n Link Builder\r\n \r\n \r\n Report Links can be created which override the default theme and filter the " + +"data shown.\r\n

\r\n \r\n <" + +"div"); + +WriteLiteral(" id=\"Config_ReportPrefs_Builder\""); + +WriteLiteral(" title=\"Report Link Builder\""); + +WriteLiteral(" class=\"dialog\""); + +WriteLiteral(">\r\n
\r\n \r\n

Report

\r\n \r\n
  • \r\n
  • \r\n
  • \r\n " + +"
  • \r\n
  • \r\n " + +"
  • \r\n " + +"
  • \r" + +"\n \r\n \r\n " + +" \r\n

    Noticeboard Theme

    \r\n"); + +WriteLiteral(" "); + + + #line 79 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(Html.DropDownList("Config_ReportPrefs_Builder_Theme", new SelectListItem[] { new SelectListItem() { Value = "", Text = "", Selected = true } }.Concat(Model.DefaultNoticeboardThemeOptions().Select(o => new SelectListItem() { Value = o.Key, Text = o.Value })))); + + + #line default + #line hidden +WriteLiteral("\r\n \r\n \r\n

    Filter

    \r\n \r\n <None>\r\n Device Profile\r\n Device Profile Address\r\n \r\n " + +" \r\n \r\n Include\r\n Exclude\r\n \r\n " + +" \r\n \r\n"); + + + #line 95 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + + + #line default + #line hidden + + #line 95 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + foreach (var deviceProfile in Model.DeviceProfiles.Value) + { + + + #line default + #line hidden +WriteLiteral("
  • \r\n " + +" (deviceProfile.Id + + #line default + #line hidden +, 6619), false) +); + +WriteLiteral(" type=\"checkbox\""); + +WriteAttribute("value", Tuple.Create(" value=\"", 6655), Tuple.Create("\"", 6680) + + #line 98 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + , Tuple.Create(Tuple.Create("", 6663), Tuple.Create(deviceProfile.Id + + #line default + #line hidden +, 6663), false) +); + +WriteLiteral(" />(deviceProfile.Id + + #line default + #line hidden +, 6726), false) +); + +WriteLiteral(">"); + + + #line 98 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(deviceProfile.Description); + + + #line default + #line hidden +WriteLiteral("
  • \r\n"); + + + #line 99 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n " + +"\r\n \r\n \r\n"); + + + #line 104 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + + + #line default + #line hidden + + #line 104 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + foreach (var address in Model.OrganisationAddresses.Value) + { + + + #line default + #line hidden +WriteLiteral("
  • \r\n " + +" (address.Id + + #line default + #line hidden +, 7334), false) +); + +WriteLiteral(" type=\"checkbox\""); + +WriteAttribute("value", Tuple.Create(" value=\"", 7364), Tuple.Create("\"", 7390) + + #line 107 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + , Tuple.Create(Tuple.Create("", 7372), Tuple.Create(address.ShortName + + #line default + #line hidden +, 7372), false) +); + +WriteLiteral(" />(address.Id + + #line default + #line hidden +, 7436), false) +); + +WriteLiteral(">"); + + + #line 107 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(address.Name); + + + #line default + #line hidden +WriteLiteral(" ("); + + + #line 107 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + Write(address.ShortName); + + + #line default + #line hidden +WriteLiteral(")
  • \r\n"); + + + #line 108 "..\..\Areas\Config\Views\JobPreferences\Parts\Reports.cshtml" + } + + + #line default + #line hidden +WriteLiteral(" \r\n " + +"\r\n \r\n \r\n " + +" \r\n \r\n \r\n " + +" \r\n \r\n \r\n \r\n \r\n $(function () {\r\n var dialog, url" + +";\r\n\r\n function updateUrl() {\r\n " + +" var theme = null;\r\n var filter = null;\r\n " + +" var filterMethod = null;\r\n var filter" + +"Value = null;\r\n\r\n var report = dialog.find(\'.report i" + +"nput:checked\');\r\n if (report.length > 0) {\r\n " + +" url = report.attr(\'data-url\');\r\n\r\n " + +" if (report.hasClass(\'themeable\')) {\r\n " + +" theme = dialog.find(\'.theme > select\').val();\r\n " + +" }\r\n\r\n filter = dialog.find(\'.filter > select\').v" + +"al();\r\n\r\n if (!!filter) {\r\n " + +" filterMethod = dialog.find(\'.filter .method input:checked\').val();" + +"\r\n\r\n filterValue = dialog\r\n " + +" .find(\'.filter .filter-\' + filter)\r\n " + +" .find(\'input:checked\')\r\n " + +" .map(function (index, element) { return $(element).val(); })\r\n " + +" .toArray().join(\',\');\r\n }" + +"\r\n\r\n if (!!theme || !!filter) {\r\n " + +" url += \'?\';\r\n\r\n if (!!the" + +"me)\r\n url += \'theme=\' + theme;\r\n\r\n " + +" if (!!theme && !!filter)\r\n " + +" url += \'&\';\r\n\r\n if (!!filter)\r" + +"\n url += filter + filterMethod + \'=\' + fi" + +"lterValue;\r\n }\r\n }\r\n\r\n" + +" $(\'#Config_ReportPrefs_Builder_Buttonpane\').find(\'te" + +"xtarea\').val(url);\r\n $(\'#Config_ReportPrefs_Builder_B" + +"uttonpane\').find(\'.fa-external-link\').closest(\'a\').attr(\'href\', url);\r\n " + +" }\r\n\r\n $(\'#Config_ReportPrefs_Builder_Butto" + +"n\').click(function () {\r\n\r\n if (!dialog) {\r\n " + +" dialog = $(\'#Config_ReportPrefs_Builder\').dialog({\r\n " + +" resizable: false,\r\n " + +" modal: true,\r\n autoOpen: false,\r\n " + +" width: 550,\r\n m" + +"axHeight: 520,\r\n buttons: {\r\n " + +" Close: function () {\r\n " + +" dialog.dialog(\'close\');\r\n }\r\n " + +" }\r\n });\r\n\r\n " + +" dialog.find(\'.report\').on(\'change\', \'input\', functio" + +"n () {\r\n var $this = $(this);\r\n " + +" var $theme = dialog.find(\'.theme\');\r\n\r\n " + +" if ($this.hasClass(\'themeable\'))\r\n " + +" $theme.slideDown();\r\n else\r\n " + +" $theme.slideUp();\r\n\r\n " + +" updateUrl();\r\n });\r\n\r\n " + +" dialog.find(\'#Config_ReportPrefs_Builder_Theme\').change(updateUr" + +"l);\r\n\r\n dialog.find(\'#Config_ReportPrefs_Builder_" + +"Filter\').change(function () {\r\n var $this = $" + +"(this);\r\n var $filter = dialog.find(\'.options" + +"\');\r\n\r\n if (!$this.val())\r\n " + +" $filter.slideUp();\r\n el" + +"se {\r\n $filter.find(\'.filter-option\').hid" + +"e();\r\n $filter.show();\r\n " + +" $filter.find(\'.filter-\' + $this.val()).slideDown();\r\n " + +" }\r\n\r\n updateU" + +"rl();\r\n });\r\n\r\n di" + +"alog.find(\'.filter .options\').on(\'click\', \'input\', updateUrl);\r\n\r\n " + +" var $buttonpane = dialog.closest(\'.ui-dialog\').children(\'.ui-d" + +"ialog-buttonpane\');\r\n $buttonpane.attr(\'id\', \'Con" + +"fig_ReportPrefs_Builder_Buttonpane\').append(dialog.children(\'.output\'));\r\n\r\n " + +" $buttonpane.find(\'textarea\').focus(function () {\r\n " + +" $(this).select();\r\n " + +" });\r\n\r\n\r\n var $clipboard = $buttonpane.find(" + +"\'.fa-clipboard\');\r\n \r\n " + +" if (!!window.clipboardData) {\r\n $clipboa" + +"rd.click(function () {\r\n window.clipboard" + +"Data.setData(\'Text\', url);\r\n alert(\'Link " + +"copied to Clipboard\');\r\n return false;\r\n " + +" });\r\n } else {" + +"\r\n $clipboard.hide();\r\n " + +" }\r\n\r\n }\r\n\r\n dial" + +"og.dialog(\'open\');\r\n\r\n updateUrl();\r\n\r\n " + +" return false;\r\n });\r\n\r\n " + +"});\r\n \r\n
    \r\n" + +"\r\n"); + + } + } +} +#pragma warning restore 1591 diff --git a/Disco.Web/Areas/Public/Controllers/HeldDevicesController.cs b/Disco.Web/Areas/Public/Controllers/HeldDevicesController.cs index 069f9727..a1733668 100644 --- a/Disco.Web/Areas/Public/Controllers/HeldDevicesController.cs +++ b/Disco.Web/Areas/Public/Controllers/HeldDevicesController.cs @@ -1,5 +1,8 @@ -using Disco.Services.Jobs.Noticeboards; +using Disco.Models.Repository; +using Disco.Services.Jobs.Noticeboards; using Disco.Services.Web; +using Disco.Web.Areas.Public.Models.UserHeldDevices; +using System.Collections.Generic; using System.Linq; using System.Web.Mvc; @@ -7,9 +10,26 @@ namespace Disco.Web.Areas.Public.Controllers { public partial class HeldDevicesController : DatabaseController { - public virtual ActionResult Index() + public virtual ActionResult Index(List DeviceProfileInclude, List DeviceProfileExclude, List DeviceAddressInclude, List DeviceAddressExclude) { - var m = Disco.Services.Jobs.Noticeboards.HeldDevices.GetHeldDevices(Database); + IQueryable query = Database.Jobs; + + if (DeviceProfileInclude != null) + query = query.Where(j => DeviceProfileInclude.Contains(j.Device.DeviceProfileId)); + if (DeviceProfileExclude != null) + query = query.Where(j => !DeviceProfileExclude.Contains(j.Device.DeviceProfileId)); + if (DeviceAddressInclude != null && DeviceAddressInclude.Count > 0) + { + var addressIds = Database.DiscoConfiguration.OrganisationAddresses.Addresses.Where(a => DeviceAddressInclude.Contains(a.ShortName)).Select(a => a.Id).ToList(); + query = query.Where(j => addressIds.Contains(j.Device.DeviceProfile.DefaultOrganisationAddress)); + } + if (DeviceAddressExclude != null && DeviceAddressExclude.Count > 0) + { + var addressIds = Database.DiscoConfiguration.OrganisationAddresses.Addresses.Where(a => DeviceAddressExclude.Contains(a.ShortName)).Select(a => (int?)a.Id).ToList(); + query = query.Where(j => j.Device.DeviceProfile.DefaultOrganisationAddress == null || !addressIds.Contains(j.Device.DeviceProfile.DefaultOrganisationAddress)); + } + + var m = Disco.Services.Jobs.Noticeboards.HeldDevices.GetHeldDevices(query); return View(m); } @@ -38,7 +58,12 @@ namespace Disco.Web.Areas.Public.Controllers public virtual ActionResult Noticeboard() { - return View(); + var model = new NoticeboardModel() + { + DefaultTheme = Database.DiscoConfiguration.JobPreferences.DefaultNoticeboardTheme + }; + + return View(model); } public virtual ActionResult HeldDevice(string id) diff --git a/Disco.Web/Areas/Public/Controllers/UserHeldDevicesController.cs b/Disco.Web/Areas/Public/Controllers/UserHeldDevicesController.cs index d74c734f..6e4b7f1d 100644 --- a/Disco.Web/Areas/Public/Controllers/UserHeldDevicesController.cs +++ b/Disco.Web/Areas/Public/Controllers/UserHeldDevicesController.cs @@ -1,5 +1,8 @@ -using Disco.Services.Jobs.Noticeboards; +using Disco.Models.Repository; +using Disco.Services.Jobs.Noticeboards; using Disco.Services.Web; +using Disco.Web.Areas.Public.Models.UserHeldDevices; +using System.Collections.Generic; using System.Linq; using System.Web.Mvc; @@ -7,9 +10,26 @@ namespace Disco.Web.Areas.Public.Controllers { public partial class UserHeldDevicesController : DatabaseController { - public virtual ActionResult Index() + public virtual ActionResult Index(List DeviceProfileInclude, List DeviceProfileExclude, List DeviceAddressInclude, List DeviceAddressExclude) { - var m = Disco.Services.Jobs.Noticeboards.HeldDevicesForUsers.GetHeldDevicesForUsers(Database); + IQueryable query = Database.Jobs; + + if (DeviceProfileInclude != null) + query = query.Where(j => DeviceProfileInclude.Contains(j.Device.DeviceProfileId)); + if (DeviceProfileExclude != null) + query = query.Where(j => !DeviceProfileExclude.Contains(j.Device.DeviceProfileId)); + if (DeviceAddressInclude != null && DeviceAddressInclude.Count > 0) + { + var addressIds = Database.DiscoConfiguration.OrganisationAddresses.Addresses.Where(a => DeviceAddressInclude.Contains(a.ShortName)).Select(a => a.Id).ToList(); + query = query.Where(j => addressIds.Contains(j.Device.DeviceProfile.DefaultOrganisationAddress)); + } + if (DeviceAddressExclude != null && DeviceAddressExclude.Count > 0) + { + var addressIds = Database.DiscoConfiguration.OrganisationAddresses.Addresses.Where(a => DeviceAddressExclude.Contains(a.ShortName)).Select(a => (int?)a.Id).ToList(); + query = query.Where(j => j.Device.DeviceProfile.DefaultOrganisationAddress == null || !addressIds.Contains(j.Device.DeviceProfile.DefaultOrganisationAddress)); + } + + var m = Disco.Services.Jobs.Noticeboards.HeldDevicesForUsers.GetHeldDevicesForUsers(query); return View(m); } @@ -38,7 +58,12 @@ namespace Disco.Web.Areas.Public.Controllers public virtual ActionResult Noticeboard() { - return View(); + var model = new NoticeboardModel() + { + DefaultTheme = Database.DiscoConfiguration.JobPreferences.DefaultNoticeboardTheme + }; + + return View(model); } public virtual ActionResult UserHeldDevice(string id) diff --git a/Disco.Web/Areas/Public/Models/UserHeldDevices/NoticeboardModel.cs b/Disco.Web/Areas/Public/Models/UserHeldDevices/NoticeboardModel.cs new file mode 100644 index 00000000..4cb9c713 --- /dev/null +++ b/Disco.Web/Areas/Public/Models/UserHeldDevices/NoticeboardModel.cs @@ -0,0 +1,8 @@ + +namespace Disco.Web.Areas.Public.Models.UserHeldDevices +{ + public class NoticeboardModel + { + public string DefaultTheme { get; set; } + } +} \ No newline at end of file diff --git a/Disco.Web/Areas/Public/Views/HeldDevices/Noticeboard.cshtml b/Disco.Web/Areas/Public/Views/HeldDevices/Noticeboard.cshtml index 2e1a71dd..006fcb11 100644 --- a/Disco.Web/Areas/Public/Views/HeldDevices/Noticeboard.cshtml +++ b/Disco.Web/Areas/Public/Views/HeldDevices/Noticeboard.cshtml @@ -1,4 +1,5 @@ -@{ +@model Disco.Web.Areas.Public.Models.UserHeldDevices.NoticeboardModel +@{ Layout = null; Html.BundleDeferred("~/ClientScripts/Modules/Knockout"); Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR"); @@ -13,7 +14,7 @@ Disco ICT - Held Devices @Html.BundleRenderDeferred() - +