From de1d6681da06b04e04a1cc49c1401fdebd8b7318 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 14 Jan 2025 20:13:57 +0100 Subject: [PATCH 01/24] updated structure --- Pages/Admin/ManageGroupsPage.php | 2 +- Web/scripts/admin/group.js | 31 ++++++++++++------------ tpl/Admin/{ => Groups}/manage_groups.tpl | 0 3 files changed, 16 insertions(+), 17 deletions(-) rename tpl/Admin/{ => Groups}/manage_groups.tpl (100%) diff --git a/Pages/Admin/ManageGroupsPage.php b/Pages/Admin/ManageGroupsPage.php index 55a57c5a8..c06919610 100644 --- a/Pages/Admin/ManageGroupsPage.php +++ b/Pages/Admin/ManageGroupsPage.php @@ -165,7 +165,7 @@ public function ProcessPageLoad() $this->presenter->PageLoad(); $this->Set('chooseText', Resources::GetInstance()->GetString('Choose') . '...'); $this->Set('CanChangeRoles', $this->CanChangeRoles); - $this->Display('Admin/manage_groups.tpl'); + $this->Display('Admin/Groups/manage_groups.tpl'); } public function BindPageInfo(PageInfo $pageInfo) diff --git a/Web/scripts/admin/group.js b/Web/scripts/admin/group.js index 1a9cc73f7..e2d3eb937 100644 --- a/Web/scripts/admin/group.js +++ b/Web/scripts/admin/group.js @@ -71,6 +71,20 @@ function GroupManagement(opts) { elements.membersDialog.modal('show'); }); + elements.groupList.delegate('.groupAdmin', 'click', function () { + changeGroupAdmin(); + }); + + elements.groupList.delegate('.changeAdminGroups', 'click', function () { + changeAdminGroups(); + }); + elements.groupList.delegate('.changeAdminResources', 'click', function () { + changeAdminResources(); + }); + elements.groupList.delegate('.changeAdminSchedules', 'click', function () { + changeAdminSchedules(); + }); + elements.groupList.delegate('.delete', 'click', function () { deleteGroup(); }); @@ -127,20 +141,6 @@ function GroupManagement(opts) { elements.userSearch.val(''); }); - elements.groupList.delegate('.groupAdmin', 'click', function () { - changeGroupAdmin(); - }); - - elements.groupList.delegate('.changeAdminGroups', 'click', function () { - changeAdminGroups(); - }); - elements.groupList.delegate('.changeAdminResources', 'click', function () { - changeAdminResources(); - }); - elements.groupList.delegate('.changeAdminSchedules', 'click', function () { - changeAdminSchedules(); - }); - elements.checkAllResourcesFull.click(function (e) { e.preventDefault(); elements.permissionsDialog.find('.full').prop('selected', true) @@ -348,9 +348,8 @@ function GroupManagement(opts) { var changeGroupAdmin = function () { var groupId = getActiveId(); - + elements.groupAdminForm.find('select').val(''); - elements.groupAdminDialog.modal('show'); }; diff --git a/tpl/Admin/manage_groups.tpl b/tpl/Admin/Groups/manage_groups.tpl similarity index 100% rename from tpl/Admin/manage_groups.tpl rename to tpl/Admin/Groups/manage_groups.tpl From 4b47eb228d6621d7ab09c7b84a671a29638ca607 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 12 Jan 2025 01:48:52 +0100 Subject: [PATCH 02/24] updated manage_resources page to support Datatables pagination --- Web/scripts/admin/resource.js | 280 +++++++++++++++++----------------- lib/Common/SmartyPage.php | 4 + 2 files changed, 140 insertions(+), 144 deletions(-) diff --git a/Web/scripts/admin/resource.js b/Web/scripts/admin/resource.js index 50414d24b..f965727f8 100644 --- a/Web/scripts/admin/resource.js +++ b/Web/scripts/admin/resource.js @@ -116,153 +116,145 @@ function ResourceManagement(opts) { } ResourceManagement.prototype.init = function () { - $('.resourceDetails').each(function () { - var indicator = $('.indicator'); - var details = $(this); - var id = details.attr('data-resourceId'); - initializeResourceUI(id, details); + var ressourceTable = $('#resourcesTable_wrapper') - details.find('.update').click(function (e) { - e.preventDefault(); - setActiveResourceId(id); - }); - - details.find('.imageButton').click(function (e) { - showChangeImage(e); - }); - - var subscriptionCallback = function (data) { - details.find('.publicSettingsPlaceHolder').html(data); - }; - - details.find('.renameButton').click(function (e) { - e.stopPropagation(); - details.find('.resourceName').editable('toggle'); - }); - - details.find('.copyButton').click(function (e) { - e.stopPropagation(); - elements.copyName.val(getActiveResource().name + ' ' + options.copyText); - elements.copyDialog.modal('show'); - elements.copyName.select().focus(); - }); - - details.find('.changeScheduleButton').click(function (e) { - e.stopPropagation(); - details.find('.scheduleName').editable('toggle'); - }); - - details.find('.changeResourceType').click(function (e) { - e.stopPropagation(); - details.find('.resourceTypeName').editable('toggle'); - }); - - details.find('.changeSortOrder').click(function (e) { - e.stopPropagation(); - details.find('.sortOrderValue').editable('toggle'); - }); - - details.find('.changeLocation').click(function (e) { - e.stopPropagation(); - details.find('.locationValue').editable('toggle'); - }); - - details.find('.changeContact').click(function (e) { - e.stopPropagation(); - details.find('.contactValue').editable('toggle'); - }); - - details.find('.changeDescription').click(function (e) { - e.stopPropagation(); - details.find('.descriptionValue').editable('toggle'); - }); - - details.find('.changeNotes').click(function (e) { - e.stopPropagation(); - details.find('.notesValue').editable('toggle'); - }); - - details.find('.changeResourceAdmin').click(function (e) { - e.stopPropagation(); - details.find('.resourceAdminValue').editable('toggle'); - }); - - details.find('.adminButton').click(function (e) { - showResourceAdmin(e); - }); - - details.find('.deleteButton').click(function (e) { - showDeletePrompt(e); - }); - - details.find('.changeAttribute').click(function (e) { - e.stopPropagation(); - $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); - }); - - details.find('.changeStatus').click(function (e) { - showStatusPrompt(e); - }); - - details.find('.changeDuration').click(function (e) { - showDurationPrompt(e); - }); - - details.find('.changeCapacity').click(function (e) { - showCapacityPrompt(e); - }); - - details.find('.changeAccess').click(function (e) { - showAccessPrompt(e); - }); - - details.find('.changeUserPermission').click(function (e) { - changeUserPermissions(); - elements.userDialog.modal('show'); - }); - - details.find('.changeGroupPermissions').click(function (e) { - changeGroupPermissions(); - elements.groupDialog.modal('show'); - }); - - details.find('.changeResourceGroups').click(function (e) { - changeResourceGroups(); - elements.resourceGroupDialog.modal('show'); - }); - - details.find('.resourceColorPicker').on('change', function (e) { - setActiveResourceId(id); - var color = $(this).val(); - elements.reservationColor.val(color); - elements.colorForm.submit(); - }); - - details.find('.clearColor').click(function (e) { - $(this).siblings('.resourceColorPicker').val('#ffffff'); - elements.reservationColor.val(''); - elements.colorForm.submit(); - }); - - details.find('.changeCredits').click(function (e) { - var resource = getActiveResource(); - elements.creditsPerSlot.val(resource.credits); - elements.peakCreditsPerSlot.val(resource.peakCredits); - elements.creditsDialog.modal('show'); - }); - - details.delegate('.enableSubscription', 'click', function (e) { - e.preventDefault(); - PerformAsyncAction($(this), getSubmitCallback(options.actions.enableSubscription), $('#subscriptionIndicator'), subscriptionCallback); - }); - - details.delegate('.disableSubscription', 'click', function (e) { - e.preventDefault(); - PerformAsyncAction($(this), getSubmitCallback(options.actions.disableSubscription), $('#subscriptionIndicator'), subscriptionCallback); - }); + ressourceTable.on('click', '.update', function (e) { + e.preventDefault(); + var id = $(this).closest('.resourceDetails').attr('data-resourceId'); + setActiveResourceId(id); }); + ressourceTable.on('click', '.imageButton', function (e) { + showChangeImage(e); + }); + + ressourceTable.on('click', '.renameButton', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.resourceName').editable('toggle'); + }); + + ressourceTable.on('click', '.copyButton', function (e) { + e.stopPropagation(); + elements.copyName.val(getActiveResource().name + ' ' + options.copyText); + elements.copyDialog.modal('show'); + elements.copyName.select().focus(); + }); + + ressourceTable.on('click', '.changeScheduleButton', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.scheduleName').editable('toggle'); + }); + + ressourceTable.on('click', '.changeResourceType', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.resourceTypeName').editable('toggle'); + }); + + ressourceTable.on('click', '.changeSortOrder', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.sortOrderValue').editable('toggle'); + }); + + ressourceTable.on('click', '.changeLocation', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.locationValue').editable('toggle'); + }); + + ressourceTable.on('click', '.changeContact', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.contactValue').editable('toggle'); + }); + + ressourceTable.on('click', '.changeDescription', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.descriptionValue').editable('toggle'); + }); + + ressourceTable.on('click', '.changeNotes', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.notesValue').editable('toggle'); + }); + + ressourceTable.on('click', '.changeResourceAdmin', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.resourceAdminValue').editable('toggle'); + }); + + ressourceTable.on('click', '.adminButton', function (e) { + showResourceAdmin(e); + }); + + ressourceTable.on('click', '.deleteButton', function (e) { + showDeletePrompt(e); + }); + + ressourceTable.on('click', '.changeAttribute', function (e) { + e.stopPropagation(); + $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); + }); + + ressourceTable.on('click', '.changeStatus', function (e) { + showStatusPrompt(e); + }); + + ressourceTable.on('click', '.changeDuration', function (e) { + showDurationPrompt(e); + }); + + ressourceTable.on('click', '.changeCapacity', function (e) { + showCapacityPrompt(e); + }); + + ressourceTable.on('click', '.changeAccess', function (e) { + showAccessPrompt(e); + }); + + ressourceTable.on('click', '.changeUserPermission', function (e) { + changeUserPermissions(); + elements.userDialog.modal('show'); + }); + + ressourceTable.on('click', '.changeGroupPermissions', function (e) { + changeGroupPermissions(); + elements.groupDialog.modal('show'); + }); + + ressourceTable.on('click', '.changeResourceGroups', function (e) { + changeResourceGroups(); + elements.resourceGroupDialog.modal('show'); + }); + + ressourceTable.on('change', '.resourceColorPicker', function (e) { + setActiveResourceId($(this).closest('.resourceDetails').attr('data-resourceId')); + var color = $(this).val(); + elements.reservationColor.val(color); + elements.colorForm.submit(); + }); + + ressourceTable.on('click', '.clearColor', function (e) { + $(this).siblings('.resourceColorPicker').val('#ffffff'); + elements.reservationColor.val(''); + elements.colorForm.submit(); + }); + + ressourceTable.on('click', '.changeCredits', function (e) { + var resource = getActiveResource(); + elements.creditsPerSlot.val(resource.credits); + elements.peakCreditsPerSlot.val(resource.peakCredits); + elements.creditsDialog.modal('show'); + }); + + ressourceTable.on('click', '.enableSubscription, .disableSubscription', function (e) { + e.preventDefault(); + const details = $(this).closest('.resourceDetails'); + const action = $(this).hasClass('enableSubscription') ? options.actions.enableSubscription : options.actions.disableSubscription; // Determine the action + const subscriptionCallback = function (data) { + details.find('.publicSettingsPlaceHolder').html(data || '

No data received

'); + }; + PerformAsyncAction(details, getSubmitCallback(action), $('#subscriptionIndicator'), subscriptionCallback); + }); + elements.checkAllResources.click(function (e) { e.preventDefault(); elements.bulkUpdateList.find('input:checkbox').prop('checked', true); @@ -987,4 +979,4 @@ function ResourceManagement(opts) { elements.groupDiv.find('[group-id=' + id + ']').prop('checked', true); }); } -} +} \ No newline at end of file diff --git a/lib/Common/SmartyPage.php b/lib/Common/SmartyPage.php index 54703ed69..5a0138528 100644 --- a/lib/Common/SmartyPage.php +++ b/lib/Common/SmartyPage.php @@ -699,6 +699,10 @@ public function CreateDataTable($params) $(".buttons-collection").addClass("btn-sm"); }); }, + "drawCallback": function (settings) { + console.log("redraw") + setUpEditables(); + }, }); ' From 39ae91076a001c1ba828d1e6a753034f178718dd Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 12 Jan 2025 14:48:30 +0100 Subject: [PATCH 03/24] Updated event handing in schedule.js to work with Datatables --- Web/scripts/admin/schedule.js | 189 +++++++++++++++++----------------- lib/Common/SmartyPage.php | 4 +- 2 files changed, 98 insertions(+), 95 deletions(-) diff --git a/Web/scripts/admin/schedule.js b/Web/scripts/admin/schedule.js index 6d8365e2a..ddb8199ec 100644 --- a/Web/scripts/admin/schedule.js +++ b/Web/scripts/admin/schedule.js @@ -80,117 +80,118 @@ function ScheduleManagement(opts) { }; ScheduleManagement.prototype.init = function () { - $('.scheduleDetails').each(function () { - var details = $(this); - var id = details.find(':hidden.id').val(); - var reservable = details.find('.reservableSlots'); - var blocked = details.find('.blockedSlots'); - var timezone = details.find('.timezone'); - var daysVisible = details.find('.daysVisible'); - var dayOfWeek = details.find('.dayOfWeek'); - var usesDailyLayouts = details.find('.usesDailyLayouts'); - - details.find('a.update').click(function () { - setActiveScheduleId(id); - }); + var schedulesTable = $('#schedulesTable_wrapper'); - details.find('.renameButton').click(function (e) { - e.stopPropagation(); - details.find('.scheduleName').editable('toggle'); - }); + schedulesTable.on('click', '.update', function (e) { + e.preventDefault(); + var id = $(this).closest('.scheduleDetails').attr('data-schedule-id'); + setActiveScheduleId(id); + }); - details.find('.dayName').click(function (e) { - e.stopPropagation(); - $(this).editable('toggle'); - }); + schedulesTable.on('click', '.renameButton', function (e) { + e.stopPropagation(); + $(this).closest('.scheduleDetails').find('.scheduleName').editable('toggle'); + }); - details.find('.daysVisible').click(function (e) { - e.stopPropagation(); - $(this).editable('toggle'); - }); + schedulesTable.on('click', '.dayName', function (e) { + e.stopPropagation(); + $(this).editable('toggle'); + }); - details.find('.changeScheduleAdmin').click(function (e) { - e.stopPropagation(); - details.find('.scheduleAdmin').editable('toggle'); - }); + schedulesTable.on('click', '.daysVisible', function (e) { + e.stopPropagation(); + $(this).editable('toggle'); + }); - details.find('.changeLayoutButton').click(function (e) { - if ($(e.target).data('layout-type') == 0) { - showChangeLayout(e, reservable, blocked, timezone, (usesDailyLayouts.val() == 'false')); - } - else { - showChangeCustomLayout(id); - } - return false; - }); + schedulesTable.on('click', '.changeScheduleAdmin', function (e) { + e.stopPropagation(); + $(this).closest('.scheduleDetails').find('.scheduleAdmin').editable('toggle'); + }); - details.find('.makeDefaultButton').click(function (e) { - PerformAsyncAction($(this), getSubmitCallback(options.makeDefaultAction), $('#action-indicator')); - }); + schedulesTable.on('click', '.changeLayoutButton', function (e) { + var id = getActiveScheduleId(); + var reservable = $(this).closest('.scheduleDetails').find('.reservableSlots'); + var blocked = $(this).closest('.scheduleDetails').find('.blockedSlots'); + var timezone = $(this).closest('.scheduleDetails').find('.timezone'); + var usesDailyLayouts = $(this).closest('.scheduleDetails').find('.usesDailyLayouts'); + + if ($(e.target).data('layout-type') == 0) { + showChangeLayout(e, reservable, blocked, timezone, (usesDailyLayouts.val() == 'false')); + } else { + showChangeCustomLayout(id); + } + return false; + }); - details.find('.enableSubscription').click(function (e) { - PerformAsyncAction($(this), getSubmitCallback(options.enableSubscriptionAction), $('#action-indicator')); - }); + schedulesTable.on('click', '.makeDefaultButton, .enableSubscription, .disableSubscription', function (e) { + var action; + if ($(this).hasClass('makeDefaultButton')) { + action = options.makeDefaultAction; + } else if ($(this).hasClass('enableSubscription')) { + action = options.enableSubscriptionAction; + } else if ($(this).hasClass('disableSubscription')) { + action = options.disableSubscriptionAction; + } - details.find('.disableSubscription').click(function (e) { - PerformAsyncAction($(this), getSubmitCallback(options.disableSubscriptionAction), $('#action-indicator')); - }); + if (action) { + PerformAsyncAction($(this), getSubmitCallback(action), $('#action-indicator')); + } + }); - details.find('.deleteScheduleButton').click(function (e) { - showDeleteDialog(e); - return false; - }); + schedulesTable.on('click', '.deleteScheduleButton', function (e) { + showDeleteDialog(e); + return false; + }); - details.find('.showAllDailyLayouts').click(function (e) { - e.preventDefault(); - $(this).next('.allDailyLayouts').toggle(); - }); + schedulesTable.on('click', '.showAllDailyLayouts', function (e) { + e.preventDefault(); + $(this).next('.allDailyLayouts').toggle(); + }); - details.find('.changePeakTimes').click(function (e) { - e.preventDefault(); - showPeakTimesDialog(getActiveScheduleId()); - }); + schedulesTable.on('click', '.changePeakTimes', function (e) { + e.preventDefault(); + showPeakTimesDialog(getActiveScheduleId()); + }); - details.find('.changeAvailability').click(function (e) { - e.preventDefault(); - showAvailabilityDialog(getActiveScheduleId()); - }); + schedulesTable.on('click', '.changeAvailability', function (e) { + e.preventDefault(); + showAvailabilityDialog(getActiveScheduleId()); + }); - details.find('.toggleConcurrent').click(function (e) { - e.preventDefault(); - var toggle = $(e.target); - var container = toggle.parent('.concurrentContainer'); - toggleConcurrentReservations(getActiveScheduleId(), toggle, container); - }); + schedulesTable.on('click', '.toggleConcurrent', function (e) { + e.preventDefault(); + var toggle = $(e.target); + var container = toggle.parent('.concurrentContainer'); + toggleConcurrentReservations(getActiveScheduleId(), toggle, container); + }); - details.find('.defaultScheduleStyle').click(function (e) { - e.stopPropagation(); - $(this).editable('toggle'); - }); + schedulesTable.on('click', '.defaultScheduleStyle', function (e) { + e.stopPropagation(); + $(this).editable('toggle'); + }); - details.find('.switchLayout').click(function (e) { - e.preventDefault(); - $('#switchLayoutTypeId').val($(e.target).data('switch-to')); - elements.switchLayoutDialog.modal('show'); - }); + schedulesTable.on('click', '.switchLayout', function (e) { + e.preventDefault(); + $('#switchLayoutTypeId').val($(e.target).data('switch-to')); + elements.switchLayoutDialog.modal('show'); + }); - details.find('.changeScheduleConcurrentMaximum').click(function (e) { - e.preventDefault(); - var concurrent = $(e.target).closest('.maximumConcurrentContainer').data('concurrent'); - elements.maximumConcurrentUnlimited.attr('checked', concurrent == "0"); - elements.maximumConcurrent.val(concurrent); - elements.maximumConcurrent.attr('disabled', concurrent == "0"); - elements.concurrentMaximumDialog.modal('show'); - }); + schedulesTable.on('click', '.changeScheduleConcurrentMaximum', function (e) { + e.preventDefault(); + var concurrent = $(e.target).closest('.maximumConcurrentContainer').data('concurrent'); + elements.maximumConcurrentUnlimited.attr('checked', concurrent == "0"); + elements.maximumConcurrent.val(concurrent); + elements.maximumConcurrent.attr('disabled', concurrent == "0"); + elements.concurrentMaximumDialog.modal('show'); + }); - details.find('.changeResourcesPerReservation').click(function (e) { - e.preventDefault(); - var maximum = $(e.target).closest('.resourcesPerReservationContainer').data('maximum'); - elements.resourcesPerReservationUnlimited.attr('checked', maximum == "0"); - elements.resourcesPerReservationResources.val(maximum); - elements.resourcesPerReservationResources.attr('disabled', maximum == "0"); - elements.resourcesPerReservationDialog.modal('show'); - }); + schedulesTable.on('click', '.changeResourcesPerReservation', function (e) { + e.preventDefault(); + var maximum = $(e.target).closest('.resourcesPerReservationContainer').data('maximum'); + elements.resourcesPerReservationUnlimited.attr('checked', maximum == "0"); + elements.resourcesPerReservationResources.val(maximum); + elements.resourcesPerReservationResources.attr('disabled', maximum == "0"); + elements.resourcesPerReservationDialog.modal('show'); }); elements.deletePeakTimesButton.click(function (e) { diff --git a/lib/Common/SmartyPage.php b/lib/Common/SmartyPage.php index 5a0138528..d6dded7ef 100644 --- a/lib/Common/SmartyPage.php +++ b/lib/Common/SmartyPage.php @@ -700,7 +700,6 @@ public function CreateDataTable($params) }); }, "drawCallback": function (settings) { - console.log("redraw") setUpEditables(); }, }); @@ -731,6 +730,9 @@ public function CreateDataTableFilter($params) zeroRecords: "' . $NoResultsFoundText . '" }, + "drawCallback": function (settings) { + setUpEditables(); + }, }); ' From 7ddb038595043f99e808506c9278cc70c44123d8 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 12 Jan 2025 17:08:53 +0100 Subject: [PATCH 04/24] update ManageReservation and ManageQuota to work with DataTables --- Web/scripts/admin/quota.js | 3 ++- lib/Common/SmartyPage.php | 17 +++++++++++------ tpl/Admin/Reservations/manage_reservations.tpl | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Web/scripts/admin/quota.js b/Web/scripts/admin/quota.js index e03dddb4b..016707ce3 100644 --- a/Web/scripts/admin/quota.js +++ b/Web/scripts/admin/quota.js @@ -17,7 +17,8 @@ function QuotaManagement(opts) { var activeQuotaId = null; QuotaManagement.prototype.init = function () { - $('.delete').click(function (e) { + + $('#quotaList-content').on('click', '.delete', function (e) { e.preventDefault(); setActiveQuotaId($(this).attr('quotaId')); elements.deleteDialog.modal('show'); diff --git a/lib/Common/SmartyPage.php b/lib/Common/SmartyPage.php index d6dded7ef..be64a0298 100644 --- a/lib/Common/SmartyPage.php +++ b/lib/Common/SmartyPage.php @@ -659,9 +659,10 @@ public function CreateDataTable($params) return sprintf( ' ' @@ -731,8 +734,10 @@ public function CreateDataTableFilter($params) '" }, "drawCallback": function (settings) { - setUpEditables(); - }, + if (typeof setUpEditables !== "undefined") { + setUpEditables(); + } + } }); ' diff --git a/tpl/Admin/Reservations/manage_reservations.tpl b/tpl/Admin/Reservations/manage_reservations.tpl index 20a4dc464..7fec876aa 100644 --- a/tpl/Admin/Reservations/manage_reservations.tpl +++ b/tpl/Admin/Reservations/manage_reservations.tpl @@ -54,7 +54,7 @@ {translate key="Filter"} -
+
{assign var=groupClass value="col-12 col-sm-4 col-md-3"}
From d18abefb3e3662eb06c3ccfcc5f9ed0b04591b39 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 12 Jan 2025 17:09:36 +0100 Subject: [PATCH 05/24] small edit in tpl to sync according state with aria-state --- Web/scripts/admin/reservations.js | 69 ++++++++++++++++--------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/Web/scripts/admin/reservations.js b/Web/scripts/admin/reservations.js index 759d2212d..205962f89 100644 --- a/Web/scripts/admin/reservations.js +++ b/Web/scripts/admin/reservations.js @@ -67,11 +67,45 @@ function ReservationManagement(opts, approval) { ReservationManagement.prototype.init = function () { - elements.reservationTable.delegate('.changeAttribute', 'click', function (e) { + var reservationTable = $('#reservationTable_wrapper'); + + reservationTable.on('click', '.update', function (e) { + e.preventDefault(); + e.stopPropagation(); + + var td = $(this); + if (this.tagName != 'TD') { + td = $(this).closest('td'); + } + setCurrentReservationInformation(td); + }); + + reservationTable.on('click', '.changeAttribute', function (e) { e.stopPropagation(); $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); }); + reservationTable.on('click', 'tr.editable', function (e) { + if ($(e.target).hasClass('action') || $(e.target).hasClass('user') || $(e.target).closest('td').hasClass('action')) { + e.stopPropagation(); + return; + } + $(this).addClass('clicked'); + viewReservation($(this).attr('data-refnum')); + }); + + reservationTable.on('click', '.delete', function (e) { + e.preventDefault(); + e.stopPropagation(); + showDeleteReservation(getActiveReferenceNumber()); + }); + + reservationTable.on('click', '.approve', function (e) { + e.preventDefault(); + e.stopPropagation(); + approveReservation(getActiveReferenceNumber()); + }); + elements.deleteTerms.click(function (e) { elements.termsOfServiceForm.attr('ajaxAction', options.deleteTermsOfServiceAction); }); @@ -97,27 +131,8 @@ function ReservationManagement(opts, approval) { elements.referenceNumberList.val(referenceNumber); } - elements.reservationTable.delegate('a.update', 'click', function (e) { - e.preventDefault(); - e.stopPropagation(); - - var td = $(this); - if (this.tagName != 'TD') { - td = $(this).closest('td'); - } - setCurrentReservationInformation(td); - }); - - elements.reservationTable.delegate('tr.editable', 'click', function (e) { - if ($(e.target).hasClass('action') || $(e.target).hasClass('user') || $(e.target).closest('td').hasClass('action')) { - e.stopPropagation(); - return; - } - $(this).addClass('clicked'); - viewReservation($(this).attr('data-refnum')); - }); - elements.reservationTable.delegate('.edit', 'click', function (e) { + reservationTable.on('click', '.edit', function (e) { //This conditional prevents the edit button from working on mobile devices /*if ($(e.target).hasClass('action') || $(e.target).closest('td').hasClass('action')) { e.stopPropagation(); @@ -138,18 +153,6 @@ function ReservationManagement(opts, approval) { });*/ }); - elements.reservationTable.delegate('.delete', 'click', function (e) { - e.preventDefault(); - e.stopPropagation(); - showDeleteReservation(getActiveReferenceNumber()); - }); - - elements.reservationTable.delegate('.approve', 'click', function (e) { - e.preventDefault(); - e.stopPropagation(); - approveReservation(getActiveReferenceNumber()); - }); - elements.statusOptions.change(function (e) { populateReasonOptions(elements.statusOptions.val(), elements.statusReasons); }); From 80dd1d582075bea5ce53d2c20f7118b48960651b Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 13 Jan 2025 16:58:09 +0100 Subject: [PATCH 06/24] Add "group role" change button for groups that are not a GroupAdmin yet --- tpl/Admin/Groups/manage_groups.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tpl/Admin/Groups/manage_groups.tpl b/tpl/Admin/Groups/manage_groups.tpl index 2d2236aa2..b910021cc 100644 --- a/tpl/Admin/Groups/manage_groups.tpl +++ b/tpl/Admin/Groups/manage_groups.tpl @@ -67,8 +67,6 @@ {translate key='Change'} {if $CanChangeRoles} - - {if $group->IsExtendedAdmin()}
{translate key='Change'} @@ -103,6 +101,8 @@ {/if}
+ {else} + {translate key='Change'} {/if} {/if} From a4e4b7dd8dad76ec229fad227cd9f4f04f336685 Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 13 Jan 2025 16:58:52 +0100 Subject: [PATCH 07/24] updated layout of schedule legend layout --- tpl/Schedule/schedule.tpl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tpl/Schedule/schedule.tpl b/tpl/Schedule/schedule.tpl index 90c7c4202..160701bff 100644 --- a/tpl/Schedule/schedule.tpl +++ b/tpl/Schedule/schedule.tpl @@ -215,18 +215,18 @@ {block name="legend"}
-
{translate key=Reservable}
-
{translate key=Unreservable}
-
{translate key=Reserved}
+
{translate key=Reservable}
+
{translate key=Unreservable}
+
{translate key=Reserved}
{if $LoggedIn} -
{translate key=MyReservation} +
{translate key=MyReservation}
-
+
{translate key=Participant}
{/if} -
{translate key=Pending}
-
{translate key=Past}
-
{translate key=Restricted}
+
{translate key=Pending}
+
{translate key=Past}
+
{translate key=Restricted}
{/block} From 81f6456e75c0671e26729845b6d5ad78a44d0218 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 14 Jan 2025 20:13:57 +0100 Subject: [PATCH 08/24] updated structure From b34720dfa3b819d45eeb4d72bcada6b3cefdc389 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sat, 18 Jan 2025 16:13:33 +0100 Subject: [PATCH 09/24] changed deledate to on function. restructuring of event callers to work with datatables --- Web/scripts/admin/accessory.js | 10 ++-- Web/scripts/admin/announcement.js | 8 +-- Web/scripts/admin/attributes.js | 10 ++-- Web/scripts/admin/blackouts.js | 12 ++--- Web/scripts/admin/group.js | 32 ++++++------ Web/scripts/admin/reminder.js | 6 +-- Web/scripts/admin/reservation-colors.js | 17 ++++-- Web/scripts/admin/reservations.js | 23 ++++----- Web/scripts/admin/resource-groups.js | 2 +- Web/scripts/admin/resource-status.js | 6 +-- Web/scripts/admin/resource-types.js | 10 ++-- Web/scripts/admin/resource.js | 69 +++++++++++++------------ Web/scripts/admin/schedule.js | 35 ++++++------- Web/scripts/admin/user.js | 26 +++++----- Web/scripts/reservation-search.js | 2 +- Web/scripts/reservation.js | 22 ++++---- Web/scripts/schedule.js | 6 +-- 17 files changed, 152 insertions(+), 144 deletions(-) diff --git a/Web/scripts/admin/accessory.js b/Web/scripts/admin/accessory.js index f5404d6c1..80708628d 100644 --- a/Web/scripts/admin/accessory.js +++ b/Web/scripts/admin/accessory.js @@ -26,20 +26,20 @@ function AccessoryManagement(opts) { AccessoryManagement.prototype.init = function () { - elements.accessoryList.delegate('a.update', 'click', function (e) { + elements.accessoryList.on('click', 'a.update', function (e) { setActiveId($(this)); e.preventDefault(); }); - elements.accessoryList.delegate('.edit', 'click', function () { + elements.accessoryList.on('click', '.edit', function () { editAccessory(); }); - elements.accessoryList.delegate('.delete', 'click', function () { + elements.accessoryList.on('click', '.delete', function () { deleteAccessory(); }); - elements.accessoryList.delegate('.resources', 'click', function () { + elements.accessoryList.on('click', '.resources', function () { showAccessoryResources(); }); @@ -52,7 +52,7 @@ function AccessoryManagement(opts) { }); - elements.accessoryResourcesDialog.delegate('.resourceCheckbox', 'click', function () { + elements.accessoryResourcesDialog.on('click', '.resourceCheckbox', function () { handleAccessoryResourceClick($(this)); }); diff --git a/Web/scripts/admin/announcement.js b/Web/scripts/admin/announcement.js index 6f8bd25a8..d272c54f3 100644 --- a/Web/scripts/admin/announcement.js +++ b/Web/scripts/admin/announcement.js @@ -33,18 +33,18 @@ function AnnouncementManagement(opts) { AnnouncementManagement.prototype.init = function () { - elements.announcementList.delegate('a.update', 'click', function (e) { + elements.announcementList.on( 'click', 'a.update', function (e) { setActiveId($(this)); e.preventDefault(); }); - elements.announcementList.delegate('.edit', 'click', function () { + elements.announcementList.on('click', '.edit', function () { editAnnouncement(); }); - elements.announcementList.delegate('.sendEmail', 'click', function () { + elements.announcementList.on('click', '.sendEmail', function () { emailAnnouncement(); }); - elements.announcementList.delegate('.delete', 'click', function () { + elements.announcementList.on('click', '.delete', function () { deleteAnnouncement(); }); diff --git a/Web/scripts/admin/attributes.js b/Web/scripts/admin/attributes.js index 2e3a65603..930ef1a60 100644 --- a/Web/scripts/admin/attributes.js +++ b/Web/scripts/admin/attributes.js @@ -68,12 +68,12 @@ function AttributeManagement(opts) { RefreshAttributeList(); }); - elements.attributeList.delegate('a.update', 'click', function (e) { + elements.attributeList.on( 'click', 'a.update', function (e) { e.preventDefault(); e.stopPropagation(); }); - elements.attributeList.delegate('.delete', 'click', function (e) { + elements.attributeList.on('click', '.delete', function (e) { e.preventDefault(); var attributeId = $(this).closest('tr').attr('attributeId'); @@ -101,7 +101,7 @@ function AttributeManagement(opts) { showRelevantAttributeOptions($(this).val(), elements.addDialog); }); - elements.attributeList.delegate('.edit', 'click', function (e) { + elements.attributeList.on('click', '.edit', function (e) { e.preventDefault(); e.stopPropagation(); selectedEntityChoices = elements.editEntityChoices; @@ -145,11 +145,11 @@ function AttributeManagement(opts) { } }); - selectedEntityChoices.delegate('a.all', 'click', function (e) { + selectedEntityChoices.on('click', 'a.all', function (e) { onEntityChoiceClick(e); }); - selectedEntityChoices.delegate('a.ok', 'click', function (e) { + selectedEntityChoices.on('click', 'a.ok', function (e) { e.preventDefault(); selectedEntityChoices.hide(); handleEntitiesSelected(activeAppliesTo); diff --git a/Web/scripts/admin/blackouts.js b/Web/scripts/admin/blackouts.js index 4cededb98..4296b6f76 100644 --- a/Web/scripts/admin/blackouts.js +++ b/Web/scripts/admin/blackouts.js @@ -45,11 +45,11 @@ function BlackoutManagement(opts) { $(this).closest('.modal').modal("hide"); }); - $('#result').delegate('.reload', 'click', function (e) { + $('#result').on('click', '.reload', function (e) { location.reload(); }); - $('#result').delegate('.unblock', 'click', function (e) { + $('#result').on('click', '.unblock', function (e) { $('#result').hide(); $('#wait-box').modal('hide'); }); @@ -96,7 +96,7 @@ function BlackoutManagement(opts) { handleBlackoutApplicabilityChange(); wireUpTimePickers(); - elements.blackoutTable.delegate('.update', 'click', function (e) { + elements.blackoutTable.on('click', '.update', function (e) { e.preventDefault(); var tr = $(this).parents('tr'); @@ -104,11 +104,11 @@ function BlackoutManagement(opts) { setActiveBlackoutId(id); }); - elements.blackoutTable.delegate('.delete', 'click', function () { + elements.blackoutTable.on('click', '.delete', function () { showDeleteBlackout(); }); - elements.blackoutTable.delegate('.delete-recurring', 'click', function () { + elements.blackoutTable.on('click', '.delete-recurring', function () { showDeleteRecurringBlackout(); }); @@ -210,7 +210,7 @@ function BlackoutManagement(opts) { $(this).attachReservationPopup(refNum, options.popupUrl); }); - $("#reservationTable").delegate('.editable', 'click', function () { + $("#reservationTable").on('click', '.editable', function () { $(this).addClass('clicked'); var td = $(this).find('.referenceNumber'); viewReservation(td.text()); diff --git a/Web/scripts/admin/group.js b/Web/scripts/admin/group.js index e2d3eb937..0981c6dc0 100644 --- a/Web/scripts/admin/group.js +++ b/Web/scripts/admin/group.js @@ -53,47 +53,47 @@ function GroupManagement(opts) { GroupManagement.prototype.init = function () { - elements.groupList.delegate('a.update', 'click', function (e) { + elements.groupList.on('click', 'a.update', function (e) { setActiveId($(this)); e.preventDefault(); }); - elements.groupList.delegate('.rename', 'click', function () { + elements.groupList.on('click', '.rename', function () { editGroup(); }); - elements.groupList.delegate('.permissions', 'click', function () { + elements.groupList.on('click', '.permissions', function () { changePermissions(); }); - elements.groupList.delegate('.members', 'click', function () { + elements.groupList.on('click', '.members', function () { changeMembers(); elements.membersDialog.modal('show'); }); - elements.groupList.delegate('.groupAdmin', 'click', function () { + elements.groupList.on('click', '.groupAdmin', function () { changeGroupAdmin(); }); - elements.groupList.delegate('.changeAdminGroups', 'click', function () { + elements.groupList.on('click', '.changeAdminGroups', function () { changeAdminGroups(); }); - elements.groupList.delegate('.changeAdminResources', 'click', function () { + elements.groupList.on('click', '.changeAdminResources', function () { changeAdminResources(); }); - elements.groupList.delegate('.changeAdminSchedules', 'click', function () { + elements.groupList.on('click', '.changeAdminSchedules', function () { changeAdminSchedules(); }); - elements.groupList.delegate('.delete', 'click', function () { + elements.groupList.on('click', '.delete', function () { deleteGroup(); }); - elements.groupList.delegate('.roles', 'click', function () { + elements.groupList.on('click', '.roles', function () { changeRoles(); }); - elements.browseUserDialog.delegate('.add', 'click', function () { + elements.browseUserDialog.on('click', '.add', function () { var link = $(this); var userId = link.siblings('.id').val(); @@ -102,7 +102,7 @@ function GroupManagement(opts) { link.find('i').removeClass('bi-plus-square-fill text-success').addClass('bi-check-circle-fill text-info'); }); - elements.groupUserList.delegate('.delete', 'click', function () { + elements.groupUserList.on('click', '.delete', function () { var userId = $(this).siblings('.id').val(); removeUserFromGroup($(this), userId); }); @@ -347,9 +347,11 @@ function GroupManagement(opts) { }; var changeGroupAdmin = function () { - var groupId = getActiveId(); - - elements.groupAdminForm.find('select').val(''); + + var activeRow = elements.groupList.find('[data-group-id="' + getActiveId() + '"]'); + const currentGroupAdmin = activeRow.find('.groupAdmin ').text(); + const currentGroupAdminVal = $('#groupAdminForm').find('select').find('option').filter(function () { return $(this).html() == currentGroupAdmin; }).val(); + elements.groupAdminForm.find('select').val(currentGroupAdminVal||''); elements.groupAdminDialog.modal('show'); }; diff --git a/Web/scripts/admin/reminder.js b/Web/scripts/admin/reminder.js index 30a416886..1d7fea6f3 100644 --- a/Web/scripts/admin/reminder.js +++ b/Web/scripts/admin/reminder.js @@ -28,15 +28,15 @@ function ReminderManagement(opts) { ConfigureAdminDialog(elements.editDialog, 450, 200); ConfigureAdminDialog(elements.deleteDialog, 500, 200); - elements.reminderList.delegate('a.update', 'click', function(e) { + elements.reminderList.on('click', 'a.update', function(e) { setActiveId($(this)); e.preventDefault(); }); - elements.reminderList.delegate('.edit', 'click', function() { + elements.reminderList.on('click', '.edit', function() { editReminder(); }); - elements.reminderList.delegate('.delete', 'click', function() { + elements.reminderList.on('click', '.delete', function() { deleteReminder(); }); diff --git a/Web/scripts/admin/reservation-colors.js b/Web/scripts/admin/reservation-colors.js index dfa05a544..a82f957b8 100644 --- a/Web/scripts/admin/reservation-colors.js +++ b/Web/scripts/admin/reservation-colors.js @@ -1,5 +1,7 @@ function ReservationColorManagement(opts) { var elements = { + reservationColorTable: $('#reservationColorTable'), + deleteRuleId: $('#deleteRuleId'), attributeOption: $('#attributeOption'), @@ -14,6 +16,16 @@ function ReservationColorManagement(opts) { }; ReservationColorManagement.prototype.init = function () { + + elements.reservationColorTable.on('click', '.update', function (e) { + e.preventDefault(); + }); + + elements.reservationColorTable.on('click', '.delete', function () { + elements.deleteRuleId.val($(this).attr('ruleId')); + elements.deleteDialog.modal('show'); + }); + $(".save").click(function () { $(this).closest('form').submit(); }); @@ -22,11 +34,6 @@ function ReservationColorManagement(opts) { $(this).closest('.modal').modal("hide"); }); - $(".delete").click(function () { - elements.deleteRuleId.val($(this).attr('ruleId')); - elements.deleteDialog.modal('show'); - }); - $('#addRuleButton').click(function (e) { var attrId = '#attribute' + elements.attributeOption.val(); $('#attributeFillIn').empty(); diff --git a/Web/scripts/admin/reservations.js b/Web/scripts/admin/reservations.js index 205962f89..5e54dce30 100644 --- a/Web/scripts/admin/reservations.js +++ b/Web/scripts/admin/reservations.js @@ -10,7 +10,7 @@ function ReservationManagement(opts, approval) { resourceId: $("#resourceId"), statusId: $('#statusId'), referenceNumber: $("#referenceNumber"), - reservationTable: $("#reservationTable"), + elements.reservationTable: $("#elements.reservationTable"), updateScope: $('#hdnSeriesUpdateScope'), resourceStatusIdFilter: $('#resourceStatusIdFilter'), resourceReasonIdFilter: $('#resourceReasonIdFilter'), @@ -67,9 +67,8 @@ function ReservationManagement(opts, approval) { ReservationManagement.prototype.init = function () { - var reservationTable = $('#reservationTable_wrapper'); - reservationTable.on('click', '.update', function (e) { + elements.elements.reservationTable.on('click', '.update', function (e) { e.preventDefault(); e.stopPropagation(); @@ -80,12 +79,12 @@ function ReservationManagement(opts, approval) { setCurrentReservationInformation(td); }); - reservationTable.on('click', '.changeAttribute', function (e) { + elements.reservationTable.on('click', '.changeAttribute', function (e) { e.stopPropagation(); $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); }); - reservationTable.on('click', 'tr.editable', function (e) { + elements.reservationTable.on('click', 'tr.editable', function (e) { if ($(e.target).hasClass('action') || $(e.target).hasClass('user') || $(e.target).closest('td').hasClass('action')) { e.stopPropagation(); return; @@ -94,13 +93,13 @@ function ReservationManagement(opts, approval) { viewReservation($(this).attr('data-refnum')); }); - reservationTable.on('click', '.delete', function (e) { + elements.reservationTable.on('click', '.delete', function (e) { e.preventDefault(); e.stopPropagation(); showDeleteReservation(getActiveReferenceNumber()); }); - reservationTable.on('click', '.approve', function (e) { + elements.reservationTable.on('click', '.approve', function (e) { e.preventDefault(); e.stopPropagation(); approveReservation(getActiveReferenceNumber()); @@ -132,7 +131,7 @@ function ReservationManagement(opts, approval) { } - reservationTable.on('click', '.edit', function (e) { + elements.reservationTable.on('click', '.edit', function (e) { //This conditional prevents the edit button from working on mobile devices /*if ($(e.target).hasClass('action') || $(e.target).closest('td').hasClass('action')) { e.stopPropagation(); @@ -141,7 +140,7 @@ function ReservationManagement(opts, approval) { viewReservation($(this).closest('tr').attr('data-refnum')); }); - elements.reservationTable.find('tr.editable').each(function () { + elements.elements.reservationTable.find('tr.editable').each(function () { var seriesId = $(this).attr('data-seriesId'); var refNum = $(this).attr('data-refnum'); $(this).attachReservationPopup(refNum, options.popupUrl); @@ -192,7 +191,7 @@ function ReservationManagement(opts, approval) { elements.deleteMultiplePrompt.click(function (e) { e.preventDefault(); - var checked = elements.reservationTable.find('.delete-multiple:checked'); + var checked = elements.elements.reservationTable.find('.delete-multiple:checked'); elements.deleteMultipleCount.text(checked.length); elements.deleteMultiplePlaceHolder.empty(); elements.deleteMultiplePlaceHolder.append(checked.clone()); @@ -208,8 +207,8 @@ function ReservationManagement(opts, approval) { elements.deleteMultipleCheckboxes.click(function (e) { e.stopPropagation(); - var numberChecked = elements.reservationTable.find('.delete-multiple:checked').length; - var allSelected = numberChecked == elements.reservationTable.find('.delete-multiple').length; + var numberChecked = elements.elements.reservationTable.find('.delete-multiple:checked').length; + var allSelected = numberChecked == elements.elements.reservationTable.find('.delete-multiple').length; elements.deleteMultipleSelectAll.prop('checked', allSelected); elements.deleteMultiplePrompt.toggleClass('d-none', numberChecked == 0); }); diff --git a/Web/scripts/admin/resource-groups.js b/Web/scripts/admin/resource-groups.js index 25d9aabce..b9de1a879 100644 --- a/Web/scripts/admin/resource-groups.js +++ b/Web/scripts/admin/resource-groups.js @@ -90,7 +90,7 @@ function ResourceGroupManagement(opts) { moveNode(event.move_info.moved_node, event.move_info.target_node, event.move_info.previous_parent, event.move_info.position); }); - elements.groupDiv.delegate('.remove-resource', 'click', function (e) { + elements.groupDiv.on('click', '.remove-resource', function (e) { var nodeId = $(this).attr('node-id'); var resourceNode = elements.groupDiv.tree('getNodeById', nodeId); removeResource(resourceNode); diff --git a/Web/scripts/admin/resource-status.js b/Web/scripts/admin/resource-status.js index 4300a03bf..b14236324 100644 --- a/Web/scripts/admin/resource-status.js +++ b/Web/scripts/admin/resource-status.js @@ -17,7 +17,7 @@ function ResourceStatusManagement(opts) { ResourceStatusManagement.prototype.init = function () { var statusList = $('.resource-status-list'); - statusList.delegate('a.update', 'click', function (e) { + statusList.on('click', 'a.update', function (e) { var id = $(this).closest('.reason-item').attr('reasonId'); setActiveId(id); @@ -25,12 +25,12 @@ function ResourceStatusManagement(opts) { e.stopPropagation(); }); - statusList.delegate('a.edit', 'click', function (e) { + statusList.on('click', 'a.edit', function (e) { $('#edit-reason-description').val($(this).closest('.reason-item').find('.reason-description').text()); showEditPrompt(e); }); - statusList.delegate('a.delete', 'click', function (e) { + statusList.on('click','a.delete', function (e) { showDeletePrompt(e); }); diff --git a/Web/scripts/admin/resource-types.js b/Web/scripts/admin/resource-types.js index ca0863515..87a2431f3 100644 --- a/Web/scripts/admin/resource-types.js +++ b/Web/scripts/admin/resource-types.js @@ -24,7 +24,7 @@ function ResourceTypeManagement(opts) { $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); }); - elements.resourceTypes.delegate('a.update', 'click', function (e) { + elements.resourceTypes.on('click', 'a.update', function (e) { var id = $(this).siblings(':hidden.id').val(); setActiveId(id); @@ -32,20 +32,20 @@ function ResourceTypeManagement(opts) { e.stopPropagation(); }); - elements.resourceTypes.delegate('a.edit', 'click', function (e) { + elements.resourceTypes.on('click', 'a.edit', function (e) { showEdit(e); }); - elements.resourceTypes.delegate('a.delete', 'click', function (e) { + elements.resourceTypes.on('click', 'a.delete', function (e) { showDeletePrompt(e); }); - elements.resourceTypes.delegate('.changeAttributes', 'click', function (e) { + elements.resourceTypes.on('click', '.changeAttributes', function (e) { var id = $(this).attr('resourceTypeId'); setActiveId(id); }); - elements.resourceTypes.delegate('.changeAttributes, .customAttributes .cancel', 'click', function (e) { + elements.resourceTypes.on('click', '.changeAttributes, .customAttributes .cancel', function (e) { var id = getActiveId(); var otherUsers = $(".customAttributes[resourceTypeId!='" + id + "']"); otherUsers.find('.attribute-readwrite, .validationSummary').hide(); diff --git a/Web/scripts/admin/resource.js b/Web/scripts/admin/resource.js index f965727f8..244a76e5b 100644 --- a/Web/scripts/admin/resource.js +++ b/Web/scripts/admin/resource.js @@ -3,6 +3,7 @@ function ResourceManagement(opts) { var elements = { activeId: $('#activeId'), + resourcesList: $('#resourceList'), imageDialog: $('#imageDialog'), deleteDialog: $('#deletePrompt'), @@ -117,135 +118,134 @@ function ResourceManagement(opts) { ResourceManagement.prototype.init = function () { - var ressourceTable = $('#resourcesTable_wrapper') - ressourceTable.on('click', '.update', function (e) { + elements.resourcesList.on('click', '.update', function (e) { e.preventDefault(); var id = $(this).closest('.resourceDetails').attr('data-resourceId'); setActiveResourceId(id); }); - ressourceTable.on('click', '.imageButton', function (e) { + elements.resourcesList.on('click', '.imageButton', function (e) { showChangeImage(e); }); - ressourceTable.on('click', '.renameButton', function (e) { + elements.resourcesList.on('click', '.renameButton', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.resourceName').editable('toggle'); }); - ressourceTable.on('click', '.copyButton', function (e) { + elements.resourcesList.on('click', '.copyButton', function (e) { e.stopPropagation(); elements.copyName.val(getActiveResource().name + ' ' + options.copyText); elements.copyDialog.modal('show'); elements.copyName.select().focus(); }); - ressourceTable.on('click', '.changeScheduleButton', function (e) { + elements.resourcesList.on('click', '.changeScheduleButton', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.scheduleName').editable('toggle'); }); - ressourceTable.on('click', '.changeResourceType', function (e) { + elements.resourcesList.on('click', '.changeResourceType', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.resourceTypeName').editable('toggle'); }); - ressourceTable.on('click', '.changeSortOrder', function (e) { + elements.resourcesList.on('click', '.changeSortOrder', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.sortOrderValue').editable('toggle'); }); - ressourceTable.on('click', '.changeLocation', function (e) { + elements.resourcesList.on('click', '.changeLocation', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.locationValue').editable('toggle'); }); - ressourceTable.on('click', '.changeContact', function (e) { + elements.resourcesList.on('click', '.changeContact', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.contactValue').editable('toggle'); }); - ressourceTable.on('click', '.changeDescription', function (e) { + elements.resourcesList.on('click', '.changeDescription', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.descriptionValue').editable('toggle'); }); - ressourceTable.on('click', '.changeNotes', function (e) { + elements.resourcesList.on('click', '.changeNotes', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.notesValue').editable('toggle'); }); - ressourceTable.on('click', '.changeResourceAdmin', function (e) { + elements.resourcesList.on('click', '.changeResourceAdmin', function (e) { e.stopPropagation(); $(this).closest('.resourceDetails').find('.resourceAdminValue').editable('toggle'); }); - ressourceTable.on('click', '.adminButton', function (e) { + elements.resourcesList.on('click', '.adminButton', function (e) { showResourceAdmin(e); }); - ressourceTable.on('click', '.deleteButton', function (e) { + elements.resourcesList.on('click', '.deleteButton', function (e) { showDeletePrompt(e); }); - ressourceTable.on('click', '.changeAttribute', function (e) { + elements.resourcesList.on('click', '.changeAttribute', function (e) { e.stopPropagation(); $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); }); - ressourceTable.on('click', '.changeStatus', function (e) { + elements.resourcesList.on('click', '.changeStatus', function (e) { showStatusPrompt(e); }); - ressourceTable.on('click', '.changeDuration', function (e) { + elements.resourcesList.on('click', '.changeDuration', function (e) { showDurationPrompt(e); }); - ressourceTable.on('click', '.changeCapacity', function (e) { + elements.resourcesList.on('click', '.changeCapacity', function (e) { showCapacityPrompt(e); }); - ressourceTable.on('click', '.changeAccess', function (e) { + elements.resourcesList.on('click', '.changeAccess', function (e) { showAccessPrompt(e); }); - ressourceTable.on('click', '.changeUserPermission', function (e) { + elements.resourcesList.on('click', '.changeUserPermission', function (e) { changeUserPermissions(); elements.userDialog.modal('show'); }); - ressourceTable.on('click', '.changeGroupPermissions', function (e) { + elements.resourcesList.on('click', '.changeGroupPermissions', function (e) { changeGroupPermissions(); elements.groupDialog.modal('show'); }); - ressourceTable.on('click', '.changeResourceGroups', function (e) { + elements.resourcesList.on('click', '.changeResourceGroups', function (e) { changeResourceGroups(); elements.resourceGroupDialog.modal('show'); }); - ressourceTable.on('change', '.resourceColorPicker', function (e) { + elements.resourcesList.on('change', '.resourceColorPicker', function (e) { setActiveResourceId($(this).closest('.resourceDetails').attr('data-resourceId')); var color = $(this).val(); elements.reservationColor.val(color); elements.colorForm.submit(); }); - ressourceTable.on('click', '.clearColor', function (e) { + elements.resourcesList.on('click', '.clearColor', function (e) { $(this).siblings('.resourceColorPicker').val('#ffffff'); elements.reservationColor.val(''); elements.colorForm.submit(); }); - ressourceTable.on('click', '.changeCredits', function (e) { + elements.resourcesList.on('click', '.changeCredits', function (e) { var resource = getActiveResource(); elements.creditsPerSlot.val(resource.credits); elements.peakCreditsPerSlot.val(resource.peakCredits); elements.creditsDialog.modal('show'); }); - ressourceTable.on('click', '.enableSubscription, .disableSubscription', function (e) { + elements.resourcesList.on('click', '.enableSubscription, .disableSubscription', function (e) { e.preventDefault(); const details = $(this).closest('.resourceDetails'); const action = $(this).hasClass('enableSubscription') ? options.actions.enableSubscription : options.actions.disableSubscription; // Determine the action @@ -369,14 +369,14 @@ function ResourceManagement(opts) { showAllUsersToAdd(); }); - elements.resourceUserList.delegate('.change-permission-type', 'change', function (e) { + elements.resourceUserList.on('change', '.change-permission-type', function (e) { e.preventDefault(); var userId = $(this).data('user-id'); var type = $(this).val(); changeUserPermission(userId, type); }); - elements.allUsersList.delegate('.change-permission-type', 'change', function (e) { + elements.allUsersList.on('change', '.change-permission-type', function (e) { e.preventDefault(); var userId = $(this).data('user-id'); var type = $(this).val(); @@ -388,14 +388,14 @@ function ResourceManagement(opts) { showAllGroupsToAdd(); }); - elements.resourceGroupList.delegate('.change-permission-type', 'change', function (e) { + elements.resourceGroupList.on('change', '.change-permission-type', function (e) { e.preventDefault(); var groupId = $(this).data('group-id'); var type = $(this).val(); changeGroupPermission(groupId, type); }); - elements.allGroupsList.delegate('.change-permission-type', 'change', function (e) { + elements.allGroupsList.on('change', '.change-permission-type', function (e) { e.preventDefault(); var groupId = $(this).data('group-id'); var type = $(this).val(); @@ -432,14 +432,14 @@ function ResourceManagement(opts) { elements.importDialog.modal('show'); }); - elements.imageDialog.delegate('.defaultImage', 'click', function (e) { + elements.imageDialog.on('click', '.defaultImage', function (e) { e.preventDefault(); var image = $(e.target).closest('.resource-image').attr('id'); elements.defaultImageName.val(image); elements.defaultImageForm.submit(); }); - elements.imageDialog.delegate('.deleteImage', 'click', function (e) { + elements.imageDialog.on('click', '.deleteImage', function (e) { e.preventDefault(); var image = $(e.target).closest('.resource-image').attr('id'); elements.removeImageName.val(image); @@ -514,7 +514,8 @@ function ResourceManagement(opts) { ConfigureAsyncForm(elements.addForm, defaultSubmitCallback(elements.addForm), null, handleAddError); ConfigureAsyncForm(elements.deleteForm, defaultSubmitCallback(elements.deleteForm), function (result) { var id = getActiveResourceId(); - $('#resourceList').find('[data-resourceid="' + id + '"]').remove(); + console.log('deleting ' + id); + elements.resourcesList.find('[data-resourceid="' + id + '"]').closest('tr').remove(); elements.deleteDialog.modal('hide'); }); ConfigureAsyncForm(elements.durationForm, defaultSubmitCallback(elements.durationForm), onDurationSaved, null, { onBeforeSerialize: combineIntervals }); diff --git a/Web/scripts/admin/schedule.js b/Web/scripts/admin/schedule.js index ddb8199ec..5444b2499 100644 --- a/Web/scripts/admin/schedule.js +++ b/Web/scripts/admin/schedule.js @@ -3,6 +3,7 @@ function ScheduleManagement(opts) { var elements = { activeId: $('#activeId'), + scheduleList: $('#schedulesTable_wrapper'), layoutDialog: $('#changeLayoutDialog'), deleteDialog: $('#deleteDialog'), @@ -80,35 +81,33 @@ function ScheduleManagement(opts) { }; ScheduleManagement.prototype.init = function () { - var schedulesTable = $('#schedulesTable_wrapper'); - - schedulesTable.on('click', '.update', function (e) { + elements.scheduleList.on('click', '.update', function (e) { e.preventDefault(); var id = $(this).closest('.scheduleDetails').attr('data-schedule-id'); setActiveScheduleId(id); }); - schedulesTable.on('click', '.renameButton', function (e) { + elements.scheduleList.on('click', '.renameButton', function (e) { e.stopPropagation(); $(this).closest('.scheduleDetails').find('.scheduleName').editable('toggle'); }); - schedulesTable.on('click', '.dayName', function (e) { + elements.scheduleList.on('click', '.dayName', function (e) { e.stopPropagation(); $(this).editable('toggle'); }); - schedulesTable.on('click', '.daysVisible', function (e) { + elements.scheduleList.on('click', '.daysVisible', function (e) { e.stopPropagation(); $(this).editable('toggle'); }); - schedulesTable.on('click', '.changeScheduleAdmin', function (e) { + elements.scheduleList.on('click', '.changeScheduleAdmin', function (e) { e.stopPropagation(); $(this).closest('.scheduleDetails').find('.scheduleAdmin').editable('toggle'); }); - schedulesTable.on('click', '.changeLayoutButton', function (e) { + elements.scheduleList.on('click', '.changeLayoutButton', function (e) { var id = getActiveScheduleId(); var reservable = $(this).closest('.scheduleDetails').find('.reservableSlots'); var blocked = $(this).closest('.scheduleDetails').find('.blockedSlots'); @@ -123,7 +122,7 @@ function ScheduleManagement(opts) { return false; }); - schedulesTable.on('click', '.makeDefaultButton, .enableSubscription, .disableSubscription', function (e) { + elements.scheduleList.on('click', '.makeDefaultButton, .enableSubscription, .disableSubscription', function (e) { var action; if ($(this).hasClass('makeDefaultButton')) { action = options.makeDefaultAction; @@ -138,45 +137,45 @@ function ScheduleManagement(opts) { } }); - schedulesTable.on('click', '.deleteScheduleButton', function (e) { + elements.scheduleList.on('click', '.deleteScheduleButton', function (e) { showDeleteDialog(e); return false; }); - schedulesTable.on('click', '.showAllDailyLayouts', function (e) { + elements.scheduleList.on('click', '.showAllDailyLayouts', function (e) { e.preventDefault(); $(this).next('.allDailyLayouts').toggle(); }); - schedulesTable.on('click', '.changePeakTimes', function (e) { + elements.scheduleList.on('click', '.changePeakTimes', function (e) { e.preventDefault(); showPeakTimesDialog(getActiveScheduleId()); }); - schedulesTable.on('click', '.changeAvailability', function (e) { + elements.scheduleList.on('click', '.changeAvailability', function (e) { e.preventDefault(); showAvailabilityDialog(getActiveScheduleId()); }); - schedulesTable.on('click', '.toggleConcurrent', function (e) { + elements.scheduleList.on('click', '.toggleConcurrent', function (e) { e.preventDefault(); var toggle = $(e.target); var container = toggle.parent('.concurrentContainer'); toggleConcurrentReservations(getActiveScheduleId(), toggle, container); }); - schedulesTable.on('click', '.defaultScheduleStyle', function (e) { + elements.scheduleList.on('click', '.defaultScheduleStyle', function (e) { e.stopPropagation(); $(this).editable('toggle'); }); - schedulesTable.on('click', '.switchLayout', function (e) { + elements.scheduleList.on('click', '.switchLayout', function (e) { e.preventDefault(); $('#switchLayoutTypeId').val($(e.target).data('switch-to')); elements.switchLayoutDialog.modal('show'); }); - schedulesTable.on('click', '.changeScheduleConcurrentMaximum', function (e) { + elements.scheduleList.on('click', '.changeScheduleConcurrentMaximum', function (e) { e.preventDefault(); var concurrent = $(e.target).closest('.maximumConcurrentContainer').data('concurrent'); elements.maximumConcurrentUnlimited.attr('checked', concurrent == "0"); @@ -185,7 +184,7 @@ function ScheduleManagement(opts) { elements.concurrentMaximumDialog.modal('show'); }); - schedulesTable.on('click', '.changeResourcesPerReservation', function (e) { + elements.scheduleList.on('click', '.changeResourcesPerReservation', function (e) { e.preventDefault(); var maximum = $(e.target).closest('.resourcesPerReservationContainer').data('maximum'); elements.resourcesPerReservationUnlimited.attr('checked', maximum == "0"); diff --git a/Web/scripts/admin/user.js b/Web/scripts/admin/user.js index ca26b0dd5..d9a837c81 100644 --- a/Web/scripts/admin/user.js +++ b/Web/scripts/admin/user.js @@ -3,7 +3,7 @@ function UserManagement(opts) { var elements = { activeId: $('#activeId'), - userList: $('#userList'), + userList: $('#userList_wrapper'), userAutocomplete: $('#userSearch'), filterStatusId: $('#filterStatusId'), @@ -61,50 +61,50 @@ function UserManagement(opts) { var users = {}; UserManagement.prototype.init = function () { - elements.userList.delegate('.update', 'click', function (e) { + elements.userList.on('click', '.update', function (e) { setActiveUserElement($(this)); e.preventDefault(); }); - elements.userList.delegate('.changeStatus', 'click', function (e) { + elements.userList.on('click', '.changeStatus', function (e) { changeStatus($(this)); }); - elements.userList.delegate('.changeGroups', 'click', function (e) { + elements.userList.on('click', '.changeGroups', function (e) { changeGroups(); }); - elements.userList.delegate('.changePermissions', 'click', function (e) { + elements.userList.on('click', '.changePermissions', function (e) { changePermissions(); }); - elements.userList.delegate('.resetPassword', 'click', function (e) { + elements.userList.on('click', '.resetPassword', function (e) { elements.passwordDialog.find(':password').val(''); elements.passwordDialog.modal('show'); }); - elements.userList.delegate('.changeColor', 'click', function (e) { + elements.userList.on('click', '.changeColor', 'click', function (e) { var user = getActiveUser(); elements.colorValue.val(user.reservationColor); elements.colorDialog.modal('show'); }); - elements.userList.delegate('.edit', 'click', function () { + elements.userList.on('click', '.edit', function () { changeUserInfo(); }); - elements.userList.delegate('.delete', 'click', function (e) { + elements.userList.on('click', '.delete', function (e) { deleteUser(); }); - elements.userList.delegate('.viewReservations', 'click', function (e) { + elements.userList.on('click', '.viewReservations', function (e) { var user = getActiveUser(); var name = encodeURI(user.first + ' ' + user.last); var url = options.manageReservationsUrl + '?uid=' + user.id + '&un=' + name; window.location.href = url; }); - elements.userList.delegate('.changeAttribute', 'click', function (e) { + elements.userList.on('click', '.changeAttribute', function (e) { e.stopPropagation(); $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); }); @@ -124,7 +124,7 @@ function UserManagement(opts) { window.location.href = options.filterUrl + statusid; }); - elements.addedGroups.delegate('div', 'click', function (e) { + elements.addedGroups.on('click', 'div', function (e) { e.preventDefault(); $('#removeGroupId').val($(this).attr('groupId')); $('#removeGroupUserId').val(getActiveUserId()); @@ -136,7 +136,7 @@ function UserManagement(opts) { $(this).appendTo(elements.removedGroups); }); - elements.removedGroups.delegate('div', 'click', function (e) { + elements.removedGroups.on('click', 'div', function (e) { e.preventDefault(); $('#addGroupId').val($(this).attr('groupId')); $('#addGroupUserId').val(getActiveUserId()); diff --git a/Web/scripts/reservation-search.js b/Web/scripts/reservation-search.js index 9c41b9ca9..617956666 100644 --- a/Web/scripts/reservation-search.js +++ b/Web/scripts/reservation-search.js @@ -70,7 +70,7 @@ function ReservationSearch(options) { }); }; - elements.reservationResults.delegate('tr.editable', 'click', function (e) { + elements.reservationResults.on('click', 'tr.editable', function (e) { viewReservation($(this).attr('data-refnum')); }); diff --git a/Web/scripts/reservation.js b/Web/scripts/reservation.js index 49215e781..10a4a5ac4 100644 --- a/Web/scripts/reservation.js +++ b/Web/scripts/reservation.js @@ -133,7 +133,7 @@ function Reservation(opts) { InitializeParticipationElements(); - elements.groupDiv.delegate('.additionalResourceCheckbox, .additionalResourceGroupCheckbox', 'click', function (e) { + elements.groupDiv.on('click', '.additionalResourceCheckbox, .additionalResourceGroupCheckbox', function (e) { handleAdditionalResourceChecked($(this), e); }); @@ -249,7 +249,7 @@ function Reservation(opts) { return false; }); - elements.emailReservationList.delegate('.remove', 'click', function (e) { + elements.emailReservationList.on('click', '.remove', function (e) { $(e.target).closest('.emailAddress').remove(); }); @@ -903,17 +903,17 @@ function Reservation(opts) { participation.showAllGroupsToAdd(elements.participantGroupDialog); }); - elements.participantDialog.delegate('.add', 'click', function (e) { + elements.participantDialog.on('click', '.add', function (e) { e.preventDefault(); participation.addParticipant($(this).find('.name').text(), $(this).attr('user-id')); }); - elements.participantGroupDialog.delegate('.add', 'click', function (e) { + elements.participantGroupDialog.on('click', '.add', function (e) { e.preventDefault(); participation.addGroupParticipants($(this).attr('group-id')); }); - elements.participantList.delegate('.remove', 'click', function (e) { + elements.participantList.on('click', '.remove', function (e) { e.preventDefault(); var item = $(this).closest('.user'); var id = item.find('.id').val(); @@ -935,17 +935,17 @@ function Reservation(opts) { participation.showAllGroupsToAdd(elements.inviteeGroupDialog); }); - elements.inviteeDialog.delegate('.add', 'click', function (e) { + elements.inviteeDialog.on('click', '.add', function (e) { e.preventDefault(); participation.addInvitee($(this).find('.name').text(), $(this).attr('user-id')); }); - elements.inviteeGroupDialog.delegate('.add', 'click', function (e) { + elements.inviteeGroupDialog.on('click', '.add', function (e) { e.preventDefault(); participation.addGroupInvitees($(this).attr('group-id')); }); - elements.inviteeList.delegate('.remove', 'click', function (e) { + elements.inviteeList.on('click', '.remove', function (e) { e.preventDefault(); var item = $(this).closest('.user'); var id = item.find('.id').val(); @@ -1007,7 +1007,7 @@ function Reservation(opts) { enableCorrectButtons(); - elements.reservationAttachments.delegate('.add-attachment', 'click', function (e) { + elements.reservationAttachments.on('click', '.add-attachment', function (e) { e.preventDefault(); var li = $(this).closest('.attachment-item'); var cloned = li.clone(); @@ -1017,7 +1017,7 @@ function Reservation(opts) { enableCorrectButtons(); }); - elements.reservationAttachments.delegate('.remove-attachment', 'click', function (e) { + elements.reservationAttachments.on('click', '.remove-attachment', function (e) { e.preventDefault(); $(this).closest('.attachment-item').remove(); enableCorrectButtons(); @@ -1171,7 +1171,7 @@ function Reservation(opts) { changeUser.showAll(); }); - $('#changeUserDialog').delegate('.add', 'click', function () { + $('#changeUserDialog').on('click', '.add', function () { changeUser.chooseUser($(this).attr('userId'), $(this).text(), $(this).attr('availableCredits')); $('#changeUserDialog').modal('hide'); }); diff --git a/Web/scripts/schedule.js b/Web/scripts/schedule.js index 95ed859be..32d7865e8 100644 --- a/Web/scripts/schedule.js +++ b/Web/scripts/schedule.js @@ -1031,15 +1031,15 @@ function Schedule(opts, resourceGroups) { }); */ - reservations.delegate('.clickres', 'mousedown', function (e) { + reservations.on('mousedown', '.clickres', function (e) { $(e.target).addClass('clicked'); }); - reservations.delegate('.clickres', 'mouseup', function (e) { + reservations.on('mouseup', '.clickres', function (e) { $(e.target).removeClass('clicked'); }); - reservations.delegate('.reservable', 'click', function (e) { + reservations.on('click', '.reservable', function (e) { openReservation($(e.target), $(e.target)); }); } From de466b6df8154434d441735134ce431f8124ac05 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sat, 18 Jan 2025 16:14:01 +0100 Subject: [PATCH 10/24] add "add" fileld for group admin role --- tpl/Admin/Groups/manage_groups.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpl/Admin/Groups/manage_groups.tpl b/tpl/Admin/Groups/manage_groups.tpl index b910021cc..0e6e23664 100644 --- a/tpl/Admin/Groups/manage_groups.tpl +++ b/tpl/Admin/Groups/manage_groups.tpl @@ -102,7 +102,7 @@
{else} - {translate key='Change'} + {translate key='Add'} {/if} {/if} From 4b064acb9e98b811df866e87a6ce0d9321a2bcc7 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sat, 18 Jan 2025 16:14:15 +0100 Subject: [PATCH 11/24] renamed table to reservationColorTable --- tpl/Admin/Reservations/manage_reservation_colors.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpl/Admin/Reservations/manage_reservation_colors.tpl b/tpl/Admin/Reservations/manage_reservation_colors.tpl index fd5964fbd..f193549f1 100644 --- a/tpl/Admin/Reservations/manage_reservation_colors.tpl +++ b/tpl/Admin/Reservations/manage_reservation_colors.tpl @@ -24,7 +24,7 @@
- {assign var=tableId value=reservationTable} + {assign var=tableId value=reservationColorTable} From 07f6d7169d45f6f1091485ddc3f1c97d24d76986 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 19 Jan 2025 14:57:19 +0100 Subject: [PATCH 12/24] updated js structure. added data element to response --- Web/scripts/admin/blackouts.js | 417 +++++++++--------- tpl/Admin/Blackouts/manage_blackouts.tpl | 43 +- .../Blackouts/manage_blackouts_response.tpl | 2 +- 3 files changed, 232 insertions(+), 230 deletions(-) diff --git a/Web/scripts/admin/blackouts.js b/Web/scripts/admin/blackouts.js index 4296b6f76..c29d65e70 100644 --- a/Web/scripts/admin/blackouts.js +++ b/Web/scripts/admin/blackouts.js @@ -1,278 +1,277 @@ -function BlackoutManagement(opts) { - var options = opts; - - var elements = { - startDate: $("#formattedStartDate"), - endDate: $("#formattedEndDate"), - scheduleId: $("#scheduleId"), - resourceId: $("#resourceId"), - blackoutTable: $("#blackoutTable"), - reservationTable: $("#reservationTable"), - - allResources: $('#allResources'), - addResourceId: $('#addResourceId'), - addScheduleId: $('#addScheduleId'), - - deleteDialog: $('#deleteDialog'), - deleteRecurringDialog: $('#deleteRecurringDialog'), - - deleteForm: $('#deleteForm'), - deleteRecurringForm: $('#deleteRecurringForm'), - addBlackoutForm: $('#addBlackoutForm'), - - referenceNumberList: $(':hidden.reservationId'), - - deleteMultiplePrompt: $('#delete-selected'), - deleteMultipleDialog: $('#deleteMultipleDialog'), - deleteMultipleForm: $('#deleteMultipleForm'), - deleteMultipleCheckboxes: $('.delete-multiple'), - deleteMultipleSelectAll: $('#delete-all'), - deleteMultipleCount: $('#deleteMultipleCount'), - deleteMultiplePlaceHolder: $('#deleteMultiplePlaceHolder') - }; - - var blackoutId; - - BlackoutManagement.prototype.init = function () { +class BlackoutManagement { + constructor(options) { + this.options = options; + this.elements = this.initializeElements(); + this.activeId = null; + } - wireUpUpdateButtons(); + initializeElements() { + return { + startDate: $("#formattedStartDate"), + endDate: $("#formattedEndDate"), + scheduleId: $("#scheduleId"), + resourceId: $("#resourceId"), + blackoutTable: $("#blackoutTable"), + + allResources: $("#allResources"), + addResourceId: $("#addResourceId"), + addScheduleId: $("#addScheduleId"), + + deleteDialog: $("#deleteDialog"), + deleteRecurringDialog: $("#deleteRecurringDialog"), + + deleteForm: $("#deleteForm"), + deleteRecurringForm: $("#deleteRecurringForm"), + addBlackoutForm: $("#addBlackoutForm"), + + referenceNumberList: $(":hidden.reservationId"), + + deleteMultiplePrompt: $("#delete-selected"), + deleteMultipleDialog: $("#deleteMultipleDialog"), + deleteMultipleForm: $("#deleteMultipleForm"), + deleteMultipleCheckboxes: $(".delete-multiple"), + deleteMultipleSelectAll: $("#delete-all"), + deleteMultipleCount: $("#deleteMultipleCount"), + deleteMultiplePlaceHolder: $("#deleteMultiplePlaceHolder"), + }; + } - $(".save").click(function () { - $(this).closest('form').submit(); - }); + init() { + this.initTimePickers(); + this.handleBlackoutApplicabilityChange(); + this.bindEventListeners(); + this.configureAsyncForms(); + } - $(".cancel").click(function () { - $(this).closest('.modal').modal("hide"); - }); + bindEventListeners() { + const { blackoutTable, deleteMultiplePrompt, deleteMultipleSelectAll, deleteMultipleCheckboxes } = this.elements; + const { scopeOpts } = this.options; - $('#result').on('click', '.reload', function (e) { - location.reload(); + // Update buttons + $(".btnUpdateThisInstance").click((e) => { + e.preventDefault(); + e.stopPropagation(); + $(e.currentTarget).closest("form").find(".hdnSeriesUpdateScope").val(scopeOpts.instance); }); - $('#result').on('click', '.unblock', function (e) { - $('#result').hide(); - $('#wait-box').modal('hide'); + $(".btnUpdateAllInstances").click((e) => { + e.preventDefault(); + e.stopPropagation(); + $(e.currentTarget).closest("form").find(".hdnSeriesUpdateScope").val(scopeOpts.full); }); - elements.blackoutTable.on('click', '.edit', function (e) { - $('#update-spinner').removeClass('d-none'); - var tr = $(this).parents('tr'); - var id = tr.attr('data-blackout-id'); - - $('#update-box').modal('show'); - var updateDiv = $('#update-contents'); + // General buttons + //main interface + $(".save").click((e) => $(e.currentTarget).closest("form").submit()); + $(".cancel").click((e) => $(e.currentTarget).closest(".modal").modal("hide")); - updateDiv.empty(); - updateDiv.load(opts.editUrl + id, function () { - $('#update-spinner').addClass('d-none'); - - ConfigureAsyncForm($('#editBlackoutForm'), getUpdateUrl, onAddSuccess, null, { - onBeforeSubmit: onBeforeAddSubmit, target: '#result' - }); - - wireUpUpdateButtons(); - - $(".save").click(function () { - $(this).closest('form').submit(); - }); - - /*$('#cancelUpdate').click(function (e) { - $('#update-box').addClass('d-none'); - $.unblockUI(); - });*/ - - $('.blackoutResources').click(function (e) { - if ($(".blackoutResources input:checked").length == 0) { - e.preventDefault(); - } - }); - wireUpTimePickers(); - - }); - }); - - handleBlackoutApplicabilityChange(); - wireUpTimePickers(); - - elements.blackoutTable.on('click', '.update', function (e) { + // Blackout table actions + blackoutTable.on('click', '.update', (e) => { e.preventDefault(); - - var tr = $(this).parents('tr'); - var id = tr.attr('data-blackout-id'); - setActiveBlackoutId(id); + this.setActiveId($(e.currentTarget)); }); - elements.blackoutTable.on('click', '.delete', function () { - showDeleteBlackout(); - }); + blackoutTable.on("click", ".edit", (e) => this.showEditBlackout($(e.currentTarget))); + blackoutTable.on("click", ".delete", () => this.showDeleteBlackout()); + blackoutTable.on("click", ".delete-recurring", () => this.showDeleteRecurringBlackout()); - elements.blackoutTable.on('click', '.delete-recurring', function () { - showDeleteRecurringBlackout(); - }); + // Multiple delete actions + deleteMultiplePrompt.click((e) => this.showDeleteMultiple()); + deleteMultipleSelectAll.click((e) => this.toggleSelectAll(e)); + deleteMultipleCheckboxes.click((e) => this.toggleDeletePrompt(e)); - $('#showAll').click(function (e) { + // Reservation filters + $("#showAll").click((e) => { e.preventDefault(); - elements.startDate.val(''); - elements.endDate.val(''); - elements.scheduleId.val(''); - elements.resourceId.val(''); - - filterReservations(); + this.resetFilters(); }); - - $('#filter').click(function (e) { + $("#filter").click((e) => { e.preventDefault(); - filterReservations(); + this.filterReservations(); }); - elements.deleteMultiplePrompt.click(function (e) { - e.preventDefault(); - var checked = elements.blackoutTable.find('.delete-multiple:checked'); - elements.deleteMultipleCount.text(checked.length); - elements.deleteMultiplePlaceHolder.empty(); - elements.deleteMultiplePlaceHolder.append(checked.clone()); - elements.deleteMultipleDialog.modal('show'); - }); + //??? + $("#result").on("click", ".reload", () => location.reload()); - elements.deleteMultipleSelectAll.click(function (e) { - e.stopPropagation(); - var isChecked = elements.deleteMultipleSelectAll.is(":checked"); - elements.deleteMultipleCheckboxes.prop('checked', isChecked); - elements.deleteMultiplePrompt.toggleClass('d-none', !isChecked); + $("#result").on("click", ".unblock", () => { + $("#result").hide(); + $("#wait-box").modal("hide"); }); + } - elements.deleteMultipleCheckboxes.click(function (e) { - e.stopPropagation(); - var numberChecked = elements.reservationTable.find('.delete-multiple:checked').length; - var allSelected = numberChecked == elements.reservationTable.find('.delete-multiple').length; - elements.deleteMultipleSelectAll.prop('checked', allSelected); - elements.deleteMultiplePrompt.toggleClass('d-none', numberChecked == 0); - }); + configureAsyncForms() { + const { addBlackoutForm, deleteForm, deleteRecurringForm, deleteMultipleForm } = this.elements; - ConfigureAsyncForm(elements.addBlackoutForm, getAddUrl, onAddSuccess, null, { - onBeforeSubmit: onBeforeAddSubmit, target: '#result' + ConfigureAsyncForm(addBlackoutForm, this.getSubmitCallback(this.options.actions.add), this.onAddSuccess.bind(this), null, { + onBeforeSubmit: this.onBeforeAddSubmit.bind(this), + target: "#result", }); - ConfigureAsyncForm(elements.deleteForm, getDeleteUrl, onDeleteSuccess, null, { - onBeforeSubmit: onBeforeDeleteSubmit, target: '#result' + + ConfigureAsyncForm(deleteForm, this.getSubmitCallback(this.options.actions.delete), this.onDeleteSuccess.bind(this), null, { + onBeforeSubmit: this.onBeforeDeleteSubmit.bind(this), + target: "#result", }); - ConfigureAsyncForm(elements.deleteRecurringForm, getDeleteUrl, onDeleteSuccess, null, { - onBeforeSubmit: onBeforeDeleteSubmit, target: '#result' + + ConfigureAsyncForm(deleteRecurringForm, this.getSubmitCallback(this.options.actions.delete), this.onDeleteSuccess.bind(this), null, { + onBeforeSubmit: () => { + this.onBeforeDeleteSubmit(); + }, + target: "#result", }); - ConfigureAsyncForm(elements.deleteMultipleForm); - }; - function showDeleteBlackout() { - elements.deleteDialog.modal('show'); + ConfigureAsyncForm(deleteMultipleForm); } - function showDeleteRecurringBlackout() { - elements.deleteRecurringDialog.modal('show'); + getSubmitCallback(action) { + return () => `${this.options.submitUrl}?action=${action}&bid=${this.activeId}`; } - function setActiveBlackoutId(id) { - blackoutId = id; + setActiveId(button) { + this.activeId = button.parents("tr").data("blackout-id"); } - function getActiveBlackoutId() { - return blackoutId; + //filter actions + filterReservations() { + const { startDate, endDate, scheduleId, resourceId } = this.elements; + const filterQuery = `sd=${startDate.val()}&ed=${endDate.val()}&sid=${scheduleId.val()}&rid=${resourceId.val()}`; + window.location = `${document.location.pathname}?${encodeURI(filterQuery)}`; } - function showWaitBox() { - $('#update-box').modal('hide'); - $('#wait-box').modal('show'); - - $('#result').hide(); - $('#creatingNotification').show(); + resetFilters() { + const { startDate, endDate, scheduleId, resourceId } = this.elements; + startDate.val(""); + endDate.val(""); + scheduleId.val(""); + resourceId.val(""); + this.filterReservations(); } - function onBeforeAddSubmit(formData, jqForm, opts) { - var isValid = BeforeFormSubmit(formData, jqForm, opts); - - if (isValid) { - showWaitBox(); - } - return isValid; + //edit blackout + showEditBlackout(button) { + this.setActiveId(button); + const updateDiv = $("#update-contents"); + $("#update-box").modal("show"); + updateDiv.empty(); + updateDiv.load(this.getSubmitCallback(this.options.actions.edit)(), () => { + $("#update-spinner").addClass("d-none"); + + ConfigureAsyncForm( + $("#editBlackoutForm"), + this.getSubmitCallback(this.options.actions.update), + this.onAddSuccess, + null, + { onBeforeSubmit: this.onBeforeAddSubmit, target: "#result" } + ); + + this.initTimePickers(); + $(".save").click(() => $(this).closest('form').submit() ); + }); } - function onBeforeDeleteSubmit() { - $('.modal').modal('hide'); - showWaitBox(); + //multi delete actions + toggleDeletePrompt(e) { + e.stopPropagation(); + const numberChecked = this.elements.blackoutTable.find(".delete-multiple:checked").length; + const allSelected = numberChecked === this.elements.blackoutTable.find(".delete-multiple").length; + this.elements.deleteMultipleSelectAll.prop("checked", allSelected); + this.elements.deleteMultiplePrompt.toggleClass("d-none", numberChecked === 0); + this.elements.deleteMultiplePrompt.tooltip() } - function onAddSuccess() { - $('#creatingNotification').hide(); - $('#result').show(); - - $("#reservationTable").find('.editable').each(function () { - var refNum = $(this).find('.referenceNumber').text(); - $(this).attachReservationPopup(refNum, options.popupUrl); - }); + toggleSelectAll(e) { + e.stopPropagation(); + const isChecked = this.elements.deleteMultipleSelectAll.is(":checked"); + this.elements.deleteMultipleCheckboxes.prop('checked', isChecked); + this.elements.deleteMultiplePrompt.toggleClass('d-none', !isChecked); + } - $("#reservationTable").on('click', '.editable', function () { - $(this).addClass('clicked'); - var td = $(this).find('.referenceNumber'); - viewReservation(td.text()); - }); + showDeleteMultiple() { + const checked = this.elements.blackoutTable.find(".delete-multiple:checked"); + this.elements.deleteMultipleCount.text(checked.length); + this.elements.deleteMultiplePlaceHolder.empty().append(checked.clone()); + this.elements.deleteMultipleDialog.modal("show"); } - function onDeleteSuccess() { - location.reload(); + //single delete actions + showDeleteBlackout() { + this.elements.deleteDialog.modal("show"); } - function getDeleteUrl() { - return opts.deleteUrl + getActiveBlackoutId(); + showDeleteRecurringBlackout() { + this.elements.deleteRecurringDialog.modal("show"); } - function getAddUrl() { - return opts.addUrl; + initTimePickers() { + const { timeFormat } = this.options; + $('.timepicker').timepicker({ + timeFormat: timeFormat + }); } - function getUpdateUrl() { - return opts.updateUrl; + handleBlackoutApplicabilityChange() { + const { allResources, addResourceId, addScheduleId } = this.elements; + + allResources.change(function () { + if ($(this).is(":checked")) { + addResourceId.prop("disabled", true); + addScheduleId.prop("disabled", false); + } else { + addResourceId.prop("disabled", false); + addScheduleId.prop("disabled", true); + } + }); } - function filterReservations() { - var filterQuery = 'sd=' + elements.startDate.val() + '&ed=' + elements.endDate.val() + '&sid=' + elements.scheduleId.val() + '&rid=' + elements.resourceId.val(); + //form submission actions + onBeforeAddSubmit(formData, jqForm, opts) { + const isValid = BeforeFormSubmit(formData, jqForm, opts); + + if (isValid) { + this.showWaitBox(); + } - window.location = document.location.pathname + '?' + encodeURI(filterQuery); + return isValid; } - function viewReservation(referenceNumber) { - window.location = options.reservationUrlTemplate.replace('[refnum]', referenceNumber); + onBeforeDeleteSubmit() { + $(".modal").modal("hide"); + this.showWaitBox(); } - function handleBlackoutApplicabilityChange() { - elements.allResources.change(function () { - if ($(this).is(':checked')) { - elements.addResourceId.attr('disabled', 'disabled'); - elements.addScheduleId.removeAttr('disabled'); - } - else { - elements.addScheduleId.attr('disabled', 'disabled'); - elements.addResourceId.removeAttr('disabled'); - } + onAddSuccess() { + const popupUrl = this.options.popupUrl; + $("#creatingNotification").hide(); + $("#result").show(); + + + $("#reservationTable").find('.editable').each((_, e) => { + var refNum = $(e).data('reservation-id'); + $(e).attachReservationPopup(refNum, popupUrl); }); - } - function wireUpTimePickers() { - $('.timepicker').timepicker({ - timeFormat: options.timeFormat + $("#reservationTable").on('click', '.editable', (e) => { + var refNum = $(e.currentTarget).data('reservation-id'); + $(e.currentTarget).addClass('clicked'); + this.viewReservation(refNum); }); } - function ChangeUpdateScope(updateScopeValue) { - $('.hdnSeriesUpdateScope').val(updateScopeValue); + onDeleteSuccess() { + location.reload(); } - function wireUpUpdateButtons() { - $('.btnUpdateThisInstance').click(function () { - ChangeUpdateScope(options.scopeOpts.instance); - }); + showWaitBox() { + $("#update-box").modal("hide"); + $("#wait-box").modal("show"); + $("#result").hide(); + $("#creatingNotification").show(); + } - $('.btnUpdateAllInstances').click(function () { - ChangeUpdateScope(options.scopeOpts.full); - }); + viewReservation(referenceNumber) { + window.location = this.options.reservationUrlTemplate.replace("[refnum]", referenceNumber); } } + +export default BlackoutManagement; \ No newline at end of file diff --git a/tpl/Admin/Blackouts/manage_blackouts.tpl b/tpl/Admin/Blackouts/manage_blackouts.tpl index 3ea6d11a3..025f2aecf 100644 --- a/tpl/Admin/Blackouts/manage_blackouts.tpl +++ b/tpl/Admin/Blackouts/manage_blackouts.tpl @@ -181,7 +181,7 @@ aria-label="{translate key=All}" /> @@ -324,49 +324,52 @@ {datatable tableId=$tableId} {jsfile src="reservationPopup.js"} {jsfile src="ajax-helpers.js"} - {jsfile src="admin/blackouts.js"} {jsfile src="date-helper.js"} {jsfile src="recurrence.js"} - From 0008695a2f72d58a38fb79d4cf961f815990705d Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 23 Jan 2025 18:04:50 +0100 Subject: [PATCH 15/24] added trumbowyg as x-editable type and reformated resourceDetailsPopup to allow for html description and note field --- Web/css/librebooking.css | 8 +++ Web/css/trumbowyg.min.css | 2 + Web/scripts/js/trumbowyg.min.js | 2 + tpl/Admin/Resources/manage_resources.tpl | 71 +++++++++++++++++++++--- tpl/Ajax/resourcedetails.tpl | 37 ++++++------ tpl/globalheader.tpl | 9 ++- tpl/javascript-includes.tpl | 7 +++ 7 files changed, 110 insertions(+), 26 deletions(-) create mode 100644 Web/css/trumbowyg.min.css create mode 100644 Web/scripts/js/trumbowyg.min.js diff --git a/Web/css/librebooking.css b/Web/css/librebooking.css index 8ab5b0f3f..03d57d440 100644 --- a/Web/css/librebooking.css +++ b/Web/css/librebooking.css @@ -478,6 +478,10 @@ table.reservations td { z-index: 99999; } +#resourceDetailsDiv .description p, #resourceDetailsDiv .note p { + margin: 0; +} + #userDetailsDiv, #customize-columns { display: none; @@ -555,4 +559,8 @@ input.mid-number { .no-show { display: none !important; +} + +.trumbowyg-editor p, .notesValue p, .descriptionValue p { + margin: 0; } \ No newline at end of file diff --git a/Web/css/trumbowyg.min.css b/Web/css/trumbowyg.min.css new file mode 100644 index 000000000..09d2183a5 --- /dev/null +++ b/Web/css/trumbowyg.min.css @@ -0,0 +1,2 @@ +/** Trumbowyg v2.27.3 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg/ - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */ +#trumbowyg-icons,.trumbowyg-icons{overflow:hidden;visibility:hidden;height:0;width:0}#trumbowyg-icons svg,.trumbowyg-icons svg{height:0;width:0}.trumbowyg-box *,.trumbowyg-box ::after,.trumbowyg-box ::before,.trumbowyg-modal *,.trumbowyg-modal ::after,.trumbowyg-modal ::before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.trumbowyg-box svg,.trumbowyg-modal svg{width:17px;height:100%;color:#222;fill:#222}.trumbowyg-box{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:300px}.trumbowyg-editor-box{display:block;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.trumbowyg-box,.trumbowyg-editor-box{position:relative;width:100%;border:1px solid #d7e0e2}.trumbowyg-box .trumbowyg-editor{min-height:100%;margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#fefefe;border:none!important}.trumbowyg-editor-box,.trumbowyg-textarea{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:20px;width:100%;border-style:none;resize:none;outline:0;overflow:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.trumbowyg-editor-box.trumbowyg-autogrow-on-enter,.trumbowyg-textarea.trumbowyg-autogrow-on-enter{-webkit-transition:height .3s ease-out;-o-transition:height .3s ease-out;transition:height .3s ease-out}.trumbowyg-editor-box{padding:0}.trumbowyg-editor{outline:0;padding:20px}.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:transparent!important;text-shadow:0 0 7px #333}@media screen and (min-width:0 \0){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(200,200,200,.6)!important}}.trumbowyg-box-blur .trumbowyg-editor hr,.trumbowyg-box-blur .trumbowyg-editor img{opacity:.2}.trumbowyg-textarea{position:relative;display:block;overflow:auto;border:none;font-size:14px;font-family:Consolas,Courier,"Courier New",monospace;line-height:18px}.trumbowyg-box.trumbowyg-editor-visible .trumbowyg-textarea{height:1px!important;width:25%;min-height:0!important;padding:0!important;background:0 0;opacity:0!important}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-textarea{display:block;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1;margin-bottom:1px}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor-box{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor-box[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none;white-space:break-spaces}.trumbowyg-button-pane{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%;min-height:36px;background:#ecf0f1;border-bottom:1px solid #d7e0e2;margin:0;padding:0 5px;position:relative;list-style-type:none;line-height:10px;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;z-index:11}.trumbowyg-button-pane::after,.trumbowyg-button-pane::before{content:" ";display:block;position:absolute;top:35px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane::after{top:71px}.trumbowyg-button-pane .trumbowyg-button-group{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group::after{content:" ";display:block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.trumbowyg-button-pane .trumbowyg-button-group:last-child::after{content:none}.trumbowyg-button-pane button{display:block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;vertical-align:middle;-webkit-transition:background-color 150ms,opacity 150ms;-o-transition:background-color 150ms,opacity 150ms;transition:background-color 150ms,opacity 150ms}.trumbowyg-button-pane button.trumbowyg-textual-button{width:auto;line-height:35px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.trumbowyg-button-pane button.trumbowyg-disable,.trumbowyg-button-pane.trumbowyg-disable button:not(.trumbowyg-not-disable):not(.trumbowyg-active),.trumbowyg-disabled .trumbowyg-button-pane button:not(.trumbowyg-not-disable):not(.trumbowyg-viewHTML-button){opacity:.2;cursor:default;pointer-events:none}.trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::before,.trumbowyg-disabled .trumbowyg-button-pane .trumbowyg-button-group::before{background:#e3e9eb}.trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#fff;outline:0}.trumbowyg-button-pane .trumbowyg-open-dropdown::after{display:block;content:" ";position:absolute;top:27px;right:3px;height:0;width:0;border:3px solid transparent;border-top-color:#555}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button{padding-left:10px!important;padding-right:18px!important}.trumbowyg-button-pane .trumbowyg-open-dropdown.trumbowyg-textual-button::after{top:17px;right:7px}.trumbowyg-button-pane .trumbowyg-right{margin-left:auto}.trumbowyg-dropdown{max-width:300px;max-height:250px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;border:1px solid #d7e0e2;padding:5px 0;border-top:none;background:#fff;color:#222;margin-left:-1px;-webkit-box-shadow:rgba(0,0,0,.1) 0 2px 3px;box-shadow:rgba(0,0,0,.1) 0 2px 3px;z-index:12}.trumbowyg-dropdown button{display:block;width:100%;height:35px;line-height:35px;text-decoration:none;background:#fff;padding:0 20px 0 10px;color:#222;border:none;cursor:pointer;text-align:left;font-size:15px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-dropdown button:focus,.trumbowyg-dropdown button:hover{background:#ecf0f1}.trumbowyg-dropdown button svg{float:left;margin-right:14px}.trumbowyg-modal{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:520px;width:100%;height:350px;z-index:12;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);max-width:500px;width:calc(100% - 20px);padding-bottom:45px;z-index:1;background-color:#fff;text-align:center;font-size:14px;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;-webkit-box-shadow:rgba(0,0,0,.2) 0 2px 3px;box-shadow:rgba(0,0,0,.2) 0 2px 3px;-webkit-backface-visibility:hidden;backface-visibility:hidden}.trumbowyg-modal-box .trumbowyg-modal-title{font-size:24px;font-weight:700;margin:0 0 20px;padding:15px 0 13px;display:block;border-bottom:1px solid #d7e0e2}.trumbowyg-modal-box .trumbowyg-progress{width:100%;height:3px;position:absolute;top:58px}.trumbowyg-modal-box .trumbowyg-progress .trumbowyg-progress-bar{background:#2bc06a;width:0;height:100%;-webkit-transition:width 150ms linear;-o-transition:width 150ms linear;transition:width 150ms linear}.trumbowyg-modal-box .trumbowyg-input-row{position:relative;margin:15px 12px;border:1px solid #dedede;overflow:hidden}.trumbowyg-modal-box .trumbowyg-input-infos{text-align:left;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;width:150px;border-right:1px solid #dedede;padding:0 7px;background-color:#fbfcfc;position:absolute;left:0;top:0;bottom:0}.trumbowyg-modal-box .trumbowyg-input-infos label{color:#69878f;overflow:hidden;height:27px;line-height:27px}.trumbowyg-modal-box .trumbowyg-input-infos label,.trumbowyg-modal-box .trumbowyg-input-infos label span{display:block;height:27px;line-height:27px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-input-infos .trumbowyg-msg-error{color:#e74c3c}.trumbowyg-modal-box .trumbowyg-input-html{padding:1px 1px 1px 152px}.trumbowyg-modal-box .trumbowyg-input-html,.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{font-size:14px}.trumbowyg-modal-box .trumbowyg-input-html input,.trumbowyg-modal-box .trumbowyg-input-html select,.trumbowyg-modal-box .trumbowyg-input-html textarea{-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms;height:27px;line-height:27px;border:0;width:100%;padding:0 7px}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html input:hover,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html select:hover,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:hover{outline:1px solid #95a5a6}.trumbowyg-modal-box .trumbowyg-input-html input:focus,.trumbowyg-modal-box .trumbowyg-input-html select:focus,.trumbowyg-modal-box .trumbowyg-input-html textarea:focus{background:#fbfcfc}.trumbowyg-modal-box .trumbowyg-input-html input[type=checkbox]{width:16px;height:16px;padding:0}.trumbowyg-modal-box .trumbowyg-input-html-with-checkbox{text-align:left;padding:3px 1px 1px 3px}.trumbowyg-modal-box .trumbowyg-input-error input,.trumbowyg-modal-box .trumbowyg-input-error select,.trumbowyg-modal-box .trumbowyg-input-error textarea{outline:1px solid #e74c3c}.trumbowyg-modal-box .trumbowyg-input-error .trumbowyg-input-infos label span:first-child{margin-top:-27px}.trumbowyg-modal-box .error{margin-top:25px;display:block;color:red}.trumbowyg-modal-box .trumbowyg-modal-button{position:absolute;bottom:10px;right:0;text-decoration:none;color:#fff;display:block;width:100px;height:35px;line-height:33px;margin:0 10px;background-color:#333;border:none;cursor:pointer;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif;font-size:16px;-webkit-transition:all 150ms;-o-transition:all 150ms;transition:all 150ms}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{right:110px;background:#2bc06a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#40d47e;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#25a25a}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{color:#555;background:#e6e6e6}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#fbfbfb;outline:0}.trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#d5d5d5}.trumbowyg-overlay{position:absolute;background-color:rgba(255,255,255,.5);height:100%;width:100%;left:0;display:none;top:0;z-index:10}body.trumbowyg-body-fullscreen{overflow:hidden}.trumbowyg-fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;margin:0;padding:0;z-index:99999}.trumbowyg-fullscreen .trumbowyg-editor-box,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor-box,.trumbowyg-fullscreen .trumbowyg-textarea{height:auto!important;overflow:auto}.trumbowyg-fullscreen .trumbowyg-overlay{height:100%!important}.trumbowyg-fullscreen .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:#222;fill:transparent}.trumbowyg-editor embed,.trumbowyg-editor img,.trumbowyg-editor object,.trumbowyg-editor video{max-width:100%}.trumbowyg-editor img,.trumbowyg-editor video{height:auto}.trumbowyg-editor img{cursor:move}.trumbowyg-editor canvas:focus{outline:0}.trumbowyg-editor.trumbowyg-reset-css{background:#fefefe!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;line-height:1.45em!important;color:#333!important;font-weight:400!important}.trumbowyg-editor.trumbowyg-reset-css a{color:#15c!important;text-decoration:underline!important}.trumbowyg-editor.trumbowyg-reset-css blockquote,.trumbowyg-editor.trumbowyg-reset-css div,.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css p,.trumbowyg-editor.trumbowyg-reset-css ul{-webkit-box-shadow:none!important;box-shadow:none!important;background:0 0!important;margin:0!important;margin-bottom:15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none!important}.trumbowyg-editor.trumbowyg-reset-css hr,.trumbowyg-editor.trumbowyg-reset-css iframe,.trumbowyg-editor.trumbowyg-reset-css object{margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css blockquote{margin-left:32px!important;font-style:italic!important;color:#555!important}.trumbowyg-editor.trumbowyg-reset-css ul{list-style:disc!important}.trumbowyg-editor.trumbowyg-reset-css ol{list-style:decimal!important}.trumbowyg-editor.trumbowyg-reset-css ol,.trumbowyg-editor.trumbowyg-reset-css ul{padding-left:20px!important}.trumbowyg-editor.trumbowyg-reset-css ol ol,.trumbowyg-editor.trumbowyg-reset-css ol ul,.trumbowyg-editor.trumbowyg-reset-css ul ol,.trumbowyg-editor.trumbowyg-reset-css ul ul{border:none!important;margin:2px!important;padding:0!important;padding-left:24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block!important;height:1px!important;border:none!important;border-top:1px solid #ccc!important}.trumbowyg-editor.trumbowyg-reset-css h1,.trumbowyg-editor.trumbowyg-reset-css h2,.trumbowyg-editor.trumbowyg-reset-css h3,.trumbowyg-editor.trumbowyg-reset-css h4{color:#111!important;background:0 0!important;margin:0!important;padding:0!important;font-weight:700!important}.trumbowyg-editor.trumbowyg-reset-css h1{font-size:32px!important;line-height:38px!important;margin-bottom:20px!important}.trumbowyg-editor.trumbowyg-reset-css h2{font-size:26px!important;line-height:34px!important;margin-bottom:15px!important}.trumbowyg-editor.trumbowyg-reset-css h3{font-size:22px!important;line-height:28px!important;margin-bottom:7px!important}.trumbowyg-editor.trumbowyg-reset-css h4{font-size:16px!important;line-height:22px!important;margin-bottom:7px!important}.trumbowyg-dark .trumbowyg-textarea{background:#222;color:#fff;border-color:#343434}.trumbowyg-dark .trumbowyg-box{border:1px solid #343434}.trumbowyg-dark .trumbowyg-box.trumbowyg-fullscreen{background:#111}.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{text-shadow:0 0 7px #ccc}@media screen and (min-width:0 \0){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}@supports (-ms-accelerator:true){.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor *,.trumbowyg-dark .trumbowyg-box.trumbowyg-box-blur .trumbowyg-editor::before{color:rgba(20,20,20,.6)!important}}.trumbowyg-dark .trumbowyg-box svg{fill:#fff;color:#fff}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after,.trumbowyg-dark .trumbowyg-button-pane::before{background:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty)::after{background-color:#343434}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-dark .trumbowyg-button-pane.trumbowyg-disable .trumbowyg-button-group::after{background-color:#2a2a2a}.trumbowyg-dark .trumbowyg-button-pane button.trumbowyg-active,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):focus,.trumbowyg-dark .trumbowyg-button-pane button:not(.trumbowyg-disable):hover{background-color:#333}.trumbowyg-dark .trumbowyg-button-pane .trumbowyg-open-dropdown::after{border-top-color:#fff}.trumbowyg-dark .trumbowyg-fullscreen .trumbowyg-button-pane .trumbowyg-button-group:not(:empty) .trumbowyg-fullscreen-button svg{color:#ecf0f1;fill:transparent}.trumbowyg-dark .trumbowyg-dropdown{border-color:#343434;background:#333;-webkit-box-shadow:rgba(0,0,0,.3) 0 2px 3px;box-shadow:rgba(0,0,0,.3) 0 2px 3px}.trumbowyg-dark .trumbowyg-dropdown button{background:#333;color:#fff}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#333;color:#fff}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row{border-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-infos{color:#eee;background-color:#2f2f2f;border-right-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#343434}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row.trumbowyg-input-error select,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-input-row.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box input,.trumbowyg-dark .trumbowyg-modal-box select,.trumbowyg-dark .trumbowyg-modal-box textarea{border-color:#343434;color:#fff;background:#222}.trumbowyg-dark .trumbowyg-modal-box input:focus,.trumbowyg-dark .trumbowyg-modal-box input:hover,.trumbowyg-dark .trumbowyg-modal-box select:focus,.trumbowyg-dark .trumbowyg-modal-box select:hover,.trumbowyg-dark .trumbowyg-modal-box textarea:focus,.trumbowyg-dark .trumbowyg-modal-box textarea:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box input:focus,.trumbowyg-dark .trumbowyg-modal-box select:focus,.trumbowyg-dark .trumbowyg-modal-box textarea:focus{background-color:#2f2f2f}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit{background:#1b7943}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:hover{background:#25a25a}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-submit:active{background:#176437}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset{background:#333;color:#ccc}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:focus,.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:hover{background:#444}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-button.trumbowyg-modal-reset:active{background:#111}.trumbowyg-dark .trumbowyg-overlay{background-color:rgba(15,15,15,.6)} \ No newline at end of file diff --git a/Web/scripts/js/trumbowyg.min.js b/Web/scripts/js/trumbowyg.min.js new file mode 100644 index 000000000..db50818f4 --- /dev/null +++ b/Web/scripts/js/trumbowyg.min.js @@ -0,0 +1,2 @@ +/** Trumbowyg v2.27.3 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg/ - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */ +jQuery.trumbowyg={langs:{en:{viewHTML:"View HTML",undo:"Undo",redo:"Redo",formatting:"Formatting",p:"Paragraph",blockquote:"Quote",code:"Code",header:"Header",bold:"Bold",italic:"Italic",strikethrough:"Strikethrough",underline:"Underline",strong:"Strong",em:"Emphasis",del:"Deleted",superscript:"Superscript",subscript:"Subscript",unorderedList:"Unordered list",orderedList:"Ordered list",insertImage:"Insert Image",link:"Link",createLink:"Insert link",unlink:"Remove link",_self:"Same tab (default)",_blank:"New tab",justifyLeft:"Align Left",justifyCenter:"Align Center",justifyRight:"Align Right",justifyFull:"Align Justify",horizontalRule:"Insert horizontal rule",removeformat:"Remove format",fullscreen:"Fullscreen",close:"Close",submit:"Confirm",reset:"Cancel",required:"Required",description:"Description",title:"Title",text:"Text",target:"Target",width:"Width"}},plugins:{},svgPath:null,svgAbsoluteUseHref:!1,hideButtonTexts:null},Object.defineProperty(jQuery.trumbowyg,"defaultOptions",{value:{lang:"en",fixedBtnPane:!1,fixedFullWidth:!1,autogrow:!1,autogrowOnEnter:!1,imageWidthModalEdit:!1,hideButtonTexts:null,prefix:"trumbowyg-",tagClasses:{},semantic:!0,semanticKeepAttributes:!1,resetCss:!1,removeformatPasted:!1,tabToIndent:!1,tagsToRemove:[],tagsToKeep:["hr","img","embed","iframe","input"],btns:[["viewHTML"],["undo","redo"],["formatting"],["strong","em","del"],["superscript","subscript"],["link"],["insertImage"],["justifyLeft","justifyCenter","justifyRight","justifyFull"],["unorderedList","orderedList"],["horizontalRule"],["removeformat"],["fullscreen"]],btnsDef:{},changeActiveDropdownIcon:!1,inlineElementsSelector:"a,abbr,acronym,b,caption,cite,code,col,dfn,dir,dt,dd,em,font,hr,i,kbd,li,q,span,strikeout,strong,sub,sup,u",pasteHandlers:[],plugins:{},urlProtocol:!1,minimalLinks:!1,linkTargets:["_self","_blank"],svgPath:null},writable:!1,enumerable:!0,configurable:!1}),function(e,t,n,a){"use strict";var o="tbwconfirm",r="tbwcancel";a.fn.trumbowyg=function(e,t){var n="trumbowyg";if(e===Object(e)||!e)return this.each((function(){a(this).data(n)||a(this).data(n,new i(this,e))}));if(1===this.length)try{var o=a(this).data(n);switch(e){case"execCmd":return o.execCmd(t.cmd,t.param,t.forceCss,t.skipTrumbowyg);case"openModal":return o.openModal(t.title,t.content);case"closeModal":return o.closeModal();case"openModalInsert":return o.openModalInsert(t.title,t.fields,t.callback);case"saveRange":return o.saveRange();case"getRange":return o.range;case"getRangeText":return o.getRangeText();case"restoreRange":return o.restoreRange();case"enable":return o.setDisabled(!1);case"disable":return o.setDisabled(!0);case"toggle":return o.toggle();case"destroy":return o.destroy();case"empty":return o.empty();case"html":return o.html(t)}}catch(e){}return!1};var i=function(o,r){var i=this,s="trumbowyg-icons",l=a.trumbowyg;i.doc=o.ownerDocument||n,i.$ta=a(o),i.$c=a(o),null!=(r=r||{}).lang||null!=l.langs[r.lang]?i.lang=a.extend(!0,{},l.langs.en,l.langs[r.lang]):i.lang=l.langs.en,i.hideButtonTexts=null!=l.hideButtonTexts?l.hideButtonTexts:r.hideButtonTexts;var d=null!=l.svgPath?l.svgPath:r.svgPath;if(i.hasSvg=!1!==d,!1!==d&&(l.svgAbsoluteUseHref||0===a("#"+s,i.doc).length)){if(null==d)a("script[src]").each((function(e,t){var n=t.src,a=n.match("trumbowyg(.min)?.js");null!=a&&(d=n.substring(0,n.indexOf(a[0]))+"ui/icons.svg")}));if(null==d)console.warn("You must define svgPath: https://goo.gl/CfTY9U");else if(!l.svgAbsoluteUseHref){var c=i.doc.createElement("div");c.id=s,i.doc.body.insertBefore(c,i.doc.body.childNodes[0]),a.ajax({async:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",dataType:"xml",crossDomain:!0,url:d,data:null,beforeSend:null,complete:null,success:function(e){c.innerHTML=(new XMLSerializer).serializeToString(e.documentElement)}})}}var u=i.doc.querySelector("base")?t.location.href.replace(t.location.hash,""):"";i.svgPath=l.svgAbsoluteUseHref?d:u;var g=i.lang.header,f=function(){return(t.chrome||t.Intl&&Intl.v8BreakIterator)&&"CSS"in t};i.btnsDef={viewHTML:{fn:"toggle",class:"trumbowyg-not-disable"},undo:{isSupported:f,key:"Z"},redo:{isSupported:f,key:"Y"},p:{fn:"formatBlock"},blockquote:{fn:"formatBlock"},h1:{fn:"formatBlock",title:g+" 1"},h2:{fn:"formatBlock",title:g+" 2"},h3:{fn:"formatBlock",title:g+" 3"},h4:{fn:"formatBlock",title:g+" 4"},h5:{fn:"formatBlock",title:g+" 5"},h6:{fn:"formatBlock",title:g+" 6"},subscript:{tag:"sub"},superscript:{tag:"sup"},bold:{key:"B",tag:"b"},italic:{key:"I",tag:"i"},underline:{tag:"u"},strikethrough:{tag:"strike"},strong:{fn:"bold",key:"B"},em:{fn:"italic",key:"I"},del:{fn:"strikethrough"},createLink:{key:"K",tag:"a"},unlink:{},insertImage:{},justifyLeft:{tag:"left",forceCss:!0},justifyCenter:{tag:"center",forceCss:!0},justifyRight:{tag:"right",forceCss:!0},justifyFull:{tag:"justify",forceCss:!0},unorderedList:{fn:"insertUnorderedList",tag:"ul"},orderedList:{fn:"insertOrderedList",tag:"ol"},horizontalRule:{fn:"insertHorizontalRule"},removeformat:{},fullscreen:{class:"trumbowyg-not-disable"},close:{fn:"destroy",class:"trumbowyg-not-disable"},formatting:{dropdown:["p","blockquote","h1","h2","h3","h4"],ico:"p"},link:{dropdown:["createLink","unlink"]}},i.o=a.extend(!0,{},l.defaultOptions,r),i.o.hasOwnProperty("imgDblClickHandler")||(i.o.imgDblClickHandler=i.getDefaultImgDblClickHandler()),i.urlPrefix=i.setupUrlPrefix(),i.disabled=i.o.disabled||"TEXTAREA"===o.nodeName&&o.disabled,r.btns?i.o.btns=r.btns:i.o.semantic||(i.o.btns[3]=["bold","italic","underline","strikethrough"]),a.each(i.o.btnsDef,(function(e,t){i.addBtnDef(e,t)})),i.eventNamespace="trumbowyg-event",i.keys=[],i.tagToButton={},i.tagHandlers=[],i.pasteHandlers=[].concat(i.o.pasteHandlers),i.isIE=-1!==e.userAgent.indexOf("MSIE")||-1!==e.appVersion.indexOf("Trident/"),i.isMac=-1!==e.platform.toUpperCase().indexOf("MAC"),i.init()};i.prototype={DEFAULT_SEMANTIC_MAP:{b:"strong",i:"em",s:"del",strike:"del",div:"p"},init:function(){var e=this;e.height=e.$ta.outerHeight()-39,e.initPlugins();try{e.doc.execCommand("enableObjectResizing",!1,!1),e.doc.execCommand("defaultParagraphSeparator",!1,"p")}catch(e){}e.buildEditor(),e.buildBtnPane(),e.fixedBtnPaneEvents(),e.buildOverlay(),setTimeout((function(){e.disabled&&e.setDisabled(!0),e.$c.trigger("tbwinit")}))},addBtnDef:function(e,t){this.btnsDef[e]=a.extend(t,this.btnsDef[e]||{})},setupUrlPrefix:function(){var e=this.o.urlProtocol;if(e)return"string"!=typeof e?"https://":e.replace("://","")+"://"},buildEditor:function(){var e=this,n=e.o.prefix,o="";e.$box=a("
",{class:n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.$edBox=a("
",{class:n+"editor-box"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=a("
").appendTo(e.$edBox),e.$box.insertAfter(e.$ta).append(e.$edBox,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=a("', + inputclass: 'input-large', + placeholder: null, + rows: 7 + }); + $.fn.editabletypes.trumbowyg = Trumbowyg; + } + + function hidePopoversWhenClickAway() { $('body').on('click', function(e) { $('[rel="popover"]').each(function() { @@ -2105,7 +2156,8 @@ }); $('.descriptionValue').editable({ - url: updateUrl + '{ManageResourcesActions::ActionChangeDescription}', emptytext: '{{translate key='NoDescriptionLabel'}|escape:'javascript'}' + url: updateUrl + '{ManageResourcesActions::ActionChangeDescription}', + emptytext: '{{translate key='NoDescriptionLabel'}|escape:'javascript'}' }); $('.notesValue').editable({ @@ -2132,6 +2184,7 @@ } $(document).ready(function() { + addTrumbowygType(); setUpPopovers(); hidePopoversWhenClickAway(); setUpEditables(); diff --git a/tpl/Ajax/resourcedetails.tpl b/tpl/Ajax/resourcedetails.tpl index 8f29d6d63..2cbda6f61 100644 --- a/tpl/Ajax/resourcedetails.tpl +++ b/tpl/Ajax/resourcedetails.tpl @@ -43,21 +43,7 @@
{/if} -
- {translate key=Description} - {if $description neq ''} - {$description|html_entity_decode|url2link|nl2br} - {else} - {translate key=NoDescriptionLabel} - {/if} -
- {translate key=Notes} - {if $notes neq ''} - {$notes|html_entity_decode|url2link|nl2br} - {else} - {translate key=NoNotesLabel} - {/if} -
+
{translate key=Contact} {if $contactInformation neq ''} {$contactInformation} @@ -93,7 +79,7 @@ {/foreach} {/if}
-
+
{if $minimumDuration neq ''} {translate key='ResourceMinLength' args=$minimumDuration} @@ -164,6 +150,25 @@
{/if}
+ {assign var=class value='col-md-10'} +
+ {translate key=Description} +
+ {if $description neq ''} + {$description|html_entity_decode|url2link|nl2br} + {else} + {translate key=NoDescriptionLabel} + {/if} +
+ {translate key=Notes} +
+ {if $notes neq ''} + {$notes|html_entity_decode|url2link|nl2br} + {else} + {translate key=NoNotesLabel} + {/if} +
+
\ No newline at end of file diff --git a/tpl/globalheader.tpl b/tpl/globalheader.tpl index eba190a43..f0dff0a46 100644 --- a/tpl/globalheader.tpl +++ b/tpl/globalheader.tpl @@ -42,7 +42,9 @@ {if isset($Validator) && $Validator} {cssfile src="css/bootstrapValidator.min.css" rel="stylesheet"} {/if} - + {if isset($Trumbowyg) && $Trumbowyg} + {cssfile src="css/trumbowyg.min.css" rel="stylesheet"} + {/if} {else} {/if} + {if isset($Trumbowyg) && $Trumbowyg} + + {/if} {/if} {if isset($InlineEdit) && $InlineEdit} diff --git a/tpl/javascript-includes.tpl b/tpl/javascript-includes.tpl index bd328e8c5..99ee7ca05 100644 --- a/tpl/javascript-includes.tpl +++ b/tpl/javascript-includes.tpl @@ -12,6 +12,9 @@ {if isset($Validator) && $Validator} {jsfile src="js/bootstrapvalidator/bootstrapValidator.min.js"} {/if} + {if isset($Trumbowyg) && $Trumbowyg} + {jsfile src="js/trumbowyg.min.js"} + {/if} {else} {**} @@ -32,6 +35,9 @@ {/if} + {if isset($Trumbowyg) && $Trumbowyg} + + {/if} {/if} {if isset($InlineEdit) && $InlineEdit} {*The version of X-editable that supports Bootstrap 5 does not have a CDN link*} @@ -67,6 +73,7 @@ {jsfile src="search-clear.js"} {/if*} {if isset($DataTable) && $DataTable} + From 35761ee49d1fb50beb73b4c1a713e920ff073ee1 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 23 Jan 2025 18:17:01 +0100 Subject: [PATCH 16/24] added dompurify to sanatize user input --- Web/scripts/js/purify.min.js | 3 +++ tpl/Admin/Resources/manage_resources.tpl | 9 +++++++-- tpl/javascript-includes.tpl | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 Web/scripts/js/purify.min.js diff --git a/Web/scripts/js/purify.min.js b/Web/scripts/js/purify.min.js new file mode 100644 index 000000000..d42a328df --- /dev/null +++ b/Web/scripts/js/purify.min.js @@ -0,0 +1,3 @@ +/*! @license DOMPurify 2.4.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.4.0/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,n){return t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},t(e,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function r(e,o,a){return r=n()?Reflect.construct:function(e,n,r){var o=[null];o.push.apply(o,n);var a=new(Function.bind.apply(e,o));return r&&t(a,r.prototype),a},r.apply(null,arguments)}function o(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?n-1:0),o=1;o/gm),q=f(/^data-[\-\w.\u00B7-\uFFFF]/),Y=f(/^aria-[\-\w]+$/),K=f(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),V=f(/^(?:\w+script|data):/i),$=f(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),X=f(/^html$/i),Z=function(){return"undefined"==typeof window?null:window},J=function(t,n){if("object"!==e(t)||"function"!=typeof t.createPolicy)return null;var r=null,o="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(o)&&(r=n.currentScript.getAttribute(o));var a="dompurify"+(r?"#"+r:"");try{return t.createPolicy(a,{createHTML:function(e){return e},createScriptURL:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};var Q=function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Z(),r=function(e){return t(e)};if(r.version="2.4.0",r.removed=[],!n||!n.document||9!==n.document.nodeType)return r.isSupported=!1,r;var a=n.document,i=n.document,l=n.DocumentFragment,c=n.HTMLTemplateElement,u=n.Node,s=n.Element,f=n.NodeFilter,p=n.NamedNodeMap,d=void 0===p?n.NamedNodeMap||n.MozNamedAttrMap:p,h=n.HTMLFormElement,g=n.DOMParser,y=n.trustedTypes,_=s.prototype,Q=R(_,"cloneNode"),ee=R(_,"nextSibling"),te=R(_,"childNodes"),ne=R(_,"parentNode");if("function"==typeof c){var re=i.createElement("template");re.content&&re.content.ownerDocument&&(i=re.content.ownerDocument)}var oe=J(y,a),ae=oe?oe.createHTML(""):"",ie=i,le=ie.implementation,ce=ie.createNodeIterator,ue=ie.createDocumentFragment,se=ie.getElementsByTagName,me=a.importNode,fe={};try{fe=D(i).documentMode?i.documentMode:{}}catch(e){}var pe={};r.isSupported="function"==typeof ne&&le&&void 0!==le.createHTMLDocument&&9!==fe;var de,he,ge=G,ye=W,be=q,ve=Y,Te=V,Ne=$,Ae=K,Ee=null,we=O({},[].concat(o(M),o(L),o(C),o(F),o(U))),xe=null,Se=O({},[].concat(o(z),o(j),o(B),o(P))),ke=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),_e=null,Oe=null,De=!0,Re=!0,Me=!1,Le=!1,Ce=!1,Ie=!1,Fe=!1,He=!1,Ue=!1,ze=!1,je=!0,Be=!1,Pe="user-content-",Ge=!0,We=!1,qe={},Ye=null,Ke=O({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Ve=null,$e=O({},["audio","video","img","source","image","track"]),Xe=null,Ze=O({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Je="http://www.w3.org/1998/Math/MathML",Qe="http://www.w3.org/2000/svg",et="http://www.w3.org/1999/xhtml",tt=et,nt=!1,rt=["application/xhtml+xml","text/html"],ot="text/html",at=null,it=i.createElement("form"),lt=function(e){return e instanceof RegExp||e instanceof Function},ct=function(t){at&&at===t||(t&&"object"===e(t)||(t={}),t=D(t),de=de=-1===rt.indexOf(t.PARSER_MEDIA_TYPE)?ot:t.PARSER_MEDIA_TYPE,he="application/xhtml+xml"===de?function(e){return e}:N,Ee="ALLOWED_TAGS"in t?O({},t.ALLOWED_TAGS,he):we,xe="ALLOWED_ATTR"in t?O({},t.ALLOWED_ATTR,he):Se,Xe="ADD_URI_SAFE_ATTR"in t?O(D(Ze),t.ADD_URI_SAFE_ATTR,he):Ze,Ve="ADD_DATA_URI_TAGS"in t?O(D($e),t.ADD_DATA_URI_TAGS,he):$e,Ye="FORBID_CONTENTS"in t?O({},t.FORBID_CONTENTS,he):Ke,_e="FORBID_TAGS"in t?O({},t.FORBID_TAGS,he):{},Oe="FORBID_ATTR"in t?O({},t.FORBID_ATTR,he):{},qe="USE_PROFILES"in t&&t.USE_PROFILES,De=!1!==t.ALLOW_ARIA_ATTR,Re=!1!==t.ALLOW_DATA_ATTR,Me=t.ALLOW_UNKNOWN_PROTOCOLS||!1,Le=t.SAFE_FOR_TEMPLATES||!1,Ce=t.WHOLE_DOCUMENT||!1,He=t.RETURN_DOM||!1,Ue=t.RETURN_DOM_FRAGMENT||!1,ze=t.RETURN_TRUSTED_TYPE||!1,Fe=t.FORCE_BODY||!1,je=!1!==t.SANITIZE_DOM,Be=t.SANITIZE_NAMED_PROPS||!1,Ge=!1!==t.KEEP_CONTENT,We=t.IN_PLACE||!1,Ae=t.ALLOWED_URI_REGEXP||Ae,tt=t.NAMESPACE||et,t.CUSTOM_ELEMENT_HANDLING&<(t.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ke.tagNameCheck=t.CUSTOM_ELEMENT_HANDLING.tagNameCheck),t.CUSTOM_ELEMENT_HANDLING&<(t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ke.attributeNameCheck=t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),t.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(ke.allowCustomizedBuiltInElements=t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Le&&(Re=!1),Ue&&(He=!0),qe&&(Ee=O({},o(U)),xe=[],!0===qe.html&&(O(Ee,M),O(xe,z)),!0===qe.svg&&(O(Ee,L),O(xe,j),O(xe,P)),!0===qe.svgFilters&&(O(Ee,C),O(xe,j),O(xe,P)),!0===qe.mathMl&&(O(Ee,F),O(xe,B),O(xe,P))),t.ADD_TAGS&&(Ee===we&&(Ee=D(Ee)),O(Ee,t.ADD_TAGS,he)),t.ADD_ATTR&&(xe===Se&&(xe=D(xe)),O(xe,t.ADD_ATTR,he)),t.ADD_URI_SAFE_ATTR&&O(Xe,t.ADD_URI_SAFE_ATTR,he),t.FORBID_CONTENTS&&(Ye===Ke&&(Ye=D(Ye)),O(Ye,t.FORBID_CONTENTS,he)),Ge&&(Ee["#text"]=!0),Ce&&O(Ee,["html","head","body"]),Ee.table&&(O(Ee,["tbody"]),delete _e.tbody),m&&m(t),at=t)},ut=O({},["mi","mo","mn","ms","mtext"]),st=O({},["foreignobject","desc","title","annotation-xml"]),mt=O({},["title","style","font","a","script"]),ft=O({},L);O(ft,C),O(ft,I);var pt=O({},F);O(pt,H);var dt=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:et,tagName:"template"});var n=N(e.tagName),r=N(t.tagName);return e.namespaceURI===Qe?t.namespaceURI===et?"svg"===n:t.namespaceURI===Je?"svg"===n&&("annotation-xml"===r||ut[r]):Boolean(ft[n]):e.namespaceURI===Je?t.namespaceURI===et?"math"===n:t.namespaceURI===Qe?"math"===n&&st[r]:Boolean(pt[n]):e.namespaceURI===et&&(!(t.namespaceURI===Qe&&!st[r])&&(!(t.namespaceURI===Je&&!ut[r])&&(!pt[n]&&(mt[n]||!ft[n]))))},ht=function(e){T(r.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=ae}catch(t){e.remove()}}},gt=function(e,t){try{T(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){T(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!xe[e])if(He||Ue)try{ht(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},yt=function(e){var t,n;if(Fe)e=""+e;else{var r=A(e,/^[\r\n\t ]+/);n=r&&r[0]}"application/xhtml+xml"===de&&(e=''+e+"");var o=oe?oe.createHTML(e):e;if(tt===et)try{t=(new g).parseFromString(o,de)}catch(e){}if(!t||!t.documentElement){t=le.createDocument(tt,"template",null);try{t.documentElement.innerHTML=nt?"":o}catch(e){}}var a=t.body||t.documentElement;return e&&n&&a.insertBefore(i.createTextNode(n),a.childNodes[0]||null),tt===et?se.call(t,Ce?"html":"body")[0]:Ce?t.documentElement:a},bt=function(e){return ce.call(e.ownerDocument||e,e,f.SHOW_ELEMENT|f.SHOW_COMMENT|f.SHOW_TEXT,null,!1)},vt=function(e){return e instanceof h&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof d)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore)},Tt=function(t){return"object"===e(u)?t instanceof u:t&&"object"===e(t)&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName},Nt=function(e,t,n){pe[e]&&b(pe[e],(function(e){e.call(r,t,n,at)}))},At=function(e){var t;if(Nt("beforeSanitizeElements",e,null),vt(e))return ht(e),!0;if(S(/[\u0080-\uFFFF]/,e.nodeName))return ht(e),!0;var n=he(e.nodeName);if(Nt("uponSanitizeElement",e,{tagName:n,allowedTags:Ee}),e.hasChildNodes()&&!Tt(e.firstElementChild)&&(!Tt(e.content)||!Tt(e.content.firstElementChild))&&S(/<[/\w]/g,e.innerHTML)&&S(/<[/\w]/g,e.textContent))return ht(e),!0;if("select"===n&&S(/