From 0c690cff5afc41436b912295eec8b37d9e5cdfbe Mon Sep 17 00:00:00 2001 From: Gary Sharp Date: Thu, 27 Apr 2023 14:54:32 +1000 Subject: [PATCH] bulk generation refactoring --- .../ConfigDocumentTemplateBulkGenerate.cs | 16 +- .../Controllers/DocumentTemplateController.cs | 10 + .../DocumentTemplate/BulkGenerateUserModel.cs | 1 + .../Controllers/DocumentTemplateController.cs | 62 ++- .../DocumentTemplate/BulkGenerateModel.cs | 6 - .../Modules/Disco-DocumentBulkGenerate.js | 462 +++++++++--------- .../Modules/Disco-DocumentBulkGenerate.min.js | 2 +- .../disco.documentbulkgenerate.js | 462 +++++++++--------- 8 files changed, 519 insertions(+), 502 deletions(-) diff --git a/Disco.Models/UI/Config/DocumentTemplate/ConfigDocumentTemplateBulkGenerate.cs b/Disco.Models/UI/Config/DocumentTemplate/ConfigDocumentTemplateBulkGenerate.cs index 2f7900a6..940efd48 100644 --- a/Disco.Models/UI/Config/DocumentTemplate/ConfigDocumentTemplateBulkGenerate.cs +++ b/Disco.Models/UI/Config/DocumentTemplate/ConfigDocumentTemplateBulkGenerate.cs @@ -1,8 +1,22 @@ -namespace Disco.Models.UI.Config.DocumentTemplate +using System.Collections.Generic; + +namespace Disco.Models.UI.Config.DocumentTemplate { public interface ConfigDocumentTemplateBulkGenerate : BaseUIModel { Repository.DocumentTemplate DocumentTemplate { get; set; } int TemplatePageCount { get; set; } + + List> UserFlags { get; set; } + List> DeviceProfiles { get; set; } + List> DeviceBatches { get; set; } + List> DocumentTemplates { get; set; } + List> UserDetails { get; set; } + } + + public class ItemWithCount + { + public T Item { get; set; } + public int Count { get; set; } } } diff --git a/Disco.Web/Areas/API/Controllers/DocumentTemplateController.cs b/Disco.Web/Areas/API/Controllers/DocumentTemplateController.cs index d3bb349c..a0b72761 100644 --- a/Disco.Web/Areas/API/Controllers/DocumentTemplateController.cs +++ b/Disco.Web/Areas/API/Controllers/DocumentTemplateController.cs @@ -733,6 +733,7 @@ namespace Disco.Web.Areas.API.Controllers results.Add(new BulkGenerateUserModel() { Id = user.UserId, + UserEmailAddress = user.EmailAddress, DisplayName = user.DisplayName, Scope = $"Matched '{dataId}'", IsError = false, @@ -763,6 +764,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = adUser.Id, DisplayName = adUser.DisplayName, + UserEmailAddress = adUser.Email, Scope = $"Group Member '{group.Name}'", IsError = false, }); @@ -816,6 +818,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = adUser.Id, DisplayName = adUser.DisplayName, + UserEmailAddress = adUser.Email, Scope = $"Group Member '{group.Name}'", IsError = false, }); @@ -827,6 +830,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = user.Id, DisplayName = user.DisplayName, + UserEmailAddress = user.Email, Scope = $"Matched '{groupId}'", IsError = false, }); @@ -887,6 +891,7 @@ namespace Disco.Web.Areas.API.Controllers results.Add(new BulkGenerateUserModel() { Id = assignment.UserId, + UserEmailAddress = assignment.User.EmailAddress, DisplayName = assignment.User.DisplayName, Scope = $"Assigned User Flag '{flag.Name}'", IsError = false, @@ -941,6 +946,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = assignment.AssignedUserId, DisplayName = assignment.AssignedUser.DisplayName, + UserEmailAddress = assignment.AssignedUser.EmailAddress, Scope = $"Device Profile '{profile.Name}' Matches Assigned Device '{assignment.SerialNumber}'", IsError = false, }); @@ -994,6 +1000,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = assignment.AssignedUserId, DisplayName = assignment.AssignedUser.DisplayName, + UserEmailAddress = assignment.AssignedUser.EmailAddress, Scope = $"Device Batch '{batch.Name}' Matches Assigned Device '{assignment.SerialNumber}'", IsError = false, }); @@ -1040,6 +1047,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = assignment.Device.AssignedUserId, DisplayName = assignment.Device.AssignedUser.DisplayName, + UserEmailAddress = assignment.Device.AssignedUser.EmailAddress, Scope = $"Document Template '{template.Id}' Attachment Matches Assigned Device '{assignment.Device.SerialNumber}'", IsError = false, }); @@ -1056,6 +1064,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = assignment.Job.UserId, DisplayName = assignment.Job.User.DisplayName, + UserEmailAddress = assignment.Job.User.EmailAddress, Scope = $"Document Template '{template.Id}' Attachment Matches Job '{assignment.Job.Id}'", IsError = false, }); @@ -1072,6 +1081,7 @@ namespace Disco.Web.Areas.API.Controllers { Id = assignment.UserId, DisplayName = assignment.User.DisplayName, + UserEmailAddress = assignment.User.EmailAddress, Scope = $"Document Template '{template.Id}' Attachment Matches User", IsError = false, }); diff --git a/Disco.Web/Areas/API/Models/DocumentTemplate/BulkGenerateUserModel.cs b/Disco.Web/Areas/API/Models/DocumentTemplate/BulkGenerateUserModel.cs index e00d5526..4cf8776e 100644 --- a/Disco.Web/Areas/API/Models/DocumentTemplate/BulkGenerateUserModel.cs +++ b/Disco.Web/Areas/API/Models/DocumentTemplate/BulkGenerateUserModel.cs @@ -3,6 +3,7 @@ public class BulkGenerateUserModel { public string Id { get; set; } + public string UserEmailAddress { get; set; } public string DisplayName { get; set; } public string Scope { get; set; } public bool IsError { get; set; } diff --git a/Disco.Web/Areas/Config/Controllers/DocumentTemplateController.cs b/Disco.Web/Areas/Config/Controllers/DocumentTemplateController.cs index 09cd8dae..32c50a5f 100644 --- a/Disco.Web/Areas/Config/Controllers/DocumentTemplateController.cs +++ b/Disco.Web/Areas/Config/Controllers/DocumentTemplateController.cs @@ -1,4 +1,5 @@ using Disco.BI.Extensions; +using Disco.Data.Repository; using Disco.Models.Repository; using Disco.Models.UI.Config.DocumentTemplate; using Disco.Services; @@ -9,10 +10,8 @@ using Disco.Services.Expressions; using Disco.Services.Plugins.Features.UIExtension; using Disco.Services.Web; using Disco.Web.Areas.Config.Models.DocumentTemplate; -using Disco.Web.Areas.Config.Views.DocumentTemplate; using System; using System.Collections.Generic; -using System.Diagnostics.Eventing.Reader; using System.Linq; using System.Web.Mvc; @@ -213,59 +212,53 @@ namespace Disco.Web.Areas.Config.Controllers return View(model); } - [DiscoAuthorizeAll(Claims.Config.DocumentTemplate.BulkGenerate, Claims.User.Actions.GenerateDocuments)] - public virtual ActionResult BulkGenerate(string id) + public static ConfigDocumentTemplateBulkGenerate BuildBulkGenerateModel(DocumentTemplate documentTemplate, DiscoDataContext database, AuthorizationToken authorization) { - var m = new BulkGenerateModel() + var model = new BulkGenerateModel() { - DocumentTemplate = Database.DocumentTemplates.FirstOrDefault(at => at.Id == id), + DocumentTemplate = documentTemplate, }; - if (m.DocumentTemplate == null) - throw new ArgumentException("Invalid Document Template Id", nameof(id)); - if (m.DocumentTemplate.Scope != DocumentTemplate.DocumentTemplateScopes.User) - throw new NotSupportedException("Only user-scoped document templates can be bulk generated using this method"); - - m.TemplatePageCount = m.DocumentTemplate.PdfPageHasAttachmentId(Database).Count; - m.UserFlags = Database.UserFlags.Select(f => new BulkGenerateModel.ItemWithCount() + model.TemplatePageCount = model.DocumentTemplate.PdfPageHasAttachmentId(database).Count; + model.UserFlags = database.UserFlags.Select(f => new ItemWithCount() { Item = f, Count = f.UserFlagAssignments.Where(a => a.RemovedDate == null).Count(), }).ToList(); - m.DeviceProfiles = Database.DeviceProfiles.Select(p => new BulkGenerateModel.ItemWithCount() + model.DeviceProfiles = database.DeviceProfiles.Select(p => new ItemWithCount() { Item = p, Count = p.Devices.Where(d => d.AssignedUserId != null).Count(), }).ToList(); - m.DeviceBatches = Database.DeviceBatches.Select(p => new BulkGenerateModel.ItemWithCount() + model.DeviceBatches = database.DeviceBatches.Select(p => new ItemWithCount() { Item = p, Count = p.Devices.Where(d => d.AssignedUserId != null).Count(), }).ToList(); - m.DocumentTemplates = Database.DocumentTemplates.Select(dt => new BulkGenerateModel.ItemWithCount() + model.DocumentTemplates = database.DocumentTemplates.Select(dt => new ItemWithCount() { Item = dt, }).ToList(); - foreach (var record in m.DocumentTemplates) + foreach (var record in model.DocumentTemplates) { switch (record.Item.AttachmentType) { case AttachmentTypes.Device: - record.Count = Database.DeviceAttachments.Where(a => a.DocumentTemplateId == record.Item.Id).Select(a => a.Device.AssignedUser).Distinct().Count(); + record.Count = database.DeviceAttachments.Where(a => a.DocumentTemplateId == record.Item.Id).Select(a => a.Device.AssignedUser).Distinct().Count(); break; case AttachmentTypes.Job: - record.Count = Database.JobAttachments.Where(a => a.DocumentTemplateId == record.Item.Id).Select(a => a.Job.User).Distinct().Count(); + record.Count = database.JobAttachments.Where(a => a.DocumentTemplateId == record.Item.Id).Select(a => a.Job.User).Distinct().Count(); break; case AttachmentTypes.User: - record.Count = Database.UserAttachments.Where(a => a.DocumentTemplateId == record.Item.Id).Select(a => a.User).Distinct().Count(); + record.Count = database.UserAttachments.Where(a => a.DocumentTemplateId == record.Item.Id).Select(a => a.User).Distinct().Count(); break; default: throw new NotSupportedException(); } } - if (Authorization.Has(Claims.User.ShowDetails)) + if (authorization.Has(Claims.User.ShowDetails)) { - m.UserDetails = Database.UserDetails.Where(d => d.Scope == "Details").GroupBy(d => d.Key).Select(g => new BulkGenerateModel.ItemWithCount() + model.UserDetails = database.UserDetails.Where(d => d.Scope == "Details").GroupBy(d => d.Key).Select(g => new ItemWithCount() { Item = g.Key, Count = g.Count(), @@ -273,13 +266,30 @@ namespace Disco.Web.Areas.Config.Controllers } else { - m.UserDetails = new List>(); + model.UserDetails = new List>(); } - // UI Extensions - UIExtensions.ExecuteExtensions(ControllerContext, m); + return model; + } - return View(MVC.Config.DocumentTemplate.Views.BulkGenerate, m); + [DiscoAuthorizeAll(Claims.Config.DocumentTemplate.BulkGenerate, Claims.User.Actions.GenerateDocuments)] + public virtual ActionResult BulkGenerate(string id) + { + var documentTemplate = Database.DocumentTemplates.FirstOrDefault(at => at.Id == id); + + if (documentTemplate == null) + throw new ArgumentException("Invalid Document Template Id", nameof(id)); + + if (documentTemplate.Scope != DocumentTemplate.DocumentTemplateScopes.User) + throw new NotSupportedException("Only user-scoped document templates can be bulk generated using this method"); + + + var model = BuildBulkGenerateModel(documentTemplate, Database, Authorization); + + // UI Extensions + UIExtensions.ExecuteExtensions(ControllerContext, model); + + return View(MVC.Config.DocumentTemplate.Views.BulkGenerate, model); } [DiscoAuthorize(Claims.Config.Show)] diff --git a/Disco.Web/Areas/Config/Models/DocumentTemplate/BulkGenerateModel.cs b/Disco.Web/Areas/Config/Models/DocumentTemplate/BulkGenerateModel.cs index 15ad4b49..4bb9c223 100644 --- a/Disco.Web/Areas/Config/Models/DocumentTemplate/BulkGenerateModel.cs +++ b/Disco.Web/Areas/Config/Models/DocumentTemplate/BulkGenerateModel.cs @@ -12,11 +12,5 @@ namespace Disco.Web.Areas.Config.Models.DocumentTemplate public List> DeviceBatches { get; set; } public List> DocumentTemplates { get; set; } public List> UserDetails { get; set; } - - public class ItemWithCount - { - public T Item { get; set; } - public int Count { get; set; } - } } } \ No newline at end of file diff --git a/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.js b/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.js index a7c45903..d3693360 100644 --- a/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.js +++ b/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.js @@ -75,6 +75,20 @@ $(() => { } } + function excludeOtherUsers(r) { + let changeCount = 0; + for (var i = 0; i < users.length; i++) { + const user = users[i]; + if (!r.find(u => u.Id === user.Id)) { + user.checkbox.checked = false; + changeCount++; + } + } + if (changeCount) { + redrawTable(); + } + } + $table.on('change', 'input[type="checkbox"]', e => { redrawTable(); }); @@ -97,59 +111,49 @@ $(() => { $('#AddUsers').click(e => { e.preventDefault(); - if (!dialogAddUsers) { - dialogAddUsers = $('#DocumentTemplate_BulkGenerate_Dialog_AddUsers').dialog({ + let dialog = dialogAddUsers; + if (!dialog) { + const action = function (applier) { + const form = dialog.find('form')[0]; + if (form.reportValidity()) { + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + applier(r); + dialog.find('textarea').html('').val(''); + dialog.dialog("close"); + dialog.dialog("enable"); + }) + .catch(reason => { + alert('Failed to validate users: ' + reason); + }); + } + dialog.dialog("disable"); + } + dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddUsers').dialog({ resizable: false, modal: true, autoOpen: false, width: 460, buttons: { + "Exclude Other Users": function () { + action(excludeOtherUsers); + }, "Exclude Users": function () { - const form = dialogAddUsers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - excludeUsers(r); - dialogAddUsers.find('textarea').html('').val(''); - dialogAddUsers.dialog("close"); - dialogAddUsers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate users: ' + reason); - }); - } - dialogAddUsers.dialog("disable"); + action(excludeUsers); }, "Add Users": function () { - const form = dialogAddUsers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - addUsers(r); - dialogAddUsers.find('textarea').html('').val(''); - dialogAddUsers.dialog("close"); - dialogAddUsers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate users: ' + reason); - }); - } - dialogAddUsers.dialog("disable"); + action(addUsers); } } }); + dialogAddUsers = dialog; } - dialogAddUsers.dialog('open'); + dialog.dialog('open'); return false; }); @@ -157,73 +161,63 @@ $(() => { $('#AddGroupMembers').click(e => { e.preventDefault(); - if (!dialogAddGroupMembers) { - dialogAddGroupMembers = $('#DocumentTemplate_BulkGenerate_Dialog_AddGroupMembers').dialog({ + let dialog = dialogAddGroupMembers; + if (!dialog) { + const action = function (applier) { + const form = dialog.find('form')[0]; + if (form.reportValidity()) { + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + applier(r); + dialog.find('input[type="text"]').val(''); + dialog.dialog("close"); + dialog.dialog("enable"); + }) + .catch(reason => { + alert('Failed to validate group: ' + reason); + }); + } + dialog.dialog("disable"); + } + dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddGroupMembers').dialog({ resizable: false, modal: true, autoOpen: false, width: 460, buttons: { + "Exclude Non-Group Members": function () { + action(excludeOtherUsers); + }, "Exclude Group Members": function () { - const form = dialogAddGroupMembers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - excludeUsers(r); - dialogAddGroupMembers.find('input[type="text"]').val(''); - dialogAddGroupMembers.dialog("close"); - dialogAddGroupMembers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate group: ' + reason); - }); - } - dialogAddGroupMembers.dialog("disable"); + action(excludeUsers); }, "Add Group Members": function () { - const form = dialogAddGroupMembers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - addUsers(r); - dialogAddGroupMembers.find('input[type="text"]').val(''); - dialogAddGroupMembers.dialog("close"); - dialogAddGroupMembers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate group: ' + reason); - }); - } - dialogAddGroupMembers.dialog("disable"); + action(addUsers); } } }); + const $input = dialog.find('input[type="text"]'); + $input.autocomplete({ + source: $input.attr('data-autocomplete-src'), + minLength: 2, + select: function (e, ui) { + $input.val(ui.item.Id); + return false; + } + }).data('ui-autocomplete')._renderItem = function (ul, item) { + return $("
  • ") + .data("item.autocomplete", item) + .append("" + item.Name + "
    " + item.Id + " (" + item.Type + ")
    ") + .appendTo(ul); + }; + dialogAddGroupMembers = dialog; } - const $input = dialogAddGroupMembers.find('input[type="text"]'); - $input.autocomplete({ - source: $input.attr('data-autocomplete-src'), - minLength: 2, - select: function (e, ui) { - $input.val(ui.item.Id); - return false; - } - }).data('ui-autocomplete')._renderItem = function (ul, item) { - return $("
  • ") - .data("item.autocomplete", item) - .append("" + item.Name + "
    " + item.Id + " (" + item.Type + ")
    ") - .appendTo(ul); - }; - dialogAddGroupMembers.dialog('open'); + dialog.dialog('open'); return false; }); @@ -231,71 +225,59 @@ $(() => { $('#AddUserFlag').click(e => { e.preventDefault(); - if (!dialogAddUserFlag) { - const dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddUserFlag').dialog({ + let dialog = dialogAddUserFlag; + if (!dialog) { + const action = function (applier) { + const form = dialog.find('form')[0]; + if (form.reportValidity()) { + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + applier(r); + dialog.find('input[name="flagId"]').val(''); + dialog.find('div.item').removeClass('selected'); + dialog.dialog("close"); + dialog.dialog("enable"); + }) + .catch(reason => { + alert('Failed to validate user flag: ' + reason); + }); + } + dialog.dialog("disable"); + } + dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddUserFlag').dialog({ resizable: false, modal: true, autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { - const form = dialog.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - excludeUsers(r); - dialog.find('input[name="flagId"]').val(''); - dialog.find('div.item').removeClass('selected'); - dialog.dialog("close"); - dialog.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate user flag: ' + reason); - }); - } - dialog.dialog("disable"); + action(excludeUsers); }, "Add Assigned Users": function () { - const form = dialog.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - addUsers(r); - dialog.find('input[name="flagId"]').val(''); - dialog.find('div.item').removeClass('selected'); - dialog.dialog("close"); - dialog.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate user flag: ' + reason); - }); - } - dialog.dialog("disable"); + action(addUsers); } } }); + const $input = dialog.find('input[name="flagId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-userflagid')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddUserFlag = dialog; } - const $input = dialogAddUserFlag.find('input[name="flagId"]'); - dialogAddUserFlag.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-userflagid')); - dialogAddUserFlag.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); - dialogAddUserFlag.dialog('open'); + dialog.dialog('open'); return false; }); @@ -304,7 +286,7 @@ $(() => { e.preventDefault(); let dialog = dialogAddDeviceProfile; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const input = dialog.find('input[name="deviceProfileId"]'); if (input.val()) { @@ -316,7 +298,7 @@ $(() => { }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); input.val(''); dialog.find('div.item').removeClass('selected'); dialog.dialog("close"); @@ -335,6 +317,9 @@ $(() => { autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { action(excludeUsers); }, @@ -343,17 +328,17 @@ $(() => { } } }); + const $input = dialog.find('input[name="deviceProfileId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-id')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddDeviceProfile = dialog; } - const $input = dialog.find('input[name="deviceProfileId"]'); - dialog.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-id')); - dialog.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); dialog.dialog('open'); return false; }); @@ -363,7 +348,7 @@ $(() => { e.preventDefault(); let dialog = dialogAddDeviceBatch; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const input = dialog.find('input[name="deviceBatchId"]'); if (input.val()) { @@ -375,7 +360,7 @@ $(() => { }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); input.val(''); dialog.find('div.item').removeClass('selected'); dialog.dialog("close"); @@ -394,6 +379,9 @@ $(() => { autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { action(excludeUsers); }, @@ -402,17 +390,17 @@ $(() => { } } }); + const $input = dialog.find('input[name="deviceBatchId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-id')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddDeviceBatch = dialog; } - const $input = dialog.find('input[name="deviceBatchId"]'); - dialog.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-id')); - dialog.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); dialog.dialog('open'); return false; }); @@ -422,7 +410,7 @@ $(() => { e.preventDefault(); let dialog = dialogAddDocumentAttachment; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const input = dialog.find('input[name="documentTemplateId"]'); if (input.val()) { @@ -434,7 +422,7 @@ $(() => { }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); input.val(''); dialog.find('div.item').removeClass('selected'); dialog.dialog("close"); @@ -453,6 +441,9 @@ $(() => { autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { action(excludeUsers); }, @@ -461,17 +452,17 @@ $(() => { } } }); + const $input = dialog.find('input[name="documentTemplateId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-id')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddDocumentAttachment = dialog; } - const $input = dialog.find('input[name="documentTemplateId"]'); - dialog.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-id')); - dialog.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); dialog.dialog('open'); return false; }); @@ -481,7 +472,7 @@ $(() => { e.preventDefault(); let dialog = dialogAddUserDetail; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const key = $(form).find('input[name="key"]'); if (key.val()) { @@ -493,7 +484,7 @@ $(() => { }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); key.val(''); $(form).find('input[name="value"]').val(''); $('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value').empty(); @@ -514,6 +505,9 @@ $(() => { autoOpen: false, width: 690, buttons: { + "Exclude Unmatched Users": function () { + action(excludeOtherUsers); + }, "Exclude Matched Users": function () { action(excludeUsers); }, @@ -522,59 +516,59 @@ $(() => { } } }); + const $key = dialog.find('input[name="key"]'); + const $value = dialog.find('input[name="value"]'); + const $keys = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Key'); + const $values = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value'); + $keys.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + const keyValue = $target.attr('data-id'); + $key.val(keyValue); + $keys.find('div.item').removeClass('selected'); + $target.addClass('selected'); + + $values.empty(); + $values.append($('')); + + const form = dialog.find('form')[1]; + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + $values.empty(); + + const allValues = $('
    All Matched Users
    '); + allValues.appendTo($values); + $value.val(''); + + r.map(v => { + const container = $('
    '); + container.attr('data-id', v); + const span = $('').text(v); + span.appendTo(container); + container.appendTo($values); + }) + }) + .catch(reason => { + alert('Failed to validate user detail: ' + reason); + }); + dialog.dialog("disable"); + + return false; + }); + $values.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $value.val($target.attr('data-id')); + $values.find('div.item').removeClass('selected'); + $target.addClass('selected'); + }); dialogAddUserDetail = dialog; } - const $key = dialog.find('input[name="key"]'); - const $value = dialog.find('input[name="value"]'); - const $keys = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Key'); - const $values = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value'); - $keys.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - const keyValue = $target.attr('data-id'); - $key.val(keyValue); - $keys.find('div.item').removeClass('selected'); - $target.addClass('selected'); - - $values.empty(); - $values.append($('')); - - const form = dialog.find('form')[1]; - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - $values.empty(); - - const allValues = $('
    All Matched Users
    '); - allValues.appendTo($values); - $value.val(''); - - r.map(v => { - const container = $('
    '); - container.attr('data-id', v); - const span = $('').text(v); - span.appendTo(container); - container.appendTo($values); - }) - }) - .catch(reason => { - alert('Failed to validate user detail: ' + reason); - }); - dialog.dialog("disable"); - - return false; - }); - $values.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $value.val($target.attr('data-id')); - $values.find('div.item').removeClass('selected'); - $target.addClass('selected'); - }); dialog.dialog('open'); return false; }); diff --git a/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.min.js b/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.min.js index 819ebb3e..0c2e9710 100644 --- a/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.min.js +++ b/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate.min.js @@ -1 +1 @@ -$(()=>{function o(){var t,n;i.length>0&&e.find("tbody tr:first-child").hide();const u=e.find("tbody");let r=0;for(t=0;t<\/td>
  • ").data("item.autocomplete",t).append(""+t.Name+"<\/strong>
    "+t.Id+" ("+t.Type+")<\/a>").appendTo(n)},n.dialog("open"),!1});let f=null;$("#AddUserFlag").click(n=>{if(n.preventDefault(),!f){const n=$("#DocumentTemplate_BulkGenerate_Dialog_AddUserFlag").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Assigned Users":function(){const t=n.find("form")[0];if(t.reportValidity()){const i=new FormData(t);fetch(t.action,{method:"POST",body:i}).then(n=>n.json()).then(t=>{u(t),n.find('input[name="flagId"]').val(""),n.find("div.item").removeClass("selected"),n.dialog("close"),n.dialog("enable")}).catch(n=>{alert("Failed to validate user flag: "+n)})}n.dialog("disable")},"Add Assigned Users":function(){const t=n.find("form")[0];if(t.reportValidity()){const i=new FormData(t);fetch(t.action,{method:"POST",body:i}).then(n=>n.json()).then(t=>{r(t),n.find('input[name="flagId"]').val(""),n.find("div.item").removeClass("selected"),n.dialog("close"),n.dialog("enable")}).catch(n=>{alert("Failed to validate user flag: "+n)})}n.dialog("disable")}}});f=n}const t=f.find('input[name="flagId"]');f.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const i=$(n.currentTarget);return t.val(i.attr("data-userflagid")),f.find("div.item").removeClass("selected"),i.addClass("selected"),!1});return f.dialog("open"),!1});let s=null;$("#AddDeviceProfile").click(n=>{n.preventDefault();let t=s;if(!t){const n=n=>{const i=t.find("form")[0],r=t.find('input[name="deviceProfileId"]');if(r.val()&&i.reportValidity()){const u=new FormData(i);fetch(i.action,{method:"POST",body:u}).then(n=>n.json()).then(i=>{n(i),r.val(""),t.find("div.item").removeClass("selected"),t.dialog("close"),t.dialog("enable")}).catch(n=>{alert("Failed to validate device profile: "+n)});t.dialog("disable")}};t=$("#DocumentTemplate_BulkGenerate_Dialog_AddDeviceProfile").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Assigned Users":function(){n(u)},"Add Assigned Users":function(){n(r)}}});s=t}const i=t.find('input[name="deviceProfileId"]');t.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const r=$(n.currentTarget);return i.val(r.attr("data-id")),t.find("div.item").removeClass("selected"),r.addClass("selected"),!1});return t.dialog("open"),!1});let h=null;$("#AddDeviceBatch").click(n=>{n.preventDefault();let t=h;if(!t){const n=n=>{const i=t.find("form")[0],r=t.find('input[name="deviceBatchId"]');if(r.val()&&i.reportValidity()){const u=new FormData(i);fetch(i.action,{method:"POST",body:u}).then(n=>n.json()).then(i=>{n(i),r.val(""),t.find("div.item").removeClass("selected"),t.dialog("close"),t.dialog("enable")}).catch(n=>{alert("Failed to validate device batch: "+n)});t.dialog("disable")}};t=$("#DocumentTemplate_BulkGenerate_Dialog_AddDeviceBatch").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Assigned Users":function(){n(u)},"Add Assigned Users":function(){n(r)}}});h=t}const i=t.find('input[name="deviceBatchId"]');t.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const r=$(n.currentTarget);return i.val(r.attr("data-id")),t.find("div.item").removeClass("selected"),r.addClass("selected"),!1});return t.dialog("open"),!1});let c=null;$("#AddDocumentAttachment").click(n=>{n.preventDefault();let t=c;if(!t){const n=n=>{const i=t.find("form")[0],r=t.find('input[name="documentTemplateId"]');if(r.val()&&i.reportValidity()){const u=new FormData(i);fetch(i.action,{method:"POST",body:u}).then(n=>n.json()).then(i=>{n(i),r.val(""),t.find("div.item").removeClass("selected"),t.dialog("close"),t.dialog("enable")}).catch(n=>{alert("Failed to validate device batch: "+n)});t.dialog("disable")}};t=$("#DocumentTemplate_BulkGenerate_Dialog_AddDocumentAttachment").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Assigned Users":function(){n(u)},"Add Assigned Users":function(){n(r)}}});c=t}const i=t.find('input[name="documentTemplateId"]');t.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const r=$(n.currentTarget);return i.val(r.attr("data-id")),t.find("div.item").removeClass("selected"),r.addClass("selected"),!1});return t.dialog("open"),!1});let l=null;$("#AddUserDetail").click(n=>{n.preventDefault();let t=l;if(!t){const n=n=>{const i=t.find("form")[0],r=$(i).find('input[name="key"]');if(r.val()&&i.reportValidity()){const u=new FormData(i);fetch(i.action,{method:"POST",body:u}).then(n=>n.json()).then(u=>{n(u),r.val(""),$(i).find('input[name="value"]').val(""),$("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value").empty(),t.find("div.item").removeClass("selected"),t.dialog("close"),t.dialog("enable")}).catch(n=>{alert("Failed to validate user detail: "+n)});t.dialog("disable")}};t=$("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail").dialog({resizable:!1,modal:!0,autoOpen:!1,width:690,buttons:{"Exclude Matched Users":function(){n(u)},"Add Matched Users":function(){n(r)}}});l=t}const o=t.find('input[name="key"]'),f=t.find('input[name="value"]'),e=t.find("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Key"),i=t.find("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value");e.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const r=$(n.currentTarget),s=r.attr("data-id");o.val(s);e.find("div.item").removeClass("selected");r.addClass("selected");i.empty();i.append($('<\/i>'));const u=t.find("form")[1],h=new FormData(u);return fetch(u.action,{method:"POST",body:h}).then(n=>n.json()).then(n=>{i.empty();const t=$('
    <\/i>All Matched Users<\/em><\/div>');t.appendTo(i);f.val("");n.map(n=>{const t=$('
    <\/i ><\/div>');t.attr("data-id",n);const r=$("").text(n);r.appendTo(t);t.appendTo(i)})}).catch(n=>{alert("Failed to validate user detail: "+n)}),t.dialog("disable"),!1});i.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const t=$(n.currentTarget);f.val(t.attr("data-id"));i.find("div.item").removeClass("selected");t.addClass("selected")});return t.dialog("open"),!1})}); \ No newline at end of file +$(()=>{function u(){var i,t;n.length>0&&f.find("tbody tr:first-child").hide();const u=f.find("tbody");let r=0;for(i=0;i<\/td>
  • ").data("item.autocomplete",t).append(""+t.Name+"<\/strong>
    "+t.Id+" ("+t.Type+")<\/a>").appendTo(n)};o=u}return u.dialog("open"),!1});let s=null;$("#AddUserFlag").click(n=>{n.preventDefault();let u=s;if(!u){const n=function(n){const t=u.find("form")[0];if(t.reportValidity()){const i=new FormData(t);fetch(t.action,{method:"POST",body:i}).then(n=>n.json()).then(t=>{n(t),u.find('input[name="flagId"]').val(""),u.find("div.item").removeClass("selected"),u.dialog("close"),u.dialog("enable")}).catch(n=>{alert("Failed to validate user flag: "+n)})}u.dialog("disable")};u=$("#DocumentTemplate_BulkGenerate_Dialog_AddUserFlag").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Unassigned Users":function(){n(r)},"Exclude Assigned Users":function(){n(i)},"Add Assigned Users":function(){n(t)}}});const f=u.find('input[name="flagId"]');u.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const t=$(n.currentTarget);return f.val(t.attr("data-userflagid")),u.find("div.item").removeClass("selected"),t.addClass("selected"),!1});s=u}return u.dialog("open"),!1});let h=null;$("#AddDeviceProfile").click(n=>{n.preventDefault();let u=h;if(!u){const n=function(n){const t=u.find("form")[0],i=u.find('input[name="deviceProfileId"]');if(i.val()&&t.reportValidity()){const r=new FormData(t);fetch(t.action,{method:"POST",body:r}).then(n=>n.json()).then(t=>{n(t),i.val(""),u.find("div.item").removeClass("selected"),u.dialog("close"),u.dialog("enable")}).catch(n=>{alert("Failed to validate device profile: "+n)});u.dialog("disable")}};u=$("#DocumentTemplate_BulkGenerate_Dialog_AddDeviceProfile").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Unassigned Users":function(){n(r)},"Exclude Assigned Users":function(){n(i)},"Add Assigned Users":function(){n(t)}}});const f=u.find('input[name="deviceProfileId"]');u.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const t=$(n.currentTarget);return f.val(t.attr("data-id")),u.find("div.item").removeClass("selected"),t.addClass("selected"),!1});h=u}return u.dialog("open"),!1});let c=null;$("#AddDeviceBatch").click(n=>{n.preventDefault();let u=c;if(!u){const n=function(n){const t=u.find("form")[0],i=u.find('input[name="deviceBatchId"]');if(i.val()&&t.reportValidity()){const r=new FormData(t);fetch(t.action,{method:"POST",body:r}).then(n=>n.json()).then(t=>{n(t),i.val(""),u.find("div.item").removeClass("selected"),u.dialog("close"),u.dialog("enable")}).catch(n=>{alert("Failed to validate device batch: "+n)});u.dialog("disable")}};u=$("#DocumentTemplate_BulkGenerate_Dialog_AddDeviceBatch").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Unassigned Users":function(){n(r)},"Exclude Assigned Users":function(){n(i)},"Add Assigned Users":function(){n(t)}}});const f=u.find('input[name="deviceBatchId"]');u.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const t=$(n.currentTarget);return f.val(t.attr("data-id")),u.find("div.item").removeClass("selected"),t.addClass("selected"),!1});c=u}return u.dialog("open"),!1});let l=null;$("#AddDocumentAttachment").click(n=>{n.preventDefault();let u=l;if(!u){const n=function(n){const t=u.find("form")[0],i=u.find('input[name="documentTemplateId"]');if(i.val()&&t.reportValidity()){const r=new FormData(t);fetch(t.action,{method:"POST",body:r}).then(n=>n.json()).then(t=>{n(t),i.val(""),u.find("div.item").removeClass("selected"),u.dialog("close"),u.dialog("enable")}).catch(n=>{alert("Failed to validate device batch: "+n)});u.dialog("disable")}};u=$("#DocumentTemplate_BulkGenerate_Dialog_AddDocumentAttachment").dialog({resizable:!1,modal:!0,autoOpen:!1,width:460,buttons:{"Exclude Unassigned Users":function(){n(r)},"Exclude Assigned Users":function(){n(i)},"Add Assigned Users":function(){n(t)}}});const f=u.find('input[name="documentTemplateId"]');u.on("click","div.item:not(.disabled)",n=>{n.preventDefault();const t=$(n.currentTarget);return f.val(t.attr("data-id")),u.find("div.item").removeClass("selected"),t.addClass("selected"),!1});l=u}return u.dialog("open"),!1});let a=null;$("#AddUserDetail").click(n=>{n.preventDefault();let u=a;if(!u){const f=function(n){const t=u.find("form")[0],i=$(t).find('input[name="key"]');if(i.val()&&t.reportValidity()){const r=new FormData(t);fetch(t.action,{method:"POST",body:r}).then(n=>n.json()).then(r=>{n(r),i.val(""),$(t).find('input[name="value"]').val(""),$("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value").empty(),u.find("div.item").removeClass("selected"),u.dialog("close"),u.dialog("enable")}).catch(n=>{alert("Failed to validate user detail: "+n)});u.dialog("disable")}};u=$("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail").dialog({resizable:!1,modal:!0,autoOpen:!1,width:690,buttons:{"Exclude Unmatched Users":function(){f(r)},"Exclude Matched Users":function(){f(i)},"Add Matched Users":function(){f(t)}}});const s=u.find('input[name="key"]'),e=u.find('input[name="value"]'),o=u.find("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Key"),n=u.find("#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value");o.on("click","div.item:not(.disabled)",t=>{t.preventDefault();const i=$(t.currentTarget),f=i.attr("data-id");s.val(f);o.find("div.item").removeClass("selected");i.addClass("selected");n.empty();n.append($('<\/i>'));const r=u.find("form")[1],h=new FormData(r);return fetch(r.action,{method:"POST",body:h}).then(n=>n.json()).then(t=>{n.empty();const i=$('
    <\/i>All Matched Users<\/em><\/div>');i.appendTo(n);e.val("");t.map(t=>{const i=$('
    <\/i ><\/div>');i.attr("data-id",t);const r=$("").text(t);r.appendTo(i);i.appendTo(n)})}).catch(n=>{alert("Failed to validate user detail: "+n)}),u.dialog("disable"),!1});n.on("click","div.item:not(.disabled)",t=>{t.preventDefault();const i=$(t.currentTarget);e.val(i.attr("data-id"));n.find("div.item").removeClass("selected");i.addClass("selected")});a=u}return u.dialog("open"),!1})}); \ No newline at end of file diff --git a/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate/disco.documentbulkgenerate.js b/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate/disco.documentbulkgenerate.js index e553685b..06850c1b 100644 --- a/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate/disco.documentbulkgenerate.js +++ b/Disco.Web/ClientSource/Scripts/Modules/Disco-DocumentBulkGenerate/disco.documentbulkgenerate.js @@ -75,6 +75,20 @@ } } + function excludeOtherUsers(r) { + let changeCount = 0; + for (var i = 0; i < users.length; i++) { + const user = users[i]; + if (!r.find(u => u.Id === user.Id)) { + user.checkbox.checked = false; + changeCount++; + } + } + if (changeCount) { + redrawTable(); + } + } + $table.on('change', 'input[type="checkbox"]', e => { redrawTable(); }); @@ -97,59 +111,49 @@ $('#AddUsers').click(e => { e.preventDefault(); - if (!dialogAddUsers) { - dialogAddUsers = $('#DocumentTemplate_BulkGenerate_Dialog_AddUsers').dialog({ + let dialog = dialogAddUsers; + if (!dialog) { + const action = function (applier) { + const form = dialog.find('form')[0]; + if (form.reportValidity()) { + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + applier(r); + dialog.find('textarea').html('').val(''); + dialog.dialog("close"); + dialog.dialog("enable"); + }) + .catch(reason => { + alert('Failed to validate users: ' + reason); + }); + } + dialog.dialog("disable"); + } + dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddUsers').dialog({ resizable: false, modal: true, autoOpen: false, width: 460, buttons: { + "Exclude Other Users": function () { + action(excludeOtherUsers); + }, "Exclude Users": function () { - const form = dialogAddUsers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - excludeUsers(r); - dialogAddUsers.find('textarea').html('').val(''); - dialogAddUsers.dialog("close"); - dialogAddUsers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate users: ' + reason); - }); - } - dialogAddUsers.dialog("disable"); + action(excludeUsers); }, "Add Users": function () { - const form = dialogAddUsers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - addUsers(r); - dialogAddUsers.find('textarea').html('').val(''); - dialogAddUsers.dialog("close"); - dialogAddUsers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate users: ' + reason); - }); - } - dialogAddUsers.dialog("disable"); + action(addUsers); } } }); + dialogAddUsers = dialog; } - dialogAddUsers.dialog('open'); + dialog.dialog('open'); return false; }); @@ -157,73 +161,63 @@ $('#AddGroupMembers').click(e => { e.preventDefault(); - if (!dialogAddGroupMembers) { - dialogAddGroupMembers = $('#DocumentTemplate_BulkGenerate_Dialog_AddGroupMembers').dialog({ + let dialog = dialogAddGroupMembers; + if (!dialog) { + const action = function (applier) { + const form = dialog.find('form')[0]; + if (form.reportValidity()) { + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + applier(r); + dialog.find('input[type="text"]').val(''); + dialog.dialog("close"); + dialog.dialog("enable"); + }) + .catch(reason => { + alert('Failed to validate group: ' + reason); + }); + } + dialog.dialog("disable"); + } + dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddGroupMembers').dialog({ resizable: false, modal: true, autoOpen: false, width: 460, buttons: { + "Exclude Non-Group Members": function () { + action(excludeOtherUsers); + }, "Exclude Group Members": function () { - const form = dialogAddGroupMembers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - excludeUsers(r); - dialogAddGroupMembers.find('input[type="text"]').val(''); - dialogAddGroupMembers.dialog("close"); - dialogAddGroupMembers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate group: ' + reason); - }); - } - dialogAddGroupMembers.dialog("disable"); + action(excludeUsers); }, "Add Group Members": function () { - const form = dialogAddGroupMembers.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - addUsers(r); - dialogAddGroupMembers.find('input[type="text"]').val(''); - dialogAddGroupMembers.dialog("close"); - dialogAddGroupMembers.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate group: ' + reason); - }); - } - dialogAddGroupMembers.dialog("disable"); + action(addUsers); } } }); + const $input = dialog.find('input[type="text"]'); + $input.autocomplete({ + source: $input.attr('data-autocomplete-src'), + minLength: 2, + select: function (e, ui) { + $input.val(ui.item.Id); + return false; + } + }).data('ui-autocomplete')._renderItem = function (ul, item) { + return $("
  • ") + .data("item.autocomplete", item) + .append("" + item.Name + "
    " + item.Id + " (" + item.Type + ")
    ") + .appendTo(ul); + }; + dialogAddGroupMembers = dialog; } - const $input = dialogAddGroupMembers.find('input[type="text"]'); - $input.autocomplete({ - source: $input.attr('data-autocomplete-src'), - minLength: 2, - select: function (e, ui) { - $input.val(ui.item.Id); - return false; - } - }).data('ui-autocomplete')._renderItem = function (ul, item) { - return $("
  • ") - .data("item.autocomplete", item) - .append("" + item.Name + "
    " + item.Id + " (" + item.Type + ")
    ") - .appendTo(ul); - }; - dialogAddGroupMembers.dialog('open'); + dialog.dialog('open'); return false; }); @@ -231,71 +225,59 @@ $('#AddUserFlag').click(e => { e.preventDefault(); - if (!dialogAddUserFlag) { - const dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddUserFlag').dialog({ + let dialog = dialogAddUserFlag; + if (!dialog) { + const action = function (applier) { + const form = dialog.find('form')[0]; + if (form.reportValidity()) { + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + applier(r); + dialog.find('input[name="flagId"]').val(''); + dialog.find('div.item').removeClass('selected'); + dialog.dialog("close"); + dialog.dialog("enable"); + }) + .catch(reason => { + alert('Failed to validate user flag: ' + reason); + }); + } + dialog.dialog("disable"); + } + dialog = $('#DocumentTemplate_BulkGenerate_Dialog_AddUserFlag').dialog({ resizable: false, modal: true, autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { - const form = dialog.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - excludeUsers(r); - dialog.find('input[name="flagId"]').val(''); - dialog.find('div.item').removeClass('selected'); - dialog.dialog("close"); - dialog.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate user flag: ' + reason); - }); - } - dialog.dialog("disable"); + action(excludeUsers); }, "Add Assigned Users": function () { - const form = dialog.find('form')[0]; - if (form.reportValidity()) { - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - addUsers(r); - dialog.find('input[name="flagId"]').val(''); - dialog.find('div.item').removeClass('selected'); - dialog.dialog("close"); - dialog.dialog("enable"); - }) - .catch(reason => { - alert('Failed to validate user flag: ' + reason); - }); - } - dialog.dialog("disable"); + action(addUsers); } } }); + const $input = dialog.find('input[name="flagId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-userflagid')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddUserFlag = dialog; } - const $input = dialogAddUserFlag.find('input[name="flagId"]'); - dialogAddUserFlag.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-userflagid')); - dialogAddUserFlag.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); - dialogAddUserFlag.dialog('open'); + dialog.dialog('open'); return false; }); @@ -304,7 +286,7 @@ e.preventDefault(); let dialog = dialogAddDeviceProfile; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const input = dialog.find('input[name="deviceProfileId"]'); if (input.val()) { @@ -316,7 +298,7 @@ }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); input.val(''); dialog.find('div.item').removeClass('selected'); dialog.dialog("close"); @@ -335,6 +317,9 @@ autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { action(excludeUsers); }, @@ -343,17 +328,17 @@ } } }); + const $input = dialog.find('input[name="deviceProfileId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-id')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddDeviceProfile = dialog; } - const $input = dialog.find('input[name="deviceProfileId"]'); - dialog.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-id')); - dialog.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); dialog.dialog('open'); return false; }); @@ -363,7 +348,7 @@ e.preventDefault(); let dialog = dialogAddDeviceBatch; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const input = dialog.find('input[name="deviceBatchId"]'); if (input.val()) { @@ -375,7 +360,7 @@ }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); input.val(''); dialog.find('div.item').removeClass('selected'); dialog.dialog("close"); @@ -394,6 +379,9 @@ autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { action(excludeUsers); }, @@ -402,17 +390,17 @@ } } }); + const $input = dialog.find('input[name="deviceBatchId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-id')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddDeviceBatch = dialog; } - const $input = dialog.find('input[name="deviceBatchId"]'); - dialog.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-id')); - dialog.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); dialog.dialog('open'); return false; }); @@ -422,7 +410,7 @@ e.preventDefault(); let dialog = dialogAddDocumentAttachment; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const input = dialog.find('input[name="documentTemplateId"]'); if (input.val()) { @@ -434,7 +422,7 @@ }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); input.val(''); dialog.find('div.item').removeClass('selected'); dialog.dialog("close"); @@ -453,6 +441,9 @@ autoOpen: false, width: 460, buttons: { + "Exclude Unassigned Users": function () { + action(excludeOtherUsers); + }, "Exclude Assigned Users": function () { action(excludeUsers); }, @@ -461,17 +452,17 @@ } } }); + const $input = dialog.find('input[name="documentTemplateId"]'); + dialog.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $input.val($target.attr('data-id')); + dialog.find('div.item').removeClass('selected'); + $target.addClass('selected'); + return false; + }); dialogAddDocumentAttachment = dialog; } - const $input = dialog.find('input[name="documentTemplateId"]'); - dialog.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $input.val($target.attr('data-id')); - dialog.find('div.item').removeClass('selected'); - $target.addClass('selected'); - return false; - }); dialog.dialog('open'); return false; }); @@ -481,7 +472,7 @@ e.preventDefault(); let dialog = dialogAddUserDetail; if (!dialog) { - const action = delegate => { + const action = function (applier) { const form = dialog.find('form')[0]; const key = $(form).find('input[name="key"]'); if (key.val()) { @@ -493,7 +484,7 @@ }) .then(r => r.json()) .then(r => { - delegate(r); + applier(r); key.val(''); $(form).find('input[name="value"]').val(''); $('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value').empty(); @@ -514,6 +505,9 @@ autoOpen: false, width: 690, buttons: { + "Exclude Unmatched Users": function () { + action(excludeOtherUsers); + }, "Exclude Matched Users": function () { action(excludeUsers); }, @@ -522,59 +516,59 @@ } } }); + const $key = dialog.find('input[name="key"]'); + const $value = dialog.find('input[name="value"]'); + const $keys = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Key'); + const $values = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value'); + $keys.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + const keyValue = $target.attr('data-id'); + $key.val(keyValue); + $keys.find('div.item').removeClass('selected'); + $target.addClass('selected'); + + $values.empty(); + $values.append($('')); + + const form = dialog.find('form')[1]; + const body = new FormData(form); + fetch(form.action, { + method: 'POST', + body: body + }) + .then(r => r.json()) + .then(r => { + $values.empty(); + + const allValues = $('
    All Matched Users
    '); + allValues.appendTo($values); + $value.val(''); + + r.map(v => { + const container = $('
    '); + container.attr('data-id', v); + const span = $('').text(v); + span.appendTo(container); + container.appendTo($values); + }) + }) + .catch(reason => { + alert('Failed to validate user detail: ' + reason); + }); + dialog.dialog("disable"); + + return false; + }); + $values.on('click', 'div.item:not(.disabled)', e => { + e.preventDefault(); + const $target = $(e.currentTarget); + $value.val($target.attr('data-id')); + $values.find('div.item').removeClass('selected'); + $target.addClass('selected'); + }); dialogAddUserDetail = dialog; } - const $key = dialog.find('input[name="key"]'); - const $value = dialog.find('input[name="value"]'); - const $keys = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Key'); - const $values = dialog.find('#DocumentTemplate_BulkGenerate_Dialog_AddUserDetail_Value'); - $keys.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - const keyValue = $target.attr('data-id'); - $key.val(keyValue); - $keys.find('div.item').removeClass('selected'); - $target.addClass('selected'); - - $values.empty(); - $values.append($('')); - - const form = dialog.find('form')[1]; - const body = new FormData(form); - fetch(form.action, { - method: 'POST', - body: body - }) - .then(r => r.json()) - .then(r => { - $values.empty(); - - const allValues = $('
    All Matched Users
    '); - allValues.appendTo($values); - $value.val(''); - - r.map(v => { - const container = $('
    '); - container.attr('data-id', v); - const span = $('').text(v); - span.appendTo(container); - container.appendTo($values); - }) - }) - .catch(reason => { - alert('Failed to validate user detail: ' + reason); - }); - dialog.dialog("disable"); - - return false; - }); - $values.on('click', 'div.item:not(.disabled)', e => { - e.preventDefault(); - const $target = $(e.currentTarget); - $value.val($target.attr('data-id')); - $values.find('div.item').removeClass('selected'); - $target.addClass('selected'); - }); dialog.dialog('open'); return false; });