summaryrefslogtreecommitdiff
path: root/sh_helpdesk/static/src
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 17:14:58 +0700
commit1ca3b3df3421961caec3b747a364071c80f5c7da (patch)
tree6778a1f0f3f9b4c6e26d6d87ccde16e24da6c9d6 /sh_helpdesk/static/src
parentb57188be371d36d96caac4b8d65a40745c0e972c (diff)
initial commit
Diffstat (limited to 'sh_helpdesk/static/src')
-rw-r--r--sh_helpdesk/static/src/css/bootstrap-multiselect.min.css1
-rw-r--r--sh_helpdesk/static/src/css/feedback.scss73
-rw-r--r--sh_helpdesk/static/src/css/ticket_dashboard.css125
-rw-r--r--sh_helpdesk/static/src/img/emg1.svg3
-rw-r--r--sh_helpdesk/static/src/img/emg2.svg31
-rw-r--r--sh_helpdesk/static/src/img/emg3.svg31
-rw-r--r--sh_helpdesk/static/src/img/emg4.svg31
-rw-r--r--sh_helpdesk/static/src/img/emg5.svg31
-rw-r--r--sh_helpdesk/static/src/js/bootstrap-multiselect.min.js1
-rw-r--r--sh_helpdesk/static/src/js/filter.js348
-rw-r--r--sh_helpdesk/static/src/js/helpdesk_ticket_dasboard.js68
-rw-r--r--sh_helpdesk/static/src/js/helpdesk_ticket_kanban_examples.js10
-rw-r--r--sh_helpdesk/static/src/js/portal.js131
13 files changed, 884 insertions, 0 deletions
diff --git a/sh_helpdesk/static/src/css/bootstrap-multiselect.min.css b/sh_helpdesk/static/src/css/bootstrap-multiselect.min.css
new file mode 100644
index 0000000..5a99da0
--- /dev/null
+++ b/sh_helpdesk/static/src/css/bootstrap-multiselect.min.css
@@ -0,0 +1 @@
+span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect.dropdown-toggle:after{display:none}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .multiselect-reset .input-group{width:93%}.multiselect-container .multiselect-filter>.fa-search{z-index:1;padding-left:.75rem}.multiselect-container .multiselect-filter>input.multiselect-search{border:none;border-bottom:1px solid #d3d3d3;padding-left:2rem;margin-left:-1.625rem;border-bottom-right-radius:0;border-bottom-left-radius:0}.multiselect-container .multiselect-filter>input.multiselect-search:focus{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.multiselect-container .multiselect-filter>.multiselect-moz-clear-filter{margin-left:-1.5rem;display:none}.multiselect-container .multiselect-option.multiselect-group-option-indented{padding-left:1.75rem}.multiselect-container .multiselect-all,.multiselect-container .multiselect-group,.multiselect-container .multiselect-option{padding:.25rem .25rem .25rem .75rem}.multiselect-container .multiselect-all.dropdown-item,.multiselect-container .multiselect-all.dropdown-toggle,.multiselect-container .multiselect-group.dropdown-item,.multiselect-container .multiselect-group.dropdown-toggle,.multiselect-container .multiselect-option.dropdown-item,.multiselect-container .multiselect-option.dropdown-toggle{cursor:pointer}.multiselect-container .multiselect-all .form-check-label,.multiselect-container .multiselect-group .form-check-label,.multiselect-container .multiselect-option .form-check-label{cursor:pointer}.multiselect-container .multiselect-all.active:not(.multiselect-active-item-fallback),.multiselect-container .multiselect-all:not(.multiselect-active-item-fallback):active,.multiselect-container .multiselect-group.active:not(.multiselect-active-item-fallback),.multiselect-container .multiselect-group:not(.multiselect-active-item-fallback):active,.multiselect-container .multiselect-option.active:not(.multiselect-active-item-fallback),.multiselect-container .multiselect-option:not(.multiselect-active-item-fallback):active{background-color:#d3d3d3;color:#000}.multiselect-container .multiselect-all .form-check,.multiselect-container .multiselect-group .form-check,.multiselect-container .multiselect-option .form-check{padding:0 5px 0 20px}.multiselect-container .multiselect-all:focus,.multiselect-container .multiselect-group:focus,.multiselect-container .multiselect-option:focus{outline:0}.form-inline .multiselect-container span.form-check{padding:3px 20px 3px 40px}.input-group.input-group-sm>.multiselect-native-select .multiselect{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;padding-right:1.75rem;height:calc(1.5em + .5rem + 2px)}.input-group>.multiselect-native-select{flex:1 1 auto;width:1%}.input-group>.multiselect-native-select>div.btn-group{width:100%}.input-group>.multiselect-native-select:not(:first-child) .multiselect{border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.multiselect-native-select:not(:last-child) .multiselect{border-top-right-radius:0;border-bottom-right-radius:0} \ No newline at end of file
diff --git a/sh_helpdesk/static/src/css/feedback.scss b/sh_helpdesk/static/src/css/feedback.scss
new file mode 100644
index 0000000..ba8f07a
--- /dev/null
+++ b/sh_helpdesk/static/src/css/feedback.scss
@@ -0,0 +1,73 @@
+form {
+ &#smileys {
+ input[type="radio"] {
+ width: 90px;
+ height: 90px;
+ border: none;
+ cursor: pointer;
+ transition: border .2s ease;
+ filter: grayscale(100%);
+ margin: 0 5px;
+ transition: all .2s ease;
+ &:focus {
+ outline: 0;
+ }
+ &:hover, &:checked {
+ filter: grayscale(0);
+ }
+
+ &.very-sad {
+ background: url('/sh_helpdesk/static/src/img/emg1.svg') center;
+ background-size: cover;
+ }
+ &.sad {
+ background: url('/sh_helpdesk/static/src/img/emg4.svg') center;
+ background-size: cover;
+ }
+
+ &.neutral {
+ background: url('/sh_helpdesk/static/src/img/emg5.svg') center;
+ background-size: cover;
+ }
+ &.happy {
+ background: url('/sh_helpdesk/static/src/img/emg3.svg') center;
+ background-size: cover;
+ }
+ &.very-happy {
+ background: url('/sh_helpdesk/static/src/img/emg2.svg') center;
+ background-size: cover;
+ }
+ }
+ }
+}
+
+.mtt {
+ position: fixed;
+ bottom: 10px;
+ right: 20px;
+ color: #999;
+ text-decoration: none;
+
+ span {
+ color: #e74c3c;
+ }
+
+ &:hover {
+ color: #666;
+
+ span {
+ color: #c0392b;
+ }
+ }
+}
+ #smileys input[type="radio"] {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ }
+
+
+
+
+
+ \ No newline at end of file
diff --git a/sh_helpdesk/static/src/css/ticket_dashboard.css b/sh_helpdesk/static/src/css/ticket_dashboard.css
new file mode 100644
index 0000000..fa2baf3
--- /dev/null
+++ b/sh_helpdesk/static/src/css/ticket_dashboard.css
@@ -0,0 +1,125 @@
+
+.btn-success {
+ border: none;
+ background: #fff;
+ border-radius: 5px;
+ padding: 7px 16px;
+ text-transform: uppercase;
+ font-weight: 500;
+ font-size: 11px;
+ letter-spacing: 0.5px;
+ color: #003e85;
+ box-shadow: 0 3px 5px #d4d4d4;
+}
+.o_kanban_view.o_kanban_ungrouped {
+ padding: 0 !important;
+}
+.o_kanban_view.o_kanban_ungrouped .o_kanban_record{margin:4px 0px !important;}
+/*****************change in counter-area***********************/
+section {
+ padding: 20px 0px;
+}
+.counter-area .custom-card {
+ margin-bottom: 20px;
+ border: 0;
+ box-shadow: 0 3px 8px 0 rgba(162, 169, 204, 0.24), 0 3px 16px 0 rgba(162, 169, 204, 0.24);
+}
+.counter-area .card {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: border-box;
+ border: 1px solid #e1e6f1;
+ border-radius: 0px;
+}
+.counter-area .sh-card-body {
+ flex: 1 1 auto;
+ padding: 15px 20px;
+}
+.counter-area .sh-card-body .media i {
+ font-size: 50px;
+}
+.counter-area .sh-card-body .media .media-body {
+ margin-top: 15px;
+}
+.counter-area .fs-20 {
+ font-size: 20px;
+}
+.counter-area h3 {
+ margin-bottom: 0.5rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin-top: 0;
+}
+.counter-area p {
+ font-size: 15px;
+ font-weight: 600;
+}
+.counter-area .card .dash1,
+.counter-area .card {
+ border-radius: 5px;
+}
+.counter-area .custom-card:hover {
+ cursor: pointer;
+}
+/********************change in table-area******************/
+.table-area .table {
+ border-collapse: collapse;
+ box-shadow: 0 3px 8px 0 rgba(162, 169, 204, 0.24), 0 3px 16px 0 rgba(162, 169, 204, 0.24);
+ margin-bottom: 30px;
+
+}
+.table-area .table tr td {
+ padding: 8px;
+ font-size: 15px;
+}
+.table-area .table tr th {
+ padding: 10px;
+ font-size: 15px;
+}
+.table-area .table tr:nth-child(even) {
+ background-color: #f2f2f2;
+}
+.table-area .table {
+ padding: 20px 0px;
+}
+.table-area .table .badge {
+ padding: 8px 10px;
+ width: 70px;
+}
+
+/*effect*/
+.card {
+ display: inline-block;
+ transition-duration: $defaultDuration;
+ transition-property: transform;
+}
+.card:hover {
+ transform: scale(1.1);
+ box-shadow: 0 5px 10px 0 rgba(162, 169, 204, 0.24), 0 5px 19px 0 rgba(162, 169, 204, 0.24);
+}
+/*filter*/
+.filter .col2 {
+ padding: 0px 28px;
+}
+
+/* 30-11-2020 */
+
+
+@media only screen and (max-width: 576px){
+ .sh_drop_btn .sh_btn select,
+ input[type="date"]{margin: 5px 0px;}
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/sh_helpdesk/static/src/img/emg1.svg b/sh_helpdesk/static/src/img/emg1.svg
new file mode 100644
index 0000000..3a0a6e0
--- /dev/null
+++ b/sh_helpdesk/static/src/img/emg1.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="126" height="126" viewBox="0 0 126 126">
+ <image x="4" y="4" width="118" height="118" xlink:href="data:image/png;base64,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"/>
+</svg>
diff --git a/sh_helpdesk/static/src/img/emg2.svg b/sh_helpdesk/static/src/img/emg2.svg
new file mode 100644
index 0000000..41d852e
--- /dev/null
+++ b/sh_helpdesk/static/src/img/emg2.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="126" height="126" viewBox="0 0 126 126">
+ <metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""/>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?></metadata>
+<image x="4" y="4" width="118" height="118" xlink:href="data:image/png;base64,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"/>
+</svg>
diff --git a/sh_helpdesk/static/src/img/emg3.svg b/sh_helpdesk/static/src/img/emg3.svg
new file mode 100644
index 0000000..c194ab4
--- /dev/null
+++ b/sh_helpdesk/static/src/img/emg3.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="126" height="126" viewBox="0 0 126 126">
+ <metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""/>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?></metadata>
+<image x="4" y="4" width="118" height="118" xlink:href="data:image/png;base64,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"/>
+</svg>
diff --git a/sh_helpdesk/static/src/img/emg4.svg b/sh_helpdesk/static/src/img/emg4.svg
new file mode 100644
index 0000000..d2676d8
--- /dev/null
+++ b/sh_helpdesk/static/src/img/emg4.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="126" height="126" viewBox="0 0 126 126">
+ <metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""/>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?></metadata>
+<image x="4" y="4" width="118" height="118" xlink:href="data:image/png;base64,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"/>
+</svg>
diff --git a/sh_helpdesk/static/src/img/emg5.svg b/sh_helpdesk/static/src/img/emg5.svg
new file mode 100644
index 0000000..669c404
--- /dev/null
+++ b/sh_helpdesk/static/src/img/emg5.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="126" height="126" viewBox="0 0 126 126">
+ <metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""/>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?></metadata>
+<image x="4" y="4" width="118" height="118" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAAB2CAMAAAAqeZcjAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAQlBMVEX////9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTT9oTQAAAAEkcH8AAAAFHRSTlMAABBAcICvv+9gMN8gn49Qz3iKfscNRVgAAAABYktHRBXl2PmjAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AQCEgU4VF+mugAABJJJREFUaN7lm9t2rCAMQBXkIl7n1P//1mMdrkoABfWheehabXH2JCQBQ6gqS+oEQbghlDG+bMIZo6TFKOXJuq78EntMNLRbvNLRRtyCRS3lS1A4bVFZ7MpckoS25bD9wNOgm85jXwSLWTpTqoyzsQCUrULG35/+f+MsbH/4VE7JtPNZMZGjt9H+MhaNB1cF560/ODpB17DYiVE+THVEpsHhdvgC1lV1joWkfKh1vuqIzmKF/TzDKUxpI9sdZnEO216E7sG8PYMdQjOUALZMNSZjkfm6nJyH/goxbk1RGhbNxr79NaoT8TNKwVrU5ip0U/jIDWANlSesoCERfM+FsYY6J24ZYDl8Fog1I4dc6K8MLhfEsqJUi0tD2KGIM3m5I4xti1MtbgthRWELu9w1MLxU1N1BNdwZebFqpZvLUutaRcfoo2KV+7PjdS9I5Q0cMHFmbvKJ0BqBJi7oxEZUfiZ7aq/WnDuoJg31O6z8O7+80oWll9NL/f50cVVPNzP2KdvdRa1r6bHMp+yFfVOqYI+67FZ/+go7zG5/v7JGXePMwwPKanV1ilTJ61Zltbp8t8zOSZWaDJHO3EosVb+CDwhCSBNfIvpmHQfn9NZxKiSVRxBWsLRcItM6g76fBC3ItvEAlUzMfje8/utiDoe4g21lOXyCsOYtYQmVf8xbABgSk1ZwFa4dLDQ2mjztGgIwv5Xly8JMdMgyMtZBKraHAV6gDCtWVmMM7h3rFGtwHlayGjO1/RNYy7Kdsbd3rFM6gWNX2MOAnZHyo05HLQWx9ueFsrZdY+khLFORK41DQGxtFVdDu0rL40dgSFXJKMNqlicYa14+g1XbuonapKom5b/E+DSUHNG3ABItFE2bnQNVlsrYVpqwCmBXwRinbNvFOi7w7xWh8hQzjnz3wmewTGLZU1iF429gudb6UezyLpb8KexfmduXAuildPFwclTGTVsKimHVpiJh4SuIFSpe48t8SSxWy3x8U1MSqzc10S1cUSxVWzi5Ye2ewRpYbHteEtsb0zZqlh/AynfaJuHVqyR2sKI18qJZEmtQ8dfqcjJZURMtImj5/AvKJ4p1igjRkomSnyUoP1Es11GbViAqg3ULRMnlsFwss22cXvzLxKrinz6nSCx1ZmIH7brnCrufiISfVhDrlOKJMrZ0XLtq/1LR/oEjCnZU9oEDmcan7O3HTypGXWVvP2yjRzf+yninmZWJjye4tx6kShN7DlK1V/Hyx8az359cMxc/JKegiR0z39QS0PlbAm5qgFDutIhou8eYT1OiP7NNaG4pxm1tC0LY4q082sJbGgKxLzUulW3TorvPgrElm9IOGgSwdgteVn5uDq1wDzQcGgMnNhwWaa80qtrnqmFsfjOpdVJmR0QMm9U629td+adaZ3Mahe0T0O5ko/C+LbpLa4uuW+cg8nxbdL1vAl9SmsCd9vNLTeC1r+W9CbS87+88jBdb3mtvgz87NvhjcrzBwq43+G+Whq8zfMV7ryPzOkMAHBCWf3ljM/WpqypDmasqm3OlX8wJBdpZbP3ONSQpL1y60lrjtsAVs/8ZBPfzqOToTQAAAABJRU5ErkJggg=="/>
+</svg>
diff --git a/sh_helpdesk/static/src/js/bootstrap-multiselect.min.js b/sh_helpdesk/static/src/js/bootstrap-multiselect.min.js
new file mode 100644
index 0000000..1bae7b0
--- /dev/null
+++ b/sh_helpdesk/static/src/js/bootstrap-multiselect.min.js
@@ -0,0 +1 @@
+!function(root,factory){"function"==typeof define&&define.amd&&"function"==typeof require&&"function"==typeof require.specified&&require.specified("knockout")?define(["jquery","knockout"],factory):factory(root.jQuery,root.ko)}(this,(function($,ko){"use strict";function forEach(array,callback){for(var index=0;index<array.length;++index)callback(array[index],index)}function Multiselect(select,options){this.$select=$(select),this.options=this.mergeOptions($.extend({},options,this.$select.data())),this.$select.attr("data-placeholder")&&(this.options.nonSelectedText=this.$select.data("placeholder")),this.originalOptions=this.$select.clone()[0].options,this.query="",this.searchTimeout=null,this.lastToggledInput=null,this.options.multiple="multiple"===this.$select.attr("multiple"),this.options.onChange=$.proxy(this.options.onChange,this),this.options.onSelectAll=$.proxy(this.options.onSelectAll,this),this.options.onDeselectAll=$.proxy(this.options.onDeselectAll,this),this.options.onDropdownShow=$.proxy(this.options.onDropdownShow,this),this.options.onDropdownHide=$.proxy(this.options.onDropdownHide,this),this.options.onDropdownShown=$.proxy(this.options.onDropdownShown,this),this.options.onDropdownHidden=$.proxy(this.options.onDropdownHidden,this),this.options.onInitialized=$.proxy(this.options.onInitialized,this),this.options.onFiltering=$.proxy(this.options.onFiltering,this),this.buildContainer(),this.buildButton(),this.buildDropdown(),this.buildReset(),this.buildSelectAll(),this.buildDropdownOptions(),this.buildFilter(),this.updateButtonText(),this.updateSelectAll(!0),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups(),this.options.wasDisabled=this.$select.prop("disabled"),this.options.disableIfEmpty&&$("option",this.$select).length<=0&&this.disable(),this.$select.wrap('<span class="multiselect-native-select" />').after(this.$container),this.options.onInitialized(this.$select,this.$container)}void 0!==ko&&ko.bindingHandlers&&!ko.bindingHandlers.multiselect&&(ko.bindingHandlers.multiselect={after:["options","value","selectedOptions","enable","disable"],init:function(element,valueAccessor,allBindings,viewModel,bindingContext){var $element=$(element),config=ko.toJS(valueAccessor());if($element.multiselect(config),allBindings.has("options")){var options=allBindings.get("options");ko.isObservable(options)&&ko.computed({read:function(){options(),setTimeout((function(){var ms=$element.data("multiselect");ms&&ms.updateOriginalOptions(),$element.multiselect("rebuild")}),1)},disposeWhenNodeIsRemoved:element})}if(allBindings.has("value")){var value=allBindings.get("value");ko.isObservable(value)&&ko.computed({read:function(){value(),setTimeout((function(){$element.multiselect("refresh")}),1)},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0})}if(allBindings.has("selectedOptions")){var selectedOptions=allBindings.get("selectedOptions");ko.isObservable(selectedOptions)&&ko.computed({read:function(){selectedOptions(),setTimeout((function(){$element.multiselect("refresh")}),1)},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0})}var setEnabled=function(enable){setTimeout((function(){enable?$element.multiselect("enable"):$element.multiselect("disable")}))};if(allBindings.has("enable")){var enable=allBindings.get("enable");ko.isObservable(enable)?ko.computed({read:function(){setEnabled(enable())},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0}):setEnabled(enable)}if(allBindings.has("disable")){var disable=allBindings.get("disable");ko.isObservable(disable)?ko.computed({read:function(){setEnabled(!disable())},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0}):setEnabled(!disable)}ko.utils.domNodeDisposal.addDisposeCallback(element,(function(){$element.multiselect("destroy")}))},update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var $element=$(element),config=ko.toJS(valueAccessor());$element.multiselect("setOptions",config),$element.multiselect("rebuild")}}),Multiselect.prototype={defaults:{buttonText:function(selectedOptions,select){if(this.disabledText.length>0&&select.prop("disabled"))return this.disabledText;if(0===selectedOptions.length)return this.nonSelectedText;if(this.allSelectedText&&selectedOptions.length===$("option",$(select)).length&&1!==$("option",$(select)).length&&this.multiple)return this.selectAllNumber?this.allSelectedText+" ("+selectedOptions.length+")":this.allSelectedText;if(0!=this.numberDisplayed&&selectedOptions.length>this.numberDisplayed)return selectedOptions.length+" "+this.nSelectedText;var selected="",delimiter=this.delimiterText;return selectedOptions.each((function(){var label=void 0!==$(this).attr("label")?$(this).attr("label"):$(this).text();selected+=label+delimiter})),selected.substr(0,selected.length-this.delimiterText.length)},buttonTitle:function(options,select){if(0===options.length)return this.nonSelectedText;var selected="",delimiter=this.delimiterText;return options.each((function(){var label=void 0!==$(this).attr("label")?$(this).attr("label"):$(this).text();selected+=label+delimiter})),selected.substr(0,selected.length-this.delimiterText.length)},checkboxName:function(option){return!1},optionLabel:function(element){return $(element).attr("label")||$(element).text()},optionClass:function(element){return $(element).attr("class")||""},onChange:function(option,checked){},onDropdownShow:function(event){},onDropdownHide:function(event){},onDropdownShown:function(event){},onDropdownHidden:function(event){},onSelectAll:function(){},onDeselectAll:function(){},onInitialized:function($select,$container){},onFiltering:function($filter){},enableHTML:!1,buttonClass:"custom-select",inheritClass:!1,buttonWidth:"auto",buttonContainer:'<div class="btn-group" />',dropRight:!1,dropUp:!1,selectedClass:"active",maxHeight:!1,includeSelectAllOption:!1,includeSelectAllIfMoreThan:0,selectAllText:" Select all",selectAllValue:"multiselect-all",selectAllName:!1,selectAllNumber:!0,selectAllJustVisible:!0,enableFiltering:!1,enableCaseInsensitiveFiltering:!1,enableFullValueFiltering:!1,enableClickableOptGroups:!1,enableCollapsibleOptGroups:!1,collapseOptGroupsByDefault:!1,filterPlaceholder:"Search",filterBehavior:"text",includeFilterClearBtn:!0,preventInputChangeEvent:!1,nonSelectedText:"None selected",nSelectedText:"selected",allSelectedText:"All selected",numberDisplayed:3,disableIfEmpty:!1,disabledText:"",delimiterText:", ",includeResetOption:!1,includeResetDivider:!1,resetText:"Reset",indentGroupOptions:!0,templates:{button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown"><span class="multiselect-selected-text"></span></button>',popupContainer:'<div class="multiselect-container dropdown-menu"></div>',filter:'<div class="multiselect-filter d-flex align-items-center"><i class="fas fa-sm fa-search text-muted"></i><input type="search" class="multiselect-search form-control" /></div>',option:'<button type="button" class="multiselect-option dropdown-item"></button>',divider:'<div class="dropdown-divider"></div>',optionGroup:'<button type="button" class="multiselect-group dropdown-item"></button>',resetButton:'<div class="multiselect-reset text-center p-2"><button type="button" class="btn btn-sm btn-block btn-outline-secondary"></button></div>'}},constructor:Multiselect,buildContainer:function(){this.$container=$(this.options.buttonContainer),this.$container.on("show.bs.dropdown",this.options.onDropdownShow),this.$container.on("hide.bs.dropdown",this.options.onDropdownHide),this.$container.on("shown.bs.dropdown",this.options.onDropdownShown),this.$container.on("hidden.bs.dropdown",this.options.onDropdownHidden)},buildButton:function(){this.$button=$(this.options.templates.button).addClass(this.options.buttonClass),this.$select.attr("class")&&this.options.inheritClass&&this.$button.addClass(this.$select.attr("class")),this.$select.prop("disabled")?this.disable():this.enable(),this.options.buttonWidth&&"auto"!==this.options.buttonWidth&&(this.$button.css({width:"100%",overflow:"hidden","text-overflow":"ellipsis"}),this.$container.css({width:this.options.buttonWidth}));var tabindex=this.$select.attr("tabindex");tabindex&&this.$button.attr("tabindex",tabindex),this.$container.prepend(this.$button)},buildDropdown:function(){this.$popupContainer=$(this.options.templates.popupContainer),this.options.dropRight?this.$container.addClass("dropright"):this.options.dropUp&&this.$container.addClass("dropup"),this.options.maxHeight&&this.$popupContainer.css({"max-height":this.options.maxHeight+"px","overflow-y":"auto","overflow-x":"hidden"}),this.$popupContainer.on("touchstart click",(function(e){e.stopPropagation()})),this.$container.append(this.$popupContainer)},buildDropdownOptions:function(){this.$select.children().each($.proxy((function(index,element){var $element=$(element),tag=$element.prop("tagName").toLowerCase();$element.prop("value")!==this.options.selectAllValue&&("optgroup"===tag?this.createOptgroup(element):"option"===tag&&("divider"===$element.data("role")?this.createDivider():this.createOptionValue(element,!1)))}),this)),$(this.$popupContainer).off("change",'> *:not(.multiselect-group) input[type="checkbox"], > *:not(.multiselect-group) input[type="radio"]'),$(this.$popupContainer).on("change",'> *:not(.multiselect-group) input[type="checkbox"], > *:not(.multiselect-group) input[type="radio"]',$.proxy((function(event){var $target=$(event.target),checked=$target.prop("checked")||!1,isSelectAllOption=$target.val()===this.options.selectAllValue;this.options.selectedClass&&(checked?$target.closest(".multiselect-option").addClass(this.options.selectedClass):$target.closest(".multiselect-option").removeClass(this.options.selectedClass));var value=$target.val(),$option=this.getOptionByValue(value),$optionsNotThis=$("option",this.$select).not($option),$checkboxesNotThis=$("input",this.$container).not($target);if(isSelectAllOption?checked?this.selectAll(this.options.selectAllJustVisible,!0):this.deselectAll(this.options.selectAllJustVisible,!0):(checked?($option.prop("selected",!0),this.options.multiple?$option.prop("selected",!0):(this.options.selectedClass&&$($checkboxesNotThis).closest(".dropdown-item").removeClass(this.options.selectedClass),$($checkboxesNotThis).prop("checked",!1),$optionsNotThis.prop("selected",!1),this.$button.click()),"active"===this.options.selectedClass&&$optionsNotThis.closest(".dropdown-item").css("outline","")):$option.prop("selected",!1),this.options.onChange($option,checked),this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups()),this.$select.change(),this.updateButtonText(),this.options.preventInputChangeEvent)return!1}),this)),$(".multiselect-option",this.$popupContainer).off("mousedown"),$(".multiselect-option",this.$popupContainer).on("mousedown",(function(e){if(e.shiftKey)return!1})),$(this.$popupContainer).off("touchstart click",".multiselect-option, .multiselect-all, .multiselect-group"),$(this.$popupContainer).on("touchstart click",".multiselect-option, .multiselect-all, .multiselect-group",$.proxy((function(event){event.stopPropagation();var $target=$(event.target),$input;if(event.shiftKey&&this.options.multiple){$target.is("input")||(event.preventDefault(),($target=$target.closest(".multiselect-option").find("input")).prop("checked",!$target.prop("checked")));var checked=$target.prop("checked")||!1;if(null!==this.lastToggledInput&&this.lastToggledInput!==$target){var from=this.$popupContainer.find(".multiselect-option:visible").index($target.closest(".multiselect-option")),to=this.$popupContainer.find(".multiselect-option:visible").index(this.lastToggledInput.closest(".multiselect-option"));if(from>to){var tmp=to;to=from,from=tmp}++to;var range=this.$popupContainer.find(".multiselect-option:not(.multiselect-filter-hidden)").slice(from,to).find("input");range.prop("checked",checked),this.options.selectedClass&&range.closest(".multiselect-option").toggleClass(this.options.selectedClass,checked);for(var i=0,j=range.length;i<j;i++){var $checkbox=$(range[i]),$option;this.getOptionByValue($checkbox.val()).prop("selected",checked)}}$target.trigger("change")}else if(!$target.is("input")){var $checkbox;if(($checkbox=$target.closest(".multiselect-option, .multiselect-all").find(".form-check-input")).length>0)$checkbox.prop("checked",!$checkbox.prop("checked")),$checkbox.change();else if(this.options.enableClickableOptGroups&&this.options.multiple&&!$target.hasClass("caret-container")){var groupItem=$target;groupItem.hasClass("multiselect-group")||(groupItem=$target.closest(".multiselect-group")),($checkbox=groupItem.find(".form-check-input")).length>0&&($checkbox.prop("checked",!$checkbox.prop("checked")),$checkbox.change())}event.preventDefault()}$target.closest(".multiselect-option").find("input[type='checkbox'], input[type='radio']").length>0?this.lastToggledInput=$target:this.lastToggledInput=null,$target.blur()}),this)),this.$container.off("keydown.multiselect").on("keydown.multiselect",$.proxy((function(event){if(!$("input.multiselect-search",this.$container).is(":focus"))if(9===event.keyCode&&this.$container.hasClass("show"))this.$button.click();else{var $items=$(this.$container).find(".multiselect-option:not(.disabled), .multiselect-group:not(.disabled), .multiselect-all").filter(":visible");if(!$items.length)return;var index=$items.index($items.filter(":focus")),$current=$items.eq(index);if(32===event.keyCode){var $checkbox=$current.find("input");$checkbox.prop("checked",!$checkbox.prop("checked")),$checkbox.change(),event.preventDefault()}13===event.keyCode&&setTimeout((function(){$current.focus()}),0)}}),this)),this.options.enableClickableOptGroups&&this.options.multiple&&($(".multiselect-group input",this.$popupContainer).off("change"),$(".multiselect-group input",this.$popupContainer).on("change",$.proxy((function(event){event.stopPropagation();var $target,checked=$(event.target).prop("checked")||!1,$item=$(event.target).closest(".dropdown-item"),$group,$inputs=$item.nextUntil(".multiselect-group").not(".multiselect-filter-hidden").not(".disabled").find("input"),$options=[];this.options.selectedClass&&(checked?$item.addClass(this.options.selectedClass):$item.removeClass(this.options.selectedClass)),$.each($inputs,$.proxy((function(index,input){var $input=$(input),value=$input.val(),$option=this.getOptionByValue(value);checked?($input.prop("checked",!0),$input.closest(".dropdown-item").addClass(this.options.selectedClass),$option.prop("selected",!0)):($input.prop("checked",!1),$input.closest(".dropdown-item").removeClass(this.options.selectedClass),$option.prop("selected",!1)),$options.push(this.getOptionByValue(value))}),this)),this.options.onChange($options,checked),this.$select.change(),this.updateButtonText(),this.updateSelectAll()}),this))),this.options.enableCollapsibleOptGroups&&this.options.multiple&&($(".multiselect-group .caret-container",this.$popupContainer).off("click"),$(".multiselect-group .caret-container",this.$popupContainer).on("click",$.proxy((function(event){var $group,$inputs=$(event.target).closest(".multiselect-group").nextUntil(".multiselect-group").not(".multiselect-filter-hidden"),visible=!0;$inputs.each((function(){visible=visible&&!$(this).hasClass("multiselect-collapsible-hidden")})),visible?$inputs.hide().addClass("multiselect-collapsible-hidden"):$inputs.show().removeClass("multiselect-collapsible-hidden")}),this)))},createCheckbox:function($item,label,name,value,title,inputType){var $wrapper=$("<span />");if($wrapper.addClass("form-check"),this.options.enableHTML&&$(label).length>0)$wrapper.append($(label));else{var $checkboxLabel=$('<label class="form-check-label" />');$checkboxLabel.text(label),$wrapper.append($checkboxLabel)}var $checkbox=$('<input class="form-check-input"/>').attr("type",inputType);return $checkbox.val(value),$wrapper.prepend($checkbox),name&&$checkbox.attr("name",name),$item.prepend($wrapper),$item.attr("title",title||label),$checkbox},createOptionValue:function(element,isGroupOption){var $element=$(element);$element.is(":selected")&&$element.prop("selected",!0);var label=this.options.optionLabel(element),classes=this.options.optionClass(element),value=$element.val(),inputType=this.options.multiple?"checkbox":"radio",title=$element.attr("title"),$option=$(this.options.templates.option);$option.addClass(classes),isGroupOption&&this.options.indentGroupOptions&&$option.addClass("multiselect-group-option-indented"),this.options.collapseOptGroupsByDefault&&"optgroup"===$(element).parent().prop("tagName").toLowerCase()&&($option.addClass("multiselect-collapsible-hidden"),$option.hide());var name=this.options.checkboxName($element),$checkbox=this.createCheckbox($option,label,name,value,title,inputType),selected=$element.prop("selected")||!1;value===this.options.selectAllValue&&($option.addClass("multiselect-all"),$option.removeClass("multiselect-option"),$checkbox.parent().parent().addClass("multiselect-all")),this.$popupContainer.append($option),$element.is(":disabled")&&$checkbox.attr("disabled","disabled").prop("disabled",!0).closest(".dropdown-item").addClass("disabled"),$checkbox.prop("checked",selected),selected&&this.options.selectedClass&&$checkbox.closest(".dropdown-item").addClass(this.options.selectedClass)},createDivider:function(element){var $divider=$(this.options.templates.divider);this.$popupContainer.append($divider)},createOptgroup:function(group){var $group=$(group),label=$group.attr("label"),value=$group.attr("value"),title=$group.attr("title"),$groupOption=$("<span class='multiselect-group dropdown-item-text'></span>");if(this.options.enableClickableOptGroups&&this.options.multiple){$groupOption=$(this.options.templates.optionGroup);var $checkbox=this.createCheckbox($groupOption,label,null,value,title,"checkbox")}else this.options.enableHTML?$groupOption.html(" "+label):$groupOption.text(" "+label);var classes=this.options.optionClass(group);$groupOption.addClass(classes),this.options.enableCollapsibleOptGroups&&this.options.multiple&&($groupOption.find(".form-check").addClass("d-inline-block"),$groupOption.append('<span class="caret-container dropdown-toggle pl-1"></span>')),$group.is(":disabled")&&$groupOption.addClass("disabled"),this.$popupContainer.append($groupOption),$("option",group).each($.proxy((function($,group){this.createOptionValue(group,!0)}),this))},buildReset:function(){if(this.options.includeResetOption){if(this.options.includeResetDivider){var divider=$(this.options.templates.divider);divider.addClass("mt-0"),this.$popupContainer.prepend(divider)}var $resetButton=$(this.options.templates.resetButton);this.options.enableHTML?$("button",$resetButton).html(this.options.resetText):$("button",$resetButton).text(this.options.resetText),$("button",$resetButton).click($.proxy((function(){this.clearSelection()}),this)),this.$popupContainer.prepend($resetButton)}},buildSelectAll:function(){var alreadyHasSelectAll;if("number"==typeof this.options.selectAllValue&&(this.options.selectAllValue=this.options.selectAllValue.toString()),!this.hasSelectAll()&&this.options.includeSelectAllOption&&this.options.multiple&&$("option",this.$select).length>this.options.includeSelectAllIfMoreThan){this.options.includeSelectAllDivider&&this.$popupContainer.prepend($(this.options.templates.divider));var $option=$(this.options.templates.li||this.options.templates.option),$checkbox=this.createCheckbox($option,this.options.selectAllText,this.options.selectAllName,this.options.selectAllValue,this.options.selectAllText,"checkbox");$option.addClass("multiselect-all"),$option.removeClass("multiselect-option"),$option.find(".form-check-label").addClass("font-weight-bold"),this.$popupContainer.prepend($option),$checkbox.prop("checked",!1)}},buildFilter:function(){if(this.options.enableFiltering||this.options.enableCaseInsensitiveFiltering){var enableFilterLength=Math.max(this.options.enableFiltering,this.options.enableCaseInsensitiveFiltering);this.$select.find("option").length>=enableFilterLength&&(this.$filter=$(this.options.templates.filter),$("input",this.$filter).attr("placeholder",this.options.filterPlaceholder),this.options.includeFilterClearBtn?(this.isFirefox()&&0===this.$filter.find(".multiselect-clear-filter").length&&this.$filter.append("<i class='fas fa-times text-muted multiselect-clear-filter multiselect-moz-clear-filter'></i>"),this.$filter.find(".multiselect-clear-filter").on("click",$.proxy((function(event){clearTimeout(this.searchTimeout),this.query="",this.$filter.find(".multiselect-search").val(""),$(".dropdown-item",this.$popupContainer).show().removeClass("multiselect-filter-hidden"),this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups()}),this))):(this.$filter.find(".multiselect-search").attr("type","text"),this.$filter.find(".multiselect-clear-filter").remove()),this.$popupContainer.prepend(this.$filter),this.$filter.val(this.query).on("click",(function(event){event.stopPropagation()})).on("input keydown",$.proxy((function(event){13===event.which&&event.preventDefault(),this.isFirefox()&&this.options.includeFilterClearBtn&&(event.target.value?this.$filter.find(".multiselect-moz-clear-filter").show():this.$filter.find(".multiselect-moz-clear-filter").hide()),clearTimeout(this.searchTimeout),this.searchTimeout=this.asyncFunction($.proxy((function(){var currentGroup,currentGroupVisible;this.query!==event.target.value&&(this.query=event.target.value,$.each($(".multiselect-option, .multiselect-group",this.$popupContainer),$.proxy((function(index,element){var value=$("input",element).length>0?$("input",element).val():"",text=$(".form-check-label",element).text(),filterCandidate="";if("text"===this.options.filterBehavior?filterCandidate=text:"value"===this.options.filterBehavior?filterCandidate=value:"both"===this.options.filterBehavior&&(filterCandidate=text+"\n"+value),value!==this.options.selectAllValue&&text){var showElement=!1;if(this.options.enableCaseInsensitiveFiltering&&(filterCandidate=filterCandidate.toLowerCase(),this.query=this.query.toLowerCase()),this.options.enableFullValueFiltering&&"both"!==this.options.filterBehavior){var valueToMatch=filterCandidate.trim().substring(0,this.query.length);this.query.indexOf(valueToMatch)>-1&&(showElement=!0)}else filterCandidate.indexOf(this.query)>-1&&(showElement=!0);showElement||($(element).css("display","none"),$(element).addClass("multiselect-filter-hidden")),showElement&&($(element).css("display","block"),$(element).removeClass("multiselect-filter-hidden")),$(element).hasClass("multiselect-group")?(currentGroup=element,currentGroupVisible=showElement):(showElement&&$(currentGroup).show().removeClass("multiselect-filter-hidden"),!showElement&&currentGroupVisible&&$(element).show().removeClass("multiselect-filter-hidden"))}}),this)));this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups(),this.options.onFiltering(event.target)}),this),300,this)}),this)))}},destroy:function(){this.$container.remove(),this.$select.show(),this.$select.prop("disabled",this.options.wasDisabled),this.$select.data("multiselect",null)},refresh:function(){var inputs={};$(".multiselect-option input",this.$popupContainer).each((function(){inputs[$(this).val()]=$(this)})),$("option",this.$select).each($.proxy((function(index,element){var $elem=$(element),$input=inputs[$(element).val()];$elem.is(":selected")?($input.prop("checked",!0),this.options.selectedClass&&$input.closest(".multiselect-option").addClass(this.options.selectedClass)):($input.prop("checked",!1),this.options.selectedClass&&$input.closest(".multiselect-option").removeClass(this.options.selectedClass)),$elem.is(":disabled")?$input.attr("disabled","disabled").prop("disabled",!0).closest(".multiselect-option").addClass("disabled"):$input.prop("disabled",!1).closest(".multiselect-option").removeClass("disabled")}),this)),this.updateButtonText(),this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups()},select:function(selectValues,triggerOnChange){$.isArray(selectValues)||(selectValues=[selectValues]);for(var i=0;i<selectValues.length;i++){var value=selectValues[i];if(null!=value){var $option=this.getOptionByValue(value),$checkbox=this.getInputByValue(value);void 0!==$option&&void 0!==$checkbox&&(this.options.multiple||this.deselectAll(!1),this.options.selectedClass&&$checkbox.closest(".dropdown-item").addClass(this.options.selectedClass),$checkbox.prop("checked",!0),$option.prop("selected",!0),triggerOnChange&&this.options.onChange($option,!0))}}this.updateButtonText(),this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups()},clearSelection:function(){this.deselectAll(!1),this.updateButtonText(),this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups()},deselect:function(deselectValues,triggerOnChange){$.isArray(deselectValues)||(deselectValues=[deselectValues]);for(var i=0;i<deselectValues.length;i++){var value=deselectValues[i];if(null!=value){var $option=this.getOptionByValue(value),$checkbox=this.getInputByValue(value);void 0!==$option&&void 0!==$checkbox&&(this.options.selectedClass&&$checkbox.closest(".dropdown-item").removeClass(this.options.selectedClass),$checkbox.prop("checked",!1),$option.prop("selected",!1),triggerOnChange&&this.options.onChange($option,!1))}}this.updateButtonText(),this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups()},selectAll:function(justVisible,triggerOnSelectAll){var justVisible=void 0===justVisible||justVisible,allOptions=$(".multiselect-option:not(.disabled)",this.$popupContainer),visibleOptions=$(".multiselect-option:not(.disabled):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)",this.$popupContainer).filter(":visible");justVisible?($("input:enabled",visibleOptions).prop("checked",!0),visibleOptions.addClass(this.options.selectedClass),$("input:enabled",visibleOptions).each($.proxy((function(index,element){var value=$(element).val(),option=this.getOptionByValue(value);$(option).prop("selected",!0)}),this))):($("input:enabled",allOptions).prop("checked",!0),allOptions.addClass(this.options.selectedClass),$("input:enabled",allOptions).each($.proxy((function(index,element){var value=$(element).val(),option=this.getOptionByValue(value);$(option).prop("selected",!0)}),this))),$('.multiselect-option input[value="'+this.options.selectAllValue+'"]',this.$popupContainer).prop("checked",!0),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups(),this.updateButtonText(),this.updateSelectAll(),triggerOnSelectAll&&this.options.onSelectAll()},deselectAll:function(justVisible,triggerOnDeselectAll){var justVisible=void 0===justVisible||justVisible,allOptions=$(".multiselect-option:not(.disabled):not(.multiselect-group)",this.$popupContainer),visibleOptions=$(".multiselect-option:not(.disabled):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)",this.$popupContainer).filter(":visible");justVisible?($('input[type="checkbox"]:enabled',visibleOptions).prop("checked",!1),visibleOptions.removeClass(this.options.selectedClass),$('input[type="checkbox"]:enabled',visibleOptions).each($.proxy((function(index,element){var value=$(element).val(),option=this.getOptionByValue(value);$(option).prop("selected",!1)}),this))):($('input[type="checkbox"]:enabled',allOptions).prop("checked",!1),allOptions.removeClass(this.options.selectedClass),$('input[type="checkbox"]:enabled',allOptions).each($.proxy((function(index,element){var value=$(element).val(),option=this.getOptionByValue(value);$(option).prop("selected",!1)}),this))),$('.multiselect-all input[value="'+this.options.selectAllValue+'"]',this.$popupContainer).prop("checked",!1),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups(),this.updateButtonText(),this.updateSelectAll(),triggerOnDeselectAll&&this.options.onDeselectAll()},rebuild:function(){this.$popupContainer.html(""),this.options.multiple="multiple"===this.$select.attr("multiple"),this.buildSelectAll(),this.buildDropdownOptions(),this.buildFilter(),this.updateButtonText(),this.updateSelectAll(!0),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups(),this.options.disableIfEmpty&&$("option",this.$select).length<=0?this.disable():this.enable(),this.options.dropRight?this.$container.addClass("dropright"):this.options.dropUp&&this.$container.addClass("dropup")},dataprovider:function(dataprovider){var groupCounter=0,$select=this.$select.empty();$.each(dataprovider,(function(index,option){var $tag;if($.isArray(option.children))groupCounter++,$tag=$("<optgroup/>").attr({label:option.label||"Group "+groupCounter,disabled:!!option.disabled,value:option.value}),forEach(option.children,(function(subOption){var attributes={value:subOption.value,label:subOption.label||subOption.value,title:subOption.title,selected:!!subOption.selected,disabled:!!subOption.disabled};for(var key in subOption.attributes)attributes["data-"+key]=subOption.attributes[key];$tag.append($("<option/>").attr(attributes))}));else{var attributes={value:option.value,label:option.label||option.value,title:option.title,class:option.class,selected:!!option.selected,disabled:!!option.disabled};for(var key in option.attributes)attributes["data-"+key]=option.attributes[key];($tag=$("<option/>").attr(attributes)).text(option.label||option.value)}$select.append($tag)})),this.rebuild()},enable:function(){this.$select.prop("disabled",!1),this.$button.prop("disabled",!1).removeClass("disabled"),this.updateButtonText()},disable:function(){this.$select.prop("disabled",!0),this.$button.prop("disabled",!0).addClass("disabled"),this.updateButtonText()},setOptions:function(options){this.options=this.mergeOptions(options)},mergeOptions:function(options){return $.extend(!0,{},this.defaults,this.options,options)},hasSelectAll:function(){return $(".multiselect-all",this.$popupContainer).length>0},updateOptGroups:function(){var $groups=$(".multiselect-group",this.$popupContainer),selectedClass=this.options.selectedClass;$groups.each((function(){var $options=$(this).nextUntil(".multiselect-group").not(".multiselect-filter-hidden").not(".disabled"),checked=!0;$options.each((function(){var $input;$("input",this).prop("checked")||(checked=!1)})),selectedClass&&(checked?$(this).addClass(selectedClass):$(this).removeClass(selectedClass)),$("input",this).prop("checked",checked)}))},updateSelectAll:function(notTriggerOnSelectAll){if(this.hasSelectAll()){var allBoxes=$(".multiselect-option:not(.multiselect-filter-hidden):not(.multiselect-group):not(.disabled) input:enabled",this.$popupContainer),allBoxesLength=allBoxes.length,checkedBoxesLength=allBoxes.filter(":checked").length,selectAllItem=$(".multiselect-all",this.$popupContainer),selectAllInput=selectAllItem.find("input");checkedBoxesLength>0&&checkedBoxesLength===allBoxesLength?(selectAllInput.prop("checked",!0),selectAllItem.addClass(this.options.selectedClass)):(selectAllInput.prop("checked",!1),selectAllItem.removeClass(this.options.selectedClass))}},updateButtonText:function(){var options=this.getSelected();this.options.enableHTML?$(".multiselect .multiselect-selected-text",this.$container).html(this.options.buttonText(options,this.$select)):$(".multiselect .multiselect-selected-text",this.$container).text(this.options.buttonText(options,this.$select)),$(".multiselect",this.$container).attr("title",this.options.buttonTitle(options,this.$select))},getSelected:function(){return $("option",this.$select).filter(":selected")},getOptionByValue:function(value){for(var options=$("option",this.$select),valueToCompare=value.toString(),i=0;i<options.length;i+=1){var option=options[i];if(option.value===valueToCompare)return $(option)}},getInputByValue:function(value){for(var checkboxes=$(".multiselect-option input:not(.multiselect-search)",this.$popupContainer),valueToCompare=value.toString(),i=0;i<checkboxes.length;i+=1){var checkbox=checkboxes[i];if(checkbox.value===valueToCompare)return $(checkbox)}},updateOriginalOptions:function(){this.originalOptions=this.$select.clone()[0].options},asyncFunction:function(callback,timeout,self){var args=Array.prototype.slice.call(arguments,3);return setTimeout((function(){callback.apply(self||window,args)}),timeout)},setAllSelectedText:function(allSelectedText){this.options.allSelectedText=allSelectedText,this.updateButtonText()},isFirefox:function(){var firefoxIdentifier="firefox",valueNotFoundIndex=-1;return!(!navigator||!navigator.userAgent)&&navigator.userAgent.toLocaleLowerCase().indexOf("firefox")>-1}},$.fn.multiselect=function(option,parameter,extraOptions){return this.each((function(){var data=$(this).data("multiselect"),options;data||(data=new Multiselect(this,"object"==typeof option&&option),$(this).data("multiselect",data)),"string"==typeof option&&(data[option](parameter,extraOptions),"destroy"===option&&$(this).data("multiselect",!1))}))},$.fn.multiselect.Constructor=Multiselect,$((function(){$("select[data-role=multiselect]").multiselect()}))})); \ No newline at end of file
diff --git a/sh_helpdesk/static/src/js/filter.js b/sh_helpdesk/static/src/js/filter.js
new file mode 100644
index 0000000..4c0d4f7
--- /dev/null
+++ b/sh_helpdesk/static/src/js/filter.js
@@ -0,0 +1,348 @@
+$(document).ready(function (e) {
+ $.ajax({
+ url: "/user-group",
+ data: {},
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ if (datas.user == "1") {
+ $("#leader_div").addClass("o_hidden");
+ $("#team_div").addClass("o_hidden");
+ $("#assign_user_div").addClass("o_hidden");
+ } else if (datas.leader == "1") {
+ $("#leader_div").addClass("o_hidden");
+ } else if (datas.manager == "1") {
+ $("#leader_div").removeClass("o_hidden");
+ $("#team_div").removeClass("o_hidden");
+ $("#assign_user_div").removeClass("o_hidden");
+ }
+ },
+ });
+ var filter_date = $("#days_filter").children("option:selected").val();
+ if (filter_date == "custom") {
+ $("#start_date").removeClass("o_hidden");
+ $("#end_date").removeClass("o_hidden");
+ } else {
+ $("#start_date").addClass("o_hidden");
+ $("#end_date").addClass("o_hidden");
+ $("#start_date").val("");
+ $("#end_date").val("");
+ }
+ $.get(
+ "/get-ticket-table-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_tbl_div").replaceWith(result);
+ }
+ );
+ $.get(
+ "/get-ticket-counter-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_count_div").replaceWith(result);
+ }
+ );
+ $.get("/get_team", function (data) {
+ obj = JSON.parse(data);
+
+ for (var key in obj) {
+ $("#team").append('<option value="' + key + '" >' + obj[key].name + "</option>");
+ }
+ });
+ $.get("/get_team_leader", function (data) {
+ obj = JSON.parse(data);
+
+ for (var key in obj) {
+ $("#team_leader").append('<option value="' + key + '" >' + obj[key].name + "</option>");
+ $("#assign_user").append('<option value="' + key + '" >' + obj[key].name + "</option>");
+ }
+ });
+ $(document).on("click", ".custom", function (e) {
+ var self = this;
+ var values = $(this).attr("data-res_ids");
+ $.ajax({
+ url: "/open-ticket",
+ data: { ids: values },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ },
+ });
+ });
+ $(document).on("click", ".mark-whatsapp", function (e) {
+ var $el = $(e.target).parents("tr").find("#partner_id").attr("value");
+ var $mobile = $(e.target).parents("tr").find("#partner_id").attr("data-mobile");
+ var partner_id = parseInt($el);
+ $(".whatsapp_modal").modal("show");
+ $("#ticket_partner_id").val(partner_id);
+ $("#partner_mobile_no").val($mobile);
+ });
+ $(document).on("change", "#ticket_partner_id", function (e) {
+ $.ajax({
+ url: "/get-mobile-no",
+ data: {'partner_id':$('#ticket_partner_id').val()},
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ if(datas.mobile){
+ $("#partner_mobile_no").val(datas.mobile);
+ }
+ },
+ });
+ });
+ $(document).on("click", "#send", function (e) {
+ $.ajax({
+ url: "/send-by-whatsapp",
+ data: {'partner_id':$('#ticket_partner_id').val(),'partner_mobile_no':$('#partner_mobile_no').val(),'message':$('#whatsapp_message').val( )},
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ if(datas.msg){
+ alert(datas.msg);
+ }
+ else{
+ if(datas.url){
+ window.open(datas.url, '_blank');
+ }
+ }
+ },
+ });
+ });
+ $(document).on("change", "#days_filter", function (e) {
+ var filter_date = $("#days_filter").children("option:selected").val();
+ if (filter_date == "custom") {
+ $("#start_date").removeClass("o_hidden");
+ $("#end_date").removeClass("o_hidden");
+ } else {
+ $("#start_date").addClass("o_hidden");
+ $("#end_date").addClass("o_hidden");
+ $("#start_date").val("");
+ $("#end_date").val("");
+ }
+ $.get(
+ "/get-ticket-table-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_tbl_div").replaceWith(result);
+ }
+ );
+ $.get(
+ "/get-ticket-counter-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_count_div").replaceWith(result);
+ }
+ );
+ });
+ $(document).on("change", "#assign_user", function (e) {
+ $.get(
+ "/get-ticket-table-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_tbl_div").replaceWith(result);
+ }
+ );
+ $.get(
+ "/get-ticket-counter-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_count_div").replaceWith(result);
+ }
+ );
+ });
+ $(document).on("change", "#start_date", function (e) {
+ $.get(
+ "/get-ticket-table-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_tbl_div").replaceWith(result);
+ }
+ );
+ $.get(
+ "/get-ticket-counter-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_count_div").replaceWith(result);
+ }
+ );
+ });
+ $(document).on("change", "#end_date", function (e) {
+ $.get(
+ "/get-ticket-table-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_tbl_div").replaceWith(result);
+ }
+ );
+ $.get(
+ "/get-ticket-counter-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_count_div").replaceWith(result);
+ }
+ );
+ });
+ $(document).on("change", "#team_leader", function (e) {
+ $.ajax({
+ url: "/get-leader-user",
+ data: { team_leader: $("#team_leader").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#team > option").remove();
+ $("#team").append('<option value="0">Team</option>');
+ for (var key in datas) {
+ $("#team").append('<option value="' + key + '" >' + datas[key].name + "</option>");
+ }
+ },
+ });
+ $.get(
+ "/get-ticket-table-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_tbl_div").replaceWith(result);
+ }
+ );
+ $.get(
+ "/get-ticket-counter-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_count_div").replaceWith(result);
+ }
+ );
+ });
+ $(document).on("change", "#team", function (e) {
+ $.ajax({
+ url: "/get-user",
+ data: { team: $("#team").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#assign_user > option").remove();
+ $("#assign_user").append('<option value="0" selected="True">Assign User</option>');
+ for (var key in datas) {
+ $("#assign_user").append('<option value="' + key + '" >' + datas[key].name + "</option>");
+ }
+ },
+ });
+ $.get(
+ "/get-ticket-table-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_tbl_div").replaceWith(result);
+ }
+ );
+ $.get(
+ "/get-ticket-counter-data",
+ {
+ team: $("#team").val(),
+ team_leader: $("#team_leader").val(),
+ user_id: $("#assign_user").val(),
+ filter_date: $("#days_filter").children("option:selected").val(),
+ date_start: $("#start_date").val(),
+ date_end: $("#end_date").val(),
+ },
+ function (result) {
+ $("#js_ticket_count_div").replaceWith(result);
+ }
+ );
+ });
+});
+
diff --git a/sh_helpdesk/static/src/js/helpdesk_ticket_dasboard.js b/sh_helpdesk/static/src/js/helpdesk_ticket_dasboard.js
new file mode 100644
index 0000000..6f2ab06
--- /dev/null
+++ b/sh_helpdesk/static/src/js/helpdesk_ticket_dasboard.js
@@ -0,0 +1,68 @@
+odoo.define('sh_helpdesk.helpdesk_ticket_dasboard', function (require) {
+ var ajax = require('web.ajax');
+ var core = require('web.core');
+ var rpc = require('web.rpc');
+
+ var qweb = core.qweb;
+ var _t = core._t;
+ var KanbanRenderer = require("web.KanbanRenderer");
+KanbanRenderer.include({
+ events: _.extend({}, KanbanRenderer.prototype.events || {}, {
+ "click .sh_tile_click": "action_all_tickets",
+ }),
+ action_all_tickets: function (event) {
+ console.log("clicked");
+ event.stopPropagation();
+ event.preventDefault();
+ var self = this;
+ var $el = $(event.currentTarget).attr("data-res_ids");
+ if ($el == undefined){
+ this._rpc({
+ model: "ir.model.data",
+ method: "xmlid_to_res_model_res_id",
+ args: ["sh_helpdesk.helpdesk_ticket_form_view"],
+ }).then(function (data) {
+ self.do_action(
+ {
+ name: _t("Tickets"),
+ type: "ir.actions.act_window",
+ res_model: "helpdesk.ticket",
+ view_mode: "kanban,tree,form",
+ views: [
+ [false, "kanban"],
+ [false, "list"],
+ [data[1], "form"],
+ ],
+ domain: [["id", "in", []]],
+ target: "current",
+ },
+ );
+ });
+ }
+ else{
+ var list_value = JSON.parse($el);
+ this._rpc({
+ model: "ir.model.data",
+ method: "xmlid_to_res_model_res_id",
+ args: ["sh_helpdesk.helpdesk_ticket_form_view"],
+ }).then(function (data) {
+ self.do_action(
+ {
+ name: _t("Tickets"),
+ type: "ir.actions.act_window",
+ res_model: "helpdesk.ticket",
+ view_mode: "kanban,tree,form",
+ views: [
+ [false, "kanban"],
+ [false, "list"],
+ [data[1], "form"],
+ ],
+ domain: [["id", "in", list_value]],
+ target: "current",
+ },
+ );
+ });
+ }
+ },
+});
+}); \ No newline at end of file
diff --git a/sh_helpdesk/static/src/js/helpdesk_ticket_kanban_examples.js b/sh_helpdesk/static/src/js/helpdesk_ticket_kanban_examples.js
new file mode 100644
index 0000000..7f9504e
--- /dev/null
+++ b/sh_helpdesk/static/src/js/helpdesk_ticket_kanban_examples.js
@@ -0,0 +1,10 @@
+odoo.define('sh_helpdesk.helpdesk_ticket_kanban_examples', function (require) {
+'use strict';
+
+var core = require('web.core');
+var kanbanExamplesRegistry = require('web.kanban_examples_registry');
+var _lt = core._lt;
+kanbanExamplesRegistry.add('sh_helpdesk', {
+ ghostColumns: [_lt('New'), _lt('In Progress'), _lt('Done'), _lt('Closed'), _lt('Reopened'), _lt('Cancelled')],
+});
+});
diff --git a/sh_helpdesk/static/src/js/portal.js b/sh_helpdesk/static/src/js/portal.js
new file mode 100644
index 0000000..fcf43e7
--- /dev/null
+++ b/sh_helpdesk/static/src/js/portal.js
@@ -0,0 +1,131 @@
+$(document).ready(function (e) {
+
+ $(function(){
+ $('#portal_assign_multi_user').multiselect();
+ });
+
+ $("#new_request").click(function () {
+ $("#createticketModal").modal("show");
+ });
+ $.ajax({
+ url: "/portal-subcategory-data",
+ data: { category_id: $("#portal_category").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#portal_subcategory > option").remove();
+ $("#portal_subcategory").append('<option value="' + "sub_category" + '">' + "Select Sub Category" + "</option>");
+ _.each(datas.sub_categories, function (data) {
+ $("#portal_subcategory").append('<option value="' + data.id + '">' + data.name + "</option>");
+ });
+ },
+ });
+
+ $.ajax({
+ url: "/portal-partner-data",
+ data: {},
+ type: "post",
+ async: false,
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#partner_ids > option").remove();
+ _.each(datas.partners, function (data) {
+ $("#partner_ids").append('<option data-id="' + data.id + '" value="' + data.name + '">');
+ });
+ },
+ });
+ $(document).on("change", "#partner", function (e) {
+ var option = $("#partner_ids").find("[value='" + $("#partner").val() + "']");
+ var partner = option.data("id");
+ $("#partner_id").val("");
+ $("#partner_id").val(partner);
+ if ($("#partner_id").val() != "") {
+ $.ajax({
+ url: "/selected-partner-data",
+ data: { partner_id: $("#partner_id").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#portal_contact_name").val(datas.name);
+ $("#portal_email").val(datas.email);
+ },
+ });
+ } else {
+ $("#portal_contact_name").val("");
+ $("#portal_email").val("");
+ }
+ });
+ $.ajax({
+ url: "/portal-subcategory-data",
+ data: { category_id: $("#portal_category").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#portal_subcategory > option").remove();
+ $("#portal_subcategory").append('<option value="' + "sub_category" + '">' + "Select Sub Category" + "</option>");
+ _.each(datas.sub_categories, function (data) {
+ $("#portal_subcategory").append('<option value="' + data.id + '">' + data.name + "</option>");
+ });
+ },
+ });
+ $.ajax({
+ url: "/portal-user-data",
+ data: { team_id: $("#portal_team").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#portal_assign_user > option").remove();
+ $("#portal_assign_user").append('<option value="' + "user" + '">' + "Select Assign User" + "</option>");
+ $("#portal_assign_multi_user").multiselect('destroy');
+ $("#portal_assign_multi_user > option").remove();
+ $("#portal_assign_multi_user").append('<option value="' + "users" + '">' + "Select Multi Users" + "</option>");
+ _.each(datas.users, function (data) {
+ $("#portal_assign_user").append('<option value="' + data.id + '">' + data.name + "</option>");
+ $("#portal_assign_multi_user").append('<option value="' + data.id + '">' + data.name + "</option>");
+ });
+ $("#portal_assign_multi_user").multiselect();
+ },
+ });
+ $(document).on("change", "#portal_category", function (e) {
+ $.ajax({
+ url: "/portal-subcategory-data",
+ data: { category_id: $("#portal_category").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#portal_subcategory > option").remove();
+ $("#portal_subcategory").append('<option value="' + "sub_category" + '">' + "Select Sub Category" + "</option>");
+ _.each(datas.sub_categories, function (data) {
+ $("#portal_subcategory").append('<option value="' + data.id + '">' + data.name + "</option>");
+ });
+ },
+ });
+ });
+ $(document).on("change", "#portal_team", function (e) {
+ $.ajax({
+ url: "/portal-user-data",
+ data: { team_id: $("#portal_team").val() },
+ type: "post",
+ cache: false,
+ success: function (result) {
+ var datas = JSON.parse(result);
+ $("#portal_assign_user > option").remove();
+ $("#portal_assign_multi_user").multiselect('destroy');
+ $("#portal_assign_multi_user > option").remove();
+ $("#portal_assign_user").append('<option value="' + "user" + '">' + "Select Assign User" + "</option>");
+ $("#portal_assign_multi_user").append('<option value="' + "users" + '">' + "Select Multi Users" + "</option>");
+ _.each(datas.users, function (data) {
+ $("#portal_assign_user").append('<option value="' + data.id + '">' + data.name + "</option>");
+ $("#portal_assign_multi_user").append('<option value="' + data.id + '">' + data.name + "</option>");
+ });
+ $("#portal_assign_multi_user").multiselect();
+ },
+ });
+ });
+});