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/css/librebooking.css b/Web/css/librebooking.css index 18e0ffef6..66b6cdd53 100644 --- a/Web/css/librebooking.css +++ b/Web/css/librebooking.css @@ -216,6 +216,26 @@ fieldset:disabled .btn { color: var(--primary) !important; } +.accordion-header { + background: var(--bs-secondary-bg); + color: var(--primary) !important; +} + +.accordion-header:has(.accordion-icon-container.collapsed) { + background: #ffffff; + color: var(--primary) !important; +} + +.accordion-header:hover { + background: var(--bs-secondary-bg) !important; + color: var(--primary) !important; +} + +.noImage { + min-height: 100px; + +} + .timespan { --bs-bg-opacity: .2; } @@ -484,6 +504,10 @@ table.reservations td { z-index: 99999; } +#resourceDetailsDiv .description p, #resourceDetailsDiv .note p { + margin: 0; +} + #userDetailsDiv, #customize-columns { display: none; @@ -575,4 +599,16 @@ input.mid-number { .no-show { display: none !important; -} \ No newline at end of file +} + +.trumbowyg-editor p, .notesValue p, .descriptionValue p { + margin: 0; +} + +.editable-container.editable-popup { + max-width: 50% !important; + } + + .editable-input { + max-width: 90%; + } \ 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/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..7eb52d7d8 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()); @@ -275,4 +275,4 @@ function BlackoutManagement(opts) { ChangeUpdateScope(options.scopeOpts.full); }); } -} +} \ No newline at end of file diff --git a/Web/scripts/admin/group.js b/Web/scripts/admin/group.js index 1a9cc73f7..a8b197052 100644 --- a/Web/scripts/admin/group.js +++ b/Web/scripts/admin/group.js @@ -1,385 +1,371 @@ -function GroupManagement(opts) { - var options = opts; - - var elements = { - activeId: $('#activeId'), - groupList: $('#groupList'), - - autocompleteSearch: $('#groupSearch'), - userSearch: $('#userSearch'), - - groupUserList: $('#groupUserList'), - membersDialog: $('#membersDialog'), - allUsersList: $('#allUsersList'), - permissionsDialog: $('#permissionsDialog'), - deleteDialog: $('#deleteDialog'), - editDialog: $('#editDialog'), - browseUserDialog: $('#allUsers'), - rolesDialog: $('#rolesDialog'), - groupAdminDialog: $('#groupAdminDialog'), - - permissionsForm: $('#permissionsForm'), - addUserForm: $('#addUserForm'), - removeUserForm: $('#removeUserForm'), - editGroupForm: $('#editGroupForm'), - deleteGroupForm: $('#deleteGroupForm'), - rolesForm: $('#rolesForm'), - groupAdminForm: $('#groupAdminForm'), - groupCount: $('#groupCount'), - - addForm: $('#addGroupForm'), - addDialog: $('#addGroupDialog'), - - checkAllResourcesFull: $('#checkAllResourcesFull'), - checkAllResourcesView: $('#checkAllResourcesView'), - checkNoResources: $('#checkNoResources'), - - editGroupName: $('#editGroupName'), - editGroupIsDefault: $('#editGroupIsDefault'), - - changeAdminGroupsForm: $('#groupAdminGroupsForm'), - changeAdminResourcesForm: $('#resourceAdminForm'), - changeAdminSchedulesForm: $('#scheduleAdminForm'), - resourceAdminDialog: $('#resourceAdminDialog'), - groupAdminAllDialog: $('#groupAdminAllDialog'), - scheduleAdminDialog: $('#scheduleAdminDialog'), - - importGroupsDialog: $('#importGroupsDialog'), - importGroupsForm: $('#importGroupsForm'), - importGroupsTrigger: $('#import-groups') - }; - - var allUserList = null; - - GroupManagement.prototype.init = function () { - - elements.groupList.delegate('a.update', 'click', function (e) { - setActiveId($(this)); - e.preventDefault(); - }); - - elements.groupList.delegate('.rename', 'click', function () { - editGroup(); - }); - - elements.groupList.delegate('.permissions', 'click', function () { - changePermissions(); - }); - - elements.groupList.delegate('.members', 'click', function () { - changeMembers(); - elements.membersDialog.modal('show'); - }); - - elements.groupList.delegate('.delete', 'click', function () { - deleteGroup(); - }); - - elements.groupList.delegate('.roles', 'click', function () { - changeRoles(); - }); - - elements.browseUserDialog.delegate('.add', 'click', function () { - var link = $(this); - var userId = link.siblings('.id').val(); - - addUserToGroup(userId); - - link.find('i').removeClass('bi-plus-square-fill text-success').addClass('bi-check-circle-fill text-info'); - }); - - elements.groupUserList.delegate('.delete', 'click', function () { - var userId = $(this).siblings('.id').val(); - removeUserFromGroup($(this), userId); - }); - - elements.autocompleteSearch.autocomplete({ - source: function (request, response) { - $.ajax({ - url: options.groupAutocompleteUrl, - dataType: "json", - data: { - term: request.term - }, - success: function (data) { - response($.map(data, function (item) { - return { - label: item.Name, - value: item.Id - }; - })); - } - }); - }, - focus: function (event, ui) { - elements.autocompleteSearch.val(ui.item.label); - return false; - }, - select: function (event, ui) { - elements.autocompleteSearch.val(ui.item.label); - window.location.href = options.selectGroupUrl + ui.item.value - return false; - } - }); - - elements.userSearch.userAutoComplete(options.userAutocompleteUrl, function (ui) { - addUserToGroup(ui.item.value); - 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) - }); - - elements.checkAllResourcesView.click(function (e) { - e.preventDefault(); - elements.permissionsDialog.find('.view').prop('selected', true) - }); - - elements.checkNoResources.click(function (e) { - e.preventDefault(); - elements.permissionsDialog.find('.none').prop('selected', true) - }); - - $(".save").click(function () { - $(this).closest('form').submit(); - }); - - $(".cancel").click(function () { - $(this).closest('.dialog').modal("hide"); - }); - - var hidePermissionsDialog = function () { - elements.permissionsDialog.modal('hide'); - }; - - var error = function (errorText) { - alert(errorText); - }; - - $("#browseUsers").click(function () { - showAllUsersToAdd(); - }); - - $('.adminDialog').on('click', '.checkbox', function (e) { - var $checkbox = $(e.target); - var modal = $checkbox.closest('.modal-body'); - modal.find('.count').text(modal.find(':checked').length); - }); - - $('#add-group').click(e => { - e.preventDefault(); - elements.addDialog.modal('show'); - elements.addDialog.find(':text').first().focus(); - }); - - elements.importGroupsTrigger.click(e => { - e.preventDefault(); - elements.importGroupsDialog.modal('show'); - }); - - const importHandler = function (responseText, form) { - if (!responseText) { - return; - } - - $('#importCount').text(responseText.importCount); - $('#importSkipped').text(responseText.skippedRows.length > 0 ? responseText.skippedRows.join(',') : '0'); - $('#importResult').removeClass('d-none'); - - var errors = $('#importErrors'); - errors.empty(); - if (responseText.messages && responseText.messages.length > 0) { - var messages = responseText.messages.join('
  • '); - errors.html('
    ' + messages + '
    ').removeClass('d-none'); - } - }; - - ConfigureAsyncForm(elements.addUserForm, getSubmitCallback(options.actions.addUser), changeMembers, error); - ConfigureAsyncForm(elements.removeUserForm, getSubmitCallback(options.actions.removeUser), changeMembers, error); - ConfigureAsyncForm(elements.permissionsForm, getSubmitCallback(options.actions.permissions), hidePermissionsDialog, error); - ConfigureAsyncForm(elements.editGroupForm, getSubmitCallback(options.actions.updateGroup), null, error); - ConfigureAsyncForm(elements.deleteGroupForm, getSubmitCallback(options.actions.deleteGroup), null, error); - ConfigureAsyncForm(elements.addForm, getSubmitCallback(options.actions.addGroup), null, error); - ConfigureAsyncForm(elements.rolesForm, getSubmitCallback(options.actions.roles), null, error); - ConfigureAsyncForm(elements.groupAdminForm, getSubmitCallback(options.actions.groupAdmin), null, error); - ConfigureAsyncForm(elements.changeAdminGroupsForm, getSubmitCallback(options.actions.adminGroups), function () { elements.groupAdminAllDialog.modal('hide'); }, error); - ConfigureAsyncForm(elements.changeAdminResourcesForm, getSubmitCallback(options.actions.resourceGroups), function () { elements.resourceAdminDialog.modal('hide'); }, error); - ConfigureAsyncForm(elements.changeAdminSchedulesForm, getSubmitCallback(options.actions.scheduleGroups), function () { elements.scheduleAdminDialog.modal('hide'); }, error); - ConfigureAsyncForm(elements.importGroupsForm, getSubmitCallback(options.actions.importGroups), importHandler); - - }; - - var showAllUsersToAdd = function () { - elements.membersDialog.modal('hide'); - elements.allUsersList.empty(); - - if (allUserList == null) { - $.ajax({ - url: options.userAutocompleteUrl, - dataType: 'json', - async: false, - success: function (data) { - allUserList = data; - } - }); - } - - var items = []; - if (allUserList != null) { - $.map(allUserList, function (item) { - if (elements.groupUserList.data('userIds')[item.Id] == undefined) { - items.push('
    ' + item.DisplayName + '
    '); - } - else { - items.push('
    ' + item.DisplayName + '
    '); - } - }); - } - - $('
    ', { 'class': '', html: items.join('') }).appendTo(elements.allUsersList); - elements.browseUserDialog.modal('show'); - }; - - var getSubmitCallback = function (action) { - return function () { - return options.submitUrl + "?gid=" + getActiveId() + "&action=" + action; - }; - }; - - function setActiveId(activeElement) { - var id = activeElement.closest('tr').attr('data-group-id'); - elements.activeId.val(id); - } - - function getActiveId() { - return elements.activeId.val(); - } - - var editGroup = function () { - var activeRow = elements.groupList.find('[data-group-id="' + getActiveId() + '"]'); - elements.editGroupName.val(activeRow.find('.dataGroupName').text()); - elements.editGroupIsDefault.prop('checked', activeRow.data('group-default') == '1'); - elements.editDialog.modal('show'); - }; - - var changeMembers = function () { - var groupId = getActiveId(); - $.getJSON(opts.groupsUrl + '?dr=groupMembers', { gid: groupId }, function (data) { - var items = []; - var userIds = []; - - $('#totalUsers').text(data.Total); - if (data.Users != null) { - $.map(data.Users, function (item) { - items.push('
    ' + item.DisplayName + '
    '); - userIds[item.Id] = item.Id; - }); - } - - elements.groupUserList.empty(); - elements.groupUserList.data('userIds', userIds); - - $('
    ', { 'class': '', html: items.join('') }).appendTo(elements.groupUserList); - }); - }; - - var addUserToGroup = function (userId) { - $('#addUserId').val(userId); - elements.addUserForm.submit(); - }; - - var removeUserFromGroup = function (element, userId) { - $('#removeUserId').val(userId); - elements.removeUserForm.submit(); - }; - - var changePermissions = function () { - var groupId = getActiveId(); - - var data = { dr: opts.dataRequests.permissions, gid: groupId }; - $.get(opts.permissionsUrl, data, function (permissions) { - elements.permissionsForm.find('.none').prop('selected', true); - - $.each(permissions.full, function (index, value) { - elements.permissionsForm.find('#permission_' + value).val(value + '_0'); - }); - - $.each(permissions.view, function (index, value) { - elements.permissionsForm.find('#permission_' + value).val(value + '_1'); - }); - - elements.permissionsDialog.modal('show'); - }); - }; - - var deleteGroup = function () { - elements.deleteDialog.modal('show'); - }; - - var changeRoles = function () { - var groupId = getActiveId(); - - var data = { dr: opts.dataRequests.roles, gid: groupId }; - $.get(opts.rolesUrl, data, function (roleIds) { - elements.rolesForm.find(':checkbox').prop('checked', false); - $.each(roleIds, function (index, value) { - elements.rolesForm.find(':checkbox[value="' + value + '"]').prop('checked', true); - }); - - elements.rolesDialog.modal('show'); - }); - }; - - var changeGroupAdmin = function () { - var groupId = getActiveId(); - - elements.groupAdminForm.find('select').val(''); - - elements.groupAdminDialog.modal('show'); - }; - - var changeAdminGroups = function () { - populateAdminCheckboxes(opts.dataRequests.adminGroups, elements.changeAdminGroupsForm, elements.groupAdminAllDialog); - }; - - var changeAdminResources = function () { - populateAdminCheckboxes(opts.dataRequests.resourceGroups, elements.changeAdminResourcesForm, elements.resourceAdminDialog); - }; - - var changeAdminSchedules = function () { - populateAdminCheckboxes(opts.dataRequests.scheduleGroups, elements.changeAdminSchedulesForm, elements.scheduleAdminDialog); - }; - - var populateAdminCheckboxes = function (dr, $form, $dialog) { - var groupId = getActiveId(); - - $dialog.find('.count').text($dialog.find(':checked').length); - - var data = { dr: dr, gid: groupId }; - $.get(opts.submitUrl, data, function (groupIds) { - $form.find(':checkbox').prop('checked', false); - $.each(groupIds, function (index, value) { - $form.find(':checkbox[value="' + value + '"]').prop('checked', true); - }); - - $dialog.find('.count').text(groupIds.length); - $dialog.modal('show'); - }); - }; +function GroupManagement(opt) { + var options = opt; + var activeId = null; + var allUserList = null; + + var elements = { + groupList: $('#groupList'), + + autocompleteSearch: $('#groupSearch'), + userSearch: $('#userSearch'), + + groupUserList: $('#groupUserList'), + membersDialog: $('#membersDialog'), + allUsersList: $('#allUsersList'), + permissionsDialog: $('#permissionsDialog'), + deleteDialog: $('#deleteDialog'), + editDialog: $('#editDialog'), + browseUserDialog: $('#allUsers'), + rolesDialog: $('#rolesDialog'), + groupAdminDialog: $('#groupAdminDialog'), + + permissionsForm: $('#permissionsForm'), + addUserForm: $('#addUserForm'), + removeUserForm: $('#removeUserForm'), + editGroupForm: $('#editGroupForm'), + deleteGroupForm: $('#deleteGroupForm'), + rolesForm: $('#rolesForm'), + groupAdminForm: $('#groupAdminForm'), + groupCount: $('#groupCount'), + + addForm: $('#addGroupForm'), + addDialog: $('#addGroupDialog'), + + checkAllResourcesFull: $('#checkAllResourcesFull'), + checkAllResourcesView: $('#checkAllResourcesView'), + checkNoResources: $('#checkNoResources'), + + editGroupName: $('#editGroupName'), + editGroupIsDefault: $('#editGroupIsDefault'), + + changeAdminGroupsForm: $('#groupAdminGroupsForm'), + changeAdminResourcesForm: $('#resourceAdminForm'), + changeAdminSchedulesForm: $('#scheduleAdminForm'), + resourceAdminDialog: $('#resourceAdminDialog'), + groupAdminAllDialog: $('#groupAdminAllDialog'), + scheduleAdminDialog: $('#scheduleAdminDialog'), + + importGroupsDialog: $('#importGroupsDialog'), + importGroupsForm: $('#importGroupsForm'), + importGroupsTrigger: $('#import-groups') + }; + + GroupManagement.prototype.init = function () { + bindEventListeners(); + configureAutocomplete(); + configureAsyncForms(); + }; + + var bindEventListeners = function () { + const { groupList, groupUserList, browseUserDialog, addDialog, importGroupsDialog } = elements; + + groupList.on('click', 'a.update', (e) => { + e.preventDefault(); + setActiveId($(e.currentTarget)); + }); + + //main interface + $(".save").click((e) => $(e.currentTarget).closest("form").submit()); + $(".cancel").click((e) => $(e.currentTarget).closest(".modal").modal("hide")); + + + $('#add-group').click((e) => { + e.preventDefault(); + addDialog.modal('show'); + addDialog.find(':text').first().focus(); + }); + + groupList.on('click', '.rename', () => editGroup()); + groupList.on('click', '.permissions', () => changePermissions()); + groupList.on('click', '.members', () => changeMembers()); + groupList.on('click', '.groupAdmin', () => changeGroupAdmin()); + groupList.on('click', '.changeAdminGroups', () => changeAdminGroups()); + groupList.on('click', '.changeAdminResources', () => changeAdminResources()); + groupList.on('click', '.changeAdminSchedules', () => changeAdminSchedules()); + groupList.on('click', '.delete', () => deleteGroup()); + groupList.on('click', '.roles', () => changeRoles()); + + //user selection for group + browseUserDialog.on('click', '.add', (e) => { + e.preventDefault(); + const link = $(e.currentTarget); + const userId = link.siblings('.id').val(); + addUserToGroup(userId); + link.find('i').removeClass('bi-plus-square-fill text-success').addClass('bi-check-circle-fill text-info'); + }); + + $("#browseUsers").click(() => { + showAllUsersToAdd(); + }); + + elements.groupUserList.on('click', '.delete', (e) => { + e.preventDefault(); + var userId = $(e.currentTarget).siblings('.id').val(); + removeUserFromGroup(userId); + }); + + //ressource selection + elements.checkAllResourcesFull.click((e) => { + e.preventDefault(); + elements.permissionsDialog.find('.full').prop('selected', true); + }); + + elements.checkAllResourcesView.click((e) => { + e.preventDefault(); + elements.permissionsDialog.find('.view').prop('selected', true); + }); + + elements.checkNoResources.click((e) => { + e.preventDefault(); + elements.permissionsDialog.find('.none').prop('selected', true); + }); + + //group role + $('.adminDialog').on('click', '.checkbox', (e) => { + const $checkbox = $(e.currentTarget); + const modal = $checkbox.closest('.modal-body'); + modal.find('.count').text(modal.find(':checked').length); + }); + + //import group form + importGroupsDialog.click((e) => { + e.preventDefault(); + elements.importGroupsDialog.modal('show'); + }); + } + + var configureAutocomplete = function () { + const { autocompleteSearch, userSearch } = elements; + autocompleteSearch.autocomplete({ + source: (request, response) => { + $.ajax({ + url: options.groupAutocompleteUrl, + dataType: "json", + data: { term: request.term }, + success: (data) => { + response(data.map((item) => ({ label: item.Name, value: item.Id }))); + } + }); + }, + focus: (event, ui) => { + autocompleteSearch.val(ui.item.label); + return false; + }, + select: (event, ui) => { + autocompleteSearch.val(ui.item.label); + window.location.href = `${options.selectGroupUrl}${ui.item.value}`; + return false; + } + }); + + userSearch.userAutoComplete(options.userAutocompleteUrl, (ui) => { + addUserToGroup(ui.item.value); + userSearch.val(''); + }); + } + + var configureAsyncForms = function () { + const { + addUserForm, + removeUserForm, + permissionsForm, + editGroupForm, + deleteGroupForm, + addForm, + rolesForm, + groupAdminForm, + changeAdminGroupsForm, + changeAdminResourcesForm, + changeAdminSchedulesForm, + importGroupsForm + } = elements; + + var hidePermissionsDialog = function () { + elements.permissionsDialog.modal('hide'); + }; + + var error = function (errorText) { + alert(errorText); + }; + + var importHandler = function (response) { + if (!response) return; + + $('#importCount').text(response.importCount); + $('#importSkipped').text(response.skippedRows.length || '0'); + $('#importResult').removeClass('d-none'); + + const errors = $('#importErrors'); + errors.empty(); + if (response.messages && response.messages.length > 0) { + const messages = response.messages.join('
  • '); + errors.html(`
    ${messages}
    `).removeClass('d-none'); + } + } + + ConfigureAsyncForm(elements.addUserForm, getSubmitCallback(options.actions.addUser), changeMembers, error); + ConfigureAsyncForm(elements.removeUserForm, getSubmitCallback(options.actions.removeUser), changeMembers, error); + ConfigureAsyncForm(elements.permissionsForm, getSubmitCallback(options.actions.permissions), hidePermissionsDialog, error); + ConfigureAsyncForm(elements.editGroupForm, getSubmitCallback(options.actions.updateGroup), null, error); + ConfigureAsyncForm(elements.deleteGroupForm, getSubmitCallback(options.actions.deleteGroup), null, error); + ConfigureAsyncForm(elements.addForm, getSubmitCallback(options.actions.addGroup), null, error); + ConfigureAsyncForm(elements.rolesForm, getSubmitCallback(options.actions.roles), null, error); + ConfigureAsyncForm(elements.groupAdminForm, getSubmitCallback(options.actions.groupAdmin), null, error); + ConfigureAsyncForm(elements.changeAdminGroupsForm, getSubmitCallback(options.actions.adminGroups), function () { elements.groupAdminAllDialog.modal('hide'); }, error); + ConfigureAsyncForm(elements.changeAdminResourcesForm, getSubmitCallback(options.actions.resourceGroups), function () { elements.resourceAdminDialog.modal('hide'); }, error); + ConfigureAsyncForm(elements.changeAdminSchedulesForm, getSubmitCallback(options.actions.scheduleGroups), function () { elements.scheduleAdminDialog.modal('hide'); }, error); + ConfigureAsyncForm(elements.importGroupsForm, getSubmitCallback(options.actions.importGroups), importHandler); + } + + var getSubmitCallback = function (action) { + return () => `${options.submitUrl}?gid=${activeId}&action=${action}`; + } + + var setActiveId = function (button) { + activeId = button.parents("tr").data("group-id"); + } + + //change group details + var editGroup = function () { + const activeRow = elements.groupList.find(`[data-group-id="${activeId}"]`); + elements.editGroupName.val(activeRow.find('.dataGroupName').text()); + elements.editGroupIsDefault.prop('checked', activeRow.data('group-default') === '1'); + elements.editDialog.modal('show'); + } + + var deleteGroup = function () { + elements.deleteDialog.modal('show'); + } + + //change group members + var changeMembers = function () { + const groupId = activeId; + $.getJSON(`${options.groupsUrl}?dr=groupMembers`, { gid: groupId }, (data) => { + const items = []; + const userIds = []; + + $('#totalUsers').text(data.Total); + if (data.Users) { + data.Users.forEach((item) => { + items.push(`
    ${item.DisplayName}
    `); + userIds[item.Id] = item.Id; + }); + } + + elements.groupUserList.empty(); + elements.groupUserList.data('userIds', userIds); + + $('
    ', { html: items.join('') }).appendTo(elements.groupUserList); + }); + elements.membersDialog.modal('show'); + } + + var addUserToGroup = function (userId) { + elements.addUserForm.find('#addUserId').val(userId); + elements.addUserForm.submit(); + } + + var removeUserFromGroup = function (userId) { + elements.removeUserForm.find('#removeUserId').val(userId); + elements.removeUserForm.submit(); + } + + var showAllUsersToAdd = function () { + elements.membersDialog.modal('hide'); + elements.allUsersList.empty(); + + if (!allUserList) { + $.ajax({ + url: options.userAutocompleteUrl, + dataType: 'json', + async: false, + success: (data) => { + allUserList = data; + } + }); + } + + const items = []; + if (allUserList) { + allUserList.forEach((item) => { + if (!elements.groupUserList.data('userIds')[item.Id]) { + items.push(`
    ${item.DisplayName}
    `); + } else { + items.push(`
    ${item.DisplayName}
    `); + } + }); + } + + $('
    ', { html: items.join('') }).appendTo(elements.allUsersList); + elements.browseUserDialog.modal('show'); + } + + //change group ressource permission + var changePermissions = function () { + $.get(options.permissionsUrl, { dr: options.dataRequests.permissions, gid: activeId }, (permissions) => { + elements.permissionsForm.find('.none').prop('selected', true); + + (permissions.full || []).forEach((id) => { + elements.permissionsForm.find(`#permission_${id}`).val(`${id}_0`); + }); + + (permissions.view || []).forEach((id) => { + elements.permissionsForm.find(`#permission_${id}`).val(`${id}_1`); + }); + + elements.permissionsDialog.modal('show'); + }); + } + + //change group admin + var changeGroupAdmin = function () { + const activeRow = elements.groupList.find(`[data-group-id="${activeId}"]`); + const currentGroupAdmin = activeRow.find('.groupAdmin').text(); + const currentGroupAdminVal = elements.groupAdminForm.find('select').find('option').filter(function () { + return $(this).html() === currentGroupAdmin; + }).val(); + + elements.groupAdminForm.find('select').val(currentGroupAdminVal || ''); + elements.groupAdminDialog.modal('show'); + } + + //change group role + var changeRoles = function () { + const groupId = activeId; + + $.get(options.rolesUrl, { dr: options.dataRequests.roles, gid: groupId }, (roleIds) => { + elements.rolesForm.find(':checkbox').prop('checked', false); + roleIds.forEach((value) => { + elements.rolesForm.find(`:checkbox[value="${value}"]`).prop('checked', true); + }); + + elements.rolesDialog.modal('show'); + }); + } + + var changeAdminGroups = function () { + populateAdminCheckboxes(options.dataRequests.adminGroups, elements.changeAdminGroupsForm, elements.groupAdminAllDialog); + } + + var changeAdminResources = function () { + populateAdminCheckboxes(options.dataRequests.resourceGroups, elements.changeAdminResourcesForm, elements.resourceAdminDialog); + } + + var changeAdminSchedules = function () { + populateAdminCheckboxes(options.dataRequests.scheduleGroups, elements.changeAdminSchedulesForm, elements.scheduleAdminDialog); + } + + var populateAdminCheckboxes = function (dr, form, dialog) { + dialog.find('.count').text(dialog.find(':checked').length); + + $.get(options.submitUrl, { dr, gid: activeId }, (groupIds) => { + form.find(':checkbox').prop('checked', false); + groupIds.forEach((value) => { + form.find(`:checkbox[value="${value}"]`).prop('checked', true); + }); + + dialog.find('.count').text(groupIds.length); + dialog.modal('show'); + }); + } } 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/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 759d2212d..eee19a1ae 100644 --- a/Web/scripts/admin/reservations.js +++ b/Web/scripts/admin/reservations.js @@ -67,11 +67,44 @@ function ReservationManagement(opts, approval) { ReservationManagement.prototype.init = function () { - elements.reservationTable.delegate('.changeAttribute', 'click', function (e) { + + elements.reservationTable.on('click', '.update', function (e) { + e.preventDefault(); + e.stopPropagation(); + + var td = $(this); + if (this.tagName != 'TD') { + td = $(this).closest('td'); + } + setCurrentReservationInformation(td); + }); + + elements.reservationTable.on('click', '.changeAttribute', function (e) { e.stopPropagation(); $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); }); + 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; + } + $(this).addClass('clicked'); + viewReservation($(this).attr('data-refnum')); + }); + + elements.reservationTable.on('click', '.delete', function (e) { + e.preventDefault(); + e.stopPropagation(); + showDeleteReservation(getActiveReferenceNumber()); + }); + + elements.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 +130,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) { + 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(); @@ -138,18 +152,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); }); 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 50414d24b..7c10e42ef 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'), @@ -116,153 +117,120 @@ 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); - - 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); - }); + this.bindEventListeners(); + this.configureAsyncForms(); + }; - details.find('.changeDuration').click(function (e) { - showDurationPrompt(e); - }); + ResourceManagement.prototype.bindEventListeners = function () { + elements.resourcesList.on('click', '.update', function (e) { + e.preventDefault(); + var id = $(this).closest('.resourceDetails').attr('data-resourceId'); + setActiveResourceId(id); + }); - details.find('.changeCapacity').click(function (e) { - showCapacityPrompt(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(); + }); - details.find('.changeAccess').click(function (e) { - showAccessPrompt(e); - }); + //edit image + elements.resourcesList.on('click', '.imageButton', function (e) { + showChangeImage(e); + }); - details.find('.changeUserPermission').click(function (e) { - changeUserPermissions(); - elements.userDialog.modal('show'); - }); + 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(); + }); - details.find('.changeGroupPermissions').click(function (e) { - changeGroupPermissions(); - elements.groupDialog.modal('show'); - }); + elements.imageDialog.on('click', '.deleteImage', function (e) { + e.preventDefault(); + var image = $(e.target).closest('.resource-image').attr('id'); + elements.removeImageName.val(image); + elements.removeImageForm.submit(); + }); - details.find('.changeResourceGroups').click(function (e) { - changeResourceGroups(); - elements.resourceGroupDialog.modal('show'); - }); + elements.imageDialog.on('hidden.bs.modal', function () { + window.location.reload(); + }); - details.find('.resourceColorPicker').on('change', function (e) { - setActiveResourceId(id); - var color = $(this).val(); - elements.reservationColor.val(color); - elements.colorForm.submit(); - }); + //edit resource color + 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(); + }); + + elements.resourcesList.on('click', '.clearColor', function (e) { + $(this).siblings('.resourceColorPicker').val('#ffffff'); + elements.reservationColor.val(''); + elements.colorForm.submit(); + }); - details.find('.clearColor').click(function (e) { - $(this).siblings('.resourceColorPicker').val('#ffffff'); - elements.reservationColor.val(''); - elements.colorForm.submit(); - }); + this.BindXEditableListeners() - details.find('.changeCredits').click(function (e) { - var resource = getActiveResource(); - elements.creditsPerSlot.val(resource.credits); - elements.peakCreditsPerSlot.val(resource.peakCredits); - elements.creditsDialog.modal('show'); - }); + //modals + elements.resourcesList.on('click', '.adminButton', function (e) { + showResourceAdmin(e); + }); + + elements.resourcesList.on('click', '.deleteButton', function (e) { + showDeletePrompt(e); + }); - details.delegate('.enableSubscription', 'click', function (e) { - e.preventDefault(); - PerformAsyncAction($(this), getSubmitCallback(options.actions.enableSubscription), $('#subscriptionIndicator'), subscriptionCallback); - }); + elements.resourcesList.on('click', '.changeStatus', function (e) { + showStatusPrompt(e); + }); + + elements.resourcesList.on('click', '.changeDuration', function (e) { + showDurationPrompt(e); + }); + + elements.resourcesList.on('click', '.changeCapacity', function (e) { + showCapacityPrompt(e); + }); + + elements.resourcesList.on('click', '.changeAccess', function (e) { + showAccessPrompt(e); + }); + + elements.resourcesList.on('click', '.changeUserPermission', function (e) { + changeUserPermissions(); + elements.userDialog.modal('show'); + }); + + elements.resourcesList.on('click', '.changeGroupPermissions', function (e) { + changeGroupPermissions(); + elements.groupDialog.modal('show'); + }); + + elements.resourcesList.on('click', '.changeResourceGroups', function (e) { + changeResourceGroups(); + elements.resourceGroupDialog.modal('show'); + }); - details.delegate('.disableSubscription', 'click', function (e) { - e.preventDefault(); - PerformAsyncAction($(this), getSubmitCallback(options.actions.disableSubscription), $('#subscriptionIndicator'), subscriptionCallback); - }); + elements.resourcesList.on('click', '.changeCredits', function (e) { + var resource = getActiveResource(); + elements.creditsPerSlot.val(resource.credits); + elements.peakCreditsPerSlot.val(resource.peakCredits); + elements.creditsDialog.modal('show'); }); + 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 + 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); @@ -377,14 +345,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(); @@ -396,14 +364,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(); @@ -440,25 +408,6 @@ function ResourceManagement(opts) { elements.importDialog.modal('show'); }); - elements.imageDialog.delegate('.defaultImage', 'click', 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) { - e.preventDefault(); - var image = $(e.target).closest('.resource-image').attr('id'); - elements.removeImageName.val(image); - elements.removeImageForm.submit(); - }); - - elements.imageDialog.on('hidden.bs.modal', function () { - window.location.reload(); - }); - - elements.toggleStatusChangeMessage.on('change', function (e) { if ($(this).is(":checked")) { elements.sendStatusChangeMessageContent.removeClass('d-none'); @@ -467,7 +416,61 @@ function ResourceManagement(opts) { elements.sendStatusChangeMessageContent.addClass('d-none'); } }); + } + + ResourceManagement.prototype.BindXEditableListeners = function () { + elements.resourcesList.on('click', '.renameButton', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.resourceNameField').editable('toggle'); + }); + elements.resourcesList.on('click', '.changeScheduleButton', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.scheduleName').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeResourceType', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.resourceTypeName').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeSortOrder', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.sortOrderValue').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeLocation', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.locationValue').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeContact', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.contactValue').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeDescription', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.descriptionValue').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeNotes', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.notesValue').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeResourceAdmin', function (e) { + e.stopPropagation(); + $(this).closest('.resourceDetails').find('.resourceAdminValue').editable('toggle'); + }); + + elements.resourcesList.on('click', '.changeAttribute', function (e) { + e.stopPropagation(); + $(e.target).closest('.updateCustomAttribute').find('.inlineAttribute').editable('toggle'); + }); + } + + ResourceManagement.prototype.configureAsyncForms = function () { var imageSaveErrorHandler = function (result) { alert(result); }; @@ -522,7 +525,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 }); @@ -539,7 +543,7 @@ function ResourceManagement(opts) { ConfigureAsyncForm(elements.importForm, defaultSubmitCallback(elements.importForm), importHandler); ConfigureAsyncForm(elements.bulkDeleteForm, defaultSubmitCallback(elements.bulkDeleteForm)); ConfigureAsyncForm(elements.statusForm, defaultSubmitCallback(elements.statusForm)); - }; + } ResourceManagement.prototype.add = function (resource) { resources[resource.id] = resource; @@ -987,4 +991,4 @@ function ResourceManagement(opts) { elements.groupDiv.find('[group-id=' + id + ']').prop('checked', true); }); } -} +} \ No newline at end of file diff --git a/Web/scripts/admin/schedule.js b/Web/scripts/admin/schedule.js index 6d8365e2a..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,117 +81,116 @@ 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); - }); - - details.find('.renameButton').click(function (e) { - e.stopPropagation(); - details.find('.scheduleName').editable('toggle'); - }); + elements.scheduleList.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'); - }); + elements.scheduleList.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'); - }); + elements.scheduleList.on('click', '.dayName', function (e) { + e.stopPropagation(); + $(this).editable('toggle'); + }); - details.find('.changeScheduleAdmin').click(function (e) { - e.stopPropagation(); - details.find('.scheduleAdmin').editable('toggle'); - }); + elements.scheduleList.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; - }); + elements.scheduleList.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')); - }); + elements.scheduleList.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')); - }); + elements.scheduleList.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; - }); + elements.scheduleList.on('click', '.deleteScheduleButton', function (e) { + showDeleteDialog(e); + return false; + }); - details.find('.showAllDailyLayouts').click(function (e) { - e.preventDefault(); - $(this).next('.allDailyLayouts').toggle(); - }); + elements.scheduleList.on('click', '.showAllDailyLayouts', function (e) { + e.preventDefault(); + $(this).next('.allDailyLayouts').toggle(); + }); - details.find('.changePeakTimes').click(function (e) { - e.preventDefault(); - showPeakTimesDialog(getActiveScheduleId()); - }); + elements.scheduleList.on('click', '.changePeakTimes', function (e) { + e.preventDefault(); + showPeakTimesDialog(getActiveScheduleId()); + }); - details.find('.changeAvailability').click(function (e) { - e.preventDefault(); - showAvailabilityDialog(getActiveScheduleId()); - }); + elements.scheduleList.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); - }); + elements.scheduleList.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'); - }); + elements.scheduleList.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'); - }); + elements.scheduleList.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'); - }); + elements.scheduleList.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'); - }); + elements.scheduleList.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/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/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(/