From e705dd92d163d6d185fe1173ecb4adda6137d7a9 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Sun, 15 Aug 2021 20:01:35 +0700 Subject: [PATCH 01/83] fix upload file --- .../wwwroot/mix-app/js/app-shared.min.js | 985 +++++++++--------- .../components/custom-file/custom-file.html | 2 +- .../components/mix-column-editor/view.html | 2 +- 3 files changed, 498 insertions(+), 491 deletions(-) diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js index 958c38547..6578ffec3 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js @@ -2886,6 +2886,16 @@ appShared.factory("RestMixDatabaseColumnPortalService", [ }, ]); +"use strict"; +appShared.factory("RestMixDatabaseDataValuePortalService", [ + "BaseRestService", + function (baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("mix-database-data-value/portal"); + return serviceFactory; + }, +]); + "use strict"; appShared.factory("RestMixDatabaseDataClientService", [ "BaseRestService", @@ -3015,11 +3025,12 @@ appShared.factory("RestMixDatabaseDataPortalService", [ ]); "use strict"; -appShared.factory("RestMixDatabaseDataValuePortalService", [ +appShared.factory("RestMvcPostService", [ "BaseRestService", function (baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database-data-value/portal"); + serviceFactory.init("post/mvc"); + // Define more service methods here return serviceFactory; }, ]); @@ -3043,17 +3054,6 @@ appShared.factory("RestMvcModuleDataService", [ }, ]); -"use strict"; -appShared.factory("RestMvcPostService", [ - "BaseRestService", - function (baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("post/mvc"); - // Define more service methods here - return serviceFactory; - }, -]); - "use strict"; appShared.factory("RestRelatedAttributeDataFormService", [ "BaseRestService", @@ -4145,6 +4145,89 @@ appShared.controller("ModuleFormController", [ }, ]); +"use strict"; +appShared.controller("MvcModuleDataController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "RestMvcModuleDataService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.request.orderBy = "Priority"; + $scope.request.direction = "Asc"; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = null; + $scope.module = null; + $scope.allData = []; + $scope.editDataUrl = null; + $scope.canLoadMore = false; + $scope.init = async function (moduleId, pageSize) { + $scope.moduleId = moduleId; + $scope.request.module_id = $scope.moduleId; + $scope.request.pageSize = pageSize || $scope.request.pageSize; + $scope.loadMore(0); + }; + + $scope.getSingle = async function () { + $rootScope.isBusy = true; + var resp = await service.getSingle($scope.id, "mvc"); + if (resp && resp.isSucceed) { + $scope.activedModuleData = resp.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.activeItem = function (arr, item) { + angular.forEach(arr, function (e) { + if (e.id != item.id) { + e.expanded = false; + } else { + e.expanded = !e.expanded; + } + }); + }; + $scope.loadMore = async function (pageIndex) { + $scope.request.pageIndex = pageIndex || $scope.request.pageIndex + 1; + $rootScope.isBusy = true; + var response = await service.getList($scope.request); + if (response.isSucceed) { + $scope.allData = $scope.allData.concat(response.data.items); + $rootScope.isBusy = false; + $scope.canLoadMore = response.data.totalItems > $scope.allData.length; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + appShared.controller("MixDataController", [ "$rootScope", "$scope", @@ -4264,89 +4347,6 @@ appShared.controller("MixDataController", [ }, ]); -"use strict"; -appShared.controller("MvcModuleDataController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "RestMvcModuleDataService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.request.orderBy = "Priority"; - $scope.request.direction = "Asc"; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = null; - $scope.module = null; - $scope.allData = []; - $scope.editDataUrl = null; - $scope.canLoadMore = false; - $scope.init = async function (moduleId, pageSize) { - $scope.moduleId = moduleId; - $scope.request.module_id = $scope.moduleId; - $scope.request.pageSize = pageSize || $scope.request.pageSize; - $scope.loadMore(0); - }; - - $scope.getSingle = async function () { - $rootScope.isBusy = true; - var resp = await service.getSingle($scope.id, "mvc"); - if (resp && resp.isSucceed) { - $scope.activedModuleData = resp.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.activeItem = function (arr, item) { - angular.forEach(arr, function (e) { - if (e.id != item.id) { - e.expanded = false; - } else { - e.expanded = !e.expanded; - } - }); - }; - $scope.loadMore = async function (pageIndex) { - $scope.request.pageIndex = pageIndex || $scope.request.pageIndex + 1; - $rootScope.isBusy = true; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.allData = $scope.allData.concat(response.data.items); - $rootScope.isBusy = false; - $scope.canLoadMore = response.data.totalItems > $scope.allData.length; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - "use strict"; appShared.controller("MvcPostController", [ "$scope", @@ -4415,111 +4415,30 @@ appShared.controller("MvcPostController", [ }, ]); -sharedComponents.component("addressEditor", { - templateUrl: "/mix-app/views/app-shared/components/address-editor/view.html", - bindings: { - province: "=", - provinceClass: "=?", - district: "=", - districtClass: "=?", - ward: "=", - wardClass: "=?", - }, - controller: "AddressEditorController", -}); +sharedComponents.component("apiFile", { + templateUrl: "/mix-app/views/app-shared/components/api-file/api-file.html", + controller: [ + "$rootScope", + "$scope", + "Upload", + function PortalTemplateController($rootScope, $scope, uploader) { + var ctrl = this; + ctrl.accept = ctrl.accept || "application/zip"; + ctrl.selectFile = function (files) { + if (files !== undefined && files !== null && files.length > 0) { + const file = files[0]; + ctrl.postedFile = file; + } + }; -sharedComponents.controller("AddressEditorController", [ - "$rootScope", - "$scope", - "ApiService", - function PortalTemplateController($rootScope, $scope, apiService) { - var ctrl = this; - ctrl.provinceEndpoint = "/rest/shared/json-data/provinces.json/true"; - ctrl.districtEndpoint = "/rest/shared/json-data/districts.json/true"; - ctrl.wardEndpoint = "/rest/shared/json-data/wards.json/true"; - ctrl.$onInit = async function () { - ctrl.provinceClass = - ctrl.provinceClass || "form-select form-control mb-3"; - ctrl.districtClass = - ctrl.districtClass || "form-select form-control mb-3"; - ctrl.wardClass = ctrl.wardClass || "form-select form-control mb-3"; - - ctrl.provinceOptions = await apiService.getApiResult({ - url: ctrl.provinceEndpoint, - }); - $scope.$apply(); - $rootScope.$watch( - () => { - return ctrl.province; - }, - async function (newVal, oldVal) { - if (newVal != oldVal || !ctrl.district) { - if (!ctrl.allDistrictOptions) { - ctrl.allDistrictOptions = await apiService.getApiResult({ - url: ctrl.districtEndpoint, - }); - ctrl.districtOptions = ctrl.allDistrictOptions.filter( - (m) => m["province"] == ctrl.province - ); - $scope.$apply(); - } else { - ctrl.districtOptions = ctrl.allDistrictOptions.filter( - (m) => m["province"] == ctrl.province - ); - } - } - } - ); - $rootScope.$watch( - () => { - return ctrl.district; - }, - async function (newVal, oldVal) { - if (newVal != oldVal) { - if (!ctrl.allWardOptions) { - ctrl.allWardOptions = await apiService.getApiResult({ - url: ctrl.wardEndpoint, - }); - ctrl.wardOptions = ctrl.allWardOptions.filter( - (m) => m["district"] == ctrl.district - ); - $scope.$apply(); - } else { - ctrl.wardOptions = ctrl.allWardOptions.filter( - (m) => m["district"] == ctrl.district - ); - } - } - } - ); - }; - }, -]); - -sharedComponents.component("apiFile", { - templateUrl: "/mix-app/views/app-shared/components/api-file/api-file.html", - controller: [ - "$rootScope", - "$scope", - "Upload", - function PortalTemplateController($rootScope, $scope, uploader) { - var ctrl = this; - ctrl.accept = ctrl.accept || "application/zip"; - ctrl.selectFile = function (files) { - if (files !== undefined && files !== null && files.length > 0) { - const file = files[0]; - ctrl.postedFile = file; - } - }; - - ctrl.uploadFile = function (file) { - // Create FormData object - var files = new FormData(); - var folder = ctrl.folder; - var title = ctrl.title; - var description = ctrl.description; - // Looping over all files and add it to FormData object - files.append(file.name, file); + ctrl.uploadFile = function (file) { + // Create FormData object + var files = new FormData(); + var folder = ctrl.folder; + var title = ctrl.title; + var description = ctrl.description; + // Looping over all files and add it to FormData object + files.append(file.name, file); // Adding one more key to FormData object files.append("fileFolder", folder); @@ -4576,6 +4495,20 @@ sharedComponents.component("apiFile", { }, }); +sharedComponents.component("breadcrumbs", { + templateUrl: + "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + }, + ], + bindings: { + breadCrumbs: "=", + }, +}); + sharedComponents.component("azureStorage", { templateUrl: "/mix-app/views/app-shared/components/azure-storage/view.html", bindings: { @@ -4684,20 +4617,87 @@ sharedComponents.component("azureStorage", { ], }); -sharedComponents.component("breadcrumbs", { - templateUrl: - "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], +sharedComponents.component("addressEditor", { + templateUrl: "/mix-app/views/app-shared/components/address-editor/view.html", bindings: { - breadCrumbs: "=", + province: "=", + provinceClass: "=?", + district: "=", + districtClass: "=?", + ward: "=", + wardClass: "=?", }, + controller: "AddressEditorController", }); +sharedComponents.controller("AddressEditorController", [ + "$rootScope", + "$scope", + "ApiService", + function PortalTemplateController($rootScope, $scope, apiService) { + var ctrl = this; + ctrl.provinceEndpoint = "/rest/shared/json-data/provinces.json/true"; + ctrl.districtEndpoint = "/rest/shared/json-data/districts.json/true"; + ctrl.wardEndpoint = "/rest/shared/json-data/wards.json/true"; + ctrl.$onInit = async function () { + ctrl.provinceClass = + ctrl.provinceClass || "form-select form-control mb-3"; + ctrl.districtClass = + ctrl.districtClass || "form-select form-control mb-3"; + ctrl.wardClass = ctrl.wardClass || "form-select form-control mb-3"; + + ctrl.provinceOptions = await apiService.getApiResult({ + url: ctrl.provinceEndpoint, + }); + $scope.$apply(); + $rootScope.$watch( + () => { + return ctrl.province; + }, + async function (newVal, oldVal) { + if (newVal != oldVal || !ctrl.district) { + if (!ctrl.allDistrictOptions) { + ctrl.allDistrictOptions = await apiService.getApiResult({ + url: ctrl.districtEndpoint, + }); + ctrl.districtOptions = ctrl.allDistrictOptions.filter( + (m) => m["province"] == ctrl.province + ); + $scope.$apply(); + } else { + ctrl.districtOptions = ctrl.allDistrictOptions.filter( + (m) => m["province"] == ctrl.province + ); + } + } + } + ); + $rootScope.$watch( + () => { + return ctrl.district; + }, + async function (newVal, oldVal) { + if (newVal != oldVal) { + if (!ctrl.allWardOptions) { + ctrl.allWardOptions = await apiService.getApiResult({ + url: ctrl.wardEndpoint, + }); + ctrl.wardOptions = ctrl.allWardOptions.filter( + (m) => m["district"] == ctrl.district + ); + $scope.$apply(); + } else { + ctrl.wardOptions = ctrl.allWardOptions.filter( + (m) => m["district"] == ctrl.district + ); + } + } + } + ); + }; + }, +]); + sharedComponents.component("checkboxSwitch", { templateUrl: "/mix-app/views/app-shared/components/checkbox-switch/view.html", controller: [ @@ -4743,9 +4743,9 @@ sharedComponents.component("customFile", { title: "=", description: "=", src: "=", - srcUrl: "=", - data: "=", - type: "=", + srcUrl: "=?", + data: "=?", + type: "=?", folder: "=", auto: "=", onInsert: "&?", @@ -4759,8 +4759,15 @@ sharedComponents.component("customFile", { function PortalTemplateController($rootScope, $scope, mediaService) { var ctrl = this; ctrl.media = null; - ctrl.init = function () { + ctrl.$onInit = function () { ctrl.id = Math.random(); + ctrl.mediaFile = { + file: null, + fullPath: "", + fileFolder: "content/site", + title: "", + description: "", + }; }; ctrl.selectFile = function (files) { if (files !== undefined && files !== null && files.length > 0) { @@ -4770,7 +4777,7 @@ sharedComponents.component("customFile", { mediaService.openCroppie(ctrl.file, ctrl, true); } else { ctrl.canUpload = true; - ctrl.getBase64(ctrl.file); + ctrl.uploadFile(ctrl.file); } } }; @@ -4794,16 +4801,16 @@ sharedComponents.component("customFile", { reader.onload = async function () { var getMedia = await mediaService.getSingle(["portal"]); if (getMedia.isSucceed) { - ctrl.data.mediaFile.fileName = file.name.substring( + ctrl.mediaFile.fileName = file.name.substring( 0, file.name.lastIndexOf(".") ); - ctrl.data.mediaFile.extension = file.name.substring( + ctrl.mediaFile.extension = file.name.substring( file.name.lastIndexOf(".") ); - ctrl.data.mediaFile.fileStream = reader.result; + ctrl.mediaFile.fileStream = reader.result; var media = getMedia.data; - media.data.mediaFile = ctrl.data.mediaFile; + media.mediaFile = ctrl.mediaFile; var resp = await mediaService.save(media); if (resp && resp.isSucceed) { ctrl.src = resp.data.fullPath; @@ -4825,21 +4832,21 @@ sharedComponents.component("customFile", { } }; ctrl.getBase64 = function (file) { - if (file !== null && ctrl.data.mediaFile) { + if (file !== null && ctrl.mediaFile) { $rootScope.isBusy = true; var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function () { var index = reader.result.indexOf(",") + 1; var base64 = reader.result.substring(index); - ctrl.data.mediaFile.fileName = file.name.substring( + ctrl.mediaFile.fileName = file.name.substring( 0, file.name.lastIndexOf(".") ); - ctrl.data.mediaFile.extension = file.name.substring( + ctrl.mediaFile.extension = file.name.substring( file.name.lastIndexOf(".") ); - ctrl.data.mediaFile.fileStream = reader.result; + ctrl.mediaFile.fileStream = reader.result; ctrl.srcUrl = reader.result; $rootScope.isBusy = false; @@ -6226,22 +6233,6 @@ sharedComponents.component("mixColumnEditor", { ], }); -sharedComponents.component("mixDataPreview", { - templateUrl: - "/mix-app/views/app-shared/components/mix-data-preview/mix-data-preview.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], - bindings: { - type: "=", - value: "=", - width: "=", - }, -}); - sharedComponents.component("mixColumnPreview", { templateUrl: "/mix-app/views/app-shared/components/mix-column-preview/view.html", @@ -6291,6 +6282,22 @@ sharedComponents.component("mixColumnPreview", { ], }); +sharedComponents.component("mixDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/mix-data-preview/mix-data-preview.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + }, + ], + bindings: { + type: "=", + value: "=", + width: "=", + }, +}); + sharedComponents.component("mixDataTable", { templateUrl: "/mix-app/views/app-shared/components/mix-data-table/mix-data-table.html", @@ -7018,6 +7025,31 @@ sharedComponents.component("mixSelect", { ], }); +// sharedComponents.component('modalConfirm', { +// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', +// controller: ModalConfirmController, +// bindings: { +// message: '=' +// } +// }); +function ModalConfirmController($rootScope, $scope, $mdDialog, message) { + $scope.message = message; + $scope.executeFunctionByName = async function (functionName, args, context) { + var result = await $rootScope.executeFunctionByName( + functionName, + args, + context + ); + if (result) { + $scope.$apply(); + } + $mdDialog.hide(); + }; + $scope.closeDialog = function () { + $mdDialog.hide(); + }; +} + "use strict"; appShared.controller("ModalPostController", [ "$scope", @@ -7343,31 +7375,6 @@ sharedComponents.controller( } ); -// sharedComponents.component('modalConfirm', { -// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', -// controller: ModalConfirmController, -// bindings: { -// message: '=' -// } -// }); -function ModalConfirmController($rootScope, $scope, $mdDialog, message) { - $scope.message = message; - $scope.executeFunctionByName = async function (functionName, args, context) { - var result = await $rootScope.executeFunctionByName( - functionName, - args, - context - ); - if (result) { - $scope.$apply(); - } - $mdDialog.hide(); - }; - $scope.closeDialog = function () { - $mdDialog.hide(); - }; -} - "use strict"; appShared.controller("SharedModuleDataController", [ "$scope", @@ -7664,30 +7671,6 @@ appShared.factory("SharedModuleDataService", [ }, ]); -sharedComponents.component("moduleDataPreview", { - templateUrl: - "/mix-app/views/app-shared/components/module-data-preview/module-data-preview.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - - ctrl.translate = $rootScope.translate; - ctrl.$onInit = () => { - if (!ctrl.datatype) { - ctrl.datatype = ctrl.data.dataType; - } - }; - }, - ], - bindings: { - data: "=", - datatype: "=?", - width: "=", - header: "=", - }, -}); - sharedComponents.component("moduleForm", { templateUrl: "/mix-app/views/app-shared/components/module-form/view.html", bindings: { @@ -7835,50 +7818,27 @@ sharedComponents.component("moduleForm", { ], }); -sharedComponents.component("modulePreview", { - templateUrl: "/mix-app/views/app-shared/components/module-preview/view.html", +sharedComponents.component("moduleDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/module-data-preview/module-data-preview.html", controller: [ - "$scope", "$rootScope", - "SharedModuleDataService", - function ($scope, $rootScope, moduleDataService) { + function ($rootScope) { var ctrl = this; - $rootScope.isBusy = false; - ctrl.previousContentId = undefined; - - this.$onInit = () => { - ctrl.previousContentId = angular.copy(ctrl.contentId); - }; - - this.$doCheck = () => { - if (ctrl.contentId !== ctrl.previousContentId) { - ctrl.loadModuleData(); - ctrl.previousContentId = ctrl.contentId; - } - }; - ctrl.loadModuleData = async function () { - $rootScope.isBusy = true; - var response = await moduleDataService.getModuleData( - ctrl.moduleId, - ctrl.contentId, - "portal" - ); - if (response.isSucceed) { - ctrl.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + ctrl.translate = $rootScope.translate; + ctrl.$onInit = () => { + if (!ctrl.datatype) { + ctrl.datatype = ctrl.data.dataType; } }; }, ], bindings: { - moduleId: "=", - contentId: "=", + data: "=", + datatype: "=?", + width: "=", + header: "=", }, }); @@ -7925,6 +7885,53 @@ sharedComponents.component("moduleFormEditor", { ], }); +sharedComponents.component("modulePreview", { + templateUrl: "/mix-app/views/app-shared/components/module-preview/view.html", + controller: [ + "$scope", + "$rootScope", + "SharedModuleDataService", + function ($scope, $rootScope, moduleDataService) { + var ctrl = this; + $rootScope.isBusy = false; + ctrl.previousContentId = undefined; + + this.$onInit = () => { + ctrl.previousContentId = angular.copy(ctrl.contentId); + }; + + this.$doCheck = () => { + if (ctrl.contentId !== ctrl.previousContentId) { + ctrl.loadModuleData(); + ctrl.previousContentId = ctrl.contentId; + } + }; + + ctrl.loadModuleData = async function () { + $rootScope.isBusy = true; + var response = await moduleDataService.getModuleData( + ctrl.moduleId, + ctrl.contentId, + "portal" + ); + if (response.isSucceed) { + ctrl.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, + ], + bindings: { + moduleId: "=", + contentId: "=", + }, +}); + sharedComponents.component("mixPaging", { templateUrl: "/mix-app/views/app-shared/components/paging/paging.html", controller: [ @@ -7994,14 +8001,6 @@ sharedComponents.directive("pills", function () { }; }); -sharedComponents.component("portalSearch", { - templateUrl: "portal-search.html", - bindings: { - previewUrl: "=", - backUrl: "=", - }, -}); - sharedComponents.component("previewImage", { templateUrl: "/mix-app/views/app-shared/components/preview-image/preview-image.html", @@ -8081,55 +8080,11 @@ sharedComponents.component("qrCode", { }, }); -sharedComponents.component("recaptcha", { - templateUrl: "/mix-app/views/app-shared/components/recaptcha/recaptcha.html", - controller: [ - "$rootScope", - "ApiService", - "CommonService", - function ($rootScope, apiService, commonService) { - var ctrl = this; - ctrl.shortenString = ""; - ctrl.previousContentId = undefined; - ctrl.recaptcha_key = null; - ctrl.token = null; - this.$onInit = () => { - ctrl.recaptcha_key = $rootScope.globalSettings.data.Recaptcha_Key; - ctrl.recaptcha_secret = $rootScope.globalSettings.data.Recaptcha_Secret; - grecaptcha.ready(function () { - grecaptcha - .execute(ctrl.recaptcha_key, { action: ctrl.action }) - .then(function (token) { - ctrl.token = token; - }); - }); - }; - ctrl.verify = function () { - var url = "https://www.google.com/recaptcha/api/siteverify"; - var data = { - secret: ctrl.recaptcha_secret, - response: ctrl.token, - }; - var req = { - method: "POST", - url: url, - data: data, - }; - return apiService.getApiResult(req).then(function (response) { - if (response.success) { - ctrl.callback(); - } else { - angular.forEach(response.error - codes, function (err) { - commonService.showAlertMsg("Recaptcha Error", err); - }); - } - }); - }; - }, - ], +sharedComponents.component("portalSearch", { + templateUrl: "portal-search.html", bindings: { - action: "=", - callback: "&", + previewUrl: "=", + backUrl: "=", }, }); @@ -8231,6 +8186,58 @@ sharedComponents.component("quillEditor", { }, }); +sharedComponents.component("recaptcha", { + templateUrl: "/mix-app/views/app-shared/components/recaptcha/recaptcha.html", + controller: [ + "$rootScope", + "ApiService", + "CommonService", + function ($rootScope, apiService, commonService) { + var ctrl = this; + ctrl.shortenString = ""; + ctrl.previousContentId = undefined; + ctrl.recaptcha_key = null; + ctrl.token = null; + this.$onInit = () => { + ctrl.recaptcha_key = $rootScope.globalSettings.data.Recaptcha_Key; + ctrl.recaptcha_secret = $rootScope.globalSettings.data.Recaptcha_Secret; + grecaptcha.ready(function () { + grecaptcha + .execute(ctrl.recaptcha_key, { action: ctrl.action }) + .then(function (token) { + ctrl.token = token; + }); + }); + }; + ctrl.verify = function () { + var url = "https://www.google.com/recaptcha/api/siteverify"; + var data = { + secret: ctrl.recaptcha_secret, + response: ctrl.token, + }; + var req = { + method: "POST", + url: url, + data: data, + }; + return apiService.getApiResult(req).then(function (response) { + if (response.success) { + ctrl.callback(); + } else { + angular.forEach(response.error - codes, function (err) { + commonService.showAlertMsg("Recaptcha Error", err); + }); + } + }); + }; + }, + ], + bindings: { + action: "=", + callback: "&", + }, +}); + sharedComponents.component("serviceHub", { templateUrl: "/mix-app/views/app-shared/components/service-hub/view.html", bindings: { @@ -8603,6 +8610,51 @@ sharedComponents.component("statuses", { }, }); +"use trick"; +sharedComponents.directive("pane", function () { + return { + require: "^tabs", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
' + + "
", + replace: true, + }; +}); + +sharedComponents.directive("tabs", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", + replace: true, + }; +}); + sharedComponents.component("mixStore", { templateUrl: "/mix-app/views/app-shared/components/store/view.html", bindings: { @@ -8743,51 +8795,6 @@ sharedComponents.component("mixStore", { ], }); -"use trick"; -sharedComponents.directive("pane", function () { - return { - require: "^tabs", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
' + - "
", - replace: true, - }; -}); - -sharedComponents.directive("tabs", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", - replace: true, - }; -}); - "use trick"; sharedComponents.directive("paneH", function () { return { @@ -8879,19 +8886,6 @@ sharedComponents.directive("tabsV", function () { }; }); -sharedComponents.component("tags", { - templateUrl: "/mix-app/views/app-shared/components/tags/tags.html", - controller: [ - "$scope", - function ($scope) { - var ctrl = this; - }, - ], - bindings: { - input: "=", - }, -}); - sharedComponents.component("tagsView", { templateUrl: "/mix-app/views/app-shared/components/tags-view/view.html", controller: [ @@ -8922,6 +8916,19 @@ sharedComponents.component("tagsView", { }, }); +sharedComponents.component("tags", { + templateUrl: "/mix-app/views/app-shared/components/tags/tags.html", + controller: [ + "$scope", + function ($scope) { + var ctrl = this; + }, + ], + bindings: { + input: "=", + }, +}); + sharedComponents.component("trumbowyg", { templateUrl: "/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html", bindings: { @@ -9086,6 +9093,58 @@ sharedComponents.component("trumbowyg", { ], }); +sharedComponents.component("tuiEditor", { + templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", + controller: [ + "$rootScope", + "$scope", + "$element", + "ngAppSettings", + function ($rootScope, $scope, $element, ngAppSettings) { + var ctrl = this; + ctrl.previousId = null; + ctrl.editor = null; + ctrl.init = function () { + ctrl.guid = $rootScope.generateUUID(); + setTimeout(() => { + ctrl.editor = new tui.Editor({ + el: document.querySelector("#tui-" + ctrl.guid), + initialEditType: "markdown", + previewStyle: "vertical", + height: "300px", + initialValue: ctrl.content, + events: { + // change: ctrl.updateContent, + // focus: () => onFocus(), + blur: () => ctrl.updateContent(), + }, + }); + ctrl.toolbar = ctrl.editor.getUI().getToolbar(); + ctrl.toolbar.addButton( + { + name: "fullscreen", + tooltip: "fullscreen", + $el: $( + '' + ), + }, + 1 + ); + }, 100); + }; + window.fsClick = function () { + $(".tui-editor-defaultUI").toggleClass("fs"); + }; + ctrl.updateContent = function () { + ctrl.content = ctrl.editor.getMarkdown(); + }; + }, + ], + bindings: { + content: "=", + }, +}); + sharedComponents.component("uploadCroppie", { templateUrl: "/mix-app/views/app-shared/components/upload-croppie/view.html?v=1", @@ -9318,58 +9377,6 @@ sharedComponents.component("uploadCroppie", { ], }); -sharedComponents.component("tuiEditor", { - templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", - controller: [ - "$rootScope", - "$scope", - "$element", - "ngAppSettings", - function ($rootScope, $scope, $element, ngAppSettings) { - var ctrl = this; - ctrl.previousId = null; - ctrl.editor = null; - ctrl.init = function () { - ctrl.guid = $rootScope.generateUUID(); - setTimeout(() => { - ctrl.editor = new tui.Editor({ - el: document.querySelector("#tui-" + ctrl.guid), - initialEditType: "markdown", - previewStyle: "vertical", - height: "300px", - initialValue: ctrl.content, - events: { - // change: ctrl.updateContent, - // focus: () => onFocus(), - blur: () => ctrl.updateContent(), - }, - }); - ctrl.toolbar = ctrl.editor.getUI().getToolbar(); - ctrl.toolbar.addButton( - { - name: "fullscreen", - tooltip: "fullscreen", - $el: $( - '' - ), - }, - 1 - ); - }, 100); - }; - window.fsClick = function () { - $(".tui-editor-defaultUI").toggleClass("fs"); - }; - ctrl.updateContent = function () { - ctrl.content = ctrl.editor.getMarkdown(); - }; - }, - ], - bindings: { - content: "=", - }, -}); - "use strict"; appShared.controller("VideoCallController", [ "$scope", diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/custom-file/custom-file.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/custom-file/custom-file.html index d8efca18a..5bd4c74e9 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/custom-file/custom-file.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/custom-file/custom-file.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html index bbf1528cf..ea5145490 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html @@ -1 +1 @@ -
Loading...
{{$ctrl.translate($ctrl.column.name)}}: {{$ctrl.translate($ctrl.column.dataType)}}
\ No newline at end of file +
Loading...
{{$ctrl.translate($ctrl.column.name)}}: {{$ctrl.translate($ctrl.column.dataType)}}
\ No newline at end of file From 2c5cbc20491272bfe0fff4e6c98180c450c162ae Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Mon, 16 Aug 2021 07:50:31 +0700 Subject: [PATCH 02/83] update api --- .../v1/Pages/ApiPageMvcController.cs | 67 +++++++++++++++++++ .../v1/Posts/ApiPostMvcController.cs | 2 +- .../Controllers/BaseReadOnlyApiController.cs | 4 +- .../ViewModels/MixPages/ReadMvcViewModel.cs | 1 - src/Mix.Rest.Api.Client/Startup.cs | 7 -- 5 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 src/Mix.Cms.Api.RestFul/Controllers/v1/Pages/ApiPageMvcController.cs diff --git a/src/Mix.Cms.Api.RestFul/Controllers/v1/Pages/ApiPageMvcController.cs b/src/Mix.Cms.Api.RestFul/Controllers/v1/Pages/ApiPageMvcController.cs new file mode 100644 index 000000000..69277dde0 --- /dev/null +++ b/src/Mix.Cms.Api.RestFul/Controllers/v1/Pages/ApiPageMvcController.cs @@ -0,0 +1,67 @@ +// Licensed to the Mixcore Foundation under one or more agreements. +// The Mixcore Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Mix.Cms.Lib.Constants; +using Mix.Cms.Lib.Controllers; +using Mix.Cms.Lib.Enums; +using Mix.Cms.Lib.Models.Cms; +using Mix.Cms.Lib.Models.Common; +using Mix.Cms.Lib.ViewModels.MixPages; +using Mix.Heart.Infrastructure.Repositories; +using Mix.Heart.Models; +using System; +using System.Linq.Expressions; +using System.Threading.Tasks; +using Mix.Heart.Extensions; + +namespace Mix.Cms.Api.RestFul.Controllers.v1 +{ + [Produces("application/json")] + [Route("api/v1/rest/{culture}/mix-page/mvc")] + public class ApiPageMvcController : + BaseReadOnlyApiController + { + public ApiPageMvcController(DefaultRepository repo) + : base(repo) + { + } + + [HttpGet] + public override async Task>> Get() + { + bool isStatus = Enum.TryParse(Request.Query[MixRequestQueryKeywords.Status], out MixContentStatus status); + bool isFromDate = DateTime.TryParse(Request.Query[MixRequestQueryKeywords.FromDate], out DateTime fromDate); + bool isToDate = DateTime.TryParse(Request.Query[MixRequestQueryKeywords.ToDate], out DateTime toDate); + string type = Request.Query["type"]; + string keyword = Request.Query[MixRequestQueryKeywords.Keyword]; + Expression> predicate = model => model.Specificulture == _lang; + predicate = predicate.AndAlsoIf(isStatus, model => model.Status == status); + predicate = predicate.AndAlsoIf(isFromDate, model => model.CreatedDateTime >= fromDate); + predicate = predicate.AndAlsoIf(isToDate, model => model.CreatedDateTime <= toDate); + predicate = predicate.AndAlsoIf(!string.IsNullOrEmpty(keyword), model => (EF.Functions.Like(model.Title, $"%{keyword}%")) + || (EF.Functions.Like(model.Excerpt, $"%{keyword}%")) + || (EF.Functions.Like(model.Content, $"%{keyword}%"))); + var getData = await base.GetListAsync(predicate); + if (getData.IsSucceed) + { + return getData.Data; + } + else + { + return BadRequest(getData.Errors); + } + } + + protected override async Task> GetSingleAsync(string id) + { + int.TryParse(Request.Query[MixRequestQueryKeywords.PageSize], out int pageSize); + int.TryParse(Request.Query[MixRequestQueryKeywords.PageIndex], out int pageIndex); + var result = await base.GetSingleAsync(id); + result.Data.LoadData(pageSize, pageIndex); + return result; + } + } +} \ No newline at end of file diff --git a/src/Mix.Cms.Api.RestFul/Controllers/v1/Posts/ApiPostMvcController.cs b/src/Mix.Cms.Api.RestFul/Controllers/v1/Posts/ApiPostMvcController.cs index 3614810e8..1a087961a 100644 --- a/src/Mix.Cms.Api.RestFul/Controllers/v1/Posts/ApiPostMvcController.cs +++ b/src/Mix.Cms.Api.RestFul/Controllers/v1/Posts/ApiPostMvcController.cs @@ -21,7 +21,7 @@ namespace Mix.Cms.Api.RestFul.Controllers.v1 { [Produces("application/json")] - [Route("api/v1/rest/{culture}/post/mvc")] + [Route("api/v1/rest/{culture}/mix-post/mvc")] public class ApiPostMvcController : BaseReadOnlyApiController { diff --git a/src/Mix.Cms.Lib/Controllers/BaseReadOnlyApiController.cs b/src/Mix.Cms.Lib/Controllers/BaseReadOnlyApiController.cs index 71f98289d..a8bee7e30 100644 --- a/src/Mix.Cms.Lib/Controllers/BaseReadOnlyApiController.cs +++ b/src/Mix.Cms.Lib/Controllers/BaseReadOnlyApiController.cs @@ -168,7 +168,7 @@ protected void GetLanguage() #region Helpers - protected async Task> GetSingleAsync(string id) + protected virtual async Task> GetSingleAsync(string id) where T : Mix.Heart.Infrastructure.ViewModels.ViewModelBase { Expression> predicate = ReflectionHelper.GetExpression(MixQueryColumnName.Id, id, Heart.Enums.ExpressionMethod.Eq); @@ -181,7 +181,7 @@ protected async Task> GetSingleAsync(string id) return await GetSingleAsync(predicate); } - protected async Task> GetSingleAsync(string id) + protected virtual async Task> GetSingleAsync(string id) { Expression> predicate = ReflectionHelper.GetExpression(MixQueryColumnName.Id, id, Heart.Enums.ExpressionMethod.Eq); if (!string.IsNullOrEmpty(_lang)) diff --git a/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs index bc961ff90..b5ac613c4 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs @@ -19,7 +19,6 @@ namespace Mix.Cms.Lib.ViewModels.MixPages { - [GeneratedController("api/v1/rest/{culture}/mix-page/mvc")] public class ReadMvcViewModel : ViewModelBase, IMvcViewModel { #region Properties diff --git a/src/Mix.Rest.Api.Client/Startup.cs b/src/Mix.Rest.Api.Client/Startup.cs index 21b009ced..cb4fa9aa2 100644 --- a/src/Mix.Rest.Api.Client/Startup.cs +++ b/src/Mix.Rest.Api.Client/Startup.cs @@ -1,17 +1,10 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using Mix.Cms.Lib.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace Mix.Rest.Api.Client { From a79f20761dc63fd3dcab24b563119c8007aba3a5 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Thu, 19 Aug 2021 08:08:25 +0700 Subject: [PATCH 03/83] fix media upload --- .../ViewModels/MixMedias/UpdateViewModel.cs | 12 +- .../ViewModels/MixPages/ReadMvcViewModel.cs | 1 - .../wwwroot/mix-app/js/app-portal.min.js | 3250 +++++++++-------- .../wwwroot/mix-app/js/app-shared.min.js | 2558 ++++++------- .../components/actions/actions.html | 2 +- .../components/module-form/view.html | 2 +- 6 files changed, 2921 insertions(+), 2904 deletions(-) diff --git a/src/Mix.Cms.Lib/ViewModels/MixMedias/UpdateViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixMedias/UpdateViewModel.cs index d141fcfa2..504224c50 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixMedias/UpdateViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixMedias/UpdateViewModel.cs @@ -157,6 +157,7 @@ public override MixMedia ParseModel(MixCmsContext _context = null, IDbContextTra public override void Validate(MixCmsContext _context = null, IDbContextTransaction _transaction = null) { + base.Validate(_context, _transaction); FileFolder = $"{MixService.GetTemplateUploadFolder(Specificulture)}"; if (MediaFile?.FileStream != null) { @@ -182,6 +183,9 @@ public override void Validate(MixCmsContext _context = null, IDbContextTransacti { if (File != null) { + FileName = $"{SeoHelper.GetSEOString(File.FileName[..File.FileName.LastIndexOf('.')]).ToLower()}-{ DateTime.UtcNow.Ticks}"; + Extension = File.FileName[File.FileName.LastIndexOf('.')..].ToLower(); + MixFileRepository.Instance.CreateDirectoryIfNotExist($"{MixFolders.WebRootPath}/{FileFolder}"); var saveFile = MixFileRepository.Instance.SaveWebFile(File, FileFolder); if (saveFile == null) { @@ -200,7 +204,7 @@ public override void Validate(MixCmsContext _context = null, IDbContextTransacti } } FileType = FileType ?? "image"; - base.Validate(_context, _transaction); + } public override void ExpandView(MixCmsContext _context = null, IDbContextTransaction _transaction = null) @@ -224,6 +228,12 @@ public override async Task> RemoveRelatedModelsAsync(Up if (FileFolder.IndexOf("http") < 0) { MixFileRepository.Instance.DeleteWebFile(FileName, Extension, FileFolder); + MixFileRepository.Instance.DeleteWebFile($"{FileName}_XL", Extension, FileFolder); + MixFileRepository.Instance.DeleteWebFile($"{FileName}_L", Extension, FileFolder); + MixFileRepository.Instance.DeleteWebFile($"{FileName}_M", Extension, FileFolder); + MixFileRepository.Instance.DeleteWebFile($"{FileName}_S", Extension, FileFolder); + MixFileRepository.Instance.DeleteWebFile($"{FileName}_XS", Extension, FileFolder); + MixFileRepository.Instance.DeleteWebFile($"{FileName}_XXS", Extension, FileFolder); } await Repository.RemoveListModelAsync(false, m => m.Id == Id && m.Specificulture != Specificulture, _context, _transaction); return await base.RemoveRelatedModelsAsync(view, _context, _transaction); diff --git a/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs index b5ac613c4..9548db597 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs @@ -8,7 +8,6 @@ using Mix.Common.Helper; using Mix.Heart.Infrastructure.ViewModels; using Mix.Heart.Models; -using Mix.Heart.NetCore.Attributes; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js index 13717a8bd..ff16ba950 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js @@ -1,4 +1,4 @@ -/* Fri Aug 13 2021 09:03:40 GMT+0700 (Indochina Time) */"use strict"; +/* Thu Aug 19 2021 07:46:11 GMT+0700 (Indochina Time) */"use strict"; var app = angular.module("MixPortal", [ "angularCroppie", "ui.bootstrap", @@ -447,68 +447,360 @@ app.factory("ConfigurationService", [ ]); "use strict"; -app.controller("CultureController", [ +app.controller("CustomerController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", - "CultureService", + "$timeout", + "$location", + "CustomerServices", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $timeout, + $location, + customerServices + ) { + $scope.request = angular.copy(ngAppSettings.request); + $scope.request.contentStatuses = ["Active"]; + $scope.request.status = "0"; + $scope.activedCustomer = null; + $scope.relatedCustomers = []; + $rootScope.isBusy = false; + $scope.data = { + pageIndex: 0, + pageSize: 1, + totalItems: 0, + }; + $scope.errors = []; + + $scope.range = function (max) { + var input = []; + for (var i = 1; i <= max; i += 1) input.push(i); + return input; + }; + + $scope.loadCustomer = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + var response = await customerServices.getCustomer(id, "portal"); + if (response.isSucceed) { + $scope.activedCustomer = response.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.loadCustomers = async function (pageIndex) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); + } + if ($scope.request.toDate !== null) { + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); + } + var resp = await customerServices.getCustomers($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + //$("html, body").animate({ "scrollTop": "0px" }, 500); + $.each($scope.data.items, function (i, customer) { + $.each($scope.activedCustomers, function (i, e) { + if (e.customerId === customer.id) { + customer.isHidden = true; + } + }); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $scope.$apply(); + } + }; + + $scope.removeCustomer = function (id) { + $rootScope.showConfirm( + $scope, + "removeCustomerConfirmed", + [id], + null, + "Remove Customer", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeCustomerConfirmed = async function (id) { + var result = await customerServices.removeCustomer(id); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + $scope.loadCustomers(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.saveCustomer = async function (customer) { + customer.content = $(".editor-content").val(); + var resp = await customerServices.saveCustomer(customer); + if (resp && resp.isSucceed) { + $scope.activedCustomer = resp.data; + $rootScope.showMessage("Update successfully!", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + //$location.path('/portal/customer/details/' + resp.data.id); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("CustomerServices", [ + "$http", + "$rootScope", "ApiService", "CommonService", + function ($http, $rootScope, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var customersServiceFactory = {}; + + var settings = $rootScope.globalSettings; + + var _getCustomer = async function (id, type) { + var apiUrl = "/queen-beauty/customer/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + id; + } + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; + + var _initCustomer = async function (type) { + var apiUrl = "/queen-beauty/customer/"; + var req = { + method: "GET", + url: apiUrl + "init/" + type, + }; + return await apiService.getApiResult(req); + }; + + var _getCustomers = async function (request) { + var apiUrl = "/queen-beauty/customer/"; + var req = { + method: "POST", + url: apiUrl + "list", + data: JSON.stringify(request), + }; + + return await apiService.getApiResult(req); + }; + + var _removeCustomer = async function (id) { + var apiUrl = "/queen-beauty/customer/"; + var req = { + method: "GET", + url: apiUrl + "delete/" + id, + }; + return await apiService.getApiResult(req); + }; + + var _saveCustomer = async function (customer) { + var apiUrl = "/queen-beauty/customer/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(customer), + }; + return await apiService.getApiResult(req); + }; + + customersServiceFactory.getCustomer = _getCustomer; + customersServiceFactory.initCustomer = _initCustomer; + customersServiceFactory.getCustomers = _getCustomers; + customersServiceFactory.removeCustomer = _removeCustomer; + customersServiceFactory.saveCustomer = _saveCustomer; + return customersServiceFactory; + }, +]); + +"use strict"; +app.controller("DashboardController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$timeout", + "$location", + "DashboardServices", function ( $scope, $rootScope, ngAppSettings, - $routeParams, - service, - apiService, - commonService + $timeout, + $location, + dashboardServices ) { - $scope.cultures = [ - { - specificulture: "en-us", - fullName: "United States - English", - icon: "flag-icon-us", - }, - { - specificulture: "fr-dz", - fullName: "Algeria - Français", - icon: "flag-icon-dz", - }, - { - specificulture: "es-ar", - fullName: "Argentina - Español", - icon: "flag-icon-ar", - }, - { - specificulture: "en-au", - fullName: "Australia - English", - icon: "flag-icon-au", - }, - { - specificulture: "nl-be", - fullName: "België - Nederlands", - icon: "flag-icon-be", - }, - { - specificulture: "fr-be", - fullName: "Belgique - Français", - icon: "flag-icon-be", - }, - { - specificulture: "es-bo", - fullName: "Bolivia - Español", - icon: "flag-icon-bo", - }, - { - specificulture: "bs-ba", - fullName: "Bosna i Hercegovina – Bosanski", - icon: "flag-icon-ba", - }, - { - specificulture: "pt-br", - fullName: "Brasil - Português", - icon: "flag-icon-br", + $scope.pageClass = "page-dashboard"; + $(".side-nav li").removeClass("active"); + $(".side-nav .page-dashboard").addClass("active"); + $scope.data = { + totalPage: 0, + totalPost: 0, + totalProduct: 0, + totalUser: 0, + }; + $scope.users = []; + $scope.$on("$viewContentLoaded", function () { + $rootScope.isBusy = false; + }); + $scope.getDashboardInfo = async function () { + $rootScope.isBusy = true; + var response = await dashboardServices.getDashboardInfo(); + if (response.isSucceed) { + // $('#mainSection').removeClass('card'); + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + // $scope.getChart(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.getChart = function () { + var ctx = document.getElementById("myChart"); + var myChart = new Chart(ctx, { + // type: 'pie', + // data: { + // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], + // datasets: [{ + // label: "Population (millions)", + // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], + // data: [2478,5267,734,784,433] + // }] + // }, + // options: { + // title: { + // display: true, + // text: 'Predicted world population (millions) in 2050' + // } + // } + }); + }; + }, +]); + +"use strict"; +app.factory("DashboardServices", [ + "$rootScope", + "$http", + "ApiService", + "CommonService", + function ($rootScope, $http, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var usersServiceFactory = {}; + var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; + var _getDashboardInfo = async function () { + var req = { + method: "GET", + url: apiUrl + "/dashboard", + }; + return await apiService.getApiResult(req); + }; + + usersServiceFactory.getDashboardInfo = _getDashboardInfo; + return usersServiceFactory; + }, +]); + +"use strict"; +app.controller("CultureController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "CultureService", + "ApiService", + "CommonService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + service, + apiService, + commonService + ) { + $scope.cultures = [ + { + specificulture: "en-us", + fullName: "United States - English", + icon: "flag-icon-us", + }, + { + specificulture: "fr-dz", + fullName: "Algeria - Français", + icon: "flag-icon-dz", + }, + { + specificulture: "es-ar", + fullName: "Argentina - Español", + icon: "flag-icon-ar", + }, + { + specificulture: "en-au", + fullName: "Australia - English", + icon: "flag-icon-au", + }, + { + specificulture: "nl-be", + fullName: "België - Nederlands", + icon: "flag-icon-be", + }, + { + specificulture: "fr-be", + fullName: "Belgique - Français", + icon: "flag-icon-be", + }, + { + specificulture: "es-bo", + fullName: "Bolivia - Español", + icon: "flag-icon-bo", + }, + { + specificulture: "bs-ba", + fullName: "Bosna i Hercegovina – Bosanski", + icon: "flag-icon-ba", + }, + { + specificulture: "pt-br", + fullName: "Brasil - Português", + icon: "flag-icon-br", }, { specificulture: "en-ca", @@ -945,370 +1237,78 @@ app.controller("CultureController", [ specificulture: "ja-jp", fullName: "日本 - 日本語", icon: "flag-icon-jp", - }, - { - specificulture: "zh-hk", - fullName: "香港特別行政區 - 繁體中文", - icon: "flag-icon-hk", - }, - ]; - $scope.selected = null; - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.saveSuccessCallback = function () { - commonService - .initAllSettings() - .then(() => - commonService - .fillAllSettings($scope.lang) - .then(() => (window.location.href = "/portal/culture/list")) - ); - }; - $scope.removeCallback = function () { - commonService - .initAllSettings() - .then(() => - commonService - .fillAllSettings($scope.lang) - .then(() => (window.location.href = "/portal/culture/list")) - ); - }; - $scope.changeData = function (selected) { - if (selected) { - $scope.viewmodel.specificulture = selected.specificulture; - $scope.viewmodel.fullName = selected.fullName; - $scope.viewmodel.icon = selected.icon; - } - }; - }, -]); - -"use strict"; -app.factory("CultureService", [ - "BaseService", - function (baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("culture"); - var _updateInfos = async function (pages) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(pages), - }; - return await apiService.getApiResult(req); - }; - - var _syncTemplates = async function (id) { - var apiUrl = "/culture/"; - var url = apiUrl + "sync/" + id; - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - serviceFactory.syncTemplates = _syncTemplates; - serviceFactory.updateInfos = _updateInfos; - return serviceFactory; - }, -]); - -"use strict"; -app.controller("CustomerController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$timeout", - "$location", - "CustomerServices", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $timeout, - $location, - customerServices - ) { - $scope.request = angular.copy(ngAppSettings.request); - $scope.request.contentStatuses = ["Active"]; - $scope.request.status = "0"; - $scope.activedCustomer = null; - $scope.relatedCustomers = []; - $rootScope.isBusy = false; - $scope.data = { - pageIndex: 0, - pageSize: 1, - totalItems: 0, - }; - $scope.errors = []; - - $scope.range = function (max) { - var input = []; - for (var i = 1; i <= max; i += 1) input.push(i); - return input; - }; - - $scope.loadCustomer = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - var response = await customerServices.getCustomer(id, "portal"); - if (response.isSucceed) { - $scope.activedCustomer = response.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.loadCustomers = async function (pageIndex) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); - } - if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); - } - var resp = await customerServices.getCustomers($scope.request); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - //$("html, body").animate({ "scrollTop": "0px" }, 500); - $.each($scope.data.items, function (i, customer) { - $.each($scope.activedCustomers, function (i, e) { - if (e.customerId === customer.id) { - customer.isHidden = true; - } - }); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - - $scope.removeCustomer = function (id) { - $rootScope.showConfirm( - $scope, - "removeCustomerConfirmed", - [id], - null, - "Remove Customer", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeCustomerConfirmed = async function (id) { - var result = await customerServices.removeCustomer(id); - if (result.isSucceed) { - $rootScope.showMessage("success", "success"); - $scope.loadCustomers(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.saveCustomer = async function (customer) { - customer.content = $(".editor-content").val(); - var resp = await customerServices.saveCustomer(customer); - if (resp && resp.isSucceed) { - $scope.activedCustomer = resp.data; - $rootScope.showMessage("Update successfully!", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - //$location.path('/portal/customer/details/' + resp.data.id); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("CustomerServices", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var customersServiceFactory = {}; - - var settings = $rootScope.globalSettings; - - var _getCustomer = async function (id, type) { - var apiUrl = "/queen-beauty/customer/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + id; - } - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _initCustomer = async function (type) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "GET", - url: apiUrl + "init/" + type, - }; - return await apiService.getApiResult(req); - }; - - var _getCustomers = async function (request) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _removeCustomer = async function (id) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; - - var _saveCustomer = async function (customer) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(customer), - }; - return await apiService.getApiResult(req); + }, + { + specificulture: "zh-hk", + fullName: "香港特別行政區 - 繁體中文", + icon: "flag-icon-hk", + }, + ]; + $scope.selected = null; + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); + $scope.saveSuccessCallback = function () { + commonService + .initAllSettings() + .then(() => + commonService + .fillAllSettings($scope.lang) + .then(() => (window.location.href = "/portal/culture/list")) + ); }; - - customersServiceFactory.getCustomer = _getCustomer; - customersServiceFactory.initCustomer = _initCustomer; - customersServiceFactory.getCustomers = _getCustomers; - customersServiceFactory.removeCustomer = _removeCustomer; - customersServiceFactory.saveCustomer = _saveCustomer; - return customersServiceFactory; - }, -]); - -"use strict"; -app.controller("DashboardController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$timeout", - "$location", - "DashboardServices", - function ( - $scope, - $rootScope, - ngAppSettings, - $timeout, - $location, - dashboardServices - ) { - $scope.pageClass = "page-dashboard"; - $(".side-nav li").removeClass("active"); - $(".side-nav .page-dashboard").addClass("active"); - $scope.data = { - totalPage: 0, - totalPost: 0, - totalProduct: 0, - totalUser: 0, + $scope.removeCallback = function () { + commonService + .initAllSettings() + .then(() => + commonService + .fillAllSettings($scope.lang) + .then(() => (window.location.href = "/portal/culture/list")) + ); }; - $scope.users = []; - $scope.$on("$viewContentLoaded", function () { - $rootScope.isBusy = false; - }); - $scope.getDashboardInfo = async function () { - $rootScope.isBusy = true; - var response = await dashboardServices.getDashboardInfo(); - if (response.isSucceed) { - // $('#mainSection').removeClass('card'); - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - // $scope.getChart(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + $scope.changeData = function (selected) { + if (selected) { + $scope.viewmodel.specificulture = selected.specificulture; + $scope.viewmodel.fullName = selected.fullName; + $scope.viewmodel.icon = selected.icon; } }; - $scope.getChart = function () { - var ctx = document.getElementById("myChart"); - var myChart = new Chart(ctx, { - // type: 'pie', - // data: { - // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], - // datasets: [{ - // label: "Population (millions)", - // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], - // data: [2478,5267,734,784,433] - // }] - // }, - // options: { - // title: { - // display: true, - // text: 'Predicted world population (millions) in 2050' - // } - // } - }); - }; }, ]); "use strict"; -app.factory("DashboardServices", [ - "$rootScope", - "$http", - "ApiService", - "CommonService", - function ($rootScope, $http, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; +app.factory("CultureService", [ + "BaseService", + function (baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("culture"); + var _updateInfos = async function (pages) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-infos", + data: JSON.stringify(pages), + }; + return await apiService.getApiResult(req); + }; - var usersServiceFactory = {}; - var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; - var _getDashboardInfo = async function () { + var _syncTemplates = async function (id) { + var apiUrl = "/culture/"; + var url = apiUrl + "sync/" + id; var req = { method: "GET", - url: apiUrl + "/dashboard", + url: url, }; return await apiService.getApiResult(req); }; - usersServiceFactory.getDashboardInfo = _getDashboardInfo; - return usersServiceFactory; + serviceFactory.syncTemplates = _syncTemplates; + serviceFactory.updateInfos = _updateInfos; + return serviceFactory; }, ]); @@ -1544,6 +1544,61 @@ app.factory("FileServices", [ }, ]); +"use strict"; +app.controller("ImportFileController", [ + "$scope", + "$rootScope", + "ImportFileServices", + "TranslatorService", + "GlobalSettingsService", + function ( + $scope, + $rootScope, + service, + translatorService, + GlobalSettingsService + ) { + $scope.saveImportFile = async function () { + $rootScope.isBusy = true; + var form = document.getElementById("frm-import"); + var frm = new FormData(); + frm.append("assets", form["assets"].files[0]); + var response = await service.saveImportFile(frm); + if (response.isSucceed) { + $scope.viewmodel = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("ImportFileServices", [ + "$rootScope", + "BaseService", + function ($rootScope, baseService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var serviceFactory = {}; + + var settings = $rootScope.globalSettings; + var serviceFactory = Object.create(baseService); + serviceFactory.init("portal", true); + var _saveImportFile = async function (frm) { + var apiUrl = this.prefixUrl + "/" + settings.lang + "/import"; + return await this.ajaxSubmitForm(frm, apiUrl); + }; + + serviceFactory.saveImportFile = _saveImportFile; + return serviceFactory; + }, +]); + "use strict"; app.controller("JsonDataController", [ "$scope", @@ -1759,61 +1814,6 @@ app.factory("JsonDataService", [ }, ]); -"use strict"; -app.controller("ImportFileController", [ - "$scope", - "$rootScope", - "ImportFileServices", - "TranslatorService", - "GlobalSettingsService", - function ( - $scope, - $rootScope, - service, - translatorService, - GlobalSettingsService - ) { - $scope.saveImportFile = async function () { - $rootScope.isBusy = true; - var form = document.getElementById("frm-import"); - var frm = new FormData(); - frm.append("assets", form["assets"].files[0]); - var response = await service.saveImportFile(frm); - if (response.isSucceed) { - $scope.viewmodel = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("ImportFileServices", [ - "$rootScope", - "BaseService", - function ($rootScope, baseService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var serviceFactory = {}; - - var settings = $rootScope.globalSettings; - var serviceFactory = Object.create(baseService); - serviceFactory.init("portal", true); - var _saveImportFile = async function (frm) { - var apiUrl = this.prefixUrl + "/" + settings.lang + "/import"; - return await this.ajaxSubmitForm(frm, apiUrl); - }; - - serviceFactory.saveImportFile = _saveImportFile; - return serviceFactory; - }, -]); - "use strict"; app.controller("LocalizeController", [ "$scope", @@ -2924,13 +2924,13 @@ app.factory("ModuleDataRestService", [ ]); "use strict"; -app.controller("ModuleGalleryController", [ +app.controller("ModulePostController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "ModuleGalleryService", + "ModulePostRestService", "ApiService", "CommonService", function ( @@ -2940,7 +2940,6 @@ app.controller("ModuleGalleryController", [ $routeParams, $location, service, - apiService, commonService ) { BaseCtrl.call( @@ -2954,11 +2953,12 @@ app.controller("ModuleGalleryController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = $routeParams.id; $scope.canDrag = $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; $scope.translate = $rootScope.translate; - $scope.moduleId = $routeParams.id; + $scope.moduleIds = $routeParams.moduleIds || $routeParams.id; + $scope.pageIds = $routeParams.page_ids; + $scope.type = $routeParams.type; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -2978,6 +2978,10 @@ app.controller("ModuleGalleryController", [ $scope.$apply(); } }; + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); + }; $scope.remove = function (moduleId, postId) { $rootScope.showConfirm( $scope, @@ -3046,7 +3050,7 @@ app.controller("ModuleGalleryController", [ ]); "use strict"; -app.factory("ModuleGalleryService", [ +app.factory("ModulePostRestService", [ "$rootScope", "ApiService", "CommonService", @@ -3077,13 +3081,13 @@ app.factory("ModuleGalleryService", [ ]); "use strict"; -app.controller("ModulePostController", [ +app.controller("ModuleGalleryController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "ModulePostRestService", + "ModuleGalleryService", "ApiService", "CommonService", function ( @@ -3093,6 +3097,7 @@ app.controller("ModulePostController", [ $routeParams, $location, service, + apiService, commonService ) { BaseCtrl.call( @@ -3106,12 +3111,11 @@ app.controller("ModulePostController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = $routeParams.id; $scope.canDrag = $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; $scope.translate = $rootScope.translate; - $scope.moduleIds = $routeParams.moduleIds || $routeParams.id; - $scope.pageIds = $routeParams.page_ids; - $scope.type = $routeParams.type; + $scope.moduleId = $routeParams.id; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -3131,10 +3135,6 @@ app.controller("ModulePostController", [ $scope.$apply(); } }; - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); - }; $scope.remove = function (moduleId, postId) { $rootScope.showConfirm( $scope, @@ -3203,7 +3203,7 @@ app.controller("ModulePostController", [ ]); "use strict"; -app.factory("ModulePostRestService", [ +app.factory("ModuleGalleryService", [ "$rootScope", "ApiService", "CommonService", @@ -3697,13 +3697,13 @@ app.factory("PageRestService", [ ]); "use strict"; -app.controller("PageGalleryController", [ +app.controller("PagePageController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PageGalleryService", + "PagePostRestService", "PostRestService", "ApiService", "CommonService", @@ -3816,14 +3816,14 @@ app.controller("PageGalleryController", [ ]); "use strict"; -app.factory("PageGalleryService", [ +app.factory("PagePageRestService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); + serviceFactory.init("page-page"); var _delete = async function (pageId, postId) { var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; var req = { @@ -3847,13 +3847,13 @@ app.factory("PageGalleryService", [ ]); "use strict"; -app.controller("PagePageController", [ +app.controller("PageGalleryController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePostRestService", + "PageGalleryService", "PostRestService", "ApiService", "CommonService", @@ -3966,14 +3966,14 @@ app.controller("PagePageController", [ ]); "use strict"; -app.factory("PagePageRestService", [ +app.factory("PageGalleryService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-page"); + serviceFactory.init("page-post"); var _delete = async function (pageId, postId) { var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; var req = { @@ -4465,98 +4465,6 @@ app.factory("RestPortalPageNavigationService", [ }, ]); -"use strict"; -app.controller("RoleController", [ - "$scope", - "$rootScope", - "$location", - "$routeParams", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", - "RoleService", - function ( - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - dataService, - columnService, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.role = { name: "" }; - $scope.initPermissions = async function () { - let backUrl = "/portal/role/list"; - $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; - $scope.updateUrl = "/portal/mix-database-data/details"; - }; - - $scope.createRole = async function () { - $rootScope.isBusy = true; - var result = await service.createRole($scope.role.name); - if (result.isSucceed) { - $scope.role.name = ""; - $scope.getList(); - } else { - $rootScope.showErrors(result.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("RoleService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("role", true); - - var _getPermissions = async function () { - var req = { - method: "GET", - url: this.prefixUrl + "/permissions", - }; - return await apiService.getApiResult(req); - }; - - var _updatePermission = async function (permission) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-permission", - data: JSON.stringify(permission), - }; - return await apiService.getApiResult(req); - }; - var _createRole = function (name) { - var req = { - method: "POST", - url: this.prefixUrl + "/create", - data: JSON.stringify(name), - }; - - return apiService.getRestApiResult(req); - }; - serviceFactory.createRole = _createRole; - serviceFactory.getPermissions = _getPermissions; - serviceFactory.updatePermission = _updatePermission; - return serviceFactory; - }, -]); - "use strict"; app.controller("PostController", [ "$scope", @@ -4955,6 +4863,98 @@ app.factory("PostRestService", [ }, ]); +"use strict"; +app.controller("RoleController", [ + "$scope", + "$rootScope", + "$location", + "$routeParams", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", + "RoleService", + function ( + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + dataService, + columnService, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.role = { name: "" }; + $scope.initPermissions = async function () { + let backUrl = "/portal/role/list"; + $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; + $scope.updateUrl = "/portal/mix-database-data/details"; + }; + + $scope.createRole = async function () { + $rootScope.isBusy = true; + var result = await service.createRole($scope.role.name); + if (result.isSucceed) { + $scope.role.name = ""; + $scope.getList(); + } else { + $rootScope.showErrors(result.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("RoleService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("role", true); + + var _getPermissions = async function () { + var req = { + method: "GET", + url: this.prefixUrl + "/permissions", + }; + return await apiService.getApiResult(req); + }; + + var _updatePermission = async function (permission) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-permission", + data: JSON.stringify(permission), + }; + return await apiService.getApiResult(req); + }; + var _createRole = function (name) { + var req = { + method: "POST", + url: this.prefixUrl + "/create", + data: JSON.stringify(name), + }; + + return apiService.getRestApiResult(req); + }; + serviceFactory.createRole = _createRole; + serviceFactory.getPermissions = _getPermissions; + serviceFactory.updatePermission = _updatePermission; + return serviceFactory; + }, +]); + "use strict"; app.controller("ServiceController", [ "$scope", @@ -5112,25 +5112,6 @@ app.controller("ServiceController", [ }, ]); -"use strict"; -app.controller("StoreController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "CryptoService", - "ThemeService", - "StoreService", - function ( - $scope, - $rootScope, - ngAppSettings, - cryptoService, - themeService, - service - ) { - }, -]); - "use strict"; app.controller("SocialFeedController", [ "$rootScope", @@ -5400,6 +5381,25 @@ app.controller("SocialFeedController", [ }, ]); +"use strict"; +app.controller("StoreController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "CryptoService", + "ThemeService", + "StoreService", + function ( + $scope, + $rootScope, + ngAppSettings, + cryptoService, + themeService, + service + ) { + }, +]); + "use strict"; app.controller("TemplateController", [ "$scope", @@ -6427,31 +6427,6 @@ app.component("appSettingsAuth", { }, }); -app.component("appSettingsGeneral", { - templateUrl: - "/mix-app/views/app-portal/pages/app-settings/components/general/view.html", - controller: [ - "$rootScope", - "$scope", - "CommonService", - function ($rootScope, $scope, commonService) { - var ctrl = this; - ctrl.stopApplication = async function () { - $rootScope.isBusy = true; - await commonService.stopApplication(); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - }; - }, - ], - bindings: { - appSettings: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("appSettingsDefault", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/default/view.html", @@ -6496,6 +6471,31 @@ app.component("appSettingsDefault", { }, }); +app.component("appSettingsGeneral", { + templateUrl: + "/mix-app/views/app-portal/pages/app-settings/components/general/view.html", + controller: [ + "$rootScope", + "$scope", + "CommonService", + function ($rootScope, $scope, commonService) { + var ctrl = this; + ctrl.stopApplication = async function () { + $rootScope.isBusy = true; + await commonService.stopApplication(); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + }; + }, + ], + bindings: { + appSettings: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + modules.component("portalMenus", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/portal-menus/view.html", @@ -6580,21 +6580,6 @@ app.component("customerMain", { }, }); -app.component("mixDatabaseEdm", { - templateUrl: - "/mix-app/views/app-portal/pages/mix-database/components/edm/view.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - }, - ], - bindings: { - model: "=", - }, -}); - app.component("customerOrders", { templateUrl: "/mix-app/views/app-portal/pages/customer/components/orders/customer-orders.html", @@ -6634,6 +6619,21 @@ app.component("customerOrders", { }, }); +app.component("mixDatabaseEdm", { + templateUrl: + "/mix-app/views/app-portal/pages/mix-database/components/edm/view.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + }, + ], + bindings: { + model: "=", + }, +}); + app.component("mixDatabaseMain", { templateUrl: "/mix-app/views/app-portal/pages/mix-database/components/main/view.html", @@ -6687,9 +6687,9 @@ app.component("moduleMain", { }, }); -app.component("moduleContent", { +app.component("moduleAdvanced", { templateUrl: - "/mix-app/views/app-portal/pages/module/components/module-content/view.html", + "/mix-app/views/app-portal/pages/module/components/module-advanced/view.html", bindings: { model: "=", additionalData: "=", @@ -6699,13 +6699,16 @@ app.component("moduleContent", { function ($rootScope) { var ctrl = this; ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = function () { + ctrl.isAdmin = $rootScope.isAdmin; + }; }, ], }); -app.component("moduleAdvanced", { +app.component("moduleContent", { templateUrl: - "/mix-app/views/app-portal/pages/module/components/module-advanced/view.html", + "/mix-app/views/app-portal/pages/module/components/module-content/view.html", bindings: { model: "=", additionalData: "=", @@ -6715,11 +6718,66 @@ app.component("moduleAdvanced", { function ($rootScope) { var ctrl = this; ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - ctrl.isAdmin = $rootScope.isAdmin; + }, + ], +}); + +app.component("moduleType", { + templateUrl: + "/mix-app/views/app-portal/pages/module/components/module-type/view.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + }, + ], + bindings: { + model: "=", + }, +}); + +app.component("pageMain", { + templateUrl: "/mix-app/views/app-portal/pages/page/components/main/main.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + // ctrl.setPageType = function (type) { + // ctrl.page.type = $index; + // } + ctrl.generateSeo = function () { + if (ctrl.page) { + if (ctrl.page.seoName === null || ctrl.page.seoName === "") { + ctrl.page.seoName = $rootScope.generateKeyword( + ctrl.page.title, + "-" + ); + } + if (ctrl.page.seoTitle === null || ctrl.page.seoTitle === "") { + ctrl.page.seoTitle = ctrl.page.title; + } + if ( + ctrl.page.seoDescription === null || + ctrl.page.seoDescription === "" + ) { + ctrl.page.seoDescription = ctrl.page.excerpt; + } + if (ctrl.page.seoKeywords === null || ctrl.page.seoKeywords === "") { + ctrl.page.seoKeywords = ctrl.page.title; + } + } }; }, ], + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, }); app.component("pageGeneral", { @@ -6828,64 +6886,6 @@ app.component("pageGeneral", { }, }); -app.component("moduleType", { - templateUrl: - "/mix-app/views/app-portal/pages/module/components/module-type/view.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - }, - ], - bindings: { - model: "=", - }, -}); - -app.component("pageMain", { - templateUrl: "/mix-app/views/app-portal/pages/page/components/main/main.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - // ctrl.setPageType = function (type) { - // ctrl.page.type = $index; - // } - ctrl.generateSeo = function () { - if (ctrl.page) { - if (ctrl.page.seoName === null || ctrl.page.seoName === "") { - ctrl.page.seoName = $rootScope.generateKeyword( - ctrl.page.title, - "-" - ); - } - if (ctrl.page.seoTitle === null || ctrl.page.seoTitle === "") { - ctrl.page.seoTitle = ctrl.page.title; - } - if ( - ctrl.page.seoDescription === null || - ctrl.page.seoDescription === "" - ) { - ctrl.page.seoDescription = ctrl.page.excerpt; - } - if (ctrl.page.seoKeywords === null || ctrl.page.seoKeywords === "") { - ctrl.page.seoKeywords = ctrl.page.title; - } - } - }; - }, - ], - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageModules", { templateUrl: "/mix-app/views/app-portal/pages/page/components/modules/modules.html", @@ -6917,31 +6917,6 @@ app.component("pageAdvanced", { ], }); -app.component("pageType", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/page-type/view.html", - bindings: { - model: "=", - }, - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - }, - ], -}); - -app.component("pageParents", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/parents/parents.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageContent", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-content/view.html", @@ -6984,9 +6959,24 @@ app.component("pageContent", { ], }); -app.component("pagePlugPlay", { +app.component("pageType", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/page-type/view.html", + bindings: { + model: "=", + }, + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + }, + ], +}); + +app.component("pageParents", { templateUrl: - "/mix-app/views/app-portal/pages/page/components/plug-play/plug-play.html", + "/mix-app/views/app-portal/pages/page/components/parents/parents.html", bindings: { page: "=", onDelete: "&", @@ -6994,17 +6984,9 @@ app.component("pagePlugPlay", { }, }); -app.component("pageSeo", { - templateUrl: "/mix-app/views/app-portal/pages/page/components/seo/seo.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - }, - ], +app.component("pagePlugPlay", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/plug-play/plug-play.html", bindings: { page: "=", onDelete: "&", @@ -7048,6 +7030,24 @@ app.component("productRelated", { }, }); +app.component("pageSeo", { + templateUrl: "/mix-app/views/app-portal/pages/page/components/seo/seo.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + }, + ], + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("permissionMain", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/main/main.html", @@ -7195,47 +7195,6 @@ app.component("permissionPlugPlay", { ], }); -modules.component("rolePageNav", { - templateUrl: - "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RoleService", - function ($rootScope, $scope, ngAppSettings, roleServices) { - var ctrl = this; - ctrl.selected = null; - ctrl.updateOrders = function (index) { - ctrl.data.splice(index, 1); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.data[i].priority = i + 1; - } - }; - //ctrl.change = async function () { - // //var permission = ctrl.page.navPermission; - // //$rootScope.isBusy = true; - // //var resp = await roleServices.updatePermission(permission); - // //if (resp && resp.isSucceed) { - // // $rootScope.showMessage('Update successfully!', 'success'); - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - // //else { - // // if (resp) { $rootScope.showErrors(resp.errors); } - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - //}; - }, - ], - bindings: { - prefix: "=", - page: "=", - callback: "&", - }, -}); - app.component("postGeneral", { templateUrl: "/mix-app/views/app-portal/pages/post/components/general/view.html", @@ -7265,6 +7224,83 @@ app.component("postGeneral", { }, }); +app.component("postMain", { + templateUrl: "/mix-app/views/app-portal/pages/post/components/main/view.html", + bindings: { + post: "=", + }, + controller: [ + "$rootScope", + "$scope", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.translate = $rootScope.translate; + ctrl.generateSeo = function () { + if (ctrl.post) { + if (!ctrl.post.seoName) { + ctrl.post.seoName = $rootScope.generateKeyword( + ctrl.post.title, + "-" + ); + } + if (!ctrl.post.seoTitle) { + ctrl.post.seoTitle = ctrl.post.title; + } + if (!ctrl.post.seoDescription === null) { + ctrl.post.seoDescription = ctrl.post.excerpt; + } + if (!ctrl.post.seoKeywords) { + ctrl.post.seoKeywords = ctrl.post.title; + } + } + }; + }, + ], +}); + +app.component("postMedias", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/medias/view.html", + controller: function () { + var ctrl = this; + ctrl.activeMedia = function (media) { + var currentItem = null; + if (ctrl.post.mediaNavs === null) { + ctrl.post.mediaNavs = []; + } + $.each(ctrl.post.mediaNavs, function (i, e) { + if (e.mediaId === media.id) { + e.isActived = media.isActived; + currentItem = e; + return false; + } + }); + if (currentItem === null) { + currentItem = { + description: + media.description !== "undefined" ? media.description : "", + image: media.filePath, + mediaId: media.id, + post: ctrl.post.id, + specificulture: media.specificulture, + position: 0, + priority: ctrl.post.mediaNavs.length + 1, + isActived: true, + }; + media.isHidden = true; + ctrl.post.mediaNavs.push(currentItem); + } + }; + }, + bindings: { + post: "=", + medias: "=", + loadMedia: "&", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("postModules", { templateUrl: "/mix-app/views/app-portal/pages/post/components/modules/view.html", @@ -7334,112 +7370,35 @@ app.component("postModules", { }; ctrl.updateDataInfos = async function (items) { - $rootScope.isBusy = true; - var resp = await moduleDataService.updateInfos(items); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, - ], - bindings: { - post: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - -app.component("postMain", { - templateUrl: "/mix-app/views/app-portal/pages/post/components/main/view.html", - bindings: { - post: "=", - }, - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.translate = $rootScope.translate; - ctrl.generateSeo = function () { - if (ctrl.post) { - if (!ctrl.post.seoName) { - ctrl.post.seoName = $rootScope.generateKeyword( - ctrl.post.title, - "-" - ); - } - if (!ctrl.post.seoTitle) { - ctrl.post.seoTitle = ctrl.post.title; - } - if (!ctrl.post.seoDescription === null) { - ctrl.post.seoDescription = ctrl.post.excerpt; - } - if (!ctrl.post.seoKeywords) { - ctrl.post.seoKeywords = ctrl.post.title; - } - } - }; - }, - ], -}); - -app.component("postParents", { - templateUrl: - "/mix-app/views/app-portal/pages/post/components/parents/view.html", - bindings: { - post: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - -app.component("postMedias", { - templateUrl: - "/mix-app/views/app-portal/pages/post/components/medias/view.html", - controller: function () { - var ctrl = this; - ctrl.activeMedia = function (media) { - var currentItem = null; - if (ctrl.post.mediaNavs === null) { - ctrl.post.mediaNavs = []; - } - $.each(ctrl.post.mediaNavs, function (i, e) { - if (e.mediaId === media.id) { - e.isActived = media.isActived; - currentItem = e; - return false; - } - }); - if (currentItem === null) { - currentItem = { - description: - media.description !== "undefined" ? media.description : "", - image: media.filePath, - mediaId: media.id, - post: ctrl.post.id, - specificulture: media.specificulture, - position: 0, - priority: ctrl.post.mediaNavs.length + 1, - isActived: true, - }; - media.isHidden = true; - ctrl.post.mediaNavs.push(currentItem); - } - }; + $rootScope.isBusy = true; + var resp = await moduleDataService.updateInfos(items); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, + ], + bindings: { + post: "=", + onDelete: "&", + onUpdate: "&", }, +}); + +app.component("postParents", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/parents/view.html", bindings: { post: "=", - medias: "=", - loadMedia: "&", onDelete: "&", onUpdate: "&", }, @@ -7555,15 +7514,6 @@ app.component("postContent", { ], }); -app.component("postSeo", { - templateUrl: "/mix-app/views/app-portal/pages/post/components/seo/view.html", - bindings: { - post: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("postRelated", { templateUrl: "/mix-app/views/app-portal/pages/post/components/related/view.html", @@ -7599,6 +7549,56 @@ app.component("postRelated", { }, }); +app.component("postSeo", { + templateUrl: "/mix-app/views/app-portal/pages/post/components/seo/view.html", + bindings: { + post: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + +modules.component("rolePageNav", { + templateUrl: + "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RoleService", + function ($rootScope, $scope, ngAppSettings, roleServices) { + var ctrl = this; + ctrl.selected = null; + ctrl.updateOrders = function (index) { + ctrl.data.splice(index, 1); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.data[i].priority = i + 1; + } + }; + //ctrl.change = async function () { + // //var permission = ctrl.page.navPermission; + // //$rootScope.isBusy = true; + // //var resp = await roleServices.updatePermission(permission); + // //if (resp && resp.isSucceed) { + // // $rootScope.showMessage('Update successfully!', 'success'); + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + // //else { + // // if (resp) { $rootScope.showErrors(resp.errors); } + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + //}; + }, + ], + bindings: { + prefix: "=", + page: "=", + callback: "&", + }, +}); + app.component("serviceMain", { templateUrl: "/mix-app/views/app-portal/pages/service/components/main/view.html", @@ -8123,6 +8123,43 @@ modules.component("aceEditor", { }, }); +modules.component("actions", { + templateUrl: "/mix-app/views/app-portal/components/actions/actions.html", + bindings: { + previewUrl: "=", + backUrl: "=", + contentUrl: "=", + onClearCache: "&?", + onSubmit: "&?", + }, + controller: [ + "$rootScope", + "$scope", + "$location", + function ($rootScope, $scope, $location) { + var ctrl = this; + ctrl.visible = $rootScope.visible; + ctrl.back = function () { + // ctrl.backUrl = ctrl.backUrl || "/admin"; + // $location.url(ctrl.backUrl); + window.history.back(); + }; + ctrl.$onInit = function () { + ctrl.isAdmin = $rootScope.isAdmin; + }; + ctrl.submit = function ($event) { + if (ctrl.onSubmit) { + $event.preventDefault(); + ctrl.onSubmit(); + } + }; + ctrl.clearCache = function () { + ctrl.onClearCache(); + }; + }, + ], +}); + modules.component("additionalColumn", { templateUrl: "/mix-app/views/app-portal/components/additional-column/view.html", @@ -8241,36 +8278,6 @@ modules.component("additionalColumn", { ], }); -modules.component("actions", { - templateUrl: "/mix-app/views/app-portal/components/actions/actions.html", - controller: [ - "$rootScope", - "$scope", - "$location", - function ($rootScope, $scope, $location) { - var ctrl = this; - ctrl.visible = $rootScope.visible; - ctrl.back = function () { - // ctrl.backUrl = ctrl.backUrl || "/admin"; - // $location.url(ctrl.backUrl); - window.history.back(); - }; - ctrl.$onInit = function () { - ctrl.isAdmin = $rootScope.isAdmin; - }; - ctrl.clearCache = function () { - ctrl.onClearCache(); - }; - }, - ], - bindings: { - previewUrl: "=", - backUrl: "=", - contentUrl: "=", - onClearCache: "&?", - }, -}); - modules.component("additionalValue", { templateUrl: "/mix-app/views/app-portal/components/additional-value/view.html", @@ -8637,44 +8644,6 @@ modules.component("funding", { bindings: {}, }); -modules.component("githubContributers", { - templateUrl: - "/mix-app/views/app-portal/components/github-contributers/view.html", - controller: [ - "$rootScope", - "$http", - function ($rootScope, $http) { - var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var req = { - method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/contributors", - }; - ctrl.getGithubApiResult(req); - }; - - ctrl.getGithubApiResult = async function (req) { - return $http(req).then( - function (resp) { - if (resp.status == "200") { - ctrl.items = resp.data; - } else { - } - }, - function (error) { - return { - isSucceed: false, - errors: [error.statusText || error.status], - }; - } - ); - }; - }, - ], - bindings: {}, -}); - modules.component("githubReleases", { templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", controller: [ @@ -8914,21 +8883,43 @@ modules.component("googleAnalytic", { ], }); -modules.component("hubMessages", { +modules.component("githubContributers", { templateUrl: - "/mix-app/views/app-portal/components/hub-messages/hub-messages.html", - controller: "HubMessagesController", + "/mix-app/views/app-portal/components/github-contributers/view.html", + controller: [ + "$rootScope", + "$http", + function ($rootScope, $http) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var req = { + method: "GET", + url: "https://api.github.com/repos/mixcore/mix.core/contributors", + }; + ctrl.getGithubApiResult(req); + }; + + ctrl.getGithubApiResult = async function (req) { + return $http(req).then( + function (resp) { + if (resp.status == "200") { + ctrl.items = resp.data; + } else { + } + }, + function (error) { + return { + isSucceed: false, + errors: [error.statusText || error.status], + }; + } + ); + }; + }, + ], bindings: {}, }); -app.controller("HubMessagesController", [ - "$scope", - function ($scope) { - BaseHub.call(this, $scope); - $scope.init = function () { - $scope.startConnection("portalhub"); - }; - }, -]); (function (angular) { app.component("headerNav", { @@ -8998,36 +8989,28 @@ app.controller("HubMessagesController", [ }; }, ], - bindings: { - breadCrumbs: "=", - settings: "=", - }, - }); -})(window.angular); - -modules.component("jumbotrons", { - templateUrl: - "/mix-app/views/app-portal/components/jumbotrons/jumbotrons.html", - controller: [ - "$rootScope", - "$scope", - "$location", - function ($rootScope, $scope, $location) { - var ctrl = this; - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - // ctrl.back = function () { - // ctrl.backUrl = ctrl.backUrl || '/admin'; - // $location.path(ctrl.backUrl); - // }; + bindings: { + breadCrumbs: "=", + settings: "=", }, - ], - bindings: { - tagName: "=", - tagType: "=", - }, + }); +})(window.angular); + +modules.component("hubMessages", { + templateUrl: + "/mix-app/views/app-portal/components/hub-messages/hub-messages.html", + controller: "HubMessagesController", + bindings: {}, }); +app.controller("HubMessagesController", [ + "$scope", + function ($scope) { + BaseHub.call(this, $scope); + $scope.init = function () { + $scope.startConnection("portalhub"); + }; + }, +]); modules.component("jsonBuilder", { templateUrl: "/mix-app/views/app-portal/components/json-builder/view.html", @@ -9243,6 +9226,30 @@ modules.component("jsonBuilder", { ], }); +modules.component("jumbotrons", { + templateUrl: + "/mix-app/views/app-portal/components/jumbotrons/jumbotrons.html", + controller: [ + "$rootScope", + "$scope", + "$location", + function ($rootScope, $scope, $location) { + var ctrl = this; + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + // ctrl.back = function () { + // ctrl.backUrl = ctrl.backUrl || '/admin'; + // $location.path(ctrl.backUrl); + // }; + }, + ], + bindings: { + tagName: "=", + tagType: "=", + }, +}); + modules.component("listMixColumn", { templateUrl: "/mix-app/views/app-portal/components/list-mix-column/view.html", controller: [ @@ -9394,6 +9401,35 @@ modules.component("listMixColumn", { }, }); +modules.component("mainSideBar", { + templateUrl: + "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "TranslatorService", + "ApiService", + "CommonService", + function ( + $rootScope, + $scope, + ngAppSettings, + translatorService, + apiService, + commonService + ) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var routes = JSON.parse($("#portal-menus").val()); + ctrl.items = routes.data; + }; + }, + ], + bindings: {}, +}); + modules.component("mainSideBarDynamic", { templateUrl: "/mix-app/views/app-portal/components/main-side-bar-dynamic/main-side-bar-dynamic.html", @@ -9435,35 +9471,6 @@ modules.component("mainSideBarDynamic", { }, }); -modules.component("mainSideBar", { - templateUrl: - "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "TranslatorService", - "ApiService", - "CommonService", - function ( - $rootScope, - $scope, - ngAppSettings, - translatorService, - apiService, - commonService - ) { - var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var routes = JSON.parse($("#portal-menus").val()); - ctrl.items = routes.data; - }; - }, - ], - bindings: {}, -}); - modules.component("mainSideBarItem", { templateUrl: "/mix-app/views/app-portal/components/main-side-bar-item/main-side-bar-item.html", @@ -9554,26 +9561,26 @@ modules.component("mediaFileUpload", { ctrl.selectFile = function (files) { if (files !== undefined && files !== null && files.length > 0) { - ctrl.file = files[0]; + ctrl.formFile = files[0]; ctrl.mediaFile.fileFolder = ctrl.folder ? ctrl.folder : "Media"; ctrl.mediaFile.title = ctrl.title ? ctrl.title : ""; ctrl.mediaFile.description = ctrl.description ? ctrl.description : ""; - ctrl.mediaFile.fileName = ctrl.file.name.substring( + ctrl.mediaFile.fileName = ctrl.formFile.name.substring( 0, - ctrl.file.name.lastIndexOf(".") + ctrl.formFile.name.lastIndexOf(".") ); - ctrl.mediaFile.extension = ctrl.file.name.substring( - ctrl.file.name.lastIndexOf(".") + ctrl.mediaFile.extension = ctrl.formFile.name.substring( + ctrl.formFile.name.lastIndexOf(".") ); - if ($rootScope.isImage(ctrl.file)) { + if ($rootScope.isImage(ctrl.formFile)) { ctrl.canUpload = false; - mediaService.openCroppie(ctrl.file, ctrl, false); + mediaService.openCroppie(ctrl.formFile, ctrl, false); } else { - ctrl.mediaFile.file = ctrl.file; - ctrl.formFile = ctrl.file; + ctrl.mediaFile.file = ctrl.formFile; + ctrl.formFile = ctrl.formFile; ctrl.canUpload = true; - ctrl.uploadFile(ctrl.file); - // ctrl.getBase64(ctrl.file); + // ctrl.uploadFile(ctrl.formFile); + // ctrl.getBase64(ctrl.formFile); } } }; @@ -9583,8 +9590,9 @@ modules.component("mediaFileUpload", { ctrl.isImage = true; ctrl.mediaFile.fileStream = result; ctrl.src = result; - } else if (ctrl.file) { - ctrl.uploadFile(ctrl.file); + } else if (ctrl.formFile) { + ctrl.mediaFile.file = ctrl.formFile; + // ctrl.uploadFile(ctrl.formFile); } }; @@ -10116,229 +10124,85 @@ modules.component("mixDatabaseDataValueEditor", { break; case "boolean": if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.booleanValue = - ctrl.mixDatabaseDataValue.column.defaultValue == "true"; - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - - default: - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - } - }; - ctrl.updateStringValue = async function (dataType) { - switch (dataType.toLowerCase()) { - case "datetime": - case "date": - case "time": - if (ctrl.mixDatabaseDataValue.dateObj) { - ctrl.mixDatabaseDataValue.dateTimeValue = ctrl.mixDatabaseDataValue.dateObj.toISOString(); - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.dateTimeValue; - } - break; - case "double": - if (ctrl.mixDatabaseDataValue.doubleValue) { - ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.doubleValue.toString(); - } - break; - case "boolean": - if (ctrl.mixDatabaseDataValue.booleanValue != null) { - ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.booleanValue.toString(); - } - break; - - default: - break; - } - }; - - ctrl.updateRefData = function (nav) { - ctrl.goToPath(`/portal/mix-database-data/details?dataId=${nav.data.id} - &mixDatabaseId=${nav.data.mixDatabaseId} - &parentId=${ctrl.parentId} - &parentType=${ctrl.parentType}`); - // ctrl.refDataModel = nav; - // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; - // angular.element(e).triggerHandler('click'); - // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); - }; - - ctrl.removeRefData = async function (nav) { - $rootScope.showConfirm( - ctrl, - "removeRefDataConfirmed", - [nav], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - ctrl.removeRefDataConfirmed = async function (nav) { - $rootScope.isBusy = true; - var result = await navService.delete([ - nav.parentId, - nav.parentType, - nav.id, - ]); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.refData, "id", nav.id); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, - ], -}); - -modules.component("mixDatabaseDataValues", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-values/view.html", - bindings: { - header: "=", - data: "=", - canDrag: "=", - mixDatabaseName: "=?", - mixDatabaseId: "=?", - queries: "=?", - filterType: "=?", - selectedList: "=", - selectSingle: "=?", - columns: "=?", - onFilterList: "&?", - onApplyList: "&?", - onSendMail: "&?", - onUpdate: "&?", - onDuplicate: "&?", - onDelete: "&?", - }, - controller: [ - "$rootScope", - "$scope", - "RestMixDatabaseColumnPortalService", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, columnService, dataService) { - var ctrl = this; - ctrl.actions = ["Delete", "SendMail"]; - ctrl.filterTypes = ["contain", "equal"]; - ctrl.selectedProp = null; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () { - if (!ctrl.selectedList) { - ctrl.selectedList = { - action: "Delete", - data: [], - }; - } - if (!ctrl.columns) { - var getFields = await columnService.initData( - ctrl.mixDatabaseName || ctrl.mixDatabaseId - ); - if (getFields.isSucceed) { - ctrl.columns = getFields.data; - $scope.$apply(); - } - } - }; - ctrl.select = function (item) { - if (item.isSelected) { - if (ctrl.selectSingle == "true") { - ctrl.selectedList.data = []; - ctrl.selectedList.data.push(item); - } else { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - item.id - ); - if (!current) { - ctrl.selectedList.data.push(item); + ctrl.mixDatabaseDataValue.booleanValue = + ctrl.mixDatabaseDataValue.column.defaultValue == "true"; + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; } - } - } else { - $rootScope.removeObject(ctrl.selectedList, item.id); - } - }; - ctrl.selectAll = function (isSelected) { - ctrl.selectedList.data = []; - angular.forEach(ctrl.data, function (e) { - e.isSelected = isSelected; - if (isSelected) { - ctrl.selectedList.data.push(e.id); - } - }); - }; - ctrl.filter = function () {}; - ctrl.sendMail = async function (data) { - ctrl.onSendMail({ data: data }); - }; - ctrl.apply = async function () { - ctrl.onApplyList(); - }; + break; - ctrl.duplicate = function (data) { - ctrl.onDuplicate({ data: data }); + default: + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; + } }; + ctrl.updateStringValue = async function (dataType) { + switch (dataType.toLowerCase()) { + case "datetime": + case "date": + case "time": + if (ctrl.mixDatabaseDataValue.dateObj) { + ctrl.mixDatabaseDataValue.dateTimeValue = ctrl.mixDatabaseDataValue.dateObj.toISOString(); + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.dateTimeValue; + } + break; + case "double": + if (ctrl.mixDatabaseDataValue.doubleValue) { + ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.doubleValue.toString(); + } + break; + case "boolean": + if (ctrl.mixDatabaseDataValue.booleanValue != null) { + ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.booleanValue.toString(); + } + break; - ctrl.update = function (data) { - ctrl.onUpdate({ data: data }); + default: + break; + } }; - ctrl.delete = function (data) { - ctrl.onDelete({ data: data }); + ctrl.updateRefData = function (nav) { + ctrl.goToPath(`/portal/mix-database-data/details?dataId=${nav.data.id} + &mixDatabaseId=${nav.data.mixDatabaseId} + &parentId=${ctrl.parentId} + &parentType=${ctrl.parentType}`); + // ctrl.refDataModel = nav; + // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; + // angular.element(e).triggerHandler('click'); + // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); }; - ctrl.filterData = function (item, attributeName) { - return $rootScope.findObjectByKey( - item.data, - "attributeName", - attributeName + ctrl.removeRefData = async function (nav) { + $rootScope.showConfirm( + ctrl, + "removeRefDataConfirmed", + [nav], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" ); }; - - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.data[0].priority; - }; - ctrl.updateOrders = function (index, items) { - if (index > ctrl.dragStartIndex) { - ctrl.data.splice(ctrl.dragStartIndex, 1); + ctrl.removeRefDataConfirmed = async function (nav) { + $rootScope.isBusy = true; + var result = await navService.delete([ + nav.parentId, + nav.parentType, + nav.id, + ]); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.refData, "id", nav.id); + $rootScope.isBusy = false; + $scope.$apply(); } else { - ctrl.data.splice(ctrl.dragStartIndex + 1, 1); + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); } - ctrl.updateDataInfos(); - }; - ctrl.updateDataInfos = async function () { - angular.forEach(ctrl.data, async function (e, i) { - e.priority = ctrl.minPriority + i; - var resp = await dataService.saveFields(e.id, { - priority: e.priority, - }); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - } - }); - }; - - ctrl.view = function (item) { - var obj = { - columns: ctrl.columns, - item: item, - }; - $rootScope.preview("mix-database-data", obj, null, "modal-lg"); }; }, ], @@ -10484,63 +10348,207 @@ modules.component("mixDatabaseForm", { if (saveResult) { $rootScope.showErrors(saveResult.errors); } - $scope.$apply(); + $scope.$apply(); + } + } + }; + ctrl.validate = function () { + var isValid = true; + ctrl.errors = []; + angular.forEach(ctrl.columns, function (column) { + if (column.regex) { + var regex = RegExp(column.regex, "g"); + isValid = regex.test(ctrl.mixDatabaseData.obj[column.name]); + if (!isValid) { + ctrl.errors.push(`${column.name} is not match Regex`); + } + } + if (!isValid) { + $rootScope.showErrors(ctrl.errors); + } + if (isValid && column.isEncrypt) { + ctrl.mixDatabaseData.obj[column.name] = $rootScope.encrypt( + ctrl.mixDatabaseData.obj[column.name] + ); + } + }); + return isValid; + }; + ctrl.showContentFilter = function ($event) { + $rootScope.showContentFilter(ctrl.loadSelectedLink); + }; + ctrl.loadSelectedLink = function (data, type) { + if (data) { + ctrl.mixDatabaseData.obj.target_id = data.id; + ctrl.mixDatabaseData.obj.title = data.title; + ctrl.mixDatabaseData.obj.type = type; + ctrl.mixDatabaseData.obj.uri = data.detailsUrl; + } + }; + ctrl.filterData = function (attributeName) { + if (ctrl.mixDatabaseData) { + var attr = $rootScope.findObjectByKey( + ctrl.mixDatabaseData.obj, + "mixDatabaseColumnName", + attributeName + ); + if (!attr) { + attr = angular.copy( + $rootScope.findObjectByKey( + ctrl.defaultData.data, + "mixDatabaseColumnName", + attributeName + ) + ); + mixDatabaseColumn; + ctrl.mixDatabaseData.obj.push(attr); + } + return attr; + } + }; + }, + ], +}); + +modules.component("mixDatabaseDataValues", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-data-values/view.html", + bindings: { + header: "=", + data: "=", + canDrag: "=", + mixDatabaseName: "=?", + mixDatabaseId: "=?", + queries: "=?", + filterType: "=?", + selectedList: "=", + selectSingle: "=?", + columns: "=?", + onFilterList: "&?", + onApplyList: "&?", + onSendMail: "&?", + onUpdate: "&?", + onDuplicate: "&?", + onDelete: "&?", + }, + controller: [ + "$rootScope", + "$scope", + "RestMixDatabaseColumnPortalService", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, columnService, dataService) { + var ctrl = this; + ctrl.actions = ["Delete", "SendMail"]; + ctrl.filterTypes = ["contain", "equal"]; + ctrl.selectedProp = null; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = async function () { + if (!ctrl.selectedList) { + ctrl.selectedList = { + action: "Delete", + data: [], + }; + } + if (!ctrl.columns) { + var getFields = await columnService.initData( + ctrl.mixDatabaseName || ctrl.mixDatabaseId + ); + if (getFields.isSucceed) { + ctrl.columns = getFields.data; + $scope.$apply(); + } + } + }; + ctrl.select = function (item) { + if (item.isSelected) { + if (ctrl.selectSingle == "true") { + ctrl.selectedList.data = []; + ctrl.selectedList.data.push(item); + } else { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + item.id + ); + if (!current) { + ctrl.selectedList.data.push(item); + } } + } else { + $rootScope.removeObject(ctrl.selectedList, item.id); } }; - ctrl.validate = function () { - var isValid = true; - ctrl.errors = []; - angular.forEach(ctrl.columns, function (column) { - if (column.regex) { - var regex = RegExp(column.regex, "g"); - isValid = regex.test(ctrl.mixDatabaseData.obj[column.name]); - if (!isValid) { - ctrl.errors.push(`${column.name} is not match Regex`); - } - } - if (!isValid) { - $rootScope.showErrors(ctrl.errors); - } - if (isValid && column.isEncrypt) { - ctrl.mixDatabaseData.obj[column.name] = $rootScope.encrypt( - ctrl.mixDatabaseData.obj[column.name] - ); + ctrl.selectAll = function (isSelected) { + ctrl.selectedList.data = []; + angular.forEach(ctrl.data, function (e) { + e.isSelected = isSelected; + if (isSelected) { + ctrl.selectedList.data.push(e.id); } }); - return isValid; }; - ctrl.showContentFilter = function ($event) { - $rootScope.showContentFilter(ctrl.loadSelectedLink); + ctrl.filter = function () {}; + ctrl.sendMail = async function (data) { + ctrl.onSendMail({ data: data }); }; - ctrl.loadSelectedLink = function (data, type) { - if (data) { - ctrl.mixDatabaseData.obj.target_id = data.id; - ctrl.mixDatabaseData.obj.title = data.title; - ctrl.mixDatabaseData.obj.type = type; - ctrl.mixDatabaseData.obj.uri = data.detailsUrl; + ctrl.apply = async function () { + ctrl.onApplyList(); + }; + + ctrl.duplicate = function (data) { + ctrl.onDuplicate({ data: data }); + }; + + ctrl.update = function (data) { + ctrl.onUpdate({ data: data }); + }; + + ctrl.delete = function (data) { + ctrl.onDelete({ data: data }); + }; + + ctrl.filterData = function (item, attributeName) { + return $rootScope.findObjectByKey( + item.data, + "attributeName", + attributeName + ); + }; + + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + ctrl.minPriority = ctrl.data[0].priority; + }; + ctrl.updateOrders = function (index, items) { + if (index > ctrl.dragStartIndex) { + ctrl.data.splice(ctrl.dragStartIndex, 1); + } else { + ctrl.data.splice(ctrl.dragStartIndex + 1, 1); } + ctrl.updateDataInfos(); }; - ctrl.filterData = function (attributeName) { - if (ctrl.mixDatabaseData) { - var attr = $rootScope.findObjectByKey( - ctrl.mixDatabaseData.obj, - "mixDatabaseColumnName", - attributeName - ); - if (!attr) { - attr = angular.copy( - $rootScope.findObjectByKey( - ctrl.defaultData.data, - "mixDatabaseColumnName", - attributeName - ) - ); - mixDatabaseColumn; - ctrl.mixDatabaseData.obj.push(attr); + ctrl.updateDataInfos = async function () { + angular.forEach(ctrl.data, async function (e, i) { + e.priority = ctrl.minPriority + i; + var resp = await dataService.saveFields(e.id, { + priority: e.priority, + }); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } } - return attr; - } + }); + }; + + ctrl.view = function (item) { + var obj = { + columns: ctrl.columns, + item: item, + }; + $rootScope.preview("mix-database-data", obj, null, "modal-lg"); }; }, ], @@ -10649,11 +10657,169 @@ modules.component("mixDatabaseNavData", { "Deleted data will not able to recover, are you sure you want to delete this item?" ); }; - ctrl.removeDataConfirmed = async function (nav) { + ctrl.removeDataConfirmed = async function (nav) { + $rootScope.isBusy = true; + var result = await navService.delete([nav.id]); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + ctrl.minPriority = ctrl.data[0].priority; + }; + ctrl.updateOrders = function (index) { + if (index > ctrl.dragStartIndex) { + ctrl.data.splice(ctrl.dragStartIndex, 1); + } else { + ctrl.data.splice(ctrl.dragStartIndex + 1, 1); + } + var arrNavs = []; + angular.forEach(ctrl.data, function (e, i) { + e.priority = ctrl.minPriority + i; + var keys = { + parentId: e.parentId, + parentType: e.parentType, + id: e.id, + }; + var properties = { + priority: e.priority, + }; + arrNavs.push({ + keys: keys, + properties: properties, + }); + }); + navService.saveProperties("portal", arrNavs).then((resp) => { + $rootScope.isBusy = false; + $scope.$apply(); + }); + }; + }, + ], +}); + +modules.component("mixDatabaseNavs", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-navs/view.html", + bindings: { + parentId: "=", + parentType: "=", + mixDatabaseNavs: "=?", + onUpdate: "&?", + onDelete: "&?", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RestRelatedMixDatabasePortalService", + "RestMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, navService, setService) { + var ctrl = this; + ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; + ctrl.selected = {}; + ctrl.defaultData = null; + ctrl.navRequest = angular.copy(ngAppSettings.request); + ctrl.setRequest = angular.copy(ngAppSettings.request); + + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = function () { + // ctrl.setRequest.type = ctrl.parentType; + navService.getDefault().then((resp) => { + resp.parentId = ctrl.parentId; + resp.parentType = ctrl.parentType; + ctrl.defaultData = resp; + ctrl.loadData(); + }); + }; + ctrl.goToPath = $rootScope.goToPath; + ctrl.selectPane = function (pane) {}; + ctrl.loadData = async function () { + // Load attr set navs if not in input + if (!ctrl.mixDatabaseNavs) { + ctrl.navRequest.parentType = ctrl.parentType; + ctrl.navRequest.parentId = ctrl.parentId; + var resp = await navService.getList(ctrl.navRequest); + if (resp) { + angular.forEach(resp.data.items, (e) => { + e.isActived = true; + ctrl.mixDatabaseNavs.push(e); + }); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + } + } else { + angular.forEach(ctrl.mixDatabaseNavs, (e) => { + e.isActived = true; + }); + } + + var setResult = await setService.getList(ctrl.setRequest); + if (setResult) { + angular.forEach(setResult.data.items, (element) => { + var e = $rootScope.findObjectByKey( + ctrl.mixDatabaseNavs, + "mixDatabaseId", + element.id + ); + if (!e) { + e = angular.copy(ctrl.defaultData); + e.status = "Published"; + e.mixDatabaseId = element.id; + e.specificulture = navService.lang; + e.data = element; + e.isActived = false; + ctrl.mixDatabaseNavs.push(e); + } + }); + } else { + if (setResult) { + $rootScope.showErrors("Others Failed"); + } + } + $scope.$apply(); + }; + ctrl.change = async function (nav) { + $rootScope.isBusy = true; + var result; + if (nav.isActived) { + ctrl.active(nav); + } else { + ctrl.deactive(nav); + } + }; + + ctrl.deactive = async function (nav) { + let result = null; + if (nav.id) { + result = await navService.delete([nav.id]); + $(".pane-container-" + nav.data.id) + .parent() + .remove(); + } + if (result && result.isSucceed) { + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + } + }; + + ctrl.active = async function (nav) { $rootScope.isBusy = true; - var result = await navService.delete([nav.id]); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); + var result; + result = await navService.save(nav); + if (result && result.isSucceed) { $rootScope.isBusy = false; $scope.$apply(); } else { @@ -10662,18 +10828,31 @@ modules.component("mixDatabaseNavData", { $scope.$apply(); } }; + + ctrl.update = function (data) { + ctrl.onUpdate({ + data: data, + }); + }; + + ctrl.delete = function (data) { + ctrl.onDelete({ + data: data, + }); + }; + ctrl.dragStart = function (index) { ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.data[0].priority; + ctrl.minPriority = ctrl.mixDatabaseNavs[0].priority; }; ctrl.updateOrders = function (index) { if (index > ctrl.dragStartIndex) { - ctrl.data.splice(ctrl.dragStartIndex, 1); + ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex, 1); } else { - ctrl.data.splice(ctrl.dragStartIndex + 1, 1); + ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex + 1, 1); } var arrNavs = []; - angular.forEach(ctrl.data, function (e, i) { + angular.forEach(ctrl.mixDatabaseNavs, function (e, i) { e.priority = ctrl.minPriority + i; var keys = { parentId: e.parentId, @@ -10886,177 +11065,6 @@ modules.component("mixDatabaseNavValues", { ], }); -modules.component("mixDatabaseNavs", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-navs/view.html", - bindings: { - parentId: "=", - parentType: "=", - mixDatabaseNavs: "=?", - onUpdate: "&?", - onDelete: "&?", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RestRelatedMixDatabasePortalService", - "RestMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, navService, setService) { - var ctrl = this; - ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; - ctrl.selected = {}; - ctrl.defaultData = null; - ctrl.navRequest = angular.copy(ngAppSettings.request); - ctrl.setRequest = angular.copy(ngAppSettings.request); - - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - // ctrl.setRequest.type = ctrl.parentType; - navService.getDefault().then((resp) => { - resp.parentId = ctrl.parentId; - resp.parentType = ctrl.parentType; - ctrl.defaultData = resp; - ctrl.loadData(); - }); - }; - ctrl.goToPath = $rootScope.goToPath; - ctrl.selectPane = function (pane) {}; - ctrl.loadData = async function () { - // Load attr set navs if not in input - if (!ctrl.mixDatabaseNavs) { - ctrl.navRequest.parentType = ctrl.parentType; - ctrl.navRequest.parentId = ctrl.parentId; - var resp = await navService.getList(ctrl.navRequest); - if (resp) { - angular.forEach(resp.data.items, (e) => { - e.isActived = true; - ctrl.mixDatabaseNavs.push(e); - }); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - } - } else { - angular.forEach(ctrl.mixDatabaseNavs, (e) => { - e.isActived = true; - }); - } - - var setResult = await setService.getList(ctrl.setRequest); - if (setResult) { - angular.forEach(setResult.data.items, (element) => { - var e = $rootScope.findObjectByKey( - ctrl.mixDatabaseNavs, - "mixDatabaseId", - element.id - ); - if (!e) { - e = angular.copy(ctrl.defaultData); - e.status = "Published"; - e.mixDatabaseId = element.id; - e.specificulture = navService.lang; - e.data = element; - e.isActived = false; - ctrl.mixDatabaseNavs.push(e); - } - }); - } else { - if (setResult) { - $rootScope.showErrors("Others Failed"); - } - } - $scope.$apply(); - }; - ctrl.change = async function (nav) { - $rootScope.isBusy = true; - var result; - if (nav.isActived) { - ctrl.active(nav); - } else { - ctrl.deactive(nav); - } - }; - - ctrl.deactive = async function (nav) { - let result = null; - if (nav.id) { - result = await navService.delete([nav.id]); - $(".pane-container-" + nav.data.id) - .parent() - .remove(); - } - if (result && result.isSucceed) { - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - } - }; - - ctrl.active = async function (nav) { - $rootScope.isBusy = true; - var result; - result = await navService.save(nav); - if (result && result.isSucceed) { - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - ctrl.update = function (data) { - ctrl.onUpdate({ - data: data, - }); - }; - - ctrl.delete = function (data) { - ctrl.onDelete({ - data: data, - }); - }; - - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.mixDatabaseNavs[0].priority; - }; - ctrl.updateOrders = function (index) { - if (index > ctrl.dragStartIndex) { - ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex, 1); - } else { - ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex + 1, 1); - } - var arrNavs = []; - angular.forEach(ctrl.mixDatabaseNavs, function (e, i) { - e.priority = ctrl.minPriority + i; - var keys = { - parentId: e.parentId, - parentType: e.parentType, - id: e.id, - }; - var properties = { - priority: e.priority, - }; - arrNavs.push({ - keys: keys, - properties: properties, - }); - }); - navService.saveProperties("portal", arrNavs).then((resp) => { - $rootScope.isBusy = false; - $scope.$apply(); - }); - }; - }, - ], -}); - modules.component("mixFileUpload", { templateUrl: "/mix-app/views/app-portal/components/mix-file-upload/view.html", bindings: { @@ -11121,29 +11129,64 @@ modules.component("mixFileUpload", { return null; } }; - - ctrl.uploadFile = async function () { - if (ctrl.file) { - $rootScope.isBusy = true; - var response = await fileService.uploadFile(ctrl.file, ctrl.folder); - if (response) { - if (ctrl.onSuccess) { - ctrl.onSuccess(); - } - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(['Cannot upload file']); - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - $rootScope.showErrors(["Please choose file"]); + + ctrl.uploadFile = async function () { + if (ctrl.file) { + $rootScope.isBusy = true; + var response = await fileService.uploadFile(ctrl.file, ctrl.folder); + if (response) { + if (ctrl.onSuccess) { + ctrl.onSuccess(); + } + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(['Cannot upload file']); + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + $rootScope.showErrors(["Please choose file"]); + } + }; + }, + ], +}); + +modules.component("mixSelectIcons", { + templateUrl: + "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", + controller: [ + "$rootScope", + "$scope", + "$location", + "$element", + function ($rootScope, $scope, $location, $element) { + var ctrl = this; + ctrl.limitTo = 20; + ctrl.container = $element[0].querySelector(".list-icon"); + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + ctrl.showMore = () => { + if ( + ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && + ctrl.limitTo < ctrl.options.length + ) { + ctrl.limitTo *= 2; } }; + ctrl.select = function (ico) { + ctrl.data = ico.class; + }; }, ], + bindings: { + data: "=", + prefix: "=", + options: "=", + }, }); "use strict"; @@ -11267,41 +11310,6 @@ app.controller("MixNavigationController", [ }, ]); -modules.component("mixSelectIcons", { - templateUrl: - "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", - controller: [ - "$rootScope", - "$scope", - "$location", - "$element", - function ($rootScope, $scope, $location, $element) { - var ctrl = this; - ctrl.limitTo = 20; - ctrl.container = $element[0].querySelector(".list-icon"); - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - ctrl.showMore = () => { - if ( - ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && - ctrl.limitTo < ctrl.options.length - ) { - ctrl.limitTo *= 2; - } - }; - ctrl.select = function (ico) { - ctrl.data = ico.class; - }; - }, - ], - bindings: { - data: "=", - prefix: "=", - options: "=", - }, -}); - modules.component("mixTemplateEditor", { templateUrl: "/mix-app/views/app-portal/components/mix-template-editor/view.html", @@ -12901,6 +12909,46 @@ modules.component("monacoEditor", { ], }); +modules.component("portalThemeSettings", { + templateUrl: + "/mix-app/views/app-portal/components/portal-theme-settings/view.html", + bindings: { + showLink: "=", + }, + controller: [ + "$rootScope", + "$scope", + "AppSettingsServices", + function ($rootScope, $scope, appSettingsServices) { + var ctrl = this; + this.$onInit = function () { + ctrl.portalThemeSettings = + $rootScope.globalSettings.portalThemeSettings; + }; + ctrl.applyThemeSettings = function () { + $rootScope.globalSettings.portalThemeSettings = + ctrl.portalThemeSettings; + }; + ctrl.saveThemeSettings = async function () { + var resp = await appSettingsServices.saveGlobalSettings( + "PortalThemeSettings", + ctrl.portalThemeSettings + ); + if (resp && resp.isSucceed) { + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $scope.$apply(); + } + }; + }, + ], +}); + modules.component("navs", { templateUrl: "/mix-app/views/app-portal/components/navigations/navigations.html", @@ -12961,40 +13009,69 @@ modules.component("navs", { ], }); -modules.component("portalThemeSettings", { +modules.component("propertiesValue", { templateUrl: - "/mix-app/views/app-portal/components/portal-theme-settings/view.html", + "/mix-app/views/app-portal/components/properties-value/view.html", bindings: { - showLink: "=", + title: "=", + columns: "=", + properties: "=", }, controller: [ "$rootScope", "$scope", - "AppSettingsServices", - function ($rootScope, $scope, appSettingsServices) { + function ($rootScope, $scope) { var ctrl = this; - this.$onInit = function () { - ctrl.portalThemeSettings = - $rootScope.globalSettings.portalThemeSettings; + ctrl.defaultAttr = { + title: "", + name: "", + default: null, + options: [], + priority: 0, + dataType: 7, + isGroupBy: false, + isSelect: false, + isDisplay: true, + width: 3, }; - ctrl.applyThemeSettings = function () { - $rootScope.globalSettings.portalThemeSettings = - ctrl.portalThemeSettings; + ctrl.selectedProp = null; + ctrl.localizeSettings = $rootScope.globalSettings; + + ctrl.$doCheck = function () { + if ( + angular.toJson(ctrl.columns) != angular.toJson(ctrl.trackedColumns) + ) { + ctrl.trackedColumns = angular.copy(ctrl.columns); + ctrl.trackedProperties = angular.copy(ctrl.properties); + ctrl.loadEditors(); + } + }.bind(ctrl); + + ctrl.loadEditors = function () { + ctrl.properties = []; + for (let i = 0; i < ctrl.columns.length; i++) { + var col = ctrl.columns[i]; + var oldObj = + $rootScope.findObjectByKey( + ctrl.trackedProperties, + "name", + col.name + ) || {}; + + ctrl.properties.push({ + title: col.title, + name: col.name, + dataType: col.dataType, + value: oldObj.value || col.defaultValue, + options: col.options, + }); + } }; - ctrl.saveThemeSettings = async function () { - var resp = await appSettingsServices.saveGlobalSettings( - "PortalThemeSettings", - ctrl.portalThemeSettings - ); - if (resp && resp.isSucceed) { - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); + + ctrl.addAttr = function () { + if (ctrl.columns) { + var t = angular.copy(ctrl.defaultAttr); + ctrl.columns.push(t); } }; }, @@ -13131,75 +13208,6 @@ modules.component("propertiesStructure", { }, }); -modules.component("propertiesValue", { - templateUrl: - "/mix-app/views/app-portal/components/properties-value/view.html", - bindings: { - title: "=", - columns: "=", - properties: "=", - }, - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.defaultAttr = { - title: "", - name: "", - default: null, - options: [], - priority: 0, - dataType: 7, - isGroupBy: false, - isSelect: false, - isDisplay: true, - width: 3, - }; - ctrl.selectedProp = null; - ctrl.localizeSettings = $rootScope.globalSettings; - - ctrl.$doCheck = function () { - if ( - angular.toJson(ctrl.columns) != angular.toJson(ctrl.trackedColumns) - ) { - ctrl.trackedColumns = angular.copy(ctrl.columns); - ctrl.trackedProperties = angular.copy(ctrl.properties); - ctrl.loadEditors(); - } - }.bind(ctrl); - - ctrl.loadEditors = function () { - ctrl.properties = []; - for (let i = 0; i < ctrl.columns.length; i++) { - var col = ctrl.columns[i]; - var oldObj = - $rootScope.findObjectByKey( - ctrl.trackedProperties, - "name", - col.name - ) || {}; - - ctrl.properties.push({ - title: col.title, - name: col.name, - dataType: col.dataType, - value: oldObj.value || col.defaultValue, - options: col.options, - }); - } - }; - - ctrl.addAttr = function () { - if (ctrl.columns) { - var t = angular.copy(ctrl.defaultAttr); - ctrl.columns.push(t); - } - }; - }, - ], -}); - modules.component("relatedNavs", { templateUrl: "/mix-app/views/app-portal/components/related-navigations/view.html", diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js index 6578ffec3..177e1b13b 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js @@ -2845,26 +2845,6 @@ appShared.factory("TranslatorService", [ }, ]); -"use strict"; -appShared.factory("RestMixDatabasePortalService", [ - "BaseRestService", - function (baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database/portal"); - var _migrate = async function (data) { - var url = `${this.prefixUrl}/migrate/${data.id}`; - var req = { - method: "POST", - url: url, - data: JSON.stringify(data), - }; - return await this.getRestApiResult(req); - }; - serviceFactory.migrate = _migrate; - return serviceFactory; - }, -]); - "use strict"; appShared.factory("RestMixDatabaseColumnPortalService", [ "BaseRestService", @@ -2887,11 +2867,21 @@ appShared.factory("RestMixDatabaseColumnPortalService", [ ]); "use strict"; -appShared.factory("RestMixDatabaseDataValuePortalService", [ +appShared.factory("RestMixDatabasePortalService", [ "BaseRestService", function (baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database-data-value/portal"); + serviceFactory.init("mix-database/portal"); + var _migrate = async function (data) { + var url = `${this.prefixUrl}/migrate/${data.id}`; + var req = { + method: "POST", + url: url, + data: JSON.stringify(data), + }; + return await this.getRestApiResult(req); + }; + serviceFactory.migrate = _migrate; return serviceFactory; }, ]); @@ -3025,12 +3015,11 @@ appShared.factory("RestMixDatabaseDataPortalService", [ ]); "use strict"; -appShared.factory("RestMvcPostService", [ +appShared.factory("RestMixDatabaseDataValuePortalService", [ "BaseRestService", function (baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("post/mvc"); - // Define more service methods here + serviceFactory.init("mix-database-data-value/portal"); return serviceFactory; }, ]); @@ -3054,6 +3043,17 @@ appShared.factory("RestMvcModuleDataService", [ }, ]); +"use strict"; +appShared.factory("RestMvcPostService", [ + "BaseRestService", + function (baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("post/mvc"); + // Define more service methods here + return serviceFactory; + }, +]); + "use strict"; appShared.factory("RestRelatedAttributeDataFormService", [ "BaseRestService", @@ -4145,89 +4145,6 @@ appShared.controller("ModuleFormController", [ }, ]); -"use strict"; -appShared.controller("MvcModuleDataController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "RestMvcModuleDataService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.request.orderBy = "Priority"; - $scope.request.direction = "Asc"; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = null; - $scope.module = null; - $scope.allData = []; - $scope.editDataUrl = null; - $scope.canLoadMore = false; - $scope.init = async function (moduleId, pageSize) { - $scope.moduleId = moduleId; - $scope.request.module_id = $scope.moduleId; - $scope.request.pageSize = pageSize || $scope.request.pageSize; - $scope.loadMore(0); - }; - - $scope.getSingle = async function () { - $rootScope.isBusy = true; - var resp = await service.getSingle($scope.id, "mvc"); - if (resp && resp.isSucceed) { - $scope.activedModuleData = resp.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.activeItem = function (arr, item) { - angular.forEach(arr, function (e) { - if (e.id != item.id) { - e.expanded = false; - } else { - e.expanded = !e.expanded; - } - }); - }; - $scope.loadMore = async function (pageIndex) { - $scope.request.pageIndex = pageIndex || $scope.request.pageIndex + 1; - $rootScope.isBusy = true; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.allData = $scope.allData.concat(response.data.items); - $rootScope.isBusy = false; - $scope.canLoadMore = response.data.totalItems > $scope.allData.length; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - appShared.controller("MixDataController", [ "$rootScope", "$scope", @@ -4250,7 +4167,7 @@ appShared.controller("MixDataController", [ successHandler, failHandler ) { - $scope.successMsg = "Thành công"; + $scope.successMsg = "Success"; $scope.validateHandler = validateHandler; $scope.loadingHandler = loadingHandler; $scope.successHandler = successHandler; @@ -4304,7 +4221,7 @@ appShared.controller("MixDataController", [ $scope.form.$$element.removeClass("was-validated"); $scope.form.$setPristine(); $scope.form.$setUntouched(); - alert($scope.successMsg); + console.log($scope.successMsg); } $scope.formData = angular.copy($scope.defaultData); $rootScope.isBusy = false; @@ -4347,6 +4264,89 @@ appShared.controller("MixDataController", [ }, ]); +"use strict"; +appShared.controller("MvcModuleDataController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "RestMvcModuleDataService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.request.orderBy = "Priority"; + $scope.request.direction = "Asc"; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = null; + $scope.module = null; + $scope.allData = []; + $scope.editDataUrl = null; + $scope.canLoadMore = false; + $scope.init = async function (moduleId, pageSize) { + $scope.moduleId = moduleId; + $scope.request.module_id = $scope.moduleId; + $scope.request.pageSize = pageSize || $scope.request.pageSize; + $scope.loadMore(0); + }; + + $scope.getSingle = async function () { + $rootScope.isBusy = true; + var resp = await service.getSingle($scope.id, "mvc"); + if (resp && resp.isSucceed) { + $scope.activedModuleData = resp.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.activeItem = function (arr, item) { + angular.forEach(arr, function (e) { + if (e.id != item.id) { + e.expanded = false; + } else { + e.expanded = !e.expanded; + } + }); + }; + $scope.loadMore = async function (pageIndex) { + $scope.request.pageIndex = pageIndex || $scope.request.pageIndex + 1; + $rootScope.isBusy = true; + var response = await service.getList($scope.request); + if (response.isSucceed) { + $scope.allData = $scope.allData.concat(response.data.items); + $rootScope.isBusy = false; + $scope.canLoadMore = response.data.totalItems > $scope.allData.length; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + "use strict"; appShared.controller("MvcPostController", [ "$scope", @@ -4415,35 +4415,116 @@ appShared.controller("MvcPostController", [ }, ]); -sharedComponents.component("apiFile", { - templateUrl: "/mix-app/views/app-shared/components/api-file/api-file.html", - controller: [ - "$rootScope", - "$scope", - "Upload", - function PortalTemplateController($rootScope, $scope, uploader) { - var ctrl = this; - ctrl.accept = ctrl.accept || "application/zip"; - ctrl.selectFile = function (files) { - if (files !== undefined && files !== null && files.length > 0) { - const file = files[0]; - ctrl.postedFile = file; - } - }; - - ctrl.uploadFile = function (file) { - // Create FormData object - var files = new FormData(); - var folder = ctrl.folder; - var title = ctrl.title; - var description = ctrl.description; - // Looping over all files and add it to FormData object - files.append(file.name, file); +sharedComponents.component("addressEditor", { + templateUrl: "/mix-app/views/app-shared/components/address-editor/view.html", + bindings: { + province: "=", + provinceClass: "=?", + district: "=", + districtClass: "=?", + ward: "=", + wardClass: "=?", + }, + controller: "AddressEditorController", +}); - // Adding one more key to FormData object - files.append("fileFolder", folder); - files.append("title", title); - files.append("description", description); +sharedComponents.controller("AddressEditorController", [ + "$rootScope", + "$scope", + "ApiService", + function PortalTemplateController($rootScope, $scope, apiService) { + var ctrl = this; + ctrl.provinceEndpoint = "/rest/shared/json-data/provinces.json/true"; + ctrl.districtEndpoint = "/rest/shared/json-data/districts.json/true"; + ctrl.wardEndpoint = "/rest/shared/json-data/wards.json/true"; + ctrl.$onInit = async function () { + ctrl.provinceClass = + ctrl.provinceClass || "form-select form-control mb-3"; + ctrl.districtClass = + ctrl.districtClass || "form-select form-control mb-3"; + ctrl.wardClass = ctrl.wardClass || "form-select form-control mb-3"; + + ctrl.provinceOptions = await apiService.getApiResult({ + url: ctrl.provinceEndpoint, + }); + $scope.$apply(); + $rootScope.$watch( + () => { + return ctrl.province; + }, + async function (newVal, oldVal) { + if (newVal != oldVal || !ctrl.district) { + if (!ctrl.allDistrictOptions) { + ctrl.allDistrictOptions = await apiService.getApiResult({ + url: ctrl.districtEndpoint, + }); + ctrl.districtOptions = ctrl.allDistrictOptions.filter( + (m) => m["province"] == ctrl.province + ); + $scope.$apply(); + } else { + ctrl.districtOptions = ctrl.allDistrictOptions.filter( + (m) => m["province"] == ctrl.province + ); + } + } + } + ); + $rootScope.$watch( + () => { + return ctrl.district; + }, + async function (newVal, oldVal) { + if (newVal != oldVal) { + if (!ctrl.allWardOptions) { + ctrl.allWardOptions = await apiService.getApiResult({ + url: ctrl.wardEndpoint, + }); + ctrl.wardOptions = ctrl.allWardOptions.filter( + (m) => m["district"] == ctrl.district + ); + $scope.$apply(); + } else { + ctrl.wardOptions = ctrl.allWardOptions.filter( + (m) => m["district"] == ctrl.district + ); + } + } + } + ); + }; + }, +]); + +sharedComponents.component("apiFile", { + templateUrl: "/mix-app/views/app-shared/components/api-file/api-file.html", + controller: [ + "$rootScope", + "$scope", + "Upload", + function PortalTemplateController($rootScope, $scope, uploader) { + var ctrl = this; + ctrl.accept = ctrl.accept || "application/zip"; + ctrl.selectFile = function (files) { + if (files !== undefined && files !== null && files.length > 0) { + const file = files[0]; + ctrl.postedFile = file; + } + }; + + ctrl.uploadFile = function (file) { + // Create FormData object + var files = new FormData(); + var folder = ctrl.folder; + var title = ctrl.title; + var description = ctrl.description; + // Looping over all files and add it to FormData object + files.append(file.name, file); + + // Adding one more key to FormData object + files.append("fileFolder", folder); + files.append("title", title); + files.append("description", description); $.ajax({ url: "/" + $rootScope.localizeSettings.lang + "/media/upload", //'/tts/UploadImage', type: "POST", @@ -4495,20 +4576,6 @@ sharedComponents.component("apiFile", { }, }); -sharedComponents.component("breadcrumbs", { - templateUrl: - "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], - bindings: { - breadCrumbs: "=", - }, -}); - sharedComponents.component("azureStorage", { templateUrl: "/mix-app/views/app-shared/components/azure-storage/view.html", bindings: { @@ -4617,87 +4684,20 @@ sharedComponents.component("azureStorage", { ], }); -sharedComponents.component("addressEditor", { - templateUrl: "/mix-app/views/app-shared/components/address-editor/view.html", +sharedComponents.component("breadcrumbs", { + templateUrl: + "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + }, + ], bindings: { - province: "=", - provinceClass: "=?", - district: "=", - districtClass: "=?", - ward: "=", - wardClass: "=?", + breadCrumbs: "=", }, - controller: "AddressEditorController", }); -sharedComponents.controller("AddressEditorController", [ - "$rootScope", - "$scope", - "ApiService", - function PortalTemplateController($rootScope, $scope, apiService) { - var ctrl = this; - ctrl.provinceEndpoint = "/rest/shared/json-data/provinces.json/true"; - ctrl.districtEndpoint = "/rest/shared/json-data/districts.json/true"; - ctrl.wardEndpoint = "/rest/shared/json-data/wards.json/true"; - ctrl.$onInit = async function () { - ctrl.provinceClass = - ctrl.provinceClass || "form-select form-control mb-3"; - ctrl.districtClass = - ctrl.districtClass || "form-select form-control mb-3"; - ctrl.wardClass = ctrl.wardClass || "form-select form-control mb-3"; - - ctrl.provinceOptions = await apiService.getApiResult({ - url: ctrl.provinceEndpoint, - }); - $scope.$apply(); - $rootScope.$watch( - () => { - return ctrl.province; - }, - async function (newVal, oldVal) { - if (newVal != oldVal || !ctrl.district) { - if (!ctrl.allDistrictOptions) { - ctrl.allDistrictOptions = await apiService.getApiResult({ - url: ctrl.districtEndpoint, - }); - ctrl.districtOptions = ctrl.allDistrictOptions.filter( - (m) => m["province"] == ctrl.province - ); - $scope.$apply(); - } else { - ctrl.districtOptions = ctrl.allDistrictOptions.filter( - (m) => m["province"] == ctrl.province - ); - } - } - } - ); - $rootScope.$watch( - () => { - return ctrl.district; - }, - async function (newVal, oldVal) { - if (newVal != oldVal) { - if (!ctrl.allWardOptions) { - ctrl.allWardOptions = await apiService.getApiResult({ - url: ctrl.wardEndpoint, - }); - ctrl.wardOptions = ctrl.allWardOptions.filter( - (m) => m["district"] == ctrl.district - ); - $scope.$apply(); - } else { - ctrl.wardOptions = ctrl.allWardOptions.filter( - (m) => m["district"] == ctrl.district - ); - } - } - } - ); - }; - }, -]); - sharedComponents.component("checkboxSwitch", { templateUrl: "/mix-app/views/app-shared/components/checkbox-switch/view.html", controller: [ @@ -4734,6 +4734,63 @@ sharedComponents.component("cultures", { }, }); +sharedComponents.component("swDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/data-preview/data-preview.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + }, + ], + bindings: { + type: "=", + value: "=", + }, +}); + +"use trick"; +sharedComponents.directive("pane", function () { + return { + require: "^tabs", + restrict: "E", + transclude: true, + scope: { title: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
' + + "
", + replace: true, + }; +}); + +sharedComponents.directive("tabs", function () { + return { + restrict: "E", + transclude: true, + scope: {}, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/templates/tabs.html", + replace: true, + }; +}); + //sharedComponents.controller('ImageController', ); sharedComponents.component("customFile", { templateUrl: @@ -4864,61 +4921,35 @@ sharedComponents.component("customFile", { ], }); -sharedComponents.component("swDataPreview", { - templateUrl: - "/mix-app/views/app-shared/components/data-preview/data-preview.html", +sharedComponents.component("goToTop", { + templateUrl: "/mix-app/views/app-shared/components/go-to-top/view.html", controller: [ "$rootScope", - function ($rootScope) { + "$scope", + function ($rootScope, $scope) { var ctrl = this; - }, - ], - bindings: { - type: "=", - value: "=", - }, -}); - -"use trick"; -sharedComponents.directive("pane", function () { - return { - require: "^tabs", - restrict: "E", - transclude: true, - scope: { title: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
' + - "
", - replace: true, - }; -}); - -sharedComponents.directive("tabs", function () { - return { - restrict: "E", - transclude: true, - scope: {}, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; + ctrl.$onInit = function () { + $(window).scroll(function () { + if ($(window).scrollTop() >= 50) { + // If page is scrolled more than 50px + $("#return-to-top").fadeIn(200); // Fade in the arrow + } else { + $("#return-to-top").fadeOut(200); // Else fade out the arrow + } }); - pane.selected = true; }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); + ctrl.goToTop = function () { + // ===== Scroll to Top ==== + $("body,html").animate( + { + scrollTop: 0, // Scroll to top of body + }, + 500 + ); }; }, - templateUrl: "/mix-app/views/app-shared/components/templates/tabs.html", - replace: true, - }; + ], + bindings: {}, }); sharedComponents.component("fbLogin", { @@ -4999,35 +5030,56 @@ sharedComponents.component("fbLogin", { ], }); -sharedComponents.component("goToTop", { - templateUrl: "/mix-app/views/app-shared/components/go-to-top/view.html", +sharedComponents.component("limitString", { + templateUrl: + "/mix-app/views/app-shared/components/limit-string/limit-string.html", controller: [ "$rootScope", "$scope", - function ($rootScope, $scope) { + "ngAppSettings", + function ($rootScope, $scope, ngAppSettings) { var ctrl = this; - ctrl.$onInit = function () { - $(window).scroll(function () { - if ($(window).scrollTop() >= 50) { - // If page is scrolled more than 50px - $("#return-to-top").fadeIn(200); // Fade in the arrow + ctrl.shortenString = ""; + ctrl.previousContentId = undefined; + + this.$onInit = () => { + ctrl.previousContentId = angular.copy(ctrl.contentId); + }; + + this.$doCheck = () => { + if (ctrl.contentId !== ctrl.previousContentId) { + ctrl.loadModuleData(); + ctrl.previousContentId = ctrl.contentId; + } + }; + ctrl.shortString = function () { + var data = decodeURIComponent(ctrl.content); + if (data) { + if (ctrl.max < data.length) { + ctrl.shortenString = + data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; } else { - $("#return-to-top").fadeOut(200); // Else fade out the arrow + ctrl.shortenString = data.replace(/[+]/g, " "); } - }); + } }; - ctrl.goToTop = function () { - // ===== Scroll to Top ==== - $("body,html").animate( - { - scrollTop: 0, // Scroll to top of body - }, - 500 - ); + ctrl.view = function () { + var obj = { + moduleId: ctrl.moduleId, + id: ctrl.contentId, + }; + $rootScope.preview("module-data", obj, null, "modal-lg"); }; + ctrl.translate = $rootScope.translate; }, ], - bindings: {}, + bindings: { + content: "=", + showData: "=", + max: "=", + moduleId: "=", + contentId: "=", + }, }); sharedComponents.component("googlePay", { @@ -5241,58 +5293,6 @@ sharedComponents.component("googlePay", { }); })(window.angular); -sharedComponents.component("limitString", { - templateUrl: - "/mix-app/views/app-shared/components/limit-string/limit-string.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - function ($rootScope, $scope, ngAppSettings) { - var ctrl = this; - ctrl.shortenString = ""; - ctrl.previousContentId = undefined; - - this.$onInit = () => { - ctrl.previousContentId = angular.copy(ctrl.contentId); - }; - - this.$doCheck = () => { - if (ctrl.contentId !== ctrl.previousContentId) { - ctrl.loadModuleData(); - ctrl.previousContentId = ctrl.contentId; - } - }; - ctrl.shortString = function () { - var data = decodeURIComponent(ctrl.content); - if (data) { - if (ctrl.max < data.length) { - ctrl.shortenString = - data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; - } else { - ctrl.shortenString = data.replace(/[+]/g, " "); - } - } - }; - ctrl.view = function () { - var obj = { - moduleId: ctrl.moduleId, - id: ctrl.contentId, - }; - $rootScope.preview("module-data", obj, null, "modal-lg"); - }; - ctrl.translate = $rootScope.translate; - }, - ], - bindings: { - content: "=", - showData: "=", - max: "=", - moduleId: "=", - contentId: "=", - }, -}); - appShared.component("loginPopup", { templateUrl: "/mix-app/views/app-shared/components/login-popup/view.html", controller: "LoginPopupController", @@ -5736,282 +5736,15 @@ sharedComponents.component("message", { }, }); -"use strict"; -appShared.controller("MessengerController", [ - "$scope", - function ($scope) { - BaseHub.call(this, $scope); - $scope.user = { - loggedIn: false, - info: {}, - }; - $scope.isHide = true; - $scope.hideContact = true; - $scope.members = []; - $scope.messages = []; - $scope.message = { connection: {}, content: "" }; - $scope.request = { - uid: "", - objectType: null, - action: "", - data: {}, - room: "", - isMyself: false, - }; - $scope.loadMsgButton = function () {}; - $scope.init = function () { - $scope.startConnection("MixChatHub", $scope.checkLoginStatus); - - $("button").on("click", function () { - var text = $("#message").val(); - var hnow = new Date().getHours(); - var mnow = new Date().getMinutes(); - mnow = mnow < 10 ? "0" + mnow : mnow; - var d = hnow + ":" + mnow; - - if (text.length > 0) { - $("#message").css("border", "1px solid #f4f5f9"); - $("#conversation").append( - "
  • You
    " + - text + - "
    " + - d + - "
  • " - ); - $("#message").val(""); - $(".widget-conversation").scrollTop( - $("ul li").last().position().top + $("ul li").last().height() - ); - } else { - $("#message").css("border", "1px solid #eb9f9f"); - $("#message").animate({ opacity: "0.1" }, "slow"); - $("#message").animate({ opacity: "1" }, "slow"); - $("#message").animate({ opacity: "0.1" }, "slow"); - $("#message").animate({ opacity: "1" }, "slow"); - } - }); - - // var _createClass = function () {function defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}return function (Constructor, protoProps, staticProps) {if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;};}();function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}var HoverButton = function () { - // function HoverButton(el) {_classCallCheck(this, HoverButton); - // this.el = el; - // this.hover = false; - // this.calculatePosition(); - // this.attachEventsListener(); - // }_createClass(HoverButton, [{ key: 'attachEventsListener', value: function attachEventsListener() - - // {var _this = this; - // window.addEventListener('mousemove', function (e) {return _this.onMouseMove(e);}); - // window.addEventListener('resize', function (e) {return _this.calculatePosition(e);}); - // } }, { key: 'calculatePosition', value: function calculatePosition() - - // { - - // var box = this.el.getBoundingClientRect(); - // this.x = box.left + box.width * 0.5; - // this.y = box.top + box.height * 0.5; - // this.width = box.width; - // this.height = box.height; - // } }, { key: 'onMouseMove', value: function onMouseMove( - - // e) { - // var hover = false; - // var hoverArea = this.hover ? 0.7 : 0.5; - // var x = e.clientX - this.x; - // var y = e.clientY - this.y; - // var distance = Math.sqrt(x * x + y * y); - // if (distance < this.width * hoverArea) { - // hover = true; - // if (!this.hover) { - // this.hover = true; - // } - // this.onHover(e.clientX, e.clientY); - // } - - // if (!hover && this.hover) { - // this.onLeave(); - // this.hover = false; - // } - // } }, { key: 'onHover', value: function onHover( - - // x, y) { - // TweenMax.to(this.el, 0.4, { - // x: (x - this.x) * 0.4, - // y: (y - this.y) * 0.4, - // scale: 1.15, - // ease: Power2.easeOut }); - - // this.el.style.zIndex = 10; - // } }, { key: 'onLeave', value: function onLeave() - // { - // TweenMax.to(this.el, 0.7, { - // x: 0, - // y: 0, - // scale: 1, - // ease: Elastic.easeOut.config(1.2, 0.4) }); - - // this.el.style.zIndex = 1; - // } }]);return HoverButton;}(); - - // var btn1 = document.querySelector('#quest'); - // new HoverButton(btn1); - }; - $scope.logout = function () { - FB.logout(function (response) { - // user is now logged out - $scope.user.loggedIn = false; - }); - }; - $scope.login = function () { - FB.login(function (response) { - if (response.authResponse) { - FB.api("/me", function (response) { - $scope.user.info.name = response.name; - $scope.user.info.id = response.id; - $scope.user.info.avatar = - "//graph.facebook.com/" + - response.id + - "/picture?width=32&height=32"; - $scope.join(); - $scope.$apply(); - }); - } else { - console.log("User cancelled login or did not fully authorize."); - } - }); - }; - $scope.join = function () { - $scope.request.uid = $scope.user.info.id; - $scope.request.data = $scope.user.info; - $scope.message.connection = $scope.user.info; - $scope.connection.invoke("join", $scope.request); - }; - $scope.toggle = function () { - $scope.isHide = !$scope.isHide; - }; - $scope.toggleContact = function () { - $scope.hideContact = !$scope.hideContact; - }; - $scope.sendMessage = function () { - if ($scope.user.loggedIn) { - $scope.request.data = $scope.message; - $scope.connection.invoke("sendMessage", $scope.request); - $scope.message.content = ""; - } - }; - $scope.receiveMessage = function (msg) { - //$scope.responses.splice(0, 0, msg); - switch (msg.responseKey) { - case "NewMember": - $scope.newMember(msg.data); - $(".widget-conversation").scrollTop = $( - ".widget-conversation" - )[0].scrollHeight; - break; - - case "NewMessage": - $scope.newMessage(msg.data); - break; - case "ConnectSuccess": - $scope.user.loggedIn = true; - $scope.initList(msg.data); - $scope.$apply(); - break; - - case "MemberOffline": - $scope.removeMember(msg.data); - break; - } - }; - $scope.checkLoginStatus = function () { - FB.getLoginStatus(function (response) { - if (response.status === "connected") { - // The user is logged in and has authenticated your - // app, and response.authResponse supplies - // the user's ID, a valid access token, a signed - // request, and the time the access token - // and signed request each expire. - FB.api("/me", function (response) { - $scope.user.info.name = response.name; - $scope.user.info.id = response.id; - $scope.user.info.avatar = - "//graph.facebook.com/" + - response.id + - "/picture?width=32&height=32"; - $scope.join(); - $scope.$apply(); - }); - } else if (response.status === "authorization_expired") { - // The user has signed into your application with - // Facebook Login but must go through the login flow - // again to renew data authorization. You might remind - // the user they've used Facebook, or hide other options - // to avoid duplicate account creation, but you should - // collect a user gesture (e.g. click/touch) to launch the - // login dialog so popup blocking is not triggered. - } else if (response.status === "not_authorized") { - // The user hasn't authorized your application. They - // must click the Login button, or you must call FB.login - // in response to a user gesture, to launch a login dialog. - } else { - // The user isn't logged in to Facebook. You can launch a - // login dialog with a user gesture, but the user may have - // to log in to Facebook before authorizing your application. - } - }); - }; - $scope.newMember = function (member) { - var index = $scope.members.findIndex((x) => x.id === member.id); - if (index < 0) { - $scope.members.splice(0, 0, member); - } - $scope.$apply(); - }; - - $scope.initList = function (data) { - data.forEach((member) => { - var index = $scope.members.findIndex((x) => x.id === member.id); - if (index < 0) { - $scope.members.splice(0, 0, member); - } - }); - - $scope.$apply(); - }; - - $scope.removeMember = function (memberId) { - var index = $scope.members.findIndex((x) => x.id === memberId); - if (index >= 0) { - $scope.members.splice(index, 1); - } - $scope.$apply(); - }; - - $scope.newMessage = function (msg) { - $scope.messages.push(msg); - $scope.$apply(); - var objDiv = document.getElementsByClassName("widget-conversation")[0]; - objDiv.scrollTop = objDiv.scrollHeight + 20; - }; - }, -]); - -sharedComponents.component("messenger", { - templateUrl: "/mix-app/views/app-shared/components/messenger/index.html", - controller: "MessengerController", - bindings: { - message: "=", - }, -}); - -sharedComponents.component("messengerPrivate", { - templateUrl: - "/mix-app/views/app-shared/components/messenger-private/index.html", - controller: "MessengerController", - bindings: { - message: "=", - connectionId: "=", - }, -}); +sharedComponents.component("messengerPrivate", { + templateUrl: + "/mix-app/views/app-shared/components/messenger-private/index.html", + controller: "MessengerController", + bindings: { + message: "=", + connectionId: "=", + }, +}); sharedComponents.component("mixColumnEditor", { templateUrl: @@ -6233,53 +5966,271 @@ sharedComponents.component("mixColumnEditor", { ], }); -sharedComponents.component("mixColumnPreview", { - templateUrl: - "/mix-app/views/app-shared/components/mix-column-preview/view.html", - bindings: { - model: "=", - column: "=", - isShowTitle: "=?", - inputClass: "=?", - }, - controller: [ - "$rootScope", - "$sce", - function ($rootScope, $sce) { - var ctrl = this; - ctrl.previousId = null; - ctrl.$onInit = function () { - ctrl.uuid = $rootScope.generateUUID(); - if (ctrl.column.isEncrypt) { - var obj = $rootScope.testJSON(ctrl.model); - if (obj) { - ctrl.encryptedData = obj; - ctrl.model = ctrl.encryptedData.data; - ctrl.decrypted = $rootScope.decrypt(ctrl.encryptedData); - } - } - if (ctrl.column.dataType == 20 && ctrl.model) { - // youtube video - ctrl.model = $sce.trustAsResourceUrl( - "https://www.youtube.com/embed/" + - ctrl.model + - "?rel=0&showinfo=0&autoplay=0" - ); - } - // if(ctrl.column.dataType == 24 && ctrl.model) // youtube video - // { - // ctrl.generateQRCode(); - // } - }; - - ctrl.generateQRCode = function () { - setTimeout(() => { - $("#" + ctrl.uuid).empty(); - $("#" + ctrl.uuid).qrcode(ctrl.model); - }, 200); - }; - }, - ], +"use strict"; +appShared.controller("MessengerController", [ + "$scope", + function ($scope) { + BaseHub.call(this, $scope); + $scope.user = { + loggedIn: false, + info: {}, + }; + $scope.isHide = true; + $scope.hideContact = true; + $scope.members = []; + $scope.messages = []; + $scope.message = { connection: {}, content: "" }; + $scope.request = { + uid: "", + objectType: null, + action: "", + data: {}, + room: "", + isMyself: false, + }; + $scope.loadMsgButton = function () {}; + $scope.init = function () { + $scope.startConnection("MixChatHub", $scope.checkLoginStatus); + + $("button").on("click", function () { + var text = $("#message").val(); + var hnow = new Date().getHours(); + var mnow = new Date().getMinutes(); + mnow = mnow < 10 ? "0" + mnow : mnow; + var d = hnow + ":" + mnow; + + if (text.length > 0) { + $("#message").css("border", "1px solid #f4f5f9"); + $("#conversation").append( + "
  • You
    " + + text + + "
    " + + d + + "
  • " + ); + $("#message").val(""); + $(".widget-conversation").scrollTop( + $("ul li").last().position().top + $("ul li").last().height() + ); + } else { + $("#message").css("border", "1px solid #eb9f9f"); + $("#message").animate({ opacity: "0.1" }, "slow"); + $("#message").animate({ opacity: "1" }, "slow"); + $("#message").animate({ opacity: "0.1" }, "slow"); + $("#message").animate({ opacity: "1" }, "slow"); + } + }); + + // var _createClass = function () {function defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}return function (Constructor, protoProps, staticProps) {if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;};}();function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}var HoverButton = function () { + // function HoverButton(el) {_classCallCheck(this, HoverButton); + // this.el = el; + // this.hover = false; + // this.calculatePosition(); + // this.attachEventsListener(); + // }_createClass(HoverButton, [{ key: 'attachEventsListener', value: function attachEventsListener() + + // {var _this = this; + // window.addEventListener('mousemove', function (e) {return _this.onMouseMove(e);}); + // window.addEventListener('resize', function (e) {return _this.calculatePosition(e);}); + // } }, { key: 'calculatePosition', value: function calculatePosition() + + // { + + // var box = this.el.getBoundingClientRect(); + // this.x = box.left + box.width * 0.5; + // this.y = box.top + box.height * 0.5; + // this.width = box.width; + // this.height = box.height; + // } }, { key: 'onMouseMove', value: function onMouseMove( + + // e) { + // var hover = false; + // var hoverArea = this.hover ? 0.7 : 0.5; + // var x = e.clientX - this.x; + // var y = e.clientY - this.y; + // var distance = Math.sqrt(x * x + y * y); + // if (distance < this.width * hoverArea) { + // hover = true; + // if (!this.hover) { + // this.hover = true; + // } + // this.onHover(e.clientX, e.clientY); + // } + + // if (!hover && this.hover) { + // this.onLeave(); + // this.hover = false; + // } + // } }, { key: 'onHover', value: function onHover( + + // x, y) { + // TweenMax.to(this.el, 0.4, { + // x: (x - this.x) * 0.4, + // y: (y - this.y) * 0.4, + // scale: 1.15, + // ease: Power2.easeOut }); + + // this.el.style.zIndex = 10; + // } }, { key: 'onLeave', value: function onLeave() + // { + // TweenMax.to(this.el, 0.7, { + // x: 0, + // y: 0, + // scale: 1, + // ease: Elastic.easeOut.config(1.2, 0.4) }); + + // this.el.style.zIndex = 1; + // } }]);return HoverButton;}(); + + // var btn1 = document.querySelector('#quest'); + // new HoverButton(btn1); + }; + $scope.logout = function () { + FB.logout(function (response) { + // user is now logged out + $scope.user.loggedIn = false; + }); + }; + $scope.login = function () { + FB.login(function (response) { + if (response.authResponse) { + FB.api("/me", function (response) { + $scope.user.info.name = response.name; + $scope.user.info.id = response.id; + $scope.user.info.avatar = + "//graph.facebook.com/" + + response.id + + "/picture?width=32&height=32"; + $scope.join(); + $scope.$apply(); + }); + } else { + console.log("User cancelled login or did not fully authorize."); + } + }); + }; + $scope.join = function () { + $scope.request.uid = $scope.user.info.id; + $scope.request.data = $scope.user.info; + $scope.message.connection = $scope.user.info; + $scope.connection.invoke("join", $scope.request); + }; + $scope.toggle = function () { + $scope.isHide = !$scope.isHide; + }; + $scope.toggleContact = function () { + $scope.hideContact = !$scope.hideContact; + }; + $scope.sendMessage = function () { + if ($scope.user.loggedIn) { + $scope.request.data = $scope.message; + $scope.connection.invoke("sendMessage", $scope.request); + $scope.message.content = ""; + } + }; + $scope.receiveMessage = function (msg) { + //$scope.responses.splice(0, 0, msg); + switch (msg.responseKey) { + case "NewMember": + $scope.newMember(msg.data); + $(".widget-conversation").scrollTop = $( + ".widget-conversation" + )[0].scrollHeight; + break; + + case "NewMessage": + $scope.newMessage(msg.data); + break; + case "ConnectSuccess": + $scope.user.loggedIn = true; + $scope.initList(msg.data); + $scope.$apply(); + break; + + case "MemberOffline": + $scope.removeMember(msg.data); + break; + } + }; + $scope.checkLoginStatus = function () { + FB.getLoginStatus(function (response) { + if (response.status === "connected") { + // The user is logged in and has authenticated your + // app, and response.authResponse supplies + // the user's ID, a valid access token, a signed + // request, and the time the access token + // and signed request each expire. + FB.api("/me", function (response) { + $scope.user.info.name = response.name; + $scope.user.info.id = response.id; + $scope.user.info.avatar = + "//graph.facebook.com/" + + response.id + + "/picture?width=32&height=32"; + $scope.join(); + $scope.$apply(); + }); + } else if (response.status === "authorization_expired") { + // The user has signed into your application with + // Facebook Login but must go through the login flow + // again to renew data authorization. You might remind + // the user they've used Facebook, or hide other options + // to avoid duplicate account creation, but you should + // collect a user gesture (e.g. click/touch) to launch the + // login dialog so popup blocking is not triggered. + } else if (response.status === "not_authorized") { + // The user hasn't authorized your application. They + // must click the Login button, or you must call FB.login + // in response to a user gesture, to launch a login dialog. + } else { + // The user isn't logged in to Facebook. You can launch a + // login dialog with a user gesture, but the user may have + // to log in to Facebook before authorizing your application. + } + }); + }; + $scope.newMember = function (member) { + var index = $scope.members.findIndex((x) => x.id === member.id); + if (index < 0) { + $scope.members.splice(0, 0, member); + } + $scope.$apply(); + }; + + $scope.initList = function (data) { + data.forEach((member) => { + var index = $scope.members.findIndex((x) => x.id === member.id); + if (index < 0) { + $scope.members.splice(0, 0, member); + } + }); + + $scope.$apply(); + }; + + $scope.removeMember = function (memberId) { + var index = $scope.members.findIndex((x) => x.id === memberId); + if (index >= 0) { + $scope.members.splice(index, 1); + } + $scope.$apply(); + }; + + $scope.newMessage = function (msg) { + $scope.messages.push(msg); + $scope.$apply(); + var objDiv = document.getElementsByClassName("widget-conversation")[0]; + objDiv.scrollTop = objDiv.scrollHeight + 20; + }; + }, +]); + +sharedComponents.component("messenger", { + templateUrl: "/mix-app/views/app-shared/components/messenger/index.html", + controller: "MessengerController", + bindings: { + message: "=", + }, }); sharedComponents.component("mixDataPreview", { @@ -6298,6 +6249,55 @@ sharedComponents.component("mixDataPreview", { }, }); +sharedComponents.component("mixColumnPreview", { + templateUrl: + "/mix-app/views/app-shared/components/mix-column-preview/view.html", + bindings: { + model: "=", + column: "=", + isShowTitle: "=?", + inputClass: "=?", + }, + controller: [ + "$rootScope", + "$sce", + function ($rootScope, $sce) { + var ctrl = this; + ctrl.previousId = null; + ctrl.$onInit = function () { + ctrl.uuid = $rootScope.generateUUID(); + if (ctrl.column.isEncrypt) { + var obj = $rootScope.testJSON(ctrl.model); + if (obj) { + ctrl.encryptedData = obj; + ctrl.model = ctrl.encryptedData.data; + ctrl.decrypted = $rootScope.decrypt(ctrl.encryptedData); + } + } + if (ctrl.column.dataType == 20 && ctrl.model) { + // youtube video + ctrl.model = $sce.trustAsResourceUrl( + "https://www.youtube.com/embed/" + + ctrl.model + + "?rel=0&showinfo=0&autoplay=0" + ); + } + // if(ctrl.column.dataType == 24 && ctrl.model) // youtube video + // { + // ctrl.generateQRCode(); + // } + }; + + ctrl.generateQRCode = function () { + setTimeout(() => { + $("#" + ctrl.uuid).empty(); + $("#" + ctrl.uuid).qrcode(ctrl.model); + }, 200); + }; + }, + ], +}); + sharedComponents.component("mixDataTable", { templateUrl: "/mix-app/views/app-shared/components/mix-data-table/mix-data-table.html", @@ -6919,6 +6919,76 @@ sharedComponents.component("mixLoader", { }, }); +"use strict"; +appShared.controller("ModalPostController", [ + "$scope", + "$rootScope", + "$location", + "ngAppSettings", + "$routeParams", + "PostRestService", + function ( + $scope, + $rootScope, + $location, + ngAppSettings, + $routeParams, + service + ) { + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); + $scope.columns = [ + { + title: "Title", + name: "title", + filter: true, + type: "string", + }, + { + title: "Url", + name: "imageUrl", + filter: true, + type: "upload", + }, + ]; + }, +]); + +"use strict"; +appShared.factory("ModalPostRestService", [ + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($rootScope, apiService, commonService, baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("page-post"); + return serviceFactory; + }, +]); + +sharedComponents.component("modalPosts", { + templateUrl: + "/mix-app/views/app-shared/components/modal-posts/modal-posts.html", + controller: "ModalPostController", + bindings: { + data: "=", + childName: "=", + canDrag: "=", + editUrl: "=", + columns: "=", + onDelete: "&", + onUpdateInfos: "&", + onUpdateChildInfos: "&", + }, +}); + sharedComponents.component("mixModuleDataTable", { templateUrl: "/mix-app/views/app-shared/components/mix-module-data-table/mix-module-data-table.html", @@ -6986,394 +7056,44 @@ sharedComponents.component("mixModuleDataTable", { ctrl.view = function (moduleId, contentId) { var obj = { moduleId: moduleId, - id: contentId, - }; - $rootScope.preview("module-data", obj, null, "modal-lg"); - }; - }, - ], - bindings: { - moduleId: "=", - data: "=", - childName: "=", - canDrag: "=", - editUrl: "=", - columns: "=", - onDelete: "&", - // onUpdateInfos: '&', - onUpdateChildInfos: "&", - }, -}); - -sharedComponents.component("mixSelect", { - templateUrl: "/mix-app/views/app-shared/components/mix-select/view.html", - bindings: { - options: "=", - model: "=", - allowNull: "=?", - callback: "&?", - }, - controller: [ - "$rootScope", - "$scope", - function PortalTemplateController($rootScope, $scope) { - var ctrl = this; - ctrl.onSelect = function () { - ctrl.callback({ type: ctrl.model }); - }; - }, - ], -}); - -// sharedComponents.component('modalConfirm', { -// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', -// controller: ModalConfirmController, -// bindings: { -// message: '=' -// } -// }); -function ModalConfirmController($rootScope, $scope, $mdDialog, message) { - $scope.message = message; - $scope.executeFunctionByName = async function (functionName, args, context) { - var result = await $rootScope.executeFunctionByName( - functionName, - args, - context - ); - if (result) { - $scope.$apply(); - } - $mdDialog.hide(); - }; - $scope.closeDialog = function () { - $mdDialog.hide(); - }; -} - -"use strict"; -appShared.controller("ModalPostController", [ - "$scope", - "$rootScope", - "$location", - "ngAppSettings", - "$routeParams", - "PostRestService", - function ( - $scope, - $rootScope, - $location, - ngAppSettings, - $routeParams, - service - ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.columns = [ - { - title: "Title", - name: "title", - filter: true, - type: "string", - }, - { - title: "Url", - name: "imageUrl", - filter: true, - type: "upload", - }, - ]; - }, -]); - -"use strict"; -appShared.factory("ModalPostRestService", [ - "$rootScope", - "ApiService", - "CommonService", - "BaseService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - return serviceFactory; - }, -]); - -sharedComponents.component("modalPosts", { - templateUrl: - "/mix-app/views/app-shared/components/modal-posts/modal-posts.html", - controller: "ModalPostController", + id: contentId, + }; + $rootScope.preview("module-data", obj, null, "modal-lg"); + }; + }, + ], bindings: { + moduleId: "=", data: "=", childName: "=", canDrag: "=", editUrl: "=", columns: "=", onDelete: "&", - onUpdateInfos: "&", + // onUpdateInfos: '&', onUpdateChildInfos: "&", }, }); -sharedComponents.controller( - "ModalCroppieController", - function ( - $rootScope, - $scope, - $http, - $uibModalInstance, - mediaService, - file, - w, - h, - rto, - autoSave - ) { - var ctrl = this; - ctrl.autoSave = autoSave; - ctrl.maxW = 400; - ctrl.file = file; - ctrl.w = w; - ctrl.h = h; - ctrl.rto = rto; - ctrl.isAdmin = $rootScope.isAdmin; - ctrl.postedFile = {}; - ctrl.isImage = false; - ctrl.mediaNavs = []; - ctrl.media = { - title: "", - mediaFile: { - file: null, - }, - }; - ctrl.image_placeholder = "/mix-app/assets/img/image_placeholder.jpg"; - ctrl.options = null; - ctrl.init = function () { - ctrl.srcUrl = ctrl.srcUrl || ctrl.image_placeholder; - ctrl.maxHeight = ctrl.maxHeight || "2000px"; - ctrl.id = Math.floor(Math.random() * 100); - ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); - ctrl.cropped = { - source: null, - }; - if (ctrl.frameUrl) { - ctrl.frame = ctrl.loadImage(frameUrl); - } - - if (ctrl.srcUrl) { - ctrl.loadBase64(ctrl.srcUrl); - } - - if (ctrl.file) { - setTimeout(() => { - ctrl.selectFile([ctrl.file]); - }, 500); - } - - // Assign blob to component when selecting a image - }; - - ctrl.loadFromUrl = function () { - if (ctrl.src !== ctrl.srcUrl && ctrl.srcUrl != ctrl.image_placeholder) { - ctrl.src = ctrl.srcUrl; - ctrl.isImage = ctrl.srcUrl - .toLowerCase() - .match(/([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|svg)/g); - if (ctrl.isImage) { - ctrl.loadBase64(ctrl.srcUrl); - } - } - }; - - ctrl.origin = function () { - $uibModalInstance.close(); - }; - - ctrl.ok = async function () { - if (!ctrl.autoSave) { - $uibModalInstance.close(ctrl.cropped.image); - } else { - ctrl.media.fileFolder = ctrl.folder || "Media"; - ctrl.media.fileName = ctrl.media.mediaFile.fileName; - ctrl.media.extension = ctrl.media.mediaFile.extension; - ctrl.media.mediaFile.fileStream = ctrl.cropped.image; - var result = await mediaService.save(ctrl.media); - if (result.isSucceed) { - $uibModalInstance.close(result.data); - } - } - }; - - ctrl.cancel = function () { - $uibModalInstance.dismiss("cancel"); - }; - ctrl.combineImage = function () { - ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); - if (ctrl.canvas) { - var img = document.getElementById("croppie-src"); - var w = ctrl.options.boundary.width; - var h = ctrl.options.boundary.height; - // var rto = w / h; - var newW = ctrl.options.output.width; - var newH = ctrl.options.output.height; - var ctx = ctrl.canvas.getContext("2d"); - ctx.imageSmoothingEnabled = true; - ctx.drawImage(img, 0, 0, newW, newH); - if (ctrl.frame) { - // combine with frame - ctx.drawImage(ctrl.frame, 0, 0, w, h); - } - - $scope.$apply(function () { - ctrl.postedFile.fileStream = ctrl.canvas.toDataURL(); //ctx.getImageData(0, 0, 300, 350); - ctrl.imgUrl = ctrl.postedFile.fileStream.replace( - "image/png", - "image/octet-stream" - ); - }); - } - }; - ctrl.saveCanvas = function () { - var link = document.createElement("a"); - link.download = ctrl.postedFile.fileName + ctrl.postedFile.extension; - $rootScope.isBusy = true; - ctrl.canvas.toBlob(function (blob) { - link.href = URL.createObjectURL(blob); - link.click(); - $rootScope.isBusy = false; - $scope.$apply(); - }, "image/png"); - }; - ctrl._arrayBufferToBase64 = function (buffer) { - var binary = ""; - var bytes = new Uint8Array(buffer); - var len = bytes.byteLength; - for (var i = 0; i < len; i++) { - binary += String.fromCharCode(bytes[i]); - } - return window.btoa(binary); - }; - - ctrl.selectFile = function (files) { - if (files !== undefined && files !== null && files.length > 0) { - const file = files[0]; - ctrl.media.folder = ctrl.folder ? ctrl.folder : "Media"; - ctrl.media.title = ctrl.title ? ctrl.title : file.name; - ctrl.media.description = ctrl.description ? ctrl.description : ""; - ctrl.media.mediaFile.fileName = file.name.substring( - 0, - file.name.lastIndexOf(".") - ); - ctrl.media.mediaFile.extension = file.name.substring( - file.name.lastIndexOf(".") - ); - ctrl.getBase64(file); - // if (file.size < 100000) { - // var msg = "Please choose a better photo (larger than 100kb)!"; - // $rootScope.showConfirm(ctrl, null, [], null, null, msg); - // } else { - // } - } - }; - ctrl.loadBase64 = function (url) { - var ext = url.substring(url.lastIndexOf(".") + 1); - $http({ - method: "GET", - url: url, - responseType: "arraybuffer", - }).then(function (resp) { - var base64 = `data:image/${ext};base64,${ctrl._arrayBufferToBase64( - resp.data - )}`; - var image = new Image(); - image.src = base64; - image.onload = function () { - // access image size here - ctrl.originW = this.width; - ctrl.originH = this.height; - - ctrl.loadImageSize(this.width, this.height); - ctrl.cropped.source = base64; - $scope.$apply(); - }; - return base64; - }); - }; - ctrl.getBase64 = function (file) { - if (file !== null) { - $rootScope.isBusy = true; - var reader = new FileReader(); - reader.readAsDataURL(file); - // ctrl.cropped.source = null; - reader.onload = function () { - if (ctrl.media.mediaFile) { - ctrl.media.mediaFile.fileName = file.name.substring( - 0, - file.name.lastIndexOf(".") - ); - ctrl.media.mediaFile.extension = file.name.substring( - file.name.lastIndexOf(".") - ); - // ctrl.postedFile.fileStream = reader.result; - } - var image = new Image(); - image.src = reader.result; - - image.onload = function () { - // access image size here - ctrl.originW = this.width; - ctrl.originH = this.height; - ctrl.loadImageSize(this.width, this.height); - ctrl.cropped.source = reader.result; - $rootScope.isBusy = false; - $scope.$apply(); - }; - }; - reader.onerror = function (error) { - $rootScope.isBusy = false; - $rootScope.showErrors([error]); - }; - } else { - return null; - } - }; - ctrl.loadImageSize = function (w, h) { - // const maxW = ctrl.w + 100; - w = w || ctrl.originW; - h = h || ctrl.originH; - var rto = w / h; - ctrl.rto = ctrl.rto || rto; - ctrl.w = ctrl.w || w; - ctrl.h = ctrl.w / ctrl.rto; - ctrl.options = { - boundary: { height: ctrl.maxW / rto, width: ctrl.maxW }, - render: { height: ctrl.maxW / rto, width: ctrl.maxW }, - output: { height: ctrl.h, width: ctrl.h * ctrl.rto }, +sharedComponents.component("mixSelect", { + templateUrl: "/mix-app/views/app-shared/components/mix-select/view.html", + bindings: { + options: "=", + model: "=", + allowNull: "=?", + callback: "&?", + }, + controller: [ + "$rootScope", + "$scope", + function PortalTemplateController($rootScope, $scope) { + var ctrl = this; + ctrl.onSelect = function () { + ctrl.callback({ type: ctrl.model }); }; - ctrl.loadViewport(); - }; - ctrl.loadViewport = function () { - if (ctrl.w && ctrl.h) { - ctrl.rto = ctrl.w / ctrl.h; - let w = ctrl.w > ctrl.maxW ? ctrl.maxW * 0.6 : ctrl.w * 0.6; - let h = w / ctrl.rto; - if (w > ctrl.options.boundary.width) { - w = ctrl.options.boundary.width; - h = w / ctrl.rto; - } - ctrl.options.viewport = { - height: h, - width: w, - }; - } - }; - } -); + }, + ], +}); "use strict"; appShared.controller("SharedModuleDataController", [ @@ -7555,121 +7275,425 @@ appShared.controller("SharedModuleDataController", [ } $rootScope.isBusy = false; $scope.$apply(); - } + } + }; + }, +]); + +"use strict"; +appShared.factory("SharedModuleDataService", [ + "$http", + "$rootScope", + "ApiService", + "CommonService", + function ($http, $rootScope, apiService, commonService) { + var moduleDatasServiceFactory = {}; + + var _updateInfos = async function (pages) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data"; + var req = { + method: "POST", + url: apiUrl + "/update-infos", + data: JSON.stringify(pages), + }; + return await apiService.getApiResult(req); + }; + + var _getModuleData = async function (moduleId, id, type) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + moduleId + "/" + id; + } else { + url += "/" + moduleId; + } + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; + + var _getModuleDatas = async function (request) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "POST", + url: apiUrl + "list", + data: JSON.stringify(request), + }; + + return await apiService.getApiResult(req); + }; + + var _exportModuleData = async function (request) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "POST", + url: apiUrl + "export", + data: JSON.stringify(request), + }; + + return await apiService.getApiResult(req); + }; + + var _initModuleForm = async function (name) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "GET", + url: apiUrl + "init-by-name/" + name, + }; + + return await apiService.getApiResult(req); + }; + + var _removeModuleData = async function (id) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "GET", + url: apiUrl + "delete/" + id, + }; + return await apiService.getApiResult(req); + }; + + var _saveModuleData = async function (moduleData) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(moduleData), + }; + return await apiService.getApiResult(req); + }; + var _saveFields = async function (id, propertyName, propertyValue) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var column = [ + { + propertyName: propertyName, + propertyValue: propertyValue, + }, + ]; + var req = { + method: "POST", + url: apiUrl + "save/" + id, + data: JSON.stringify(column), + }; + return await apiService.getApiResult(req); + }; + moduleDatasServiceFactory.getModuleData = _getModuleData; + moduleDatasServiceFactory.getModuleDatas = _getModuleDatas; + moduleDatasServiceFactory.exportModuleData = _exportModuleData; + moduleDatasServiceFactory.removeModuleData = _removeModuleData; + moduleDatasServiceFactory.saveModuleData = _saveModuleData; + moduleDatasServiceFactory.initModuleForm = _initModuleForm; + moduleDatasServiceFactory.saveFields = _saveFields; + moduleDatasServiceFactory.updateInfos = _updateInfos; + return moduleDatasServiceFactory; + }, +]); + +sharedComponents.controller( + "ModalCroppieController", + function ( + $rootScope, + $scope, + $http, + $uibModalInstance, + mediaService, + file, + w, + h, + rto, + autoSave + ) { + var ctrl = this; + ctrl.autoSave = autoSave; + ctrl.maxW = 400; + ctrl.file = file; + ctrl.w = w; + ctrl.h = h; + ctrl.rto = rto; + ctrl.isAdmin = $rootScope.isAdmin; + ctrl.postedFile = {}; + ctrl.isImage = false; + ctrl.mediaNavs = []; + ctrl.media = { + title: "", + mediaFile: { + file: null, + }, + }; + ctrl.image_placeholder = "/mix-app/assets/img/image_placeholder.jpg"; + ctrl.options = null; + ctrl.init = function () { + ctrl.srcUrl = ctrl.srcUrl || ctrl.image_placeholder; + ctrl.maxHeight = ctrl.maxHeight || "2000px"; + ctrl.id = Math.floor(Math.random() * 100); + ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); + ctrl.cropped = { + source: null, + }; + if (ctrl.frameUrl) { + ctrl.frame = ctrl.loadImage(frameUrl); + } + + if (ctrl.srcUrl) { + ctrl.loadBase64(ctrl.srcUrl); + } + + if (ctrl.file) { + setTimeout(() => { + ctrl.selectFile([ctrl.file]); + }, 500); + } + + // Assign blob to component when selecting a image + }; + + ctrl.loadFromUrl = function () { + if (ctrl.src !== ctrl.srcUrl && ctrl.srcUrl != ctrl.image_placeholder) { + ctrl.src = ctrl.srcUrl; + ctrl.isImage = ctrl.srcUrl + .toLowerCase() + .match(/([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|svg)/g); + if (ctrl.isImage) { + ctrl.loadBase64(ctrl.srcUrl); + } + } + }; + + ctrl.origin = function () { + $uibModalInstance.close(); + }; + + ctrl.ok = async function () { + if (!ctrl.autoSave) { + $uibModalInstance.close(ctrl.cropped.image); + } else { + ctrl.media.fileFolder = ctrl.folder || "Media"; + ctrl.media.fileName = ctrl.media.mediaFile.fileName; + ctrl.media.extension = ctrl.media.mediaFile.extension; + ctrl.media.mediaFile.fileStream = ctrl.cropped.image; + var result = await mediaService.save(ctrl.media); + if (result.isSucceed) { + $uibModalInstance.close(result.data); + } + } + }; + + ctrl.cancel = function () { + $uibModalInstance.dismiss("cancel"); + }; + ctrl.combineImage = function () { + ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); + if (ctrl.canvas) { + var img = document.getElementById("croppie-src"); + var w = ctrl.options.boundary.width; + var h = ctrl.options.boundary.height; + // var rto = w / h; + var newW = ctrl.options.output.width; + var newH = ctrl.options.output.height; + var ctx = ctrl.canvas.getContext("2d"); + ctx.imageSmoothingEnabled = true; + ctx.drawImage(img, 0, 0, newW, newH); + if (ctrl.frame) { + // combine with frame + ctx.drawImage(ctrl.frame, 0, 0, w, h); + } + + $scope.$apply(function () { + ctrl.postedFile.fileStream = ctrl.canvas.toDataURL(); //ctx.getImageData(0, 0, 300, 350); + ctrl.imgUrl = ctrl.postedFile.fileStream.replace( + "image/png", + "image/octet-stream" + ); + }); + } + }; + ctrl.saveCanvas = function () { + var link = document.createElement("a"); + link.download = ctrl.postedFile.fileName + ctrl.postedFile.extension; + $rootScope.isBusy = true; + ctrl.canvas.toBlob(function (blob) { + link.href = URL.createObjectURL(blob); + link.click(); + $rootScope.isBusy = false; + $scope.$apply(); + }, "image/png"); }; - }, -]); - -"use strict"; -appShared.factory("SharedModuleDataService", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - var moduleDatasServiceFactory = {}; - - var _updateInfos = async function (pages) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data"; - var req = { - method: "POST", - url: apiUrl + "/update-infos", - data: JSON.stringify(pages), - }; - return await apiService.getApiResult(req); + ctrl._arrayBufferToBase64 = function (buffer) { + var binary = ""; + var bytes = new Uint8Array(buffer); + var len = bytes.byteLength; + for (var i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); }; - var _getModuleData = async function (moduleId, id, type) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + moduleId + "/" + id; - } else { - url += "/" + moduleId; + ctrl.selectFile = function (files) { + if (files !== undefined && files !== null && files.length > 0) { + const file = files[0]; + ctrl.media.folder = ctrl.folder ? ctrl.folder : "Media"; + ctrl.media.title = ctrl.title ? ctrl.title : file.name; + ctrl.media.description = ctrl.description ? ctrl.description : ""; + ctrl.media.mediaFile.fileName = file.name.substring( + 0, + file.name.lastIndexOf(".") + ); + ctrl.media.mediaFile.extension = file.name.substring( + file.name.lastIndexOf(".") + ); + ctrl.getBase64(file); + // if (file.size < 100000) { + // var msg = "Please choose a better photo (larger than 100kb)!"; + // $rootScope.showConfirm(ctrl, null, [], null, null, msg); + // } else { + // } } - var req = { + }; + ctrl.loadBase64 = function (url) { + var ext = url.substring(url.lastIndexOf(".") + 1); + $http({ method: "GET", url: url, - }; - return await apiService.getApiResult(req); - }; - - var _getModuleDatas = async function (request) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; + responseType: "arraybuffer", + }).then(function (resp) { + var base64 = `data:image/${ext};base64,${ctrl._arrayBufferToBase64( + resp.data + )}`; + var image = new Image(); + image.src = base64; + image.onload = function () { + // access image size here + ctrl.originW = this.width; + ctrl.originH = this.height; - return await apiService.getApiResult(req); + ctrl.loadImageSize(this.width, this.height); + ctrl.cropped.source = base64; + $scope.$apply(); + }; + return base64; + }); }; + ctrl.getBase64 = function (file) { + if (file !== null) { + $rootScope.isBusy = true; + var reader = new FileReader(); + reader.readAsDataURL(file); + // ctrl.cropped.source = null; + reader.onload = function () { + if (ctrl.media.mediaFile) { + ctrl.media.mediaFile.fileName = file.name.substring( + 0, + file.name.lastIndexOf(".") + ); + ctrl.media.mediaFile.extension = file.name.substring( + file.name.lastIndexOf(".") + ); + // ctrl.postedFile.fileStream = reader.result; + } + var image = new Image(); + image.src = reader.result; - var _exportModuleData = async function (request) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "POST", - url: apiUrl + "export", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); + image.onload = function () { + // access image size here + ctrl.originW = this.width; + ctrl.originH = this.height; + ctrl.loadImageSize(this.width, this.height); + ctrl.cropped.source = reader.result; + $rootScope.isBusy = false; + $scope.$apply(); + }; + }; + reader.onerror = function (error) { + $rootScope.isBusy = false; + $rootScope.showErrors([error]); + }; + } else { + return null; + } }; - - var _initModuleForm = async function (name) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "GET", - url: apiUrl + "init-by-name/" + name, + ctrl.loadImageSize = function (w, h) { + // const maxW = ctrl.w + 100; + w = w || ctrl.originW; + h = h || ctrl.originH; + var rto = w / h; + ctrl.rto = ctrl.rto || rto; + ctrl.w = ctrl.w || w; + ctrl.h = ctrl.w / ctrl.rto; + ctrl.options = { + boundary: { height: ctrl.maxW / rto, width: ctrl.maxW }, + render: { height: ctrl.maxW / rto, width: ctrl.maxW }, + output: { height: ctrl.h, width: ctrl.h * ctrl.rto }, }; - - return await apiService.getApiResult(req); + ctrl.loadViewport(); }; - - var _removeModuleData = async function (id) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); + ctrl.loadViewport = function () { + if (ctrl.w && ctrl.h) { + ctrl.rto = ctrl.w / ctrl.h; + let w = ctrl.w > ctrl.maxW ? ctrl.maxW * 0.6 : ctrl.w * 0.6; + let h = w / ctrl.rto; + if (w > ctrl.options.boundary.width) { + w = ctrl.options.boundary.width; + h = w / ctrl.rto; + } + ctrl.options.viewport = { + height: h, + width: w, + }; + } }; + } +); - var _saveModuleData = async function (moduleData) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(moduleData), - }; - return await apiService.getApiResult(req); - }; - var _saveFields = async function (id, propertyName, propertyValue) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var column = [ - { - propertyName: propertyName, - propertyValue: propertyValue, - }, - ]; - var req = { - method: "POST", - url: apiUrl + "save/" + id, - data: JSON.stringify(column), +sharedComponents.component("moduleDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/module-data-preview/module-data-preview.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + + ctrl.translate = $rootScope.translate; + ctrl.$onInit = () => { + if (!ctrl.datatype) { + ctrl.datatype = ctrl.data.dataType; + } }; - return await apiService.getApiResult(req); - }; - moduleDatasServiceFactory.getModuleData = _getModuleData; - moduleDatasServiceFactory.getModuleDatas = _getModuleDatas; - moduleDatasServiceFactory.exportModuleData = _exportModuleData; - moduleDatasServiceFactory.removeModuleData = _removeModuleData; - moduleDatasServiceFactory.saveModuleData = _saveModuleData; - moduleDatasServiceFactory.initModuleForm = _initModuleForm; - moduleDatasServiceFactory.saveFields = _saveFields; - moduleDatasServiceFactory.updateInfos = _updateInfos; - return moduleDatasServiceFactory; + }, + ], + bindings: { + data: "=", + datatype: "=?", + width: "=", + header: "=", }, -]); +}); + +// sharedComponents.component('modalConfirm', { +// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', +// controller: ModalConfirmController, +// bindings: { +// message: '=' +// } +// }); +function ModalConfirmController($rootScope, $scope, $mdDialog, message) { + $scope.message = message; + $scope.executeFunctionByName = async function (functionName, args, context) { + var result = await $rootScope.executeFunctionByName( + functionName, + args, + context + ); + if (result) { + $scope.$apply(); + } + $mdDialog.hide(); + }; + $scope.closeDialog = function () { + $mdDialog.hide(); + }; +} sharedComponents.component("moduleForm", { templateUrl: "/mix-app/views/app-shared/components/module-form/view.html", @@ -7818,30 +7842,6 @@ sharedComponents.component("moduleForm", { ], }); -sharedComponents.component("moduleDataPreview", { - templateUrl: - "/mix-app/views/app-shared/components/module-data-preview/module-data-preview.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - - ctrl.translate = $rootScope.translate; - ctrl.$onInit = () => { - if (!ctrl.datatype) { - ctrl.datatype = ctrl.data.dataType; - } - }; - }, - ], - bindings: { - data: "=", - datatype: "=?", - width: "=", - header: "=", - }, -}); - sharedComponents.component("moduleFormEditor", { templateUrl: "/mix-app/views/app-shared/components/module-form-editor/view.html", @@ -7956,49 +7956,12 @@ sharedComponents.component("mixPaging", { }, }); -"use trick"; -sharedComponents.directive("pill", function () { - return { - require: "^pills", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("pills", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/pills/pills.html", - replace: true, - }; +sharedComponents.component("portalSearch", { + templateUrl: "portal-search.html", + bindings: { + previewUrl: "=", + backUrl: "=", + }, }); sharedComponents.component("previewImage", { @@ -8058,6 +8021,51 @@ sharedComponents.component("previewPopup", { }, }); +"use trick"; +sharedComponents.directive("pill", function () { + return { + require: "^pills", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("pills", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/pills/pills.html", + replace: true, + }; +}); + sharedComponents.component("qrCode", { templateUrl: "/mix-app/views/app-shared/components/qr-code/view.html", controller: [ @@ -8080,14 +8088,6 @@ sharedComponents.component("qrCode", { }, }); -sharedComponents.component("portalSearch", { - templateUrl: "portal-search.html", - bindings: { - previewUrl: "=", - backUrl: "=", - }, -}); - sharedComponents.component("quillEditor", { templateUrl: "/mix-app/views/app-shared/components/quill-editor/view.html", controller: [ @@ -8610,51 +8610,6 @@ sharedComponents.component("statuses", { }, }); -"use trick"; -sharedComponents.directive("pane", function () { - return { - require: "^tabs", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabs", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", - replace: true, - }; -}); - sharedComponents.component("mixStore", { templateUrl: "/mix-app/views/app-shared/components/store/view.html", bindings: { @@ -8795,6 +8750,51 @@ sharedComponents.component("mixStore", { ], }); +"use trick"; +sharedComponents.directive("pane", function () { + return { + require: "^tabs", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabs", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", + replace: true, + }; +}); + "use trick"; sharedComponents.directive("paneH", function () { return { @@ -8886,6 +8886,19 @@ sharedComponents.directive("tabsV", function () { }; }); +sharedComponents.component("tags", { + templateUrl: "/mix-app/views/app-shared/components/tags/tags.html", + controller: [ + "$scope", + function ($scope) { + var ctrl = this; + }, + ], + bindings: { + input: "=", + }, +}); + sharedComponents.component("tagsView", { templateUrl: "/mix-app/views/app-shared/components/tags-view/view.html", controller: [ @@ -8916,19 +8929,6 @@ sharedComponents.component("tagsView", { }, }); -sharedComponents.component("tags", { - templateUrl: "/mix-app/views/app-shared/components/tags/tags.html", - controller: [ - "$scope", - function ($scope) { - var ctrl = this; - }, - ], - bindings: { - input: "=", - }, -}); - sharedComponents.component("trumbowyg", { templateUrl: "/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html", bindings: { diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/actions/actions.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/actions/actions.html index ec9e0e4dd..28dd10761 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/actions/actions.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/actions/actions.html @@ -1 +1 @@ -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form/view.html index 861b99190..44ee2eca8 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form/view.html @@ -1 +1 @@ -
    Module Data
    \ No newline at end of file +
    Module Data
    \ No newline at end of file From 970dc69e885b78a08630bde0a6c506b206d88cd8 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Thu, 19 Aug 2021 18:01:34 +0700 Subject: [PATCH 04/83] fix clone additinal Data --- .../FormViewModel.cs | 12 ++++++ .../MixDatabaseDatas/FormViewModel.cs | 35 ++++++++++-------- .../MixDatabaseDatas/UpdateViewModel.cs | 28 ++++++++++++++ .../MixDatabases/UpdateViewModel.cs | 12 ------ .../ViewModels/MixModules/UpdateViewModel.cs | 17 ++++++--- .../MixContent/voido-coffee.db-shm | Bin 0 -> 32768 bytes .../MixContent/voido-coffee.db-wal | Bin 0 -> 444992 bytes 7 files changed, 71 insertions(+), 33 deletions(-) create mode 100644 src/Mix.Cms.Web/MixContent/voido-coffee.db-shm create mode 100644 src/Mix.Cms.Web/MixContent/voido-coffee.db-wal diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataAssociations/FormViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataAssociations/FormViewModel.cs index 52ad88cda..84fa9e6f7 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataAssociations/FormViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataAssociations/FormViewModel.cs @@ -174,6 +174,18 @@ public override async Task> SaveModelAsync(boo } } + public override async Task> CloneSubModelsAsync(MixDatabaseDataAssociation parent, List cloneCultures, MixCmsContext _context = null, IDbContextTransaction _transaction = null) + { + var result = new RepositoryResponse() { IsSucceed = true }; + if (AttributeData != null) + { + AttributeData.Cultures = Cultures; + var model = AttributeData.ParseModel(_context, _transaction); + var cloneValue = await AttributeData.CloneAsync(model, Cultures, _context, _transaction); + ViewModelHelper.HandleResult(cloneValue, ref result); + } + return result; + } #endregion overrides } } \ No newline at end of file diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/FormViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/FormViewModel.cs index f894074f1..db60ccd13 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/FormViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/FormViewModel.cs @@ -169,7 +169,11 @@ public override MixDatabaseData ParseModel( .Data.OrderBy(a => a.Priority).ToList(); Columns ??= MixDatabaseColumns.UpdateViewModel.Repository.GetModelListBy(f => f.MixDatabaseId == MixDatabaseId , _context, _transaction).Data; - + Columns.AddRange( + Values + .Where(v => v.Column != null && !Columns.Any(f => f.Id == v.Column?.Id)) + .Select(v => v.Column) + .ToList()); Obj ??= new JObject(); foreach (var field in Columns.OrderBy(f => f.Priority)) { @@ -255,12 +259,12 @@ public override async Task> SaveModelAsync( { - var getNav = MixDatabaseDataAssociations.UpdateViewModel.Repository.CheckIsExists( + var getNav = MixDatabaseDataAssociations.UpdateViewModel.Repository.GetFirstModel( m => m.DataId == Id && m.ParentId == ParentId && m.ParentType == ParentType && m.Specificulture == Specificulture , context, transaction); - if (!getNav) + if (!getNav.IsSucceed) { - var nav = new MixDatabaseDataAssociations.UpdateViewModel() + getNav.Data = new MixDatabaseDataAssociations.UpdateViewModel() { DataId = Id, Specificulture = Specificulture, @@ -270,7 +274,7 @@ public override async Task> SaveModelAsync( ParentId = ParentId, Status = MixContentStatus.Published, }; - var saveResult = await nav.SaveModelAsync(false, context, transaction); + var saveResult = await getNav.Data.SaveModelAsync(false, context, transaction); if (!saveResult.IsSucceed) { @@ -279,18 +283,17 @@ public override async Task> SaveModelAsync( result.Errors.Add("Cannot save navigation"); result.Errors.AddRange(saveResult.Errors); } - - if (IsClone) + } + if (IsClone) + { + var cloneData = await CloneAsync(ParseModel(), Cultures, context, transaction); + var cloneNav = await getNav.Data.CloneAsync(getNav.Data.ParseModel(), Cultures, context, transaction); + if (!cloneNav.IsSucceed) { - var cloneData = await CloneAsync(ParseModel(), Cultures, context, transaction); - var cloneNav = await nav.CloneAsync(nav.ParseModel(), Cultures, context, transaction); - if (!cloneNav.IsSucceed) - { - result.IsSucceed = false; - result.Exception = saveResult.Exception; - result.Errors.Add("Cannot clone navigation"); - result.Errors.AddRange(saveResult.Errors); - } + result.IsSucceed = false; + result.Exception = cloneNav.Exception; + result.Errors.Add("Cannot clone navigation"); + result.Errors.AddRange(cloneNav.Errors); } } } diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/UpdateViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/UpdateViewModel.cs index 2d10fa9a2..871b63a6f 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/UpdateViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/UpdateViewModel.cs @@ -159,6 +159,34 @@ public override MixDatabaseData ParseModel(MixCmsContext _context = null, IDbCon return base.ParseModel(_context, _transaction); } + public override async Task> RemoveRelatedModelsAsync(UpdateViewModel view, MixCmsContext _context = null, IDbContextTransaction _transaction = null) + { + var result = new RepositoryResponse() { IsSucceed = true }; + // Remove values + var removeValues = await MixDatabaseDataValues.DeleteViewModel.Repository.RemoveListModelAsync(false, f => f.DataId == Id && f.Specificulture == Specificulture, _context, _transaction); + ViewModelHelper.HandleResult(removeValues, ref result); + + // remove related navs + if (result.IsSucceed) + { + var removeRelated = await MixDatabaseDataAssociations.DeleteViewModel.Repository.RemoveListModelAsync + (true, d => (d.DataId == Id || d.ParentId == Id) && d.Specificulture == Specificulture + , _context, _transaction); + ViewModelHelper.HandleResult(removeRelated, ref result); + } + + if (result.IsSucceed) + { + var removeChildFields = await MixDatabaseDataValues.DeleteViewModel.Repository.RemoveListModelAsync( + false, f => (f.DataId == Id) && f.Specificulture == Specificulture, _context, _transaction); + ViewModelHelper.HandleResult(removeChildFields, ref result); + var removeChilds = await MixDatabaseDatas.DeleteViewModel.Repository.RemoveListModelAsync( + false, f => (f.Id == Id) && f.Specificulture == Specificulture, _context, _transaction); + ViewModelHelper.HandleResult(removeChilds, ref result); + } + return result; + } + internal async Task> DuplicateAsync( MixCmsContext _context = null, IDbContextTransaction _transaction = null) diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabases/UpdateViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabases/UpdateViewModel.cs index 7050b6795..8c690a55c 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabases/UpdateViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabases/UpdateViewModel.cs @@ -39,18 +39,6 @@ public class UpdateViewModel [JsonProperty("formTemplate")] public string FormTemplate { get; set; } - //[JsonProperty("edmTemplate")] - //public string EdmTemplate { get; set; } - - //[JsonProperty("edmSubject")] - //public string EdmSubject { get; set; } - - //[JsonProperty("edmFrom")] - //public string EdmFrom { get; set; } - - //[JsonProperty("edmAutoSend")] - //public bool? EdmAutoSend { get; set; } - [JsonProperty("createdBy")] public string CreatedBy { get; set; } diff --git a/src/Mix.Cms.Lib/ViewModels/MixModules/UpdateViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixModules/UpdateViewModel.cs index 48416939a..deb08fd0c 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixModules/UpdateViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixModules/UpdateViewModel.cs @@ -275,15 +275,18 @@ public override async Task> RemoveRelatedModelsAsync(Up { string parentId = Id.ToString(); var result = new RepositoryResponse() { IsSucceed = true }; - var removeAdditionalData = await MixDatabaseDataAssociations.UpdateViewModel.Repository.RemoveListModelAsync( - true, + var removeAdditionalData = await MixDatabaseDataAssociations.UpdateViewModel.Repository.GetModelListByAsync( m => m.ParentId == parentId && m.MixDatabaseName == MixDatabaseNames.ADDITIONAL_COLUMN_MODULE && m.ParentType == MixDatabaseParentType.Module && m.Specificulture == Specificulture, _context, _transaction ); - ViewModelHelper.HandleResult(removeAdditionalData, ref result); + foreach (var item in removeAdditionalData.Data) + { + var temp = await item.Data.RemoveModelAsync(true, _context, _transaction); + ViewModelHelper.HandleResult(temp, ref result); + } return result; } @@ -303,13 +306,17 @@ public override async Task> CloneSubModelsAsync(MixModu { string parentId = Id.ToString(); var result = new RepositoryResponse() { IsSucceed = true }; - var getAdditionalData = await MixDatabaseDataAssociations.UpdateViewModel.Repository.GetFirstModelAsync( + var getAdditionalData = await MixDatabaseDataAssociations.FormViewModel.Repository.GetFirstModelAsync( m => m.ParentId == parentId && m.ParentType == MixDatabaseParentType.Module && m.Specificulture == Specificulture, _context, _transaction); if (getAdditionalData.IsSucceed) { + //getAdditionalData.Data.Cultures = Cultures; + //var m = getAdditionalData.Data.AttributeData.ParseModel(_context, _transaction); + //var cloneValue = await getAdditionalData.Data.AttributeData.CloneAsync(m, Cultures, _context, _transaction); + getAdditionalData.Data.Cultures = Cultures; - var model = getAdditionalData.Data.ParseModel(); + var model = getAdditionalData.Data.ParseModel(_context, _transaction); var cloneData = await getAdditionalData.Data.CloneAsync(model, Cultures, _context, _transaction); ViewModelHelper.HandleResult(cloneData, ref result); } diff --git a/src/Mix.Cms.Web/MixContent/voido-coffee.db-shm b/src/Mix.Cms.Web/MixContent/voido-coffee.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..5d0ca1a6f99b1bd39ed3b61c4db837852d098a35 GIT binary patch literal 32768 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℞W!0veR~^s=qer*L942*U4>j`Y0@#=Za3eLv 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 VyJ0|ZB;Sz=WBG`%Ki&4j{{`&h5`O>y literal 0 HcmV?d00001 From 5b86bd9281fee518fcdf3bb75cb96a4ddb7be24e Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Sun, 22 Aug 2021 16:01:02 +0700 Subject: [PATCH 05/83] fix upload module data --- .../wwwroot/mix-app/js/app-portal.min.js | 4525 +++++++++-------- .../components/mix-column-editor/view.html | 2 +- 2 files changed, 2269 insertions(+), 2258 deletions(-) diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js index ff16ba950..e32259c81 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js @@ -1,4 +1,4 @@ -/* Thu Aug 19 2021 07:46:11 GMT+0700 (Indochina Time) */"use strict"; +/* Sun Aug 22 2021 15:56:07 GMT+0700 (Indochina Time) */"use strict"; var app = angular.module("MixPortal", [ "angularCroppie", "ui.bootstrap", @@ -647,97 +647,6 @@ app.factory("CustomerServices", [ }, ]); -"use strict"; -app.controller("DashboardController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$timeout", - "$location", - "DashboardServices", - function ( - $scope, - $rootScope, - ngAppSettings, - $timeout, - $location, - dashboardServices - ) { - $scope.pageClass = "page-dashboard"; - $(".side-nav li").removeClass("active"); - $(".side-nav .page-dashboard").addClass("active"); - $scope.data = { - totalPage: 0, - totalPost: 0, - totalProduct: 0, - totalUser: 0, - }; - $scope.users = []; - $scope.$on("$viewContentLoaded", function () { - $rootScope.isBusy = false; - }); - $scope.getDashboardInfo = async function () { - $rootScope.isBusy = true; - var response = await dashboardServices.getDashboardInfo(); - if (response.isSucceed) { - // $('#mainSection').removeClass('card'); - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - // $scope.getChart(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.getChart = function () { - var ctx = document.getElementById("myChart"); - var myChart = new Chart(ctx, { - // type: 'pie', - // data: { - // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], - // datasets: [{ - // label: "Population (millions)", - // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], - // data: [2478,5267,734,784,433] - // }] - // }, - // options: { - // title: { - // display: true, - // text: 'Predicted world population (millions) in 2050' - // } - // } - }); - }; - }, -]); - -"use strict"; -app.factory("DashboardServices", [ - "$rootScope", - "$http", - "ApiService", - "CommonService", - function ($rootScope, $http, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var usersServiceFactory = {}; - var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; - var _getDashboardInfo = async function () { - var req = { - method: "GET", - url: apiUrl + "/dashboard", - }; - return await apiService.getApiResult(req); - }; - - usersServiceFactory.getDashboardInfo = _getDashboardInfo; - return usersServiceFactory; - }, -]); - "use strict"; app.controller("CultureController", [ "$scope", @@ -1544,6 +1453,97 @@ app.factory("FileServices", [ }, ]); +"use strict"; +app.controller("DashboardController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$timeout", + "$location", + "DashboardServices", + function ( + $scope, + $rootScope, + ngAppSettings, + $timeout, + $location, + dashboardServices + ) { + $scope.pageClass = "page-dashboard"; + $(".side-nav li").removeClass("active"); + $(".side-nav .page-dashboard").addClass("active"); + $scope.data = { + totalPage: 0, + totalPost: 0, + totalProduct: 0, + totalUser: 0, + }; + $scope.users = []; + $scope.$on("$viewContentLoaded", function () { + $rootScope.isBusy = false; + }); + $scope.getDashboardInfo = async function () { + $rootScope.isBusy = true; + var response = await dashboardServices.getDashboardInfo(); + if (response.isSucceed) { + // $('#mainSection').removeClass('card'); + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + // $scope.getChart(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.getChart = function () { + var ctx = document.getElementById("myChart"); + var myChart = new Chart(ctx, { + // type: 'pie', + // data: { + // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], + // datasets: [{ + // label: "Population (millions)", + // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], + // data: [2478,5267,734,784,433] + // }] + // }, + // options: { + // title: { + // display: true, + // text: 'Predicted world population (millions) in 2050' + // } + // } + }); + }; + }, +]); + +"use strict"; +app.factory("DashboardServices", [ + "$rootScope", + "$http", + "ApiService", + "CommonService", + function ($rootScope, $http, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var usersServiceFactory = {}; + var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; + var _getDashboardInfo = async function () { + var req = { + method: "GET", + url: apiUrl + "/dashboard", + }; + return await apiService.getApiResult(req); + }; + + usersServiceFactory.getDashboardInfo = _getDashboardInfo; + return usersServiceFactory; + }, +]); + "use strict"; app.controller("ImportFileController", [ "$scope", @@ -2097,22 +2097,26 @@ app.controller("MixDatabaseController", [ ]); "use strict"; -app.controller("MixDatabaseDataController", [ +app.controller("ModuleController", [ "$scope", "$rootScope", "ngAppSettings", - "$routeParams", "$location", + "$routeParams", + "ModuleRestService", + "SharedModuleDataService", + "RestRelatedMixDatabasePortalService", "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", function ( $scope, $rootScope, ngAppSettings, - $routeParams, $location, - service, - columnService + $routeParams, + moduleServices, + moduleDataService, + RestRelatedMixDatabasePortalService, + dataService ) { BaseRestCtrl.call( this, @@ -2121,187 +2125,83 @@ app.controller("MixDatabaseDataController", [ $location, $routeParams, ngAppSettings, - service + moduleServices, + "product" ); - $scope.queries = {}; - $scope.data = {}; - $scope.exportAll = true; - $scope.localizeSettings = $rootScope.globalSettings; - // $scope.request.orderBy = "Priority"; - // $scope.request.direction = "Asc"; - $scope.filterType = "contain"; - $scope.defaultId = "default"; - $scope.importFile = { - file: null, - fullPath: "", - folder: "import", - title: "", - description: "", - }; - $scope.initRouteParams = () => { - $scope.requestKey = `request${$rootScope.generateKeyword( - $location.$$path, - "_" - )}_${$routeParams.mixDatabaseId}`; - $scope.request = $rootScope.getRequest($scope.requestKey); - $scope.mixDatabaseId = $routeParams.mixDatabaseId; - $scope.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.mixDatabaseTitle = $routeParams.mixDatabaseTitle; - $scope.parentId = $routeParams.parentId; - $scope.parentType = $routeParams.parentType; - $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.request.isGroup = $routeParams.isGroup || false; - if ($routeParams.backUrl) { - $scope.backUrl = decodeURIComponent($routeParams.backUrl); + $scope.viewmodelType = "module"; + $scope.contentUrl = ""; + $scope.getSingleSuccessCallback = function () { + $scope.loadAdditionalData(); + + if ($scope.viewmodel.id > 0) { + // module => list post or list product + if ($scope.viewmodel.type == 2 || $scope.viewmodel.type == 6) { + $scope.contentUrl = "/portal/module-post/list/" + $scope.viewmodel.id; + } else { + $scope.contentUrl = "/portal/module/data/" + $scope.viewmodel.id; + } } - if ($routeParams.dataId != $scope.defaultId) { - $scope.dataId = $routeParams.dataId; + if ($scope.viewmodel.sysCategories) { + angular.forEach($scope.viewmodel.sysCategories, function (e) { + e.attributeData.obj.isActived = true; + }); } - if ($scope.parentId && $scope.parentType) { - $scope.refDataModel = { - parentId: $scope.parentId, - parentType: $scope.parentType, - }; - } - }; - $scope.init = async function () { - $scope.initRouteParams(); - if ($scope.mixDatabaseName || $scope.mixDatabaseId) { - var getFields = await columnService.initData( - $scope.mixDatabaseName || $scope.mixDatabaseId - ); - if (getFields.isSucceed) { - $scope.columns = getFields.data; - $scope.$apply(); - } - } - }; - $scope.saveSuccess = function (data) { - $scope.viewmodel = data; - }; - $scope.selectData = function () { - if ($scope.selectedList.data.length) { - $scope.viewmodel = $scope.selectedList.data[0]; + if ($scope.viewmodel.sysTags) { + angular.forEach($scope.viewmodel.sysTags, function (e) { + e.attributeData.obj.isActived = true; + }); } - }; - // $scope.saveSuccessCallback = function () { - // if ($location.path() == "/portal/mix-database-data/create") { - // let backUrl = - // $scope.backUrl || - // `/portal/mix-database-data/details?dataId=${$scope.viewmodel.id}`; - // $rootScope.goToSiteUrl(backUrl); - // } else { - // if ($scope.parentId && $scope.parentType == 'Set') { - // $rootScope.goToSiteUrl(`/portal/mix-database-data/details?dataId=${$scope.parentId}`); - // } else { - // let backUrl = - // $scope.backUrl || - // `/portal/mix-database-data/list?mixDatabaseId=${$scope.viewmodel.mixDatabaseId}&mixDatabaseName=${$scope.viewmodel.mixDatabaseName}&mixDatabaseTitle=${$scope.viewmodel.mixDatabaseName}`; - // $rootScope.goToSiteUrl(backUrl); - // } - // } - // }; - - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); - }; - $scope.edit = function (data) { - $rootScope.goToPath( - "/portal/mix-database-data/details?dataId=" + data.id + "&abc" - ); - }; - $scope.remove = function (data) { - $rootScope.showConfirm( - $scope, - "removeConfirmed", - [data.id], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - $scope.removeConfirmed = async function (dataId) { - $rootScope.isBusy = true; - var result = await service.delete([dataId]); - if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.import = async function () { - if ($scope.validateDataFile()) { - $rootScope.isBusy = true; - var form = document.getElementById("form-portal"); - var result = await service.import( - $scope.mixDatabaseName, - form["import-data-inp"].files[0] + if ($routeParams.template) { + $scope.viewmodel.view = $rootScope.findObjectByKey( + $scope.viewmodel.templates, + "fileName", + $routeParams.template ); - if (result.isSucceed) { - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.getList(0); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } } }; - $scope.validateDataFile = function () { - if (!$scope.importFile.file) { - $rootScope.showMessage("Please choose data file", "danger"); - return false; - } else { - return true; - } + $scope.getListByType = async function (pageIndex) { + $scope.request.query = "?type=" + $scope.type; + await $scope.getList(pageIndex); }; - $scope.sendMail = function (data) { - var email = ""; - angular.forEach(data.values, function (e) { - if (e.mixDatabaseColumnName == "email") { - email = e.stringValue; - } - }); - $rootScope.showConfirm( - $scope, - "sendMailConfirmed", - [data], - null, - "Send mail", - "Are you sure to send mail to " + email - ); + $scope.defaultAttr = { + name: "", + options: [], + priority: 0, + dataType: 7, + isGroupBy: false, + isSelect: false, + isDisplay: true, + width: 3, }; - $scope.sendMailConfirmed = async function (data) { - $rootScope.isBusy = true; + $scope.type = "-1"; + + $scope.localizeSettings = $rootScope.globalSettings; + $scope.viewmodel = null; + $scope.editDataUrl = ""; + + $scope.loadModuleDatas = async function () { $rootScope.isBusy = true; - var result = await service.sendMail([data.id]); - if (result.isSucceed) { - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); + var id = $routeParams.id; + $scope.dataColumns = []; + var response = await moduleServices.getSingle([id]); if (response.isSucceed) { - $scope.getList(); + $scope.viewmodel = response.data; + $scope.editDataUrl = + "/portal/module-data/details/" + $scope.viewmodel.id; + $scope.loadMoreModuleDatas(); + angular.forEach($scope.viewmodel.columns, function (e, i) { + if (e.isDisplay) { + $scope.dataColumns.push({ + title: e.title, + name: e.name, + filter: true, + type: 0, // string - ngAppSettings.dataTypes[0] + }); + } + }); + $rootScope.isBusy = false; $scope.$apply(); } else { $rootScope.showErrors(response.errors); @@ -2309,297 +2209,46 @@ app.controller("MixDatabaseDataController", [ $scope.$apply(); } }; - $scope.selectImportFile = function (files) { - if (files !== undefined && files !== null && files.length > 0) { - const file = files[0]; - $scope.importFile.folder = "imports"; - $scope.importFile.title = $scope.mixDatabaseName; - $scope.importFile.description = $scope.mixDatabaseName + "'s data"; - $scope.importFile.file = file; - // if (ctrl.auto=='true') { - // ctrl.uploadFile(file); - // } - // else { - // ctrl.getBase64(file); - // } - } - }; - $scope.getList = async function (pageIndex) { + $scope.loadMoreModuleDatas = async function (pageIndex) { + $scope.request.query = "&module_id=" + $scope.viewmodel.id; if (pageIndex !== undefined) { $scope.request.pageIndex = pageIndex; } if ($scope.request.fromDate !== null) { - var df = new Date($scope.request.fromDate); - $scope.request.fromDate = df.toISOString(); + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); } if ($scope.request.toDate !== null) { - var dt = new Date($scope.request.toDate); - $scope.request.toDate = dt.toISOString(); - } - var query = {}; - if ($routeParams.mixDatabaseId) { - $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); } - $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.request.filterType = $routeParams.filterType || "contain"; - Object.keys($scope.queries).forEach((e) => { - if ($scope.queries[e]) { - query[e] = $scope.queries[e]; - } - }); - $scope.request.query = JSON.stringify(query); $rootScope.isBusy = true; - var resp = await service.getList($scope.request); + var resp = await moduleDataService.getModuleDatas($scope.request); if (resp && resp.isSucceed) { - $scope.data = resp.data; - $.each($scope.data.items, function (i, data) { - $.each($scope.activeddata, function (i, e) { - if (e.dataId === data.id) { - data.isHidden = true; - } - }); - }); - if ($scope.getListSuccessCallback) { - $scope.getListSuccessCallback(); - } - $("html, body").animate( - { - scrollTop: "0px", - }, - 500 - ); - if (!resp.data || !resp.data.items.length) { - $scope.queries = {}; - } + $scope.viewmodel.data = resp.data; $rootScope.isBusy = false; $scope.$apply(); } else { if (resp) { $rootScope.showErrors(resp.errors); } - if ($scope.getListFailCallback) { - $scope.getListFailCallback(); - } - $scope.queries = {}; $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.export = async function (pageIndex, exportAll) { + $scope.exportModuleData = async function (pageIndex) { + $scope.request.query = "&module_id=" + $scope.viewmodel.id; if (pageIndex !== undefined) { $scope.request.pageIndex = pageIndex; } if ($scope.request.fromDate !== null) { - var df = new Date($scope.request.fromDate); - $scope.request.fromDate = df.toISOString(); + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); } if ($scope.request.toDate !== null) { - var dt = new Date($scope.request.toDate); - $scope.request.toDate = dt.toISOString(); - } - var query = {}; - if ($routeParams.mixDatabaseId) { - $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; - } - $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.request.filterType = $routeParams.filterType || "contain"; - Object.keys($scope.queries).forEach((e) => { - if ($scope.queries[e]) { - query[e] = $scope.queries[e]; - } - }); - $scope.request.query = JSON.stringify(query); - var request = angular.copy($scope.request); - $scope.exportAll = $scope.exportAll; - if (exportAll) { - request.pageSize = 10000; - request.pageIndex = 0; - } - $rootScope.isBusy = true; - var resp = await service.export(request); - if (resp && resp.isSucceed) { - if (resp.data) { - window.top.location = resp.data.webPath; - } else { - $rootScope.showMessage("Nothing to export"); - } - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.migrate = async function () { - if ($routeParams.mixDatabaseId) { - $rootScope.isBusy = true; - var result = await service.migrate($routeParams.mixDatabaseId); - $scope.handleResult(result); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.controller("ModuleController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$location", - "$routeParams", - "ModuleRestService", - "SharedModuleDataService", - "RestRelatedMixDatabasePortalService", - "RestMixDatabaseDataPortalService", - function ( - $scope, - $rootScope, - ngAppSettings, - $location, - $routeParams, - moduleServices, - moduleDataService, - RestRelatedMixDatabasePortalService, - dataService - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - moduleServices, - "product" - ); - $scope.viewmodelType = "module"; - $scope.contentUrl = ""; - $scope.getSingleSuccessCallback = function () { - $scope.loadAdditionalData(); - - if ($scope.viewmodel.id > 0) { - // module => list post or list product - if ($scope.viewmodel.type == 2 || $scope.viewmodel.type == 6) { - $scope.contentUrl = "/portal/module-post/list/" + $scope.viewmodel.id; - } else { - $scope.contentUrl = "/portal/module/data/" + $scope.viewmodel.id; - } - } - if ($scope.viewmodel.sysCategories) { - angular.forEach($scope.viewmodel.sysCategories, function (e) { - e.attributeData.obj.isActived = true; - }); - } - - if ($scope.viewmodel.sysTags) { - angular.forEach($scope.viewmodel.sysTags, function (e) { - e.attributeData.obj.isActived = true; - }); - } - - if ($routeParams.template) { - $scope.viewmodel.view = $rootScope.findObjectByKey( - $scope.viewmodel.templates, - "fileName", - $routeParams.template - ); - } - }; - $scope.getListByType = async function (pageIndex) { - $scope.request.query = "?type=" + $scope.type; - await $scope.getList(pageIndex); - }; - $scope.defaultAttr = { - name: "", - options: [], - priority: 0, - dataType: 7, - isGroupBy: false, - isSelect: false, - isDisplay: true, - width: 3, - }; - $scope.type = "-1"; - - $scope.localizeSettings = $rootScope.globalSettings; - $scope.viewmodel = null; - $scope.editDataUrl = ""; - - $scope.loadModuleDatas = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.dataColumns = []; - var response = await moduleServices.getSingle([id]); - if (response.isSucceed) { - $scope.viewmodel = response.data; - $scope.editDataUrl = - "/portal/module-data/details/" + $scope.viewmodel.id; - $scope.loadMoreModuleDatas(); - angular.forEach($scope.viewmodel.columns, function (e, i) { - if (e.isDisplay) { - $scope.dataColumns.push({ - title: e.title, - name: e.name, - filter: true, - type: 0, // string - ngAppSettings.dataTypes[0] - }); - } - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.loadMoreModuleDatas = async function (pageIndex) { - $scope.request.query = "&module_id=" + $scope.viewmodel.id; - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); - } - if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); - } - $rootScope.isBusy = true; - var resp = await moduleDataService.getModuleDatas($scope.request); - if (resp && resp.isSucceed) { - $scope.viewmodel.data = resp.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.exportModuleData = async function (pageIndex) { - $scope.request.query = "&module_id=" + $scope.viewmodel.id; - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); - } - if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); } $rootScope.isBusy = true; var resp = await moduleDataService.exportModuleData($scope.request); @@ -2748,16 +2397,14 @@ app.factory("ModuleRestService", [ ]); "use strict"; -app.controller("ModuleDataController", [ +app.controller("MixDatabaseDataController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "ModuleDataRestService", - "ModuleRestService", - "ApiService", - "CommonService", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", function ( $scope, $rootScope, @@ -2765,8 +2412,7 @@ app.controller("ModuleDataController", [ $routeParams, $location, service, - moduleService, - commonService + columnService ) { BaseRestCtrl.call( this, @@ -2777,88 +2423,100 @@ app.controller("ModuleDataController", [ ngAppSettings, service ); + $scope.queries = {}; + $scope.data = {}; + $scope.exportAll = true; + $scope.localizeSettings = $rootScope.globalSettings; // $scope.request.orderBy = "Priority"; // $scope.request.direction = "Asc"; - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = $routeParams.moduleId; - $scope.backUrl = `/portal/module-data/list/${$scope.moduleId}`; - $scope.module = null; - $scope.dataColumns = []; - $scope.editDataUrl = "/portal/module-data/details/" + $scope.moduleId; - $scope.init = async function () { - $scope.id = $routeParams.id; - if (!$scope.module) { - var getModule = await moduleService.getSingle([$scope.moduleId]); - if (getModule.isSucceed) { - $scope.module = getModule.data; - angular.forEach($scope.module.columns, function (e, i) { - if (e.isDisplay) { - $scope.dataColumns.push({ - title: e.title, - name: e.name, - datatype: e.dataType, - filter: true, - type: 0, // string - ngAppSettings.dataTypes[0] - }); - } - }); - $scope.$apply(); - } - } + $scope.filterType = "contain"; + $scope.defaultId = "default"; + $scope.importFile = { + file: null, + fullPath: "", + folder: "import", + title: "", + description: "", }; - $scope.getList = async function () { - $rootScope.isBusy = true; - $scope.request.module_id = $scope.moduleId; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + $scope.initRouteParams = () => { + $scope.requestKey = `request${$rootScope.generateKeyword( + $location.$$path, + "_" + )}_${$routeParams.mixDatabaseId}`; + $scope.request = $rootScope.getRequest($scope.requestKey); + $scope.mixDatabaseId = $routeParams.mixDatabaseId; + $scope.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.mixDatabaseTitle = $routeParams.mixDatabaseTitle; + $scope.parentId = $routeParams.parentId; + $scope.parentType = $routeParams.parentType; + $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.request.isGroup = $routeParams.isGroup || false; + if ($routeParams.backUrl) { + $scope.backUrl = decodeURIComponent($routeParams.backUrl); + } + if ($routeParams.dataId != $scope.defaultId) { + $scope.dataId = $routeParams.dataId; } - }; - $scope.export = async function () { - $rootScope.isBusy = true; - $scope.request.module_id = $scope.moduleId; - var response = await service.export($scope.request); - if (response.isSucceed) { - window.top.location = response.data.webPath; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + if ($scope.parentId && $scope.parentType) { + $scope.refDataModel = { + parentId: $scope.parentId, + parentType: $scope.parentType, + }; } }; - - $scope.getSingle = async function () { - $rootScope.isBusy = true; - var resp = await service.getSingle($routeParams.id, "portal"); - if (resp && resp.isSucceed) { - $scope.activedModuleData = resp.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); + $scope.init = async function () { + $scope.initRouteParams(); + if ($scope.mixDatabaseName || $scope.mixDatabaseId) { + var getFields = await columnService.initData( + $scope.mixDatabaseName || $scope.mixDatabaseId + ); + if (getFields.isSucceed) { + $scope.columns = getFields.data; + $scope.$apply(); } - $rootScope.isBusy = false; - $scope.$apply(); } }; - $scope.remove = function (dataId) { + $scope.saveSuccess = function (data) { + $scope.viewmodel = data; + }; + $scope.selectData = function () { + if ($scope.selectedList.data.length) { + $scope.viewmodel = $scope.selectedList.data[0]; + } + }; + // $scope.saveSuccessCallback = function () { + // if ($location.path() == "/portal/mix-database-data/create") { + // let backUrl = + // $scope.backUrl || + // `/portal/mix-database-data/details?dataId=${$scope.viewmodel.id}`; + // $rootScope.goToSiteUrl(backUrl); + // } else { + // if ($scope.parentId && $scope.parentType == 'Set') { + // $rootScope.goToSiteUrl(`/portal/mix-database-data/details?dataId=${$scope.parentId}`); + // } else { + // let backUrl = + // $scope.backUrl || + // `/portal/mix-database-data/list?mixDatabaseId=${$scope.viewmodel.mixDatabaseId}&mixDatabaseName=${$scope.viewmodel.mixDatabaseName}&mixDatabaseTitle=${$scope.viewmodel.mixDatabaseName}`; + // $rootScope.goToSiteUrl(backUrl); + // } + // } + // }; + + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); + }; + $scope.edit = function (data) { + $rootScope.goToPath( + "/portal/mix-database-data/details?dataId=" + data.id + "&abc" + ); + }; + $scope.remove = function (data) { $rootScope.showConfirm( $scope, "removeConfirmed", - [dataId], + [data.id], null, "Remove", "Deleted data will not able to recover, are you sure you want to delete this item?" @@ -2883,137 +2541,63 @@ app.controller("ModuleDataController", [ $scope.$apply(); } }; - - $scope.removeCallback = function () {}; - - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + $scope.import = async function () { + if ($scope.validateDataFile()) { + $rootScope.isBusy = true; + var form = document.getElementById("form-portal"); + var result = await service.import( + $scope.mixDatabaseName, + form["import-data-inp"].files[0] + ); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.getList(0); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } } }; - }, -]); - -"use strict"; -app.factory("ModuleDataRestService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("module-data/portal"); - // Define more service methods here - - var _initForm = async function (moduleId) { - var url = `${this.prefixUrl}/init-form/${moduleId}`; - var req = { - method: "GET", - url: url, - }; - return await apiService.getRestApiResult(req); - }; - serviceFactory.initForm = _initForm; - return serviceFactory; - }, -]); - -"use strict"; -app.controller("ModulePostController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "ModulePostRestService", - "ApiService", - "CommonService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service, - commonService - ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.translate = $rootScope.translate; - $scope.moduleIds = $routeParams.moduleIds || $routeParams.id; - $scope.pageIds = $routeParams.page_ids; - $scope.type = $routeParams.type; - $scope.getList = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.moduleId = $routeParams.id; - $scope.request.query = "&module_id=" + id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); + $scope.validateDataFile = function () { + if (!$scope.importFile.file) { + $rootScope.showMessage("Please choose data file", "danger"); + return false; } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + return true; } }; - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); - }; - $scope.remove = function (moduleId, postId) { + $scope.sendMail = function (data) { + var email = ""; + angular.forEach(data.values, function (e) { + if (e.mixDatabaseColumnName == "email") { + email = e.stringValue; + } + }); $rootScope.showConfirm( $scope, - "removeConfirmed", - [moduleId, postId], + "sendMailConfirmed", + [data], null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" + "Send mail", + "Are you sure to send mail to " + email ); }; - - $scope.removeConfirmed = async function (moduleId, postId) { + $scope.sendMailConfirmed = async function (data) { $rootScope.isBusy = true; - var result = await service.delete(moduleId, postId); + $rootScope.isBusy = true; + var result = await service.sendMail([data.id]); if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); } else { $rootScope.showMessage("failed"); $rootScope.isBusy = false; $scope.$apply(); } }; - - $scope.removeCallback = function () {}; - $scope.saveOthers = async function () { var response = await service.saveList($scope.others); if (response.isSucceed) { @@ -3025,8 +2609,244 @@ app.controller("ModulePostController", [ $scope.$apply(); } }; - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); + $scope.selectImportFile = function (files) { + if (files !== undefined && files !== null && files.length > 0) { + const file = files[0]; + $scope.importFile.folder = "imports"; + $scope.importFile.title = $scope.mixDatabaseName; + $scope.importFile.description = $scope.mixDatabaseName + "'s data"; + $scope.importFile.file = file; + + // if (ctrl.auto=='true') { + // ctrl.uploadFile(file); + // } + // else { + // ctrl.getBase64(file); + // } + } + }; + $scope.getList = async function (pageIndex) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var df = new Date($scope.request.fromDate); + $scope.request.fromDate = df.toISOString(); + } + if ($scope.request.toDate !== null) { + var dt = new Date($scope.request.toDate); + $scope.request.toDate = dt.toISOString(); + } + var query = {}; + if ($routeParams.mixDatabaseId) { + $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; + } + $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.request.filterType = $routeParams.filterType || "contain"; + Object.keys($scope.queries).forEach((e) => { + if ($scope.queries[e]) { + query[e] = $scope.queries[e]; + } + }); + $scope.request.query = JSON.stringify(query); + $rootScope.isBusy = true; + var resp = await service.getList($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + $.each($scope.data.items, function (i, data) { + $.each($scope.activeddata, function (i, e) { + if (e.dataId === data.id) { + data.isHidden = true; + } + }); + }); + if ($scope.getListSuccessCallback) { + $scope.getListSuccessCallback(); + } + $("html, body").animate( + { + scrollTop: "0px", + }, + 500 + ); + if (!resp.data || !resp.data.items.length) { + $scope.queries = {}; + } + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + if ($scope.getListFailCallback) { + $scope.getListFailCallback(); + } + $scope.queries = {}; + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.export = async function (pageIndex, exportAll) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var df = new Date($scope.request.fromDate); + $scope.request.fromDate = df.toISOString(); + } + if ($scope.request.toDate !== null) { + var dt = new Date($scope.request.toDate); + $scope.request.toDate = dt.toISOString(); + } + var query = {}; + if ($routeParams.mixDatabaseId) { + $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; + } + $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.request.filterType = $routeParams.filterType || "contain"; + Object.keys($scope.queries).forEach((e) => { + if ($scope.queries[e]) { + query[e] = $scope.queries[e]; + } + }); + $scope.request.query = JSON.stringify(query); + var request = angular.copy($scope.request); + $scope.exportAll = $scope.exportAll; + if (exportAll) { + request.pageSize = 10000; + request.pageIndex = 0; + } + $rootScope.isBusy = true; + var resp = await service.export(request); + if (resp && resp.isSucceed) { + if (resp.data) { + window.top.location = resp.data.webPath; + } else { + $rootScope.showMessage("Nothing to export"); + } + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.migrate = async function () { + if ($routeParams.mixDatabaseId) { + $rootScope.isBusy = true; + var result = await service.migrate($routeParams.mixDatabaseId); + $scope.handleResult(result); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.controller("ModuleGalleryController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "ModuleGalleryService", + "ApiService", + "CommonService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service, + apiService, + commonService + ) { + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.translate = $rootScope.translate; + $scope.moduleId = $routeParams.id; + $scope.getList = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + $scope.moduleId = $routeParams.id; + $scope.request.query = "&module_id=" + id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + var response = await service.getList($scope.request); + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.remove = function (moduleId, postId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [moduleId, postId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeConfirmed = async function (moduleId, postId) { + $rootScope.isBusy = true; + var result = await service.delete(moduleId, postId); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.removeCallback = function () {}; + + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); $rootScope.isBusy = true; var startIndex = $scope.data.items[0].priority - 1; for (var i = 0; i < $scope.data.items.length; i++) { @@ -3050,7 +2870,7 @@ app.controller("ModulePostController", [ ]); "use strict"; -app.factory("ModulePostRestService", [ +app.factory("ModuleGalleryService", [ "$rootScope", "ApiService", "CommonService", @@ -3081,13 +2901,13 @@ app.factory("ModulePostRestService", [ ]); "use strict"; -app.controller("ModuleGalleryController", [ +app.controller("ModulePostController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "ModuleGalleryService", + "ModulePostRestService", "ApiService", "CommonService", function ( @@ -3097,7 +2917,6 @@ app.controller("ModuleGalleryController", [ $routeParams, $location, service, - apiService, commonService ) { BaseCtrl.call( @@ -3111,11 +2930,12 @@ app.controller("ModuleGalleryController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = $routeParams.id; $scope.canDrag = $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; $scope.translate = $rootScope.translate; - $scope.moduleId = $routeParams.id; + $scope.moduleIds = $routeParams.moduleIds || $routeParams.id; + $scope.pageIds = $routeParams.page_ids; + $scope.type = $routeParams.type; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -3135,6 +2955,10 @@ app.controller("ModuleGalleryController", [ $scope.$apply(); } }; + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); + }; $scope.remove = function (moduleId, postId) { $rootScope.showConfirm( $scope, @@ -3203,7 +3027,7 @@ app.controller("ModuleGalleryController", [ ]); "use strict"; -app.factory("ModuleGalleryService", [ +app.factory("ModulePostRestService", [ "$rootScope", "ApiService", "CommonService", @@ -3697,13 +3521,13 @@ app.factory("PageRestService", [ ]); "use strict"; -app.controller("PagePageController", [ +app.controller("PageGalleryController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePostRestService", + "PageGalleryService", "PostRestService", "ApiService", "CommonService", @@ -3816,14 +3640,14 @@ app.controller("PagePageController", [ ]); "use strict"; -app.factory("PagePageRestService", [ +app.factory("PageGalleryService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-page"); + serviceFactory.init("page-post"); var _delete = async function (pageId, postId) { var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; var req = { @@ -3847,13 +3671,189 @@ app.factory("PagePageRestService", [ ]); "use strict"; -app.controller("PageGalleryController", [ +app.controller("ModuleDataController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PageGalleryService", + "ModuleDataRestService", + "ModuleRestService", + "ApiService", + "CommonService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service, + moduleService, + commonService + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + // $scope.request.orderBy = "Priority"; + // $scope.request.direction = "Asc"; + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = $routeParams.moduleId; + $scope.backUrl = `/portal/module-data/list/${$scope.moduleId}`; + $scope.module = null; + $scope.dataColumns = []; + $scope.editDataUrl = "/portal/module-data/details/" + $scope.moduleId; + $scope.init = async function () { + $scope.id = $routeParams.id; + if (!$scope.module) { + var getModule = await moduleService.getSingle([$scope.moduleId]); + if (getModule.isSucceed) { + $scope.module = getModule.data; + angular.forEach($scope.module.columns, function (e, i) { + if (e.isDisplay) { + $scope.dataColumns.push({ + title: e.title, + name: e.name, + datatype: e.dataType, + filter: true, + type: 0, // string - ngAppSettings.dataTypes[0] + }); + } + }); + $scope.$apply(); + } + } + }; + $scope.getList = async function () { + $rootScope.isBusy = true; + $scope.request.module_id = $scope.moduleId; + var response = await service.getList($scope.request); + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.export = async function () { + $rootScope.isBusy = true; + $scope.request.module_id = $scope.moduleId; + var response = await service.export($scope.request); + if (response.isSucceed) { + window.top.location = response.data.webPath; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.getSingle = async function () { + $rootScope.isBusy = true; + var resp = await service.getSingle($routeParams.id, "portal"); + if (resp && resp.isSucceed) { + $scope.activedModuleData = resp.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.remove = function (dataId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [dataId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeConfirmed = async function (dataId) { + $rootScope.isBusy = true; + var result = await service.delete([dataId]); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.removeCallback = function () {}; + + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("ModuleDataRestService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("module-data/portal"); + // Define more service methods here + + var _initForm = async function (moduleId) { + var url = `${this.prefixUrl}/init-form/${moduleId}`; + var req = { + method: "GET", + url: url, + }; + return await apiService.getRestApiResult(req); + }; + serviceFactory.initForm = _initForm; + return serviceFactory; + }, +]); + +"use strict"; +app.controller("PagePageController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "PagePostRestService", "PostRestService", "ApiService", "CommonService", @@ -3966,14 +3966,14 @@ app.controller("PageGalleryController", [ ]); "use strict"; -app.factory("PageGalleryService", [ +app.factory("PagePageRestService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); + serviceFactory.init("page-page"); var _delete = async function (pageId, postId) { var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; var req = { @@ -4466,26 +4466,24 @@ app.factory("RestPortalPageNavigationService", [ ]); "use strict"; -app.controller("PostController", [ +app.controller("RoleController", [ "$scope", "$rootScope", "$location", - "$filter", - "ngAppSettings", "$routeParams", - "PostRestService", - "UrlAliasService", + "ngAppSettings", "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", + "RoleService", function ( $scope, $rootScope, $location, - $filter, - ngAppSettings, $routeParams, - service, - urlAliasService, - dataService + ngAppSettings, + dataService, + columnService, + service ) { BaseRestCtrl.call( this, @@ -4496,41 +4494,135 @@ app.controller("PostController", [ ngAppSettings, service ); - $scope.viewmodelType = "post"; - $scope.additionalData = null; - $scope.createUrl = "/portal/post/create?"; - $scope.selectedCategories = []; - $scope.selectedTags = []; - $scope.postType = { - databaseName: "", - title: "All", + $scope.role = { name: "" }; + $scope.initPermissions = async function () { + let backUrl = "/portal/role/list"; + $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; + $scope.updateUrl = "/portal/mix-database-data/details"; }; - $scope.postTypeRequest = angular.copy(ngAppSettings.request); - $scope.postTypeRequest.mixDatabaseName = "post_type"; - $scope.postTypeRequest.orderBy = "Priority"; - $scope.postTypeRequest.direction = "Asc"; - $scope.initList = async function () { - if ($routeParams.template) { - $scope.createUrl = `${$scope.createUrl}&template=${$routeParams.template}`; - } - if ($routeParams.category) { - $scope.request.category = $routeParams.category; - } - if ($routeParams.type) { - $scope.createUrl = `${$scope.createUrl}&type=${$routeParams.type}`; - $scope.request.postType = $routeParams.type; - } - if ($routeParams.page_ids) { - $scope.createUrl = `${$scope.createUrl}&page_ids=${$routeParams.page_ids}`; + $scope.createRole = async function () { + $rootScope.isBusy = true; + var result = await service.createRole($scope.role.name); + if (result.isSucceed) { + $scope.role.name = ""; + $scope.getList(); + } else { + $rootScope.showErrors(result.errors); + $rootScope.isBusy = false; + $scope.$apply(); } - $scope.pageName = "postList"; - await $scope.loadPostTypes(); - $scope.getList(); }; - $scope.loadPostTypes = async function () { - let getTypes = await dataService.getList($scope.postTypeRequest); - if (getTypes.isSucceed) { + }, +]); + +"use strict"; +app.factory("RoleService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("role", true); + + var _getPermissions = async function () { + var req = { + method: "GET", + url: this.prefixUrl + "/permissions", + }; + return await apiService.getApiResult(req); + }; + + var _updatePermission = async function (permission) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-permission", + data: JSON.stringify(permission), + }; + return await apiService.getApiResult(req); + }; + var _createRole = function (name) { + var req = { + method: "POST", + url: this.prefixUrl + "/create", + data: JSON.stringify(name), + }; + + return apiService.getRestApiResult(req); + }; + serviceFactory.createRole = _createRole; + serviceFactory.getPermissions = _getPermissions; + serviceFactory.updatePermission = _updatePermission; + return serviceFactory; + }, +]); + +"use strict"; +app.controller("PostController", [ + "$scope", + "$rootScope", + "$location", + "$filter", + "ngAppSettings", + "$routeParams", + "PostRestService", + "UrlAliasService", + "RestMixDatabaseDataPortalService", + function ( + $scope, + $rootScope, + $location, + $filter, + ngAppSettings, + $routeParams, + service, + urlAliasService, + dataService + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.viewmodelType = "post"; + $scope.additionalData = null; + $scope.createUrl = "/portal/post/create?"; + $scope.selectedCategories = []; + $scope.selectedTags = []; + $scope.postType = { + databaseName: "", + title: "All", + }; + $scope.postTypeRequest = angular.copy(ngAppSettings.request); + $scope.postTypeRequest.mixDatabaseName = "post_type"; + $scope.postTypeRequest.orderBy = "Priority"; + $scope.postTypeRequest.direction = "Asc"; + + $scope.initList = async function () { + if ($routeParams.template) { + $scope.createUrl = `${$scope.createUrl}&template=${$routeParams.template}`; + } + if ($routeParams.category) { + $scope.request.category = $routeParams.category; + } + if ($routeParams.type) { + $scope.createUrl = `${$scope.createUrl}&type=${$routeParams.type}`; + $scope.request.postType = $routeParams.type; + } + if ($routeParams.page_ids) { + $scope.createUrl = `${$scope.createUrl}&page_ids=${$routeParams.page_ids}`; + } + $scope.pageName = "postList"; + await $scope.loadPostTypes(); + $scope.getList(); + }; + $scope.loadPostTypes = async function () { + let getTypes = await dataService.getList($scope.postTypeRequest); + if (getTypes.isSucceed) { $scope.postTypes = getTypes.data.items.map((m) => m.obj); $scope.postTypes.splice( 0, @@ -4863,98 +4955,6 @@ app.factory("PostRestService", [ }, ]); -"use strict"; -app.controller("RoleController", [ - "$scope", - "$rootScope", - "$location", - "$routeParams", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", - "RoleService", - function ( - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - dataService, - columnService, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.role = { name: "" }; - $scope.initPermissions = async function () { - let backUrl = "/portal/role/list"; - $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; - $scope.updateUrl = "/portal/mix-database-data/details"; - }; - - $scope.createRole = async function () { - $rootScope.isBusy = true; - var result = await service.createRole($scope.role.name); - if (result.isSucceed) { - $scope.role.name = ""; - $scope.getList(); - } else { - $rootScope.showErrors(result.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("RoleService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("role", true); - - var _getPermissions = async function () { - var req = { - method: "GET", - url: this.prefixUrl + "/permissions", - }; - return await apiService.getApiResult(req); - }; - - var _updatePermission = async function (permission) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-permission", - data: JSON.stringify(permission), - }; - return await apiService.getApiResult(req); - }; - var _createRole = function (name) { - var req = { - method: "POST", - url: this.prefixUrl + "/create", - data: JSON.stringify(name), - }; - - return apiService.getRestApiResult(req); - }; - serviceFactory.createRole = _createRole; - serviceFactory.getPermissions = _getPermissions; - serviceFactory.updatePermission = _updatePermission; - return serviceFactory; - }, -]); - "use strict"; app.controller("ServiceController", [ "$scope", @@ -5112,6 +5112,25 @@ app.controller("ServiceController", [ }, ]); +"use strict"; +app.controller("StoreController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "CryptoService", + "ThemeService", + "StoreService", + function ( + $scope, + $rootScope, + ngAppSettings, + cryptoService, + themeService, + service + ) { + }, +]); + "use strict"; app.controller("SocialFeedController", [ "$rootScope", @@ -5382,41 +5401,23 @@ app.controller("SocialFeedController", [ ]); "use strict"; -app.controller("StoreController", [ +app.controller("ThemeController", [ "$scope", "$rootScope", "ngAppSettings", - "CryptoService", - "ThemeService", - "StoreService", - function ( - $scope, - $rootScope, - ngAppSettings, - cryptoService, - themeService, - service - ) { - }, -]); - -"use strict"; -app.controller("TemplateController", [ - "$scope", - "$rootScope", "$routeParams", "$location", - "ngAppSettings", - "AuthService", - "TemplateService", + "ThemeService", + "ApiService", + "CommonService", function ( $scope, $rootScope, + ngAppSettings, $routeParams, $location, - ngAppSettings, - authService, - service + service, + commonService ) { BaseRestCtrl.call( this, @@ -5427,9 +5428,140 @@ app.controller("TemplateController", [ ngAppSettings, service ); - BaseHub.call(this, $scope); - $scope.folderTypes = [ - "Masters", + $scope.exportData = null; + $scope.selectedExport = { + isIncludeAssets: true, + isIncludeTemplates: true, + isIncludeConfigurations: true, + pages: [], + modules: [], + mixDatabases: [], + }; + + $scope.getSingleSuccessCallback = function () { + $scope.assets = null; + $scope.theme = null; + }; + $scope.save = async function (viewmodel) { + var form = document.getElementById("form-portal"); + var frm = new FormData(); + var url = service.prefixUrl + "/save"; + + $rootScope.isBusy = true; + // Looping over all files and add it to FormData object + frm.append("assets", form["assets"].files[0]); + frm.append("theme", form["theme"].files[0]); + // Adding one more key to FormData object + frm.append("model", angular.toJson(viewmodel || $scope.viewmodel)); + + var response = await service.ajaxSubmitForm(frm, url); + if (response.isSucceed) { + $scope.viewmodel = response.data; + $rootScope.isBusy = false; + $location.url($scope.referrerUrl); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.syncTemplates = async function (id) { + $rootScope.isBusy = true; + var response = await service.syncTemplates(id); + if (response.isSucceed) { + $scope.viewmodel = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.export = async function () { + var id = $routeParams.id; + $rootScope.isBusy = true; + var response = await service.export(id, $scope.selectedExport); + if (response.isSucceed) { + $rootScope.isBusy = false; + window.open(response.data, "_blank"); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.saveSuccessCallback = function () { + commonService.initAllSettings().then(function () { + $location.path("/portal/theme/list"); + $rootScope.isBusy = false; + $scope.$apply(); + }); + }; + $scope.removeCallback = function () { + commonService.initAllSettings().then(function () { + $location.path("/portal/theme/list"); + }); + }; + + $scope.getExportData = async function () { + var id = $routeParams.id; + var resp = await service.getExportData(id); + if (resp && resp.isSucceed) { + $scope.exportData = resp.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.generateSEO = function () { + $scope.viewmodel.name = $rootScope.generateKeyword( + $scope.viewmodel.title, + "-" + ); + }; + }, +]); + +"use strict"; +app.controller("TemplateController", [ + "$scope", + "$rootScope", + "$routeParams", + "$location", + "ngAppSettings", + "AuthService", + "TemplateService", + function ( + $scope, + $rootScope, + $routeParams, + $location, + ngAppSettings, + authService, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + BaseHub.call(this, $scope); + $scope.folderTypes = [ + "Masters", "Layouts", "Pages", "Modules", @@ -5613,13 +5745,13 @@ app.controller("TemplateController", [ ]); "use strict"; -app.controller("ThemeController", [ +app.controller("UrlAliasController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "ThemeService", + "UrlAliasService", "ApiService", "CommonService", function ( @@ -5629,48 +5761,34 @@ app.controller("ThemeController", [ $routeParams, $location, service, + apiService, commonService ) { - BaseRestCtrl.call( + BaseCtrl.call( this, $scope, $rootScope, - $location, $routeParams, ngAppSettings, service ); - $scope.exportData = null; - $scope.selectedExport = { - isIncludeAssets: true, - isIncludeTemplates: true, - isIncludeConfigurations: true, - pages: [], - modules: [], - mixDatabases: [], - }; - - $scope.getSingleSuccessCallback = function () { - $scope.assets = null; - $scope.theme = null; - }; - $scope.save = async function (viewmodel) { - var form = document.getElementById("form-portal"); - var frm = new FormData(); - var url = service.prefixUrl + "/save"; - + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.pageId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.getList = async function () { $rootScope.isBusy = true; - // Looping over all files and add it to FormData object - frm.append("assets", form["assets"].files[0]); - frm.append("theme", form["theme"].files[0]); - // Adding one more key to FormData object - frm.append("model", angular.toJson(viewmodel || $scope.viewmodel)); - - var response = await service.ajaxSubmitForm(frm, url); + var id = $routeParams.id; + $scope.request.query = "&page_id=" + id; + var response = await service.getList($scope.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; if (response.isSucceed) { - $scope.viewmodel = response.data; + $scope.data = response.data; $rootScope.isBusy = false; - $location.url($scope.referrerUrl); $scope.$apply(); } else { $rootScope.showErrors(response.errors); @@ -5678,52 +5796,47 @@ app.controller("ThemeController", [ $scope.$apply(); } }; - $scope.syncTemplates = async function (id) { - $rootScope.isBusy = true; - var response = await service.syncTemplates(id); - if (response.isSucceed) { - $scope.viewmodel = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } + $scope.remove = function (id) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [id], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); }; - $scope.export = async function () { - var id = $routeParams.id; + $scope.removeConfirmed = async function (id) { $rootScope.isBusy = true; - var response = await service.export(id, $scope.selectedExport); - if (response.isSucceed) { - $rootScope.isBusy = false; - window.open(response.data, "_blank"); - $scope.$apply(); + var result = await service.delete(id); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); } else { - $rootScope.showErrors(response.errors); + $rootScope.showMessage("failed"); $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.saveSuccessCallback = function () { - commonService.initAllSettings().then(function () { - $location.path("/portal/theme/list"); - $rootScope.isBusy = false; - $scope.$apply(); - }); - }; - $scope.removeCallback = function () { - commonService.initAllSettings().then(function () { - $location.path("/portal/theme/list"); - }); - }; - $scope.getExportData = async function () { - var id = $routeParams.id; - var resp = await service.getExportData(id); + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); + $rootScope.isBusy = true; + var startIndex = $scope.data.items[0].priority - 1; + for (var i = 0; i < $scope.data.items.length; i++) { + $scope.data.items[i].priority = startIndex + i + 1; + } + var resp = await service.updateInfos($scope.data.items); if (resp && resp.isSucceed) { - $scope.exportData = resp.data; + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -5734,121 +5847,8 @@ app.controller("ThemeController", [ $scope.$apply(); } }; - - $scope.generateSEO = function () { - $scope.viewmodel.name = $rootScope.generateKeyword( - $scope.viewmodel.title, - "-" - ); - }; - }, -]); - -"use strict"; -app.controller("UrlAliasController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "UrlAliasService", - "ApiService", - "CommonService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service, - apiService, - commonService - ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.pageId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.getList = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.request.query = "&page_id=" + id; - var response = await service.getList($scope.request); - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.remove = function (id) { - $rootScope.showConfirm( - $scope, - "removeConfirmed", - [id], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeConfirmed = async function (id) { - $rootScope.isBusy = true; - var result = await service.delete(id); - if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); - $rootScope.isBusy = true; - var startIndex = $scope.data.items[0].priority - 1; - for (var i = 0; i < $scope.data.items.length; i++) { - $scope.data.items[i].priority = startIndex + i + 1; - } - var resp = await service.updateInfos($scope.data.items); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); + }, +]); "use strict"; app.factory("UrlAliasService", [ @@ -6496,6 +6496,34 @@ app.component("appSettingsGeneral", { }, }); +app.component("appSettingsHeart", { + templateUrl: + "/mix-app/views/app-portal/pages/app-settings/components/heart/view.html", + bindings: { + appSettings: "=", + }, + controller: [ + "$rootScope", + "$scope", + "CommonService", + "ngAppSettings", + function ($rootScope, $scope, commonService, ngAppSettings) { + var ctrl = this; + ctrl.$onInit = function () { + ctrl.databaseProviders = ngAppSettings.enums.database_providers; + ctrl.cacheModes = ngAppSettings.enums.cache_modes; + }; + ctrl.clearCache = async function () { + $rootScope.isBusy = true; + await commonService.clearCache(); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + }; + }, + ], +}); + modules.component("portalMenus", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/portal-menus/view.html", @@ -6528,34 +6556,6 @@ modules.component("portalMenus", { ], }); -app.component("appSettingsHeart", { - templateUrl: - "/mix-app/views/app-portal/pages/app-settings/components/heart/view.html", - bindings: { - appSettings: "=", - }, - controller: [ - "$rootScope", - "$scope", - "CommonService", - "ngAppSettings", - function ($rootScope, $scope, commonService, ngAppSettings) { - var ctrl = this; - ctrl.$onInit = function () { - ctrl.databaseProviders = ngAppSettings.enums.database_providers; - ctrl.cacheModes = ngAppSettings.enums.cache_modes; - }; - ctrl.clearCache = async function () { - $rootScope.isBusy = true; - await commonService.clearCache(); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - }; - }, - ], -}); - app.component("appSettingsSmtp", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/smtp/view.html", @@ -6737,49 +6737,6 @@ app.component("moduleType", { }, }); -app.component("pageMain", { - templateUrl: "/mix-app/views/app-portal/pages/page/components/main/main.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - // ctrl.setPageType = function (type) { - // ctrl.page.type = $index; - // } - ctrl.generateSeo = function () { - if (ctrl.page) { - if (ctrl.page.seoName === null || ctrl.page.seoName === "") { - ctrl.page.seoName = $rootScope.generateKeyword( - ctrl.page.title, - "-" - ); - } - if (ctrl.page.seoTitle === null || ctrl.page.seoTitle === "") { - ctrl.page.seoTitle = ctrl.page.title; - } - if ( - ctrl.page.seoDescription === null || - ctrl.page.seoDescription === "" - ) { - ctrl.page.seoDescription = ctrl.page.excerpt; - } - if (ctrl.page.seoKeywords === null || ctrl.page.seoKeywords === "") { - ctrl.page.seoKeywords = ctrl.page.title; - } - } - }; - }, - ], - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageGeneral", { templateUrl: "/mix-app/views/app-portal/pages/page/components/general/general.html", @@ -6886,6 +6843,49 @@ app.component("pageGeneral", { }, }); +app.component("pageMain", { + templateUrl: "/mix-app/views/app-portal/pages/page/components/main/main.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + // ctrl.setPageType = function (type) { + // ctrl.page.type = $index; + // } + ctrl.generateSeo = function () { + if (ctrl.page) { + if (ctrl.page.seoName === null || ctrl.page.seoName === "") { + ctrl.page.seoName = $rootScope.generateKeyword( + ctrl.page.title, + "-" + ); + } + if (ctrl.page.seoTitle === null || ctrl.page.seoTitle === "") { + ctrl.page.seoTitle = ctrl.page.title; + } + if ( + ctrl.page.seoDescription === null || + ctrl.page.seoDescription === "" + ) { + ctrl.page.seoDescription = ctrl.page.excerpt; + } + if (ctrl.page.seoKeywords === null || ctrl.page.seoKeywords === "") { + ctrl.page.seoKeywords = ctrl.page.title; + } + } + }; + }, + ], + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("pageModules", { templateUrl: "/mix-app/views/app-portal/pages/page/components/modules/modules.html", @@ -6917,7 +6917,22 @@ app.component("pageAdvanced", { ], }); -app.component("pageContent", { +app.component("pageType", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/page-type/view.html", + bindings: { + model: "=", + }, + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + }, + ], +}); + +app.component("pageContent", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-content/view.html", bindings: { @@ -6959,21 +6974,6 @@ app.component("pageContent", { ], }); -app.component("pageType", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/page-type/view.html", - bindings: { - model: "=", - }, - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - }, - ], -}); - app.component("pageParents", { templateUrl: "/mix-app/views/app-portal/pages/page/components/parents/parents.html", @@ -7096,6 +7096,47 @@ app.component("permissionParents", { }, }); +modules.component("rolePageNav", { + templateUrl: + "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RoleService", + function ($rootScope, $scope, ngAppSettings, roleServices) { + var ctrl = this; + ctrl.selected = null; + ctrl.updateOrders = function (index) { + ctrl.data.splice(index, 1); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.data[i].priority = i + 1; + } + }; + //ctrl.change = async function () { + // //var permission = ctrl.page.navPermission; + // //$rootScope.isBusy = true; + // //var resp = await roleServices.updatePermission(permission); + // //if (resp && resp.isSucceed) { + // // $rootScope.showMessage('Update successfully!', 'success'); + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + // //else { + // // if (resp) { $rootScope.showErrors(resp.errors); } + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + //}; + }, + ], + bindings: { + prefix: "=", + page: "=", + callback: "&", + }, +}); + app.component("permissionPlugPlay", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/plug-play/plug-play.html", @@ -7558,47 +7599,6 @@ app.component("postSeo", { }, }); -modules.component("rolePageNav", { - templateUrl: - "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RoleService", - function ($rootScope, $scope, ngAppSettings, roleServices) { - var ctrl = this; - ctrl.selected = null; - ctrl.updateOrders = function (index) { - ctrl.data.splice(index, 1); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.data[i].priority = i + 1; - } - }; - //ctrl.change = async function () { - // //var permission = ctrl.page.navPermission; - // //$rootScope.isBusy = true; - // //var resp = await roleServices.updatePermission(permission); - // //if (resp && resp.isSucceed) { - // // $rootScope.showMessage('Update successfully!', 'success'); - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - // //else { - // // if (resp) { $rootScope.showErrors(resp.errors); } - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - //}; - }, - ], - bindings: { - prefix: "=", - page: "=", - callback: "&", - }, -}); - app.component("serviceMain", { templateUrl: "/mix-app/views/app-portal/pages/service/components/main/view.html", @@ -8278,55 +8278,6 @@ modules.component("additionalColumn", { ], }); -modules.component("additionalValue", { - templateUrl: - "/mix-app/views/app-portal/components/additional-value/view.html", - bindings: { - additionalData: "=?", - additionalDataId: "=?", - parentType: "=?", - parentId: "=?", - databaseName: "=?", - }, - controller: [ - "$rootScope", - "$scope", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, dataService) { - var ctrl = this; - ctrl.value = {}; - ctrl.column = { dataType: "Text" }; - ctrl.selectedCol = null; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () { - if (!ctrl.additionalData) { - if (!ctrl.additionalDataId) { - const obj = { - parentType: ctrl.parentType, - parentId: ctrl.parentId, - databaseName: ctrl.databaseName, - }; - const getData = await dataService.getAdditionalData(obj); - if (getData.isSucceed) { - ctrl.additionalData = getData.data; - ctrl.additionalData.mixDatabaseName = ctrl.databaseName; - ctrl.additionalData.parentType = ctrl.parentType; - ctrl.additionalData.parentId = ctrl.parentId; - $scope.$apply(); - } else { - $rootScope.showErrors(getData.errors); - } - } else { - var getData = await dataService.getSingle([ctrl.additionalDataId]); - ctrl.additionalData = getData.data; - $scope.$apply(); - } - } - }; - }, - ], -}); - modules.component("confirm", { templateUrl: "/mix-app/views/app-portal/components/confirm/confirm.html", controller: [ @@ -8538,6 +8489,55 @@ modules.component("customImage", { ], }); +modules.component("additionalValue", { + templateUrl: + "/mix-app/views/app-portal/components/additional-value/view.html", + bindings: { + additionalData: "=?", + additionalDataId: "=?", + parentType: "=?", + parentId: "=?", + databaseName: "=?", + }, + controller: [ + "$rootScope", + "$scope", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, dataService) { + var ctrl = this; + ctrl.value = {}; + ctrl.column = { dataType: "Text" }; + ctrl.selectedCol = null; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = async function () { + if (!ctrl.additionalData) { + if (!ctrl.additionalDataId) { + const obj = { + parentType: ctrl.parentType, + parentId: ctrl.parentId, + databaseName: ctrl.databaseName, + }; + const getData = await dataService.getAdditionalData(obj); + if (getData.isSucceed) { + ctrl.additionalData = getData.data; + ctrl.additionalData.mixDatabaseName = ctrl.databaseName; + ctrl.additionalData.parentType = ctrl.parentType; + ctrl.additionalData.parentId = ctrl.parentId; + $scope.$apply(); + } else { + $rootScope.showErrors(getData.errors); + } + } else { + var getData = await dataService.getSingle([ctrl.additionalDataId]); + ctrl.additionalData = getData.data; + $scope.$apply(); + } + } + }; + }, + ], +}); + modules.component("filterList", { templateUrl: "/mix-app/views/app-portal/components/filter-list/filter-list.html", @@ -8601,6 +8601,44 @@ modules.component("filterList", { }, }); +modules.component("githubContributers", { + templateUrl: + "/mix-app/views/app-portal/components/github-contributers/view.html", + controller: [ + "$rootScope", + "$http", + function ($rootScope, $http) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var req = { + method: "GET", + url: "https://api.github.com/repos/mixcore/mix.core/contributors", + }; + ctrl.getGithubApiResult(req); + }; + + ctrl.getGithubApiResult = async function (req) { + return $http(req).then( + function (resp) { + if (resp.status == "200") { + ctrl.items = resp.data; + } else { + } + }, + function (error) { + return { + isSucceed: false, + errors: [error.statusText || error.status], + }; + } + ); + }; + }, + ], + bindings: {}, +}); + modules.component("funding", { templateUrl: "/mix-app/views/app-portal/components/funding/view.html", controller: [ @@ -8644,46 +8682,9 @@ modules.component("funding", { bindings: {}, }); -modules.component("githubReleases", { - templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", - controller: [ - "$rootScope", - "$http", - function ($rootScope, $http) { - var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var req = { - method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/releases", - }; - ctrl.getGithubApiResult(req); - }; - - ctrl.getGithubApiResult = async function (req) { - return $http(req).then( - function (resp) { - if (resp.status == "200") { - ctrl.items = resp.data; - } else { - } - }, - function (error) { - return { - isSucceed: false, - errors: [error.statusText || error.status], - }; - } - ); - }; - }, - ], - bindings: {}, -}); - -modules.component("googleAnalytic", { - templateUrl: "/mix-app/views/app-portal/components/google-analytic/view.html", - bindings: {}, +modules.component("googleAnalytic", { + templateUrl: "/mix-app/views/app-portal/components/google-analytic/view.html", + bindings: {}, controller: [ "$rootScope", "ApiService", @@ -8883,9 +8884,8 @@ modules.component("googleAnalytic", { ], }); -modules.component("githubContributers", { - templateUrl: - "/mix-app/views/app-portal/components/github-contributers/view.html", +modules.component("githubReleases", { + templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", controller: [ "$rootScope", "$http", @@ -8895,7 +8895,7 @@ modules.component("githubContributers", { ctrl.init = function () { var req = { method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/contributors", + url: "https://api.github.com/repos/mixcore/mix.core/releases", }; ctrl.getGithubApiResult(req); }; @@ -9401,35 +9401,6 @@ modules.component("listMixColumn", { }, }); -modules.component("mainSideBar", { - templateUrl: - "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "TranslatorService", - "ApiService", - "CommonService", - function ( - $rootScope, - $scope, - ngAppSettings, - translatorService, - apiService, - commonService - ) { - var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var routes = JSON.parse($("#portal-menus").val()); - ctrl.items = routes.data; - }; - }, - ], - bindings: {}, -}); - modules.component("mainSideBarDynamic", { templateUrl: "/mix-app/views/app-portal/components/main-side-bar-dynamic/main-side-bar-dynamic.html", @@ -9494,24 +9465,6 @@ modules.component("mainSideBarItem", { }, }); -modules.component("mainSideBarItemDynamic", { - templateUrl: - "/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.translate = $rootScope.translate; - }, - ], - bindings: { - iconSize: "=", - linkStyle: "=", - itemStyle: "=", - item: "=", - }, -}); - modules.component("mediaFileUpload", { templateUrl: "/mix-app/views/app-portal/components/media-file-upload/view.html", @@ -9521,7 +9474,6 @@ modules.component("mediaFileUpload", { src: "=", srcUrl: "=", mediaFile: "=?", - formFile: "=", type: "=?", folder: "=?", auto: "=", @@ -9542,6 +9494,7 @@ modules.component("mediaFileUpload", { ctrl.isImage = false; ctrl.mediaNavs = []; ctrl.$onInit = function () { + ctrl.autoSave = ctrl.auto === "true"; ctrl.srcUrl = ctrl.srcUrl || image_placeholder; ctrl.mediaFile = ctrl.mediaFile || {}; ctrl.isImage = ctrl.srcUrl @@ -9574,12 +9527,13 @@ modules.component("mediaFileUpload", { ); if ($rootScope.isImage(ctrl.formFile)) { ctrl.canUpload = false; - mediaService.openCroppie(ctrl.formFile, ctrl, false); + mediaService.openCroppie(files[0], ctrl, ctrl.autoSave); } else { ctrl.mediaFile.file = ctrl.formFile; - ctrl.formFile = ctrl.formFile; ctrl.canUpload = true; - // ctrl.uploadFile(ctrl.formFile); + if (ctrl.autoSave) { + ctrl.uploadFile(ctrl.formFile); + } // ctrl.getBase64(ctrl.formFile); } } @@ -9588,10 +9542,20 @@ modules.component("mediaFileUpload", { ctrl.croppieCallback = function (result) { if (result) { ctrl.isImage = true; - ctrl.mediaFile.fileStream = result; - ctrl.src = result; + if (!ctrl.autoSave) { + ctrl.src = result; + ctrl.mediaFile.fileStream = result; + } else { + ctrl.src = result.filePath; + } + $scope.$apply(); } else if (ctrl.formFile) { - ctrl.mediaFile.file = ctrl.formFile; + if (ctrl.autoSave) { + ctrl.uploadFile(ctrl.formFile); + } else { + ctrl.mediaFile.file = ctrl.formFile; + ctrl.getBase64(ctrl.formFile); + } // ctrl.uploadFile(ctrl.formFile); } }; @@ -9660,6 +9624,53 @@ modules.component("mediaFileUpload", { ], }); +modules.component("mainSideBarItemDynamic", { + templateUrl: + "/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.translate = $rootScope.translate; + }, + ], + bindings: { + iconSize: "=", + linkStyle: "=", + itemStyle: "=", + item: "=", + }, +}); + +modules.component("mainSideBar", { + templateUrl: + "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "TranslatorService", + "ApiService", + "CommonService", + function ( + $rootScope, + $scope, + ngAppSettings, + translatorService, + apiService, + commonService + ) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var routes = JSON.parse($("#portal-menus").val()); + ctrl.items = routes.data; + }; + }, + ], + bindings: {}, +}); + modules.component("mediaUpload", { templateUrl: "/mix-app/views/app-portal/components/media-upload/media-upload.html", @@ -9993,216 +10004,145 @@ modules.component("mixDatabaseDataFilter", { ], }); -modules.component("mixDatabaseDataValueEditor", { +modules.component("mixDatabaseDataValues", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html", + "/mix-app/views/app-portal/components/mix-database-data-values/view.html", bindings: { - mixDatabaseDataValue: "=?", - parentType: "=?", - parentId: "=?", - isShowTitle: "=?", + header: "=", + data: "=", + canDrag: "=", + mixDatabaseName: "=?", + mixDatabaseId: "=?", + queries: "=?", + filterType: "=?", + selectedList: "=", + selectSingle: "=?", + columns: "=?", + onFilterList: "&?", + onApplyList: "&?", + onSendMail: "&?", + onUpdate: "&?", + onDuplicate: "&?", + onDelete: "&?", }, controller: [ "$rootScope", "$scope", - "ngAppSettings", - "$location", - "RestRelatedMixDatabasePortalService", + "RestMixDatabaseColumnPortalService", "RestMixDatabaseDataPortalService", - function ( - $rootScope, - $scope, - ngAppSettings, - $location, - navService, - dataService - ) { + function ($rootScope, $scope, columnService, dataService) { var ctrl = this; - ctrl.goToPath = $rootScope.goToPath; - ctrl.icons = ngAppSettings.icons; - ctrl.refData = null; - ctrl.defaultDataModel = null; - ctrl.refDataModel = { - id: null, - data: null, + ctrl.actions = ["Delete", "SendMail"]; + ctrl.filterTypes = ["contain", "equal"]; + ctrl.selectedProp = null; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = async function () { + if (!ctrl.selectedList) { + ctrl.selectedList = { + action: "Delete", + data: [], + }; + } + if (!ctrl.columns) { + var getFields = await columnService.initData( + ctrl.mixDatabaseName || ctrl.mixDatabaseId + ); + if (getFields.isSucceed) { + ctrl.columns = getFields.data; + $scope.$apply(); + } + } }; - ctrl.refRequest = angular.copy(ngAppSettings.request); - ctrl.refRequest.pageSize = 100; - ctrl.dataTypes = $rootScope.globalSettings.dataTypes; - ctrl.previousId = null; - ctrl.$doCheck = function () { - if ( - ctrl.mixDatabaseDataValue && - ctrl.previousId !== ctrl.mixDatabaseDataValue.id - ) { - ctrl.previousId = ctrl.mixDatabaseDataValue.id; - ctrl.initData(); + ctrl.select = function (item) { + if (item.isSelected) { + if (ctrl.selectSingle == "true") { + ctrl.selectedList.data = []; + ctrl.selectedList.data.push(item); + } else { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + item.id + ); + if (!current) { + ctrl.selectedList.data.push(item); + } + } + } else { + $rootScope.removeObject(ctrl.selectedList, item.id); } - }.bind(ctrl); - ctrl.$onInit = function () { - ctrl.initData(); }; - ctrl.initData = async function () { - setTimeout(() => { - if (!ctrl.mixDatabaseDataValue.id) { - ctrl.initDefaultValue(); + ctrl.selectAll = function (isSelected) { + ctrl.selectedList.data = []; + angular.forEach(ctrl.data, function (e) { + e.isSelected = isSelected; + if (isSelected) { + ctrl.selectedList.data.push(e.id); } - switch (ctrl.mixDatabaseDataValue.dataType.toLowerCase()) { - case "datetime": - case "date": - case "time": - if (ctrl.mixDatabaseDataValue.dateTimeValue) { - ctrl.mixDatabaseDataValue.dateObj = new Date( - ctrl.mixDatabaseDataValue.dateTimeValue - ); - $scope.$apply(); - } - break; - case "reference": // reference - if ( - ctrl.mixDatabaseDataValue.column.referenceId && - ctrl.parentId - ) { - ctrl.mixDatabaseDataValue.integerValue = - ctrl.mixDatabaseDataValue.column.referenceId; - // navService.getSingle(["default"]).then((resp) => { - // ctrl.defaultDataModel = resp; - // ctrl.defaultDataModel.mixDatabaseId = - // ctrl.mixDatabaseDataValue.column.referenceId; - // ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); - // }); - // ctrl.loadRefData(); - } - break; - default: - if ( - ctrl.mixDatabaseDataValue.column && - ctrl.mixDatabaseDataValue.column.isEncrypt && - ctrl.mixDatabaseDataValue.encryptValue - ) { - var encryptedData = { - key: ctrl.mixDatabaseDataValue.encryptKey, - data: ctrl.mixDatabaseDataValue.encryptValue, - }; - ctrl.mixDatabaseDataValue.stringValue = $rootScope.decrypt( - encryptedData - ); - } - if ( - ctrl.mixDatabaseDataValue.column && - !ctrl.mixDatabaseDataValue.stringValue - ) { - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - $scope.$apply(); - } - break; - } - }, 200); + }); + }; + ctrl.filter = function () {}; + ctrl.sendMail = async function (data) { + ctrl.onSendMail({ data: data }); + }; + ctrl.apply = async function () { + ctrl.onApplyList(); }; - ctrl.initDefaultValue = async function () { - switch (ctrl.mixDatabaseDataValue.dataType) { - case "datetime": - case "date": - case "time": - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.dateObj = new Date( - ctrl.mixDatabaseDataValue.column.defaultValue - ); - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - case "double": - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.doubleValue = parseFloat( - ctrl.mixDatabaseDataValue.column.defaultValue - ); - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - case "boolean": - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.booleanValue = - ctrl.mixDatabaseDataValue.column.defaultValue == "true"; - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - default: - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - } + ctrl.duplicate = function (data) { + ctrl.onDuplicate({ data: data }); }; - ctrl.updateStringValue = async function (dataType) { - switch (dataType.toLowerCase()) { - case "datetime": - case "date": - case "time": - if (ctrl.mixDatabaseDataValue.dateObj) { - ctrl.mixDatabaseDataValue.dateTimeValue = ctrl.mixDatabaseDataValue.dateObj.toISOString(); - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.dateTimeValue; - } - break; - case "double": - if (ctrl.mixDatabaseDataValue.doubleValue) { - ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.doubleValue.toString(); - } - break; - case "boolean": - if (ctrl.mixDatabaseDataValue.booleanValue != null) { - ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.booleanValue.toString(); - } - break; - default: - break; - } + ctrl.update = function (data) { + ctrl.onUpdate({ data: data }); }; - ctrl.updateRefData = function (nav) { - ctrl.goToPath(`/portal/mix-database-data/details?dataId=${nav.data.id} - &mixDatabaseId=${nav.data.mixDatabaseId} - &parentId=${ctrl.parentId} - &parentType=${ctrl.parentType}`); - // ctrl.refDataModel = nav; - // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; - // angular.element(e).triggerHandler('click'); - // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); + ctrl.delete = function (data) { + ctrl.onDelete({ data: data }); }; - ctrl.removeRefData = async function (nav) { - $rootScope.showConfirm( - ctrl, - "removeRefDataConfirmed", - [nav], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" + ctrl.filterData = function (item, attributeName) { + return $rootScope.findObjectByKey( + item.data, + "attributeName", + attributeName ); }; - ctrl.removeRefDataConfirmed = async function (nav) { - $rootScope.isBusy = true; - var result = await navService.delete([ - nav.parentId, - nav.parentType, - nav.id, - ]); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.refData, "id", nav.id); - $rootScope.isBusy = false; - $scope.$apply(); + + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + ctrl.minPriority = ctrl.data[0].priority; + }; + ctrl.updateOrders = function (index, items) { + if (index > ctrl.dragStartIndex) { + ctrl.data.splice(ctrl.dragStartIndex, 1); } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); + ctrl.data.splice(ctrl.dragStartIndex + 1, 1); } + ctrl.updateDataInfos(); + }; + ctrl.updateDataInfos = async function () { + angular.forEach(ctrl.data, async function (e, i) { + e.priority = ctrl.minPriority + i; + var resp = await dataService.saveFields(e.id, { + priority: e.priority, + }); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + } + }); + }; + + ctrl.view = function (item) { + var obj = { + columns: ctrl.columns, + item: item, + }; + $rootScope.preview("mix-database-data", obj, null, "modal-lg"); }; }, ], @@ -10410,44 +10350,45 @@ modules.component("mixDatabaseForm", { ], }); -modules.component("mixDatabaseDataValues", { +modules.component("mixDatabaseNavValues", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-values/view.html", + "/mix-app/views/app-portal/components/mix-database-nav-values/view.html", bindings: { - header: "=", - data: "=", - canDrag: "=", - mixDatabaseName: "=?", - mixDatabaseId: "=?", - queries: "=?", - filterType: "=?", - selectedList: "=", - selectSingle: "=?", + mixDatabaseId: "=", + mixDatabaseName: "=", + parentId: "=", + parentType: "=", columns: "=?", - onFilterList: "&?", - onApplyList: "&?", - onSendMail: "&?", + header: "=", + data: "=?", + maxCol: "=?", + createUrl: "=?", + updateUrl: "=?", onUpdate: "&?", - onDuplicate: "&?", onDelete: "&?", }, controller: [ "$rootScope", "$scope", + "ngAppSettings", + "RestRelatedAttributeDataPortalService", "RestMixDatabaseColumnPortalService", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, columnService, dataService) { + function ($rootScope, $scope, ngAppSettings, navService, columnService) { var ctrl = this; - ctrl.actions = ["Delete", "SendMail"]; - ctrl.filterTypes = ["contain", "equal"]; ctrl.selectedProp = null; + ctrl.request = angular.copy(ngAppSettings.restRequest); + ctrl.request.orderBy = "Priority"; + ctrl.request.query = "{}"; + + ctrl.request.direction = 0; ctrl.localizeSettings = $rootScope.globalSettings; ctrl.$onInit = async function () { - if (!ctrl.selectedList) { - ctrl.selectedList = { - action: "Delete", - data: [], - }; + ctrl.maxCol = ctrl.maxCol || 3; + if (!ctrl.createUrl) { + ctrl.createUrl = "/portal/mix-database-data/create"; + } + if (!ctrl.updateUrl) { + ctrl.updateUrl = "/portal/mix-database-data/details"; } if (!ctrl.columns) { var getFields = await columnService.initData( @@ -10458,46 +10399,10 @@ modules.component("mixDatabaseDataValues", { $scope.$apply(); } } + if (!ctrl.data) { + ctrl.loadData(); + } }; - ctrl.select = function (item) { - if (item.isSelected) { - if (ctrl.selectSingle == "true") { - ctrl.selectedList.data = []; - ctrl.selectedList.data.push(item); - } else { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - item.id - ); - if (!current) { - ctrl.selectedList.data.push(item); - } - } - } else { - $rootScope.removeObject(ctrl.selectedList, item.id); - } - }; - ctrl.selectAll = function (isSelected) { - ctrl.selectedList.data = []; - angular.forEach(ctrl.data, function (e) { - e.isSelected = isSelected; - if (isSelected) { - ctrl.selectedList.data.push(e.id); - } - }); - }; - ctrl.filter = function () {}; - ctrl.sendMail = async function (data) { - ctrl.onSendMail({ data: data }); - }; - ctrl.apply = async function () { - ctrl.onApplyList(); - }; - - ctrl.duplicate = function (data) { - ctrl.onDuplicate({ data: data }); - }; ctrl.update = function (data) { ctrl.onUpdate({ data: data }); @@ -10517,121 +10422,74 @@ modules.component("mixDatabaseDataValues", { ctrl.dragStart = function (index) { ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.data[0].priority; + ctrl.minPriority = ctrl.data.items[0].priority; }; - ctrl.updateOrders = function (index, items) { + ctrl.updateOrders = function (index) { if (index > ctrl.dragStartIndex) { - ctrl.data.splice(ctrl.dragStartIndex, 1); + ctrl.data.items.splice(ctrl.dragStartIndex, 1); } else { - ctrl.data.splice(ctrl.dragStartIndex + 1, 1); + ctrl.data.items.splice(ctrl.dragStartIndex + 1, 1); } - ctrl.updateDataInfos(); - }; - ctrl.updateDataInfos = async function () { - angular.forEach(ctrl.data, async function (e, i) { + angular.forEach(ctrl.data.items, function (e, i) { e.priority = ctrl.minPriority + i; - var resp = await dataService.saveFields(e.id, { - priority: e.priority, + navService.saveFields(e.id, { priority: e.priority }).then((resp) => { + $rootScope.isBusy = false; + $scope.$apply(); }); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - } }); }; - ctrl.view = function (item) { - var obj = { - columns: ctrl.columns, - item: item, - }; - $rootScope.preview("mix-database-data", obj, null, "modal-lg"); - }; - }, - ], -}); - -modules.component("mixDatabaseNavData", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-nav-data/view.html", - bindings: { - nav: "=", - parentId: "=", - parentType: "=", - onUpdate: "&?", - onDelete: "&?", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RestRelatedAttributeDataPortalService", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, ngAppSettings, navService, dataService) { - var ctrl = this; - ctrl.data = null; - ctrl.selected = null; - ctrl.navRequest = angular.copy(ngAppSettings.request); - ctrl.setRequest = angular.copy(ngAppSettings.request); - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - navService - .getDefault([ctrl.parentId, ctrl.parentType, "default"]) - .then((resp) => { - ctrl.defaultData = resp.data; - ctrl.defaultData.parentId = ctrl.parentId; - ctrl.defaultData.parentType = ctrl.parentType; - ctrl.selected = angular.copy(ctrl.defaultData); - ctrl.loadData(); - }); - ctrl.navRequest.parentType = ctrl.parentType; - ctrl.navRequest.parentId = ctrl.parentId; - }; - ctrl.selectPane = function (pane) {}; ctrl.loadData = function () { - navService.getList(ctrl.navRequest).then((resp) => { + ctrl.request.mixDatabaseId = ctrl.mixDatabaseId || 0; + ctrl.request.mixDatabaseName = ctrl.mixDatabaseName || null; + ctrl.request.parentId = ctrl.parentId; + ctrl.request.parentType = ctrl.parentType; + navService.getList(ctrl.request).then((resp) => { if (resp) { ctrl.data = resp.data; + $rootScope.isBusy = false; $scope.$apply(); } else { if (resp) { $rootScope.showErrors("Failed"); } + ctrl.refData = []; + $rootScope.isBusy = false; $scope.$apply(); } }); }; ctrl.updateData = function (nav) { - ctrl.selected = nav; - var e = $(".pane-form-" + ctrl.nav.data.id)[0]; - angular.element(e).triggerHandler("click"); + $rootScope.goToPath( + `${ctrl.updateUrl}?dataId=${nav.dataId}&mixDatabaseId=${nav.mixDatabaseId}&parentId=${ctrl.parentId}&parentType=${ctrl.parentType}` + ); + // ctrl.refDataModel = nav; + // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; + // angular.element(e).triggerHandler('click'); // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); }; ctrl.saveData = function (data) { $rootScope.isBusy = true; - ctrl.selected.data = data; - dataService.save(data).then((resp) => { + ctrl.refDataModel.data = data; + dataService.save("portal", data).then((resp) => { if (resp.isSucceed) { - ctrl.selected.dataId = resp.data.id; - ctrl.selected.mixDatabaseId = resp.data.mixDatabaseId; - ctrl.selected.mixDatabaseName = resp.data.mixDatabaseName; - ctrl.selected.attributeData = resp.data; - navService.save(ctrl.selected).then((resp) => { + ctrl.refDataModel.id = resp.data.id; + ctrl.refDataModel.data = resp.data; + navService.save("portal", ctrl.refDataModel).then((resp) => { if (resp.isSucceed) { var tmp = $rootScope.findObjectByKey( - ctrl.data, + ctrl.refData, ["parentId", "parentType", "id"], [resp.data.parentId, resp.data.parentType, resp.data.id] ); if (!tmp) { - ctrl.data.items.push(resp.data); - var e = $(".pane-data-" + ctrl.nav.data.id)[0]; - angular.element(e).triggerHandler("click"); + ctrl.refData.push(resp.data); } - ctrl.selected = angular.copy(ctrl.defautData); + ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); + var e = $( + ".pane-data-" + ctrl.mixDatabaseDataValue.column.referenceId + )[0]; + angular.element(e).triggerHandler("click"); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -10661,7 +10519,7 @@ modules.component("mixDatabaseNavData", { $rootScope.isBusy = true; var result = await navService.delete([nav.id]); if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); + $rootScope.removeObjectByKey(ctrl.data.items, "id", nav.id); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -10670,156 +10528,220 @@ modules.component("mixDatabaseNavData", { $scope.$apply(); } }; - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.data[0].priority; - }; - ctrl.updateOrders = function (index) { - if (index > ctrl.dragStartIndex) { - ctrl.data.splice(ctrl.dragStartIndex, 1); - } else { - ctrl.data.splice(ctrl.dragStartIndex + 1, 1); - } - var arrNavs = []; - angular.forEach(ctrl.data, function (e, i) { - e.priority = ctrl.minPriority + i; - var keys = { - parentId: e.parentId, - parentType: e.parentType, - id: e.id, - }; - var properties = { - priority: e.priority, - }; - arrNavs.push({ - keys: keys, - properties: properties, - }); - }); - navService.saveProperties("portal", arrNavs).then((resp) => { - $rootScope.isBusy = false; - $scope.$apply(); - }); + ctrl.view = function (item) { + var obj = { + columns: ctrl.columns, + item: item, + }; + $rootScope.preview("mix-database-data", obj, null, "modal-lg"); }; }, ], }); -modules.component("mixDatabaseNavs", { +modules.component("mixDatabaseDataValueEditor", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-navs/view.html", + "/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html", bindings: { - parentId: "=", - parentType: "=", - mixDatabaseNavs: "=?", - onUpdate: "&?", - onDelete: "&?", + mixDatabaseDataValue: "=?", + parentType: "=?", + parentId: "=?", + isShowTitle: "=?", }, controller: [ "$rootScope", "$scope", "ngAppSettings", + "$location", "RestRelatedMixDatabasePortalService", - "RestMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, navService, setService) { + "RestMixDatabaseDataPortalService", + function ( + $rootScope, + $scope, + ngAppSettings, + $location, + navService, + dataService + ) { var ctrl = this; - ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; - ctrl.selected = {}; - ctrl.defaultData = null; - ctrl.navRequest = angular.copy(ngAppSettings.request); - ctrl.setRequest = angular.copy(ngAppSettings.request); - - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - // ctrl.setRequest.type = ctrl.parentType; - navService.getDefault().then((resp) => { - resp.parentId = ctrl.parentId; - resp.parentType = ctrl.parentType; - ctrl.defaultData = resp; - ctrl.loadData(); - }); - }; ctrl.goToPath = $rootScope.goToPath; - ctrl.selectPane = function (pane) {}; - ctrl.loadData = async function () { - // Load attr set navs if not in input - if (!ctrl.mixDatabaseNavs) { - ctrl.navRequest.parentType = ctrl.parentType; - ctrl.navRequest.parentId = ctrl.parentId; - var resp = await navService.getList(ctrl.navRequest); - if (resp) { - angular.forEach(resp.data.items, (e) => { - e.isActived = true; - ctrl.mixDatabaseNavs.push(e); - }); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - } - } else { - angular.forEach(ctrl.mixDatabaseNavs, (e) => { - e.isActived = true; - }); + ctrl.icons = ngAppSettings.icons; + ctrl.refData = null; + ctrl.defaultDataModel = null; + ctrl.refDataModel = { + id: null, + data: null, + }; + ctrl.refRequest = angular.copy(ngAppSettings.request); + ctrl.refRequest.pageSize = 100; + ctrl.dataTypes = $rootScope.globalSettings.dataTypes; + ctrl.previousId = null; + ctrl.$doCheck = function () { + if ( + ctrl.mixDatabaseDataValue && + ctrl.previousId !== ctrl.mixDatabaseDataValue.id + ) { + ctrl.previousId = ctrl.mixDatabaseDataValue.id; + ctrl.initData(); } + }.bind(ctrl); + ctrl.$onInit = function () { + ctrl.initData(); + }; + ctrl.initData = async function () { + setTimeout(() => { + if (!ctrl.mixDatabaseDataValue.id) { + ctrl.initDefaultValue(); + } + switch (ctrl.mixDatabaseDataValue.dataType.toLowerCase()) { + case "datetime": + case "date": + case "time": + if (ctrl.mixDatabaseDataValue.dateTimeValue) { + ctrl.mixDatabaseDataValue.dateObj = new Date( + ctrl.mixDatabaseDataValue.dateTimeValue + ); + $scope.$apply(); + } + break; + case "reference": // reference + if ( + ctrl.mixDatabaseDataValue.column.referenceId && + ctrl.parentId + ) { + ctrl.mixDatabaseDataValue.integerValue = + ctrl.mixDatabaseDataValue.column.referenceId; + // navService.getSingle(["default"]).then((resp) => { + // ctrl.defaultDataModel = resp; + // ctrl.defaultDataModel.mixDatabaseId = + // ctrl.mixDatabaseDataValue.column.referenceId; + // ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); + // }); + // ctrl.loadRefData(); + } + break; + default: + if ( + ctrl.mixDatabaseDataValue.column && + ctrl.mixDatabaseDataValue.column.isEncrypt && + ctrl.mixDatabaseDataValue.encryptValue + ) { + var encryptedData = { + key: ctrl.mixDatabaseDataValue.encryptKey, + data: ctrl.mixDatabaseDataValue.encryptValue, + }; + ctrl.mixDatabaseDataValue.stringValue = $rootScope.decrypt( + encryptedData + ); + } + if ( + ctrl.mixDatabaseDataValue.column && + !ctrl.mixDatabaseDataValue.stringValue + ) { + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + $scope.$apply(); + } + break; + } + }, 200); + }; + ctrl.initDefaultValue = async function () { + switch (ctrl.mixDatabaseDataValue.dataType) { + case "datetime": + case "date": + case "time": + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.dateObj = new Date( + ctrl.mixDatabaseDataValue.column.defaultValue + ); + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; + case "double": + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.doubleValue = parseFloat( + ctrl.mixDatabaseDataValue.column.defaultValue + ); + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; + case "boolean": + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.booleanValue = + ctrl.mixDatabaseDataValue.column.defaultValue == "true"; + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; - var setResult = await setService.getList(ctrl.setRequest); - if (setResult) { - angular.forEach(setResult.data.items, (element) => { - var e = $rootScope.findObjectByKey( - ctrl.mixDatabaseNavs, - "mixDatabaseId", - element.id - ); - if (!e) { - e = angular.copy(ctrl.defaultData); - e.status = "Published"; - e.mixDatabaseId = element.id; - e.specificulture = navService.lang; - e.data = element; - e.isActived = false; - ctrl.mixDatabaseNavs.push(e); + default: + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; } - }); - } else { - if (setResult) { - $rootScope.showErrors("Others Failed"); - } + break; } - $scope.$apply(); }; - ctrl.change = async function (nav) { - $rootScope.isBusy = true; - var result; - if (nav.isActived) { - ctrl.active(nav); - } else { - ctrl.deactive(nav); + ctrl.updateStringValue = async function (dataType) { + switch (dataType.toLowerCase()) { + case "datetime": + case "date": + case "time": + if (ctrl.mixDatabaseDataValue.dateObj) { + ctrl.mixDatabaseDataValue.dateTimeValue = ctrl.mixDatabaseDataValue.dateObj.toISOString(); + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.dateTimeValue; + } + break; + case "double": + if (ctrl.mixDatabaseDataValue.doubleValue) { + ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.doubleValue.toString(); + } + break; + case "boolean": + if (ctrl.mixDatabaseDataValue.booleanValue != null) { + ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.booleanValue.toString(); + } + break; + + default: + break; } }; - ctrl.deactive = async function (nav) { - let result = null; - if (nav.id) { - result = await navService.delete([nav.id]); - $(".pane-container-" + nav.data.id) - .parent() - .remove(); - } - if (result && result.isSucceed) { - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - } + ctrl.updateRefData = function (nav) { + ctrl.goToPath(`/portal/mix-database-data/details?dataId=${nav.data.id} + &mixDatabaseId=${nav.data.mixDatabaseId} + &parentId=${ctrl.parentId} + &parentType=${ctrl.parentType}`); + // ctrl.refDataModel = nav; + // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; + // angular.element(e).triggerHandler('click'); + // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); }; - ctrl.active = async function (nav) { + ctrl.removeRefData = async function (nav) { + $rootScope.showConfirm( + ctrl, + "removeRefDataConfirmed", + [nav], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + ctrl.removeRefDataConfirmed = async function (nav) { $rootScope.isBusy = true; - var result; - result = await navService.save(nav); - if (result && result.isSucceed) { + var result = await navService.delete([ + nav.parentId, + nav.parentType, + nav.id, + ]); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.refData, "id", nav.id); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -10828,68 +10750,17 @@ modules.component("mixDatabaseNavs", { $scope.$apply(); } }; - - ctrl.update = function (data) { - ctrl.onUpdate({ - data: data, - }); - }; - - ctrl.delete = function (data) { - ctrl.onDelete({ - data: data, - }); - }; - - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.mixDatabaseNavs[0].priority; - }; - ctrl.updateOrders = function (index) { - if (index > ctrl.dragStartIndex) { - ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex, 1); - } else { - ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex + 1, 1); - } - var arrNavs = []; - angular.forEach(ctrl.mixDatabaseNavs, function (e, i) { - e.priority = ctrl.minPriority + i; - var keys = { - parentId: e.parentId, - parentType: e.parentType, - id: e.id, - }; - var properties = { - priority: e.priority, - }; - arrNavs.push({ - keys: keys, - properties: properties, - }); - }); - navService.saveProperties("portal", arrNavs).then((resp) => { - $rootScope.isBusy = false; - $scope.$apply(); - }); - }; }, ], }); -modules.component("mixDatabaseNavValues", { +modules.component("mixDatabaseNavs", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-nav-values/view.html", + "/mix-app/views/app-portal/components/mix-database-navs/view.html", bindings: { - mixDatabaseId: "=", - mixDatabaseName: "=", parentId: "=", parentType: "=", - columns: "=?", - header: "=", - data: "=?", - maxCol: "=?", - createUrl: "=?", - updateUrl: "=?", + mixDatabaseNavs: "=?", onUpdate: "&?", onDelete: "&?", }, @@ -10897,155 +10768,107 @@ modules.component("mixDatabaseNavValues", { "$rootScope", "$scope", "ngAppSettings", - "RestRelatedAttributeDataPortalService", - "RestMixDatabaseColumnPortalService", - function ($rootScope, $scope, ngAppSettings, navService, columnService) { + "RestRelatedMixDatabasePortalService", + "RestMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, navService, setService) { var ctrl = this; - ctrl.selectedProp = null; - ctrl.request = angular.copy(ngAppSettings.restRequest); - ctrl.request.orderBy = "Priority"; - ctrl.request.query = "{}"; + ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; + ctrl.selected = {}; + ctrl.defaultData = null; + ctrl.navRequest = angular.copy(ngAppSettings.request); + ctrl.setRequest = angular.copy(ngAppSettings.request); - ctrl.request.direction = 0; ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () { - ctrl.maxCol = ctrl.maxCol || 3; - if (!ctrl.createUrl) { - ctrl.createUrl = "/portal/mix-database-data/create"; - } - if (!ctrl.updateUrl) { - ctrl.updateUrl = "/portal/mix-database-data/details"; - } - if (!ctrl.columns) { - var getFields = await columnService.initData( - ctrl.mixDatabaseName || ctrl.mixDatabaseId - ); - if (getFields.isSucceed) { - ctrl.columns = getFields.data; - $scope.$apply(); - } - } - if (!ctrl.data) { + ctrl.$onInit = function () { + // ctrl.setRequest.type = ctrl.parentType; + navService.getDefault().then((resp) => { + resp.parentId = ctrl.parentId; + resp.parentType = ctrl.parentType; + ctrl.defaultData = resp; ctrl.loadData(); - } - }; - - ctrl.update = function (data) { - ctrl.onUpdate({ data: data }); - }; - - ctrl.delete = function (data) { - ctrl.onDelete({ data: data }); - }; - - ctrl.filterData = function (item, attributeName) { - return $rootScope.findObjectByKey( - item.data, - "attributeName", - attributeName - ); - }; - - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.data.items[0].priority; - }; - ctrl.updateOrders = function (index) { - if (index > ctrl.dragStartIndex) { - ctrl.data.items.splice(ctrl.dragStartIndex, 1); - } else { - ctrl.data.items.splice(ctrl.dragStartIndex + 1, 1); - } - angular.forEach(ctrl.data.items, function (e, i) { - e.priority = ctrl.minPriority + i; - navService.saveFields(e.id, { priority: e.priority }).then((resp) => { - $rootScope.isBusy = false; - $scope.$apply(); - }); }); }; - - ctrl.loadData = function () { - ctrl.request.mixDatabaseId = ctrl.mixDatabaseId || 0; - ctrl.request.mixDatabaseName = ctrl.mixDatabaseName || null; - ctrl.request.parentId = ctrl.parentId; - ctrl.request.parentType = ctrl.parentType; - navService.getList(ctrl.request).then((resp) => { + ctrl.goToPath = $rootScope.goToPath; + ctrl.selectPane = function (pane) {}; + ctrl.loadData = async function () { + // Load attr set navs if not in input + if (!ctrl.mixDatabaseNavs) { + ctrl.navRequest.parentType = ctrl.parentType; + ctrl.navRequest.parentId = ctrl.parentId; + var resp = await navService.getList(ctrl.navRequest); if (resp) { - ctrl.data = resp.data; - $rootScope.isBusy = false; - $scope.$apply(); + angular.forEach(resp.data.items, (e) => { + e.isActived = true; + ctrl.mixDatabaseNavs.push(e); + }); } else { if (resp) { - $rootScope.showErrors("Failed"); + $rootScope.showErrors(resp.errors); } - ctrl.refData = []; - $rootScope.isBusy = false; - $scope.$apply(); } - }); - }; - ctrl.updateData = function (nav) { - $rootScope.goToPath( - `${ctrl.updateUrl}?dataId=${nav.dataId}&mixDatabaseId=${nav.mixDatabaseId}&parentId=${ctrl.parentId}&parentType=${ctrl.parentType}` - ); - // ctrl.refDataModel = nav; - // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; - // angular.element(e).triggerHandler('click'); - // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); - }; - ctrl.saveData = function (data) { - $rootScope.isBusy = true; - ctrl.refDataModel.data = data; - dataService.save("portal", data).then((resp) => { - if (resp.isSucceed) { - ctrl.refDataModel.id = resp.data.id; - ctrl.refDataModel.data = resp.data; - navService.save("portal", ctrl.refDataModel).then((resp) => { - if (resp.isSucceed) { - var tmp = $rootScope.findObjectByKey( - ctrl.refData, - ["parentId", "parentType", "id"], - [resp.data.parentId, resp.data.parentType, resp.data.id] - ); - if (!tmp) { - ctrl.refData.push(resp.data); - } - ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); - var e = $( - ".pane-data-" + ctrl.mixDatabaseDataValue.column.referenceId - )[0]; - angular.element(e).triggerHandler("click"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); + } else { + angular.forEach(ctrl.mixDatabaseNavs, (e) => { + e.isActived = true; + }); + } + + var setResult = await setService.getList(ctrl.setRequest); + if (setResult) { + angular.forEach(setResult.data.items, (element) => { + var e = $rootScope.findObjectByKey( + ctrl.mixDatabaseNavs, + "mixDatabaseId", + element.id + ); + if (!e) { + e = angular.copy(ctrl.defaultData); + e.status = "Published"; + e.mixDatabaseId = element.id; + e.specificulture = navService.lang; + e.data = element; + e.isActived = false; + ctrl.mixDatabaseNavs.push(e); + } + }); + } else { + if (setResult) { + $rootScope.showErrors("Others Failed"); } - }); + } + $scope.$apply(); }; - ctrl.removeData = async function (nav) { - $rootScope.showConfirm( - ctrl, - "removeDataConfirmed", - [nav], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); + ctrl.change = async function (nav) { + $rootScope.isBusy = true; + var result; + if (nav.isActived) { + ctrl.active(nav); + } else { + ctrl.deactive(nav); + } }; - ctrl.removeDataConfirmed = async function (nav) { + + ctrl.deactive = async function (nav) { + let result = null; + if (nav.id) { + result = await navService.delete([nav.id]); + $(".pane-container-" + nav.data.id) + .parent() + .remove(); + } + if (result && result.isSucceed) { + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + } + }; + + ctrl.active = async function (nav) { $rootScope.isBusy = true; - var result = await navService.delete([nav.id]); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.data.items, "id", nav.id); + var result; + result = await navService.save(nav); + if (result && result.isSucceed) { $rootScope.isBusy = false; $scope.$apply(); } else { @@ -11054,12 +10877,49 @@ modules.component("mixDatabaseNavValues", { $scope.$apply(); } }; - ctrl.view = function (item) { - var obj = { - columns: ctrl.columns, - item: item, - }; - $rootScope.preview("mix-database-data", obj, null, "modal-lg"); + + ctrl.update = function (data) { + ctrl.onUpdate({ + data: data, + }); + }; + + ctrl.delete = function (data) { + ctrl.onDelete({ + data: data, + }); + }; + + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + ctrl.minPriority = ctrl.mixDatabaseNavs[0].priority; + }; + ctrl.updateOrders = function (index) { + if (index > ctrl.dragStartIndex) { + ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex, 1); + } else { + ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex + 1, 1); + } + var arrNavs = []; + angular.forEach(ctrl.mixDatabaseNavs, function (e, i) { + e.priority = ctrl.minPriority + i; + var keys = { + parentId: e.parentId, + parentType: e.parentType, + id: e.id, + }; + var properties = { + priority: e.priority, + }; + arrNavs.push({ + keys: keys, + properties: properties, + }); + }); + navService.saveProperties("portal", arrNavs).then((resp) => { + $rootScope.isBusy = false; + $scope.$apply(); + }); }; }, ], @@ -11147,46 +11007,197 @@ modules.component("mixFileUpload", { $scope.$apply(); } } else { - $rootScope.showErrors(["Please choose file"]); + $rootScope.showErrors(["Please choose file"]); + } + }; + }, + ], +}); + +modules.component("mixSelectIcons", { + templateUrl: + "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", + controller: [ + "$rootScope", + "$scope", + "$location", + "$element", + function ($rootScope, $scope, $location, $element) { + var ctrl = this; + ctrl.limitTo = 20; + ctrl.container = $element[0].querySelector(".list-icon"); + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + ctrl.showMore = () => { + if ( + ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && + ctrl.limitTo < ctrl.options.length + ) { + ctrl.limitTo *= 2; + } + }; + ctrl.select = function (ico) { + ctrl.data = ico.class; + }; + }, + ], + bindings: { + data: "=", + prefix: "=", + options: "=", + }, +}); + +modules.component("mixDatabaseNavData", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-nav-data/view.html", + bindings: { + nav: "=", + parentId: "=", + parentType: "=", + onUpdate: "&?", + onDelete: "&?", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RestRelatedAttributeDataPortalService", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, ngAppSettings, navService, dataService) { + var ctrl = this; + ctrl.data = null; + ctrl.selected = null; + ctrl.navRequest = angular.copy(ngAppSettings.request); + ctrl.setRequest = angular.copy(ngAppSettings.request); + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = function () { + navService + .getDefault([ctrl.parentId, ctrl.parentType, "default"]) + .then((resp) => { + ctrl.defaultData = resp.data; + ctrl.defaultData.parentId = ctrl.parentId; + ctrl.defaultData.parentType = ctrl.parentType; + ctrl.selected = angular.copy(ctrl.defaultData); + ctrl.loadData(); + }); + ctrl.navRequest.parentType = ctrl.parentType; + ctrl.navRequest.parentId = ctrl.parentId; + }; + ctrl.selectPane = function (pane) {}; + ctrl.loadData = function () { + navService.getList(ctrl.navRequest).then((resp) => { + if (resp) { + ctrl.data = resp.data; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors("Failed"); + } + $scope.$apply(); + } + }); + }; + ctrl.updateData = function (nav) { + ctrl.selected = nav; + var e = $(".pane-form-" + ctrl.nav.data.id)[0]; + angular.element(e).triggerHandler("click"); + // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); + }; + ctrl.saveData = function (data) { + $rootScope.isBusy = true; + ctrl.selected.data = data; + dataService.save(data).then((resp) => { + if (resp.isSucceed) { + ctrl.selected.dataId = resp.data.id; + ctrl.selected.mixDatabaseId = resp.data.mixDatabaseId; + ctrl.selected.mixDatabaseName = resp.data.mixDatabaseName; + ctrl.selected.attributeData = resp.data; + navService.save(ctrl.selected).then((resp) => { + if (resp.isSucceed) { + var tmp = $rootScope.findObjectByKey( + ctrl.data, + ["parentId", "parentType", "id"], + [resp.data.parentId, resp.data.parentType, resp.data.id] + ); + if (!tmp) { + ctrl.data.items.push(resp.data); + var e = $(".pane-data-" + ctrl.nav.data.id)[0]; + angular.element(e).triggerHandler("click"); + } + ctrl.selected = angular.copy(ctrl.defautData); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + }; + ctrl.removeData = async function (nav) { + $rootScope.showConfirm( + ctrl, + "removeDataConfirmed", + [nav], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + ctrl.removeDataConfirmed = async function (nav) { + $rootScope.isBusy = true; + var result = await navService.delete([nav.id]); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); } }; - }, - ], -}); - -modules.component("mixSelectIcons", { - templateUrl: - "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", - controller: [ - "$rootScope", - "$scope", - "$location", - "$element", - function ($rootScope, $scope, $location, $element) { - var ctrl = this; - ctrl.limitTo = 20; - ctrl.container = $element[0].querySelector(".list-icon"); - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + ctrl.minPriority = ctrl.data[0].priority; }; - ctrl.showMore = () => { - if ( - ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && - ctrl.limitTo < ctrl.options.length - ) { - ctrl.limitTo *= 2; + ctrl.updateOrders = function (index) { + if (index > ctrl.dragStartIndex) { + ctrl.data.splice(ctrl.dragStartIndex, 1); + } else { + ctrl.data.splice(ctrl.dragStartIndex + 1, 1); } - }; - ctrl.select = function (ico) { - ctrl.data = ico.class; + var arrNavs = []; + angular.forEach(ctrl.data, function (e, i) { + e.priority = ctrl.minPriority + i; + var keys = { + parentId: e.parentId, + parentType: e.parentType, + id: e.id, + }; + var properties = { + priority: e.priority, + }; + arrNavs.push({ + keys: keys, + properties: properties, + }); + }); + navService.saveProperties("portal", arrNavs).then((resp) => { + $rootScope.isBusy = false; + $scope.$apply(); + }); }; }, ], - bindings: { - data: "=", - prefix: "=", - options: "=", - }, }); "use strict"; @@ -11587,6 +11598,30 @@ modules.component("modalBookmark", { ], }); +app.component("modalCroppie", { + templateUrl: "/mix-app/views/app-portal/components/modal-croppie/view.html", + bidings: { + resolve: "<", + close: "&", + dismiss: "&", + }, + controller: function () { + var $ctrl = this; + $ctrl.fileUrl = "test"; + $ctrl.$onInit = function () { + $ctrl.file = $ctrl.resolve.file; + }; + + $ctrl.ok = function () { + $ctrl.close({ $value: $ctrl.fileUrl }); + }; + + $ctrl.cancel = function () { + $ctrl.dismiss({ $value: "cancel" }); + }; + }, +}); + modules.component("modalContentFilter", { templateUrl: "/mix-app/views/app-portal/components/modal-content-filter/modal-content-filter.html", @@ -11755,30 +11790,6 @@ modules.component("modalContentFilter", { ], }); -app.component("modalCroppie", { - templateUrl: "/mix-app/views/app-portal/components/modal-croppie/view.html", - bidings: { - resolve: "<", - close: "&", - dismiss: "&", - }, - controller: function () { - var $ctrl = this; - $ctrl.fileUrl = "test"; - $ctrl.$onInit = function () { - $ctrl.file = $ctrl.resolve.file; - }; - - $ctrl.ok = function () { - $ctrl.close({ $value: $ctrl.fileUrl }); - }; - - $ctrl.cancel = function () { - $ctrl.dismiss({ $value: "cancel" }); - }; - }, -}); - modules.component("modalHelper", { templateUrl: "/mix-app/views/app-portal/components/modal-helper/modal-helper.html", @@ -12453,87 +12464,6 @@ modules.component("modalNavPages", { ], }); -modules.component("modalNavPosts", { - templateUrl: - "/mix-app/views/app-portal/components/modal-nav-posts/modal-nav-posts.html", - bindings: { - srcColumn: "=", - srcId: "=", - query: "=", - selected: "=", - save: "&", - }, - controller: [ - "$rootScope", - "$scope", - "$routeParams", - "ngAppSettings", - "PostRestService", - function ($rootScope, $scope, $routeParams, ngAppSettings, postService) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.navs = []; - ctrl.data = { items: [] }; - ctrl.loadPosts = async function (pageIndex) { - // ctrl.request.query = ctrl.query + ctrl.srcId; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var d = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = d.toISOString(); - } - if (ctrl.request.toDate !== null) { - var d = new Date(ctrl.request.toDate); - ctrl.request.toDate = d.toISOString(); - } - if ($routeParams.type) { - ctrl.request.postType = $routeParams.type; - } else { - ctrl.request.postType = ""; - } - var response = await postService.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - ctrl.navs = []; - angular.forEach(response.data.items, function (e) { - var item = { - priority: e.priority, - description: e.title, - postId: e.id, - image: e.thumbnailUrl, - specificulture: e.specificulture, - post: e, - status: "Published", - isActived: false, - }; - item[ctrl.srcColumn] = ctrl.srcId; - ctrl.navs.push(item); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.saveSelected = function () { - ctrl.selected = $rootScope.filterArray( - ctrl.navs, - ["isActived"], - [true] - ); - setTimeout(() => { - ctrl.save().then(() => { - ctrl.loadPosts(); - }); - }, 500); - }; - }, - ], -}); - modules.component("modalNavs", { templateUrl: "/mix-app/views/app-portal/components/modal-navs/view.html", bindings: { @@ -12652,18 +12582,99 @@ modules.component("modalNavs", { angular.forEach(ctrl.data.items, (element) => { element.isActived = false; }); - item.isActived = true; + item.isActived = true; + } + }; + ctrl.saveSelected = function () { + ctrl.selected = $rootScope.filterArray( + ctrl.data.items, + ["isActived"], + [true] + ); + if (ctrl.save) { + ctrl.save({ selected: ctrl.selected }); + } + }; + }, + ], +}); + +modules.component("modalNavPosts", { + templateUrl: + "/mix-app/views/app-portal/components/modal-nav-posts/modal-nav-posts.html", + bindings: { + srcColumn: "=", + srcId: "=", + query: "=", + selected: "=", + save: "&", + }, + controller: [ + "$rootScope", + "$scope", + "$routeParams", + "ngAppSettings", + "PostRestService", + function ($rootScope, $scope, $routeParams, ngAppSettings, postService) { + var ctrl = this; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.navs = []; + ctrl.data = { items: [] }; + ctrl.loadPosts = async function (pageIndex) { + // ctrl.request.query = ctrl.query + ctrl.srcId; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var d = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = d.toISOString(); + } + if (ctrl.request.toDate !== null) { + var d = new Date(ctrl.request.toDate); + ctrl.request.toDate = d.toISOString(); + } + if ($routeParams.type) { + ctrl.request.postType = $routeParams.type; + } else { + ctrl.request.postType = ""; + } + var response = await postService.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + ctrl.navs = []; + angular.forEach(response.data.items, function (e) { + var item = { + priority: e.priority, + description: e.title, + postId: e.id, + image: e.thumbnailUrl, + specificulture: e.specificulture, + post: e, + status: "Published", + isActived: false, + }; + item[ctrl.srcColumn] = ctrl.srcId; + ctrl.navs.push(item); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); } }; ctrl.saveSelected = function () { ctrl.selected = $rootScope.filterArray( - ctrl.data.items, + ctrl.navs, ["isActived"], [true] ); - if (ctrl.save) { - ctrl.save({ selected: ctrl.selected }); - } + setTimeout(() => { + ctrl.save().then(() => { + ctrl.loadPosts(); + }); + }, 500); }; }, ], @@ -12909,46 +12920,6 @@ modules.component("monacoEditor", { ], }); -modules.component("portalThemeSettings", { - templateUrl: - "/mix-app/views/app-portal/components/portal-theme-settings/view.html", - bindings: { - showLink: "=", - }, - controller: [ - "$rootScope", - "$scope", - "AppSettingsServices", - function ($rootScope, $scope, appSettingsServices) { - var ctrl = this; - this.$onInit = function () { - ctrl.portalThemeSettings = - $rootScope.globalSettings.portalThemeSettings; - }; - ctrl.applyThemeSettings = function () { - $rootScope.globalSettings.portalThemeSettings = - ctrl.portalThemeSettings; - }; - ctrl.saveThemeSettings = async function () { - var resp = await appSettingsServices.saveGlobalSettings( - "PortalThemeSettings", - ctrl.portalThemeSettings - ); - if (resp && resp.isSucceed) { - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - }, - ], -}); - modules.component("navs", { templateUrl: "/mix-app/views/app-portal/components/navigations/navigations.html", @@ -13009,75 +12980,6 @@ modules.component("navs", { ], }); -modules.component("propertiesValue", { - templateUrl: - "/mix-app/views/app-portal/components/properties-value/view.html", - bindings: { - title: "=", - columns: "=", - properties: "=", - }, - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.defaultAttr = { - title: "", - name: "", - default: null, - options: [], - priority: 0, - dataType: 7, - isGroupBy: false, - isSelect: false, - isDisplay: true, - width: 3, - }; - ctrl.selectedProp = null; - ctrl.localizeSettings = $rootScope.globalSettings; - - ctrl.$doCheck = function () { - if ( - angular.toJson(ctrl.columns) != angular.toJson(ctrl.trackedColumns) - ) { - ctrl.trackedColumns = angular.copy(ctrl.columns); - ctrl.trackedProperties = angular.copy(ctrl.properties); - ctrl.loadEditors(); - } - }.bind(ctrl); - - ctrl.loadEditors = function () { - ctrl.properties = []; - for (let i = 0; i < ctrl.columns.length; i++) { - var col = ctrl.columns[i]; - var oldObj = - $rootScope.findObjectByKey( - ctrl.trackedProperties, - "name", - col.name - ) || {}; - - ctrl.properties.push({ - title: col.title, - name: col.name, - dataType: col.dataType, - value: oldObj.value || col.defaultValue, - options: col.options, - }); - } - }; - - ctrl.addAttr = function () { - if (ctrl.columns) { - var t = angular.copy(ctrl.defaultAttr); - ctrl.columns.push(t); - } - }; - }, - ], -}); - modules.component("propertiesStructure", { templateUrl: "/mix-app/views/app-portal/components/properties-structure/view.html", @@ -13208,6 +13110,115 @@ modules.component("propertiesStructure", { }, }); +modules.component("portalThemeSettings", { + templateUrl: + "/mix-app/views/app-portal/components/portal-theme-settings/view.html", + bindings: { + showLink: "=", + }, + controller: [ + "$rootScope", + "$scope", + "AppSettingsServices", + function ($rootScope, $scope, appSettingsServices) { + var ctrl = this; + this.$onInit = function () { + ctrl.portalThemeSettings = + $rootScope.globalSettings.portalThemeSettings; + }; + ctrl.applyThemeSettings = function () { + $rootScope.globalSettings.portalThemeSettings = + ctrl.portalThemeSettings; + }; + ctrl.saveThemeSettings = async function () { + var resp = await appSettingsServices.saveGlobalSettings( + "PortalThemeSettings", + ctrl.portalThemeSettings + ); + if (resp && resp.isSucceed) { + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $scope.$apply(); + } + }; + }, + ], +}); + +modules.component("propertiesValue", { + templateUrl: + "/mix-app/views/app-portal/components/properties-value/view.html", + bindings: { + title: "=", + columns: "=", + properties: "=", + }, + controller: [ + "$rootScope", + "$scope", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.defaultAttr = { + title: "", + name: "", + default: null, + options: [], + priority: 0, + dataType: 7, + isGroupBy: false, + isSelect: false, + isDisplay: true, + width: 3, + }; + ctrl.selectedProp = null; + ctrl.localizeSettings = $rootScope.globalSettings; + + ctrl.$doCheck = function () { + if ( + angular.toJson(ctrl.columns) != angular.toJson(ctrl.trackedColumns) + ) { + ctrl.trackedColumns = angular.copy(ctrl.columns); + ctrl.trackedProperties = angular.copy(ctrl.properties); + ctrl.loadEditors(); + } + }.bind(ctrl); + + ctrl.loadEditors = function () { + ctrl.properties = []; + for (let i = 0; i < ctrl.columns.length; i++) { + var col = ctrl.columns[i]; + var oldObj = + $rootScope.findObjectByKey( + ctrl.trackedProperties, + "name", + col.name + ) || {}; + + ctrl.properties.push({ + title: col.title, + name: col.name, + dataType: col.dataType, + value: oldObj.value || col.defaultValue, + options: col.options, + }); + } + }; + + ctrl.addAttr = function () { + if (ctrl.columns) { + var t = angular.copy(ctrl.defaultAttr); + ctrl.columns.push(t); + } + }; + }, + ], +}); + modules.component("relatedNavs", { templateUrl: "/mix-app/views/app-portal/components/related-navigations/view.html", diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html index ea5145490..cab6faba9 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html @@ -1 +1 @@ -

    Loading...
    \ No newline at end of file +
    Loading...
    {{$ctrl.translate($ctrl.column.name)}}: {{$ctrl.translate($ctrl.column.dataType)}}
    \ No newline at end of file From 1b168cfb261e7f5dae82ef4fbc0291b06182b970 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Sun, 22 Aug 2021 16:24:04 +0700 Subject: [PATCH 06/83] fix save module form --- .../wwwroot/mix-app/js/app-portal.min.js | 8103 +++++++++-------- .../wwwroot/mix-app/js/app-shared.min.js | 2766 +++--- 2 files changed, 5435 insertions(+), 5434 deletions(-) diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js index e32259c81..934c3fd7e 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js @@ -1,4 +1,4 @@ -/* Sun Aug 22 2021 15:56:07 GMT+0700 (Indochina Time) */"use strict"; +/* Sun Aug 22 2021 16:20:30 GMT+0700 (Indochina Time) */"use strict"; var app = angular.module("MixPortal", [ "angularCroppie", "ui.bootstrap", @@ -446,207 +446,6 @@ app.factory("ConfigurationService", [ }, ]); -"use strict"; -app.controller("CustomerController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$timeout", - "$location", - "CustomerServices", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $timeout, - $location, - customerServices - ) { - $scope.request = angular.copy(ngAppSettings.request); - $scope.request.contentStatuses = ["Active"]; - $scope.request.status = "0"; - $scope.activedCustomer = null; - $scope.relatedCustomers = []; - $rootScope.isBusy = false; - $scope.data = { - pageIndex: 0, - pageSize: 1, - totalItems: 0, - }; - $scope.errors = []; - - $scope.range = function (max) { - var input = []; - for (var i = 1; i <= max; i += 1) input.push(i); - return input; - }; - - $scope.loadCustomer = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - var response = await customerServices.getCustomer(id, "portal"); - if (response.isSucceed) { - $scope.activedCustomer = response.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.loadCustomers = async function (pageIndex) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); - } - if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); - } - var resp = await customerServices.getCustomers($scope.request); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - //$("html, body").animate({ "scrollTop": "0px" }, 500); - $.each($scope.data.items, function (i, customer) { - $.each($scope.activedCustomers, function (i, e) { - if (e.customerId === customer.id) { - customer.isHidden = true; - } - }); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - - $scope.removeCustomer = function (id) { - $rootScope.showConfirm( - $scope, - "removeCustomerConfirmed", - [id], - null, - "Remove Customer", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeCustomerConfirmed = async function (id) { - var result = await customerServices.removeCustomer(id); - if (result.isSucceed) { - $rootScope.showMessage("success", "success"); - $scope.loadCustomers(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.saveCustomer = async function (customer) { - customer.content = $(".editor-content").val(); - var resp = await customerServices.saveCustomer(customer); - if (resp && resp.isSucceed) { - $scope.activedCustomer = resp.data; - $rootScope.showMessage("Update successfully!", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - //$location.path('/portal/customer/details/' + resp.data.id); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("CustomerServices", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var customersServiceFactory = {}; - - var settings = $rootScope.globalSettings; - - var _getCustomer = async function (id, type) { - var apiUrl = "/queen-beauty/customer/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + id; - } - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _initCustomer = async function (type) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "GET", - url: apiUrl + "init/" + type, - }; - return await apiService.getApiResult(req); - }; - - var _getCustomers = async function (request) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _removeCustomer = async function (id) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; - - var _saveCustomer = async function (customer) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(customer), - }; - return await apiService.getApiResult(req); - }; - - customersServiceFactory.getCustomer = _getCustomer; - customersServiceFactory.initCustomer = _initCustomer; - customersServiceFactory.getCustomers = _getCustomers; - customersServiceFactory.removeCustomer = _removeCustomer; - customersServiceFactory.saveCustomer = _saveCustomer; - return customersServiceFactory; - }, -]); - "use strict"; app.controller("CultureController", [ "$scope", @@ -1222,105 +1021,168 @@ app.factory("CultureService", [ ]); "use strict"; -app.controller("FileController", [ +app.controller("DashboardController", [ "$scope", "$rootScope", "ngAppSettings", - "$routeParams", "$timeout", "$location", - "AuthService", - "FileServices", + "DashboardServices", function ( $scope, $rootScope, ngAppSettings, - $routeParams, $timeout, $location, - authService, - fileServices + dashboardServices ) { - $scope.request = { - pageSize: "10", - pageIndex: 0, - status: "Published", - orderBy: "CreatedDateTime", - direction: "Desc", - fromDate: null, - toDate: null, - keyword: "", - key: "", - }; - - $scope.activedFile = null; - $scope.relatedFiles = []; - $rootScope.isBusy = false; + $scope.pageClass = "page-dashboard"; + $(".side-nav li").removeClass("active"); + $(".side-nav .page-dashboard").addClass("active"); $scope.data = { - pageIndex: 0, - pageSize: 1, - totalItems: 0, - }; - $scope.errors = []; - - $scope.range = function (max) { - var input = []; - for (var i = 1; i <= max; i += 1) input.push(i); - return input; - }; - $scope.loadPage = async function (folder) { - if (folder) { - $scope.request.key += $scope.request.key !== "" ? "/" : ""; - $scope.request.key += folder; - } - $location.url( - "/portal/file/list?folder=" + encodeURIComponent($scope.request.key) - ); + totalPage: 0, + totalPost: 0, + totalProduct: 0, + totalUser: 0, }; - $scope.loadFile = async function () { - $rootScope.isBusy = true; - $scope.listUrl = "/portal/file/list?folder/" + $routeParams.folder; - $rootScope.isBusy = true; - var response = await fileServices.getFile( - $routeParams.folder, - $routeParams.filename - ); + $scope.users = []; + $scope.$on("$viewContentLoaded", function () { + $rootScope.isBusy = false; + }); + $scope.getDashboardInfo = async function () { + $rootScope.isBusy = true; + var response = await dashboardServices.getDashboardInfo(); if (response.isSucceed) { - $scope.activedFile = response.data; + // $('#mainSection').removeClass('card'); + $scope.data = response.data; $rootScope.isBusy = false; $scope.$apply(); + // $scope.getChart(); } else { $rootScope.showErrors(response.errors); $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.loadFiles = async function (folder) { - if (folder) { - $scope.request.key += - $scope.request.key !== "" ? "wwwroot/" : "wwwroot"; - $scope.request.key += folder; + $scope.getChart = function () { + var ctx = document.getElementById("myChart"); + var myChart = new Chart(ctx, { + // type: 'pie', + // data: { + // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], + // datasets: [{ + // label: "Population (millions)", + // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], + // data: [2478,5267,734,784,433] + // }] + // }, + // options: { + // title: { + // display: true, + // text: 'Predicted world population (millions) in 2050' + // } + // } + }); + }; + }, +]); + +"use strict"; +app.factory("DashboardServices", [ + "$rootScope", + "$http", + "ApiService", + "CommonService", + function ($rootScope, $http, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var usersServiceFactory = {}; + var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; + var _getDashboardInfo = async function () { + var req = { + method: "GET", + url: apiUrl + "/dashboard", + }; + return await apiService.getApiResult(req); + }; + + usersServiceFactory.getDashboardInfo = _getDashboardInfo; + return usersServiceFactory; + }, +]); + +"use strict"; +app.controller("CustomerController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$timeout", + "$location", + "CustomerServices", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $timeout, + $location, + customerServices + ) { + $scope.request = angular.copy(ngAppSettings.request); + $scope.request.contentStatuses = ["Active"]; + $scope.request.status = "0"; + $scope.activedCustomer = null; + $scope.relatedCustomers = []; + $rootScope.isBusy = false; + $scope.data = { + pageIndex: 0, + pageSize: 1, + totalItems: 0, + }; + $scope.errors = []; + + $scope.range = function (max) { + var input = []; + for (var i = 1; i <= max; i += 1) input.push(i); + return input; + }; + + $scope.loadCustomer = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + var response = await customerServices.getCustomer(id, "portal"); + if (response.isSucceed) { + $scope.activedCustomer = response.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); } else { - $scope.request.key = $routeParams.folder - ? $routeParams.folder - : "wwwroot"; + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); } - if ($routeParams.folder) { - $scope.backUrl = - "/portal/file/list?folder=" + - $routeParams.folder.substring( - 0, - $routeParams.folder.lastIndexOf("/") - ); + }; + $scope.loadCustomers = async function (pageIndex) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; } - $rootScope.isBusy = true; - var resp = await fileServices.getFiles($scope.request); + if ($scope.request.fromDate !== null) { + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); + } + if ($scope.request.toDate !== null) { + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); + } + var resp = await customerServices.getCustomers($scope.request); if (resp && resp.isSucceed) { $scope.data = resp.data; - $.each($scope.data.items, function (i, file) { - $.each($scope.activedFiles, function (i, e) { - if (e.fileId === file.id) { - file.isHidden = true; + //$("html, body").animate({ "scrollTop": "0px" }, 500); + $.each($scope.data.items, function (i, customer) { + $.each($scope.activedCustomers, function (i, e) { + if (e.customerId === customer.id) { + customer.isHidden = true; } }); }); @@ -1330,66 +1192,71 @@ app.controller("FileController", [ if (resp) { $rootScope.showErrors(resp.errors); } - $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.removeFile = async function (id) { - if (confirm("Are you sure!")) { - $rootScope.isBusy = true; - var resp = await fileServices.removeFile(id); - if (resp && resp.isSucceed) { - $scope.loadFiles(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } + $scope.removeCustomer = function (id) { + $rootScope.showConfirm( + $scope, + "removeCustomerConfirmed", + [id], + null, + "Remove Customer", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeCustomerConfirmed = async function (id) { + var result = await customerServices.removeCustomer(id); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + $scope.loadCustomers(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); } }; - $scope.saveFile = async function (file) { - $rootScope.isBusy = true; - var resp = await fileServices.saveFile(file); + $scope.saveCustomer = async function (customer) { + customer.content = $(".editor-content").val(); + var resp = await customerServices.saveCustomer(customer); if (resp && resp.isSucceed) { - $scope.activedFile = resp.data; + $scope.activedCustomer = resp.data; $rootScope.showMessage("Update successfully!", "success"); $rootScope.isBusy = false; $scope.$apply(); + //$location.path('/portal/customer/details/' + resp.data.id); } else { if (resp) { $rootScope.showErrors(resp.errors); } - $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.updateTemplateContent = function (content) { - $scope.activedFile.content = content; - }; }, ]); "use strict"; -app.factory("FileServices", [ +app.factory("CustomerServices", [ "$http", "$rootScope", "ApiService", "CommonService", - "BaseService", - function ($http, $rootScope, apiService, commonService, baseService) { + function ($http, $rootScope, apiService, commonService) { //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - var filesServiceFactory = angular.copy(baseService); - filesServiceFactory.init("file", true); + var customersServiceFactory = {}; + var settings = $rootScope.globalSettings; - var _getFile = async function (folder, filename) { - var apiUrl = "/file/"; - var url = apiUrl + "details?folder=" + folder + "&filename=" + filename; + var _getCustomer = async function (id, type) { + var apiUrl = "/queen-beauty/customer/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + id; + } var req = { method: "GET", url: url, @@ -1397,8 +1264,8 @@ app.factory("FileServices", [ return await apiService.getApiResult(req); }; - var _initFile = async function (type) { - var apiUrl = "/file/"; + var _initCustomer = async function (type) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "GET", url: apiUrl + "init/" + type, @@ -1406,8 +1273,8 @@ app.factory("FileServices", [ return await apiService.getApiResult(req); }; - var _getFiles = async function (request) { - var apiUrl = "/file/"; + var _getCustomers = async function (request) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "POST", url: apiUrl + "list", @@ -1417,130 +1284,263 @@ app.factory("FileServices", [ return await apiService.getApiResult(req); }; - var _removeFile = async function (fullPath) { - var apiUrl = "/file/"; + var _removeCustomer = async function (id) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "GET", - url: apiUrl + "delete/?fullPath=" + fullPath, + url: apiUrl + "delete/" + id, }; return await apiService.getApiResult(req); }; - var _saveFile = async function (file) { - var apiUrl = "/file/"; + var _saveCustomer = async function (customer) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "POST", url: apiUrl + "save", - data: JSON.stringify(file), + data: JSON.stringify(customer), }; return await apiService.getApiResult(req); }; - var _uploadFile = async function (file, folder) { - var apiUrl = "/file/upload-file"; - var fd = new FormData(); - fd.append("folder", folder); - fd.append("file", file); - return await filesServiceFactory.ajaxSubmitForm(fd, apiUrl); - }; - filesServiceFactory.getFile = _getFile; - filesServiceFactory.initFile = _initFile; - filesServiceFactory.getFiles = _getFiles; - filesServiceFactory.removeFile = _removeFile; - filesServiceFactory.saveFile = _saveFile; - filesServiceFactory.uploadFile = _uploadFile; - return filesServiceFactory; + customersServiceFactory.getCustomer = _getCustomer; + customersServiceFactory.initCustomer = _initCustomer; + customersServiceFactory.getCustomers = _getCustomers; + customersServiceFactory.removeCustomer = _removeCustomer; + customersServiceFactory.saveCustomer = _saveCustomer; + return customersServiceFactory; }, ]); "use strict"; -app.controller("DashboardController", [ +app.controller("FileController", [ "$scope", "$rootScope", "ngAppSettings", + "$routeParams", "$timeout", "$location", - "DashboardServices", + "AuthService", + "FileServices", function ( $scope, $rootScope, ngAppSettings, + $routeParams, $timeout, $location, - dashboardServices + authService, + fileServices ) { - $scope.pageClass = "page-dashboard"; - $(".side-nav li").removeClass("active"); - $(".side-nav .page-dashboard").addClass("active"); + $scope.request = { + pageSize: "10", + pageIndex: 0, + status: "Published", + orderBy: "CreatedDateTime", + direction: "Desc", + fromDate: null, + toDate: null, + keyword: "", + key: "", + }; + + $scope.activedFile = null; + $scope.relatedFiles = []; + $rootScope.isBusy = false; $scope.data = { - totalPage: 0, - totalPost: 0, - totalProduct: 0, - totalUser: 0, + pageIndex: 0, + pageSize: 1, + totalItems: 0, }; - $scope.users = []; - $scope.$on("$viewContentLoaded", function () { - $rootScope.isBusy = false; - }); - $scope.getDashboardInfo = async function () { + $scope.errors = []; + + $scope.range = function (max) { + var input = []; + for (var i = 1; i <= max; i += 1) input.push(i); + return input; + }; + $scope.loadPage = async function (folder) { + if (folder) { + $scope.request.key += $scope.request.key !== "" ? "/" : ""; + $scope.request.key += folder; + } + $location.url( + "/portal/file/list?folder=" + encodeURIComponent($scope.request.key) + ); + }; + $scope.loadFile = async function () { $rootScope.isBusy = true; - var response = await dashboardServices.getDashboardInfo(); + $scope.listUrl = "/portal/file/list?folder/" + $routeParams.folder; + $rootScope.isBusy = true; + var response = await fileServices.getFile( + $routeParams.folder, + $routeParams.filename + ); if (response.isSucceed) { - // $('#mainSection').removeClass('card'); - $scope.data = response.data; + $scope.activedFile = response.data; $rootScope.isBusy = false; $scope.$apply(); - // $scope.getChart(); } else { $rootScope.showErrors(response.errors); $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.getChart = function () { - var ctx = document.getElementById("myChart"); - var myChart = new Chart(ctx, { - // type: 'pie', - // data: { - // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], - // datasets: [{ - // label: "Population (millions)", - // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], - // data: [2478,5267,734,784,433] - // }] - // }, - // options: { - // title: { - // display: true, - // text: 'Predicted world population (millions) in 2050' - // } - // } - }); + $scope.loadFiles = async function (folder) { + if (folder) { + $scope.request.key += + $scope.request.key !== "" ? "wwwroot/" : "wwwroot"; + $scope.request.key += folder; + } else { + $scope.request.key = $routeParams.folder + ? $routeParams.folder + : "wwwroot"; + } + if ($routeParams.folder) { + $scope.backUrl = + "/portal/file/list?folder=" + + $routeParams.folder.substring( + 0, + $routeParams.folder.lastIndexOf("/") + ); + } + $rootScope.isBusy = true; + var resp = await fileServices.getFiles($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + $.each($scope.data.items, function (i, file) { + $.each($scope.activedFiles, function (i, e) { + if (e.fileId === file.id) { + file.isHidden = true; + } + }); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.removeFile = async function (id) { + if (confirm("Are you sure!")) { + $rootScope.isBusy = true; + var resp = await fileServices.removeFile(id); + if (resp && resp.isSucceed) { + $scope.loadFiles(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } + }; + + $scope.saveFile = async function (file) { + $rootScope.isBusy = true; + var resp = await fileServices.saveFile(file); + if (resp && resp.isSucceed) { + $scope.activedFile = resp.data; + $rootScope.showMessage("Update successfully!", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateTemplateContent = function (content) { + $scope.activedFile.content = content; }; }, ]); "use strict"; -app.factory("DashboardServices", [ - "$rootScope", +app.factory("FileServices", [ "$http", + "$rootScope", "ApiService", "CommonService", - function ($rootScope, $http, apiService, commonService) { + "BaseService", + function ($http, $rootScope, apiService, commonService, baseService) { //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - var usersServiceFactory = {}; - var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; - var _getDashboardInfo = async function () { + var filesServiceFactory = angular.copy(baseService); + filesServiceFactory.init("file", true); + var settings = $rootScope.globalSettings; + + var _getFile = async function (folder, filename) { + var apiUrl = "/file/"; + var url = apiUrl + "details?folder=" + folder + "&filename=" + filename; var req = { method: "GET", - url: apiUrl + "/dashboard", + url: url, }; return await apiService.getApiResult(req); }; - usersServiceFactory.getDashboardInfo = _getDashboardInfo; - return usersServiceFactory; + var _initFile = async function (type) { + var apiUrl = "/file/"; + var req = { + method: "GET", + url: apiUrl + "init/" + type, + }; + return await apiService.getApiResult(req); + }; + + var _getFiles = async function (request) { + var apiUrl = "/file/"; + var req = { + method: "POST", + url: apiUrl + "list", + data: JSON.stringify(request), + }; + + return await apiService.getApiResult(req); + }; + + var _removeFile = async function (fullPath) { + var apiUrl = "/file/"; + var req = { + method: "GET", + url: apiUrl + "delete/?fullPath=" + fullPath, + }; + return await apiService.getApiResult(req); + }; + + var _saveFile = async function (file) { + var apiUrl = "/file/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(file), + }; + return await apiService.getApiResult(req); + }; + var _uploadFile = async function (file, folder) { + var apiUrl = "/file/upload-file"; + var fd = new FormData(); + fd.append("folder", folder); + fd.append("file", file); + return await filesServiceFactory.ajaxSubmitForm(fd, apiUrl); + }; + + filesServiceFactory.getFile = _getFile; + filesServiceFactory.initFile = _initFile; + filesServiceFactory.getFiles = _getFiles; + filesServiceFactory.removeFile = _removeFile; + filesServiceFactory.saveFile = _saveFile; + filesServiceFactory.uploadFile = _uploadFile; + return filesServiceFactory; }, ]); @@ -2397,14 +2397,16 @@ app.factory("ModuleRestService", [ ]); "use strict"; -app.controller("MixDatabaseDataController", [ +app.controller("ModuleDataController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", + "ModuleDataRestService", + "ModuleRestService", + "ApiService", + "CommonService", function ( $scope, $rootScope, @@ -2412,7 +2414,8 @@ app.controller("MixDatabaseDataController", [ $routeParams, $location, service, - columnService + moduleService, + commonService ) { BaseRestCtrl.call( this, @@ -2423,100 +2426,88 @@ app.controller("MixDatabaseDataController", [ ngAppSettings, service ); - $scope.queries = {}; - $scope.data = {}; - $scope.exportAll = true; - $scope.localizeSettings = $rootScope.globalSettings; // $scope.request.orderBy = "Priority"; // $scope.request.direction = "Asc"; - $scope.filterType = "contain"; - $scope.defaultId = "default"; - $scope.importFile = { - file: null, - fullPath: "", - folder: "import", - title: "", - description: "", - }; - $scope.initRouteParams = () => { - $scope.requestKey = `request${$rootScope.generateKeyword( - $location.$$path, - "_" - )}_${$routeParams.mixDatabaseId}`; - $scope.request = $rootScope.getRequest($scope.requestKey); - $scope.mixDatabaseId = $routeParams.mixDatabaseId; - $scope.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.mixDatabaseTitle = $routeParams.mixDatabaseTitle; - $scope.parentId = $routeParams.parentId; - $scope.parentType = $routeParams.parentType; - $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.request.isGroup = $routeParams.isGroup || false; - if ($routeParams.backUrl) { - $scope.backUrl = decodeURIComponent($routeParams.backUrl); - } - if ($routeParams.dataId != $scope.defaultId) { - $scope.dataId = $routeParams.dataId; - } - - if ($scope.parentId && $scope.parentType) { - $scope.refDataModel = { - parentId: $scope.parentId, - parentType: $scope.parentType, - }; - } - }; + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = $routeParams.moduleId; + $scope.backUrl = `/portal/module-data/list/${$scope.moduleId}`; + $scope.module = null; + $scope.dataColumns = []; + $scope.editDataUrl = "/portal/module-data/details/" + $scope.moduleId; $scope.init = async function () { - $scope.initRouteParams(); - if ($scope.mixDatabaseName || $scope.mixDatabaseId) { - var getFields = await columnService.initData( - $scope.mixDatabaseName || $scope.mixDatabaseId - ); - if (getFields.isSucceed) { - $scope.columns = getFields.data; + $scope.id = $routeParams.id; + if (!$scope.module) { + var getModule = await moduleService.getSingle([$scope.moduleId]); + if (getModule.isSucceed) { + $scope.module = getModule.data; + angular.forEach($scope.module.columns, function (e, i) { + if (e.isDisplay) { + $scope.dataColumns.push({ + title: e.title, + name: e.name, + datatype: e.dataType, + filter: true, + type: 0, // string - ngAppSettings.dataTypes[0] + }); + } + }); $scope.$apply(); } } }; - $scope.saveSuccess = function (data) { - $scope.viewmodel = data; - }; - $scope.selectData = function () { - if ($scope.selectedList.data.length) { - $scope.viewmodel = $scope.selectedList.data[0]; + $scope.getList = async function () { + $rootScope.isBusy = true; + $scope.request.module_id = $scope.moduleId; + var response = await service.getList($scope.request); + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); } }; - // $scope.saveSuccessCallback = function () { - // if ($location.path() == "/portal/mix-database-data/create") { - // let backUrl = - // $scope.backUrl || - // `/portal/mix-database-data/details?dataId=${$scope.viewmodel.id}`; - // $rootScope.goToSiteUrl(backUrl); - // } else { - // if ($scope.parentId && $scope.parentType == 'Set') { - // $rootScope.goToSiteUrl(`/portal/mix-database-data/details?dataId=${$scope.parentId}`); - // } else { - // let backUrl = - // $scope.backUrl || - // `/portal/mix-database-data/list?mixDatabaseId=${$scope.viewmodel.mixDatabaseId}&mixDatabaseName=${$scope.viewmodel.mixDatabaseName}&mixDatabaseTitle=${$scope.viewmodel.mixDatabaseName}`; - // $rootScope.goToSiteUrl(backUrl); - // } - // } - // }; - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); + $scope.export = async function () { + $rootScope.isBusy = true; + $scope.request.module_id = $scope.moduleId; + var response = await service.export($scope.request); + if (response.isSucceed) { + window.top.location = response.data.webPath; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } }; - $scope.edit = function (data) { - $rootScope.goToPath( - "/portal/mix-database-data/details?dataId=" + data.id + "&abc" - ); + + $scope.getSingle = async function () { + $rootScope.isBusy = true; + var resp = await service.getSingle($routeParams.id, "portal"); + if (resp && resp.isSucceed) { + $scope.activedModuleData = resp.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } }; - $scope.remove = function (data) { + $scope.remove = function (dataId) { $rootScope.showConfirm( $scope, "removeConfirmed", - [data.id], + [dataId], null, "Remove", "Deleted data will not able to recover, are you sure you want to delete this item?" @@ -2541,63 +2532,9 @@ app.controller("MixDatabaseDataController", [ $scope.$apply(); } }; - $scope.import = async function () { - if ($scope.validateDataFile()) { - $rootScope.isBusy = true; - var form = document.getElementById("form-portal"); - var result = await service.import( - $scope.mixDatabaseName, - form["import-data-inp"].files[0] - ); - if (result.isSucceed) { - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.getList(0); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - } - }; - $scope.validateDataFile = function () { - if (!$scope.importFile.file) { - $rootScope.showMessage("Please choose data file", "danger"); - return false; - } else { - return true; - } - }; - $scope.sendMail = function (data) { - var email = ""; - angular.forEach(data.values, function (e) { - if (e.mixDatabaseColumnName == "email") { - email = e.stringValue; - } - }); - $rootScope.showConfirm( - $scope, - "sendMailConfirmed", - [data], - null, - "Send mail", - "Are you sure to send mail to " + email - ); - }; - $scope.sendMailConfirmed = async function (data) { - $rootScope.isBusy = true; - $rootScope.isBusy = true; - var result = await service.sendMail([data.id]); - if (result.isSucceed) { - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; + + $scope.removeCallback = function () {}; + $scope.saveOthers = async function () { var response = await service.saveList($scope.others); if (response.isSucceed) { @@ -2609,141 +2546,29 @@ app.controller("MixDatabaseDataController", [ $scope.$apply(); } }; - $scope.selectImportFile = function (files) { - if (files !== undefined && files !== null && files.length > 0) { - const file = files[0]; - $scope.importFile.folder = "imports"; - $scope.importFile.title = $scope.mixDatabaseName; - $scope.importFile.description = $scope.mixDatabaseName + "'s data"; - $scope.importFile.file = file; + }, +]); - // if (ctrl.auto=='true') { - // ctrl.uploadFile(file); - // } - // else { - // ctrl.getBase64(file); - // } - } - }; - $scope.getList = async function (pageIndex) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var df = new Date($scope.request.fromDate); - $scope.request.fromDate = df.toISOString(); - } - if ($scope.request.toDate !== null) { - var dt = new Date($scope.request.toDate); - $scope.request.toDate = dt.toISOString(); - } - var query = {}; - if ($routeParams.mixDatabaseId) { - $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; - } - $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.request.filterType = $routeParams.filterType || "contain"; - Object.keys($scope.queries).forEach((e) => { - if ($scope.queries[e]) { - query[e] = $scope.queries[e]; - } - }); - $scope.request.query = JSON.stringify(query); - $rootScope.isBusy = true; - var resp = await service.getList($scope.request); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - $.each($scope.data.items, function (i, data) { - $.each($scope.activeddata, function (i, e) { - if (e.dataId === data.id) { - data.isHidden = true; - } - }); - }); - if ($scope.getListSuccessCallback) { - $scope.getListSuccessCallback(); - } - $("html, body").animate( - { - scrollTop: "0px", - }, - 500 - ); - if (!resp.data || !resp.data.items.length) { - $scope.queries = {}; - } - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - if ($scope.getListFailCallback) { - $scope.getListFailCallback(); - } - $scope.queries = {}; - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.export = async function (pageIndex, exportAll) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var df = new Date($scope.request.fromDate); - $scope.request.fromDate = df.toISOString(); - } - if ($scope.request.toDate !== null) { - var dt = new Date($scope.request.toDate); - $scope.request.toDate = dt.toISOString(); - } - var query = {}; - if ($routeParams.mixDatabaseId) { - $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; - } - $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; - $scope.request.filterType = $routeParams.filterType || "contain"; - Object.keys($scope.queries).forEach((e) => { - if ($scope.queries[e]) { - query[e] = $scope.queries[e]; - } - }); - $scope.request.query = JSON.stringify(query); - var request = angular.copy($scope.request); - $scope.exportAll = $scope.exportAll; - if (exportAll) { - request.pageSize = 10000; - request.pageIndex = 0; - } - $rootScope.isBusy = true; - var resp = await service.export(request); - if (resp && resp.isSucceed) { - if (resp.data) { - window.top.location = resp.data.webPath; - } else { - $rootScope.showMessage("Nothing to export"); - } - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.migrate = async function () { - if ($routeParams.mixDatabaseId) { - $rootScope.isBusy = true; - var result = await service.migrate($routeParams.mixDatabaseId); - $scope.handleResult(result); - $rootScope.isBusy = false; - $scope.$apply(); - } +"use strict"; +app.factory("ModuleDataRestService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("module-data/portal"); + // Define more service methods here + + var _initForm = async function (moduleId) { + var url = `${this.prefixUrl}/init-form/${moduleId}`; + var req = { + method: "GET", + url: url, + }; + return await apiService.getRestApiResult(req); }; + serviceFactory.initForm = _initForm; + return serviceFactory; }, ]); @@ -2901,15 +2726,14 @@ app.factory("ModuleGalleryService", [ ]); "use strict"; -app.controller("ModulePostController", [ +app.controller("MixDatabaseDataController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "ModulePostRestService", - "ApiService", - "CommonService", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", function ( $scope, $rootScope, @@ -2917,62 +2741,120 @@ app.controller("ModulePostController", [ $routeParams, $location, service, - commonService + columnService ) { - BaseCtrl.call( + BaseRestCtrl.call( this, $scope, $rootScope, + $location, $routeParams, ngAppSettings, service ); - $scope.cates = ["Site", "System"]; - $scope.others = []; + $scope.queries = {}; + $scope.data = {}; + $scope.exportAll = true; $scope.localizeSettings = $rootScope.globalSettings; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.translate = $rootScope.translate; - $scope.moduleIds = $routeParams.moduleIds || $routeParams.id; - $scope.pageIds = $routeParams.page_ids; - $scope.type = $routeParams.type; - $scope.getList = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.moduleId = $routeParams.id; - $scope.request.query = "&module_id=" + id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + // $scope.request.orderBy = "Priority"; + // $scope.request.direction = "Asc"; + $scope.filterType = "contain"; + $scope.defaultId = "default"; + $scope.importFile = { + file: null, + fullPath: "", + folder: "import", + title: "", + description: "", + }; + $scope.initRouteParams = () => { + $scope.requestKey = `request${$rootScope.generateKeyword( + $location.$$path, + "_" + )}_${$routeParams.mixDatabaseId}`; + $scope.request = $rootScope.getRequest($scope.requestKey); + $scope.mixDatabaseId = $routeParams.mixDatabaseId; + $scope.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.mixDatabaseTitle = $routeParams.mixDatabaseTitle; + $scope.parentId = $routeParams.parentId; + $scope.parentType = $routeParams.parentType; + $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.request.isGroup = $routeParams.isGroup || false; + if ($routeParams.backUrl) { + $scope.backUrl = decodeURIComponent($routeParams.backUrl); + } + if ($routeParams.dataId != $scope.defaultId) { + $scope.dataId = $routeParams.dataId; + } + + if ($scope.parentId && $scope.parentType) { + $scope.refDataModel = { + parentId: $scope.parentId, + parentType: $scope.parentType, + }; + } + }; + $scope.init = async function () { + $scope.initRouteParams(); + if ($scope.mixDatabaseName || $scope.mixDatabaseId) { + var getFields = await columnService.initData( + $scope.mixDatabaseName || $scope.mixDatabaseId + ); + if (getFields.isSucceed) { + $scope.columns = getFields.data; + $scope.$apply(); + } + } + }; + $scope.saveSuccess = function (data) { + $scope.viewmodel = data; + }; + $scope.selectData = function () { + if ($scope.selectedList.data.length) { + $scope.viewmodel = $scope.selectedList.data[0]; } }; + // $scope.saveSuccessCallback = function () { + // if ($location.path() == "/portal/mix-database-data/create") { + // let backUrl = + // $scope.backUrl || + // `/portal/mix-database-data/details?dataId=${$scope.viewmodel.id}`; + // $rootScope.goToSiteUrl(backUrl); + // } else { + // if ($scope.parentId && $scope.parentType == 'Set') { + // $rootScope.goToSiteUrl(`/portal/mix-database-data/details?dataId=${$scope.parentId}`); + // } else { + // let backUrl = + // $scope.backUrl || + // `/portal/mix-database-data/list?mixDatabaseId=${$scope.viewmodel.mixDatabaseId}&mixDatabaseName=${$scope.viewmodel.mixDatabaseName}&mixDatabaseTitle=${$scope.viewmodel.mixDatabaseName}`; + // $rootScope.goToSiteUrl(backUrl); + // } + // } + // }; + $scope.preview = function (item) { item.editUrl = "/portal/post/details/" + item.id; $rootScope.preview("post", item, item.title, "modal-lg"); }; - $scope.remove = function (moduleId, postId) { + $scope.edit = function (data) { + $rootScope.goToPath( + "/portal/mix-database-data/details?dataId=" + data.id + "&abc" + ); + }; + $scope.remove = function (data) { $rootScope.showConfirm( $scope, "removeConfirmed", - [moduleId, postId], + [data.id], null, "Remove", "Deleted data will not able to recover, are you sure you want to delete this item?" ); }; - $scope.removeConfirmed = async function (moduleId, postId) { + $scope.removeConfirmed = async function (dataId) { $rootScope.isBusy = true; - var result = await service.delete(moduleId, postId); + var result = await service.delete([dataId]); if (result.isSucceed) { if ($scope.removeCallback) { $rootScope.executeFunctionByName( @@ -2988,129 +2870,67 @@ app.controller("ModulePostController", [ $scope.$apply(); } }; - - $scope.removeCallback = function () {}; - - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); + $scope.import = async function () { + if ($scope.validateDataFile()) { + $rootScope.isBusy = true; + var form = document.getElementById("form-portal"); + var result = await service.import( + $scope.mixDatabaseName, + form["import-data-inp"].files[0] + ); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.getList(0); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + } + }; + $scope.validateDataFile = function () { + if (!$scope.importFile.file) { + $rootScope.showMessage("Please choose data file", "danger"); + return false; } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + return true; } }; - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); + $scope.sendMail = function (data) { + var email = ""; + angular.forEach(data.values, function (e) { + if (e.mixDatabaseColumnName == "email") { + email = e.stringValue; + } + }); + $rootScope.showConfirm( + $scope, + "sendMailConfirmed", + [data], + null, + "Send mail", + "Are you sure to send mail to " + email + ); + }; + $scope.sendMailConfirmed = async function (data) { $rootScope.isBusy = true; - var startIndex = $scope.data.items[0].priority - 1; - for (var i = 0; i < $scope.data.items.length; i++) { - $scope.data.items[i].priority = startIndex + i + 1; - } - var resp = await service.updateInfos($scope.data.items); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; + $rootScope.isBusy = true; + var result = await service.sendMail([data.id]); + if (result.isSucceed) { $rootScope.showMessage("success", "success"); $rootScope.isBusy = false; $scope.$apply(); } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } + $rootScope.showMessage("failed"); $rootScope.isBusy = false; $scope.$apply(); } }; - }, -]); - -"use strict"; -app.factory("ModulePostRestService", [ - "$rootScope", - "ApiService", - "CommonService", - "BaseService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("module-post"); - var _delete = async function (moduleId, postId) { - var url = this.prefixUrl + "/delete/" + moduleId + "/" + postId; - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - var _updateInfos = async function (modules) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(modules), - }; - return await apiService.getApiResult(req); - }; - serviceFactory.delete = _delete; - serviceFactory.updateInfos = _updateInfos; - return serviceFactory; - }, -]); - -"use strict"; -app.controller("OrderController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$timeout", - "$location", - "AuthService", - "OrderServices", - "ngAppSettings", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $timeout, - $location, - authService, - orderServices - ) { - $scope.request = angular.copy(ngAppSettings.request); - $scope.request.contentStatuses = [ - "Waiting", - "Serving", - "Rated", - "Finished", - ]; - $scope.request.status = "2"; - $scope.activedOrder = null; - $scope.relatedOrders = []; - $rootScope.isBusy = false; - $scope.data = { - pageIndex: 0, - pageSize: 1, - totalItems: 0, - items: [], - }; - $scope.errors = []; - - $scope.range = function (max) { - var input = []; - for (var i = 1; i <= max; i += 1) input.push(i); - return input; - }; - - $scope.loadOrder = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - var response = await orderServices.getOrder(id, "portal"); + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); if (response.isSucceed) { - $scope.activedOrder = response.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; + $scope.getList(); $scope.$apply(); } else { $rootScope.showErrors(response.errors); @@ -3118,75 +2938,123 @@ app.controller("OrderController", [ $scope.$apply(); } }; - $scope.loadOrders = async function (pageIndex) { + $scope.selectImportFile = function (files) { + if (files !== undefined && files !== null && files.length > 0) { + const file = files[0]; + $scope.importFile.folder = "imports"; + $scope.importFile.title = $scope.mixDatabaseName; + $scope.importFile.description = $scope.mixDatabaseName + "'s data"; + $scope.importFile.file = file; + + // if (ctrl.auto=='true') { + // ctrl.uploadFile(file); + // } + // else { + // ctrl.getBase64(file); + // } + } + }; + $scope.getList = async function (pageIndex) { if (pageIndex !== undefined) { $scope.request.pageIndex = pageIndex; } if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); + var df = new Date($scope.request.fromDate); + $scope.request.fromDate = df.toISOString(); } if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); + var dt = new Date($scope.request.toDate); + $scope.request.toDate = dt.toISOString(); + } + var query = {}; + if ($routeParams.mixDatabaseId) { + $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; } + $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.request.filterType = $routeParams.filterType || "contain"; + Object.keys($scope.queries).forEach((e) => { + if ($scope.queries[e]) { + query[e] = $scope.queries[e]; + } + }); + $scope.request.query = JSON.stringify(query); $rootScope.isBusy = true; - var resp = await orderServices.getOrders($scope.request); + var resp = await service.getList($scope.request); if (resp && resp.isSucceed) { $scope.data = resp.data; - //$("html, body").animate({ "scrollTop": "0px" }, 500); - $.each($scope.data.items, function (i, order) { - $.each($scope.activedOrders, function (i, e) { - if (e.orderId === order.id) { - order.isHidden = true; + $.each($scope.data.items, function (i, data) { + $.each($scope.activeddata, function (i, e) { + if (e.dataId === data.id) { + data.isHidden = true; } }); }); + if ($scope.getListSuccessCallback) { + $scope.getListSuccessCallback(); + } + $("html, body").animate( + { + scrollTop: "0px", + }, + 500 + ); + if (!resp.data || !resp.data.items.length) { + $scope.queries = {}; + } $rootScope.isBusy = false; $scope.$apply(); } else { if (resp) { $rootScope.showErrors(resp.errors); } + if ($scope.getListFailCallback) { + $scope.getListFailCallback(); + } + $scope.queries = {}; $rootScope.isBusy = false; $scope.$apply(); } }; - - $scope.removeOrder = function (id) { - $rootScope.showConfirm( - $scope, - "removeOrderConfirmed", - [id], - null, - "Remove Order", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeOrderConfirmed = async function (id) { - $rootScope.isBusy = true; - var result = await orderServices.removeOrder(id); - if (result.isSucceed) { - $scope.loadOrders(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); + $scope.export = async function (pageIndex, exportAll) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var df = new Date($scope.request.fromDate); + $scope.request.fromDate = df.toISOString(); + } + if ($scope.request.toDate !== null) { + var dt = new Date($scope.request.toDate); + $scope.request.toDate = dt.toISOString(); + } + var query = {}; + if ($routeParams.mixDatabaseId) { + $scope.request.mixDatabaseId = $routeParams.mixDatabaseId; + } + $scope.request.mixDatabaseName = $routeParams.mixDatabaseName; + $scope.request.filterType = $routeParams.filterType || "contain"; + Object.keys($scope.queries).forEach((e) => { + if ($scope.queries[e]) { + query[e] = $scope.queries[e]; + } + }); + $scope.request.query = JSON.stringify(query); + var request = angular.copy($scope.request); + $scope.exportAll = $scope.exportAll; + if (exportAll) { + request.pageSize = 10000; + request.pageIndex = 0; } - }; - - $scope.saveOrder = async function (order) { - order.content = $(".editor-content.content").val(); - order.excerpt = $(".editor-content.excerpt").val(); $rootScope.isBusy = true; - var resp = await orderServices.saveOrder(order); + var resp = await service.export(request); if (resp && resp.isSucceed) { - $scope.activedOrder = resp.data; - $rootScope.showMessage("Update successfully!", "success"); + if (resp.data) { + window.top.location = resp.data.webPath; + } else { + $rootScope.showMessage("Nothing to export"); + } $rootScope.isBusy = false; $scope.$apply(); - //$location.path('/portal/order/details/' + resp.data.id); } else { if (resp) { $rootScope.showErrors(resp.errors); @@ -3196,141 +3064,65 @@ app.controller("OrderController", [ } }; - $scope.preview = function (item) { - $rootScope.preview("order", item, item.title, "modal-lg"); - }; - }, -]); - -"use strict"; -app.factory("OrderServices", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var ordersServiceFactory = {}; - - var settings = $rootScope.globalSettings; - - var _getOrder = async function (id, type) { - var apiUrl = "/" + settings.lang + "/order/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + id; + $scope.migrate = async function () { + if ($routeParams.mixDatabaseId) { + $rootScope.isBusy = true; + var result = await service.migrate($routeParams.mixDatabaseId); + $scope.handleResult(result); + $rootScope.isBusy = false; + $scope.$apply(); } - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _initOrder = async function (type) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "GET", - url: apiUrl + "init/" + type, - }; - return await apiService.getApiResult(req); - }; - - var _getOrders = async function (request) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _removeOrder = async function (id) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; - - var _saveOrder = async function (order) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(order), - }; - return await apiService.getApiResult(req); }; - - ordersServiceFactory.getOrder = _getOrder; - ordersServiceFactory.initOrder = _initOrder; - ordersServiceFactory.getOrders = _getOrders; - ordersServiceFactory.removeOrder = _removeOrder; - ordersServiceFactory.saveOrder = _saveOrder; - return ordersServiceFactory; }, ]); "use strict"; -app.controller("PageController", [ +app.controller("ModulePostController", [ "$scope", "$rootScope", "ngAppSettings", - "$location", "$routeParams", - "PageRestService", - "PagePostRestService", - "PagePageRestService", - "UrlAliasService", - "RestMixDatabaseDataPortalService", + "$location", + "ModulePostRestService", + "ApiService", + "CommonService", function ( $scope, $rootScope, ngAppSettings, - $location, $routeParams, + $location, service, - pagePostRestService, - pagePageRestService, - urlAliasService, - dataService + commonService ) { - BaseRestCtrl.call( + BaseCtrl.call( this, $scope, $rootScope, - $location, $routeParams, ngAppSettings, service ); - $scope.viewmodelType = "page"; - $scope.request.query = "level=0"; - $scope.pageType = ""; - $scope.pageTypes = $rootScope.globalSettings.pageTypes; - $scope.selectedCategories = []; - $scope.selectedTags = []; - $scope.pageData = { - posts: [], - products: [], - data: [], - }; - $scope.postRequest = angular.copy(ngAppSettings.request); + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; $scope.canDrag = $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.loadPosts = async function () { + $scope.translate = $rootScope.translate; + $scope.moduleIds = $routeParams.moduleIds || $routeParams.id; + $scope.pageIds = $routeParams.page_ids; + $scope.type = $routeParams.type; + $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; - $scope.postRequest.query += "&page_id=" + id; - var response = await pagePostRestService.getList($scope.postRequest); - + $scope.moduleId = $routeParams.id; + $scope.request.query = "&module_id=" + id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + var response = await service.getList($scope.request); if (response.isSucceed) { - $scope.pageData.posts = response.data; + $scope.data = response.data; $rootScope.isBusy = false; $scope.$apply(); } else { @@ -3339,35 +3131,52 @@ app.controller("PageController", [ $scope.$apply(); } }; - $scope.getSingleSuccessCallback = function () { - $scope.loadAdditionalData(); - if ($routeParams.template) { - $scope.viewmodel.view = $rootScope.findObjectByKey( - $scope.viewmodel.templates, - "fileName", - $routeParams.template - ); - } + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); }; - $scope.getListSuccessCallback = function () { - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; + $scope.remove = function (moduleId, postId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [moduleId, postId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); }; - $scope.loadAdditionalData = async function () { - const obj = { - parentType: "Page", - parentId: $scope.viewmodel.id, - databaseName: "sys_additional_column_page", - }; - const getData = await dataService.getAdditionalData(obj); - if (getData.isSucceed) { - $scope.additionalData = getData.data; + + $scope.removeConfirmed = async function (moduleId, postId) { + $rootScope.isBusy = true; + var result = await service.delete(moduleId, postId); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.showChilds = function (id) { - $("#childs-" + id).toggleClass("collapse"); + + $scope.removeCallback = function () {}; + + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } }; $scope.updateInfos = async function (index) { $scope.data.items.splice(index, 1); @@ -3390,182 +3199,93 @@ app.controller("PageController", [ $scope.$apply(); } }; - $scope.selPageType = function () { - $scope.request.query = "level=0&pageType=" + $scope.pageType; - $scope.getList(); - }; - $scope.goUp = async function (items, index) { - items[index].priority -= 1; - items[index - 1].priority += 1; - }; + }, +]); - $scope.goDown = async function (items, index) { - items[index].priority += 1; - items[index - 1].priority -= 1; +"use strict"; +app.factory("ModulePostRestService", [ + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($rootScope, apiService, commonService, baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("module-post"); + var _delete = async function (moduleId, postId) { + var url = this.prefixUrl + "/delete/" + moduleId + "/" + postId; + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); }; - - $scope.updatePagePage = async function (items) { - $rootScope.isBusy = true; - var resp = await pagePageRestService.updateInfos(items); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - $rootScope.showMessage("success", "success"); - $scope.getList(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.saveSuccessCallback = async function () { - if ($scope.additionalData) { - $scope.additionalData.isClone = $scope.viewmodel.isClone; - $scope.additionalData.cultures = $scope.viewmodel.cultures; - $scope.additionalData.parentId = $scope.viewmodel.id; - $scope.additionalData.parentType = "Page"; - await dataService.save($scope.additionalData); - } - $rootScope.isBusy = false; - $scope.$apply(); - }; - $scope.validate = async function () { - // Add default alias if create new page - if (!$scope.viewmodel.id && !$scope.viewmodel.urlAliases.length) { - // Ex: en-us/page-seo-name - // await $scope.addAlias($scope.viewmodel.specificulture + '/' + $scope.viewmodel.seoName); - return true; - } else { - return true; - } - }; - $scope.addAlias = async function (alias) { - var getAlias = await urlAliasService.getSingle(); - if (getAlias.isSucceed) { - if (alias) { - getAlias.data.alias = alias; - } - $scope.viewmodel.urlAliases.push(getAlias.data); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(getAlias.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.updateSysCategories = function (data) { - // Loop selected categories - angular.forEach($scope.selectedCategories, function (e) { - // add if not exist in sysCategories - var current = $rootScope.findObjectByKey( - $scope.viewmodel.sysCategories, - "id", - e.id - ); - if (!current) { - $scope.viewmodel.sysCategories.push({ - id: e.id, - parentId: $scope.viewmodel.id, - mixDatabaseName: "sys_category", - }); - } - }); - }; - $scope.updateSysTags = function (data) { - // Loop selected categories - angular.forEach($scope.selectedTags, function (e) { - // add if not exist in sysCategories - var current = $rootScope.findObjectByKey( - $scope.viewmodel.sysTags, - "id", - e.id - ); - if (!current) { - $scope.viewmodel.sysCategories.push({ - id: e.id, - parentId: $scope.viewmodel.id, - mixDatabaseName: "sys_tag", - }); - } - }); - }; - $scope.removeAliasCallback = async function (index) { - $scope.viewmodel.urlAliases.splice(index, 1); - $scope.$apply(); - }; - }, -]); - -"use strict"; -app.factory("PageRestService", [ - "$rootScope", - "ApiService", - "CommonService", - "BaseRestService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("page/portal"); - var _updateInfos = async function (pages) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(pages), - }; - return await apiService.getApiResult(req); + var _updateInfos = async function (modules) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-infos", + data: JSON.stringify(modules), + }; + return await apiService.getApiResult(req); }; + serviceFactory.delete = _delete; serviceFactory.updateInfos = _updateInfos; return serviceFactory; }, ]); "use strict"; -app.controller("PageGalleryController", [ +app.controller("OrderController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", + "$timeout", "$location", - "PageGalleryService", - "PostRestService", - "ApiService", - "CommonService", + "AuthService", + "OrderServices", + "ngAppSettings", function ( $scope, $rootScope, ngAppSettings, $routeParams, + $timeout, $location, - service, - postService, - apiService, - commonService + authService, + orderServices ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.pageId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.getList = async function () { + $scope.request = angular.copy(ngAppSettings.request); + $scope.request.contentStatuses = [ + "Waiting", + "Serving", + "Rated", + "Finished", + ]; + $scope.request.status = "2"; + $scope.activedOrder = null; + $scope.relatedOrders = []; + $rootScope.isBusy = false; + $scope.data = { + pageIndex: 0, + pageSize: 1, + totalItems: 0, + items: [], + }; + $scope.errors = []; + + $scope.range = function (max) { + var input = []; + for (var i = 1; i <= max; i += 1) input.push(i); + return input; + }; + + $scope.loadOrder = async function () { $rootScope.isBusy = true; var id = $routeParams.id; - $scope.request.query = "&page_id=" + id; - var response = await service.getList($scope.request); - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; + var response = await orderServices.getOrder(id, "portal"); if (response.isSucceed) { - $scope.data = response.data; + $scope.activedOrder = response.data; + $rootScope.initEditor(); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -3574,29 +3294,57 @@ app.controller("PageGalleryController", [ $scope.$apply(); } }; - $scope.remove = function (pageId, postId) { + $scope.loadOrders = async function (pageIndex) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); + } + if ($scope.request.toDate !== null) { + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); + } + $rootScope.isBusy = true; + var resp = await orderServices.getOrders($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + //$("html, body").animate({ "scrollTop": "0px" }, 500); + $.each($scope.data.items, function (i, order) { + $.each($scope.activedOrders, function (i, e) { + if (e.orderId === order.id) { + order.isHidden = true; + } + }); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.removeOrder = function (id) { $rootScope.showConfirm( $scope, - "removeConfirmed", - [pageId, postId], + "removeOrderConfirmed", + [id], null, - "Remove", + "Remove Order", "Deleted data will not able to recover, are you sure you want to delete this item?" ); }; - $scope.removeConfirmed = async function (pageId, postId) { + $scope.removeOrderConfirmed = async function (id) { $rootScope.isBusy = true; - var result = await service.delete(pageId, postId); + var result = await orderServices.removeOrder(id); if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); + $scope.loadOrders(); } else { $rootScope.showMessage("failed"); $rootScope.isBusy = false; @@ -3604,30 +3352,17 @@ app.controller("PageGalleryController", [ } }; - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); + $scope.saveOrder = async function (order) { + order.content = $(".editor-content.content").val(); + order.excerpt = $(".editor-content.excerpt").val(); $rootScope.isBusy = true; - var startIndex = $scope.data.items[0].priority - 1; - for (var i = 0; i < $scope.data.items.length; i++) { - $scope.data.items[i].priority = startIndex + i + 1; - } - var resp = await service.updateInfos($scope.data.items); + var resp = await orderServices.saveOrder(order); if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - $rootScope.showMessage("success", "success"); + $scope.activedOrder = resp.data; + $rootScope.showMessage("Update successfully!", "success"); $rootScope.isBusy = false; $scope.$apply(); + //$location.path('/portal/order/details/' + resp.data.id); } else { if (resp) { $rootScope.showErrors(resp.errors); @@ -3636,213 +3371,84 @@ app.controller("PageGalleryController", [ $scope.$apply(); } }; + + $scope.preview = function (item) { + $rootScope.preview("order", item, item.title, "modal-lg"); + }; }, ]); "use strict"; -app.factory("PageGalleryService", [ +app.factory("OrderServices", [ + "$http", "$rootScope", "ApiService", "CommonService", - "BaseService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (pageId, postId) { - var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - var _updateInfos = async function (pages) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(pages), - }; - return await apiService.getApiResult(req); - }; - serviceFactory.delete = _delete; - serviceFactory.updateInfos = _updateInfos; - return serviceFactory; - }, -]); + function ($http, $rootScope, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; -"use strict"; -app.controller("ModuleDataController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "ModuleDataRestService", - "ModuleRestService", - "ApiService", - "CommonService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service, - moduleService, - commonService - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - // $scope.request.orderBy = "Priority"; - // $scope.request.direction = "Asc"; - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = $routeParams.moduleId; - $scope.backUrl = `/portal/module-data/list/${$scope.moduleId}`; - $scope.module = null; - $scope.dataColumns = []; - $scope.editDataUrl = "/portal/module-data/details/" + $scope.moduleId; - $scope.init = async function () { - $scope.id = $routeParams.id; - if (!$scope.module) { - var getModule = await moduleService.getSingle([$scope.moduleId]); - if (getModule.isSucceed) { - $scope.module = getModule.data; - angular.forEach($scope.module.columns, function (e, i) { - if (e.isDisplay) { - $scope.dataColumns.push({ - title: e.title, - name: e.name, - datatype: e.dataType, - filter: true, - type: 0, // string - ngAppSettings.dataTypes[0] - }); - } - }); - $scope.$apply(); - } - } - }; - $scope.getList = async function () { - $rootScope.isBusy = true; - $scope.request.module_id = $scope.moduleId; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; + var ordersServiceFactory = {}; - $scope.export = async function () { - $rootScope.isBusy = true; - $scope.request.module_id = $scope.moduleId; - var response = await service.export($scope.request); - if (response.isSucceed) { - window.top.location = response.data.webPath; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; + var settings = $rootScope.globalSettings; - $scope.getSingle = async function () { - $rootScope.isBusy = true; - var resp = await service.getSingle($routeParams.id, "portal"); - if (resp && resp.isSucceed) { - $scope.activedModuleData = resp.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); + var _getOrder = async function (id, type) { + var apiUrl = "/" + settings.lang + "/order/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + id; } - }; - $scope.remove = function (dataId) { - $rootScope.showConfirm( - $scope, - "removeConfirmed", - [dataId], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); }; - $scope.removeConfirmed = async function (dataId) { - $rootScope.isBusy = true; - var result = await service.delete([dataId]); - if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } + var _initOrder = async function (type) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "GET", + url: apiUrl + "init/" + type, + }; + return await apiService.getApiResult(req); }; - $scope.removeCallback = function () {}; + var _getOrders = async function (request) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "POST", + url: apiUrl + "list", + data: JSON.stringify(request), + }; - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } + return await apiService.getApiResult(req); }; - }, -]); - -"use strict"; -app.factory("ModuleDataRestService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("module-data/portal"); - // Define more service methods here - var _initForm = async function (moduleId) { - var url = `${this.prefixUrl}/init-form/${moduleId}`; + var _removeOrder = async function (id) { + var apiUrl = "/" + settings.lang + "/order/"; var req = { method: "GET", - url: url, + url: apiUrl + "delete/" + id, }; - return await apiService.getRestApiResult(req); + return await apiService.getApiResult(req); }; - serviceFactory.initForm = _initForm; - return serviceFactory; + + var _saveOrder = async function (order) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(order), + }; + return await apiService.getApiResult(req); + }; + + ordersServiceFactory.getOrder = _getOrder; + ordersServiceFactory.initOrder = _initOrder; + ordersServiceFactory.getOrders = _getOrders; + ordersServiceFactory.removeOrder = _removeOrder; + ordersServiceFactory.saveOrder = _saveOrder; + return ordersServiceFactory; }, ]); @@ -3997,51 +3603,60 @@ app.factory("PagePageRestService", [ ]); "use strict"; -app.controller("PagePositionController", [ +app.controller("PageController", [ "$scope", "$rootScope", "ngAppSettings", - "$routeParams", "$location", - "PagePositionService", - "PostRestService", - "ApiService", - "CommonService", + "$routeParams", + "PageRestService", + "PagePostRestService", + "PagePageRestService", + "UrlAliasService", + "RestMixDatabaseDataPortalService", function ( $scope, $rootScope, ngAppSettings, - $routeParams, $location, + $routeParams, service, - postService, - apiService, - commonService + pagePostRestService, + pagePageRestService, + urlAliasService, + dataService ) { - BaseCtrl.call( + BaseRestCtrl.call( this, $scope, $rootScope, + $location, $routeParams, ngAppSettings, service ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.pageId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.getList = async function () { + $scope.viewmodelType = "page"; + $scope.request.query = "level=0"; + $scope.pageType = ""; + $scope.pageTypes = $rootScope.globalSettings.pageTypes; + $scope.selectedCategories = []; + $scope.selectedTags = []; + $scope.pageData = { + posts: [], + products: [], + data: [], + }; + $scope.postRequest = angular.copy(ngAppSettings.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.loadPosts = async function () { $rootScope.isBusy = true; var id = $routeParams.id; - $scope.request.query = "&page_id=" + id; - var response = await service.getList($scope.request); - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; + $scope.postRequest.query += "&page_id=" + id; + var response = await pagePostRestService.getList($scope.postRequest); + if (response.isSucceed) { - $scope.data = response.data; + $scope.pageData.posts = response.data; $rootScope.isBusy = false; $scope.$apply(); } else { @@ -4050,50 +3665,35 @@ app.controller("PagePositionController", [ $scope.$apply(); } }; - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); + $scope.getSingleSuccessCallback = function () { + $scope.loadAdditionalData(); + if ($routeParams.template) { + $scope.viewmodel.view = $rootScope.findObjectByKey( + $scope.viewmodel.templates, + "fileName", + $routeParams.template + ); + } }; - $scope.remove = function (pageId, postId) { - $rootScope.showConfirm( - $scope, - "removeConfirmed", - [pageId, postId], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); + $scope.getListSuccessCallback = function () { + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; }; - - $scope.removeConfirmed = async function (pageId, postId) { - $rootScope.isBusy = true; - var result = await service.delete(pageId, postId); - if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; + $scope.loadAdditionalData = async function () { + const obj = { + parentType: "Page", + parentId: $scope.viewmodel.id, + databaseName: "sys_additional_column_page", + }; + const getData = await dataService.getAdditionalData(obj); + if (getData.isSucceed) { + $scope.additionalData = getData.data; $scope.$apply(); } }; - - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } + $scope.showChilds = function (id) { + $("#childs-" + id).toggleClass("collapse"); }; $scope.updateInfos = async function (index) { $scope.data.items.splice(index, 1); @@ -4116,26 +3716,123 @@ app.controller("PagePositionController", [ $scope.$apply(); } }; + $scope.selPageType = function () { + $scope.request.query = "level=0&pageType=" + $scope.pageType; + $scope.getList(); + }; + $scope.goUp = async function (items, index) { + items[index].priority -= 1; + items[index - 1].priority += 1; + }; + + $scope.goDown = async function (items, index) { + items[index].priority += 1; + items[index - 1].priority -= 1; + }; + + $scope.updatePagePage = async function (items) { + $rootScope.isBusy = true; + var resp = await pagePageRestService.updateInfos(items); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); + $scope.getList(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.saveSuccessCallback = async function () { + if ($scope.additionalData) { + $scope.additionalData.isClone = $scope.viewmodel.isClone; + $scope.additionalData.cultures = $scope.viewmodel.cultures; + $scope.additionalData.parentId = $scope.viewmodel.id; + $scope.additionalData.parentType = "Page"; + await dataService.save($scope.additionalData); + } + $rootScope.isBusy = false; + $scope.$apply(); + }; + $scope.validate = async function () { + // Add default alias if create new page + if (!$scope.viewmodel.id && !$scope.viewmodel.urlAliases.length) { + // Ex: en-us/page-seo-name + // await $scope.addAlias($scope.viewmodel.specificulture + '/' + $scope.viewmodel.seoName); + return true; + } else { + return true; + } + }; + $scope.addAlias = async function (alias) { + var getAlias = await urlAliasService.getSingle(); + if (getAlias.isSucceed) { + if (alias) { + getAlias.data.alias = alias; + } + $scope.viewmodel.urlAliases.push(getAlias.data); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(getAlias.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateSysCategories = function (data) { + // Loop selected categories + angular.forEach($scope.selectedCategories, function (e) { + // add if not exist in sysCategories + var current = $rootScope.findObjectByKey( + $scope.viewmodel.sysCategories, + "id", + e.id + ); + if (!current) { + $scope.viewmodel.sysCategories.push({ + id: e.id, + parentId: $scope.viewmodel.id, + mixDatabaseName: "sys_category", + }); + } + }); + }; + $scope.updateSysTags = function (data) { + // Loop selected categories + angular.forEach($scope.selectedTags, function (e) { + // add if not exist in sysCategories + var current = $rootScope.findObjectByKey( + $scope.viewmodel.sysTags, + "id", + e.id + ); + if (!current) { + $scope.viewmodel.sysCategories.push({ + id: e.id, + parentId: $scope.viewmodel.id, + mixDatabaseName: "sys_tag", + }); + } + }); + }; + $scope.removeAliasCallback = async function (index) { + $scope.viewmodel.urlAliases.splice(index, 1); + $scope.$apply(); + }; }, ]); "use strict"; -app.factory("PagePositionService", [ +app.factory("PageRestService", [ "$rootScope", "ApiService", "CommonService", - "BaseService", + "BaseRestService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-position"); - var _delete = async function (pageId, positionId) { - var url = this.prefixUrl + "/delete/" + pageId + "/" + positionId; - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; + serviceFactory.init("page/portal"); var _updateInfos = async function (pages) { var req = { method: "POST", @@ -4144,20 +3841,19 @@ app.factory("PagePositionService", [ }; return await apiService.getApiResult(req); }; - serviceFactory.delete = _delete; serviceFactory.updateInfos = _updateInfos; return serviceFactory; }, ]); "use strict"; -app.controller("PagePostController", [ +app.controller("PagePositionController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePostRestService", + "PagePositionService", "PostRestService", "ApiService", "CommonService", @@ -4169,6 +3865,7 @@ app.controller("PagePostController", [ $location, service, postService, + apiService, commonService ) { BaseCtrl.call( @@ -4182,24 +3879,9 @@ app.controller("PagePostController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.init = function () { - $scope.pageId = $routeParams.id; - $scope.type = $routeParams.type; - $scope.template = $routeParams.template || ""; - $scope.pageIds = $routeParams.page_ids || $routeParams.id; - $scope.moduleIds = $routeParams.module_ids || ""; - $scope.canDrag = - $scope.request.orderBy === "Priority" && - $scope.request.direction === "Asc"; - $scope.createUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/create-gallery" - : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; - $scope.updateUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/gallery-details" - : "/portal/post/details"; - }; + $scope.pageId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -4233,9 +3915,9 @@ app.controller("PagePostController", [ ); }; - $scope.removeConfirmed = async function (id) { + $scope.removeConfirmed = async function (pageId, postId) { $rootScope.isBusy = true; - var result = await service.delete(id); + var result = await service.delete(pageId, postId); if (result.isSucceed) { if ($scope.removeCallback) { $rootScope.executeFunctionByName( @@ -4288,16 +3970,16 @@ app.controller("PagePostController", [ ]); "use strict"; -app.factory("PagePostRestService", [ +app.factory("PagePositionService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (id) { - var url = this.prefixUrl + "/delete/" + id; + serviceFactory.init("page-position"); + var _delete = async function (pageId, positionId) { + var url = this.prefixUrl + "/delete/" + pageId + "/" + positionId; var req = { method: "GET", url: url, @@ -4319,88 +4001,108 @@ app.factory("PagePostRestService", [ ]); "use strict"; -app.controller("PermissionController", [ +app.controller("PageGalleryController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", + "PageGalleryService", + "PostRestService", "ApiService", "CommonService", - "PermissionService", - "RestPortalPageNavigationService", function ( $scope, $rootScope, ngAppSettings, $routeParams, $location, - apiService, - commonService, service, - navService - ) { - BaseRestCtrl.call( + postService, + apiService, + commonService + ) { + BaseCtrl.call( this, $scope, $rootScope, - $location, $routeParams, ngAppSettings, service ); - $scope.request.level = 0; - $scope.miOptions = ngAppSettings.miIcons; - $scope.initDialog = function () { - $("#dlg-permission").on("shown.bs.modal", function () { - $scope.initCurrentPath(); - }); - }; - - $scope.initCurrentPath = async function () { - var resp = await service.getDefault(); - if (resp && resp.isSucceed) { - $scope.viewmodel = resp.data; - $scope.viewmodel.url = $location.url(); + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.pageId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.getList = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + $scope.request.query = "&page_id=" + id; + var response = await service.getList($scope.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + if (response.isSucceed) { + $scope.data = response.data; $rootScope.isBusy = false; - $scope.$applyAsync(); + $scope.$apply(); } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - if ($scope.getSingleFailCallback) { - $scope.getSingleFailCallback(); - } + $rootScope.showErrors(response.errors); $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.saveSuccessCallback = function () { - $scope.getSingle(); + $scope.remove = function (pageId, postId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [pageId, postId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); }; - $scope.dragStart = function (index) { - $scope.minPriority = $scope.data.items[0].priority; - $scope.dragStartIndex = index; - }; - $scope.updateOrders = function (index) { - if (index > $scope.dragStartIndex) { - $scope.data.items.splice($scope.dragStartIndex, 1); + $scope.removeConfirmed = async function (pageId, postId) { + $rootScope.isBusy = true; + var result = await service.delete(pageId, postId); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); } else { - $scope.data.items.splice($scope.dragStartIndex + 1, 1); + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); } - angular.forEach($scope.data.items, function (e, i) { - e.priority = $scope.minPriority + i; - service.saveFields(e.id, { priority: e.priority }).then((resp) => { - $rootScope.isBusy = false; - $scope.$apply(); - }); - }); }; - $scope.updateChildInfos = async function (items) { + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); $rootScope.isBusy = true; - var resp = await service.updateChildInfos(items); + var startIndex = $scope.data.items[0].priority - 1; + for (var i = 0; i < $scope.data.items.length; i++) { + $scope.data.items[i].priority = startIndex + i + 1; + } + var resp = await service.updateInfos($scope.data.items); if (resp && resp.isSucceed) { $scope.activedPage = resp.data; $rootScope.showMessage("success", "success"); @@ -4414,170 +4116,229 @@ app.controller("PermissionController", [ $scope.$apply(); } }; - $("#dlg-favorite").on("show.bs.modal", function (event) { - $scope.initCurrentPath(); - }); }, ]); "use strict"; -app.factory("PermissionService", [ - "BaseRestService", +app.factory("PageGalleryService", [ + "$rootScope", "ApiService", "CommonService", - function (baseService, apiService, commonService) { + "BaseService", + function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("permission", true); - var _updateInfos = async function (pages) { + serviceFactory.init("page-post"); + var _delete = async function (pageId, postId) { + var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; var req = { - method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(pages), + method: "GET", + url: url, }; return await apiService.getApiResult(req); }; - - var _updateChildInfos = async function (pages) { + var _updateInfos = async function (pages) { var req = { method: "POST", - url: this.prefixUrl + "/update-child-infos", + url: this.prefixUrl + "/update-infos", data: JSON.stringify(pages), }; return await apiService.getApiResult(req); }; - + serviceFactory.delete = _delete; serviceFactory.updateInfos = _updateInfos; - serviceFactory.updateChildInfos = _updateChildInfos; - return serviceFactory; - }, -]); - -"use strict"; -app.factory("RestPortalPageNavigationService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("portal-page-navigation", true); - return serviceFactory; }, ]); "use strict"; -app.controller("RoleController", [ +app.controller("PagePostController", [ "$scope", "$rootScope", - "$location", - "$routeParams", "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", - "RoleService", + "$routeParams", + "$location", + "PagePostRestService", + "PostRestService", + "ApiService", + "CommonService", function ( $scope, $rootScope, - $location, - $routeParams, ngAppSettings, - dataService, - columnService, - service + $routeParams, + $location, + service, + postService, + commonService ) { - BaseRestCtrl.call( + BaseCtrl.call( this, $scope, $rootScope, - $location, $routeParams, ngAppSettings, service ); - $scope.role = { name: "" }; - $scope.initPermissions = async function () { - let backUrl = "/portal/role/list"; - $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; - $scope.updateUrl = "/portal/mix-database-data/details"; + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.init = function () { + $scope.pageId = $routeParams.id; + $scope.type = $routeParams.type; + $scope.template = $routeParams.template || ""; + $scope.pageIds = $routeParams.page_ids || $routeParams.id; + $scope.moduleIds = $routeParams.module_ids || ""; + $scope.canDrag = + $scope.request.orderBy === "Priority" && + $scope.request.direction === "Asc"; + $scope.createUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/create-gallery" + : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; + $scope.updateUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/gallery-details" + : "/portal/post/details"; + }; + $scope.getList = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + $scope.request.query = "&page_id=" + id; + var response = await service.getList($scope.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); + }; + $scope.remove = function (pageId, postId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [pageId, postId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); }; - $scope.createRole = async function () { + $scope.removeConfirmed = async function (id) { $rootScope.isBusy = true; - var result = await service.createRole($scope.role.name); + var result = await service.delete(id); if (result.isSucceed) { - $scope.role.name = ""; + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } $scope.getList(); } else { - $rootScope.showErrors(result.errors); + $rootScope.showMessage("failed"); $rootScope.isBusy = false; $scope.$apply(); } }; - }, -]); - -"use strict"; -app.factory("RoleService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("role", true); - var _getPermissions = async function () { - var req = { - method: "GET", - url: this.prefixUrl + "/permissions", - }; - return await apiService.getApiResult(req); + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); + $rootScope.isBusy = true; + var startIndex = $scope.data.items[0].priority - 1; + for (var i = 0; i < $scope.data.items.length; i++) { + $scope.data.items[i].priority = startIndex + i + 1; + } + var resp = await service.updateInfos($scope.data.items); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } }; + }, +]); - var _updatePermission = async function (permission) { +"use strict"; +app.factory("PagePostRestService", [ + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($rootScope, apiService, commonService, baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("page-post"); + var _delete = async function (id) { + var url = this.prefixUrl + "/delete/" + id; var req = { - method: "POST", - url: this.prefixUrl + "/update-permission", - data: JSON.stringify(permission), + method: "GET", + url: url, }; return await apiService.getApiResult(req); }; - var _createRole = function (name) { + var _updateInfos = async function (pages) { var req = { method: "POST", - url: this.prefixUrl + "/create", - data: JSON.stringify(name), + url: this.prefixUrl + "/update-infos", + data: JSON.stringify(pages), }; - - return apiService.getRestApiResult(req); + return await apiService.getApiResult(req); }; - serviceFactory.createRole = _createRole; - serviceFactory.getPermissions = _getPermissions; - serviceFactory.updatePermission = _updatePermission; + serviceFactory.delete = _delete; + serviceFactory.updateInfos = _updateInfos; return serviceFactory; }, ]); "use strict"; -app.controller("PostController", [ +app.controller("PermissionController", [ "$scope", "$rootScope", - "$location", - "$filter", "ngAppSettings", "$routeParams", - "PostRestService", - "UrlAliasService", - "RestMixDatabaseDataPortalService", + "$location", + "ApiService", + "CommonService", + "PermissionService", + "RestPortalPageNavigationService", function ( $scope, $rootScope, - $location, - $filter, ngAppSettings, $routeParams, + $location, + apiService, + commonService, service, - urlAliasService, - dataService + navService ) { BaseRestCtrl.call( this, @@ -4588,85 +4349,21 @@ app.controller("PostController", [ ngAppSettings, service ); - $scope.viewmodelType = "post"; - $scope.additionalData = null; - $scope.createUrl = "/portal/post/create?"; - $scope.selectedCategories = []; - $scope.selectedTags = []; - $scope.postType = { - databaseName: "", - title: "All", + $scope.request.level = 0; + $scope.miOptions = ngAppSettings.miIcons; + $scope.initDialog = function () { + $("#dlg-permission").on("shown.bs.modal", function () { + $scope.initCurrentPath(); + }); }; - $scope.postTypeRequest = angular.copy(ngAppSettings.request); - $scope.postTypeRequest.mixDatabaseName = "post_type"; - $scope.postTypeRequest.orderBy = "Priority"; - $scope.postTypeRequest.direction = "Asc"; - $scope.initList = async function () { - if ($routeParams.template) { - $scope.createUrl = `${$scope.createUrl}&template=${$routeParams.template}`; - } - if ($routeParams.category) { - $scope.request.category = $routeParams.category; - } - if ($routeParams.type) { - $scope.createUrl = `${$scope.createUrl}&type=${$routeParams.type}`; - $scope.request.postType = $routeParams.type; - } - if ($routeParams.page_ids) { - $scope.createUrl = `${$scope.createUrl}&page_ids=${$routeParams.page_ids}`; - } - $scope.pageName = "postList"; - await $scope.loadPostTypes(); - $scope.getList(); - }; - $scope.loadPostTypes = async function () { - let getTypes = await dataService.getList($scope.postTypeRequest); - if (getTypes.isSucceed) { - $scope.postTypes = getTypes.data.items.map((m) => m.obj); - $scope.postTypes.splice( - 0, - 0, - { - databaseName: "", - title: "All", - id: 0, - }, - { - databaseName: "sys_additional_column_post", - title: "Default", - id: 1, - } - ); - if ($scope.request.postType) { - $scope.postType = $rootScope.findObjectByKey( - $scope.postTypes, - "databaseName", - $scope.request.postType - ); - } - $scope.request.postType = $routeParams.type || ""; - $scope.$apply(); - } - }; - $scope.getDefault = async function (type = null) { - $rootScope.isBusy = true; - type = type || $routeParams.type; - var resp = await service.getDefault({ - type: type || "", - template: $routeParams.template || "", - }); - if (resp.isSucceed) { + $scope.initCurrentPath = async function () { + var resp = await service.getDefault(); + if (resp && resp.isSucceed) { $scope.viewmodel = resp.data; - if ($scope.getSingleSuccessCallback) { - $scope.getSingleSuccessCallback(); - } - - // $scope.viewmodel.createdDateTime = Date.now(); - $scope.viewmodel.createdBy = $rootScope.authentication.userName; - + $scope.viewmodel.url = $location.url(); $rootScope.isBusy = false; - $scope.$apply(); + $scope.$applyAsync(); } else { if (resp) { $rootScope.showErrors(resp.errors); @@ -4678,279 +4375,92 @@ app.controller("PostController", [ $scope.$apply(); } }; - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); + $scope.saveSuccessCallback = function () { + $scope.getSingle(); }; - $scope.onSelectType = function () { - if ($scope.viewmodel) { - $scope.viewmodel.type = $scope.postType.databaseName; - $scope.loadAdditionalData(); - } - $scope.request.postType = $scope.postType.databaseName; - $scope.createUrl = `/portal/post/create?type=${$scope.request.postType}`; - if ($routeParams.template) { - $scope.createUrl += `&template=${$routeParams.template}`; - } - if ( - $scope.postType.databaseName && - (!$scope.viewmodel || !$scope.viewmodel.id) - ) { - $scope.getDefault($scope.request.postType); - } - if ($scope.pageName == "postList") { - $scope.getList(); - } + + $scope.dragStart = function (index) { + $scope.minPriority = $scope.data.items[0].priority; + $scope.dragStartIndex = index; }; - $scope.getListRelated = async function (pageIndex) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); - } - if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); + $scope.updateOrders = function (index) { + if (index > $scope.dragStartIndex) { + $scope.data.items.splice($scope.dragStartIndex, 1); + } else { + $scope.data.items.splice($scope.dragStartIndex + 1, 1); } - var resp = await service.getList($scope.request); - if (resp && resp.isSucceed) { - let result = []; - angular.forEach(resp.data.items, (element) => { - let isActive = - null != - $scope.viewmodel.postNavs.find( - (p) => p.destinationId == element.id - ); - if (!isActive) { - var obj = { - description: element.title, - destinationId: element.id, - image: element.image, - isActived: isActive, - sourceId: $scope.viewmodel.id, - specificulture: $scope.viewmodel.specificulture, - status: "Published", - }; - result.push(obj); - } + angular.forEach($scope.data.items, function (e, i) { + e.priority = $scope.minPriority + i; + service.saveFields(e.id, { priority: e.priority }).then((resp) => { + $rootScope.isBusy = false; + $scope.$apply(); }); - resp.data.items = result; + }); + }; + + $scope.updateChildInfos = async function (items) { + $rootScope.isBusy = true; + var resp = await service.updateChildInfos(items); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); $rootScope.isBusy = false; $scope.$apply(); - return resp.data; } else { - $rootScope.showErrors(getData.errors); + if (resp) { + $rootScope.showErrors(resp.errors); + } $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.saveFailCallback = function () { - angular.forEach($scope.viewmodel.mixDatabaseNavs, function (nav) { - if (nav.isActived) { - $rootScope.decryptMixDatabase( - nav.mixDatabase.attributes, - nav.mixDatabase.postData.items - ); - } - }); - }; - $scope.saveSuccessCallback = async function () { - if ($scope.additionalData) { - $scope.additionalData.isClone = $scope.viewmodel.isClone; - $scope.additionalData.cultures = $scope.viewmodel.cultures; - $scope.additionalData.parentId = $scope.viewmodel.id; - $scope.additionalData.parentType = "Post"; - let result = await dataService.save($scope.additionalData); - if (!result.isSucceed) { - $rootScope.showErrors(result.errors); - } - } - $rootScope.isBusy = false; - $scope.$apply(); - }; - $scope.getSingleSuccessCallback = async function () { - $scope.defaultThumbnailImgWidth = - ngAppSettings.localizeSettings.DefaultThumbnailImgWidth; - $scope.defaultThumbnailImgHeight = - ngAppSettings.localizeSettings.DefaultThumbnailImgHeight; - - $scope.defaultFeatureImgWidth = - ngAppSettings.localizeSettings.DefaultFeatureImgWidth; - $scope.defaultFeatureImgHeight = - ngAppSettings.localizeSettings.DefaultFeatureImgHeight; - - $scope.request.postType = $scope.viewmodel.type; - var moduleIds = $routeParams.module_ids; - var pageIds = $routeParams.page_ids; - $scope.postType = $rootScope.findObjectByKey( - $scope.postTypes, - "databaseName", - $scope.request.postType - ); - $scope.loadAdditionalData(); - if (moduleIds) { - for (var moduleId of moduleIds.split(",")) { - var moduleNav = $rootScope.findObjectByKey( - $scope.viewmodel.modules, - "moduleId", - moduleId - ); - if (moduleNav) { - moduleNav.isActived = true; - } - } - } - if (pageIds) { - for (var pageId of pageIds.split(",")) { - var pageNav = $rootScope.findObjectByKey( - $scope.viewmodel.categories, - "pageId", - pageId - ); - if (pageNav) { - pageNav.isActived = true; - } - } - } - if ($scope.viewmodel.sysCategories) { - angular.forEach($scope.viewmodel.sysCategories, function (e) { - e.attributeData.obj.isActived = true; - $scope.selectedCategories.push(e.attributeData.obj); - }); - } + $("#dlg-favorite").on("show.bs.modal", function (event) { + $scope.initCurrentPath(); + }); + }, +]); - if ($scope.viewmodel.sysTags) { - angular.forEach($scope.viewmodel.sysTags, function (e) { - e.attributeData.obj.isActived = true; - $scope.selectedCategories.push(e.attributeData.obj); - }); - } - if ($routeParams.template) { - $scope.viewmodel.view = $rootScope.findObjectByKey( - $scope.viewmodel.templates, - "fileName", - $routeParams.template - ); - } - }; - $scope.loadAdditionalData = async function () { - const obj = { - parentType: "Post", - parentId: $scope.viewmodel.id, - databaseName: $scope.viewmodel.type || "", +"use strict"; +app.factory("PermissionService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("permission", true); + var _updateInfos = async function (pages) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-infos", + data: JSON.stringify(pages), }; - const getData = await dataService.getAdditionalData(obj); - if (getData.isSucceed) { - $scope.additionalData = getData.data; - $scope.$apply(); - } - }; - $scope.generateSeo = function () { - if ($scope.viewmodel) { - if ( - $scope.viewmodel.seoName === null || - $scope.viewmodel.seoName === "" - ) { - $scope.viewmodel.seoName = $rootScope.generateKeyword( - $scope.viewmodel.title, - "-" - ); - } - if ( - $scope.viewmodel.seoTitle === null || - $scope.viewmodel.seoTitle === "" - ) { - $scope.viewmodel.seoTitle = $scope.viewmodel.title; - } - if ( - $scope.viewmodel.seoDescription === null || - $scope.viewmodel.seoDescription === "" - ) { - $scope.viewmodel.seoDescription = $scope.viewmodel.excerpt; - } - if ( - $scope.viewmodel.seoKeywords === null || - $scope.viewmodel.seoKeywords === "" - ) { - $scope.viewmodel.seoKeywords = $scope.viewmodel.title; - } - } - }; - $scope.addAlias = async function () { - var getAlias = await urlAliasService.getSingle(); - if (getAlias.isSucceed) { - $scope.viewmodel.urlAliases.push(getAlias.data); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(getAlias.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.removeAliasCallback = async function (index) { - $scope.viewmodel.urlAliases.splice(index, 1); - $scope.$apply(); - }; - $scope.updateSysCategories = function (data) { - // Loop selected categories - angular.forEach($scope.selectedCategories, function (e) { - // add if not exist in sysCategories - var current = $rootScope.findObjectByKey( - $scope.viewmodel.sysCategories, - "id", - e.id - ); - if (!current) { - $scope.viewmodel.sysCategories.push({ - id: e.id, - parentId: $scope.viewmodel.id, - mixDatabaseName: "sys_category", - }); - } - }); - }; - $scope.updateSysTags = function (data) { - // Loop selected categories - angular.forEach($scope.selectedTags, function (e) { - // add if not exist in sysCategories - var current = $rootScope.findObjectByKey( - $scope.viewmodel.sysTags, - "id", - e.id - ); - if (!current) { - $scope.viewmodel.sysCategories.push({ - id: e.id, - parentId: $scope.viewmodel.id, - mixDatabaseName: "sys_tag", - }); - } - }); + return await apiService.getApiResult(req); }; - $scope.validate = function () { - angular.forEach($scope.viewmodel.mixDatabaseNavs, function (nav) { - if (nav.isActived) { - $rootScope.encryptMixDatabase( - nav.mixDatabase.attributes, - nav.mixDatabase.postData.items - ); - } - }); - return true; + + var _updateChildInfos = async function (pages) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-child-infos", + data: JSON.stringify(pages), + }; + return await apiService.getApiResult(req); }; + + serviceFactory.updateInfos = _updateInfos; + serviceFactory.updateChildInfos = _updateChildInfos; + return serviceFactory; }, ]); "use strict"; -app.factory("PostRestService", [ +app.factory("RestPortalPageNavigationService", [ "BaseRestService", - function (baseService) { + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("post/portal"); - // Define more service methods here + serviceFactory.init("portal-page-navigation", true); + return serviceFactory; }, ]); @@ -5113,20 +4623,722 @@ app.controller("ServiceController", [ ]); "use strict"; -app.controller("StoreController", [ +app.controller("PostController", [ "$scope", "$rootScope", + "$location", + "$filter", "ngAppSettings", - "CryptoService", - "ThemeService", - "StoreService", + "$routeParams", + "PostRestService", + "UrlAliasService", + "RestMixDatabaseDataPortalService", function ( $scope, $rootScope, + $location, + $filter, ngAppSettings, - cryptoService, - themeService, - service + $routeParams, + service, + urlAliasService, + dataService + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.viewmodelType = "post"; + $scope.additionalData = null; + $scope.createUrl = "/portal/post/create?"; + $scope.selectedCategories = []; + $scope.selectedTags = []; + $scope.postType = { + databaseName: "", + title: "All", + }; + $scope.postTypeRequest = angular.copy(ngAppSettings.request); + $scope.postTypeRequest.mixDatabaseName = "post_type"; + $scope.postTypeRequest.orderBy = "Priority"; + $scope.postTypeRequest.direction = "Asc"; + + $scope.initList = async function () { + if ($routeParams.template) { + $scope.createUrl = `${$scope.createUrl}&template=${$routeParams.template}`; + } + if ($routeParams.category) { + $scope.request.category = $routeParams.category; + } + if ($routeParams.type) { + $scope.createUrl = `${$scope.createUrl}&type=${$routeParams.type}`; + $scope.request.postType = $routeParams.type; + } + if ($routeParams.page_ids) { + $scope.createUrl = `${$scope.createUrl}&page_ids=${$routeParams.page_ids}`; + } + $scope.pageName = "postList"; + await $scope.loadPostTypes(); + $scope.getList(); + }; + $scope.loadPostTypes = async function () { + let getTypes = await dataService.getList($scope.postTypeRequest); + if (getTypes.isSucceed) { + $scope.postTypes = getTypes.data.items.map((m) => m.obj); + $scope.postTypes.splice( + 0, + 0, + { + databaseName: "", + title: "All", + id: 0, + }, + { + databaseName: "sys_additional_column_post", + title: "Default", + id: 1, + } + ); + if ($scope.request.postType) { + $scope.postType = $rootScope.findObjectByKey( + $scope.postTypes, + "databaseName", + $scope.request.postType + ); + } + $scope.request.postType = $routeParams.type || ""; + $scope.$apply(); + } + }; + $scope.getDefault = async function (type = null) { + $rootScope.isBusy = true; + type = type || $routeParams.type; + var resp = await service.getDefault({ + type: type || "", + template: $routeParams.template || "", + }); + if (resp.isSucceed) { + $scope.viewmodel = resp.data; + if ($scope.getSingleSuccessCallback) { + $scope.getSingleSuccessCallback(); + } + + // $scope.viewmodel.createdDateTime = Date.now(); + $scope.viewmodel.createdBy = $rootScope.authentication.userName; + + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + if ($scope.getSingleFailCallback) { + $scope.getSingleFailCallback(); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); + }; + $scope.onSelectType = function () { + if ($scope.viewmodel) { + $scope.viewmodel.type = $scope.postType.databaseName; + $scope.loadAdditionalData(); + } + $scope.request.postType = $scope.postType.databaseName; + $scope.createUrl = `/portal/post/create?type=${$scope.request.postType}`; + if ($routeParams.template) { + $scope.createUrl += `&template=${$routeParams.template}`; + } + if ( + $scope.postType.databaseName && + (!$scope.viewmodel || !$scope.viewmodel.id) + ) { + $scope.getDefault($scope.request.postType); + } + if ($scope.pageName == "postList") { + $scope.getList(); + } + }; + $scope.getListRelated = async function (pageIndex) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); + } + if ($scope.request.toDate !== null) { + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); + } + var resp = await service.getList($scope.request); + if (resp && resp.isSucceed) { + let result = []; + angular.forEach(resp.data.items, (element) => { + let isActive = + null != + $scope.viewmodel.postNavs.find( + (p) => p.destinationId == element.id + ); + if (!isActive) { + var obj = { + description: element.title, + destinationId: element.id, + image: element.image, + isActived: isActive, + sourceId: $scope.viewmodel.id, + specificulture: $scope.viewmodel.specificulture, + status: "Published", + }; + result.push(obj); + } + }); + resp.data.items = result; + $rootScope.isBusy = false; + $scope.$apply(); + return resp.data; + } else { + $rootScope.showErrors(getData.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.saveFailCallback = function () { + angular.forEach($scope.viewmodel.mixDatabaseNavs, function (nav) { + if (nav.isActived) { + $rootScope.decryptMixDatabase( + nav.mixDatabase.attributes, + nav.mixDatabase.postData.items + ); + } + }); + }; + $scope.saveSuccessCallback = async function () { + if ($scope.additionalData) { + $scope.additionalData.isClone = $scope.viewmodel.isClone; + $scope.additionalData.cultures = $scope.viewmodel.cultures; + $scope.additionalData.parentId = $scope.viewmodel.id; + $scope.additionalData.parentType = "Post"; + let result = await dataService.save($scope.additionalData); + if (!result.isSucceed) { + $rootScope.showErrors(result.errors); + } + } + $rootScope.isBusy = false; + $scope.$apply(); + }; + $scope.getSingleSuccessCallback = async function () { + $scope.defaultThumbnailImgWidth = + ngAppSettings.localizeSettings.DefaultThumbnailImgWidth; + $scope.defaultThumbnailImgHeight = + ngAppSettings.localizeSettings.DefaultThumbnailImgHeight; + + $scope.defaultFeatureImgWidth = + ngAppSettings.localizeSettings.DefaultFeatureImgWidth; + $scope.defaultFeatureImgHeight = + ngAppSettings.localizeSettings.DefaultFeatureImgHeight; + + $scope.request.postType = $scope.viewmodel.type; + var moduleIds = $routeParams.module_ids; + var pageIds = $routeParams.page_ids; + $scope.postType = $rootScope.findObjectByKey( + $scope.postTypes, + "databaseName", + $scope.request.postType + ); + $scope.loadAdditionalData(); + if (moduleIds) { + for (var moduleId of moduleIds.split(",")) { + var moduleNav = $rootScope.findObjectByKey( + $scope.viewmodel.modules, + "moduleId", + moduleId + ); + if (moduleNav) { + moduleNav.isActived = true; + } + } + } + if (pageIds) { + for (var pageId of pageIds.split(",")) { + var pageNav = $rootScope.findObjectByKey( + $scope.viewmodel.categories, + "pageId", + pageId + ); + if (pageNav) { + pageNav.isActived = true; + } + } + } + if ($scope.viewmodel.sysCategories) { + angular.forEach($scope.viewmodel.sysCategories, function (e) { + e.attributeData.obj.isActived = true; + $scope.selectedCategories.push(e.attributeData.obj); + }); + } + + if ($scope.viewmodel.sysTags) { + angular.forEach($scope.viewmodel.sysTags, function (e) { + e.attributeData.obj.isActived = true; + $scope.selectedCategories.push(e.attributeData.obj); + }); + } + if ($routeParams.template) { + $scope.viewmodel.view = $rootScope.findObjectByKey( + $scope.viewmodel.templates, + "fileName", + $routeParams.template + ); + } + }; + $scope.loadAdditionalData = async function () { + const obj = { + parentType: "Post", + parentId: $scope.viewmodel.id, + databaseName: $scope.viewmodel.type || "", + }; + const getData = await dataService.getAdditionalData(obj); + if (getData.isSucceed) { + $scope.additionalData = getData.data; + $scope.$apply(); + } + }; + $scope.generateSeo = function () { + if ($scope.viewmodel) { + if ( + $scope.viewmodel.seoName === null || + $scope.viewmodel.seoName === "" + ) { + $scope.viewmodel.seoName = $rootScope.generateKeyword( + $scope.viewmodel.title, + "-" + ); + } + if ( + $scope.viewmodel.seoTitle === null || + $scope.viewmodel.seoTitle === "" + ) { + $scope.viewmodel.seoTitle = $scope.viewmodel.title; + } + if ( + $scope.viewmodel.seoDescription === null || + $scope.viewmodel.seoDescription === "" + ) { + $scope.viewmodel.seoDescription = $scope.viewmodel.excerpt; + } + if ( + $scope.viewmodel.seoKeywords === null || + $scope.viewmodel.seoKeywords === "" + ) { + $scope.viewmodel.seoKeywords = $scope.viewmodel.title; + } + } + }; + $scope.addAlias = async function () { + var getAlias = await urlAliasService.getSingle(); + if (getAlias.isSucceed) { + $scope.viewmodel.urlAliases.push(getAlias.data); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(getAlias.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.removeAliasCallback = async function (index) { + $scope.viewmodel.urlAliases.splice(index, 1); + $scope.$apply(); + }; + $scope.updateSysCategories = function (data) { + // Loop selected categories + angular.forEach($scope.selectedCategories, function (e) { + // add if not exist in sysCategories + var current = $rootScope.findObjectByKey( + $scope.viewmodel.sysCategories, + "id", + e.id + ); + if (!current) { + $scope.viewmodel.sysCategories.push({ + id: e.id, + parentId: $scope.viewmodel.id, + mixDatabaseName: "sys_category", + }); + } + }); + }; + $scope.updateSysTags = function (data) { + // Loop selected categories + angular.forEach($scope.selectedTags, function (e) { + // add if not exist in sysCategories + var current = $rootScope.findObjectByKey( + $scope.viewmodel.sysTags, + "id", + e.id + ); + if (!current) { + $scope.viewmodel.sysCategories.push({ + id: e.id, + parentId: $scope.viewmodel.id, + mixDatabaseName: "sys_tag", + }); + } + }); + }; + $scope.validate = function () { + angular.forEach($scope.viewmodel.mixDatabaseNavs, function (nav) { + if (nav.isActived) { + $rootScope.encryptMixDatabase( + nav.mixDatabase.attributes, + nav.mixDatabase.postData.items + ); + } + }); + return true; + }; + }, +]); + +"use strict"; +app.factory("PostRestService", [ + "BaseRestService", + function (baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("post/portal"); + // Define more service methods here + return serviceFactory; + }, +]); + +"use strict"; +app.controller("RoleController", [ + "$scope", + "$rootScope", + "$location", + "$routeParams", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", + "RoleService", + function ( + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + dataService, + columnService, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.role = { name: "" }; + $scope.initPermissions = async function () { + let backUrl = "/portal/role/list"; + $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; + $scope.updateUrl = "/portal/mix-database-data/details"; + }; + + $scope.createRole = async function () { + $rootScope.isBusy = true; + var result = await service.createRole($scope.role.name); + if (result.isSucceed) { + $scope.role.name = ""; + $scope.getList(); + } else { + $rootScope.showErrors(result.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("RoleService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("role", true); + + var _getPermissions = async function () { + var req = { + method: "GET", + url: this.prefixUrl + "/permissions", + }; + return await apiService.getApiResult(req); + }; + + var _updatePermission = async function (permission) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-permission", + data: JSON.stringify(permission), + }; + return await apiService.getApiResult(req); + }; + var _createRole = function (name) { + var req = { + method: "POST", + url: this.prefixUrl + "/create", + data: JSON.stringify(name), + }; + + return apiService.getRestApiResult(req); + }; + serviceFactory.createRole = _createRole; + serviceFactory.getPermissions = _getPermissions; + serviceFactory.updatePermission = _updatePermission; + return serviceFactory; + }, +]); + +"use strict"; +app.controller("TemplateController", [ + "$scope", + "$rootScope", + "$routeParams", + "$location", + "ngAppSettings", + "AuthService", + "TemplateService", + function ( + $scope, + $rootScope, + $routeParams, + $location, + ngAppSettings, + authService, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + BaseHub.call(this, $scope); + $scope.folderTypes = [ + "Masters", + "Layouts", + "Pages", + "Modules", + "Forms", + "Edms", + "Products", + "Posts", + "Widgets", + ]; + $scope.isInitHub = false; + $scope.room = null; + $scope.members = []; + $scope.activedPane = null; + $scope.canRename = true; + $scope.user = null; + $scope.selectPane = function (pane) { + $scope.activedPane = pane; + }; + $scope.init = async function () { + authService.fillAuthData().then(function () { + $scope.user = { + username: authService.authentication.info.user.UserName, + avatar: authService.authentication.info.user.Avatar, + }; + $scope.startConnection("editFileHub", () => { + if ($routeParams.id) { + $scope.room = `Template-${$routeParams.id}`; + $scope.joinRoom(); + } + }); + }); + }; + $scope.loadFolder = function (d) { + $location.url( + "/portal/template/list/" + + $routeParams.themeId + + "?folderType=" + + encodeURIComponent(d) + ); + }; + $scope.loadParams = async function () { + $rootScope.isBusy = true; + $scope.folderType = $routeParams.folderType; // ? $routeParams.folderType : 'Masters'; + $scope.themeId = $routeParams.themeId; + }; + $scope.getSingle = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + $scope.folderType = $routeParams.folderType; // ? $routeParams.folderType : 'Masters'; + var themeId = $routeParams.themeId; + $scope.listUrl = + "/portal/template/list/" + + themeId + + "?folderType=" + + encodeURIComponent($scope.folderType); + if (id) { + var resp = await service.getSingle([id], { + folderType: $scope.folderType, + themeId: themeId, + }); + if (resp && resp.isSucceed) { + $scope.viewmodel = resp.data; + $scope.canRename = + $scope.viewmodel.id === 0 || + $scope.viewmodel.fileName.indexOf("Copy") === 0; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + var resp = await service.getDefault(); + if (resp && resp.isSucceed) { + resp.data.themeId = themeId; + resp.data.folderType = $scope.folderType; + $scope.viewmodel = resp.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } + }; + $scope.copy = async function (id) { + $rootScope.isBusy = true; + $scope.folderType = $routeParams.folderType; // ? $routeParams.folderType : 'Masters'; + var themeId = $routeParams.themeId; + $scope.listUrl = + "/portal/template/list/" + + themeId + + "?folderType=" + + encodeURIComponent($scope.folderType); + var resp = await service.copy(id); + if (resp && resp.isSucceed) { + $location.url( + `/portal/template/details/${themeId}/${$scope.folderType}/${resp.data.id}` + ); + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.getList = async function (pageIndex, themeId) { + $scope.request.themeId = themeId || $routeParams.themeId; + $scope.request.folderType = $routeParams.folderType; + $scope.request.status = null; + $scope.folderType = $routeParams.folderType; + if ($scope.folderType) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var df = new Date($scope.request.fromDate); + $scope.request.fromDate = df.toISOString(); + } + if ($scope.request.toDate !== null) { + var dt = new Date($scope.request.toDate); + $scope.request.toDate = dt.toISOString(); + } + var resp = await service.getList($scope.request, [$scope.themeId]); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + $rootScope.isBusy = false; + } + }; + $scope.updateTemplateContent = function (content) { + $scope.viewmodel.content = content; + }; + $scope.updateStyleContent = function (content) { + $scope.viewmodel.scripts = content; + }; + $scope.updateScriptContent = function (content) { + $scope.viewmodel.styles = content; + }; + $scope.joinRoom = function () { + $scope.connection.invoke("JoinRoom", $scope.room, $scope.user); + }; + $scope.receiveMessage = function (msg) { + switch (msg.type) { + case "MemberList": + $scope.members = msg.data; + $scope.isValid = $scope.members.length == 1; + if (!$scope.isValid) { + $scope.errors = [ + "Cannot modify if there is another user opening this template", + ]; + } else { + $scope.errors = []; + } + $scope.$apply(); + break; + + default: + break; + } + console.log(msg); + }; + }, +]); + +"use strict"; +app.controller("StoreController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "CryptoService", + "ThemeService", + "StoreService", + function ( + $scope, + $rootScope, + ngAppSettings, + cryptoService, + themeService, + service ) { }, ]); @@ -5498,248 +5710,36 @@ app.controller("ThemeController", [ commonService.initAllSettings().then(function () { $location.path("/portal/theme/list"); $rootScope.isBusy = false; - $scope.$apply(); - }); - }; - $scope.removeCallback = function () { - commonService.initAllSettings().then(function () { - $location.path("/portal/theme/list"); - }); - }; - - $scope.getExportData = async function () { - var id = $routeParams.id; - var resp = await service.getExportData(id); - if (resp && resp.isSucceed) { - $scope.exportData = resp.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.generateSEO = function () { - $scope.viewmodel.name = $rootScope.generateKeyword( - $scope.viewmodel.title, - "-" - ); - }; - }, -]); - -"use strict"; -app.controller("TemplateController", [ - "$scope", - "$rootScope", - "$routeParams", - "$location", - "ngAppSettings", - "AuthService", - "TemplateService", - function ( - $scope, - $rootScope, - $routeParams, - $location, - ngAppSettings, - authService, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - BaseHub.call(this, $scope); - $scope.folderTypes = [ - "Masters", - "Layouts", - "Pages", - "Modules", - "Forms", - "Edms", - "Products", - "Posts", - "Widgets", - ]; - $scope.isInitHub = false; - $scope.room = null; - $scope.members = []; - $scope.activedPane = null; - $scope.canRename = true; - $scope.user = null; - $scope.selectPane = function (pane) { - $scope.activedPane = pane; - }; - $scope.init = async function () { - authService.fillAuthData().then(function () { - $scope.user = { - username: authService.authentication.info.user.UserName, - avatar: authService.authentication.info.user.Avatar, - }; - $scope.startConnection("editFileHub", () => { - if ($routeParams.id) { - $scope.room = `Template-${$routeParams.id}`; - $scope.joinRoom(); - } - }); - }); - }; - $scope.loadFolder = function (d) { - $location.url( - "/portal/template/list/" + - $routeParams.themeId + - "?folderType=" + - encodeURIComponent(d) - ); - }; - $scope.loadParams = async function () { - $rootScope.isBusy = true; - $scope.folderType = $routeParams.folderType; // ? $routeParams.folderType : 'Masters'; - $scope.themeId = $routeParams.themeId; - }; - $scope.getSingle = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.folderType = $routeParams.folderType; // ? $routeParams.folderType : 'Masters'; - var themeId = $routeParams.themeId; - $scope.listUrl = - "/portal/template/list/" + - themeId + - "?folderType=" + - encodeURIComponent($scope.folderType); - if (id) { - var resp = await service.getSingle([id], { - folderType: $scope.folderType, - themeId: themeId, - }); - if (resp && resp.isSucceed) { - $scope.viewmodel = resp.data; - $scope.canRename = - $scope.viewmodel.id === 0 || - $scope.viewmodel.fileName.indexOf("Copy") === 0; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - var resp = await service.getDefault(); - if (resp && resp.isSucceed) { - resp.data.themeId = themeId; - resp.data.folderType = $scope.folderType; - $scope.viewmodel = resp.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } - }; - $scope.copy = async function (id) { - $rootScope.isBusy = true; - $scope.folderType = $routeParams.folderType; // ? $routeParams.folderType : 'Masters'; - var themeId = $routeParams.themeId; - $scope.listUrl = - "/portal/template/list/" + - themeId + - "?folderType=" + - encodeURIComponent($scope.folderType); - var resp = await service.copy(id); - if (resp && resp.isSucceed) { - $location.url( - `/portal/template/details/${themeId}/${$scope.folderType}/${resp.data.id}` - ); - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.getList = async function (pageIndex, themeId) { - $scope.request.themeId = themeId || $routeParams.themeId; - $scope.request.folderType = $routeParams.folderType; - $scope.request.status = null; - $scope.folderType = $routeParams.folderType; - if ($scope.folderType) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var df = new Date($scope.request.fromDate); - $scope.request.fromDate = df.toISOString(); - } - if ($scope.request.toDate !== null) { - var dt = new Date($scope.request.toDate); - $scope.request.toDate = dt.toISOString(); - } - var resp = await service.getList($scope.request, [$scope.themeId]); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - $rootScope.isBusy = false; - } - }; - $scope.updateTemplateContent = function (content) { - $scope.viewmodel.content = content; - }; - $scope.updateStyleContent = function (content) { - $scope.viewmodel.scripts = content; - }; - $scope.updateScriptContent = function (content) { - $scope.viewmodel.styles = content; - }; - $scope.joinRoom = function () { - $scope.connection.invoke("JoinRoom", $scope.room, $scope.user); - }; - $scope.receiveMessage = function (msg) { - switch (msg.type) { - case "MemberList": - $scope.members = msg.data; - $scope.isValid = $scope.members.length == 1; - if (!$scope.isValid) { - $scope.errors = [ - "Cannot modify if there is another user opening this template", - ]; - } else { - $scope.errors = []; - } - $scope.$apply(); - break; + $scope.$apply(); + }); + }; + $scope.removeCallback = function () { + commonService.initAllSettings().then(function () { + $location.path("/portal/theme/list"); + }); + }; - default: - break; + $scope.getExportData = async function () { + var id = $routeParams.id; + var resp = await service.getExportData(id); + if (resp && resp.isSucceed) { + $scope.exportData = resp.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); } - console.log(msg); + }; + + $scope.generateSEO = function () { + $scope.viewmodel.name = $rootScope.generateKeyword( + $scope.viewmodel.title, + "-" + ); }; }, ]); @@ -6471,31 +6471,6 @@ app.component("appSettingsDefault", { }, }); -app.component("appSettingsGeneral", { - templateUrl: - "/mix-app/views/app-portal/pages/app-settings/components/general/view.html", - controller: [ - "$rootScope", - "$scope", - "CommonService", - function ($rootScope, $scope, commonService) { - var ctrl = this; - ctrl.stopApplication = async function () { - $rootScope.isBusy = true; - await commonService.stopApplication(); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - }; - }, - ], - bindings: { - appSettings: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("appSettingsHeart", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/heart/view.html", @@ -6556,6 +6531,31 @@ modules.component("portalMenus", { ], }); +app.component("appSettingsGeneral", { + templateUrl: + "/mix-app/views/app-portal/pages/app-settings/components/general/view.html", + controller: [ + "$rootScope", + "$scope", + "CommonService", + function ($rootScope, $scope, commonService) { + var ctrl = this; + ctrl.stopApplication = async function () { + $rootScope.isBusy = true; + await commonService.stopApplication(); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + }; + }, + ], + bindings: { + appSettings: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("appSettingsSmtp", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/smtp/view.html", @@ -6843,6 +6843,16 @@ app.component("pageGeneral", { }, }); +app.component("pageModules", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/modules/modules.html", + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("pageMain", { templateUrl: "/mix-app/views/app-portal/pages/page/components/main/main.html", controller: [ @@ -6886,16 +6896,6 @@ app.component("pageMain", { }, }); -app.component("pageModules", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/modules/modules.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageAdvanced", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-advanced/view.html", @@ -6917,21 +6917,6 @@ app.component("pageAdvanced", { ], }); -app.component("pageType", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/page-type/view.html", - bindings: { - model: "=", - }, - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - }, - ], -}); - app.component("pageContent", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-content/view.html", @@ -6974,6 +6959,21 @@ app.component("pageContent", { ], }); +app.component("pageType", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/page-type/view.html", + bindings: { + model: "=", + }, + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + }, + ], +}); + app.component("pageParents", { templateUrl: "/mix-app/views/app-portal/pages/page/components/parents/parents.html", @@ -7096,47 +7096,6 @@ app.component("permissionParents", { }, }); -modules.component("rolePageNav", { - templateUrl: - "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RoleService", - function ($rootScope, $scope, ngAppSettings, roleServices) { - var ctrl = this; - ctrl.selected = null; - ctrl.updateOrders = function (index) { - ctrl.data.splice(index, 1); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.data[i].priority = i + 1; - } - }; - //ctrl.change = async function () { - // //var permission = ctrl.page.navPermission; - // //$rootScope.isBusy = true; - // //var resp = await roleServices.updatePermission(permission); - // //if (resp && resp.isSucceed) { - // // $rootScope.showMessage('Update successfully!', 'success'); - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - // //else { - // // if (resp) { $rootScope.showErrors(resp.errors); } - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - //}; - }, - ], - bindings: { - prefix: "=", - page: "=", - callback: "&", - }, -}); - app.component("permissionPlugPlay", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/plug-play/plug-play.html", @@ -7236,6 +7195,30 @@ app.component("permissionPlugPlay", { ], }); +app.component("serviceMain", { + templateUrl: + "/mix-app/views/app-portal/pages/service/components/main/view.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.gennerateName = function () { + if ( + !ctrl.model.id || + ctrl.model.name === null || + ctrl.model.name === "" + ) { + ctrl.model.name = $rootScope.generateKeyword(ctrl.model.title, "_"); + } + }; + }, + ], + bindings: { + model: "=", + }, +}); + app.component("postGeneral", { templateUrl: "/mix-app/views/app-portal/pages/post/components/general/view.html", @@ -7299,49 +7282,6 @@ app.component("postMain", { ], }); -app.component("postMedias", { - templateUrl: - "/mix-app/views/app-portal/pages/post/components/medias/view.html", - controller: function () { - var ctrl = this; - ctrl.activeMedia = function (media) { - var currentItem = null; - if (ctrl.post.mediaNavs === null) { - ctrl.post.mediaNavs = []; - } - $.each(ctrl.post.mediaNavs, function (i, e) { - if (e.mediaId === media.id) { - e.isActived = media.isActived; - currentItem = e; - return false; - } - }); - if (currentItem === null) { - currentItem = { - description: - media.description !== "undefined" ? media.description : "", - image: media.filePath, - mediaId: media.id, - post: ctrl.post.id, - specificulture: media.specificulture, - position: 0, - priority: ctrl.post.mediaNavs.length + 1, - isActived: true, - }; - media.isHidden = true; - ctrl.post.mediaNavs.push(currentItem); - } - }; - }, - bindings: { - post: "=", - medias: "=", - loadMedia: "&", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("postModules", { templateUrl: "/mix-app/views/app-portal/pages/post/components/modules/view.html", @@ -7425,11 +7365,54 @@ app.component("postModules", { $rootScope.isBusy = false; $scope.$apply(); } - }; - }, - ], + }; + }, + ], + bindings: { + post: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + +app.component("postMedias", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/medias/view.html", + controller: function () { + var ctrl = this; + ctrl.activeMedia = function (media) { + var currentItem = null; + if (ctrl.post.mediaNavs === null) { + ctrl.post.mediaNavs = []; + } + $.each(ctrl.post.mediaNavs, function (i, e) { + if (e.mediaId === media.id) { + e.isActived = media.isActived; + currentItem = e; + return false; + } + }); + if (currentItem === null) { + currentItem = { + description: + media.description !== "undefined" ? media.description : "", + image: media.filePath, + mediaId: media.id, + post: ctrl.post.id, + specificulture: media.specificulture, + position: 0, + priority: ctrl.post.mediaNavs.length + 1, + isActived: true, + }; + media.isHidden = true; + ctrl.post.mediaNavs.push(currentItem); + } + }; + }, bindings: { post: "=", + medias: "=", + loadMedia: "&", onDelete: "&", onUpdate: "&", }, @@ -7590,36 +7573,53 @@ app.component("postRelated", { }, }); -app.component("postSeo", { - templateUrl: "/mix-app/views/app-portal/pages/post/components/seo/view.html", - bindings: { - post: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - -app.component("serviceMain", { +modules.component("rolePageNav", { templateUrl: - "/mix-app/views/app-portal/pages/service/components/main/view.html", + "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", controller: [ "$rootScope", - function ($rootScope) { + "$scope", + "ngAppSettings", + "RoleService", + function ($rootScope, $scope, ngAppSettings, roleServices) { var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.gennerateName = function () { - if ( - !ctrl.model.id || - ctrl.model.name === null || - ctrl.model.name === "" - ) { - ctrl.model.name = $rootScope.generateKeyword(ctrl.model.title, "_"); + ctrl.selected = null; + ctrl.updateOrders = function (index) { + ctrl.data.splice(index, 1); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.data[i].priority = i + 1; } }; + //ctrl.change = async function () { + // //var permission = ctrl.page.navPermission; + // //$rootScope.isBusy = true; + // //var resp = await roleServices.updatePermission(permission); + // //if (resp && resp.isSucceed) { + // // $rootScope.showMessage('Update successfully!', 'success'); + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + // //else { + // // if (resp) { $rootScope.showErrors(resp.errors); } + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + //}; }, ], bindings: { - model: "=", + prefix: "=", + page: "=", + callback: "&", + }, +}); + +app.component("postSeo", { + templateUrl: "/mix-app/views/app-portal/pages/post/components/seo/view.html", + bindings: { + post: "=", + onDelete: "&", + onUpdate: "&", }, }); @@ -7693,34 +7693,20 @@ app.component("themeExportModules", { }, }); -app.component("themeExportPages", { +app.component("themeExportPosts", { templateUrl: - "/mix-app/views/app-portal/pages/theme/components/theme-export-pages/view.html", + "/mix-app/views/app-portal/pages/theme/components/theme-export-posts/view.html", controller: [ "$rootScope", "$scope", "ngAppSettings", function ($rootScope, $scope) { var ctrl = this; - ctrl.updatePageExport = function (value, isSelected) { - // Filter actived page - var idx = (ctrl.selectedExport.pages = angular.copy( - $rootScope.filterArray(ctrl.exportData.pages, ["isActived"], [true]) + ctrl.updatePostExport = function (value, isSelected) { + // Filter actived post + var idx = (ctrl.selectedExport.posts = angular.copy( + $rootScope.filterArray(ctrl.exportData.posts, ["isActived"], [true]) )); - - // // Loop actived page - // angular.forEach(ctrl.selectedExport.pages, function (e) { - // // filter list actived modules - // e.moduleNavs = angular.copy($rootScope.filterArray(e.moduleNavs, ['isActived'], [true])); - - // // Loop actived modules - // angular.forEach(e.moduleNavs, function (n) { - // // filter list actived data - // n.module.data.items = angular.copy($rootScope.filterArray(n.module.data.items, ['isActived'], [true])); - // $rootScope.removeObjectByKey(ctrl.exportData.modules, 'id', n.moduleId); - // $rootScope.removeObjectByKey(ctrl.selectedExport.modules, 'id', n.moduleId); - // }); - // }); }; ctrl.isSelected = function (value) { return ctrl.selectedValues.indexOf(value) >= 0; @@ -7731,7 +7717,7 @@ app.component("themeExportPages", { e.isActived = ctrl.selectedList.isSelectAll; e.isExportData = ctrl.selectedList.isExportData; }); - ctrl.updatePageExport(); + ctrl.updatePostExport(); }; }, ], @@ -7741,20 +7727,34 @@ app.component("themeExportPages", { }, }); -app.component("themeExportPosts", { +app.component("themeExportPages", { templateUrl: - "/mix-app/views/app-portal/pages/theme/components/theme-export-posts/view.html", + "/mix-app/views/app-portal/pages/theme/components/theme-export-pages/view.html", controller: [ "$rootScope", "$scope", "ngAppSettings", function ($rootScope, $scope) { var ctrl = this; - ctrl.updatePostExport = function (value, isSelected) { - // Filter actived post - var idx = (ctrl.selectedExport.posts = angular.copy( - $rootScope.filterArray(ctrl.exportData.posts, ["isActived"], [true]) + ctrl.updatePageExport = function (value, isSelected) { + // Filter actived page + var idx = (ctrl.selectedExport.pages = angular.copy( + $rootScope.filterArray(ctrl.exportData.pages, ["isActived"], [true]) )); + + // // Loop actived page + // angular.forEach(ctrl.selectedExport.pages, function (e) { + // // filter list actived modules + // e.moduleNavs = angular.copy($rootScope.filterArray(e.moduleNavs, ['isActived'], [true])); + + // // Loop actived modules + // angular.forEach(e.moduleNavs, function (n) { + // // filter list actived data + // n.module.data.items = angular.copy($rootScope.filterArray(n.module.data.items, ['isActived'], [true])); + // $rootScope.removeObjectByKey(ctrl.exportData.modules, 'id', n.moduleId); + // $rootScope.removeObjectByKey(ctrl.selectedExport.modules, 'id', n.moduleId); + // }); + // }); }; ctrl.isSelected = function (value) { return ctrl.selectedValues.indexOf(value) >= 0; @@ -7765,7 +7765,7 @@ app.component("themeExportPosts", { e.isActived = ctrl.selectedList.isSelectAll; e.isExportData = ctrl.selectedList.isExportData; }); - ctrl.updatePostExport(); + ctrl.updatePageExport(); }; }, ], @@ -7995,133 +7995,26 @@ var demo = { color: "rgba(255,255,255,0.1)", zeroLineColor: "transparent", }, - }, - ], - xAxes: [ - { - gridLines: { - zeroLineColor: "transparent", - display: false, - }, - ticks: { - padding: 10, - fontColor: "rgba(255,255,255,0.4)", - fontStyle: "bold", - }, - }, - ], - }, - }, - }); - }, -}; - -modules.component("aceEditor", { - templateUrl: - "/mix-app/views/app-portal/components/ace-editor/ace-editor.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - function ($rootScope, $scope, ngAppSettings) { - var ctrl = this; - ctrl.previousId = null; - ctrl.editor = null; - ctrl.id = Math.floor(Math.random() * 100) + 1; - ctrl.$onChanges = (changes) => { - if (changes.content) { - ctrl.updateEditors(); - } - }; - - this.$doCheck = function () { - if (ctrl.previousId != null && ctrl.previousId !== ctrl.contentId) { - ctrl.previousId = ctrl.contentId; - ctrl.updateEditors(); - } - }.bind(this); - ctrl.initAce = function () { - setTimeout(() => { - ctrl.previousId = ctrl.contentId; - ctrl.updateEditors(); - $scope.$apply(); - }, 200); - }; - ctrl.updateContent = function (content) { - ctrl.editor.setValue(content); - }; - ctrl.updateEditors = function () { - $.each($("#code-editor-" + ctrl.id), function (i, e) { - //var container = $(this); - ace.require("ace/ext/language_tools"); - if (e) { - var editor = ace.edit(e); - switch (ctrl.ext) { - case ".json": - editor.session.setMode("ace/mode/json"); - break; - case ".js": - editor.session.setMode("ace/mode/javascript"); - break; - case ".css": - editor.session.setMode("ace/mode/css"); - break; - case ".cshtml": - editor.session.setMode("ace/mode/razor"); - break; - case ".cs": - editor.session.setMode("ace/mode/csharp"); - break; - default: - editor.session.setMode("ace/mode/razor"); - break; - } - editor.setTheme("ace/theme/chrome"); - //editor.setReadOnly(true); - if (ctrl.content) { - editor.setValue(ctrl.content); - } - editor.$blockScrolling = Infinity; - editor.session.setUseWrapMode(true); - editor.setOptions({ - enableBasicAutocompletion: true, - enableSnippets: true, - enableLiveAutocompletion: false, - maxLines: 50, - fontSize: 11, - }); - editor.getSession().on("change", function (e) { - // e.type, etc - ctrl.content = editor.getValue(); - }); - editor.getSession().on("paste", function (e) { - // e.type, etc - ctrl.content = editor.getValue(); - }); - editor.commands.addCommand({ - name: "saveFile", - bindKey: { - win: "Ctrl-S", - mac: "Command-S", - sender: "editor|cli", + }, + ], + xAxes: [ + { + gridLines: { + zeroLineColor: "transparent", + display: false, }, - exec: function (env, args, request) { - var btn = document.getElementById("btnToSubmit"); - btn.click(); + ticks: { + padding: 10, + fontColor: "rgba(255,255,255,0.4)", + fontStyle: "bold", }, - }); - ctrl.editor = editor; - } - }); - }; - }, - ], - bindings: { - content: "=", - contentId: "=", - ext: "=", + }, + ], + }, + }, + }); }, -}); +}; modules.component("actions", { templateUrl: "/mix-app/views/app-portal/components/actions/actions.html", @@ -8151,6 +8044,7 @@ modules.component("actions", { if (ctrl.onSubmit) { $event.preventDefault(); ctrl.onSubmit(); + return; } }; ctrl.clearCache = function () { @@ -8278,6 +8172,162 @@ modules.component("additionalColumn", { ], }); +modules.component("aceEditor", { + templateUrl: + "/mix-app/views/app-portal/components/ace-editor/ace-editor.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + function ($rootScope, $scope, ngAppSettings) { + var ctrl = this; + ctrl.previousId = null; + ctrl.editor = null; + ctrl.id = Math.floor(Math.random() * 100) + 1; + ctrl.$onChanges = (changes) => { + if (changes.content) { + ctrl.updateEditors(); + } + }; + + this.$doCheck = function () { + if (ctrl.previousId != null && ctrl.previousId !== ctrl.contentId) { + ctrl.previousId = ctrl.contentId; + ctrl.updateEditors(); + } + }.bind(this); + ctrl.initAce = function () { + setTimeout(() => { + ctrl.previousId = ctrl.contentId; + ctrl.updateEditors(); + $scope.$apply(); + }, 200); + }; + ctrl.updateContent = function (content) { + ctrl.editor.setValue(content); + }; + ctrl.updateEditors = function () { + $.each($("#code-editor-" + ctrl.id), function (i, e) { + //var container = $(this); + ace.require("ace/ext/language_tools"); + if (e) { + var editor = ace.edit(e); + switch (ctrl.ext) { + case ".json": + editor.session.setMode("ace/mode/json"); + break; + case ".js": + editor.session.setMode("ace/mode/javascript"); + break; + case ".css": + editor.session.setMode("ace/mode/css"); + break; + case ".cshtml": + editor.session.setMode("ace/mode/razor"); + break; + case ".cs": + editor.session.setMode("ace/mode/csharp"); + break; + default: + editor.session.setMode("ace/mode/razor"); + break; + } + editor.setTheme("ace/theme/chrome"); + //editor.setReadOnly(true); + if (ctrl.content) { + editor.setValue(ctrl.content); + } + editor.$blockScrolling = Infinity; + editor.session.setUseWrapMode(true); + editor.setOptions({ + enableBasicAutocompletion: true, + enableSnippets: true, + enableLiveAutocompletion: false, + maxLines: 50, + fontSize: 11, + }); + editor.getSession().on("change", function (e) { + // e.type, etc + ctrl.content = editor.getValue(); + }); + editor.getSession().on("paste", function (e) { + // e.type, etc + ctrl.content = editor.getValue(); + }); + editor.commands.addCommand({ + name: "saveFile", + bindKey: { + win: "Ctrl-S", + mac: "Command-S", + sender: "editor|cli", + }, + exec: function (env, args, request) { + var btn = document.getElementById("btnToSubmit"); + btn.click(); + }, + }); + ctrl.editor = editor; + } + }); + }; + }, + ], + bindings: { + content: "=", + contentId: "=", + ext: "=", + }, +}); + +modules.component("additionalValue", { + templateUrl: + "/mix-app/views/app-portal/components/additional-value/view.html", + bindings: { + additionalData: "=?", + additionalDataId: "=?", + parentType: "=?", + parentId: "=?", + databaseName: "=?", + }, + controller: [ + "$rootScope", + "$scope", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, dataService) { + var ctrl = this; + ctrl.value = {}; + ctrl.column = { dataType: "Text" }; + ctrl.selectedCol = null; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = async function () { + if (!ctrl.additionalData) { + if (!ctrl.additionalDataId) { + const obj = { + parentType: ctrl.parentType, + parentId: ctrl.parentId, + databaseName: ctrl.databaseName, + }; + const getData = await dataService.getAdditionalData(obj); + if (getData.isSucceed) { + ctrl.additionalData = getData.data; + ctrl.additionalData.mixDatabaseName = ctrl.databaseName; + ctrl.additionalData.parentType = ctrl.parentType; + ctrl.additionalData.parentId = ctrl.parentId; + $scope.$apply(); + } else { + $rootScope.showErrors(getData.errors); + } + } else { + var getData = await dataService.getSingle([ctrl.additionalDataId]); + ctrl.additionalData = getData.data; + $scope.$apply(); + } + } + }; + }, + ], +}); + modules.component("confirm", { templateUrl: "/mix-app/views/app-portal/components/confirm/confirm.html", controller: [ @@ -8463,77 +8513,28 @@ modules.component("customImage", { ); ctrl.postedFile.fileStream = reader.result; } - ctrl.srcUrl = reader.result; - ctrl.isImage = - ctrl.srcUrl.indexOf("data:image/") >= 0 || - ctrl.srcUrl - .toLowerCase() - .match(/([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|svg)/g); - ctrl.src = reader.result; - $rootScope.isBusy = false; - $scope.$apply(); - }; - reader.onerror = function (error) { - $rootScope.isBusy = false; - $rootScope.showErrors([error]); - }; - } else { - return null; - } - }; - - ctrl.onUploadFileProgress = function (progress) { - ctrl.progress = progress; - }; - }, - ], -}); - -modules.component("additionalValue", { - templateUrl: - "/mix-app/views/app-portal/components/additional-value/view.html", - bindings: { - additionalData: "=?", - additionalDataId: "=?", - parentType: "=?", - parentId: "=?", - databaseName: "=?", - }, - controller: [ - "$rootScope", - "$scope", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, dataService) { - var ctrl = this; - ctrl.value = {}; - ctrl.column = { dataType: "Text" }; - ctrl.selectedCol = null; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () { - if (!ctrl.additionalData) { - if (!ctrl.additionalDataId) { - const obj = { - parentType: ctrl.parentType, - parentId: ctrl.parentId, - databaseName: ctrl.databaseName, - }; - const getData = await dataService.getAdditionalData(obj); - if (getData.isSucceed) { - ctrl.additionalData = getData.data; - ctrl.additionalData.mixDatabaseName = ctrl.databaseName; - ctrl.additionalData.parentType = ctrl.parentType; - ctrl.additionalData.parentId = ctrl.parentId; - $scope.$apply(); - } else { - $rootScope.showErrors(getData.errors); - } - } else { - var getData = await dataService.getSingle([ctrl.additionalDataId]); - ctrl.additionalData = getData.data; + ctrl.srcUrl = reader.result; + ctrl.isImage = + ctrl.srcUrl.indexOf("data:image/") >= 0 || + ctrl.srcUrl + .toLowerCase() + .match(/([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|svg)/g); + ctrl.src = reader.result; + $rootScope.isBusy = false; $scope.$apply(); - } + }; + reader.onerror = function (error) { + $rootScope.isBusy = false; + $rootScope.showErrors([error]); + }; + } else { + return null; } }; + + ctrl.onUploadFileProgress = function (progress) { + ctrl.progress = progress; + }; }, ], }); @@ -8601,6 +8602,49 @@ modules.component("filterList", { }, }); +modules.component("funding", { + templateUrl: "/mix-app/views/app-portal/components/funding/view.html", + controller: [ + "$rootScope", + "$http", + function ($rootScope, $http) { + var ctrl = this; + ctrl.items = [ + { + title: "opencollective.com/mixcore", + href: "https://opencollective.com/mixcore", + logo: + "https://github.githubassets.com/images/modules/site/icons/funding_platforms/open_collective.svg", + }, + { + title: "funding.communitybridge.org/projects/mixcore", + href: "https://crowdfunding.lfx.linuxfoundation.org/projects/mixcore", + logo: + "https://github.githubassets.com/images/modules/site/icons/funding_platforms/community_bridge.svg", + }, + { + title: "patreon.com/mixcore", + href: "https://www.patreon.com/mixcore/creators", + logo: + "https://github.githubassets.com/images/modules/site/icons/funding_platforms/patreon.svg", + }, + { + title: "paypalme/mixcore", + href: "https://www.paypal.me/mixcore", + logo: "/mix-app/assets/img/svg/heart.svg", + }, + { + title: "buymeacoffee.com/mixcore", + href: "https://www.buymeacoffee.com/mixcore", + logo: "/mix-app/assets/img/svg/heart.svg", + }, + ]; + ctrl.init = function () {}; + }, + ], + bindings: {}, +}); + modules.component("githubContributers", { templateUrl: "/mix-app/views/app-portal/components/github-contributers/view.html", @@ -8639,44 +8683,38 @@ modules.component("githubContributers", { bindings: {}, }); -modules.component("funding", { - templateUrl: "/mix-app/views/app-portal/components/funding/view.html", +modules.component("githubReleases", { + templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", controller: [ "$rootScope", "$http", function ($rootScope, $http) { var ctrl = this; - ctrl.items = [ - { - title: "opencollective.com/mixcore", - href: "https://opencollective.com/mixcore", - logo: - "https://github.githubassets.com/images/modules/site/icons/funding_platforms/open_collective.svg", - }, - { - title: "funding.communitybridge.org/projects/mixcore", - href: "https://crowdfunding.lfx.linuxfoundation.org/projects/mixcore", - logo: - "https://github.githubassets.com/images/modules/site/icons/funding_platforms/community_bridge.svg", - }, - { - title: "patreon.com/mixcore", - href: "https://www.patreon.com/mixcore/creators", - logo: - "https://github.githubassets.com/images/modules/site/icons/funding_platforms/patreon.svg", - }, - { - title: "paypalme/mixcore", - href: "https://www.paypal.me/mixcore", - logo: "/mix-app/assets/img/svg/heart.svg", - }, - { - title: "buymeacoffee.com/mixcore", - href: "https://www.buymeacoffee.com/mixcore", - logo: "/mix-app/assets/img/svg/heart.svg", - }, - ]; - ctrl.init = function () {}; + ctrl.items = []; + ctrl.init = function () { + var req = { + method: "GET", + url: "https://api.github.com/repos/mixcore/mix.core/releases", + }; + ctrl.getGithubApiResult(req); + }; + + ctrl.getGithubApiResult = async function (req) { + return $http(req).then( + function (resp) { + if (resp.status == "200") { + ctrl.items = resp.data; + } else { + } + }, + function (error) { + return { + isSucceed: false, + errors: [error.statusText || error.status], + }; + } + ); + }; }, ], bindings: {}, @@ -8884,43 +8922,6 @@ modules.component("googleAnalytic", { ], }); -modules.component("githubReleases", { - templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", - controller: [ - "$rootScope", - "$http", - function ($rootScope, $http) { - var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var req = { - method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/releases", - }; - ctrl.getGithubApiResult(req); - }; - - ctrl.getGithubApiResult = async function (req) { - return $http(req).then( - function (resp) { - if (resp.status == "200") { - ctrl.items = resp.data; - } else { - } - }, - function (error) { - return { - isSucceed: false, - errors: [error.statusText || error.status], - }; - } - ); - }; - }, - ], - bindings: {}, -}); - (function (angular) { app.component("headerNav", { templateUrl: @@ -8996,22 +8997,6 @@ modules.component("githubReleases", { }); })(window.angular); -modules.component("hubMessages", { - templateUrl: - "/mix-app/views/app-portal/components/hub-messages/hub-messages.html", - controller: "HubMessagesController", - bindings: {}, -}); -app.controller("HubMessagesController", [ - "$scope", - function ($scope) { - BaseHub.call(this, $scope); - $scope.init = function () { - $scope.startConnection("portalhub"); - }; - }, -]); - modules.component("jsonBuilder", { templateUrl: "/mix-app/views/app-portal/components/json-builder/view.html", bindings: { @@ -9226,6 +9211,22 @@ modules.component("jsonBuilder", { ], }); +modules.component("hubMessages", { + templateUrl: + "/mix-app/views/app-portal/components/hub-messages/hub-messages.html", + controller: "HubMessagesController", + bindings: {}, +}); +app.controller("HubMessagesController", [ + "$scope", + function ($scope) { + BaseHub.call(this, $scope); + $scope.init = function () { + $scope.startConnection("portalhub"); + }; + }, +]); + modules.component("jumbotrons", { templateUrl: "/mix-app/views/app-portal/components/jumbotrons/jumbotrons.html", @@ -9238,15 +9239,85 @@ modules.component("jumbotrons", { ctrl.translate = function (keyword) { return $rootScope.translate(keyword); }; - // ctrl.back = function () { - // ctrl.backUrl = ctrl.backUrl || '/admin'; - // $location.path(ctrl.backUrl); - // }; + // ctrl.back = function () { + // ctrl.backUrl = ctrl.backUrl || '/admin'; + // $location.path(ctrl.backUrl); + // }; + }, + ], + bindings: { + tagName: "=", + tagType: "=", + }, +}); + +modules.component("mainSideBar", { + templateUrl: + "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "TranslatorService", + "ApiService", + "CommonService", + function ( + $rootScope, + $scope, + ngAppSettings, + translatorService, + apiService, + commonService + ) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var routes = JSON.parse($("#portal-menus").val()); + ctrl.items = routes.data; + }; + }, + ], + bindings: {}, +}); + +modules.component("mainSideBarDynamic", { + templateUrl: + "/mix-app/views/app-portal/components/main-side-bar-dynamic/main-side-bar-dynamic.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "CommonService", + "TranslatorService", + "AuthService", + function ( + $rootScope, + $scope, + ngAppSettings, + commonService, + translatorService, + authService + ) { + var ctrl = this; + ctrl.init = function () { + commonService.getPermissions().then(function (response) { + if (response && response.isSucceed) { + ctrl.isInit = true; + ctrl.roles = response.data; + if (ctrl.roles.data) { + ctrl.role = ctrl.roles.data[0]; + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + }; }, ], bindings: { - tagName: "=", - tagType: "=", + roles: "=", + activedRole: "=", + translate: "&", }, }); @@ -9401,66 +9472,43 @@ modules.component("listMixColumn", { }, }); -modules.component("mainSideBarDynamic", { +modules.component("mainSideBarItem", { templateUrl: - "/mix-app/views/app-portal/components/main-side-bar-dynamic/main-side-bar-dynamic.html", + "/mix-app/views/app-portal/components/main-side-bar-item/main-side-bar-item.html", controller: [ "$rootScope", - "$scope", - "ngAppSettings", - "CommonService", - "TranslatorService", - "AuthService", - function ( - $rootScope, - $scope, - ngAppSettings, - commonService, - translatorService, - authService - ) { + function ($rootScope) { var ctrl = this; - ctrl.init = function () { - commonService.getPermissions().then(function (response) { - if (response && response.isSucceed) { - ctrl.isInit = true; - ctrl.roles = response.data; - if (ctrl.roles.data) { - ctrl.role = ctrl.roles.data[0]; - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }); + ctrl.translate = $rootScope.translate; + ctrl.addClass = function (obj) { + obj.currentTarget.classList.add("btn-group-lg"); + //alert(obj); + }; + ctrl.removeClass = function (obj) { + obj.currentTarget.classList.remove("btn-group-lg"); + //alert(obj); }; }, ], bindings: { - roles: "=", - activedRole: "=", - translate: "&", + item: "=", }, }); -modules.component("mainSideBarItem", { +modules.component("mainSideBarItemDynamic", { templateUrl: - "/mix-app/views/app-portal/components/main-side-bar-item/main-side-bar-item.html", + "/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html", controller: [ "$rootScope", function ($rootScope) { var ctrl = this; ctrl.translate = $rootScope.translate; - ctrl.addClass = function (obj) { - obj.currentTarget.classList.add("btn-group-lg"); - //alert(obj); - }; - ctrl.removeClass = function (obj) { - obj.currentTarget.classList.remove("btn-group-lg"); - //alert(obj); - }; }, ], bindings: { + iconSize: "=", + linkStyle: "=", + itemStyle: "=", item: "=", }, }); @@ -9624,47 +9672,38 @@ modules.component("mediaFileUpload", { ], }); -modules.component("mainSideBarItemDynamic", { - templateUrl: - "/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.translate = $rootScope.translate; - }, - ], - bindings: { - iconSize: "=", - linkStyle: "=", - itemStyle: "=", - item: "=", - }, -}); - -modules.component("mainSideBar", { - templateUrl: - "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", +modules.component("mediumNews", { + templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", controller: [ "$rootScope", - "$scope", - "ngAppSettings", - "TranslatorService", - "ApiService", - "CommonService", - function ( - $rootScope, - $scope, - ngAppSettings, - translatorService, - apiService, - commonService - ) { + "$http", + function ($rootScope, $http) { var ctrl = this; ctrl.items = []; ctrl.init = function () { - var routes = JSON.parse($("#portal-menus").val()); - ctrl.items = routes.data; + var req = { + method: "GET", + url: + "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + + Math.floor(Date.now() / 1000), + }; + ctrl.getMediumApiResult(req); + }; + + ctrl.getMediumApiResult = async function (req) { + return $http(req).then( + function (resp) { + if (resp.status == "200") { + ctrl.items = resp.data.items; + } + }, + function (error) { + return { + isSucceed: false, + errors: [error.statusText || error.status], + }; + } + ); }; }, ], @@ -9732,42 +9771,128 @@ modules.component("mediaUpload", { }, }); -modules.component("mediumNews", { - templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", +modules.component("mixDatabaseDataFilter", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-data-filter/view.html", + bindings: { + query: "=", + mixDatabaseName: "=?", + mixDatabaseId: "=?", + selectedList: "=", + initData: "=?", + columns: "=?", + selected: "=", + callback: "&?", + save: "&?", + }, controller: [ "$rootScope", - "$http", - function ($rootScope, $http) { + "$scope", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, ngAppSettings, dataService) { var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var req = { - method: "GET", - url: - "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + - Math.floor(Date.now() / 1000), - }; - ctrl.getMediumApiResult(req); + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.types = ["Page", "Post"]; + ctrl.type = "Page"; + ctrl.navs = []; + ctrl.data = { items: [] }; + ctrl.goToPath = $rootScope.goToPath; + ctrl.$onInit = function () { + if (ctrl.initData) { + ctrl.data = ctrl.initData; + } else { + ctrl.loadData(); + } }; + ctrl.loadData = async function (pageIndex) { + ctrl.isBusy = true; - ctrl.getMediumApiResult = async function (req) { - return $http(req).then( - function (resp) { - if (resp.status == "200") { - ctrl.items = resp.data.items; - } - }, - function (error) { - return { - isSucceed: false, - errors: [error.statusText || error.status], - }; + // ctrl.request.query = ctrl.query + ctrl.srcId; + ctrl.navs = []; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var df = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = df.toISOString(); + } + if (ctrl.request.toDate !== null) { + var dt = new Date(ctrl.request.toDate); + ctrl.request.toDate = dt.toISOString(); + } + if (ctrl.mixDatabaseId) { + ctrl.request.mixDatabaseId = ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.mixDatabaseName = ctrl.mixDatabaseName; + } + if (ctrl.filterType) { + ctrl.request.filterType = ctrl.filterType; + } + + var response = await dataService.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + ctrl.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + ctrl.isBusy = false; + $scope.$apply(); + } + }; + ctrl.edit = function (nav) { + switch (ctrl.type) { + case "Page": + ctrl.goToPath(`/portal/page/details/${nav.id}`); + break; + case "Post": + ctrl.goToPath(`/portal/post/details/${nav.id}`); + break; + case "Module": + ctrl.goToPath(`/portal/module/details/${nav.id}`); + break; + } + }; + ctrl.onClose = function () { + ctrl.callback(); + }; + ctrl.select = function (nav) { + var current = $rootScope.findObjectByKey(ctrl.data.items, "id", nav.id); + if (!nav.isActive && ctrl.callback) { + ctrl.callback({ nav: nav }); + } + if (ctrl.isMultiple) { + current.isActive = !current.isActive; + } else { + if (!nav.isActive) { + angular.forEach(ctrl.data.items, (element) => { + element.isActive = false; + }); } + current.isActive = !nav.isActive; + } + }; + ctrl.saveSelected = function () { + ctrl.selected = $rootScope.filterArray( + ctrl.data, + ["isActived"], + [true] ); + setTimeout(() => { + ctrl.save().then(() => { + ctrl.loadPosts(); + }); + }, 500); + }; + ctrl.limString = function (str, max) { + if (str) { + return str.length > max ? str.substring(0, max) + " ..." : str; + } }; }, ], - bindings: {}, }); modules.component("mixDatabaseColumn", { @@ -9880,124 +10005,417 @@ modules.component("mixDatabaseColumn", { ], }); -modules.component("mixDatabaseDataFilter", { +modules.component("mixDatabaseDataValueEditor", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-filter/view.html", + "/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html", bindings: { - query: "=", - mixDatabaseName: "=?", - mixDatabaseId: "=?", - selectedList: "=", - initData: "=?", + mixDatabaseDataValue: "=?", + parentType: "=?", + parentId: "=?", + isShowTitle: "=?", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "$location", + "RestRelatedMixDatabasePortalService", + "RestMixDatabaseDataPortalService", + function ( + $rootScope, + $scope, + ngAppSettings, + $location, + navService, + dataService + ) { + var ctrl = this; + ctrl.goToPath = $rootScope.goToPath; + ctrl.icons = ngAppSettings.icons; + ctrl.refData = null; + ctrl.defaultDataModel = null; + ctrl.refDataModel = { + id: null, + data: null, + }; + ctrl.refRequest = angular.copy(ngAppSettings.request); + ctrl.refRequest.pageSize = 100; + ctrl.dataTypes = $rootScope.globalSettings.dataTypes; + ctrl.previousId = null; + ctrl.$doCheck = function () { + if ( + ctrl.mixDatabaseDataValue && + ctrl.previousId !== ctrl.mixDatabaseDataValue.id + ) { + ctrl.previousId = ctrl.mixDatabaseDataValue.id; + ctrl.initData(); + } + }.bind(ctrl); + ctrl.$onInit = function () { + ctrl.initData(); + }; + ctrl.initData = async function () { + setTimeout(() => { + if (!ctrl.mixDatabaseDataValue.id) { + ctrl.initDefaultValue(); + } + switch (ctrl.mixDatabaseDataValue.dataType.toLowerCase()) { + case "datetime": + case "date": + case "time": + if (ctrl.mixDatabaseDataValue.dateTimeValue) { + ctrl.mixDatabaseDataValue.dateObj = new Date( + ctrl.mixDatabaseDataValue.dateTimeValue + ); + $scope.$apply(); + } + break; + case "reference": // reference + if ( + ctrl.mixDatabaseDataValue.column.referenceId && + ctrl.parentId + ) { + ctrl.mixDatabaseDataValue.integerValue = + ctrl.mixDatabaseDataValue.column.referenceId; + // navService.getSingle(["default"]).then((resp) => { + // ctrl.defaultDataModel = resp; + // ctrl.defaultDataModel.mixDatabaseId = + // ctrl.mixDatabaseDataValue.column.referenceId; + // ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); + // }); + // ctrl.loadRefData(); + } + break; + default: + if ( + ctrl.mixDatabaseDataValue.column && + ctrl.mixDatabaseDataValue.column.isEncrypt && + ctrl.mixDatabaseDataValue.encryptValue + ) { + var encryptedData = { + key: ctrl.mixDatabaseDataValue.encryptKey, + data: ctrl.mixDatabaseDataValue.encryptValue, + }; + ctrl.mixDatabaseDataValue.stringValue = $rootScope.decrypt( + encryptedData + ); + } + if ( + ctrl.mixDatabaseDataValue.column && + !ctrl.mixDatabaseDataValue.stringValue + ) { + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + $scope.$apply(); + } + break; + } + }, 200); + }; + ctrl.initDefaultValue = async function () { + switch (ctrl.mixDatabaseDataValue.dataType) { + case "datetime": + case "date": + case "time": + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.dateObj = new Date( + ctrl.mixDatabaseDataValue.column.defaultValue + ); + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; + case "double": + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.doubleValue = parseFloat( + ctrl.mixDatabaseDataValue.column.defaultValue + ); + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; + case "boolean": + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.booleanValue = + ctrl.mixDatabaseDataValue.column.defaultValue == "true"; + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; + + default: + if (ctrl.mixDatabaseDataValue.column.defaultValue) { + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.column.defaultValue; + } + break; + } + }; + ctrl.updateStringValue = async function (dataType) { + switch (dataType.toLowerCase()) { + case "datetime": + case "date": + case "time": + if (ctrl.mixDatabaseDataValue.dateObj) { + ctrl.mixDatabaseDataValue.dateTimeValue = ctrl.mixDatabaseDataValue.dateObj.toISOString(); + ctrl.mixDatabaseDataValue.stringValue = + ctrl.mixDatabaseDataValue.dateTimeValue; + } + break; + case "double": + if (ctrl.mixDatabaseDataValue.doubleValue) { + ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.doubleValue.toString(); + } + break; + case "boolean": + if (ctrl.mixDatabaseDataValue.booleanValue != null) { + ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.booleanValue.toString(); + } + break; + + default: + break; + } + }; + + ctrl.updateRefData = function (nav) { + ctrl.goToPath(`/portal/mix-database-data/details?dataId=${nav.data.id} + &mixDatabaseId=${nav.data.mixDatabaseId} + &parentId=${ctrl.parentId} + &parentType=${ctrl.parentType}`); + // ctrl.refDataModel = nav; + // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; + // angular.element(e).triggerHandler('click'); + // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); + }; + + ctrl.removeRefData = async function (nav) { + $rootScope.showConfirm( + ctrl, + "removeRefDataConfirmed", + [nav], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + ctrl.removeRefDataConfirmed = async function (nav) { + $rootScope.isBusy = true; + var result = await navService.delete([ + nav.parentId, + nav.parentType, + nav.id, + ]); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.refData, "id", nav.id); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, + ], +}); + +modules.component("mixDatabaseForm", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-form/view.html", + bindings: { + mixDatabaseId: "=", + mixDatabaseName: "=", columns: "=?", - selected: "=", - callback: "&?", - save: "&?", + mixDatabaseDataId: "=?", + mixDatabaseData: "=", + parentType: "=?", // attribute set = 1 | post = 2 | page = 3 | module = 4 + parentId: "=?", + defaultId: "=", + backUrl: "=?", + level: "=?", + hideAction: "=?", + saveSuccess: "&?", }, controller: [ "$rootScope", "$scope", - "ngAppSettings", + "$location", + "$routeParams", "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, ngAppSettings, dataService) { + function ($rootScope, $scope, $location, $routeParams, service) { var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.types = ["Page", "Post"]; - ctrl.type = "Page"; - ctrl.navs = []; - ctrl.data = { items: [] }; - ctrl.goToPath = $rootScope.goToPath; - ctrl.$onInit = function () { - if (ctrl.initData) { - ctrl.data = ctrl.initData; - } else { - ctrl.loadData(); - } + ctrl.isBusy = false; + ctrl.attributes = []; + + ctrl.defaultData = null; + ctrl.selectedProp = null; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = async function () { + ctrl.level = ctrl.level || 0; + await ctrl.loadData(); }; - ctrl.loadData = async function (pageIndex) { + ctrl.loadData = async function () { + /* + If input is data id => load ctrl.mixDatabaseData from service and handle it independently + */ ctrl.isBusy = true; - // ctrl.request.query = ctrl.query + ctrl.srcId; - ctrl.navs = []; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var df = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = df.toISOString(); + if (ctrl.mixDatabaseDataId) { + var getData = await service.getSingle([ctrl.mixDatabaseDataId]); + ctrl.mixDatabaseData = getData.data; + if (ctrl.mixDatabaseData) { + ctrl.mixDatabaseData.parentId = ctrl.parentId; + ctrl.mixDatabaseData.parentType = ctrl.parentType; + ctrl.mixDatabaseId = ctrl.mixDatabaseData.mixDatabaseId; + ctrl.mixDatabaseName = ctrl.mixDatabaseData.mixDatabaseName; + ctrl.mixDatabaseTitle = $routeParams.mixDatabaseTitle; + ctrl.backUrl = `/portal/mix-database-data/list?mixDatabaseId=${ctrl.mixDatabaseData.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseData.mixDatabaseName}&mixDatabaseTitle=test`; + await ctrl.loadDefaultModel(); + ctrl.isBusy = false; + $scope.$apply(); + } else { + if (getData) { + $rootScope.showErrors(getData.errors); + } + ctrl.isBusy = false; + $scope.$apply(); + } } - if (ctrl.request.toDate !== null) { - var dt = new Date(ctrl.request.toDate); - ctrl.request.toDate = dt.toISOString(); + if ((ctrl.mixDatabaseName || ctrl.mixDatabaseId) && !ctrl.defaultData) { + await ctrl.loadDefaultModel(); + ctrl.isBusy = false; + $scope.$apply(); } - if (ctrl.mixDatabaseId) { - ctrl.request.mixDatabaseId = ctrl.mixDatabaseId; + }; + ctrl.loadDefaultModel = async function () { + if ($routeParams.parentId) { + ctrl.parentId = $routeParams.parentId; } - if (ctrl.mixDatabaseName) { - ctrl.request.mixDatabaseName = ctrl.mixDatabaseName; + if ($routeParams.parentType) { + ctrl.parentType = $routeParams.parentType; } - if (ctrl.filterType) { - ctrl.request.filterType = ctrl.filterType; + if (!ctrl.backUrl) { + if (ctrl.parentType) { + switch (ctrl.parentType) { + case "Post": + case "Page": + case "Module": + ctrl.backUrl = `/portal/${ctrl.parentType.toLowerCase()}/details/${ + ctrl.parentId + }`; + break; + + default: + ctrl.backUrl = `/portal/mix-database-data/details?dataId=${ctrl.parentId}&mixDatabaseId=${ctrl.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseName}&mixDatabaseTitle=${$routeParams.mixDatabaseTitle}`; + break; + } + } } + var getDefault = await service.initData( + ctrl.mixDatabaseName || ctrl.mixDatabaseId + ); + ctrl.defaultData = getDefault.data; + if (ctrl.defaultData) { + ctrl.defaultData.mixDatabaseId = ctrl.mixDatabaseId || 0; + ctrl.defaultData.mixDatabaseName = ctrl.mixDatabaseName; + ctrl.defaultData.parentId = ctrl.parentId; + ctrl.defaultData.parentType = ctrl.parentType; - var response = await dataService.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - ctrl.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - ctrl.isBusy = false; - $scope.$apply(); + ctrl.columns = ctrl.columns || ctrl.defaultData.columns; } - }; - ctrl.edit = function (nav) { - switch (ctrl.type) { - case "Page": - ctrl.goToPath(`/portal/page/details/${nav.id}`); - break; - case "Post": - ctrl.goToPath(`/portal/post/details/${nav.id}`); - break; - case "Module": - ctrl.goToPath(`/portal/module/details/${nav.id}`); - break; + + if (!ctrl.mixDatabaseData) { + ctrl.mixDatabaseData = angular.copy(ctrl.defaultData); } }; - ctrl.onClose = function () { - ctrl.callback(); + + ctrl.reload = async function () { + ctrl.mixDatabaseData = angular.copy(ctrl.defaultData); }; - ctrl.select = function (nav) { - var current = $rootScope.findObjectByKey(ctrl.data.items, "id", nav.id); - if (!nav.isActive && ctrl.callback) { - ctrl.callback({ nav: nav }); + ctrl.loadSelected = function () { + if (ctrl.selectedList.data.length) { + ctrl.mixDatabaseData = ctrl.selectedList.data[0]; + ctrl.mixDatabaseData.mixDatabaseId = ctrl.mixDatabaseId; + ctrl.mixDatabaseData.mixDatabaseName = ctrl.mixDatabaseName; + ctrl.mixDatabaseData.parentId = ctrl.parentId; + ctrl.mixDatabaseData.parentType = ctrl.parentType; } - if (ctrl.isMultiple) { - current.isActive = !current.isActive; - } else { - if (!nav.isActive) { - angular.forEach(ctrl.data.items, (element) => { - element.isActive = false; - }); + }; + ctrl.submit = async function () { + if (ctrl.validate()) { + ctrl.isBusy = true; + + var saveResult = await service.save(ctrl.mixDatabaseData); + if (saveResult.isSucceed) { + ctrl.mixDatabaseData = saveResult.data; + if (ctrl.saveSuccess) { + ctrl.saveSuccess({ data: ctrl.mixDatabaseData }); + } + ctrl.isBusy = false; + $rootScope.showMessage("success"); + $scope.$apply(); + } else { + ctrl.isBusy = false; + if (saveResult) { + $rootScope.showErrors(saveResult.errors); + } + $scope.$apply(); } - current.isActive = !nav.isActive; } }; - ctrl.saveSelected = function () { - ctrl.selected = $rootScope.filterArray( - ctrl.data, - ["isActived"], - [true] - ); - setTimeout(() => { - ctrl.save().then(() => { - ctrl.loadPosts(); - }); - }, 500); + ctrl.validate = function () { + var isValid = true; + ctrl.errors = []; + angular.forEach(ctrl.columns, function (column) { + if (column.regex) { + var regex = RegExp(column.regex, "g"); + isValid = regex.test(ctrl.mixDatabaseData.obj[column.name]); + if (!isValid) { + ctrl.errors.push(`${column.name} is not match Regex`); + } + } + if (!isValid) { + $rootScope.showErrors(ctrl.errors); + } + if (isValid && column.isEncrypt) { + ctrl.mixDatabaseData.obj[column.name] = $rootScope.encrypt( + ctrl.mixDatabaseData.obj[column.name] + ); + } + }); + return isValid; }; - ctrl.limString = function (str, max) { - if (str) { - return str.length > max ? str.substring(0, max) + " ..." : str; + ctrl.showContentFilter = function ($event) { + $rootScope.showContentFilter(ctrl.loadSelectedLink); + }; + ctrl.loadSelectedLink = function (data, type) { + if (data) { + ctrl.mixDatabaseData.obj.target_id = data.id; + ctrl.mixDatabaseData.obj.title = data.title; + ctrl.mixDatabaseData.obj.type = type; + ctrl.mixDatabaseData.obj.uri = data.detailsUrl; + } + }; + ctrl.filterData = function (attributeName) { + if (ctrl.mixDatabaseData) { + var attr = $rootScope.findObjectByKey( + ctrl.mixDatabaseData.obj, + "mixDatabaseColumnName", + attributeName + ); + if (!attr) { + attr = angular.copy( + $rootScope.findObjectByKey( + ctrl.defaultData.data, + "mixDatabaseColumnName", + attributeName + ) + ); + mixDatabaseColumn; + ctrl.mixDatabaseData.obj.push(attr); + } + return attr; } }; }, @@ -10148,203 +10566,152 @@ modules.component("mixDatabaseDataValues", { ], }); -modules.component("mixDatabaseForm", { +modules.component("mixDatabaseNavData", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-form/view.html", - bindings: { - mixDatabaseId: "=", - mixDatabaseName: "=", - columns: "=?", - mixDatabaseDataId: "=?", - mixDatabaseData: "=", - parentType: "=?", // attribute set = 1 | post = 2 | page = 3 | module = 4 - parentId: "=?", - defaultId: "=", - backUrl: "=?", - level: "=?", - hideAction: "=?", - saveSuccess: "&?", + "/mix-app/views/app-portal/components/mix-database-nav-data/view.html", + bindings: { + nav: "=", + parentId: "=", + parentType: "=", + onUpdate: "&?", + onDelete: "&?", }, controller: [ "$rootScope", "$scope", - "$location", - "$routeParams", + "ngAppSettings", + "RestRelatedAttributeDataPortalService", "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, $location, $routeParams, service) { + function ($rootScope, $scope, ngAppSettings, navService, dataService) { var ctrl = this; - ctrl.isBusy = false; - ctrl.attributes = []; - - ctrl.defaultData = null; - ctrl.selectedProp = null; + ctrl.data = null; + ctrl.selected = null; + ctrl.navRequest = angular.copy(ngAppSettings.request); + ctrl.setRequest = angular.copy(ngAppSettings.request); ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () { - ctrl.level = ctrl.level || 0; - await ctrl.loadData(); + ctrl.$onInit = function () { + navService + .getDefault([ctrl.parentId, ctrl.parentType, "default"]) + .then((resp) => { + ctrl.defaultData = resp.data; + ctrl.defaultData.parentId = ctrl.parentId; + ctrl.defaultData.parentType = ctrl.parentType; + ctrl.selected = angular.copy(ctrl.defaultData); + ctrl.loadData(); + }); + ctrl.navRequest.parentType = ctrl.parentType; + ctrl.navRequest.parentId = ctrl.parentId; }; - ctrl.loadData = async function () { - /* - If input is data id => load ctrl.mixDatabaseData from service and handle it independently - */ - ctrl.isBusy = true; - - if (ctrl.mixDatabaseDataId) { - var getData = await service.getSingle([ctrl.mixDatabaseDataId]); - ctrl.mixDatabaseData = getData.data; - if (ctrl.mixDatabaseData) { - ctrl.mixDatabaseData.parentId = ctrl.parentId; - ctrl.mixDatabaseData.parentType = ctrl.parentType; - ctrl.mixDatabaseId = ctrl.mixDatabaseData.mixDatabaseId; - ctrl.mixDatabaseName = ctrl.mixDatabaseData.mixDatabaseName; - ctrl.mixDatabaseTitle = $routeParams.mixDatabaseTitle; - ctrl.backUrl = `/portal/mix-database-data/list?mixDatabaseId=${ctrl.mixDatabaseData.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseData.mixDatabaseName}&mixDatabaseTitle=test`; - await ctrl.loadDefaultModel(); - ctrl.isBusy = false; + ctrl.selectPane = function (pane) {}; + ctrl.loadData = function () { + navService.getList(ctrl.navRequest).then((resp) => { + if (resp) { + ctrl.data = resp.data; $scope.$apply(); } else { - if (getData) { - $rootScope.showErrors(getData.errors); + if (resp) { + $rootScope.showErrors("Failed"); } - ctrl.isBusy = false; $scope.$apply(); } - } - if ((ctrl.mixDatabaseName || ctrl.mixDatabaseId) && !ctrl.defaultData) { - await ctrl.loadDefaultModel(); - ctrl.isBusy = false; - $scope.$apply(); - } - }; - ctrl.loadDefaultModel = async function () { - if ($routeParams.parentId) { - ctrl.parentId = $routeParams.parentId; - } - if ($routeParams.parentType) { - ctrl.parentType = $routeParams.parentType; - } - if (!ctrl.backUrl) { - if (ctrl.parentType) { - switch (ctrl.parentType) { - case "Post": - case "Page": - case "Module": - ctrl.backUrl = `/portal/${ctrl.parentType.toLowerCase()}/details/${ - ctrl.parentId - }`; - break; - - default: - ctrl.backUrl = `/portal/mix-database-data/details?dataId=${ctrl.parentId}&mixDatabaseId=${ctrl.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseName}&mixDatabaseTitle=${$routeParams.mixDatabaseTitle}`; - break; - } - } - } - var getDefault = await service.initData( - ctrl.mixDatabaseName || ctrl.mixDatabaseId - ); - ctrl.defaultData = getDefault.data; - if (ctrl.defaultData) { - ctrl.defaultData.mixDatabaseId = ctrl.mixDatabaseId || 0; - ctrl.defaultData.mixDatabaseName = ctrl.mixDatabaseName; - ctrl.defaultData.parentId = ctrl.parentId; - ctrl.defaultData.parentType = ctrl.parentType; - - ctrl.columns = ctrl.columns || ctrl.defaultData.columns; - } - - if (!ctrl.mixDatabaseData) { - ctrl.mixDatabaseData = angular.copy(ctrl.defaultData); - } - }; - - ctrl.reload = async function () { - ctrl.mixDatabaseData = angular.copy(ctrl.defaultData); + }); }; - ctrl.loadSelected = function () { - if (ctrl.selectedList.data.length) { - ctrl.mixDatabaseData = ctrl.selectedList.data[0]; - ctrl.mixDatabaseData.mixDatabaseId = ctrl.mixDatabaseId; - ctrl.mixDatabaseData.mixDatabaseName = ctrl.mixDatabaseName; - ctrl.mixDatabaseData.parentId = ctrl.parentId; - ctrl.mixDatabaseData.parentType = ctrl.parentType; - } + ctrl.updateData = function (nav) { + ctrl.selected = nav; + var e = $(".pane-form-" + ctrl.nav.data.id)[0]; + angular.element(e).triggerHandler("click"); + // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); }; - ctrl.submit = async function () { - if (ctrl.validate()) { - ctrl.isBusy = true; - - var saveResult = await service.save(ctrl.mixDatabaseData); - if (saveResult.isSucceed) { - ctrl.mixDatabaseData = saveResult.data; - if (ctrl.saveSuccess) { - ctrl.saveSuccess({ data: ctrl.mixDatabaseData }); - } - ctrl.isBusy = false; - $rootScope.showMessage("success"); - $scope.$apply(); + ctrl.saveData = function (data) { + $rootScope.isBusy = true; + ctrl.selected.data = data; + dataService.save(data).then((resp) => { + if (resp.isSucceed) { + ctrl.selected.dataId = resp.data.id; + ctrl.selected.mixDatabaseId = resp.data.mixDatabaseId; + ctrl.selected.mixDatabaseName = resp.data.mixDatabaseName; + ctrl.selected.attributeData = resp.data; + navService.save(ctrl.selected).then((resp) => { + if (resp.isSucceed) { + var tmp = $rootScope.findObjectByKey( + ctrl.data, + ["parentId", "parentType", "id"], + [resp.data.parentId, resp.data.parentType, resp.data.id] + ); + if (!tmp) { + ctrl.data.items.push(resp.data); + var e = $(".pane-data-" + ctrl.nav.data.id)[0]; + angular.element(e).triggerHandler("click"); + } + ctrl.selected = angular.copy(ctrl.defautData); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); } else { - ctrl.isBusy = false; - if (saveResult) { - $rootScope.showErrors(saveResult.errors); - } + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; $scope.$apply(); } - } - }; - ctrl.validate = function () { - var isValid = true; - ctrl.errors = []; - angular.forEach(ctrl.columns, function (column) { - if (column.regex) { - var regex = RegExp(column.regex, "g"); - isValid = regex.test(ctrl.mixDatabaseData.obj[column.name]); - if (!isValid) { - ctrl.errors.push(`${column.name} is not match Regex`); - } - } - if (!isValid) { - $rootScope.showErrors(ctrl.errors); - } - if (isValid && column.isEncrypt) { - ctrl.mixDatabaseData.obj[column.name] = $rootScope.encrypt( - ctrl.mixDatabaseData.obj[column.name] - ); - } }); - return isValid; }; - ctrl.showContentFilter = function ($event) { - $rootScope.showContentFilter(ctrl.loadSelectedLink); + ctrl.removeData = async function (nav) { + $rootScope.showConfirm( + ctrl, + "removeDataConfirmed", + [nav], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); }; - ctrl.loadSelectedLink = function (data, type) { - if (data) { - ctrl.mixDatabaseData.obj.target_id = data.id; - ctrl.mixDatabaseData.obj.title = data.title; - ctrl.mixDatabaseData.obj.type = type; - ctrl.mixDatabaseData.obj.uri = data.detailsUrl; + ctrl.removeDataConfirmed = async function (nav) { + $rootScope.isBusy = true; + var result = await navService.delete([nav.id]); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); } }; - ctrl.filterData = function (attributeName) { - if (ctrl.mixDatabaseData) { - var attr = $rootScope.findObjectByKey( - ctrl.mixDatabaseData.obj, - "mixDatabaseColumnName", - attributeName - ); - if (!attr) { - attr = angular.copy( - $rootScope.findObjectByKey( - ctrl.defaultData.data, - "mixDatabaseColumnName", - attributeName - ) - ); - mixDatabaseColumn; - ctrl.mixDatabaseData.obj.push(attr); - } - return attr; + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + ctrl.minPriority = ctrl.data[0].priority; + }; + ctrl.updateOrders = function (index) { + if (index > ctrl.dragStartIndex) { + ctrl.data.splice(ctrl.dragStartIndex, 1); + } else { + ctrl.data.splice(ctrl.dragStartIndex + 1, 1); } + var arrNavs = []; + angular.forEach(ctrl.data, function (e, i) { + e.priority = ctrl.minPriority + i; + var keys = { + parentId: e.parentId, + parentType: e.parentType, + id: e.id, + }; + var properties = { + priority: e.priority, + }; + arrNavs.push({ + keys: keys, + properties: properties, + }); + }); + navService.saveProperties("portal", arrNavs).then((resp) => { + $rootScope.isBusy = false; + $scope.$apply(); + }); }; }, ], @@ -10485,263 +10852,41 @@ modules.component("mixDatabaseNavValues", { if (!tmp) { ctrl.refData.push(resp.data); } - ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); - var e = $( - ".pane-data-" + ctrl.mixDatabaseDataValue.column.referenceId - )[0]; - angular.element(e).triggerHandler("click"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - }; - ctrl.removeData = async function (nav) { - $rootScope.showConfirm( - ctrl, - "removeDataConfirmed", - [nav], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - ctrl.removeDataConfirmed = async function (nav) { - $rootScope.isBusy = true; - var result = await navService.delete([nav.id]); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.data.items, "id", nav.id); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.view = function (item) { - var obj = { - columns: ctrl.columns, - item: item, - }; - $rootScope.preview("mix-database-data", obj, null, "modal-lg"); - }; - }, - ], -}); - -modules.component("mixDatabaseDataValueEditor", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html", - bindings: { - mixDatabaseDataValue: "=?", - parentType: "=?", - parentId: "=?", - isShowTitle: "=?", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "$location", - "RestRelatedMixDatabasePortalService", - "RestMixDatabaseDataPortalService", - function ( - $rootScope, - $scope, - ngAppSettings, - $location, - navService, - dataService - ) { - var ctrl = this; - ctrl.goToPath = $rootScope.goToPath; - ctrl.icons = ngAppSettings.icons; - ctrl.refData = null; - ctrl.defaultDataModel = null; - ctrl.refDataModel = { - id: null, - data: null, - }; - ctrl.refRequest = angular.copy(ngAppSettings.request); - ctrl.refRequest.pageSize = 100; - ctrl.dataTypes = $rootScope.globalSettings.dataTypes; - ctrl.previousId = null; - ctrl.$doCheck = function () { - if ( - ctrl.mixDatabaseDataValue && - ctrl.previousId !== ctrl.mixDatabaseDataValue.id - ) { - ctrl.previousId = ctrl.mixDatabaseDataValue.id; - ctrl.initData(); - } - }.bind(ctrl); - ctrl.$onInit = function () { - ctrl.initData(); - }; - ctrl.initData = async function () { - setTimeout(() => { - if (!ctrl.mixDatabaseDataValue.id) { - ctrl.initDefaultValue(); - } - switch (ctrl.mixDatabaseDataValue.dataType.toLowerCase()) { - case "datetime": - case "date": - case "time": - if (ctrl.mixDatabaseDataValue.dateTimeValue) { - ctrl.mixDatabaseDataValue.dateObj = new Date( - ctrl.mixDatabaseDataValue.dateTimeValue - ); - $scope.$apply(); - } - break; - case "reference": // reference - if ( - ctrl.mixDatabaseDataValue.column.referenceId && - ctrl.parentId - ) { - ctrl.mixDatabaseDataValue.integerValue = - ctrl.mixDatabaseDataValue.column.referenceId; - // navService.getSingle(["default"]).then((resp) => { - // ctrl.defaultDataModel = resp; - // ctrl.defaultDataModel.mixDatabaseId = - // ctrl.mixDatabaseDataValue.column.referenceId; - // ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); - // }); - // ctrl.loadRefData(); - } - break; - default: - if ( - ctrl.mixDatabaseDataValue.column && - ctrl.mixDatabaseDataValue.column.isEncrypt && - ctrl.mixDatabaseDataValue.encryptValue - ) { - var encryptedData = { - key: ctrl.mixDatabaseDataValue.encryptKey, - data: ctrl.mixDatabaseDataValue.encryptValue, - }; - ctrl.mixDatabaseDataValue.stringValue = $rootScope.decrypt( - encryptedData - ); - } - if ( - ctrl.mixDatabaseDataValue.column && - !ctrl.mixDatabaseDataValue.stringValue - ) { - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - $scope.$apply(); - } - break; - } - }, 200); - }; - ctrl.initDefaultValue = async function () { - switch (ctrl.mixDatabaseDataValue.dataType) { - case "datetime": - case "date": - case "time": - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.dateObj = new Date( - ctrl.mixDatabaseDataValue.column.defaultValue - ); - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - case "double": - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.doubleValue = parseFloat( - ctrl.mixDatabaseDataValue.column.defaultValue - ); - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - case "boolean": - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.booleanValue = - ctrl.mixDatabaseDataValue.column.defaultValue == "true"; - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - - default: - if (ctrl.mixDatabaseDataValue.column.defaultValue) { - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.column.defaultValue; - } - break; - } - }; - ctrl.updateStringValue = async function (dataType) { - switch (dataType.toLowerCase()) { - case "datetime": - case "date": - case "time": - if (ctrl.mixDatabaseDataValue.dateObj) { - ctrl.mixDatabaseDataValue.dateTimeValue = ctrl.mixDatabaseDataValue.dateObj.toISOString(); - ctrl.mixDatabaseDataValue.stringValue = - ctrl.mixDatabaseDataValue.dateTimeValue; - } - break; - case "double": - if (ctrl.mixDatabaseDataValue.doubleValue) { - ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.doubleValue.toString(); - } - break; - case "boolean": - if (ctrl.mixDatabaseDataValue.booleanValue != null) { - ctrl.mixDatabaseDataValue.stringValue = ctrl.mixDatabaseDataValue.booleanValue.toString(); - } - break; - - default: - break; - } - }; - - ctrl.updateRefData = function (nav) { - ctrl.goToPath(`/portal/mix-database-data/details?dataId=${nav.data.id} - &mixDatabaseId=${nav.data.mixDatabaseId} - &parentId=${ctrl.parentId} - &parentType=${ctrl.parentType}`); - // ctrl.refDataModel = nav; - // var e = $(".pane-form-" + ctrl.mixDatabaseDataValue.column.referenceId)[0]; - // angular.element(e).triggerHandler('click'); - // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); + ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); + var e = $( + ".pane-data-" + ctrl.mixDatabaseDataValue.column.referenceId + )[0]; + angular.element(e).triggerHandler("click"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); }; - - ctrl.removeRefData = async function (nav) { + ctrl.removeData = async function (nav) { $rootScope.showConfirm( ctrl, - "removeRefDataConfirmed", + "removeDataConfirmed", [nav], null, "Remove", "Deleted data will not able to recover, are you sure you want to delete this item?" ); }; - ctrl.removeRefDataConfirmed = async function (nav) { + ctrl.removeDataConfirmed = async function (nav) { $rootScope.isBusy = true; - var result = await navService.delete([ - nav.parentId, - nav.parentType, - nav.id, - ]); + var result = await navService.delete([nav.id]); if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.refData, "id", nav.id); + $rootScope.removeObjectByKey(ctrl.data.items, "id", nav.id); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -10750,6 +10895,13 @@ modules.component("mixDatabaseDataValueEditor", { $scope.$apply(); } }; + ctrl.view = function (item) { + var obj = { + columns: ctrl.columns, + item: item, + }; + $rootScope.preview("mix-database-data", obj, null, "modal-lg"); + }; }, ], }); @@ -10925,6 +11077,41 @@ modules.component("mixDatabaseNavs", { ], }); +modules.component("mixSelectIcons", { + templateUrl: + "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", + controller: [ + "$rootScope", + "$scope", + "$location", + "$element", + function ($rootScope, $scope, $location, $element) { + var ctrl = this; + ctrl.limitTo = 20; + ctrl.container = $element[0].querySelector(".list-icon"); + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + ctrl.showMore = () => { + if ( + ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && + ctrl.limitTo < ctrl.options.length + ) { + ctrl.limitTo *= 2; + } + }; + ctrl.select = function (ico) { + ctrl.data = ico.class; + }; + }, + ], + bindings: { + data: "=", + prefix: "=", + options: "=", + }, +}); + modules.component("mixFileUpload", { templateUrl: "/mix-app/views/app-portal/components/mix-file-upload/view.html", bindings: { @@ -11014,187 +11201,83 @@ modules.component("mixFileUpload", { ], }); -modules.component("mixSelectIcons", { - templateUrl: - "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", - controller: [ - "$rootScope", - "$scope", - "$location", - "$element", - function ($rootScope, $scope, $location, $element) { - var ctrl = this; - ctrl.limitTo = 20; - ctrl.container = $element[0].querySelector(".list-icon"); - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - ctrl.showMore = () => { - if ( - ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && - ctrl.limitTo < ctrl.options.length - ) { - ctrl.limitTo *= 2; - } - }; - ctrl.select = function (ico) { - ctrl.data = ico.class; - }; - }, - ], - bindings: { - data: "=", - prefix: "=", - options: "=", - }, -}); - -modules.component("mixDatabaseNavData", { +modules.component("mixTemplateEditor", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-nav-data/view.html", + "/mix-app/views/app-portal/components/mix-template-editor/view.html", bindings: { - nav: "=", - parentId: "=", - parentType: "=", - onUpdate: "&?", - onDelete: "&?", + template: "=", + folderType: "=", + isReadonly: "=?", + lineCount: "=?", + hideJs: "=?", + hideCss: "=?", }, controller: [ - "$rootScope", "$scope", + "$rootScope", + "$routeParams", "ngAppSettings", - "RestRelatedAttributeDataPortalService", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, ngAppSettings, navService, dataService) { + "GlobalSettingsService", + "TemplateService", + function ( + $scope, + $rootScope, + $routeParams, + ngAppSettings, + globalSettingsService, + service + ) { + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); var ctrl = this; - ctrl.data = null; - ctrl.selected = null; - ctrl.navRequest = angular.copy(ngAppSettings.request); - ctrl.setRequest = angular.copy(ngAppSettings.request); - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - navService - .getDefault([ctrl.parentId, ctrl.parentType, "default"]) - .then((resp) => { - ctrl.defaultData = resp.data; - ctrl.defaultData.parentId = ctrl.parentId; - ctrl.defaultData.parentType = ctrl.parentType; - ctrl.selected = angular.copy(ctrl.defaultData); - ctrl.loadData(); - }); - ctrl.navRequest.parentType = ctrl.parentType; - ctrl.navRequest.parentId = ctrl.parentId; - }; - ctrl.selectPane = function (pane) {}; - ctrl.loadData = function () { - navService.getList(ctrl.navRequest).then((resp) => { - if (resp) { - ctrl.data = resp.data; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors("Failed"); - } - $scope.$apply(); - } - }); - }; - ctrl.updateData = function (nav) { - ctrl.selected = nav; - var e = $(".pane-form-" + ctrl.nav.data.id)[0]; - angular.element(e).triggerHandler("click"); - // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); + ctrl.isNull = false; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.selectPane = function (pane) { + ctrl.activedPane = pane; }; - ctrl.saveData = function (data) { - $rootScope.isBusy = true; - ctrl.selected.data = data; - dataService.save(data).then((resp) => { - if (resp.isSucceed) { - ctrl.selected.dataId = resp.data.id; - ctrl.selected.mixDatabaseId = resp.data.mixDatabaseId; - ctrl.selected.mixDatabaseName = resp.data.mixDatabaseName; - ctrl.selected.attributeData = resp.data; - navService.save(ctrl.selected).then((resp) => { - if (resp.isSucceed) { - var tmp = $rootScope.findObjectByKey( - ctrl.data, - ["parentId", "parentType", "id"], - [resp.data.parentId, resp.data.parentType, resp.data.id] - ); - if (!tmp) { - ctrl.data.items.push(resp.data); - var e = $(".pane-data-" + ctrl.nav.data.id)[0]; - angular.element(e).triggerHandler("click"); - } - ctrl.selected = angular.copy(ctrl.defautData); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); + ctrl.selectTemplate = function (template) { + ctrl.template = template; + $scope.$broadcast("updateContentCodeEditors", []); }; - ctrl.removeData = async function (nav) { - $rootScope.showConfirm( - ctrl, - "removeDataConfirmed", - [nav], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); + ctrl.new = function () { + ctrl.template.id = 0; }; - ctrl.removeDataConfirmed = async function (nav) { - $rootScope.isBusy = true; - var result = await navService.delete([nav.id]); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); + ctrl.init = async function () { + if (ctrl.folderType) { + var themeId = $rootScope.localizeSettings.data.ThemeId; + ctrl.request.key = ctrl.folderType; + var resp = await service.getList(ctrl.request, [themeId]); + + if (resp && resp.isSucceed) { + ctrl.templates = resp.data.items; + if (!ctrl.template) { + ctrl.template = ctrl.templates[0]; + } + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + } } }; - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.data[0].priority; + ctrl.updateTemplateContent = function (content) { + ctrl.template.content = content; }; - ctrl.updateOrders = function (index) { - if (index > ctrl.dragStartIndex) { - ctrl.data.splice(ctrl.dragStartIndex, 1); - } else { - ctrl.data.splice(ctrl.dragStartIndex + 1, 1); - } - var arrNavs = []; - angular.forEach(ctrl.data, function (e, i) { - e.priority = ctrl.minPriority + i; - var keys = { - parentId: e.parentId, - parentType: e.parentType, - id: e.id, - }; - var properties = { - priority: e.priority, - }; - arrNavs.push({ - keys: keys, - properties: properties, - }); - }); - navService.saveProperties("portal", arrNavs).then((resp) => { - $rootScope.isBusy = false; - $scope.$apply(); - }); + ctrl.updateStyleContent = function (content) { + ctrl.template.scripts = content; + }; + ctrl.updateScriptContent = function (content) { + ctrl.template.styles = content; }; }, ], @@ -11321,83 +11404,229 @@ app.controller("MixNavigationController", [ }, ]); -modules.component("mixTemplateEditor", { +modules.component("modalBookmark", { templateUrl: - "/mix-app/views/app-portal/components/mix-template-editor/view.html", + "/mix-app/views/app-portal/components/modal-bookmark/modal-bookmark.html", + controller: [ + "$rootScope", + "$scope", + "localStorageService", + "$routeParams", + "$location", + function ( + $rootScope, + $scope, + localStorageService, + $routeParams, + $location + ) { + var ctrl = this; + ctrl.searchText = ""; + ctrl.defaultModel = { + url: "", + title: "", + }; + ctrl.bookmarks = []; + ctrl.model = null; + ctrl.$onInit = function () { + ctrl.model = angular.copy(ctrl.defaultModel); + ctrl.getCurrentUrl(); + ctrl.bookmarks = localStorageService.get("bookmarks") || []; + }; + ctrl.goToPath = function (url) { + $rootScope.goToPath(url); + $("#dlg-bookmark").modal("hide"); + }; + ctrl.getCurrentUrl = function (url) { + url = url || $location.url(); + ctrl.model.url = url; + ctrl.model.title = url; + }; + ctrl.removeBookmark = function (url) { + $rootScope.removeObjectByKey(ctrl.bookmarks, "url", url); + localStorageService.set("bookmarks", ctrl.bookmarks); + }; + ctrl.addBookmark = function () { + var current = $rootScope.findObjectByKey( + ctrl.bookmarks, + "url", + ctrl.model.url + ); + if (current) { + current.title = ctrl.model.title; + } else { + ctrl.bookmarks.push(ctrl.model); + } + localStorageService.set("bookmarks", ctrl.bookmarks); + ctrl.model = angular.copy(ctrl.defaultModel); + }; + }, + ], +}); + +modules.component("modalContentFilter", { + templateUrl: + "/mix-app/views/app-portal/components/modal-content-filter/modal-content-filter.html", bindings: { - template: "=", - folderType: "=", - isReadonly: "=?", - lineCount: "=?", - hideJs: "=?", - hideCss: "=?", + query: "=", + initData: "=?", + selected: "=", + callback: "&?", + save: "&?", }, controller: [ - "$scope", "$rootScope", - "$routeParams", + "$scope", "ngAppSettings", - "GlobalSettingsService", - "TemplateService", + "PostRestService", + "PageRestService", + "ModuleRestService", function ( - $scope, $rootScope, - $routeParams, + $scope, ngAppSettings, - globalSettingsService, - service + postService, + pageService, + moduleService ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); var ctrl = this; - ctrl.isNull = false; ctrl.request = angular.copy(ngAppSettings.request); - ctrl.selectPane = function (pane) { - ctrl.activedPane = pane; + ctrl.types = ["Page", "Post", "Module"]; + ctrl.moduleId = null; + ctrl.type = "Page"; + ctrl.navs = []; + ctrl.data = { + items: [], }; - ctrl.selectTemplate = function (template) { - ctrl.template = template; - $scope.$broadcast("updateContentCodeEditors", []); + // ctrl.goToPath = $rootScope.goToPath; + ctrl.$onInit = function () { + $("#modal-content-filter").on("shown.bs.modal", function () { + if (ctrl.initData) { + ctrl.data = ctrl.initData; + } else { + if (!ctrl.data.items.length) { + ctrl.loadData(); + } + } + }); }; - ctrl.new = function () { - ctrl.template.id = 0; + ctrl.closeDialog = function () { + $("#modal-content-filter").modal("hide"); + }; + ctrl.loadData = async function (pageIndex) { + ctrl.request.query = ctrl.query + ctrl.srcId; + ctrl.navs = []; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var d = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = d.toISOString(); + } + if (ctrl.request.toDate !== null) { + var d = new Date(ctrl.request.toDate); + ctrl.request.toDate = d.toISOString(); + } + + switch (ctrl.type) { + case "Page": + ctrl.loadPages(); + break; + case "Post": + ctrl.loadPosts(); + break; + case "Module": + ctrl.loadModules(); + break; + } + }; + ctrl.edit = function (nav) { + switch (ctrl.type) { + case "Page": + ctrl.goToPath(`/portal/page/details/${nav.id}`); + break; + case "Post": + ctrl.goToPath(`/portal/post/details/${nav.id}`); + break; + case "Module": + ctrl.goToPath(`/portal/module/details/${nav.id}`); + break; + } + }; + ctrl.loadModules = async function () { + $rootScope.isBusy = true; + var response = await moduleService.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + ctrl.loadPosts = async function () { + $rootScope.isBusy = true; + var response = await postService.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + ctrl.loadPages = async function () { + $rootScope.isBusy = true; + var response = await pageService.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } }; - ctrl.init = async function () { - if (ctrl.folderType) { - var themeId = $rootScope.localizeSettings.data.ThemeId; - ctrl.request.key = ctrl.folderType; - var resp = await service.getList(ctrl.request, [themeId]); - - if (resp && resp.isSucceed) { - ctrl.templates = resp.data.items; - if (!ctrl.template) { - ctrl.template = ctrl.templates[0]; - } - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } + ctrl.select = function (nav) { + var current = $rootScope.findObjectByKey(ctrl.data.items, "id", nav.id); + if (!nav.isActive && ctrl.callback) { + ctrl.callback({ + nav: nav, + type: ctrl.type, + }); + } + if (ctrl.isMultiple) { + current.isActive = !current.isActive; + } else { + if (!nav.isActive) { + angular.forEach(ctrl.data.items, (element) => { + element.isActive = false; + }); } + current.isActive = !nav.isActive; } }; - ctrl.updateTemplateContent = function (content) { - ctrl.template.content = content; - }; - ctrl.updateStyleContent = function (content) { - ctrl.template.scripts = content; + ctrl.saveSelected = function () { + ctrl.selected = $rootScope.filterArray( + ctrl.data, + ["isActived"], + [true] + ); + setTimeout(() => { + ctrl.save().then(() => { + ctrl.loadPosts(); + }); + }, 500); }; - ctrl.updateScriptContent = function (content) { - ctrl.template.styles = content; + ctrl.limString = function (str, max) { + if (str) { + return str.length > max ? str.substring(0, max) + " ..." : str; + } }; }, ], @@ -11538,61 +11767,199 @@ modules.component("mixValueEditor", { ], }); -modules.component("modalBookmark", { - templateUrl: - "/mix-app/views/app-portal/components/modal-bookmark/modal-bookmark.html", +modules.component("modalNavDatas", { + templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", + bindings: { + mixDatabaseId: "=?", + mixDatabaseName: "=?", + parentId: "=?", + parentType: "=?", + type: "=?", + columnDisplay: "=?", + selectedList: "=?", + selectCallback: "&", + save: "&", + }, controller: [ "$rootScope", "$scope", - "localStorageService", - "$routeParams", - "$location", - function ( - $rootScope, - $scope, - localStorageService, - $routeParams, - $location - ) { + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestRelatedMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, service, navService) { var ctrl = this; - ctrl.searchText = ""; - ctrl.defaultModel = { - url: "", - title: "", - }; - ctrl.bookmarks = []; - ctrl.model = null; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.request.key = "readData"; + ctrl.navs = []; + + ctrl.queries = {}; + ctrl.data = { items: [] }; ctrl.$onInit = function () { - ctrl.model = angular.copy(ctrl.defaultModel); - ctrl.getCurrentUrl(); - ctrl.bookmarks = localStorageService.get("bookmarks") || []; - }; - ctrl.goToPath = function (url) { - $rootScope.goToPath(url); - $("#dlg-bookmark").modal("hide"); - }; - ctrl.getCurrentUrl = function (url) { - url = url || $location.url(); - ctrl.model.url = url; - ctrl.model.title = url; + if (!ctrl.selectedList) { + ctrl.selectedList = []; + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } }; - ctrl.removeBookmark = function (url) { - $rootScope.removeObjectByKey(ctrl.bookmarks, "url", url); - localStorageService.set("bookmarks", ctrl.bookmarks); + ctrl.loadData = async function (pageIndex) { + ctrl.request.query = ""; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var d = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = d.toISOString(); + } + if (ctrl.request.toDate !== null) { + var d = new Date(ctrl.request.toDate); + ctrl.request.toDate = d.toISOString(); + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } + Object.keys(ctrl.queries).forEach((e) => { + if (ctrl.queries[e]) { + ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; + } + }); + var response = await service.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + ctrl.navs = []; + angular.forEach(response.data.items, function (e) { + e.disabled = + $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; + // var item = { + // priority: e.priority, + // description: e.data.title, + // postId: e.id, + // image: e.thumbnailUrl, + // specificulture: e.specificulture, + // status: 'Published', + // isActived: false + // }; + // item[ctrl.srcField] = ctrl.srcId; + // ctrl.navs.push(item); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } }; - ctrl.addBookmark = function () { - var current = $rootScope.findObjectByKey( - ctrl.bookmarks, - "url", - ctrl.model.url - ); - if (current) { - current.title = ctrl.model.title; + ctrl.select = function (value, isSelected) { + if (isSelected) { + if (ctrl.parentId) { + var nav = { + mixDatabaseName: ctrl.mixDatabaseName, + parentId: ctrl.parentId, + parentType: ctrl.parentType, + id: value, + }; + navService.save(nav).then((resp) => { + if (resp.isSucceed) { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + } } else { - ctrl.bookmarks.push(ctrl.model); + if (ctrl.parentId) { + navService + .delete([ctrl.parentId, ctrl.parentType, data.id]) + .then((resp) => { + if (resp.isSucceed) { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); + } } - localStorageService.set("bookmarks", ctrl.bookmarks); - ctrl.model = angular.copy(ctrl.defaultModel); + if (ctrl.selectCallback) { + ctrl.selectCallback({ data: data }); + } + }; + ctrl.createData = function () { + var data = { + title: ctrl.newTitle, + slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), + type: ctrl.type, + }; + service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { + if (resp.isSucceed) { + ctrl.data.items.push(resp.data); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); }; }, ], @@ -11622,174 +11989,6 @@ app.component("modalCroppie", { }, }); -modules.component("modalContentFilter", { - templateUrl: - "/mix-app/views/app-portal/components/modal-content-filter/modal-content-filter.html", - bindings: { - query: "=", - initData: "=?", - selected: "=", - callback: "&?", - save: "&?", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "PostRestService", - "PageRestService", - "ModuleRestService", - function ( - $rootScope, - $scope, - ngAppSettings, - postService, - pageService, - moduleService - ) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.types = ["Page", "Post", "Module"]; - ctrl.moduleId = null; - ctrl.type = "Page"; - ctrl.navs = []; - ctrl.data = { - items: [], - }; - // ctrl.goToPath = $rootScope.goToPath; - ctrl.$onInit = function () { - $("#modal-content-filter").on("shown.bs.modal", function () { - if (ctrl.initData) { - ctrl.data = ctrl.initData; - } else { - if (!ctrl.data.items.length) { - ctrl.loadData(); - } - } - }); - }; - ctrl.closeDialog = function () { - $("#modal-content-filter").modal("hide"); - }; - ctrl.loadData = async function (pageIndex) { - ctrl.request.query = ctrl.query + ctrl.srcId; - ctrl.navs = []; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var d = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = d.toISOString(); - } - if (ctrl.request.toDate !== null) { - var d = new Date(ctrl.request.toDate); - ctrl.request.toDate = d.toISOString(); - } - - switch (ctrl.type) { - case "Page": - ctrl.loadPages(); - break; - case "Post": - ctrl.loadPosts(); - break; - case "Module": - ctrl.loadModules(); - break; - } - }; - ctrl.edit = function (nav) { - switch (ctrl.type) { - case "Page": - ctrl.goToPath(`/portal/page/details/${nav.id}`); - break; - case "Post": - ctrl.goToPath(`/portal/post/details/${nav.id}`); - break; - case "Module": - ctrl.goToPath(`/portal/module/details/${nav.id}`); - break; - } - }; - ctrl.loadModules = async function () { - $rootScope.isBusy = true; - var response = await moduleService.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.loadPosts = async function () { - $rootScope.isBusy = true; - var response = await postService.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.loadPages = async function () { - $rootScope.isBusy = true; - var response = await pageService.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.select = function (nav) { - var current = $rootScope.findObjectByKey(ctrl.data.items, "id", nav.id); - if (!nav.isActive && ctrl.callback) { - ctrl.callback({ - nav: nav, - type: ctrl.type, - }); - } - if (ctrl.isMultiple) { - current.isActive = !current.isActive; - } else { - if (!nav.isActive) { - angular.forEach(ctrl.data.items, (element) => { - element.isActive = false; - }); - } - current.isActive = !nav.isActive; - } - }; - ctrl.saveSelected = function () { - ctrl.selected = $rootScope.filterArray( - ctrl.data, - ["isActived"], - [true] - ); - setTimeout(() => { - ctrl.save().then(() => { - ctrl.loadPosts(); - }); - }, 500); - }; - ctrl.limString = function (str, max) { - if (str) { - return str.length > max ? str.substring(0, max) + " ..." : str; - } - }; - }, - ], -}); - modules.component("modalHelper", { templateUrl: "/mix-app/views/app-portal/components/modal-helper/modal-helper.html", @@ -11925,46 +12124,29 @@ modules.component("modalHelper", { ], }); -modules.component("modalNavDatas", { - templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", +modules.component("modalNavPosts", { + templateUrl: + "/mix-app/views/app-portal/components/modal-nav-posts/modal-nav-posts.html", bindings: { - mixDatabaseId: "=?", - mixDatabaseName: "=?", - parentId: "=?", - parentType: "=?", - type: "=?", - columnDisplay: "=?", - selectedList: "=?", - selectCallback: "&", + srcColumn: "=", + srcId: "=", + query: "=", + selected: "=", save: "&", }, controller: [ "$rootScope", "$scope", + "$routeParams", "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestRelatedMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, service, navService) { + "PostRestService", + function ($rootScope, $scope, $routeParams, ngAppSettings, postService) { var ctrl = this; ctrl.request = angular.copy(ngAppSettings.request); - ctrl.request.key = "readData"; ctrl.navs = []; - - ctrl.queries = {}; ctrl.data = { items: [] }; - ctrl.$onInit = function () { - if (!ctrl.selectedList) { - ctrl.selectedList = []; - } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - }; - ctrl.loadData = async function (pageIndex) { - ctrl.request.query = ""; + ctrl.loadPosts = async function (pageIndex) { + // ctrl.request.query = ctrl.query + ctrl.srcId; if (pageIndex !== undefined) { ctrl.request.pageIndex = pageIndex; } @@ -11976,35 +12158,28 @@ modules.component("modalNavDatas", { var d = new Date(ctrl.request.toDate); ctrl.request.toDate = d.toISOString(); } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - Object.keys(ctrl.queries).forEach((e) => { - if (ctrl.queries[e]) { - ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; - } - }); - var response = await service.getList(ctrl.request); + if ($routeParams.type) { + ctrl.request.postType = $routeParams.type; + } else { + ctrl.request.postType = ""; + } + var response = await postService.getList(ctrl.request); if (response.isSucceed) { ctrl.data = response.data; ctrl.navs = []; angular.forEach(response.data.items, function (e) { - e.disabled = - $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; - // var item = { - // priority: e.priority, - // description: e.data.title, - // postId: e.id, - // image: e.thumbnailUrl, - // specificulture: e.specificulture, - // status: 'Published', - // isActived: false - // }; - // item[ctrl.srcField] = ctrl.srcId; - // ctrl.navs.push(item); + var item = { + priority: e.priority, + description: e.title, + postId: e.id, + image: e.thumbnailUrl, + specificulture: e.specificulture, + post: e, + status: "Published", + isActived: false, + }; + item[ctrl.srcColumn] = ctrl.srcId; + ctrl.navs.push(item); }); $rootScope.isBusy = false; $scope.$apply(); @@ -12014,110 +12189,17 @@ modules.component("modalNavDatas", { $scope.$apply(); } }; - ctrl.select = function (value, isSelected) { - if (isSelected) { - if (ctrl.parentId) { - var nav = { - mixDatabaseName: ctrl.mixDatabaseName, - parentId: ctrl.parentId, - parentType: ctrl.parentType, - id: value, - }; - navService.save(nav).then((resp) => { - if (resp.isSucceed) { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - } - } else { - if (ctrl.parentId) { - navService - .delete([ctrl.parentId, ctrl.parentType, data.id]) - .then((resp) => { - if (resp.isSucceed) { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); - } - } - if (ctrl.selectCallback) { - ctrl.selectCallback({ data: data }); - } - }; - ctrl.createData = function () { - var data = { - title: ctrl.newTitle, - slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), - type: ctrl.type, - }; - service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { - if (resp.isSucceed) { - ctrl.data.items.push(resp.data); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); + ctrl.saveSelected = function () { + ctrl.selected = $rootScope.filterArray( + ctrl.navs, + ["isActived"], + [true] + ); + setTimeout(() => { + ctrl.save().then(() => { + ctrl.loadPosts(); + }); + }, 500); }; }, ], @@ -12464,6 +12546,15 @@ modules.component("modalNavPages", { ], }); +modules.component("modalPermission", { + templateUrl: + "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", + controller: "PermissionController", + bindings: { + message: "=", + }, +}); + modules.component("modalNavs", { templateUrl: "/mix-app/views/app-portal/components/modal-navs/view.html", bindings: { @@ -12551,144 +12642,54 @@ modules.component("modalNavs", { // ctrl.data = response.data; // ctrl.navs = []; // angular.forEach(response.data.items, function (e) { - // var item = { - // priority: e.priority, - // description: e.title, - // pageId: e.id, - // image: e.thumbnailUrl, - // specificulture: e.specificulture, - // status: 'Published', - // isActived: false - // }; - // item[ctrl.srcField] = ctrl.srcId; - // ctrl.navs.push(item); - // }); - // $rootScope.isBusy = false; - // $scope.$apply(); - // } - // else { - // $rootScope.showErrors(response.errors); - // $rootScope.isBusy = false; - // $scope.$apply(); - // } - // } - ctrl.selectAll = function (isSelectAll) { - angular.forEach(ctrl.data.items, (element) => { - element.isActived = isSelectAll; - }); - }; - ctrl.selectChange = function (item) { - if (ctrl.isSingle == "true" && item.isActived) { - angular.forEach(ctrl.data.items, (element) => { - element.isActived = false; - }); - item.isActived = true; - } - }; - ctrl.saveSelected = function () { - ctrl.selected = $rootScope.filterArray( - ctrl.data.items, - ["isActived"], - [true] - ); - if (ctrl.save) { - ctrl.save({ selected: ctrl.selected }); - } - }; - }, - ], -}); - -modules.component("modalNavPosts", { - templateUrl: - "/mix-app/views/app-portal/components/modal-nav-posts/modal-nav-posts.html", - bindings: { - srcColumn: "=", - srcId: "=", - query: "=", - selected: "=", - save: "&", - }, - controller: [ - "$rootScope", - "$scope", - "$routeParams", - "ngAppSettings", - "PostRestService", - function ($rootScope, $scope, $routeParams, ngAppSettings, postService) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.navs = []; - ctrl.data = { items: [] }; - ctrl.loadPosts = async function (pageIndex) { - // ctrl.request.query = ctrl.query + ctrl.srcId; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var d = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = d.toISOString(); - } - if (ctrl.request.toDate !== null) { - var d = new Date(ctrl.request.toDate); - ctrl.request.toDate = d.toISOString(); - } - if ($routeParams.type) { - ctrl.request.postType = $routeParams.type; - } else { - ctrl.request.postType = ""; - } - var response = await postService.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - ctrl.navs = []; - angular.forEach(response.data.items, function (e) { - var item = { - priority: e.priority, - description: e.title, - postId: e.id, - image: e.thumbnailUrl, - specificulture: e.specificulture, - post: e, - status: "Published", - isActived: false, - }; - item[ctrl.srcColumn] = ctrl.srcId; - ctrl.navs.push(item); + // var item = { + // priority: e.priority, + // description: e.title, + // pageId: e.id, + // image: e.thumbnailUrl, + // specificulture: e.specificulture, + // status: 'Published', + // isActived: false + // }; + // item[ctrl.srcField] = ctrl.srcId; + // ctrl.navs.push(item); + // }); + // $rootScope.isBusy = false; + // $scope.$apply(); + // } + // else { + // $rootScope.showErrors(response.errors); + // $rootScope.isBusy = false; + // $scope.$apply(); + // } + // } + ctrl.selectAll = function (isSelectAll) { + angular.forEach(ctrl.data.items, (element) => { + element.isActived = isSelectAll; + }); + }; + ctrl.selectChange = function (item) { + if (ctrl.isSingle == "true" && item.isActived) { + angular.forEach(ctrl.data.items, (element) => { + element.isActived = false; }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); + item.isActived = true; } }; ctrl.saveSelected = function () { ctrl.selected = $rootScope.filterArray( - ctrl.navs, + ctrl.data.items, ["isActived"], [true] ); - setTimeout(() => { - ctrl.save().then(() => { - ctrl.loadPosts(); - }); - }, 500); + if (ctrl.save) { + ctrl.save({ selected: ctrl.selected }); + } }; }, ], }); -modules.component("modalPermission", { - templateUrl: - "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", - controller: "PermissionController", - bindings: { - message: "=", - }, -}); - modules.component("modalTemplate", { templateUrl: "/mix-app/views/app-portal/components/modal-template/view.html", controller: [ @@ -12731,6 +12732,66 @@ modules.component("modalTemplate", { ], }); +modules.component("navs", { + templateUrl: + "/mix-app/views/app-portal/components/navigations/navigations.html", + bindings: { + prefix: "=", + detailsUrl: "=", + key: "=", + data: "=", + titleField: "=?", + titleMaxLength: "=?", + callback: "&", + }, + controller: [ + "$scope", + "$location", + function ($scope, $location) { + var ctrl = this; + ctrl.selected = null; + ctrl.activedIndex = null; + ctrl.getTitle = (item) => { + if (ctrl.titleField) { + let t = item; + angular.forEach(ctrl.titleField.split("."), (e) => { + t = t[e]; + }); + return ctrl.limString(t, ctrl.titleMaxLength || 30); + } else { + return ctrl.limString(item.description, ctrl.titleMaxLength || 30); + } + }; + ctrl.updateOrders = function (index) { + ctrl.data.splice(index, 1); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.data[i].priority = i + 1; + } + }; + ctrl.dropCallback = function (index, item, external, type) { + ctrl.logListEvent("dropped at", index, external, type); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.data[i].priority = i + 1; + } + // Return false here to cancel drop. Return true if you insert the item yourself. + return item; + }; + ctrl.logListEvent = function (action, index, external, type) { + var message = external ? "External " : ""; + message += type + " element was " + action + " position " + index; + }; + ctrl.goToDetails = async function (nav) { + $location.url(ctrl.detailsUrl + nav[ctrl.key]); + }; + ctrl.limString = function (str, max) { + if (str) { + return str.length > max ? str.substring(0, max) + " ..." : str; + } + }; + }, + ], +}); + modules.component("monacoEditor", { templateUrl: "/mix-app/views/app-portal/components/monaco-editor/view.html", bindings: { @@ -12920,66 +12981,6 @@ modules.component("monacoEditor", { ], }); -modules.component("navs", { - templateUrl: - "/mix-app/views/app-portal/components/navigations/navigations.html", - bindings: { - prefix: "=", - detailsUrl: "=", - key: "=", - data: "=", - titleField: "=?", - titleMaxLength: "=?", - callback: "&", - }, - controller: [ - "$scope", - "$location", - function ($scope, $location) { - var ctrl = this; - ctrl.selected = null; - ctrl.activedIndex = null; - ctrl.getTitle = (item) => { - if (ctrl.titleField) { - let t = item; - angular.forEach(ctrl.titleField.split("."), (e) => { - t = t[e]; - }); - return ctrl.limString(t, ctrl.titleMaxLength || 30); - } else { - return ctrl.limString(item.description, ctrl.titleMaxLength || 30); - } - }; - ctrl.updateOrders = function (index) { - ctrl.data.splice(index, 1); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.data[i].priority = i + 1; - } - }; - ctrl.dropCallback = function (index, item, external, type) { - ctrl.logListEvent("dropped at", index, external, type); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.data[i].priority = i + 1; - } - // Return false here to cancel drop. Return true if you insert the item yourself. - return item; - }; - ctrl.logListEvent = function (action, index, external, type) { - var message = external ? "External " : ""; - message += type + " element was " + action + " position " + index; - }; - ctrl.goToDetails = async function (nav) { - $location.url(ctrl.detailsUrl + nav[ctrl.key]); - }; - ctrl.limString = function (str, max) { - if (str) { - return str.length > max ? str.substring(0, max) + " ..." : str; - } - }; - }, - ], -}); - modules.component("propertiesStructure", { templateUrl: "/mix-app/views/app-portal/components/properties-structure/view.html", @@ -13110,46 +13111,6 @@ modules.component("propertiesStructure", { }, }); -modules.component("portalThemeSettings", { - templateUrl: - "/mix-app/views/app-portal/components/portal-theme-settings/view.html", - bindings: { - showLink: "=", - }, - controller: [ - "$rootScope", - "$scope", - "AppSettingsServices", - function ($rootScope, $scope, appSettingsServices) { - var ctrl = this; - this.$onInit = function () { - ctrl.portalThemeSettings = - $rootScope.globalSettings.portalThemeSettings; - }; - ctrl.applyThemeSettings = function () { - $rootScope.globalSettings.portalThemeSettings = - ctrl.portalThemeSettings; - }; - ctrl.saveThemeSettings = async function () { - var resp = await appSettingsServices.saveGlobalSettings( - "PortalThemeSettings", - ctrl.portalThemeSettings - ); - if (resp && resp.isSucceed) { - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - }, - ], -}); - modules.component("propertiesValue", { templateUrl: "/mix-app/views/app-portal/components/properties-value/view.html", @@ -13440,6 +13401,46 @@ modules.component("serviceHubPortal", { ], }); +modules.component("portalThemeSettings", { + templateUrl: + "/mix-app/views/app-portal/components/portal-theme-settings/view.html", + bindings: { + showLink: "=", + }, + controller: [ + "$rootScope", + "$scope", + "AppSettingsServices", + function ($rootScope, $scope, appSettingsServices) { + var ctrl = this; + this.$onInit = function () { + ctrl.portalThemeSettings = + $rootScope.globalSettings.portalThemeSettings; + }; + ctrl.applyThemeSettings = function () { + $rootScope.globalSettings.portalThemeSettings = + ctrl.portalThemeSettings; + }; + ctrl.saveThemeSettings = async function () { + var resp = await appSettingsServices.saveGlobalSettings( + "PortalThemeSettings", + ctrl.portalThemeSettings + ); + if (resp && resp.isSucceed) { + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $scope.$apply(); + } + }; + }, + ], +}); + modules.component("templateEditor", { templateUrl: "/mix-app/views/app-portal/components/template-editor/templateEditor.html", diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js index 177e1b13b..0dafe723d 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js @@ -2846,42 +2846,42 @@ appShared.factory("TranslatorService", [ ]); "use strict"; -appShared.factory("RestMixDatabaseColumnPortalService", [ +appShared.factory("RestMixDatabasePortalService", [ "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { + function (baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database-column/portal", true); - var _initData = async function (mixDatabaseName) { - var url = this.prefixUrl + "/init/" + mixDatabaseName; + serviceFactory.init("mix-database/portal"); + var _migrate = async function (data) { + var url = `${this.prefixUrl}/migrate/${data.id}`; var req = { - method: "GET", + method: "POST", url: url, + data: JSON.stringify(data), }; - return await apiService.getRestApiResult(req); + return await this.getRestApiResult(req); }; - serviceFactory.initData = _initData; + serviceFactory.migrate = _migrate; return serviceFactory; }, ]); "use strict"; -appShared.factory("RestMixDatabasePortalService", [ +appShared.factory("RestMixDatabaseColumnPortalService", [ "BaseRestService", - function (baseService) { + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database/portal"); - var _migrate = async function (data) { - var url = `${this.prefixUrl}/migrate/${data.id}`; + serviceFactory.init("mix-database-column/portal", true); + var _initData = async function (mixDatabaseName) { + var url = this.prefixUrl + "/init/" + mixDatabaseName; var req = { - method: "POST", + method: "GET", url: url, - data: JSON.stringify(data), }; - return await this.getRestApiResult(req); + return await apiService.getRestApiResult(req); }; - serviceFactory.migrate = _migrate; + serviceFactory.initData = _initData; return serviceFactory; }, ]); @@ -3014,16 +3014,6 @@ appShared.factory("RestMixDatabaseDataPortalService", [ }, ]); -"use strict"; -appShared.factory("RestMixDatabaseDataValuePortalService", [ - "BaseRestService", - function (baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database-data-value/portal"); - return serviceFactory; - }, -]); - "use strict"; appShared.factory("RestMvcModuleDataService", [ "BaseRestService", @@ -3043,6 +3033,16 @@ appShared.factory("RestMvcModuleDataService", [ }, ]); +"use strict"; +appShared.factory("RestMixDatabaseDataValuePortalService", [ + "BaseRestService", + function (baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("mix-database-data-value/portal"); + return serviceFactory; + }, +]); + "use strict"; appShared.factory("RestMvcPostService", [ "BaseRestService", @@ -4734,63 +4734,6 @@ sharedComponents.component("cultures", { }, }); -sharedComponents.component("swDataPreview", { - templateUrl: - "/mix-app/views/app-shared/components/data-preview/data-preview.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], - bindings: { - type: "=", - value: "=", - }, -}); - -"use trick"; -sharedComponents.directive("pane", function () { - return { - require: "^tabs", - restrict: "E", - transclude: true, - scope: { title: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabs", function () { - return { - restrict: "E", - transclude: true, - scope: {}, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/templates/tabs.html", - replace: true, - }; -}); - //sharedComponents.controller('ImageController', ); sharedComponents.component("customFile", { templateUrl: @@ -4921,35 +4864,61 @@ sharedComponents.component("customFile", { ], }); -sharedComponents.component("goToTop", { - templateUrl: "/mix-app/views/app-shared/components/go-to-top/view.html", +sharedComponents.component("swDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/data-preview/data-preview.html", controller: [ "$rootScope", - "$scope", - function ($rootScope, $scope) { + function ($rootScope) { var ctrl = this; - ctrl.$onInit = function () { - $(window).scroll(function () { - if ($(window).scrollTop() >= 50) { - // If page is scrolled more than 50px - $("#return-to-top").fadeIn(200); // Fade in the arrow - } else { - $("#return-to-top").fadeOut(200); // Else fade out the arrow - } + }, + ], + bindings: { + type: "=", + value: "=", + }, +}); + +"use trick"; +sharedComponents.directive("pane", function () { + return { + require: "^tabs", + restrict: "E", + transclude: true, + scope: { title: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabs", function () { + return { + restrict: "E", + transclude: true, + scope: {}, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; }); + pane.selected = true; }; - ctrl.goToTop = function () { - // ===== Scroll to Top ==== - $("body,html").animate( - { - scrollTop: 0, // Scroll to top of body - }, - 500 - ); + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); }; }, - ], - bindings: {}, + templateUrl: "/mix-app/views/app-shared/components/templates/tabs.html", + replace: true, + }; }); sharedComponents.component("fbLogin", { @@ -5030,56 +4999,35 @@ sharedComponents.component("fbLogin", { ], }); -sharedComponents.component("limitString", { - templateUrl: - "/mix-app/views/app-shared/components/limit-string/limit-string.html", +sharedComponents.component("goToTop", { + templateUrl: "/mix-app/views/app-shared/components/go-to-top/view.html", controller: [ "$rootScope", "$scope", - "ngAppSettings", - function ($rootScope, $scope, ngAppSettings) { + function ($rootScope, $scope) { var ctrl = this; - ctrl.shortenString = ""; - ctrl.previousContentId = undefined; - - this.$onInit = () => { - ctrl.previousContentId = angular.copy(ctrl.contentId); - }; - - this.$doCheck = () => { - if (ctrl.contentId !== ctrl.previousContentId) { - ctrl.loadModuleData(); - ctrl.previousContentId = ctrl.contentId; - } - }; - ctrl.shortString = function () { - var data = decodeURIComponent(ctrl.content); - if (data) { - if (ctrl.max < data.length) { - ctrl.shortenString = - data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; + ctrl.$onInit = function () { + $(window).scroll(function () { + if ($(window).scrollTop() >= 50) { + // If page is scrolled more than 50px + $("#return-to-top").fadeIn(200); // Fade in the arrow } else { - ctrl.shortenString = data.replace(/[+]/g, " "); + $("#return-to-top").fadeOut(200); // Else fade out the arrow } - } + }); }; - ctrl.view = function () { - var obj = { - moduleId: ctrl.moduleId, - id: ctrl.contentId, - }; - $rootScope.preview("module-data", obj, null, "modal-lg"); + ctrl.goToTop = function () { + // ===== Scroll to Top ==== + $("body,html").animate( + { + scrollTop: 0, // Scroll to top of body + }, + 500 + ); }; - ctrl.translate = $rootScope.translate; }, ], - bindings: { - content: "=", - showData: "=", - max: "=", - moduleId: "=", - contentId: "=", - }, + bindings: {}, }); sharedComponents.component("googlePay", { @@ -5233,66 +5181,6 @@ sharedComponents.component("googlePay", { ], }); -(function (angular) { - appShared.component("languageSwitcher", { - templateUrl: - "/mix-app/views/app-shared/components/language-switcher/language-switcher.html", - controller: [ - "$rootScope", - "$scope", - "$location", - "ApiService", - "CommonService", - "TranslatorService", - "GlobalSettingsService", - function ( - $rootScope, - $scope, - $location, - apiService, - commonService, - translatorService, - globalSettingsService - ) { - var ctrl = this; - ctrl.localizeSettings = {}; - this.$onInit = function () { - ctrl.localizeSettings = $rootScope.localizeSettings; - if ($rootScope.globalSettings) { - ctrl.localizeSettings.cultures = $rootScope.globalSettings.cultures; - } - }; - - ctrl.changeLang = async function (lang, langIcon) { - ctrl.localizeSettings.lang = lang; - ctrl.localizeSettings.langIcon = langIcon; - // await commonService.removeSettings(); - // await commonService.removeTranslator(); - // commonService.fillSettings(lang).then(function () { - // translatorService.reset(lang).then(function () { - commonService.fillAllSettings(lang).then(function (response) { - translatorService.translateUrl(lang).then(function (url) { - window.top.location = url; - }); - }); - // }); - // }); - }; - ctrl.logOut = function () { - $rootScope.logOut(); - }; - }, - ], - bindings: { - //settings: '=', - ulStyle: "=", - liStyle: "=", - aStyle: "=", - activeClass: "=", - }, - }); -})(window.angular); - appShared.component("loginPopup", { templateUrl: "/mix-app/views/app-shared/components/login-popup/view.html", controller: "LoginPopupController", @@ -5342,116 +5230,6 @@ appShared.controller("LoginPopupController", [ }, ]); -appShared.component("mediaNavs", { - templateUrl: - "/mix-app/views/app-shared/components/media-navs/media-navs.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "MediaService", - function ($rootScope, $scope, ngAppSettings, mediaService) { - var ctrl = this; - mediaService.init("media"); - ctrl.request = { - pageSize: "10", - pageIndex: 0, - status: "Published", - orderBy: "CreatedDateTime", - direction: "Desc", - fromDate: null, - toDate: null, - keyword: "", - }; - ctrl.medias = []; - ctrl.activeMedia = function (media) { - var currentItem = null; - if (ctrl.data === null || ctrl.isSingle) { - ctrl.data = []; - } - $.each(ctrl.data, function (i, e) { - if (e.mediaId === media.id) { - e.isActived = media.isActived; - currentItem = e; - return false; - } - }); - if (currentItem === null) { - currentItem = { - description: - media.description !== "undefined" ? media.description : "", - image: media.filePath, - mediaId: media.id, - product: ctrl.id, - specificulture: media.specificulture, - position: 0, - priority: ctrl.data.length + 1, - isActived: true, - }; - ctrl.data.push(currentItem); - } - if (ctrl.isSingle) { - if (!media.isActived) { - ctrl.output = ""; - ctrl.data = []; - } else { - ctrl.output = ctrl.data[0].image; - //ctrl.loadMedias(ctrl.request.pageIndex); - } - } - }; - ctrl.loadMedias = async function (pageIndex) { - if (!ctrl.prefix) { - ctrl.prefix = "media_navs"; - } - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var d = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = d.toISOString(); - } - if (ctrl.request.toDate !== null) { - ctrl.request.toDate = ctrl.request.toDate.toISOString(); - } - if ($rootScope.globalSettings) { - ctrl.isBusy = true; - var resp = await mediaService.getList(ctrl.request); - if (resp && resp.isSucceed) { - ctrl.medias = resp.data; - if (ctrl.data) { - angular.forEach(ctrl.medias.items, function (value, key) { - var temp = ctrl.data.filter(function (item) { - return item.mediaId === value.id; - })[0]; - value.isActived = temp !== undefined; - }); - } - ctrl.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - ctrl.isBusy = false; - $scope.$apply(); - } - } - }; - }, - ], - bindings: { - data: "=", - prefix: "=", - sourceFieldName: "=", - isSingle: "=", - output: "=", - loadMedia: "&", - onDelete: "&", - onUpdate: "&", - }, -}); - "use strict"; appShared.controller("MediaController", [ "$scope", @@ -5729,296 +5507,281 @@ sharedComponents.component("medias", { bindings: {}, }); -sharedComponents.component("message", { - templateUrl: "/mix-app/views/app-shared/components/message/message.html", - bindings: { - message: "=", - }, -}); - -sharedComponents.component("messengerPrivate", { - templateUrl: - "/mix-app/views/app-shared/components/messenger-private/index.html", - controller: "MessengerController", - bindings: { - message: "=", - connectionId: "=", - }, -}); - -sharedComponents.component("mixColumnEditor", { +appShared.component("mediaNavs", { templateUrl: - "/mix-app/views/app-shared/components/mix-column-editor/view.html", - bindings: { - model: "=", - column: "=", - isShowTitle: "=?", - inputClass: "=?", - createUrl: "=?", - updateUrl: "=?", - backUrl: "=?", - level: "=?", - }, + "/mix-app/views/app-shared/components/media-navs/media-navs.html", controller: [ "$rootScope", "$scope", - "$location", "ngAppSettings", - "$filter", - "ApiService", - function ( - $rootScope, - $scope, - $location, - ngAppSettings, - $filter, - apiService - ) { + "MediaService", + function ($rootScope, $scope, ngAppSettings, mediaService) { var ctrl = this; - ctrl.mediaFile = {}; - ctrl.icons = ngAppSettings.icons; - ctrl.previousValue = null; - ctrl.translate = (keyword, isWrap, defaultText) => { - return $rootScope.translate(keyword, isWrap, defaultText); + mediaService.init("media"); + ctrl.request = { + pageSize: "10", + pageIndex: 0, + status: "Published", + orderBy: "CreatedDateTime", + direction: "Desc", + fromDate: null, + toDate: null, + keyword: "", }; - ctrl.$doCheck = function () { - // Generate seo string if create new or not exist - if ( - ctrl.column && - ctrl.model && - (!ctrl.model.id || !ctrl.model.obj["seo_url"]) && - ctrl.column.name == "title" - ) { - if ( - ctrl.model.obj[ctrl.column.name] && - ctrl.previousValue !== ctrl.model.obj[ctrl.column.name] - ) { - ctrl.previousValue = ctrl.model.obj[ctrl.column.name]; - ctrl.model.obj["seo_url"] = $rootScope.generateKeyword( - ctrl.model.obj[ctrl.column.name], - "-" - ); - } + ctrl.medias = []; + ctrl.activeMedia = function (media) { + var currentItem = null; + if (ctrl.data === null || ctrl.isSingle) { + ctrl.data = []; } - if (ctrl.model && ctrl.column) { - // check encrypt data - if ( - ctrl.column.isEncrypt && - ctrl.model.obj[ctrl.column.name] && - $rootScope.testJSON(ctrl.model.obj[ctrl.column.name]) - ) { - ctrl.model.obj[ctrl.column.name] = ctrl.parseEncryptedData( - ctrl.model.obj[ctrl.column.name] - ); + $.each(ctrl.data, function (i, e) { + if (e.mediaId === media.id) { + e.isActived = media.isActived; + currentItem = e; + return false; } + }); + if (currentItem === null) { + currentItem = { + description: + media.description !== "undefined" ? media.description : "", + image: media.filePath, + mediaId: media.id, + product: ctrl.id, + specificulture: media.specificulture, + position: 0, + priority: ctrl.data.length + 1, + isActived: true, + }; + ctrl.data.push(currentItem); } - }.bind(ctrl); - ctrl.refData = null; - ctrl.defaultDataModel = null; - - ctrl.refDataModel = { - id: null, - data: null, - }; - - ctrl.dataTypes = $rootScope.globalSettings.dataTypes; - ctrl.previousId = null; - ctrl.options = []; - ctrl.$onInit = async function () { - if (!ctrl.createUrl && ctrl.model && ctrl.column.referenceId) { - ctrl.buildCreateUrl(); - } - if (!ctrl.updateUrl) { - ctrl.updateUrl = "/portal/mix-database-data/details"; - } - if (ctrl.model && ctrl.column.isSelect) { - // Load options from system configutation by name if exist else load options from column configurations - if (ctrl.column.columnConfigurations.optionsConfigurationName) { - // load options if not belong to other column value - let belongTo = ctrl.column.columnConfigurations.belongTo; - let endpoint = - ctrl.column.columnConfigurations.optionsConfigurationName; - if (!belongTo) { - let options = await apiService.getApiResult({ - url: endpoint, - }); - ctrl.options = options; - } else { - // ctrl.options = options.filter( - // (m) => m[belongTo] == ctrl.model.obj[belongTo] - // ); - $rootScope.$watch( - () => { - return ctrl.model.obj[belongTo]; - }, - async function (newVal, oldVal) { - if (newVal != oldVal) { - if (!ctrl.allOptions) { - ctrl.allOptions = await apiService.getApiResult({ - url: endpoint, - }); - } - ctrl.options = ctrl.allOptions.filter( - (m) => m[belongTo] == ctrl.model.obj[belongTo] - ); - } - } - ); - } + if (ctrl.isSingle) { + if (!media.isActived) { + ctrl.output = ""; + ctrl.data = []; } else { - ctrl.options = ctrl.column.options; + ctrl.output = ctrl.data[0].image; + //ctrl.loadMedias(ctrl.request.pageIndex); } } - - ctrl.watchId(); }; - ctrl.watchId = function () { - $rootScope.$watch( - () => { - if (ctrl.model) { - return ctrl.model.id; + ctrl.loadMedias = async function (pageIndex) { + if (!ctrl.prefix) { + ctrl.prefix = "media_navs"; + } + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var d = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = d.toISOString(); + } + if (ctrl.request.toDate !== null) { + ctrl.request.toDate = ctrl.request.toDate.toISOString(); + } + if ($rootScope.globalSettings) { + ctrl.isBusy = true; + var resp = await mediaService.getList(ctrl.request); + if (resp && resp.isSucceed) { + ctrl.medias = resp.data; + if (ctrl.data) { + angular.forEach(ctrl.medias.items, function (value, key) { + var temp = ctrl.data.filter(function (item) { + return item.mediaId === value.id; + })[0]; + value.isActived = temp !== undefined; + }); } - }, - async function (newVal, oldVal) { - if (newVal != oldVal) { - ctrl.buildCreateUrl(); + ctrl.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); } + ctrl.isBusy = false; + $scope.$apply(); } - ); - }; - ctrl.buildCreateUrl = function () { - var backUrl = encodeURIComponent($location.url()); - ctrl.createUrl = `/portal/mix-database-data/create?mixDatabaseId=${ctrl.column.referenceId}&dataId=default&parentId=${ctrl.model.id}&parentType=Set&backUrl=${backUrl}`; - }; - ctrl.initData = async function () { - setTimeout(() => { - switch (ctrl.column.dataType.toLowerCase()) { - case "datetime": - case "date": - case "time": - if (ctrl.model.obj[ctrl.column.name]) { - var local = $filter("utcToLocalTime")( - ctrl.model.obj[ctrl.column.name] - ); - ctrl.model.obj[ctrl.column.name] = new Date(local); - $scope.$apply(); - } - break; - case "reference": // reference - // if(ctrl.column.referenceId && ctrl.model.id){ - // ctrl.model[ctrl.column.name] = ctrl.column.referenceId; - // navService.getSingle(['default']).then(resp=>{ - // resp.mixDatabaseId = ctrl.column.referenceId; - // resp.parentId = ctrl.parentId; - // resp.parentType = ctrl.parentType; - // ctrl.defaultDataModel = resp; - // ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); - // }); - // ctrl.loadRefData(); - // } - break; - default: - if (ctrl.column && !ctrl.model[ctrl.column.name]) { - ctrl.model[ctrl.column.name] = ctrl.column.defaultValue; - $scope.$apply(); - } - break; - } - }, 200); - }; - ctrl.parseEncryptedData = function (data) { - var encryptedData = $rootScope.testJSON(data); - return $rootScope.decrypt(encryptedData); - }; - ctrl.initDefaultValue = async function () { - switch (ctrl.column.dataType) { - case "datetime": - case "date": - case "time": - if (ctrl.column.defaultValue) { - ctrl.model[ctrl.column.name] = new Date( - ctrl.mixDatabaseDataValue.column.defaultValue - ); - } - break; - case "double": - if (ctrl.column.defaultValue) { - ctrl.model[ctrl.column.name] = parseFloat( - ctrl.mixDatabaseDataValue.column.defaultValue - ); - } - break; - case "boolean": - if (ctrl.column.defaultValue) { - ctrl.model[ctrl.column.name] = - ctrl.mixDatabaseDataValue.column.defaultValue == "true"; - } - break; - - default: - if (ctrl.column.defaultValue) { - ctrl.model[ctrl.column.name] = ctrl.column.defaultValue; - } - break; } }; }, ], + bindings: { + data: "=", + prefix: "=", + sourceFieldName: "=", + isSingle: "=", + output: "=", + loadMedia: "&", + onDelete: "&", + onUpdate: "&", + }, }); -"use strict"; -appShared.controller("MessengerController", [ - "$scope", - function ($scope) { - BaseHub.call(this, $scope); - $scope.user = { - loggedIn: false, - info: {}, - }; - $scope.isHide = true; - $scope.hideContact = true; - $scope.members = []; - $scope.messages = []; - $scope.message = { connection: {}, content: "" }; - $scope.request = { - uid: "", - objectType: null, - action: "", - data: {}, - room: "", - isMyself: false, - }; - $scope.loadMsgButton = function () {}; - $scope.init = function () { - $scope.startConnection("MixChatHub", $scope.checkLoginStatus); - - $("button").on("click", function () { - var text = $("#message").val(); - var hnow = new Date().getHours(); - var mnow = new Date().getMinutes(); - mnow = mnow < 10 ? "0" + mnow : mnow; - var d = hnow + ":" + mnow; - - if (text.length > 0) { - $("#message").css("border", "1px solid #f4f5f9"); - $("#conversation").append( - "
  • You
    " + - text + - "
    " + - d + - "
  • " - ); - $("#message").val(""); - $(".widget-conversation").scrollTop( - $("ul li").last().position().top + $("ul li").last().height() - ); - } else { - $("#message").css("border", "1px solid #eb9f9f"); - $("#message").animate({ opacity: "0.1" }, "slow"); - $("#message").animate({ opacity: "1" }, "slow"); - $("#message").animate({ opacity: "0.1" }, "slow"); - $("#message").animate({ opacity: "1" }, "slow"); - } +(function (angular) { + appShared.component("languageSwitcher", { + templateUrl: + "/mix-app/views/app-shared/components/language-switcher/language-switcher.html", + controller: [ + "$rootScope", + "$scope", + "$location", + "ApiService", + "CommonService", + "TranslatorService", + "GlobalSettingsService", + function ( + $rootScope, + $scope, + $location, + apiService, + commonService, + translatorService, + globalSettingsService + ) { + var ctrl = this; + ctrl.localizeSettings = {}; + this.$onInit = function () { + ctrl.localizeSettings = $rootScope.localizeSettings; + if ($rootScope.globalSettings) { + ctrl.localizeSettings.cultures = $rootScope.globalSettings.cultures; + } + }; + + ctrl.changeLang = async function (lang, langIcon) { + ctrl.localizeSettings.lang = lang; + ctrl.localizeSettings.langIcon = langIcon; + // await commonService.removeSettings(); + // await commonService.removeTranslator(); + // commonService.fillSettings(lang).then(function () { + // translatorService.reset(lang).then(function () { + commonService.fillAllSettings(lang).then(function (response) { + translatorService.translateUrl(lang).then(function (url) { + window.top.location = url; + }); + }); + // }); + // }); + }; + ctrl.logOut = function () { + $rootScope.logOut(); + }; + }, + ], + bindings: { + //settings: '=', + ulStyle: "=", + liStyle: "=", + aStyle: "=", + activeClass: "=", + }, + }); +})(window.angular); + +sharedComponents.component("limitString", { + templateUrl: + "/mix-app/views/app-shared/components/limit-string/limit-string.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + function ($rootScope, $scope, ngAppSettings) { + var ctrl = this; + ctrl.shortenString = ""; + ctrl.previousContentId = undefined; + + this.$onInit = () => { + ctrl.previousContentId = angular.copy(ctrl.contentId); + }; + + this.$doCheck = () => { + if (ctrl.contentId !== ctrl.previousContentId) { + ctrl.loadModuleData(); + ctrl.previousContentId = ctrl.contentId; + } + }; + ctrl.shortString = function () { + var data = decodeURIComponent(ctrl.content); + if (data) { + if (ctrl.max < data.length) { + ctrl.shortenString = + data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; + } else { + ctrl.shortenString = data.replace(/[+]/g, " "); + } + } + }; + ctrl.view = function () { + var obj = { + moduleId: ctrl.moduleId, + id: ctrl.contentId, + }; + $rootScope.preview("module-data", obj, null, "modal-lg"); + }; + ctrl.translate = $rootScope.translate; + }, + ], + bindings: { + content: "=", + showData: "=", + max: "=", + moduleId: "=", + contentId: "=", + }, +}); + +"use strict"; +appShared.controller("MessengerController", [ + "$scope", + function ($scope) { + BaseHub.call(this, $scope); + $scope.user = { + loggedIn: false, + info: {}, + }; + $scope.isHide = true; + $scope.hideContact = true; + $scope.members = []; + $scope.messages = []; + $scope.message = { connection: {}, content: "" }; + $scope.request = { + uid: "", + objectType: null, + action: "", + data: {}, + room: "", + isMyself: false, + }; + $scope.loadMsgButton = function () {}; + $scope.init = function () { + $scope.startConnection("MixChatHub", $scope.checkLoginStatus); + + $("button").on("click", function () { + var text = $("#message").val(); + var hnow = new Date().getHours(); + var mnow = new Date().getMinutes(); + mnow = mnow < 10 ? "0" + mnow : mnow; + var d = hnow + ":" + mnow; + + if (text.length > 0) { + $("#message").css("border", "1px solid #f4f5f9"); + $("#conversation").append( + "
  • You
    " + + text + + "
    " + + d + + "
  • " + ); + $("#message").val(""); + $(".widget-conversation").scrollTop( + $("ul li").last().position().top + $("ul li").last().height() + ); + } else { + $("#message").css("border", "1px solid #eb9f9f"); + $("#message").animate({ opacity: "0.1" }, "slow"); + $("#message").animate({ opacity: "1" }, "slow"); + $("#message").animate({ opacity: "0.1" }, "slow"); + $("#message").animate({ opacity: "1" }, "slow"); + } }); // var _createClass = function () {function defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}return function (Constructor, protoProps, staticProps) {if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;};}();function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}var HoverButton = function () { @@ -6233,137 +5996,374 @@ sharedComponents.component("messenger", { }, }); -sharedComponents.component("mixDataPreview", { +sharedComponents.component("message", { + templateUrl: "/mix-app/views/app-shared/components/message/message.html", + bindings: { + message: "=", + }, +}); + +sharedComponents.component("messengerPrivate", { templateUrl: - "/mix-app/views/app-shared/components/mix-data-preview/mix-data-preview.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], + "/mix-app/views/app-shared/components/messenger-private/index.html", + controller: "MessengerController", bindings: { - type: "=", - value: "=", - width: "=", + message: "=", + connectionId: "=", }, }); -sharedComponents.component("mixColumnPreview", { +sharedComponents.component("mixColumnEditor", { templateUrl: - "/mix-app/views/app-shared/components/mix-column-preview/view.html", + "/mix-app/views/app-shared/components/mix-column-editor/view.html", bindings: { model: "=", column: "=", isShowTitle: "=?", inputClass: "=?", + createUrl: "=?", + updateUrl: "=?", + backUrl: "=?", + level: "=?", }, - controller: [ - "$rootScope", - "$sce", - function ($rootScope, $sce) { - var ctrl = this; - ctrl.previousId = null; - ctrl.$onInit = function () { - ctrl.uuid = $rootScope.generateUUID(); - if (ctrl.column.isEncrypt) { - var obj = $rootScope.testJSON(ctrl.model); - if (obj) { - ctrl.encryptedData = obj; - ctrl.model = ctrl.encryptedData.data; - ctrl.decrypted = $rootScope.decrypt(ctrl.encryptedData); - } - } - if (ctrl.column.dataType == 20 && ctrl.model) { - // youtube video - ctrl.model = $sce.trustAsResourceUrl( - "https://www.youtube.com/embed/" + - ctrl.model + - "?rel=0&showinfo=0&autoplay=0" - ); - } - // if(ctrl.column.dataType == 24 && ctrl.model) // youtube video - // { - // ctrl.generateQRCode(); - // } - }; - - ctrl.generateQRCode = function () { - setTimeout(() => { - $("#" + ctrl.uuid).empty(); - $("#" + ctrl.uuid).qrcode(ctrl.model); - }, 200); - }; - }, - ], -}); - -sharedComponents.component("mixDataTable", { - templateUrl: - "/mix-app/views/app-shared/components/mix-data-table/mix-data-table.html", controller: [ "$rootScope", "$scope", "$location", "ngAppSettings", - function ($rootScope, $scope, $location, ngAppSettings) { + "$filter", + "ApiService", + function ( + $rootScope, + $scope, + $location, + ngAppSettings, + $filter, + apiService + ) { var ctrl = this; - ctrl.colWidth = 3; - ctrl.init = function () { - if (ctrl.data.items.length) { - ctrl.min = ctrl.data.items[0].priority; - } - ctrl.colWidth = parseInt(9 / ctrl.columns.length); - ctrl.lastColWidth = 9 % ctrl.columns.length > 0 ? 2 : 1; + ctrl.mediaFile = {}; + ctrl.icons = ngAppSettings.icons; + ctrl.previousValue = null; + ctrl.translate = (keyword, isWrap, defaultText) => { + return $rootScope.translate(keyword, isWrap, defaultText); }; - ctrl.translate = $rootScope.translate; - ctrl.selected = null; - ctrl.updateOrders = function (index, items) { - items.splice(index, 1); - for (var i = 0; i < items.length; i++) { - items[i].priority = ctrl.min + i; + ctrl.$doCheck = function () { + // Generate seo string if create new or not exist + if ( + ctrl.column && + ctrl.model && + (!ctrl.model.id || !ctrl.model.obj["seo_url"]) && + ctrl.column.name == "title" + ) { + if ( + ctrl.model.obj[ctrl.column.name] && + ctrl.previousValue !== ctrl.model.obj[ctrl.column.name] + ) { + ctrl.previousValue = ctrl.model.obj[ctrl.column.name]; + ctrl.model.obj["seo_url"] = $rootScope.generateKeyword( + ctrl.model.obj[ctrl.column.name], + "-" + ); + } } - ctrl.onUpdateInfos({ items: items }); + if (ctrl.model && ctrl.column) { + // check encrypt data + if ( + ctrl.column.isEncrypt && + ctrl.model.obj[ctrl.column.name] && + $rootScope.testJSON(ctrl.model.obj[ctrl.column.name]) + ) { + ctrl.model.obj[ctrl.column.name] = ctrl.parseEncryptedData( + ctrl.model.obj[ctrl.column.name] + ); + } + } + }.bind(ctrl); + ctrl.refData = null; + ctrl.defaultDataModel = null; + + ctrl.refDataModel = { + id: null, + data: null, }; - ctrl.updateChildOrders = function (index, items) { - items.splice(index, 1); - for (var i = 0; i < items.length; i++) { - items[i].priority = ctrl.min + i; + ctrl.dataTypes = $rootScope.globalSettings.dataTypes; + ctrl.previousId = null; + ctrl.options = []; + ctrl.$onInit = async function () { + if (!ctrl.createUrl && ctrl.model && ctrl.column.referenceId) { + ctrl.buildCreateUrl(); } - ctrl.onUpdateChildInfos({ items: items }); + if (!ctrl.updateUrl) { + ctrl.updateUrl = "/portal/mix-database-data/details"; + } + if (ctrl.model && ctrl.column.isSelect) { + // Load options from system configutation by name if exist else load options from column configurations + if (ctrl.column.columnConfigurations.optionsConfigurationName) { + // load options if not belong to other column value + let belongTo = ctrl.column.columnConfigurations.belongTo; + let endpoint = + ctrl.column.columnConfigurations.optionsConfigurationName; + if (!belongTo) { + let options = await apiService.getApiResult({ + url: endpoint, + }); + ctrl.options = options; + } else { + // ctrl.options = options.filter( + // (m) => m[belongTo] == ctrl.model.obj[belongTo] + // ); + $rootScope.$watch( + () => { + return ctrl.model.obj[belongTo]; + }, + async function (newVal, oldVal) { + if (newVal != oldVal) { + if (!ctrl.allOptions) { + ctrl.allOptions = await apiService.getApiResult({ + url: endpoint, + }); + } + ctrl.options = ctrl.allOptions.filter( + (m) => m[belongTo] == ctrl.model.obj[belongTo] + ); + } + } + ); + } + } else { + ctrl.options = ctrl.column.options; + } + } + + ctrl.watchId(); }; - ctrl.dragoverCallback = function (index, item, external, type) { - //console.log('drop ', index, item, external, type); + ctrl.watchId = function () { + $rootScope.$watch( + () => { + if (ctrl.model) { + return ctrl.model.id; + } + }, + async function (newVal, oldVal) { + if (newVal != oldVal) { + ctrl.buildCreateUrl(); + } + } + ); }; - ctrl.insertCallback = function (index, item, external, type) { - //console.log('insert ', index, item, external, type); + ctrl.buildCreateUrl = function () { + var backUrl = encodeURIComponent($location.url()); + ctrl.createUrl = `/portal/mix-database-data/create?mixDatabaseId=${ctrl.column.referenceId}&dataId=default&parentId=${ctrl.model.id}&parentType=Set&backUrl=${backUrl}`; }; - ctrl.delete = function (id) { - ctrl.onDelete({ id: id }); + ctrl.initData = async function () { + setTimeout(() => { + switch (ctrl.column.dataType.toLowerCase()) { + case "datetime": + case "date": + case "time": + if (ctrl.model.obj[ctrl.column.name]) { + var local = $filter("utcToLocalTime")( + ctrl.model.obj[ctrl.column.name] + ); + ctrl.model.obj[ctrl.column.name] = new Date(local); + $scope.$apply(); + } + break; + case "reference": // reference + // if(ctrl.column.referenceId && ctrl.model.id){ + // ctrl.model[ctrl.column.name] = ctrl.column.referenceId; + // navService.getSingle(['default']).then(resp=>{ + // resp.mixDatabaseId = ctrl.column.referenceId; + // resp.parentId = ctrl.parentId; + // resp.parentType = ctrl.parentType; + // ctrl.defaultDataModel = resp; + // ctrl.refDataModel = angular.copy(ctrl.defaultDataModel); + // }); + // ctrl.loadRefData(); + // } + break; + default: + if (ctrl.column && !ctrl.model[ctrl.column.name]) { + ctrl.model[ctrl.column.name] = ctrl.column.defaultValue; + $scope.$apply(); + } + break; + } + }, 200); }; - ctrl.goTo = function (id) { - $location.path(ctrl.editUrl + "/" + id); + ctrl.parseEncryptedData = function (data) { + var encryptedData = $rootScope.testJSON(data); + return $rootScope.decrypt(encryptedData); }; - ctrl.toggleChildNavs = function (nav) { - nav.showChildNavs = nav.childNavs.length > 0 && !nav.showChildNavs; + ctrl.initDefaultValue = async function () { + switch (ctrl.column.dataType) { + case "datetime": + case "date": + case "time": + if (ctrl.column.defaultValue) { + ctrl.model[ctrl.column.name] = new Date( + ctrl.mixDatabaseDataValue.column.defaultValue + ); + } + break; + case "double": + if (ctrl.column.defaultValue) { + ctrl.model[ctrl.column.name] = parseFloat( + ctrl.mixDatabaseDataValue.column.defaultValue + ); + } + break; + case "boolean": + if (ctrl.column.defaultValue) { + ctrl.model[ctrl.column.name] = + ctrl.mixDatabaseDataValue.column.defaultValue == "true"; + } + break; + + default: + if (ctrl.column.defaultValue) { + ctrl.model[ctrl.column.name] = ctrl.column.defaultValue; + } + break; + } }; }, ], +}); + +sharedComponents.component("mixColumnPreview", { + templateUrl: + "/mix-app/views/app-shared/components/mix-column-preview/view.html", bindings: { - data: "=", - childName: "=", - canDrag: "=", - editUrl: "=", - columns: "=", - onDelete: "&", - onUpdateInfos: "&", - onUpdateChildInfos: "&", + model: "=", + column: "=", + isShowTitle: "=?", + inputClass: "=?", }, + controller: [ + "$rootScope", + "$sce", + function ($rootScope, $sce) { + var ctrl = this; + ctrl.previousId = null; + ctrl.$onInit = function () { + ctrl.uuid = $rootScope.generateUUID(); + if (ctrl.column.isEncrypt) { + var obj = $rootScope.testJSON(ctrl.model); + if (obj) { + ctrl.encryptedData = obj; + ctrl.model = ctrl.encryptedData.data; + ctrl.decrypted = $rootScope.decrypt(ctrl.encryptedData); + } + } + if (ctrl.column.dataType == 20 && ctrl.model) { + // youtube video + ctrl.model = $sce.trustAsResourceUrl( + "https://www.youtube.com/embed/" + + ctrl.model + + "?rel=0&showinfo=0&autoplay=0" + ); + } + // if(ctrl.column.dataType == 24 && ctrl.model) // youtube video + // { + // ctrl.generateQRCode(); + // } + }; + + ctrl.generateQRCode = function () { + setTimeout(() => { + $("#" + ctrl.uuid).empty(); + $("#" + ctrl.uuid).qrcode(ctrl.model); + }, 200); + }; + }, + ], }); -"use strict"; -appShared.controller("MixDatabaseDataClientController", [ +sharedComponents.component("mixDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/mix-data-preview/mix-data-preview.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + }, + ], + bindings: { + type: "=", + value: "=", + width: "=", + }, +}); + +sharedComponents.component("mixDataTable", { + templateUrl: + "/mix-app/views/app-shared/components/mix-data-table/mix-data-table.html", + controller: [ + "$rootScope", + "$scope", + "$location", + "ngAppSettings", + function ($rootScope, $scope, $location, ngAppSettings) { + var ctrl = this; + ctrl.colWidth = 3; + ctrl.init = function () { + if (ctrl.data.items.length) { + ctrl.min = ctrl.data.items[0].priority; + } + ctrl.colWidth = parseInt(9 / ctrl.columns.length); + ctrl.lastColWidth = 9 % ctrl.columns.length > 0 ? 2 : 1; + }; + ctrl.translate = $rootScope.translate; + ctrl.selected = null; + ctrl.updateOrders = function (index, items) { + items.splice(index, 1); + for (var i = 0; i < items.length; i++) { + items[i].priority = ctrl.min + i; + } + ctrl.onUpdateInfos({ items: items }); + }; + + ctrl.updateChildOrders = function (index, items) { + items.splice(index, 1); + for (var i = 0; i < items.length; i++) { + items[i].priority = ctrl.min + i; + } + ctrl.onUpdateChildInfos({ items: items }); + }; + ctrl.dragoverCallback = function (index, item, external, type) { + //console.log('drop ', index, item, external, type); + }; + ctrl.insertCallback = function (index, item, external, type) { + //console.log('insert ', index, item, external, type); + }; + ctrl.delete = function (id) { + ctrl.onDelete({ id: id }); + }; + ctrl.goTo = function (id) { + $location.path(ctrl.editUrl + "/" + id); + }; + ctrl.toggleChildNavs = function (nav) { + nav.showChildNavs = nav.childNavs.length > 0 && !nav.showChildNavs; + }; + }, + ], + bindings: { + data: "=", + childName: "=", + canDrag: "=", + editUrl: "=", + columns: "=", + onDelete: "&", + onUpdateInfos: "&", + onUpdateChildInfos: "&", + }, +}); + +"use strict"; +appShared.controller("MixDatabaseDataClientController", [ "$scope", "$rootScope", "ngAppSettings", @@ -6919,76 +6919,6 @@ sharedComponents.component("mixLoader", { }, }); -"use strict"; -appShared.controller("ModalPostController", [ - "$scope", - "$rootScope", - "$location", - "ngAppSettings", - "$routeParams", - "PostRestService", - function ( - $scope, - $rootScope, - $location, - ngAppSettings, - $routeParams, - service - ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.columns = [ - { - title: "Title", - name: "title", - filter: true, - type: "string", - }, - { - title: "Url", - name: "imageUrl", - filter: true, - type: "upload", - }, - ]; - }, -]); - -"use strict"; -appShared.factory("ModalPostRestService", [ - "$rootScope", - "ApiService", - "CommonService", - "BaseService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - return serviceFactory; - }, -]); - -sharedComponents.component("modalPosts", { - templateUrl: - "/mix-app/views/app-shared/components/modal-posts/modal-posts.html", - controller: "ModalPostController", - bindings: { - data: "=", - childName: "=", - canDrag: "=", - editUrl: "=", - columns: "=", - onDelete: "&", - onUpdateInfos: "&", - onUpdateChildInfos: "&", - }, -}); - sharedComponents.component("mixModuleDataTable", { templateUrl: "/mix-app/views/app-shared/components/mix-module-data-table/mix-module-data-table.html", @@ -7091,9 +7021,359 @@ sharedComponents.component("mixSelect", { ctrl.onSelect = function () { ctrl.callback({ type: ctrl.model }); }; - }, - ], -}); + }, + ], +}); + +"use strict"; +appShared.controller("ModalPostController", [ + "$scope", + "$rootScope", + "$location", + "ngAppSettings", + "$routeParams", + "PostRestService", + function ( + $scope, + $rootScope, + $location, + ngAppSettings, + $routeParams, + service + ) { + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); + $scope.columns = [ + { + title: "Title", + name: "title", + filter: true, + type: "string", + }, + { + title: "Url", + name: "imageUrl", + filter: true, + type: "upload", + }, + ]; + }, +]); + +"use strict"; +appShared.factory("ModalPostRestService", [ + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($rootScope, apiService, commonService, baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("page-post"); + return serviceFactory; + }, +]); + +sharedComponents.component("modalPosts", { + templateUrl: + "/mix-app/views/app-shared/components/modal-posts/modal-posts.html", + controller: "ModalPostController", + bindings: { + data: "=", + childName: "=", + canDrag: "=", + editUrl: "=", + columns: "=", + onDelete: "&", + onUpdateInfos: "&", + onUpdateChildInfos: "&", + }, +}); + +// sharedComponents.component('modalConfirm', { +// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', +// controller: ModalConfirmController, +// bindings: { +// message: '=' +// } +// }); +function ModalConfirmController($rootScope, $scope, $mdDialog, message) { + $scope.message = message; + $scope.executeFunctionByName = async function (functionName, args, context) { + var result = await $rootScope.executeFunctionByName( + functionName, + args, + context + ); + if (result) { + $scope.$apply(); + } + $mdDialog.hide(); + }; + $scope.closeDialog = function () { + $mdDialog.hide(); + }; +} + +sharedComponents.controller( + "ModalCroppieController", + function ( + $rootScope, + $scope, + $http, + $uibModalInstance, + mediaService, + file, + w, + h, + rto, + autoSave + ) { + var ctrl = this; + ctrl.autoSave = autoSave; + ctrl.maxW = 400; + ctrl.file = file; + ctrl.w = w; + ctrl.h = h; + ctrl.rto = rto; + ctrl.isAdmin = $rootScope.isAdmin; + ctrl.postedFile = {}; + ctrl.isImage = false; + ctrl.mediaNavs = []; + ctrl.media = { + title: "", + mediaFile: { + file: null, + }, + }; + ctrl.image_placeholder = "/mix-app/assets/img/image_placeholder.jpg"; + ctrl.options = null; + ctrl.init = function () { + ctrl.srcUrl = ctrl.srcUrl || ctrl.image_placeholder; + ctrl.maxHeight = ctrl.maxHeight || "2000px"; + ctrl.id = Math.floor(Math.random() * 100); + ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); + ctrl.cropped = { + source: null, + }; + if (ctrl.frameUrl) { + ctrl.frame = ctrl.loadImage(frameUrl); + } + + if (ctrl.srcUrl) { + ctrl.loadBase64(ctrl.srcUrl); + } + + if (ctrl.file) { + setTimeout(() => { + ctrl.selectFile([ctrl.file]); + }, 500); + } + + // Assign blob to component when selecting a image + }; + + ctrl.loadFromUrl = function () { + if (ctrl.src !== ctrl.srcUrl && ctrl.srcUrl != ctrl.image_placeholder) { + ctrl.src = ctrl.srcUrl; + ctrl.isImage = ctrl.srcUrl + .toLowerCase() + .match(/([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|svg)/g); + if (ctrl.isImage) { + ctrl.loadBase64(ctrl.srcUrl); + } + } + }; + + ctrl.origin = function () { + $uibModalInstance.close(); + }; + + ctrl.ok = async function () { + if (!ctrl.autoSave) { + $uibModalInstance.close(ctrl.cropped.image); + } else { + ctrl.media.fileFolder = ctrl.folder || "Media"; + ctrl.media.fileName = ctrl.media.mediaFile.fileName; + ctrl.media.extension = ctrl.media.mediaFile.extension; + ctrl.media.mediaFile.fileStream = ctrl.cropped.image; + var result = await mediaService.save(ctrl.media); + if (result.isSucceed) { + $uibModalInstance.close(result.data); + } + } + }; + + ctrl.cancel = function () { + $uibModalInstance.dismiss("cancel"); + }; + ctrl.combineImage = function () { + ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); + if (ctrl.canvas) { + var img = document.getElementById("croppie-src"); + var w = ctrl.options.boundary.width; + var h = ctrl.options.boundary.height; + // var rto = w / h; + var newW = ctrl.options.output.width; + var newH = ctrl.options.output.height; + var ctx = ctrl.canvas.getContext("2d"); + ctx.imageSmoothingEnabled = true; + ctx.drawImage(img, 0, 0, newW, newH); + if (ctrl.frame) { + // combine with frame + ctx.drawImage(ctrl.frame, 0, 0, w, h); + } + + $scope.$apply(function () { + ctrl.postedFile.fileStream = ctrl.canvas.toDataURL(); //ctx.getImageData(0, 0, 300, 350); + ctrl.imgUrl = ctrl.postedFile.fileStream.replace( + "image/png", + "image/octet-stream" + ); + }); + } + }; + ctrl.saveCanvas = function () { + var link = document.createElement("a"); + link.download = ctrl.postedFile.fileName + ctrl.postedFile.extension; + $rootScope.isBusy = true; + ctrl.canvas.toBlob(function (blob) { + link.href = URL.createObjectURL(blob); + link.click(); + $rootScope.isBusy = false; + $scope.$apply(); + }, "image/png"); + }; + ctrl._arrayBufferToBase64 = function (buffer) { + var binary = ""; + var bytes = new Uint8Array(buffer); + var len = bytes.byteLength; + for (var i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); + }; + + ctrl.selectFile = function (files) { + if (files !== undefined && files !== null && files.length > 0) { + const file = files[0]; + ctrl.media.folder = ctrl.folder ? ctrl.folder : "Media"; + ctrl.media.title = ctrl.title ? ctrl.title : file.name; + ctrl.media.description = ctrl.description ? ctrl.description : ""; + ctrl.media.mediaFile.fileName = file.name.substring( + 0, + file.name.lastIndexOf(".") + ); + ctrl.media.mediaFile.extension = file.name.substring( + file.name.lastIndexOf(".") + ); + ctrl.getBase64(file); + // if (file.size < 100000) { + // var msg = "Please choose a better photo (larger than 100kb)!"; + // $rootScope.showConfirm(ctrl, null, [], null, null, msg); + // } else { + // } + } + }; + ctrl.loadBase64 = function (url) { + var ext = url.substring(url.lastIndexOf(".") + 1); + $http({ + method: "GET", + url: url, + responseType: "arraybuffer", + }).then(function (resp) { + var base64 = `data:image/${ext};base64,${ctrl._arrayBufferToBase64( + resp.data + )}`; + var image = new Image(); + image.src = base64; + image.onload = function () { + // access image size here + ctrl.originW = this.width; + ctrl.originH = this.height; + + ctrl.loadImageSize(this.width, this.height); + ctrl.cropped.source = base64; + $scope.$apply(); + }; + return base64; + }); + }; + ctrl.getBase64 = function (file) { + if (file !== null) { + $rootScope.isBusy = true; + var reader = new FileReader(); + reader.readAsDataURL(file); + // ctrl.cropped.source = null; + reader.onload = function () { + if (ctrl.media.mediaFile) { + ctrl.media.mediaFile.fileName = file.name.substring( + 0, + file.name.lastIndexOf(".") + ); + ctrl.media.mediaFile.extension = file.name.substring( + file.name.lastIndexOf(".") + ); + // ctrl.postedFile.fileStream = reader.result; + } + var image = new Image(); + image.src = reader.result; + + image.onload = function () { + // access image size here + ctrl.originW = this.width; + ctrl.originH = this.height; + ctrl.loadImageSize(this.width, this.height); + ctrl.cropped.source = reader.result; + $rootScope.isBusy = false; + $scope.$apply(); + }; + }; + reader.onerror = function (error) { + $rootScope.isBusy = false; + $rootScope.showErrors([error]); + }; + } else { + return null; + } + }; + ctrl.loadImageSize = function (w, h) { + // const maxW = ctrl.w + 100; + w = w || ctrl.originW; + h = h || ctrl.originH; + var rto = w / h; + ctrl.rto = ctrl.rto || rto; + ctrl.w = ctrl.w || w; + ctrl.h = ctrl.w / ctrl.rto; + ctrl.options = { + boundary: { height: ctrl.maxW / rto, width: ctrl.maxW }, + render: { height: ctrl.maxW / rto, width: ctrl.maxW }, + output: { height: ctrl.h, width: ctrl.h * ctrl.rto }, + }; + ctrl.loadViewport(); + }; + ctrl.loadViewport = function () { + if (ctrl.w && ctrl.h) { + ctrl.rto = ctrl.w / ctrl.h; + let w = ctrl.w > ctrl.maxW ? ctrl.maxW * 0.6 : ctrl.w * 0.6; + let h = w / ctrl.rto; + if (w > ctrl.options.boundary.width) { + w = ctrl.options.boundary.width; + h = w / ctrl.rto; + } + ctrl.options.viewport = { + height: h, + width: w, + }; + } + }; + } +); "use strict"; appShared.controller("SharedModuleDataController", [ @@ -7230,421 +7510,166 @@ appShared.controller("SharedModuleDataController", [ var d = new Date($scope.request.toDate); $scope.request.toDate = d.toISOString(); } - var resp = await moduleDataService.getModuleDatas($scope.request); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.removeModuleData = async function (id) { - if (confirm("Are you sure!")) { - var resp = await moduleDataService.removeModuleData(id); - if (resp && resp.isSucceed) { - $scope.loadModuleDatas(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - } - } - }; - - $scope.saveModuleData = async function () { - var resp = await moduleDataService.saveModuleData( - $scope.activedModuleData - ); - if (resp && resp.isSucceed) { - $scope.activedModuleData = resp.data; - $rootScope.showMessage("Update successfully!", "success"); - $rootScope.isBusy = false; - $scope.initModuleForm($scope.name); - $rootScope.isBusy = false; - $scope.$apply(); - //$location.path('/portal/moduleData/details/' + resp.data.id); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -appShared.factory("SharedModuleDataService", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - var moduleDatasServiceFactory = {}; - - var _updateInfos = async function (pages) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data"; - var req = { - method: "POST", - url: apiUrl + "/update-infos", - data: JSON.stringify(pages), - }; - return await apiService.getApiResult(req); - }; - - var _getModuleData = async function (moduleId, id, type) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + moduleId + "/" + id; - } else { - url += "/" + moduleId; - } - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _getModuleDatas = async function (request) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _exportModuleData = async function (request) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "POST", - url: apiUrl + "export", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _initModuleForm = async function (name) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "GET", - url: apiUrl + "init-by-name/" + name, - }; - - return await apiService.getApiResult(req); - }; - - var _removeModuleData = async function (id) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; - - var _saveModuleData = async function (moduleData) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(moduleData), - }; - return await apiService.getApiResult(req); - }; - var _saveFields = async function (id, propertyName, propertyValue) { - var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; - var column = [ - { - propertyName: propertyName, - propertyValue: propertyValue, - }, - ]; - var req = { - method: "POST", - url: apiUrl + "save/" + id, - data: JSON.stringify(column), - }; - return await apiService.getApiResult(req); - }; - moduleDatasServiceFactory.getModuleData = _getModuleData; - moduleDatasServiceFactory.getModuleDatas = _getModuleDatas; - moduleDatasServiceFactory.exportModuleData = _exportModuleData; - moduleDatasServiceFactory.removeModuleData = _removeModuleData; - moduleDatasServiceFactory.saveModuleData = _saveModuleData; - moduleDatasServiceFactory.initModuleForm = _initModuleForm; - moduleDatasServiceFactory.saveFields = _saveFields; - moduleDatasServiceFactory.updateInfos = _updateInfos; - return moduleDatasServiceFactory; - }, -]); - -sharedComponents.controller( - "ModalCroppieController", - function ( - $rootScope, - $scope, - $http, - $uibModalInstance, - mediaService, - file, - w, - h, - rto, - autoSave - ) { - var ctrl = this; - ctrl.autoSave = autoSave; - ctrl.maxW = 400; - ctrl.file = file; - ctrl.w = w; - ctrl.h = h; - ctrl.rto = rto; - ctrl.isAdmin = $rootScope.isAdmin; - ctrl.postedFile = {}; - ctrl.isImage = false; - ctrl.mediaNavs = []; - ctrl.media = { - title: "", - mediaFile: { - file: null, - }, - }; - ctrl.image_placeholder = "/mix-app/assets/img/image_placeholder.jpg"; - ctrl.options = null; - ctrl.init = function () { - ctrl.srcUrl = ctrl.srcUrl || ctrl.image_placeholder; - ctrl.maxHeight = ctrl.maxHeight || "2000px"; - ctrl.id = Math.floor(Math.random() * 100); - ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); - ctrl.cropped = { - source: null, - }; - if (ctrl.frameUrl) { - ctrl.frame = ctrl.loadImage(frameUrl); - } - - if (ctrl.srcUrl) { - ctrl.loadBase64(ctrl.srcUrl); - } - - if (ctrl.file) { - setTimeout(() => { - ctrl.selectFile([ctrl.file]); - }, 500); + var resp = await moduleDataService.getModuleDatas($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); } - - // Assign blob to component when selecting a image }; - ctrl.loadFromUrl = function () { - if (ctrl.src !== ctrl.srcUrl && ctrl.srcUrl != ctrl.image_placeholder) { - ctrl.src = ctrl.srcUrl; - ctrl.isImage = ctrl.srcUrl - .toLowerCase() - .match(/([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|svg)/g); - if (ctrl.isImage) { - ctrl.loadBase64(ctrl.srcUrl); + $scope.removeModuleData = async function (id) { + if (confirm("Are you sure!")) { + var resp = await moduleDataService.removeModuleData(id); + if (resp && resp.isSucceed) { + $scope.loadModuleDatas(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } } } }; - ctrl.origin = function () { - $uibModalInstance.close(); - }; - - ctrl.ok = async function () { - if (!ctrl.autoSave) { - $uibModalInstance.close(ctrl.cropped.image); + $scope.saveModuleData = async function () { + var resp = await moduleDataService.saveModuleData( + $scope.activedModuleData + ); + if (resp && resp.isSucceed) { + $scope.activedModuleData = resp.data; + $rootScope.showMessage("Update successfully!", "success"); + $rootScope.isBusy = false; + $scope.initModuleForm($scope.name); + $rootScope.isBusy = false; + $scope.$apply(); + //$location.path('/portal/moduleData/details/' + resp.data.id); } else { - ctrl.media.fileFolder = ctrl.folder || "Media"; - ctrl.media.fileName = ctrl.media.mediaFile.fileName; - ctrl.media.extension = ctrl.media.mediaFile.extension; - ctrl.media.mediaFile.fileStream = ctrl.cropped.image; - var result = await mediaService.save(ctrl.media); - if (result.isSucceed) { - $uibModalInstance.close(result.data); + if (resp) { + $rootScope.showErrors(resp.errors); } + $rootScope.isBusy = false; + $scope.$apply(); } }; + }, +]); - ctrl.cancel = function () { - $uibModalInstance.dismiss("cancel"); - }; - ctrl.combineImage = function () { - ctrl.canvas = document.getElementById(`canvas-${ctrl.id}`); - if (ctrl.canvas) { - var img = document.getElementById("croppie-src"); - var w = ctrl.options.boundary.width; - var h = ctrl.options.boundary.height; - // var rto = w / h; - var newW = ctrl.options.output.width; - var newH = ctrl.options.output.height; - var ctx = ctrl.canvas.getContext("2d"); - ctx.imageSmoothingEnabled = true; - ctx.drawImage(img, 0, 0, newW, newH); - if (ctrl.frame) { - // combine with frame - ctx.drawImage(ctrl.frame, 0, 0, w, h); - } +"use strict"; +appShared.factory("SharedModuleDataService", [ + "$http", + "$rootScope", + "ApiService", + "CommonService", + function ($http, $rootScope, apiService, commonService) { + var moduleDatasServiceFactory = {}; - $scope.$apply(function () { - ctrl.postedFile.fileStream = ctrl.canvas.toDataURL(); //ctx.getImageData(0, 0, 300, 350); - ctrl.imgUrl = ctrl.postedFile.fileStream.replace( - "image/png", - "image/octet-stream" - ); - }); - } - }; - ctrl.saveCanvas = function () { - var link = document.createElement("a"); - link.download = ctrl.postedFile.fileName + ctrl.postedFile.extension; - $rootScope.isBusy = true; - ctrl.canvas.toBlob(function (blob) { - link.href = URL.createObjectURL(blob); - link.click(); - $rootScope.isBusy = false; - $scope.$apply(); - }, "image/png"); - }; - ctrl._arrayBufferToBase64 = function (buffer) { - var binary = ""; - var bytes = new Uint8Array(buffer); - var len = bytes.byteLength; - for (var i = 0; i < len; i++) { - binary += String.fromCharCode(bytes[i]); - } - return window.btoa(binary); + var _updateInfos = async function (pages) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data"; + var req = { + method: "POST", + url: apiUrl + "/update-infos", + data: JSON.stringify(pages), + }; + return await apiService.getApiResult(req); }; - ctrl.selectFile = function (files) { - if (files !== undefined && files !== null && files.length > 0) { - const file = files[0]; - ctrl.media.folder = ctrl.folder ? ctrl.folder : "Media"; - ctrl.media.title = ctrl.title ? ctrl.title : file.name; - ctrl.media.description = ctrl.description ? ctrl.description : ""; - ctrl.media.mediaFile.fileName = file.name.substring( - 0, - file.name.lastIndexOf(".") - ); - ctrl.media.mediaFile.extension = file.name.substring( - file.name.lastIndexOf(".") - ); - ctrl.getBase64(file); - // if (file.size < 100000) { - // var msg = "Please choose a better photo (larger than 100kb)!"; - // $rootScope.showConfirm(ctrl, null, [], null, null, msg); - // } else { - // } + var _getModuleData = async function (moduleId, id, type) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + moduleId + "/" + id; + } else { + url += "/" + moduleId; } - }; - ctrl.loadBase64 = function (url) { - var ext = url.substring(url.lastIndexOf(".") + 1); - $http({ + var req = { method: "GET", url: url, - responseType: "arraybuffer", - }).then(function (resp) { - var base64 = `data:image/${ext};base64,${ctrl._arrayBufferToBase64( - resp.data - )}`; - var image = new Image(); - image.src = base64; - image.onload = function () { - // access image size here - ctrl.originW = this.width; - ctrl.originH = this.height; + }; + return await apiService.getApiResult(req); + }; - ctrl.loadImageSize(this.width, this.height); - ctrl.cropped.source = base64; - $scope.$apply(); - }; - return base64; - }); + var _getModuleDatas = async function (request) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "POST", + url: apiUrl + "list", + data: JSON.stringify(request), + }; + + return await apiService.getApiResult(req); }; - ctrl.getBase64 = function (file) { - if (file !== null) { - $rootScope.isBusy = true; - var reader = new FileReader(); - reader.readAsDataURL(file); - // ctrl.cropped.source = null; - reader.onload = function () { - if (ctrl.media.mediaFile) { - ctrl.media.mediaFile.fileName = file.name.substring( - 0, - file.name.lastIndexOf(".") - ); - ctrl.media.mediaFile.extension = file.name.substring( - file.name.lastIndexOf(".") - ); - // ctrl.postedFile.fileStream = reader.result; - } - var image = new Image(); - image.src = reader.result; - image.onload = function () { - // access image size here - ctrl.originW = this.width; - ctrl.originH = this.height; - ctrl.loadImageSize(this.width, this.height); - ctrl.cropped.source = reader.result; - $rootScope.isBusy = false; - $scope.$apply(); - }; - }; - reader.onerror = function (error) { - $rootScope.isBusy = false; - $rootScope.showErrors([error]); - }; - } else { - return null; - } + var _exportModuleData = async function (request) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "POST", + url: apiUrl + "export", + data: JSON.stringify(request), + }; + + return await apiService.getApiResult(req); }; - ctrl.loadImageSize = function (w, h) { - // const maxW = ctrl.w + 100; - w = w || ctrl.originW; - h = h || ctrl.originH; - var rto = w / h; - ctrl.rto = ctrl.rto || rto; - ctrl.w = ctrl.w || w; - ctrl.h = ctrl.w / ctrl.rto; - ctrl.options = { - boundary: { height: ctrl.maxW / rto, width: ctrl.maxW }, - render: { height: ctrl.maxW / rto, width: ctrl.maxW }, - output: { height: ctrl.h, width: ctrl.h * ctrl.rto }, + + var _initModuleForm = async function (name) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "GET", + url: apiUrl + "init-by-name/" + name, + }; + + return await apiService.getApiResult(req); + }; + + var _removeModuleData = async function (id) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "GET", + url: apiUrl + "delete/" + id, }; - ctrl.loadViewport(); + return await apiService.getApiResult(req); }; - ctrl.loadViewport = function () { - if (ctrl.w && ctrl.h) { - ctrl.rto = ctrl.w / ctrl.h; - let w = ctrl.w > ctrl.maxW ? ctrl.maxW * 0.6 : ctrl.w * 0.6; - let h = w / ctrl.rto; - if (w > ctrl.options.boundary.width) { - w = ctrl.options.boundary.width; - h = w / ctrl.rto; - } - ctrl.options.viewport = { - height: h, - width: w, - }; - } + + var _saveModuleData = async function (moduleData) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(moduleData), + }; + return await apiService.getApiResult(req); }; - } -); + var _saveFields = async function (id, propertyName, propertyValue) { + var apiUrl = "/" + $rootScope.localizeSettings.lang + "/module-data/"; + var column = [ + { + propertyName: propertyName, + propertyValue: propertyValue, + }, + ]; + var req = { + method: "POST", + url: apiUrl + "save/" + id, + data: JSON.stringify(column), + }; + return await apiService.getApiResult(req); + }; + moduleDatasServiceFactory.getModuleData = _getModuleData; + moduleDatasServiceFactory.getModuleDatas = _getModuleDatas; + moduleDatasServiceFactory.exportModuleData = _exportModuleData; + moduleDatasServiceFactory.removeModuleData = _removeModuleData; + moduleDatasServiceFactory.saveModuleData = _saveModuleData; + moduleDatasServiceFactory.initModuleForm = _initModuleForm; + moduleDatasServiceFactory.saveFields = _saveFields; + moduleDatasServiceFactory.updateInfos = _updateInfos; + return moduleDatasServiceFactory; + }, +]); sharedComponents.component("moduleDataPreview", { templateUrl: @@ -7670,31 +7695,6 @@ sharedComponents.component("moduleDataPreview", { }, }); -// sharedComponents.component('modalConfirm', { -// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', -// controller: ModalConfirmController, -// bindings: { -// message: '=' -// } -// }); -function ModalConfirmController($rootScope, $scope, $mdDialog, message) { - $scope.message = message; - $scope.executeFunctionByName = async function (functionName, args, context) { - var result = await $rootScope.executeFunctionByName( - functionName, - args, - context - ); - if (result) { - $scope.$apply(); - } - $mdDialog.hide(); - }; - $scope.closeDialog = function () { - $mdDialog.hide(); - }; -} - sharedComponents.component("moduleForm", { templateUrl: "/mix-app/views/app-shared/components/module-form/view.html", bindings: { @@ -7819,7 +7819,7 @@ sharedComponents.component("moduleForm", { } else { var msg = $rootScope.translate("success"); $rootScope.showMessage(msg, "success"); - ctrl.initModuleForm(); + // ctrl.initModuleForm(); $rootScope.isBusy = false; $scope.$apply(); } @@ -7885,6 +7885,30 @@ sharedComponents.component("moduleFormEditor", { ], }); +sharedComponents.component("mixPaging", { + templateUrl: "/mix-app/views/app-shared/components/paging/paging.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.loadData = function (index) { + ctrl.pagingAction({ pageIndex: index }); + }; + ctrl.range = $rootScope.range; + }, + ], + bindings: { + data: "=", + activeClass: "=", + ulClass: "=", + page: "=", + pageSize: "=", + total: "=", + totalPage: "=", + pagingAction: "&", + }, +}); + sharedComponents.component("modulePreview", { templateUrl: "/mix-app/views/app-shared/components/module-preview/view.html", controller: [ @@ -7932,28 +7956,49 @@ sharedComponents.component("modulePreview", { }, }); -sharedComponents.component("mixPaging", { - templateUrl: "/mix-app/views/app-shared/components/paging/paging.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.loadData = function (index) { - ctrl.pagingAction({ pageIndex: index }); +"use trick"; +sharedComponents.directive("pill", function () { + return { + require: "^pills", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("pills", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); }; - ctrl.range = $rootScope.range; }, - ], - bindings: { - data: "=", - activeClass: "=", - ulClass: "=", - page: "=", - pageSize: "=", - total: "=", - totalPage: "=", - pagingAction: "&", - }, + templateUrl: "/mix-app/views/app-shared/components/pills/pills.html", + replace: true, + }; }); sharedComponents.component("portalSearch", { @@ -8021,49 +8066,56 @@ sharedComponents.component("previewPopup", { }, }); -"use trick"; -sharedComponents.directive("pill", function () { - return { - require: "^pills", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("pills", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; +sharedComponents.component("recaptcha", { + templateUrl: "/mix-app/views/app-shared/components/recaptcha/recaptcha.html", + controller: [ + "$rootScope", + "ApiService", + "CommonService", + function ($rootScope, apiService, commonService) { + var ctrl = this; + ctrl.shortenString = ""; + ctrl.previousContentId = undefined; + ctrl.recaptcha_key = null; + ctrl.token = null; + this.$onInit = () => { + ctrl.recaptcha_key = $rootScope.globalSettings.data.Recaptcha_Key; + ctrl.recaptcha_secret = $rootScope.globalSettings.data.Recaptcha_Secret; + grecaptcha.ready(function () { + grecaptcha + .execute(ctrl.recaptcha_key, { action: ctrl.action }) + .then(function (token) { + ctrl.token = token; + }); }); - pane.selected = true; - this.selectCallback({ pane: pane }); }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); + ctrl.verify = function () { + var url = "https://www.google.com/recaptcha/api/siteverify"; + var data = { + secret: ctrl.recaptcha_secret, + response: ctrl.token, + }; + var req = { + method: "POST", + url: url, + data: data, + }; + return apiService.getApiResult(req).then(function (response) { + if (response.success) { + ctrl.callback(); + } else { + angular.forEach(response.error - codes, function (err) { + commonService.showAlertMsg("Recaptcha Error", err); + }); + } + }); }; }, - templateUrl: "/mix-app/views/app-shared/components/pills/pills.html", - replace: true, - }; + ], + bindings: { + action: "=", + callback: "&", + }, }); sharedComponents.component("qrCode", { @@ -8186,58 +8238,6 @@ sharedComponents.component("quillEditor", { }, }); -sharedComponents.component("recaptcha", { - templateUrl: "/mix-app/views/app-shared/components/recaptcha/recaptcha.html", - controller: [ - "$rootScope", - "ApiService", - "CommonService", - function ($rootScope, apiService, commonService) { - var ctrl = this; - ctrl.shortenString = ""; - ctrl.previousContentId = undefined; - ctrl.recaptcha_key = null; - ctrl.token = null; - this.$onInit = () => { - ctrl.recaptcha_key = $rootScope.globalSettings.data.Recaptcha_Key; - ctrl.recaptcha_secret = $rootScope.globalSettings.data.Recaptcha_Secret; - grecaptcha.ready(function () { - grecaptcha - .execute(ctrl.recaptcha_key, { action: ctrl.action }) - .then(function (token) { - ctrl.token = token; - }); - }); - }; - ctrl.verify = function () { - var url = "https://www.google.com/recaptcha/api/siteverify"; - var data = { - secret: ctrl.recaptcha_secret, - response: ctrl.token, - }; - var req = { - method: "POST", - url: url, - data: data, - }; - return apiService.getApiResult(req).then(function (response) { - if (response.success) { - ctrl.callback(); - } else { - angular.forEach(response.error - codes, function (err) { - commonService.showAlertMsg("Recaptcha Error", err); - }); - } - }); - }; - }, - ], - bindings: { - action: "=", - callback: "&", - }, -}); - sharedComponents.component("serviceHub", { templateUrl: "/mix-app/views/app-shared/components/service-hub/view.html", bindings: { @@ -8421,15 +8421,6 @@ sharedComponents.component("serviceHub", { ], }); -sharedComponents.component("codeEditor", { - templateUrl: "codeEditor.html", - bindings: { - product: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - sharedComponents.component("snowy", { templateUrl: "/mix-app/views/app-shared/components/snowy/index.html", controller: [ @@ -8552,6 +8543,15 @@ sharedComponents.component("snowy", { bindings: {}, }); +sharedComponents.component("codeEditor", { + templateUrl: "codeEditor.html", + bindings: { + product: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + sharedComponents.component("starRating", { templateUrl: "/mix-app/views/app-shared/components/star-rating/star-rating.html", @@ -9093,58 +9093,6 @@ sharedComponents.component("trumbowyg", { ], }); -sharedComponents.component("tuiEditor", { - templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", - controller: [ - "$rootScope", - "$scope", - "$element", - "ngAppSettings", - function ($rootScope, $scope, $element, ngAppSettings) { - var ctrl = this; - ctrl.previousId = null; - ctrl.editor = null; - ctrl.init = function () { - ctrl.guid = $rootScope.generateUUID(); - setTimeout(() => { - ctrl.editor = new tui.Editor({ - el: document.querySelector("#tui-" + ctrl.guid), - initialEditType: "markdown", - previewStyle: "vertical", - height: "300px", - initialValue: ctrl.content, - events: { - // change: ctrl.updateContent, - // focus: () => onFocus(), - blur: () => ctrl.updateContent(), - }, - }); - ctrl.toolbar = ctrl.editor.getUI().getToolbar(); - ctrl.toolbar.addButton( - { - name: "fullscreen", - tooltip: "fullscreen", - $el: $( - '' - ), - }, - 1 - ); - }, 100); - }; - window.fsClick = function () { - $(".tui-editor-defaultUI").toggleClass("fs"); - }; - ctrl.updateContent = function () { - ctrl.content = ctrl.editor.getMarkdown(); - }; - }, - ], - bindings: { - content: "=", - }, -}); - sharedComponents.component("uploadCroppie", { templateUrl: "/mix-app/views/app-shared/components/upload-croppie/view.html?v=1", @@ -9377,6 +9325,99 @@ sharedComponents.component("uploadCroppie", { ], }); +sharedComponents.component("tuiEditor", { + templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", + controller: [ + "$rootScope", + "$scope", + "$element", + "ngAppSettings", + function ($rootScope, $scope, $element, ngAppSettings) { + var ctrl = this; + ctrl.previousId = null; + ctrl.editor = null; + ctrl.init = function () { + ctrl.guid = $rootScope.generateUUID(); + setTimeout(() => { + ctrl.editor = new tui.Editor({ + el: document.querySelector("#tui-" + ctrl.guid), + initialEditType: "markdown", + previewStyle: "vertical", + height: "300px", + initialValue: ctrl.content, + events: { + // change: ctrl.updateContent, + // focus: () => onFocus(), + blur: () => ctrl.updateContent(), + }, + }); + ctrl.toolbar = ctrl.editor.getUI().getToolbar(); + ctrl.toolbar.addButton( + { + name: "fullscreen", + tooltip: "fullscreen", + $el: $( + '' + ), + }, + 1 + ); + }, 100); + }; + window.fsClick = function () { + $(".tui-editor-defaultUI").toggleClass("fs"); + }; + ctrl.updateContent = function () { + ctrl.content = ctrl.editor.getMarkdown(); + }; + }, + ], + bindings: { + content: "=", + }, +}); + +sharedComponents.component("youtubeEditor", { + templateUrl: + "/mix-app/views/app-shared/components/youtube-editor/youtube-editor.html", + controller: [ + "$rootScope", + "$scope", + "$sce", + function ($rootScope, $scope, $sce) { + var ctrl = this; + ctrl.isPlay = false; + ctrl.loadVideo = function () { + ctrl.isPlay = false; + ctrl.src = ""; + if (ctrl.code) { + ctrl.img = + "https://img.youtube.com/vi/" + ctrl.code + "/sddefault.jpg"; + } + }; + ctrl.playVideo = function () { + ctrl.isPlay = true; + ctrl.src = $sce.trustAsResourceUrl( + "https://www.youtube.com/embed/" + + ctrl.code + + "?rel=0&showinfo=0&autoplay=1" + ); + }; + ctrl.searchVideo = function () { + // search + $rootScope.preview( + "message", + "ToDo: Integrate youtube search (https://developers.google.com/youtube/v3/docs/search/list) \r\n PATH: portal-app/app/app-shared/components/youtube-editor/youtube-editor.js" + ); + }; + }, + ], + bindings: { + code: "=", + hideInput: "=?", + }, +}); + "use strict"; appShared.controller("VideoCallController", [ "$scope", @@ -9710,47 +9751,6 @@ sharedComponents.component("videoCall", { }, }); -sharedComponents.component("youtubeEditor", { - templateUrl: - "/mix-app/views/app-shared/components/youtube-editor/youtube-editor.html", - controller: [ - "$rootScope", - "$scope", - "$sce", - function ($rootScope, $scope, $sce) { - var ctrl = this; - ctrl.isPlay = false; - ctrl.loadVideo = function () { - ctrl.isPlay = false; - ctrl.src = ""; - if (ctrl.code) { - ctrl.img = - "https://img.youtube.com/vi/" + ctrl.code + "/sddefault.jpg"; - } - }; - ctrl.playVideo = function () { - ctrl.isPlay = true; - ctrl.src = $sce.trustAsResourceUrl( - "https://www.youtube.com/embed/" + - ctrl.code + - "?rel=0&showinfo=0&autoplay=1" - ); - }; - ctrl.searchVideo = function () { - // search - $rootScope.preview( - "message", - "ToDo: Integrate youtube search (https://developers.google.com/youtube/v3/docs/search/list) \r\n PATH: portal-app/app/app-shared/components/youtube-editor/youtube-editor.js" - ); - }; - }, - ], - bindings: { - code: "=", - hideInput: "=?", - }, -}); - /*! * angular-loading-bar v0.9.0 * https://chieffancypants.github.io/angular-loading-bar From 7c8aecba153b5dc496eaafc76ece9bd73982d1a3 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Sun, 22 Aug 2021 19:36:47 +0700 Subject: [PATCH 07/83] fix postgresql db --- ...7193422_UpdateAdditionalDbName.Designer.cs | 2521 ----------------- .../20210807193422_UpdateAdditionalDbName.cs | 44 - .../PostgresqlMixCmsContextModelSnapshot.cs | 216 +- 3 files changed, 108 insertions(+), 2673 deletions(-) delete mode 100644 src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.Designer.cs delete mode 100644 src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.cs diff --git a/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.Designer.cs b/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.Designer.cs deleted file mode 100644 index 12557b6c2..000000000 --- a/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.Designer.cs +++ /dev/null @@ -1,2521 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Mix.Cms.Lib.Models.Cms; - -namespace Mix.Cms.Lib.Migrations.PostgresqlMixCms -{ - [DbContext(typeof(PostgresqlMixCmsContext))] - [Migration("20210807193422_UpdateAdditionalDbName")] - partial class UpdateDbName - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.8") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixCmsUser", b => - { - b.Property("Id") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Address") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Avatar") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Email") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FirstName") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("LastName") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("MiddleName") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("PhoneNumber") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Username") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.ToTable("mix_cms_user"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixConfiguration", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Category") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("DataType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Keyword") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Value") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_configuration"); - - b.HasIndex("Specificulture"); - - b.ToTable("mix_configuration"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixCulture", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Alias") - .HasColumnType("varchar(150)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FullName") - .HasColumnType("varchar(150)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Icon") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("Lcid") - .HasColumnType("varchar(50)") - .HasColumnName("LCID") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Specificulture") - .IsRequired() - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.HasIndex("Specificulture") - .IsUnique() - .HasDatabaseName("IX_Mix_Culture"); - - b.ToTable("mix_culture"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixDatabase", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EdmAutoSend") - .HasColumnType("boolean"); - - b.Property("EdmFrom") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EdmSubject") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EdmTemplate") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FormTemplate") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Name") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Title") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Type") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.ToTable("mix_database"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixDatabaseColumn", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Configurations") - .HasColumnType("nvarchar(max)"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("DataType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("DefaultValue") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("IsEncrypt") - .HasColumnType("boolean"); - - b.Property("IsMultiple") - .HasColumnType("boolean"); - - b.Property("IsRequire") - .HasColumnType("boolean"); - - b.Property("IsSelect") - .HasColumnType("boolean"); - - b.Property("IsUnique") - .HasColumnType("boolean"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("MixDatabaseId") - .HasColumnType("int"); - - b.Property("MixDatabaseName") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Name") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Options") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("ReferenceId") - .HasColumnType("int"); - - b.Property("Regex") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Title") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.HasIndex("MixDatabaseId"); - - b.HasIndex("ReferenceId"); - - b.ToTable("mix_database_column"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixDatabaseData", b => - { - b.Property("Id") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("MixDatabaseId") - .HasColumnType("int"); - - b.Property("MixDatabaseName") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_database_data"); - - b.HasIndex("MixDatabaseId"); - - b.ToTable("mix_database_data"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixDatabaseDataAssociation", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("DataId") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Description") - .HasColumnType("varchar(450)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("MixDatabaseId") - .HasColumnType("int"); - - b.Property("MixDatabaseName") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ParentId") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ParentType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_database_data_association"); - - b.ToTable("mix_database_data_association"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixDatabaseDataValue", b => - { - b.Property("Id") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("BooleanValue") - .HasColumnType("boolean"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("DataId") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("DataType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("DateTimeValue") - .HasColumnType("timestamp without time zone"); - - b.Property("DoubleValue") - .HasColumnType("float"); - - b.Property("EditorType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("varchar(50)") - .HasDefaultValue("Html") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EditorValue") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EncryptKey") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EncryptType") - .HasColumnType("int"); - - b.Property("EncryptValue") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("IntegerValue") - .HasColumnType("int"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("MixDatabaseColumnId") - .HasColumnType("int"); - - b.Property("MixDatabaseColumnName") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("MixDatabaseName") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Regex") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("StringValue") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_database_data_value"); - - b.HasIndex("DataId"); - - b.ToTable("mix_database_data_value"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixFile", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Extension") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileFolder") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FolderType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("StringContent") - .IsRequired() - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ThemeId") - .HasColumnType("int"); - - b.Property("ThemeName") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.HasIndex("ThemeId"); - - b.ToTable("mix_file"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixLanguage", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Category") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("DataType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("DefaultValue") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Keyword") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Value") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_language"); - - b.HasIndex("Specificulture"); - - b.ToTable("mix_language"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixMedia", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Extension") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileFolder") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileProperties") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileSize") - .HasColumnType("bigint"); - - b.Property("FileType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Source") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Tags") - .HasColumnType("varchar(400)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("TargetUrl") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Title") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PRIMARY"); - - b.ToTable("mix_media"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModule", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EditorType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("varchar(50)") - .HasDefaultValue("Html") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EditorValue") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EdmTemplate") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Fields") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FormTemplate") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Name") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("PageSize") - .HasColumnType("int"); - - b.Property("PostType") - .HasColumnType("nvarchar(max)"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Template") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Thumbnail") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Title") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Type") - .HasColumnType("int"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_module"); - - b.HasIndex("Specificulture"); - - b.ToTable("mix_module"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModuleData", b => - { - b.Property("Id") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Fields") - .IsRequired() - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModuleId") - .HasColumnType("int"); - - b.Property("PageId") - .HasColumnType("int"); - - b.Property("PostId") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Value") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_module_data"); - - b.HasIndex("ModuleId", "Specificulture"); - - b.HasIndex("PageId", "Specificulture"); - - b.HasIndex("PostId", "Specificulture"); - - b.HasIndex("ModuleId", "PageId", "Specificulture"); - - b.ToTable("mix_module_data"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModulePost", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModuleId") - .HasColumnType("int"); - - b.Property("PostId") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_module_post"); - - b.HasIndex("ModuleId", "Specificulture"); - - b.HasIndex("PostId", "Specificulture"); - - b.ToTable("mix_module_post"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPage", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Content") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("CssClass") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EditorType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("varchar(50)") - .HasDefaultValue("Html") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EditorValue") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Excerpt") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ExtraFields") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Icon") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("Layout") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Level") - .HasColumnType("int"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("PageSize") - .HasColumnType("int"); - - b.Property("PostType") - .HasColumnType("nvarchar(max)"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("SeoDescription") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("SeoKeywords") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("SeoName") - .HasColumnType("varchar(500)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("SeoTitle") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("StaticUrl") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Tags") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Template") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Title") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Type") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Views") - .HasColumnType("int"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_page"); - - b.HasIndex("Specificulture"); - - b.ToTable("mix_page"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPageModule", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModuleId") - .HasColumnType("int"); - - b.Property("PageId") - .HasColumnType("int"); - - b.Property("Position") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_page_module"); - - b.HasIndex("ModuleId", "Specificulture"); - - b.HasIndex("PageId", "Specificulture"); - - b.ToTable("mix_page_module"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPagePost", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("PageId") - .HasColumnType("int"); - - b.Property("PostId") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_page_post"); - - b.HasIndex("PageId", "Specificulture"); - - b.HasIndex("PostId", "Specificulture"); - - b.ToTable("mix_page_post"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPortalPage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(450)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Icon") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("Level") - .HasColumnType("int"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("TextDefault") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("TextKeyword") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Url") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.ToTable("mix_portal_page"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPortalPageNavigation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("PageId") - .HasColumnType("int"); - - b.Property("ParentId") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.HasIndex("PageId") - .HasDatabaseName("FK_mix_portal_page_navigation_mix_portal_page"); - - b.HasIndex("ParentId"); - - b.ToTable("mix_portal_page_navigation"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPortalPageRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreatedBy") - .HasMaxLength(50) - .IsUnicode(false) - .HasColumnType("varchar(50)"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasMaxLength(50) - .IsUnicode(false) - .HasColumnType("varchar(50)"); - - b.Property("PageId") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("RoleId") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("Status") - .IsRequired() - .HasMaxLength(50) - .IsUnicode(false) - .HasColumnType("varchar(50)"); - - b.HasKey("Id") - .HasName("PK_mix_portal_page_role"); - - b.HasIndex("PageId"); - - b.ToTable("mix_portal_page_role"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPost", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Content") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("EditorType") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("varchar(50)") - .HasDefaultValue("Html") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("EditorValue") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Excerpt") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ExtraFields") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ExtraProperties") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Icon") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("PublishedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("SeoDescription") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("SeoKeywords") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("SeoName") - .HasColumnType("varchar(500)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("SeoTitle") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Source") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Tags") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Template") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Thumbnail") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Title") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Type") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Views") - .HasColumnType("int"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_post"); - - b.HasIndex("Specificulture"); - - b.ToTable("mix_post"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostAssociation", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(450)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("DestinationId") - .HasColumnType("int"); - - b.Property("Image") - .HasColumnType("varchar(450)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("SourceId") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_post_association"); - - b.HasIndex("DestinationId", "Specificulture"); - - b.HasIndex("SourceId", "Specificulture"); - - b.ToTable("mix_post_association"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostMedia", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("MediaId") - .HasColumnType("int"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Position") - .HasColumnType("int"); - - b.Property("PostId") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_post_media"); - - b.HasIndex("MediaId", "Specificulture"); - - b.HasIndex("PostId", "Specificulture"); - - b.ToTable("mix_post_media"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostModule", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModuleId") - .HasColumnType("int"); - - b.Property("Position") - .HasColumnType("int"); - - b.Property("PostId") - .HasColumnType("int"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_post_module"); - - b.HasIndex("ModuleId", "Specificulture"); - - b.HasIndex("PostId", "Specificulture"); - - b.ToTable("mix_post_module"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixTemplate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Content") - .IsRequired() - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Extension") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileFolder") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FileName") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("FolderType") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("MobileContent") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Scripts") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("SpaContent") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Styles") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("ThemeId") - .HasColumnType("int"); - - b.Property("ThemeName") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.HasIndex("ThemeId") - .HasDatabaseName("IX_mix_template_file_TemplateId"); - - b.ToTable("mix_template"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixTheme", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Image") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Name") - .IsRequired() - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("PreviewUrl") - .HasColumnType("varchar(450)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Thumbnail") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Title") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.HasKey("Id"); - - b.ToTable("mix_theme"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixUrlAlias", b => - { - b.Property("Id") - .HasColumnType("int"); - - b.Property("Specificulture") - .HasColumnType("varchar(10)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Alias") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("CreatedDateTime") - .HasColumnType("timestamp without time zone"); - - b.Property("Description") - .HasColumnType("text") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("LastModified") - .HasColumnType("timestamp without time zone"); - - b.Property("ModifiedBy") - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Priority") - .HasColumnType("int"); - - b.Property("SourceId") - .HasColumnType("varchar(250)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Status") - .IsRequired() - .HasColumnType("varchar(50)") - .UseCollation("und-x-icu") - .HasAnnotation("MySql:CharSet", "utf8"); - - b.Property("Type") - .HasColumnType("int"); - - b.HasKey("Id", "Specificulture") - .HasName("PK_mix_url_alias"); - - b.HasIndex("Specificulture"); - - b.ToTable("mix_url_alias"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixConfiguration", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixCulture", "SpecificultureNavigation") - .WithMany("MixConfiguration") - .HasForeignKey("Specificulture") - .HasConstraintName("FK_Mix_Configuration_Mix_Culture") - .HasPrincipalKey("Specificulture") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("SpecificultureNavigation"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixDatabaseData", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixDatabase", "MixDatabase") - .WithMany() - .HasForeignKey("MixDatabaseId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("MixDatabase"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixFile", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixTheme", "Theme") - .WithMany("MixFile") - .HasForeignKey("ThemeId") - .HasConstraintName("FK_mix_file_mix_template"); - - b.Navigation("Theme"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixLanguage", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixCulture", "SpecificultureNavigation") - .WithMany("MixLanguage") - .HasForeignKey("Specificulture") - .HasConstraintName("FK_Mix_Language_Mix_Culture") - .HasPrincipalKey("Specificulture") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("SpecificultureNavigation"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModule", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixCulture", "SpecificultureNavigation") - .WithMany("MixModule") - .HasForeignKey("Specificulture") - .HasConstraintName("FK_Mix_Module_Mix_Culture") - .HasPrincipalKey("Specificulture") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("SpecificultureNavigation"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModuleData", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixModule", "MixModule") - .WithMany("MixModuleData") - .HasForeignKey("ModuleId", "Specificulture") - .HasConstraintName("FK_Mix_Module_Data_Mix_Module") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPage", "MixPage") - .WithMany("MixModuleData") - .HasForeignKey("PageId", "Specificulture") - .HasConstraintName("FK_mix_module_data_mix_page"); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPost", "MixPost") - .WithMany("MixModuleData") - .HasForeignKey("PostId", "Specificulture") - .HasConstraintName("FK_mix_module_data_mix_post"); - - b.Navigation("MixModule"); - - b.Navigation("MixPage"); - - b.Navigation("MixPost"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModulePost", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixModule", "MixModule") - .WithMany("MixModulePost") - .HasForeignKey("ModuleId", "Specificulture") - .HasConstraintName("FK_Mix_Module_Post_Mix_Module") - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPost", "MixPost") - .WithMany("MixModulePost") - .HasForeignKey("PostId", "Specificulture") - .HasConstraintName("FK_Mix_Module_Post_Mix_Post") - .IsRequired(); - - b.Navigation("MixModule"); - - b.Navigation("MixPost"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPage", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixCulture", "SpecificultureNavigation") - .WithMany("MixPage") - .HasForeignKey("Specificulture") - .HasConstraintName("FK_Mix_Page_Mix_Culture") - .HasPrincipalKey("Specificulture") - .IsRequired(); - - b.Navigation("SpecificultureNavigation"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPageModule", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixModule", "MixModule") - .WithMany("MixPageModule") - .HasForeignKey("ModuleId", "Specificulture") - .HasConstraintName("FK_Mix_Menu_Module_Mix_Module1") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPage", "MixPage") - .WithMany("MixPageModule") - .HasForeignKey("PageId", "Specificulture") - .HasConstraintName("FK_Mix_Page_Module_Mix_Page") - .IsRequired(); - - b.Navigation("MixModule"); - - b.Navigation("MixPage"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPagePost", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPage", "MixPage") - .WithMany("MixPagePost") - .HasForeignKey("PageId", "Specificulture") - .HasConstraintName("FK_Mix_Page_Post_Mix_Page") - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPost", "MixPost") - .WithMany("MixPagePost") - .HasForeignKey("PostId", "Specificulture") - .HasConstraintName("FK_Mix_Page_Post_Mix_Post") - .IsRequired(); - - b.Navigation("MixPage"); - - b.Navigation("MixPost"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPortalPageNavigation", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPortalPage", "Page") - .WithMany("MixPortalPageNavigationPage") - .HasForeignKey("PageId") - .HasConstraintName("FK_mix_portal_page_navigation_mix_portal_page") - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPortalPage", "Parent") - .WithMany("MixPortalPageNavigationParent") - .HasForeignKey("ParentId") - .HasConstraintName("FK_mix_portal_page_navigation_mix_portal_page1") - .IsRequired(); - - b.Navigation("Page"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPortalPageRole", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPortalPage", "Page") - .WithMany("MixPortalPageRole") - .HasForeignKey("PageId") - .HasConstraintName("FK_mix_portal_page_role_mix_portal_page") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Page"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPost", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixCulture", "SpecificultureNavigation") - .WithMany("MixPost") - .HasForeignKey("Specificulture") - .HasConstraintName("FK_Mix_Post_Mix_Culture") - .HasPrincipalKey("Specificulture") - .IsRequired(); - - b.Navigation("SpecificultureNavigation"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostAssociation", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPost", "MixPost") - .WithMany("MixRelatedPostMixPost") - .HasForeignKey("DestinationId", "Specificulture") - .HasConstraintName("FK_mix_post_association_mix_post1") - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPost", "S") - .WithMany("MixRelatedPostS") - .HasForeignKey("SourceId", "Specificulture") - .HasConstraintName("FK_mix_post_association_mix_post") - .IsRequired(); - - b.Navigation("MixPost"); - - b.Navigation("S"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostMedia", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixMedia", "MixMedia") - .WithMany("MixPostMedia") - .HasForeignKey("MediaId", "Specificulture") - .HasConstraintName("FK_mix_post_media_mix_media") - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPost", "MixPost") - .WithMany("MixPostMedia") - .HasForeignKey("PostId", "Specificulture") - .HasConstraintName("FK_mix_post_media_mix_post") - .IsRequired(); - - b.Navigation("MixMedia"); - - b.Navigation("MixPost"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostModule", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixModule", "MixModule") - .WithMany("MixPostModule") - .HasForeignKey("ModuleId", "Specificulture") - .HasConstraintName("FK_Mix_Post_Module_Mix_Module1") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Mix.Cms.Lib.Models.Cms.MixPost", "MixPost") - .WithMany("MixPostModule") - .HasForeignKey("PostId", "Specificulture") - .HasConstraintName("FK_Mix_Post_Module_Mix_Post") - .IsRequired(); - - b.Navigation("MixModule"); - - b.Navigation("MixPost"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixTemplate", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixTheme", "Theme") - .WithMany("MixTemplate") - .HasForeignKey("ThemeId") - .HasConstraintName("FK_mix_template_mix_theme") - .IsRequired(); - - b.Navigation("Theme"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixUrlAlias", b => - { - b.HasOne("Mix.Cms.Lib.Models.Cms.MixCulture", "SpecificultureNavigation") - .WithMany("MixUrlAlias") - .HasForeignKey("Specificulture") - .HasConstraintName("FK_Mix_Url_Alias_Mix_Culture") - .HasPrincipalKey("Specificulture") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("SpecificultureNavigation"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixCulture", b => - { - b.Navigation("MixConfiguration"); - - b.Navigation("MixLanguage"); - - b.Navigation("MixModule"); - - b.Navigation("MixPage"); - - b.Navigation("MixPost"); - - b.Navigation("MixUrlAlias"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixMedia", b => - { - b.Navigation("MixPostMedia"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModule", b => - { - b.Navigation("MixModuleData"); - - b.Navigation("MixModulePost"); - - b.Navigation("MixPageModule"); - - b.Navigation("MixPostModule"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPage", b => - { - b.Navigation("MixModuleData"); - - b.Navigation("MixPageModule"); - - b.Navigation("MixPagePost"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPortalPage", b => - { - b.Navigation("MixPortalPageNavigationPage"); - - b.Navigation("MixPortalPageNavigationParent"); - - b.Navigation("MixPortalPageRole"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPost", b => - { - b.Navigation("MixModuleData"); - - b.Navigation("MixModulePost"); - - b.Navigation("MixPagePost"); - - b.Navigation("MixPostMedia"); - - b.Navigation("MixPostModule"); - - b.Navigation("MixRelatedPostMixPost"); - - b.Navigation("MixRelatedPostS"); - }); - - modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixTheme", b => - { - b.Navigation("MixFile"); - - b.Navigation("MixTemplate"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.cs b/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.cs deleted file mode 100644 index ba20d04f5..000000000 --- a/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/20210807193422_UpdateAdditionalDbName.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Mix.Cms.Lib.Migrations.PostgresqlMixCms -{ - public partial class UpdateDbName : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.Sql(@"UPDATE mix_database SET Name='sys_additional_column_page' WHERE Name='sys_additional_field_page'"); - migrationBuilder.Sql(@"UPDATE mix_database SET Name='sys_additional_column_post' WHERE Name='sys_additional_field_post'"); - migrationBuilder.Sql(@"UPDATE mix_database SET Name='sys_additional_column_module' WHERE Name='sys_additional_field_module'"); - migrationBuilder.Sql(@"UPDATE mix_database SET Name='sys_additional_column' WHERE Name='sys_additional_field'"); - - migrationBuilder.Sql(@"UPDATE mix_database_data SET MixDatabaseName='sys_additional_column_page' WHERE MixDatabaseName='sys_additional_field_page'"); - migrationBuilder.Sql(@"UPDATE mix_database_data SET MixDatabaseName='sys_additional_column_post' WHERE MixDatabaseName='sys_additional_field_post'"); - migrationBuilder.Sql(@"UPDATE mix_database_data SET MixDatabaseName='sys_additional_column_module' WHERE MixDatabaseName='sys_additional_field_module'"); - migrationBuilder.Sql(@"UPDATE mix_database_data SET MixDatabaseName='sys_additional_column' WHERE MixDatabaseName='sys_additional_field'"); - - migrationBuilder.Sql(@"UPDATE mix_database_data_association SET MixDatabaseName='sys_additional_column_page' WHERE MixDatabaseName='sys_additional_field_page'"); - migrationBuilder.Sql(@"UPDATE mix_database_data_association SET MixDatabaseName='sys_additional_column_post' WHERE MixDatabaseName='sys_additional_field_post'"); - migrationBuilder.Sql(@"UPDATE mix_database_data_association SET MixDatabaseName='sys_additional_column_module' WHERE MixDatabaseName='sys_additional_field_module'"); - migrationBuilder.Sql(@"UPDATE mix_database_data_association SET MixDatabaseName='sys_additional_column' WHERE MixDatabaseName='sys_additional_field'"); - - migrationBuilder.Sql(@"UPDATE mix_database_column SET MixDatabaseName='sys_additional_column_page' WHERE MixDatabaseName='sys_additional_field_page'"); - migrationBuilder.Sql(@"UPDATE mix_database_column SET MixDatabaseName='sys_additional_column_post' WHERE MixDatabaseName='sys_additional_field_post'"); - migrationBuilder.Sql(@"UPDATE mix_database_column SET MixDatabaseName='sys_additional_column_module' WHERE MixDatabaseName='sys_additional_field_module'"); - migrationBuilder.Sql(@"UPDATE mix_database_column SET MixDatabaseName='sys_additional_column' WHERE MixDatabaseName='sys_additional_field'"); - - migrationBuilder.Sql(@"UPDATE mix_database_column SET Name='databaseName' WHERE MixDatabaseName='post_type' AND Name='mix_database_name'"); - - migrationBuilder.Sql(@"UPDATE mix_database_data_value SET MixDatabaseName='sys_additional_column_page' WHERE MixDatabaseName='sys_additional_field_page'"); - migrationBuilder.Sql(@"UPDATE mix_database_data_value SET MixDatabaseName='sys_additional_column_post' WHERE MixDatabaseName='sys_additional_field_post'"); - migrationBuilder.Sql(@"UPDATE mix_database_data_value SET MixDatabaseName='sys_additional_column_module' WHERE MixDatabaseName='sys_additional_field_module'"); - migrationBuilder.Sql(@"UPDATE mix_database_data_value SET MixDatabaseName='sys_additional_column' WHERE MixDatabaseName='sys_additional_field'"); - - migrationBuilder.Sql(@"UPDATE mix_post SET Type='sys_additional_column_post' WHERE Type='sys_additional_field_post'"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - - } - } -} diff --git a/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/PostgresqlMixCmsContextModelSnapshot.cs b/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/PostgresqlMixCmsContextModelSnapshot.cs index 16556a39b..082be0894 100644 --- a/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/PostgresqlMixCmsContextModelSnapshot.cs +++ b/src/Mix.Cms.Lib/Migrations/PostgresqlMixCms/PostgresqlMixCmsContextModelSnapshot.cs @@ -2,9 +2,9 @@ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Mix.Cms.Lib.Models.Cms; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Mix.Cms.Lib.Migrations.PostgresqlMixCms { @@ -15,9 +15,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("Relational:MaxIdentifierLength", 63) .HasAnnotation("ProductVersion", "5.0.8") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixCmsUser", b => { @@ -78,7 +78,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -99,7 +99,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixConfiguration", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -145,7 +145,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -170,8 +170,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Alias") .HasColumnType("varchar(150)") @@ -216,7 +216,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .IsRequired() @@ -243,8 +243,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("CreatedBy") .HasColumnType("varchar(50)") @@ -297,7 +297,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -326,11 +326,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Configurations") - .HasColumnType("nvarchar(max)"); + .HasColumnType("text"); b.Property("CreatedBy") .HasColumnType("varchar(50)") @@ -370,7 +370,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp without time zone"); b.Property("MixDatabaseId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("MixDatabaseName") .HasColumnType("varchar(250)") @@ -394,10 +394,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("ReferenceId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Regex") .HasColumnType("varchar(250)") @@ -448,7 +448,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp without time zone"); b.Property("MixDatabaseId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("MixDatabaseName") .HasColumnType("varchar(250)") @@ -461,7 +461,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -480,7 +480,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixDatabaseDataAssociation", b => { b.Property("Id") - .HasColumnType("nvarchar(450)"); + .HasColumnType("text"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -510,7 +510,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp without time zone"); b.Property("MixDatabaseId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("MixDatabaseName") .HasColumnType("varchar(250)") @@ -535,7 +535,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -588,7 +588,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp without time zone"); b.Property("DoubleValue") - .HasColumnType("float"); + .HasColumnType("double precision"); b.Property("EditorType") .IsRequired() @@ -609,7 +609,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("EncryptType") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("EncryptValue") .HasColumnType("text") @@ -617,13 +617,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("IntegerValue") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("LastModified") .HasColumnType("timestamp without time zone"); b.Property("MixDatabaseColumnId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("MixDatabaseColumnName") .IsRequired() @@ -642,7 +642,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Regex") .HasColumnType("varchar(250)") @@ -672,8 +672,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("CreatedBy") .HasColumnType("varchar(50)") @@ -716,7 +716,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -731,7 +731,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("ThemeId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("ThemeName") .IsRequired() @@ -749,7 +749,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixLanguage", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -800,7 +800,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -824,7 +824,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixMedia", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -885,7 +885,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Source") .HasColumnType("varchar(250)") @@ -922,7 +922,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModule", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -990,13 +990,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("PageSize") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PostType") - .HasColumnType("nvarchar(max)"); + .HasColumnType("text"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1020,7 +1020,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Type") - .HasColumnType("int"); + .HasColumnType("integer"); b.HasKey("Id", "Specificulture") .HasName("PK_mix_module"); @@ -1065,16 +1065,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("ModuleId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PageId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PostId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1104,7 +1104,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixModulePost", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1138,13 +1138,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("ModuleId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PostId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1165,7 +1165,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPage", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1232,7 +1232,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Level") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("ModifiedBy") .HasColumnType("varchar(50)") @@ -1240,13 +1240,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("PageSize") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PostType") - .HasColumnType("nvarchar(max)"); + .HasColumnType("text"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("SeoDescription") .HasColumnType("text") @@ -1301,7 +1301,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Views") - .HasColumnType("int"); + .HasColumnType("integer"); b.HasKey("Id", "Specificulture") .HasName("PK_mix_page"); @@ -1314,7 +1314,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPageModule", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1348,16 +1348,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("ModuleId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PageId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Position") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1378,7 +1378,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPagePost", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1412,13 +1412,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("PageId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PostId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1440,8 +1440,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("CreatedBy") .HasColumnType("varchar(50)") @@ -1465,7 +1465,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp without time zone"); b.Property("Level") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("ModifiedBy") .HasColumnType("varchar(50)") @@ -1473,7 +1473,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1505,8 +1505,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("CreatedBy") .HasColumnType("varchar(50)") @@ -1535,13 +1535,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("PageId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("ParentId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1563,13 +1563,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("CreatedBy") .HasMaxLength(50) .IsUnicode(false) - .HasColumnType("varchar(50)"); + .HasColumnType("character varying(50)"); b.Property("CreatedDateTime") .HasColumnType("timestamp without time zone"); @@ -1580,23 +1580,23 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("ModifiedBy") .HasMaxLength(50) .IsUnicode(false) - .HasColumnType("varchar(50)"); + .HasColumnType("character varying(50)"); b.Property("PageId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("RoleId") .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); + .HasColumnType("character varying(50)"); b.Property("Status") .IsRequired() .HasMaxLength(50) .IsUnicode(false) - .HasColumnType("varchar(50)"); + .HasColumnType("character varying(50)"); b.HasKey("Id") .HasName("PK_mix_portal_page_role"); @@ -1609,7 +1609,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPost", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1676,7 +1676,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PublishedDateTime") .HasColumnType("timestamp without time zone"); @@ -1738,7 +1738,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Views") - .HasColumnType("int"); + .HasColumnType("integer"); b.HasKey("Id", "Specificulture") .HasName("PK_mix_post"); @@ -1751,7 +1751,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostAssociation", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1772,7 +1772,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("DestinationId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Image") .HasColumnType("varchar(450)") @@ -1788,10 +1788,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("SourceId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1812,7 +1812,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostMedia", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1841,7 +1841,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp without time zone"); b.Property("MediaId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("ModifiedBy") .HasColumnType("varchar(50)") @@ -1849,13 +1849,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Position") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PostId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1876,7 +1876,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixPostModule", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -1910,16 +1910,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("ModuleId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Position") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("PostId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -1941,8 +1941,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("Content") .IsRequired() @@ -1996,7 +1996,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Scripts") .HasColumnType("text") @@ -2020,7 +2020,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("ThemeId") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("ThemeName") .IsRequired() @@ -2040,8 +2040,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); b.Property("CreatedBy") .HasColumnType("varchar(50)") @@ -2076,7 +2076,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Status") .IsRequired() @@ -2102,7 +2102,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Mix.Cms.Lib.Models.Cms.MixUrlAlias", b => { b.Property("Id") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("Specificulture") .HasColumnType("varchar(10)") @@ -2136,7 +2136,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Priority") - .HasColumnType("int"); + .HasColumnType("integer"); b.Property("SourceId") .HasColumnType("varchar(250)") @@ -2150,7 +2150,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasAnnotation("MySql:CharSet", "utf8"); b.Property("Type") - .HasColumnType("int"); + .HasColumnType("integer"); b.HasKey("Id", "Specificulture") .HasName("PK_mix_url_alias"); From e169b54803a7e8f4b1e1c8ce8fe3a06983d52db7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 14:55:55 +0000 Subject: [PATCH 08/83] Bump Microsoft.AspNetCore.Authentication.JwtBearer in /src/Mix.Cms.Lib Bumps [Microsoft.AspNetCore.Authentication.JwtBearer](https://github.com/dotnet/aspnetcore) from 5.0.8 to 5.0.9. - [Release notes](https://github.com/dotnet/aspnetcore/releases) - [Commits](https://github.com/dotnet/aspnetcore/compare/v5.0.8...v5.0.9) --- updated-dependencies: - dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- src/Mix.Cms.Lib/Mix.Cms.Lib.csproj | 2 +- src/Mix.Identity/Mix.Identity.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mix.Cms.Lib/Mix.Cms.Lib.csproj b/src/Mix.Cms.Lib/Mix.Cms.Lib.csproj index 9835f914c..bb10dd366 100644 --- a/src/Mix.Cms.Lib/Mix.Cms.Lib.csproj +++ b/src/Mix.Cms.Lib/Mix.Cms.Lib.csproj @@ -6,7 +6,7 @@ - + all diff --git a/src/Mix.Identity/Mix.Identity.csproj b/src/Mix.Identity/Mix.Identity.csproj index c1ba68c1d..94c38cc66 100644 --- a/src/Mix.Identity/Mix.Identity.csproj +++ b/src/Mix.Identity/Mix.Identity.csproj @@ -8,7 +8,7 @@ - + From f26610efe16a8ec740a6c5f8207645584ac18c1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 15:25:07 +0000 Subject: [PATCH 09/83] Bump Microsoft.AspNetCore.Authentication.JwtBearer in /src/Mix.Identity Bumps [Microsoft.AspNetCore.Authentication.JwtBearer](https://github.com/dotnet/aspnetcore) from 5.0.1 to 5.0.9. - [Release notes](https://github.com/dotnet/aspnetcore/releases) - [Commits](https://github.com/dotnet/aspnetcore/compare/v5.0.1...v5.0.9) --- updated-dependencies: - dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- src/Mix.Identity/Mix.Identity.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mix.Identity/Mix.Identity.csproj b/src/Mix.Identity/Mix.Identity.csproj index c1ba68c1d..94c38cc66 100644 --- a/src/Mix.Identity/Mix.Identity.csproj +++ b/src/Mix.Identity/Mix.Identity.csproj @@ -8,7 +8,7 @@ - + From a1a4bbc83eaf0a36b903cef35c76acb0646b9093 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 17:27:19 +0000 Subject: [PATCH 10/83] Bump Microsoft.AspNetCore.Authentication.JwtBearer in /src/Mix.Cms.Api Bumps [Microsoft.AspNetCore.Authentication.JwtBearer](https://github.com/dotnet/aspnetcore) from 5.0.8 to 5.0.9. - [Release notes](https://github.com/dotnet/aspnetcore/releases) - [Commits](https://github.com/dotnet/aspnetcore/compare/v5.0.8...v5.0.9) --- updated-dependencies: - dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- src/Mix.Cms.Api/Mix.Cms.Api.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mix.Cms.Api/Mix.Cms.Api.csproj b/src/Mix.Cms.Api/Mix.Cms.Api.csproj index 7357f2165..8ba568b28 100644 --- a/src/Mix.Cms.Api/Mix.Cms.Api.csproj +++ b/src/Mix.Cms.Api/Mix.Cms.Api.csproj @@ -7,7 +7,7 @@ - + From fca0c6513c23570b004bbd52ebe52d64f005e549 Mon Sep 17 00:00:00 2001 From: phat Date: Fri, 27 Aug 2021 01:00:36 +0700 Subject: [PATCH 11/83] Add new Mix helper --- src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs | 194 +++++++++++++++--------- 1 file changed, 123 insertions(+), 71 deletions(-) diff --git a/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs b/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs index e9b5e0d7c..5f287a563 100644 --- a/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs +++ b/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs @@ -22,6 +22,11 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using Mix.Infrastructure.Repositories; +using System.Web; +using MixDatas = Mix.Cms.Lib.ViewModels.MixDatabaseDatas; +using MixPagePosts = Mix.Cms.Lib.ViewModels.MixPagePosts; +using MixPosts = Mix.Cms.Lib.ViewModels.MixPosts; +using System.Collections.Specialized; namespace Mix.Cms.Lib.Helpers { @@ -80,9 +85,8 @@ public static string GetRouterUrl(object routeValues, HttpRequest request, IUrlH var value = prop.GetValue(routeValues, null).ToString(); url += $"/{value}"; } - return string.Format("{0}://{1}{2}", request.Scheme, request.Host, - url - ); + + return string.Format("{0}://{1}{2}", request.Scheme, request.Host, url); } public static string FormatPrice(double? price, string oldPrice = "0") @@ -173,7 +177,7 @@ public static void LogException(Exception ex) } } - public static System.Threading.Tasks.Task GetModuleAsync(string name, string culture = null, IUrlHelper url = null) + public static Task GetModuleAsync(string name, string culture = null, IUrlHelper url = null) { var cacheKey = $"vm_{culture}_module_{name}_mvc"; var module = new RepositoryResponse(); @@ -185,7 +189,6 @@ public static void LogException(Exception ex) } // If load successful => load details - return Task.FromResult(module.Data); } @@ -196,7 +199,7 @@ internal static string GetDetailsUrl(string specificulture, string path) + path; } - public static async System.Threading.Tasks.Task GetPageAsync(int id, string culture) + public static async Task GetPageAsync(int id, string culture) { RepositoryResponse getPage = null; if (getPage == null) @@ -219,7 +222,7 @@ public static ViewModels.MixPages.ReadMvcViewModel GetPage(int id, string cultur return page.Data; } - public static async System.Threading.Tasks.Task GetTemplateByPath(string themeName, string templatePath) + public static async Task GetTemplateByPath(string themeName, string templatePath) { string[] tmp = templatePath.Split('/'); if (tmp[1].IndexOf('.') > 0) @@ -227,16 +230,18 @@ public static ViewModels.MixPages.ReadMvcViewModel GetPage(int id, string cultur tmp[1] = tmp[1].Substring(0, tmp[1].IndexOf('.')); } var getData = await ViewModels.MixTemplates.ReadViewModel.Repository.GetFirstModelAsync( - m => m.ThemeName == themeName && m.FolderType == tmp[0] && m.FileName == tmp[1]); + m => m.ThemeName == themeName + && m.FolderType == tmp[0] + && m.FileName == tmp[1]); return getData.Data; } - public static async Task GetNavigationAsync( - string name, string culture, IUrlHelper Url) + public static async Task GetNavigationAsync(string name, string culture, IUrlHelper Url) { - var navs = await ViewModels.MixDatabaseDatas.Helper.FilterByKeywordAsync( - culture, MixConstants.MixDatabaseName.NAVIGATION, "equal", "name", name); + var navs = await MixDatas.Helper + .FilterByKeywordAsync(culture, MixConstants.MixDatabaseName.NAVIGATION, "equal", "name", name); + var nav = navs.Data?.FirstOrDefault()?.Nav; string activePath = Url.ActionContext.HttpContext.Request.Path; @@ -268,11 +273,11 @@ public static async Task GetNavigationAsync( return nav; } - public static MixNavigation GetNavigation( - string name, string culture, IUrlHelper Url) + public static MixNavigation GetNavigation(string name, string culture, IUrlHelper Url) { - var navs = ViewModels.MixDatabaseDatas.Helper.FilterByKeyword( - culture, MixConstants.MixDatabaseName.NAVIGATION, "equal", "name", name); + var navs = MixDatas.Helper + .FilterByKeyword(culture, MixConstants.MixDatabaseName.NAVIGATION, "equal", "name", name); + var nav = navs.Data?.FirstOrDefault()?.Nav; string activePath = Url.ActionContext.HttpContext.Request.Path; @@ -305,11 +310,17 @@ public static MixNavigation GetNavigation( } public static async Task>> GetListPostByAdditionalField( - string fieldName, object fieldValue, string culture, MixDataType dataType - , MixCompareOperatorKind filterType = MixCompareOperatorKind.Equal - , string orderByPropertyName = null, Heart.Enums.DisplayDirection direction = Heart.Enums.DisplayDirection.Asc, int? pageSize = null, int? pageIndex = null - , MixCmsContext _context = null, IDbContextTransaction _transaction = null) - where TView : ViewModelBase + string fieldName, + object fieldValue, + string culture, + MixDataType dataType, + MixCompareOperatorKind filterType = MixCompareOperatorKind.Equal, + string orderByPropertyName = null, + DisplayDirection direction = DisplayDirection.Asc, + int? pageSize = null, + int? pageIndex = null, + MixCmsContext _context = null, + IDbContextTransaction _transaction = null) where TView : ViewModelBase { UnitOfWorkHelper.InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try @@ -324,8 +335,9 @@ public static async Task>> GetListPost } }; // Get Value Predicate By Type - Expression> valPredicate = m => m.MixDatabaseName == MixConstants.MixDatabaseName.ADDITIONAL_COLUMN_POST - && m.MixDatabaseColumnName == fieldName; + Expression> valPredicate = + m => m.MixDatabaseName == MixConstants.MixDatabaseName.ADDITIONAL_COLUMN_POST + && m.MixDatabaseColumnName == fieldName; var pre = GetValuePredicate(fieldValue.ToString(), filterType, dataType); if (pre != null) @@ -335,16 +347,25 @@ public static async Task>> GetListPost var query = context.MixDatabaseDataValue.Where(valPredicate).Select(m => m.DataId).Distinct(); var dataIds = query.ToList(); + var relatedQuery = context.MixDatabaseDataAssociation.Where( - m => m.ParentType == MixDatabaseParentType.Post && m.Specificulture == culture - && dataIds.Any(d => d == m.DataId)); + m => m.ParentType == MixDatabaseParentType.Post + && m.Specificulture == culture + && dataIds.Any(d => d == m.DataId)); + var postIds = relatedQuery.Select(m => int.Parse(m.ParentId)).Distinct().AsEnumerable().ToList(); + result = await DefaultRepository.Instance.GetModelListByAsync( - m => m.Specificulture == culture && postIds.Any(p => p == m.Id) - , orderByPropertyName, direction - , pageSize ?? 100, pageIndex ?? 0 - , null, null - , context, transaction); + m => m.Specificulture == culture && postIds.Any(p => p == m.Id), + orderByPropertyName, + direction, + pageSize ?? 100, + pageIndex ?? 0, + null, + null, + context, + transaction); + return result; } catch (Exception ex) @@ -361,8 +382,7 @@ public static async Task>> GetListPost } } - private static Expression> GetValuePredicate(string fieldValue - , MixCompareOperatorKind filterType, MixDataType dataType) + private static Expression> GetValuePredicate(string fieldValue, MixCompareOperatorKind filterType, MixDataType dataType) { Expression> valPredicate = null; switch (dataType) @@ -494,15 +514,14 @@ public static Expression> FilterObjectSet(string p } public async static Task>> GetPostlistByMeta( - HttpContext context - , string keyword = null - , string culture = null - , string type = MixConstants.MixDatabaseName.SYSTEM_TAG - , int? pageSize = null - , MixCmsContext _context = null, IDbContextTransaction _transaction = null) - where TView : ViewModelBase + HttpContext context, + string keyword = null, + string culture = null, + string type = MixConstants.MixDatabaseName.SYSTEM_TAG, + int? pageSize = null, + MixCmsContext _context = null, + IDbContextTransaction _transaction = null) where TView : ViewModelBase { - culture ??= MixService.GetAppSetting(MixAppSettingKeywords.DefaultCulture); keyword ??= context.Request.Query["Keyword"]; @@ -511,61 +530,73 @@ HttpContext context { pagingRequest.PageSize = pageSize.Value; } - return await ViewModels.MixPosts.Helper.GetModelistByMeta( - type, keyword, + return await MixPosts.Helper.GetModelistByMeta( + type, + keyword, MixDatabaseNames.ADDITIONAL_COLUMN_POST, pagingRequest, - culture, _context, _transaction); + culture, + _context, + _transaction); } public async static Task>> GetPostlistByAdditionalField( - - string fieldName, string value, string culture - , string orderByPropertyName = null, DisplayDirection direction = DisplayDirection.Asc - , int? pageSize = null, int? pageIndex = 0 - , MixCmsContext _context = null, IDbContextTransaction _transaction = null) - where TView : ViewModelBase + string fieldName, + string value, + string culture, + string orderByPropertyName = null, + DisplayDirection direction = DisplayDirection.Asc, + int? pageSize = null, + int? pageIndex = 0, + MixCmsContext _context = null, + IDbContextTransaction _transaction = null) where TView : ViewModelBase { int maxPageSize = MixService.GetAppSetting("MaxPageSize"); string orderBy = MixService.GetAppSetting("OrderBy"); pageSize = (pageSize > 0 && pageSize < maxPageSize) ? pageSize : maxPageSize; pageIndex = (pageIndex >= 0) ? pageIndex : 0; - return await Mix.Cms.Lib.ViewModels.MixPosts.Helper.SearchPostByField( - fieldName, value, - culture, orderByPropertyName ?? orderBy, direction, pageSize, pageIndex - 1, _context, _transaction); + return await MixPosts.Helper.SearchPostByField( + fieldName, + value, + culture, + orderByPropertyName ?? orderBy, + direction, + pageSize, + pageIndex - 1, + _context, + _transaction); } - public static async Task>> GetPostListByPageId( - HttpContext context - , int pageId - , string keyword = null - , string culture = null - , string orderBy = "CreatedDateTime" - , Heart.Enums.DisplayDirection direction = DisplayDirection.Desc - , MixCmsContext _context = null, IDbContextTransaction _transaction = null - ) + public static async Task>> GetPostListByPageId( + HttpContext context, + int pageId, + string keyword = null, + string culture = null, + string orderBy = "CreatedDateTime", + DisplayDirection direction = DisplayDirection.Desc, + MixCmsContext _context = null, + IDbContextTransaction _transaction = null) { int.TryParse(context.Request.Query[MixRequestQueryKeywords.Page], out int page); int.TryParse(context.Request.Query[MixRequestQueryKeywords.PageSize], out int pageSize); page = (page > 0) ? page : 1; - var result = await ViewModels.MixPosts.Helper.GetPostListByPageId( + var result = await MixPosts.Helper.GetPostListByPageId( pageId, keyword, culture, orderBy, direction, pageSize, page - 1, _context, _transaction); result.Data.Items.ForEach(m => m.LoadPost(_context, _transaction)); return result; } - public static async Task>> GetAttributeDataListBySet( - HttpContext context - , string mixDatabaseName - , string culture = null - , Heart.Enums.DisplayDirection direction = DisplayDirection.Desc - , MixCmsContext _context = null, IDbContextTransaction _transaction = null - ) + public static async Task>> GetAttributeDataListBySet( + HttpContext context, + string mixDatabaseName, + string culture = null, + DisplayDirection direction = DisplayDirection.Desc, + MixCmsContext _context = null, + IDbContextTransaction _transaction = null) { - var result = await ViewModels.MixDatabaseDatas.Helper.FilterByKeywordAsync( - context.Request, culture, mixDatabaseName); + var result = await MixDatas.Helper.FilterByKeywordAsync(context.Request, culture, mixDatabaseName); return result; } @@ -575,5 +606,26 @@ public static string TranslateUrl(string url, string srcCulture, string destCult ? url.Replace(srcCulture, destCulture) : $"/{destCulture}{url}"; } + + public static string BuildUrl(HttpContext context, NameValueCollection nameValueCollection) + { + var request = context.Request; + var uri = string.Format("{0}://{1}{2}", request.Scheme, request.Host, request.Path); + var queryString = HttpUtility.ParseQueryString(request.QueryString.Value); + var uriBuilder = new UriBuilder(uri); + queryString.Add(nameValueCollection); + uriBuilder.Query = queryString.ToString(); + return uriBuilder.ToString(); + } + + public static string BuildUrl(HttpContext context, string key, string value) + { + var nameValueCollection = new NameValueCollection + { + { key, value } + }; + + return BuildUrl(context, nameValueCollection); + } } } \ No newline at end of file From 786167a63065932d1a1e29bc49c5bd0cc39a2d06 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Fri, 27 Aug 2021 17:30:35 +0700 Subject: [PATCH 12/83] fix import theme --- .../MixDatabaseDatas/ImportViewModel.cs | 2 +- .../ViewModels/SiteStructureViewModel.cs | 10 ++++++---- src/Mix.Cms.Web/MixContent/data/_blank.zip | Bin 12351 -> 12341 bytes .../MixContent/voido-coffee.db-shm | Bin 32768 -> 0 bytes .../MixContent/voido-coffee.db-wal | Bin 444992 -> 0 bytes 5 files changed, 7 insertions(+), 5 deletions(-) delete mode 100644 src/Mix.Cms.Web/MixContent/voido-coffee.db-shm delete mode 100644 src/Mix.Cms.Web/MixContent/voido-coffee.db-wal diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/ImportViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/ImportViewModel.cs index d24062f4e..c65040547 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/ImportViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/ImportViewModel.cs @@ -133,7 +133,7 @@ public override MixDatabaseData ParseModel(MixCmsContext _context = null, IDbCon foreach (var field in Columns.OrderBy(f => f.Priority)) { - var val = Values.FirstOrDefault(v => v.MixDatabaseColumnId == field.Id); + var val = Values.FirstOrDefault(v => v.MixDatabaseColumnName == field.Name); if (val == null) { val = new MixDatabaseDataValues.UpdateViewModel( diff --git a/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs b/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs index fa6426969..fb06c0ea2 100644 --- a/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs @@ -356,6 +356,11 @@ public async Task> ImportAsync( UnitOfWorkHelper.InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { + if (result.IsSucceed && Templates.Count > 0) + { + result = await ImportTemplates(themeId, themeName, context, transaction); + } + if (Configurations != null && Configurations.Count > 0) { result = await ImportConfigurationsAsync(destCulture, context, transaction); @@ -393,10 +398,7 @@ public async Task> ImportAsync( { result = await ImportRelatedDatas(destCulture, context, transaction); } - if (result.IsSucceed && Templates.Count > 0) - { - result = await ImportTemplates(themeId, themeName, context, transaction); - } + UnitOfWorkHelper.HandleTransaction(result.IsSucceed, isRoot, transaction); } diff --git a/src/Mix.Cms.Web/MixContent/data/_blank.zip b/src/Mix.Cms.Web/MixContent/data/_blank.zip index 21d73eb076ad00b7b162e0c9dce7df6174c4749e..e1e64a2f273c2addf589bf307388981e0db26da4 100644 GIT binary patch delta 6378 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 delta 6389 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℞W!0veR~^s=qer*L942*U4>j`Y0@#=Za3eLv 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 VyJ0|ZB;Sz=WBG`%Ki&4j{{`&h5`O>y From c1b5156354bf7f69e94c1182f353e6ad1e98a1cb Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Tue, 31 Aug 2021 17:05:12 +0700 Subject: [PATCH 13/83] fix richtext editor --- .../Models/Common/SearchPostQueryModel.cs | 2 +- .../Views/Shared/_LayoutPortal_Angular.cshtml | 28 +- .../wwwroot/mix-app/css/app-client.min.css | 2 +- .../mix-app/css/app-vendor-scss.min.css | 10 +- .../wwwroot/mix-app/css/app-vendor.min.css | 4 +- .../mix-app/js/app-portal-required.min.js | 2 +- .../wwwroot/mix-app/js/app-portal.min.js | 6846 ++++++++--------- .../wwwroot/mix-app/js/app-shared.min.js | 1436 ++-- .../pages/post/components/main/view.html | 2 +- .../components/trumbowyg/trumbowyg.html | 6 +- 10 files changed, 4175 insertions(+), 4163 deletions(-) diff --git a/src/Mix.Cms.Lib/Models/Common/SearchPostQueryModel.cs b/src/Mix.Cms.Lib/Models/Common/SearchPostQueryModel.cs index eba156130..14c8d92fa 100644 --- a/src/Mix.Cms.Lib/Models/Common/SearchPostQueryModel.cs +++ b/src/Mix.Cms.Lib/Models/Common/SearchPostQueryModel.cs @@ -20,7 +20,7 @@ public SearchPostQueryModel() public SearchPostQueryModel(HttpRequest request, string culture): base(request, culture) { PostType = request.Query.TryGetValue("postType", out var postType) - ? postType : MixDatabaseNames.ADDITIONAL_COLUMN_POST; + ? postType : string.Empty; Category = request.Query.TryGetValue(MixRequestQueryKeywords.Category, out var category) ? category: string.Empty; Tag = request.Query.TryGetValue(MixRequestQueryKeywords.Tag, out var tag) diff --git a/src/Mix.Cms.Web/Views/Shared/_LayoutPortal_Angular.cshtml b/src/Mix.Cms.Web/Views/Shared/_LayoutPortal_Angular.cshtml index 78adf5980..ce3f92b80 100644 --- a/src/Mix.Cms.Web/Views/Shared/_LayoutPortal_Angular.cshtml +++ b/src/Mix.Cms.Web/Views/Shared/_LayoutPortal_Angular.cshtml @@ -14,7 +14,7 @@ - + @@ -31,7 +31,7 @@ --primary-color-hue : {{globalSettings.portalThemeSettings.primaryColorHue}}; --primary-color-saturation : {{globalSettings.portalThemeSettings.primaryColorSaturation}}%; --primary-color-brightness : {{globalSettings.portalThemeSettings.primaryColorBrightness}}%; - + --second-color-hue : {{globalSettings.portalThemeSettings.secondColorHue}}; --second-color-saturation : {{globalSettings.portalThemeSettings.secondColorSaturation}}%; --second-color-brightness : {{globalSettings.portalThemeSettings.secondColorBrightness}}%; @@ -49,22 +49,24 @@ @RenderBody() - - + - @* *@ - @* *@ - - @* - *@ - @* *@ + @* *@ + + + @**@ + + + @* + + *@ + - - - + + diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css index 77040f666..479d90b00 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css +++ b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css @@ -1 +1 @@ -/* Wed Aug 11 2021 22:38:42 GMT+0700 (Indochina Time) */.haiyen-loader,.video{width:100%;height:100%}#modal-shopping-cart .modal-title{margin-top:0}#modal-shopping-cart .cart-item{margin:10px 0}#modal-shopping-cart .modal-dialog{max-width:unset;margin:20px}#modal-shopping-cart{color:#5c4b43;z-index:1060}#modal-shopping-cart .modal-footer button{margin:0 10px}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative;overflow:hidden}.user .username{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.haiyen-loader{position:fixed;left:0;top:0;z-index:999999;background:rgba(255,255,255,.78)}.haiyen-loader .spinner{width:55px;height:70px;position:absolute;top:50%;left:50%;margin-top:-70px;margin-left:-65px}.haiyen-loader .spinner>div{background-color:red;height:100%;width:6px;margin-right:5px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.haiyen-loader .spinner .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.haiyen-loader .spinner .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.haiyen-loader .spinner .rect4{-webkit-animation-delay:-.9s;animation-delay:-.9s}.haiyen-loader .spinner .rect5{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-stretchdelay{0%,100%,40%{-webkit-transform:scaleY(.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,100%,40%{transform:scaleY(.4);-webkit-transform:scaleY(.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.package-wrapper h2{margin-top:20px}.tbl-package span{margin-left:0;font-size:inherit}.tbl-package .sum-th{background-color:#fff}.tbl-package .sum-th span{color:#333}.tbl-package td,.tbl-package th{height:21px;padding:2px 14px;font-size:20px}.tbl-package-slot th{height:0;padding:0 14px;font-size:20px}.tbl-package td{height:21px;text-align:center}.tbl-package .no-border-top{border-top:none}.tbl-package .no-border-bottom{border-bottom:none}.btn-minus,.btn-plus{width:50px;height:20px;font-weight:700;font-size:1em;line-height:10px;border:1px solid #fff;border-radius:15px;color:#fff;margin-right:5px}.btn-dark,.btn-minus-dark{border:1px solid #333}.btn-minus-dark,.btn-plus{color:#333;background-color:#fff}.btn-dark{color:#fff;background-color:#333}.tbl-package-mobile{font-size:medium}.tbl-package-mobile td,.tbl-package-mobile th{height:21px;padding:5px;font-size:medium}.tbl-package-mobile th{height:0}.tbl-package-mobile .btn-minus,.tbl-package-mobile .btn-plus{width:40px;height:16px;font-weight:700;font-size:1em;line-height:5px}.tbl-final{width:100%}.tbl-final .gift-title{padding:5px 10px;background-color:#ddd;color:#000}.tbl-final .gift-quantity{padding:5px 10px;background-color:#000;color:#fff} \ No newline at end of file +/* Tue Aug 31 2021 16:58:21 GMT+0700 (Indochina Time) */.haiyen-loader,.video{width:100%;height:100%}#modal-shopping-cart .modal-title{margin-top:0}#modal-shopping-cart .cart-item{margin:10px 0}#modal-shopping-cart .modal-dialog{max-width:unset;margin:20px}#modal-shopping-cart{color:#5c4b43;z-index:1060}#modal-shopping-cart .modal-footer button{margin:0 10px}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative;overflow:hidden}.user .username{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.haiyen-loader{position:fixed;left:0;top:0;z-index:999999;background:rgba(255,255,255,.78)}.haiyen-loader .spinner{width:55px;height:70px;position:absolute;top:50%;left:50%;margin-top:-70px;margin-left:-65px}.haiyen-loader .spinner>div{background-color:red;height:100%;width:6px;margin-right:5px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.haiyen-loader .spinner .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.haiyen-loader .spinner .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.haiyen-loader .spinner .rect4{-webkit-animation-delay:-.9s;animation-delay:-.9s}.haiyen-loader .spinner .rect5{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-stretchdelay{0%,100%,40%{-webkit-transform:scaleY(.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,100%,40%{transform:scaleY(.4);-webkit-transform:scaleY(.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.package-wrapper h2{margin-top:20px}.tbl-package span{margin-left:0;font-size:inherit}.tbl-package .sum-th{background-color:#fff}.tbl-package .sum-th span{color:#333}.tbl-package td,.tbl-package th{height:21px;padding:2px 14px;font-size:20px}.tbl-package-slot th{height:0;padding:0 14px;font-size:20px}.tbl-package td{height:21px;text-align:center}.tbl-package .no-border-top{border-top:none}.tbl-package .no-border-bottom{border-bottom:none}.btn-minus,.btn-plus{width:50px;height:20px;font-weight:700;font-size:1em;line-height:10px;border:1px solid #fff;border-radius:15px;color:#fff;margin-right:5px}.btn-dark,.btn-minus-dark{border:1px solid #333}.btn-minus-dark,.btn-plus{color:#333;background-color:#fff}.btn-dark{color:#fff;background-color:#333}.tbl-package-mobile{font-size:medium}.tbl-package-mobile td,.tbl-package-mobile th{height:21px;padding:5px;font-size:medium}.tbl-package-mobile th{height:0}.tbl-package-mobile .btn-minus,.tbl-package-mobile .btn-plus{width:40px;height:16px;font-weight:700;font-size:1em;line-height:5px}.tbl-final{width:100%}.tbl-final .gift-title{padding:5px 10px;background-color:#ddd;color:#000}.tbl-final .gift-quantity{padding:5px 10px;background-color:#000;color:#fff} \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css index 7842323ef..c4af66949 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css +++ b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css @@ -1,4 +1,4 @@ -/* Wed Aug 11 2021 22:38:25 GMT+0700 (Indochina Time) */fb-login { +/* Tue Aug 31 2021 16:58:07 GMT+0700 (Indochina Time) */fb-login { background-color: aqua; } medias .modal { @@ -32,10 +32,6 @@ mix-module-data-table .preview-container { upload-croppie .cr-boundary { overflow: hidden; } -.table-data td.preview { - max-width: 120px; - overflow: hidden; } - main-side-bar-dynamic .sw-sidebar .sw-toc-item { position: relative; } main-side-bar-dynamic .sw-sidebar .sw-toc-item .sw-toc-link .sw-toc-link { @@ -60,3 +56,7 @@ main-side-bar-dynamic .sw-sidebar .sw-toc-sub-link .btn-group { #modal-content-filter .modal-lg, #modal-content-filter .modal-xl { max-width: 80vw; } } + +.table-data td.preview { + max-width: 120px; + overflow: hidden; } diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css index 70a917f75..c500cfee2 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css +++ b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css @@ -1,7 +1,7 @@ -/* Wed Aug 11 2021 22:38:28 GMT+0700 (Indochina Time) */@charset "UTF-8";#return-to-top,tags-input .tags .tag-item .remove-button:hover{text-decoration:none}#return-to-top{position:fixed;bottom:20px;right:20px;background:#000;background:rgba(0,0,0,.7);width:50px;height:50px;-webkit-border-radius:35px;-moz-border-radius:35px;border-radius:35px;display:none;-webkit-transition:all .3s linear;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease;z-index:9}#return-to-top:hover{background:rgba(0,0,0,.9)}#return-to-top i{color:#fff;margin:0;position:relative;left:4px;top:0;font-size:30px;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}#return-to-top:hover i{color:#fff;top:5px}@media (min-width:992px){.language-switcher{display:inline;position:absolute;right:150px;bottom:15px}.language-switcher.portal{bottom:0}.language-switcher .dropdown-menu{right:0}}@media screen and (max-width:991px){.language-switcher{display:inline;position:absolute;left:20px}.language-switcher .dropdown-menu{left:0}}.language-switcher .dropdown-menu{width:250px;overflow:hidden!important}.navbar-collapse .dropdown-menu .dropdown-item{color:#444}.dialogdemoThemeInheritance .container{text-align:center}.data-table .header{padding:10px;font-weight:700;background:#d3d3d3}.mix-loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#21252987;opacity:.97;z-index:9999;display:flex;justify-content:center;align-items:center}.mix-loader-container .spinner{margin:100px auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-rotate 2s infinite linear;animation:sk-rotate 2s infinite linear}.mix-loader-container .dot1,.mix-loader-container .dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#fff;border-radius:100%;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.mix-loader-container .dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-rotate{100%{-webkit-transform:rotate(360deg)}}@keyframes sk-rotate{100%{transform:rotate(360deg);-webkit-transform:rotate(360deg)}}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.lds-ellipsis{display:inline-block;position:relative;width:80px;height:80px}.lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}@keyframes lds-ellipsis1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}#dlg-preview-popup .modal-body .img{max-width:100%;display:block;margin:0 auto}quill-editor .ql-container{min-height:300px;overflow:auto}quill-editor .ql-toolbar{position:sticky!important;top:3.9rem;z-index:12;background-color:#fff}.snowflake{display:block;position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:-webkit-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-moz-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-ms-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%)}#snow{position:fixed;width:100%;height:100%}.star-rating{margin:0;padding:0;display:inline-block}.star-rating .star{padding:1px;color:#ddd;font-size:12px;text-shadow:.05em .05em #aaa;list-style-type:none;display:inline-block;cursor:pointer}.star-rating .star.filled{color:#fd0}.star-rating.readonly .star.filled{color:#666}.youtube{background-color:#000;margin-bottom:30px;position:relative;padding-top:56.25%;overflow:hidden;cursor:pointer}.youtube img{width:100%;top:-16.82%;left:0;opacity:.7}.youtube .play-button{width:90px;height:60px;background-color:#333;box-shadow:0 0 30px rgba(0,0,0,.6);z-index:1;opacity:.8;border-radius:6px}.now-ui-icons.circle,tags-input[disabled] .tags,tags-input[disabled] .tags .input{background-color:#eee}.youtube .play-button:before{content:"";border-style:solid;border-width:15px 0 15px 26px;border-color:transparent transparent transparent #fff}.youtube .play-button,.youtube img{cursor:pointer}.youtube .play-button,.youtube .play-button:before,.youtube iframe,.youtube img{position:absolute}.youtube .play-button,.youtube .play-button:before{top:50%;left:50%;transform:translate3d(-50%,-50%,0)}.youtube iframe{height:100%;width:100%;top:0;left:0}tags-input{box-shadow:none;border:none;padding:0;min-height:34px}tags-input .tags{border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}tags-input .tags .tag-item{color:#000}tags-input .tags .tag-item.selected{color:#fff;border:1px solid #d43f3a}tags-input .tags.focused{border:1px solid #66afe9}tags-input .autocomplete{border-radius:4px}tags-input.ng-invalid .tags{border-color:#843534}.input-group tags-input{padding:0;display:table-cell}.input-group tags-input:not(:first-child) .tags{border-top-left-radius:0;border-bottom-left-radius:0}.input-group tags-input:not(:last-child) .tags{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-lg tags-input:first-child .tags{border-top-left-radius:6px;border-bottom-left-radius:6px}.input-group-lg tags-input:last-child .tags{border-top-right-radius:6px;border-bottom-right-radius:6px}.input-group-sm tags-input:first-child .tags{border-top-left-radius:3px;border-bottom-left-radius:3px}.input-group-sm tags-input:last-child .tags{border-top-right-radius:3px;border-bottom-right-radius:3px}.input-group-lg tags-input,tags-input.ti-input-lg{min-height:46px}.input-group-lg tags-input .tags,tags-input.ti-input-lg .tags{border-radius:6px}.input-group-lg tags-input .tags .tag-item,tags-input.ti-input-lg .tags .tag-item{height:38px;line-height:37px;font-size:18px;border-radius:6px}.input-group-lg tags-input .tags .tag-item .remove-button,tags-input.ti-input-lg .tags .tag-item .remove-button{font-size:20px}.input-group-lg tags-input .tags .input,tags-input.ti-input-lg .tags .input{height:38px;font-size:18px}.input-group-sm tags-input,tags-input.ti-input-sm{min-height:30px}.input-group-sm tags-input .tags,tags-input.ti-input-sm .tags{border-radius:3px}.input-group-sm tags-input .tags .tag-item,tags-input.ti-input-sm .tags .tag-item{height:22px;line-height:21px;font-size:12px;border-radius:3px}.input-group-sm tags-input .tags .tag-item .remove-button,tags-input.ti-input-sm .tags .tag-item .remove-button{font-size:16px}.input-group-sm tags-input .tags .input,tags-input.ti-input-sm .tags .input{height:22px;font-size:12px}.has-feedback tags-input .tags{padding-right:30px}.has-success tags-input .tags{border-color:#3c763d}.has-success tags-input .tags.focused{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-error tags-input .tags{border-color:#a94442}.has-error tags-input .tags.focused{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-warning tags-input .tags{border-color:#8a6d3b}.has-warning tags-input .tags.focused{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{margin:5px 0;position:relative;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;background:-webkit-linear-gradient(top,#f0f9ff 0,#cbebff 47%,#a1dbff 100%);background:linear-gradient(to bottom,#f0f9ff 0,#cbebff 47%,#a1dbff 100%)}tags-input .tags .tag-item.selected{background:-webkit-linear-gradient(top,#febbbb 0,#fe9090 45%,#ff5c5c 100%);background:linear-gradient(to bottom,#febbbb 0,#fe9090 45%,#ff5c5c 100%)}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}.CodeMirror-gutter-elt,tags-input[disabled] .tags,tags-input[disabled] .tags .input,tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}.portal-menus .handle{cursor:move}body,html{height:100%}.btn,.btn-link{cursor:pointer}.display-4{font-size:2rem!important}div[dnd-list],ul[dnd-list]{min-height:42px;padding-left:0}div[dnd-list] .dndDraggingSource,ul[dnd-list] .dndDraggingSource{display:none}div[dnd-list] .dndPlaceholder,ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}div[dnd-list] .dnd-item,ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}div[dnd-list] .dnd-item.selected,ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}.custom-file-img{max-width:100%}.md-avatar{vertical-align:middle;width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important;margin-left:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}#modal-posts img,medias #modal-files .modal-body .table img{height:30px}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}.content{width:100%;display:flex;align-items:center;flex-direction:column;background:0 0}.flag-icon,.flag-icon-background{background-size:contain;background-position:50%}fb-login{background-color:#0ff}medias .modal{z-index:1049}medias #modal-files .modal-body .table img.preview{height:auto}mix-column-preview .row{max-height:120px;margin:10px 0;overflow:hidden}mix-module-data-table .data-table .header{padding:5px;color:#495057;background-color:hsla(var(--primary-color-hue,211),100%,50%,.075);border-color:#dee2e6;font-weight:400;font-size:small}mix-module-data-table .preview-container{max-height:4em;overflow:hidden}upload-croppie .cr-boundary{overflow:hidden}.table-data td.preview{max-width:120px;overflow:hidden}main-side-bar-dynamic .sw-sidebar .sw-toc-item{position:relative}main-side-bar-dynamic .sw-sidebar .sw-toc-item .sw-toc-link .sw-toc-link{padding-left:0}main-side-bar-dynamic .sw-sidebar .sw-toc-item .btn-group{right:20px;opacity:1}main-side-bar-dynamic .sw-sidebar ul{padding-left:15px}main-side-bar-dynamic .sw-sidebar .sw-toc-sub-link .btn-group{padding:2px 0}.custom-image{max-width:30vw}.attr-set-value-item:last-child{border-bottom:0!important}@media (min-width:992px){#modal-content-filter .modal-lg,#modal-content-filter .modal-xl{max-width:80vw}}.img-container>img,.img-preview>img{max-width:100%}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem;overflow:hidden}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor{color:#000}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}.bootstrap-tagsinput,.cm-tab,.cr-rotate-controls i:before,.flag-icon,.now-ui-icons{display:inline-block}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;border-radius:50%}.fa-ul,.nc-icon-ul{padding-left:0;list-style-type:none}.nc-icon-ul{margin-left:2.14285714em}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.flag-icon-background{background-repeat:no-repeat}.flag-icon{background-repeat:no-repeat;position:relative;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{font-style:normal;font-weight:900;font-size:22px}.cm-em,.hljs-comment,.hljs-emphasis,.hljs-quote,.tui-editor-contents address,.tui-editor-contents cite,.tui-editor-contents dfn,.tui-editor-contents em,.tui-editor-contents i,.tui-editor-contents var{font-style:italic}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! +/* Tue Aug 31 2021 16:58:07 GMT+0700 (Indochina Time) */@charset "UTF-8";.tui-editor-contents .task-list-item:before,.tui-editor-contents ol li.task-list-item:before,.tui-editor-contents pre ul li:before,.tui-editor-contents ul li.task-list-item:before,.youtube .play-button:before{content:""}#return-to-top,tags-input .tags .tag-item .remove-button:hover{text-decoration:none}#return-to-top{position:fixed;bottom:20px;right:20px;background:#000;background:rgba(0,0,0,.7);width:50px;height:50px;-webkit-border-radius:35px;-moz-border-radius:35px;border-radius:35px;display:none;-webkit-transition:all .3s linear;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease;z-index:9}#return-to-top:hover{background:rgba(0,0,0,.9)}#return-to-top i{color:#fff;margin:0;position:relative;left:4px;top:0;font-size:30px;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}#return-to-top:hover i{color:#fff;top:5px}@media (min-width:992px){.language-switcher{display:inline;position:absolute;right:150px;bottom:15px}.language-switcher.portal{bottom:0}.language-switcher .dropdown-menu{right:0}}@media screen and (max-width:991px){.language-switcher{display:inline;position:absolute;left:20px}.language-switcher .dropdown-menu{left:0}}.language-switcher .dropdown-menu{width:250px;overflow:hidden!important}.navbar-collapse .dropdown-menu .dropdown-item{color:#444}.dialogdemoThemeInheritance .container{text-align:center}.data-table .header{padding:10px;font-weight:700;background:#d3d3d3}.mix-loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#21252987;opacity:.97;z-index:9999;display:flex;justify-content:center;align-items:center}.mix-loader-container .spinner{margin:100px auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-rotate 2s infinite linear;animation:sk-rotate 2s infinite linear}.mix-loader-container .dot1,.mix-loader-container .dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#fff;border-radius:100%;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.mix-loader-container .dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-rotate{100%{-webkit-transform:rotate(360deg)}}@keyframes sk-rotate{100%{transform:rotate(360deg);-webkit-transform:rotate(360deg)}}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.lds-ellipsis{display:inline-block;position:relative;width:80px;height:80px}.lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}@keyframes lds-ellipsis1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}#dlg-preview-popup .modal-body .img{max-width:100%;display:block;margin:0 auto}quill-editor .ql-container{min-height:300px;overflow:auto}quill-editor .ql-toolbar{position:sticky!important;top:3.9rem;z-index:12;background-color:#fff}.snowflake{display:block;position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:-webkit-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-moz-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-ms-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%)}#snow{position:fixed;width:100%;height:100%}.star-rating{margin:0;padding:0;display:inline-block}.star-rating .star{padding:1px;color:#ddd;font-size:12px;text-shadow:.05em .05em #aaa;list-style-type:none;display:inline-block;cursor:pointer}.star-rating .star.filled{color:#fd0}.star-rating.readonly .star.filled{color:#666}.youtube{background-color:#000;margin-bottom:30px;position:relative;padding-top:56.25%;overflow:hidden;cursor:pointer}.youtube img{width:100%;top:-16.82%;left:0;opacity:.7}.youtube .play-button{width:90px;height:60px;background-color:#333;box-shadow:0 0 30px rgba(0,0,0,.6);z-index:1;opacity:.8;border-radius:6px}.now-ui-icons.circle,tags-input[disabled] .tags,tags-input[disabled] .tags .input{background-color:#eee}.youtube .play-button:before{border-style:solid;border-width:15px 0 15px 26px;border-color:transparent transparent transparent #fff}.youtube .play-button,.youtube img{cursor:pointer}.youtube .play-button,.youtube .play-button:before,.youtube iframe,.youtube img{position:absolute}.youtube .play-button,.youtube .play-button:before{top:50%;left:50%;transform:translate3d(-50%,-50%,0)}.youtube iframe{height:100%;width:100%;top:0;left:0}tags-input{box-shadow:none;border:none;padding:0;min-height:34px}tags-input .tags{border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}tags-input .tags .tag-item{color:#000}tags-input .tags .tag-item.selected{color:#fff;border:1px solid #d43f3a}tags-input .tags.focused{border:1px solid #66afe9}tags-input .autocomplete{border-radius:4px}tags-input.ng-invalid .tags{border-color:#843534}.input-group tags-input{padding:0;display:table-cell}.input-group tags-input:not(:first-child) .tags{border-top-left-radius:0;border-bottom-left-radius:0}.input-group tags-input:not(:last-child) .tags{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-lg tags-input:first-child .tags{border-top-left-radius:6px;border-bottom-left-radius:6px}.input-group-lg tags-input:last-child .tags{border-top-right-radius:6px;border-bottom-right-radius:6px}.input-group-sm tags-input:first-child .tags{border-top-left-radius:3px;border-bottom-left-radius:3px}.input-group-sm tags-input:last-child .tags{border-top-right-radius:3px;border-bottom-right-radius:3px}.input-group-lg tags-input,tags-input.ti-input-lg{min-height:46px}.input-group-lg tags-input .tags,tags-input.ti-input-lg .tags{border-radius:6px}.input-group-lg tags-input .tags .tag-item,tags-input.ti-input-lg .tags .tag-item{height:38px;line-height:37px;font-size:18px;border-radius:6px}.input-group-lg tags-input .tags .tag-item .remove-button,tags-input.ti-input-lg .tags .tag-item .remove-button{font-size:20px}.input-group-lg tags-input .tags .input,tags-input.ti-input-lg .tags .input{height:38px;font-size:18px}.input-group-sm tags-input,tags-input.ti-input-sm{min-height:30px}.input-group-sm tags-input .tags,tags-input.ti-input-sm .tags{border-radius:3px}.input-group-sm tags-input .tags .tag-item,tags-input.ti-input-sm .tags .tag-item{height:22px;line-height:21px;font-size:12px;border-radius:3px}.input-group-sm tags-input .tags .tag-item .remove-button,tags-input.ti-input-sm .tags .tag-item .remove-button{font-size:16px}.input-group-sm tags-input .tags .input,tags-input.ti-input-sm .tags .input{height:22px;font-size:12px}.has-feedback tags-input .tags{padding-right:30px}.has-success tags-input .tags{border-color:#3c763d}.has-success tags-input .tags.focused{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-error tags-input .tags{border-color:#a94442}.has-error tags-input .tags.focused{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-warning tags-input .tags{border-color:#8a6d3b}.has-warning tags-input .tags.focused{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{margin:5px 0;position:relative;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;background:-webkit-linear-gradient(top,#f0f9ff 0,#cbebff 47%,#a1dbff 100%);background:linear-gradient(to bottom,#f0f9ff 0,#cbebff 47%,#a1dbff 100%)}tags-input .tags .tag-item.selected{background:-webkit-linear-gradient(top,#febbbb 0,#fe9090 45%,#ff5c5c 100%);background:linear-gradient(to bottom,#febbbb 0,#fe9090 45%,#ff5c5c 100%)}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}.CodeMirror-gutter-elt,tags-input[disabled] .tags,tags-input[disabled] .tags .input,tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}.portal-menus .handle{cursor:move}body,html{height:100%}.btn,.btn-link{cursor:pointer}.display-4{font-size:2rem!important}div[dnd-list],ul[dnd-list]{min-height:42px;padding-left:0}div[dnd-list] .dndDraggingSource,ul[dnd-list] .dndDraggingSource{display:none}div[dnd-list] .dndPlaceholder,ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}div[dnd-list] .dnd-item,ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}div[dnd-list] .dnd-item.selected,ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}.custom-file-img{max-width:100%}.md-avatar{vertical-align:middle;width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important;margin-left:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}#modal-posts img,medias #modal-files .modal-body .table img{height:30px}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}.content{width:100%;display:flex;align-items:center;flex-direction:column;background:0 0}.flag-icon,.flag-icon-background{background-size:contain;background-position:50%}fb-login{background-color:#0ff}medias .modal{z-index:1049}medias #modal-files .modal-body .table img.preview{height:auto}mix-column-preview .row{max-height:120px;margin:10px 0;overflow:hidden}mix-module-data-table .data-table .header{padding:5px;color:#495057;background-color:hsla(var(--primary-color-hue,211),100%,50%,.075);border-color:#dee2e6;font-weight:400;font-size:small}mix-module-data-table .preview-container{max-height:4em;overflow:hidden}upload-croppie .cr-boundary{overflow:hidden}main-side-bar-dynamic .sw-sidebar .sw-toc-item{position:relative}main-side-bar-dynamic .sw-sidebar .sw-toc-item .sw-toc-link .sw-toc-link{padding-left:0}main-side-bar-dynamic .sw-sidebar .sw-toc-item .btn-group{right:20px;opacity:1}main-side-bar-dynamic .sw-sidebar ul{padding-left:15px}main-side-bar-dynamic .sw-sidebar .sw-toc-sub-link .btn-group{padding:2px 0}.custom-image{max-width:30vw}.attr-set-value-item:last-child{border-bottom:0!important}@media (min-width:992px){#modal-content-filter .modal-lg,#modal-content-filter .modal-xl{max-width:80vw}}.table-data td.preview{max-width:120px;overflow:hidden}.img-container>img,.img-preview>img{max-width:100%}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem;overflow:hidden}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor{color:#000}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}.bootstrap-tagsinput,.cm-tab,.cr-rotate-controls i:before,.flag-icon,.now-ui-icons{display:inline-block}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;border-radius:50%}.fa-ul,.nc-icon-ul{padding-left:0;list-style-type:none}.nc-icon-ul{margin-left:2.14285714em}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.flag-icon-background{background-repeat:no-repeat}.flag-icon{background-repeat:no-repeat;position:relative;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{font-style:normal;font-weight:900;font-size:22px}.cm-em,.hljs-comment,.hljs-emphasis,.hljs-quote,.tui-editor-contents address,.tui-editor-contents cite,.tui-editor-contents dfn,.tui-editor-contents em,.tui-editor-contents i,.tui-editor-contents var{font-style:italic}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.CodeMirror{height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{text-decoration:inherit}.cm-link,.tui-editor-contents a{text-decoration:underline}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror,.te-input-language input,.te-ww-block-overlay.code-block-header,.tui-editor-defaultUI{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-strong{font-weight:700}.tui-editor-contents :not(table){line-height:160%;box-sizing:content-box}.tui-editor-contents strong{font-weight:700}.tui-editor-contents p{margin:10px 0;color:#555}.tui-editor-contents>div>div:first-of-type h1,.tui-editor-contents>h1:first-of-type{margin-top:14px}.tui-editor-contents h1,.tui-editor-contents h2,.tui-editor-contents h3,.tui-editor-contents h5{font-weight:700}.tui-editor-contents h1{font-size:1.6rem;line-height:28px;border-bottom:3px double #999;margin:52px 0 15px;padding-bottom:7px;color:#000}.tui-editor-contents h2{font-size:1.3rem;line-height:23px;border-bottom:1px solid #dbdbdb;margin:30px 0 13px;padding-bottom:7px;color:#333}.tui-editor-contents h3,.tui-editor-contents h4{font-size:1.2rem;line-height:18px;margin:20px 0 2px;color:#333}.tui-editor-contents h5,.tui-editor-contents h6{font-size:1rem;line-height:17px;margin:10px 0 -4px;color:#333}.tui-editor-contents blockquote{margin:15px 0;border-left:4px solid #ddd;padding:0 15px;color:#777}.tui-editor-contents blockquote>:first-child{margin-top:0}.tui-editor-contents blockquote>:last-child{margin-bottom:0}.tui-editor-contents code,.tui-editor-contents pre{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;border:0;border-radius:0}.tui-editor-contents pre{margin:2px 0 8px;padding:18px;background-color:#f5f7f8}.tui-editor-contents code{color:#c1788b;padding:4px 4px 2px 0;letter-spacing:-.3px}.tui-editor-contents pre code{padding:0;color:inherit;white-space:pre-wrap;background-color:transparent}.tui-editor-contents pre.addon{border:1px solid #e8ebed;background-color:#fff}.tui-editor-contents img{margin:4px 0 10px;box-sizing:border-box;vertical-align:top;max-width:100%}.tui-editor-contents table{margin:2px 0 14px;color:#555;width:auto;border-collapse:collapse;box-sizing:border-box}.tui-editor-contents table td,.tui-editor-contents table th{height:32px;padding:5px 14px 5px 12px}.tui-editor-contents table td{border:1px solid #eaeaea}.tui-editor-contents table th{border:1px solid #72777b;border-top:0;background-color:#7b8184;font-weight:300;color:#fff;padding-top:6px}.tui-editor-contents dir,.tui-editor-contents menu,.tui-editor-contents ol,.tui-editor-contents ul{display:block;list-style-type:disc;padding-left:17px;margin:6px 0 10px;color:#555}.tui-editor-contents ol{list-style-type:decimal}.tui-editor-contents ol ol,.tui-editor-contents ol ul,.tui-editor-contents ul ol,.tui-editor-contents ul ul{margin-top:0!important;margin-bottom:0!important}.tui-editor-contents ol li,.tui-editor-contents ul li{position:relative}.tui-editor-contents ul p,ol p{margin:0}.tui-editor-contents ol li.task-list-item:before,.tui-editor-contents pre ul li:before,.tui-editor-contents ul li.task-list-item:before{content:""}.tui-editor-contents hr{border-top:1px solid #eee;margin:16px 0}.tui-editor-contents a{color:#5286bc}.tui-editor-contents a:hover{color:#007cff}.tui-editor-contents{font-size:13px;margin:0;padding:0}.tui-editor-contents .task-list-item{border:0;list-style:none;padding-left:22px;margin-left:-22px}.tui-editor-contents .task-list-item:before{background-repeat:no-repeat;background-size:16px 16px;background-position:center;content:"";height:18px;width:18px;position:absolute;left:0;top:1px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item.checked:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item .task-list-item-checkbox,.tui-editor-contents .task-list-item input[type=checkbox]{margin-left:-17px;margin-right:3.8px;margin-top:3px}.tui-editor-contents-placeholder:before{content:attr(data-placeholder);color:grey;line-height:160%;position:absolute}.auto-height,.auto-height .tui-editor-defaultUI{height:auto}.auto-height .tui-editor{position:relative}:not(.auto-height)>.tui-editor-defaultUI,:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{-ms-flex:1;flex:1}.tui-editor-defaultUI-toolbar:after,.tui-editor:after{content:"";display:block;height:0;clear:both}.tui-editor{position:absolute;line-height:1;color:#181818;width:100%;height:inherit}.te-editor-section{min-height:0;position:relative;height:inherit}.te-md-container{display:none;overflow:hidden;height:100%}.te-md-container .te-editor{line-height:1.5}.te-md-container .te-editor,.te-md-container .te-preview{box-sizing:border-box;padding:0;height:inherit}.te-md-container .CodeMirror{font-size:13px;height:inherit}.te-md-container .te-preview{overflow:auto;padding:0 25px;height:100%}.te-md-container .te-preview>p:first-child{margin-top:0!important}.te-md-container .te-preview .tui-editor-contents{padding-top:11px}.tui-editor .te-preview-style-tab>.te-editor,.tui-editor .te-preview-style-tab>.te-preview{float:left;width:100%;display:none}.tui-editor .te-preview-style-tab>.te-tab-active{display:block}.tui-editor .te-preview-style-vertical>.te-tab-section{display:none}.tui-editor .te-preview-style-tab>.te-tab-section{display:block}.tui-editor .te-preview-style-vertical .te-editor,.tui-editor .te-preview-style-vertical .te-preview{float:left;width:50%}.tui-editor .te-md-splitter{display:none;position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #e5e5e5}.tui-editor .te-preview-style-vertical .te-md-splitter{display:block}.te-ww-container{display:none;overflow:hidden;z-index:10;height:inherit;background-color:#fff}.te-ww-container>.te-editor{overflow:auto;height:inherit}.te-ww-container .tui-editor-contents:focus{outline:0}.te-ww-container .tui-editor-contents{padding:0 25px}.te-ww-container .tui-editor-contents:first-child{box-sizing:border-box;margin:0;padding:16px 25px 0;height:inherit}.te-ww-container .tui-editor-contents:last-child{margin-bottom:16px}.te-md-mode .te-md-container,.te-ww-mode .te-ww-container{display:block;z-index:100}.tui-editor-defaultUI.te-hide,.tui-editor.te-hide{display:none}.tui-editor-defaultUI .CodeMirror-lines{padding-top:13px;padding-bottom:13px}.tui-editor-defaultUI .CodeMirror-line{padding-left:25px;padding-right:25px}.tui-editor-defaultUI .CodeMirror pre.CodeMirror-placeholder{padding-left:25px;color:grey}.tui-editor-defaultUI .CodeMirror-scroll{cursor:text}.tui-editor-contents td.te-cell-selected{background-color:#d8dfec}.tui-editor-contents td.te-cell-selected::selection{background-color:#d8dfec}.tui-editor-contents th.te-cell-selected{background-color:#908f8f}.tui-editor-contents th.te-cell-selected::selection{background-color:#908f8f}.tui-editor-defaultUI{position:relative;border:1px solid #e5e5e5;height:100%}.tui-editor-defaultUI button{color:#fff;padding:0 14px 0 15px;height:28px;font-size:12px;border:none;cursor:pointer;outline:0}.tui-editor-defaultUI button.te-ok-button{background-color:#4b96e6}.tui-editor-defaultUI button.te-close-button{background-color:#777}.tui-editor-defaultUI-toolbar{padding:0 25px;height:31px;background-color:#fff;border:0;overflow:hidden}.tui-toolbar-divider{float:left;display:inline-block;width:1px;height:14px;background-color:#ddd;margin:9px 6px}.tui-toolbar-button-group{height:28px;border-right:1px solid #d9d9d9;float:left}.te-toolbar-section{height:32px;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.tui-editor-defaultUI-toolbar button{float:left;box-sizing:border-box;outline:0;cursor:pointer;background-color:#fff;width:22px;height:22px;padding:3px;border-radius:0;margin:5px 3px;border:1px solid #fff}.tui-editor-defaultUI-toolbar button.active,.tui-editor-defaultUI-toolbar button:active,.tui-editor-defaultUI-toolbar button:hover{border:1px solid #aaa;background-color:#fff}.tui-editor-defaultUI-toolbar button:first-child{margin-left:0}.tui-editor-defaultUI-toolbar button:last-child{margin-right:0}.tui-editor-defaultUI-toolbar button.tui-scrollsync{width:auto;color:#777;border:0}.tui-editor-defaultUI button.tui-scrollsync:after{content:"Scroll off"}.tui-editor-defaultUI button.tui-scrollsync.active{color:#125de6;font-weight:700}.tui-editor-defaultUI button.tui-scrollsync.active:after{content:"Scroll on"}.tui-editor-defaultUI .te-mode-switch-section{background-color:#f9f9f9;border-top:1px solid #e5e5e5;height:20px;font-size:12px}.tui-editor-defaultUI .te-mode-switch{float:right;height:100%}.tui-editor-defaultUI .te-switch-button{width:92px;height:inherit;background:#e5e5e5;outline:0;color:#a0aabf;cursor:pointer;border:0;border-left:1px solid #ddd;border-right:1px solid #ddd}.tui-editor-defaultUI .te-switch-button.active{background-color:#fff;color:#000}.tui-editor-defaultUI .te-markdown-tab-section{float:left;height:31px;background:#fff}.te-markdown-tab-section .te-tab{margin:0 -7px 0 24px;background:#fff}.tui-editor-defaultUI .te-tab button{box-sizing:border-box;line-height:100%;position:relative;cursor:pointer;z-index:1;font-size:13px;background-color:#f9f9f9;border:1px solid #e5e5e5;border-top:0;padding:0 9px;color:#777;border-radius:0;outline:0}.te-markdown-tab-section .te-tab button:last-child{margin-left:-1px}.te-markdown-tab-section .te-tab button.te-tab-active,.te-markdown-tab-section .te-tab button:hover.te-tab-active{background-color:#fff;color:#333;border-bottom:1px solid #fff;z-index:2}.te-markdown-tab-section .te-tab button:hover{background-color:#fff;color:#333}.tui-popup-modal-background{background-color:rgba(202,202,202,.6);position:fixed;margin:0;left:0;top:0;width:100%;height:100%;z-index:9999}.tui-popup-modal-background.fit-window .tui-popup-wrapper,.tui-popup-wrapper.fit-window{width:100%;height:100%}.tui-popup-wrapper{width:500px;margin-right:auto;border:1px solid #cacaca;background:#fff;z-index:9999}.tui-popup-modal-background .tui-popup-wrapper{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0}.tui-popup-header{padding:10px;height:auto;line-height:normal;position:relative;border-bottom:1px solid #cacaca}.tui-popup-header .tui-popup-header-buttons{float:right}.tui-popup-header .tui-popup-header-buttons button{padding:0;background-color:transparent;background-size:cover;float:left}.tui-popup-header .tui-popup-close-button{margin:3px;width:13px;height:13px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMHB4IiBoZWlnaHQ9IjEwcHgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5GMjc2Qzc4MC0zM0JBLTQ3MTItQTM3OC04RkQwQUNDOTFDRTk8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImxuYi1mb2xkZXItZGVsIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM3Nzc3NzciPiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LDMuNTg1Nzg2NDQgTDEuNzA3MTA2NzgsMC4yOTI4OTMyMTkgTDAuMjkyODkzMjE5LDEuNzA3MTA2NzggTDMuNTg1Nzg2NDQsNSBMMC4yOTI4OTMyMTksOC4yOTI4OTMyMiBMMS43MDcxMDY3OCw5LjcwNzEwNjc4IEw1LDYuNDE0MjEzNTYgTDguMjkyODkzMjIsOS43MDcxMDY3OCBMOS43MDcxMDY3OCw4LjI5Mjg5MzIyIEw2LjQxNDIxMzU2LDUgTDkuNzA3MTA2NzgsMS43MDcxMDY3OCBMOC4yOTI4OTMyMiwwLjI5Mjg5MzIxOSBMNSwzLjU4NTc4NjQ0IFoiIGlkPSJDb21iaW5lZC1TaGFwZSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-header .tui-popup-title{font-size:13px;font-weight:700;color:#333;vertical-align:bottom}.tui-popup-body{padding:15px;font-size:12px}.tui-editor-popup{position:absolute;top:30px;left:50%;margin-left:-250px}.tui-editor-popup.tui-popup-modal-background{position:fixed;top:0;left:0;margin:0}.tui-editor-popup .tui-popup-body label{font-weight:700;color:#666;display:block;margin:10px 0 5px}.tui-editor-popup .tui-popup-body .te-button-section{margin-top:15px}.tui-editor-popup .tui-popup-body input[type=file],.tui-editor-popup .tui-popup-body input[type=text]{padding:4px 10px;border:1px solid #bfbfbf;box-sizing:border-box;width:100%}.tui-editor-popup .tui-popup-body input.wrong{border-color:red}.te-popup-add-link .tui-popup-wrapper{height:219px}.te-popup-add-image .tui-popup-wrapper{height:243px}.te-popup-add-image .te-tab{display:block;background:0 0;border-bottom:1px solid #ebebeb;margin-bottom:8px}.te-dropdown-toolbar .tui-toolbar-divider,.te-popup-add-image .te-file-type,.te-popup-add-image .te-url-type,.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-toggle-slider{display:none}.te-popup-add-image div.te-tab-active,.te-popup-add-image form.te-tab-active{display:block}.te-popup-add-image .te-tab button{border:1px solid #ccc;background:#eee;min-width:100px;margin-left:-1px;border-bottom:0;border-radius:3px 3px 0 0}.te-popup-add-image .te-tab button.te-tab-active{background:#fff}.te-popup-add-table .te-table-selection{position:relative}.te-popup-add-table .te-table-body{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZmspKREMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgAMSwQgckFvTgAAAABJRU5ErkJggg==)}.te-popup-add-table .te-table-header{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZksLCxMMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgDxKwPzTeWPdAAAAABJRU5ErkJggg==)}.te-popup-add-table .te-selection-area{position:absolute;top:0;left:0;background:#80d2ff;opacity:.3;z-index:999}.te-popup-add-table .te-description{margin:10px 0 0;text-align:center}.te-popup-table-utils{width:120px}.te-popup-table-utils .tui-popup-body{padding:0}.te-popup-table-utils button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:28px;text-align:left;color:#777}.fa-inverse,.mi-inverse,.tui-tooltip{color:#fff}.te-popup-table-utils button:hover{background-color:#f4f4f4}.te-popup-table-utils hr{background-color:#cacaca;border-style:none;height:1px}.te-heading-add{width:auto}.te-heading-add .tui-popup-body{padding:0}.te-heading-add h1,.te-heading-add h2,.te-heading-add h3,.te-heading-add h4,.te-heading-add h5,.te-heading-add h6,.te-heading-add p,.te-heading-add ul{padding:0;margin:0}.te-heading-add ul{list-style:none}.te-heading-add ul li{padding:2px 10px;cursor:pointer}.te-dropdown-toolbar .tui-popup-body,.tui-popup-color{padding:0}.te-heading-add ul li:hover{background-color:#eee}.te-heading-add h1{font-size:24px}.te-heading-add h2{font-size:22px}.te-heading-add h3{font-size:20px}.te-heading-add h4{font-size:18px}.te-heading-add h5{font-size:16px}.te-heading-add h6{font-size:14px}.te-dropdown-toolbar{position:absolute;width:auto}.tui-popup-color .tui-colorpicker-container,.tui-popup-color .tui-colorpicker-palette-container{width:144px}.tui-popup-color .tui-colorpicker-container ul{width:144px;margin-bottom:8px}.tui-popup-color .tui-colorpicker-container li{padding:0 1px 1px 0}.tui-popup-color .tui-colorpicker-container li .tui-colorpicker-palette-button{border:0;width:17px;height:17px}.tui-popup-color .tui-popup-body{padding:10px}.tui-popup-color .te-apply-button,.tui-popup-color .tui-colorpicker-palette-hex{float:right}.tui-popup-color .te-apply-button{height:21px;width:35px;background:#fff;border:1px solid #efefef;position:absolute;bottom:141px;right:10px}.tui-tooltip,.tui-tooltip .arrow{background-color:#222;position:absolute}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-hex{border:1px solid #E1E1E1;padding:3px 14px;margin-left:-1px}.tui-popup-color .tui-colorpicker-container div.tui-colorpicker-clearfix{display:inline-block}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-preview{width:19px;height:19px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-slider-right{width:22px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-huebar-handle{display:none}.tui-tooltip{z-index:999;opacity:.8;padding:2px 5px;font-size:10px}.tui-tooltip .arrow{content:"";display:inline-block;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:6px;z-index:-1}.tui-toolbar-icons{background:url(tui-editor.png);background-size:218px 188px;display:inline-block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.tui-toolbar-icons{background:url(tui-editor-2x.png);background-size:218px 188px;display:inline-block}}.tui-toolbar-icons.tui-heading{background-position:-172px -48px}.tui-toolbar-icons.tui-heading:disabled{background-position:-193px -48px}.tui-toolbar-icons.tui-bold{background-position:-4px -4px}.tui-toolbar-icons.tui-bold:disabled{background-position:-25px -4px}.tui-toolbar-icons.tui-italic{background-position:-4px -48px}.tui-toolbar-icons.tui-italic:disabled{background-position:-25px -48px}.tui-toolbar-icons.tui-color{background-position:-172px -70px}.tui-toolbar-icons.tui-color:disabled{background-position:-193px -70px}.tui-toolbar-icons.tui-strike{background-position:-4px -26px}.tui-toolbar-icons.tui-strike:disabled{background-position:-25px -26px}.tui-toolbar-icons.tui-hrline{background-position:-46px -92px}.tui-toolbar-icons.tui-hrline:disabled{background-position:-67px -92px}.tui-toolbar-icons.tui-quote{background-position:-4px -114px}.tui-toolbar-icons.tui-quote:disabled{background-position:-25px -114px}.tui-toolbar-icons.tui-ul{background-position:-46px -4px}.tui-toolbar-icons.tui-ul:disabled{background-position:-67px -4px}.tui-toolbar-icons.tui-ol{background-position:-46px -26px}.tui-toolbar-icons.tui-ol:disabled{background-position:-67px -26px}.tui-toolbar-icons.tui-task{background-position:-130px -48px}.tui-toolbar-icons.tui-task:disabled{background-position:-151px -48px}.tui-toolbar-icons.tui-indent{background-position:-46px -48px}.tui-toolbar-icons.tui-indent:disabled{background-position:-67px -48px}.tui-toolbar-icons.tui-outdent{background-position:-46px -70px}.tui-toolbar-icons.tui-outdent:disabled{background-position:-67px -70px}.tui-toolbar-icons.tui-table{background-position:-88px -92px}.tui-toolbar-icons.tui-table:disabled{background-position:-109px -92px}.tui-toolbar-icons.tui-image{background-position:-130px -4px}.tui-toolbar-icons.tui-image:disabled{background-position:-151px -4px}.tui-toolbar-icons.tui-link{background-position:-130px -26px}.tui-toolbar-icons.tui-link:disabled{background-position:-151px -26px}.tui-toolbar-icons.tui-code{background-position:-130px -92px}.tui-toolbar-icons.tui-code:disabled{background-position:-151px -92px}.tui-toolbar-icons.tui-codeblock{background-position:-130px -70px}.tui-toolbar-icons.tui-codeblock:disabled{background-position:-151px -70px}.tui-toolbar-icons.tui-more{background-position:-172px -92px}.tui-toolbar-icons.tui-more:disabled{background-position:-193px -92px}.tui-colorpicker-svg-huebar,.tui-colorpicker-svg-slider,.tui-colorpicker-vml-slider{border:1px solid #ebebeb}.CodeMirror-sizer{margin-top:6px}.CodeMirror .cm-header{font-weight:700;color:inherit}.CodeMirror .cm-header-1{font-size:24px}.CodeMirror .cm-header-2{font-size:22px}.CodeMirror .cm-header-3{font-size:20px}.CodeMirror .cm-header-4{font-size:18px}.CodeMirror .cm-header-5{font-size:16px}.CodeMirror .cm-header-6{font-size:14px}.CodeMirror .cm-variable-2{color:inherit}.tui-editor-pseudo-clipboard{position:fixed;left:-1000px;top:-1000px;width:100px;height:100px}.te-ww-block-overlay.code-block-header{text-align:right}.te-ww-block-overlay.code-block-header span{font-size:10px;font-weight:600;padding:0 10px;color:#333;cursor:default}.te-ww-block-overlay.code-block-header button{margin:8px;font-size:10px;color:#333;background-color:#f9f9f9;border:1px solid #ddd;padding:4px;height:auto}.te-popup-code-block-languages{position:fixed;box-sizing:border-box;width:130px}.te-popup-code-block-languages .tui-popup-body{max-height:169px;overflow:auto;padding:0}.te-popup-code-block-languages button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:24px;text-align:left;color:#777}.te-popup-code-block-languages button.active{background-color:#f4f4f4}.tui-popup-code-block-editor .tui-popup-wrapper{width:70%;height:70%;margin:auto;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.te-input-language{position:relative;margin-left:15px;cursor:pointer}.te-input-language input{font-size:10px;padding:3px 5px;border:1px solid #ddd;background-color:#f9f9f9;box-sizing:border-box;width:130px;outline:0}.te-input-language input::-ms-clear{display:none}.te-input-language::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT42Q0NBRDk2QS0yMjYxLTRFNDAtOTk1RC1DRUUyQUREQUQ3NkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLWQtc2lkZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS03IiBwb2ludHM9IjIgNSAxMCA1IDYgMTAiPjwvcG9seWdvbj4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);position:absolute;top:1px;right:3px}.te-input-language.active::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BNEZDRkIzMy0zNjdBLTREMjAtOEEyNC1DQ0I2ODFBMDZDODg8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLXVwLXNpZGUiIGZpbGw9IiM1NTU1NTUiPiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJSZWN0YW5nbGUtNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC02LjAwMDAwMCwgLTYuNTAwMDAwKSAiIHBvaW50cz0iMiA0IDEwIDQgNiA5Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor button{margin:-1px 3px}.tui-popup-code-block-editor .tui-popup-header-buttons{height:20px}.tui-popup-code-block-editor .popup-editor-toggle-preview::after{content:'Preview off';color:#777;margin-right:22px}.tui-popup-code-block-editor .popup-editor-toggle-preview.active::after{content:'Preview on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-scroll::after{content:'Scroll off';color:#777;margin-right:16px}.tui-popup-code-block-editor .popup-editor-toggle-scroll.active::after{content:'Scroll on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-fit{width:18px;height:18px;margin-top:4px;margin-right:14px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT40OUQ4RTYyMy1GRTAyLTQ1RUUtQkQ5Ri0xMjUyQjEzRTU1MkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLWV4cGFuZCIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBhdGggZD0iTTMsMyBMOSwzIEw5LDUgTDUsNSBMNSw5IEwzLDkgTDMsMyBaIE0xNSwxNSBMOSwxNSBMOSwxMyBMMTMsMTMgTDEzLDkgTDE1LDkgTDE1LDE1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC05LjAwMDAwMCwgLTkuMDAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZSIgZmlsbC1ydWxlPSJub256ZXJvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS41MDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMS41MDAwMDAsIC02LjUwMDAwMCkgIiBwb2ludHM9IjkuMDg1Nzg2NDQgNS41IDEyLjUgOC45MTQyMTM1NiAxMy45MTQyMTM2IDcuNSAxMC41IDQuMDg1Nzg2NDQiPjwvcG9seWdvbj4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZS1Db3B5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuNTAwMDAwLCAxMS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTYuNTAwMDAwLCAtMTEuNTAwMDAwKSAiIHBvaW50cz0iNC4wODU3ODY0NCAxMC41IDcuNSAxMy45MTQyMTM2IDguOTE0MjEzNTYgMTIuNSA1LjUgOS4wODU3ODY0NCI+PC9wb2x5Z29uPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-code-block-editor .popup-editor-toggle-fit.active{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT4wN0Q1MjlCRi1GNTIzLTREN0EtQTlGNi05NTUzNTU5RDNEMUE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLXJlZHVjZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDEyLjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNS41MDAwMDAsIC0xMi41MDAwMDApICIgcG9pbnRzPSIzLjA4NTc4NjQ0IDExLjUgNi41IDE0LjkxNDIxMzYgNy45MTQyMTM1NiAxMy41IDQuNSAxMC4wODU3ODY0Ij48L3BvbHlnb24+ICAgICAgICAgICAgPHBhdGggZD0iTTksOSBMMTUsOSBMMTUsMTEgTDExLDExIEwxMSwxNSBMOSwxNSBMOSw5IFogTTksOSBMMyw5IEwzLDcgTDcsNyBMNywzIEw5LDMgTDksOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCA5LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOS4wMDAwMDAsIC05LjAwMDAwMCkgIj48L3BhdGg+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzMiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNTAwMDAwLCA1LjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTIuNTAwMDAwLCAtNS41MDAwMDApICIgcG9pbnRzPSIxNC45MTQyMTM2IDYuNSAxMS41IDMuMDg1Nzg2NDQgMTAuMDg1Nzg2NCA0LjUgMTMuNSA3LjkxNDIxMzU2Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor .tui-popup-close-button{margin-top:6px}.tui-popup-code-block-editor .tui-popup-body{z-index:-1;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1;flex:1}.tui-split-scroll.single-content .tui-split-content-right,.tui-split-scroll.single-content .tui-splitter,.tui-split-scroll.single-content button.tui-scrollsync{display:none}.tui-popup-code-block-editor .popup-editor-body{position:relative;-ms-flex:1;flex:1;border-bottom:1px solid #cacaca}.tui-popup-code-block-editor .te-button-section{padding:15px}.tui-popup-code-block-editor .te-button-section button{float:left}.tui-popup-code-block-editor .tui-editor-contents pre{margin:0;background-color:transparent}.tui-popup-code-block-editor .CodeMirror{height:auto}.tui-popup-code-block-editor .CodeMirror-line{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;font-size:13px;line-height:160%;letter-spacing:-.3px}.tui-popup-code-block-editor .popup-editor-editor-wrapper{min-height:100%}.tui-split-scroll-wrapper{position:relative}.tui-split-scroll{position:absolute}.tui-split-scroll,.tui-split-scroll-wrapper{width:100%;height:100%}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{position:absolute;top:0;width:50%;box-sizing:border-box}.tui-split-scroll .tui-split-content-left{left:0}.tui-split-scroll .tui-split-content-right{left:50%}.tui-split-scroll .tui-splitter{position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #cacaca}.tui-split-scroll .tui-split-scroll-content{width:100%;height:100%;overflow:hidden;position:relative}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{height:100%;overflow-x:hidden;overflow-y:auto}.tui-split-scroll button.tui-scrollsync{top:10px;opacity:.2}.tui-split-scroll button.tui-scrollsync::after{content:"scroll off"}.tui-split-scroll.scroll-sync button.tui-scrollsync{opacity:.5}.tui-split-scroll.scroll-sync .tui-split-content-left,.tui-split-scroll.scroll-sync .tui-split-content-right{height:auto;overflow:initial}.tui-split-scroll.scroll-sync button.tui-scrollsync::after{content:"scroll on"}.tui-split-scroll.scroll-sync .tui-split-scroll-content{overflow-y:auto}.tui-split-scroll.single-content .tui-split-content-left{width:100%}.fa,.fa-stack,.fab,.fad,.fal,.far,.fas,.mi,.mi-stack{display:inline-block}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@supports (-ms-accelerator:true){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@media screen and (max-width:480px){.tui-popup-wrapper{max-width:300px}.tui-editor-popup{margin-left:-150px}.te-dropdown-toolbar{max-width:none}}/*! + */@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.CodeMirror{height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{text-decoration:inherit}.cm-link,.tui-editor-contents a{text-decoration:underline}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror,.te-input-language input,.te-ww-block-overlay.code-block-header,.tui-editor-defaultUI{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-strong{font-weight:700}.tui-editor-contents :not(table){line-height:160%;box-sizing:content-box}.tui-editor-contents strong{font-weight:700}.tui-editor-contents p{margin:10px 0;color:#555}.tui-editor-contents>div>div:first-of-type h1,.tui-editor-contents>h1:first-of-type{margin-top:14px}.tui-editor-contents h1,.tui-editor-contents h2,.tui-editor-contents h3,.tui-editor-contents h5{font-weight:700}.tui-editor-contents h1{font-size:1.6rem;line-height:28px;border-bottom:3px double #999;margin:52px 0 15px;padding-bottom:7px;color:#000}.tui-editor-contents h2{font-size:1.3rem;line-height:23px;border-bottom:1px solid #dbdbdb;margin:30px 0 13px;padding-bottom:7px;color:#333}.tui-editor-contents h3,.tui-editor-contents h4{font-size:1.2rem;line-height:18px;margin:20px 0 2px;color:#333}.tui-editor-contents h5,.tui-editor-contents h6{font-size:1rem;line-height:17px;margin:10px 0 -4px;color:#333}.tui-editor-contents blockquote{margin:15px 0;border-left:4px solid #ddd;padding:0 15px;color:#777}.tui-editor-contents blockquote>:first-child{margin-top:0}.tui-editor-contents blockquote>:last-child{margin-bottom:0}.tui-editor-contents code,.tui-editor-contents pre{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;border:0;border-radius:0}.tui-editor-contents pre{margin:2px 0 8px;padding:18px;background-color:#f5f7f8}.tui-editor-contents code{color:#c1788b;padding:4px 4px 2px 0;letter-spacing:-.3px}.tui-editor-contents pre code{padding:0;color:inherit;white-space:pre-wrap;background-color:transparent}.tui-editor-contents pre.addon{border:1px solid #e8ebed;background-color:#fff}.tui-editor-contents img{margin:4px 0 10px;box-sizing:border-box;vertical-align:top;max-width:100%}.tui-editor-contents table{margin:2px 0 14px;color:#555;width:auto;border-collapse:collapse;box-sizing:border-box}.tui-editor-contents table td,.tui-editor-contents table th{height:32px;padding:5px 14px 5px 12px}.tui-editor-contents table td{border:1px solid #eaeaea}.tui-editor-contents table th{border:1px solid #72777b;border-top:0;background-color:#7b8184;font-weight:300;color:#fff;padding-top:6px}.tui-editor-contents dir,.tui-editor-contents menu,.tui-editor-contents ol,.tui-editor-contents ul{display:block;list-style-type:disc;padding-left:17px;margin:6px 0 10px;color:#555}.tui-editor-contents ol{list-style-type:decimal}.tui-editor-contents ol ol,.tui-editor-contents ol ul,.tui-editor-contents ul ol,.tui-editor-contents ul ul{margin-top:0!important;margin-bottom:0!important}.tui-editor-contents ol li,.tui-editor-contents ul li{position:relative}.tui-editor-contents ul p,ol p{margin:0}.tui-editor-contents hr{border-top:1px solid #eee;margin:16px 0}.tui-editor-contents a{color:#5286bc}.tui-editor-contents a:hover{color:#007cff}.tui-editor-contents{font-size:13px;margin:0;padding:0}.tui-editor-contents .task-list-item{border:0;list-style:none;padding-left:22px;margin-left:-22px}.tui-editor-contents .task-list-item:before{background-repeat:no-repeat;background-size:16px 16px;background-position:center;height:18px;width:18px;position:absolute;left:0;top:1px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item.checked:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item .task-list-item-checkbox,.tui-editor-contents .task-list-item input[type=checkbox]{margin-left:-17px;margin-right:3.8px;margin-top:3px}.tui-editor-contents-placeholder:before{content:attr(data-placeholder);color:grey;line-height:160%;position:absolute}.auto-height,.auto-height .tui-editor-defaultUI{height:auto}.auto-height .tui-editor{position:relative}:not(.auto-height)>.tui-editor-defaultUI,:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{-ms-flex:1;flex:1}.tui-editor-defaultUI-toolbar:after,.tui-editor:after{content:"";display:block;height:0;clear:both}.tui-editor{position:absolute;line-height:1;color:#181818;width:100%;height:inherit}.te-editor-section{min-height:0;position:relative;height:inherit}.te-md-container{display:none;overflow:hidden;height:100%}.te-md-container .te-editor{line-height:1.5}.te-md-container .te-editor,.te-md-container .te-preview{box-sizing:border-box;padding:0;height:inherit}.te-md-container .CodeMirror{font-size:13px;height:inherit}.te-md-container .te-preview{overflow:auto;padding:0 25px;height:100%}.te-md-container .te-preview>p:first-child{margin-top:0!important}.te-md-container .te-preview .tui-editor-contents{padding-top:11px}.tui-editor .te-preview-style-tab>.te-editor,.tui-editor .te-preview-style-tab>.te-preview{float:left;width:100%;display:none}.tui-editor .te-preview-style-tab>.te-tab-active{display:block}.tui-editor .te-preview-style-vertical>.te-tab-section{display:none}.tui-editor .te-preview-style-tab>.te-tab-section{display:block}.tui-editor .te-preview-style-vertical .te-editor,.tui-editor .te-preview-style-vertical .te-preview{float:left;width:50%}.tui-editor .te-md-splitter{display:none;position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #e5e5e5}.tui-editor .te-preview-style-vertical .te-md-splitter{display:block}.te-ww-container{display:none;overflow:hidden;z-index:10;height:inherit;background-color:#fff}.te-ww-container>.te-editor{overflow:auto;height:inherit}.te-ww-container .tui-editor-contents:focus{outline:0}.te-ww-container .tui-editor-contents{padding:0 25px}.te-ww-container .tui-editor-contents:first-child{box-sizing:border-box;margin:0;padding:16px 25px 0;height:inherit}.te-ww-container .tui-editor-contents:last-child{margin-bottom:16px}.te-md-mode .te-md-container,.te-ww-mode .te-ww-container{display:block;z-index:100}.tui-editor-defaultUI.te-hide,.tui-editor.te-hide{display:none}.tui-editor-defaultUI .CodeMirror-lines{padding-top:13px;padding-bottom:13px}.tui-editor-defaultUI .CodeMirror-line{padding-left:25px;padding-right:25px}.tui-editor-defaultUI .CodeMirror pre.CodeMirror-placeholder{padding-left:25px;color:grey}.tui-editor-defaultUI .CodeMirror-scroll{cursor:text}.tui-editor-contents td.te-cell-selected{background-color:#d8dfec}.tui-editor-contents td.te-cell-selected::selection{background-color:#d8dfec}.tui-editor-contents th.te-cell-selected{background-color:#908f8f}.tui-editor-contents th.te-cell-selected::selection{background-color:#908f8f}.tui-editor-defaultUI{position:relative;border:1px solid #e5e5e5;height:100%}.tui-editor-defaultUI button{color:#fff;padding:0 14px 0 15px;height:28px;font-size:12px;border:none;cursor:pointer;outline:0}.tui-editor-defaultUI button.te-ok-button{background-color:#4b96e6}.tui-editor-defaultUI button.te-close-button{background-color:#777}.tui-editor-defaultUI-toolbar{padding:0 25px;height:31px;background-color:#fff;border:0;overflow:hidden}.tui-toolbar-divider{float:left;display:inline-block;width:1px;height:14px;background-color:#ddd;margin:9px 6px}.tui-toolbar-button-group{height:28px;border-right:1px solid #d9d9d9;float:left}.te-toolbar-section{height:32px;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.tui-editor-defaultUI-toolbar button{float:left;box-sizing:border-box;outline:0;cursor:pointer;background-color:#fff;width:22px;height:22px;padding:3px;border-radius:0;margin:5px 3px;border:1px solid #fff}.tui-editor-defaultUI-toolbar button.active,.tui-editor-defaultUI-toolbar button:active,.tui-editor-defaultUI-toolbar button:hover{border:1px solid #aaa;background-color:#fff}.tui-editor-defaultUI-toolbar button:first-child{margin-left:0}.tui-editor-defaultUI-toolbar button:last-child{margin-right:0}.tui-editor-defaultUI-toolbar button.tui-scrollsync{width:auto;color:#777;border:0}.tui-editor-defaultUI button.tui-scrollsync:after{content:"Scroll off"}.tui-editor-defaultUI button.tui-scrollsync.active{color:#125de6;font-weight:700}.tui-editor-defaultUI button.tui-scrollsync.active:after{content:"Scroll on"}.tui-editor-defaultUI .te-mode-switch-section{background-color:#f9f9f9;border-top:1px solid #e5e5e5;height:20px;font-size:12px}.tui-editor-defaultUI .te-mode-switch{float:right;height:100%}.tui-editor-defaultUI .te-switch-button{width:92px;height:inherit;background:#e5e5e5;outline:0;color:#a0aabf;cursor:pointer;border:0;border-left:1px solid #ddd;border-right:1px solid #ddd}.tui-editor-defaultUI .te-switch-button.active{background-color:#fff;color:#000}.tui-editor-defaultUI .te-markdown-tab-section{float:left;height:31px;background:#fff}.te-markdown-tab-section .te-tab{margin:0 -7px 0 24px;background:#fff}.tui-editor-defaultUI .te-tab button{box-sizing:border-box;line-height:100%;position:relative;cursor:pointer;z-index:1;font-size:13px;background-color:#f9f9f9;border:1px solid #e5e5e5;border-top:0;padding:0 9px;color:#777;border-radius:0;outline:0}.te-markdown-tab-section .te-tab button:last-child{margin-left:-1px}.te-markdown-tab-section .te-tab button.te-tab-active,.te-markdown-tab-section .te-tab button:hover.te-tab-active{background-color:#fff;color:#333;border-bottom:1px solid #fff;z-index:2}.te-markdown-tab-section .te-tab button:hover{background-color:#fff;color:#333}.tui-popup-modal-background{background-color:rgba(202,202,202,.6);position:fixed;margin:0;left:0;top:0;width:100%;height:100%;z-index:9999}.tui-popup-modal-background.fit-window .tui-popup-wrapper,.tui-popup-wrapper.fit-window{width:100%;height:100%}.tui-popup-wrapper{width:500px;margin-right:auto;border:1px solid #cacaca;background:#fff;z-index:9999}.tui-popup-modal-background .tui-popup-wrapper{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0}.tui-popup-header{padding:10px;height:auto;line-height:normal;position:relative;border-bottom:1px solid #cacaca}.tui-popup-header .tui-popup-header-buttons{float:right}.tui-popup-header .tui-popup-header-buttons button{padding:0;background-color:transparent;background-size:cover;float:left}.tui-popup-header .tui-popup-close-button{margin:3px;width:13px;height:13px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMHB4IiBoZWlnaHQ9IjEwcHgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5GMjc2Qzc4MC0zM0JBLTQ3MTItQTM3OC04RkQwQUNDOTFDRTk8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImxuYi1mb2xkZXItZGVsIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM3Nzc3NzciPiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LDMuNTg1Nzg2NDQgTDEuNzA3MTA2NzgsMC4yOTI4OTMyMTkgTDAuMjkyODkzMjE5LDEuNzA3MTA2NzggTDMuNTg1Nzg2NDQsNSBMMC4yOTI4OTMyMTksOC4yOTI4OTMyMiBMMS43MDcxMDY3OCw5LjcwNzEwNjc4IEw1LDYuNDE0MjEzNTYgTDguMjkyODkzMjIsOS43MDcxMDY3OCBMOS43MDcxMDY3OCw4LjI5Mjg5MzIyIEw2LjQxNDIxMzU2LDUgTDkuNzA3MTA2NzgsMS43MDcxMDY3OCBMOC4yOTI4OTMyMiwwLjI5Mjg5MzIxOSBMNSwzLjU4NTc4NjQ0IFoiIGlkPSJDb21iaW5lZC1TaGFwZSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-header .tui-popup-title{font-size:13px;font-weight:700;color:#333;vertical-align:bottom}.tui-popup-body{padding:15px;font-size:12px}.tui-editor-popup{position:absolute;top:30px;left:50%;margin-left:-250px}.tui-editor-popup.tui-popup-modal-background{position:fixed;top:0;left:0;margin:0}.tui-editor-popup .tui-popup-body label{font-weight:700;color:#666;display:block;margin:10px 0 5px}.tui-editor-popup .tui-popup-body .te-button-section{margin-top:15px}.tui-editor-popup .tui-popup-body input[type=file],.tui-editor-popup .tui-popup-body input[type=text]{padding:4px 10px;border:1px solid #bfbfbf;box-sizing:border-box;width:100%}.tui-editor-popup .tui-popup-body input.wrong{border-color:red}.te-popup-add-link .tui-popup-wrapper{height:219px}.te-popup-add-image .tui-popup-wrapper{height:243px}.te-popup-add-image .te-tab{display:block;background:0 0;border-bottom:1px solid #ebebeb;margin-bottom:8px}.te-dropdown-toolbar .tui-toolbar-divider,.te-popup-add-image .te-file-type,.te-popup-add-image .te-url-type,.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-toggle-slider{display:none}.te-popup-add-image div.te-tab-active,.te-popup-add-image form.te-tab-active{display:block}.te-popup-add-image .te-tab button{border:1px solid #ccc;background:#eee;min-width:100px;margin-left:-1px;border-bottom:0;border-radius:3px 3px 0 0}.te-popup-add-image .te-tab button.te-tab-active{background:#fff}.te-popup-add-table .te-table-selection{position:relative}.te-popup-add-table .te-table-body{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZmspKREMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgAMSwQgckFvTgAAAABJRU5ErkJggg==)}.te-popup-add-table .te-table-header{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZksLCxMMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgDxKwPzTeWPdAAAAABJRU5ErkJggg==)}.te-popup-add-table .te-selection-area{position:absolute;top:0;left:0;background:#80d2ff;opacity:.3;z-index:999}.te-popup-add-table .te-description{margin:10px 0 0;text-align:center}.te-popup-table-utils{width:120px}.te-popup-table-utils .tui-popup-body{padding:0}.te-popup-table-utils button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:28px;text-align:left;color:#777}.fa-inverse,.mi-inverse,.tui-tooltip{color:#fff}.te-popup-table-utils button:hover{background-color:#f4f4f4}.te-popup-table-utils hr{background-color:#cacaca;border-style:none;height:1px}.te-heading-add{width:auto}.te-heading-add .tui-popup-body{padding:0}.te-heading-add h1,.te-heading-add h2,.te-heading-add h3,.te-heading-add h4,.te-heading-add h5,.te-heading-add h6,.te-heading-add p,.te-heading-add ul{padding:0;margin:0}.te-heading-add ul{list-style:none}.te-heading-add ul li{padding:2px 10px;cursor:pointer}.te-dropdown-toolbar .tui-popup-body,.tui-popup-color{padding:0}.te-heading-add ul li:hover{background-color:#eee}.te-heading-add h1{font-size:24px}.te-heading-add h2{font-size:22px}.te-heading-add h3{font-size:20px}.te-heading-add h4{font-size:18px}.te-heading-add h5{font-size:16px}.te-heading-add h6{font-size:14px}.te-dropdown-toolbar{position:absolute;width:auto}.tui-popup-color .tui-colorpicker-container,.tui-popup-color .tui-colorpicker-palette-container{width:144px}.tui-popup-color .tui-colorpicker-container ul{width:144px;margin-bottom:8px}.tui-popup-color .tui-colorpicker-container li{padding:0 1px 1px 0}.tui-popup-color .tui-colorpicker-container li .tui-colorpicker-palette-button{border:0;width:17px;height:17px}.tui-popup-color .tui-popup-body{padding:10px}.tui-popup-color .te-apply-button,.tui-popup-color .tui-colorpicker-palette-hex{float:right}.tui-popup-color .te-apply-button{height:21px;width:35px;background:#fff;border:1px solid #efefef;position:absolute;bottom:141px;right:10px}.tui-tooltip,.tui-tooltip .arrow{background-color:#222;position:absolute}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-hex{border:1px solid #E1E1E1;padding:3px 14px;margin-left:-1px}.tui-popup-color .tui-colorpicker-container div.tui-colorpicker-clearfix{display:inline-block}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-preview{width:19px;height:19px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-slider-right{width:22px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-huebar-handle{display:none}.tui-tooltip{z-index:999;opacity:.8;padding:2px 5px;font-size:10px}.tui-tooltip .arrow{content:"";display:inline-block;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:6px;z-index:-1}.tui-toolbar-icons{background:url(tui-editor.png);background-size:218px 188px;display:inline-block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.tui-toolbar-icons{background:url(tui-editor-2x.png);background-size:218px 188px;display:inline-block}}.tui-toolbar-icons.tui-heading{background-position:-172px -48px}.tui-toolbar-icons.tui-heading:disabled{background-position:-193px -48px}.tui-toolbar-icons.tui-bold{background-position:-4px -4px}.tui-toolbar-icons.tui-bold:disabled{background-position:-25px -4px}.tui-toolbar-icons.tui-italic{background-position:-4px -48px}.tui-toolbar-icons.tui-italic:disabled{background-position:-25px -48px}.tui-toolbar-icons.tui-color{background-position:-172px -70px}.tui-toolbar-icons.tui-color:disabled{background-position:-193px -70px}.tui-toolbar-icons.tui-strike{background-position:-4px -26px}.tui-toolbar-icons.tui-strike:disabled{background-position:-25px -26px}.tui-toolbar-icons.tui-hrline{background-position:-46px -92px}.tui-toolbar-icons.tui-hrline:disabled{background-position:-67px -92px}.tui-toolbar-icons.tui-quote{background-position:-4px -114px}.tui-toolbar-icons.tui-quote:disabled{background-position:-25px -114px}.tui-toolbar-icons.tui-ul{background-position:-46px -4px}.tui-toolbar-icons.tui-ul:disabled{background-position:-67px -4px}.tui-toolbar-icons.tui-ol{background-position:-46px -26px}.tui-toolbar-icons.tui-ol:disabled{background-position:-67px -26px}.tui-toolbar-icons.tui-task{background-position:-130px -48px}.tui-toolbar-icons.tui-task:disabled{background-position:-151px -48px}.tui-toolbar-icons.tui-indent{background-position:-46px -48px}.tui-toolbar-icons.tui-indent:disabled{background-position:-67px -48px}.tui-toolbar-icons.tui-outdent{background-position:-46px -70px}.tui-toolbar-icons.tui-outdent:disabled{background-position:-67px -70px}.tui-toolbar-icons.tui-table{background-position:-88px -92px}.tui-toolbar-icons.tui-table:disabled{background-position:-109px -92px}.tui-toolbar-icons.tui-image{background-position:-130px -4px}.tui-toolbar-icons.tui-image:disabled{background-position:-151px -4px}.tui-toolbar-icons.tui-link{background-position:-130px -26px}.tui-toolbar-icons.tui-link:disabled{background-position:-151px -26px}.tui-toolbar-icons.tui-code{background-position:-130px -92px}.tui-toolbar-icons.tui-code:disabled{background-position:-151px -92px}.tui-toolbar-icons.tui-codeblock{background-position:-130px -70px}.tui-toolbar-icons.tui-codeblock:disabled{background-position:-151px -70px}.tui-toolbar-icons.tui-more{background-position:-172px -92px}.tui-toolbar-icons.tui-more:disabled{background-position:-193px -92px}.tui-colorpicker-svg-huebar,.tui-colorpicker-svg-slider,.tui-colorpicker-vml-slider{border:1px solid #ebebeb}.CodeMirror-sizer{margin-top:6px}.CodeMirror .cm-header{font-weight:700;color:inherit}.CodeMirror .cm-header-1{font-size:24px}.CodeMirror .cm-header-2{font-size:22px}.CodeMirror .cm-header-3{font-size:20px}.CodeMirror .cm-header-4{font-size:18px}.CodeMirror .cm-header-5{font-size:16px}.CodeMirror .cm-header-6{font-size:14px}.CodeMirror .cm-variable-2{color:inherit}.tui-editor-pseudo-clipboard{position:fixed;left:-1000px;top:-1000px;width:100px;height:100px}.te-ww-block-overlay.code-block-header{text-align:right}.te-ww-block-overlay.code-block-header span{font-size:10px;font-weight:600;padding:0 10px;color:#333;cursor:default}.te-ww-block-overlay.code-block-header button{margin:8px;font-size:10px;color:#333;background-color:#f9f9f9;border:1px solid #ddd;padding:4px;height:auto}.te-popup-code-block-languages{position:fixed;box-sizing:border-box;width:130px}.te-popup-code-block-languages .tui-popup-body{max-height:169px;overflow:auto;padding:0}.te-popup-code-block-languages button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:24px;text-align:left;color:#777}.te-popup-code-block-languages button.active{background-color:#f4f4f4}.tui-popup-code-block-editor .tui-popup-wrapper{width:70%;height:70%;margin:auto;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.te-input-language{position:relative;margin-left:15px;cursor:pointer}.te-input-language input{font-size:10px;padding:3px 5px;border:1px solid #ddd;background-color:#f9f9f9;box-sizing:border-box;width:130px;outline:0}.te-input-language input::-ms-clear{display:none}.te-input-language::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT42Q0NBRDk2QS0yMjYxLTRFNDAtOTk1RC1DRUUyQUREQUQ3NkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLWQtc2lkZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS03IiBwb2ludHM9IjIgNSAxMCA1IDYgMTAiPjwvcG9seWdvbj4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);position:absolute;top:1px;right:3px}.te-input-language.active::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BNEZDRkIzMy0zNjdBLTREMjAtOEEyNC1DQ0I2ODFBMDZDODg8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLXVwLXNpZGUiIGZpbGw9IiM1NTU1NTUiPiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJSZWN0YW5nbGUtNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC02LjAwMDAwMCwgLTYuNTAwMDAwKSAiIHBvaW50cz0iMiA0IDEwIDQgNiA5Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor button{margin:-1px 3px}.tui-popup-code-block-editor .tui-popup-header-buttons{height:20px}.tui-popup-code-block-editor .popup-editor-toggle-preview::after{content:'Preview off';color:#777;margin-right:22px}.tui-popup-code-block-editor .popup-editor-toggle-preview.active::after{content:'Preview on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-scroll::after{content:'Scroll off';color:#777;margin-right:16px}.tui-popup-code-block-editor .popup-editor-toggle-scroll.active::after{content:'Scroll on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-fit{width:18px;height:18px;margin-top:4px;margin-right:14px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT40OUQ4RTYyMy1GRTAyLTQ1RUUtQkQ5Ri0xMjUyQjEzRTU1MkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLWV4cGFuZCIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBhdGggZD0iTTMsMyBMOSwzIEw5LDUgTDUsNSBMNSw5IEwzLDkgTDMsMyBaIE0xNSwxNSBMOSwxNSBMOSwxMyBMMTMsMTMgTDEzLDkgTDE1LDkgTDE1LDE1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC05LjAwMDAwMCwgLTkuMDAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZSIgZmlsbC1ydWxlPSJub256ZXJvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS41MDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMS41MDAwMDAsIC02LjUwMDAwMCkgIiBwb2ludHM9IjkuMDg1Nzg2NDQgNS41IDEyLjUgOC45MTQyMTM1NiAxMy45MTQyMTM2IDcuNSAxMC41IDQuMDg1Nzg2NDQiPjwvcG9seWdvbj4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZS1Db3B5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuNTAwMDAwLCAxMS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTYuNTAwMDAwLCAtMTEuNTAwMDAwKSAiIHBvaW50cz0iNC4wODU3ODY0NCAxMC41IDcuNSAxMy45MTQyMTM2IDguOTE0MjEzNTYgMTIuNSA1LjUgOS4wODU3ODY0NCI+PC9wb2x5Z29uPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-code-block-editor .popup-editor-toggle-fit.active{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT4wN0Q1MjlCRi1GNTIzLTREN0EtQTlGNi05NTUzNTU5RDNEMUE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLXJlZHVjZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDEyLjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNS41MDAwMDAsIC0xMi41MDAwMDApICIgcG9pbnRzPSIzLjA4NTc4NjQ0IDExLjUgNi41IDE0LjkxNDIxMzYgNy45MTQyMTM1NiAxMy41IDQuNSAxMC4wODU3ODY0Ij48L3BvbHlnb24+ICAgICAgICAgICAgPHBhdGggZD0iTTksOSBMMTUsOSBMMTUsMTEgTDExLDExIEwxMSwxNSBMOSwxNSBMOSw5IFogTTksOSBMMyw5IEwzLDcgTDcsNyBMNywzIEw5LDMgTDksOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCA5LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOS4wMDAwMDAsIC05LjAwMDAwMCkgIj48L3BhdGg+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzMiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNTAwMDAwLCA1LjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTIuNTAwMDAwLCAtNS41MDAwMDApICIgcG9pbnRzPSIxNC45MTQyMTM2IDYuNSAxMS41IDMuMDg1Nzg2NDQgMTAuMDg1Nzg2NCA0LjUgMTMuNSA3LjkxNDIxMzU2Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor .tui-popup-close-button{margin-top:6px}.tui-popup-code-block-editor .tui-popup-body{z-index:-1;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1;flex:1}.tui-split-scroll.single-content .tui-split-content-right,.tui-split-scroll.single-content .tui-splitter,.tui-split-scroll.single-content button.tui-scrollsync{display:none}.tui-popup-code-block-editor .popup-editor-body{position:relative;-ms-flex:1;flex:1;border-bottom:1px solid #cacaca}.tui-popup-code-block-editor .te-button-section{padding:15px}.tui-popup-code-block-editor .te-button-section button{float:left}.tui-popup-code-block-editor .tui-editor-contents pre{margin:0;background-color:transparent}.tui-popup-code-block-editor .CodeMirror{height:auto}.tui-popup-code-block-editor .CodeMirror-line{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;font-size:13px;line-height:160%;letter-spacing:-.3px}.tui-popup-code-block-editor .popup-editor-editor-wrapper{min-height:100%}.tui-split-scroll-wrapper{position:relative}.tui-split-scroll{position:absolute}.tui-split-scroll,.tui-split-scroll-wrapper{width:100%;height:100%}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{position:absolute;top:0;width:50%;box-sizing:border-box}.tui-split-scroll .tui-split-content-left{left:0}.tui-split-scroll .tui-split-content-right{left:50%}.tui-split-scroll .tui-splitter{position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #cacaca}.tui-split-scroll .tui-split-scroll-content{width:100%;height:100%;overflow:hidden;position:relative}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{height:100%;overflow-x:hidden;overflow-y:auto}.tui-split-scroll button.tui-scrollsync{top:10px;opacity:.2}.tui-split-scroll button.tui-scrollsync::after{content:"scroll off"}.tui-split-scroll.scroll-sync button.tui-scrollsync{opacity:.5}.tui-split-scroll.scroll-sync .tui-split-content-left,.tui-split-scroll.scroll-sync .tui-split-content-right{height:auto;overflow:initial}.tui-split-scroll.scroll-sync button.tui-scrollsync::after{content:"scroll on"}.tui-split-scroll.scroll-sync .tui-split-scroll-content{overflow-y:auto}.tui-split-scroll.single-content .tui-split-content-left{width:100%}.fa,.fa-stack,.fab,.fad,.fal,.far,.fas,.mi,.mi-stack{display:inline-block}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@supports (-ms-accelerator:true){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@media screen and (max-width:480px){.tui-popup-wrapper{max-width:300px}.tui-editor-popup{margin-left:-150px}.te-dropdown-toolbar{max-width:none}}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x,.fa-stack-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{margin-left:2.5em}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.mi-stack,.mi-ul>li{position:relative}.fa-stack-1x{line-height:inherit}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}/*! diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js index 915dd015a..900d1c7d4 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js @@ -1 +1 @@ -/* Wed Aug 11 2021 22:38:25 GMT+0700 (Indochina Time) */!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],i=Object.getPrototypeOf,s=n.slice,r=n.flat?function(e){return n.flat.call(e)}:function(e){return n.concat.apply([],e)},o=n.push,a=n.indexOf,l={},c=l.toString,u=l.hasOwnProperty,d=u.toString,h=d.call(Object),f={},p=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},g=function(e){return null!=e&&e===e.window},m=e.document,v={type:!0,src:!0,nonce:!0,noModule:!0};function y(e,t,n){var i,s,r=(n=n||m).createElement("script");if(r.text=e,t)for(i in v)(s=t[i]||t.getAttribute&&t.getAttribute(i))&&r.setAttribute(i,s);n.head.appendChild(r).parentNode.removeChild(r)}function b(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var _="3.6.0",w=function(e,t){return new w.fn.init(e,t)};function x(e){var t=!!e&&"length"in e&&e.length,n=b(e);return!p(e)&&!g(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+B+")"+B+"*"),U=new RegExp(B+"|>"),X=new RegExp(F),V=new RegExp("^"+H+"$"),G={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+B+"*(even|odd|(([+-]|)(\\d*)n|)"+B+"*(?:([+-]|)"+B+"*(\\d+)|))"+B+"*\\)|)","i"),bool:new RegExp("^(?:"+M+")$","i"),needsContext:new RegExp("^"+B+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+B+"*((?:-\\d)?\\d*)"+B+"*\\)|)(?=[^-]|$)","i")},K=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+B+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},ie=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,se=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){h()},oe=_e(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{P.apply(D=I.call(w.childNodes),w.childNodes),D[w.childNodes.length].nodeType}catch(t){P={apply:D.length?function(e,t){j.apply(e,I.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function ae(e,t,i,s){var r,a,c,u,d,p,v,y=t&&t.ownerDocument,w=t?t.nodeType:9;if(i=i||[],"string"!=typeof e||!e||1!==w&&9!==w&&11!==w)return i;if(!s&&(h(t),t=t||f,g)){if(11!==w&&(d=Z.exec(e)))if(r=d[1]){if(9===w){if(!(c=t.getElementById(r)))return i;if(c.id===r)return i.push(c),i}else if(y&&(c=y.getElementById(r))&&b(t,c)&&c.id===r)return i.push(c),i}else{if(d[2])return P.apply(i,t.getElementsByTagName(e)),i;if((r=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return P.apply(i,t.getElementsByClassName(r)),i}if(n.qsa&&!k[e+" "]&&(!m||!m.test(e))&&(1!==w||"object"!==t.nodeName.toLowerCase())){if(v=e,y=t,1===w&&(U.test(e)||z.test(e))){for((y=ee.test(e)&&ve(t.parentNode)||t)===t&&n.scope||((u=t.getAttribute("id"))?u=u.replace(ie,se):t.setAttribute("id",u=_)),a=(p=o(e)).length;a--;)p[a]=(u?"#"+u:":scope")+" "+be(p[a]);v=p.join(",")}try{return P.apply(i,y.querySelectorAll(v)),i}catch(t){k(e,!0)}finally{u===_&&t.removeAttribute("id")}}}return l(e.replace(R,"$1"),t,i,s)}function le(){var e=[];return function t(n,s){return e.push(n+" ")>i.cacheLength&&delete t[e.shift()],t[n+" "]=s}}function ce(e){return e[_]=!0,e}function ue(e){var t=f.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var n=e.split("|"),s=n.length;s--;)i.attrHandle[n[s]]=t}function he(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ge(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&oe(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function me(e){return ce(function(t){return t=+t,ce(function(n,i){for(var s,r=e([],n.length,t),o=r.length;o--;)n[s=r[o]]&&(n[s]=!(i[s]=n[s]))})})}function ve(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ae.support={},r=ae.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!K.test(t||n&&n.nodeName||"HTML")},h=ae.setDocument=function(e){var t,s,o=e?e.ownerDocument||e:w;return o!=f&&9===o.nodeType&&o.documentElement&&(p=(f=o).documentElement,g=!r(f),w!=f&&(s=f.defaultView)&&s.top!==s&&(s.addEventListener?s.addEventListener("unload",re,!1):s.attachEvent&&s.attachEvent("onunload",re)),n.scope=ue(function(e){return p.appendChild(e).appendChild(f.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(f.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=J.test(f.getElementsByClassName),n.getById=ue(function(e){return p.appendChild(e).id=_,!f.getElementsByName||!f.getElementsByName(_).length}),n.getById?(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,i,s,r=t.getElementById(e);if(r){if((n=r.getAttributeNode("id"))&&n.value===e)return[r];for(s=t.getElementsByName(e),i=0;r=s[i++];)if((n=r.getAttributeNode("id"))&&n.value===e)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],s=0,r=t.getElementsByTagName(e);if("*"===e){for(;n=r[s++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],m=[],(n.qsa=J.test(f.querySelectorAll))&&(ue(function(e){var t;p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+B+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+B+"*(?:value|"+M+")"),e.querySelectorAll("[id~="+_+"-]").length||m.push("~="),(t=f.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+B+"*name"+B+"*="+B+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+_+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")}),ue(function(e){e.innerHTML="";var t=f.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+B+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(n.matchesSelector=J.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=y.call(e,"*"),y.call(e,"[s!='']:x"),v.push("!=",F)}),m=m.length&&new RegExp(m.join("|")),v=v.length&&new RegExp(v.join("|")),t=J.test(p.compareDocumentPosition),b=t||J.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},L=t?function(e,t){if(e===t)return d=!0,0;var i=!e.compareDocumentPosition-!t.compareDocumentPosition;return i||(1&(i=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===i?e==f||e.ownerDocument==w&&b(w,e)?-1:t==f||t.ownerDocument==w&&b(w,t)?1:u?O(u,e)-O(u,t):0:4&i?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,i=0,s=e.parentNode,r=t.parentNode,o=[e],a=[t];if(!s||!r)return e==f?-1:t==f?1:s?-1:r?1:u?O(u,e)-O(u,t):0;if(s===r)return he(e,t);for(n=e;n=n.parentNode;)o.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;o[i]===a[i];)i++;return i?he(o[i],a[i]):o[i]==w?-1:a[i]==w?1:0}),f},ae.matches=function(e,t){return ae(e,null,null,t)},ae.matchesSelector=function(e,t){if(h(e),n.matchesSelector&&g&&!k[t+" "]&&(!v||!v.test(t))&&(!m||!m.test(t)))try{var i=y.call(e,t);if(i||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return i}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ae.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ae.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=o(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=T[e+" "];return t||(t=new RegExp("(^|"+B+")"+e+"("+B+"|$)"))&&T(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(i){var s=ae.attr(i,e);return null==s?"!="===t:!t||(s+="","="===t?s===n:"!="===t?s!==n:"^="===t?n&&0===s.indexOf(n):"*="===t?n&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function S(e,t,n){return p(t)?w.grep(e,function(e,i){return!!t.call(e,i,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,s;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:N.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),L.test(i[1])&&w.isPlainObject(t))for(i in t)p(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(s=m.getElementById(i[2]))&&(this[0]=s,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):p(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,D=w(m);var j=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};function I(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;ue=m.createDocumentFragment().appendChild(m.createElement("div")),(de=m.createElement("input")).setAttribute("type","radio"),de.setAttribute("checked","checked"),de.setAttribute("name","t"),ue.appendChild(de),f.checkClone=ue.cloneNode(!0).cloneNode(!0).lastChild.checked,ue.innerHTML="",f.noCloneChecked=!!ue.cloneNode(!0).lastChild.defaultValue,ue.innerHTML="",f.option=!!ue.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function me(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&k(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,i=e.length;n",""]);var ye=/<|&#?\w+;/;function be(e,t,n,i,s){for(var r,o,a,l,c,u,d=t.createDocumentFragment(),h=[],f=0,p=e.length;f\s*$/g;function Se(e,t){return k(e,"table")&&k(11!==t.nodeType?t:t.firstChild,"tr")&&w(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ne(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,i,s,r,o,a;if(1===t.nodeType){if(K.hasData(e)&&(a=K.get(e).events))for(s in K.remove(t,"handle events"),a)for(n=0,i=a[s].length;n").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&s("error"===e.type?404:200,e.type)}),m.head.appendChild(t[0])},abort:function(){n&&n()}}});var Wt,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;w.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||w.expando+"_"+wt.guid++;return this[e]=!0,e}}),w.ajaxPrefilter("json jsonp",function(t,n,i){var s,r,o,a=!1!==t.jsonp&&(Ut.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return s=t.jsonpCallback=p(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,"$1"+s):!1!==t.jsonp&&(t.url+=(xt.test(t.url)?"&":"?")+t.jsonp+"="+s),t.converters["script json"]=function(){return o||w.error(s+" was not called"),o[0]},t.dataTypes[0]="json",r=e[s],e[s]=function(){o=arguments},i.always(function(){void 0===r?w(e).removeProp(s):e[s]=r,t[s]&&(t.jsonpCallback=n.jsonpCallback,zt.push(s)),o&&p(r)&&r(o[0]),o=r=void 0}),"script"}),f.createHTMLDocument=((Wt=m.implementation.createHTMLDocument("").body).innerHTML="

    ",2===Wt.childNodes.length),w.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(f.createHTMLDocument?((i=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(i)):t=m),r=!n&&[],(s=L.exec(e))?[t.createElement(s[1])]:(s=be([e],t,r),r&&r.length&&w(r).remove(),w.merge([],s.childNodes)));var i,s,r},w.fn.load=function(e,t,n){var i,s,r,o=this,a=e.indexOf(" ");return-1").append(w.parseHTML(e)).find(i):e)}).always(n&&function(e,t){o.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var i,s,r,o,a,l,c=w.css(e,"position"),u=w(e),d={};"static"===c&&(e.style.position="relative"),a=u.offset(),r=w.css(e,"top"),l=w.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(r+l).indexOf("auto")?(o=(i=u.position()).top,s=i.left):(o=parseFloat(r)||0,s=parseFloat(l)||0),p(t)&&(t=t.call(e,n,w.extend({},a))),null!=t.top&&(d.top=t.top-a.top+o),null!=t.left&&(d.left=t.left-a.left+s),"using"in t?t.using.call(e,d):u.css(d)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,i=this[0];return i?i.getClientRects().length?(t=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],s={top:0,left:0};if("fixed"===w.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((s=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),s.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-s.top-w.css(i,"marginTop",!0),left:t.left-s.left-w.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===w.css(e,"position");)e=e.offsetParent;return e||ie})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(i){return R(this,function(e,i,s){var r;if(g(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===s)return r?r[t]:e[i];r?r.scrollTo(n?r.pageXOffset:s,n?s:r.pageYOffset):e[i]=s},e,i,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=Fe(f.pixelPosition,function(e,n){if(n)return n=qe(e,t),Oe.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,i){w.fn[i]=function(s,r){var o=arguments.length&&(n||"boolean"!=typeof s),a=n||(!0===s||!0===r?"margin":"border");return R(this,function(t,n,s){var r;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(r=t.documentElement,Math.max(t.body["scroll"+e],r["scroll"+e],t.body["offset"+e],r["offset"+e],r["client"+e])):void 0===s?w.css(t,n,a):w.style(t,n,s,a)},t,o?s:void 0,o)}})}),w.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return 0[].concat(...Element.prototype.querySelectorAll.call(t,e)),findOne:(e,t=document.documentElement)=>Element.prototype.querySelector.call(t,e),children:(e,t)=>[].concat(...e.children).filter(e=>e.matches(t)),parents(e,t){const n=[];let i=e.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(t)&&n.push(i),i=i.parentNode;return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]}},i=e=>{do{e+=Math.floor(1e6*Math.random())}while(document.getElementById(e));return e},s=e=>{let t=e.getAttribute("data-bs-target");if(!t||"#"===t){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n="#"+n.split("#")[1]),t=n&&"#"!==n?n.trim():null}return t},r=e=>{const t=s(e);return t&&document.querySelector(t)?t:null},o=e=>{const t=s(e);return t?document.querySelector(t):null},a=e=>{e.dispatchEvent(new Event("transitionend"))},l=e=>!(!e||"object"!=typeof e)&&(void 0!==e.jquery&&(e=e[0]),void 0!==e.nodeType),c=e=>l(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?n.findOne(e):null,u=(e,t,n)=>{Object.keys(n).forEach(i=>{const s=n[i],r=t[i],o=r&&l(r)?"element":null==(a=r)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(s).test(o))throw new TypeError(`${e.toUpperCase()}: Option "${i}" provided type "${o}" but expected type "${s}".`)})},d=e=>!(!l(e)||0===e.getClientRects().length)&&"visible"===getComputedStyle(e).getPropertyValue("visibility"),h=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled")),f=e=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?f(e.parentNode):null},p=()=>{},g=e=>e.offsetHeight,m=()=>{const{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},v=[],y=()=>"rtl"===document.documentElement.dir,b=e=>{var t;t=(()=>{const t=m();if(t){const n=e.NAME,i=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=(()=>(t.fn[n]=i,e.jQueryInterface))}}),"loading"===document.readyState?(v.length||document.addEventListener("DOMContentLoaded",()=>{v.forEach(e=>e())}),v.push(t)):t()},_=e=>{"function"==typeof e&&e()},w=(e,t,n=!0)=>{if(!n)return void _(e);const i=(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const i=Number.parseFloat(t),s=Number.parseFloat(n);return i||s?(t=t.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(n))):0})(t)+5;let s=!1;const r=({target:n})=>{n===t&&(s=!0,t.removeEventListener("transitionend",r),_(e))};t.addEventListener("transitionend",r),setTimeout(()=>{s||a(t)},i)},x=(e,t,n,i)=>{let s=e.indexOf(t);if(-1===s)return e[!n&&i?e.length-1:0];const r=e.length;return s+=n?1:-1,i&&(s=(s+r)%r),e[Math.max(0,Math.min(s,r-1))]},E=/[^.]*(?=\..*)\.|.*/,T=/\..*/,C=/::\d+$/,A={};let k=1;const L={mouseenter:"mouseover",mouseleave:"mouseout"},S=/^(mouseenter|mouseleave)/i,D=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function N(e,t){return t&&`${t}::${k++}`||e.uidEvent||k++}function j(e){const t=N(e);return e.uidEvent=t,A[t]=A[t]||{},A[t]}function P(e,t,n=null){const i=Object.keys(e);for(let s=0,r=i.length;s(function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)});i?i=e(i):n=e(n)}const[r,o,a]=I(t,n,i),l=j(e),c=l[a]||(l[a]={}),u=P(c,o,r?n:null);if(u)return void(u.oneOff=u.oneOff&&s);const d=N(o,t.replace(E,"")),h=r?function(e,t,n){return function i(s){const r=e.querySelectorAll(t);for(let{target:o}=s;o&&o!==this;o=o.parentNode)for(let a=r.length;a--;)if(r[a]===o)return s.delegateTarget=o,i.oneOff&&H.off(e,s.type,t,n),n.apply(o,[s]);return null}}(e,n,i):function(e,t){return function n(i){return i.delegateTarget=e,n.oneOff&&H.off(e,i.type,t),t.apply(e,[i])}}(e,n);h.delegationSelector=r?n:null,h.originalHandler=o,h.oneOff=s,h.uidEvent=d,c[d]=h,e.addEventListener(a,h,r)}function M(e,t,n,i,s){const r=P(t[n],i,s);r&&(e.removeEventListener(n,r,Boolean(s)),delete t[n][r.uidEvent])}function B(e){return e=e.replace(T,""),L[e]||e}const H={on(e,t,n,i){O(e,t,n,i,!1)},one(e,t,n,i){O(e,t,n,i,!0)},off(e,t,n,i){if("string"!=typeof t||!e)return;const[s,r,o]=I(t,n,i),a=o!==t,l=j(e),c=t.startsWith(".");if(void 0!==r){if(!l||!l[o])return;return void M(e,l,o,r,s?n:null)}c&&Object.keys(l).forEach(n=>{!function(e,t,n,i){const s=t[n]||{};Object.keys(s).forEach(r=>{if(r.includes(i)){const i=s[r];M(e,t,n,i.originalHandler,i.delegationSelector)}})}(e,l,n,t.slice(1))});const u=l[o]||{};Object.keys(u).forEach(n=>{const i=n.replace(C,"");if(!a||t.includes(i)){const t=u[n];M(e,l,o,t.originalHandler,t.delegationSelector)}})},trigger(e,t,n){if("string"!=typeof t||!e)return null;const i=m(),s=B(t),r=t!==s,o=D.has(s);let a,l=!0,c=!0,u=!1,d=null;return r&&i&&(a=i.Event(t,n),i(e).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),u=a.isDefaultPrevented()),o?(d=document.createEvent("HTMLEvents")).initEvent(s,l,!0):d=new CustomEvent(t,{bubbles:l,cancelable:!0}),void 0!==n&&Object.keys(n).forEach(e=>{Object.defineProperty(d,e,{get:()=>n[e]})}),u&&d.preventDefault(),c&&e.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},q=new Map;var F={set(e,t,n){q.has(e)||q.set(e,new Map);const i=q.get(e);i.has(t)||0===i.size?i.set(t,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(e,t)=>q.has(e)&&q.get(e).get(t)||null,remove(e,t){if(!q.has(e))return;const n=q.get(e);n.delete(t),0===n.size&&q.delete(e)}};class ${constructor(e){(e=c(e))&&(this._element=e,F.set(this._element,this.constructor.DATA_KEY,this))}dispose(){F.remove(this._element,this.constructor.DATA_KEY),H.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,t,n=!0){w(e,t,n)}static getInstance(e){return F.get(e,this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,"object"==typeof t?t:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class R extends ${static get NAME(){return"alert"}close(e){const t=e?this._getRootElement(e):this._element,n=this._triggerCloseEvent(t);null===n||n.defaultPrevented||this._removeElement(t)}_getRootElement(e){return o(e)||e.closest(".alert")}_triggerCloseEvent(e){return H.trigger(e,"close.bs.alert")}_removeElement(e){e.classList.remove("show");const t=e.classList.contains("fade");this._queueCallback(()=>this._destroyElement(e),e,t)}_destroyElement(e){e.remove(),H.trigger(e,"closed.bs.alert")}static jQueryInterface(e){return this.each(function(){const t=R.getOrCreateInstance(this);"close"===e&&t[e](this)})}static handleDismiss(e){return function(t){t&&t.preventDefault(),e.close(this)}}}H.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',R.handleDismiss(new R)),b(R);class W extends ${static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each(function(){const t=W.getOrCreateInstance(this);"toggle"===e&&t[e]()})}}function z(e){return"true"===e||"false"!==e&&(e===Number(e).toString()?Number(e):""===e||"null"===e?null:e)}function U(e){return e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())}H.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',e=>{e.preventDefault();const t=e.target.closest('[data-bs-toggle="button"]');W.getOrCreateInstance(t).toggle()}),b(W);const X={setDataAttribute(e,t,n){e.setAttribute("data-bs-"+U(t),n)},removeDataAttribute(e,t){e.removeAttribute("data-bs-"+U(t))},getDataAttributes(e){if(!e)return{};const t={};return Object.keys(e.dataset).filter(e=>e.startsWith("bs")).forEach(n=>{let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),t[i]=z(e.dataset[n])}),t},getDataAttribute:(e,t)=>z(e.getAttribute("data-bs-"+U(t))),offset(e){const t=e.getBoundingClientRect();return{top:t.top+document.body.scrollTop,left:t.left+document.body.scrollLeft}},position:e=>({top:e.offsetTop,left:e.offsetLeft})},V={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},G={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},K="next",Q="prev",Y="left",J="right",Z={ArrowLeft:J,ArrowRight:Y};class ee extends ${constructor(e,t){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._indicatorsElement=n.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return V}static get NAME(){return"carousel"}next(){this._slide(K)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(Q)}pause(e){e||(this._isPaused=!0),n.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(a(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=n.findOne(".active.carousel-item",this._element);const t=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void H.one(this._element,"slid.bs.carousel",()=>this.to(e));if(t===e)return this.pause(),void this.cycle();const i=e>t?K:Q;this._slide(i,this._items[e])}_getConfig(e){return e={...V,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("carousel",e,G),e}_handleSwipe(){const e=Math.abs(this.touchDeltaX);if(e<=40)return;const t=e/this.touchDeltaX;this.touchDeltaX=0,t&&this._slide(t>0?J:Y)}_addEventListeners(){this._config.keyboard&&H.on(this._element,"keydown.bs.carousel",e=>this._keydown(e)),"hover"===this._config.pause&&(H.on(this._element,"mouseenter.bs.carousel",e=>this.pause(e)),H.on(this._element,"mouseleave.bs.carousel",e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType?this._pointerEvent||(this.touchStartX=e.touches[0].clientX):this.touchStartX=e.clientX},t=e=>{this.touchDeltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this.touchStartX},i=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType||(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(e=>this.cycle(e),500+this._config.interval))};n.find(".carousel-item img",this._element).forEach(e=>{H.on(e,"dragstart.bs.carousel",e=>e.preventDefault())}),this._pointerEvent?(H.on(this._element,"pointerdown.bs.carousel",t=>e(t)),H.on(this._element,"pointerup.bs.carousel",e=>i(e)),this._element.classList.add("pointer-event")):(H.on(this._element,"touchstart.bs.carousel",t=>e(t)),H.on(this._element,"touchmove.bs.carousel",e=>t(e)),H.on(this._element,"touchend.bs.carousel",e=>i(e)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=Z[e.key];t&&(e.preventDefault(),this._slide(t))}_getItemIndex(e){return this._items=e&&e.parentNode?n.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,t){const n=e===K;return x(this._items,t,n,this._config.wrap)}_triggerSlideEvent(e,t){const i=this._getItemIndex(e),s=this._getItemIndex(n.findOne(".active.carousel-item",this._element));return H.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:t,from:s,to:i})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const t=n.findOne(".active",this._indicatorsElement);t.classList.remove("active"),t.removeAttribute("aria-current");const i=n.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{H.trigger(this._element,"slid.bs.carousel",{relatedTarget:o,direction:h,from:r,to:a})};if(this._element.classList.contains("slide")){o.classList.add(d),g(o),s.classList.add(u),o.classList.add(u);const e=()=>{o.classList.remove(u,d),o.classList.add("active"),s.classList.remove("active",d,u),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(e,s,!0)}else s.classList.remove("active"),o.classList.add("active"),this._isSliding=!1,f();l&&this.cycle()}_directionToOrder(e){return[J,Y].includes(e)?y()?e===Y?Q:K:e===Y?K:Q:e}_orderToDirection(e){return[K,Q].includes(e)?y()?e===Q?Y:J:e===Q?J:Y:e}static carouselInterface(e,t){const n=ee.getOrCreateInstance(e,t);let{_config:i}=n;"object"==typeof t&&(i={...i,...t});const s="string"==typeof t?t:i.slide;if("number"==typeof t)n.to(t);else if("string"==typeof s){if(void 0===n[s])throw new TypeError(`No method named "${s}"`);n[s]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}static jQueryInterface(e){return this.each(function(){ee.carouselInterface(this,e)})}static dataApiClickHandler(e){const t=o(this);if(!t||!t.classList.contains("carousel"))return;const n={...X.getDataAttributes(t),...X.getDataAttributes(this)},i=this.getAttribute("data-bs-slide-to");i&&(n.interval=!1),ee.carouselInterface(t,n),i&&ee.getInstance(t).to(i),e.preventDefault()}}H.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",ee.dataApiClickHandler),H.on(window,"load.bs.carousel.data-api",()=>{const e=n.find('[data-bs-ride="carousel"]');for(let t=0,n=e.length;te===this._element);null!==s&&o.length&&(this._selector=s,this._triggerArray.push(t))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return te}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let e,t;this._parent&&(0===(e=n.find(".show, .collapsing",this._parent).filter(e=>"string"==typeof this._config.parent?e.getAttribute("data-bs-parent")===this._config.parent:e.classList.contains("collapse"))).length&&(e=null));const i=n.findOne(this._selector);if(e){const n=e.find(e=>i!==e);if((t=n?ie.getInstance(n):null)&&t._isTransitioning)return}if(H.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e&&e.forEach(e=>{i!==e&&ie.collapseInterface(e,"hide"),t||F.set(e,"bs.collapse",null)});const s=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[s]=0,this._triggerArray.length&&this._triggerArray.forEach(e=>{e.classList.remove("collapsed"),e.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const r="scroll"+(s[0].toUpperCase()+s.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[s]="",this.setTransitioning(!1),H.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[s]=this._element[r]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(H.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const e=this._getDimension();this._element.style[e]=this._element.getBoundingClientRect()[e]+"px",g(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const t=this._triggerArray.length;if(t>0)for(let e=0;e{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),H.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(e){this._isTransitioning=e}_getConfig(e){return(e={...te,...e}).toggle=Boolean(e.toggle),u("collapse",e,ne),e}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:e}=this._config;const t=`[data-bs-toggle="collapse"][data-bs-parent="${e=c(e)}"]`;return n.find(t,e).forEach(e=>{const t=o(e);this._addAriaAndCollapsedClass(t,[e])}),e}_addAriaAndCollapsedClass(e,t){if(!e||!t.length)return;const n=e.classList.contains("show");t.forEach(e=>{n?e.classList.remove("collapsed"):e.classList.add("collapsed"),e.setAttribute("aria-expanded",n)})}static collapseInterface(e,t){let n=ie.getInstance(e);const i={...te,...X.getDataAttributes(e),..."object"==typeof t&&t?t:{}};if(!n&&i.toggle&&"string"==typeof t&&/show|hide/.test(t)&&(i.toggle=!1),n||(n=new ie(e,i)),"string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){ie.collapseInterface(this,e)})}}H.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const t=X.getDataAttributes(this),i=r(this);n.find(i).forEach(e=>{const n=ie.getInstance(e);let i;n?(null===n._parent&&"string"==typeof t.parent&&(n._config.parent=t.parent,n._parent=n._getParent()),i="toggle"):i=t,ie.collapseInterface(e,i)})}),b(ie);const se=new RegExp("ArrowUp|ArrowDown|Escape"),re=y()?"top-end":"top-start",oe=y()?"top-start":"top-end",ae=y()?"bottom-end":"bottom-start",le=y()?"bottom-start":"bottom-end",ce=y()?"left-start":"right-start",ue=y()?"right-start":"left-start",de={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},he={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class fe extends ${constructor(e,t){super(e),this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return de}static get DefaultType(){return he}static get NAME(){return"dropdown"}toggle(){h(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(h(this._element)||this._menu.classList.contains("show"))return;const e=fe.getParentFromElement(this._element),n={relatedTarget:this._element};if(!H.trigger(this._element,"show.bs.dropdown",n).defaultPrevented){if(this._inNavbar)X.setDataAttribute(this._menu,"popper","none");else{if(void 0===t)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let n=this._element;"parent"===this._config.reference?n=e:l(this._config.reference)?n=c(this._config.reference):"object"==typeof this._config.reference&&(n=this._config.reference);const i=this._getPopperConfig(),s=i.modifiers.find(e=>"applyStyles"===e.name&&!1===e.enabled);this._popper=t.createPopper(n,this._menu,i),s&&X.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(e=>H.on(e,"mouseover",p)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),H.trigger(this._element,"shown.bs.dropdown",n)}}hide(){if(h(this._element)||!this._menu.classList.contains("show"))return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){H.on(this._element,"click.bs.dropdown",e=>{e.preventDefault(),this.toggle()})}_completeHide(e){H.trigger(this._element,"hide.bs.dropdown",e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>H.off(e,"mouseover",p)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),X.removeDataAttribute(this._menu,"popper"),H.trigger(this._element,"hidden.bs.dropdown",e))}_getConfig(e){if(e={...this.constructor.Default,...X.getDataAttributes(this._element),...e},u("dropdown",e,this.constructor.DefaultType),"object"==typeof e.reference&&!l(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return e}_getMenuElement(){return n.next(this._element,".dropdown-menu")[0]}_getPlacement(){const e=this._element.parentNode;if(e.classList.contains("dropend"))return ce;if(e.classList.contains("dropstart"))return ue;const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?oe:re:t?le:ae}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:t}){const i=n.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(d);i.length&&x(i,t,"ArrowDown"===e,!i.includes(t)).focus()}static dropdownInterface(e,t){const n=fe.getOrCreateInstance(e,t);if("string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){fe.dropdownInterface(this,e)})}static clearMenus(e){if(e&&(2===e.button||"keyup"===e.type&&"Tab"!==e.key))return;const t=n.find('[data-bs-toggle="dropdown"]');for(let n=0,i=t.length;nthis.matches('[data-bs-toggle="dropdown"]')?this:n.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===e.key?(i().focus(),void fe.clearMenus()):"ArrowUp"===e.key||"ArrowDown"===e.key?(t||i().click(),void fe.getInstance(i())._selectMenuItem(e)):void(t&&"Space"!==e.key||fe.clearMenus())}}H.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',fe.dataApiKeydownHandler),H.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",fe.dataApiKeydownHandler),H.on(document,"click.bs.dropdown.data-api",fe.clearMenus),H.on(document,"keyup.bs.dropdown.data-api",fe.clearMenus),H.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',function(e){e.preventDefault(),fe.dropdownInterface(this)}),b(fe);class pe{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",t=>t+e),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",t=>t+e),this._setElementAttributes(".sticky-top","marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const i=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+i)return;this._saveInitialAttribute(e,t);const s=window.getComputedStyle(e)[t];e.style[t]=n(Number.parseFloat(s))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(e,t){const n=e.style[t];n&&X.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{const n=X.getDataAttribute(e,t);void 0===n?e.style.removeProperty(t):(X.removeDataAttribute(e,t),e.style[t]=n)})}_applyManipulationCallback(e,t){l(e)?t(e):n.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}const ge={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},me={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class ve{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){this._config.isVisible?(this._append(),this._config.isAnimated&&g(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{_(e)})):_(e)}hide(e){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),_(e)})):_(e)}_getElement(){if(!this._element){const e=document.createElement("div");e.className="modal-backdrop",this._config.isAnimated&&e.classList.add("fade"),this._element=e}return this._element}_getConfig(e){return(e={...ge,..."object"==typeof e?e:{}}).rootElement=c(e.rootElement),u("backdrop",e,me),e}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),H.on(this._getElement(),"mousedown.bs.backdrop",()=>{_(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(H.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){w(e,this._getElement(),this._config.isAnimated)}}const ye={backdrop:!0,keyboard:!0,focus:!0},be={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class _e extends ${constructor(e,t){super(e),this._config=this._getConfig(t),this._dialog=n.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new pe}static get Default(){return ye}static get NAME(){return"modal"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||H.trigger(this._element,"show.bs.modal",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),H.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',e=>this.hide(e)),H.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{H.one(this._element,"mouseup.dismiss.bs.modal",e=>{e.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(e){if(e&&["A","AREA"].includes(e.target.tagName)&&e.preventDefault(),!this._isShown||this._isTransitioning)return;if(H.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),H.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),H.off(this._element,"click.dismiss.bs.modal"),H.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,t)}dispose(){[window,this._dialog].forEach(e=>H.off(e,".bs.modal")),this._backdrop.dispose(),super.dispose(),H.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new ve({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(e){return e={...ye,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("modal",e,be),e}_showElement(e){const t=this._isAnimated(),i=n.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),t&&g(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,H.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,t)}_enforceFocus(){H.off(document,"focusin.bs.modal"),H.on(document,"focusin.bs.modal",e=>{document===e.target||this._element===e.target||this._element.contains(e.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?H.on(this._element,"keydown.dismiss.bs.modal",e=>{this._config.keyboard&&"Escape"===e.key?(e.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==e.key||this._triggerBackdropTransition()}):H.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?H.on(window,"resize.bs.modal",()=>this._adjustDialog()):H.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),H.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(e){H.on(this._element,"click.dismiss.bs.modal",e=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:e.target===e.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(H.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:e,scrollHeight:t,style:n}=this._element,i=t>document.documentElement.clientHeight;!i&&"hidden"===n.overflowY||e.contains("modal-static")||(i||(n.overflowY="hidden"),e.add("modal-static"),this._queueCallback(()=>{e.remove("modal-static"),i||this._queueCallback(()=>{n.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;(!n&&e&&!y()||n&&!e&&y())&&(this._element.style.paddingLeft=t+"px"),(n&&!e&&!y()||!n&&e&&y())&&(this._element.style.paddingRight=t+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=_e.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e](t)}})}}H.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',function(e){const t=o(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),H.one(t,"show.bs.modal",e=>{e.defaultPrevented||H.one(t,"hidden.bs.modal",()=>{d(this)&&this.focus()})}),_e.getOrCreateInstance(t).toggle(this)}),b(_e);const we={backdrop:!0,keyboard:!0,scroll:!1},xe={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Ee extends ${constructor(e,t){super(e),this._config=this._getConfig(t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return we}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||H.trigger(this._element,"show.bs.offcanvas",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new pe).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{H.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:e})},this._element,!0))}hide(){this._isShown&&(H.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(H.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new pe).reset(),H.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),H.off(document,"focusin.bs.offcanvas")}_getConfig(e){return e={...we,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("offcanvas",e,xe),e}_initializeBackDrop(){return new ve({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(e){H.off(document,"focusin.bs.offcanvas"),H.on(document,"focusin.bs.offcanvas",t=>{document===t.target||e===t.target||e.contains(t.target)||e.focus()}),e.focus()}_addEventListeners(){H.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),H.on(this._element,"keydown.dismiss.bs.offcanvas",e=>{this._config.keyboard&&"Escape"===e.key&&this.hide()})}static jQueryInterface(e){return this.each(function(){const t=Ee.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}H.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',function(e){const t=o(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this))return;H.one(t,"hidden.bs.offcanvas",()=>{d(this)&&this.focus()});const i=n.findOne(".offcanvas.show");i&&i!==t&&Ee.getInstance(i).hide(),Ee.getOrCreateInstance(t).toggle(this)}),H.on(window,"load.bs.offcanvas.data-api",()=>n.find(".offcanvas.show").forEach(e=>Ee.getOrCreateInstance(e).show())),b(Ee);const Te=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ce=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Ae=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,ke=(e,t)=>{const n=e.nodeName.toLowerCase();if(t.includes(n))return!Te.has(n)||Boolean(Ce.test(e.nodeValue)||Ae.test(e.nodeValue));const i=t.filter(e=>e instanceof RegExp);for(let e=0,t=i.length;e{ke(e,a)||n.removeAttribute(e.nodeName)})}return i.body.innerHTML}const Se=new RegExp("(^|\\s)bs-tooltip\\S+","g"),De=new Set(["sanitize","allowList","sanitizeFn"]),Ne={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},je={AUTO:"auto",TOP:"top",RIGHT:y()?"left":"right",BOTTOM:"bottom",LEFT:y()?"right":"left"},Pe={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ie={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class Oe extends ${constructor(e,n){if(void 0===t)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(n),this.tip=null,this._setListeners()}static get Default(){return Pe}static get NAME(){return"tooltip"}static get Event(){return Ie}static get DefaultType(){return Ne}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(this._isEnabled)if(e){const t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),H.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const e=H.trigger(this._element,this.constructor.Event.SHOW),n=f(this._element),s=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!s)return;const r=this.getTipElement(),o=i(this.constructor.NAME);r.setAttribute("id",o),this._element.setAttribute("aria-describedby",o),this.setContent(),this._config.animation&&r.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,r,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:c}=this._config;F.set(r,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(c.appendChild(r),H.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=t.createPopper(this._element,r,this._getPopperConfig(l)),r.classList.add("show");const u="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;u&&r.classList.add(...u.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>{H.on(e,"mouseover",p)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const e=this._hoverState;this._hoverState=null,H.trigger(this._element,this.constructor.Event.SHOWN),"out"===e&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const e=this.getTipElement();if(H.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>H.off(e,"mouseover",p)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const t=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),H.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,t),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const e=document.createElement("div");return e.innerHTML=this._config.template,this.tip=e.children[0],this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")}setElementContent(e,t){if(null!==e)return l(t)?(t=c(t),void(this._config.html?t.parentNode!==e&&(e.innerHTML="",e.appendChild(t)):e.textContent=t.textContent)):void(this._config.html?(this._config.sanitize&&(t=Le(t,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=t):e.textContent=t)}getTitle(){let e=this._element.getAttribute("data-bs-original-title");return e||(e="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),e}updateAttachment(e){return"right"===e?"end":"left"===e?"start":e}_initializeOnDelegatedTarget(e,t){const n=this.constructor.DATA_KEY;return(t=t||F.get(e.delegateTarget,n))||(t=new this.constructor(e.delegateTarget,this._getDelegateConfig()),F.set(e.delegateTarget,n,t)),t}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:e=>this._handlePopperPlacementChange(e)}],onFirstUpdate:e=>{e.options.placement!==e.placement&&this._handlePopperPlacementChange(e)}};return{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_addAttachmentClass(e){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(e))}_getAttachment(e){return je[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(e=>{if("click"===e)H.on(this._element,this.constructor.Event.CLICK,this._config.selector,e=>this.toggle(e));else if("manual"!==e){const t="hover"===e?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,n="hover"===e?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;H.on(this._element,t,this._config.selector,e=>this._enter(e)),H.on(this._element,n,this._config.selector,e=>this._leave(e))}}),this._hideModalHandler=(()=>{this._element&&this.hide()}),H.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||"string"!==t)&&(this._element.setAttribute("data-bs-original-title",e||""),!e||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusin"===e.type?"focus":"hover"]=!0),t.getTipElement().classList.contains("show")||"show"===t._hoverState?t._hoverState="show":(clearTimeout(t._timeout),t._hoverState="show",t._config.delay&&t._config.delay.show?t._timeout=setTimeout(()=>{"show"===t._hoverState&&t.show()},t._config.delay.show):t.show())}_leave(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusout"===e.type?"focus":"hover"]=t._element.contains(e.relatedTarget)),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t._config.delay&&t._config.delay.hide?t._timeout=setTimeout(()=>{"out"===t._hoverState&&t.hide()},t._config.delay.hide):t.hide())}_isWithActiveTrigger(){for(const e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){const t=X.getDataAttributes(this._element);return Object.keys(t).forEach(e=>{De.has(e)&&delete t[e]}),(e={...this.constructor.Default,...t,..."object"==typeof e&&e?e:{}}).container=!1===e.container?document.body:c(e.container),"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),u("tooltip",e,this.constructor.DefaultType),e.sanitize&&(e.template=Le(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){const e={};if(this._config)for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(Se);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}_handlePopperPlacementChange(e){const{state:t}=e;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}static jQueryInterface(e){return this.each(function(){const t=Oe.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}b(Oe);const Me=new RegExp("(^|\\s)bs-popover\\S+","g"),Be={...Oe.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},He={...Oe.DefaultType,content:"(string|element|function)"},qe={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Fe extends Oe{static get Default(){return Be}static get NAME(){return"popover"}static get Event(){return qe}static get DefaultType(){return He}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||n.findOne(".popover-header",this.tip).remove(),this._getContent()||n.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".popover-header",e),this.getTitle());let t=this._getContent();"function"==typeof t&&(t=t.call(this._element)),this.setElementContent(n.findOne(".popover-body",e),t),e.classList.remove("fade","show")}_addAttachmentClass(e){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(e))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(Me);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}static jQueryInterface(e){return this.each(function(){const t=Fe.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}b(Fe);const $e={offset:10,method:"auto",target:""},Re={offset:"number",method:"string",target:"(string|element)"};class We extends ${constructor(e,t){super(e),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(t),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,H.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return $e}static get NAME(){return"scrollspy"}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":"position",t="auto"===this._config.method?e:this._config.method,i="position"===t?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),n.find(this._selector).map(e=>{const s=r(e),o=s?n.findOne(s):null;if(o){const e=o.getBoundingClientRect();if(e.width||e.height)return[X[t](o).top+i,s]}return null}).filter(e=>e).sort((e,t)=>e[0]-t[0]).forEach(e=>{this._offsets.push(e[0]),this._targets.push(e[1])})}dispose(){H.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(e){if("string"!=typeof(e={...$e,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}}).target&&l(e.target)){let{id:t}=e.target;t||(t=i("scrollspy"),e.target.id=t),e.target="#"+t}return u("scrollspy",e,Re),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){const e=this._targets[this._targets.length-1];this._activeTarget!==e&&this._activate(e)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(void 0===this._offsets[t+1]||e`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),i=n.findOne(t.join(","));i.classList.contains("dropdown-item")?(n.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add("active"),i.classList.add("active")):(i.classList.add("active"),n.parents(i,".nav, .list-group").forEach(e=>{n.prev(e,".nav-link, .list-group-item").forEach(e=>e.classList.add("active")),n.prev(e,".nav-item").forEach(e=>{n.children(e,".nav-link").forEach(e=>e.classList.add("active"))})})),H.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){n.find(this._selector).filter(e=>e.classList.contains("active")).forEach(e=>e.classList.remove("active"))}static jQueryInterface(e){return this.each(function(){const t=We.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}H.on(window,"load.bs.scrollspy.data-api",()=>{n.find('[data-bs-spy="scroll"]').forEach(e=>new We(e))}),b(We);class ze extends ${static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let e;const t=o(this._element),i=this._element.closest(".nav, .list-group");if(i){const t="UL"===i.nodeName||"OL"===i.nodeName?":scope > li > .active":".active";e=(e=n.find(t,i))[e.length-1]}const s=e?H.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(H.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const r=()=>{H.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),H.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};t?this._activate(t,t.parentNode,r):r()}_activate(e,t,i){const s=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?n.children(t,".active"):n.find(":scope > li > .active",t))[0],r=i&&s&&s.classList.contains("fade"),o=()=>this._transitionComplete(e,s,i);s&&r?(s.classList.remove("show"),this._queueCallback(o,e,!0)):o()}_transitionComplete(e,t,i){if(t){t.classList.remove("active");const e=n.findOne(":scope > .dropdown-menu .active",t.parentNode);e&&e.classList.remove("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),g(e),e.classList.contains("fade")&&e.classList.add("show");let s=e.parentNode;if(s&&"LI"===s.nodeName&&(s=s.parentNode),s&&s.classList.contains("dropdown-menu")){const t=e.closest(".dropdown");t&&n.find(".dropdown-toggle",t).forEach(e=>e.classList.add("active")),e.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(e){return this.each(function(){const t=ze.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}H.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this)||ze.getOrCreateInstance(this).show()}),b(ze);const Ue={animation:"boolean",autohide:"boolean",delay:"number"},Xe={animation:!0,autohide:!0,delay:5e3};class Ve extends ${constructor(e,t){super(e),this._config=this._getConfig(t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Ue}static get Default(){return Xe}static get NAME(){return"toast"}show(){H.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),g(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),H.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(H.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),H.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(e){return e={...Xe,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}},u("toast",e,this.constructor.DefaultType),e}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t}if(t)return void this._clearTimeout();const n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){H.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),H.on(this._element,"mouseover.bs.toast",e=>this._onInteraction(e,!0)),H.on(this._element,"mouseout.bs.toast",e=>this._onInteraction(e,!1)),H.on(this._element,"focusin.bs.toast",e=>this._onInteraction(e,!0)),H.on(this._element,"focusout.bs.toast",e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Ve.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return b(Ve),{Alert:R,Button:W,Carousel:ee,Collapse:ie,Dropdown:fe,Modal:_e,Offcanvas:Ee,Popover:Fe,ScrollSpy:We,Tab:ze,Toast:Ve,Tooltip:Oe}}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function t(t,i,s){i={content:{message:"object"==typeof i?i.message:i,title:i.title?i.title:"",icon:i.icon?i.icon:"",url:i.url?i.url:"#",target:i.target?i.target:"-"}},s=e.extend(!0,{},i,s),this.settings=e.extend(!0,{},n,s),this._defaults=n,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var n={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var e=arguments[0],t=1;t .progress-bar').removeClass("progress-bar-"+e.settings.type),e.settings.type=i[t],this.$ele.addClass("alert-"+i[t]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[t]);break;case"icon":var s=this.$ele.find('[data-notify="icon"]');"class"==e.settings.icon_type.toLowerCase()?s.removeClass(e.settings.content.icon).addClass(i[t]):(s.is("img")||s.find("img"),s.attr("src",i[t]));break;case"progress":var r=e.settings.delay-e.settings.delay*(i[t]/100);this.$ele.data("notify-delay",r),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[t]).css("width",i[t]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[t]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[t]);break;default:this.$ele.find('[data-notify="'+t+'"]').html(i[t])}var o=this.$ele.outerHeight()+parseInt(e.settings.spacing)+parseInt(e.settings.offset.y);e.reposition(o)},close:function(){e.close()}}},buildNotify:function(){var t=this.settings.content;this.$ele=e(String.format(this.settings.template,this.settings.type,t.title,t.message,t.url,t.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var t=this,n=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},s=!1,r=this.settings;switch(e('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return n=Math.max(n,parseInt(e(this).css(r.placement.from))+parseInt(e(this).outerHeight())+parseInt(r.spacing))}),1==this.settings.newest_on_top&&(n=this.settings.offset.y),i[this.settings.placement.from]=n+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),e.each(Array("webkit","moz","o","ms",""),function(e,n){t.$ele[0].style[n+"AnimationIterationCount"]=1}),e(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(n=parseInt(n)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(n)),e.isFunction(t.settings.onShow)&&t.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(e){s=!0}).one(this.animations.end,function(n){e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)}),setTimeout(function(){s||e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)},600)},bind:function(){var t=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){t.close()}),this.$ele.mouseover(function(t){e(this).data("data-hover","true")}).mouseout(function(t){e(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){t.$ele.data("notify-delay",t.settings.delay);var n=setInterval(function(){var e=parseInt(t.$ele.data("notify-delay"))-t.settings.timer;if("false"===t.$ele.data("data-hover")&&"pause"==t.settings.mouse_over||"pause"!=t.settings.mouse_over){var i=(t.settings.delay-e)/t.settings.delay*100;t.$ele.data("notify-delay",e),t.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}e<=-t.settings.timer&&(clearInterval(n),t.close())},t.settings.timer)}},close:function(){var t=this,n=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),t.reposition(n),e.isFunction(t.settings.onClose)&&t.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(e){i=!0}).one(this.animations.end,function(n){e(this).remove(),e.isFunction(t.settings.onClosed)&&t.settings.onClosed.call(this)}),setTimeout(function(){i||(t.$ele.remove(),t.settings.onClosed&&t.settings.onClosed(t.$ele))},600)},reposition:function(t){var n=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',s=this.$ele.nextAll(i);1==this.settings.newest_on_top&&(s=this.$ele.prevAll(i)),s.each(function(){e(this).css(n.settings.placement.from,t),t=parseInt(t)+parseInt(n.settings.spacing)+e(this).outerHeight()})}}),e.notify=function(e,n){return new t(this,e,n).notify},e.notifyDefaults=function(t){return n=e.extend(!0,{},n,t)},e.notifyClose=function(t){void 0===t||"all"==t?e("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):e('[data-notify-position="'+t+'"]').find('[data-notify="dismiss"]').trigger("click")}});var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof i?new i(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof l)){if(g&&b!=t.length-1){if(h.lastIndex=_,!(k=h.exec(e)))break;for(var x=k.index+(p?k[1].length:0),E=k.index+k[0].length,T=b,C=_,A=t.length;T"+r.content+""},!_self.document)return _self.addEventListener&&(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),i=t.language,s=t.code,r=t.immediateClose;_self.postMessage(n.highlight(s,n.languages[i],i)),r&&_self.close()},!1)),_self.Prism;var s=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return s&&(n.filename=s.src,n.manual||s.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/[a-z0-9_]+(?=\()/i,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,function:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}}}),Prism.languages.javascript["template-string"].inside.interpolation.inside.rest=Prism.languages.javascript,Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(){var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){for(var n,i=t.getAttribute("data-src"),s=t,r=/\blang(?:uage)?-([\w-]+)\b/i;s&&!r.test(s.className);)s=s.parentNode;if(s&&(n=(t.className.match(r)||[,""])[1]),!n){var o=(i.match(/\.(\w+)$/)||[,""])[1];n=e[o]||o}var a=document.createElement("code");a.className="language-"+n,t.textContent="",a.textContent="Loading…",t.appendChild(a);var l=new XMLHttpRequest;l.open("GET",i,!0),l.onreadystatechange=function(){4==l.readyState&&(l.status<400&&l.responseText?(a.textContent=l.responseText,Prism.highlightElement(a)):400<=l.status?a.textContent="✖ Error "+l.status+" while fetching file: "+l.statusText:a.textContent="✖ Error: File does not exist or is empty")},l.send(null)}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),i=document.createElement("a");return i.textContent=t.getAttribute("data-download-link-label")||"Download",i.setAttribute("download",""),i.href=n,i}})},document.addEventListener("DOMContentLoaded",self.Prism.fileHighlight)),function(e,t,n){var i,s=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/en_US/sdk.js",s.parentNode.insertBefore(i,s))}(document,"script","facebook-jssdk"),function(e,t,n,i,s,r){(i=e.gapi||(e.gapi={})).analytics={q:[],ready:function(e){this.q.push(e)}},s=t.createElement(n),r=t.getElementsByTagName(n)[0],s.src="https://apis.google.com/js/platform.js",r.parentNode.insertBefore(s,r),s.onload=function(){i.load("analytics")}}(window,document,"script"),function(e,t,n){var i,s=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/vi_VN/sdk/xfbml.customerchat.js",s.parentNode.insertBefore(i,s))}(document,"script","facebook-jssdk"),function(e){e.fn.qrcode=function(t){var n;function i(e){this.mode=n,this.data=e}function s(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function r(e,t){if(null==e.length)throw Error(e.length+"/"+t);for(var n=0;ne||this.moduleCount<=e||0>t||this.moduleCount<=t)throw Error(e+","+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){var e=1;for(e=1;40>e;e++){for(var t=o.getRSBlocks(e,this.errorCorrectLevel),n=new a,i=0,s=0;s=n;n++)if(!(-1>=e+n||this.moduleCount<=e+n))for(var i=-1;7>=i;i++)-1>=t+i||this.moduleCount<=t+i||(this.modules[e+n][t+i]=0<=n&&6>=n&&(0==i||6==i)||0<=i&&6>=i&&(0==n||6==n)||2<=n&&4>=n&&2<=i&&4>=i)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;8>n;n++){this.makeImpl(!0,n);var i=l.getLostPoint(this);(0==n||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){for(e=e.createEmptyMovieClip(t,n),this.make(),t=0;t=r;r++)for(var o=-2;2>=o;o++)this.modules[i+r][s+o]=-2==r||2==r||-2==o||2==o||0==r&&0==o}},setupTypeNumber:function(e){for(var t=l.getBCHTypeNumber(this.typeNumber),n=0;18>n;n++){var i=!e&&1==(t>>n&1);this.modules[Math.floor(n/3)][n%3+this.moduleCount-8-3]=i}for(n=0;18>n;n++)i=!e&&1==(t>>n&1),this.modules[n%3+this.moduleCount-8-3][Math.floor(n/3)]=i},setupTypeInfo:function(e,t){for(var n=l.getBCHTypeInfo(this.errorCorrectLevel<<3|t),i=0;15>i;i++){var s=!e&&1==(n>>i&1);6>i?this.modules[i][8]=s:8>i?this.modules[i+1][8]=s:this.modules[this.moduleCount-15+i][8]=s}for(i=0;15>i;i++)s=!e&&1==(n>>i&1),8>i?this.modules[8][this.moduleCount-i-1]=s:9>i?this.modules[8][15-i-1+1]=s:this.modules[8][15-i-1]=s;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,s=7,r=0,o=this.moduleCount-1;0a;a++)if(null==this.modules[i][o-a]){var c=!1;r>>s&1)),l.getMask(t,i,o-a)&&(c=!c),this.modules[i][o-a]=c,-1==--s&&(r++,s=7)}if(0>(i+=n)||this.moduleCount<=i){i-=n,n=-n;break}}}},s.PAD0=236,s.PAD1=17,s.createData=function(e,t,n){t=o.getRSBlocks(e,t);for(var i=new a,r=0;r8*e)throw Error("code length overflow. ("+i.getLengthInBits()+">"+8*e+")");for(i.getLengthInBits()+4<=8*e&&i.put(0,4);0!=i.getLengthInBits()%8;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*e||(i.put(s.PAD0,8),i.getLengthInBits()>=8*e));)i.put(s.PAD1,8);return s.createBytes(i,t)},s.createBytes=function(e,t){for(var n=0,i=0,s=0,o=Array(t.length),a=Array(t.length),c=0;c>>=1;return t},getPatternPosition:function(e){return l.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case 0:return 0==(t+n)%2;case 1:return 0==t%2;case 2:return 0==n%3;case 3:return 0==(t+n)%3;case 4:return 0==(Math.floor(t/2)+Math.floor(n/3))%2;case 5:return 0==t*n%2+t*n%3;case 6:return 0==(t*n%2+t*n%3)%2;case 7:return 0==(t*n%3+(t+n)%2)%2;default:throw Error("bad maskPattern:"+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;nt)switch(e){case 1:return 10;case 2:return 9;case n:case 8:return 8;default:throw Error("mode:"+e)}else if(27>t)switch(e){case 1:return 12;case 2:return 11;case n:return 16;case 8:return 10;default:throw Error("mode:"+e)}else{if(!(41>t))throw Error("type:"+t);switch(e){case 1:return 14;case 2:return 13;case n:return 16;case 8:return 12;default:throw Error("mode:"+e)}}},getLostPoint:function(e){for(var t=e.getModuleCount(),n=0,i=0;i=a;a++)if(!(0>i+a||t<=i+a))for(var l=-1;1>=l;l++)0>s+l||t<=s+l||0==a&&0==l||o==e.isDark(i+a,s+l)&&r++;5e)throw Error("glog("+e+")");return c.LOG_TABLE[e]},gexp:function(e){for(;0>e;)e+=255;for(;256<=e;)e-=255;return c.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},u=0;8>u;u++)c.EXP_TABLE[u]=1<u;u++)c.EXP_TABLE[u]=c.EXP_TABLE[u-4]^c.EXP_TABLE[u-5]^c.EXP_TABLE[u-6]^c.EXP_TABLE[u-8];for(u=0;255>u;u++)c.LOG_TABLE[c.EXP_TABLE[u]]=u;return r.prototype={get:function(e){return this.num[e]},getLength:function(){return this.num.length},multiply:function(e){for(var t=Array(this.getLength()+e.getLength()-1),n=0;nthis.getLength()-e.getLength())return this;for(var t=c.glog(this.get(0))-c.glog(e.get(0)),n=Array(this.getLength()),i=0;i>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},"string"==typeof t&&(t={text:t}),t=e.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,correctLevel:2,background:"#ffffff",foreground:"#000000"},t),this.each(function(){var n;if("canvas"==t.render){(n=new s(t.typeNumber,t.correctLevel)).addData(t.text),n.make();var i=document.createElement("canvas");i.width=t.width,i.height=t.height;for(var r=i.getContext("2d"),o=t.width/n.getModuleCount(),a=t.height/n.getModuleCount(),l=0;l").css("width",t.width+"px").css("height",t.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",t.background),r=t.width/n.getModuleCount(),o=t.height/n.getModuleCount(),a=0;a").css("height",o+"px").appendTo(i),c=0;c").css("width",r+"px").css("background-color",n.isDark(a,c)?t.foreground:t.background).appendTo(l);n=i,jQuery(n).appendTo(this)})}}(jQuery),function(){"use strict";var e="undefined"!=typeof window&&void 0!==window.document?window.document:{},t="undefined"!=typeof module&&module.exports,n=function(){for(var t,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=0,s=n.length,r={};i+~]|"+R+")"+R+"*"),U=new RegExp(R+"|>"),X=new RegExp(H),K=new RegExp("^"+B+"$"),V={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+H),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+O+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+R+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},ie=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,oe=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){h()},se=we(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{j.apply(L=$.call(_.childNodes),_.childNodes),L[_.childNodes.length].nodeType}catch(t){j={apply:L.length?function(e,t){P.apply(e,$.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function ae(e,t,i,o){var r,a,c,u,d,p,b,v=t&&t.ownerDocument,_=t?t.nodeType:9;if(i=i||[],"string"!=typeof e||!e||1!==_&&9!==_&&11!==_)return i;if(!o&&(h(t),t=t||f,g)){if(11!==_&&(d=J.exec(e)))if(r=d[1]){if(9===_){if(!(c=t.getElementById(r)))return i;if(c.id===r)return i.push(c),i}else if(v&&(c=v.getElementById(r))&&y(t,c)&&c.id===r)return i.push(c),i}else{if(d[2])return j.apply(i,t.getElementsByTagName(e)),i;if((r=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return j.apply(i,t.getElementsByClassName(r)),i}if(n.qsa&&!k[e+" "]&&(!m||!m.test(e))&&(1!==_||"object"!==t.nodeName.toLowerCase())){if(b=e,v=t,1===_&&(U.test(e)||W.test(e))){for((v=ee.test(e)&&be(t.parentNode)||t)===t&&n.scope||((u=t.getAttribute("id"))?u=u.replace(ie,oe):t.setAttribute("id",u=w)),a=(p=s(e)).length;a--;)p[a]=(u?"#"+u:":scope")+" "+ye(p[a]);b=p.join(",")}try{return j.apply(i,v.querySelectorAll(b)),i}catch(t){k(e,!0)}finally{u===w&&t.removeAttribute("id")}}}return l(e.replace(q,"$1"),t,i,o)}function le(){var e=[];return function t(n,o){return e.push(n+" ")>i.cacheLength&&delete t[e.shift()],t[n+" "]=o}}function ce(e){return e[w]=!0,e}function ue(e){var t=f.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var n=e.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=t}function he(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ge(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&se(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function me(e){return ce(function(t){return t=+t,ce(function(n,i){for(var o,r=e([],n.length,t),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))})})}function be(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ae.support={},r=ae.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!G.test(t||n&&n.nodeName||"HTML")},h=ae.setDocument=function(e){var t,o,s=e?e.ownerDocument||e:_;return s!=f&&9===s.nodeType&&s.documentElement&&(p=(f=s).documentElement,g=!r(f),_!=f&&(o=f.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",re,!1):o.attachEvent&&o.attachEvent("onunload",re)),n.scope=ue(function(e){return p.appendChild(e).appendChild(f.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(f.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Z.test(f.getElementsByClassName),n.getById=ue(function(e){return p.appendChild(e).id=w,!f.getElementsByName||!f.getElementsByName(w).length}),n.getById?(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,i,o,r=t.getElementById(e);if(r){if((n=r.getAttributeNode("id"))&&n.value===e)return[r];for(o=t.getElementsByName(e),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===e)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],o=0,r=t.getElementsByTagName(e);if("*"===e){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},b=[],m=[],(n.qsa=Z.test(f.querySelectorAll))&&(ue(function(e){var t;p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+R+"*(?:value|"+O+")"),e.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(t=f.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+R+"*name"+R+"*="+R+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")}),ue(function(e){e.innerHTML="";var t=f.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+R+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(n.matchesSelector=Z.test(v=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=v.call(e,"*"),v.call(e,"[s!='']:x"),b.push("!=",H)}),m=m.length&&new RegExp(m.join("|")),b=b.length&&new RegExp(b.join("|")),t=Z.test(p.compareDocumentPosition),y=t||Z.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},S=t?function(e,t){if(e===t)return d=!0,0;var i=!e.compareDocumentPosition-!t.compareDocumentPosition;return i||(1&(i=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===i?e==f||e.ownerDocument==_&&y(_,e)?-1:t==f||t.ownerDocument==_&&y(_,t)?1:u?I(u,e)-I(u,t):0:4&i?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,i=0,o=e.parentNode,r=t.parentNode,s=[e],a=[t];if(!o||!r)return e==f?-1:t==f?1:o?-1:r?1:u?I(u,e)-I(u,t):0;if(o===r)return he(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?he(s[i],a[i]):s[i]==_?-1:a[i]==_?1:0}),f},ae.matches=function(e,t){return ae(e,null,null,t)},ae.matchesSelector=function(e,t){if(h(e),n.matchesSelector&&g&&!k[t+" "]&&(!b||!b.test(t))&&(!m||!m.test(t)))try{var i=v.call(e,t);if(i||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return i}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ae.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ae.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=s(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(i){var o=ae.attr(i,e);return null==o?"!="===t:!t||(o+="","="===t?o===n:"!="===t?o!==n:"^="===t?n&&0===o.indexOf(n):"*="===t?n&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,t,n){return p(t)?_.grep(e,function(e,i){return!!t.call(e,i,e)!==n}):t.nodeType?_.grep(e,function(e){return e===t!==n}):"string"!=typeof t?_.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(_.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||L,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:N.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof _?t[0]:t,_.merge(this,_.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),S.test(i[1])&&_.isPlainObject(t))for(i in t)p(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=m.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):p(e)?void 0!==n.ready?n.ready(e):e(_):_.makeArray(e,this)}).prototype=_.fn,L=_(m);var P=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function $(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}_.fn.extend({has:function(e){var t=_(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;ue=m.createDocumentFragment().appendChild(m.createElement("div")),(de=m.createElement("input")).setAttribute("type","radio"),de.setAttribute("checked","checked"),de.setAttribute("name","t"),ue.appendChild(de),f.checkClone=ue.cloneNode(!0).cloneNode(!0).lastChild.checked,ue.innerHTML="",f.noCloneChecked=!!ue.cloneNode(!0).lastChild.defaultValue,ue.innerHTML="",f.option=!!ue.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function me(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&k(e,t)?_.merge([e],n):n}function be(e,t){for(var n=0,i=e.length;n",""]);var ve=/<|&#?\w+;/;function ye(e,t,n,i,o){for(var r,s,a,l,c,u,d=t.createDocumentFragment(),h=[],f=0,p=e.length;f\s*$/g;function De(e,t){return k(e,"table")&&k(11!==t.nodeType?t:t.firstChild,"tr")&&_(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ne(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,i,o,r,s,a;if(1===t.nodeType){if(G.hasData(e)&&(a=G.get(e).events))for(o in G.remove(t,"handle events"),a)for(n=0,i=a[o].length;n").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),m.head.appendChild(t[0])},abort:function(){n&&n()}}});var zt,Wt=[],Ut=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Wt.pop()||_.expando+"_"+_t.guid++;return this[e]=!0,e}}),_.ajaxPrefilter("json jsonp",function(t,n,i){var o,r,s,a=!1!==t.jsonp&&(Ut.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return o=t.jsonpCallback=p(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,"$1"+o):!1!==t.jsonp&&(t.url+=(xt.test(t.url)?"&":"?")+t.jsonp+"="+o),t.converters["script json"]=function(){return s||_.error(o+" was not called"),s[0]},t.dataTypes[0]="json",r=e[o],e[o]=function(){s=arguments},i.always(function(){void 0===r?_(e).removeProp(o):e[o]=r,t[o]&&(t.jsonpCallback=n.jsonpCallback,Wt.push(o)),s&&p(r)&&r(s[0]),s=r=void 0}),"script"}),f.createHTMLDocument=((zt=m.implementation.createHTMLDocument("").body).innerHTML="
    ",2===zt.childNodes.length),_.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(f.createHTMLDocument?((i=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(i)):t=m),r=!n&&[],(o=S.exec(e))?[t.createElement(o[1])]:(o=ye([e],t,r),r&&r.length&&_(r).remove(),_.merge([],o.childNodes)));var i,o,r},_.fn.load=function(e,t,n){var i,o,r,s=this,a=e.indexOf(" ");return-1").append(_.parseHTML(e)).find(i):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},_.expr.pseudos.animated=function(e){return _.grep(_.timers,function(t){return e===t.elem}).length},_.offset={setOffset:function(e,t,n){var i,o,r,s,a,l,c=_.css(e,"position"),u=_(e),d={};"static"===c&&(e.style.position="relative"),a=u.offset(),r=_.css(e,"top"),l=_.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(r+l).indexOf("auto")?(s=(i=u.position()).top,o=i.left):(s=parseFloat(r)||0,o=parseFloat(l)||0),p(t)&&(t=t.call(e,n,_.extend({},a))),null!=t.top&&(d.top=t.top-a.top+s),null!=t.left&&(d.left=t.left-a.left+o),"using"in t?t.using.call(e,d):u.css(d)}},_.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){_.offset.setOffset(this,e,t)});var t,n,i=this[0];return i?i.getClientRects().length?(t=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],o={top:0,left:0};if("fixed"===_.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===_.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((o=_(e).offset()).top+=_.css(e,"borderTopWidth",!0),o.left+=_.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-_.css(i,"marginTop",!0),left:t.left-o.left-_.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===_.css(e,"position");)e=e.offsetParent;return e||ie})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;_.fn[e]=function(i){return q(this,function(e,i,o){var r;if(g(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===o)return r?r[t]:e[i];r?r.scrollTo(n?r.pageXOffset:o,n?o:r.pageYOffset):e[i]=o},e,i,arguments.length)}}),_.each(["top","left"],function(e,t){_.cssHooks[t]=He(f.pixelPosition,function(e,n){if(n)return n=Me(e,t),Ie.test(n)?_(e).position()[t]+"px":n})}),_.each({Height:"height",Width:"width"},function(e,t){_.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,i){_.fn[i]=function(o,r){var s=arguments.length&&(n||"boolean"!=typeof o),a=n||(!0===o||!0===r?"margin":"border");return q(this,function(t,n,o){var r;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(r=t.documentElement,Math.max(t.body["scroll"+e],r["scroll"+e],t.body["offset"+e],r["offset"+e],r["client"+e])):void 0===o?_.css(t,n,a):_.style(t,n,o,a)},t,s?o:void 0,s)}})}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){_.fn[t]=function(e){return this.on(t,e)}}),_.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),_.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){_.fn[t]=function(e,n){return 0[].concat(...Element.prototype.querySelectorAll.call(t,e)),findOne:(e,t=document.documentElement)=>Element.prototype.querySelector.call(t,e),children:(e,t)=>[].concat(...e.children).filter(e=>e.matches(t)),parents(e,t){const n=[];let i=e.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(t)&&n.push(i),i=i.parentNode;return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]}},i=e=>{do{e+=Math.floor(1e6*Math.random())}while(document.getElementById(e));return e},o=e=>{let t=e.getAttribute("data-bs-target");if(!t||"#"===t){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n="#"+n.split("#")[1]),t=n&&"#"!==n?n.trim():null}return t},r=e=>{const t=o(e);return t&&document.querySelector(t)?t:null},s=e=>{const t=o(e);return t?document.querySelector(t):null},a=e=>{e.dispatchEvent(new Event("transitionend"))},l=e=>!(!e||"object"!=typeof e)&&(void 0!==e.jquery&&(e=e[0]),void 0!==e.nodeType),c=e=>l(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?n.findOne(e):null,u=(e,t,n)=>{Object.keys(n).forEach(i=>{const o=n[i],r=t[i],s=r&&l(r)?"element":null==(a=r)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(o).test(s))throw new TypeError(`${e.toUpperCase()}: Option "${i}" provided type "${s}" but expected type "${o}".`)})},d=e=>!(!l(e)||0===e.getClientRects().length)&&"visible"===getComputedStyle(e).getPropertyValue("visibility"),h=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled")),f=e=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?f(e.parentNode):null},p=()=>{},g=e=>e.offsetHeight,m=()=>{const{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},b=[],v=()=>"rtl"===document.documentElement.dir,y=e=>{var t;t=(()=>{const t=m();if(t){const n=e.NAME,i=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=(()=>(t.fn[n]=i,e.jQueryInterface))}}),"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{b.forEach(e=>e())}),b.push(t)):t()},w=e=>{"function"==typeof e&&e()},_=(e,t,n=!0)=>{if(!n)return void w(e);const i=(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const i=Number.parseFloat(t),o=Number.parseFloat(n);return i||o?(t=t.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(n))):0})(t)+5;let o=!1;const r=({target:n})=>{n===t&&(o=!0,t.removeEventListener("transitionend",r),w(e))};t.addEventListener("transitionend",r),setTimeout(()=>{o||a(t)},i)},x=(e,t,n,i)=>{let o=e.indexOf(t);if(-1===o)return e[!n&&i?e.length-1:0];const r=e.length;return o+=n?1:-1,i&&(o=(o+r)%r),e[Math.max(0,Math.min(o,r-1))]},C=/[^.]*(?=\..*)\.|.*/,E=/\..*/,A=/::\d+$/,T={};let k=1;const S={mouseenter:"mouseover",mouseleave:"mouseout"},D=/^(mouseenter|mouseleave)/i,L=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function N(e,t){return t&&`${t}::${k++}`||e.uidEvent||k++}function P(e){const t=N(e);return e.uidEvent=t,T[t]=T[t]||{},T[t]}function j(e,t,n=null){const i=Object.keys(e);for(let o=0,r=i.length;o(function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)});i?i=e(i):n=e(n)}const[r,s,a]=$(t,n,i),l=P(e),c=l[a]||(l[a]={}),u=j(c,s,r?n:null);if(u)return void(u.oneOff=u.oneOff&&o);const d=N(s,t.replace(C,"")),h=r?function(e,t,n){return function i(o){const r=e.querySelectorAll(t);for(let{target:s}=o;s&&s!==this;s=s.parentNode)for(let a=r.length;a--;)if(r[a]===s)return o.delegateTarget=s,i.oneOff&&B.off(e,o.type,t,n),n.apply(s,[o]);return null}}(e,n,i):function(e,t){return function n(i){return i.delegateTarget=e,n.oneOff&&B.off(e,i.type,t),t.apply(e,[i])}}(e,n);h.delegationSelector=r?n:null,h.originalHandler=s,h.oneOff=o,h.uidEvent=d,c[d]=h,e.addEventListener(a,h,r)}function O(e,t,n,i,o){const r=j(t[n],i,o);r&&(e.removeEventListener(n,r,Boolean(o)),delete t[n][r.uidEvent])}function R(e){return e=e.replace(E,""),S[e]||e}const B={on(e,t,n,i){I(e,t,n,i,!1)},one(e,t,n,i){I(e,t,n,i,!0)},off(e,t,n,i){if("string"!=typeof t||!e)return;const[o,r,s]=$(t,n,i),a=s!==t,l=P(e),c=t.startsWith(".");if(void 0!==r){if(!l||!l[s])return;return void O(e,l,s,r,o?n:null)}c&&Object.keys(l).forEach(n=>{!function(e,t,n,i){const o=t[n]||{};Object.keys(o).forEach(r=>{if(r.includes(i)){const i=o[r];O(e,t,n,i.originalHandler,i.delegationSelector)}})}(e,l,n,t.slice(1))});const u=l[s]||{};Object.keys(u).forEach(n=>{const i=n.replace(A,"");if(!a||t.includes(i)){const t=u[n];O(e,l,s,t.originalHandler,t.delegationSelector)}})},trigger(e,t,n){if("string"!=typeof t||!e)return null;const i=m(),o=R(t),r=t!==o,s=L.has(o);let a,l=!0,c=!0,u=!1,d=null;return r&&i&&(a=i.Event(t,n),i(e).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),u=a.isDefaultPrevented()),s?(d=document.createEvent("HTMLEvents")).initEvent(o,l,!0):d=new CustomEvent(t,{bubbles:l,cancelable:!0}),void 0!==n&&Object.keys(n).forEach(e=>{Object.defineProperty(d,e,{get:()=>n[e]})}),u&&d.preventDefault(),c&&e.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map;var H={set(e,t,n){M.has(e)||M.set(e,new Map);const i=M.get(e);i.has(t)||0===i.size?i.set(t,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(e,t)=>M.has(e)&&M.get(e).get(t)||null,remove(e,t){if(!M.has(e))return;const n=M.get(e);n.delete(t),0===n.size&&M.delete(e)}};class F{constructor(e){(e=c(e))&&(this._element=e,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,t,n=!0){_(e,t,n)}static getInstance(e){return H.get(e,this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,"object"==typeof t?t:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class q extends F{static get NAME(){return"alert"}close(e){const t=e?this._getRootElement(e):this._element,n=this._triggerCloseEvent(t);null===n||n.defaultPrevented||this._removeElement(t)}_getRootElement(e){return s(e)||e.closest(".alert")}_triggerCloseEvent(e){return B.trigger(e,"close.bs.alert")}_removeElement(e){e.classList.remove("show");const t=e.classList.contains("fade");this._queueCallback(()=>this._destroyElement(e),e,t)}_destroyElement(e){e.remove(),B.trigger(e,"closed.bs.alert")}static jQueryInterface(e){return this.each(function(){const t=q.getOrCreateInstance(this);"close"===e&&t[e](this)})}static handleDismiss(e){return function(t){t&&t.preventDefault(),e.close(this)}}}B.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',q.handleDismiss(new q)),y(q);class z extends F{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each(function(){const t=z.getOrCreateInstance(this);"toggle"===e&&t[e]()})}}function W(e){return"true"===e||"false"!==e&&(e===Number(e).toString()?Number(e):""===e||"null"===e?null:e)}function U(e){return e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())}B.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',e=>{e.preventDefault();const t=e.target.closest('[data-bs-toggle="button"]');z.getOrCreateInstance(t).toggle()}),y(z);const X={setDataAttribute(e,t,n){e.setAttribute("data-bs-"+U(t),n)},removeDataAttribute(e,t){e.removeAttribute("data-bs-"+U(t))},getDataAttributes(e){if(!e)return{};const t={};return Object.keys(e.dataset).filter(e=>e.startsWith("bs")).forEach(n=>{let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),t[i]=W(e.dataset[n])}),t},getDataAttribute:(e,t)=>W(e.getAttribute("data-bs-"+U(t))),offset(e){const t=e.getBoundingClientRect();return{top:t.top+document.body.scrollTop,left:t.left+document.body.scrollLeft}},position:e=>({top:e.offsetTop,left:e.offsetLeft})},K={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},V={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},G="next",Q="prev",Y="left",Z="right",J={ArrowLeft:Z,ArrowRight:Y};class ee extends F{constructor(e,t){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._indicatorsElement=n.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return K}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(Q)}pause(e){e||(this._isPaused=!0),n.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(a(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=n.findOne(".active.carousel-item",this._element);const t=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void B.one(this._element,"slid.bs.carousel",()=>this.to(e));if(t===e)return this.pause(),void this.cycle();const i=e>t?G:Q;this._slide(i,this._items[e])}_getConfig(e){return e={...K,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("carousel",e,V),e}_handleSwipe(){const e=Math.abs(this.touchDeltaX);if(e<=40)return;const t=e/this.touchDeltaX;this.touchDeltaX=0,t&&this._slide(t>0?Z:Y)}_addEventListeners(){this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",e=>this._keydown(e)),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",e=>this.pause(e)),B.on(this._element,"mouseleave.bs.carousel",e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType?this._pointerEvent||(this.touchStartX=e.touches[0].clientX):this.touchStartX=e.clientX},t=e=>{this.touchDeltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this.touchStartX},i=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType||(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(e=>this.cycle(e),500+this._config.interval))};n.find(".carousel-item img",this._element).forEach(e=>{B.on(e,"dragstart.bs.carousel",e=>e.preventDefault())}),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",t=>e(t)),B.on(this._element,"pointerup.bs.carousel",e=>i(e)),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",t=>e(t)),B.on(this._element,"touchmove.bs.carousel",e=>t(e)),B.on(this._element,"touchend.bs.carousel",e=>i(e)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=J[e.key];t&&(e.preventDefault(),this._slide(t))}_getItemIndex(e){return this._items=e&&e.parentNode?n.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,t){const n=e===G;return x(this._items,t,n,this._config.wrap)}_triggerSlideEvent(e,t){const i=this._getItemIndex(e),o=this._getItemIndex(n.findOne(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:t,from:o,to:i})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const t=n.findOne(".active",this._indicatorsElement);t.classList.remove("active"),t.removeAttribute("aria-current");const i=n.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{B.trigger(this._element,"slid.bs.carousel",{relatedTarget:s,direction:h,from:r,to:a})};if(this._element.classList.contains("slide")){s.classList.add(d),g(s),o.classList.add(u),s.classList.add(u);const e=()=>{s.classList.remove(u,d),s.classList.add("active"),o.classList.remove("active",d,u),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(e,o,!0)}else o.classList.remove("active"),s.classList.add("active"),this._isSliding=!1,f();l&&this.cycle()}_directionToOrder(e){return[Z,Y].includes(e)?v()?e===Y?Q:G:e===Y?G:Q:e}_orderToDirection(e){return[G,Q].includes(e)?v()?e===Q?Y:Z:e===Q?Z:Y:e}static carouselInterface(e,t){const n=ee.getOrCreateInstance(e,t);let{_config:i}=n;"object"==typeof t&&(i={...i,...t});const o="string"==typeof t?t:i.slide;if("number"==typeof t)n.to(t);else if("string"==typeof o){if(void 0===n[o])throw new TypeError(`No method named "${o}"`);n[o]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}static jQueryInterface(e){return this.each(function(){ee.carouselInterface(this,e)})}static dataApiClickHandler(e){const t=s(this);if(!t||!t.classList.contains("carousel"))return;const n={...X.getDataAttributes(t),...X.getDataAttributes(this)},i=this.getAttribute("data-bs-slide-to");i&&(n.interval=!1),ee.carouselInterface(t,n),i&&ee.getInstance(t).to(i),e.preventDefault()}}B.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",ee.dataApiClickHandler),B.on(window,"load.bs.carousel.data-api",()=>{const e=n.find('[data-bs-ride="carousel"]');for(let t=0,n=e.length;te===this._element);null!==o&&s.length&&(this._selector=o,this._triggerArray.push(t))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return te}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let e,t;this._parent&&(0===(e=n.find(".show, .collapsing",this._parent).filter(e=>"string"==typeof this._config.parent?e.getAttribute("data-bs-parent")===this._config.parent:e.classList.contains("collapse"))).length&&(e=null));const i=n.findOne(this._selector);if(e){const n=e.find(e=>i!==e);if((t=n?ie.getInstance(n):null)&&t._isTransitioning)return}if(B.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e&&e.forEach(e=>{i!==e&&ie.collapseInterface(e,"hide"),t||H.set(e,"bs.collapse",null)});const o=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[o]=0,this._triggerArray.length&&this._triggerArray.forEach(e=>{e.classList.remove("collapsed"),e.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const r="scroll"+(o[0].toUpperCase()+o.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[o]="",this.setTransitioning(!1),B.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[o]=this._element[r]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(B.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const e=this._getDimension();this._element.style[e]=this._element.getBoundingClientRect()[e]+"px",g(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const t=this._triggerArray.length;if(t>0)for(let e=0;e{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),B.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(e){this._isTransitioning=e}_getConfig(e){return(e={...te,...e}).toggle=Boolean(e.toggle),u("collapse",e,ne),e}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:e}=this._config;const t=`[data-bs-toggle="collapse"][data-bs-parent="${e=c(e)}"]`;return n.find(t,e).forEach(e=>{const t=s(e);this._addAriaAndCollapsedClass(t,[e])}),e}_addAriaAndCollapsedClass(e,t){if(!e||!t.length)return;const n=e.classList.contains("show");t.forEach(e=>{n?e.classList.remove("collapsed"):e.classList.add("collapsed"),e.setAttribute("aria-expanded",n)})}static collapseInterface(e,t){let n=ie.getInstance(e);const i={...te,...X.getDataAttributes(e),..."object"==typeof t&&t?t:{}};if(!n&&i.toggle&&"string"==typeof t&&/show|hide/.test(t)&&(i.toggle=!1),n||(n=new ie(e,i)),"string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){ie.collapseInterface(this,e)})}}B.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const t=X.getDataAttributes(this),i=r(this);n.find(i).forEach(e=>{const n=ie.getInstance(e);let i;n?(null===n._parent&&"string"==typeof t.parent&&(n._config.parent=t.parent,n._parent=n._getParent()),i="toggle"):i=t,ie.collapseInterface(e,i)})}),y(ie);const oe=new RegExp("ArrowUp|ArrowDown|Escape"),re=v()?"top-end":"top-start",se=v()?"top-start":"top-end",ae=v()?"bottom-end":"bottom-start",le=v()?"bottom-start":"bottom-end",ce=v()?"left-start":"right-start",ue=v()?"right-start":"left-start",de={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},he={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class fe extends F{constructor(e,t){super(e),this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return de}static get DefaultType(){return he}static get NAME(){return"dropdown"}toggle(){h(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(h(this._element)||this._menu.classList.contains("show"))return;const e=fe.getParentFromElement(this._element),n={relatedTarget:this._element};if(!B.trigger(this._element,"show.bs.dropdown",n).defaultPrevented){if(this._inNavbar)X.setDataAttribute(this._menu,"popper","none");else{if(void 0===t)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let n=this._element;"parent"===this._config.reference?n=e:l(this._config.reference)?n=c(this._config.reference):"object"==typeof this._config.reference&&(n=this._config.reference);const i=this._getPopperConfig(),o=i.modifiers.find(e=>"applyStyles"===e.name&&!1===e.enabled);this._popper=t.createPopper(n,this._menu,i),o&&X.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(e=>B.on(e,"mouseover",p)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),B.trigger(this._element,"shown.bs.dropdown",n)}}hide(){if(h(this._element)||!this._menu.classList.contains("show"))return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){B.on(this._element,"click.bs.dropdown",e=>{e.preventDefault(),this.toggle()})}_completeHide(e){B.trigger(this._element,"hide.bs.dropdown",e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>B.off(e,"mouseover",p)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),X.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,"hidden.bs.dropdown",e))}_getConfig(e){if(e={...this.constructor.Default,...X.getDataAttributes(this._element),...e},u("dropdown",e,this.constructor.DefaultType),"object"==typeof e.reference&&!l(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return e}_getMenuElement(){return n.next(this._element,".dropdown-menu")[0]}_getPlacement(){const e=this._element.parentNode;if(e.classList.contains("dropend"))return ce;if(e.classList.contains("dropstart"))return ue;const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?se:re:t?le:ae}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:t}){const i=n.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(d);i.length&&x(i,t,"ArrowDown"===e,!i.includes(t)).focus()}static dropdownInterface(e,t){const n=fe.getOrCreateInstance(e,t);if("string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){fe.dropdownInterface(this,e)})}static clearMenus(e){if(e&&(2===e.button||"keyup"===e.type&&"Tab"!==e.key))return;const t=n.find('[data-bs-toggle="dropdown"]');for(let n=0,i=t.length;nthis.matches('[data-bs-toggle="dropdown"]')?this:n.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===e.key?(i().focus(),void fe.clearMenus()):"ArrowUp"===e.key||"ArrowDown"===e.key?(t||i().click(),void fe.getInstance(i())._selectMenuItem(e)):void(t&&"Space"!==e.key||fe.clearMenus())}}B.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',fe.dataApiKeydownHandler),B.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",fe.dataApiKeydownHandler),B.on(document,"click.bs.dropdown.data-api",fe.clearMenus),B.on(document,"keyup.bs.dropdown.data-api",fe.clearMenus),B.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',function(e){e.preventDefault(),fe.dropdownInterface(this)}),y(fe);class pe{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",t=>t+e),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",t=>t+e),this._setElementAttributes(".sticky-top","marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const i=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+i)return;this._saveInitialAttribute(e,t);const o=window.getComputedStyle(e)[t];e.style[t]=n(Number.parseFloat(o))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(e,t){const n=e.style[t];n&&X.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{const n=X.getDataAttribute(e,t);void 0===n?e.style.removeProperty(t):(X.removeDataAttribute(e,t),e.style[t]=n)})}_applyManipulationCallback(e,t){l(e)?t(e):n.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}const ge={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},me={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class be{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){this._config.isVisible?(this._append(),this._config.isAnimated&&g(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{w(e)})):w(e)}hide(e){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),w(e)})):w(e)}_getElement(){if(!this._element){const e=document.createElement("div");e.className="modal-backdrop",this._config.isAnimated&&e.classList.add("fade"),this._element=e}return this._element}_getConfig(e){return(e={...ge,..."object"==typeof e?e:{}}).rootElement=c(e.rootElement),u("backdrop",e,me),e}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),B.on(this._getElement(),"mousedown.bs.backdrop",()=>{w(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(B.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){_(e,this._getElement(),this._config.isAnimated)}}const ve={backdrop:!0,keyboard:!0,focus:!0},ye={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class we extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._dialog=n.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new pe}static get Default(){return ve}static get NAME(){return"modal"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||B.trigger(this._element,"show.bs.modal",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),B.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',e=>this.hide(e)),B.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{B.one(this._element,"mouseup.dismiss.bs.modal",e=>{e.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(e){if(e&&["A","AREA"].includes(e.target.tagName)&&e.preventDefault(),!this._isShown||this._isTransitioning)return;if(B.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),B.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.modal"),B.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,t)}dispose(){[window,this._dialog].forEach(e=>B.off(e,".bs.modal")),this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new be({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(e){return e={...ve,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("modal",e,ye),e}_showElement(e){const t=this._isAnimated(),i=n.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),t&&g(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,B.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,t)}_enforceFocus(){B.off(document,"focusin.bs.modal"),B.on(document,"focusin.bs.modal",e=>{document===e.target||this._element===e.target||this._element.contains(e.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?B.on(this._element,"keydown.dismiss.bs.modal",e=>{this._config.keyboard&&"Escape"===e.key?(e.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==e.key||this._triggerBackdropTransition()}):B.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?B.on(window,"resize.bs.modal",()=>this._adjustDialog()):B.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(e){B.on(this._element,"click.dismiss.bs.modal",e=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:e.target===e.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(B.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:e,scrollHeight:t,style:n}=this._element,i=t>document.documentElement.clientHeight;!i&&"hidden"===n.overflowY||e.contains("modal-static")||(i||(n.overflowY="hidden"),e.add("modal-static"),this._queueCallback(()=>{e.remove("modal-static"),i||this._queueCallback(()=>{n.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;(!n&&e&&!v()||n&&!e&&v())&&(this._element.style.paddingLeft=t+"px"),(n&&!e&&!v()||!n&&e&&v())&&(this._element.style.paddingRight=t+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=we.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e](t)}})}}B.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',function(e){const t=s(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),B.one(t,"show.bs.modal",e=>{e.defaultPrevented||B.one(t,"hidden.bs.modal",()=>{d(this)&&this.focus()})}),we.getOrCreateInstance(t).toggle(this)}),y(we);const _e={backdrop:!0,keyboard:!0,scroll:!1},xe={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Ce extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return _e}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||B.trigger(this._element,"show.bs.offcanvas",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new pe).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{B.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:e})},this._element,!0))}hide(){this._isShown&&(B.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(B.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new pe).reset(),B.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.offcanvas")}_getConfig(e){return e={..._e,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("offcanvas",e,xe),e}_initializeBackDrop(){return new be({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(e){B.off(document,"focusin.bs.offcanvas"),B.on(document,"focusin.bs.offcanvas",t=>{document===t.target||e===t.target||e.contains(t.target)||e.focus()}),e.focus()}_addEventListeners(){B.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),B.on(this._element,"keydown.dismiss.bs.offcanvas",e=>{this._config.keyboard&&"Escape"===e.key&&this.hide()})}static jQueryInterface(e){return this.each(function(){const t=Ce.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}B.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',function(e){const t=s(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this))return;B.one(t,"hidden.bs.offcanvas",()=>{d(this)&&this.focus()});const i=n.findOne(".offcanvas.show");i&&i!==t&&Ce.getInstance(i).hide(),Ce.getOrCreateInstance(t).toggle(this)}),B.on(window,"load.bs.offcanvas.data-api",()=>n.find(".offcanvas.show").forEach(e=>Ce.getOrCreateInstance(e).show())),y(Ce);const Ee=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ae=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Te=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,ke=(e,t)=>{const n=e.nodeName.toLowerCase();if(t.includes(n))return!Ee.has(n)||Boolean(Ae.test(e.nodeValue)||Te.test(e.nodeValue));const i=t.filter(e=>e instanceof RegExp);for(let e=0,t=i.length;e{ke(e,a)||n.removeAttribute(e.nodeName)})}return i.body.innerHTML}const De=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Le=new Set(["sanitize","allowList","sanitizeFn"]),Ne={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Pe={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},je={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},$e={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class Ie extends F{constructor(e,n){if(void 0===t)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(n),this.tip=null,this._setListeners()}static get Default(){return je}static get NAME(){return"tooltip"}static get Event(){return $e}static get DefaultType(){return Ne}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(this._isEnabled)if(e){const t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const e=B.trigger(this._element,this.constructor.Event.SHOW),n=f(this._element),o=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!o)return;const r=this.getTipElement(),s=i(this.constructor.NAME);r.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this.setContent(),this._config.animation&&r.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,r,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:c}=this._config;H.set(r,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(c.appendChild(r),B.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=t.createPopper(this._element,r,this._getPopperConfig(l)),r.classList.add("show");const u="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;u&&r.classList.add(...u.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>{B.on(e,"mouseover",p)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const e=this._hoverState;this._hoverState=null,B.trigger(this._element,this.constructor.Event.SHOWN),"out"===e&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const e=this.getTipElement();if(B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>B.off(e,"mouseover",p)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const t=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),B.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,t),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const e=document.createElement("div");return e.innerHTML=this._config.template,this.tip=e.children[0],this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")}setElementContent(e,t){if(null!==e)return l(t)?(t=c(t),void(this._config.html?t.parentNode!==e&&(e.innerHTML="",e.appendChild(t)):e.textContent=t.textContent)):void(this._config.html?(this._config.sanitize&&(t=Se(t,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=t):e.textContent=t)}getTitle(){let e=this._element.getAttribute("data-bs-original-title");return e||(e="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),e}updateAttachment(e){return"right"===e?"end":"left"===e?"start":e}_initializeOnDelegatedTarget(e,t){const n=this.constructor.DATA_KEY;return(t=t||H.get(e.delegateTarget,n))||(t=new this.constructor(e.delegateTarget,this._getDelegateConfig()),H.set(e.delegateTarget,n,t)),t}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:e=>this._handlePopperPlacementChange(e)}],onFirstUpdate:e=>{e.options.placement!==e.placement&&this._handlePopperPlacementChange(e)}};return{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_addAttachmentClass(e){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(e))}_getAttachment(e){return Pe[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(e=>{if("click"===e)B.on(this._element,this.constructor.Event.CLICK,this._config.selector,e=>this.toggle(e));else if("manual"!==e){const t="hover"===e?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,n="hover"===e?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;B.on(this._element,t,this._config.selector,e=>this._enter(e)),B.on(this._element,n,this._config.selector,e=>this._leave(e))}}),this._hideModalHandler=(()=>{this._element&&this.hide()}),B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||"string"!==t)&&(this._element.setAttribute("data-bs-original-title",e||""),!e||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusin"===e.type?"focus":"hover"]=!0),t.getTipElement().classList.contains("show")||"show"===t._hoverState?t._hoverState="show":(clearTimeout(t._timeout),t._hoverState="show",t._config.delay&&t._config.delay.show?t._timeout=setTimeout(()=>{"show"===t._hoverState&&t.show()},t._config.delay.show):t.show())}_leave(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusout"===e.type?"focus":"hover"]=t._element.contains(e.relatedTarget)),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t._config.delay&&t._config.delay.hide?t._timeout=setTimeout(()=>{"out"===t._hoverState&&t.hide()},t._config.delay.hide):t.hide())}_isWithActiveTrigger(){for(const e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){const t=X.getDataAttributes(this._element);return Object.keys(t).forEach(e=>{Le.has(e)&&delete t[e]}),(e={...this.constructor.Default,...t,..."object"==typeof e&&e?e:{}}).container=!1===e.container?document.body:c(e.container),"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),u("tooltip",e,this.constructor.DefaultType),e.sanitize&&(e.template=Se(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){const e={};if(this._config)for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(De);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}_handlePopperPlacementChange(e){const{state:t}=e;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}static jQueryInterface(e){return this.each(function(){const t=Ie.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}y(Ie);const Oe=new RegExp("(^|\\s)bs-popover\\S+","g"),Re={...Ie.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Be={...Ie.DefaultType,content:"(string|element|function)"},Me={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class He extends Ie{static get Default(){return Re}static get NAME(){return"popover"}static get Event(){return Me}static get DefaultType(){return Be}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||n.findOne(".popover-header",this.tip).remove(),this._getContent()||n.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".popover-header",e),this.getTitle());let t=this._getContent();"function"==typeof t&&(t=t.call(this._element)),this.setElementContent(n.findOne(".popover-body",e),t),e.classList.remove("fade","show")}_addAttachmentClass(e){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(e))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(Oe);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}static jQueryInterface(e){return this.each(function(){const t=He.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}y(He);const Fe={offset:10,method:"auto",target:""},qe={offset:"number",method:"string",target:"(string|element)"};class ze extends F{constructor(e,t){super(e),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(t),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,B.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return Fe}static get NAME(){return"scrollspy"}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":"position",t="auto"===this._config.method?e:this._config.method,i="position"===t?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),n.find(this._selector).map(e=>{const o=r(e),s=o?n.findOne(o):null;if(s){const e=s.getBoundingClientRect();if(e.width||e.height)return[X[t](s).top+i,o]}return null}).filter(e=>e).sort((e,t)=>e[0]-t[0]).forEach(e=>{this._offsets.push(e[0]),this._targets.push(e[1])})}dispose(){B.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(e){if("string"!=typeof(e={...Fe,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}}).target&&l(e.target)){let{id:t}=e.target;t||(t=i("scrollspy"),e.target.id=t),e.target="#"+t}return u("scrollspy",e,qe),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){const e=this._targets[this._targets.length-1];this._activeTarget!==e&&this._activate(e)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(void 0===this._offsets[t+1]||e`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),i=n.findOne(t.join(","));i.classList.contains("dropdown-item")?(n.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add("active"),i.classList.add("active")):(i.classList.add("active"),n.parents(i,".nav, .list-group").forEach(e=>{n.prev(e,".nav-link, .list-group-item").forEach(e=>e.classList.add("active")),n.prev(e,".nav-item").forEach(e=>{n.children(e,".nav-link").forEach(e=>e.classList.add("active"))})})),B.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){n.find(this._selector).filter(e=>e.classList.contains("active")).forEach(e=>e.classList.remove("active"))}static jQueryInterface(e){return this.each(function(){const t=ze.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(window,"load.bs.scrollspy.data-api",()=>{n.find('[data-bs-spy="scroll"]').forEach(e=>new ze(e))}),y(ze);class We extends F{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let e;const t=s(this._element),i=this._element.closest(".nav, .list-group");if(i){const t="UL"===i.nodeName||"OL"===i.nodeName?":scope > li > .active":".active";e=(e=n.find(t,i))[e.length-1]}const o=e?B.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(B.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==o&&o.defaultPrevented)return;this._activate(this._element,i);const r=()=>{B.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),B.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};t?this._activate(t,t.parentNode,r):r()}_activate(e,t,i){const o=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?n.children(t,".active"):n.find(":scope > li > .active",t))[0],r=i&&o&&o.classList.contains("fade"),s=()=>this._transitionComplete(e,o,i);o&&r?(o.classList.remove("show"),this._queueCallback(s,e,!0)):s()}_transitionComplete(e,t,i){if(t){t.classList.remove("active");const e=n.findOne(":scope > .dropdown-menu .active",t.parentNode);e&&e.classList.remove("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),g(e),e.classList.contains("fade")&&e.classList.add("show");let o=e.parentNode;if(o&&"LI"===o.nodeName&&(o=o.parentNode),o&&o.classList.contains("dropdown-menu")){const t=e.closest(".dropdown");t&&n.find(".dropdown-toggle",t).forEach(e=>e.classList.add("active")),e.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(e){return this.each(function(){const t=We.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this)||We.getOrCreateInstance(this).show()}),y(We);const Ue={animation:"boolean",autohide:"boolean",delay:"number"},Xe={animation:!0,autohide:!0,delay:5e3};class Ke extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Ue}static get Default(){return Xe}static get NAME(){return"toast"}show(){B.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),g(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),B.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(B.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),B.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(e){return e={...Xe,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}},u("toast",e,this.constructor.DefaultType),e}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t}if(t)return void this._clearTimeout();const n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),B.on(this._element,"mouseover.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"mouseout.bs.toast",e=>this._onInteraction(e,!1)),B.on(this._element,"focusin.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"focusout.bs.toast",e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Ke.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return y(Ke),{Alert:q,Button:z,Carousel:ee,Collapse:ie,Dropdown:fe,Modal:we,Offcanvas:Ce,Popover:He,ScrollSpy:ze,Tab:We,Toast:Ke,Tooltip:Ie}}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function t(t,i,o){i={content:{message:"object"==typeof i?i.message:i,title:i.title?i.title:"",icon:i.icon?i.icon:"",url:i.url?i.url:"#",target:i.target?i.target:"-"}},o=e.extend(!0,{},i,o),this.settings=e.extend(!0,{},n,o),this._defaults=n,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var n={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var e=arguments[0],t=1;t .progress-bar').removeClass("progress-bar-"+e.settings.type),e.settings.type=i[t],this.$ele.addClass("alert-"+i[t]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[t]);break;case"icon":var o=this.$ele.find('[data-notify="icon"]');"class"==e.settings.icon_type.toLowerCase()?o.removeClass(e.settings.content.icon).addClass(i[t]):(o.is("img")||o.find("img"),o.attr("src",i[t]));break;case"progress":var r=e.settings.delay-e.settings.delay*(i[t]/100);this.$ele.data("notify-delay",r),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[t]).css("width",i[t]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[t]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[t]);break;default:this.$ele.find('[data-notify="'+t+'"]').html(i[t])}var s=this.$ele.outerHeight()+parseInt(e.settings.spacing)+parseInt(e.settings.offset.y);e.reposition(s)},close:function(){e.close()}}},buildNotify:function(){var t=this.settings.content;this.$ele=e(String.format(this.settings.template,this.settings.type,t.title,t.message,t.url,t.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var t=this,n=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},o=!1,r=this.settings;switch(e('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return n=Math.max(n,parseInt(e(this).css(r.placement.from))+parseInt(e(this).outerHeight())+parseInt(r.spacing))}),1==this.settings.newest_on_top&&(n=this.settings.offset.y),i[this.settings.placement.from]=n+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),e.each(Array("webkit","moz","o","ms",""),function(e,n){t.$ele[0].style[n+"AnimationIterationCount"]=1}),e(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(n=parseInt(n)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(n)),e.isFunction(t.settings.onShow)&&t.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(e){o=!0}).one(this.animations.end,function(n){e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)}),setTimeout(function(){o||e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)},600)},bind:function(){var t=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){t.close()}),this.$ele.mouseover(function(t){e(this).data("data-hover","true")}).mouseout(function(t){e(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){t.$ele.data("notify-delay",t.settings.delay);var n=setInterval(function(){var e=parseInt(t.$ele.data("notify-delay"))-t.settings.timer;if("false"===t.$ele.data("data-hover")&&"pause"==t.settings.mouse_over||"pause"!=t.settings.mouse_over){var i=(t.settings.delay-e)/t.settings.delay*100;t.$ele.data("notify-delay",e),t.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}e<=-t.settings.timer&&(clearInterval(n),t.close())},t.settings.timer)}},close:function(){var t=this,n=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),t.reposition(n),e.isFunction(t.settings.onClose)&&t.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(e){i=!0}).one(this.animations.end,function(n){e(this).remove(),e.isFunction(t.settings.onClosed)&&t.settings.onClosed.call(this)}),setTimeout(function(){i||(t.$ele.remove(),t.settings.onClosed&&t.settings.onClosed(t.$ele))},600)},reposition:function(t){var n=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',o=this.$ele.nextAll(i);1==this.settings.newest_on_top&&(o=this.$ele.prevAll(i)),o.each(function(){e(this).css(n.settings.placement.from,t),t=parseInt(t)+parseInt(n.settings.spacing)+e(this).outerHeight()})}}),e.notify=function(e,n){return new t(this,e,n).notify},e.notifyDefaults=function(t){return n=e.extend(!0,{},n,t)},e.notifyClose=function(t){void 0===t||"all"==t?e("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):e('[data-notify-position="'+t+'"]').find('[data-notify="dismiss"]').trigger("click")}});var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof i?new i(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(_ instanceof l)){if(g&&y!=t.length-1){if(h.lastIndex=w,!(k=h.exec(e)))break;for(var x=k.index+(p?k[1].length:0),C=k.index+k[0].length,E=y,A=w,T=t.length;E"+r.content+""},!_self.document)return _self.addEventListener&&(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),i=t.language,o=t.code,r=t.immediateClose;_self.postMessage(n.highlight(o,n.languages[i],i)),r&&_self.close()},!1)),_self.Prism;var o=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return o&&(n.filename=o.src,n.manual||o.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/[a-z0-9_]+(?=\()/i,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,function:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}}}),Prism.languages.javascript["template-string"].inside.interpolation.inside.rest=Prism.languages.javascript,Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(){var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){for(var n,i=t.getAttribute("data-src"),o=t,r=/\blang(?:uage)?-([\w-]+)\b/i;o&&!r.test(o.className);)o=o.parentNode;if(o&&(n=(t.className.match(r)||[,""])[1]),!n){var s=(i.match(/\.(\w+)$/)||[,""])[1];n=e[s]||s}var a=document.createElement("code");a.className="language-"+n,t.textContent="",a.textContent="Loading…",t.appendChild(a);var l=new XMLHttpRequest;l.open("GET",i,!0),l.onreadystatechange=function(){4==l.readyState&&(l.status<400&&l.responseText?(a.textContent=l.responseText,Prism.highlightElement(a)):400<=l.status?a.textContent="✖ Error "+l.status+" while fetching file: "+l.statusText:a.textContent="✖ Error: File does not exist or is empty")},l.send(null)}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),i=document.createElement("a");return i.textContent=t.getAttribute("data-download-link-label")||"Download",i.setAttribute("download",""),i.href=n,i}})},document.addEventListener("DOMContentLoaded",self.Prism.fileHighlight)),function(e,t,n){var i,o=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/en_US/sdk.js",o.parentNode.insertBefore(i,o))}(document,"script","facebook-jssdk"),function(e,t,n,i,o,r){(i=e.gapi||(e.gapi={})).analytics={q:[],ready:function(e){this.q.push(e)}},o=t.createElement(n),r=t.getElementsByTagName(n)[0],o.src="https://apis.google.com/js/platform.js",r.parentNode.insertBefore(o,r),o.onload=function(){i.load("analytics")}}(window,document,"script"),function(e,t,n){var i,o=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/vi_VN/sdk/xfbml.customerchat.js",o.parentNode.insertBefore(i,o))}(document,"script","facebook-jssdk"),function(e){e.fn.qrcode=function(t){var n;function i(e){this.mode=n,this.data=e}function o(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function r(e,t){if(null==e.length)throw Error(e.length+"/"+t);for(var n=0;ne||this.moduleCount<=e||0>t||this.moduleCount<=t)throw Error(e+","+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){var e=1;for(e=1;40>e;e++){for(var t=s.getRSBlocks(e,this.errorCorrectLevel),n=new a,i=0,o=0;o=n;n++)if(!(-1>=e+n||this.moduleCount<=e+n))for(var i=-1;7>=i;i++)-1>=t+i||this.moduleCount<=t+i||(this.modules[e+n][t+i]=0<=n&&6>=n&&(0==i||6==i)||0<=i&&6>=i&&(0==n||6==n)||2<=n&&4>=n&&2<=i&&4>=i)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;8>n;n++){this.makeImpl(!0,n);var i=l.getLostPoint(this);(0==n||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){for(e=e.createEmptyMovieClip(t,n),this.make(),t=0;t=r;r++)for(var s=-2;2>=s;s++)this.modules[i+r][o+s]=-2==r||2==r||-2==s||2==s||0==r&&0==s}},setupTypeNumber:function(e){for(var t=l.getBCHTypeNumber(this.typeNumber),n=0;18>n;n++){var i=!e&&1==(t>>n&1);this.modules[Math.floor(n/3)][n%3+this.moduleCount-8-3]=i}for(n=0;18>n;n++)i=!e&&1==(t>>n&1),this.modules[n%3+this.moduleCount-8-3][Math.floor(n/3)]=i},setupTypeInfo:function(e,t){for(var n=l.getBCHTypeInfo(this.errorCorrectLevel<<3|t),i=0;15>i;i++){var o=!e&&1==(n>>i&1);6>i?this.modules[i][8]=o:8>i?this.modules[i+1][8]=o:this.modules[this.moduleCount-15+i][8]=o}for(i=0;15>i;i++)o=!e&&1==(n>>i&1),8>i?this.modules[8][this.moduleCount-i-1]=o:9>i?this.modules[8][15-i-1+1]=o:this.modules[8][15-i-1]=o;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,o=7,r=0,s=this.moduleCount-1;0a;a++)if(null==this.modules[i][s-a]){var c=!1;r>>o&1)),l.getMask(t,i,s-a)&&(c=!c),this.modules[i][s-a]=c,-1==--o&&(r++,o=7)}if(0>(i+=n)||this.moduleCount<=i){i-=n,n=-n;break}}}},o.PAD0=236,o.PAD1=17,o.createData=function(e,t,n){t=s.getRSBlocks(e,t);for(var i=new a,r=0;r8*e)throw Error("code length overflow. ("+i.getLengthInBits()+">"+8*e+")");for(i.getLengthInBits()+4<=8*e&&i.put(0,4);0!=i.getLengthInBits()%8;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*e||(i.put(o.PAD0,8),i.getLengthInBits()>=8*e));)i.put(o.PAD1,8);return o.createBytes(i,t)},o.createBytes=function(e,t){for(var n=0,i=0,o=0,s=Array(t.length),a=Array(t.length),c=0;c>>=1;return t},getPatternPosition:function(e){return l.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case 0:return 0==(t+n)%2;case 1:return 0==t%2;case 2:return 0==n%3;case 3:return 0==(t+n)%3;case 4:return 0==(Math.floor(t/2)+Math.floor(n/3))%2;case 5:return 0==t*n%2+t*n%3;case 6:return 0==(t*n%2+t*n%3)%2;case 7:return 0==(t*n%3+(t+n)%2)%2;default:throw Error("bad maskPattern:"+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;nt)switch(e){case 1:return 10;case 2:return 9;case n:case 8:return 8;default:throw Error("mode:"+e)}else if(27>t)switch(e){case 1:return 12;case 2:return 11;case n:return 16;case 8:return 10;default:throw Error("mode:"+e)}else{if(!(41>t))throw Error("type:"+t);switch(e){case 1:return 14;case 2:return 13;case n:return 16;case 8:return 12;default:throw Error("mode:"+e)}}},getLostPoint:function(e){for(var t=e.getModuleCount(),n=0,i=0;i=a;a++)if(!(0>i+a||t<=i+a))for(var l=-1;1>=l;l++)0>o+l||t<=o+l||0==a&&0==l||s==e.isDark(i+a,o+l)&&r++;5e)throw Error("glog("+e+")");return c.LOG_TABLE[e]},gexp:function(e){for(;0>e;)e+=255;for(;256<=e;)e-=255;return c.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},u=0;8>u;u++)c.EXP_TABLE[u]=1<u;u++)c.EXP_TABLE[u]=c.EXP_TABLE[u-4]^c.EXP_TABLE[u-5]^c.EXP_TABLE[u-6]^c.EXP_TABLE[u-8];for(u=0;255>u;u++)c.LOG_TABLE[c.EXP_TABLE[u]]=u;return r.prototype={get:function(e){return this.num[e]},getLength:function(){return this.num.length},multiply:function(e){for(var t=Array(this.getLength()+e.getLength()-1),n=0;nthis.getLength()-e.getLength())return this;for(var t=c.glog(this.get(0))-c.glog(e.get(0)),n=Array(this.getLength()),i=0;i>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},"string"==typeof t&&(t={text:t}),t=e.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,correctLevel:2,background:"#ffffff",foreground:"#000000"},t),this.each(function(){var n;if("canvas"==t.render){(n=new o(t.typeNumber,t.correctLevel)).addData(t.text),n.make();var i=document.createElement("canvas");i.width=t.width,i.height=t.height;for(var r=i.getContext("2d"),s=t.width/n.getModuleCount(),a=t.height/n.getModuleCount(),l=0;l").css("width",t.width+"px").css("height",t.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",t.background),r=t.width/n.getModuleCount(),s=t.height/n.getModuleCount(),a=0;a").css("height",s+"px").appendTo(i),c=0;c").css("width",r+"px").css("background-color",n.isDark(a,c)?t.foreground:t.background).appendTo(l);n=i,jQuery(n).appendTo(this)})}}(jQuery),function(){"use strict";var e="undefined"!=typeof window&&void 0!==window.document?window.document:{},t="undefined"!=typeof module&&module.exports,n=function(){for(var t,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=0,o=n.length,r={};i",{class:n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=i("
    "),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=i("
    \ No newline at end of file +{{$ctrl.post.excerpt}}
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html index 75b5d5627..a7e050922 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html @@ -1,4 +1,4 @@
    \ No newline at end of file + display: block; + margin-bottom: 0 !important; + }
    \ No newline at end of file From a35286275d6d6269c954f300989b7435d58fb46a Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Tue, 31 Aug 2021 17:22:11 +0700 Subject: [PATCH 14/83] restore trumbowyg editor --- .../wwwroot/mix-app/js/app-shared.min.js | 1002 ++++++++--------- .../mix-database-data-value-editor/view.html | 2 +- .../components/mix-value-editor/view.html | 2 +- .../pages/module/components/main/main.html | 2 +- .../pages/page/components/main/main.html | 2 +- .../components/mix-column-editor/view.html | 2 +- .../components/module-form-editor/view.html | 2 +- .../components/trumbowyg/trumbowyg.html | 2 +- 8 files changed, 503 insertions(+), 513 deletions(-) diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js index 9bfc5957c..e438147ec 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js @@ -2845,6 +2845,27 @@ appShared.factory("TranslatorService", [ }, ]); +"use strict"; +appShared.factory("RestMixDatabaseColumnPortalService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("mix-database-column/portal", true); + var _initData = async function (mixDatabaseName) { + var url = this.prefixUrl + "/init/" + mixDatabaseName; + var req = { + method: "GET", + url: url, + }; + return await apiService.getRestApiResult(req); + }; + serviceFactory.initData = _initData; + return serviceFactory; + }, +]); + "use strict"; appShared.factory("RestMixDatabasePortalService", [ "BaseRestService", @@ -2865,16 +2886,6 @@ appShared.factory("RestMixDatabasePortalService", [ }, ]); -"use strict"; -appShared.factory("RestMixDatabaseDataValuePortalService", [ - "BaseRestService", - function (baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database-data-value/portal"); - return serviceFactory; - }, -]); - "use strict"; appShared.factory("RestMixDatabaseDataClientService", [ "BaseRestService", @@ -3004,33 +3015,11 @@ appShared.factory("RestMixDatabaseDataPortalService", [ ]); "use strict"; -appShared.factory("RestMixDatabaseColumnPortalService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database-column/portal", true); - var _initData = async function (mixDatabaseName) { - var url = this.prefixUrl + "/init/" + mixDatabaseName; - var req = { - method: "GET", - url: url, - }; - return await apiService.getRestApiResult(req); - }; - serviceFactory.initData = _initData; - return serviceFactory; - }, -]); - -"use strict"; -appShared.factory("RestMvcPostService", [ +appShared.factory("RestMixDatabaseDataValuePortalService", [ "BaseRestService", function (baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("post/mvc"); - // Define more service methods here + serviceFactory.init("mix-database-data-value/portal"); return serviceFactory; }, ]); @@ -3054,6 +3043,17 @@ appShared.factory("RestMvcModuleDataService", [ }, ]); +"use strict"; +appShared.factory("RestMvcPostService", [ + "BaseRestService", + function (baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("post/mvc"); + // Define more service methods here + return serviceFactory; + }, +]); + "use strict"; appShared.factory("RestRelatedAttributeDataFormService", [ "BaseRestService", @@ -4145,89 +4145,6 @@ appShared.controller("ModuleFormController", [ }, ]); -"use strict"; -appShared.controller("MvcModuleDataController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "RestMvcModuleDataService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.request.orderBy = "Priority"; - $scope.request.direction = "Asc"; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = null; - $scope.module = null; - $scope.allData = []; - $scope.editDataUrl = null; - $scope.canLoadMore = false; - $scope.init = async function (moduleId, pageSize) { - $scope.moduleId = moduleId; - $scope.request.module_id = $scope.moduleId; - $scope.request.pageSize = pageSize || $scope.request.pageSize; - $scope.loadMore(0); - }; - - $scope.getSingle = async function () { - $rootScope.isBusy = true; - var resp = await service.getSingle($scope.id, "mvc"); - if (resp && resp.isSucceed) { - $scope.activedModuleData = resp.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.activeItem = function (arr, item) { - angular.forEach(arr, function (e) { - if (e.id != item.id) { - e.expanded = false; - } else { - e.expanded = !e.expanded; - } - }); - }; - $scope.loadMore = async function (pageIndex) { - $scope.request.pageIndex = pageIndex || $scope.request.pageIndex + 1; - $rootScope.isBusy = true; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.allData = $scope.allData.concat(response.data.items); - $rootScope.isBusy = false; - $scope.canLoadMore = response.data.totalItems > $scope.allData.length; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - appShared.controller("MixDataController", [ "$rootScope", "$scope", @@ -4347,6 +4264,89 @@ appShared.controller("MixDataController", [ }, ]); +"use strict"; +appShared.controller("MvcModuleDataController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "RestMvcModuleDataService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.request.orderBy = "Priority"; + $scope.request.direction = "Asc"; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = null; + $scope.module = null; + $scope.allData = []; + $scope.editDataUrl = null; + $scope.canLoadMore = false; + $scope.init = async function (moduleId, pageSize) { + $scope.moduleId = moduleId; + $scope.request.module_id = $scope.moduleId; + $scope.request.pageSize = pageSize || $scope.request.pageSize; + $scope.loadMore(0); + }; + + $scope.getSingle = async function () { + $rootScope.isBusy = true; + var resp = await service.getSingle($scope.id, "mvc"); + if (resp && resp.isSucceed) { + $scope.activedModuleData = resp.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.activeItem = function (arr, item) { + angular.forEach(arr, function (e) { + if (e.id != item.id) { + e.expanded = false; + } else { + e.expanded = !e.expanded; + } + }); + }; + $scope.loadMore = async function (pageIndex) { + $scope.request.pageIndex = pageIndex || $scope.request.pageIndex + 1; + $rootScope.isBusy = true; + var response = await service.getList($scope.request); + if (response.isSucceed) { + $scope.allData = $scope.allData.concat(response.data.items); + $rootScope.isBusy = false; + $scope.canLoadMore = response.data.totalItems > $scope.allData.length; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + "use strict"; appShared.controller("MvcPostController", [ "$scope", @@ -4576,20 +4576,6 @@ sharedComponents.component("apiFile", { }, }); -sharedComponents.component("breadcrumbs", { - templateUrl: - "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], - bindings: { - breadCrumbs: "=", - }, -}); - sharedComponents.component("azureStorage", { templateUrl: "/mix-app/views/app-shared/components/azure-storage/view.html", bindings: { @@ -4698,12 +4684,26 @@ sharedComponents.component("azureStorage", { ], }); -sharedComponents.component("checkboxSwitch", { - templateUrl: "/mix-app/views/app-shared/components/checkbox-switch/view.html", +sharedComponents.component("breadcrumbs", { + templateUrl: + "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", controller: [ "$rootScope", - "$location", - function ($rootScope, $location) { + function ($rootScope) { + var ctrl = this; + }, + ], + bindings: { + breadCrumbs: "=", + }, +}); + +sharedComponents.component("checkboxSwitch", { + templateUrl: "/mix-app/views/app-shared/components/checkbox-switch/view.html", + controller: [ + "$rootScope", + "$location", + function ($rootScope, $location) { var ctrl = this; ctrl.guid = $rootScope.generateUUID(); ctrl.$onInit = function () { @@ -4921,37 +4921,6 @@ sharedComponents.component("swDataPreview", { }, }); -sharedComponents.component("goToTop", { - templateUrl: "/mix-app/views/app-shared/components/go-to-top/view.html", - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.$onInit = function () { - $(window).scroll(function () { - if ($(window).scrollTop() >= 50) { - // If page is scrolled more than 50px - $("#return-to-top").fadeIn(200); // Fade in the arrow - } else { - $("#return-to-top").fadeOut(200); // Else fade out the arrow - } - }); - }; - ctrl.goToTop = function () { - // ===== Scroll to Top ==== - $("body,html").animate( - { - scrollTop: 0, // Scroll to top of body - }, - 500 - ); - }; - }, - ], - bindings: {}, -}); - sharedComponents.component("fbLogin", { templateUrl: "/mix-app/views/app-shared/components/fb-login/view.html", bindings: { @@ -5030,6 +4999,37 @@ sharedComponents.component("fbLogin", { ], }); +sharedComponents.component("goToTop", { + templateUrl: "/mix-app/views/app-shared/components/go-to-top/view.html", + controller: [ + "$rootScope", + "$scope", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.$onInit = function () { + $(window).scroll(function () { + if ($(window).scrollTop() >= 50) { + // If page is scrolled more than 50px + $("#return-to-top").fadeIn(200); // Fade in the arrow + } else { + $("#return-to-top").fadeOut(200); // Else fade out the arrow + } + }); + }; + ctrl.goToTop = function () { + // ===== Scroll to Top ==== + $("body,html").animate( + { + scrollTop: 0, // Scroll to top of body + }, + 500 + ); + }; + }, + ], + bindings: {}, +}); + sharedComponents.component("googlePay", { templateUrl: "/mix-app/views/app-shared/components/google-pay/view.html", bindings: { @@ -5181,6 +5181,58 @@ sharedComponents.component("googlePay", { ], }); +sharedComponents.component("limitString", { + templateUrl: + "/mix-app/views/app-shared/components/limit-string/limit-string.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + function ($rootScope, $scope, ngAppSettings) { + var ctrl = this; + ctrl.shortenString = ""; + ctrl.previousContentId = undefined; + + this.$onInit = () => { + ctrl.previousContentId = angular.copy(ctrl.contentId); + }; + + this.$doCheck = () => { + if (ctrl.contentId !== ctrl.previousContentId) { + ctrl.loadModuleData(); + ctrl.previousContentId = ctrl.contentId; + } + }; + ctrl.shortString = function () { + var data = decodeURIComponent(ctrl.content); + if (data) { + if (ctrl.max < data.length) { + ctrl.shortenString = + data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; + } else { + ctrl.shortenString = data.replace(/[+]/g, " "); + } + } + }; + ctrl.view = function () { + var obj = { + moduleId: ctrl.moduleId, + id: ctrl.contentId, + }; + $rootScope.preview("module-data", obj, null, "modal-lg"); + }; + ctrl.translate = $rootScope.translate; + }, + ], + bindings: { + content: "=", + showData: "=", + max: "=", + moduleId: "=", + contentId: "=", + }, +}); + (function (angular) { appShared.component("languageSwitcher", { templateUrl: @@ -5241,58 +5293,6 @@ sharedComponents.component("googlePay", { }); })(window.angular); -sharedComponents.component("limitString", { - templateUrl: - "/mix-app/views/app-shared/components/limit-string/limit-string.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - function ($rootScope, $scope, ngAppSettings) { - var ctrl = this; - ctrl.shortenString = ""; - ctrl.previousContentId = undefined; - - this.$onInit = () => { - ctrl.previousContentId = angular.copy(ctrl.contentId); - }; - - this.$doCheck = () => { - if (ctrl.contentId !== ctrl.previousContentId) { - ctrl.loadModuleData(); - ctrl.previousContentId = ctrl.contentId; - } - }; - ctrl.shortString = function () { - var data = decodeURIComponent(ctrl.content); - if (data) { - if (ctrl.max < data.length) { - ctrl.shortenString = - data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; - } else { - ctrl.shortenString = data.replace(/[+]/g, " "); - } - } - }; - ctrl.view = function () { - var obj = { - moduleId: ctrl.moduleId, - id: ctrl.contentId, - }; - $rootScope.preview("module-data", obj, null, "modal-lg"); - }; - ctrl.translate = $rootScope.translate; - }, - ], - bindings: { - content: "=", - showData: "=", - max: "=", - moduleId: "=", - contentId: "=", - }, -}); - appShared.component("loginPopup", { templateUrl: "/mix-app/views/app-shared/components/login-popup/view.html", controller: "LoginPopupController", @@ -7095,6 +7095,31 @@ sharedComponents.component("modalPosts", { }, }); +// sharedComponents.component('modalConfirm', { +// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', +// controller: ModalConfirmController, +// bindings: { +// message: '=' +// } +// }); +function ModalConfirmController($rootScope, $scope, $mdDialog, message) { + $scope.message = message; + $scope.executeFunctionByName = async function (functionName, args, context) { + var result = await $rootScope.executeFunctionByName( + functionName, + args, + context + ); + if (result) { + $scope.$apply(); + } + $mdDialog.hide(); + }; + $scope.closeDialog = function () { + $mdDialog.hide(); + }; +} + sharedComponents.controller( "ModalCroppieController", function ( @@ -7350,31 +7375,6 @@ sharedComponents.controller( } ); -// sharedComponents.component('modalConfirm', { -// templateUrl: '/mix-app/views/app-shared/components/modal-confirm/modal-confirm.html', -// controller: ModalConfirmController, -// bindings: { -// message: '=' -// } -// }); -function ModalConfirmController($rootScope, $scope, $mdDialog, message) { - $scope.message = message; - $scope.executeFunctionByName = async function (functionName, args, context) { - var result = await $rootScope.executeFunctionByName( - functionName, - args, - context - ); - if (result) { - $scope.$apply(); - } - $mdDialog.hide(); - }; - $scope.closeDialog = function () { - $mdDialog.hide(); - }; -} - "use strict"; appShared.controller("SharedModuleDataController", [ "$scope", @@ -8238,15 +8238,6 @@ sharedComponents.component("recaptcha", { }, }); -sharedComponents.component("codeEditor", { - templateUrl: "codeEditor.html", - bindings: { - product: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - sharedComponents.component("serviceHub", { templateUrl: "/mix-app/views/app-shared/components/service-hub/view.html", bindings: { @@ -8552,6 +8543,15 @@ sharedComponents.component("snowy", { bindings: {}, }); +sharedComponents.component("codeEditor", { + templateUrl: "codeEditor.html", + bindings: { + product: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + sharedComponents.component("starRating", { templateUrl: "/mix-app/views/app-shared/components/star-rating/star-rating.html", @@ -8610,14 +8610,150 @@ sharedComponents.component("statuses", { }, }); -sharedComponents.component("mixStore", { - templateUrl: "/mix-app/views/app-shared/components/store/view.html", - bindings: { - installCallback: "&?", - }, - controller: [ - "$scope", - "$rootScope", +"use trick"; +sharedComponents.directive("paneV", function () { + return { + require: "^tabs-v", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@", class: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabsV", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/tabs-verticle/tabs.html", + replace: true, + }; +}); + +"use trick"; +sharedComponents.directive("pane", function () { + return { + require: "^tabs", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabs", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", + replace: true, + }; +}); + +"use trick"; +sharedComponents.directive("paneH", function () { + return { + require: "^tabs-h", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabsH", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: + "/mix-app/views/app-shared/components/tabs-horizontal/tabs.html", + replace: true, + }; +}); + +sharedComponents.component("mixStore", { + templateUrl: "/mix-app/views/app-shared/components/store/view.html", + bindings: { + installCallback: "&?", + }, + controller: [ + "$scope", + "$rootScope", "ngAppSettings", "CryptoService", "ThemeService", @@ -8750,142 +8886,6 @@ sharedComponents.component("mixStore", { ], }); -"use trick"; -sharedComponents.directive("paneH", function () { - return { - require: "^tabs-h", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabsH", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: - "/mix-app/views/app-shared/components/tabs-horizontal/tabs.html", - replace: true, - }; -}); - -"use trick"; -sharedComponents.directive("pane", function () { - return { - require: "^tabs", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabs", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", - replace: true, - }; -}); - -"use trick"; -sharedComponents.directive("paneV", function () { - return { - require: "^tabs-v", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@", class: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabsV", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/tabs-verticle/tabs.html", - replace: true, - }; -}); - sharedComponents.component("tags", { templateUrl: "/mix-app/views/app-shared/components/tags/tags.html", controller: [ @@ -8929,6 +8929,58 @@ sharedComponents.component("tagsView", { }, }); +sharedComponents.component("tuiEditor", { + templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", + controller: [ + "$rootScope", + "$scope", + "$element", + "ngAppSettings", + function ($rootScope, $scope, $element, ngAppSettings) { + var ctrl = this; + ctrl.previousId = null; + ctrl.editor = null; + ctrl.init = function () { + ctrl.guid = $rootScope.generateUUID(); + setTimeout(() => { + ctrl.editor = new tui.Editor({ + el: document.querySelector("#tui-" + ctrl.guid), + initialEditType: "markdown", + previewStyle: "vertical", + height: "300px", + initialValue: ctrl.content, + events: { + // change: ctrl.updateContent, + // focus: () => onFocus(), + blur: () => ctrl.updateContent(), + }, + }); + ctrl.toolbar = ctrl.editor.getUI().getToolbar(); + ctrl.toolbar.addButton( + { + name: "fullscreen", + tooltip: "fullscreen", + $el: $( + '' + ), + }, + 1 + ); + }, 100); + }; + window.fsClick = function () { + $(".tui-editor-defaultUI").toggleClass("fs"); + }; + ctrl.updateContent = function () { + ctrl.content = ctrl.editor.getMarkdown(); + }; + }, + ], + bindings: { + content: "=", + }, +}); + sharedComponents.component("trumbowyg", { templateUrl: "/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html", bindings: { @@ -9024,7 +9076,7 @@ sharedComponents.component("trumbowyg", { }, }; ctrl.getElementReference = function () { - return jQuery($element.find("div")); + return $($element.find("div")); }; ctrl.getEditorReference = function () { @@ -9033,7 +9085,6 @@ sharedComponents.component("trumbowyg", { ctrl.updateModelValue = () => { $scope.$applyAsync(() => { const value = ctrl.getEditorReference().trumbowyg("html"); - console.log(value); ctrl.ngModel.$setViewValue(value); }); }; @@ -9046,6 +9097,8 @@ sharedComponents.component("trumbowyg", { }; ctrl.initializeEditor = (element, options) => { + jQuery.trumbowyg.svgPath = + "https://cdnjs.cloudflare.com/ajax/libs/Trumbowyg/2.25.1/ui/icons.svg"; if (ctrl.removeformatPasted) { ctrl.editorConfigurations.plugins.removeformatPasted = ctrl.removeformatPasted == "true"; @@ -9070,10 +9123,8 @@ sharedComponents.component("trumbowyg", { if (changes.options && !changes.options.isFirstChange()) { element.trumbowyg("destroy"); } - - if (changes.options) { - ctrl.initializeEditor(element, angular.extend({}, ctrl.options)); - } + ctrl.options = ctrl.options || {}; + ctrl.initializeEditor(element, angular.extend({}, ctrl.options)); if (changes.ngDisabled) { element.trumbowyg(ctrl.ngDisabled ? "disable" : "enable"); @@ -9085,76 +9136,15 @@ sharedComponents.component("trumbowyg", { }; ctrl.$onInit = () => { - jQuery.trumbowyg.svgPath = - "https://cdnjs.cloudflare.com/ajax/libs/Trumbowyg/2.25.1/ui/icons.svg"; ctrl.ngModel.$render = () => { - setTimeout(() => { - const element = ctrl.getEditorReference(); - element.trumbowyg(ctrl.editorConfigurations.plugins); - element.trumbowyg("html", ctrl.ngModel.$modelValue); - element - .on("tbwchange", () => ctrl.updateModelValue()) - .on("tbwpaste", () => ctrl.updateModelValue()); - $scope.$apply(); - }, 200); + const element = ctrl.getEditorReference(); + element.trumbowyg("html", ctrl.ngModel.$modelValue); }; }; }, ], }); -sharedComponents.component("tuiEditor", { - templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", - controller: [ - "$rootScope", - "$scope", - "$element", - "ngAppSettings", - function ($rootScope, $scope, $element, ngAppSettings) { - var ctrl = this; - ctrl.previousId = null; - ctrl.editor = null; - ctrl.init = function () { - ctrl.guid = $rootScope.generateUUID(); - setTimeout(() => { - ctrl.editor = new tui.Editor({ - el: document.querySelector("#tui-" + ctrl.guid), - initialEditType: "markdown", - previewStyle: "vertical", - height: "300px", - initialValue: ctrl.content, - events: { - // change: ctrl.updateContent, - // focus: () => onFocus(), - blur: () => ctrl.updateContent(), - }, - }); - ctrl.toolbar = ctrl.editor.getUI().getToolbar(); - ctrl.toolbar.addButton( - { - name: "fullscreen", - tooltip: "fullscreen", - $el: $( - '' - ), - }, - 1 - ); - }, 100); - }; - window.fsClick = function () { - $(".tui-editor-defaultUI").toggleClass("fs"); - }; - ctrl.updateContent = function () { - ctrl.content = ctrl.editor.getMarkdown(); - }; - }, - ], - bindings: { - content: "=", - }, -}); - sharedComponents.component("uploadCroppie", { templateUrl: "/mix-app/views/app-shared/components/upload-croppie/view.html?v=1", @@ -9387,6 +9377,47 @@ sharedComponents.component("uploadCroppie", { ], }); +sharedComponents.component("youtubeEditor", { + templateUrl: + "/mix-app/views/app-shared/components/youtube-editor/youtube-editor.html", + controller: [ + "$rootScope", + "$scope", + "$sce", + function ($rootScope, $scope, $sce) { + var ctrl = this; + ctrl.isPlay = false; + ctrl.loadVideo = function () { + ctrl.isPlay = false; + ctrl.src = ""; + if (ctrl.code) { + ctrl.img = + "https://img.youtube.com/vi/" + ctrl.code + "/sddefault.jpg"; + } + }; + ctrl.playVideo = function () { + ctrl.isPlay = true; + ctrl.src = $sce.trustAsResourceUrl( + "https://www.youtube.com/embed/" + + ctrl.code + + "?rel=0&showinfo=0&autoplay=1" + ); + }; + ctrl.searchVideo = function () { + // search + $rootScope.preview( + "message", + "ToDo: Integrate youtube search (https://developers.google.com/youtube/v3/docs/search/list) \r\n PATH: portal-app/app/app-shared/components/youtube-editor/youtube-editor.js" + ); + }; + }, + ], + bindings: { + code: "=", + hideInput: "=?", + }, +}); + "use strict"; appShared.controller("VideoCallController", [ "$scope", @@ -9720,47 +9751,6 @@ sharedComponents.component("videoCall", { }, }); -sharedComponents.component("youtubeEditor", { - templateUrl: - "/mix-app/views/app-shared/components/youtube-editor/youtube-editor.html", - controller: [ - "$rootScope", - "$scope", - "$sce", - function ($rootScope, $scope, $sce) { - var ctrl = this; - ctrl.isPlay = false; - ctrl.loadVideo = function () { - ctrl.isPlay = false; - ctrl.src = ""; - if (ctrl.code) { - ctrl.img = - "https://img.youtube.com/vi/" + ctrl.code + "/sddefault.jpg"; - } - }; - ctrl.playVideo = function () { - ctrl.isPlay = true; - ctrl.src = $sce.trustAsResourceUrl( - "https://www.youtube.com/embed/" + - ctrl.code + - "?rel=0&showinfo=0&autoplay=1" - ); - }; - ctrl.searchVideo = function () { - // search - $rootScope.preview( - "message", - "ToDo: Integrate youtube search (https://developers.google.com/youtube/v3/docs/search/list) \r\n PATH: portal-app/app/app-shared/components/youtube-editor/youtube-editor.js" - ); - }; - }, - ], - bindings: { - code: "=", - hideInput: "=?", - }, -}); - /*! * angular-loading-bar v0.9.0 * https://chieffancypants.github.io/angular-loading-bar diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html index 7b646f0e3..bea68b75e 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html @@ -1 +1 @@ -
    ({{$ctrl.mixDatabaseDataValue.dataType}})

    \ No newline at end of file +
    ({{$ctrl.mixDatabaseDataValue.dataType}})

    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-value-editor/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-value-editor/view.html index 22390e1a3..c8b7fda9e 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-value-editor/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/mix-value-editor/view.html @@ -1 +1 @@ -

    \ No newline at end of file +

    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/module/components/main/main.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/module/components/main/main.html index 6f67e6eff..15b67161c 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/module/components/main/main.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/module/components/main/main.html @@ -1 +1 @@ -
    This system name is using within the template code.
    \ No newline at end of file +
    This system name is using within the template code.
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/page/components/main/main.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/page/components/main/main.html index 66838da2a..b7aa906dd 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/page/components/main/main.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/page/components/main/main.html @@ -1,2 +1,2 @@
    \ No newline at end of file +{{$ctrl.page.excerpt}}
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html index cab6faba9..0543b194c 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html @@ -1 +1 @@ -
    Loading...
    {{$ctrl.translate($ctrl.column.name)}}: {{$ctrl.translate($ctrl.column.dataType)}}
    \ No newline at end of file +
    Loading...
    {{$ctrl.translate($ctrl.column.name)}}: {{$ctrl.translate($ctrl.column.dataType)}}
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form-editor/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form-editor/view.html index 433f5e98e..ef5c21dc9 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form-editor/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/module-form-editor/view.html @@ -1 +1 @@ -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html index a7e050922..e837b972e 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html @@ -1,4 +1,4 @@
    \ No newline at end of file + }
    \ No newline at end of file From f21c234cb178e5a5fa1439fb3a4d7ddf6d2bca84 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Wed, 1 Sep 2021 20:53:46 +0700 Subject: [PATCH 15/83] Export Site Permissions --- .../ViewModels/SiteStructureViewModel.cs | 69 +- .../wwwroot/mix-app/css/app-client.min.css | 2 +- .../mix-app/css/app-vendor-scss.min.css | 2 +- .../wwwroot/mix-app/css/app-vendor.min.css | 8 +- .../wwwroot/mix-app/js/app-portal.min.js | 2837 +++++++++-------- .../views/app-portal/pages/theme/export.html | 2 +- 6 files changed, 1494 insertions(+), 1426 deletions(-) diff --git a/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs b/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs index fb06c0ea2..1fcdfa50c 100644 --- a/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs @@ -24,6 +24,9 @@ public class SiteStructureViewModel [JsonProperty("isIncludeConfigurations")] public bool IsIncludeConfigurations { get; set; } = true; + [JsonProperty("isIncludePermissions")] + public bool IsIncludePermissions { get; set; } = true; + [JsonProperty("createdBy")] public string CreatedBy { get; set; } @@ -45,6 +48,9 @@ public class SiteStructureViewModel [JsonProperty("configurations")] public List Configurations { get; set; } = new List(); + [JsonProperty("permissions")] + public List Permissions { get; set; } = new(); + [JsonProperty("languages")] public List Languages { get; set; } = new List(); @@ -100,6 +106,11 @@ public RepositoryResponse ExportSelectedItemsAsync() m => m.Specificulture == Specificulture, context, transaction).Data; } + if (IsIncludePermissions) + { + Permissions = MixPortalPages.UpdateViewModel.Repository.GetModelList(context, transaction).Data; + } + ExportPages(context, transaction); ExportModules(context, transaction); ExportMixDatabasesAsync(context, transaction); @@ -340,6 +351,7 @@ private void ExportRelatedDatas(MixCmsContext context, IDbContextTransaction tra private Dictionary dicConfigurationIds = new Dictionary(); private Dictionary dicLanguageIds = new Dictionary(); + private Dictionary dicPermissionIds = new Dictionary(); private Dictionary dicModuleIds = new Dictionary(); private Dictionary dicPostIds = new Dictionary(); private Dictionary dicPageIds = new Dictionary(); @@ -369,6 +381,10 @@ public async Task> ImportAsync( { result = await ImportLanguagesAsync(destCulture, context, transaction); } + if (result.IsSucceed && Permissions != null && Permissions.Count > 0) + { + result = await ImportPermissionsAsync(context, transaction); + } if (result.IsSucceed && Pages != null && Pages.Count > 0) { result = await ImportPagesAsync(destCulture, context, transaction); @@ -398,7 +414,7 @@ public async Task> ImportAsync( { result = await ImportRelatedDatas(destCulture, context, transaction); } - + UnitOfWorkHelper.HandleTransaction(result.IsSucceed, isRoot, transaction); } @@ -692,6 +708,57 @@ private async Task> ImportLanguagesAsync(string destCul return result; } + private async Task> ImportPermissionsAsync(MixCmsContext _context = null, IDbContextTransaction _transaction = null) + { + var result = new RepositoryResponse() { IsSucceed = true }; + + UnitOfWorkHelper.InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); + try + { + int startId = MixPortalPages.UpdateViewModel.ModelRepository.Max(m => m.Id, context, transaction).Data; + foreach (var item in Permissions) + { + var oldId = item.Id; + item.CreatedBy = CreatedBy; + startId++; + item.Id = startId; + + item.CreatedDateTime = DateTime.UtcNow; + + var saveResult = await item.SaveModelAsync(false, context, transaction); + if (!saveResult.IsSucceed) + { + result.IsSucceed = false; + result.Exception = saveResult.Exception; + result.Errors = saveResult.Errors; + break; + } + + if (!dicPermissionIds.Any(m => m.Key == item.Id)) + { + dicPermissionIds.Add(oldId, startId); + } + } + UnitOfWorkHelper.HandleTransaction(result.IsSucceed, isRoot, transaction); + } + catch (Exception ex) // TODO: Add more specific exeption types instead of Exception only + { + var error = UnitOfWorkHelper.HandleException(ex, isRoot, transaction); + result.IsSucceed = false; + result.Errors = error.Errors; + result.Exception = error.Exception; + } + finally + { + //if current Context is Root + if (isRoot) + { + UnitOfWorkHelper.CloseDbContext(ref context, ref transaction); + } + } + return result; + } + private async Task> ImportPagesAsync(string destCulture, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css index 479d90b00..5ee15e850 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css +++ b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-client.min.css @@ -1 +1 @@ -/* Tue Aug 31 2021 16:58:21 GMT+0700 (Indochina Time) */.haiyen-loader,.video{width:100%;height:100%}#modal-shopping-cart .modal-title{margin-top:0}#modal-shopping-cart .cart-item{margin:10px 0}#modal-shopping-cart .modal-dialog{max-width:unset;margin:20px}#modal-shopping-cart{color:#5c4b43;z-index:1060}#modal-shopping-cart .modal-footer button{margin:0 10px}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative;overflow:hidden}.user .username{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.haiyen-loader{position:fixed;left:0;top:0;z-index:999999;background:rgba(255,255,255,.78)}.haiyen-loader .spinner{width:55px;height:70px;position:absolute;top:50%;left:50%;margin-top:-70px;margin-left:-65px}.haiyen-loader .spinner>div{background-color:red;height:100%;width:6px;margin-right:5px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.haiyen-loader .spinner .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.haiyen-loader .spinner .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.haiyen-loader .spinner .rect4{-webkit-animation-delay:-.9s;animation-delay:-.9s}.haiyen-loader .spinner .rect5{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-stretchdelay{0%,100%,40%{-webkit-transform:scaleY(.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,100%,40%{transform:scaleY(.4);-webkit-transform:scaleY(.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.package-wrapper h2{margin-top:20px}.tbl-package span{margin-left:0;font-size:inherit}.tbl-package .sum-th{background-color:#fff}.tbl-package .sum-th span{color:#333}.tbl-package td,.tbl-package th{height:21px;padding:2px 14px;font-size:20px}.tbl-package-slot th{height:0;padding:0 14px;font-size:20px}.tbl-package td{height:21px;text-align:center}.tbl-package .no-border-top{border-top:none}.tbl-package .no-border-bottom{border-bottom:none}.btn-minus,.btn-plus{width:50px;height:20px;font-weight:700;font-size:1em;line-height:10px;border:1px solid #fff;border-radius:15px;color:#fff;margin-right:5px}.btn-dark,.btn-minus-dark{border:1px solid #333}.btn-minus-dark,.btn-plus{color:#333;background-color:#fff}.btn-dark{color:#fff;background-color:#333}.tbl-package-mobile{font-size:medium}.tbl-package-mobile td,.tbl-package-mobile th{height:21px;padding:5px;font-size:medium}.tbl-package-mobile th{height:0}.tbl-package-mobile .btn-minus,.tbl-package-mobile .btn-plus{width:40px;height:16px;font-weight:700;font-size:1em;line-height:5px}.tbl-final{width:100%}.tbl-final .gift-title{padding:5px 10px;background-color:#ddd;color:#000}.tbl-final .gift-quantity{padding:5px 10px;background-color:#000;color:#fff} \ No newline at end of file +/* Tue Aug 31 2021 17:27:26 GMT+0700 (Indochina Time) */.haiyen-loader,.video{width:100%;height:100%}#modal-shopping-cart .modal-title{margin-top:0}#modal-shopping-cart .cart-item{margin:10px 0}#modal-shopping-cart .modal-dialog{max-width:unset;margin:20px}#modal-shopping-cart{color:#5c4b43;z-index:1060}#modal-shopping-cart .modal-footer button{margin:0 10px}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}@-moz-keyframes rotation{from{-moz-transform:rotate(0);-moz-transform-origin:85% 90%}to{-moz-transform:rotate(359deg);-moz-transform-origin:85% 90%}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0);-webkit-transform-origin:85% 90%}to{-webkit-transform:rotate(359deg);-webkit-transform-origin:85% 90%}}[class*=" icon-"].loading-indicator{float:left;display:none;font-size:24px;margin:7px;color:#ec173a}[class*=" icon-"].loading-indicator.on{display:block;-webkit-animation:rotation 1.5s infinite linear;-moz-animation:rotation 1.5s infinite linear}.browser-warning,.user .icon-phone-4{display:none}.user-list{padding:9px 0}.user:hover .icon-phone-4{display:inline-block}.user a{position:relative;overflow:hidden}.user .username{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;padding-right:16px}.user .helper{position:absolute;right:10px;top:5px}.actions{display:none}[data-mode=incall] .actions,[data-mode=calling] .actions{display:block}.actions .hangup{width:100%}.actions .status{text-align:center;margin-bottom:20px}.video{border:2px solid #000}.cool-background{background:linear-gradient(135deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(225deg,#eceddc 25%,transparent 25%) -50px 0,linear-gradient(315deg,#eceddc 25%,transparent 25%),linear-gradient(45deg,#eceddc 25%,transparent 25%);background-size:100px 100px;background-color:#ec173a}.alertify-cover{background:rgba(0,0,0,.8)}.haiyen-loader{position:fixed;left:0;top:0;z-index:999999;background:rgba(255,255,255,.78)}.haiyen-loader .spinner{width:55px;height:70px;position:absolute;top:50%;left:50%;margin-top:-70px;margin-left:-65px}.haiyen-loader .spinner>div{background-color:red;height:100%;width:6px;margin-right:5px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.haiyen-loader .spinner .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.haiyen-loader .spinner .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.haiyen-loader .spinner .rect4{-webkit-animation-delay:-.9s;animation-delay:-.9s}.haiyen-loader .spinner .rect5{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-stretchdelay{0%,100%,40%{-webkit-transform:scaleY(.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,100%,40%{transform:scaleY(.4);-webkit-transform:scaleY(.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.package-wrapper h2{margin-top:20px}.tbl-package span{margin-left:0;font-size:inherit}.tbl-package .sum-th{background-color:#fff}.tbl-package .sum-th span{color:#333}.tbl-package td,.tbl-package th{height:21px;padding:2px 14px;font-size:20px}.tbl-package-slot th{height:0;padding:0 14px;font-size:20px}.tbl-package td{height:21px;text-align:center}.tbl-package .no-border-top{border-top:none}.tbl-package .no-border-bottom{border-bottom:none}.btn-minus,.btn-plus{width:50px;height:20px;font-weight:700;font-size:1em;line-height:10px;border:1px solid #fff;border-radius:15px;color:#fff;margin-right:5px}.btn-dark,.btn-minus-dark{border:1px solid #333}.btn-minus-dark,.btn-plus{color:#333;background-color:#fff}.btn-dark{color:#fff;background-color:#333}.tbl-package-mobile{font-size:medium}.tbl-package-mobile td,.tbl-package-mobile th{height:21px;padding:5px;font-size:medium}.tbl-package-mobile th{height:0}.tbl-package-mobile .btn-minus,.tbl-package-mobile .btn-plus{width:40px;height:16px;font-weight:700;font-size:1em;line-height:5px}.tbl-final{width:100%}.tbl-final .gift-title{padding:5px 10px;background-color:#ddd;color:#000}.tbl-final .gift-quantity{padding:5px 10px;background-color:#000;color:#fff} \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css index c4af66949..e7666c8b6 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css +++ b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor-scss.min.css @@ -1,4 +1,4 @@ -/* Tue Aug 31 2021 16:58:07 GMT+0700 (Indochina Time) */fb-login { +/* Tue Aug 31 2021 17:27:10 GMT+0700 (Indochina Time) */fb-login { background-color: aqua; } medias .modal { diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css index c500cfee2..9950fbf15 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css +++ b/src/Mix.Cms.Web/wwwroot/mix-app/css/app-vendor.min.css @@ -1,10 +1,10 @@ -/* Tue Aug 31 2021 16:58:07 GMT+0700 (Indochina Time) */@charset "UTF-8";.tui-editor-contents .task-list-item:before,.tui-editor-contents ol li.task-list-item:before,.tui-editor-contents pre ul li:before,.tui-editor-contents ul li.task-list-item:before,.youtube .play-button:before{content:""}#return-to-top,tags-input .tags .tag-item .remove-button:hover{text-decoration:none}#return-to-top{position:fixed;bottom:20px;right:20px;background:#000;background:rgba(0,0,0,.7);width:50px;height:50px;-webkit-border-radius:35px;-moz-border-radius:35px;border-radius:35px;display:none;-webkit-transition:all .3s linear;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease;z-index:9}#return-to-top:hover{background:rgba(0,0,0,.9)}#return-to-top i{color:#fff;margin:0;position:relative;left:4px;top:0;font-size:30px;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}#return-to-top:hover i{color:#fff;top:5px}@media (min-width:992px){.language-switcher{display:inline;position:absolute;right:150px;bottom:15px}.language-switcher.portal{bottom:0}.language-switcher .dropdown-menu{right:0}}@media screen and (max-width:991px){.language-switcher{display:inline;position:absolute;left:20px}.language-switcher .dropdown-menu{left:0}}.language-switcher .dropdown-menu{width:250px;overflow:hidden!important}.navbar-collapse .dropdown-menu .dropdown-item{color:#444}.dialogdemoThemeInheritance .container{text-align:center}.data-table .header{padding:10px;font-weight:700;background:#d3d3d3}.mix-loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#21252987;opacity:.97;z-index:9999;display:flex;justify-content:center;align-items:center}.mix-loader-container .spinner{margin:100px auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-rotate 2s infinite linear;animation:sk-rotate 2s infinite linear}.mix-loader-container .dot1,.mix-loader-container .dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#fff;border-radius:100%;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.mix-loader-container .dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-rotate{100%{-webkit-transform:rotate(360deg)}}@keyframes sk-rotate{100%{transform:rotate(360deg);-webkit-transform:rotate(360deg)}}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.lds-ellipsis{display:inline-block;position:relative;width:80px;height:80px}.lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}@keyframes lds-ellipsis1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}#dlg-preview-popup .modal-body .img{max-width:100%;display:block;margin:0 auto}quill-editor .ql-container{min-height:300px;overflow:auto}quill-editor .ql-toolbar{position:sticky!important;top:3.9rem;z-index:12;background-color:#fff}.snowflake{display:block;position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:-webkit-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-moz-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-ms-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%)}#snow{position:fixed;width:100%;height:100%}.star-rating{margin:0;padding:0;display:inline-block}.star-rating .star{padding:1px;color:#ddd;font-size:12px;text-shadow:.05em .05em #aaa;list-style-type:none;display:inline-block;cursor:pointer}.star-rating .star.filled{color:#fd0}.star-rating.readonly .star.filled{color:#666}.youtube{background-color:#000;margin-bottom:30px;position:relative;padding-top:56.25%;overflow:hidden;cursor:pointer}.youtube img{width:100%;top:-16.82%;left:0;opacity:.7}.youtube .play-button{width:90px;height:60px;background-color:#333;box-shadow:0 0 30px rgba(0,0,0,.6);z-index:1;opacity:.8;border-radius:6px}.now-ui-icons.circle,tags-input[disabled] .tags,tags-input[disabled] .tags .input{background-color:#eee}.youtube .play-button:before{border-style:solid;border-width:15px 0 15px 26px;border-color:transparent transparent transparent #fff}.youtube .play-button,.youtube img{cursor:pointer}.youtube .play-button,.youtube .play-button:before,.youtube iframe,.youtube img{position:absolute}.youtube .play-button,.youtube .play-button:before{top:50%;left:50%;transform:translate3d(-50%,-50%,0)}.youtube iframe{height:100%;width:100%;top:0;left:0}tags-input{box-shadow:none;border:none;padding:0;min-height:34px}tags-input .tags{border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}tags-input .tags .tag-item{color:#000}tags-input .tags .tag-item.selected{color:#fff;border:1px solid #d43f3a}tags-input .tags.focused{border:1px solid #66afe9}tags-input .autocomplete{border-radius:4px}tags-input.ng-invalid .tags{border-color:#843534}.input-group tags-input{padding:0;display:table-cell}.input-group tags-input:not(:first-child) .tags{border-top-left-radius:0;border-bottom-left-radius:0}.input-group tags-input:not(:last-child) .tags{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-lg tags-input:first-child .tags{border-top-left-radius:6px;border-bottom-left-radius:6px}.input-group-lg tags-input:last-child .tags{border-top-right-radius:6px;border-bottom-right-radius:6px}.input-group-sm tags-input:first-child .tags{border-top-left-radius:3px;border-bottom-left-radius:3px}.input-group-sm tags-input:last-child .tags{border-top-right-radius:3px;border-bottom-right-radius:3px}.input-group-lg tags-input,tags-input.ti-input-lg{min-height:46px}.input-group-lg tags-input .tags,tags-input.ti-input-lg .tags{border-radius:6px}.input-group-lg tags-input .tags .tag-item,tags-input.ti-input-lg .tags .tag-item{height:38px;line-height:37px;font-size:18px;border-radius:6px}.input-group-lg tags-input .tags .tag-item .remove-button,tags-input.ti-input-lg .tags .tag-item .remove-button{font-size:20px}.input-group-lg tags-input .tags .input,tags-input.ti-input-lg .tags .input{height:38px;font-size:18px}.input-group-sm tags-input,tags-input.ti-input-sm{min-height:30px}.input-group-sm tags-input .tags,tags-input.ti-input-sm .tags{border-radius:3px}.input-group-sm tags-input .tags .tag-item,tags-input.ti-input-sm .tags .tag-item{height:22px;line-height:21px;font-size:12px;border-radius:3px}.input-group-sm tags-input .tags .tag-item .remove-button,tags-input.ti-input-sm .tags .tag-item .remove-button{font-size:16px}.input-group-sm tags-input .tags .input,tags-input.ti-input-sm .tags .input{height:22px;font-size:12px}.has-feedback tags-input .tags{padding-right:30px}.has-success tags-input .tags{border-color:#3c763d}.has-success tags-input .tags.focused{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-error tags-input .tags{border-color:#a94442}.has-error tags-input .tags.focused{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-warning tags-input .tags{border-color:#8a6d3b}.has-warning tags-input .tags.focused{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{margin:5px 0;position:relative;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;background:-webkit-linear-gradient(top,#f0f9ff 0,#cbebff 47%,#a1dbff 100%);background:linear-gradient(to bottom,#f0f9ff 0,#cbebff 47%,#a1dbff 100%)}tags-input .tags .tag-item.selected{background:-webkit-linear-gradient(top,#febbbb 0,#fe9090 45%,#ff5c5c 100%);background:linear-gradient(to bottom,#febbbb 0,#fe9090 45%,#ff5c5c 100%)}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}.CodeMirror-gutter-elt,tags-input[disabled] .tags,tags-input[disabled] .tags .input,tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}.portal-menus .handle{cursor:move}body,html{height:100%}.btn,.btn-link{cursor:pointer}.display-4{font-size:2rem!important}div[dnd-list],ul[dnd-list]{min-height:42px;padding-left:0}div[dnd-list] .dndDraggingSource,ul[dnd-list] .dndDraggingSource{display:none}div[dnd-list] .dndPlaceholder,ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}div[dnd-list] .dnd-item,ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}div[dnd-list] .dnd-item.selected,ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}.custom-file-img{max-width:100%}.md-avatar{vertical-align:middle;width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important;margin-left:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}#modal-posts img,medias #modal-files .modal-body .table img{height:30px}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}.content{width:100%;display:flex;align-items:center;flex-direction:column;background:0 0}.flag-icon,.flag-icon-background{background-size:contain;background-position:50%}fb-login{background-color:#0ff}medias .modal{z-index:1049}medias #modal-files .modal-body .table img.preview{height:auto}mix-column-preview .row{max-height:120px;margin:10px 0;overflow:hidden}mix-module-data-table .data-table .header{padding:5px;color:#495057;background-color:hsla(var(--primary-color-hue,211),100%,50%,.075);border-color:#dee2e6;font-weight:400;font-size:small}mix-module-data-table .preview-container{max-height:4em;overflow:hidden}upload-croppie .cr-boundary{overflow:hidden}main-side-bar-dynamic .sw-sidebar .sw-toc-item{position:relative}main-side-bar-dynamic .sw-sidebar .sw-toc-item .sw-toc-link .sw-toc-link{padding-left:0}main-side-bar-dynamic .sw-sidebar .sw-toc-item .btn-group{right:20px;opacity:1}main-side-bar-dynamic .sw-sidebar ul{padding-left:15px}main-side-bar-dynamic .sw-sidebar .sw-toc-sub-link .btn-group{padding:2px 0}.custom-image{max-width:30vw}.attr-set-value-item:last-child{border-bottom:0!important}@media (min-width:992px){#modal-content-filter .modal-lg,#modal-content-filter .modal-xl{max-width:80vw}}.table-data td.preview{max-width:120px;overflow:hidden}.img-container>img,.img-preview>img{max-width:100%}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem;overflow:hidden}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor{color:#000}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}.bootstrap-tagsinput,.cm-tab,.cr-rotate-controls i:before,.flag-icon,.now-ui-icons{display:inline-block}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;border-radius:50%}.fa-ul,.nc-icon-ul{padding-left:0;list-style-type:none}.nc-icon-ul{margin-left:2.14285714em}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.flag-icon-background{background-repeat:no-repeat}.flag-icon{background-repeat:no-repeat;position:relative;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{font-style:normal;font-weight:900;font-size:22px}.cm-em,.hljs-comment,.hljs-emphasis,.hljs-quote,.tui-editor-contents address,.tui-editor-contents cite,.tui-editor-contents dfn,.tui-editor-contents em,.tui-editor-contents i,.tui-editor-contents var{font-style:italic}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;vertical-align:middle;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! +/* Tue Aug 31 2021 17:27:10 GMT+0700 (Indochina Time) */@charset "UTF-8";.tui-editor-contents .task-list-item:before,.tui-editor-contents ol li.task-list-item:before,.tui-editor-contents pre ul li:before,.tui-editor-contents ul li.task-list-item:before,.youtube .play-button:before{content:""}#return-to-top{position:fixed;bottom:20px;right:20px;background:#000;background:rgba(0,0,0,.7);width:50px;height:50px;text-decoration:none;-webkit-border-radius:35px;-moz-border-radius:35px;border-radius:35px;display:none;-webkit-transition:all .3s linear;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease;z-index:9}#return-to-top:hover{background:rgba(0,0,0,.9)}#return-to-top i{color:#fff;margin:0;position:relative;left:4px;top:0;font-size:30px;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}#return-to-top:hover i{color:#fff;top:5px}@media (min-width:992px){.language-switcher{display:inline;position:absolute;right:150px;bottom:15px}.language-switcher.portal{bottom:0}.language-switcher .dropdown-menu{right:0}}@media screen and (max-width:991px){.language-switcher{display:inline;position:absolute;left:20px}.language-switcher .dropdown-menu{left:0}}.language-switcher .dropdown-menu{width:250px;overflow:hidden!important}.navbar-collapse .dropdown-menu .dropdown-item{color:#444}.dialogdemoThemeInheritance .container{text-align:center}.data-table .header{padding:10px;font-weight:700;background:#d3d3d3}.mix-loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#21252987;opacity:.97;z-index:9999;display:flex;justify-content:center;align-items:center}.mix-loader-container .spinner{margin:100px auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-rotate 2s infinite linear;animation:sk-rotate 2s infinite linear}.mix-loader-container .dot1,.mix-loader-container .dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#fff;border-radius:100%;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.mix-loader-container .dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-rotate{100%{-webkit-transform:rotate(360deg)}}@keyframes sk-rotate{100%{transform:rotate(360deg);-webkit-transform:rotate(360deg)}}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.lds-ellipsis{display:inline-block;position:relative;width:80px;height:80px}.lds-ellipsis div{position:absolute;top:33px;width:13px;height:13px;border-radius:50%;background:#fff;animation-timing-function:cubic-bezier(0,1,1,0)}.lds-ellipsis div:nth-child(1){left:8px;animation:lds-ellipsis1 .6s infinite}.lds-ellipsis div:nth-child(2){left:8px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(3){left:32px;animation:lds-ellipsis2 .6s infinite}.lds-ellipsis div:nth-child(4){left:56px;animation:lds-ellipsis3 .6s infinite}@keyframes lds-ellipsis1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes lds-ellipsis3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes lds-ellipsis2{0%{transform:translate(0,0)}100%{transform:translate(24px,0)}}#dlg-preview-popup .modal-body .img{max-width:100%;display:block;margin:0 auto}quill-editor .ql-container{min-height:300px;overflow:auto}quill-editor .ql-toolbar{position:sticky!important;top:3.9rem;z-index:12;background-color:#fff}.snowflake{display:block;position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-user-select:none;-moz-user-select:none;user-select:none;background-image:-webkit-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-moz-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:-ms-radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%);background-image:radial-gradient(center,circle farthest-corner,rgba(255,255,255,1) 40%,rgba(255,255,255,0) 100%)}#snow{position:fixed;width:100%;height:100%}.star-rating{margin:0;padding:0;display:inline-block}.star-rating .star{padding:1px;color:#ddd;font-size:12px;text-shadow:.05em .05em #aaa;list-style-type:none;display:inline-block;cursor:pointer}.star-rating .star.filled{color:#fd0}.star-rating.readonly .star.filled{color:#666}.youtube{background-color:#000;margin-bottom:30px;position:relative;padding-top:56.25%;overflow:hidden;cursor:pointer}.youtube img{width:100%;top:-16.82%;left:0;opacity:.7}.youtube .play-button{width:90px;height:60px;background-color:#333;box-shadow:0 0 30px rgba(0,0,0,.6);z-index:1;opacity:.8;border-radius:6px}.now-ui-icons.circle,tags-input[disabled] .tags,tags-input[disabled] .tags .input{background-color:#eee}.youtube .play-button:before{border-style:solid;border-width:15px 0 15px 26px;border-color:transparent transparent transparent #fff}.youtube .play-button,.youtube img{cursor:pointer}.youtube .play-button,.youtube .play-button:before,.youtube iframe,.youtube img{position:absolute}.youtube .play-button,.youtube .play-button:before{top:50%;left:50%;transform:translate3d(-50%,-50%,0)}.youtube iframe{height:100%;width:100%;top:0;left:0}tags-input{box-shadow:none;border:none;padding:0;min-height:34px}tags-input .tags{border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}tags-input .tags .tag-item{color:#000}tags-input .tags .tag-item.selected{color:#fff;border:1px solid #d43f3a}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags.focused{border:1px solid #66afe9}tags-input .autocomplete{border-radius:4px}tags-input.ng-invalid .tags{border-color:#843534}.input-group tags-input{padding:0;display:table-cell}.input-group tags-input:not(:first-child) .tags{border-top-left-radius:0;border-bottom-left-radius:0}.input-group tags-input:not(:last-child) .tags{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-lg tags-input:first-child .tags{border-top-left-radius:6px;border-bottom-left-radius:6px}.input-group-lg tags-input:last-child .tags{border-top-right-radius:6px;border-bottom-right-radius:6px}.input-group-sm tags-input:first-child .tags{border-top-left-radius:3px;border-bottom-left-radius:3px}.input-group-sm tags-input:last-child .tags{border-top-right-radius:3px;border-bottom-right-radius:3px}.input-group-lg tags-input,tags-input.ti-input-lg{min-height:46px}.input-group-lg tags-input .tags,tags-input.ti-input-lg .tags{border-radius:6px}.input-group-lg tags-input .tags .tag-item,tags-input.ti-input-lg .tags .tag-item{height:38px;line-height:37px;font-size:18px;border-radius:6px}.input-group-lg tags-input .tags .tag-item .remove-button,tags-input.ti-input-lg .tags .tag-item .remove-button{font-size:20px}.input-group-lg tags-input .tags .input,tags-input.ti-input-lg .tags .input{height:38px;font-size:18px}.input-group-sm tags-input,tags-input.ti-input-sm{min-height:30px}.input-group-sm tags-input .tags,tags-input.ti-input-sm .tags{border-radius:3px}.input-group-sm tags-input .tags .tag-item,tags-input.ti-input-sm .tags .tag-item{height:22px;line-height:21px;font-size:12px;border-radius:3px}.input-group-sm tags-input .tags .tag-item .remove-button,tags-input.ti-input-sm .tags .tag-item .remove-button{font-size:16px}.input-group-sm tags-input .tags .input,tags-input.ti-input-sm .tags .input{height:22px;font-size:12px}.has-feedback tags-input .tags{padding-right:30px}.has-success tags-input .tags{border-color:#3c763d}.has-success tags-input .tags.focused{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-error tags-input .tags{border-color:#a94442}.has-error tags-input .tags.focused{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-warning tags-input .tags{border-color:#8a6d3b}.has-warning tags-input .tags.focused{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{margin:5px 0;position:relative;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;background:-webkit-linear-gradient(top,#f0f9ff 0,#cbebff 47%,#a1dbff 100%);background:linear-gradient(to bottom,#f0f9ff 0,#cbebff 47%,#a1dbff 100%)}tags-input .tags .tag-item.selected{background:-webkit-linear-gradient(top,#febbbb 0,#fe9090 45%,#ff5c5c 100%);background:linear-gradient(to bottom,#febbbb 0,#fe9090 45%,#ff5c5c 100%)}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input[disabled] .tags,tags-input[disabled] .tags .input,tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input .tags .input.invalid-tag,tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0 0 0 5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input[disabled] .host:focus{outline:0}tags-input[disabled] .tags .tag-item{opacity:.65;background:-webkit-linear-gradient(top,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%);background:linear-gradient(to bottom,#f0f9ff 0,rgba(203,235,255,.75) 47%,rgba(161,219,255,.62) 100%)}tags-input[disabled] .tags .tag-item .remove-button:active{color:#585858}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.portal-menus .handle,.trumbowyg-editor img{cursor:move}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal 700 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}.portal-menus ul[dnd-list],.portal-menus ul[dnd-list]>li{position:relative}.portal-menus ul[dnd-list]{min-height:42px;padding-left:0}.portal-menus ul[dnd-list] .dndDraggingSource{display:none}.portal-menus ul[dnd-list] .dndPlaceholder{display:block;background-color:#ddd;padding:10px 15px;min-height:42px}.portal-menus ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;margin-bottom:-1px;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.portal-menus ul[dnd-list] li dnd-nodrag{display:block;padding:10px 15px}body,html{height:100%}.btn,.btn-link{cursor:pointer}.display-4{font-size:2rem!important}div[dnd-list],ul[dnd-list]{min-height:42px;padding-left:0}div[dnd-list] .dndDraggingSource,ul[dnd-list] .dndDraggingSource{display:none}div[dnd-list] .dndPlaceholder,ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}div[dnd-list] .dnd-item,ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}div[dnd-list] .dnd-item.selected,ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}#trumbowyg-icons,#trumbowyg-icons svg{height:0;width:0}#trumbowyg-icons{overflow:hidden;visibility:hidden}.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%;fill:#222}.trumbowyg-box,.trumbowyg-editor{display:block;position:relative;border:1px solid #DDD;width:100%;min-height:300px}.trumbowyg-box .trumbowyg-editor{margin:0 auto}.trumbowyg-box.trumbowyg-fullscreen{background:#FEFEFE;border:none!important}.trumbowyg-editor,.trumbowyg-textarea{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:20px;min-height:300px;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.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-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:Inconsolata,Consolas,Courier,"Courier New",sans-serif;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;margin-bottom:1px}.trumbowyg-box.trumbowyg-editor-hidden .trumbowyg-editor{display:none}.trumbowyg-box.trumbowyg-disabled .trumbowyg-textarea{opacity:.8;background:0 0}.trumbowyg-editor[contenteditable=true]:empty:not(:focus)::before{content:attr(placeholder);color:#999;pointer-events:none;white-space:break-spaces}.trumbowyg-button-pane{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;z-index:11}.trumbowyg-button-pane::after{content:" ";display:block;position:absolute;top:36px;left:0;right:0;width:100%;height:1px;background:#d7e0e2}.trumbowyg-button-pane .trumbowyg-button-group{display:inline-block}.trumbowyg-button-pane .trumbowyg-button-group .trumbowyg-fullscreen-button svg{color:transparent}.trumbowyg-button-pane .trumbowyg-button-group::after{content:" ";display:inline-block;width:1px;background:#d7e0e2;margin:0 5px;height:35px;vertical-align:top}.bootstrap-tagsinput,.fa-stack,.md-avatar,.mi-stack,.trumbowyg-button-pane button{vertical-align:middle}.trumbowyg-button-pane .trumbowyg-button-group:last-child::after{content:none}.trumbowyg-button-pane button{display:inline-block;position:relative;width:35px;height:35px;padding:1px 6px!important;margin-bottom:1px;overflow:hidden;border:none;cursor:pointer;background:0 0;-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:25px;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{float:right}.trumbowyg-dropdown{max-width:300px;max-height:250px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;border:1px solid #ecf0f1;padding:5px 0;border-top:none;background:#FFF;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:#333!important;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;-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 #EEE;color:#333;background:#fbfcfc}.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}.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:#95a5a6 solid 1px}.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:#e74c3c solid 1px}.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,.trumbowyg-fullscreen.trumbowyg-box{border:none}.trumbowyg-fullscreen .trumbowyg-editor,.trumbowyg-fullscreen .trumbowyg-textarea{height:calc(100% - 37px)!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 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}.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 0 15px!important;line-height:1.4em!important;font-family:"Trebuchet MS",Helvetica,Verdana,sans-serif!important;font-size:14px!important;border:none}.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}.trumbowyg-editor.trumbowyg-reset-css ul{list-style:disc}.trumbowyg-editor.trumbowyg-reset-css ol{list-style:decimal}.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;margin:2px!important;padding:0 0 0 24px!important}.trumbowyg-editor.trumbowyg-reset-css hr{display:block;height:1px;border:none;border-top:1px solid #CCC}.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;background:0 0;margin:0!important;padding:0!important;font-weight:700}.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:#111;color:#ddd}.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:#ecf0f1;color:#ecf0f1}.trumbowyg-dark .trumbowyg-button-pane{background-color:#222;border-bottom-color:#343434}.trumbowyg-dark .trumbowyg-button-pane::after{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:#222;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!important}.trumbowyg-dark .trumbowyg-dropdown button:focus,.trumbowyg-dark .trumbowyg-dropdown button:hover{background:#222}.trumbowyg-dark .trumbowyg-modal-box{background-color:#222}.trumbowyg-dark .trumbowyg-modal-box .trumbowyg-modal-title{border-bottom:1px solid #555;color:#fff;background:#3c3c3c}.trumbowyg-dark .trumbowyg-modal-box label{display:block;position:relative;margin:15px 12px;height:27px;line-height:27px;overflow:hidden}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span{color:#eee;background-color:#2f2f2f;border-color:#222}.trumbowyg-dark .trumbowyg-modal-box label .trumbowyg-input-infos span.trumbowyg-msg-error{color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error input,.trumbowyg-dark .trumbowyg-modal-box label.trumbowyg-input-error textarea{border-color:#e74c3c}.trumbowyg-dark .trumbowyg-modal-box label input{border-color:#222;color:#eee;background:#333}.trumbowyg-dark .trumbowyg-modal-box label input:focus,.trumbowyg-dark .trumbowyg-modal-box label input:hover{border-color:#626262}.trumbowyg-dark .trumbowyg-modal-box label input: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)}.trumbowyg-editor table{width:100%}.trumbowyg-editor table td{border:1px dotted #e7eaec;padding:8px}.trumbowyg-dropdown-table table{margin:10px;display:inline-block}.trumbowyg-dropdown-table table td{display:inline-block;height:20px;width:20px;margin:1px;padding:0;background-color:#fff;-webkit-box-shadow:0 0 0 1px #cecece inset;box-shadow:0 0 0 1px #cecece inset}.trumbowyg-dropdown-table table td.active{background-color:#00b393;-webkit-box-shadow:none;box-shadow:none;cursor:pointer}.trumbowyg-dropdown-table .trumbowyg-table-size{text-align:center}.custom-file-img{max-width:100%}.md-avatar{width:50px;height:50px}.mix-tree-view .container{padding-right:0;padding-left:25px}.mix-tree-view .dropdown-menu{z-index:99999}.mix-tree-view .item{padding-bottom:2px;border-left:1px #eee solid}.mix-tree-view .item-fields{padding:12px 8px 0 26px}.sw-search{margin-right:0!important;margin-left:0!important}.sw-sidebar a{color:var(--text-color,#212529)}.ActiveUsers.is-increasing{-webkit-animation:a 3s;animation:a 3s}.ActiveUsers.is-decreasing{-webkit-animation:b 3s;animation:b 3s}@-webkit-keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@keyframes a{10%{background-color:#ebffeb;border-color:rgba(0,128,0,.5);color:green}}@-webkit-keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}@keyframes b{10%{background-color:#ffebeb;border-color:rgba(255,0,0,.5);color:red}}.Chartjs{font-size:.85em}.Chartjs-figure{height:250px}.Chartjs-legend{list-style:none;margin:0;padding:1em 0 0;text-align:center}.Chartjs-legend>li{display:inline-block;padding:.25em .5em}.Chartjs-legend>li>i{display:inline-block;height:1em;margin-right:.5em;vertical-align:-.1em;width:1em}#modal-posts img,medias #modal-files .modal-body .table img{height:30px}@media (min-width:570px){.Chartjs-figure{margin-right:1.5em}}.mix-sel-icons .dropdown-menu{left:-90px!important}.mix-sel-icons .dropdown-menu.show{max-height:250px;overflow:scroll}.mix-sel-icons .list-icon{max-height:150px;overflow-y:scroll;overflow-x:hidden}.monaco-editor-full{position:fixed!important;left:0;top:0;width:100%;z-index:2222}.monaco-editor-full .monaco-editor-btn-group-full{z-index:2223;position:fixed;top:15px;right:25px}.simpleDemo ul[dnd-list]{min-height:42px;padding-left:0}.simpleDemo ul[dnd-list] .dndDraggingSource{display:none}.simpleDemo ul[dnd-list] .dndPlaceholder{background-color:#ddd;display:block;min-height:42px}.simpleDemo ul[dnd-list] li{background-color:#fff;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;display:block;padding:10px 15px;margin-bottom:-1px}.simpleDemo ul[dnd-list] li.selected{background-color:#dff0d8;color:#3c763d}@media (min-width:576px){.jumbotron{padding:2rem 1rem!important}}.alert.position-sticky{bottom:10px}.content{width:100%;display:flex;align-items:center;flex-direction:column;background:0 0}.flag-icon,.flag-icon-background{background-size:contain;background-position:50%}fb-login{background-color:#0ff}medias .modal{z-index:1049}medias #modal-files .modal-body .table img.preview{height:auto}mix-column-preview .row{max-height:120px;margin:10px 0;overflow:hidden}mix-module-data-table .data-table .header{padding:5px;color:#495057;background-color:hsla(var(--primary-color-hue,211),100%,50%,.075);border-color:#dee2e6;font-weight:400;font-size:small}mix-module-data-table .preview-container{max-height:4em;overflow:hidden}upload-croppie .cr-boundary{overflow:hidden}main-side-bar-dynamic .sw-sidebar .sw-toc-item{position:relative}main-side-bar-dynamic .sw-sidebar .sw-toc-item .sw-toc-link .sw-toc-link{padding-left:0}main-side-bar-dynamic .sw-sidebar .sw-toc-item .btn-group{right:20px;opacity:1}main-side-bar-dynamic .sw-sidebar ul{padding-left:15px}main-side-bar-dynamic .sw-sidebar .sw-toc-sub-link .btn-group{padding:2px 0}.custom-image{max-width:30vw}.attr-set-value-item:last-child{border-bottom:0!important}@media (min-width:992px){#modal-content-filter .modal-lg,#modal-content-filter .modal-xl{max-width:80vw}}.table-data td.preview{max-width:120px;overflow:hidden}.img-container>img,.img-preview>img{max-width:100%}.img-container,.img-preview{background-color:#f7f7f7;text-align:center;width:100%}.img-container{margin-bottom:1rem;max-height:497px;min-height:200px}@media (min-width:768px){.img-container{min-height:497px}}.docs-preview{margin-right:-1rem}.img-preview{float:left;margin-bottom:.5rem;margin-right:.5rem;overflow:hidden}.preview-lg{height:9rem;width:16rem}.preview-md{height:4.5rem;width:8rem}.preview-sm{height:2.25rem;width:4rem}.preview-xs{height:1.125rem;margin-right:0;width:2rem}.docs-data>.input-group{margin-bottom:.5rem}.docs-data>.input-group>label{justify-content:center;min-width:5rem}.docs-data>.input-group>span{justify-content:center;min-width:3rem}.docs-buttons>.btn,.docs-buttons>.btn-group,.docs-buttons>.form-control{margin-bottom:.5rem;margin-right:.25rem}.docs-toggles>.btn,.docs-toggles>.btn-group,.docs-toggles>.dropdown{margin-bottom:.5rem}.custom-file-val{position:absolute;bottom:0}.sw-content{width:100%!important}input[type=date]::-webkit-inner-spin-button{display:none}.ace_razor{background-color:#ff0}.ace_punctuation.ace_block.ace_razor,.ace_punctuation.ace_short.ace_razor{color:#000}@media screen and (max-width:580px){.hide-on-mb{display:none}}#modal-files img.preview{width:100%;height:auto}@media screen and (min-width:580px){.hide-on-desktop{display:none}}.bootstrap-tagsinput,.cm-tab,.cr-rotate-controls i:before,.flag-icon,.now-ui-icons{display:inline-block}@media screen and (max-width:991px){.navbar .navbar-nav{min-height:unset}}@font-face{font-family:'Nucleo Outline';src:url(../fonts/nucleo-outline.eot);src:url(../fonts/nucleo-outline.eot) format("embedded-opentype"),url(../fonts/nucleo-outline.woff2) format("woff2"),url(../fonts/nucleo-outline.woff) format("woff"),url(../fonts/nucleo-outline.ttf) format("truetype"),url(../fonts/nucleo-outline.svg) format("svg");font-weight:400;font-style:normal}.now-ui-icons{font:normal normal normal 14px/1 'Nucleo Outline';font-size:inherit;speak:none;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.now-ui-icons.circle{padding:.33333333em;vertical-align:-16%;border-radius:50%}.fa-ul,.nc-icon-ul{padding-left:0;list-style-type:none}.nc-icon-ul{margin-left:2.14285714em}.nc-icon-ul>li{position:relative}.nc-icon-ul>li>.now-ui-icons{position:absolute;left:-1.57142857em;top:.14285714em;text-align:center}.nc-icon-ul>li>.now-ui-icons.circle{top:-.19047619em;left:-1.9047619em}.now-ui-icons.spin{-webkit-animation:nc-icon-spin 2s infinite linear;-moz-animation:nc-icon-spin 2s infinite linear;animation:nc-icon-spin 2s infinite linear}@-webkit-keyframes nc-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes nc-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@keyframes nc-icon-spin{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.now-ui-icons.ui-1_check:before{content:"\ea22"}.now-ui-icons.ui-1_email-85:before{content:"\ea2a"}.now-ui-icons.arrows-1_cloud-download-93:before{content:"\ea21"}.now-ui-icons.arrows-1_cloud-upload-94:before{content:"\ea24"}.now-ui-icons.arrows-1_minimal-down:before{content:"\ea39"}.now-ui-icons.arrows-1_minimal-left:before{content:"\ea3a"}.now-ui-icons.arrows-1_minimal-right:before{content:"\ea3b"}.now-ui-icons.arrows-1_minimal-up:before{content:"\ea3c"}.now-ui-icons.arrows-1_refresh-69:before{content:"\ea44"}.now-ui-icons.arrows-1_share-66:before{content:"\ea4c"}.now-ui-icons.business_badge:before{content:"\ea09"}.now-ui-icons.business_bank:before{content:"\ea0a"}.now-ui-icons.business_briefcase-24:before{content:"\ea13"}.now-ui-icons.business_bulb-63:before{content:"\ea15"}.now-ui-icons.business_chart-bar-32:before{content:"\ea1e"}.now-ui-icons.business_chart-pie-36:before{content:"\ea1f"}.now-ui-icons.business_globe:before{content:"\ea2f"}.now-ui-icons.business_money-coins:before{content:"\ea40"}.now-ui-icons.clothes_tie-bow:before{content:"\ea5b"}.now-ui-icons.design_vector:before{content:"\ea61"}.now-ui-icons.design_app:before{content:"\ea08"}.now-ui-icons.design_bullet-list-67:before{content:"\ea14"}.now-ui-icons.design_image:before{content:"\ea33"}.now-ui-icons.design_palette:before{content:"\ea41"}.now-ui-icons.design_scissors:before{content:"\ea4a"}.now-ui-icons.design-2_html5:before{content:"\ea32"}.now-ui-icons.design-2_ruler-pencil:before{content:"\ea48"}.now-ui-icons.emoticons_satisfied:before{content:"\ea49"}.now-ui-icons.files_box:before{content:"\ea12"}.now-ui-icons.files_paper:before{content:"\ea43"}.now-ui-icons.files_single-copy-04:before{content:"\ea52"}.now-ui-icons.health_ambulance:before{content:"\ea07"}.now-ui-icons.loader_gear:before{content:"\ea4e"}.now-ui-icons.loader_refresh:before{content:"\ea44"}.now-ui-icons.location_bookmark:before{content:"\ea10"}.now-ui-icons.location_compass-05:before{content:"\ea25"}.now-ui-icons.location_map-big:before{content:"\ea3d"}.now-ui-icons.location_pin:before{content:"\ea47"}.now-ui-icons.location_world:before{content:"\ea63"}.now-ui-icons.media-1_album:before{content:"\ea02"}.now-ui-icons.media-1_button-pause:before{content:"\ea16"}.now-ui-icons.media-1_button-play:before{content:"\ea18"}.now-ui-icons.media-1_button-power:before{content:"\ea19"}.now-ui-icons.media-1_camera-compact:before{content:"\ea1c"}.now-ui-icons.media-2_note-03:before{content:"\ea3f"}.now-ui-icons.media-2_sound-wave:before{content:"\ea57"}.now-ui-icons.objects_diamond:before{content:"\ea29"}.now-ui-icons.objects_globe:before{content:"\ea2f"}.now-ui-icons.objects_key-25:before{content:"\ea38"}.now-ui-icons.objects_planet:before{content:"\ea46"}.now-ui-icons.objects_spaceship:before{content:"\ea55"}.now-ui-icons.objects_support-17:before{content:"\ea56"}.now-ui-icons.objects_umbrella-13:before{content:"\ea5f"}.now-ui-icons.education_agenda-bookmark:before{content:"\ea01"}.now-ui-icons.education_atom:before{content:"\ea0c"}.now-ui-icons.education_glasses:before{content:"\ea2d"}.now-ui-icons.education_hat:before{content:"\ea30"}.now-ui-icons.education_paper:before{content:"\ea42"}.now-ui-icons.shopping_bag-16:before{content:"\ea0d"}.now-ui-icons.shopping_basket:before{content:"\ea0b"}.now-ui-icons.shopping_box:before{content:"\ea11"}.now-ui-icons.shopping_cart-simple:before{content:"\ea1d"}.now-ui-icons.shopping_credit-card:before{content:"\ea28"}.now-ui-icons.shopping_delivery-fast:before{content:"\ea27"}.now-ui-icons.shopping_shop:before{content:"\ea50"}.now-ui-icons.shopping_tag-content:before{content:"\ea59"}.now-ui-icons.sport_trophy:before{content:"\ea5d"}.now-ui-icons.sport_user-run:before{content:"\ea60"}.now-ui-icons.tech_controller-modern:before{content:"\ea26"}.now-ui-icons.tech_headphones:before{content:"\ea31"}.now-ui-icons.tech_laptop:before{content:"\ea36"}.now-ui-icons.tech_mobile:before{content:"\ea3e"}.now-ui-icons.tech_tablet:before{content:"\ea58"}.now-ui-icons.tech_tv:before{content:"\ea5e"}.now-ui-icons.tech_watch-time:before{content:"\ea62"}.now-ui-icons.text_align-center:before{content:"\ea05"}.now-ui-icons.text_align-left:before{content:"\ea06"}.now-ui-icons.text_bold:before{content:"\ea0e"}.now-ui-icons.text_caps-small:before{content:"\ea1b"}.now-ui-icons.gestures_tap-01:before{content:"\ea5a"}.now-ui-icons.transportation_air-baloon:before{content:"\ea03"}.now-ui-icons.transportation_bus-front-12:before{content:"\ea17"}.now-ui-icons.travel_info:before{content:"\ea04"}.now-ui-icons.travel_istanbul:before{content:"\ea34"}.now-ui-icons.ui-1_bell-53:before{content:"\ea0f"}.now-ui-icons.ui-1_calendar-60:before{content:"\ea1a"}.now-ui-icons.ui-1_lock-circle-open:before{content:"\ea35"}.now-ui-icons.ui-1_send:before{content:"\ea4d"}.now-ui-icons.ui-1_settings-gear-63:before{content:"\ea4e"}.now-ui-icons.ui-1_simple-add:before{content:"\ea4f"}.now-ui-icons.ui-1_simple-delete:before{content:"\ea54"}.now-ui-icons.ui-1_simple-remove:before{content:"\ea53"}.now-ui-icons.ui-1_zoom-bold:before{content:"\ea64"}.now-ui-icons.ui-2_chat-round:before{content:"\ea20"}.now-ui-icons.ui-2_favourite-28:before{content:"\ea2b"}.now-ui-icons.ui-2_like:before{content:"\ea37"}.now-ui-icons.ui-2_settings-90:before{content:"\ea4b"}.now-ui-icons.ui-2_time-alarm:before{content:"\ea5c"}.now-ui-icons.users_circle-08:before{content:"\ea23"}.now-ui-icons.users_single-02:before{content:"\ea51"}.flag-icon-background{background-repeat:no-repeat}.flag-icon{background-repeat:no-repeat;position:relative;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.flag-icon-es-ct.flag-icon-squared{background-image:url(../flags/1x1/es-ct.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)}.flag-icon-xk{background-image:url(../flags/4x3/xk.svg)}.flag-icon-xk.flag-icon-squared{background-image:url(../flags/1x1/xk.svg)}.loader-container{top:0;left:0;width:100%;height:100%;position:fixed;background-color:#000;opacity:.2;z-index:9999}#loader{position:absolute;left:50%;top:50%;z-index:1;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #3498db;width:120px;height:120px;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.modal-open{overflow:hidden;padding-right:0!important}.croppie-container{width:100%;height:100%}.croppie-container .cr-image{z-index:-1;position:absolute;top:0;left:0;transform-origin:0 0;max-height:none;max-width:none}.croppie-container .cr-boundary{position:relative;overflow:hidden;margin:0 auto;z-index:1;width:100%;height:100%}.croppie-container .cr-resizer,.croppie-container .cr-viewport{position:absolute;border:2px solid #fff;margin:auto;top:0;bottom:0;right:0;left:0;box-shadow:0 0 2000px 2000px rgba(0,0,0,.5);z-index:0}.croppie-container .cr-resizer{z-index:2;box-shadow:none;pointer-events:none}.croppie-container .cr-resizer-horisontal,.croppie-container .cr-resizer-vertical{position:absolute;pointer-events:all}.croppie-container .cr-resizer-horisontal::after,.croppie-container .cr-resizer-vertical::after{display:block;position:absolute;box-sizing:border-box;border:1px solid #000;background:#fff;width:10px;height:10px;content:''}.croppie-container .cr-resizer-vertical{bottom:-5px;cursor:row-resize;width:100%;height:10px}.croppie-container .cr-resizer-vertical::after{left:50%;margin-left:-5px}.croppie-container .cr-resizer-horisontal{right:-5px;cursor:col-resize;width:10px;height:100%}.croppie-container .cr-resizer-horisontal::after{top:50%;margin-top:-5px}.croppie-container .cr-original-image{display:none}.croppie-container .cr-vp-circle{border-radius:50%}.croppie-container .cr-overlay{z-index:1;position:absolute;cursor:move;touch-action:none}.croppie-container .cr-slider-wrap{width:75%;margin:15px auto;text-align:center}.croppie-result{position:relative;overflow:hidden}.croppie-result img{position:absolute}.croppie-container .cr-image,.croppie-container .cr-overlay,.croppie-container .cr-viewport{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.cr-slider{-webkit-appearance:none;max-width:100%;padding-top:8px;padding-bottom:8px;background-color:transparent}.cr-slider::-webkit-slider-runnable-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:focus{outline:0}.cr-slider::-moz-range-track{width:100%;height:3px;background:rgba(0,0,0,.5);border:0;border-radius:3px}.cr-slider::-moz-range-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:-6px}.cr-slider:-moz-focusring{outline:#fff solid 1px;outline-offset:-1px}.cr-slider::-ms-track{width:100%;height:5px;background:0 0;border-color:transparent;border-width:6px 0;color:transparent}.cr-slider::-ms-fill-lower{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-fill-upper{background:rgba(0,0,0,.5);border-radius:10px}.cr-slider::-ms-thumb{border:none;height:16px;width:16px;border-radius:50%;background:#ddd;margin-top:1px}.cr-slider:focus::-ms-fill-lower{background:rgba(0,0,0,.5)}.cr-slider:focus::-ms-fill-upper{background:rgba(0,0,0,.5)}.cr-rotate-controls{position:absolute;bottom:5px;left:5px;z-index:1}.cr-rotate-controls button{border:0;background:0 0}.cr-rotate-controls i:before{font-style:normal;font-weight:900;font-size:22px}.cm-em,.hljs-comment,.hljs-emphasis,.hljs-quote,.tui-editor-contents address,.tui-editor-contents cite,.tui-editor-contents dfn,.tui-editor-contents em,.tui-editor-contents i,.tui-editor-contents var{font-style:italic}.cr-rotate-l i:before{content:'↺'}.cr-rotate-r i:before{content:'↻'}.bootstrap-tagsinput{background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);padding:4px 6px;color:#555;border-radius:4px;max-width:100%;line-height:22px;cursor:text}.bootstrap-tagsinput input,.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput input{outline:0;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#777;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#777}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#777}.bootstrap-tagsinput .tag{margin-right:2px;color:#fff}.bootstrap-tagsinput .tag [data-role=remove]{margin-left:8px;cursor:pointer}.bootstrap-tagsinput .tag [data-role=remove]:after{content:"x";padding:0 2px}.bootstrap-tagsinput .tag [data-role=remove]:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.bootstrap-tagsinput .tag [data-role=remove]:hover:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.CodeMirror{height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{text-decoration:inherit}.cm-link,.tui-editor-contents a{text-decoration:underline}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror,.te-input-language input,.te-ww-block-overlay.code-block-header,.tui-editor-defaultUI{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-strong{font-weight:700}.tui-editor-contents :not(table){line-height:160%;box-sizing:content-box}.tui-editor-contents strong{font-weight:700}.tui-editor-contents p{margin:10px 0;color:#555}.tui-editor-contents>div>div:first-of-type h1,.tui-editor-contents>h1:first-of-type{margin-top:14px}.tui-editor-contents h1,.tui-editor-contents h2,.tui-editor-contents h3,.tui-editor-contents h5{font-weight:700}.tui-editor-contents h1{font-size:1.6rem;line-height:28px;border-bottom:3px double #999;margin:52px 0 15px;padding-bottom:7px;color:#000}.tui-editor-contents h2{font-size:1.3rem;line-height:23px;border-bottom:1px solid #dbdbdb;margin:30px 0 13px;padding-bottom:7px;color:#333}.tui-editor-contents h3,.tui-editor-contents h4{font-size:1.2rem;line-height:18px;margin:20px 0 2px;color:#333}.tui-editor-contents h5,.tui-editor-contents h6{font-size:1rem;line-height:17px;margin:10px 0 -4px;color:#333}.tui-editor-contents blockquote{margin:15px 0;border-left:4px solid #ddd;padding:0 15px;color:#777}.tui-editor-contents blockquote>:first-child{margin-top:0}.tui-editor-contents blockquote>:last-child{margin-bottom:0}.tui-editor-contents code,.tui-editor-contents pre{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;border:0;border-radius:0}.tui-editor-contents pre{margin:2px 0 8px;padding:18px;background-color:#f5f7f8}.tui-editor-contents code{color:#c1788b;padding:4px 4px 2px 0;letter-spacing:-.3px}.tui-editor-contents pre code{padding:0;color:inherit;white-space:pre-wrap;background-color:transparent}.tui-editor-contents pre.addon{border:1px solid #e8ebed;background-color:#fff}.tui-editor-contents img{margin:4px 0 10px;box-sizing:border-box;vertical-align:top;max-width:100%}.tui-editor-contents table{margin:2px 0 14px;color:#555;width:auto;border-collapse:collapse;box-sizing:border-box}.tui-editor-contents table td,.tui-editor-contents table th{height:32px;padding:5px 14px 5px 12px}.tui-editor-contents table td{border:1px solid #eaeaea}.tui-editor-contents table th{border:1px solid #72777b;border-top:0;background-color:#7b8184;font-weight:300;color:#fff;padding-top:6px}.tui-editor-contents dir,.tui-editor-contents menu,.tui-editor-contents ol,.tui-editor-contents ul{display:block;list-style-type:disc;padding-left:17px;margin:6px 0 10px;color:#555}.tui-editor-contents ol{list-style-type:decimal}.tui-editor-contents ol ol,.tui-editor-contents ol ul,.tui-editor-contents ul ol,.tui-editor-contents ul ul{margin-top:0!important;margin-bottom:0!important}.tui-editor-contents ol li,.tui-editor-contents ul li{position:relative}.tui-editor-contents ul p,ol p{margin:0}.tui-editor-contents hr{border-top:1px solid #eee;margin:16px 0}.tui-editor-contents a{color:#5286bc}.tui-editor-contents a:hover{color:#007cff}.tui-editor-contents{font-size:13px;margin:0;padding:0}.tui-editor-contents .task-list-item{border:0;list-style:none;padding-left:22px;margin-left:-22px}.tui-editor-contents .task-list-item:before{background-repeat:no-repeat;background-size:16px 16px;background-position:center;height:18px;width:18px;position:absolute;left:0;top:1px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item.checked:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item .task-list-item-checkbox,.tui-editor-contents .task-list-item input[type=checkbox]{margin-left:-17px;margin-right:3.8px;margin-top:3px}.tui-editor-contents-placeholder:before{content:attr(data-placeholder);color:grey;line-height:160%;position:absolute}.auto-height,.auto-height .tui-editor-defaultUI{height:auto}.auto-height .tui-editor{position:relative}:not(.auto-height)>.tui-editor-defaultUI,:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{-ms-flex:1;flex:1}.tui-editor-defaultUI-toolbar:after,.tui-editor:after{content:"";display:block;height:0;clear:both}.tui-editor{position:absolute;line-height:1;color:#181818;width:100%;height:inherit}.te-editor-section{min-height:0;position:relative;height:inherit}.te-md-container{display:none;overflow:hidden;height:100%}.te-md-container .te-editor{line-height:1.5}.te-md-container .te-editor,.te-md-container .te-preview{box-sizing:border-box;padding:0;height:inherit}.te-md-container .CodeMirror{font-size:13px;height:inherit}.te-md-container .te-preview{overflow:auto;padding:0 25px;height:100%}.te-md-container .te-preview>p:first-child{margin-top:0!important}.te-md-container .te-preview .tui-editor-contents{padding-top:11px}.tui-editor .te-preview-style-tab>.te-editor,.tui-editor .te-preview-style-tab>.te-preview{float:left;width:100%;display:none}.tui-editor .te-preview-style-tab>.te-tab-active{display:block}.tui-editor .te-preview-style-vertical>.te-tab-section{display:none}.tui-editor .te-preview-style-tab>.te-tab-section{display:block}.tui-editor .te-preview-style-vertical .te-editor,.tui-editor .te-preview-style-vertical .te-preview{float:left;width:50%}.tui-editor .te-md-splitter{display:none;position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #e5e5e5}.tui-editor .te-preview-style-vertical .te-md-splitter{display:block}.te-ww-container{display:none;overflow:hidden;z-index:10;height:inherit;background-color:#fff}.te-ww-container>.te-editor{overflow:auto;height:inherit}.te-ww-container .tui-editor-contents:focus{outline:0}.te-ww-container .tui-editor-contents{padding:0 25px}.te-ww-container .tui-editor-contents:first-child{box-sizing:border-box;margin:0;padding:16px 25px 0;height:inherit}.te-ww-container .tui-editor-contents:last-child{margin-bottom:16px}.te-md-mode .te-md-container,.te-ww-mode .te-ww-container{display:block;z-index:100}.tui-editor-defaultUI.te-hide,.tui-editor.te-hide{display:none}.tui-editor-defaultUI .CodeMirror-lines{padding-top:13px;padding-bottom:13px}.tui-editor-defaultUI .CodeMirror-line{padding-left:25px;padding-right:25px}.tui-editor-defaultUI .CodeMirror pre.CodeMirror-placeholder{padding-left:25px;color:grey}.tui-editor-defaultUI .CodeMirror-scroll{cursor:text}.tui-editor-contents td.te-cell-selected{background-color:#d8dfec}.tui-editor-contents td.te-cell-selected::selection{background-color:#d8dfec}.tui-editor-contents th.te-cell-selected{background-color:#908f8f}.tui-editor-contents th.te-cell-selected::selection{background-color:#908f8f}.tui-editor-defaultUI{position:relative;border:1px solid #e5e5e5;height:100%}.tui-editor-defaultUI button{color:#fff;padding:0 14px 0 15px;height:28px;font-size:12px;border:none;cursor:pointer;outline:0}.tui-editor-defaultUI button.te-ok-button{background-color:#4b96e6}.tui-editor-defaultUI button.te-close-button{background-color:#777}.tui-editor-defaultUI-toolbar{padding:0 25px;height:31px;background-color:#fff;border:0;overflow:hidden}.tui-toolbar-divider{float:left;display:inline-block;width:1px;height:14px;background-color:#ddd;margin:9px 6px}.tui-toolbar-button-group{height:28px;border-right:1px solid #d9d9d9;float:left}.te-toolbar-section{height:32px;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.tui-editor-defaultUI-toolbar button{float:left;box-sizing:border-box;outline:0;cursor:pointer;background-color:#fff;width:22px;height:22px;padding:3px;border-radius:0;margin:5px 3px;border:1px solid #fff}.tui-editor-defaultUI-toolbar button.active,.tui-editor-defaultUI-toolbar button:active,.tui-editor-defaultUI-toolbar button:hover{border:1px solid #aaa;background-color:#fff}.tui-editor-defaultUI-toolbar button:first-child{margin-left:0}.tui-editor-defaultUI-toolbar button:last-child{margin-right:0}.tui-editor-defaultUI-toolbar button.tui-scrollsync{width:auto;color:#777;border:0}.tui-editor-defaultUI button.tui-scrollsync:after{content:"Scroll off"}.tui-editor-defaultUI button.tui-scrollsync.active{color:#125de6;font-weight:700}.tui-editor-defaultUI button.tui-scrollsync.active:after{content:"Scroll on"}.tui-editor-defaultUI .te-mode-switch-section{background-color:#f9f9f9;border-top:1px solid #e5e5e5;height:20px;font-size:12px}.tui-editor-defaultUI .te-mode-switch{float:right;height:100%}.tui-editor-defaultUI .te-switch-button{width:92px;height:inherit;background:#e5e5e5;outline:0;color:#a0aabf;cursor:pointer;border:0;border-left:1px solid #ddd;border-right:1px solid #ddd}.tui-editor-defaultUI .te-switch-button.active{background-color:#fff;color:#000}.tui-editor-defaultUI .te-markdown-tab-section{float:left;height:31px;background:#fff}.te-markdown-tab-section .te-tab{margin:0 -7px 0 24px;background:#fff}.tui-editor-defaultUI .te-tab button{box-sizing:border-box;line-height:100%;position:relative;cursor:pointer;z-index:1;font-size:13px;background-color:#f9f9f9;border:1px solid #e5e5e5;border-top:0;padding:0 9px;color:#777;border-radius:0;outline:0}.te-markdown-tab-section .te-tab button:last-child{margin-left:-1px}.te-markdown-tab-section .te-tab button.te-tab-active,.te-markdown-tab-section .te-tab button:hover.te-tab-active{background-color:#fff;color:#333;border-bottom:1px solid #fff;z-index:2}.te-markdown-tab-section .te-tab button:hover{background-color:#fff;color:#333}.tui-popup-modal-background{background-color:rgba(202,202,202,.6);position:fixed;margin:0;left:0;top:0;width:100%;height:100%;z-index:9999}.tui-popup-modal-background.fit-window .tui-popup-wrapper,.tui-popup-wrapper.fit-window{width:100%;height:100%}.tui-popup-wrapper{width:500px;margin-right:auto;border:1px solid #cacaca;background:#fff;z-index:9999}.tui-popup-modal-background .tui-popup-wrapper{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0}.tui-popup-header{padding:10px;height:auto;line-height:normal;position:relative;border-bottom:1px solid #cacaca}.tui-popup-header .tui-popup-header-buttons{float:right}.tui-popup-header .tui-popup-header-buttons button{padding:0;background-color:transparent;background-size:cover;float:left}.tui-popup-header .tui-popup-close-button{margin:3px;width:13px;height:13px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMHB4IiBoZWlnaHQ9IjEwcHgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5GMjc2Qzc4MC0zM0JBLTQ3MTItQTM3OC04RkQwQUNDOTFDRTk8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImxuYi1mb2xkZXItZGVsIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM3Nzc3NzciPiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LDMuNTg1Nzg2NDQgTDEuNzA3MTA2NzgsMC4yOTI4OTMyMTkgTDAuMjkyODkzMjE5LDEuNzA3MTA2NzggTDMuNTg1Nzg2NDQsNSBMMC4yOTI4OTMyMTksOC4yOTI4OTMyMiBMMS43MDcxMDY3OCw5LjcwNzEwNjc4IEw1LDYuNDE0MjEzNTYgTDguMjkyODkzMjIsOS43MDcxMDY3OCBMOS43MDcxMDY3OCw4LjI5Mjg5MzIyIEw2LjQxNDIxMzU2LDUgTDkuNzA3MTA2NzgsMS43MDcxMDY3OCBMOC4yOTI4OTMyMiwwLjI5Mjg5MzIxOSBMNSwzLjU4NTc4NjQ0IFoiIGlkPSJDb21iaW5lZC1TaGFwZSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-header .tui-popup-title{font-size:13px;font-weight:700;color:#333;vertical-align:bottom}.tui-popup-body{padding:15px;font-size:12px}.tui-editor-popup{position:absolute;top:30px;left:50%;margin-left:-250px}.tui-editor-popup.tui-popup-modal-background{position:fixed;top:0;left:0;margin:0}.tui-editor-popup .tui-popup-body label{font-weight:700;color:#666;display:block;margin:10px 0 5px}.tui-editor-popup .tui-popup-body .te-button-section{margin-top:15px}.tui-editor-popup .tui-popup-body input[type=file],.tui-editor-popup .tui-popup-body input[type=text]{padding:4px 10px;border:1px solid #bfbfbf;box-sizing:border-box;width:100%}.tui-editor-popup .tui-popup-body input.wrong{border-color:red}.te-popup-add-link .tui-popup-wrapper{height:219px}.te-popup-add-image .tui-popup-wrapper{height:243px}.te-popup-add-image .te-tab{display:block;background:0 0;border-bottom:1px solid #ebebeb;margin-bottom:8px}.te-dropdown-toolbar .tui-toolbar-divider,.te-popup-add-image .te-file-type,.te-popup-add-image .te-url-type,.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-toggle-slider{display:none}.te-popup-add-image div.te-tab-active,.te-popup-add-image form.te-tab-active{display:block}.te-popup-add-image .te-tab button{border:1px solid #ccc;background:#eee;min-width:100px;margin-left:-1px;border-bottom:0;border-radius:3px 3px 0 0}.te-popup-add-image .te-tab button.te-tab-active{background:#fff}.te-popup-add-table .te-table-selection{position:relative}.te-popup-add-table .te-table-body{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZmspKREMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgAMSwQgckFvTgAAAABJRU5ErkJggg==)}.te-popup-add-table .te-table-header{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZksLCxMMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgDxKwPzTeWPdAAAAABJRU5ErkJggg==)}.te-popup-add-table .te-selection-area{position:absolute;top:0;left:0;background:#80d2ff;opacity:.3;z-index:999}.te-popup-add-table .te-description{margin:10px 0 0;text-align:center}.te-popup-table-utils{width:120px}.te-popup-table-utils .tui-popup-body{padding:0}.te-popup-table-utils button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:28px;text-align:left;color:#777}.fa-inverse,.mi-inverse,.tui-tooltip{color:#fff}.te-popup-table-utils button:hover{background-color:#f4f4f4}.te-popup-table-utils hr{background-color:#cacaca;border-style:none;height:1px}.te-heading-add{width:auto}.te-heading-add .tui-popup-body{padding:0}.te-heading-add h1,.te-heading-add h2,.te-heading-add h3,.te-heading-add h4,.te-heading-add h5,.te-heading-add h6,.te-heading-add p,.te-heading-add ul{padding:0;margin:0}.te-heading-add ul{list-style:none}.te-heading-add ul li{padding:2px 10px;cursor:pointer}.te-dropdown-toolbar .tui-popup-body,.tui-popup-color{padding:0}.te-heading-add ul li:hover{background-color:#eee}.te-heading-add h1{font-size:24px}.te-heading-add h2{font-size:22px}.te-heading-add h3{font-size:20px}.te-heading-add h4{font-size:18px}.te-heading-add h5{font-size:16px}.te-heading-add h6{font-size:14px}.te-dropdown-toolbar{position:absolute;width:auto}.tui-popup-color .tui-colorpicker-container,.tui-popup-color .tui-colorpicker-palette-container{width:144px}.tui-popup-color .tui-colorpicker-container ul{width:144px;margin-bottom:8px}.tui-popup-color .tui-colorpicker-container li{padding:0 1px 1px 0}.tui-popup-color .tui-colorpicker-container li .tui-colorpicker-palette-button{border:0;width:17px;height:17px}.tui-popup-color .tui-popup-body{padding:10px}.tui-popup-color .te-apply-button,.tui-popup-color .tui-colorpicker-palette-hex{float:right}.tui-popup-color .te-apply-button{height:21px;width:35px;background:#fff;border:1px solid #efefef;position:absolute;bottom:141px;right:10px}.tui-tooltip,.tui-tooltip .arrow{background-color:#222;position:absolute}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-hex{border:1px solid #E1E1E1;padding:3px 14px;margin-left:-1px}.tui-popup-color .tui-colorpicker-container div.tui-colorpicker-clearfix{display:inline-block}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-preview{width:19px;height:19px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-slider-right{width:22px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-huebar-handle{display:none}.tui-tooltip{z-index:999;opacity:.8;padding:2px 5px;font-size:10px}.tui-tooltip .arrow{content:"";display:inline-block;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:6px;z-index:-1}.tui-toolbar-icons{background:url(tui-editor.png);background-size:218px 188px;display:inline-block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.tui-toolbar-icons{background:url(tui-editor-2x.png);background-size:218px 188px;display:inline-block}}.tui-toolbar-icons.tui-heading{background-position:-172px -48px}.tui-toolbar-icons.tui-heading:disabled{background-position:-193px -48px}.tui-toolbar-icons.tui-bold{background-position:-4px -4px}.tui-toolbar-icons.tui-bold:disabled{background-position:-25px -4px}.tui-toolbar-icons.tui-italic{background-position:-4px -48px}.tui-toolbar-icons.tui-italic:disabled{background-position:-25px -48px}.tui-toolbar-icons.tui-color{background-position:-172px -70px}.tui-toolbar-icons.tui-color:disabled{background-position:-193px -70px}.tui-toolbar-icons.tui-strike{background-position:-4px -26px}.tui-toolbar-icons.tui-strike:disabled{background-position:-25px -26px}.tui-toolbar-icons.tui-hrline{background-position:-46px -92px}.tui-toolbar-icons.tui-hrline:disabled{background-position:-67px -92px}.tui-toolbar-icons.tui-quote{background-position:-4px -114px}.tui-toolbar-icons.tui-quote:disabled{background-position:-25px -114px}.tui-toolbar-icons.tui-ul{background-position:-46px -4px}.tui-toolbar-icons.tui-ul:disabled{background-position:-67px -4px}.tui-toolbar-icons.tui-ol{background-position:-46px -26px}.tui-toolbar-icons.tui-ol:disabled{background-position:-67px -26px}.tui-toolbar-icons.tui-task{background-position:-130px -48px}.tui-toolbar-icons.tui-task:disabled{background-position:-151px -48px}.tui-toolbar-icons.tui-indent{background-position:-46px -48px}.tui-toolbar-icons.tui-indent:disabled{background-position:-67px -48px}.tui-toolbar-icons.tui-outdent{background-position:-46px -70px}.tui-toolbar-icons.tui-outdent:disabled{background-position:-67px -70px}.tui-toolbar-icons.tui-table{background-position:-88px -92px}.tui-toolbar-icons.tui-table:disabled{background-position:-109px -92px}.tui-toolbar-icons.tui-image{background-position:-130px -4px}.tui-toolbar-icons.tui-image:disabled{background-position:-151px -4px}.tui-toolbar-icons.tui-link{background-position:-130px -26px}.tui-toolbar-icons.tui-link:disabled{background-position:-151px -26px}.tui-toolbar-icons.tui-code{background-position:-130px -92px}.tui-toolbar-icons.tui-code:disabled{background-position:-151px -92px}.tui-toolbar-icons.tui-codeblock{background-position:-130px -70px}.tui-toolbar-icons.tui-codeblock:disabled{background-position:-151px -70px}.tui-toolbar-icons.tui-more{background-position:-172px -92px}.tui-toolbar-icons.tui-more:disabled{background-position:-193px -92px}.tui-colorpicker-svg-huebar,.tui-colorpicker-svg-slider,.tui-colorpicker-vml-slider{border:1px solid #ebebeb}.CodeMirror-sizer{margin-top:6px}.CodeMirror .cm-header{font-weight:700;color:inherit}.CodeMirror .cm-header-1{font-size:24px}.CodeMirror .cm-header-2{font-size:22px}.CodeMirror .cm-header-3{font-size:20px}.CodeMirror .cm-header-4{font-size:18px}.CodeMirror .cm-header-5{font-size:16px}.CodeMirror .cm-header-6{font-size:14px}.CodeMirror .cm-variable-2{color:inherit}.tui-editor-pseudo-clipboard{position:fixed;left:-1000px;top:-1000px;width:100px;height:100px}.te-ww-block-overlay.code-block-header{text-align:right}.te-ww-block-overlay.code-block-header span{font-size:10px;font-weight:600;padding:0 10px;color:#333;cursor:default}.te-ww-block-overlay.code-block-header button{margin:8px;font-size:10px;color:#333;background-color:#f9f9f9;border:1px solid #ddd;padding:4px;height:auto}.te-popup-code-block-languages{position:fixed;box-sizing:border-box;width:130px}.te-popup-code-block-languages .tui-popup-body{max-height:169px;overflow:auto;padding:0}.te-popup-code-block-languages button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:24px;text-align:left;color:#777}.te-popup-code-block-languages button.active{background-color:#f4f4f4}.tui-popup-code-block-editor .tui-popup-wrapper{width:70%;height:70%;margin:auto;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.te-input-language{position:relative;margin-left:15px;cursor:pointer}.te-input-language input{font-size:10px;padding:3px 5px;border:1px solid #ddd;background-color:#f9f9f9;box-sizing:border-box;width:130px;outline:0}.te-input-language input::-ms-clear{display:none}.te-input-language::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT42Q0NBRDk2QS0yMjYxLTRFNDAtOTk1RC1DRUUyQUREQUQ3NkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLWQtc2lkZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS03IiBwb2ludHM9IjIgNSAxMCA1IDYgMTAiPjwvcG9seWdvbj4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);position:absolute;top:1px;right:3px}.te-input-language.active::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BNEZDRkIzMy0zNjdBLTREMjAtOEEyNC1DQ0I2ODFBMDZDODg8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLXVwLXNpZGUiIGZpbGw9IiM1NTU1NTUiPiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJSZWN0YW5nbGUtNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC02LjAwMDAwMCwgLTYuNTAwMDAwKSAiIHBvaW50cz0iMiA0IDEwIDQgNiA5Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor button{margin:-1px 3px}.tui-popup-code-block-editor .tui-popup-header-buttons{height:20px}.tui-popup-code-block-editor .popup-editor-toggle-preview::after{content:'Preview off';color:#777;margin-right:22px}.tui-popup-code-block-editor .popup-editor-toggle-preview.active::after{content:'Preview on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-scroll::after{content:'Scroll off';color:#777;margin-right:16px}.tui-popup-code-block-editor .popup-editor-toggle-scroll.active::after{content:'Scroll on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-fit{width:18px;height:18px;margin-top:4px;margin-right:14px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT40OUQ4RTYyMy1GRTAyLTQ1RUUtQkQ5Ri0xMjUyQjEzRTU1MkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLWV4cGFuZCIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBhdGggZD0iTTMsMyBMOSwzIEw5LDUgTDUsNSBMNSw5IEwzLDkgTDMsMyBaIE0xNSwxNSBMOSwxNSBMOSwxMyBMMTMsMTMgTDEzLDkgTDE1LDkgTDE1LDE1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC05LjAwMDAwMCwgLTkuMDAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZSIgZmlsbC1ydWxlPSJub256ZXJvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS41MDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMS41MDAwMDAsIC02LjUwMDAwMCkgIiBwb2ludHM9IjkuMDg1Nzg2NDQgNS41IDEyLjUgOC45MTQyMTM1NiAxMy45MTQyMTM2IDcuNSAxMC41IDQuMDg1Nzg2NDQiPjwvcG9seWdvbj4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZS1Db3B5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuNTAwMDAwLCAxMS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTYuNTAwMDAwLCAtMTEuNTAwMDAwKSAiIHBvaW50cz0iNC4wODU3ODY0NCAxMC41IDcuNSAxMy45MTQyMTM2IDguOTE0MjEzNTYgMTIuNSA1LjUgOS4wODU3ODY0NCI+PC9wb2x5Z29uPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-code-block-editor .popup-editor-toggle-fit.active{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT4wN0Q1MjlCRi1GNTIzLTREN0EtQTlGNi05NTUzNTU5RDNEMUE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLXJlZHVjZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDEyLjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNS41MDAwMDAsIC0xMi41MDAwMDApICIgcG9pbnRzPSIzLjA4NTc4NjQ0IDExLjUgNi41IDE0LjkxNDIxMzYgNy45MTQyMTM1NiAxMy41IDQuNSAxMC4wODU3ODY0Ij48L3BvbHlnb24+ICAgICAgICAgICAgPHBhdGggZD0iTTksOSBMMTUsOSBMMTUsMTEgTDExLDExIEwxMSwxNSBMOSwxNSBMOSw5IFogTTksOSBMMyw5IEwzLDcgTDcsNyBMNywzIEw5LDMgTDksOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCA5LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOS4wMDAwMDAsIC05LjAwMDAwMCkgIj48L3BhdGg+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzMiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNTAwMDAwLCA1LjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTIuNTAwMDAwLCAtNS41MDAwMDApICIgcG9pbnRzPSIxNC45MTQyMTM2IDYuNSAxMS41IDMuMDg1Nzg2NDQgMTAuMDg1Nzg2NCA0LjUgMTMuNSA3LjkxNDIxMzU2Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor .tui-popup-close-button{margin-top:6px}.tui-popup-code-block-editor .tui-popup-body{z-index:-1;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1;flex:1}.tui-split-scroll.single-content .tui-split-content-right,.tui-split-scroll.single-content .tui-splitter,.tui-split-scroll.single-content button.tui-scrollsync{display:none}.tui-popup-code-block-editor .popup-editor-body{position:relative;-ms-flex:1;flex:1;border-bottom:1px solid #cacaca}.tui-popup-code-block-editor .te-button-section{padding:15px}.tui-popup-code-block-editor .te-button-section button{float:left}.tui-popup-code-block-editor .tui-editor-contents pre{margin:0;background-color:transparent}.tui-popup-code-block-editor .CodeMirror{height:auto}.tui-popup-code-block-editor .CodeMirror-line{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;font-size:13px;line-height:160%;letter-spacing:-.3px}.tui-popup-code-block-editor .popup-editor-editor-wrapper{min-height:100%}.tui-split-scroll-wrapper{position:relative}.tui-split-scroll{position:absolute}.tui-split-scroll,.tui-split-scroll-wrapper{width:100%;height:100%}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{position:absolute;top:0;width:50%;box-sizing:border-box}.tui-split-scroll .tui-split-content-left{left:0}.tui-split-scroll .tui-split-content-right{left:50%}.tui-split-scroll .tui-splitter{position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #cacaca}.tui-split-scroll .tui-split-scroll-content{width:100%;height:100%;overflow:hidden;position:relative}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{height:100%;overflow-x:hidden;overflow-y:auto}.tui-split-scroll button.tui-scrollsync{top:10px;opacity:.2}.tui-split-scroll button.tui-scrollsync::after{content:"scroll off"}.tui-split-scroll.scroll-sync button.tui-scrollsync{opacity:.5}.tui-split-scroll.scroll-sync .tui-split-content-left,.tui-split-scroll.scroll-sync .tui-split-content-right{height:auto;overflow:initial}.tui-split-scroll.scroll-sync button.tui-scrollsync::after{content:"scroll on"}.tui-split-scroll.scroll-sync .tui-split-scroll-content{overflow-y:auto}.tui-split-scroll.single-content .tui-split-content-left{width:100%}.fa,.fa-stack,.fab,.fad,.fal,.far,.fas,.mi,.mi-stack{display:inline-block}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@supports (-ms-accelerator:true){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@media screen and (max-width:480px){.tui-popup-wrapper{max-width:300px}.tui-editor-popup{margin-left:-150px}.te-dropdown-toolbar{max-width:none}}/*! + */@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.CodeMirror{height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{text-decoration:inherit}.cm-link,.tui-editor-contents a{text-decoration:underline}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror,.te-input-language input,.te-ww-block-overlay.code-block-header,.tui-editor-defaultUI{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-strong{font-weight:700}.tui-editor-contents :not(table){line-height:160%;box-sizing:content-box}.tui-editor-contents strong{font-weight:700}.tui-editor-contents p{margin:10px 0;color:#555}.tui-editor-contents>div>div:first-of-type h1,.tui-editor-contents>h1:first-of-type{margin-top:14px}.tui-editor-contents h1,.tui-editor-contents h2,.tui-editor-contents h3,.tui-editor-contents h5{font-weight:700}.tui-editor-contents h1{font-size:1.6rem;line-height:28px;border-bottom:3px double #999;margin:52px 0 15px;padding-bottom:7px;color:#000}.tui-editor-contents h2{font-size:1.3rem;line-height:23px;border-bottom:1px solid #dbdbdb;margin:30px 0 13px;padding-bottom:7px;color:#333}.tui-editor-contents h3,.tui-editor-contents h4{font-size:1.2rem;line-height:18px;margin:20px 0 2px;color:#333}.tui-editor-contents h5,.tui-editor-contents h6{font-size:1rem;line-height:17px;margin:10px 0 -4px;color:#333}.tui-editor-contents blockquote{margin:15px 0;border-left:4px solid #ddd;padding:0 15px;color:#777}.tui-editor-contents blockquote>:first-child{margin-top:0}.tui-editor-contents blockquote>:last-child{margin-bottom:0}.tui-editor-contents code,.tui-editor-contents pre{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;border:0;border-radius:0}.tui-editor-contents pre{margin:2px 0 8px;padding:18px;background-color:#f5f7f8}.tui-editor-contents code{color:#c1788b;padding:4px 4px 2px 0;letter-spacing:-.3px}.tui-editor-contents pre code{padding:0;color:inherit;white-space:pre-wrap;background-color:transparent}.tui-editor-contents pre.addon{border:1px solid #e8ebed;background-color:#fff}.tui-editor-contents img{margin:4px 0 10px;box-sizing:border-box;vertical-align:top;max-width:100%}.tui-editor-contents table{margin:2px 0 14px;color:#555;width:auto;border-collapse:collapse;box-sizing:border-box}.tui-editor-contents table td,.tui-editor-contents table th{height:32px;padding:5px 14px 5px 12px}.tui-editor-contents table td{border:1px solid #eaeaea}.tui-editor-contents table th{border:1px solid #72777b;border-top:0;background-color:#7b8184;font-weight:300;color:#fff;padding-top:6px}.tui-editor-contents dir,.tui-editor-contents menu,.tui-editor-contents ol,.tui-editor-contents ul{display:block;list-style-type:disc;padding-left:17px;margin:6px 0 10px;color:#555}.tui-editor-contents ol{list-style-type:decimal}.tui-editor-contents ol ol,.tui-editor-contents ol ul,.tui-editor-contents ul ol,.tui-editor-contents ul ul{margin-top:0!important;margin-bottom:0!important}.tui-editor-contents ol li,.tui-editor-contents ul li{position:relative}.tui-editor-contents ul p,ol p{margin:0}.tui-editor-contents hr{border-top:1px solid #eee;margin:16px 0}.tui-editor-contents a{color:#5286bc}.tui-editor-contents a:hover{color:#007cff}.tui-editor-contents{font-size:13px;margin:0;padding:0}.tui-editor-contents .task-list-item{border:0;list-style:none;padding-left:22px;margin-left:-22px}.tui-editor-contents .task-list-item:before{background-repeat:no-repeat;background-size:16px 16px;background-position:center;height:18px;width:18px;position:absolute;left:0;top:1px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item.checked:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=)}.tui-editor-contents .task-list-item .task-list-item-checkbox,.tui-editor-contents .task-list-item input[type=checkbox]{margin-left:-17px;margin-right:3.8px;margin-top:3px}.tui-editor-contents-placeholder:before{content:attr(data-placeholder);color:grey;line-height:160%;position:absolute}.auto-height,.auto-height .tui-editor-defaultUI{height:auto}.auto-height .tui-editor{position:relative}:not(.auto-height)>.tui-editor-defaultUI,:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}:not(.auto-height)>.tui-editor-defaultUI>.te-editor-section{-ms-flex:1;flex:1}.tui-editor-defaultUI-toolbar:after,.tui-editor:after{content:"";display:block;height:0;clear:both}.tui-editor{position:absolute;line-height:1;color:#181818;width:100%;height:inherit}.te-editor-section{min-height:0;position:relative;height:inherit}.te-md-container{display:none;overflow:hidden;height:100%}.te-md-container .te-editor{line-height:1.5}.te-md-container .te-editor,.te-md-container .te-preview{box-sizing:border-box;padding:0;height:inherit}.te-md-container .CodeMirror{font-size:13px;height:inherit}.te-md-container .te-preview{overflow:auto;padding:0 25px;height:100%}.te-md-container .te-preview>p:first-child{margin-top:0!important}.te-md-container .te-preview .tui-editor-contents{padding-top:11px}.tui-editor .te-preview-style-tab>.te-editor,.tui-editor .te-preview-style-tab>.te-preview{float:left;width:100%;display:none}.tui-editor .te-preview-style-tab>.te-tab-active{display:block}.tui-editor .te-preview-style-vertical>.te-tab-section{display:none}.tui-editor .te-preview-style-tab>.te-tab-section{display:block}.tui-editor .te-preview-style-vertical .te-editor,.tui-editor .te-preview-style-vertical .te-preview{float:left;width:50%}.tui-editor .te-md-splitter{display:none;position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #e5e5e5}.tui-editor .te-preview-style-vertical .te-md-splitter{display:block}.te-ww-container{display:none;overflow:hidden;z-index:10;height:inherit;background-color:#fff}.te-ww-container>.te-editor{overflow:auto;height:inherit}.te-ww-container .tui-editor-contents:focus{outline:0}.te-ww-container .tui-editor-contents{padding:0 25px}.te-ww-container .tui-editor-contents:first-child{box-sizing:border-box;margin:0;padding:16px 25px 0;height:inherit}.te-ww-container .tui-editor-contents:last-child{margin-bottom:16px}.te-md-mode .te-md-container,.te-ww-mode .te-ww-container{display:block;z-index:100}.tui-editor-defaultUI.te-hide,.tui-editor.te-hide{display:none}.tui-editor-defaultUI .CodeMirror-lines{padding-top:13px;padding-bottom:13px}.tui-editor-defaultUI .CodeMirror-line{padding-left:25px;padding-right:25px}.tui-editor-defaultUI .CodeMirror pre.CodeMirror-placeholder{padding-left:25px;color:grey}.tui-editor-defaultUI .CodeMirror-scroll{cursor:text}.tui-editor-contents td.te-cell-selected{background-color:#d8dfec}.tui-editor-contents td.te-cell-selected::selection{background-color:#d8dfec}.tui-editor-contents th.te-cell-selected{background-color:#908f8f}.tui-editor-contents th.te-cell-selected::selection{background-color:#908f8f}.tui-editor-defaultUI{position:relative;border:1px solid #e5e5e5;height:100%}.tui-editor-defaultUI button{color:#fff;padding:0 14px 0 15px;height:28px;font-size:12px;border:none;cursor:pointer;outline:0}.tui-editor-defaultUI button.te-ok-button{background-color:#4b96e6}.tui-editor-defaultUI button.te-close-button{background-color:#777}.tui-editor-defaultUI-toolbar{padding:0 25px;height:31px;background-color:#fff;border:0;overflow:hidden}.tui-toolbar-divider{float:left;display:inline-block;width:1px;height:14px;background-color:#ddd;margin:9px 6px}.tui-toolbar-button-group{height:28px;border-right:1px solid #d9d9d9;float:left}.te-toolbar-section{height:32px;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.tui-editor-defaultUI-toolbar button{float:left;box-sizing:border-box;outline:0;cursor:pointer;background-color:#fff;width:22px;height:22px;padding:3px;border-radius:0;margin:5px 3px;border:1px solid #fff}.tui-editor-defaultUI-toolbar button.active,.tui-editor-defaultUI-toolbar button:active,.tui-editor-defaultUI-toolbar button:hover{border:1px solid #aaa;background-color:#fff}.tui-editor-defaultUI-toolbar button:first-child{margin-left:0}.tui-editor-defaultUI-toolbar button:last-child{margin-right:0}.tui-editor-defaultUI-toolbar button.tui-scrollsync{width:auto;color:#777;border:0}.tui-editor-defaultUI button.tui-scrollsync:after{content:"Scroll off"}.tui-editor-defaultUI button.tui-scrollsync.active{color:#125de6;font-weight:700}.tui-editor-defaultUI button.tui-scrollsync.active:after{content:"Scroll on"}.tui-editor-defaultUI .te-mode-switch-section{background-color:#f9f9f9;border-top:1px solid #e5e5e5;height:20px;font-size:12px}.tui-editor-defaultUI .te-mode-switch{float:right;height:100%}.tui-editor-defaultUI .te-switch-button{width:92px;height:inherit;background:#e5e5e5;outline:0;color:#a0aabf;cursor:pointer;border:0;border-left:1px solid #ddd;border-right:1px solid #ddd}.tui-editor-defaultUI .te-switch-button.active{background-color:#fff;color:#000}.tui-editor-defaultUI .te-markdown-tab-section{float:left;height:31px;background:#fff}.te-markdown-tab-section .te-tab{margin:0 -7px 0 24px;background:#fff}.tui-editor-defaultUI .te-tab button{box-sizing:border-box;line-height:100%;position:relative;cursor:pointer;z-index:1;font-size:13px;background-color:#f9f9f9;border:1px solid #e5e5e5;border-top:0;padding:0 9px;color:#777;border-radius:0;outline:0}.te-markdown-tab-section .te-tab button:last-child{margin-left:-1px}.te-markdown-tab-section .te-tab button.te-tab-active,.te-markdown-tab-section .te-tab button:hover.te-tab-active{background-color:#fff;color:#333;border-bottom:1px solid #fff;z-index:2}.te-markdown-tab-section .te-tab button:hover{background-color:#fff;color:#333}.tui-popup-modal-background{background-color:rgba(202,202,202,.6);position:fixed;margin:0;left:0;top:0;width:100%;height:100%;z-index:9999}.tui-popup-modal-background.fit-window .tui-popup-wrapper,.tui-popup-wrapper.fit-window{width:100%;height:100%}.tui-popup-wrapper{width:500px;margin-right:auto;border:1px solid #cacaca;background:#fff;z-index:9999}.tui-popup-modal-background .tui-popup-wrapper{position:absolute;margin:auto;top:0;right:0;bottom:0;left:0}.tui-popup-header{padding:10px;height:auto;line-height:normal;position:relative;border-bottom:1px solid #cacaca}.tui-popup-header .tui-popup-header-buttons{float:right}.tui-popup-header .tui-popup-header-buttons button{padding:0;background-color:transparent;background-size:cover;float:left}.tui-popup-header .tui-popup-close-button{margin:3px;width:13px;height:13px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMHB4IiBoZWlnaHQ9IjEwcHgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5GMjc2Qzc4MC0zM0JBLTQ3MTItQTM3OC04RkQwQUNDOTFDRTk8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImxuYi1mb2xkZXItZGVsIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM3Nzc3NzciPiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LDMuNTg1Nzg2NDQgTDEuNzA3MTA2NzgsMC4yOTI4OTMyMTkgTDAuMjkyODkzMjE5LDEuNzA3MTA2NzggTDMuNTg1Nzg2NDQsNSBMMC4yOTI4OTMyMTksOC4yOTI4OTMyMiBMMS43MDcxMDY3OCw5LjcwNzEwNjc4IEw1LDYuNDE0MjEzNTYgTDguMjkyODkzMjIsOS43MDcxMDY3OCBMOS43MDcxMDY3OCw4LjI5Mjg5MzIyIEw2LjQxNDIxMzU2LDUgTDkuNzA3MTA2NzgsMS43MDcxMDY3OCBMOC4yOTI4OTMyMiwwLjI5Mjg5MzIxOSBMNSwzLjU4NTc4NjQ0IFoiIGlkPSJDb21iaW5lZC1TaGFwZSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-header .tui-popup-title{font-size:13px;font-weight:700;color:#333;vertical-align:bottom}.tui-popup-body{padding:15px;font-size:12px}.tui-editor-popup{position:absolute;top:30px;left:50%;margin-left:-250px}.tui-editor-popup.tui-popup-modal-background{position:fixed;top:0;left:0;margin:0}.tui-editor-popup .tui-popup-body label{font-weight:700;color:#666;display:block;margin:10px 0 5px}.tui-editor-popup .tui-popup-body .te-button-section{margin-top:15px}.tui-editor-popup .tui-popup-body input[type=file],.tui-editor-popup .tui-popup-body input[type=text]{padding:4px 10px;border:1px solid #bfbfbf;box-sizing:border-box;width:100%}.tui-editor-popup .tui-popup-body input.wrong{border-color:red}.te-popup-add-link .tui-popup-wrapper{height:219px}.te-popup-add-image .tui-popup-wrapper{height:243px}.te-popup-add-image .te-tab{display:block;background:0 0;border-bottom:1px solid #ebebeb;margin-bottom:8px}.te-dropdown-toolbar .tui-toolbar-divider,.te-popup-add-image .te-file-type,.te-popup-add-image .te-url-type,.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-toggle-slider{display:none}.te-popup-add-image div.te-tab-active,.te-popup-add-image form.te-tab-active{display:block}.te-popup-add-image .te-tab button{border:1px solid #ccc;background:#eee;min-width:100px;margin-left:-1px;border-bottom:0;border-radius:3px 3px 0 0}.te-popup-add-image .te-tab button.te-tab-active{background:#fff}.te-popup-add-table .te-table-selection{position:relative}.te-popup-add-table .te-table-body{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZmspKREMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgAMSwQgckFvTgAAAABJRU5ErkJggg==)}.te-popup-add-table .te-table-header{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAARCAYAAAAougcOAAAC7mlDQ1BJQ0MgUHJvZmlsZQAAeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UXAeIuJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOklEQVQ4EWO8e/fuPwYGBkYgphlgAZksLCxMMwtABjPR1HSo4aOWkBTKo8E1GlwkhQBJikdT1wgNLgDxKwPzTeWPdAAAAABJRU5ErkJggg==)}.te-popup-add-table .te-selection-area{position:absolute;top:0;left:0;background:#80d2ff;opacity:.3;z-index:999}.te-popup-add-table .te-description{margin:10px 0 0;text-align:center}.te-popup-table-utils{width:120px}.te-popup-table-utils .tui-popup-body{padding:0}.te-popup-table-utils button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:28px;text-align:left;color:#777}.fa-inverse,.mi-inverse,.tui-tooltip{color:#fff}.te-popup-table-utils button:hover{background-color:#f4f4f4}.te-popup-table-utils hr{background-color:#cacaca;border-style:none;height:1px}.te-heading-add{width:auto}.te-heading-add .tui-popup-body{padding:0}.te-heading-add h1,.te-heading-add h2,.te-heading-add h3,.te-heading-add h4,.te-heading-add h5,.te-heading-add h6,.te-heading-add p,.te-heading-add ul{padding:0;margin:0}.te-heading-add ul{list-style:none}.te-heading-add ul li{padding:2px 10px;cursor:pointer}.te-dropdown-toolbar .tui-popup-body,.tui-popup-color{padding:0}.te-heading-add ul li:hover{background-color:#eee}.te-heading-add h1{font-size:24px}.te-heading-add h2{font-size:22px}.te-heading-add h3{font-size:20px}.te-heading-add h4{font-size:18px}.te-heading-add h5{font-size:16px}.te-heading-add h6{font-size:14px}.te-dropdown-toolbar{position:absolute;width:auto}.tui-popup-color .tui-colorpicker-container,.tui-popup-color .tui-colorpicker-palette-container{width:144px}.tui-popup-color .tui-colorpicker-container ul{width:144px;margin-bottom:8px}.tui-popup-color .tui-colorpicker-container li{padding:0 1px 1px 0}.tui-popup-color .tui-colorpicker-container li .tui-colorpicker-palette-button{border:0;width:17px;height:17px}.tui-popup-color .tui-popup-body{padding:10px}.tui-popup-color .te-apply-button,.tui-popup-color .tui-colorpicker-palette-hex{float:right}.tui-popup-color .te-apply-button{height:21px;width:35px;background:#fff;border:1px solid #efefef;position:absolute;bottom:141px;right:10px}.tui-tooltip,.tui-tooltip .arrow{background-color:#222;position:absolute}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-hex{border:1px solid #E1E1E1;padding:3px 14px;margin-left:-1px}.tui-popup-color .tui-colorpicker-container div.tui-colorpicker-clearfix{display:inline-block}.tui-popup-color .tui-colorpicker-container .tui-colorpicker-palette-preview{width:19px;height:19px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-slider-right{width:22px}.tui-popup-color .tui-colorpicker-slider-container .tui-colorpicker-huebar-handle{display:none}.tui-tooltip{z-index:999;opacity:.8;padding:2px 5px;font-size:10px}.tui-tooltip .arrow{content:"";display:inline-block;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:-3px;left:6px;z-index:-1}.tui-toolbar-icons{background:url(tui-editor.png);background-size:218px 188px;display:inline-block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.tui-toolbar-icons{background:url(tui-editor-2x.png);background-size:218px 188px;display:inline-block}}.tui-toolbar-icons.tui-heading{background-position:-172px -48px}.tui-toolbar-icons.tui-heading:disabled{background-position:-193px -48px}.tui-toolbar-icons.tui-bold{background-position:-4px -4px}.tui-toolbar-icons.tui-bold:disabled{background-position:-25px -4px}.tui-toolbar-icons.tui-italic{background-position:-4px -48px}.tui-toolbar-icons.tui-italic:disabled{background-position:-25px -48px}.tui-toolbar-icons.tui-color{background-position:-172px -70px}.tui-toolbar-icons.tui-color:disabled{background-position:-193px -70px}.tui-toolbar-icons.tui-strike{background-position:-4px -26px}.tui-toolbar-icons.tui-strike:disabled{background-position:-25px -26px}.tui-toolbar-icons.tui-hrline{background-position:-46px -92px}.tui-toolbar-icons.tui-hrline:disabled{background-position:-67px -92px}.tui-toolbar-icons.tui-quote{background-position:-4px -114px}.tui-toolbar-icons.tui-quote:disabled{background-position:-25px -114px}.tui-toolbar-icons.tui-ul{background-position:-46px -4px}.tui-toolbar-icons.tui-ul:disabled{background-position:-67px -4px}.tui-toolbar-icons.tui-ol{background-position:-46px -26px}.tui-toolbar-icons.tui-ol:disabled{background-position:-67px -26px}.tui-toolbar-icons.tui-task{background-position:-130px -48px}.tui-toolbar-icons.tui-task:disabled{background-position:-151px -48px}.tui-toolbar-icons.tui-indent{background-position:-46px -48px}.tui-toolbar-icons.tui-indent:disabled{background-position:-67px -48px}.tui-toolbar-icons.tui-outdent{background-position:-46px -70px}.tui-toolbar-icons.tui-outdent:disabled{background-position:-67px -70px}.tui-toolbar-icons.tui-table{background-position:-88px -92px}.tui-toolbar-icons.tui-table:disabled{background-position:-109px -92px}.tui-toolbar-icons.tui-image{background-position:-130px -4px}.tui-toolbar-icons.tui-image:disabled{background-position:-151px -4px}.tui-toolbar-icons.tui-link{background-position:-130px -26px}.tui-toolbar-icons.tui-link:disabled{background-position:-151px -26px}.tui-toolbar-icons.tui-code{background-position:-130px -92px}.tui-toolbar-icons.tui-code:disabled{background-position:-151px -92px}.tui-toolbar-icons.tui-codeblock{background-position:-130px -70px}.tui-toolbar-icons.tui-codeblock:disabled{background-position:-151px -70px}.tui-toolbar-icons.tui-more{background-position:-172px -92px}.tui-toolbar-icons.tui-more:disabled{background-position:-193px -92px}.tui-colorpicker-svg-huebar,.tui-colorpicker-svg-slider,.tui-colorpicker-vml-slider{border:1px solid #ebebeb}.CodeMirror-sizer{margin-top:6px}.CodeMirror .cm-header{font-weight:700;color:inherit}.CodeMirror .cm-header-1{font-size:24px}.CodeMirror .cm-header-2{font-size:22px}.CodeMirror .cm-header-3{font-size:20px}.CodeMirror .cm-header-4{font-size:18px}.CodeMirror .cm-header-5{font-size:16px}.CodeMirror .cm-header-6{font-size:14px}.CodeMirror .cm-variable-2{color:inherit}.tui-editor-pseudo-clipboard{position:fixed;left:-1000px;top:-1000px;width:100px;height:100px}.te-ww-block-overlay.code-block-header{text-align:right}.te-ww-block-overlay.code-block-header span{font-size:10px;font-weight:600;padding:0 10px;color:#333;cursor:default}.te-ww-block-overlay.code-block-header button{margin:8px;font-size:10px;color:#333;background-color:#f9f9f9;border:1px solid #ddd;padding:4px;height:auto}.te-popup-code-block-languages{position:fixed;box-sizing:border-box;width:130px}.te-popup-code-block-languages .tui-popup-body{max-height:169px;overflow:auto;padding:0}.te-popup-code-block-languages button{width:100%;background-color:#fff;border:none;outline:0;padding:0 10px;font-size:12px;line-height:24px;text-align:left;color:#777}.te-popup-code-block-languages button.active{background-color:#f4f4f4}.tui-popup-code-block-editor .tui-popup-wrapper{width:70%;height:70%;margin:auto;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.te-input-language{position:relative;margin-left:15px;cursor:pointer}.te-input-language input{font-size:10px;padding:3px 5px;border:1px solid #ddd;background-color:#f9f9f9;box-sizing:border-box;width:130px;outline:0}.te-input-language input::-ms-clear{display:none}.te-input-language::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT42Q0NBRDk2QS0yMjYxLTRFNDAtOTk1RC1DRUUyQUREQUQ3NkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLWQtc2lkZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlJlY3RhbmdsZS03IiBwb2ludHM9IjIgNSAxMCA1IDYgMTAiPjwvcG9seWdvbj4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);position:absolute;top:1px;right:3px}.te-input-language.active::after{content:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxMiAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5BNEZDRkIzMy0zNjdBLTREMjAtOEEyNC1DQ0I2ODFBMDZDODg8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbS10cmFuZ2xlLXVwLXNpZGUiIGZpbGw9IiM1NTU1NTUiPiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJSZWN0YW5nbGUtNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC02LjAwMDAwMCwgLTYuNTAwMDAwKSAiIHBvaW50cz0iMiA0IDEwIDQgNiA5Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor button{margin:-1px 3px}.tui-popup-code-block-editor .tui-popup-header-buttons{height:20px}.tui-popup-code-block-editor .popup-editor-toggle-preview::after{content:'Preview off';color:#777;margin-right:22px}.tui-popup-code-block-editor .popup-editor-toggle-preview.active::after{content:'Preview on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-scroll::after{content:'Scroll off';color:#777;margin-right:16px}.tui-popup-code-block-editor .popup-editor-toggle-scroll.active::after{content:'Scroll on';color:#4b96e6}.tui-popup-code-block-editor .popup-editor-toggle-fit{width:18px;height:18px;margin-top:4px;margin-right:14px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT40OUQ4RTYyMy1GRTAyLTQ1RUUtQkQ5Ri0xMjUyQjEzRTU1MkQ8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLWV4cGFuZCIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBhdGggZD0iTTMsMyBMOSwzIEw5LDUgTDUsNSBMNSw5IEwzLDkgTDMsMyBaIE0xNSwxNSBMOSwxNSBMOSwxMyBMMTMsMTMgTDEzLDkgTDE1LDkgTDE1LDE1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDkuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC05LjAwMDAwMCwgLTkuMDAwMDAwKSAiPjwvcGF0aD4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZSIgZmlsbC1ydWxlPSJub256ZXJvIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS41MDAwMDAsIDYuNTAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMS41MDAwMDAsIC02LjUwMDAwMCkgIiBwb2ludHM9IjkuMDg1Nzg2NDQgNS41IDEyLjUgOC45MTQyMTM1NiAxMy45MTQyMTM2IDcuNSAxMC41IDQuMDg1Nzg2NDQiPjwvcG9seWdvbj4gICAgICAgICAgICA8cG9seWdvbiBpZD0iTGluZS1Db3B5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuNTAwMDAwLCAxMS41MDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTYuNTAwMDAwLCAtMTEuNTAwMDAwKSAiIHBvaW50cz0iNC4wODU3ODY0NCAxMC41IDcuNSAxMy45MTQyMTM2IDguOTE0MjEzNTYgMTIuNSA1LjUgOS4wODU3ODY0NCI+PC9wb2x5Z29uPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+)}.tui-popup-code-block-editor .popup-editor-toggle-fit.active{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT4wN0Q1MjlCRi1GNTIzLTREN0EtQTlGNi05NTUzNTU5RDNEMUE8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggc2tldGNodG9vbC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImNvbnRlbnRzLXJlZHVjZSIgZmlsbD0iIzU1NTU1NSI+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzIiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDEyLjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtNS41MDAwMDAsIC0xMi41MDAwMDApICIgcG9pbnRzPSIzLjA4NTc4NjQ0IDExLjUgNi41IDE0LjkxNDIxMzYgNy45MTQyMTM1NiAxMy41IDQuNSAxMC4wODU3ODY0Ij48L3BvbHlnb24+ICAgICAgICAgICAgPHBhdGggZD0iTTksOSBMMTUsOSBMMTUsMTEgTDExLDExIEwxMSwxNSBMOSwxNSBMOSw5IFogTTksOSBMMyw5IEwzLDcgTDcsNyBMNywzIEw5LDMgTDksOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCA5LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOS4wMDAwMDAsIC05LjAwMDAwMCkgIj48L3BhdGg+ICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtMzMiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNTAwMDAwLCA1LjUwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTIuNTAwMDAwLCAtNS41MDAwMDApICIgcG9pbnRzPSIxNC45MTQyMTM2IDYuNSAxMS41IDMuMDg1Nzg2NDQgMTAuMDg1Nzg2NCA0LjUgMTMuNSA3LjkxNDIxMzU2Ij48L3BvbHlnb24+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=)}.tui-popup-code-block-editor .tui-popup-close-button{margin-top:6px}.tui-popup-code-block-editor .tui-popup-body{z-index:-1;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1;flex:1}.tui-split-scroll.single-content .tui-split-content-right,.tui-split-scroll.single-content .tui-splitter,.tui-split-scroll.single-content button.tui-scrollsync{display:none}.tui-popup-code-block-editor .popup-editor-body{position:relative;-ms-flex:1;flex:1;border-bottom:1px solid #cacaca}.tui-popup-code-block-editor .te-button-section{padding:15px}.tui-popup-code-block-editor .te-button-section button{float:left}.tui-popup-code-block-editor .tui-editor-contents pre{margin:0;background-color:transparent}.tui-popup-code-block-editor .CodeMirror{height:auto}.tui-popup-code-block-editor .CodeMirror-line{font-family:Consolas,Courier,"Apple SD 산돌고딕 Neo",-apple-system,"Lucida Grande","Apple SD Gothic Neo","맑은 고딕","Malgun Gothic","Segoe UI","돋움",dotum,sans-serif;font-size:13px;line-height:160%;letter-spacing:-.3px}.tui-popup-code-block-editor .popup-editor-editor-wrapper{min-height:100%}.tui-split-scroll-wrapper{position:relative}.tui-split-scroll{position:absolute}.tui-split-scroll,.tui-split-scroll-wrapper{width:100%;height:100%}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{position:absolute;top:0;width:50%;box-sizing:border-box}.tui-split-scroll .tui-split-content-left{left:0}.tui-split-scroll .tui-split-content-right{left:50%}.tui-split-scroll .tui-splitter{position:absolute;left:50%;top:0;height:100%;width:1px;border-left:1px solid #cacaca}.tui-split-scroll .tui-split-scroll-content{width:100%;height:100%;overflow:hidden;position:relative}.tui-split-scroll .tui-split-content-left,.tui-split-scroll .tui-split-content-right{height:100%;overflow-x:hidden;overflow-y:auto}.tui-split-scroll button.tui-scrollsync{top:10px;opacity:.2}.tui-split-scroll button.tui-scrollsync::after{content:"scroll off"}.tui-split-scroll.scroll-sync button.tui-scrollsync{opacity:.5}.tui-split-scroll.scroll-sync .tui-split-content-left,.tui-split-scroll.scroll-sync .tui-split-content-right{height:auto;overflow:initial}.tui-split-scroll.scroll-sync button.tui-scrollsync::after{content:"scroll on"}.tui-split-scroll.scroll-sync .tui-split-scroll-content{overflow-y:auto}.tui-split-scroll.single-content .tui-split-content-left{width:100%}.fa,.fa-stack,.fab,.fad,.fal,.far,.fas,.mi,.mi-stack{display:inline-block}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@supports (-ms-accelerator:true){.tui-split-scroll-wrapper .tui-splitter{left:calc(50% - 9px)}}@media screen and (max-width:480px){.tui-popup-wrapper{max-width:300px}.tui-editor-popup{margin-left:-150px}.te-dropdown-toolbar{max-width:none}}/*! * Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x,.fa-stack-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{margin-left:2.5em}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.mi-stack,.mi-ul>li{position:relative}.fa-stack-1x{line-height:inherit}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}/*! + */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x,.fa-stack-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{margin-left:2.5em}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{height:2em;line-height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.mi-stack,.mi-ul>li{position:relative}.fa-stack-1x{line-height:inherit}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}/*! * License - Micon v3.0.168 http://xtoolkit.github.io/Micon/ (MIT License) * License - template: https://fontawesome.com/license/free (Code: MIT License) - */@font-face{font-family:micon;font-style:normal;font-weight:400;src:url(../fonts/micon.eot);src:url(../fonts/micon.eot?#iefix) format("embedded-opentype"),url(../fonts/micon.woff2) format("woff2"),url(../fonts/micon.woff) format("woff"),url(../fonts/micon.ttf) format("truetype"),url(../fonts/micon.svg#micon) format("svg")}.mi{font-family:micon;font-weight:400;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.mi-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.mi-xs{font-size:.75em}.mi-sm{font-size:.875em}.mi-1x{font-size:1em}.mi-2x,.mi-stack-2x{font-size:2em}.mi-3x{font-size:3em}.mi-4x{font-size:4em}.mi-5x{font-size:5em}.mi-6x{font-size:6em}.mi-7x{font-size:7em}.mi-8x{font-size:8em}.mi-9x{font-size:9em}.mi-10x{font-size:10em}.mi-fw{text-align:center;width:1.25em}.mi-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.mi-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.mi-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.mi-pull-left{float:left}.mi-pull-right{float:right}.mi.mi-pull-left{margin-right:.3em}.mi.mi-pull-right{margin-left:.3em}.mi-spin{animation:mi-spin 2s infinite linear}.mi-pulse{animation:mi-spin 1s infinite steps(8)}@keyframes mi-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.mi-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.mi-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.mi-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.mi-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scale(-1,1)}.mi-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(1,-1)}.mi-flip-horizontal.mi-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(-1,-1)}:root .mi-flip-horizontal,:root .mi-flip-vertical,:root .mi-rotate-180,:root .mi-rotate-270,:root .mi-rotate-90{filter:none}.mi-stack{height:2em;line-height:2em;vertical-align:middle;width:2.5em}.mi-stack-1x,.mi-stack-2x{left:0;position:absolute;text-align:center;width:100%}.mi-stack-1x{line-height:inherit}.mi-Accept:before,.mi-AcceptLegacy:before,.mi-CheckmarkListviewLegacy:before,.mi-CheckmarkMenuLegacy:before{content:"\EA01"}.mi-Accident:before{content:"\EA02"}.mi-AccidentSolid:before{content:"\EA03"}.mi-Accounts:before,.mi-AccountsLegacy:before{content:"\EA04"}.mi-ActionCenter:before{content:"\EA05"}.mi-ActionCenterAsterisk:before{content:"\EA06"}.mi-ActionCenterMirrored:before{content:"\EA07"}.mi-ActionCenterNotification:before{content:"\EA08"}.mi-ActionCenterNotificationMirrored:before{content:"\EA09"}.mi-ActionCenterQuiet:before{content:"\EA0A"}.mi-ActionCenterQuietNotification:before{content:"\EA0B"}.mi-Add:before,.mi-AddLegacy:before{content:"\EA0C"}.mi-AddFriend:before,.mi-AddFriendLegacy:before{content:"\EA0D"}.mi-AddRemoteDevice:before{content:"\EA0E"}.mi-AddSurfaceHub:before{content:"\EA0F"}.mi-AddTo:before{content:"\EA10"}.mi-AdjustHologram:before{content:"\EA11"}.mi-Admin:before,.mi-AdminLegacy:before{content:"\EA12"}.mi-Airplane:before{content:"\EA13"}.mi-AirplaneSolid:before{content:"\EA14"}.mi-AlignCenter:before,.mi-AlignCenterLegacy:before{content:"\EA15"}.mi-AlignLeft:before,.mi-AlignLeftLegacy:before{content:"\EA16"}.mi-AlignRight:before,.mi-AlignRightLegacy:before{content:"\EA17"}.mi-AllApps:before,.mi-AllAppsLegacy:before{content:"\EA18"}.mi-AllAppsLegacyMirrored:before,.mi-AllAppsMirrored:before{content:"\EA19"}.mi-Annotation:before{content:"\EA1A"}.mi-AppIconDefault:before{content:"\EA1B"}.mi-Apps:before{content:"\EA1C"}.mi-AreaChart:before{content:"\EA1D"}.mi-ArrowDown8:before{content:"\EA1E"}.mi-ArrowLeft8:before{content:"\EA1F"}.mi-ArrowRight8:before{content:"\EA20"}.mi-ArrowUp8:before{content:"\EA21"}.mi-AspectRatio:before{content:"\EA22"}.mi-Asterisk:before{content:"\EA23"}.mi-AsteriskBadge12:before{content:"\EA24"}.mi-Attach:before,.mi-AttachLegacy:before{content:"\EA25"}.mi-AttachCamera:before,.mi-AttachCameraLegacy:before{content:"\EA26"}.mi-Audio:before,.mi-AudioLegacy:before{content:"\EA27"}.mi-ArrowHTMLLegacy:before,.mi-Back:before,.mi-BackBttnArrow20Legacy:before,.mi-BackBttnArrow42Legacy:before,.mi-BackLegacy:before{content:"\EA28"}.mi-BackMirrored:before{content:"\EA29"}.mi-BackSpaceQWERTYLg:before{content:"\EA2B"}.mi-BackSpaceQWERTYMd:before{content:"\EA2C"}.mi-BackSpaceQWERTYSm:before{content:"\EA2D"}.mi-BackToWindow:before,.mi-BackToWindowLegacy:before{content:"\EA2E"}.mi-BackgroundToggle:before{content:"\EA2F"}.mi-Badge:before{content:"\EA30"}.mi-BandBattery0:before{content:"\EA31"}.mi-BandBattery1:before{content:"\EA32"}.mi-BandBattery2:before{content:"\EA33"}.mi-BandBattery3:before{content:"\EA34"}.mi-BandBattery4:before{content:"\EA35"}.mi-BandBattery5:before{content:"\EA36"}.mi-BandBattery6:before{content:"\EA37"}.mi-Bank:before{content:"\EA38"}.mi-BarcodeScanner:before{content:"\EA39"}.mi-Battery0:before{content:"\EA3A"}.mi-Battery1:before{content:"\EA3B"}.mi-Battery10:before{content:"\EA3C"}.mi-Battery2:before{content:"\EA3D"}.mi-Battery3:before{content:"\EA3E"}.mi-Battery4:before{content:"\EA3F"}.mi-Battery5:before{content:"\EA40"}.mi-Battery6:before{content:"\EA41"}.mi-Battery7:before{content:"\EA42"}.mi-Battery8:before{content:"\EA43"}.mi-Battery9:before{content:"\EA44"}.mi-BatteryCharging0:before{content:"\EA45"}.mi-BatteryCharging1:before{content:"\EA46"}.mi-BatteryCharging10:before{content:"\EA47"}.mi-BatteryCharging2:before{content:"\EA48"}.mi-BatteryCharging3:before{content:"\EA49"}.mi-BatteryCharging4:before{content:"\EA4A"}.mi-BatteryCharging5:before{content:"\EA4B"}.mi-BatteryCharging6:before{content:"\EA4C"}.mi-BatteryCharging7:before{content:"\EA4D"}.mi-BatteryCharging8:before{content:"\EA4E"}.mi-BatteryCharging9:before{content:"\EA4F"}.mi-BatterySaver0:before{content:"\EA50"}.mi-BatterySaver1:before{content:"\EA51"}.mi-BatterySaver10:before{content:"\EA52"}.mi-BatterySaver2:before{content:"\EA53"}.mi-BatterySaver3:before{content:"\EA54"}.mi-BatterySaver4:before{content:"\EA55"}.mi-BatterySaver5:before{content:"\EA56"}.mi-BatterySaver6:before{content:"\EA57"}.mi-BatterySaver7:before{content:"\EA58"}.mi-BatterySaver8:before{content:"\EA59"}.mi-BatterySaver9:before{content:"\EA5A"}.mi-BatteryUnknown:before{content:"\EA5B"}.mi-Beta:before{content:"\EA5C"}.mi-BidiLtr:before{content:"\EA5D"}.mi-BidiRtl:before{content:"\EA5E"}.mi-BlockContact:before,.mi-BlockContactLegacy:before{content:"\EA5F"}.mi-Blocked:before,.mi-BlockedLegacy:before{content:"\EA61"}.mi-BlueLight:before{content:"\EA62"}.mi-Bluetooth:before{content:"\EA63"}.mi-BodyCam:before{content:"\EA64"}.mi-Bold:before,.mi-BoldLegacy:before{content:"\EA65"}.mi-BoldF:before,.mi-BoldFLegacy:before{content:"\EA67"}.mi-BoldG:before,.mi-BoldGLegacy:before{content:"\EA69"}.mi-BoldKorean:before,.mi-BoldKoreanLegacy:before{content:"\EA6B"}.mi-BoldN:before,.mi-BoldNLegacy:before{content:"\EA6D"}.mi-BoldRussion:before,.mi-BoldRussionLegacy:before{content:"\EA6F"}.mi-Bookmarks:before,.mi-BookmarksLegacy:before{content:"\EA70"}.mi-BookmarksLegacyMirrored:before,.mi-BookmarksMirrored:before{content:"\EA71"}.mi-Brightness:before{content:"\EA72"}.mi-Broom:before{content:"\EA73"}.mi-BrowsePhotos:before,.mi-BrowsePhotosLegacy:before{content:"\EA74"}.mi-BrushSize:before{content:"\EA75"}.mi-Bug:before{content:"\EA76"}.mi-BuildingEnergy:before{content:"\EA77"}.mi-BulletedList:before,.mi-BulletedListLegacy:before,.mi-ListLegacy:before{content:"\EA78"}.mi-BulletedListLegacyMirrored:before,.mi-BulletedListMirrored:before,.mi-ListLegacyMirrored:before{content:"\EA79"}.mi-Bullseye:before{content:"\EA7A"}.mi-BumperLeft:before{content:"\EA7B"}.mi-BumperRight:before{content:"\EA7C"}.mi-Bus:before{content:"\EA7D"}.mi-BusSolid:before{content:"\EA7E"}.mi-ButtonA:before{content:"\EA7F"}.mi-ButtonB:before{content:"\EA80"}.mi-ButtonMenu:before{content:"\EA81"}.mi-ButtonView2:before{content:"\EA82"}.mi-ButtonX:before{content:"\EA83"}.mi-ButtonY:before{content:"\EA84"}.mi-CC:before,.mi-CCLegacy:before{content:"\EA85"}.mi-CCEuro:before,.mi-CCEuroLegacy:before{content:"\EA87"}.mi-CCJapan:before,.mi-CCJapanLegacy:before{content:"\EA89"}.mi-Cafe:before{content:"\EA8A"}.mi-Calculator:before,.mi-CalculatorLegacy:before{content:"\EA8B"}.mi-CalculatorAddition:before{content:"\EA8C"}.mi-BackSpaceQWERTY:before,.mi-CalculatorBackspace:before{content:"\EA8D"}.mi-CalculatorDivide:before{content:"\EA8E"}.mi-CalculatorEqualTo:before{content:"\EA8F"}.mi-CalculatorMultiply:before{content:"\EA90"}.mi-CalculatorNegate:before{content:"\EA91"}.mi-CalculatorPercentage:before{content:"\EA92"}.mi-CalculatorSquareroot:before{content:"\EA93"}.mi-CalculatorSubtract:before{content:"\EA94"}.mi-Calendar:before,.mi-CalendarLegacy:before{content:"\EA95"}.mi-CalendarDay:before,.mi-CalendarDayLegacy:before{content:"\EA96"}.mi-CalendarLegacyMirrored:before,.mi-CalendarMirrored:before{content:"\EA97"}.mi-CalendarReply:before,.mi-CalendarReplyLegacy:before{content:"\EA98"}.mi-CalendarSolid:before{content:"\EA99"}.mi-CalendarWeek:before,.mi-CalendarWeekLegacy:before{content:"\EA9A"}.mi-CallForwardInternational:before{content:"\EA9B"}.mi-CallForwardInternationalMirrored:before{content:"\EA9C"}.mi-CallForwardRoaming:before{content:"\EA9D"}.mi-CallForwardRoamingMirrored:before{content:"\EA9E"}.mi-CallForwarding:before{content:"\EA9F"}.mi-CallForwardingMirrored:before{content:"\EAA0"}.mi-CalligraphyFill:before{content:"\EAA1"}.mi-CalligraphyPen:before{content:"\EAA2"}.mi-Calories:before{content:"\EAA3"}.mi-Camera:before,.mi-CameraLegacy:before{content:"\EAA4"}.mi-Cancel:before,.mi-CancelLegacy:before{content:"\EAA5"}.mi-Caption:before,.mi-CaptionLegacy:before{content:"\EAA6"}.mi-Car:before,.mi-DrivingMode:before{content:"\EAA7"}.mi-CaretBottomRightSolidCenter8:before{content:"\EAA8"}.mi-CaretDownSolid8:before{content:"\EAA9"}.mi-CaretLeftSolid8:before{content:"\EAAA"}.mi-CaretRight8:before{content:"\EAAB"}.mi-CaretRightSolid8:before{content:"\EAAC"}.mi-CaretUpSolid8:before{content:"\EAAD"}.mi-CashDrawer:before{content:"\EAAE"}.mi-CellPhone:before,.mi-CellPhoneLegacy:before,.mi-MobileContactLegacy:before{content:"\EAAF"}.mi-Certificate:before{content:"\EAB0"}.mi-CharacterAppearance:before{content:"\EAB1"}.mi-Characters:before,.mi-CharactersLegacy:before{content:"\EAB2"}.mi-ChatBubbles:before{content:"\EAB3"}.mi-CheckList:before{content:"\EAB4"}.mi-CheckMark:before,.mi-CheckMarkLegacy:before,.mi-CheckMarkZeroWidthLegacy:before{content:"\EAB5"}.mi-Checkbox:before,.mi-CheckboxLegacy:before{content:"\EAB6"}.mi-Checkbox14:before{content:"\EAB7"}.mi-CheckboxComposite:before,.mi-CheckboxCompositeLegacy:before{content:"\EAB8"}.mi-CheckboxComposite14:before{content:"\EAB9"}.mi-CheckboxCompositeReversed:before,.mi-CheckboxCompositeReversedLegacy:before{content:"\EABA"}.mi-CheckboxIndeterminate:before,.mi-CheckboxIndeterminateLegacy:before{content:"\EABC"}.mi-CheckboxIndeterminateCombo:before{content:"\EABD"}.mi-CheckboxIndeterminateCombo14:before{content:"\EABE"}.mi-ChecklistMirrored:before{content:"\EABF"}.mi-ChevronDown1Legacy:before,.mi-ChevronDown2Legacy:before,.mi-ChevronDown3Legacy:before,.mi-ChevronDown4Legacy:before,.mi-ChevronDown:before,.mi-ChevronFlipDownLegacy:before,.mi-ScrollChevronDownBoldLegacy:before,.mi-ScrollChevronDownLegacy:before{content:"\EAC0"}.mi-ChevronDownMed:before{content:"\EAC1"}.mi-ChevronDownSmLegacy:before,.mi-ChevronDownSmall:before{content:"\EAC2"}.mi-ChevronFlipLeftLegacy:before,.mi-ChevronLeft1Legacy:before,.mi-ChevronLeft2Legacy:before,.mi-ChevronLeft3Legacy:before,.mi-ChevronLeft4Legacy:before,.mi-ChevronLeft:before,.mi-ScrollChevronLeftBoldLegacy:before,.mi-ScrollChevronLeftLegacy:before{content:"\EAC3"}.mi-ChevronLeftMed:before{content:"\EAC4"}.mi-ChevronLeftSmLegacy:before,.mi-ChevronLeftSmall:before{content:"\EAC5"}.mi-ChevronFlipRightLegacy:before,.mi-ChevronRight1Legacy:before,.mi-ChevronRight2Legacy:before,.mi-ChevronRight3Legacy:before,.mi-ChevronRight4Legacy:before,.mi-ChevronRight:before,.mi-ScrollChevronRightBoldLegacy:before,.mi-ScrollChevronRightLegacy:before{content:"\EAC6"}.mi-ChevronRightMed:before{content:"\EAC7"}.mi-ChevronRightSmLegacy:before,.mi-ChevronRightSmall:before{content:"\EAC8"}.mi-ChevronFlipUpLegacy:before,.mi-ChevronUp1Legacy:before,.mi-ChevronUp2Legacy:before,.mi-ChevronUp3Legacy:before,.mi-ChevronUp4Legacy:before,.mi-ChevronUp:before,.mi-ScrollChevronUpBoldLegacy:before,.mi-ScrollChevronUpLegacy:before{content:"\EAC9"}.mi-ChevronUpMed:before{content:"\EACA"}.mi-ChevronUpSmall:before{content:"\EACB"}.mi-ChineseBoPoMoFo:before{content:"\EACC"}.mi-ChineseChangjie:before{content:"\EACD"}.mi-ChinesePinyin:before{content:"\EACE"}.mi-ChinesePunctuation:before{content:"\EACF"}.mi-ChineseQuick:before{content:"\EAD0"}.mi-ChipCardCreditCardReader:before{content:"\EAD1"}.mi-ChromeAnnotate:before{content:"\EAD2"}.mi-ChromeAnnotateContrast:before{content:"\EAD3"}.mi-ChromeBack:before{content:"\EAD4"}.mi-ChromeBackContrast:before{content:"\EAD5"}.mi-ChromeBackContrastMirrored:before{content:"\EAD6"}.mi-ChromeBackMirrored:before{content:"\EAD7"}.mi-ChromeBackToWindow:before{content:"\EAD8"}.mi-ChromeBackToWindowContrast:before{content:"\EAD9"}.mi-ChromeClose:before{content:"\EADA"}.mi-ChromeCloseContrast:before{content:"\EADB"}.mi-ChromeFullScreen:before{content:"\EADC"}.mi-ChromeFullScreenContrast:before{content:"\EADD"}.mi-ChromeMaximize:before{content:"\EADE"}.mi-ChromeMaximizeContrast:before{content:"\EADF"}.mi-ChromeMinimize:before{content:"\EAE0"}.mi-ChromeMinimizeContrast:before{content:"\EAE1"}.mi-ChromeRestore:before{content:"\EAE2"}.mi-ChromeRestoreContrast:before{content:"\EAE3"}.mi-ChromeSwitch:before{content:"\EAE4"}.mi-ChromeSwitchContast:before{content:"\EAE5"}.mi-CircleFill:before{content:"\EAE6"}.mi-CircleFillBadge12:before{content:"\EAE7"}.mi-CircleRing:before{content:"\EAE8"}.mi-CircleRingBadge12:before{content:"\EAE9"}.mi-CityNext:before{content:"\EAEA"}.mi-CityNext2:before{content:"\EAEB"}.mi-Clear:before,.mi-ClearLegacy:before{content:"\EAEC"}.mi-ClearAllInk:before{content:"\EAED"}.mi-ClearAllInkMirrored:before{content:"\EAEE"}.mi-ClearSelection:before,.mi-ClearSelectionLegacy:before{content:"\EAEF"}.mi-ClearSelectionLegacyMirrored:before,.mi-ClearSelectionMirrored:before{content:"\EAF0"}.mi-Click:before{content:"\EAF1"}.mi-ClipboardList:before{content:"\EAF2"}.mi-ClipboardListMirrored:before{content:"\EAF3"}.mi-ClippingTool:before{content:"\EAF4"}.mi-Clock:before,.mi-ClockLegacy:before{content:"\EAF6"}.mi-ClosePane:before,.mi-ClosePaneLegacy:before{content:"\EAF7"}.mi-ClosePaneLegacyMirrored:before,.mi-ClosePaneMirrored:before{content:"\EAF8"}.mi-Cloud:before{content:"\EAF9"}.mi-CloudPrinter:before{content:"\EAFA"}.mi-CloudSeach:before{content:"\EAFB"}.mi-Code:before{content:"\EAFC"}.mi-CollapseContent:before{content:"\EAFD"}.mi-CollapseContentSingle:before{content:"\EAFE"}.mi-CollateLandscape:before{content:"\EAFF"}.mi-CollateLandscapeSeparated:before{content:"\EB00"}.mi-CollatePortrait:before{content:"\EB01"}.mi-CollatePortraitSeparated:before{content:"\EB02"}.mi-Color:before,.mi-ColorLegacy:before{content:"\EB03"}.mi-ColorOff:before{content:"\EB04"}.mi-CommaKey:before{content:"\EB05"}.mi-CommandPrompt:before{content:"\EB06"}.mi-Comment:before,.mi-CommentLegacy:before{content:"\EB07"}.mi-Communications:before{content:"\EB08"}.mi-CompanionApp:before{content:"\EB09"}.mi-CompanionDeviceFramework:before{content:"\EB0A"}.mi-Completed:before{content:"\EB0B"}.mi-CompletedSolid:before{content:"\EB0C"}.mi-Component:before{content:"\EB0D"}.mi-Connect:before{content:"\EB0E"}.mi-ConnectApp:before,.mi-MiracastLogoLarge:before{content:"\EB0F"}.mi-Connected:before{content:"\EB10"}.mi-Construction:before{content:"\EB11"}.mi-ConstructionCone:before{content:"\EB12"}.mi-ConstructionSolid:before{content:"\EB13"}.mi-Contact3Legacy:before,.mi-Contact:before,.mi-ContactLegacy:before{content:"\EB14"}.mi-Contact2:before,.mi-Contact2Legacy:before{content:"\EB15"}.mi-ContactInfo:before,.mi-ContactInfoLegacy:before{content:"\EB16"}.mi-ContactInfoMirrored:before{content:"\EB17"}.mi-ContactPresence:before,.mi-ContactPresenceLegacy:before{content:"\EB18"}.mi-ContactSolid:before{content:"\EB19"}.mi-Copy:before,.mi-CopyLegacy:before{content:"\EB1A"}.mi-CopyTo:before{content:"\EB1B"}.mi-Courthouse:before{content:"\EB1C"}.mi-Crop:before,.mi-CropLegacy:before{content:"\EB1D"}.mi-CtrlSpatialLeft:before{content:"\EB1E"}.mi-CtrlSpatialRight:before{content:"\EB1F"}.mi-Cut:before,.mi-CutLegacy:before{content:"\EB20"}.mi-DMC:before{content:"\EB21"}.mi-DashKey:before{content:"\EB22"}.mi-DataSense:before{content:"\EB23"}.mi-DataSenseBar:before{content:"\EB24"}.mi-DateTime:before{content:"\EB25"}.mi-DateTimeMirrored:before{content:"\EB26"}.mi-DecreaseIndent:before,.mi-DecreaseIndentLegacy:before{content:"\EB28"}.mi-DecreaseIndentLegacyMirrored:before,.mi-DecreaseIndentMirrored:before{content:"\EB2A"}.mi-DefaultAPN:before{content:"\EB2B"}.mi-DefenderApp:before{content:"\EB2C"}.mi-DefenderBadge12:before{content:"\EB2D"}.mi-Delete:before,.mi-DeleteLegacy:before{content:"\EB2E"}.mi-Design:before{content:"\EB2F"}.mi-DetachablePC:before{content:"\EB30"}.mi-DevUpdate:before{content:"\EB31"}.mi-DeveloperTools:before{content:"\EB32"}.mi-DeviceDiscovery:before{content:"\EB33"}.mi-DeviceLaptopNoPic:before{content:"\EB34"}.mi-DeviceLaptopPic:before{content:"\EB35"}.mi-DeviceMonitorLeftPic:before{content:"\EB36"}.mi-DeviceMonitorNoPic:before{content:"\EB37"}.mi-DeviceMonitorRightPic:before{content:"\EB38"}.mi-Devices:before{content:"\EB39"}.mi-Devices3:before{content:"\EB3B"}.mi-Devices4:before{content:"\EB3C"}.mi-Devices2:before,.mi-DevicesLegacy:before{content:"\EB3D"}.mi-Diagnostic:before{content:"\EB3E"}.mi-Dial1:before{content:"\EB3F"}.mi-Dial10:before{content:"\EB40"}.mi-Dial11:before{content:"\EB41"}.mi-Dial12:before{content:"\EB42"}.mi-Dial13:before{content:"\EB43"}.mi-Dial14:before{content:"\EB44"}.mi-Dial15:before{content:"\EB45"}.mi-Dial16:before{content:"\EB46"}.mi-Dial2:before{content:"\EB47"}.mi-Dial3:before{content:"\EB48"}.mi-Dial4:before{content:"\EB49"}.mi-Dial5:before{content:"\EB4A"}.mi-Dial6:before{content:"\EB4B"}.mi-Dial7:before{content:"\EB4C"}.mi-Dial8:before{content:"\EB4D"}.mi-Dial9:before{content:"\EB4E"}.mi-DialShape1:before{content:"\EB4F"}.mi-DialShape2:before{content:"\EB50"}.mi-DialShape3:before{content:"\EB51"}.mi-DialShape4:before{content:"\EB52"}.mi-DialUp:before{content:"\EB53"}.mi-Dialpad:before{content:"\EB54"}.mi-Dictionary:before{content:"\EB55"}.mi-DictionaryAdd:before{content:"\EB56"}.mi-DictionaryCloud:before{content:"\EB57"}.mi-DirectAccess:before{content:"\EB58"}.mi-Directions:before,.mi-DirectionsLegacy:before{content:"\EB59"}.mi-DisableUpdates:before,.mi-DisableUpdatesLegacy:before{content:"\EB5A"}.mi-DisconnectDisplay:before{content:"\EB5B"}.mi-DisconnectDrive:before,.mi-DisconnectDriveLegacy:before{content:"\EB5C"}.mi-Dislike:before,.mi-DislikeLegacy:before{content:"\EB5D"}.mi-Dock:before{content:"\EB5E"}.mi-DockBottom:before,.mi-DockBottomLegacy:before{content:"\EB5F"}.mi-DockLeft:before,.mi-DockLeftLegacy:before{content:"\EB60"}.mi-DockLeftLegacyMirrored:before,.mi-DockLeftMirrored:before{content:"\EB61"}.mi-DockRight:before,.mi-DockRightLegacy:before{content:"\EB62"}.mi-DockRightLegacyMirrored:before,.mi-DockRightMirrored:before{content:"\EB63"}.mi-Document:before,.mi-DocumentLegacy:before{content:"\EB64"}.mi-DoublePinyin:before{content:"\EB65"}.mi-Down:before,.mi-DownLegacy:before{content:"\EB66"}.mi-DownShiftKey:before{content:"\EB67"}.mi-Download:before,.mi-DownloadLegacy:before{content:"\EB68"}.mi-DownloadMap:before{content:"\EB69"}.mi-Dpad:before{content:"\EB6A"}.mi-Draw:before{content:"\EB6B"}.mi-DrawSolid:before{content:"\EB6C"}.mi-Drop:before{content:"\EB6D"}.mi-DullSound:before{content:"\EB6E"}.mi-DullSoundKey:before{content:"\EB6F"}.mi-DuplexLandscapeOneSided:before{content:"\EB70"}.mi-DuplexLandscapeOneSidedMirrored:before{content:"\EB71"}.mi-DuplexLandscapeTwoSidedLongEdge:before{content:"\EB72"}.mi-DuplexLandscapeTwoSidedLongEdgeMirrored:before{content:"\EB73"}.mi-DuplexLandscapeTwoSidedShortEdge:before{content:"\EB74"}.mi-DuplexLandscapeTwoSidedShortEdgeMirrored:before{content:"\EB75"}.mi-DuplexPortraitOneSided:before{content:"\EB76"}.mi-DuplexPortraitOneSidedMirrored:before{content:"\EB77"}.mi-DuplexPortraitTwoSidedLongEdge:before{content:"\EB78"}.mi-DuplexPortraitTwoSidedLongEdgeMirrored:before{content:"\EB79"}.mi-DuplexPortraitTwoSidedShortEdge:before{content:"\EB7A"}.mi-DuplexPortraitTwoSidedShortEdgeMirrored:before{content:"\EB7B"}.mi-DynamicLock:before{content:"\EB7C"}.mi-EMI:before{content:"\EB7D"}.mi-Ear:before{content:"\EB7E"}.mi-Earbud:before{content:"\EB7F"}.mi-EaseOfAccess:before,.mi-EaseOfAccessLegacy:before{content:"\EB80"}.mi-Edit:before,.mi-EditLegacy:before{content:"\EB81"}.mi-EditLegacyMirrored:before,.mi-EditMirrored:before{content:"\EB82"}.mi-Education:before{content:"\EB83"}.mi-Emoji:before,.mi-EmojiLegacy:before{content:"\EB84"}.mi-Emoji2:before,.mi-Emoji2Legacy:before{content:"\EB85"}.mi-EmojiSwatch:before{content:"\EB86"}.mi-EmojiTabCelebrationObjects:before{content:"\EB87"}.mi-EmojiTabFavorites:before{content:"\EB88"}.mi-EmojiTabFoodPlants:before{content:"\EB89"}.mi-EmojiTabPeople:before{content:"\EB8A"}.mi-EmojiTabSmilesAnimals:before{content:"\EB8B"}.mi-EmojiTabSymbols:before{content:"\EB8C"}.mi-EmojiTabTextSmiles:before{content:"\EB8D"}.mi-EmojiTabTransitPlaces:before{content:"\EB8E"}.mi-EndPointSolid:before{content:"\EB90"}.mi-EnglishPunctuation:before{content:"\EB91"}.mi-Equalizer:before{content:"\EB92"}.mi-EraseTool:before{content:"\EB93"}.mi-EraseToolFill:before{content:"\EB94"}.mi-EraseToolFill2:before{content:"\EB95"}.mi-Error:before{content:"\EB96"}.mi-ErrorBadge:before{content:"\EB97"}.mi-ErrorBadge12:before{content:"\EB98"}.mi-Ethernet:before{content:"\EB99"}.mi-EthernetError:before{content:"\EB9A"}.mi-EthernetWarning:before{content:"\EB9B"}.mi-ExpandTile:before,.mi-ExpandTileLegacy:before{content:"\EB9C"}.mi-ExpandTileLegacyMirrored:before,.mi-ExpandTileMirrored:before{content:"\EB9D"}.mi-ExploitProtectionSettings:before{content:"\EB9E"}.mi-ExploreContent:before{content:"\EB9F"}.mi-ExploreContentSingle:before{content:"\EBA0"}.mi-Export:before,.mi-ImportLegacyMirrored:before,.mi-ImportMirrored:before{content:"\EBA1"}.mi-EyeGaze:before{content:"\EBA2"}.mi-Eyedropper:before{content:"\EBA3"}.mi-Family:before{content:"\EBA4"}.mi-FastForward:before{content:"\EBA5"}.mi-Favicon:before{content:"\EBA6"}.mi-FavoriteList:before{content:"\EBA8"}.mi-FavoriteInlineLegacy:before,.mi-FavoriteStar:before,.mi-OutlineStarLegacy:before,.mi-RatingStarLegacy:before,.mi-Unfavorite2Legacy:before{content:"\EBA9"}.mi-Favorite2Legacy:before,.mi-FavoriteLegacy:before,.mi-FavoriteStarFill:before,.mi-RatingStarFillLegacy:before,.mi-RatingStarFillReducedPaddingHTMLLegacy:before,.mi-RatingStarFillSmallLegacy:before,.mi-RatingStarFillZeroWidthLegacy:before,.mi-SolidStarLegacy:before{content:"\EBAA"}.mi-Feedback:before{content:"\EBAB"}.mi-FeedbackApp:before{content:"\EBAC"}.mi-Ferry:before{content:"\EBAD"}.mi-FerrySolid:before{content:"\EBAE"}.mi-FileExplorer:before{content:"\EBAF"}.mi-FileExplorerApp:before{content:"\EBB0"}.mi-Filter:before,.mi-FilterLegacy:before{content:"\EBB1"}.mi-FingerInking:before{content:"\EBB2"}.mi-Fingerprint:before{content:"\EBB3"}.mi-FitPage:before{content:"\EBB4"}.mi-EndPoint:before,.mi-Flag:before,.mi-FlagLegacy:before{content:"\EBB5"}.mi-Flashlight:before{content:"\EBB6"}.mi-FlickDown:before{content:"\EBB7"}.mi-FlickLeft:before{content:"\EBB8"}.mi-FlickRight:before{content:"\EBB9"}.mi-FlickUp:before{content:"\EBBA"}.mi-Folder:before{content:"\EBBB"}.mi-FolderFill:before,.mi-FolderLegacy:before{content:"\EBBC"}.mi-FolderHorizontal:before{content:"\EBBD"}.mi-FolderOpen:before{content:"\EBBE"}.mi-Font:before,.mi-FontLegacy:before{content:"\EBBF"}.mi-FontColor:before,.mi-FontColorLegacy:before{content:"\EBC0"}.mi-FontColorKorean:before,.mi-FontColorKoreanLegacy:before{content:"\EBC2"}.mi-FontDecrease:before,.mi-FontDecreaseLegacy:before{content:"\EBC3"}.mi-FontIncrease:before,.mi-FontIncreaseLegacy:before{content:"\EBC4"}.mi-FontSize:before,.mi-FontSizeLegacy:before{content:"\EBC5"}.mi-FontStyleKorean:before,.mi-FontStyleKoreanLegacy:before{content:"\EBC7"}.mi-ArrowHTMLLegacyMirrored:before,.mi-BackBttnMirroredArrow20Legacy:before,.mi-BackBttnMirroredArrow42Legacy:before,.mi-Forward:before,.mi-ForwardLegacy:before{content:"\EBC8"}.mi-ForwardMirrored:before{content:"\EBC9"}.mi-ForwardSm:before{content:"\EBCA"}.mi-FourBars:before,.mi-FourBarsLegacy:before{content:"\EBCB"}.mi-FreeFormClipping:before{content:"\EBCC"}.mi-Frigid:before{content:"\EBCD"}.mi-FullAlpha:before{content:"\EBCE"}.mi-FullCircleMask:before{content:"\EBCF"}.mi-FullHiragana:before{content:"\EBD0"}.mi-FullKatakana:before{content:"\EBD1"}.mi-FullScreen:before,.mi-FullScreenLegacy:before{content:"\EBD2"}.mi-FuzzyReading:before{content:"\EBD3"}.mi-GIF:before{content:"\EBD4"}.mi-Game:before{content:"\EBD5"}.mi-GameConsole:before{content:"\EBD6"}.mi-GiftboxOpen:before{content:"\EBD7"}.mi-GlobalNavigationButton:before{content:"\EBD8"}.mi-Globe:before,.mi-GlobeLegacy:before{content:"\EBD9"}.mi-Go:before,.mi-GoLegacy:before{content:"\EBDA"}.mi-GoLegacyMirrored:before,.mi-GoMirrored:before{content:"\EBDB"}.mi-GoToStart:before,.mi-GoToStartLegacy:before{content:"\EBDC"}.mi-GotoToday:before,.mi-GotoTodayLegacy:before{content:"\EBDD"}.mi-GridView:before{content:"\EBDE"}.mi-GripperBarHorizontal:before{content:"\EBDF"}.mi-GripperBarVertical:before{content:"\EBE0"}.mi-GripperResize:before{content:"\EBE1"}.mi-GripperResizeMirrored:before{content:"\EBE2"}.mi-GripperTool:before{content:"\EBE3"}.mi-Groceries:before{content:"\EBE4"}.mi-Group:before{content:"\EBE5"}.mi-GroupList:before{content:"\EBE6"}.mi-GuestUser:before{content:"\EBE7"}.mi-HMD:before{content:"\EBE8"}.mi-HWPInsert:before{content:"\EBE9"}.mi-HWPJoin:before{content:"\EBEA"}.mi-HWPNewLine:before{content:"\EBEB"}.mi-HWPOverwrite:before{content:"\EBEC"}.mi-HWPScratchOut:before{content:"\EBED"}.mi-HWPSplit:before{content:"\EBEE"}.mi-HWPStrikeThrough:before{content:"\EBEF"}.mi-HalfAlpha:before{content:"\EBF0"}.mi-HalfDullSound:before{content:"\EBF1"}.mi-HalfKatakana:before{content:"\EBF2"}.mi-HalfStarLeft:before{content:"\EBF3"}.mi-HalfStarRight:before{content:"\EBF4"}.mi-Handwriting:before{content:"\EBF5"}.mi-HangUp:before,.mi-HangUpLegacy:before{content:"\EBF6"}.mi-HardDrive:before{content:"\EBF7"}.mi-HeadlessDevice:before{content:"\EBF8"}.mi-Headphone:before{content:"\EBF9"}.mi-Headphone0:before{content:"\EBFA"}.mi-Headphone1:before{content:"\EBFB"}.mi-Headphone2:before{content:"\EBFC"}.mi-Headphone3:before{content:"\EBFD"}.mi-Headset:before{content:"\EBFE"}.mi-Health:before{content:"\EBFF"}.mi-Heart:before,.mi-HeartLegacy:before{content:"\EC00"}.mi-HeartBroken:before{content:"\EC01"}.mi-HeartBrokenLegacy:before,.mi-HeartBrokenZeroWidthLegacy:before{content:"\EC02"}.mi-HeartFill:before,.mi-HeartFillLegacy:before,.mi-HeartFillZeroWidthLegacy:before{content:"\EC03"}.mi-Help:before,.mi-HelpLegacy:before{content:"\EC04"}.mi-HelpLegacyMirrored:before,.mi-HelpMirrored:before{content:"\EC05"}.mi-HideBcc:before,.mi-HideBccLegacy:before{content:"\EC06"}.mi-Highlight:before,.mi-HighlightLegacy:before{content:"\EC07"}.mi-HighlightFill:before{content:"\EC08"}.mi-HighlightFill2:before{content:"\EC09"}.mi-History:before{content:"\EC0A"}.mi-HolePunchLandscapeBottom:before{content:"\EC0B"}.mi-HolePunchLandscapeLeft:before{content:"\EC0C"}.mi-HolePunchLandscapeRight:before{content:"\EC0D"}.mi-HolePunchLandscapeTop:before{content:"\EC0E"}.mi-HolePunchOff:before{content:"\EC0F"}.mi-HolePunchPortraitBottom:before{content:"\EC10"}.mi-HolePunchPortraitLeft:before{content:"\EC11"}.mi-HolePunchPortraitRight:before{content:"\EC12"}.mi-HolePunchPortraitTop:before{content:"\EC13"}.mi-HoloLensSelected:before{content:"\EC14"}.mi-Home:before,.mi-HomeLegacy:before{content:"\EC15"}.mi-HomeGroup:before{content:"\EC16"}.mi-HomeSolid:before{content:"\EC17"}.mi-HorizontalTabKey:before{content:"\EC18"}.mi-IBeam:before{content:"\EC19"}.mi-IBeamOutline:before{content:"\EC1A"}.mi-IOT:before{content:"\EC1B"}.mi-ImageExport:before{content:"\EC1C"}.mi-ExportMirrored:before,.mi-Import:before,.mi-ImportLegacy:before{content:"\EC1D"}.mi-ImportAll:before,.mi-ImportAllLegacy:before{content:"\EC1E"}.mi-ImportAllLegacyMirrored:before,.mi-ImportAllMirrored:before{content:"\EC1F"}.mi-Important:before,.mi-ImportantLegacy:before{content:"\EC20"}.mi-ImportantBadge12:before{content:"\EC21"}.mi-InPrivate:before{content:"\EC22"}.mi-IncidentTriangle:before{content:"\EC23"}.mi-IncreaseIndent:before,.mi-IncreaseIndentLegacy:before{content:"\EC25"}.mi-IncreaseIndentLegacyMirrored:before,.mi-IncreaseIndentMirrored:before{content:"\EC27"}.mi-Info:before{content:"\EC28"}.mi-Info2:before{content:"\EC29"}.mi-InfoSolid:before{content:"\EC2A"}.mi-InkingCaret:before{content:"\EC2B"}.mi-InkingColorFill:before{content:"\EC2C"}.mi-InkingColorOutline:before{content:"\EC2D"}.mi-InkingTool:before{content:"\EC2E"}.mi-InkingToolFill:before{content:"\EC2F"}.mi-InkingToolFill2:before{content:"\EC30"}.mi-Input:before{content:"\EC31"}.mi-InsiderHubApp:before{content:"\EC32"}.mi-InteractiveDashboard:before{content:"\EC33"}.mi-Italic:before,.mi-ItalicLegacy:before{content:"\EC34"}.mi-ItalicC:before,.mi-ItalicCLegacy:before{content:"\EC36"}.mi-ItalicI:before,.mi-ItalicILegacy:before{content:"\EC38"}.mi-ItalicK:before,.mi-ItalicKLegacy:before{content:"\EC3A"}.mi-ItalicKorean:before,.mi-ItalicKoreanLegacy:before{content:"\EC3C"}.mi-ItalicRussian:before,.mi-ItalicRussianLegacy:before{content:"\EC3E"}.mi-Japanese:before{content:"\EC3F"}.mi-JpnRomanji:before{content:"\EC40"}.mi-JpnRomanjiLock:before{content:"\EC41"}.mi-JpnRomanjiShift:before{content:"\EC42"}.mi-JpnRomanjiShiftLock:before{content:"\EC43"}.mi-Key12On:before{content:"\EC44"}.mi-Keyboard12Key:before{content:"\EC46"}.mi-KeyboardBrightness:before{content:"\EC47"}.mi-KeyBoardLegacy:before,.mi-KeyboardClassic:before{content:"\EC48"}.mi-KeyboardDismiss:before{content:"\EC49"}.mi-KeyboardDock:before{content:"\EC4A"}.mi-KeyboardFull:before{content:"\EC4B"}.mi-KeyboardLeftAligned:before{content:"\EC4C"}.mi-KeyboardLeftDock:before{content:"\EC4D"}.mi-KeyboardLeftHanded:before{content:"\EC4E"}.mi-KeyboardLowerBrightness:before{content:"\EC4F"}.mi-KeyboardNarrow:before{content:"\EC50"}.mi-KeyboardOneHanded:before{content:"\EC51"}.mi-KeyboardRightAligned:before{content:"\EC52"}.mi-KeyboardRightDock:before{content:"\EC53"}.mi-KeyboardRightHanded:before{content:"\EC54"}.mi-KeyboardSettings:before{content:"\EC55"}.mi-KeyboardShortcut:before{content:"\EC56"}.mi-KeyboardSplit:before,.mi-KeyboardSplitLegacy:before{content:"\EC57"}.mi-KeyboardStandard:before,.mi-KeyboardStandardLegacy:before{content:"\EC58"}.mi-KeyboardUndock:before{content:"\EC59"}.mi-KnowledgeArticle:before{content:"\EC5A"}.mi-Korean:before{content:"\EC5B"}.mi-LEDLight:before{content:"\EC5C"}.mi-Label:before{content:"\EC5D"}.mi-LandscapeOrientation:before{content:"\EC5E"}.mi-LandscapeOrientationMirrored:before{content:"\EC5F"}.mi-LangJPN:before{content:"\EC60"}.mi-LanguageChs:before{content:"\EC61"}.mi-LanguageCht:before{content:"\EC62"}.mi-LanguageJpn:before{content:"\EC63"}.mi-LanguageKor:before{content:"\EC64"}.mi-LaptopSecure:before{content:"\EC65"}.mi-LaptopSelected:before{content:"\EC66"}.mi-LargeErase:before{content:"\EC67"}.mi-Layout:before,.mi-LayoutLegacy:before{content:"\EC69"}.mi-Leaf:before{content:"\EC6A"}.mi-LeaveChat:before,.mi-LeaveChatLegacy:before{content:"\EC6B"}.mi-LeaveChatMirrored:before{content:"\EC6C"}.mi-LeftArrowKeyTime0:before{content:"\EC6D"}.mi-LeftDoubleQuote:before{content:"\EC6E"}.mi-LeftQuote:before{content:"\EC6F"}.mi-LeftStick:before{content:"\EC70"}.mi-Lexicon:before{content:"\EC71"}.mi-Library:before,.mi-LibraryLegacy:before{content:"\EC72"}.mi-Light:before{content:"\EC73"}.mi-LightningBolt:before{content:"\EC75"}.mi-Like:before,.mi-LikeInlineLegacy:before,.mi-LikeLegacy:before{content:"\EC76"}.mi-LikeDislike:before,.mi-LikeDislikeLegacy:before{content:"\EC77"}.mi-LineDisplay:before{content:"\EC78"}.mi-Link:before,.mi-LinkLegacy:before{content:"\EC79"}.mi-List:before{content:"\EC7A"}.mi-ListMirrored:before{content:"\EC7B"}.mi-Location:before,.mi-LocationLegacy:before{content:"\EC7C"}.mi-Lock:before,.mi-LockLegacy:before{content:"\EC7D"}.mi-LockFeedback:before{content:"\EC7E"}.mi-LockScreenGlance:before{content:"\EC7F"}.mi-LockscreenDesktop:before{content:"\EC80"}.mi-LowerBrightness:before{content:"\EC81"}.mi-MagStripeReader:before{content:"\EC82"}.mi-Mail:before,.mi-MailLegacy:before{content:"\EC83"}.mi-MailBadge12:before{content:"\EC84"}.mi-MailFill:before,.mi-MailFillLegacy:before,.mi-MailMessageLegacy:before{content:"\EC85"}.mi-MailForward:before,.mi-MailForwardLegacy:before{content:"\EC86"}.mi-MailForwardLegacyMirrored:before,.mi-MailForwardMirrored:before{content:"\EC87"}.mi-MailReply:before,.mi-MailReplyLegacy:before{content:"\EC88"}.mi-MailReplyAll:before,.mi-MailReplyAllLegacy:before{content:"\EC89"}.mi-MailReplyAllLegacyMirrored:before,.mi-MailReplyAllMirrored:before{content:"\EC8A"}.mi-MailReplyLegacyMirrored:before,.mi-MailReplyMirrored:before{content:"\EC8B"}.mi-Manage:before,.mi-ManageLegacy:before{content:"\EC8C"}.mi-MapCompassBottom:before{content:"\EC8D"}.mi-MapCompassTop:before{content:"\EC8E"}.mi-MapDirections:before{content:"\EC8F"}.mi-MapDrive:before,.mi-MapDriveLegacy:before{content:"\EC90"}.mi-MapLayers:before{content:"\EC91"}.mi-MapLegacy:before,.mi-MapPin:before{content:"\EC92"}.mi-MapPin2:before,.mi-MapPinLegacy:before{content:"\EC94"}.mi-Marker:before{content:"\EC95"}.mi-Marquee:before{content:"\EC96"}.mi-Media:before{content:"\EC97"}.mi-MediaStorageTower:before{content:"\EC98"}.mi-Megaphone:before{content:"\EC99"}.mi-Memo:before,.mi-MemoLegacy:before{content:"\EC9A"}.mi-CommentInlineLegacy:before,.mi-Message:before,.mi-MessageLegacy:before{content:"\EC9B"}.mi-MicClipping:before{content:"\EC9C"}.mi-MicError:before{content:"\EC9D"}.mi-MicOff:before{content:"\EC9E"}.mi-MicOn:before{content:"\EC9F"}.mi-MicSleep:before{content:"\ECA0"}.mi-Microphone:before,.mi-MicrophoneLegacy:before{content:"\ECA1"}.mi-MicrophoneListening:before{content:"\ECA2"}.mi-MiracastLogoSmall:before{content:"\ECA3"}.mi-MixVolumes:before{content:"\ECA4"}.mi-MobActionCenter:before{content:"\ECA5"}.mi-MobAirplane:before{content:"\ECA6"}.mi-MobBattery0:before{content:"\ECA7"}.mi-MobBattery1:before{content:"\ECA8"}.mi-MobBattery10:before{content:"\ECA9"}.mi-MobBattery2:before{content:"\ECAA"}.mi-MobBattery3:before{content:"\ECAB"}.mi-MobBattery4:before{content:"\ECAC"}.mi-MobBattery5:before{content:"\ECAD"}.mi-MobBattery6:before{content:"\ECAE"}.mi-MobBattery7:before{content:"\ECAF"}.mi-MobBattery8:before{content:"\ECB0"}.mi-MobBattery9:before{content:"\ECB1"}.mi-MobBatteryCharging0:before{content:"\ECB2"}.mi-MobBatteryCharging1:before{content:"\ECB3"}.mi-MobBatteryCharging10:before{content:"\ECB4"}.mi-MobBatteryCharging2:before{content:"\ECB5"}.mi-MobBatteryCharging3:before{content:"\ECB6"}.mi-MobBatteryCharging4:before{content:"\ECB7"}.mi-MobBatteryCharging5:before{content:"\ECB8"}.mi-MobBatteryCharging6:before{content:"\ECB9"}.mi-MobBatteryCharging7:before{content:"\ECBA"}.mi-MobBatteryCharging8:before{content:"\ECBB"}.mi-MobBatteryCharging9:before{content:"\ECBC"}.mi-MobBatterySaver0:before{content:"\ECBD"}.mi-MobBatterySaver1:before{content:"\ECBE"}.mi-MobBatterySaver10:before{content:"\ECBF"}.mi-MobBatterySaver2:before{content:"\ECC0"}.mi-MobBatterySaver3:before{content:"\ECC1"}.mi-MobBatterySaver4:before{content:"\ECC2"}.mi-MobBatterySaver5:before{content:"\ECC3"}.mi-MobBatterySaver6:before{content:"\ECC4"}.mi-MobBatterySaver7:before{content:"\ECC5"}.mi-MobBatterySaver8:before{content:"\ECC6"}.mi-MobBatterySaver9:before{content:"\ECC7"}.mi-MobBatteryUnknown:before{content:"\ECC8"}.mi-MobBluetooth:before{content:"\ECC9"}.mi-MobCallForwarding:before{content:"\ECCA"}.mi-MobCallForwardingMirrored:before{content:"\ECCB"}.mi-MobDrivingMode:before{content:"\ECCC"}.mi-MobLocation:before{content:"\ECCD"}.mi-MobQuietHours:before{content:"\ECCE"}.mi-MobSIMError:before{content:"\ECCF"}.mi-MobSIMLock:before{content:"\ECD0"}.mi-MobSIMMissing:before{content:"\ECD1"}.mi-MobSignal1:before{content:"\ECD2"}.mi-MobSignal2:before{content:"\ECD3"}.mi-MobSignal3:before{content:"\ECD4"}.mi-MobSignal4:before{content:"\ECD5"}.mi-MobSignal5:before{content:"\ECD6"}.mi-MobWifi1:before{content:"\ECD7"}.mi-MobWifi2:before{content:"\ECD8"}.mi-MobWifi3:before{content:"\ECD9"}.mi-MobWifi4:before{content:"\ECDA"}.mi-MobWifiHotspot:before{content:"\ECDB"}.mi-MobWifiWarning1:before{content:"\ECDC"}.mi-MobWifiWarning2:before{content:"\ECDD"}.mi-MobWifiWarning3:before{content:"\ECDE"}.mi-MobWifiWarning4:before{content:"\ECDF"}.mi-MobeSIM:before{content:"\ECE0"}.mi-MobeSIMBusy:before{content:"\ECE1"}.mi-MobeSIMLocked:before{content:"\ECE2"}.mi-MobeSIMNoProfile:before{content:"\ECE3"}.mi-MobileLocked:before{content:"\ECE4"}.mi-MobileSelected:before{content:"\ECE5"}.mi-MobileTablet:before{content:"\ECE6"}.mi-More:before,.mi-MoreLegacy:before{content:"\ECE7"}.mi-Mouse:before{content:"\ECE8"}.mi-MoveToFolder:before,.mi-MoveToFolderLegacy:before{content:"\ECE9"}.mi-Movies:before{content:"\ECEA"}.mi-MultiSelect:before,.mi-MultiSelectLegacy:before{content:"\ECEB"}.mi-MultiSelectLegacyMirrored:before,.mi-MultiSelectMirrored:before{content:"\ECEC"}.mi-MultimediaDMP:before{content:"\ECED"}.mi-MultimediaDMS:before{content:"\ECEE"}.mi-MultimediaDVR:before{content:"\ECEF"}.mi-MultimediaPMP:before{content:"\ECF0"}.mi-Multitask:before{content:"\ECF1"}.mi-Multitask16:before{content:"\ECF2"}.mi-MultitaskExpanded:before{content:"\ECF3"}.mi-MusicAlbum:before{content:"\ECF4"}.mi-MusicInfo:before,.mi-MusicInfoLegacy:before{content:"\ECF5"}.mi-MusicNote:before{content:"\ECF6"}.mi-MusicSharing:before{content:"\ECF7"}.mi-MusicSharingOff:before{content:"\ECF8"}.mi-Mute:before,.mi-MuteLegacy:before{content:"\ECF9"}.mi-MyNetwork:before{content:"\ECFA"}.mi-NUIFPContinueSlideAction:before{content:"\ECFB"}.mi-NUIFPContinueSlideHand:before{content:"\ECFC"}.mi-NUIFPPressAction:before{content:"\ECFD"}.mi-NUIFPPressHand:before{content:"\ECFE"}.mi-NUIFPPressRepeatAction:before{content:"\ECFF"}.mi-NUIFPRollLeftAction:before{content:"\ED00"}.mi-NUIFPRollLeftHand:before{content:"\ED01"}.mi-NUIFPRollRightHand:before{content:"\ED02"}.mi-NUIFPRollRightHandAction:before{content:"\ED03"}.mi-NUIFPStartSlideAction:before{content:"\ED04"}.mi-NUIFPPressRepeatHand:before,.mi-NUIFPStartSlideHand:before{content:"\ED05"}.mi-NUIFace:before{content:"\ED06"}.mi-NUIIris:before{content:"\ED07"}.mi-Narrator:before{content:"\ED08"}.mi-NarratorForward:before{content:"\ED09"}.mi-NarratorForwardMirrored:before{content:"\ED0A"}.mi-NearbySharing:before{content:"\ED0B"}.mi-Network:before{content:"\ED0C"}.mi-NetworkAdapter:before{content:"\ED0D"}.mi-NetworkConnected:before{content:"\ED0E"}.mi-NetworkConnectedCheckmark:before{content:"\ED0F"}.mi-NetworkOffline:before{content:"\ED10"}.mi-NetworkPrinter:before{content:"\ED11"}.mi-NetworkSharing:before{content:"\ED12"}.mi-NetworkTower:before{content:"\ED13"}.mi-NewFolder:before,.mi-NewFolderLegacy:before{content:"\ED14"}.mi-NewWindow:before,.mi-NewWindowLegacy:before{content:"\ED15"}.mi-Next:before,.mi-NextLegacy:before{content:"\ED16"}.mi-NoiseCancelation:before{content:"\ED17"}.mi-NoiseCancelationOff:before{content:"\ED18"}.mi-OEM:before{content:"\ED19"}.mi-OneBar:before,.mi-OneBarLegacy:before{content:"\ED1A"}.mi-OpenFile:before,.mi-OpenFileLegacy:before{content:"\ED1B"}.mi-OpenFolderHorizontal:before{content:"\ED1C"}.mi-OpenInNewWindow:before,.mi-OpenInNewWindowLegacy:before{content:"\ED1D"}.mi-OpenLocal:before,.mi-OpenLocalLegacy:before{content:"\ED1E"}.mi-OpenPane:before,.mi-OpenPaneLegacy:before{content:"\ED1F"}.mi-OpenPaneLegacyMirrored:before,.mi-OpenPaneMirrored:before{content:"\ED20"}.mi-OpenWith:before,.mi-OpenWithLegacy:before{content:"\ED21"}.mi-OpenWithLegacyMirrored:before,.mi-OpenWithMirrored:before{content:"\ED22"}.mi-Orientation:before,.mi-OrientationLegacy:before{content:"\ED23"}.mi-OtherUser:before,.mi-OtherUserLegacy:before{content:"\ED24"}.mi-OutlineHalfStarLeft:before{content:"\ED25"}.mi-OutlineHalfStarRight:before{content:"\ED26"}.mi-OutlineQuarterStarLeft:before{content:"\ED27"}.mi-OutlineQuarterStarRight:before{content:"\ED28"}.mi-OutlineStarLeftHalf:before{content:"\ED29"}.mi-OutlineStarRightHalf:before{content:"\ED2A"}.mi-OutlineThreeQuarterStarLeft:before{content:"\ED2B"}.mi-OutlineThreeQuarterStarRight:before{content:"\ED2C"}.mi-PC1:before,.mi-PC1Legacy:before{content:"\ED2D"}.mi-PINPad:before{content:"\ED2E"}.mi-PLAP:before{content:"\ED2F"}.mi-PPSFourLandscape:before{content:"\ED30"}.mi-PPSFourPortrait:before{content:"\ED31"}.mi-PPSOneLandscape:before{content:"\ED32"}.mi-PPSOnePortrait:before{content:"\ED33"}.mi-PPSTwoLandscape:before{content:"\ED34"}.mi-PPSTwoPortrait:before{content:"\ED35"}.mi-Package:before{content:"\ED36"}.mi-Page:before,.mi-PageLegacy:before{content:"\ED37"}.mi-PageLeft:before{content:"\ED38"}.mi-PageMarginLandscapeModerate:before{content:"\ED39"}.mi-PageMarginLandscapeNarrow:before{content:"\ED3A"}.mi-PageMarginLandscapeNormal:before{content:"\ED3B"}.mi-PageMarginLandscapeWide:before{content:"\ED3C"}.mi-PageMarginPortraitModerate:before{content:"\ED3D"}.mi-PageMarginPortraitNarrow:before{content:"\ED3E"}.mi-PageMarginPortraitNormal:before{content:"\ED3F"}.mi-PageMarginPortraitWide:before{content:"\ED40"}.mi-PageMirrored:before{content:"\ED41"}.mi-PageRight:before{content:"\ED42"}.mi-PageFillLegacy:before,.mi-PageSolid:before{content:"\ED43"}.mi-PaginationDotOutline10:before{content:"\ED44"}.mi-PaginationDotSolid10:before{content:"\ED45"}.mi-PanMode:before{content:"\ED46"}.mi-ParkingLocation:before{content:"\ED47"}.mi-ParkingLocationMirrored:before{content:"\ED48"}.mi-ParkingLocationSolid:before{content:"\ED49"}.mi-PartyLeader:before{content:"\ED4A"}.mi-PassiveAuthentication:before{content:"\ED4B"}.mi-PasswordKeyHide:before{content:"\ED4C"}.mi-PasswordKeyShow:before{content:"\ED4D"}.mi-Paste:before,.mi-PasteLegacy:before{content:"\ED4E"}.mi-Pause:before,.mi-PauseLegacy:before{content:"\ED4F"}.mi-PauseBadge12:before{content:"\ED50"}.mi-PaymentCard:before{content:"\ED51"}.mi-PenPalette:before{content:"\ED52"}.mi-PenPaletteMirrored:before{content:"\ED53"}.mi-PenTips:before{content:"\ED54"}.mi-PenTipsMirrored:before{content:"\ED55"}.mi-PenWorkspace:before{content:"\ED56"}.mi-PenWorkspaceMirrored:before{content:"\ED57"}.mi-Pencil:before{content:"\ED58"}.mi-PencilFill:before{content:"\ED59"}.mi-People:before,.mi-PeopleLegacy:before{content:"\ED5A"}.mi-PeriodKey:before{content:"\ED5B"}.mi-Permissions:before,.mi-PermissionsLegacy:before{content:"\ED5C"}.mi-PersonalFolder:before{content:"\ED5D"}.mi-Personalize:before{content:"\ED5E"}.mi-Phone:before,.mi-PhoneLegacy:before{content:"\ED5F"}.mi-PhoneBook:before,.mi-PhoneBookLegacy:before{content:"\ED60"}.mi-Photo:before{content:"\ED61"}.mi-Photo2:before{content:"\ED62"}.mi-Picture:before,.mi-PictureLegacy:before{content:"\ED63"}.mi-PieSingle:before{content:"\ED64"}.mi-Pin:before,.mi-PinLegacy:before{content:"\ED65"}.mi-PinFill:before{content:"\ED66"}.mi-Pinned:before{content:"\ED67"}.mi-PinnedFill:before{content:"\ED68"}.mi-PinyinIMELogo:before{content:"\ED69"}.mi-PlaceFolder:before,.mi-PlaceFolderLegacy:before{content:"\ED6B"}.mi-Play:before,.mi-PlayLegacy:before{content:"\ED6C"}.mi-Play36:before{content:"\ED6D"}.mi-PlayBadge12:before{content:"\ED6E"}.mi-PlayOn:before,.mi-PlayOnLegacy:before{content:"\ED70"}.mi-PlaySolid:before{content:"\ED71"}.mi-PlaybackRate1x:before{content:"\ED72"}.mi-PlaybackRateOther:before{content:"\ED73"}.mi-PlayerSettings:before{content:"\ED74"}.mi-PointErase:before{content:"\ED75"}.mi-PointEraseMirrored:before{content:"\ED76"}.mi-PointerHand:before{content:"\ED77"}.mi-PoliceCar:before{content:"\ED78"}.mi-PostUpdate:before,.mi-PostUpdateLegacy:before{content:"\ED79"}.mi-PowerButton:before{content:"\ED7A"}.mi-CheckboxFill:before,.mi-CheckboxFillLegacy:before,.mi-CheckboxFillZeroWidthLegacy:before,.mi-PresenceChicklet:before,.mi-PresenceChickletLegacy:before,.mi-ResizeMouseLarge:before{content:"\ED7B"}.mi-PresenceChickletVideo:before,.mi-PresenceChickletVideoLegacy:before{content:"\ED7C"}.mi-Preview:before,.mi-PreviewLegacy:before{content:"\ED7D"}.mi-PreviewLink:before,.mi-PreviewLinkLegacy:before{content:"\ED7E"}.mi-Previous:before,.mi-PreviousLegacy:before{content:"\ED7F"}.mi-Print:before,.mi-PrintLegacy:before{content:"\ED80"}.mi-PrintAllPages:before{content:"\ED81"}.mi-PrintCustomRange:before{content:"\ED82"}.mi-PrintDefault:before{content:"\ED83"}.mi-Printer3D:before{content:"\ED84"}.mi-Printer3DLegacy:before{content:"\ED85"}.mi-PrintfaxPrinterFile:before{content:"\ED86"}.mi-Priority:before,.mi-PriorityLegacy:before{content:"\ED87"}.mi-Process:before{content:"\ED88"}.mi-Processing:before{content:"\ED89"}.mi-ProgressRingDots:before{content:"\ED8A"}.mi-Project:before{content:"\ED8B"}.mi-Projector:before{content:"\ED8C"}.mi-ProtectedDocument:before,.mi-ProtectedDocumentLegacy:before{content:"\ED8D"}.mi-Protractor:before{content:"\ED8E"}.mi-ProvisioningPackage:before{content:"\ED8F"}.mi-PuncKey:before{content:"\ED90"}.mi-PuncKey0:before{content:"\ED91"}.mi-PuncKey1:before{content:"\ED92"}.mi-PuncKey2:before{content:"\ED93"}.mi-PuncKey3:before{content:"\ED94"}.mi-PuncKey4:before{content:"\ED95"}.mi-PuncKey5:before{content:"\ED96"}.mi-PuncKey6:before{content:"\ED97"}.mi-PuncKey7:before{content:"\ED98"}.mi-PuncKey8:before{content:"\ED99"}.mi-PuncKey9:before{content:"\ED9A"}.mi-PuncKeyLeftBottom:before{content:"\ED9B"}.mi-PuncKeyRightBottom:before{content:"\ED9C"}.mi-Puzzle:before{content:"\ED9D"}.mi-QWERTYOff:before{content:"\ED9E"}.mi-QWERTYOn:before{content:"\ED9F"}.mi-QuarentinedItems:before{content:"\EDA0"}.mi-QuarentinedItemsMirrored:before{content:"\EDA1"}.mi-QuarterStarLeft:before{content:"\EDA2"}.mi-QuarterStarRight:before{content:"\EDA3"}.mi-QuickNote:before{content:"\EDA4"}.mi-QuietHours:before{content:"\EDA5"}.mi-QuietHoursBadge12:before{content:"\EDA6"}.mi-Radar:before{content:"\EDA7"}.mi-RadioBtnOff:before{content:"\EDA8"}.mi-RadioBtnOn:before{content:"\EDA9"}.mi-RadioBullet:before{content:"\EDAA"}.mi-RadioBullet2:before{content:"\EDAB"}.mi-Read:before,.mi-ReadLegacy:before{content:"\EDAC"}.mi-ReadingList:before{content:"\EDAD"}.mi-ReceiptPrinter:before{content:"\EDAE"}.mi-LengthLegacy:before,.mi-Recent:before{content:"\EDAF"}.mi-Record:before,.mi-RecordLegacy:before{content:"\EDB0"}.mi-RectangularClipping:before{content:"\EDB1"}.mi-RedEye:before{content:"\EDB2"}.mi-Redo:before,.mi-RedoLegacy:before{content:"\EDB3"}.mi-ReduceTile:before,.mi-ReduceTileLegacy:before{content:"\EDB5"}.mi-ReduceTileLegacyMirrored:before,.mi-ReduceTileMirrored:before{content:"\EDB7"}.mi-Refresh:before,.mi-RefreshLegacy:before,.mi-RepeatAll:before,.mi-RepeatAllLegacy:before{content:"\EDB8"}.mi-Relationship:before{content:"\EDB9"}.mi-RememberedDevice:before{content:"\EDBA"}.mi-Reminder:before{content:"\EDBB"}.mi-ReminderFill:before{content:"\EDBC"}.mi-Remote:before,.mi-RemoteLegacy:before{content:"\EDBD"}.mi-Remove:before,.mi-RemoveLegacy:before{content:"\EDBE"}.mi-RemoveFrom:before{content:"\EDBF"}.mi-Rename:before,.mi-RenameLegacy:before{content:"\EDC0"}.mi-Repair:before,.mi-RepairLegacy:before{content:"\EDC1"}.mi-RepeatOne:before,.mi-RepeatOneLegacy:before{content:"\EDC2"}.mi-Replay:before{content:"\EDC3"}.mi-Reply:before,.mi-ReplyLegacy:before{content:"\EDC4"}.mi-ReplyMirrored:before{content:"\EDC5"}.mi-ReportDocument:before{content:"\EDC6"}.mi-ReportHacked:before,.mi-ReportHackedLegacy:before{content:"\EDC7"}.mi-ResetDevice:before{content:"\EDC8"}.mi-ResetDrive:before{content:"\EDC9"}.mi-Reshare:before,.mi-ReshareLegacy:before{content:"\EDCA"}.mi-ResizeMouseMedium:before{content:"\EDCB"}.mi-ResizeMouseMediumMirrored:before{content:"\EDCC"}.mi-ResizeMouseSmall:before{content:"\EDCD"}.mi-ResizeMouseSmallMirrored:before{content:"\EDCE"}.mi-ResizeMouseTall:before{content:"\EDCF"}.mi-ResizeMouseTallMirrored:before{content:"\EDD0"}.mi-ResizeMouseWide:before{content:"\EDD1"}.mi-ResizeTouchLarger:before{content:"\EDD2"}.mi-ResizeTouchNarrower:before{content:"\EDD3"}.mi-ResizeTouchNarrowerMirrored:before{content:"\EDD4"}.mi-ResizeTouchShorter:before{content:"\EDD5"}.mi-ResizeTouchSmaller:before{content:"\EDD6"}.mi-Resolution:before,.mi-ResolutionLegacy:before{content:"\EDD8"}.mi-ReturnKey:before{content:"\EDD9"}.mi-ReturnKeyLg:before{content:"\EDDA"}.mi-ReturnKeySm:before{content:"\EDDB"}.mi-ReturnToWindow:before,.mi-ReturnToWindowLegacy:before{content:"\EDDC"}.mi-RevToggleKey:before{content:"\EDDD"}.mi-Rewind:before{content:"\EDDE"}.mi-RightArrowKeyTime0:before{content:"\EDDF"}.mi-RightArrowKeyTime1:before{content:"\EDE0"}.mi-RightArrowKeyTime2:before{content:"\EDE1"}.mi-RightArrowKeyTime3:before{content:"\EDE2"}.mi-RightArrowKeyTime4:before{content:"\EDE3"}.mi-RightDoubleQuote:before{content:"\EDE4"}.mi-RightQuote:before{content:"\EDE5"}.mi-RightStick:before{content:"\EDE6"}.mi-Ringer:before{content:"\EDE7"}.mi-RingerBadge12:before{content:"\EDE8"}.mi-RingerSilent:before{content:"\EDE9"}.mi-RoamingDomestic:before{content:"\EDEA"}.mi-RoamingInternational:before{content:"\EDEB"}.mi-Robot:before{content:"\EDEC"}.mi-Rotate:before{content:"\EDED"}.mi-RotateCamera:before,.mi-RotateCameraLegacy:before{content:"\EDEE"}.mi-RotateLegacy:before{content:"\EDEF"}.mi-RotateMapLeft:before{content:"\EDF0"}.mi-RotateMapRight:before{content:"\EDF1"}.mi-RotationLock:before{content:"\EDF2"}.mi-Ruler:before{content:"\EDF3"}.mi-SDCard:before{content:"\EDF4"}.mi-SIMError:before{content:"\EDF5"}.mi-SIMLock:before{content:"\EDF6"}.mi-SIMMissing:before{content:"\EDF7"}.mi-SIPMove:before{content:"\EDF8"}.mi-SIPRedock:before{content:"\EDF9"}.mi-SIPUndock:before{content:"\EDFA"}.mi-Safe:before{content:"\EDFB"}.mi-Save:before,.mi-SaveLegacy:before{content:"\EDFC"}.mi-SaveAs:before,.mi-SaveAsLegacy:before{content:"\EDFD"}.mi-SaveCopy:before{content:"\EDFE"}.mi-SaveLocal:before,.mi-SaveLocalLegacy:before{content:"\EDFF"}.mi-Scan:before,.mi-ScanLegacy:before{content:"\EE00"}.mi-ScreenTime:before{content:"\EE01"}.mi-ScrollMode:before{content:"\EE02"}.mi-ScrollUpDown:before{content:"\EE03"}.mi-FindLegacy:before,.mi-Search:before,.mi-SearchboxLegacy:before{content:"\EE04"}.mi-SearchAndApps:before{content:"\EE05"}.mi-SelectAll:before,.mi-SelectAllLegacy:before{content:"\EE06"}.mi-SemanticZoom:before,.mi-SemanticZoomLegacy:before{content:"\EE08"}.mi-Send:before,.mi-SendLegacy:before{content:"\EE09"}.mi-SendFill:before{content:"\EE0A"}.mi-SendFillMirrored:before{content:"\EE0B"}.mi-SendMirrored:before{content:"\EE0C"}.mi-Sensor:before{content:"\EE0D"}.mi-Set:before{content:"\EE0E"}.mi-SetSolid:before{content:"\EE0F"}.mi-SetTile:before,.mi-SetTileLegacy:before{content:"\EE10"}.mi-SetlockScreen:before,.mi-SetlockScreenLegacy:before{content:"\EE11"}.mi-Settings:before,.mi-SettingsLegacy:before{content:"\EE12"}.mi-SettingsBattery:before{content:"\EE13"}.mi-SettingsDisplaySound:before{content:"\EE14"}.mi-Share:before{content:"\EE15"}.mi-ShareBroadband:before{content:"\EE16"}.mi-Shield:before{content:"\EE17"}.mi-Shop:before,.mi-ShopLegacy:before{content:"\EE18"}.mi-ShoppingCart:before{content:"\EE19"}.mi-ShowAllFiles1:before,.mi-ShowAllFiles1Legacy:before{content:"\EE1B"}.mi-ShowAllFiles3:before,.mi-ShowAllFiles3Legacy:before{content:"\EE1D"}.mi-ShowBcc:before,.mi-ShowBccLegacy:before{content:"\EE1E"}.mi-ShowResults:before,.mi-ShowResultsLegacy:before{content:"\EE1F"}.mi-ShowResultsLegacyMirrored:before,.mi-ShowResultsMirrored:before{content:"\EE20"}.mi-Shuffle:before,.mi-ShuffleLegacy:before{content:"\EE21"}.mi-SignalBars1:before{content:"\EE22"}.mi-SignalBars2:before{content:"\EE23"}.mi-SignalBars3:before{content:"\EE24"}.mi-SignalBars4:before{content:"\EE25"}.mi-SignalBars5:before{content:"\EE26"}.mi-SignalError:before{content:"\EE27"}.mi-SignalNotConnected:before{content:"\EE28"}.mi-SignalRoaming:before{content:"\EE29"}.mi-SignatureCapture:before{content:"\EE2A"}.mi-Size:before{content:"\EE2B"}.mi-SkipBack10:before{content:"\EE2C"}.mi-SkipForward30:before{content:"\EE2D"}.mi-SliderThumb:before{content:"\EE2E"}.mi-Slideshow:before,.mi-SlideshowLegacy:before{content:"\EE2F"}.mi-SlowMotionOn:before{content:"\EE30"}.mi-SmallErase:before{content:"\EE31"}.mi-Smartcard:before{content:"\EE32"}.mi-SmartcardVirtual:before{content:"\EE33"}.mi-Sort:before,.mi-SortLegacy:before{content:"\EE34"}.mi-SpatialVolume0:before{content:"\EE35"}.mi-SpatialVolume1:before{content:"\EE36"}.mi-SpatialVolume2:before{content:"\EE37"}.mi-SpatialVolume3:before{content:"\EE38"}.mi-Speakers:before{content:"\EE39"}.mi-Speech:before{content:"\EE3A"}.mi-SpeedHigh:before{content:"\EE3B"}.mi-SpeedMedium:before{content:"\EE3C"}.mi-SpeedOff:before{content:"\EE3D"}.mi-StaplingLandscapeBookBinding:before{content:"\EE3E"}.mi-StaplingLandscapeBottomLeft:before{content:"\EE3F"}.mi-StaplingLandscapeBottomRight:before{content:"\EE40"}.mi-StaplingLandscapeTopLeft:before{content:"\EE41"}.mi-StaplingLandscapeTopRight:before{content:"\EE42"}.mi-StaplingLandscapeTwoBottom:before{content:"\EE43"}.mi-StaplingLandscapeTwoLeft:before{content:"\EE44"}.mi-StaplingLandscapeTwoRight:before{content:"\EE45"}.mi-StaplingLandscapeTwoTop:before{content:"\EE46"}.mi-StaplingOff:before{content:"\EE47"}.mi-StaplingPortraitBookBinding:before{content:"\EE48"}.mi-StaplingPortraitBottomLeft:before{content:"\EE49"}.mi-StaplingPortraitBottomRight:before{content:"\EE4A"}.mi-StaplingPortraitTopLeft:before{content:"\EE4B"}.mi-StaplingPortraitTopRight:before{content:"\EE4C"}.mi-StaplingPortraitTwoBottom:before{content:"\EE4D"}.mi-StaplingPortraitTwoLeft:before{content:"\EE4E"}.mi-StaplingPortraitTwoRight:before{content:"\EE4F"}.mi-StaplingPortraitTwoTop:before{content:"\EE50"}.mi-StartPoint:before{content:"\EE51"}.mi-StartPointSolid:before{content:"\EE52"}.mi-StatusCheckmark:before{content:"\EE53"}.mi-StatusCheckmark7:before{content:"\EE54"}.mi-StatusCheckmarkLeft:before{content:"\EE55"}.mi-StatusCircle:before{content:"\EE56"}.mi-StatusCircle7:before{content:"\EE57"}.mi-StatusCircleBlock:before{content:"\EE58"}.mi-StatusCircleBlock2:before{content:"\EE59"}.mi-StatusCircleCheckmark:before{content:"\EE5A"}.mi-StatusCircleErrorX:before{content:"\EE5B"}.mi-StatusCircleExclamation:before{content:"\EE5C"}.mi-StatusCircleInfo:before{content:"\EE5D"}.mi-StatusCircleInner:before{content:"\EE5E"}.mi-StatusCircleLeft:before{content:"\EE5F"}.mi-StatusCircleOuter:before{content:"\EE60"}.mi-StatusCircleQuestionMark:before{content:"\EE61"}.mi-StatusCircleRing:before{content:"\EE62"}.mi-StatusCircleSync:before{content:"\EE63"}.mi-StatusConnecting1:before{content:"\EE64"}.mi-StatusConnecting2:before{content:"\EE65"}.mi-StatusDataTransfer:before{content:"\EE66"}.mi-StatusDataTransferVPN:before{content:"\EE67"}.mi-StatusDualSIM1:before{content:"\EE68"}.mi-StatusDualSIM1VPN:before{content:"\EE69"}.mi-StatusDualSIM2:before{content:"\EE6A"}.mi-StatusDualSIM2VPN:before{content:"\EE6B"}.mi-StatusError:before{content:"\EE6C"}.mi-StatusErrorCircle7:before{content:"\EE6D"}.mi-StatusErrorFull:before{content:"\EE6E"}.mi-StatusErrorLeft:before{content:"\EE6F"}.mi-StatusExclamationCircle7:before{content:"\EE70"}.mi-StatusInfo:before{content:"\EE71"}.mi-StatusInfoLeft:before{content:"\EE72"}.mi-StatusPause7:before{content:"\EE73"}.mi-StatusSGLTE:before{content:"\EE74"}.mi-StatusSGLTECell:before{content:"\EE75"}.mi-StatusSGLTEDataVPN:before{content:"\EE76"}.mi-StatusTriangle:before{content:"\EE77"}.mi-StatusTriangleExclamation:before{content:"\EE78"}.mi-StatusTriangleInner:before{content:"\EE79"}.mi-StatusTriangleLeft:before{content:"\EE7A"}.mi-StatusTriangleOuter:before{content:"\EE7B"}.mi-StatusUnsecure:before{content:"\EE7C"}.mi-StatusVPN:before{content:"\EE7D"}.mi-StatusWarning:before{content:"\EE7E"}.mi-StatusWarningLeft:before{content:"\EE7F"}.mi-Sticker2:before{content:"\EE80"}.mi-StockDown:before{content:"\EE81"}.mi-StockUp:before{content:"\EE82"}.mi-Stop:before,.mi-StopLegacy:before{content:"\EE83"}.mi-StopPoint:before{content:"\EE84"}.mi-StopPointSolid:before{content:"\EE85"}.mi-StopSlideshow:before,.mi-StopSlideshowLegacy:before{content:"\EE87"}.mi-Stopwatch:before{content:"\EE88"}.mi-StorageNetworkWireless:before{content:"\EE89"}.mi-StorageOptical:before{content:"\EE8A"}.mi-StorageTape:before{content:"\EE8B"}.mi-Streaming:before{content:"\EE8C"}.mi-StreamingEnterprise:before{content:"\EE8D"}.mi-Street:before,.mi-StreetLegacy:before{content:"\EE8E"}.mi-StreetsideSplitExpand:before{content:"\EE8F"}.mi-StreetsideSplitMinimize:before{content:"\EE90"}.mi-StrokeErase:before{content:"\EE91"}.mi-StrokeErase2:before{content:"\EE92"}.mi-StrokeEraseMirrored:before{content:"\EE93"}.mi-Subtitles:before{content:"\EE94"}.mi-SubtitlesAudio:before{content:"\EE95"}.mi-SurfaceHub:before{content:"\EE96"}.mi-SurfaceHubSelected:before{content:"\EE97"}.mi-Sustainable:before{content:"\EE98"}.mi-Swipe:before{content:"\EE99"}.mi-SwipeRevealArt:before{content:"\EE9A"}.mi-Switch:before,.mi-SwitchLegacy:before{content:"\EE9B"}.mi-SwitchApps:before,.mi-SwitchAppsLegacy:before{content:"\EE9C"}.mi-SwitchUser:before{content:"\EE9D"}.mi-Sync:before,.mi-SyncLegacy:before{content:"\EE9E"}.mi-SyncBadge12:before{content:"\EE9F"}.mi-SyncError:before{content:"\EEA0"}.mi-SyncFolder:before,.mi-SyncFolderLegacy:before{content:"\EEA1"}.mi-System:before{content:"\EEA2"}.mi-TVMonitor:before{content:"\EEA3"}.mi-TVMonitorSelected:before{content:"\EEA4"}.mi-Tablet:before{content:"\EEA5"}.mi-TabletMode:before{content:"\EEA6"}.mi-TabletSelected:before{content:"\EEA7"}.mi-Tag:before,.mi-TagLegacy:before{content:"\EEA8"}.mi-TapAndSend:before{content:"\EEA9"}.mi-TaskView:before{content:"\EEAA"}.mi-TaskViewExpanded:before{content:"\EEAB"}.mi-TaskViewSettings:before{content:"\EEAC"}.mi-TaskbarPhone:before{content:"\EEAD"}.mi-ThisPC:before{content:"\EEAE"}.mi-ThoughtBubble:before{content:"\EEAF"}.mi-ThreeBars:before,.mi-ThreeBarsLegacy:before{content:"\EEB0"}.mi-ThreeQuarterStarLeft:before{content:"\EEB1"}.mi-ThreeQuarterStarRight:before{content:"\EEB2"}.mi-Tiles:before{content:"\EEB3"}.mi-TiltDown:before{content:"\EEB4"}.mi-TiltUp:before{content:"\EEB5"}.mi-TimeLanguage:before{content:"\EEB6"}.mi-ToggleBorder:before{content:"\EEB7"}.mi-ToggleFilled:before{content:"\EEB8"}.mi-ToggleThumb:before{content:"\EEB9"}.mi-TollSolid:before{content:"\EEBA"}.mi-Lightbulb:before,.mi-ToolTip:before{content:"\EEBB"}.mi-Touch:before{content:"\EEBC"}.mi-TouchPointer:before,.mi-TouchPointerLegacy:before{content:"\EEBD"}.mi-Touchpad:before{content:"\EEBE"}.mi-Touchscreen:before{content:"\EEBF"}.mi-Trackers:before{content:"\EEC0"}.mi-TrackersMirrored:before{content:"\EEC1"}.mi-TrafficCongestionSolid:before{content:"\EEC2"}.mi-TrafficLight:before{content:"\EEC3"}.mi-Train:before{content:"\EEC4"}.mi-TrainSolid:before{content:"\EEC5"}.mi-TreeFolderFolder:before{content:"\EEC6"}.mi-TreeFolderFolderFill:before{content:"\EEC7"}.mi-TreeFolderFolderOpen:before{content:"\EEC8"}.mi-TreeFolderFolderOpenFill:before{content:"\EEC9"}.mi-TriggerLeft:before{content:"\EECA"}.mi-TriggerRight:before{content:"\EECB"}.mi-Trim:before,.mi-TrimLegacy:before{content:"\EECC"}.mi-TwoBars:before,.mi-TwoBarsLegacy:before{content:"\EECD"}.mi-TwoPage:before,.mi-TwoPageLegacy:before{content:"\EECE"}.mi-Type:before,.mi-TypeLegacy:before{content:"\EECF"}.mi-TypingIndicatorLegacy:before{content:"\EED0"}.mi-USB:before{content:"\EED1"}.mi-USBSafeConnect:before{content:"\EED2"}.mi-Underline:before,.mi-UnderlineLegacy:before{content:"\EED3"}.mi-UnderlineLKorean:before,.mi-UnderlineLKoreanLegacy:before{content:"\EED5"}.mi-UnderlineRussian:before,.mi-UnderlineRussianLegacy:before{content:"\EED7"}.mi-UnderlineS:before,.mi-UnderlineSLegacy:before{content:"\EED9"}.mi-UnderlineU:before,.mi-UnderlineULegacy:before{content:"\EEDB"}.mi-UnderscoreSpace:before{content:"\EEDC"}.mi-Undo:before,.mi-UndoLegacy:before{content:"\EEDD"}.mi-Unfavorite:before,.mi-UnfavoriteLegacy:before{content:"\EEDE"}.mi-Unit:before{content:"\EEDF"}.mi-Unknown:before{content:"\EEE0"}.mi-UnknownMirrored:before{content:"\EEE1"}.mi-Unlock:before,.mi-UnlockLegacy:before{content:"\EEE2"}.mi-Unpin:before,.mi-UnpinLegacy:before{content:"\EEE3"}.mi-UnsyncFolder:before,.mi-UnsyncFolderLegacy:before{content:"\EEE4"}.mi-Up:before,.mi-UpLegacy:before{content:"\EEE5"}.mi-UpArrowShiftKey:before{content:"\EEE6"}.mi-UpShiftKey:before{content:"\EEE7"}.mi-UpdateRestore:before{content:"\EEE8"}.mi-Upload:before,.mi-UploadLegacy:before,.mi-UploadSkyDriveLegacy:before{content:"\EEE9"}.mi-UserAPN:before{content:"\EEEA"}.mi-VPN:before{content:"\EEEB"}.mi-VerticalBattery0:before{content:"\EEEC"}.mi-VerticalBattery1:before{content:"\EEED"}.mi-VerticalBattery10:before{content:"\EEEE"}.mi-VerticalBattery2:before{content:"\EEEF"}.mi-VerticalBattery3:before{content:"\EEF0"}.mi-VerticalBattery4:before{content:"\EEF1"}.mi-VerticalBattery5:before{content:"\EEF2"}.mi-VerticalBattery6:before{content:"\EEF3"}.mi-VerticalBattery7:before{content:"\EEF4"}.mi-VerticalBattery8:before{content:"\EEF5"}.mi-VerticalBattery9:before{content:"\EEF6"}.mi-VerticalBatteryCharging0:before{content:"\EEF7"}.mi-VerticalBatteryCharging1:before{content:"\EEF8"}.mi-VerticalBatteryCharging10:before{content:"\EEF9"}.mi-VerticalBatteryCharging2:before{content:"\EEFA"}.mi-VerticalBatteryCharging3:before{content:"\EEFB"}.mi-VerticalBatteryCharging4:before{content:"\EEFC"}.mi-VerticalBatteryCharging5:before{content:"\EEFD"}.mi-VerticalBatteryCharging6:before{content:"\EEFE"}.mi-VerticalBatteryCharging7:before{content:"\EEFF"}.mi-VerticalBatteryCharging8:before{content:"\EF00"}.mi-VerticalBatteryCharging9:before{content:"\EF01"}.mi-VerticalBatteryUnknown:before{content:"\EF02"}.mi-Vibrate:before{content:"\EF03"}.mi-Video:before,.mi-VideoInlineLegacy:before,.mi-VideoLegacy:before{content:"\EF04"}.mi-Video360:before{content:"\EF05"}.mi-VideoChat:before,.mi-VideoChatLegacy:before{content:"\EF06"}.mi-VideoSolid:before{content:"\EF07"}.mi-RevealPasswordLegacy:before,.mi-View:before,.mi-ViewLegacy:before{content:"\EF08"}.mi-ShowAllFilesLegacy:before,.mi-ViewAll:before,.mi-ViewAllLegacy:before{content:"\EF09"}.mi-ViewDashboard:before{content:"\EF0A"}.mi-Volume:before,.mi-VolumeLegacy:before{content:"\EF0B"}.mi-Volume0:before{content:"\EF0C"}.mi-Volume1:before{content:"\EF0D"}.mi-Volume2:before{content:"\EF0E"}.mi-Volume3:before{content:"\EF0F"}.mi-VolumeBars:before{content:"\EF10"}.mi-Walk:before{content:"\EF11"}.mi-WalkSolid:before{content:"\EF12"}.mi-Warning:before{content:"\EF13"}.mi-Webcam:before,.mi-WebcamLegacy:before{content:"\EF14"}.mi-Webcam2:before{content:"\EF15"}.mi-Website:before{content:"\EF16"}.mi-Wheel:before{content:"\EF17"}.mi-Wifi:before{content:"\EF18"}.mi-Wifi1:before{content:"\EF19"}.mi-Wifi2:before{content:"\EF1A"}.mi-Wifi3:before{content:"\EF1B"}.mi-WifiAttentionOverlay:before{content:"\EF1C"}.mi-WifiCall0:before{content:"\EF1D"}.mi-WifiCall1:before{content:"\EF1E"}.mi-WifiCall2:before{content:"\EF1F"}.mi-WifiCall3:before{content:"\EF20"}.mi-WifiCall4:before{content:"\EF21"}.mi-WifiCallBars:before{content:"\EF22"}.mi-WifiError0:before{content:"\EF23"}.mi-WifiError1:before{content:"\EF24"}.mi-WifiError2:before{content:"\EF25"}.mi-WifiError3:before{content:"\EF26"}.mi-WifiError4:before{content:"\EF27"}.mi-WifiEthernet:before{content:"\EF28"}.mi-InternetSharing:before,.mi-WifiHotspot:before{content:"\EF29"}.mi-WifiWarning0:before{content:"\EF2A"}.mi-WifiWarning1:before{content:"\EF2B"}.mi-WifiWarning2:before{content:"\EF2C"}.mi-WifiWarning3:before{content:"\EF2D"}.mi-WifiWarning4:before{content:"\EF2E"}.mi-WindDirection:before{content:"\EF2F"}.mi-WindowsInsider:before{content:"\EF30"}.mi-WiredUSB:before{content:"\EF31"}.mi-WirelessUSB:before{content:"\EF32"}.mi-Work:before{content:"\EF33"}.mi-WorkSolid:before{content:"\EF34"}.mi-World:before,.mi-WorldLegacy:before{content:"\EF35"}.mi-XboxOneConsole:before{content:"\EF36"}.mi-ZeroBars:before,.mi-ZeroBarsLegacy:before{content:"\EF37"}.mi-Zoom:before,.mi-ZoomLegacy:before{content:"\EF38"}.mi-ZoomIn:before,.mi-ZoomInLegacy:before{content:"\EF39"}.mi-ZoomMode:before{content:"\EF3A"}.mi-ZoomOut:before,.mi-ZoomOutLegacy:before{content:"\EF3B"}.mi-eSIM:before{content:"\EF3C"}.mi-eSIMBusy:before{content:"\EF3D"}.mi-eSIMLocked:before{content:"\EF3E"}.mi-eSIMNoProfile:before{content:"\EF3F"}.mi-E80B:before,.mi-uniE80B:before{content:"\EF40"}.mi-EA0D:before,.mi-uniEA0D:before{content:"\EF41"}.mi-EA3F:before,.mi-uniEA3F:before{content:"\EF42"}.mi-EA90:before,.mi-uniEA90:before{content:"\EF43"}.mi-EAC2:before,.mi-uniEAC2:before{content:"\EF44"}.mi-EC6C:before,.mi-uniEC6C:before{content:"\EF45"}.mi-EEA3:before,.mi-uniEEA3:before{content:"\EF46"}.mi-F2B7:before,.mi-uniF2B7:before{content:"\EF47"}.mi-F5AA:before,.mi-uniF5AA:before{content:"\EF48"}.mi-F614:before,.mi-uniF614:before{content:"\EF49"}.mi-F615:before,.mi-uniF615:before{content:"\EF4A"}.mi-F616:before,.mi-uniF616:before{content:"\EF4B"}.mi-F617:before,.mi-uniF617:before{content:"\EF4C"}.mi-F657:before,.mi-uniF657:before{content:"\EF4D"}.mi-F658:before,.mi-uniF658:before{content:"\EF4E"}.mi-F659:before,.mi-uniF659:before{content:"\EF4F"}.mi-F65A:before,.mi-uniF65A:before{content:"\EF50"}.mi-F65B:before,.mi-uniF65B:before{content:"\EF51"}.mi-F65C:before,.mi-uniF65C:before{content:"\EF52"}.mi-F69E:before,.mi-uniF69E:before{content:"\EF53"}.mi-F6FA:before,.mi-uniF6FA:before{content:"\EF54"}.mi-F712:before,.mi-uniF712:before{content:"\EF55"}.mi-F71C:before,.mi-uniF71C:before{content:"\EF56"}.mi-F71D:before,.mi-uniF71D:before{content:"\EF57"}.mi-F71E:before,.mi-uniF71E:before{content:"\EF58"}.mi-F738:before,.mi-uniF738:before{content:"\EF59"}.mi-F739:before,.mi-uniF739:before{content:"\EF5A"}.mi-F73D:before,.mi-uniF73D:before{content:"\EF5B"}.mi-F73E:before,.mi-uniF73E:before{content:"\EF5C"}.mi-F73F:before,.mi-uniF73F:before{content:"\EF5D"}.mi-F740:before,.mi-uniF740:before{content:"\EF5E"}.mi-F741:before,.mi-uniF741:before{content:"\EF5F"}.mi-F742:before,.mi-uniF742:before{content:"\EF60"}.mi-F743:before,.mi-uniF743:before{content:"\EF61"}.mi-F744:before,.mi-uniF744:before{content:"\EF62"}.mi-F745:before,.mi-uniF745:before{content:"\EF63"}.mi-F746:before,.mi-uniF746:before{content:"\EF64"}.mi-F785:before,.mi-uniF785:before{content:"\EF65"}.mi-500px:before{content:"\EF66"}.mi-accessible-icon:before{content:"\EF67"}.mi-accusoft:before{content:"\EF68"}.mi-acquisitions-incorporated:before{content:"\EF69"}.mi-adn:before{content:"\EF6A"}.mi-adobe:before{content:"\EF6B"}.mi-adversal:before{content:"\EF6C"}.mi-affiliatetheme:before{content:"\EF6D"}.mi-algolia:before{content:"\EF6E"}.mi-alipay:before{content:"\EF6F"}.mi-amazon-pay:before{content:"\EF70"}.mi-amazon:before{content:"\EF71"}.mi-amilia:before{content:"\EF72"}.mi-android:before{content:"\EF73"}.mi-angellist:before{content:"\EF74"}.mi-angrycreative:before{content:"\EF75"}.mi-angular:before{content:"\EF76"}.mi-app-store-ios:before{content:"\EF77"}.mi-app-store:before{content:"\EF78"}.mi-apper:before{content:"\EF79"}.mi-apple-pay:before{content:"\EF7A"}.mi-apple:before{content:"\EF7B"}.mi-artstation:before{content:"\EF7C"}.mi-asymmetrik:before{content:"\EF7D"}.mi-atlassian:before{content:"\EF7E"}.mi-audible:before{content:"\EF7F"}.mi-autoprefixer:before{content:"\EF80"}.mi-avianex:before{content:"\EF81"}.mi-aviato:before{content:"\EF82"}.mi-aws:before{content:"\EF83"}.mi-bandcamp:before{content:"\EF84"}.mi-behance-square:before{content:"\EF85"}.mi-behance:before{content:"\EF86"}.mi-bimobject:before{content:"\EF87"}.mi-bitbucket:before{content:"\EF88"}.mi-bitcoin:before{content:"\EF89"}.mi-bity:before{content:"\EF8A"}.mi-black-tie:before{content:"\EF8B"}.mi-blackberry:before{content:"\EF8C"}.mi-blogger-b:before{content:"\EF8D"}.mi-blogger:before{content:"\EF8E"}.mi-bluetooth-b:before{content:"\EF8F"}.mi-bluetooth:before{content:"\EF90"}.mi-btc:before{content:"\EF91"}.mi-buromobelexperte:before{content:"\EF92"}.mi-buysellads:before{content:"\EF93"}.mi-canadian-maple-leaf:before{content:"\EF94"}.mi-cc-amazon-pay:before{content:"\EF95"}.mi-cc-amex:before{content:"\EF96"}.mi-cc-apple-pay:before{content:"\EF97"}.mi-cc-diners-club:before{content:"\EF98"}.mi-cc-discover:before{content:"\EF99"}.mi-cc-jcb:before{content:"\EF9A"}.mi-cc-mastercard:before{content:"\EF9B"}.mi-cc-paypal:before{content:"\EF9C"}.mi-cc-stripe:before{content:"\EF9D"}.mi-cc-visa:before{content:"\EF9E"}.mi-centercode:before{content:"\EF9F"}.mi-centos:before{content:"\EFA0"}.mi-chrome:before{content:"\EFA1"}.mi-cloudscale:before{content:"\EFA2"}.mi-cloudsmith:before{content:"\EFA3"}.mi-cloudversify:before{content:"\EFA4"}.mi-codepen:before{content:"\EFA5"}.mi-codiepie:before{content:"\EFA6"}.mi-confluence:before{content:"\EFA7"}.mi-connectdevelop:before{content:"\EFA8"}.mi-contao:before{content:"\EFA9"}.mi-cpanel:before{content:"\EFAA"}.mi-creative-commons-by:before{content:"\EFAB"}.mi-creative-commons-nc-eu:before{content:"\EFAC"}.mi-creative-commons-nc-jp:before{content:"\EFAD"}.mi-creative-commons-nc:before{content:"\EFAE"}.mi-creative-commons-nd:before{content:"\EFAF"}.mi-creative-commons-pd-alt:before{content:"\EFB0"}.mi-creative-commons-pd:before{content:"\EFB1"}.mi-creative-commons-remix:before{content:"\EFB2"}.mi-creative-commons-sa:before{content:"\EFB3"}.mi-creative-commons-sampling-plus:before{content:"\EFB4"}.mi-creative-commons-sampling:before{content:"\EFB5"}.mi-creative-commons-share:before{content:"\EFB6"}.mi-creative-commons-zero:before{content:"\EFB7"}.mi-creative-commons:before{content:"\EFB8"}.mi-critical-role:before{content:"\EFB9"}.mi-css3-alt:before{content:"\EFBA"}.mi-css3:before{content:"\EFBB"}.mi-cuttlefish:before{content:"\EFBC"}.mi-d-and-d-beyond:before{content:"\EFBD"}.mi-d-and-d:before{content:"\EFBE"}.mi-dashcube:before{content:"\EFBF"}.mi-delicious:before{content:"\EFC0"}.mi-deploydog:before{content:"\EFC1"}.mi-deskpro:before{content:"\EFC2"}.mi-dev:before{content:"\EFC3"}.mi-deviantart:before{content:"\EFC4"}.mi-dhl:before{content:"\EFC5"}.mi-diaspora:before{content:"\EFC6"}.mi-digg:before{content:"\EFC7"}.mi-digital-ocean:before{content:"\EFC8"}.mi-discord:before{content:"\EFC9"}.mi-discourse:before{content:"\EFCA"}.mi-dochub:before{content:"\EFCB"}.mi-docker:before{content:"\EFCC"}.mi-draft2digital:before{content:"\EFCD"}.mi-dribbble-square:before{content:"\EFCE"}.mi-dribbble:before{content:"\EFCF"}.mi-dropbox:before{content:"\EFD0"}.mi-drupal:before{content:"\EFD1"}.mi-dyalog:before{content:"\EFD2"}.mi-earlybirds:before{content:"\EFD3"}.mi-ebay:before{content:"\EFD4"}.mi-edge:before{content:"\EFD5"}.mi-elementor:before{content:"\EFD6"}.mi-ello:before{content:"\EFD7"}.mi-ember:before{content:"\EFD8"}.mi-empire:before{content:"\EFD9"}.mi-envira:before{content:"\EFDA"}.mi-erlang:before{content:"\EFDB"}.mi-ethereum:before{content:"\EFDC"}.mi-etsy:before{content:"\EFDD"}.mi-expeditedssl:before{content:"\EFDE"}.mi-facebook-f:before{content:"\EFDF"}.mi-facebook-messenger:before{content:"\EFE0"}.mi-facebook-square:before{content:"\EFE1"}.mi-facebook:before{content:"\EFE2"}.mi-fedex:before{content:"\EFE3"}.mi-fedora:before{content:"\EFE4"}.mi-figma:before{content:"\EFE5"}.mi-firefox:before{content:"\EFE6"}.mi-first-order-alt:before{content:"\EFE7"}.mi-first-order:before{content:"\EFE8"}.mi-firstdraft:before{content:"\EFE9"}.mi-flickr:before{content:"\EFEA"}.mi-flipboard:before{content:"\EFEB"}.mi-fly:before{content:"\EFEC"}.mi-font-awesome-alt:before{content:"\EFED"}.mi-font-awesome-flag:before{content:"\EFEE"}.mi-font-awesome:before{content:"\EFEF"}.mi-fonticons-fi:before{content:"\EFF0"}.mi-fonticons:before{content:"\EFF1"}.mi-fort-awesome-alt:before{content:"\EFF2"}.mi-fort-awesome:before{content:"\EFF3"}.mi-forumbee:before{content:"\EFF4"}.mi-foursquare:before{content:"\EFF5"}.mi-free-code-camp:before{content:"\EFF6"}.mi-freebsd:before{content:"\EFF7"}.mi-fulcrum:before{content:"\EFF8"}.mi-galactic-republic:before{content:"\EFF9"}.mi-galactic-senate:before{content:"\EFFA"}.mi-get-pocket:before{content:"\EFFB"}.mi-gg-circle:before{content:"\EFFC"}.mi-gg:before{content:"\EFFD"}.mi-git-square:before{content:"\EFFE"}.mi-github-alt:before{content:"\EFFF"}.mi-github-square:before{content:"\F000"}.mi-github:before{content:"\F001"}.mi-gitkraken:before{content:"\F002"}.mi-gitlab:before{content:"\F003"}.mi-gitter:before{content:"\F004"}.mi-glide-g:before{content:"\F005"}.mi-glide:before{content:"\F006"}.mi-gofore:before{content:"\F007"}.mi-goodreads-g:before{content:"\F008"}.mi-goodreads:before{content:"\F009"}.mi-google-drive:before{content:"\F00A"}.mi-google-play:before{content:"\F00B"}.mi-google-plus-g:before{content:"\F00C"}.mi-google-plus-square:before{content:"\F00D"}.mi-google-plus:before{content:"\F00E"}.mi-google-wallet:before{content:"\F00F"}.mi-google:before{content:"\F010"}.mi-gratipay:before{content:"\F011"}.mi-grav:before{content:"\F012"}.mi-gripfire:before{content:"\F013"}.mi-grunt:before{content:"\F014"}.mi-gulp:before{content:"\F015"}.mi-hacker-news-square:before{content:"\F016"}.mi-hacker-news:before{content:"\F017"}.mi-hackerrank:before{content:"\F018"}.mi-hire-a-helper:before{content:"\F019"}.mi-hooli:before{content:"\F01A"}.mi-hornbill:before{content:"\F01B"}.mi-hotjar:before{content:"\F01C"}.mi-houzz:before{content:"\F01D"}.mi-html5:before{content:"\F01E"}.mi-hubspot:before{content:"\F01F"}.mi-imdb:before{content:"\F020"}.mi-instagram:before{content:"\F021"}.mi-intercom:before{content:"\F022"}.mi-internet-explorer:before{content:"\F023"}.mi-invision:before{content:"\F024"}.mi-ioxhost:before{content:"\F025"}.mi-itunes-note:before{content:"\F026"}.mi-itunes:before{content:"\F027"}.mi-java:before{content:"\F028"}.mi-jedi-order:before{content:"\F029"}.mi-jenkins:before{content:"\F02A"}.mi-jira:before{content:"\F02B"}.mi-joget:before{content:"\F02C"}.mi-joomla:before{content:"\F02D"}.mi-js-square:before{content:"\F02E"}.mi-js:before{content:"\F02F"}.mi-jsfiddle:before{content:"\F030"}.mi-kaggle:before{content:"\F031"}.mi-keybase:before{content:"\F032"}.mi-keycdn:before{content:"\F033"}.mi-kickstarter-k:before{content:"\F034"}.mi-kickstarter:before{content:"\F035"}.mi-korvue:before{content:"\F036"}.mi-laravel:before{content:"\F037"}.mi-lastfm-square:before{content:"\F038"}.mi-lastfm:before{content:"\F039"}.mi-leanpub:before{content:"\F03A"}.mi-less:before{content:"\F03B"}.mi-line:before{content:"\F03C"}.mi-linkedin-in:before{content:"\F03D"}.mi-linkedin:before{content:"\F03E"}.mi-linode:before{content:"\F03F"}.mi-linux:before{content:"\F040"}.mi-lyft:before{content:"\F041"}.mi-magento:before{content:"\F042"}.mi-mailchimp:before{content:"\F043"}.mi-mandalorian:before{content:"\F044"}.mi-markdown:before{content:"\F045"}.mi-mastodon:before{content:"\F046"}.mi-maxcdn:before{content:"\F047"}.mi-medapps:before{content:"\F048"}.mi-medium-m:before{content:"\F049"}.mi-medium:before{content:"\F04A"}.mi-medrt:before{content:"\F04B"}.mi-meetup:before{content:"\F04C"}.mi-megaport:before{content:"\F04D"}.mi-mendeley:before{content:"\F04E"}.mi-microsoft:before{content:"\F04F"}.mi-mix:before{content:"\F050"}.mi-mixcloud:before{content:"\F051"}.mi-mizuni:before{content:"\F052"}.mi-modx:before{content:"\F053"}.mi-monero:before{content:"\F054"}.mi-napster:before{content:"\F055"}.mi-neos:before{content:"\F056"}.mi-nimblr:before{content:"\F057"}.mi-nintendo-switch:before{content:"\F058"}.mi-node-js:before{content:"\F059"}.mi-node:before{content:"\F05A"}.mi-npm:before{content:"\F05B"}.mi-ns8:before{content:"\F05C"}.mi-nutritionix:before{content:"\F05D"}.mi-odnoklassniki-square:before{content:"\F05E"}.mi-odnoklassniki:before{content:"\F05F"}.mi-old-republic:before{content:"\F060"}.mi-opencart:before{content:"\F061"}.mi-openid:before{content:"\F062"}.mi-opera:before{content:"\F063"}.mi-optin-monster:before{content:"\F064"}.mi-osi:before{content:"\F065"}.mi-page4:before{content:"\F066"}.mi-pagelines:before{content:"\F067"}.mi-palfed:before{content:"\F068"}.mi-patreon:before{content:"\F069"}.mi-paypal:before{content:"\F06A"}.mi-penny-arcade:before{content:"\F06B"}.mi-periscope:before{content:"\F06C"}.mi-phabricator:before{content:"\F06D"}.mi-phoenix-framework:before{content:"\F06E"}.mi-phoenix-squadron:before{content:"\F06F"}.mi-php:before{content:"\F070"}.mi-pied-piper-alt:before{content:"\F071"}.mi-pied-piper-hat:before{content:"\F072"}.mi-pied-piper-pp:before{content:"\F073"}.mi-pied-piper:before{content:"\F074"}.mi-pinterest-p:before{content:"\F075"}.mi-pinterest-square:before{content:"\F076"}.mi-pinterest:before{content:"\F077"}.mi-playstation:before{content:"\F078"}.mi-product-hunt:before{content:"\F079"}.mi-pushed:before{content:"\F07A"}.mi-python:before{content:"\F07B"}.mi-qq:before{content:"\F07C"}.mi-quinscape:before{content:"\F07D"}.mi-quora:before{content:"\F07E"}.mi-r-project:before{content:"\F07F"}.mi-raspberry-pi:before{content:"\F080"}.mi-ravelry:before{content:"\F081"}.mi-react:before{content:"\F082"}.mi-reacteurope:before{content:"\F083"}.mi-readme:before{content:"\F084"}.mi-rebel:before{content:"\F085"}.mi-red-river:before{content:"\F086"}.mi-reddit-alien:before{content:"\F087"}.mi-reddit-square:before{content:"\F088"}.mi-reddit:before{content:"\F089"}.mi-redhat:before{content:"\F08A"}.mi-renren:before{content:"\F08B"}.mi-replyd:before{content:"\F08C"}.mi-researchgate:before{content:"\F08D"}.mi-resolving:before{content:"\F08E"}.mi-rev:before{content:"\F08F"}.mi-rocketchat:before{content:"\F090"}.mi-rockrms:before{content:"\F091"}.mi-safari:before{content:"\F092"}.mi-sass:before{content:"\F093"}.mi-schlix:before{content:"\F094"}.mi-scribd:before{content:"\F095"}.mi-searchengin:before{content:"\F096"}.mi-sellcast:before{content:"\F097"}.mi-sellsy:before{content:"\F098"}.mi-servicestack:before{content:"\F099"}.mi-shirtsinbulk:before{content:"\F09A"}.mi-shopware:before{content:"\F09B"}.mi-simplybuilt:before{content:"\F09C"}.mi-sistrix:before{content:"\F09D"}.mi-sith:before{content:"\F09E"}.mi-sketch:before{content:"\F09F"}.mi-skyatlas:before{content:"\F0A0"}.mi-skype:before{content:"\F0A1"}.mi-slack-hash:before{content:"\F0A2"}.mi-slack:before{content:"\F0A3"}.mi-slideshare:before{content:"\F0A4"}.mi-snapchat-ghost:before{content:"\F0A5"}.mi-snapchat-square:before{content:"\F0A6"}.mi-snapchat:before{content:"\F0A7"}.mi-soundcloud:before{content:"\F0A8"}.mi-sourcetree:before{content:"\F0A9"}.mi-speakap:before{content:"\F0AA"}.mi-spotify:before{content:"\F0AB"}.mi-squarespace:before{content:"\F0AC"}.mi-stack-exchange:before{content:"\F0AD"}.mi-stack-overflow:before{content:"\F0AE"}.mi-staylinked:before{content:"\F0AF"}.mi-steam-square:before{content:"\F0B0"}.mi-steam:before{content:"\F0B1"}.mi-sticker-mule:before{content:"\F0B2"}.mi-strava:before{content:"\F0B3"}.mi-stripe-s:before{content:"\F0B4"}.mi-stripe:before{content:"\F0B5"}.mi-studiovinari:before{content:"\F0B6"}.mi-stumbleupon-circle:before{content:"\F0B7"}.mi-stumbleupon:before{content:"\F0B8"}.mi-superpowers:before{content:"\F0B9"}.mi-supple:before{content:"\F0BA"}.mi-suse:before{content:"\F0BB"}.mi-teamspeak:before{content:"\F0BC"}.mi-telegram-plane:before{content:"\F0BD"}.mi-telegram:before{content:"\F0BE"}.mi-tencent-weibo:before{content:"\F0BF"}.mi-the-red-yeti:before{content:"\F0C0"}.mi-themeco:before{content:"\F0C1"}.mi-themeisle:before{content:"\F0C2"}.mi-think-peaks:before{content:"\F0C3"}.mi-trade-federation:before{content:"\F0C4"}.mi-trello:before{content:"\F0C5"}.mi-tripadvisor:before{content:"\F0C6"}.mi-tumblr-square:before{content:"\F0C7"}.mi-tumblr:before{content:"\F0C8"}.mi-twitch:before{content:"\F0C9"}.mi-twitter-square:before{content:"\F0CA"}.mi-typo3:before{content:"\F0CB"}.mi-ubuntu:before{content:"\F0CC"}.mi-uikit:before{content:"\F0CD"}.mi-uniregistry:before{content:"\F0CE"}.mi-untappd:before{content:"\F0CF"}.mi-ups:before{content:"\F0D0"}.mi-usb:before{content:"\F0D1"}.mi-usps:before{content:"\F0D2"}.mi-ussunnah:before{content:"\F0D3"}.mi-vaadin:before{content:"\F0D4"}.mi-viacoin:before{content:"\F0D5"}.mi-viadeo-square:before{content:"\F0D6"}.mi-viadeo:before{content:"\F0D7"}.mi-viber:before{content:"\F0D8"}.mi-vimeo-square:before{content:"\F0D9"}.mi-vimeo-v:before{content:"\F0DA"}.mi-vimeo:before{content:"\F0DB"}.mi-vine:before{content:"\F0DC"}.mi-vk:before{content:"\F0DD"}.mi-vnv:before{content:"\F0DE"}.mi-vuejs:before{content:"\F0DF"}.mi-weebly:before{content:"\F0E0"}.mi-weibo:before{content:"\F0E1"}.mi-weixin:before{content:"\F0E2"}.mi-whatsapp-square:before{content:"\F0E3"}.mi-whatsapp:before{content:"\F0E4"}.mi-whmcs:before{content:"\F0E5"}.mi-wikipedia-w:before{content:"\F0E6"}.mi-windows:before{content:"\F0E7"}.mi-wix:before{content:"\F0E8"}.mi-wizards-of-the-coast:before{content:"\F0E9"}.mi-wolf-pack-battalion:before{content:"\F0EA"}.mi-wordpress-simple:before{content:"\F0EB"}.mi-wordpress:before{content:"\F0EC"}.mi-wpbeginner:before{content:"\F0ED"}.mi-wpexplorer:before{content:"\F0EE"}.mi-wpforms:before{content:"\F0EF"}.mi-wpressr:before{content:"\F0F0"}.mi-xbox:before{content:"\F0F1"}.mi-xing-square:before{content:"\F0F2"}.mi-xing:before{content:"\F0F3"}.mi-y-combinator:before{content:"\F0F4"}.mi-yahoo:before{content:"\F0F5"}.mi-yandex-international:before{content:"\F0F6"}.mi-yandex:before{content:"\F0F7"}.mi-yarn:before{content:"\F0F8"}.mi-yelp:before{content:"\F0F9"}.mi-yoast:before{content:"\F0FA"}.mi-youtube-square:before{content:"\F0FB"}.mi-youtube:before{content:"\F0FC"}.mi-zhihu:before{content:"\F0FD"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.uib-datepicker .uib-title,.uib-left,.uib-right{width:100%}.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}.uib-day button,.uib-month button,.uib-year button{min-width:100%}.uib-position-measure{display:block!important;visibility:hidden!important;position:absolute!important;top:-9999px!important;left:-9999px!important}.uib-position-scrollbar-measure{position:absolute!important;top:-9999px!important;width:50px!important;height:50px!important;overflow:scroll!important}.uib-position-body-scrollbar-measure{overflow:scroll!important}.uib-datepicker-popup.dropdown-menu{display:block;float:none;margin:0}.uib-button-bar{padding:10px 9px 2px}[uib-popover-html-popup].popover.bottom-left>.arrow,[uib-popover-html-popup].popover.bottom-right>.arrow,[uib-popover-html-popup].popover.left-bottom>.arrow,[uib-popover-html-popup].popover.left-top>.arrow,[uib-popover-html-popup].popover.right-bottom>.arrow,[uib-popover-html-popup].popover.right-top>.arrow,[uib-popover-html-popup].popover.top-left>.arrow,[uib-popover-html-popup].popover.top-right>.arrow,[uib-popover-popup].popover.bottom-left>.arrow,[uib-popover-popup].popover.bottom-right>.arrow,[uib-popover-popup].popover.left-bottom>.arrow,[uib-popover-popup].popover.left-top>.arrow,[uib-popover-popup].popover.right-bottom>.arrow,[uib-popover-popup].popover.right-top>.arrow,[uib-popover-popup].popover.top-left>.arrow,[uib-popover-popup].popover.top-right>.arrow,[uib-popover-template-popup].popover.bottom-left>.arrow,[uib-popover-template-popup].popover.bottom-right>.arrow,[uib-popover-template-popup].popover.left-bottom>.arrow,[uib-popover-template-popup].popover.left-top>.arrow,[uib-popover-template-popup].popover.right-bottom>.arrow,[uib-popover-template-popup].popover.right-top>.arrow,[uib-popover-template-popup].popover.top-left>.arrow,[uib-popover-template-popup].popover.top-right>.arrow,[uib-tooltip-html-popup].tooltip.bottom-left>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-right>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-bottom>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-top>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-bottom>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-top>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-left>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-right>.tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-left>.tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-right>.tooltip-arrow,[uib-tooltip-popup].tooltip.left-bottom>.tooltip-arrow,[uib-tooltip-popup].tooltip.left-top>.tooltip-arrow,[uib-tooltip-popup].tooltip.right-bottom>.tooltip-arrow,[uib-tooltip-popup].tooltip.right-top>.tooltip-arrow,[uib-tooltip-popup].tooltip.top-left>.tooltip-arrow,[uib-tooltip-popup].tooltip.top-right>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-left>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-right>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-bottom>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-top>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-bottom>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-top>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-left>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-right>.tooltip-arrow{top:auto;bottom:auto;left:auto;right:auto;margin:0}[uib-popover-html-popup].popover,[uib-popover-popup].popover,[uib-popover-template-popup].popover{display:block!important}.uib-time input{width:50px}[uib-typeahead-popup].dropdown-menu{display:block} \ No newline at end of file + */@font-face{font-family:micon;font-style:normal;font-weight:400;src:url(../fonts/micon.eot);src:url(../fonts/micon.eot?#iefix) format("embedded-opentype"),url(../fonts/micon.woff2) format("woff2"),url(../fonts/micon.woff) format("woff"),url(../fonts/micon.ttf) format("truetype"),url(../fonts/micon.svg#micon) format("svg")}.mi{font-family:micon;font-weight:400;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.mi-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.mi-xs{font-size:.75em}.mi-sm{font-size:.875em}.mi-1x{font-size:1em}.mi-2x,.mi-stack-2x{font-size:2em}.mi-3x{font-size:3em}.mi-4x{font-size:4em}.mi-5x{font-size:5em}.mi-6x{font-size:6em}.mi-7x{font-size:7em}.mi-8x{font-size:8em}.mi-9x{font-size:9em}.mi-10x{font-size:10em}.mi-fw{text-align:center;width:1.25em}.mi-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.mi-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.mi-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.mi-pull-left{float:left}.mi-pull-right{float:right}.mi.mi-pull-left{margin-right:.3em}.mi.mi-pull-right{margin-left:.3em}.mi-spin{animation:mi-spin 2s infinite linear}.mi-pulse{animation:mi-spin 1s infinite steps(8)}@keyframes mi-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.mi-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.mi-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.mi-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.mi-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scale(-1,1)}.mi-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(1,-1)}.mi-flip-horizontal.mi-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(-1,-1)}:root .mi-flip-horizontal,:root .mi-flip-vertical,:root .mi-rotate-180,:root .mi-rotate-270,:root .mi-rotate-90{filter:none}.mi-stack{height:2em;line-height:2em;width:2.5em}.mi-stack-1x,.mi-stack-2x{left:0;position:absolute;text-align:center;width:100%}.mi-stack-1x{line-height:inherit}.mi-Accept:before,.mi-AcceptLegacy:before,.mi-CheckmarkListviewLegacy:before,.mi-CheckmarkMenuLegacy:before{content:"\EA01"}.mi-Accident:before{content:"\EA02"}.mi-AccidentSolid:before{content:"\EA03"}.mi-Accounts:before,.mi-AccountsLegacy:before{content:"\EA04"}.mi-ActionCenter:before{content:"\EA05"}.mi-ActionCenterAsterisk:before{content:"\EA06"}.mi-ActionCenterMirrored:before{content:"\EA07"}.mi-ActionCenterNotification:before{content:"\EA08"}.mi-ActionCenterNotificationMirrored:before{content:"\EA09"}.mi-ActionCenterQuiet:before{content:"\EA0A"}.mi-ActionCenterQuietNotification:before{content:"\EA0B"}.mi-Add:before,.mi-AddLegacy:before{content:"\EA0C"}.mi-AddFriend:before,.mi-AddFriendLegacy:before{content:"\EA0D"}.mi-AddRemoteDevice:before{content:"\EA0E"}.mi-AddSurfaceHub:before{content:"\EA0F"}.mi-AddTo:before{content:"\EA10"}.mi-AdjustHologram:before{content:"\EA11"}.mi-Admin:before,.mi-AdminLegacy:before{content:"\EA12"}.mi-Airplane:before{content:"\EA13"}.mi-AirplaneSolid:before{content:"\EA14"}.mi-AlignCenter:before,.mi-AlignCenterLegacy:before{content:"\EA15"}.mi-AlignLeft:before,.mi-AlignLeftLegacy:before{content:"\EA16"}.mi-AlignRight:before,.mi-AlignRightLegacy:before{content:"\EA17"}.mi-AllApps:before,.mi-AllAppsLegacy:before{content:"\EA18"}.mi-AllAppsLegacyMirrored:before,.mi-AllAppsMirrored:before{content:"\EA19"}.mi-Annotation:before{content:"\EA1A"}.mi-AppIconDefault:before{content:"\EA1B"}.mi-Apps:before{content:"\EA1C"}.mi-AreaChart:before{content:"\EA1D"}.mi-ArrowDown8:before{content:"\EA1E"}.mi-ArrowLeft8:before{content:"\EA1F"}.mi-ArrowRight8:before{content:"\EA20"}.mi-ArrowUp8:before{content:"\EA21"}.mi-AspectRatio:before{content:"\EA22"}.mi-Asterisk:before{content:"\EA23"}.mi-AsteriskBadge12:before{content:"\EA24"}.mi-Attach:before,.mi-AttachLegacy:before{content:"\EA25"}.mi-AttachCamera:before,.mi-AttachCameraLegacy:before{content:"\EA26"}.mi-Audio:before,.mi-AudioLegacy:before{content:"\EA27"}.mi-ArrowHTMLLegacy:before,.mi-Back:before,.mi-BackBttnArrow20Legacy:before,.mi-BackBttnArrow42Legacy:before,.mi-BackLegacy:before{content:"\EA28"}.mi-BackMirrored:before{content:"\EA29"}.mi-BackSpaceQWERTYLg:before{content:"\EA2B"}.mi-BackSpaceQWERTYMd:before{content:"\EA2C"}.mi-BackSpaceQWERTYSm:before{content:"\EA2D"}.mi-BackToWindow:before,.mi-BackToWindowLegacy:before{content:"\EA2E"}.mi-BackgroundToggle:before{content:"\EA2F"}.mi-Badge:before{content:"\EA30"}.mi-BandBattery0:before{content:"\EA31"}.mi-BandBattery1:before{content:"\EA32"}.mi-BandBattery2:before{content:"\EA33"}.mi-BandBattery3:before{content:"\EA34"}.mi-BandBattery4:before{content:"\EA35"}.mi-BandBattery5:before{content:"\EA36"}.mi-BandBattery6:before{content:"\EA37"}.mi-Bank:before{content:"\EA38"}.mi-BarcodeScanner:before{content:"\EA39"}.mi-Battery0:before{content:"\EA3A"}.mi-Battery1:before{content:"\EA3B"}.mi-Battery10:before{content:"\EA3C"}.mi-Battery2:before{content:"\EA3D"}.mi-Battery3:before{content:"\EA3E"}.mi-Battery4:before{content:"\EA3F"}.mi-Battery5:before{content:"\EA40"}.mi-Battery6:before{content:"\EA41"}.mi-Battery7:before{content:"\EA42"}.mi-Battery8:before{content:"\EA43"}.mi-Battery9:before{content:"\EA44"}.mi-BatteryCharging0:before{content:"\EA45"}.mi-BatteryCharging1:before{content:"\EA46"}.mi-BatteryCharging10:before{content:"\EA47"}.mi-BatteryCharging2:before{content:"\EA48"}.mi-BatteryCharging3:before{content:"\EA49"}.mi-BatteryCharging4:before{content:"\EA4A"}.mi-BatteryCharging5:before{content:"\EA4B"}.mi-BatteryCharging6:before{content:"\EA4C"}.mi-BatteryCharging7:before{content:"\EA4D"}.mi-BatteryCharging8:before{content:"\EA4E"}.mi-BatteryCharging9:before{content:"\EA4F"}.mi-BatterySaver0:before{content:"\EA50"}.mi-BatterySaver1:before{content:"\EA51"}.mi-BatterySaver10:before{content:"\EA52"}.mi-BatterySaver2:before{content:"\EA53"}.mi-BatterySaver3:before{content:"\EA54"}.mi-BatterySaver4:before{content:"\EA55"}.mi-BatterySaver5:before{content:"\EA56"}.mi-BatterySaver6:before{content:"\EA57"}.mi-BatterySaver7:before{content:"\EA58"}.mi-BatterySaver8:before{content:"\EA59"}.mi-BatterySaver9:before{content:"\EA5A"}.mi-BatteryUnknown:before{content:"\EA5B"}.mi-Beta:before{content:"\EA5C"}.mi-BidiLtr:before{content:"\EA5D"}.mi-BidiRtl:before{content:"\EA5E"}.mi-BlockContact:before,.mi-BlockContactLegacy:before{content:"\EA5F"}.mi-Blocked:before,.mi-BlockedLegacy:before{content:"\EA61"}.mi-BlueLight:before{content:"\EA62"}.mi-Bluetooth:before{content:"\EA63"}.mi-BodyCam:before{content:"\EA64"}.mi-Bold:before,.mi-BoldLegacy:before{content:"\EA65"}.mi-BoldF:before,.mi-BoldFLegacy:before{content:"\EA67"}.mi-BoldG:before,.mi-BoldGLegacy:before{content:"\EA69"}.mi-BoldKorean:before,.mi-BoldKoreanLegacy:before{content:"\EA6B"}.mi-BoldN:before,.mi-BoldNLegacy:before{content:"\EA6D"}.mi-BoldRussion:before,.mi-BoldRussionLegacy:before{content:"\EA6F"}.mi-Bookmarks:before,.mi-BookmarksLegacy:before{content:"\EA70"}.mi-BookmarksLegacyMirrored:before,.mi-BookmarksMirrored:before{content:"\EA71"}.mi-Brightness:before{content:"\EA72"}.mi-Broom:before{content:"\EA73"}.mi-BrowsePhotos:before,.mi-BrowsePhotosLegacy:before{content:"\EA74"}.mi-BrushSize:before{content:"\EA75"}.mi-Bug:before{content:"\EA76"}.mi-BuildingEnergy:before{content:"\EA77"}.mi-BulletedList:before,.mi-BulletedListLegacy:before,.mi-ListLegacy:before{content:"\EA78"}.mi-BulletedListLegacyMirrored:before,.mi-BulletedListMirrored:before,.mi-ListLegacyMirrored:before{content:"\EA79"}.mi-Bullseye:before{content:"\EA7A"}.mi-BumperLeft:before{content:"\EA7B"}.mi-BumperRight:before{content:"\EA7C"}.mi-Bus:before{content:"\EA7D"}.mi-BusSolid:before{content:"\EA7E"}.mi-ButtonA:before{content:"\EA7F"}.mi-ButtonB:before{content:"\EA80"}.mi-ButtonMenu:before{content:"\EA81"}.mi-ButtonView2:before{content:"\EA82"}.mi-ButtonX:before{content:"\EA83"}.mi-ButtonY:before{content:"\EA84"}.mi-CC:before,.mi-CCLegacy:before{content:"\EA85"}.mi-CCEuro:before,.mi-CCEuroLegacy:before{content:"\EA87"}.mi-CCJapan:before,.mi-CCJapanLegacy:before{content:"\EA89"}.mi-Cafe:before{content:"\EA8A"}.mi-Calculator:before,.mi-CalculatorLegacy:before{content:"\EA8B"}.mi-CalculatorAddition:before{content:"\EA8C"}.mi-BackSpaceQWERTY:before,.mi-CalculatorBackspace:before{content:"\EA8D"}.mi-CalculatorDivide:before{content:"\EA8E"}.mi-CalculatorEqualTo:before{content:"\EA8F"}.mi-CalculatorMultiply:before{content:"\EA90"}.mi-CalculatorNegate:before{content:"\EA91"}.mi-CalculatorPercentage:before{content:"\EA92"}.mi-CalculatorSquareroot:before{content:"\EA93"}.mi-CalculatorSubtract:before{content:"\EA94"}.mi-Calendar:before,.mi-CalendarLegacy:before{content:"\EA95"}.mi-CalendarDay:before,.mi-CalendarDayLegacy:before{content:"\EA96"}.mi-CalendarLegacyMirrored:before,.mi-CalendarMirrored:before{content:"\EA97"}.mi-CalendarReply:before,.mi-CalendarReplyLegacy:before{content:"\EA98"}.mi-CalendarSolid:before{content:"\EA99"}.mi-CalendarWeek:before,.mi-CalendarWeekLegacy:before{content:"\EA9A"}.mi-CallForwardInternational:before{content:"\EA9B"}.mi-CallForwardInternationalMirrored:before{content:"\EA9C"}.mi-CallForwardRoaming:before{content:"\EA9D"}.mi-CallForwardRoamingMirrored:before{content:"\EA9E"}.mi-CallForwarding:before{content:"\EA9F"}.mi-CallForwardingMirrored:before{content:"\EAA0"}.mi-CalligraphyFill:before{content:"\EAA1"}.mi-CalligraphyPen:before{content:"\EAA2"}.mi-Calories:before{content:"\EAA3"}.mi-Camera:before,.mi-CameraLegacy:before{content:"\EAA4"}.mi-Cancel:before,.mi-CancelLegacy:before{content:"\EAA5"}.mi-Caption:before,.mi-CaptionLegacy:before{content:"\EAA6"}.mi-Car:before,.mi-DrivingMode:before{content:"\EAA7"}.mi-CaretBottomRightSolidCenter8:before{content:"\EAA8"}.mi-CaretDownSolid8:before{content:"\EAA9"}.mi-CaretLeftSolid8:before{content:"\EAAA"}.mi-CaretRight8:before{content:"\EAAB"}.mi-CaretRightSolid8:before{content:"\EAAC"}.mi-CaretUpSolid8:before{content:"\EAAD"}.mi-CashDrawer:before{content:"\EAAE"}.mi-CellPhone:before,.mi-CellPhoneLegacy:before,.mi-MobileContactLegacy:before{content:"\EAAF"}.mi-Certificate:before{content:"\EAB0"}.mi-CharacterAppearance:before{content:"\EAB1"}.mi-Characters:before,.mi-CharactersLegacy:before{content:"\EAB2"}.mi-ChatBubbles:before{content:"\EAB3"}.mi-CheckList:before{content:"\EAB4"}.mi-CheckMark:before,.mi-CheckMarkLegacy:before,.mi-CheckMarkZeroWidthLegacy:before{content:"\EAB5"}.mi-Checkbox:before,.mi-CheckboxLegacy:before{content:"\EAB6"}.mi-Checkbox14:before{content:"\EAB7"}.mi-CheckboxComposite:before,.mi-CheckboxCompositeLegacy:before{content:"\EAB8"}.mi-CheckboxComposite14:before{content:"\EAB9"}.mi-CheckboxCompositeReversed:before,.mi-CheckboxCompositeReversedLegacy:before{content:"\EABA"}.mi-CheckboxIndeterminate:before,.mi-CheckboxIndeterminateLegacy:before{content:"\EABC"}.mi-CheckboxIndeterminateCombo:before{content:"\EABD"}.mi-CheckboxIndeterminateCombo14:before{content:"\EABE"}.mi-ChecklistMirrored:before{content:"\EABF"}.mi-ChevronDown1Legacy:before,.mi-ChevronDown2Legacy:before,.mi-ChevronDown3Legacy:before,.mi-ChevronDown4Legacy:before,.mi-ChevronDown:before,.mi-ChevronFlipDownLegacy:before,.mi-ScrollChevronDownBoldLegacy:before,.mi-ScrollChevronDownLegacy:before{content:"\EAC0"}.mi-ChevronDownMed:before{content:"\EAC1"}.mi-ChevronDownSmLegacy:before,.mi-ChevronDownSmall:before{content:"\EAC2"}.mi-ChevronFlipLeftLegacy:before,.mi-ChevronLeft1Legacy:before,.mi-ChevronLeft2Legacy:before,.mi-ChevronLeft3Legacy:before,.mi-ChevronLeft4Legacy:before,.mi-ChevronLeft:before,.mi-ScrollChevronLeftBoldLegacy:before,.mi-ScrollChevronLeftLegacy:before{content:"\EAC3"}.mi-ChevronLeftMed:before{content:"\EAC4"}.mi-ChevronLeftSmLegacy:before,.mi-ChevronLeftSmall:before{content:"\EAC5"}.mi-ChevronFlipRightLegacy:before,.mi-ChevronRight1Legacy:before,.mi-ChevronRight2Legacy:before,.mi-ChevronRight3Legacy:before,.mi-ChevronRight4Legacy:before,.mi-ChevronRight:before,.mi-ScrollChevronRightBoldLegacy:before,.mi-ScrollChevronRightLegacy:before{content:"\EAC6"}.mi-ChevronRightMed:before{content:"\EAC7"}.mi-ChevronRightSmLegacy:before,.mi-ChevronRightSmall:before{content:"\EAC8"}.mi-ChevronFlipUpLegacy:before,.mi-ChevronUp1Legacy:before,.mi-ChevronUp2Legacy:before,.mi-ChevronUp3Legacy:before,.mi-ChevronUp4Legacy:before,.mi-ChevronUp:before,.mi-ScrollChevronUpBoldLegacy:before,.mi-ScrollChevronUpLegacy:before{content:"\EAC9"}.mi-ChevronUpMed:before{content:"\EACA"}.mi-ChevronUpSmall:before{content:"\EACB"}.mi-ChineseBoPoMoFo:before{content:"\EACC"}.mi-ChineseChangjie:before{content:"\EACD"}.mi-ChinesePinyin:before{content:"\EACE"}.mi-ChinesePunctuation:before{content:"\EACF"}.mi-ChineseQuick:before{content:"\EAD0"}.mi-ChipCardCreditCardReader:before{content:"\EAD1"}.mi-ChromeAnnotate:before{content:"\EAD2"}.mi-ChromeAnnotateContrast:before{content:"\EAD3"}.mi-ChromeBack:before{content:"\EAD4"}.mi-ChromeBackContrast:before{content:"\EAD5"}.mi-ChromeBackContrastMirrored:before{content:"\EAD6"}.mi-ChromeBackMirrored:before{content:"\EAD7"}.mi-ChromeBackToWindow:before{content:"\EAD8"}.mi-ChromeBackToWindowContrast:before{content:"\EAD9"}.mi-ChromeClose:before{content:"\EADA"}.mi-ChromeCloseContrast:before{content:"\EADB"}.mi-ChromeFullScreen:before{content:"\EADC"}.mi-ChromeFullScreenContrast:before{content:"\EADD"}.mi-ChromeMaximize:before{content:"\EADE"}.mi-ChromeMaximizeContrast:before{content:"\EADF"}.mi-ChromeMinimize:before{content:"\EAE0"}.mi-ChromeMinimizeContrast:before{content:"\EAE1"}.mi-ChromeRestore:before{content:"\EAE2"}.mi-ChromeRestoreContrast:before{content:"\EAE3"}.mi-ChromeSwitch:before{content:"\EAE4"}.mi-ChromeSwitchContast:before{content:"\EAE5"}.mi-CircleFill:before{content:"\EAE6"}.mi-CircleFillBadge12:before{content:"\EAE7"}.mi-CircleRing:before{content:"\EAE8"}.mi-CircleRingBadge12:before{content:"\EAE9"}.mi-CityNext:before{content:"\EAEA"}.mi-CityNext2:before{content:"\EAEB"}.mi-Clear:before,.mi-ClearLegacy:before{content:"\EAEC"}.mi-ClearAllInk:before{content:"\EAED"}.mi-ClearAllInkMirrored:before{content:"\EAEE"}.mi-ClearSelection:before,.mi-ClearSelectionLegacy:before{content:"\EAEF"}.mi-ClearSelectionLegacyMirrored:before,.mi-ClearSelectionMirrored:before{content:"\EAF0"}.mi-Click:before{content:"\EAF1"}.mi-ClipboardList:before{content:"\EAF2"}.mi-ClipboardListMirrored:before{content:"\EAF3"}.mi-ClippingTool:before{content:"\EAF4"}.mi-Clock:before,.mi-ClockLegacy:before{content:"\EAF6"}.mi-ClosePane:before,.mi-ClosePaneLegacy:before{content:"\EAF7"}.mi-ClosePaneLegacyMirrored:before,.mi-ClosePaneMirrored:before{content:"\EAF8"}.mi-Cloud:before{content:"\EAF9"}.mi-CloudPrinter:before{content:"\EAFA"}.mi-CloudSeach:before{content:"\EAFB"}.mi-Code:before{content:"\EAFC"}.mi-CollapseContent:before{content:"\EAFD"}.mi-CollapseContentSingle:before{content:"\EAFE"}.mi-CollateLandscape:before{content:"\EAFF"}.mi-CollateLandscapeSeparated:before{content:"\EB00"}.mi-CollatePortrait:before{content:"\EB01"}.mi-CollatePortraitSeparated:before{content:"\EB02"}.mi-Color:before,.mi-ColorLegacy:before{content:"\EB03"}.mi-ColorOff:before{content:"\EB04"}.mi-CommaKey:before{content:"\EB05"}.mi-CommandPrompt:before{content:"\EB06"}.mi-Comment:before,.mi-CommentLegacy:before{content:"\EB07"}.mi-Communications:before{content:"\EB08"}.mi-CompanionApp:before{content:"\EB09"}.mi-CompanionDeviceFramework:before{content:"\EB0A"}.mi-Completed:before{content:"\EB0B"}.mi-CompletedSolid:before{content:"\EB0C"}.mi-Component:before{content:"\EB0D"}.mi-Connect:before{content:"\EB0E"}.mi-ConnectApp:before,.mi-MiracastLogoLarge:before{content:"\EB0F"}.mi-Connected:before{content:"\EB10"}.mi-Construction:before{content:"\EB11"}.mi-ConstructionCone:before{content:"\EB12"}.mi-ConstructionSolid:before{content:"\EB13"}.mi-Contact3Legacy:before,.mi-Contact:before,.mi-ContactLegacy:before{content:"\EB14"}.mi-Contact2:before,.mi-Contact2Legacy:before{content:"\EB15"}.mi-ContactInfo:before,.mi-ContactInfoLegacy:before{content:"\EB16"}.mi-ContactInfoMirrored:before{content:"\EB17"}.mi-ContactPresence:before,.mi-ContactPresenceLegacy:before{content:"\EB18"}.mi-ContactSolid:before{content:"\EB19"}.mi-Copy:before,.mi-CopyLegacy:before{content:"\EB1A"}.mi-CopyTo:before{content:"\EB1B"}.mi-Courthouse:before{content:"\EB1C"}.mi-Crop:before,.mi-CropLegacy:before{content:"\EB1D"}.mi-CtrlSpatialLeft:before{content:"\EB1E"}.mi-CtrlSpatialRight:before{content:"\EB1F"}.mi-Cut:before,.mi-CutLegacy:before{content:"\EB20"}.mi-DMC:before{content:"\EB21"}.mi-DashKey:before{content:"\EB22"}.mi-DataSense:before{content:"\EB23"}.mi-DataSenseBar:before{content:"\EB24"}.mi-DateTime:before{content:"\EB25"}.mi-DateTimeMirrored:before{content:"\EB26"}.mi-DecreaseIndent:before,.mi-DecreaseIndentLegacy:before{content:"\EB28"}.mi-DecreaseIndentLegacyMirrored:before,.mi-DecreaseIndentMirrored:before{content:"\EB2A"}.mi-DefaultAPN:before{content:"\EB2B"}.mi-DefenderApp:before{content:"\EB2C"}.mi-DefenderBadge12:before{content:"\EB2D"}.mi-Delete:before,.mi-DeleteLegacy:before{content:"\EB2E"}.mi-Design:before{content:"\EB2F"}.mi-DetachablePC:before{content:"\EB30"}.mi-DevUpdate:before{content:"\EB31"}.mi-DeveloperTools:before{content:"\EB32"}.mi-DeviceDiscovery:before{content:"\EB33"}.mi-DeviceLaptopNoPic:before{content:"\EB34"}.mi-DeviceLaptopPic:before{content:"\EB35"}.mi-DeviceMonitorLeftPic:before{content:"\EB36"}.mi-DeviceMonitorNoPic:before{content:"\EB37"}.mi-DeviceMonitorRightPic:before{content:"\EB38"}.mi-Devices:before{content:"\EB39"}.mi-Devices3:before{content:"\EB3B"}.mi-Devices4:before{content:"\EB3C"}.mi-Devices2:before,.mi-DevicesLegacy:before{content:"\EB3D"}.mi-Diagnostic:before{content:"\EB3E"}.mi-Dial1:before{content:"\EB3F"}.mi-Dial10:before{content:"\EB40"}.mi-Dial11:before{content:"\EB41"}.mi-Dial12:before{content:"\EB42"}.mi-Dial13:before{content:"\EB43"}.mi-Dial14:before{content:"\EB44"}.mi-Dial15:before{content:"\EB45"}.mi-Dial16:before{content:"\EB46"}.mi-Dial2:before{content:"\EB47"}.mi-Dial3:before{content:"\EB48"}.mi-Dial4:before{content:"\EB49"}.mi-Dial5:before{content:"\EB4A"}.mi-Dial6:before{content:"\EB4B"}.mi-Dial7:before{content:"\EB4C"}.mi-Dial8:before{content:"\EB4D"}.mi-Dial9:before{content:"\EB4E"}.mi-DialShape1:before{content:"\EB4F"}.mi-DialShape2:before{content:"\EB50"}.mi-DialShape3:before{content:"\EB51"}.mi-DialShape4:before{content:"\EB52"}.mi-DialUp:before{content:"\EB53"}.mi-Dialpad:before{content:"\EB54"}.mi-Dictionary:before{content:"\EB55"}.mi-DictionaryAdd:before{content:"\EB56"}.mi-DictionaryCloud:before{content:"\EB57"}.mi-DirectAccess:before{content:"\EB58"}.mi-Directions:before,.mi-DirectionsLegacy:before{content:"\EB59"}.mi-DisableUpdates:before,.mi-DisableUpdatesLegacy:before{content:"\EB5A"}.mi-DisconnectDisplay:before{content:"\EB5B"}.mi-DisconnectDrive:before,.mi-DisconnectDriveLegacy:before{content:"\EB5C"}.mi-Dislike:before,.mi-DislikeLegacy:before{content:"\EB5D"}.mi-Dock:before{content:"\EB5E"}.mi-DockBottom:before,.mi-DockBottomLegacy:before{content:"\EB5F"}.mi-DockLeft:before,.mi-DockLeftLegacy:before{content:"\EB60"}.mi-DockLeftLegacyMirrored:before,.mi-DockLeftMirrored:before{content:"\EB61"}.mi-DockRight:before,.mi-DockRightLegacy:before{content:"\EB62"}.mi-DockRightLegacyMirrored:before,.mi-DockRightMirrored:before{content:"\EB63"}.mi-Document:before,.mi-DocumentLegacy:before{content:"\EB64"}.mi-DoublePinyin:before{content:"\EB65"}.mi-Down:before,.mi-DownLegacy:before{content:"\EB66"}.mi-DownShiftKey:before{content:"\EB67"}.mi-Download:before,.mi-DownloadLegacy:before{content:"\EB68"}.mi-DownloadMap:before{content:"\EB69"}.mi-Dpad:before{content:"\EB6A"}.mi-Draw:before{content:"\EB6B"}.mi-DrawSolid:before{content:"\EB6C"}.mi-Drop:before{content:"\EB6D"}.mi-DullSound:before{content:"\EB6E"}.mi-DullSoundKey:before{content:"\EB6F"}.mi-DuplexLandscapeOneSided:before{content:"\EB70"}.mi-DuplexLandscapeOneSidedMirrored:before{content:"\EB71"}.mi-DuplexLandscapeTwoSidedLongEdge:before{content:"\EB72"}.mi-DuplexLandscapeTwoSidedLongEdgeMirrored:before{content:"\EB73"}.mi-DuplexLandscapeTwoSidedShortEdge:before{content:"\EB74"}.mi-DuplexLandscapeTwoSidedShortEdgeMirrored:before{content:"\EB75"}.mi-DuplexPortraitOneSided:before{content:"\EB76"}.mi-DuplexPortraitOneSidedMirrored:before{content:"\EB77"}.mi-DuplexPortraitTwoSidedLongEdge:before{content:"\EB78"}.mi-DuplexPortraitTwoSidedLongEdgeMirrored:before{content:"\EB79"}.mi-DuplexPortraitTwoSidedShortEdge:before{content:"\EB7A"}.mi-DuplexPortraitTwoSidedShortEdgeMirrored:before{content:"\EB7B"}.mi-DynamicLock:before{content:"\EB7C"}.mi-EMI:before{content:"\EB7D"}.mi-Ear:before{content:"\EB7E"}.mi-Earbud:before{content:"\EB7F"}.mi-EaseOfAccess:before,.mi-EaseOfAccessLegacy:before{content:"\EB80"}.mi-Edit:before,.mi-EditLegacy:before{content:"\EB81"}.mi-EditLegacyMirrored:before,.mi-EditMirrored:before{content:"\EB82"}.mi-Education:before{content:"\EB83"}.mi-Emoji:before,.mi-EmojiLegacy:before{content:"\EB84"}.mi-Emoji2:before,.mi-Emoji2Legacy:before{content:"\EB85"}.mi-EmojiSwatch:before{content:"\EB86"}.mi-EmojiTabCelebrationObjects:before{content:"\EB87"}.mi-EmojiTabFavorites:before{content:"\EB88"}.mi-EmojiTabFoodPlants:before{content:"\EB89"}.mi-EmojiTabPeople:before{content:"\EB8A"}.mi-EmojiTabSmilesAnimals:before{content:"\EB8B"}.mi-EmojiTabSymbols:before{content:"\EB8C"}.mi-EmojiTabTextSmiles:before{content:"\EB8D"}.mi-EmojiTabTransitPlaces:before{content:"\EB8E"}.mi-EndPointSolid:before{content:"\EB90"}.mi-EnglishPunctuation:before{content:"\EB91"}.mi-Equalizer:before{content:"\EB92"}.mi-EraseTool:before{content:"\EB93"}.mi-EraseToolFill:before{content:"\EB94"}.mi-EraseToolFill2:before{content:"\EB95"}.mi-Error:before{content:"\EB96"}.mi-ErrorBadge:before{content:"\EB97"}.mi-ErrorBadge12:before{content:"\EB98"}.mi-Ethernet:before{content:"\EB99"}.mi-EthernetError:before{content:"\EB9A"}.mi-EthernetWarning:before{content:"\EB9B"}.mi-ExpandTile:before,.mi-ExpandTileLegacy:before{content:"\EB9C"}.mi-ExpandTileLegacyMirrored:before,.mi-ExpandTileMirrored:before{content:"\EB9D"}.mi-ExploitProtectionSettings:before{content:"\EB9E"}.mi-ExploreContent:before{content:"\EB9F"}.mi-ExploreContentSingle:before{content:"\EBA0"}.mi-Export:before,.mi-ImportLegacyMirrored:before,.mi-ImportMirrored:before{content:"\EBA1"}.mi-EyeGaze:before{content:"\EBA2"}.mi-Eyedropper:before{content:"\EBA3"}.mi-Family:before{content:"\EBA4"}.mi-FastForward:before{content:"\EBA5"}.mi-Favicon:before{content:"\EBA6"}.mi-FavoriteList:before{content:"\EBA8"}.mi-FavoriteInlineLegacy:before,.mi-FavoriteStar:before,.mi-OutlineStarLegacy:before,.mi-RatingStarLegacy:before,.mi-Unfavorite2Legacy:before{content:"\EBA9"}.mi-Favorite2Legacy:before,.mi-FavoriteLegacy:before,.mi-FavoriteStarFill:before,.mi-RatingStarFillLegacy:before,.mi-RatingStarFillReducedPaddingHTMLLegacy:before,.mi-RatingStarFillSmallLegacy:before,.mi-RatingStarFillZeroWidthLegacy:before,.mi-SolidStarLegacy:before{content:"\EBAA"}.mi-Feedback:before{content:"\EBAB"}.mi-FeedbackApp:before{content:"\EBAC"}.mi-Ferry:before{content:"\EBAD"}.mi-FerrySolid:before{content:"\EBAE"}.mi-FileExplorer:before{content:"\EBAF"}.mi-FileExplorerApp:before{content:"\EBB0"}.mi-Filter:before,.mi-FilterLegacy:before{content:"\EBB1"}.mi-FingerInking:before{content:"\EBB2"}.mi-Fingerprint:before{content:"\EBB3"}.mi-FitPage:before{content:"\EBB4"}.mi-EndPoint:before,.mi-Flag:before,.mi-FlagLegacy:before{content:"\EBB5"}.mi-Flashlight:before{content:"\EBB6"}.mi-FlickDown:before{content:"\EBB7"}.mi-FlickLeft:before{content:"\EBB8"}.mi-FlickRight:before{content:"\EBB9"}.mi-FlickUp:before{content:"\EBBA"}.mi-Folder:before{content:"\EBBB"}.mi-FolderFill:before,.mi-FolderLegacy:before{content:"\EBBC"}.mi-FolderHorizontal:before{content:"\EBBD"}.mi-FolderOpen:before{content:"\EBBE"}.mi-Font:before,.mi-FontLegacy:before{content:"\EBBF"}.mi-FontColor:before,.mi-FontColorLegacy:before{content:"\EBC0"}.mi-FontColorKorean:before,.mi-FontColorKoreanLegacy:before{content:"\EBC2"}.mi-FontDecrease:before,.mi-FontDecreaseLegacy:before{content:"\EBC3"}.mi-FontIncrease:before,.mi-FontIncreaseLegacy:before{content:"\EBC4"}.mi-FontSize:before,.mi-FontSizeLegacy:before{content:"\EBC5"}.mi-FontStyleKorean:before,.mi-FontStyleKoreanLegacy:before{content:"\EBC7"}.mi-ArrowHTMLLegacyMirrored:before,.mi-BackBttnMirroredArrow20Legacy:before,.mi-BackBttnMirroredArrow42Legacy:before,.mi-Forward:before,.mi-ForwardLegacy:before{content:"\EBC8"}.mi-ForwardMirrored:before{content:"\EBC9"}.mi-ForwardSm:before{content:"\EBCA"}.mi-FourBars:before,.mi-FourBarsLegacy:before{content:"\EBCB"}.mi-FreeFormClipping:before{content:"\EBCC"}.mi-Frigid:before{content:"\EBCD"}.mi-FullAlpha:before{content:"\EBCE"}.mi-FullCircleMask:before{content:"\EBCF"}.mi-FullHiragana:before{content:"\EBD0"}.mi-FullKatakana:before{content:"\EBD1"}.mi-FullScreen:before,.mi-FullScreenLegacy:before{content:"\EBD2"}.mi-FuzzyReading:before{content:"\EBD3"}.mi-GIF:before{content:"\EBD4"}.mi-Game:before{content:"\EBD5"}.mi-GameConsole:before{content:"\EBD6"}.mi-GiftboxOpen:before{content:"\EBD7"}.mi-GlobalNavigationButton:before{content:"\EBD8"}.mi-Globe:before,.mi-GlobeLegacy:before{content:"\EBD9"}.mi-Go:before,.mi-GoLegacy:before{content:"\EBDA"}.mi-GoLegacyMirrored:before,.mi-GoMirrored:before{content:"\EBDB"}.mi-GoToStart:before,.mi-GoToStartLegacy:before{content:"\EBDC"}.mi-GotoToday:before,.mi-GotoTodayLegacy:before{content:"\EBDD"}.mi-GridView:before{content:"\EBDE"}.mi-GripperBarHorizontal:before{content:"\EBDF"}.mi-GripperBarVertical:before{content:"\EBE0"}.mi-GripperResize:before{content:"\EBE1"}.mi-GripperResizeMirrored:before{content:"\EBE2"}.mi-GripperTool:before{content:"\EBE3"}.mi-Groceries:before{content:"\EBE4"}.mi-Group:before{content:"\EBE5"}.mi-GroupList:before{content:"\EBE6"}.mi-GuestUser:before{content:"\EBE7"}.mi-HMD:before{content:"\EBE8"}.mi-HWPInsert:before{content:"\EBE9"}.mi-HWPJoin:before{content:"\EBEA"}.mi-HWPNewLine:before{content:"\EBEB"}.mi-HWPOverwrite:before{content:"\EBEC"}.mi-HWPScratchOut:before{content:"\EBED"}.mi-HWPSplit:before{content:"\EBEE"}.mi-HWPStrikeThrough:before{content:"\EBEF"}.mi-HalfAlpha:before{content:"\EBF0"}.mi-HalfDullSound:before{content:"\EBF1"}.mi-HalfKatakana:before{content:"\EBF2"}.mi-HalfStarLeft:before{content:"\EBF3"}.mi-HalfStarRight:before{content:"\EBF4"}.mi-Handwriting:before{content:"\EBF5"}.mi-HangUp:before,.mi-HangUpLegacy:before{content:"\EBF6"}.mi-HardDrive:before{content:"\EBF7"}.mi-HeadlessDevice:before{content:"\EBF8"}.mi-Headphone:before{content:"\EBF9"}.mi-Headphone0:before{content:"\EBFA"}.mi-Headphone1:before{content:"\EBFB"}.mi-Headphone2:before{content:"\EBFC"}.mi-Headphone3:before{content:"\EBFD"}.mi-Headset:before{content:"\EBFE"}.mi-Health:before{content:"\EBFF"}.mi-Heart:before,.mi-HeartLegacy:before{content:"\EC00"}.mi-HeartBroken:before{content:"\EC01"}.mi-HeartBrokenLegacy:before,.mi-HeartBrokenZeroWidthLegacy:before{content:"\EC02"}.mi-HeartFill:before,.mi-HeartFillLegacy:before,.mi-HeartFillZeroWidthLegacy:before{content:"\EC03"}.mi-Help:before,.mi-HelpLegacy:before{content:"\EC04"}.mi-HelpLegacyMirrored:before,.mi-HelpMirrored:before{content:"\EC05"}.mi-HideBcc:before,.mi-HideBccLegacy:before{content:"\EC06"}.mi-Highlight:before,.mi-HighlightLegacy:before{content:"\EC07"}.mi-HighlightFill:before{content:"\EC08"}.mi-HighlightFill2:before{content:"\EC09"}.mi-History:before{content:"\EC0A"}.mi-HolePunchLandscapeBottom:before{content:"\EC0B"}.mi-HolePunchLandscapeLeft:before{content:"\EC0C"}.mi-HolePunchLandscapeRight:before{content:"\EC0D"}.mi-HolePunchLandscapeTop:before{content:"\EC0E"}.mi-HolePunchOff:before{content:"\EC0F"}.mi-HolePunchPortraitBottom:before{content:"\EC10"}.mi-HolePunchPortraitLeft:before{content:"\EC11"}.mi-HolePunchPortraitRight:before{content:"\EC12"}.mi-HolePunchPortraitTop:before{content:"\EC13"}.mi-HoloLensSelected:before{content:"\EC14"}.mi-Home:before,.mi-HomeLegacy:before{content:"\EC15"}.mi-HomeGroup:before{content:"\EC16"}.mi-HomeSolid:before{content:"\EC17"}.mi-HorizontalTabKey:before{content:"\EC18"}.mi-IBeam:before{content:"\EC19"}.mi-IBeamOutline:before{content:"\EC1A"}.mi-IOT:before{content:"\EC1B"}.mi-ImageExport:before{content:"\EC1C"}.mi-ExportMirrored:before,.mi-Import:before,.mi-ImportLegacy:before{content:"\EC1D"}.mi-ImportAll:before,.mi-ImportAllLegacy:before{content:"\EC1E"}.mi-ImportAllLegacyMirrored:before,.mi-ImportAllMirrored:before{content:"\EC1F"}.mi-Important:before,.mi-ImportantLegacy:before{content:"\EC20"}.mi-ImportantBadge12:before{content:"\EC21"}.mi-InPrivate:before{content:"\EC22"}.mi-IncidentTriangle:before{content:"\EC23"}.mi-IncreaseIndent:before,.mi-IncreaseIndentLegacy:before{content:"\EC25"}.mi-IncreaseIndentLegacyMirrored:before,.mi-IncreaseIndentMirrored:before{content:"\EC27"}.mi-Info:before{content:"\EC28"}.mi-Info2:before{content:"\EC29"}.mi-InfoSolid:before{content:"\EC2A"}.mi-InkingCaret:before{content:"\EC2B"}.mi-InkingColorFill:before{content:"\EC2C"}.mi-InkingColorOutline:before{content:"\EC2D"}.mi-InkingTool:before{content:"\EC2E"}.mi-InkingToolFill:before{content:"\EC2F"}.mi-InkingToolFill2:before{content:"\EC30"}.mi-Input:before{content:"\EC31"}.mi-InsiderHubApp:before{content:"\EC32"}.mi-InteractiveDashboard:before{content:"\EC33"}.mi-Italic:before,.mi-ItalicLegacy:before{content:"\EC34"}.mi-ItalicC:before,.mi-ItalicCLegacy:before{content:"\EC36"}.mi-ItalicI:before,.mi-ItalicILegacy:before{content:"\EC38"}.mi-ItalicK:before,.mi-ItalicKLegacy:before{content:"\EC3A"}.mi-ItalicKorean:before,.mi-ItalicKoreanLegacy:before{content:"\EC3C"}.mi-ItalicRussian:before,.mi-ItalicRussianLegacy:before{content:"\EC3E"}.mi-Japanese:before{content:"\EC3F"}.mi-JpnRomanji:before{content:"\EC40"}.mi-JpnRomanjiLock:before{content:"\EC41"}.mi-JpnRomanjiShift:before{content:"\EC42"}.mi-JpnRomanjiShiftLock:before{content:"\EC43"}.mi-Key12On:before{content:"\EC44"}.mi-Keyboard12Key:before{content:"\EC46"}.mi-KeyboardBrightness:before{content:"\EC47"}.mi-KeyBoardLegacy:before,.mi-KeyboardClassic:before{content:"\EC48"}.mi-KeyboardDismiss:before{content:"\EC49"}.mi-KeyboardDock:before{content:"\EC4A"}.mi-KeyboardFull:before{content:"\EC4B"}.mi-KeyboardLeftAligned:before{content:"\EC4C"}.mi-KeyboardLeftDock:before{content:"\EC4D"}.mi-KeyboardLeftHanded:before{content:"\EC4E"}.mi-KeyboardLowerBrightness:before{content:"\EC4F"}.mi-KeyboardNarrow:before{content:"\EC50"}.mi-KeyboardOneHanded:before{content:"\EC51"}.mi-KeyboardRightAligned:before{content:"\EC52"}.mi-KeyboardRightDock:before{content:"\EC53"}.mi-KeyboardRightHanded:before{content:"\EC54"}.mi-KeyboardSettings:before{content:"\EC55"}.mi-KeyboardShortcut:before{content:"\EC56"}.mi-KeyboardSplit:before,.mi-KeyboardSplitLegacy:before{content:"\EC57"}.mi-KeyboardStandard:before,.mi-KeyboardStandardLegacy:before{content:"\EC58"}.mi-KeyboardUndock:before{content:"\EC59"}.mi-KnowledgeArticle:before{content:"\EC5A"}.mi-Korean:before{content:"\EC5B"}.mi-LEDLight:before{content:"\EC5C"}.mi-Label:before{content:"\EC5D"}.mi-LandscapeOrientation:before{content:"\EC5E"}.mi-LandscapeOrientationMirrored:before{content:"\EC5F"}.mi-LangJPN:before{content:"\EC60"}.mi-LanguageChs:before{content:"\EC61"}.mi-LanguageCht:before{content:"\EC62"}.mi-LanguageJpn:before{content:"\EC63"}.mi-LanguageKor:before{content:"\EC64"}.mi-LaptopSecure:before{content:"\EC65"}.mi-LaptopSelected:before{content:"\EC66"}.mi-LargeErase:before{content:"\EC67"}.mi-Layout:before,.mi-LayoutLegacy:before{content:"\EC69"}.mi-Leaf:before{content:"\EC6A"}.mi-LeaveChat:before,.mi-LeaveChatLegacy:before{content:"\EC6B"}.mi-LeaveChatMirrored:before{content:"\EC6C"}.mi-LeftArrowKeyTime0:before{content:"\EC6D"}.mi-LeftDoubleQuote:before{content:"\EC6E"}.mi-LeftQuote:before{content:"\EC6F"}.mi-LeftStick:before{content:"\EC70"}.mi-Lexicon:before{content:"\EC71"}.mi-Library:before,.mi-LibraryLegacy:before{content:"\EC72"}.mi-Light:before{content:"\EC73"}.mi-LightningBolt:before{content:"\EC75"}.mi-Like:before,.mi-LikeInlineLegacy:before,.mi-LikeLegacy:before{content:"\EC76"}.mi-LikeDislike:before,.mi-LikeDislikeLegacy:before{content:"\EC77"}.mi-LineDisplay:before{content:"\EC78"}.mi-Link:before,.mi-LinkLegacy:before{content:"\EC79"}.mi-List:before{content:"\EC7A"}.mi-ListMirrored:before{content:"\EC7B"}.mi-Location:before,.mi-LocationLegacy:before{content:"\EC7C"}.mi-Lock:before,.mi-LockLegacy:before{content:"\EC7D"}.mi-LockFeedback:before{content:"\EC7E"}.mi-LockScreenGlance:before{content:"\EC7F"}.mi-LockscreenDesktop:before{content:"\EC80"}.mi-LowerBrightness:before{content:"\EC81"}.mi-MagStripeReader:before{content:"\EC82"}.mi-Mail:before,.mi-MailLegacy:before{content:"\EC83"}.mi-MailBadge12:before{content:"\EC84"}.mi-MailFill:before,.mi-MailFillLegacy:before,.mi-MailMessageLegacy:before{content:"\EC85"}.mi-MailForward:before,.mi-MailForwardLegacy:before{content:"\EC86"}.mi-MailForwardLegacyMirrored:before,.mi-MailForwardMirrored:before{content:"\EC87"}.mi-MailReply:before,.mi-MailReplyLegacy:before{content:"\EC88"}.mi-MailReplyAll:before,.mi-MailReplyAllLegacy:before{content:"\EC89"}.mi-MailReplyAllLegacyMirrored:before,.mi-MailReplyAllMirrored:before{content:"\EC8A"}.mi-MailReplyLegacyMirrored:before,.mi-MailReplyMirrored:before{content:"\EC8B"}.mi-Manage:before,.mi-ManageLegacy:before{content:"\EC8C"}.mi-MapCompassBottom:before{content:"\EC8D"}.mi-MapCompassTop:before{content:"\EC8E"}.mi-MapDirections:before{content:"\EC8F"}.mi-MapDrive:before,.mi-MapDriveLegacy:before{content:"\EC90"}.mi-MapLayers:before{content:"\EC91"}.mi-MapLegacy:before,.mi-MapPin:before{content:"\EC92"}.mi-MapPin2:before,.mi-MapPinLegacy:before{content:"\EC94"}.mi-Marker:before{content:"\EC95"}.mi-Marquee:before{content:"\EC96"}.mi-Media:before{content:"\EC97"}.mi-MediaStorageTower:before{content:"\EC98"}.mi-Megaphone:before{content:"\EC99"}.mi-Memo:before,.mi-MemoLegacy:before{content:"\EC9A"}.mi-CommentInlineLegacy:before,.mi-Message:before,.mi-MessageLegacy:before{content:"\EC9B"}.mi-MicClipping:before{content:"\EC9C"}.mi-MicError:before{content:"\EC9D"}.mi-MicOff:before{content:"\EC9E"}.mi-MicOn:before{content:"\EC9F"}.mi-MicSleep:before{content:"\ECA0"}.mi-Microphone:before,.mi-MicrophoneLegacy:before{content:"\ECA1"}.mi-MicrophoneListening:before{content:"\ECA2"}.mi-MiracastLogoSmall:before{content:"\ECA3"}.mi-MixVolumes:before{content:"\ECA4"}.mi-MobActionCenter:before{content:"\ECA5"}.mi-MobAirplane:before{content:"\ECA6"}.mi-MobBattery0:before{content:"\ECA7"}.mi-MobBattery1:before{content:"\ECA8"}.mi-MobBattery10:before{content:"\ECA9"}.mi-MobBattery2:before{content:"\ECAA"}.mi-MobBattery3:before{content:"\ECAB"}.mi-MobBattery4:before{content:"\ECAC"}.mi-MobBattery5:before{content:"\ECAD"}.mi-MobBattery6:before{content:"\ECAE"}.mi-MobBattery7:before{content:"\ECAF"}.mi-MobBattery8:before{content:"\ECB0"}.mi-MobBattery9:before{content:"\ECB1"}.mi-MobBatteryCharging0:before{content:"\ECB2"}.mi-MobBatteryCharging1:before{content:"\ECB3"}.mi-MobBatteryCharging10:before{content:"\ECB4"}.mi-MobBatteryCharging2:before{content:"\ECB5"}.mi-MobBatteryCharging3:before{content:"\ECB6"}.mi-MobBatteryCharging4:before{content:"\ECB7"}.mi-MobBatteryCharging5:before{content:"\ECB8"}.mi-MobBatteryCharging6:before{content:"\ECB9"}.mi-MobBatteryCharging7:before{content:"\ECBA"}.mi-MobBatteryCharging8:before{content:"\ECBB"}.mi-MobBatteryCharging9:before{content:"\ECBC"}.mi-MobBatterySaver0:before{content:"\ECBD"}.mi-MobBatterySaver1:before{content:"\ECBE"}.mi-MobBatterySaver10:before{content:"\ECBF"}.mi-MobBatterySaver2:before{content:"\ECC0"}.mi-MobBatterySaver3:before{content:"\ECC1"}.mi-MobBatterySaver4:before{content:"\ECC2"}.mi-MobBatterySaver5:before{content:"\ECC3"}.mi-MobBatterySaver6:before{content:"\ECC4"}.mi-MobBatterySaver7:before{content:"\ECC5"}.mi-MobBatterySaver8:before{content:"\ECC6"}.mi-MobBatterySaver9:before{content:"\ECC7"}.mi-MobBatteryUnknown:before{content:"\ECC8"}.mi-MobBluetooth:before{content:"\ECC9"}.mi-MobCallForwarding:before{content:"\ECCA"}.mi-MobCallForwardingMirrored:before{content:"\ECCB"}.mi-MobDrivingMode:before{content:"\ECCC"}.mi-MobLocation:before{content:"\ECCD"}.mi-MobQuietHours:before{content:"\ECCE"}.mi-MobSIMError:before{content:"\ECCF"}.mi-MobSIMLock:before{content:"\ECD0"}.mi-MobSIMMissing:before{content:"\ECD1"}.mi-MobSignal1:before{content:"\ECD2"}.mi-MobSignal2:before{content:"\ECD3"}.mi-MobSignal3:before{content:"\ECD4"}.mi-MobSignal4:before{content:"\ECD5"}.mi-MobSignal5:before{content:"\ECD6"}.mi-MobWifi1:before{content:"\ECD7"}.mi-MobWifi2:before{content:"\ECD8"}.mi-MobWifi3:before{content:"\ECD9"}.mi-MobWifi4:before{content:"\ECDA"}.mi-MobWifiHotspot:before{content:"\ECDB"}.mi-MobWifiWarning1:before{content:"\ECDC"}.mi-MobWifiWarning2:before{content:"\ECDD"}.mi-MobWifiWarning3:before{content:"\ECDE"}.mi-MobWifiWarning4:before{content:"\ECDF"}.mi-MobeSIM:before{content:"\ECE0"}.mi-MobeSIMBusy:before{content:"\ECE1"}.mi-MobeSIMLocked:before{content:"\ECE2"}.mi-MobeSIMNoProfile:before{content:"\ECE3"}.mi-MobileLocked:before{content:"\ECE4"}.mi-MobileSelected:before{content:"\ECE5"}.mi-MobileTablet:before{content:"\ECE6"}.mi-More:before,.mi-MoreLegacy:before{content:"\ECE7"}.mi-Mouse:before{content:"\ECE8"}.mi-MoveToFolder:before,.mi-MoveToFolderLegacy:before{content:"\ECE9"}.mi-Movies:before{content:"\ECEA"}.mi-MultiSelect:before,.mi-MultiSelectLegacy:before{content:"\ECEB"}.mi-MultiSelectLegacyMirrored:before,.mi-MultiSelectMirrored:before{content:"\ECEC"}.mi-MultimediaDMP:before{content:"\ECED"}.mi-MultimediaDMS:before{content:"\ECEE"}.mi-MultimediaDVR:before{content:"\ECEF"}.mi-MultimediaPMP:before{content:"\ECF0"}.mi-Multitask:before{content:"\ECF1"}.mi-Multitask16:before{content:"\ECF2"}.mi-MultitaskExpanded:before{content:"\ECF3"}.mi-MusicAlbum:before{content:"\ECF4"}.mi-MusicInfo:before,.mi-MusicInfoLegacy:before{content:"\ECF5"}.mi-MusicNote:before{content:"\ECF6"}.mi-MusicSharing:before{content:"\ECF7"}.mi-MusicSharingOff:before{content:"\ECF8"}.mi-Mute:before,.mi-MuteLegacy:before{content:"\ECF9"}.mi-MyNetwork:before{content:"\ECFA"}.mi-NUIFPContinueSlideAction:before{content:"\ECFB"}.mi-NUIFPContinueSlideHand:before{content:"\ECFC"}.mi-NUIFPPressAction:before{content:"\ECFD"}.mi-NUIFPPressHand:before{content:"\ECFE"}.mi-NUIFPPressRepeatAction:before{content:"\ECFF"}.mi-NUIFPRollLeftAction:before{content:"\ED00"}.mi-NUIFPRollLeftHand:before{content:"\ED01"}.mi-NUIFPRollRightHand:before{content:"\ED02"}.mi-NUIFPRollRightHandAction:before{content:"\ED03"}.mi-NUIFPStartSlideAction:before{content:"\ED04"}.mi-NUIFPPressRepeatHand:before,.mi-NUIFPStartSlideHand:before{content:"\ED05"}.mi-NUIFace:before{content:"\ED06"}.mi-NUIIris:before{content:"\ED07"}.mi-Narrator:before{content:"\ED08"}.mi-NarratorForward:before{content:"\ED09"}.mi-NarratorForwardMirrored:before{content:"\ED0A"}.mi-NearbySharing:before{content:"\ED0B"}.mi-Network:before{content:"\ED0C"}.mi-NetworkAdapter:before{content:"\ED0D"}.mi-NetworkConnected:before{content:"\ED0E"}.mi-NetworkConnectedCheckmark:before{content:"\ED0F"}.mi-NetworkOffline:before{content:"\ED10"}.mi-NetworkPrinter:before{content:"\ED11"}.mi-NetworkSharing:before{content:"\ED12"}.mi-NetworkTower:before{content:"\ED13"}.mi-NewFolder:before,.mi-NewFolderLegacy:before{content:"\ED14"}.mi-NewWindow:before,.mi-NewWindowLegacy:before{content:"\ED15"}.mi-Next:before,.mi-NextLegacy:before{content:"\ED16"}.mi-NoiseCancelation:before{content:"\ED17"}.mi-NoiseCancelationOff:before{content:"\ED18"}.mi-OEM:before{content:"\ED19"}.mi-OneBar:before,.mi-OneBarLegacy:before{content:"\ED1A"}.mi-OpenFile:before,.mi-OpenFileLegacy:before{content:"\ED1B"}.mi-OpenFolderHorizontal:before{content:"\ED1C"}.mi-OpenInNewWindow:before,.mi-OpenInNewWindowLegacy:before{content:"\ED1D"}.mi-OpenLocal:before,.mi-OpenLocalLegacy:before{content:"\ED1E"}.mi-OpenPane:before,.mi-OpenPaneLegacy:before{content:"\ED1F"}.mi-OpenPaneLegacyMirrored:before,.mi-OpenPaneMirrored:before{content:"\ED20"}.mi-OpenWith:before,.mi-OpenWithLegacy:before{content:"\ED21"}.mi-OpenWithLegacyMirrored:before,.mi-OpenWithMirrored:before{content:"\ED22"}.mi-Orientation:before,.mi-OrientationLegacy:before{content:"\ED23"}.mi-OtherUser:before,.mi-OtherUserLegacy:before{content:"\ED24"}.mi-OutlineHalfStarLeft:before{content:"\ED25"}.mi-OutlineHalfStarRight:before{content:"\ED26"}.mi-OutlineQuarterStarLeft:before{content:"\ED27"}.mi-OutlineQuarterStarRight:before{content:"\ED28"}.mi-OutlineStarLeftHalf:before{content:"\ED29"}.mi-OutlineStarRightHalf:before{content:"\ED2A"}.mi-OutlineThreeQuarterStarLeft:before{content:"\ED2B"}.mi-OutlineThreeQuarterStarRight:before{content:"\ED2C"}.mi-PC1:before,.mi-PC1Legacy:before{content:"\ED2D"}.mi-PINPad:before{content:"\ED2E"}.mi-PLAP:before{content:"\ED2F"}.mi-PPSFourLandscape:before{content:"\ED30"}.mi-PPSFourPortrait:before{content:"\ED31"}.mi-PPSOneLandscape:before{content:"\ED32"}.mi-PPSOnePortrait:before{content:"\ED33"}.mi-PPSTwoLandscape:before{content:"\ED34"}.mi-PPSTwoPortrait:before{content:"\ED35"}.mi-Package:before{content:"\ED36"}.mi-Page:before,.mi-PageLegacy:before{content:"\ED37"}.mi-PageLeft:before{content:"\ED38"}.mi-PageMarginLandscapeModerate:before{content:"\ED39"}.mi-PageMarginLandscapeNarrow:before{content:"\ED3A"}.mi-PageMarginLandscapeNormal:before{content:"\ED3B"}.mi-PageMarginLandscapeWide:before{content:"\ED3C"}.mi-PageMarginPortraitModerate:before{content:"\ED3D"}.mi-PageMarginPortraitNarrow:before{content:"\ED3E"}.mi-PageMarginPortraitNormal:before{content:"\ED3F"}.mi-PageMarginPortraitWide:before{content:"\ED40"}.mi-PageMirrored:before{content:"\ED41"}.mi-PageRight:before{content:"\ED42"}.mi-PageFillLegacy:before,.mi-PageSolid:before{content:"\ED43"}.mi-PaginationDotOutline10:before{content:"\ED44"}.mi-PaginationDotSolid10:before{content:"\ED45"}.mi-PanMode:before{content:"\ED46"}.mi-ParkingLocation:before{content:"\ED47"}.mi-ParkingLocationMirrored:before{content:"\ED48"}.mi-ParkingLocationSolid:before{content:"\ED49"}.mi-PartyLeader:before{content:"\ED4A"}.mi-PassiveAuthentication:before{content:"\ED4B"}.mi-PasswordKeyHide:before{content:"\ED4C"}.mi-PasswordKeyShow:before{content:"\ED4D"}.mi-Paste:before,.mi-PasteLegacy:before{content:"\ED4E"}.mi-Pause:before,.mi-PauseLegacy:before{content:"\ED4F"}.mi-PauseBadge12:before{content:"\ED50"}.mi-PaymentCard:before{content:"\ED51"}.mi-PenPalette:before{content:"\ED52"}.mi-PenPaletteMirrored:before{content:"\ED53"}.mi-PenTips:before{content:"\ED54"}.mi-PenTipsMirrored:before{content:"\ED55"}.mi-PenWorkspace:before{content:"\ED56"}.mi-PenWorkspaceMirrored:before{content:"\ED57"}.mi-Pencil:before{content:"\ED58"}.mi-PencilFill:before{content:"\ED59"}.mi-People:before,.mi-PeopleLegacy:before{content:"\ED5A"}.mi-PeriodKey:before{content:"\ED5B"}.mi-Permissions:before,.mi-PermissionsLegacy:before{content:"\ED5C"}.mi-PersonalFolder:before{content:"\ED5D"}.mi-Personalize:before{content:"\ED5E"}.mi-Phone:before,.mi-PhoneLegacy:before{content:"\ED5F"}.mi-PhoneBook:before,.mi-PhoneBookLegacy:before{content:"\ED60"}.mi-Photo:before{content:"\ED61"}.mi-Photo2:before{content:"\ED62"}.mi-Picture:before,.mi-PictureLegacy:before{content:"\ED63"}.mi-PieSingle:before{content:"\ED64"}.mi-Pin:before,.mi-PinLegacy:before{content:"\ED65"}.mi-PinFill:before{content:"\ED66"}.mi-Pinned:before{content:"\ED67"}.mi-PinnedFill:before{content:"\ED68"}.mi-PinyinIMELogo:before{content:"\ED69"}.mi-PlaceFolder:before,.mi-PlaceFolderLegacy:before{content:"\ED6B"}.mi-Play:before,.mi-PlayLegacy:before{content:"\ED6C"}.mi-Play36:before{content:"\ED6D"}.mi-PlayBadge12:before{content:"\ED6E"}.mi-PlayOn:before,.mi-PlayOnLegacy:before{content:"\ED70"}.mi-PlaySolid:before{content:"\ED71"}.mi-PlaybackRate1x:before{content:"\ED72"}.mi-PlaybackRateOther:before{content:"\ED73"}.mi-PlayerSettings:before{content:"\ED74"}.mi-PointErase:before{content:"\ED75"}.mi-PointEraseMirrored:before{content:"\ED76"}.mi-PointerHand:before{content:"\ED77"}.mi-PoliceCar:before{content:"\ED78"}.mi-PostUpdate:before,.mi-PostUpdateLegacy:before{content:"\ED79"}.mi-PowerButton:before{content:"\ED7A"}.mi-CheckboxFill:before,.mi-CheckboxFillLegacy:before,.mi-CheckboxFillZeroWidthLegacy:before,.mi-PresenceChicklet:before,.mi-PresenceChickletLegacy:before,.mi-ResizeMouseLarge:before{content:"\ED7B"}.mi-PresenceChickletVideo:before,.mi-PresenceChickletVideoLegacy:before{content:"\ED7C"}.mi-Preview:before,.mi-PreviewLegacy:before{content:"\ED7D"}.mi-PreviewLink:before,.mi-PreviewLinkLegacy:before{content:"\ED7E"}.mi-Previous:before,.mi-PreviousLegacy:before{content:"\ED7F"}.mi-Print:before,.mi-PrintLegacy:before{content:"\ED80"}.mi-PrintAllPages:before{content:"\ED81"}.mi-PrintCustomRange:before{content:"\ED82"}.mi-PrintDefault:before{content:"\ED83"}.mi-Printer3D:before{content:"\ED84"}.mi-Printer3DLegacy:before{content:"\ED85"}.mi-PrintfaxPrinterFile:before{content:"\ED86"}.mi-Priority:before,.mi-PriorityLegacy:before{content:"\ED87"}.mi-Process:before{content:"\ED88"}.mi-Processing:before{content:"\ED89"}.mi-ProgressRingDots:before{content:"\ED8A"}.mi-Project:before{content:"\ED8B"}.mi-Projector:before{content:"\ED8C"}.mi-ProtectedDocument:before,.mi-ProtectedDocumentLegacy:before{content:"\ED8D"}.mi-Protractor:before{content:"\ED8E"}.mi-ProvisioningPackage:before{content:"\ED8F"}.mi-PuncKey:before{content:"\ED90"}.mi-PuncKey0:before{content:"\ED91"}.mi-PuncKey1:before{content:"\ED92"}.mi-PuncKey2:before{content:"\ED93"}.mi-PuncKey3:before{content:"\ED94"}.mi-PuncKey4:before{content:"\ED95"}.mi-PuncKey5:before{content:"\ED96"}.mi-PuncKey6:before{content:"\ED97"}.mi-PuncKey7:before{content:"\ED98"}.mi-PuncKey8:before{content:"\ED99"}.mi-PuncKey9:before{content:"\ED9A"}.mi-PuncKeyLeftBottom:before{content:"\ED9B"}.mi-PuncKeyRightBottom:before{content:"\ED9C"}.mi-Puzzle:before{content:"\ED9D"}.mi-QWERTYOff:before{content:"\ED9E"}.mi-QWERTYOn:before{content:"\ED9F"}.mi-QuarentinedItems:before{content:"\EDA0"}.mi-QuarentinedItemsMirrored:before{content:"\EDA1"}.mi-QuarterStarLeft:before{content:"\EDA2"}.mi-QuarterStarRight:before{content:"\EDA3"}.mi-QuickNote:before{content:"\EDA4"}.mi-QuietHours:before{content:"\EDA5"}.mi-QuietHoursBadge12:before{content:"\EDA6"}.mi-Radar:before{content:"\EDA7"}.mi-RadioBtnOff:before{content:"\EDA8"}.mi-RadioBtnOn:before{content:"\EDA9"}.mi-RadioBullet:before{content:"\EDAA"}.mi-RadioBullet2:before{content:"\EDAB"}.mi-Read:before,.mi-ReadLegacy:before{content:"\EDAC"}.mi-ReadingList:before{content:"\EDAD"}.mi-ReceiptPrinter:before{content:"\EDAE"}.mi-LengthLegacy:before,.mi-Recent:before{content:"\EDAF"}.mi-Record:before,.mi-RecordLegacy:before{content:"\EDB0"}.mi-RectangularClipping:before{content:"\EDB1"}.mi-RedEye:before{content:"\EDB2"}.mi-Redo:before,.mi-RedoLegacy:before{content:"\EDB3"}.mi-ReduceTile:before,.mi-ReduceTileLegacy:before{content:"\EDB5"}.mi-ReduceTileLegacyMirrored:before,.mi-ReduceTileMirrored:before{content:"\EDB7"}.mi-Refresh:before,.mi-RefreshLegacy:before,.mi-RepeatAll:before,.mi-RepeatAllLegacy:before{content:"\EDB8"}.mi-Relationship:before{content:"\EDB9"}.mi-RememberedDevice:before{content:"\EDBA"}.mi-Reminder:before{content:"\EDBB"}.mi-ReminderFill:before{content:"\EDBC"}.mi-Remote:before,.mi-RemoteLegacy:before{content:"\EDBD"}.mi-Remove:before,.mi-RemoveLegacy:before{content:"\EDBE"}.mi-RemoveFrom:before{content:"\EDBF"}.mi-Rename:before,.mi-RenameLegacy:before{content:"\EDC0"}.mi-Repair:before,.mi-RepairLegacy:before{content:"\EDC1"}.mi-RepeatOne:before,.mi-RepeatOneLegacy:before{content:"\EDC2"}.mi-Replay:before{content:"\EDC3"}.mi-Reply:before,.mi-ReplyLegacy:before{content:"\EDC4"}.mi-ReplyMirrored:before{content:"\EDC5"}.mi-ReportDocument:before{content:"\EDC6"}.mi-ReportHacked:before,.mi-ReportHackedLegacy:before{content:"\EDC7"}.mi-ResetDevice:before{content:"\EDC8"}.mi-ResetDrive:before{content:"\EDC9"}.mi-Reshare:before,.mi-ReshareLegacy:before{content:"\EDCA"}.mi-ResizeMouseMedium:before{content:"\EDCB"}.mi-ResizeMouseMediumMirrored:before{content:"\EDCC"}.mi-ResizeMouseSmall:before{content:"\EDCD"}.mi-ResizeMouseSmallMirrored:before{content:"\EDCE"}.mi-ResizeMouseTall:before{content:"\EDCF"}.mi-ResizeMouseTallMirrored:before{content:"\EDD0"}.mi-ResizeMouseWide:before{content:"\EDD1"}.mi-ResizeTouchLarger:before{content:"\EDD2"}.mi-ResizeTouchNarrower:before{content:"\EDD3"}.mi-ResizeTouchNarrowerMirrored:before{content:"\EDD4"}.mi-ResizeTouchShorter:before{content:"\EDD5"}.mi-ResizeTouchSmaller:before{content:"\EDD6"}.mi-Resolution:before,.mi-ResolutionLegacy:before{content:"\EDD8"}.mi-ReturnKey:before{content:"\EDD9"}.mi-ReturnKeyLg:before{content:"\EDDA"}.mi-ReturnKeySm:before{content:"\EDDB"}.mi-ReturnToWindow:before,.mi-ReturnToWindowLegacy:before{content:"\EDDC"}.mi-RevToggleKey:before{content:"\EDDD"}.mi-Rewind:before{content:"\EDDE"}.mi-RightArrowKeyTime0:before{content:"\EDDF"}.mi-RightArrowKeyTime1:before{content:"\EDE0"}.mi-RightArrowKeyTime2:before{content:"\EDE1"}.mi-RightArrowKeyTime3:before{content:"\EDE2"}.mi-RightArrowKeyTime4:before{content:"\EDE3"}.mi-RightDoubleQuote:before{content:"\EDE4"}.mi-RightQuote:before{content:"\EDE5"}.mi-RightStick:before{content:"\EDE6"}.mi-Ringer:before{content:"\EDE7"}.mi-RingerBadge12:before{content:"\EDE8"}.mi-RingerSilent:before{content:"\EDE9"}.mi-RoamingDomestic:before{content:"\EDEA"}.mi-RoamingInternational:before{content:"\EDEB"}.mi-Robot:before{content:"\EDEC"}.mi-Rotate:before{content:"\EDED"}.mi-RotateCamera:before,.mi-RotateCameraLegacy:before{content:"\EDEE"}.mi-RotateLegacy:before{content:"\EDEF"}.mi-RotateMapLeft:before{content:"\EDF0"}.mi-RotateMapRight:before{content:"\EDF1"}.mi-RotationLock:before{content:"\EDF2"}.mi-Ruler:before{content:"\EDF3"}.mi-SDCard:before{content:"\EDF4"}.mi-SIMError:before{content:"\EDF5"}.mi-SIMLock:before{content:"\EDF6"}.mi-SIMMissing:before{content:"\EDF7"}.mi-SIPMove:before{content:"\EDF8"}.mi-SIPRedock:before{content:"\EDF9"}.mi-SIPUndock:before{content:"\EDFA"}.mi-Safe:before{content:"\EDFB"}.mi-Save:before,.mi-SaveLegacy:before{content:"\EDFC"}.mi-SaveAs:before,.mi-SaveAsLegacy:before{content:"\EDFD"}.mi-SaveCopy:before{content:"\EDFE"}.mi-SaveLocal:before,.mi-SaveLocalLegacy:before{content:"\EDFF"}.mi-Scan:before,.mi-ScanLegacy:before{content:"\EE00"}.mi-ScreenTime:before{content:"\EE01"}.mi-ScrollMode:before{content:"\EE02"}.mi-ScrollUpDown:before{content:"\EE03"}.mi-FindLegacy:before,.mi-Search:before,.mi-SearchboxLegacy:before{content:"\EE04"}.mi-SearchAndApps:before{content:"\EE05"}.mi-SelectAll:before,.mi-SelectAllLegacy:before{content:"\EE06"}.mi-SemanticZoom:before,.mi-SemanticZoomLegacy:before{content:"\EE08"}.mi-Send:before,.mi-SendLegacy:before{content:"\EE09"}.mi-SendFill:before{content:"\EE0A"}.mi-SendFillMirrored:before{content:"\EE0B"}.mi-SendMirrored:before{content:"\EE0C"}.mi-Sensor:before{content:"\EE0D"}.mi-Set:before{content:"\EE0E"}.mi-SetSolid:before{content:"\EE0F"}.mi-SetTile:before,.mi-SetTileLegacy:before{content:"\EE10"}.mi-SetlockScreen:before,.mi-SetlockScreenLegacy:before{content:"\EE11"}.mi-Settings:before,.mi-SettingsLegacy:before{content:"\EE12"}.mi-SettingsBattery:before{content:"\EE13"}.mi-SettingsDisplaySound:before{content:"\EE14"}.mi-Share:before{content:"\EE15"}.mi-ShareBroadband:before{content:"\EE16"}.mi-Shield:before{content:"\EE17"}.mi-Shop:before,.mi-ShopLegacy:before{content:"\EE18"}.mi-ShoppingCart:before{content:"\EE19"}.mi-ShowAllFiles1:before,.mi-ShowAllFiles1Legacy:before{content:"\EE1B"}.mi-ShowAllFiles3:before,.mi-ShowAllFiles3Legacy:before{content:"\EE1D"}.mi-ShowBcc:before,.mi-ShowBccLegacy:before{content:"\EE1E"}.mi-ShowResults:before,.mi-ShowResultsLegacy:before{content:"\EE1F"}.mi-ShowResultsLegacyMirrored:before,.mi-ShowResultsMirrored:before{content:"\EE20"}.mi-Shuffle:before,.mi-ShuffleLegacy:before{content:"\EE21"}.mi-SignalBars1:before{content:"\EE22"}.mi-SignalBars2:before{content:"\EE23"}.mi-SignalBars3:before{content:"\EE24"}.mi-SignalBars4:before{content:"\EE25"}.mi-SignalBars5:before{content:"\EE26"}.mi-SignalError:before{content:"\EE27"}.mi-SignalNotConnected:before{content:"\EE28"}.mi-SignalRoaming:before{content:"\EE29"}.mi-SignatureCapture:before{content:"\EE2A"}.mi-Size:before{content:"\EE2B"}.mi-SkipBack10:before{content:"\EE2C"}.mi-SkipForward30:before{content:"\EE2D"}.mi-SliderThumb:before{content:"\EE2E"}.mi-Slideshow:before,.mi-SlideshowLegacy:before{content:"\EE2F"}.mi-SlowMotionOn:before{content:"\EE30"}.mi-SmallErase:before{content:"\EE31"}.mi-Smartcard:before{content:"\EE32"}.mi-SmartcardVirtual:before{content:"\EE33"}.mi-Sort:before,.mi-SortLegacy:before{content:"\EE34"}.mi-SpatialVolume0:before{content:"\EE35"}.mi-SpatialVolume1:before{content:"\EE36"}.mi-SpatialVolume2:before{content:"\EE37"}.mi-SpatialVolume3:before{content:"\EE38"}.mi-Speakers:before{content:"\EE39"}.mi-Speech:before{content:"\EE3A"}.mi-SpeedHigh:before{content:"\EE3B"}.mi-SpeedMedium:before{content:"\EE3C"}.mi-SpeedOff:before{content:"\EE3D"}.mi-StaplingLandscapeBookBinding:before{content:"\EE3E"}.mi-StaplingLandscapeBottomLeft:before{content:"\EE3F"}.mi-StaplingLandscapeBottomRight:before{content:"\EE40"}.mi-StaplingLandscapeTopLeft:before{content:"\EE41"}.mi-StaplingLandscapeTopRight:before{content:"\EE42"}.mi-StaplingLandscapeTwoBottom:before{content:"\EE43"}.mi-StaplingLandscapeTwoLeft:before{content:"\EE44"}.mi-StaplingLandscapeTwoRight:before{content:"\EE45"}.mi-StaplingLandscapeTwoTop:before{content:"\EE46"}.mi-StaplingOff:before{content:"\EE47"}.mi-StaplingPortraitBookBinding:before{content:"\EE48"}.mi-StaplingPortraitBottomLeft:before{content:"\EE49"}.mi-StaplingPortraitBottomRight:before{content:"\EE4A"}.mi-StaplingPortraitTopLeft:before{content:"\EE4B"}.mi-StaplingPortraitTopRight:before{content:"\EE4C"}.mi-StaplingPortraitTwoBottom:before{content:"\EE4D"}.mi-StaplingPortraitTwoLeft:before{content:"\EE4E"}.mi-StaplingPortraitTwoRight:before{content:"\EE4F"}.mi-StaplingPortraitTwoTop:before{content:"\EE50"}.mi-StartPoint:before{content:"\EE51"}.mi-StartPointSolid:before{content:"\EE52"}.mi-StatusCheckmark:before{content:"\EE53"}.mi-StatusCheckmark7:before{content:"\EE54"}.mi-StatusCheckmarkLeft:before{content:"\EE55"}.mi-StatusCircle:before{content:"\EE56"}.mi-StatusCircle7:before{content:"\EE57"}.mi-StatusCircleBlock:before{content:"\EE58"}.mi-StatusCircleBlock2:before{content:"\EE59"}.mi-StatusCircleCheckmark:before{content:"\EE5A"}.mi-StatusCircleErrorX:before{content:"\EE5B"}.mi-StatusCircleExclamation:before{content:"\EE5C"}.mi-StatusCircleInfo:before{content:"\EE5D"}.mi-StatusCircleInner:before{content:"\EE5E"}.mi-StatusCircleLeft:before{content:"\EE5F"}.mi-StatusCircleOuter:before{content:"\EE60"}.mi-StatusCircleQuestionMark:before{content:"\EE61"}.mi-StatusCircleRing:before{content:"\EE62"}.mi-StatusCircleSync:before{content:"\EE63"}.mi-StatusConnecting1:before{content:"\EE64"}.mi-StatusConnecting2:before{content:"\EE65"}.mi-StatusDataTransfer:before{content:"\EE66"}.mi-StatusDataTransferVPN:before{content:"\EE67"}.mi-StatusDualSIM1:before{content:"\EE68"}.mi-StatusDualSIM1VPN:before{content:"\EE69"}.mi-StatusDualSIM2:before{content:"\EE6A"}.mi-StatusDualSIM2VPN:before{content:"\EE6B"}.mi-StatusError:before{content:"\EE6C"}.mi-StatusErrorCircle7:before{content:"\EE6D"}.mi-StatusErrorFull:before{content:"\EE6E"}.mi-StatusErrorLeft:before{content:"\EE6F"}.mi-StatusExclamationCircle7:before{content:"\EE70"}.mi-StatusInfo:before{content:"\EE71"}.mi-StatusInfoLeft:before{content:"\EE72"}.mi-StatusPause7:before{content:"\EE73"}.mi-StatusSGLTE:before{content:"\EE74"}.mi-StatusSGLTECell:before{content:"\EE75"}.mi-StatusSGLTEDataVPN:before{content:"\EE76"}.mi-StatusTriangle:before{content:"\EE77"}.mi-StatusTriangleExclamation:before{content:"\EE78"}.mi-StatusTriangleInner:before{content:"\EE79"}.mi-StatusTriangleLeft:before{content:"\EE7A"}.mi-StatusTriangleOuter:before{content:"\EE7B"}.mi-StatusUnsecure:before{content:"\EE7C"}.mi-StatusVPN:before{content:"\EE7D"}.mi-StatusWarning:before{content:"\EE7E"}.mi-StatusWarningLeft:before{content:"\EE7F"}.mi-Sticker2:before{content:"\EE80"}.mi-StockDown:before{content:"\EE81"}.mi-StockUp:before{content:"\EE82"}.mi-Stop:before,.mi-StopLegacy:before{content:"\EE83"}.mi-StopPoint:before{content:"\EE84"}.mi-StopPointSolid:before{content:"\EE85"}.mi-StopSlideshow:before,.mi-StopSlideshowLegacy:before{content:"\EE87"}.mi-Stopwatch:before{content:"\EE88"}.mi-StorageNetworkWireless:before{content:"\EE89"}.mi-StorageOptical:before{content:"\EE8A"}.mi-StorageTape:before{content:"\EE8B"}.mi-Streaming:before{content:"\EE8C"}.mi-StreamingEnterprise:before{content:"\EE8D"}.mi-Street:before,.mi-StreetLegacy:before{content:"\EE8E"}.mi-StreetsideSplitExpand:before{content:"\EE8F"}.mi-StreetsideSplitMinimize:before{content:"\EE90"}.mi-StrokeErase:before{content:"\EE91"}.mi-StrokeErase2:before{content:"\EE92"}.mi-StrokeEraseMirrored:before{content:"\EE93"}.mi-Subtitles:before{content:"\EE94"}.mi-SubtitlesAudio:before{content:"\EE95"}.mi-SurfaceHub:before{content:"\EE96"}.mi-SurfaceHubSelected:before{content:"\EE97"}.mi-Sustainable:before{content:"\EE98"}.mi-Swipe:before{content:"\EE99"}.mi-SwipeRevealArt:before{content:"\EE9A"}.mi-Switch:before,.mi-SwitchLegacy:before{content:"\EE9B"}.mi-SwitchApps:before,.mi-SwitchAppsLegacy:before{content:"\EE9C"}.mi-SwitchUser:before{content:"\EE9D"}.mi-Sync:before,.mi-SyncLegacy:before{content:"\EE9E"}.mi-SyncBadge12:before{content:"\EE9F"}.mi-SyncError:before{content:"\EEA0"}.mi-SyncFolder:before,.mi-SyncFolderLegacy:before{content:"\EEA1"}.mi-System:before{content:"\EEA2"}.mi-TVMonitor:before{content:"\EEA3"}.mi-TVMonitorSelected:before{content:"\EEA4"}.mi-Tablet:before{content:"\EEA5"}.mi-TabletMode:before{content:"\EEA6"}.mi-TabletSelected:before{content:"\EEA7"}.mi-Tag:before,.mi-TagLegacy:before{content:"\EEA8"}.mi-TapAndSend:before{content:"\EEA9"}.mi-TaskView:before{content:"\EEAA"}.mi-TaskViewExpanded:before{content:"\EEAB"}.mi-TaskViewSettings:before{content:"\EEAC"}.mi-TaskbarPhone:before{content:"\EEAD"}.mi-ThisPC:before{content:"\EEAE"}.mi-ThoughtBubble:before{content:"\EEAF"}.mi-ThreeBars:before,.mi-ThreeBarsLegacy:before{content:"\EEB0"}.mi-ThreeQuarterStarLeft:before{content:"\EEB1"}.mi-ThreeQuarterStarRight:before{content:"\EEB2"}.mi-Tiles:before{content:"\EEB3"}.mi-TiltDown:before{content:"\EEB4"}.mi-TiltUp:before{content:"\EEB5"}.mi-TimeLanguage:before{content:"\EEB6"}.mi-ToggleBorder:before{content:"\EEB7"}.mi-ToggleFilled:before{content:"\EEB8"}.mi-ToggleThumb:before{content:"\EEB9"}.mi-TollSolid:before{content:"\EEBA"}.mi-Lightbulb:before,.mi-ToolTip:before{content:"\EEBB"}.mi-Touch:before{content:"\EEBC"}.mi-TouchPointer:before,.mi-TouchPointerLegacy:before{content:"\EEBD"}.mi-Touchpad:before{content:"\EEBE"}.mi-Touchscreen:before{content:"\EEBF"}.mi-Trackers:before{content:"\EEC0"}.mi-TrackersMirrored:before{content:"\EEC1"}.mi-TrafficCongestionSolid:before{content:"\EEC2"}.mi-TrafficLight:before{content:"\EEC3"}.mi-Train:before{content:"\EEC4"}.mi-TrainSolid:before{content:"\EEC5"}.mi-TreeFolderFolder:before{content:"\EEC6"}.mi-TreeFolderFolderFill:before{content:"\EEC7"}.mi-TreeFolderFolderOpen:before{content:"\EEC8"}.mi-TreeFolderFolderOpenFill:before{content:"\EEC9"}.mi-TriggerLeft:before{content:"\EECA"}.mi-TriggerRight:before{content:"\EECB"}.mi-Trim:before,.mi-TrimLegacy:before{content:"\EECC"}.mi-TwoBars:before,.mi-TwoBarsLegacy:before{content:"\EECD"}.mi-TwoPage:before,.mi-TwoPageLegacy:before{content:"\EECE"}.mi-Type:before,.mi-TypeLegacy:before{content:"\EECF"}.mi-TypingIndicatorLegacy:before{content:"\EED0"}.mi-USB:before{content:"\EED1"}.mi-USBSafeConnect:before{content:"\EED2"}.mi-Underline:before,.mi-UnderlineLegacy:before{content:"\EED3"}.mi-UnderlineLKorean:before,.mi-UnderlineLKoreanLegacy:before{content:"\EED5"}.mi-UnderlineRussian:before,.mi-UnderlineRussianLegacy:before{content:"\EED7"}.mi-UnderlineS:before,.mi-UnderlineSLegacy:before{content:"\EED9"}.mi-UnderlineU:before,.mi-UnderlineULegacy:before{content:"\EEDB"}.mi-UnderscoreSpace:before{content:"\EEDC"}.mi-Undo:before,.mi-UndoLegacy:before{content:"\EEDD"}.mi-Unfavorite:before,.mi-UnfavoriteLegacy:before{content:"\EEDE"}.mi-Unit:before{content:"\EEDF"}.mi-Unknown:before{content:"\EEE0"}.mi-UnknownMirrored:before{content:"\EEE1"}.mi-Unlock:before,.mi-UnlockLegacy:before{content:"\EEE2"}.mi-Unpin:before,.mi-UnpinLegacy:before{content:"\EEE3"}.mi-UnsyncFolder:before,.mi-UnsyncFolderLegacy:before{content:"\EEE4"}.mi-Up:before,.mi-UpLegacy:before{content:"\EEE5"}.mi-UpArrowShiftKey:before{content:"\EEE6"}.mi-UpShiftKey:before{content:"\EEE7"}.mi-UpdateRestore:before{content:"\EEE8"}.mi-Upload:before,.mi-UploadLegacy:before,.mi-UploadSkyDriveLegacy:before{content:"\EEE9"}.mi-UserAPN:before{content:"\EEEA"}.mi-VPN:before{content:"\EEEB"}.mi-VerticalBattery0:before{content:"\EEEC"}.mi-VerticalBattery1:before{content:"\EEED"}.mi-VerticalBattery10:before{content:"\EEEE"}.mi-VerticalBattery2:before{content:"\EEEF"}.mi-VerticalBattery3:before{content:"\EEF0"}.mi-VerticalBattery4:before{content:"\EEF1"}.mi-VerticalBattery5:before{content:"\EEF2"}.mi-VerticalBattery6:before{content:"\EEF3"}.mi-VerticalBattery7:before{content:"\EEF4"}.mi-VerticalBattery8:before{content:"\EEF5"}.mi-VerticalBattery9:before{content:"\EEF6"}.mi-VerticalBatteryCharging0:before{content:"\EEF7"}.mi-VerticalBatteryCharging1:before{content:"\EEF8"}.mi-VerticalBatteryCharging10:before{content:"\EEF9"}.mi-VerticalBatteryCharging2:before{content:"\EEFA"}.mi-VerticalBatteryCharging3:before{content:"\EEFB"}.mi-VerticalBatteryCharging4:before{content:"\EEFC"}.mi-VerticalBatteryCharging5:before{content:"\EEFD"}.mi-VerticalBatteryCharging6:before{content:"\EEFE"}.mi-VerticalBatteryCharging7:before{content:"\EEFF"}.mi-VerticalBatteryCharging8:before{content:"\EF00"}.mi-VerticalBatteryCharging9:before{content:"\EF01"}.mi-VerticalBatteryUnknown:before{content:"\EF02"}.mi-Vibrate:before{content:"\EF03"}.mi-Video:before,.mi-VideoInlineLegacy:before,.mi-VideoLegacy:before{content:"\EF04"}.mi-Video360:before{content:"\EF05"}.mi-VideoChat:before,.mi-VideoChatLegacy:before{content:"\EF06"}.mi-VideoSolid:before{content:"\EF07"}.mi-RevealPasswordLegacy:before,.mi-View:before,.mi-ViewLegacy:before{content:"\EF08"}.mi-ShowAllFilesLegacy:before,.mi-ViewAll:before,.mi-ViewAllLegacy:before{content:"\EF09"}.mi-ViewDashboard:before{content:"\EF0A"}.mi-Volume:before,.mi-VolumeLegacy:before{content:"\EF0B"}.mi-Volume0:before{content:"\EF0C"}.mi-Volume1:before{content:"\EF0D"}.mi-Volume2:before{content:"\EF0E"}.mi-Volume3:before{content:"\EF0F"}.mi-VolumeBars:before{content:"\EF10"}.mi-Walk:before{content:"\EF11"}.mi-WalkSolid:before{content:"\EF12"}.mi-Warning:before{content:"\EF13"}.mi-Webcam:before,.mi-WebcamLegacy:before{content:"\EF14"}.mi-Webcam2:before{content:"\EF15"}.mi-Website:before{content:"\EF16"}.mi-Wheel:before{content:"\EF17"}.mi-Wifi:before{content:"\EF18"}.mi-Wifi1:before{content:"\EF19"}.mi-Wifi2:before{content:"\EF1A"}.mi-Wifi3:before{content:"\EF1B"}.mi-WifiAttentionOverlay:before{content:"\EF1C"}.mi-WifiCall0:before{content:"\EF1D"}.mi-WifiCall1:before{content:"\EF1E"}.mi-WifiCall2:before{content:"\EF1F"}.mi-WifiCall3:before{content:"\EF20"}.mi-WifiCall4:before{content:"\EF21"}.mi-WifiCallBars:before{content:"\EF22"}.mi-WifiError0:before{content:"\EF23"}.mi-WifiError1:before{content:"\EF24"}.mi-WifiError2:before{content:"\EF25"}.mi-WifiError3:before{content:"\EF26"}.mi-WifiError4:before{content:"\EF27"}.mi-WifiEthernet:before{content:"\EF28"}.mi-InternetSharing:before,.mi-WifiHotspot:before{content:"\EF29"}.mi-WifiWarning0:before{content:"\EF2A"}.mi-WifiWarning1:before{content:"\EF2B"}.mi-WifiWarning2:before{content:"\EF2C"}.mi-WifiWarning3:before{content:"\EF2D"}.mi-WifiWarning4:before{content:"\EF2E"}.mi-WindDirection:before{content:"\EF2F"}.mi-WindowsInsider:before{content:"\EF30"}.mi-WiredUSB:before{content:"\EF31"}.mi-WirelessUSB:before{content:"\EF32"}.mi-Work:before{content:"\EF33"}.mi-WorkSolid:before{content:"\EF34"}.mi-World:before,.mi-WorldLegacy:before{content:"\EF35"}.mi-XboxOneConsole:before{content:"\EF36"}.mi-ZeroBars:before,.mi-ZeroBarsLegacy:before{content:"\EF37"}.mi-Zoom:before,.mi-ZoomLegacy:before{content:"\EF38"}.mi-ZoomIn:before,.mi-ZoomInLegacy:before{content:"\EF39"}.mi-ZoomMode:before{content:"\EF3A"}.mi-ZoomOut:before,.mi-ZoomOutLegacy:before{content:"\EF3B"}.mi-eSIM:before{content:"\EF3C"}.mi-eSIMBusy:before{content:"\EF3D"}.mi-eSIMLocked:before{content:"\EF3E"}.mi-eSIMNoProfile:before{content:"\EF3F"}.mi-E80B:before,.mi-uniE80B:before{content:"\EF40"}.mi-EA0D:before,.mi-uniEA0D:before{content:"\EF41"}.mi-EA3F:before,.mi-uniEA3F:before{content:"\EF42"}.mi-EA90:before,.mi-uniEA90:before{content:"\EF43"}.mi-EAC2:before,.mi-uniEAC2:before{content:"\EF44"}.mi-EC6C:before,.mi-uniEC6C:before{content:"\EF45"}.mi-EEA3:before,.mi-uniEEA3:before{content:"\EF46"}.mi-F2B7:before,.mi-uniF2B7:before{content:"\EF47"}.mi-F5AA:before,.mi-uniF5AA:before{content:"\EF48"}.mi-F614:before,.mi-uniF614:before{content:"\EF49"}.mi-F615:before,.mi-uniF615:before{content:"\EF4A"}.mi-F616:before,.mi-uniF616:before{content:"\EF4B"}.mi-F617:before,.mi-uniF617:before{content:"\EF4C"}.mi-F657:before,.mi-uniF657:before{content:"\EF4D"}.mi-F658:before,.mi-uniF658:before{content:"\EF4E"}.mi-F659:before,.mi-uniF659:before{content:"\EF4F"}.mi-F65A:before,.mi-uniF65A:before{content:"\EF50"}.mi-F65B:before,.mi-uniF65B:before{content:"\EF51"}.mi-F65C:before,.mi-uniF65C:before{content:"\EF52"}.mi-F69E:before,.mi-uniF69E:before{content:"\EF53"}.mi-F6FA:before,.mi-uniF6FA:before{content:"\EF54"}.mi-F712:before,.mi-uniF712:before{content:"\EF55"}.mi-F71C:before,.mi-uniF71C:before{content:"\EF56"}.mi-F71D:before,.mi-uniF71D:before{content:"\EF57"}.mi-F71E:before,.mi-uniF71E:before{content:"\EF58"}.mi-F738:before,.mi-uniF738:before{content:"\EF59"}.mi-F739:before,.mi-uniF739:before{content:"\EF5A"}.mi-F73D:before,.mi-uniF73D:before{content:"\EF5B"}.mi-F73E:before,.mi-uniF73E:before{content:"\EF5C"}.mi-F73F:before,.mi-uniF73F:before{content:"\EF5D"}.mi-F740:before,.mi-uniF740:before{content:"\EF5E"}.mi-F741:before,.mi-uniF741:before{content:"\EF5F"}.mi-F742:before,.mi-uniF742:before{content:"\EF60"}.mi-F743:before,.mi-uniF743:before{content:"\EF61"}.mi-F744:before,.mi-uniF744:before{content:"\EF62"}.mi-F745:before,.mi-uniF745:before{content:"\EF63"}.mi-F746:before,.mi-uniF746:before{content:"\EF64"}.mi-F785:before,.mi-uniF785:before{content:"\EF65"}.mi-500px:before{content:"\EF66"}.mi-accessible-icon:before{content:"\EF67"}.mi-accusoft:before{content:"\EF68"}.mi-acquisitions-incorporated:before{content:"\EF69"}.mi-adn:before{content:"\EF6A"}.mi-adobe:before{content:"\EF6B"}.mi-adversal:before{content:"\EF6C"}.mi-affiliatetheme:before{content:"\EF6D"}.mi-algolia:before{content:"\EF6E"}.mi-alipay:before{content:"\EF6F"}.mi-amazon-pay:before{content:"\EF70"}.mi-amazon:before{content:"\EF71"}.mi-amilia:before{content:"\EF72"}.mi-android:before{content:"\EF73"}.mi-angellist:before{content:"\EF74"}.mi-angrycreative:before{content:"\EF75"}.mi-angular:before{content:"\EF76"}.mi-app-store-ios:before{content:"\EF77"}.mi-app-store:before{content:"\EF78"}.mi-apper:before{content:"\EF79"}.mi-apple-pay:before{content:"\EF7A"}.mi-apple:before{content:"\EF7B"}.mi-artstation:before{content:"\EF7C"}.mi-asymmetrik:before{content:"\EF7D"}.mi-atlassian:before{content:"\EF7E"}.mi-audible:before{content:"\EF7F"}.mi-autoprefixer:before{content:"\EF80"}.mi-avianex:before{content:"\EF81"}.mi-aviato:before{content:"\EF82"}.mi-aws:before{content:"\EF83"}.mi-bandcamp:before{content:"\EF84"}.mi-behance-square:before{content:"\EF85"}.mi-behance:before{content:"\EF86"}.mi-bimobject:before{content:"\EF87"}.mi-bitbucket:before{content:"\EF88"}.mi-bitcoin:before{content:"\EF89"}.mi-bity:before{content:"\EF8A"}.mi-black-tie:before{content:"\EF8B"}.mi-blackberry:before{content:"\EF8C"}.mi-blogger-b:before{content:"\EF8D"}.mi-blogger:before{content:"\EF8E"}.mi-bluetooth-b:before{content:"\EF8F"}.mi-bluetooth:before{content:"\EF90"}.mi-btc:before{content:"\EF91"}.mi-buromobelexperte:before{content:"\EF92"}.mi-buysellads:before{content:"\EF93"}.mi-canadian-maple-leaf:before{content:"\EF94"}.mi-cc-amazon-pay:before{content:"\EF95"}.mi-cc-amex:before{content:"\EF96"}.mi-cc-apple-pay:before{content:"\EF97"}.mi-cc-diners-club:before{content:"\EF98"}.mi-cc-discover:before{content:"\EF99"}.mi-cc-jcb:before{content:"\EF9A"}.mi-cc-mastercard:before{content:"\EF9B"}.mi-cc-paypal:before{content:"\EF9C"}.mi-cc-stripe:before{content:"\EF9D"}.mi-cc-visa:before{content:"\EF9E"}.mi-centercode:before{content:"\EF9F"}.mi-centos:before{content:"\EFA0"}.mi-chrome:before{content:"\EFA1"}.mi-cloudscale:before{content:"\EFA2"}.mi-cloudsmith:before{content:"\EFA3"}.mi-cloudversify:before{content:"\EFA4"}.mi-codepen:before{content:"\EFA5"}.mi-codiepie:before{content:"\EFA6"}.mi-confluence:before{content:"\EFA7"}.mi-connectdevelop:before{content:"\EFA8"}.mi-contao:before{content:"\EFA9"}.mi-cpanel:before{content:"\EFAA"}.mi-creative-commons-by:before{content:"\EFAB"}.mi-creative-commons-nc-eu:before{content:"\EFAC"}.mi-creative-commons-nc-jp:before{content:"\EFAD"}.mi-creative-commons-nc:before{content:"\EFAE"}.mi-creative-commons-nd:before{content:"\EFAF"}.mi-creative-commons-pd-alt:before{content:"\EFB0"}.mi-creative-commons-pd:before{content:"\EFB1"}.mi-creative-commons-remix:before{content:"\EFB2"}.mi-creative-commons-sa:before{content:"\EFB3"}.mi-creative-commons-sampling-plus:before{content:"\EFB4"}.mi-creative-commons-sampling:before{content:"\EFB5"}.mi-creative-commons-share:before{content:"\EFB6"}.mi-creative-commons-zero:before{content:"\EFB7"}.mi-creative-commons:before{content:"\EFB8"}.mi-critical-role:before{content:"\EFB9"}.mi-css3-alt:before{content:"\EFBA"}.mi-css3:before{content:"\EFBB"}.mi-cuttlefish:before{content:"\EFBC"}.mi-d-and-d-beyond:before{content:"\EFBD"}.mi-d-and-d:before{content:"\EFBE"}.mi-dashcube:before{content:"\EFBF"}.mi-delicious:before{content:"\EFC0"}.mi-deploydog:before{content:"\EFC1"}.mi-deskpro:before{content:"\EFC2"}.mi-dev:before{content:"\EFC3"}.mi-deviantart:before{content:"\EFC4"}.mi-dhl:before{content:"\EFC5"}.mi-diaspora:before{content:"\EFC6"}.mi-digg:before{content:"\EFC7"}.mi-digital-ocean:before{content:"\EFC8"}.mi-discord:before{content:"\EFC9"}.mi-discourse:before{content:"\EFCA"}.mi-dochub:before{content:"\EFCB"}.mi-docker:before{content:"\EFCC"}.mi-draft2digital:before{content:"\EFCD"}.mi-dribbble-square:before{content:"\EFCE"}.mi-dribbble:before{content:"\EFCF"}.mi-dropbox:before{content:"\EFD0"}.mi-drupal:before{content:"\EFD1"}.mi-dyalog:before{content:"\EFD2"}.mi-earlybirds:before{content:"\EFD3"}.mi-ebay:before{content:"\EFD4"}.mi-edge:before{content:"\EFD5"}.mi-elementor:before{content:"\EFD6"}.mi-ello:before{content:"\EFD7"}.mi-ember:before{content:"\EFD8"}.mi-empire:before{content:"\EFD9"}.mi-envira:before{content:"\EFDA"}.mi-erlang:before{content:"\EFDB"}.mi-ethereum:before{content:"\EFDC"}.mi-etsy:before{content:"\EFDD"}.mi-expeditedssl:before{content:"\EFDE"}.mi-facebook-f:before{content:"\EFDF"}.mi-facebook-messenger:before{content:"\EFE0"}.mi-facebook-square:before{content:"\EFE1"}.mi-facebook:before{content:"\EFE2"}.mi-fedex:before{content:"\EFE3"}.mi-fedora:before{content:"\EFE4"}.mi-figma:before{content:"\EFE5"}.mi-firefox:before{content:"\EFE6"}.mi-first-order-alt:before{content:"\EFE7"}.mi-first-order:before{content:"\EFE8"}.mi-firstdraft:before{content:"\EFE9"}.mi-flickr:before{content:"\EFEA"}.mi-flipboard:before{content:"\EFEB"}.mi-fly:before{content:"\EFEC"}.mi-font-awesome-alt:before{content:"\EFED"}.mi-font-awesome-flag:before{content:"\EFEE"}.mi-font-awesome:before{content:"\EFEF"}.mi-fonticons-fi:before{content:"\EFF0"}.mi-fonticons:before{content:"\EFF1"}.mi-fort-awesome-alt:before{content:"\EFF2"}.mi-fort-awesome:before{content:"\EFF3"}.mi-forumbee:before{content:"\EFF4"}.mi-foursquare:before{content:"\EFF5"}.mi-free-code-camp:before{content:"\EFF6"}.mi-freebsd:before{content:"\EFF7"}.mi-fulcrum:before{content:"\EFF8"}.mi-galactic-republic:before{content:"\EFF9"}.mi-galactic-senate:before{content:"\EFFA"}.mi-get-pocket:before{content:"\EFFB"}.mi-gg-circle:before{content:"\EFFC"}.mi-gg:before{content:"\EFFD"}.mi-git-square:before{content:"\EFFE"}.mi-github-alt:before{content:"\EFFF"}.mi-github-square:before{content:"\F000"}.mi-github:before{content:"\F001"}.mi-gitkraken:before{content:"\F002"}.mi-gitlab:before{content:"\F003"}.mi-gitter:before{content:"\F004"}.mi-glide-g:before{content:"\F005"}.mi-glide:before{content:"\F006"}.mi-gofore:before{content:"\F007"}.mi-goodreads-g:before{content:"\F008"}.mi-goodreads:before{content:"\F009"}.mi-google-drive:before{content:"\F00A"}.mi-google-play:before{content:"\F00B"}.mi-google-plus-g:before{content:"\F00C"}.mi-google-plus-square:before{content:"\F00D"}.mi-google-plus:before{content:"\F00E"}.mi-google-wallet:before{content:"\F00F"}.mi-google:before{content:"\F010"}.mi-gratipay:before{content:"\F011"}.mi-grav:before{content:"\F012"}.mi-gripfire:before{content:"\F013"}.mi-grunt:before{content:"\F014"}.mi-gulp:before{content:"\F015"}.mi-hacker-news-square:before{content:"\F016"}.mi-hacker-news:before{content:"\F017"}.mi-hackerrank:before{content:"\F018"}.mi-hire-a-helper:before{content:"\F019"}.mi-hooli:before{content:"\F01A"}.mi-hornbill:before{content:"\F01B"}.mi-hotjar:before{content:"\F01C"}.mi-houzz:before{content:"\F01D"}.mi-html5:before{content:"\F01E"}.mi-hubspot:before{content:"\F01F"}.mi-imdb:before{content:"\F020"}.mi-instagram:before{content:"\F021"}.mi-intercom:before{content:"\F022"}.mi-internet-explorer:before{content:"\F023"}.mi-invision:before{content:"\F024"}.mi-ioxhost:before{content:"\F025"}.mi-itunes-note:before{content:"\F026"}.mi-itunes:before{content:"\F027"}.mi-java:before{content:"\F028"}.mi-jedi-order:before{content:"\F029"}.mi-jenkins:before{content:"\F02A"}.mi-jira:before{content:"\F02B"}.mi-joget:before{content:"\F02C"}.mi-joomla:before{content:"\F02D"}.mi-js-square:before{content:"\F02E"}.mi-js:before{content:"\F02F"}.mi-jsfiddle:before{content:"\F030"}.mi-kaggle:before{content:"\F031"}.mi-keybase:before{content:"\F032"}.mi-keycdn:before{content:"\F033"}.mi-kickstarter-k:before{content:"\F034"}.mi-kickstarter:before{content:"\F035"}.mi-korvue:before{content:"\F036"}.mi-laravel:before{content:"\F037"}.mi-lastfm-square:before{content:"\F038"}.mi-lastfm:before{content:"\F039"}.mi-leanpub:before{content:"\F03A"}.mi-less:before{content:"\F03B"}.mi-line:before{content:"\F03C"}.mi-linkedin-in:before{content:"\F03D"}.mi-linkedin:before{content:"\F03E"}.mi-linode:before{content:"\F03F"}.mi-linux:before{content:"\F040"}.mi-lyft:before{content:"\F041"}.mi-magento:before{content:"\F042"}.mi-mailchimp:before{content:"\F043"}.mi-mandalorian:before{content:"\F044"}.mi-markdown:before{content:"\F045"}.mi-mastodon:before{content:"\F046"}.mi-maxcdn:before{content:"\F047"}.mi-medapps:before{content:"\F048"}.mi-medium-m:before{content:"\F049"}.mi-medium:before{content:"\F04A"}.mi-medrt:before{content:"\F04B"}.mi-meetup:before{content:"\F04C"}.mi-megaport:before{content:"\F04D"}.mi-mendeley:before{content:"\F04E"}.mi-microsoft:before{content:"\F04F"}.mi-mix:before{content:"\F050"}.mi-mixcloud:before{content:"\F051"}.mi-mizuni:before{content:"\F052"}.mi-modx:before{content:"\F053"}.mi-monero:before{content:"\F054"}.mi-napster:before{content:"\F055"}.mi-neos:before{content:"\F056"}.mi-nimblr:before{content:"\F057"}.mi-nintendo-switch:before{content:"\F058"}.mi-node-js:before{content:"\F059"}.mi-node:before{content:"\F05A"}.mi-npm:before{content:"\F05B"}.mi-ns8:before{content:"\F05C"}.mi-nutritionix:before{content:"\F05D"}.mi-odnoklassniki-square:before{content:"\F05E"}.mi-odnoklassniki:before{content:"\F05F"}.mi-old-republic:before{content:"\F060"}.mi-opencart:before{content:"\F061"}.mi-openid:before{content:"\F062"}.mi-opera:before{content:"\F063"}.mi-optin-monster:before{content:"\F064"}.mi-osi:before{content:"\F065"}.mi-page4:before{content:"\F066"}.mi-pagelines:before{content:"\F067"}.mi-palfed:before{content:"\F068"}.mi-patreon:before{content:"\F069"}.mi-paypal:before{content:"\F06A"}.mi-penny-arcade:before{content:"\F06B"}.mi-periscope:before{content:"\F06C"}.mi-phabricator:before{content:"\F06D"}.mi-phoenix-framework:before{content:"\F06E"}.mi-phoenix-squadron:before{content:"\F06F"}.mi-php:before{content:"\F070"}.mi-pied-piper-alt:before{content:"\F071"}.mi-pied-piper-hat:before{content:"\F072"}.mi-pied-piper-pp:before{content:"\F073"}.mi-pied-piper:before{content:"\F074"}.mi-pinterest-p:before{content:"\F075"}.mi-pinterest-square:before{content:"\F076"}.mi-pinterest:before{content:"\F077"}.mi-playstation:before{content:"\F078"}.mi-product-hunt:before{content:"\F079"}.mi-pushed:before{content:"\F07A"}.mi-python:before{content:"\F07B"}.mi-qq:before{content:"\F07C"}.mi-quinscape:before{content:"\F07D"}.mi-quora:before{content:"\F07E"}.mi-r-project:before{content:"\F07F"}.mi-raspberry-pi:before{content:"\F080"}.mi-ravelry:before{content:"\F081"}.mi-react:before{content:"\F082"}.mi-reacteurope:before{content:"\F083"}.mi-readme:before{content:"\F084"}.mi-rebel:before{content:"\F085"}.mi-red-river:before{content:"\F086"}.mi-reddit-alien:before{content:"\F087"}.mi-reddit-square:before{content:"\F088"}.mi-reddit:before{content:"\F089"}.mi-redhat:before{content:"\F08A"}.mi-renren:before{content:"\F08B"}.mi-replyd:before{content:"\F08C"}.mi-researchgate:before{content:"\F08D"}.mi-resolving:before{content:"\F08E"}.mi-rev:before{content:"\F08F"}.mi-rocketchat:before{content:"\F090"}.mi-rockrms:before{content:"\F091"}.mi-safari:before{content:"\F092"}.mi-sass:before{content:"\F093"}.mi-schlix:before{content:"\F094"}.mi-scribd:before{content:"\F095"}.mi-searchengin:before{content:"\F096"}.mi-sellcast:before{content:"\F097"}.mi-sellsy:before{content:"\F098"}.mi-servicestack:before{content:"\F099"}.mi-shirtsinbulk:before{content:"\F09A"}.mi-shopware:before{content:"\F09B"}.mi-simplybuilt:before{content:"\F09C"}.mi-sistrix:before{content:"\F09D"}.mi-sith:before{content:"\F09E"}.mi-sketch:before{content:"\F09F"}.mi-skyatlas:before{content:"\F0A0"}.mi-skype:before{content:"\F0A1"}.mi-slack-hash:before{content:"\F0A2"}.mi-slack:before{content:"\F0A3"}.mi-slideshare:before{content:"\F0A4"}.mi-snapchat-ghost:before{content:"\F0A5"}.mi-snapchat-square:before{content:"\F0A6"}.mi-snapchat:before{content:"\F0A7"}.mi-soundcloud:before{content:"\F0A8"}.mi-sourcetree:before{content:"\F0A9"}.mi-speakap:before{content:"\F0AA"}.mi-spotify:before{content:"\F0AB"}.mi-squarespace:before{content:"\F0AC"}.mi-stack-exchange:before{content:"\F0AD"}.mi-stack-overflow:before{content:"\F0AE"}.mi-staylinked:before{content:"\F0AF"}.mi-steam-square:before{content:"\F0B0"}.mi-steam:before{content:"\F0B1"}.mi-sticker-mule:before{content:"\F0B2"}.mi-strava:before{content:"\F0B3"}.mi-stripe-s:before{content:"\F0B4"}.mi-stripe:before{content:"\F0B5"}.mi-studiovinari:before{content:"\F0B6"}.mi-stumbleupon-circle:before{content:"\F0B7"}.mi-stumbleupon:before{content:"\F0B8"}.mi-superpowers:before{content:"\F0B9"}.mi-supple:before{content:"\F0BA"}.mi-suse:before{content:"\F0BB"}.mi-teamspeak:before{content:"\F0BC"}.mi-telegram-plane:before{content:"\F0BD"}.mi-telegram:before{content:"\F0BE"}.mi-tencent-weibo:before{content:"\F0BF"}.mi-the-red-yeti:before{content:"\F0C0"}.mi-themeco:before{content:"\F0C1"}.mi-themeisle:before{content:"\F0C2"}.mi-think-peaks:before{content:"\F0C3"}.mi-trade-federation:before{content:"\F0C4"}.mi-trello:before{content:"\F0C5"}.mi-tripadvisor:before{content:"\F0C6"}.mi-tumblr-square:before{content:"\F0C7"}.mi-tumblr:before{content:"\F0C8"}.mi-twitch:before{content:"\F0C9"}.mi-twitter-square:before{content:"\F0CA"}.mi-typo3:before{content:"\F0CB"}.mi-ubuntu:before{content:"\F0CC"}.mi-uikit:before{content:"\F0CD"}.mi-uniregistry:before{content:"\F0CE"}.mi-untappd:before{content:"\F0CF"}.mi-ups:before{content:"\F0D0"}.mi-usb:before{content:"\F0D1"}.mi-usps:before{content:"\F0D2"}.mi-ussunnah:before{content:"\F0D3"}.mi-vaadin:before{content:"\F0D4"}.mi-viacoin:before{content:"\F0D5"}.mi-viadeo-square:before{content:"\F0D6"}.mi-viadeo:before{content:"\F0D7"}.mi-viber:before{content:"\F0D8"}.mi-vimeo-square:before{content:"\F0D9"}.mi-vimeo-v:before{content:"\F0DA"}.mi-vimeo:before{content:"\F0DB"}.mi-vine:before{content:"\F0DC"}.mi-vk:before{content:"\F0DD"}.mi-vnv:before{content:"\F0DE"}.mi-vuejs:before{content:"\F0DF"}.mi-weebly:before{content:"\F0E0"}.mi-weibo:before{content:"\F0E1"}.mi-weixin:before{content:"\F0E2"}.mi-whatsapp-square:before{content:"\F0E3"}.mi-whatsapp:before{content:"\F0E4"}.mi-whmcs:before{content:"\F0E5"}.mi-wikipedia-w:before{content:"\F0E6"}.mi-windows:before{content:"\F0E7"}.mi-wix:before{content:"\F0E8"}.mi-wizards-of-the-coast:before{content:"\F0E9"}.mi-wolf-pack-battalion:before{content:"\F0EA"}.mi-wordpress-simple:before{content:"\F0EB"}.mi-wordpress:before{content:"\F0EC"}.mi-wpbeginner:before{content:"\F0ED"}.mi-wpexplorer:before{content:"\F0EE"}.mi-wpforms:before{content:"\F0EF"}.mi-wpressr:before{content:"\F0F0"}.mi-xbox:before{content:"\F0F1"}.mi-xing-square:before{content:"\F0F2"}.mi-xing:before{content:"\F0F3"}.mi-y-combinator:before{content:"\F0F4"}.mi-yahoo:before{content:"\F0F5"}.mi-yandex-international:before{content:"\F0F6"}.mi-yandex:before{content:"\F0F7"}.mi-yarn:before{content:"\F0F8"}.mi-yelp:before{content:"\F0F9"}.mi-yoast:before{content:"\F0FA"}.mi-youtube-square:before{content:"\F0FB"}.mi-youtube:before{content:"\F0FC"}.mi-zhihu:before{content:"\F0FD"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.uib-datepicker .uib-title,.uib-left,.uib-right{width:100%}.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}.uib-day button,.uib-month button,.uib-year button{min-width:100%}.uib-position-measure{display:block!important;visibility:hidden!important;position:absolute!important;top:-9999px!important;left:-9999px!important}.uib-position-scrollbar-measure{position:absolute!important;top:-9999px!important;width:50px!important;height:50px!important;overflow:scroll!important}.uib-position-body-scrollbar-measure{overflow:scroll!important}.uib-datepicker-popup.dropdown-menu{display:block;float:none;margin:0}.uib-button-bar{padding:10px 9px 2px}[uib-popover-html-popup].popover.bottom-left>.arrow,[uib-popover-html-popup].popover.bottom-right>.arrow,[uib-popover-html-popup].popover.left-bottom>.arrow,[uib-popover-html-popup].popover.left-top>.arrow,[uib-popover-html-popup].popover.right-bottom>.arrow,[uib-popover-html-popup].popover.right-top>.arrow,[uib-popover-html-popup].popover.top-left>.arrow,[uib-popover-html-popup].popover.top-right>.arrow,[uib-popover-popup].popover.bottom-left>.arrow,[uib-popover-popup].popover.bottom-right>.arrow,[uib-popover-popup].popover.left-bottom>.arrow,[uib-popover-popup].popover.left-top>.arrow,[uib-popover-popup].popover.right-bottom>.arrow,[uib-popover-popup].popover.right-top>.arrow,[uib-popover-popup].popover.top-left>.arrow,[uib-popover-popup].popover.top-right>.arrow,[uib-popover-template-popup].popover.bottom-left>.arrow,[uib-popover-template-popup].popover.bottom-right>.arrow,[uib-popover-template-popup].popover.left-bottom>.arrow,[uib-popover-template-popup].popover.left-top>.arrow,[uib-popover-template-popup].popover.right-bottom>.arrow,[uib-popover-template-popup].popover.right-top>.arrow,[uib-popover-template-popup].popover.top-left>.arrow,[uib-popover-template-popup].popover.top-right>.arrow,[uib-tooltip-html-popup].tooltip.bottom-left>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-right>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-bottom>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-top>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-bottom>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-top>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-left>.tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-right>.tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-left>.tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-right>.tooltip-arrow,[uib-tooltip-popup].tooltip.left-bottom>.tooltip-arrow,[uib-tooltip-popup].tooltip.left-top>.tooltip-arrow,[uib-tooltip-popup].tooltip.right-bottom>.tooltip-arrow,[uib-tooltip-popup].tooltip.right-top>.tooltip-arrow,[uib-tooltip-popup].tooltip.top-left>.tooltip-arrow,[uib-tooltip-popup].tooltip.top-right>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-left>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-right>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-bottom>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-top>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-bottom>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-top>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-left>.tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-right>.tooltip-arrow{top:auto;bottom:auto;left:auto;right:auto;margin:0}[uib-popover-html-popup].popover,[uib-popover-popup].popover,[uib-popover-template-popup].popover{display:block!important}.uib-time input{width:50px}[uib-typeahead-popup].dropdown-menu{display:block} \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js index 1bcaa2466..f326f8a75 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js @@ -1,4 +1,4 @@ -/* Tue Aug 31 2021 16:59:42 GMT+0700 (Indochina Time) */"use strict"; +/* Wed Sep 01 2021 20:51:17 GMT+0700 (Indochina Time) */"use strict"; var app = angular.module("MixPortal", [ "angularCroppie", "ui.bootstrap", @@ -647,97 +647,6 @@ app.factory("CustomerServices", [ }, ]); -"use strict"; -app.controller("DashboardController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$timeout", - "$location", - "DashboardServices", - function ( - $scope, - $rootScope, - ngAppSettings, - $timeout, - $location, - dashboardServices - ) { - $scope.pageClass = "page-dashboard"; - $(".side-nav li").removeClass("active"); - $(".side-nav .page-dashboard").addClass("active"); - $scope.data = { - totalPage: 0, - totalPost: 0, - totalProduct: 0, - totalUser: 0, - }; - $scope.users = []; - $scope.$on("$viewContentLoaded", function () { - $rootScope.isBusy = false; - }); - $scope.getDashboardInfo = async function () { - $rootScope.isBusy = true; - var response = await dashboardServices.getDashboardInfo(); - if (response.isSucceed) { - // $('#mainSection').removeClass('card'); - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - // $scope.getChart(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.getChart = function () { - var ctx = document.getElementById("myChart"); - var myChart = new Chart(ctx, { - // type: 'pie', - // data: { - // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], - // datasets: [{ - // label: "Population (millions)", - // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], - // data: [2478,5267,734,784,433] - // }] - // }, - // options: { - // title: { - // display: true, - // text: 'Predicted world population (millions) in 2050' - // } - // } - }); - }; - }, -]); - -"use strict"; -app.factory("DashboardServices", [ - "$rootScope", - "$http", - "ApiService", - "CommonService", - function ($rootScope, $http, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var usersServiceFactory = {}; - var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; - var _getDashboardInfo = async function () { - var req = { - method: "GET", - url: apiUrl + "/dashboard", - }; - return await apiService.getApiResult(req); - }; - - usersServiceFactory.getDashboardInfo = _getDashboardInfo; - return usersServiceFactory; - }, -]); - "use strict"; app.controller("CultureController", [ "$scope", @@ -1312,6 +1221,97 @@ app.factory("CultureService", [ }, ]); +"use strict"; +app.controller("DashboardController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$timeout", + "$location", + "DashboardServices", + function ( + $scope, + $rootScope, + ngAppSettings, + $timeout, + $location, + dashboardServices + ) { + $scope.pageClass = "page-dashboard"; + $(".side-nav li").removeClass("active"); + $(".side-nav .page-dashboard").addClass("active"); + $scope.data = { + totalPage: 0, + totalPost: 0, + totalProduct: 0, + totalUser: 0, + }; + $scope.users = []; + $scope.$on("$viewContentLoaded", function () { + $rootScope.isBusy = false; + }); + $scope.getDashboardInfo = async function () { + $rootScope.isBusy = true; + var response = await dashboardServices.getDashboardInfo(); + if (response.isSucceed) { + // $('#mainSection').removeClass('card'); + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + // $scope.getChart(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.getChart = function () { + var ctx = document.getElementById("myChart"); + var myChart = new Chart(ctx, { + // type: 'pie', + // data: { + // labels: ["Africa", "Asia", "Europe", "Latin America", "North America"], + // datasets: [{ + // label: "Population (millions)", + // backgroundColor: ["#3e95cd", "#8e5ea2","#3cba9f","#e8c3b9","#c45850"], + // data: [2478,5267,734,784,433] + // }] + // }, + // options: { + // title: { + // display: true, + // text: 'Predicted world population (millions) in 2050' + // } + // } + }); + }; + }, +]); + +"use strict"; +app.factory("DashboardServices", [ + "$rootScope", + "$http", + "ApiService", + "CommonService", + function ($rootScope, $http, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var usersServiceFactory = {}; + var apiUrl = "/portal/" + $rootScope.localizeSettings.lang; + var _getDashboardInfo = async function () { + var req = { + method: "GET", + url: apiUrl + "/dashboard", + }; + return await apiService.getApiResult(req); + }; + + usersServiceFactory.getDashboardInfo = _getDashboardInfo; + return usersServiceFactory; + }, +]); + "use strict"; app.controller("FileController", [ "$scope", @@ -1600,68 +1600,171 @@ app.factory("ImportFileServices", [ ]); "use strict"; -app.controller("JsonDataController", [ +app.controller("LocalizeController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", - "$timeout", "$location", - "AuthService", - "JsonDataService", + "LocalizeService", + "ApiService", + "CommonService", function ( $scope, $rootScope, ngAppSettings, $routeParams, - $timeout, $location, - authService, - service + service, + commonService ) { - $scope.request = { - pageSize: "10", - pageIndex: 0, - status: "Published", - orderBy: "CreatedDateTime", - direction: "Desc", - fromDate: null, - toDate: null, - keyword: "", - key: "", - }; - - $scope.activedFile = null; - $scope.editorVisible = false; - $scope.data = null; - $scope.relatedFiles = []; - $rootScope.isBusy = false; - - $scope.errors = []; + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); - $scope.loadPage = async function (folder) { - if (folder) { - $scope.request.key += $scope.request.key !== "" ? "/" : ""; - $scope.request.key += folder; + $scope.getSingleSuccessCallback = function () { + $scope.cates = ngAppSettings.enums.configuration_cates; + $scope.globalSettings = $rootScope.globalSettings; + $scope.request.category = $routeParams.category || ""; + if (!$scope.viewmodel.id) { + $scope.viewmodel.property.dataType = "Text"; + } + if (!$scope.viewmodel.category) { + $scope.viewmodel.category = "Site"; } - $location.url( - "/portal/json-data/list?folder=" + - encodeURIComponent($scope.request.key) - ); }; - $scope.init = async function () { - $rootScope.isBusy = true; - $scope.filename = $routeParams.filename; - $scope.folder = $routeParams.folder; - $scope.listUrl = "/portal/json-data/list?folder=" + $routeParams.folder; - $rootScope.isBusy = true; - var response = await service.getFile( - $routeParams.folder, - $routeParams.filename - ); - if (response.isSucceed) { - $scope.activedFile = response.data; - $scope.data = $.parseJSON(response.data.content); + $scope.saveSuccessCallback = function () { + commonService.initAllSettings().then(function () { + // $location.url($scope.referrerUrl); + $rootScope.isBusy = false; + $scope.$apply(); + }); + }; + $scope.removeCallback = function () { + commonService.initAllSettings().then(function () { + $location.url($scope.referrerUrl); + }); + }; + + $scope.generateName = function () { + $scope.viewmodel.keyword = $rootScope.generateKeyword( + $scope.viewmodel.keyword, + "_", + true + ); + }; + }, +]); + +"use strict"; +app.factory("LocalizeService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("language"); + + var _uploadLanguage = async function (languageFile) { + //var container = $(this).parents('.model-language').first().find('.custom-file').first(); + if (languageFile.file !== undefined && languageFile.file !== null) { + // Create FormData object + var files = new FormData(); + + // Looping over all files and add it to FormData object + files.append(languageFile.file.name, languageFile.file); + + // Adding one more key to FormData object + files.append("fileFolder", languageFile.folder); + files.append("title", languageFile.title); + files.append("description", languageFile.description); + + var req = { + url: this.prefixUrl + "/upload", + type: "POST", + headers: {}, + contentType: false, // Not to set any content header + processData: false, // Not to process data + data: files, + }; + + return await apiService.getApiResult(req); + } + }; + serviceFactory.uploadLanguage = _uploadLanguage; + return serviceFactory; + }, +]); + +"use strict"; +app.controller("JsonDataController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$timeout", + "$location", + "AuthService", + "JsonDataService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $timeout, + $location, + authService, + service + ) { + $scope.request = { + pageSize: "10", + pageIndex: 0, + status: "Published", + orderBy: "CreatedDateTime", + direction: "Desc", + fromDate: null, + toDate: null, + keyword: "", + key: "", + }; + + $scope.activedFile = null; + $scope.editorVisible = false; + $scope.data = null; + $scope.relatedFiles = []; + $rootScope.isBusy = false; + + $scope.errors = []; + + $scope.loadPage = async function (folder) { + if (folder) { + $scope.request.key += $scope.request.key !== "" ? "/" : ""; + $scope.request.key += folder; + } + $location.url( + "/portal/json-data/list?folder=" + + encodeURIComponent($scope.request.key) + ); + }; + $scope.init = async function () { + $rootScope.isBusy = true; + $scope.filename = $routeParams.filename; + $scope.folder = $routeParams.folder; + $scope.listUrl = "/portal/json-data/list?folder=" + $routeParams.folder; + $rootScope.isBusy = true; + var response = await service.getFile( + $routeParams.folder, + $routeParams.filename + ); + if (response.isSucceed) { + $scope.activedFile = response.data; + $scope.data = $.parseJSON(response.data.content); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -1814,109 +1917,6 @@ app.factory("JsonDataService", [ }, ]); -"use strict"; -app.controller("LocalizeController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "LocalizeService", - "ApiService", - "CommonService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service, - commonService - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - - $scope.getSingleSuccessCallback = function () { - $scope.cates = ngAppSettings.enums.configuration_cates; - $scope.globalSettings = $rootScope.globalSettings; - $scope.request.category = $routeParams.category || ""; - if (!$scope.viewmodel.id) { - $scope.viewmodel.property.dataType = "Text"; - } - if (!$scope.viewmodel.category) { - $scope.viewmodel.category = "Site"; - } - }; - $scope.saveSuccessCallback = function () { - commonService.initAllSettings().then(function () { - // $location.url($scope.referrerUrl); - $rootScope.isBusy = false; - $scope.$apply(); - }); - }; - $scope.removeCallback = function () { - commonService.initAllSettings().then(function () { - $location.url($scope.referrerUrl); - }); - }; - - $scope.generateName = function () { - $scope.viewmodel.keyword = $rootScope.generateKeyword( - $scope.viewmodel.keyword, - "_", - true - ); - }; - }, -]); - -"use strict"; -app.factory("LocalizeService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("language"); - - var _uploadLanguage = async function (languageFile) { - //var container = $(this).parents('.model-language').first().find('.custom-file').first(); - if (languageFile.file !== undefined && languageFile.file !== null) { - // Create FormData object - var files = new FormData(); - - // Looping over all files and add it to FormData object - files.append(languageFile.file.name, languageFile.file); - - // Adding one more key to FormData object - files.append("fileFolder", languageFile.folder); - files.append("title", languageFile.title); - files.append("description", languageFile.description); - - var req = { - url: this.prefixUrl + "/upload", - type: "POST", - headers: {}, - contentType: false, // Not to set any content header - processData: false, // Not to process data - data: files, - }; - - return await apiService.getApiResult(req); - } - }; - serviceFactory.uploadLanguage = _uploadLanguage; - return serviceFactory; - }, -]); - "use strict"; app.controller("loginController", [ "$rootScope", @@ -3453,43 +3453,193 @@ app.factory("OrderServices", [ ]); "use strict"; -app.controller("PageController", [ +app.controller("PageGalleryController", [ "$scope", "$rootScope", "ngAppSettings", - "$location", "$routeParams", - "PageRestService", - "PagePostRestService", - "PagePageRestService", - "UrlAliasService", - "RestMixDatabaseDataPortalService", + "$location", + "PageGalleryService", + "PostRestService", + "ApiService", + "CommonService", function ( $scope, $rootScope, ngAppSettings, - $location, $routeParams, + $location, service, - pagePostRestService, - pagePageRestService, - urlAliasService, - dataService + postService, + apiService, + commonService ) { - BaseRestCtrl.call( + BaseCtrl.call( this, $scope, $rootScope, - $location, $routeParams, ngAppSettings, service ); - $scope.viewmodelType = "page"; - $scope.request.query = "level=0"; - $scope.pageType = ""; - $scope.pageTypes = $rootScope.globalSettings.pageTypes; - $scope.selectedCategories = []; + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.pageId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.getList = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + $scope.request.query = "&page_id=" + id; + var response = await service.getList($scope.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.remove = function (pageId, postId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [pageId, postId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeConfirmed = async function (pageId, postId) { + $rootScope.isBusy = true; + var result = await service.delete(pageId, postId); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); + $rootScope.isBusy = true; + var startIndex = $scope.data.items[0].priority - 1; + for (var i = 0; i < $scope.data.items.length; i++) { + $scope.data.items[i].priority = startIndex + i + 1; + } + var resp = await service.updateInfos($scope.data.items); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("PageGalleryService", [ + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($rootScope, apiService, commonService, baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("page-post"); + var _delete = async function (pageId, postId) { + var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; + var _updateInfos = async function (pages) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-infos", + data: JSON.stringify(pages), + }; + return await apiService.getApiResult(req); + }; + serviceFactory.delete = _delete; + serviceFactory.updateInfos = _updateInfos; + return serviceFactory; + }, +]); + +"use strict"; +app.controller("PageController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$location", + "$routeParams", + "PageRestService", + "PagePostRestService", + "PagePageRestService", + "UrlAliasService", + "RestMixDatabaseDataPortalService", + function ( + $scope, + $rootScope, + ngAppSettings, + $location, + $routeParams, + service, + pagePostRestService, + pagePageRestService, + urlAliasService, + dataService + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.viewmodelType = "page"; + $scope.request.query = "level=0"; + $scope.pageType = ""; + $scope.pageTypes = $rootScope.globalSettings.pageTypes; + $scope.selectedCategories = []; $scope.selectedTags = []; $scope.pageData = { posts: [], @@ -3847,13 +3997,13 @@ app.factory("PagePageRestService", [ ]); "use strict"; -app.controller("PageGalleryController", [ +app.controller("PagePositionController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PageGalleryService", + "PagePositionService", "PostRestService", "ApiService", "CommonService", @@ -3900,6 +4050,10 @@ app.controller("PageGalleryController", [ $scope.$apply(); } }; + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); + }; $scope.remove = function (pageId, postId) { $rootScope.showConfirm( $scope, @@ -3966,16 +4120,16 @@ app.controller("PageGalleryController", [ ]); "use strict"; -app.factory("PageGalleryService", [ +app.factory("PagePositionService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (pageId, postId) { - var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; + serviceFactory.init("page-position"); + var _delete = async function (pageId, positionId) { + var url = this.prefixUrl + "/delete/" + pageId + "/" + positionId; var req = { method: "GET", url: url, @@ -3997,13 +4151,13 @@ app.factory("PageGalleryService", [ ]); "use strict"; -app.controller("PagePositionController", [ +app.controller("PagePostController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePositionService", + "PagePostRestService", "PostRestService", "ApiService", "CommonService", @@ -4015,7 +4169,6 @@ app.controller("PagePositionController", [ $location, service, postService, - apiService, commonService ) { BaseCtrl.call( @@ -4029,9 +4182,24 @@ app.controller("PagePositionController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.pageId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.init = function () { + $scope.pageId = $routeParams.id; + $scope.type = $routeParams.type; + $scope.template = $routeParams.template || ""; + $scope.pageIds = $routeParams.page_ids || $routeParams.id; + $scope.moduleIds = $routeParams.module_ids || ""; + $scope.canDrag = + $scope.request.orderBy === "Priority" && + $scope.request.direction === "Asc"; + $scope.createUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/create-gallery" + : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; + $scope.updateUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/gallery-details" + : "/portal/post/details"; + }; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -4065,9 +4233,9 @@ app.controller("PagePositionController", [ ); }; - $scope.removeConfirmed = async function (pageId, postId) { + $scope.removeConfirmed = async function (id) { $rootScope.isBusy = true; - var result = await service.delete(pageId, postId); + var result = await service.delete(id); if (result.isSucceed) { if ($scope.removeCallback) { $rootScope.executeFunctionByName( @@ -4120,16 +4288,16 @@ app.controller("PagePositionController", [ ]); "use strict"; -app.factory("PagePositionService", [ +app.factory("PagePostRestService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-position"); - var _delete = async function (pageId, positionId) { - var url = this.prefixUrl + "/delete/" + pageId + "/" + positionId; + serviceFactory.init("page-post"); + var _delete = async function (id) { + var url = this.prefixUrl + "/delete/" + id; var req = { method: "GET", url: url, @@ -4151,210 +4319,42 @@ app.factory("PagePositionService", [ ]); "use strict"; -app.controller("PagePostController", [ +app.controller("PermissionController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePostRestService", - "PostRestService", "ApiService", "CommonService", + "PermissionService", + "RestPortalPageNavigationService", function ( $scope, $rootScope, ngAppSettings, $routeParams, $location, + apiService, + commonService, service, - postService, - commonService + navService ) { - BaseCtrl.call( + BaseRestCtrl.call( this, $scope, $rootScope, + $location, $routeParams, ngAppSettings, service ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.init = function () { - $scope.pageId = $routeParams.id; - $scope.type = $routeParams.type; - $scope.template = $routeParams.template || ""; - $scope.pageIds = $routeParams.page_ids || $routeParams.id; - $scope.moduleIds = $routeParams.module_ids || ""; - $scope.canDrag = - $scope.request.orderBy === "Priority" && - $scope.request.direction === "Asc"; - $scope.createUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/create-gallery" - : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; - $scope.updateUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/gallery-details" - : "/portal/post/details"; - }; - $scope.getList = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.request.query = "&page_id=" + id; - var response = await service.getList($scope.request); - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); - }; - $scope.remove = function (pageId, postId) { - $rootScope.showConfirm( - $scope, - "removeConfirmed", - [pageId, postId], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeConfirmed = async function (id) { - $rootScope.isBusy = true; - var result = await service.delete(id); - if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); - $rootScope.isBusy = true; - var startIndex = $scope.data.items[0].priority - 1; - for (var i = 0; i < $scope.data.items.length; i++) { - $scope.data.items[i].priority = startIndex + i + 1; - } - var resp = await service.updateInfos($scope.data.items); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("PagePostRestService", [ - "$rootScope", - "ApiService", - "CommonService", - "BaseService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (id) { - var url = this.prefixUrl + "/delete/" + id; - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - var _updateInfos = async function (pages) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(pages), - }; - return await apiService.getApiResult(req); - }; - serviceFactory.delete = _delete; - serviceFactory.updateInfos = _updateInfos; - return serviceFactory; - }, -]); - -"use strict"; -app.controller("PermissionController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "ApiService", - "CommonService", - "PermissionService", - "RestPortalPageNavigationService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - apiService, - commonService, - service, - navService - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.request.level = 0; - $scope.miOptions = ngAppSettings.miIcons; - $scope.initDialog = function () { - $("#dlg-permission").on("shown.bs.modal", function () { - $scope.initCurrentPath(); - }); + $scope.request.level = 0; + $scope.miOptions = ngAppSettings.miIcons; + $scope.initDialog = function () { + $("#dlg-permission").on("shown.bs.modal", function () { + $scope.initCurrentPath(); + }); }; $scope.initCurrentPath = async function () { @@ -4465,6 +4465,98 @@ app.factory("RestPortalPageNavigationService", [ }, ]); +"use strict"; +app.controller("RoleController", [ + "$scope", + "$rootScope", + "$location", + "$routeParams", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", + "RoleService", + function ( + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + dataService, + columnService, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.role = { name: "" }; + $scope.initPermissions = async function () { + let backUrl = "/portal/role/list"; + $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; + $scope.updateUrl = "/portal/mix-database-data/details"; + }; + + $scope.createRole = async function () { + $rootScope.isBusy = true; + var result = await service.createRole($scope.role.name); + if (result.isSucceed) { + $scope.role.name = ""; + $scope.getList(); + } else { + $rootScope.showErrors(result.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("RoleService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("role", true); + + var _getPermissions = async function () { + var req = { + method: "GET", + url: this.prefixUrl + "/permissions", + }; + return await apiService.getApiResult(req); + }; + + var _updatePermission = async function (permission) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-permission", + data: JSON.stringify(permission), + }; + return await apiService.getApiResult(req); + }; + var _createRole = function (name) { + var req = { + method: "POST", + url: this.prefixUrl + "/create", + data: JSON.stringify(name), + }; + + return apiService.getRestApiResult(req); + }; + serviceFactory.createRole = _createRole; + serviceFactory.getPermissions = _getPermissions; + serviceFactory.updatePermission = _updatePermission; + return serviceFactory; + }, +]); + "use strict"; app.controller("PostController", [ "$scope", @@ -5021,99 +5113,7 @@ app.controller("ServiceController", [ ]); "use strict"; -app.controller("RoleController", [ - "$scope", - "$rootScope", - "$location", - "$routeParams", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", - "RoleService", - function ( - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - dataService, - columnService, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.role = { name: "" }; - $scope.initPermissions = async function () { - let backUrl = "/portal/role/list"; - $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; - $scope.updateUrl = "/portal/mix-database-data/details"; - }; - - $scope.createRole = async function () { - $rootScope.isBusy = true; - var result = await service.createRole($scope.role.name); - if (result.isSucceed) { - $scope.role.name = ""; - $scope.getList(); - } else { - $rootScope.showErrors(result.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("RoleService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("role", true); - - var _getPermissions = async function () { - var req = { - method: "GET", - url: this.prefixUrl + "/permissions", - }; - return await apiService.getApiResult(req); - }; - - var _updatePermission = async function (permission) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-permission", - data: JSON.stringify(permission), - }; - return await apiService.getApiResult(req); - }; - var _createRole = function (name) { - var req = { - method: "POST", - url: this.prefixUrl + "/create", - data: JSON.stringify(name), - }; - - return apiService.getRestApiResult(req); - }; - serviceFactory.createRole = _createRole; - serviceFactory.getPermissions = _getPermissions; - serviceFactory.updatePermission = _updatePermission; - return serviceFactory; - }, -]); - -"use strict"; -app.controller("SocialFeedController", [ +app.controller("SocialFeedController", [ "$rootScope", "$scope", "$http", @@ -5645,6 +5645,7 @@ app.controller("ThemeController", [ isIncludeAssets: true, isIncludeTemplates: true, isIncludeConfigurations: true, + isIncludePermissions: true, pages: [], modules: [], mixDatabases: [], @@ -6570,16 +6571,6 @@ app.component("appSettingsSmtp", { }, }); -app.component("customerMain", { - templateUrl: - "/mix-app/views/app-portal/pages/customer/components/main/customer-main.html", - bindings: { - customer: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("customerOrders", { templateUrl: "/mix-app/views/app-portal/pages/customer/components/orders/customer-orders.html", @@ -6619,6 +6610,31 @@ app.component("customerOrders", { }, }); +app.component("customerMain", { + templateUrl: + "/mix-app/views/app-portal/pages/customer/components/main/customer-main.html", + bindings: { + customer: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + +app.component("mixDatabaseEdm", { + templateUrl: + "/mix-app/views/app-portal/pages/mix-database/components/edm/view.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + }, + ], + bindings: { + model: "=", + }, +}); + app.component("mixDatabaseMain", { templateUrl: "/mix-app/views/app-portal/pages/mix-database/components/main/view.html", @@ -6648,21 +6664,6 @@ app.component("mixDatabaseMain", { }, }); -app.component("mixDatabaseEdm", { - templateUrl: - "/mix-app/views/app-portal/pages/mix-database/components/edm/view.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - }, - ], - bindings: { - model: "=", - }, -}); - app.component("moduleMain", { templateUrl: "/mix-app/views/app-portal/pages/module/components/main/main.html", @@ -6896,6 +6897,27 @@ app.component("pageModules", { }, }); +app.component("pageAdvanced", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/page-advanced/view.html", + bindings: { + model: "=", + additionalData: "=", + }, + controller: [ + "$rootScope", + "$scope", + function ($rootScope, $scope) { + var ctrl = this; + + ctrl.translate = $rootScope.translate; + ctrl.$onInit = function () { + ctrl.isAdmin = $rootScope.isAdmin; + }; + }, + ], +}); + app.component("pageContent", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-content/view.html", @@ -6938,27 +6960,6 @@ app.component("pageContent", { ], }); -app.component("pageAdvanced", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/page-advanced/view.html", - bindings: { - model: "=", - additionalData: "=", - }, - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - - ctrl.translate = $rootScope.translate; - ctrl.$onInit = function () { - ctrl.isAdmin = $rootScope.isAdmin; - }; - }, - ], -}); - app.component("pageType", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-type/view.html", @@ -6974,16 +6975,6 @@ app.component("pageType", { ], }); -app.component("pagePlugPlay", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/plug-play/plug-play.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageParents", { templateUrl: "/mix-app/views/app-portal/pages/page/components/parents/parents.html", @@ -6994,24 +6985,6 @@ app.component("pageParents", { }, }); -app.component("pageSeo", { - templateUrl: "/mix-app/views/app-portal/pages/page/components/seo/seo.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - }, - ], - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("productRelated", { templateUrl: "/mix-app/views/app-portal/pages/product/components/related/productRelated.html", @@ -7048,6 +7021,34 @@ app.component("productRelated", { }, }); +app.component("pagePlugPlay", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/plug-play/plug-play.html", + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + +app.component("pageSeo", { + templateUrl: "/mix-app/views/app-portal/pages/page/components/seo/seo.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + }, + ], + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("permissionMain", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/main/main.html", @@ -7086,16 +7087,6 @@ app.component("permissionMain", { }, }); -app.component("permissionParents", { - templateUrl: - "/mix-app/views/app-portal/pages/permission/components/parents/parents.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("permissionPlugPlay", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/plug-play/plug-play.html", @@ -7195,13 +7186,64 @@ app.component("permissionPlugPlay", { ], }); -app.component("postGeneral", { +app.component("permissionParents", { templateUrl: - "/mix-app/views/app-portal/pages/post/components/general/view.html", + "/mix-app/views/app-portal/pages/permission/components/parents/parents.html", + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + +modules.component("rolePageNav", { + templateUrl: + "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", controller: [ "$rootScope", + "$scope", "ngAppSettings", - function ($rootScope, ngAppSettings) { + "RoleService", + function ($rootScope, $scope, ngAppSettings, roleServices) { + var ctrl = this; + ctrl.selected = null; + ctrl.updateOrders = function (index) { + ctrl.data.splice(index, 1); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.data[i].priority = i + 1; + } + }; + //ctrl.change = async function () { + // //var permission = ctrl.page.navPermission; + // //$rootScope.isBusy = true; + // //var resp = await roleServices.updatePermission(permission); + // //if (resp && resp.isSucceed) { + // // $rootScope.showMessage('Update successfully!', 'success'); + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + // //else { + // // if (resp) { $rootScope.showErrors(resp.errors); } + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + //}; + }, + ], + bindings: { + prefix: "=", + page: "=", + callback: "&", + }, +}); + +app.component("postGeneral", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/general/view.html", + controller: [ + "$rootScope", + "ngAppSettings", + function ($rootScope, ngAppSettings) { var ctrl = this; ctrl.dataTypes = $rootScope.globalSettings.dataTypes; ctrl.$onInit = function () {}; @@ -7224,49 +7266,6 @@ app.component("postGeneral", { }, }); -app.component("postMedias", { - templateUrl: - "/mix-app/views/app-portal/pages/post/components/medias/view.html", - controller: function () { - var ctrl = this; - ctrl.activeMedia = function (media) { - var currentItem = null; - if (ctrl.post.mediaNavs === null) { - ctrl.post.mediaNavs = []; - } - $.each(ctrl.post.mediaNavs, function (i, e) { - if (e.mediaId === media.id) { - e.isActived = media.isActived; - currentItem = e; - return false; - } - }); - if (currentItem === null) { - currentItem = { - description: - media.description !== "undefined" ? media.description : "", - image: media.filePath, - mediaId: media.id, - post: ctrl.post.id, - specificulture: media.specificulture, - position: 0, - priority: ctrl.post.mediaNavs.length + 1, - isActived: true, - }; - media.isHidden = true; - ctrl.post.mediaNavs.push(currentItem); - } - }; - }, - bindings: { - post: "=", - medias: "=", - loadMedia: "&", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("postMain", { templateUrl: "/mix-app/views/app-portal/pages/post/components/main/view.html", bindings: { @@ -7394,26 +7393,6 @@ app.component("postModules", { }, }); -app.component("postAdvanced", { - templateUrl: - "/mix-app/views/app-portal/pages/post/components/post-advanced/view.html", - bindings: { - model: "=", - additionalData: "=", - }, - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.translate = $rootScope.translate; - ctrl.$onInit = function () { - ctrl.isAdmin = $rootScope.isAdmin; - }; - }, - ], -}); - app.component("postParents", { templateUrl: "/mix-app/views/app-portal/pages/post/components/parents/view.html", @@ -7424,41 +7403,69 @@ app.component("postParents", { }, }); -app.component("postRelated", { +app.component("postMedias", { templateUrl: - "/mix-app/views/app-portal/pages/post/components/related/view.html", + "/mix-app/views/app-portal/pages/post/components/medias/view.html", controller: function () { var ctrl = this; - ctrl.activePost = function (model) { + ctrl.activeMedia = function (media) { var currentItem = null; - $.each(ctrl.post.postNavs, function (i, e) { - if (e.relatedPostId === model.id) { - e.isActived = model.isActived; + if (ctrl.post.mediaNavs === null) { + ctrl.post.mediaNavs = []; + } + $.each(ctrl.post.mediaNavs, function (i, e) { + if (e.mediaId === media.id) { + e.isActived = media.isActived; currentItem = e; return false; } }); if (currentItem === null) { currentItem = { - relatedPostId: model.id, - sourcePostId: ctrl.post.id, - specificulture: ctrl.post.specificulture, - priority: ctrl.post.postNavs.length + 1, - relatedPost: pr, + description: + media.description !== "undefined" ? media.description : "", + image: media.filePath, + mediaId: media.id, + post: ctrl.post.id, + specificulture: media.specificulture, + position: 0, + priority: ctrl.post.mediaNavs.length + 1, isActived: true, }; - model.isHidden = true; - ctrl.post.postNavs.push(currentItem); + media.isHidden = true; + ctrl.post.mediaNavs.push(currentItem); } }; }, bindings: { post: "=", + medias: "=", + loadMedia: "&", onDelete: "&", onUpdate: "&", }, }); +app.component("postAdvanced", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/post-advanced/view.html", + bindings: { + model: "=", + additionalData: "=", + }, + controller: [ + "$rootScope", + "$scope", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.translate = $rootScope.translate; + ctrl.$onInit = function () { + ctrl.isAdmin = $rootScope.isAdmin; + }; + }, + ], +}); + app.component("postContent", { templateUrl: "/mix-app/views/app-portal/pages/post/components/post-content/view.html", @@ -7558,6 +7565,41 @@ app.component("postSeo", { }, }); +app.component("postRelated", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/related/view.html", + controller: function () { + var ctrl = this; + ctrl.activePost = function (model) { + var currentItem = null; + $.each(ctrl.post.postNavs, function (i, e) { + if (e.relatedPostId === model.id) { + e.isActived = model.isActived; + currentItem = e; + return false; + } + }); + if (currentItem === null) { + currentItem = { + relatedPostId: model.id, + sourcePostId: ctrl.post.id, + specificulture: ctrl.post.specificulture, + priority: ctrl.post.postNavs.length + 1, + relatedPost: pr, + isActived: true, + }; + model.isHidden = true; + ctrl.post.postNavs.push(currentItem); + } + }; + }, + bindings: { + post: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("serviceMain", { templateUrl: "/mix-app/views/app-portal/pages/service/components/main/view.html", @@ -7582,47 +7624,6 @@ app.component("serviceMain", { }, }); -modules.component("rolePageNav", { - templateUrl: - "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RoleService", - function ($rootScope, $scope, ngAppSettings, roleServices) { - var ctrl = this; - ctrl.selected = null; - ctrl.updateOrders = function (index) { - ctrl.data.splice(index, 1); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.data[i].priority = i + 1; - } - }; - //ctrl.change = async function () { - // //var permission = ctrl.page.navPermission; - // //$rootScope.isBusy = true; - // //var resp = await roleServices.updatePermission(permission); - // //if (resp && resp.isSucceed) { - // // $rootScope.showMessage('Update successfully!', 'success'); - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - // //else { - // // if (resp) { $rootScope.showErrors(resp.errors); } - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - //}; - }, - ], - bindings: { - prefix: "=", - page: "=", - callback: "&", - }, -}); - app.component("themeExportMixDatabases", { templateUrl: "/mix-app/views/app-portal/pages/theme/components/theme-export-mix-databases/view.html", @@ -7660,45 +7661,30 @@ app.component("themeExportMixDatabases", { }, }); -app.component("themeExportPages", { +app.component("themeExportModules", { templateUrl: - "/mix-app/views/app-portal/pages/theme/components/theme-export-pages/view.html", + "/mix-app/views/app-portal/pages/theme/components/theme-export-modules/view.html", controller: [ "$rootScope", "$scope", "ngAppSettings", function ($rootScope, $scope) { var ctrl = this; - ctrl.updatePageExport = function (value, isSelected) { - // Filter actived page - var idx = (ctrl.selectedExport.pages = angular.copy( - $rootScope.filterArray(ctrl.exportData.pages, ["isActived"], [true]) - )); - - // // Loop actived page - // angular.forEach(ctrl.selectedExport.pages, function (e) { - // // filter list actived modules - // e.moduleNavs = angular.copy($rootScope.filterArray(e.moduleNavs, ['isActived'], [true])); - - // // Loop actived modules - // angular.forEach(e.moduleNavs, function (n) { - // // filter list actived data - // n.module.data.items = angular.copy($rootScope.filterArray(n.module.data.items, ['isActived'], [true])); - // $rootScope.removeObjectByKey(ctrl.exportData.modules, 'id', n.moduleId); - // $rootScope.removeObjectByKey(ctrl.selectedExport.modules, 'id', n.moduleId); - // }); + ctrl.updateModuleExport = function () { + ctrl.selectedExport.modules = angular.copy( + $rootScope.filterArray(ctrl.exportData.modules, ["isActived"], [true]) + ); + // angular.forEach(ctrl.selectedExport.modules,function(e){ + // e.data.items = angular.copy($rootScope.filterArray(e.data.items, ['isActived'], [true])); // }); }; - ctrl.isSelected = function (value) { - return ctrl.selectedValues.indexOf(value) >= 0; - }; ctrl.selectAll = function (arr) { ctrl.selectedList.data = []; angular.forEach(arr, function (e) { e.isActived = ctrl.selectedList.isSelectAll; e.isExportData = ctrl.selectedList.isExportData; }); - ctrl.updatePageExport(); + ctrl.updateModuleExport(); }; }, ], @@ -7708,30 +7694,45 @@ app.component("themeExportPages", { }, }); -app.component("themeExportModules", { +app.component("themeExportPages", { templateUrl: - "/mix-app/views/app-portal/pages/theme/components/theme-export-modules/view.html", + "/mix-app/views/app-portal/pages/theme/components/theme-export-pages/view.html", controller: [ "$rootScope", "$scope", "ngAppSettings", function ($rootScope, $scope) { var ctrl = this; - ctrl.updateModuleExport = function () { - ctrl.selectedExport.modules = angular.copy( - $rootScope.filterArray(ctrl.exportData.modules, ["isActived"], [true]) - ); - // angular.forEach(ctrl.selectedExport.modules,function(e){ - // e.data.items = angular.copy($rootScope.filterArray(e.data.items, ['isActived'], [true])); + ctrl.updatePageExport = function (value, isSelected) { + // Filter actived page + var idx = (ctrl.selectedExport.pages = angular.copy( + $rootScope.filterArray(ctrl.exportData.pages, ["isActived"], [true]) + )); + + // // Loop actived page + // angular.forEach(ctrl.selectedExport.pages, function (e) { + // // filter list actived modules + // e.moduleNavs = angular.copy($rootScope.filterArray(e.moduleNavs, ['isActived'], [true])); + + // // Loop actived modules + // angular.forEach(e.moduleNavs, function (n) { + // // filter list actived data + // n.module.data.items = angular.copy($rootScope.filterArray(n.module.data.items, ['isActived'], [true])); + // $rootScope.removeObjectByKey(ctrl.exportData.modules, 'id', n.moduleId); + // $rootScope.removeObjectByKey(ctrl.selectedExport.modules, 'id', n.moduleId); + // }); // }); }; + ctrl.isSelected = function (value) { + return ctrl.selectedValues.indexOf(value) >= 0; + }; ctrl.selectAll = function (arr) { ctrl.selectedList.data = []; angular.forEach(arr, function (e) { e.isActived = ctrl.selectedList.isSelectAll; e.isExportData = ctrl.selectedList.isExportData; }); - ctrl.updateModuleExport(); + ctrl.updatePageExport(); }; }, ], @@ -8328,35 +8329,6 @@ modules.component("additionalValue", { ], }); -modules.component("confirm", { - templateUrl: "/mix-app/views/app-portal/components/confirm/confirm.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.executeFunctionByName = async function ( - functionName, - args, - context - ) { - var result = await $rootScope.executeFunctionByName( - functionName, - args, - context - ); - if (result) { - $scope.$apply(); - } - }; - }, - ], - bindings: { - message: "=", - }, -}); - modules.component("customImage", { templateUrl: "/mix-app/views/app-portal/components/custom-image/custom-image.html", @@ -8539,6 +8511,35 @@ modules.component("customImage", { ], }); +modules.component("confirm", { + templateUrl: "/mix-app/views/app-portal/components/confirm/confirm.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.executeFunctionByName = async function ( + functionName, + args, + context + ) { + var result = await $rootScope.executeFunctionByName( + functionName, + args, + context + ); + if (result) { + $scope.$apply(); + } + }; + }, + ], + bindings: { + message: "=", + }, +}); + modules.component("filterList", { templateUrl: "/mix-app/views/app-portal/components/filter-list/filter-list.html", @@ -8645,8 +8646,9 @@ modules.component("funding", { bindings: {}, }); -modules.component("githubReleases", { - templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", +modules.component("githubContributers", { + templateUrl: + "/mix-app/views/app-portal/components/github-contributers/view.html", controller: [ "$rootScope", "$http", @@ -8656,7 +8658,7 @@ modules.component("githubReleases", { ctrl.init = function () { var req = { method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/releases", + url: "https://api.github.com/repos/mixcore/mix.core/contributors", }; ctrl.getGithubApiResult(req); }; @@ -8682,9 +8684,8 @@ modules.component("githubReleases", { bindings: {}, }); -modules.component("githubContributers", { - templateUrl: - "/mix-app/views/app-portal/components/github-contributers/view.html", +modules.component("githubReleases", { + templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", controller: [ "$rootScope", "$http", @@ -8694,7 +8695,7 @@ modules.component("githubContributers", { ctrl.init = function () { var req = { method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/contributors", + url: "https://api.github.com/repos/mixcore/mix.core/releases", }; ctrl.getGithubApiResult(req); }; @@ -9672,6 +9673,44 @@ modules.component("mediaFileUpload", { ], }); +modules.component("mediumNews", { + templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", + controller: [ + "$rootScope", + "$http", + function ($rootScope, $http) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var req = { + method: "GET", + url: + "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + + Math.floor(Date.now() / 1000), + }; + ctrl.getMediumApiResult(req); + }; + + ctrl.getMediumApiResult = async function (req) { + return $http(req).then( + function (resp) { + if (resp.status == "200") { + ctrl.items = resp.data.items; + } + }, + function (error) { + return { + isSucceed: false, + errors: [error.statusText || error.status], + }; + } + ); + }; + }, + ], + bindings: {}, +}); + modules.component("mediaUpload", { templateUrl: "/mix-app/views/app-portal/components/media-upload/media-upload.html", @@ -9733,79 +9772,151 @@ modules.component("mediaUpload", { }, }); -modules.component("mediumNews", { - templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", - controller: [ - "$rootScope", - "$http", - function ($rootScope, $http) { - var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var req = { - method: "GET", - url: - "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + - Math.floor(Date.now() / 1000), - }; - ctrl.getMediumApiResult(req); - }; - - ctrl.getMediumApiResult = async function (req) { - return $http(req).then( - function (resp) { - if (resp.status == "200") { - ctrl.items = resp.data.items; - } - }, - function (error) { - return { - isSucceed: false, - errors: [error.statusText || error.status], - }; - } - ); - }; - }, - ], - bindings: {}, -}); - -modules.component("mixDatabaseDataFilter", { +modules.component("mixDatabaseColumn", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-filter/view.html", + "/mix-app/views/app-portal/components/mix-database-column/view.html", bindings: { - query: "=", - mixDatabaseName: "=?", - mixDatabaseId: "=?", - selectedList: "=", - initData: "=?", - columns: "=?", - selected: "=", - callback: "&?", - save: "&?", + column: "=", }, controller: [ "$rootScope", "$scope", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, ngAppSettings, dataService) { + "RestMixDatabaseColumnPortalService", + function ($rootScope, $scope, columnService) { var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.types = ["Page", "Post"]; - ctrl.type = "Page"; - ctrl.navs = []; - ctrl.data = { items: [] }; - ctrl.goToPath = $rootScope.goToPath; - ctrl.$onInit = function () { - if (ctrl.initData) { - ctrl.data = ctrl.initData; + ctrl.value = {}; + ctrl.column = { + dataType: "Text", + mixDatabaseName: "sys_additional_column", + mixDatabaseId: 6, + }; + ctrl.selectedCol = null; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = async function () {}; + ctrl.addAttr = async function () { + if (ctrl.column.name) { + var current = $rootScope.findObjectByKey( + ctrl.additionalData.columns, + "name", + ctrl.column.name + ); + if (current) { + $rootScope.showErrors(["Field " + ctrl.column.name + " existed!"]); + } else { + ctrl.column.priority = ctrl.additionalData.columns.length + 1; + $rootScope.isBusy = true; + var saveField = await columnService.create(ctrl.column); + $rootScope.isBusy = false; + if (saveField.isSucceed) { + ctrl.additionalData.columns.push(saveField.data); + + //reset column option + ctrl.column.title = ""; + ctrl.column.name = ""; + ctrl.column.dataType = "Text"; + $scope.$apply(); + } + } } else { - ctrl.loadData(); + $rootScope.showErrors(["Please add column Name"]); } }; - ctrl.loadData = async function (pageIndex) { + + ctrl.generateName = function (col) { + col.name = $rootScope.generateKeyword(col.title, "_"); + }; + ctrl.showReferences = function (col) { + ctrl.colRef = col; + $("#modal-navs").modal("show"); + }; + ctrl.referenceCallback = function (selected) { + if (selected && selected.length) { + ctrl.colRef.reference = selected; + ctrl.colRef.referenceId = selected[0].id; + } + $("#modal-navs").modal("hide"); + }; + ctrl.updateOrders = function (index) { + if (index > ctrl.dragStartIndex) { + ctrl.columns.splice(ctrl.dragStartIndex, 1); + } else { + ctrl.columns.splice(ctrl.dragStartIndex + 1, 1); + } + angular.forEach(ctrl.columns, function (e, i) { + e.priority = i; + }); + }; + + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + }; + + ctrl.removeAttribute = function (val, index) { + $rootScope.showConfirm( + ctrl, + "removeAttributeConfirmed", + [val, index], + null, + "Remove Field", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + ctrl.removeAttributeConfirmed = async function (val, index) { + if (val.id) { + $rootScope.isBusy = true; + var result = await columnService.delete([val.id]); + if (result.isSucceed) { + ctrl.additionalData.columns.splice(index, 1); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(result.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + ctrl.additionalData.columns.splice(index, 1); + } + }; + }, + ], +}); + +modules.component("mixDatabaseDataFilter", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-data-filter/view.html", + bindings: { + query: "=", + mixDatabaseName: "=?", + mixDatabaseId: "=?", + selectedList: "=", + initData: "=?", + columns: "=?", + selected: "=", + callback: "&?", + save: "&?", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, ngAppSettings, dataService) { + var ctrl = this; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.types = ["Page", "Post"]; + ctrl.type = "Page"; + ctrl.navs = []; + ctrl.data = { items: [] }; + ctrl.goToPath = $rootScope.goToPath; + ctrl.$onInit = function () { + if (ctrl.initData) { + ctrl.data = ctrl.initData; + } else { + ctrl.loadData(); + } + }; + ctrl.loadData = async function (pageIndex) { ctrl.isBusy = true; // ctrl.request.query = ctrl.query + ctrl.srcId; @@ -9895,116 +10006,6 @@ modules.component("mixDatabaseDataFilter", { ], }); -modules.component("mixDatabaseColumn", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-column/view.html", - bindings: { - column: "=", - }, - controller: [ - "$rootScope", - "$scope", - "RestMixDatabaseColumnPortalService", - function ($rootScope, $scope, columnService) { - var ctrl = this; - ctrl.value = {}; - ctrl.column = { - dataType: "Text", - mixDatabaseName: "sys_additional_column", - mixDatabaseId: 6, - }; - ctrl.selectedCol = null; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () {}; - ctrl.addAttr = async function () { - if (ctrl.column.name) { - var current = $rootScope.findObjectByKey( - ctrl.additionalData.columns, - "name", - ctrl.column.name - ); - if (current) { - $rootScope.showErrors(["Field " + ctrl.column.name + " existed!"]); - } else { - ctrl.column.priority = ctrl.additionalData.columns.length + 1; - $rootScope.isBusy = true; - var saveField = await columnService.create(ctrl.column); - $rootScope.isBusy = false; - if (saveField.isSucceed) { - ctrl.additionalData.columns.push(saveField.data); - - //reset column option - ctrl.column.title = ""; - ctrl.column.name = ""; - ctrl.column.dataType = "Text"; - $scope.$apply(); - } - } - } else { - $rootScope.showErrors(["Please add column Name"]); - } - }; - - ctrl.generateName = function (col) { - col.name = $rootScope.generateKeyword(col.title, "_"); - }; - ctrl.showReferences = function (col) { - ctrl.colRef = col; - $("#modal-navs").modal("show"); - }; - ctrl.referenceCallback = function (selected) { - if (selected && selected.length) { - ctrl.colRef.reference = selected; - ctrl.colRef.referenceId = selected[0].id; - } - $("#modal-navs").modal("hide"); - }; - ctrl.updateOrders = function (index) { - if (index > ctrl.dragStartIndex) { - ctrl.columns.splice(ctrl.dragStartIndex, 1); - } else { - ctrl.columns.splice(ctrl.dragStartIndex + 1, 1); - } - angular.forEach(ctrl.columns, function (e, i) { - e.priority = i; - }); - }; - - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - }; - - ctrl.removeAttribute = function (val, index) { - $rootScope.showConfirm( - ctrl, - "removeAttributeConfirmed", - [val, index], - null, - "Remove Field", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - ctrl.removeAttributeConfirmed = async function (val, index) { - if (val.id) { - $rootScope.isBusy = true; - var result = await columnService.delete([val.id]); - if (result.isSucceed) { - ctrl.additionalData.columns.splice(index, 1); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(result.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - ctrl.additionalData.columns.splice(index, 1); - } - }; - }, - ], -}); - modules.component("mixDatabaseDataValueEditor", { templateUrl: "/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html", @@ -10906,128 +10907,39 @@ modules.component("mixDatabaseNavValues", { ], }); -modules.component("mixFileUpload", { - templateUrl: "/mix-app/views/app-portal/components/mix-file-upload/view.html", +modules.component("mixDatabaseNavs", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-navs/view.html", bindings: { - folder: "=?", - accept: "=?", - onFail: "&?", - onSuccess: "&?", + parentId: "=", + parentType: "=", + mixDatabaseNavs: "=?", + onUpdate: "&?", + onDelete: "&?", }, controller: [ "$rootScope", "$scope", "ngAppSettings", - "FileServices", - function ($rootScope, $scope, ngAppSettings, fileService) { + "RestRelatedMixDatabasePortalService", + "RestMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, navService, setService) { var ctrl = this; - ctrl.mediaFile = {}; - ctrl.isAdmin = $rootScope.isAdmin; - ctrl.mediaNavs = []; + ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; + ctrl.selected = {}; + ctrl.defaultData = null; + ctrl.navRequest = angular.copy(ngAppSettings.request); + ctrl.setRequest = angular.copy(ngAppSettings.request); + + ctrl.localizeSettings = $rootScope.globalSettings; ctrl.$onInit = function () { - ctrl.id = Math.floor(Math.random() * 100); - }; - ctrl.selectFile = function (files) { - if (files !== undefined && files !== null && files.length > 0) { - const file = files[0]; - ctrl.file = file; - ctrl.mediaFile.folder = ctrl.folder ? ctrl.folder : "Media"; - ctrl.mediaFile.title = ctrl.title ? ctrl.title : ""; - ctrl.mediaFile.description = ctrl.description ? ctrl.description : ""; - ctrl.mediaFile.file = file; - if (ctrl.auto == "true") { - ctrl.uploadFile(file); - } else { - ctrl.getBase64(file); - } - } - }; - - ctrl.getBase64 = function (file) { - if (file !== null) { - $rootScope.isBusy = true; - var reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = function () { - if (ctrl.mediaFile) { - ctrl.mediaFile.fileName = file.name.substring( - 0, - file.name.lastIndexOf(".") - ); - ctrl.mediaFile.extension = file.name.substring( - file.name.lastIndexOf(".") - ); - ctrl.mediaFile.fileStream = reader.result; - } - $rootScope.isBusy = false; - $scope.$apply(); - }; - reader.onerror = function (error) { - $rootScope.isBusy = false; - $rootScope.showErrors([error]); - }; - } else { - return null; - } - }; - - ctrl.uploadFile = async function () { - if (ctrl.file) { - $rootScope.isBusy = true; - var response = await fileService.uploadFile(ctrl.file, ctrl.folder); - if (response) { - if (ctrl.onSuccess) { - ctrl.onSuccess(); - } - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(['Cannot upload file']); - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - $rootScope.showErrors(["Please choose file"]); - } - }; - }, - ], -}); - -modules.component("mixDatabaseNavs", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-navs/view.html", - bindings: { - parentId: "=", - parentType: "=", - mixDatabaseNavs: "=?", - onUpdate: "&?", - onDelete: "&?", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RestRelatedMixDatabasePortalService", - "RestMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, navService, setService) { - var ctrl = this; - ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; - ctrl.selected = {}; - ctrl.defaultData = null; - ctrl.navRequest = angular.copy(ngAppSettings.request); - ctrl.setRequest = angular.copy(ngAppSettings.request); - - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - // ctrl.setRequest.type = ctrl.parentType; - navService.getDefault().then((resp) => { - resp.parentId = ctrl.parentId; - resp.parentType = ctrl.parentType; - ctrl.defaultData = resp; - ctrl.loadData(); - }); + // ctrl.setRequest.type = ctrl.parentType; + navService.getDefault().then((resp) => { + resp.parentId = ctrl.parentId; + resp.parentType = ctrl.parentType; + ctrl.defaultData = resp; + ctrl.loadData(); + }); }; ctrl.goToPath = $rootScope.goToPath; ctrl.selectPane = function (pane) {}; @@ -11166,6 +11078,130 @@ modules.component("mixDatabaseNavs", { ], }); +modules.component("mixFileUpload", { + templateUrl: "/mix-app/views/app-portal/components/mix-file-upload/view.html", + bindings: { + folder: "=?", + accept: "=?", + onFail: "&?", + onSuccess: "&?", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "FileServices", + function ($rootScope, $scope, ngAppSettings, fileService) { + var ctrl = this; + ctrl.mediaFile = {}; + ctrl.isAdmin = $rootScope.isAdmin; + ctrl.mediaNavs = []; + ctrl.$onInit = function () { + ctrl.id = Math.floor(Math.random() * 100); + }; + ctrl.selectFile = function (files) { + if (files !== undefined && files !== null && files.length > 0) { + const file = files[0]; + ctrl.file = file; + ctrl.mediaFile.folder = ctrl.folder ? ctrl.folder : "Media"; + ctrl.mediaFile.title = ctrl.title ? ctrl.title : ""; + ctrl.mediaFile.description = ctrl.description ? ctrl.description : ""; + ctrl.mediaFile.file = file; + if (ctrl.auto == "true") { + ctrl.uploadFile(file); + } else { + ctrl.getBase64(file); + } + } + }; + + ctrl.getBase64 = function (file) { + if (file !== null) { + $rootScope.isBusy = true; + var reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = function () { + if (ctrl.mediaFile) { + ctrl.mediaFile.fileName = file.name.substring( + 0, + file.name.lastIndexOf(".") + ); + ctrl.mediaFile.extension = file.name.substring( + file.name.lastIndexOf(".") + ); + ctrl.mediaFile.fileStream = reader.result; + } + $rootScope.isBusy = false; + $scope.$apply(); + }; + reader.onerror = function (error) { + $rootScope.isBusy = false; + $rootScope.showErrors([error]); + }; + } else { + return null; + } + }; + + ctrl.uploadFile = async function () { + if (ctrl.file) { + $rootScope.isBusy = true; + var response = await fileService.uploadFile(ctrl.file, ctrl.folder); + if (response) { + if (ctrl.onSuccess) { + ctrl.onSuccess(); + } + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(['Cannot upload file']); + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + $rootScope.showErrors(["Please choose file"]); + } + }; + }, + ], +}); + +modules.component("mixSelectIcons", { + templateUrl: + "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", + controller: [ + "$rootScope", + "$scope", + "$location", + "$element", + function ($rootScope, $scope, $location, $element) { + var ctrl = this; + ctrl.limitTo = 20; + ctrl.container = $element[0].querySelector(".list-icon"); + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + ctrl.showMore = () => { + if ( + ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && + ctrl.limitTo < ctrl.options.length + ) { + ctrl.limitTo *= 2; + } + }; + ctrl.select = function (ico) { + ctrl.data = ico.class; + }; + }, + ], + bindings: { + data: "=", + prefix: "=", + options: "=", + }, +}); + "use strict"; app.controller("MixNavigationController", [ "$scope", @@ -11287,41 +11323,6 @@ app.controller("MixNavigationController", [ }, ]); -modules.component("mixSelectIcons", { - templateUrl: - "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", - controller: [ - "$rootScope", - "$scope", - "$location", - "$element", - function ($rootScope, $scope, $location, $element) { - var ctrl = this; - ctrl.limitTo = 20; - ctrl.container = $element[0].querySelector(".list-icon"); - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - ctrl.showMore = () => { - if ( - ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && - ctrl.limitTo < ctrl.options.length - ) { - ctrl.limitTo *= 2; - } - }; - ctrl.select = function (ico) { - ctrl.data = ico.class; - }; - }, - ], - bindings: { - data: "=", - prefix: "=", - options: "=", - }, -}); - modules.component("mixValueEditor", { templateUrl: "/mix-app/views/app-portal/components/mix-value-editor/view.html", @@ -11767,14 +11768,38 @@ modules.component("modalContentFilter", { ], }); -modules.component("modalHelper", { - templateUrl: - "/mix-app/views/app-portal/components/modal-helper/modal-helper.html", - bindings: { - url: "=?", - title: "=?", - }, - controller: [ +app.component("modalCroppie", { + templateUrl: "/mix-app/views/app-portal/components/modal-croppie/view.html", + bidings: { + resolve: "<", + close: "&", + dismiss: "&", + }, + controller: function () { + var $ctrl = this; + $ctrl.fileUrl = "test"; + $ctrl.$onInit = function () { + $ctrl.file = $ctrl.resolve.file; + }; + + $ctrl.ok = function () { + $ctrl.close({ $value: $ctrl.fileUrl }); + }; + + $ctrl.cancel = function () { + $ctrl.dismiss({ $value: "cancel" }); + }; + }, +}); + +modules.component("modalHelper", { + templateUrl: + "/mix-app/views/app-portal/components/modal-helper/modal-helper.html", + bindings: { + url: "=?", + title: "=?", + }, + controller: [ "$rootScope", "$scope", "localStorageService", @@ -11902,228 +11927,6 @@ modules.component("modalHelper", { ], }); -app.component("modalCroppie", { - templateUrl: "/mix-app/views/app-portal/components/modal-croppie/view.html", - bidings: { - resolve: "<", - close: "&", - dismiss: "&", - }, - controller: function () { - var $ctrl = this; - $ctrl.fileUrl = "test"; - $ctrl.$onInit = function () { - $ctrl.file = $ctrl.resolve.file; - }; - - $ctrl.ok = function () { - $ctrl.close({ $value: $ctrl.fileUrl }); - }; - - $ctrl.cancel = function () { - $ctrl.dismiss({ $value: "cancel" }); - }; - }, -}); - -modules.component("modalNavDatas", { - templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", - bindings: { - mixDatabaseId: "=?", - mixDatabaseName: "=?", - parentId: "=?", - parentType: "=?", - type: "=?", - columnDisplay: "=?", - selectedList: "=?", - selectCallback: "&", - save: "&", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestRelatedMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, service, navService) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.request.key = "readData"; - ctrl.navs = []; - - ctrl.queries = {}; - ctrl.data = { items: [] }; - ctrl.$onInit = function () { - if (!ctrl.selectedList) { - ctrl.selectedList = []; - } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - }; - ctrl.loadData = async function (pageIndex) { - ctrl.request.query = ""; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var d = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = d.toISOString(); - } - if (ctrl.request.toDate !== null) { - var d = new Date(ctrl.request.toDate); - ctrl.request.toDate = d.toISOString(); - } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - Object.keys(ctrl.queries).forEach((e) => { - if (ctrl.queries[e]) { - ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; - } - }); - var response = await service.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - ctrl.navs = []; - angular.forEach(response.data.items, function (e) { - e.disabled = - $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; - // var item = { - // priority: e.priority, - // description: e.data.title, - // postId: e.id, - // image: e.thumbnailUrl, - // specificulture: e.specificulture, - // status: 'Published', - // isActived: false - // }; - // item[ctrl.srcField] = ctrl.srcId; - // ctrl.navs.push(item); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.select = function (value, isSelected) { - if (isSelected) { - if (ctrl.parentId) { - var nav = { - mixDatabaseName: ctrl.mixDatabaseName, - parentId: ctrl.parentId, - parentType: ctrl.parentType, - id: value, - }; - navService.save(nav).then((resp) => { - if (resp.isSucceed) { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - } - } else { - if (ctrl.parentId) { - navService - .delete([ctrl.parentId, ctrl.parentType, data.id]) - .then((resp) => { - if (resp.isSucceed) { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); - } - } - if (ctrl.selectCallback) { - ctrl.selectCallback({ data: data }); - } - }; - ctrl.createData = function () { - var data = { - title: ctrl.newTitle, - slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), - type: ctrl.type, - }; - service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { - if (resp.isSucceed) { - ctrl.data.items.push(resp.data); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - }; - }, - ], -}); - modules.component("modalNavMetas", { templateUrl: "/mix-app/views/app-portal/components/modal-nav-metas/view.html", bindings: { @@ -12392,11 +12195,10 @@ modules.component("modalNavMetas", { ], }); -modules.component("modalNavPosts", { - templateUrl: - "/mix-app/views/app-portal/components/modal-nav-posts/modal-nav-posts.html", +modules.component("modalNavPages", { + templateUrl: "/mix-app/views/app-portal/components/modal-nav-pages/view.html", bindings: { - srcColumn: "=", + srcField: "=", srcId: "=", query: "=", selected: "=", @@ -12405,16 +12207,15 @@ modules.component("modalNavPosts", { controller: [ "$rootScope", "$scope", - "$routeParams", "ngAppSettings", - "PostRestService", - function ($rootScope, $scope, $routeParams, ngAppSettings, postService) { + "PageRestService", + function ($rootScope, $scope, ngAppSettings, pageService) { var ctrl = this; ctrl.request = angular.copy(ngAppSettings.request); ctrl.navs = []; ctrl.data = { items: [] }; - ctrl.loadPosts = async function (pageIndex) { - // ctrl.request.query = ctrl.query + ctrl.srcId; + ctrl.loadData = async function (pageIndex) { + ctrl.request.query = ctrl.query + ctrl.srcId; if (pageIndex !== undefined) { ctrl.request.pageIndex = pageIndex; } @@ -12426,12 +12227,7 @@ modules.component("modalNavPosts", { var d = new Date(ctrl.request.toDate); ctrl.request.toDate = d.toISOString(); } - if ($routeParams.type) { - ctrl.request.postType = $routeParams.type; - } else { - ctrl.request.postType = ""; - } - var response = await postService.getList(ctrl.request); + var response = await pageService.getList(ctrl.request); if (response.isSucceed) { ctrl.data = response.data; ctrl.navs = []; @@ -12439,14 +12235,13 @@ modules.component("modalNavPosts", { var item = { priority: e.priority, description: e.title, - postId: e.id, + pageId: e.id, image: e.thumbnailUrl, specificulture: e.specificulture, - post: e, status: "Published", isActived: false, }; - item[ctrl.srcColumn] = ctrl.srcId; + item[ctrl.srcField] = ctrl.srcId; ctrl.navs.push(item); }); $rootScope.isBusy = false; @@ -12465,7 +12260,7 @@ modules.component("modalNavPosts", { ); setTimeout(() => { ctrl.save().then(() => { - ctrl.loadPosts(); + ctrl.loadPages(); }); }, 500); }; @@ -12473,10 +12268,218 @@ modules.component("modalNavPosts", { ], }); -modules.component("modalNavPages", { - templateUrl: "/mix-app/views/app-portal/components/modal-nav-pages/view.html", +modules.component("modalNavDatas", { + templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", bindings: { - srcField: "=", + mixDatabaseId: "=?", + mixDatabaseName: "=?", + parentId: "=?", + parentType: "=?", + type: "=?", + columnDisplay: "=?", + selectedList: "=?", + selectCallback: "&", + save: "&", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestRelatedMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, service, navService) { + var ctrl = this; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.request.key = "readData"; + ctrl.navs = []; + + ctrl.queries = {}; + ctrl.data = { items: [] }; + ctrl.$onInit = function () { + if (!ctrl.selectedList) { + ctrl.selectedList = []; + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } + }; + ctrl.loadData = async function (pageIndex) { + ctrl.request.query = ""; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var d = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = d.toISOString(); + } + if (ctrl.request.toDate !== null) { + var d = new Date(ctrl.request.toDate); + ctrl.request.toDate = d.toISOString(); + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } + Object.keys(ctrl.queries).forEach((e) => { + if (ctrl.queries[e]) { + ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; + } + }); + var response = await service.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + ctrl.navs = []; + angular.forEach(response.data.items, function (e) { + e.disabled = + $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; + // var item = { + // priority: e.priority, + // description: e.data.title, + // postId: e.id, + // image: e.thumbnailUrl, + // specificulture: e.specificulture, + // status: 'Published', + // isActived: false + // }; + // item[ctrl.srcField] = ctrl.srcId; + // ctrl.navs.push(item); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + ctrl.select = function (value, isSelected) { + if (isSelected) { + if (ctrl.parentId) { + var nav = { + mixDatabaseName: ctrl.mixDatabaseName, + parentId: ctrl.parentId, + parentType: ctrl.parentType, + id: value, + }; + navService.save(nav).then((resp) => { + if (resp.isSucceed) { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + } + } else { + if (ctrl.parentId) { + navService + .delete([ctrl.parentId, ctrl.parentType, data.id]) + .then((resp) => { + if (resp.isSucceed) { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); + } + } + if (ctrl.selectCallback) { + ctrl.selectCallback({ data: data }); + } + }; + ctrl.createData = function () { + var data = { + title: ctrl.newTitle, + slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), + type: ctrl.type, + }; + service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { + if (resp.isSucceed) { + ctrl.data.items.push(resp.data); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + }; + }, + ], +}); + +modules.component("modalPermission", { + templateUrl: + "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", + controller: "PermissionController", + bindings: { + message: "=", + }, +}); + +modules.component("modalNavPosts", { + templateUrl: + "/mix-app/views/app-portal/components/modal-nav-posts/modal-nav-posts.html", + bindings: { + srcColumn: "=", srcId: "=", query: "=", selected: "=", @@ -12485,15 +12488,16 @@ modules.component("modalNavPages", { controller: [ "$rootScope", "$scope", + "$routeParams", "ngAppSettings", - "PageRestService", - function ($rootScope, $scope, ngAppSettings, pageService) { + "PostRestService", + function ($rootScope, $scope, $routeParams, ngAppSettings, postService) { var ctrl = this; ctrl.request = angular.copy(ngAppSettings.request); ctrl.navs = []; ctrl.data = { items: [] }; - ctrl.loadData = async function (pageIndex) { - ctrl.request.query = ctrl.query + ctrl.srcId; + ctrl.loadPosts = async function (pageIndex) { + // ctrl.request.query = ctrl.query + ctrl.srcId; if (pageIndex !== undefined) { ctrl.request.pageIndex = pageIndex; } @@ -12505,7 +12509,12 @@ modules.component("modalNavPages", { var d = new Date(ctrl.request.toDate); ctrl.request.toDate = d.toISOString(); } - var response = await pageService.getList(ctrl.request); + if ($routeParams.type) { + ctrl.request.postType = $routeParams.type; + } else { + ctrl.request.postType = ""; + } + var response = await postService.getList(ctrl.request); if (response.isSucceed) { ctrl.data = response.data; ctrl.navs = []; @@ -12513,13 +12522,14 @@ modules.component("modalNavPages", { var item = { priority: e.priority, description: e.title, - pageId: e.id, + postId: e.id, image: e.thumbnailUrl, specificulture: e.specificulture, + post: e, status: "Published", isActived: false, }; - item[ctrl.srcField] = ctrl.srcId; + item[ctrl.srcColumn] = ctrl.srcId; ctrl.navs.push(item); }); $rootScope.isBusy = false; @@ -12538,7 +12548,7 @@ modules.component("modalNavPages", { ); setTimeout(() => { ctrl.save().then(() => { - ctrl.loadPages(); + ctrl.loadPosts(); }); }, 500); }; @@ -12681,15 +12691,6 @@ modules.component("modalNavs", { ], }); -modules.component("modalPermission", { - templateUrl: - "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", - controller: "PermissionController", - bindings: { - message: "=", - }, -}); - modules.component("modalTemplate", { templateUrl: "/mix-app/views/app-portal/components/modal-template/view.html", controller: [ diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/theme/export.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/theme/export.html index 2a1aa7a24..8ce935cb7 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/theme/export.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/theme/export.html @@ -1 +1 @@ -

    Export theme and data

    Use the filter side bar on the right to filter and search your themes.

    \ No newline at end of file +

    Export theme and data

    Use the filter side bar on the right to filter and search your themes.

    Include Configurations
    \ No newline at end of file From 6f00f8915e78dc3861647345c9897931d15bd76c Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Fri, 3 Sep 2021 12:32:34 +0700 Subject: [PATCH 16/83] fix additional column options --- .../BaseAuthorizedRestApiController.cs | 19 +- .../MixDatabaseDataValues/UpdateViewModel.cs | 2 +- .../MixPortalPages/UpdateViewModel.cs | 2 +- .../wwwroot/mix-app/js/app-portal.min.js | 2831 +++++++++-------- .../wwwroot/mix-app/js/app-shared.min.js | 1030 +++--- .../components/additional-column/view.html | 2 +- .../components/media-file-upload/view.html | 2 +- .../components/mix-column-editor/view.html | 2 +- 8 files changed, 1980 insertions(+), 1910 deletions(-) diff --git a/src/Mix.Cms.Lib/Controllers/BaseAuthorizedRestApiController.cs b/src/Mix.Cms.Lib/Controllers/BaseAuthorizedRestApiController.cs index 45fe29bd3..a64dbb594 100644 --- a/src/Mix.Cms.Lib/Controllers/BaseAuthorizedRestApiController.cs +++ b/src/Mix.Cms.Lib/Controllers/BaseAuthorizedRestApiController.cs @@ -244,6 +244,21 @@ public virtual async Task> Delete(string id) return GetResponse(result); } + // POST api/update-infos + [HttpPost] + [Route("save-many")] + public async Task>> UpdateInfos([FromBody] List models) + { + if (models != null) + { + return await SaveManyAsync(models, false); + } + else + { + return new RepositoryResponse>(); + } + } + [HttpPost] [Route("list-action")] public async Task> ListActionAsync([FromBody] ListAction data) @@ -355,7 +370,7 @@ private async Task>> PublishListAsync(Expressio { ReflectionHelper.SetPropertyValue(item, new JProperty("Status", MixContentStatus.Published)); } - return await SaveListAsync(data.Data.Items, false); + return await SaveManyAsync(data.Data.Items, false); } protected virtual async Task> GetSingleAsync(string id) @@ -562,7 +577,7 @@ protected async Task> SavePropertiesAsync(JObject obj return new RepositoryResponse(); } - protected async Task>> SaveListAsync(List lstVm, bool isSaveSubModel) + protected async Task>> SaveManyAsync(List lstVm, bool isSaveSubModel) { var result = await DefaultRepository.Instance.SaveListModelAsync(lstVm, isSaveSubModel); diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataValues/UpdateViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataValues/UpdateViewModel.cs index df8ad6860..600291d1a 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataValues/UpdateViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDataValues/UpdateViewModel.cs @@ -189,7 +189,7 @@ public override void ExpandView(MixCmsContext _context = null, IDbContextTransac if (MixDatabaseColumnId > 0) { - Column ??= MixDatabaseColumns.UpdateViewModel.Repository.GetSingleModel( + Column = MixDatabaseColumns.UpdateViewModel.Repository.GetSingleModel( f => f.Id == MixDatabaseColumnId , _context, _transaction).Data; if (Column != null && DataType == MixDataType.Reference) diff --git a/src/Mix.Cms.Lib/ViewModels/MixPortalPages/UpdateViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixPortalPages/UpdateViewModel.cs index d77d48372..711d07a9a 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixPortalPages/UpdateViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixPortalPages/UpdateViewModel.cs @@ -200,7 +200,7 @@ public override async Task> SaveSubModelsAsync(MixPorta public override async Task> RemoveRelatedModelsAsync(UpdateViewModel view, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { - var removeNavs = await MixPortalPagePortalPages.UpdateViewModel.Repository.RemoveListModelAsync(false, p => p.PageId == Id || p.ParentId == Id); + var removeNavs = await MixPortalPagePortalPages.UpdateViewModel.Repository.RemoveListModelAsync(false, p => p.PageId == Id || p.ParentId == Id, _context, _transaction); var result = new RepositoryResponse() { IsSucceed = true, diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js index f326f8a75..4cb8e2e19 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js @@ -1,4 +1,4 @@ -/* Wed Sep 01 2021 20:51:17 GMT+0700 (Indochina Time) */"use strict"; +/* Fri Sep 03 2021 12:25:04 GMT+0700 (Indochina Time) */"use strict"; var app = angular.module("MixPortal", [ "angularCroppie", "ui.bootstrap", @@ -446,207 +446,6 @@ app.factory("ConfigurationService", [ }, ]); -"use strict"; -app.controller("CustomerController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$timeout", - "$location", - "CustomerServices", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $timeout, - $location, - customerServices - ) { - $scope.request = angular.copy(ngAppSettings.request); - $scope.request.contentStatuses = ["Active"]; - $scope.request.status = "0"; - $scope.activedCustomer = null; - $scope.relatedCustomers = []; - $rootScope.isBusy = false; - $scope.data = { - pageIndex: 0, - pageSize: 1, - totalItems: 0, - }; - $scope.errors = []; - - $scope.range = function (max) { - var input = []; - for (var i = 1; i <= max; i += 1) input.push(i); - return input; - }; - - $scope.loadCustomer = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - var response = await customerServices.getCustomer(id, "portal"); - if (response.isSucceed) { - $scope.activedCustomer = response.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.loadCustomers = async function (pageIndex) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); - } - if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); - } - var resp = await customerServices.getCustomers($scope.request); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - //$("html, body").animate({ "scrollTop": "0px" }, 500); - $.each($scope.data.items, function (i, customer) { - $.each($scope.activedCustomers, function (i, e) { - if (e.customerId === customer.id) { - customer.isHidden = true; - } - }); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - - $scope.removeCustomer = function (id) { - $rootScope.showConfirm( - $scope, - "removeCustomerConfirmed", - [id], - null, - "Remove Customer", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeCustomerConfirmed = async function (id) { - var result = await customerServices.removeCustomer(id); - if (result.isSucceed) { - $rootScope.showMessage("success", "success"); - $scope.loadCustomers(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.saveCustomer = async function (customer) { - customer.content = $(".editor-content").val(); - var resp = await customerServices.saveCustomer(customer); - if (resp && resp.isSucceed) { - $scope.activedCustomer = resp.data; - $rootScope.showMessage("Update successfully!", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - //$location.path('/portal/customer/details/' + resp.data.id); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("CustomerServices", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var customersServiceFactory = {}; - - var settings = $rootScope.globalSettings; - - var _getCustomer = async function (id, type) { - var apiUrl = "/queen-beauty/customer/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + id; - } - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _initCustomer = async function (type) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "GET", - url: apiUrl + "init/" + type, - }; - return await apiService.getApiResult(req); - }; - - var _getCustomers = async function (request) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _removeCustomer = async function (id) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; - - var _saveCustomer = async function (customer) { - var apiUrl = "/queen-beauty/customer/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(customer), - }; - return await apiService.getApiResult(req); - }; - - customersServiceFactory.getCustomer = _getCustomer; - customersServiceFactory.initCustomer = _initCustomer; - customersServiceFactory.getCustomers = _getCustomers; - customersServiceFactory.removeCustomer = _removeCustomer; - customersServiceFactory.saveCustomer = _saveCustomer; - return customersServiceFactory; - }, -]); - "use strict"; app.controller("CultureController", [ "$scope", @@ -1313,15 +1112,14 @@ app.factory("DashboardServices", [ ]); "use strict"; -app.controller("FileController", [ +app.controller("CustomerController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$timeout", "$location", - "AuthService", - "FileServices", + "CustomerServices", function ( $scope, $rootScope, @@ -1329,23 +1127,13 @@ app.controller("FileController", [ $routeParams, $timeout, $location, - authService, - fileServices + customerServices ) { - $scope.request = { - pageSize: "10", - pageIndex: 0, - status: "Published", - orderBy: "CreatedDateTime", - direction: "Desc", - fromDate: null, - toDate: null, - keyword: "", - key: "", - }; - - $scope.activedFile = null; - $scope.relatedFiles = []; + $scope.request = angular.copy(ngAppSettings.request); + $scope.request.contentStatuses = ["Active"]; + $scope.request.status = "0"; + $scope.activedCustomer = null; + $scope.relatedCustomers = []; $rootScope.isBusy = false; $scope.data = { pageIndex: 0, @@ -1359,25 +1147,14 @@ app.controller("FileController", [ for (var i = 1; i <= max; i += 1) input.push(i); return input; }; - $scope.loadPage = async function (folder) { - if (folder) { - $scope.request.key += $scope.request.key !== "" ? "/" : ""; - $scope.request.key += folder; - } - $location.url( - "/portal/file/list?folder=" + encodeURIComponent($scope.request.key) - ); - }; - $scope.loadFile = async function () { - $rootScope.isBusy = true; - $scope.listUrl = "/portal/file/list?folder/" + $routeParams.folder; + + $scope.loadCustomer = async function () { $rootScope.isBusy = true; - var response = await fileServices.getFile( - $routeParams.folder, - $routeParams.filename - ); + var id = $routeParams.id; + var response = await customerServices.getCustomer(id, "portal"); if (response.isSucceed) { - $scope.activedFile = response.data; + $scope.activedCustomer = response.data; + $rootScope.initEditor(); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -1386,32 +1163,26 @@ app.controller("FileController", [ $scope.$apply(); } }; - $scope.loadFiles = async function (folder) { - if (folder) { - $scope.request.key += - $scope.request.key !== "" ? "wwwroot/" : "wwwroot"; - $scope.request.key += folder; - } else { - $scope.request.key = $routeParams.folder - ? $routeParams.folder - : "wwwroot"; + $scope.loadCustomers = async function (pageIndex) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; } - if ($routeParams.folder) { - $scope.backUrl = - "/portal/file/list?folder=" + - $routeParams.folder.substring( - 0, - $routeParams.folder.lastIndexOf("/") - ); + if ($scope.request.fromDate !== null) { + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); } - $rootScope.isBusy = true; - var resp = await fileServices.getFiles($scope.request); + if ($scope.request.toDate !== null) { + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); + } + var resp = await customerServices.getCustomers($scope.request); if (resp && resp.isSucceed) { $scope.data = resp.data; - $.each($scope.data.items, function (i, file) { - $.each($scope.activedFiles, function (i, e) { - if (e.fileId === file.id) { - file.isHidden = true; + //$("html, body").animate({ "scrollTop": "0px" }, 500); + $.each($scope.data.items, function (i, customer) { + $.each($scope.activedCustomers, function (i, e) { + if (e.customerId === customer.id) { + customer.isHidden = true; } }); }); @@ -1421,66 +1192,71 @@ app.controller("FileController", [ if (resp) { $rootScope.showErrors(resp.errors); } - $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.removeFile = async function (id) { - if (confirm("Are you sure!")) { - $rootScope.isBusy = true; - var resp = await fileServices.removeFile(id); - if (resp && resp.isSucceed) { - $scope.loadFiles(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } + $scope.removeCustomer = function (id) { + $rootScope.showConfirm( + $scope, + "removeCustomerConfirmed", + [id], + null, + "Remove Customer", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeCustomerConfirmed = async function (id) { + var result = await customerServices.removeCustomer(id); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + $scope.loadCustomers(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); } }; - $scope.saveFile = async function (file) { - $rootScope.isBusy = true; - var resp = await fileServices.saveFile(file); + $scope.saveCustomer = async function (customer) { + customer.content = $(".editor-content").val(); + var resp = await customerServices.saveCustomer(customer); if (resp && resp.isSucceed) { - $scope.activedFile = resp.data; + $scope.activedCustomer = resp.data; $rootScope.showMessage("Update successfully!", "success"); $rootScope.isBusy = false; $scope.$apply(); + //$location.path('/portal/customer/details/' + resp.data.id); } else { if (resp) { $rootScope.showErrors(resp.errors); } - $rootScope.isBusy = false; $scope.$apply(); } }; - $scope.updateTemplateContent = function (content) { - $scope.activedFile.content = content; - }; }, ]); "use strict"; -app.factory("FileServices", [ +app.factory("CustomerServices", [ "$http", "$rootScope", "ApiService", "CommonService", - "BaseService", - function ($http, $rootScope, apiService, commonService, baseService) { + function ($http, $rootScope, apiService, commonService) { //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - var filesServiceFactory = angular.copy(baseService); - filesServiceFactory.init("file", true); + var customersServiceFactory = {}; + var settings = $rootScope.globalSettings; - var _getFile = async function (folder, filename) { - var apiUrl = "/file/"; - var url = apiUrl + "details?folder=" + folder + "&filename=" + filename; + var _getCustomer = async function (id, type) { + var apiUrl = "/queen-beauty/customer/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + id; + } var req = { method: "GET", url: url, @@ -1488,8 +1264,8 @@ app.factory("FileServices", [ return await apiService.getApiResult(req); }; - var _initFile = async function (type) { - var apiUrl = "/file/"; + var _initCustomer = async function (type) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "GET", url: apiUrl + "init/" + type, @@ -1497,8 +1273,8 @@ app.factory("FileServices", [ return await apiService.getApiResult(req); }; - var _getFiles = async function (request) { - var apiUrl = "/file/"; + var _getCustomers = async function (request) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "POST", url: apiUrl + "list", @@ -1508,39 +1284,31 @@ app.factory("FileServices", [ return await apiService.getApiResult(req); }; - var _removeFile = async function (fullPath) { - var apiUrl = "/file/"; + var _removeCustomer = async function (id) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "GET", - url: apiUrl + "delete/?fullPath=" + fullPath, + url: apiUrl + "delete/" + id, }; return await apiService.getApiResult(req); }; - var _saveFile = async function (file) { - var apiUrl = "/file/"; + var _saveCustomer = async function (customer) { + var apiUrl = "/queen-beauty/customer/"; var req = { method: "POST", url: apiUrl + "save", - data: JSON.stringify(file), + data: JSON.stringify(customer), }; return await apiService.getApiResult(req); }; - var _uploadFile = async function (file, folder) { - var apiUrl = "/file/upload-file"; - var fd = new FormData(); - fd.append("folder", folder); - fd.append("file", file); - return await filesServiceFactory.ajaxSubmitForm(fd, apiUrl); - }; - filesServiceFactory.getFile = _getFile; - filesServiceFactory.initFile = _initFile; - filesServiceFactory.getFiles = _getFiles; - filesServiceFactory.removeFile = _removeFile; - filesServiceFactory.saveFile = _saveFile; - filesServiceFactory.uploadFile = _uploadFile; - return filesServiceFactory; + customersServiceFactory.getCustomer = _getCustomer; + customersServiceFactory.initCustomer = _initCustomer; + customersServiceFactory.getCustomers = _getCustomers; + customersServiceFactory.removeCustomer = _removeCustomer; + customersServiceFactory.saveCustomer = _saveCustomer; + return customersServiceFactory; }, ]); @@ -1600,105 +1368,234 @@ app.factory("ImportFileServices", [ ]); "use strict"; -app.controller("LocalizeController", [ +app.controller("FileController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", + "$timeout", "$location", - "LocalizeService", - "ApiService", - "CommonService", + "AuthService", + "FileServices", function ( $scope, $rootScope, ngAppSettings, $routeParams, + $timeout, $location, - service, - commonService + authService, + fileServices ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); + $scope.request = { + pageSize: "10", + pageIndex: 0, + status: "Published", + orderBy: "CreatedDateTime", + direction: "Desc", + fromDate: null, + toDate: null, + keyword: "", + key: "", + }; - $scope.getSingleSuccessCallback = function () { - $scope.cates = ngAppSettings.enums.configuration_cates; - $scope.globalSettings = $rootScope.globalSettings; - $scope.request.category = $routeParams.category || ""; - if (!$scope.viewmodel.id) { - $scope.viewmodel.property.dataType = "Text"; + $scope.activedFile = null; + $scope.relatedFiles = []; + $rootScope.isBusy = false; + $scope.data = { + pageIndex: 0, + pageSize: 1, + totalItems: 0, + }; + $scope.errors = []; + + $scope.range = function (max) { + var input = []; + for (var i = 1; i <= max; i += 1) input.push(i); + return input; + }; + $scope.loadPage = async function (folder) { + if (folder) { + $scope.request.key += $scope.request.key !== "" ? "/" : ""; + $scope.request.key += folder; } - if (!$scope.viewmodel.category) { - $scope.viewmodel.category = "Site"; + $location.url( + "/portal/file/list?folder=" + encodeURIComponent($scope.request.key) + ); + }; + $scope.loadFile = async function () { + $rootScope.isBusy = true; + $scope.listUrl = "/portal/file/list?folder/" + $routeParams.folder; + $rootScope.isBusy = true; + var response = await fileServices.getFile( + $routeParams.folder, + $routeParams.filename + ); + if (response.isSucceed) { + $scope.activedFile = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); } }; - $scope.saveSuccessCallback = function () { - commonService.initAllSettings().then(function () { - // $location.url($scope.referrerUrl); + $scope.loadFiles = async function (folder) { + if (folder) { + $scope.request.key += + $scope.request.key !== "" ? "wwwroot/" : "wwwroot"; + $scope.request.key += folder; + } else { + $scope.request.key = $routeParams.folder + ? $routeParams.folder + : "wwwroot"; + } + if ($routeParams.folder) { + $scope.backUrl = + "/portal/file/list?folder=" + + $routeParams.folder.substring( + 0, + $routeParams.folder.lastIndexOf("/") + ); + } + $rootScope.isBusy = true; + var resp = await fileServices.getFiles($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + $.each($scope.data.items, function (i, file) { + $.each($scope.activedFiles, function (i, e) { + if (e.fileId === file.id) { + file.isHidden = true; + } + }); + }); $rootScope.isBusy = false; $scope.$apply(); - }); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } }; - $scope.removeCallback = function () { - commonService.initAllSettings().then(function () { - $location.url($scope.referrerUrl); - }); + + $scope.removeFile = async function (id) { + if (confirm("Are you sure!")) { + $rootScope.isBusy = true; + var resp = await fileServices.removeFile(id); + if (resp && resp.isSucceed) { + $scope.loadFiles(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } }; - $scope.generateName = function () { - $scope.viewmodel.keyword = $rootScope.generateKeyword( - $scope.viewmodel.keyword, - "_", - true - ); + $scope.saveFile = async function (file) { + $rootScope.isBusy = true; + var resp = await fileServices.saveFile(file); + if (resp && resp.isSucceed) { + $scope.activedFile = resp.data; + $rootScope.showMessage("Update successfully!", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateTemplateContent = function (content) { + $scope.activedFile.content = content; }; }, ]); "use strict"; -app.factory("LocalizeService", [ - "BaseRestService", +app.factory("FileServices", [ + "$http", + "$rootScope", "ApiService", "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("language"); + "BaseService", + function ($http, $rootScope, apiService, commonService, baseService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - var _uploadLanguage = async function (languageFile) { - //var container = $(this).parents('.model-language').first().find('.custom-file').first(); - if (languageFile.file !== undefined && languageFile.file !== null) { - // Create FormData object - var files = new FormData(); + var filesServiceFactory = angular.copy(baseService); + filesServiceFactory.init("file", true); + var settings = $rootScope.globalSettings; - // Looping over all files and add it to FormData object - files.append(languageFile.file.name, languageFile.file); + var _getFile = async function (folder, filename) { + var apiUrl = "/file/"; + var url = apiUrl + "details?folder=" + folder + "&filename=" + filename; + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; - // Adding one more key to FormData object - files.append("fileFolder", languageFile.folder); - files.append("title", languageFile.title); - files.append("description", languageFile.description); + var _initFile = async function (type) { + var apiUrl = "/file/"; + var req = { + method: "GET", + url: apiUrl + "init/" + type, + }; + return await apiService.getApiResult(req); + }; - var req = { - url: this.prefixUrl + "/upload", - type: "POST", - headers: {}, - contentType: false, // Not to set any content header - processData: false, // Not to process data - data: files, - }; + var _getFiles = async function (request) { + var apiUrl = "/file/"; + var req = { + method: "POST", + url: apiUrl + "list", + data: JSON.stringify(request), + }; - return await apiService.getApiResult(req); - } + return await apiService.getApiResult(req); }; - serviceFactory.uploadLanguage = _uploadLanguage; - return serviceFactory; + + var _removeFile = async function (fullPath) { + var apiUrl = "/file/"; + var req = { + method: "GET", + url: apiUrl + "delete/?fullPath=" + fullPath, + }; + return await apiService.getApiResult(req); + }; + + var _saveFile = async function (file) { + var apiUrl = "/file/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(file), + }; + return await apiService.getApiResult(req); + }; + var _uploadFile = async function (file, folder) { + var apiUrl = "/file/upload-file"; + var fd = new FormData(); + fd.append("folder", folder); + fd.append("file", file); + return await filesServiceFactory.ajaxSubmitForm(fd, apiUrl); + }; + + filesServiceFactory.getFile = _getFile; + filesServiceFactory.initFile = _initFile; + filesServiceFactory.getFiles = _getFiles; + filesServiceFactory.removeFile = _removeFile; + filesServiceFactory.saveFile = _saveFile; + filesServiceFactory.uploadFile = _uploadFile; + return filesServiceFactory; }, ]); @@ -1889,31 +1786,134 @@ app.factory("JsonDataService", [ return await apiService.getApiResult(req); }; - var _removeFile = async function (id) { - var apiUrl = "/file/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; + var _removeFile = async function (id) { + var apiUrl = "/file/"; + var req = { + method: "GET", + url: apiUrl + "delete/" + id, + }; + return await apiService.getApiResult(req); + }; + + var _saveFile = async function (file) { + var apiUrl = "/file/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(file), + }; + return await apiService.getApiResult(req); + }; + + filesServiceFactory.getFile = _getFile; + filesServiceFactory.initFile = _initFile; + filesServiceFactory.getFiles = _getFiles; + filesServiceFactory.removeFile = _removeFile; + filesServiceFactory.saveFile = _saveFile; + return filesServiceFactory; + }, +]); + +"use strict"; +app.controller("LocalizeController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "LocalizeService", + "ApiService", + "CommonService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service, + commonService + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + + $scope.getSingleSuccessCallback = function () { + $scope.cates = ngAppSettings.enums.configuration_cates; + $scope.globalSettings = $rootScope.globalSettings; + $scope.request.category = $routeParams.category || ""; + if (!$scope.viewmodel.id) { + $scope.viewmodel.property.dataType = "Text"; + } + if (!$scope.viewmodel.category) { + $scope.viewmodel.category = "Site"; + } + }; + $scope.saveSuccessCallback = function () { + commonService.initAllSettings().then(function () { + // $location.url($scope.referrerUrl); + $rootScope.isBusy = false; + $scope.$apply(); + }); + }; + $scope.removeCallback = function () { + commonService.initAllSettings().then(function () { + $location.url($scope.referrerUrl); + }); + }; + + $scope.generateName = function () { + $scope.viewmodel.keyword = $rootScope.generateKeyword( + $scope.viewmodel.keyword, + "_", + true + ); + }; + }, +]); + +"use strict"; +app.factory("LocalizeService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("language"); + + var _uploadLanguage = async function (languageFile) { + //var container = $(this).parents('.model-language').first().find('.custom-file').first(); + if (languageFile.file !== undefined && languageFile.file !== null) { + // Create FormData object + var files = new FormData(); + + // Looping over all files and add it to FormData object + files.append(languageFile.file.name, languageFile.file); + + // Adding one more key to FormData object + files.append("fileFolder", languageFile.folder); + files.append("title", languageFile.title); + files.append("description", languageFile.description); + + var req = { + url: this.prefixUrl + "/upload", + type: "POST", + headers: {}, + contentType: false, // Not to set any content header + processData: false, // Not to process data + data: files, + }; - var _saveFile = async function (file) { - var apiUrl = "/file/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(file), - }; - return await apiService.getApiResult(req); + return await apiService.getApiResult(req); + } }; - - filesServiceFactory.getFile = _getFile; - filesServiceFactory.initFile = _initFile; - filesServiceFactory.getFiles = _getFiles; - filesServiceFactory.removeFile = _removeFile; - filesServiceFactory.saveFile = _saveFile; - return filesServiceFactory; + serviceFactory.uploadLanguage = _uploadLanguage; + return serviceFactory; }, ]); @@ -2458,6 +2458,7 @@ app.controller("ModuleController", [ "SharedModuleDataService", "RestRelatedMixDatabasePortalService", "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", function ( $scope, $rootScope, @@ -2467,7 +2468,8 @@ app.controller("ModuleController", [ moduleServices, moduleDataService, RestRelatedMixDatabasePortalService, - dataService + dataService, + columnService ) { BaseRestCtrl.call( this, @@ -2681,11 +2683,16 @@ app.controller("ModuleController", [ $rootScope.showErrors(result.errors); } else { $scope.additionalData = result.data; - $rootScope.isBusy = false; - $scope.$apply(); + $scope.saveColumns(); } } }; + $scope.saveColumns = async function () { + let result = await columnService.saveMany($scope.additionalData.columns); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + } + }; $scope.loadPosts = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -3346,220 +3353,23 @@ app.controller("OrderController", [ if (result.isSucceed) { $scope.loadOrders(); } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.saveOrder = async function (order) { - order.content = $(".editor-content.content").val(); - order.excerpt = $(".editor-content.excerpt").val(); - $rootScope.isBusy = true; - var resp = await orderServices.saveOrder(order); - if (resp && resp.isSucceed) { - $scope.activedOrder = resp.data; - $rootScope.showMessage("Update successfully!", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - //$location.path('/portal/order/details/' + resp.data.id); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.preview = function (item) { - $rootScope.preview("order", item, item.title, "modal-lg"); - }; - }, -]); - -"use strict"; -app.factory("OrderServices", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var ordersServiceFactory = {}; - - var settings = $rootScope.globalSettings; - - var _getOrder = async function (id, type) { - var apiUrl = "/" + settings.lang + "/order/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + id; - } - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _initOrder = async function (type) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "GET", - url: apiUrl + "init/" + type, - }; - return await apiService.getApiResult(req); - }; - - var _getOrders = async function (request) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _removeOrder = async function (id) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; - - var _saveOrder = async function (order) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(order), - }; - return await apiService.getApiResult(req); - }; - - ordersServiceFactory.getOrder = _getOrder; - ordersServiceFactory.initOrder = _initOrder; - ordersServiceFactory.getOrders = _getOrders; - ordersServiceFactory.removeOrder = _removeOrder; - ordersServiceFactory.saveOrder = _saveOrder; - return ordersServiceFactory; - }, -]); - -"use strict"; -app.controller("PageGalleryController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "PageGalleryService", - "PostRestService", - "ApiService", - "CommonService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service, - postService, - apiService, - commonService - ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.pageId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.getList = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.request.query = "&page_id=" + id; - var response = await service.getList($scope.request); - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.remove = function (pageId, postId) { - $rootScope.showConfirm( - $scope, - "removeConfirmed", - [pageId, postId], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeConfirmed = async function (pageId, postId) { - $rootScope.isBusy = true; - var result = await service.delete(pageId, postId); - if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); - $rootScope.isBusy = true; - var startIndex = $scope.data.items[0].priority - 1; - for (var i = 0; i < $scope.data.items.length; i++) { - $scope.data.items[i].priority = startIndex + i + 1; + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); } - var resp = await service.updateInfos($scope.data.items); + }; + + $scope.saveOrder = async function (order) { + order.content = $(".editor-content.content").val(); + order.excerpt = $(".editor-content.excerpt").val(); + $rootScope.isBusy = true; + var resp = await orderServices.saveOrder(order); if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - $rootScope.showMessage("success", "success"); + $scope.activedOrder = resp.data; + $rootScope.showMessage("Update successfully!", "success"); $rootScope.isBusy = false; $scope.$apply(); + //$location.path('/portal/order/details/' + resp.data.id); } else { if (resp) { $rootScope.showErrors(resp.errors); @@ -3568,37 +3378,84 @@ app.controller("PageGalleryController", [ $scope.$apply(); } }; + + $scope.preview = function (item) { + $rootScope.preview("order", item, item.title, "modal-lg"); + }; }, ]); "use strict"; -app.factory("PageGalleryService", [ +app.factory("OrderServices", [ + "$http", "$rootScope", "ApiService", "CommonService", - "BaseService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (pageId, postId) { - var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; + function ($http, $rootScope, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var ordersServiceFactory = {}; + + var settings = $rootScope.globalSettings; + + var _getOrder = async function (id, type) { + var apiUrl = "/" + settings.lang + "/order/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + id; + } var req = { method: "GET", url: url, }; return await apiService.getApiResult(req); }; - var _updateInfos = async function (pages) { + + var _initOrder = async function (type) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "GET", + url: apiUrl + "init/" + type, + }; + return await apiService.getApiResult(req); + }; + + var _getOrders = async function (request) { + var apiUrl = "/" + settings.lang + "/order/"; var req = { method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(pages), + url: apiUrl + "list", + data: JSON.stringify(request), }; + return await apiService.getApiResult(req); }; - serviceFactory.delete = _delete; - serviceFactory.updateInfos = _updateInfos; - return serviceFactory; + + var _removeOrder = async function (id) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "GET", + url: apiUrl + "delete/" + id, + }; + return await apiService.getApiResult(req); + }; + + var _saveOrder = async function (order) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(order), + }; + return await apiService.getApiResult(req); + }; + + ordersServiceFactory.getOrder = _getOrder; + ordersServiceFactory.initOrder = _initOrder; + ordersServiceFactory.getOrders = _getOrders; + ordersServiceFactory.removeOrder = _removeOrder; + ordersServiceFactory.saveOrder = _saveOrder; + return ordersServiceFactory; }, ]); @@ -3614,6 +3471,7 @@ app.controller("PageController", [ "PagePageRestService", "UrlAliasService", "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", function ( $scope, $rootScope, @@ -3624,7 +3482,8 @@ app.controller("PageController", [ pagePostRestService, pagePageRestService, urlAliasService, - dataService + dataService, + columnService ) { BaseRestCtrl.call( this, @@ -3751,11 +3610,25 @@ app.controller("PageController", [ $scope.additionalData.cultures = $scope.viewmodel.cultures; $scope.additionalData.parentId = $scope.viewmodel.id; $scope.additionalData.parentType = "Page"; - await dataService.save($scope.additionalData); + let result = await dataService.save($scope.additionalData); + if (!result.isSucceed) { + $rootScope.showErrors(result.errors); + } else { + $scope.additionalData = result.data; + $scope.saveColumns(); + } } $rootScope.isBusy = false; $scope.$apply(); }; + + $scope.saveColumns = async function () { + let result = await columnService.saveMany($scope.additionalData.columns); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + } + }; + $scope.validate = async function () { // Add default alias if create new page if (!$scope.viewmodel.id && !$scope.viewmodel.urlAliases.length) { @@ -3846,6 +3719,156 @@ app.factory("PageRestService", [ }, ]); +"use strict"; +app.controller("PageGalleryController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "PageGalleryService", + "PostRestService", + "ApiService", + "CommonService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service, + postService, + apiService, + commonService + ) { + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.pageId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.getList = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + $scope.request.query = "&page_id=" + id; + var response = await service.getList($scope.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.remove = function (pageId, postId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [pageId, postId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeConfirmed = async function (pageId, postId) { + $rootScope.isBusy = true; + var result = await service.delete(pageId, postId); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); + $rootScope.isBusy = true; + var startIndex = $scope.data.items[0].priority - 1; + for (var i = 0; i < $scope.data.items.length; i++) { + $scope.data.items[i].priority = startIndex + i + 1; + } + var resp = await service.updateInfos($scope.data.items); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("PageGalleryService", [ + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($rootScope, apiService, commonService, baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("page-post"); + var _delete = async function (pageId, postId) { + var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; + var _updateInfos = async function (pages) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-infos", + data: JSON.stringify(pages), + }; + return await apiService.getApiResult(req); + }; + serviceFactory.delete = _delete; + serviceFactory.updateInfos = _updateInfos; + return serviceFactory; + }, +]); + "use strict"; app.controller("PagePageController", [ "$scope", @@ -3997,13 +4020,13 @@ app.factory("PagePageRestService", [ ]); "use strict"; -app.controller("PagePositionController", [ +app.controller("PagePostController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePositionService", + "PagePostRestService", "PostRestService", "ApiService", "CommonService", @@ -4015,7 +4038,6 @@ app.controller("PagePositionController", [ $location, service, postService, - apiService, commonService ) { BaseCtrl.call( @@ -4029,9 +4051,24 @@ app.controller("PagePositionController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.pageId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.init = function () { + $scope.pageId = $routeParams.id; + $scope.type = $routeParams.type; + $scope.template = $routeParams.template || ""; + $scope.pageIds = $routeParams.page_ids || $routeParams.id; + $scope.moduleIds = $routeParams.module_ids || ""; + $scope.canDrag = + $scope.request.orderBy === "Priority" && + $scope.request.direction === "Asc"; + $scope.createUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/create-gallery" + : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; + $scope.updateUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/gallery-details" + : "/portal/post/details"; + }; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -4065,9 +4102,9 @@ app.controller("PagePositionController", [ ); }; - $scope.removeConfirmed = async function (pageId, postId) { + $scope.removeConfirmed = async function (id) { $rootScope.isBusy = true; - var result = await service.delete(pageId, postId); + var result = await service.delete(id); if (result.isSucceed) { if ($scope.removeCallback) { $rootScope.executeFunctionByName( @@ -4120,16 +4157,16 @@ app.controller("PagePositionController", [ ]); "use strict"; -app.factory("PagePositionService", [ +app.factory("PagePostRestService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-position"); - var _delete = async function (pageId, positionId) { - var url = this.prefixUrl + "/delete/" + pageId + "/" + positionId; + serviceFactory.init("page-post"); + var _delete = async function (id) { + var url = this.prefixUrl + "/delete/" + id; var req = { method: "GET", url: url, @@ -4151,13 +4188,13 @@ app.factory("PagePositionService", [ ]); "use strict"; -app.controller("PagePostController", [ +app.controller("PagePositionController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePostRestService", + "PagePositionService", "PostRestService", "ApiService", "CommonService", @@ -4169,6 +4206,7 @@ app.controller("PagePostController", [ $location, service, postService, + apiService, commonService ) { BaseCtrl.call( @@ -4182,24 +4220,9 @@ app.controller("PagePostController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.init = function () { - $scope.pageId = $routeParams.id; - $scope.type = $routeParams.type; - $scope.template = $routeParams.template || ""; - $scope.pageIds = $routeParams.page_ids || $routeParams.id; - $scope.moduleIds = $routeParams.module_ids || ""; - $scope.canDrag = - $scope.request.orderBy === "Priority" && - $scope.request.direction === "Asc"; - $scope.createUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/create-gallery" - : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; - $scope.updateUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/gallery-details" - : "/portal/post/details"; - }; + $scope.pageId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -4233,9 +4256,9 @@ app.controller("PagePostController", [ ); }; - $scope.removeConfirmed = async function (id) { + $scope.removeConfirmed = async function (pageId, postId) { $rootScope.isBusy = true; - var result = await service.delete(id); + var result = await service.delete(pageId, postId); if (result.isSucceed) { if ($scope.removeCallback) { $rootScope.executeFunctionByName( @@ -4288,16 +4311,16 @@ app.controller("PagePostController", [ ]); "use strict"; -app.factory("PagePostRestService", [ +app.factory("PagePositionService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (id) { - var url = this.prefixUrl + "/delete/" + id; + serviceFactory.init("page-position"); + var _delete = async function (pageId, positionId) { + var url = this.prefixUrl + "/delete/" + pageId + "/" + positionId; var req = { method: "GET", url: url, @@ -4465,98 +4488,6 @@ app.factory("RestPortalPageNavigationService", [ }, ]); -"use strict"; -app.controller("RoleController", [ - "$scope", - "$rootScope", - "$location", - "$routeParams", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", - "RoleService", - function ( - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - dataService, - columnService, - service - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.role = { name: "" }; - $scope.initPermissions = async function () { - let backUrl = "/portal/role/list"; - $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; - $scope.updateUrl = "/portal/mix-database-data/details"; - }; - - $scope.createRole = async function () { - $rootScope.isBusy = true; - var result = await service.createRole($scope.role.name); - if (result.isSucceed) { - $scope.role.name = ""; - $scope.getList(); - } else { - $rootScope.showErrors(result.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("RoleService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("role", true); - - var _getPermissions = async function () { - var req = { - method: "GET", - url: this.prefixUrl + "/permissions", - }; - return await apiService.getApiResult(req); - }; - - var _updatePermission = async function (permission) { - var req = { - method: "POST", - url: this.prefixUrl + "/update-permission", - data: JSON.stringify(permission), - }; - return await apiService.getApiResult(req); - }; - var _createRole = function (name) { - var req = { - method: "POST", - url: this.prefixUrl + "/create", - data: JSON.stringify(name), - }; - - return apiService.getRestApiResult(req); - }; - serviceFactory.createRole = _createRole; - serviceFactory.getPermissions = _getPermissions; - serviceFactory.updatePermission = _updatePermission; - return serviceFactory; - }, -]); - "use strict"; app.controller("PostController", [ "$scope", @@ -4568,6 +4499,7 @@ app.controller("PostController", [ "PostRestService", "UrlAliasService", "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", function ( $scope, $rootScope, @@ -4577,7 +4509,8 @@ app.controller("PostController", [ $routeParams, service, urlAliasService, - dataService + dataService, + columnService ) { BaseRestCtrl.call( this, @@ -4765,11 +4698,21 @@ app.controller("PostController", [ let result = await dataService.save($scope.additionalData); if (!result.isSucceed) { $rootScope.showErrors(result.errors); + } else { + $scope.additionalData = result.data; + $scope.saveColumns(); } } $rootScope.isBusy = false; $scope.$apply(); }; + + $scope.saveColumns = async function () { + let result = await columnService.saveMany($scope.additionalData.columns); + if (result.isSucceed) { + $rootScope.showMessage("success", "success"); + } + }; $scope.getSingleSuccessCallback = async function () { $scope.defaultThumbnailImgWidth = ngAppSettings.localizeSettings.DefaultThumbnailImgWidth; @@ -4941,16 +4884,108 @@ app.controller("PostController", [ }); return true; }; - }, -]); + }, +]); + +"use strict"; +app.factory("PostRestService", [ + "BaseRestService", + function (baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("post/portal"); + // Define more service methods here + return serviceFactory; + }, +]); + +"use strict"; +app.controller("RoleController", [ + "$scope", + "$rootScope", + "$location", + "$routeParams", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", + "RoleService", + function ( + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + dataService, + columnService, + service + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.role = { name: "" }; + $scope.initPermissions = async function () { + let backUrl = "/portal/role/list"; + $scope.createUrl = `/portal/mix-database-data/create?mixDatabaseName=sys_permission&dataId=default&parentId=${$scope.viewmodel.id}&parentType=Role&backUrl=${backUrl}`; + $scope.updateUrl = "/portal/mix-database-data/details"; + }; + + $scope.createRole = async function () { + $rootScope.isBusy = true; + var result = await service.createRole($scope.role.name); + if (result.isSucceed) { + $scope.role.name = ""; + $scope.getList(); + } else { + $rootScope.showErrors(result.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("RoleService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("role", true); + + var _getPermissions = async function () { + var req = { + method: "GET", + url: this.prefixUrl + "/permissions", + }; + return await apiService.getApiResult(req); + }; -"use strict"; -app.factory("PostRestService", [ - "BaseRestService", - function (baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("post/portal"); - // Define more service methods here + var _updatePermission = async function (permission) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-permission", + data: JSON.stringify(permission), + }; + return await apiService.getApiResult(req); + }; + var _createRole = function (name) { + var req = { + method: "POST", + url: this.prefixUrl + "/create", + data: JSON.stringify(name), + }; + + return apiService.getRestApiResult(req); + }; + serviceFactory.createRole = _createRole; + serviceFactory.getPermissions = _getPermissions; + serviceFactory.updatePermission = _updatePermission; return serviceFactory; }, ]); @@ -6525,6 +6560,20 @@ app.component("appSettingsHeart", { ], }); +app.component("appSettingsSmtp", { + templateUrl: + "/mix-app/views/app-portal/pages/app-settings/components/smtp/view.html", + controller: [ + "ngAppSettings", + function (ngAppSettings) { + var ctrl = this; + }, + ], + bindings: { + appSettings: "=", + }, +}); + modules.component("portalMenus", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/portal-menus/view.html", @@ -6557,17 +6606,13 @@ modules.component("portalMenus", { ], }); -app.component("appSettingsSmtp", { +app.component("customerMain", { templateUrl: - "/mix-app/views/app-portal/pages/app-settings/components/smtp/view.html", - controller: [ - "ngAppSettings", - function (ngAppSettings) { - var ctrl = this; - }, - ], + "/mix-app/views/app-portal/pages/customer/components/main/customer-main.html", bindings: { - appSettings: "=", + customer: "=", + onDelete: "&", + onUpdate: "&", }, }); @@ -6610,16 +6655,6 @@ app.component("customerOrders", { }, }); -app.component("customerMain", { - templateUrl: - "/mix-app/views/app-portal/pages/customer/components/main/customer-main.html", - bindings: { - customer: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("mixDatabaseEdm", { templateUrl: "/mix-app/views/app-portal/pages/mix-database/components/edm/view.html", @@ -6707,9 +6742,13 @@ app.component("moduleAdvanced", { ], }); -app.component("moduleType", { +app.component("moduleContent", { templateUrl: - "/mix-app/views/app-portal/pages/module/components/module-type/view.html", + "/mix-app/views/app-portal/pages/module/components/module-content/view.html", + bindings: { + model: "=", + additionalData: "=", + }, controller: [ "$rootScope", function ($rootScope) { @@ -6717,18 +6756,11 @@ app.component("moduleType", { ctrl.localizeSettings = $rootScope.globalSettings; }, ], - bindings: { - model: "=", - }, }); -app.component("moduleContent", { +app.component("moduleType", { templateUrl: - "/mix-app/views/app-portal/pages/module/components/module-content/view.html", - bindings: { - model: "=", - additionalData: "=", - }, + "/mix-app/views/app-portal/pages/module/components/module-type/view.html", controller: [ "$rootScope", function ($rootScope) { @@ -6736,6 +6768,9 @@ app.component("moduleContent", { ctrl.localizeSettings = $rootScope.globalSettings; }, ], + bindings: { + model: "=", + }, }); app.component("pageGeneral", { @@ -6844,6 +6879,16 @@ app.component("pageGeneral", { }, }); +app.component("pageModules", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/modules/modules.html", + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("pageMain", { templateUrl: "/mix-app/views/app-portal/pages/page/components/main/main.html", controller: [ @@ -6887,16 +6932,6 @@ app.component("pageMain", { }, }); -app.component("pageModules", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/modules/modules.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageAdvanced", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-advanced/view.html", @@ -6985,6 +7020,16 @@ app.component("pageParents", { }, }); +app.component("pagePlugPlay", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/plug-play/plug-play.html", + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("productRelated", { templateUrl: "/mix-app/views/app-portal/pages/product/components/related/productRelated.html", @@ -7021,16 +7066,6 @@ app.component("productRelated", { }, }); -app.component("pagePlugPlay", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/plug-play/plug-play.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageSeo", { templateUrl: "/mix-app/views/app-portal/pages/page/components/seo/seo.html", controller: [ @@ -7087,6 +7122,16 @@ app.component("permissionMain", { }, }); +app.component("permissionParents", { + templateUrl: + "/mix-app/views/app-portal/pages/permission/components/parents/parents.html", + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("permissionPlugPlay", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/plug-play/plug-play.html", @@ -7186,57 +7231,6 @@ app.component("permissionPlugPlay", { ], }); -app.component("permissionParents", { - templateUrl: - "/mix-app/views/app-portal/pages/permission/components/parents/parents.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - -modules.component("rolePageNav", { - templateUrl: - "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RoleService", - function ($rootScope, $scope, ngAppSettings, roleServices) { - var ctrl = this; - ctrl.selected = null; - ctrl.updateOrders = function (index) { - ctrl.data.splice(index, 1); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.data[i].priority = i + 1; - } - }; - //ctrl.change = async function () { - // //var permission = ctrl.page.navPermission; - // //$rootScope.isBusy = true; - // //var resp = await roleServices.updatePermission(permission); - // //if (resp && resp.isSucceed) { - // // $rootScope.showMessage('Update successfully!', 'success'); - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - // //else { - // // if (resp) { $rootScope.showErrors(resp.errors); } - // // $rootScope.isBusy = false; - // // $scope.$apply(); - // //} - //}; - }, - ], - bindings: { - prefix: "=", - page: "=", - callback: "&", - }, -}); - app.component("postGeneral", { templateUrl: "/mix-app/views/app-portal/pages/post/components/general/view.html", @@ -7271,33 +7265,76 @@ app.component("postMain", { bindings: { post: "=", }, - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - ctrl.translate = $rootScope.translate; - ctrl.generateSeo = function () { - if (ctrl.post) { - if (!ctrl.post.seoName) { - ctrl.post.seoName = $rootScope.generateKeyword( - ctrl.post.title, - "-" - ); - } - if (!ctrl.post.seoTitle) { - ctrl.post.seoTitle = ctrl.post.title; - } - if (!ctrl.post.seoDescription === null) { - ctrl.post.seoDescription = ctrl.post.excerpt; - } - if (!ctrl.post.seoKeywords) { - ctrl.post.seoKeywords = ctrl.post.title; - } - } - }; - }, - ], + controller: [ + "$rootScope", + "$scope", + function ($rootScope, $scope) { + var ctrl = this; + ctrl.translate = $rootScope.translate; + ctrl.generateSeo = function () { + if (ctrl.post) { + if (!ctrl.post.seoName) { + ctrl.post.seoName = $rootScope.generateKeyword( + ctrl.post.title, + "-" + ); + } + if (!ctrl.post.seoTitle) { + ctrl.post.seoTitle = ctrl.post.title; + } + if (!ctrl.post.seoDescription === null) { + ctrl.post.seoDescription = ctrl.post.excerpt; + } + if (!ctrl.post.seoKeywords) { + ctrl.post.seoKeywords = ctrl.post.title; + } + } + }; + }, + ], +}); + +app.component("postMedias", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/medias/view.html", + controller: function () { + var ctrl = this; + ctrl.activeMedia = function (media) { + var currentItem = null; + if (ctrl.post.mediaNavs === null) { + ctrl.post.mediaNavs = []; + } + $.each(ctrl.post.mediaNavs, function (i, e) { + if (e.mediaId === media.id) { + e.isActived = media.isActived; + currentItem = e; + return false; + } + }); + if (currentItem === null) { + currentItem = { + description: + media.description !== "undefined" ? media.description : "", + image: media.filePath, + mediaId: media.id, + post: ctrl.post.id, + specificulture: media.specificulture, + position: 0, + priority: ctrl.post.mediaNavs.length + 1, + isActived: true, + }; + media.isHidden = true; + ctrl.post.mediaNavs.push(currentItem); + } + }; + }, + bindings: { + post: "=", + medias: "=", + loadMedia: "&", + onDelete: "&", + onUpdate: "&", + }, }); app.component("postModules", { @@ -7403,49 +7440,6 @@ app.component("postParents", { }, }); -app.component("postMedias", { - templateUrl: - "/mix-app/views/app-portal/pages/post/components/medias/view.html", - controller: function () { - var ctrl = this; - ctrl.activeMedia = function (media) { - var currentItem = null; - if (ctrl.post.mediaNavs === null) { - ctrl.post.mediaNavs = []; - } - $.each(ctrl.post.mediaNavs, function (i, e) { - if (e.mediaId === media.id) { - e.isActived = media.isActived; - currentItem = e; - return false; - } - }); - if (currentItem === null) { - currentItem = { - description: - media.description !== "undefined" ? media.description : "", - image: media.filePath, - mediaId: media.id, - post: ctrl.post.id, - specificulture: media.specificulture, - position: 0, - priority: ctrl.post.mediaNavs.length + 1, - isActived: true, - }; - media.isHidden = true; - ctrl.post.mediaNavs.push(currentItem); - } - }; - }, - bindings: { - post: "=", - medias: "=", - loadMedia: "&", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("postAdvanced", { templateUrl: "/mix-app/views/app-portal/pages/post/components/post-advanced/view.html", @@ -7556,15 +7550,6 @@ app.component("postContent", { ], }); -app.component("postSeo", { - templateUrl: "/mix-app/views/app-portal/pages/post/components/seo/view.html", - bindings: { - post: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("postRelated", { templateUrl: "/mix-app/views/app-portal/pages/post/components/related/view.html", @@ -7600,6 +7585,56 @@ app.component("postRelated", { }, }); +app.component("postSeo", { + templateUrl: "/mix-app/views/app-portal/pages/post/components/seo/view.html", + bindings: { + post: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + +modules.component("rolePageNav", { + templateUrl: + "/mix-app/views/app-portal/pages/role/components/role-page-navigation/role-page-navigations.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RoleService", + function ($rootScope, $scope, ngAppSettings, roleServices) { + var ctrl = this; + ctrl.selected = null; + ctrl.updateOrders = function (index) { + ctrl.data.splice(index, 1); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.data[i].priority = i + 1; + } + }; + //ctrl.change = async function () { + // //var permission = ctrl.page.navPermission; + // //$rootScope.isBusy = true; + // //var resp = await roleServices.updatePermission(permission); + // //if (resp && resp.isSucceed) { + // // $rootScope.showMessage('Update successfully!', 'success'); + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + // //else { + // // if (resp) { $rootScope.showErrors(resp.errors); } + // // $rootScope.isBusy = false; + // // $scope.$apply(); + // //} + //}; + }, + ], + bindings: { + prefix: "=", + page: "=", + callback: "&", + }, +}); + app.component("serviceMain", { templateUrl: "/mix-app/views/app-portal/pages/service/components/main/view.html", @@ -8236,11 +8271,11 @@ modules.component("additionalColumn", { }; ctrl.updateOrders = function (index) { if (index > ctrl.dragStartIndex) { - ctrl.columns.splice(ctrl.dragStartIndex, 1); + ctrl.additionalData.columns.splice(ctrl.dragStartIndex, 1); } else { - ctrl.columns.splice(ctrl.dragStartIndex + 1, 1); + ctrl.additionalData.columns.splice(ctrl.dragStartIndex + 1, 1); } - angular.forEach(ctrl.columns, function (e, i) { + angular.forEach(ctrl.additionalData.columns, function (e, i) { e.priority = i; }); }; @@ -8646,9 +8681,8 @@ modules.component("funding", { bindings: {}, }); -modules.component("githubContributers", { - templateUrl: - "/mix-app/views/app-portal/components/github-contributers/view.html", +modules.component("githubReleases", { + templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", controller: [ "$rootScope", "$http", @@ -8658,7 +8692,7 @@ modules.component("githubContributers", { ctrl.init = function () { var req = { method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/contributors", + url: "https://api.github.com/repos/mixcore/mix.core/releases", }; ctrl.getGithubApiResult(req); }; @@ -8684,8 +8718,9 @@ modules.component("githubContributers", { bindings: {}, }); -modules.component("githubReleases", { - templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", +modules.component("githubContributers", { + templateUrl: + "/mix-app/views/app-portal/components/github-contributers/view.html", controller: [ "$rootScope", "$http", @@ -8695,7 +8730,7 @@ modules.component("githubReleases", { ctrl.init = function () { var req = { method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/releases", + url: "https://api.github.com/repos/mixcore/mix.core/contributors", }; ctrl.getGithubApiResult(req); }; @@ -9496,24 +9531,6 @@ modules.component("mainSideBarItem", { }, }); -modules.component("mainSideBarItemDynamic", { - templateUrl: - "/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.translate = $rootScope.translate; - }, - ], - bindings: { - iconSize: "=", - linkStyle: "=", - itemStyle: "=", - item: "=", - }, -}); - modules.component("mediaFileUpload", { templateUrl: "/mix-app/views/app-portal/components/media-file-upload/view.html", @@ -9526,7 +9543,7 @@ modules.component("mediaFileUpload", { type: "=?", folder: "=?", auto: "=", - acceptTypes: "=?", + uploadOptions: "=?", onDelete: "&?", onUpdate: "&?", onInsert: "&?", @@ -9551,6 +9568,10 @@ modules.component("mediaFileUpload", { .match(/([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|svg)/g); ctrl.maxHeight = ctrl.maxHeight || "200px"; ctrl.id = Math.floor(Math.random() * 100); + if (ctrl.uploadOptions) { + ctrl.w = ctrl.uploadOptions.width; + ctrl.h = ctrl.uploadOptions.height; + } }; ctrl.$doCheck = function () { if (ctrl.src !== ctrl.srcUrl && ctrl.srcUrl != image_placeholder) { @@ -9673,42 +9694,22 @@ modules.component("mediaFileUpload", { ], }); -modules.component("mediumNews", { - templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", +modules.component("mainSideBarItemDynamic", { + templateUrl: + "/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html", controller: [ "$rootScope", - "$http", - function ($rootScope, $http) { + function ($rootScope) { var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var req = { - method: "GET", - url: - "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + - Math.floor(Date.now() / 1000), - }; - ctrl.getMediumApiResult(req); - }; - - ctrl.getMediumApiResult = async function (req) { - return $http(req).then( - function (resp) { - if (resp.status == "200") { - ctrl.items = resp.data.items; - } - }, - function (error) { - return { - isSucceed: false, - errors: [error.statusText || error.status], - }; - } - ); - }; + ctrl.translate = $rootScope.translate; }, ], - bindings: {}, + bindings: { + iconSize: "=", + linkStyle: "=", + itemStyle: "=", + item: "=", + }, }); modules.component("mediaUpload", { @@ -9761,15 +9762,53 @@ modules.component("mediaUpload", { if (resp) { $rootScope.showErrors(resp.errors); } - $rootScope.isBusy = false; - $scope.$apply(); - } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, + ], + bindings: { + onUpdate: "&?", + }, +}); + +modules.component("mediumNews", { + templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", + controller: [ + "$rootScope", + "$http", + function ($rootScope, $http) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var req = { + method: "GET", + url: + "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + + Math.floor(Date.now() / 1000), + }; + ctrl.getMediumApiResult(req); + }; + + ctrl.getMediumApiResult = async function (req) { + return $http(req).then( + function (resp) { + if (resp.status == "200") { + ctrl.items = resp.data.items; + } + }, + function (error) { + return { + isSucceed: false, + errors: [error.statusText || error.status], + }; + } + ); }; }, ], - bindings: { - onUpdate: "&?", - }, + bindings: {}, }); modules.component("mixDatabaseColumn", { @@ -11167,41 +11206,6 @@ modules.component("mixFileUpload", { ], }); -modules.component("mixSelectIcons", { - templateUrl: - "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", - controller: [ - "$rootScope", - "$scope", - "$location", - "$element", - function ($rootScope, $scope, $location, $element) { - var ctrl = this; - ctrl.limitTo = 20; - ctrl.container = $element[0].querySelector(".list-icon"); - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - ctrl.showMore = () => { - if ( - ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && - ctrl.limitTo < ctrl.options.length - ) { - ctrl.limitTo *= 2; - } - }; - ctrl.select = function (ico) { - ctrl.data = ico.class; - }; - }, - ], - bindings: { - data: "=", - prefix: "=", - options: "=", - }, -}); - "use strict"; app.controller("MixNavigationController", [ "$scope", @@ -11323,139 +11327,39 @@ app.controller("MixNavigationController", [ }, ]); -modules.component("mixValueEditor", { +modules.component("mixSelectIcons", { templateUrl: - "/mix-app/views/app-portal/components/mix-value-editor/view.html", - bindings: { - title: "=?", - isSelect: "=?", - stringValue: "=", - type: "=", - }, + "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", controller: [ "$rootScope", "$scope", - "ngAppSettings", "$location", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, ngAppSettings, $location, dataService) { + "$element", + function ($rootScope, $scope, $location, $element) { var ctrl = this; - ctrl.icons = ngAppSettings.icons; - ctrl.refData = []; - ctrl.refRequest = angular.copy(ngAppSettings.request); - ctrl.refRequest.pageSize = 100; - ctrl.dataTypes = $rootScope.globalSettings.dataTypes; - ctrl.previousId = null; - ctrl.initData = async function () { - setTimeout(() => { - switch (ctrl.type) { - case "datetime": - case "date": - case "time": - if (ctrl.stringValue) { - ctrl.dateObj = new Date(ctrl.stringValue); - $scope.$apply(); - } - break; - case "boolean": - if (ctrl.stringValue) { - ctrl.booleanValue = ctrl.stringValue == "true"; - } - break; - - case "reference": // reference - if (ctrl.referenceId) { - ctrl.refRequest.mixDatabaseId = ctrl.referenceId; - ctrl.refRequest.parentType = ctrl.parentType; - ctrl.refRequest.parentId = ctrl.parentId; - - dataService.getList(ctrl.refRequest).then((resp) => { - if (resp) { - ctrl.refData = resp; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors("Failed"); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } - break; - default: - if (ctrl.isEncrypt && ctrl.encryptValue) { - var encryptedData = { - key: ctrl.encryptKey, - data: ctrl.encryptValue, - }; - ctrl.stringValue = $rootScope.decrypt(encryptedData); - } - break; - } - }, 200); + ctrl.limitTo = 20; + ctrl.container = $element[0].querySelector(".list-icon"); + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); }; - ctrl.updateStringValue = async function (dataType) { - switch (dataType) { - case "datetime": - case "date": - case "time": - if (ctrl.dateObj != null) { - ctrl.stringValue = ctrl.dateObj.toISOString(); - } else { - ctrl.stringValue = null; - } - break; - case "double": - // ctrl.stringValue = ctrl.doubleValue; - break; - case "boolean": - // ctrl.stringValue = ctrl.booleanValue; - break; - - default: - ctrl.stringValue = ctrl.doubleValue; - break; + ctrl.showMore = () => { + if ( + ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && + ctrl.limitTo < ctrl.options.length + ) { + ctrl.limitTo *= 2; } }; - ctrl.updateRefData = function (item) { - $location.url( - "/portal/mix-database-data/details?dataId=" + - item.id + - "&mixDatabaseId=" + - item.mixDatabaseId + - "&parentType=" + - item.parentType + - "&parentId=" + - item.parentId - ); - }; - ctrl.removeRefData = async function (data) { - $rootScope.showConfirm( - ctrl, - "removeRefDataConfirmed", - [data.id], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - ctrl.removeRefDataConfirmed = async function (dataId) { - $rootScope.isBusy = true; - var result = await dataService.delete(dataId); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.refData, "id", dataId); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } + ctrl.select = function (ico) { + ctrl.data = ico.class; }; }, ], + bindings: { + data: "=", + prefix: "=", + options: "=", + }, }); modules.component("mixTemplateEditor", { @@ -11527,14 +11431,149 @@ modules.component("mixTemplateEditor", { } } }; - ctrl.updateTemplateContent = function (content) { - ctrl.template.content = content; + ctrl.updateTemplateContent = function (content) { + ctrl.template.content = content; + }; + ctrl.updateStyleContent = function (content) { + ctrl.template.scripts = content; + }; + ctrl.updateScriptContent = function (content) { + ctrl.template.styles = content; + }; + }, + ], +}); + +modules.component("mixValueEditor", { + templateUrl: + "/mix-app/views/app-portal/components/mix-value-editor/view.html", + bindings: { + title: "=?", + isSelect: "=?", + stringValue: "=", + type: "=", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "$location", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, ngAppSettings, $location, dataService) { + var ctrl = this; + ctrl.icons = ngAppSettings.icons; + ctrl.refData = []; + ctrl.refRequest = angular.copy(ngAppSettings.request); + ctrl.refRequest.pageSize = 100; + ctrl.dataTypes = $rootScope.globalSettings.dataTypes; + ctrl.previousId = null; + ctrl.initData = async function () { + setTimeout(() => { + switch (ctrl.type) { + case "datetime": + case "date": + case "time": + if (ctrl.stringValue) { + ctrl.dateObj = new Date(ctrl.stringValue); + $scope.$apply(); + } + break; + case "boolean": + if (ctrl.stringValue) { + ctrl.booleanValue = ctrl.stringValue == "true"; + } + break; + + case "reference": // reference + if (ctrl.referenceId) { + ctrl.refRequest.mixDatabaseId = ctrl.referenceId; + ctrl.refRequest.parentType = ctrl.parentType; + ctrl.refRequest.parentId = ctrl.parentId; + + dataService.getList(ctrl.refRequest).then((resp) => { + if (resp) { + ctrl.refData = resp; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors("Failed"); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } + break; + default: + if (ctrl.isEncrypt && ctrl.encryptValue) { + var encryptedData = { + key: ctrl.encryptKey, + data: ctrl.encryptValue, + }; + ctrl.stringValue = $rootScope.decrypt(encryptedData); + } + break; + } + }, 200); + }; + ctrl.updateStringValue = async function (dataType) { + switch (dataType) { + case "datetime": + case "date": + case "time": + if (ctrl.dateObj != null) { + ctrl.stringValue = ctrl.dateObj.toISOString(); + } else { + ctrl.stringValue = null; + } + break; + case "double": + // ctrl.stringValue = ctrl.doubleValue; + break; + case "boolean": + // ctrl.stringValue = ctrl.booleanValue; + break; + + default: + ctrl.stringValue = ctrl.doubleValue; + break; + } + }; + ctrl.updateRefData = function (item) { + $location.url( + "/portal/mix-database-data/details?dataId=" + + item.id + + "&mixDatabaseId=" + + item.mixDatabaseId + + "&parentType=" + + item.parentType + + "&parentId=" + + item.parentId + ); }; - ctrl.updateStyleContent = function (content) { - ctrl.template.scripts = content; + ctrl.removeRefData = async function (data) { + $rootScope.showConfirm( + ctrl, + "removeRefDataConfirmed", + [data.id], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); }; - ctrl.updateScriptContent = function (content) { - ctrl.template.styles = content; + ctrl.removeRefDataConfirmed = async function (dataId) { + $rootScope.isBusy = true; + var result = await dataService.delete(dataId); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.refData, "id", dataId); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } }; }, ], @@ -11910,18 +11949,216 @@ modules.component("modalHelper", { defaultUrl + "/basic-usage-configuration" ); } - if (portalUrl.startsWith("/portal/my-profile")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-users-profile" - ); + if (portalUrl.startsWith("/portal/my-profile")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-users-profile" + ); + } + + // switch (portalUrl) { + // case '/portal': + // default: + // ctrl.trustedUrl = $sce.trustAsResourceUrl(defaultUrl); + // break; + // } + }; + }, + ], +}); + +modules.component("modalNavDatas", { + templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", + bindings: { + mixDatabaseId: "=?", + mixDatabaseName: "=?", + parentId: "=?", + parentType: "=?", + type: "=?", + columnDisplay: "=?", + selectedList: "=?", + selectCallback: "&", + save: "&", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestRelatedMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, service, navService) { + var ctrl = this; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.request.key = "readData"; + ctrl.navs = []; + + ctrl.queries = {}; + ctrl.data = { items: [] }; + ctrl.$onInit = function () { + if (!ctrl.selectedList) { + ctrl.selectedList = []; + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } + }; + ctrl.loadData = async function (pageIndex) { + ctrl.request.query = ""; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var d = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = d.toISOString(); + } + if (ctrl.request.toDate !== null) { + var d = new Date(ctrl.request.toDate); + ctrl.request.toDate = d.toISOString(); + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } + Object.keys(ctrl.queries).forEach((e) => { + if (ctrl.queries[e]) { + ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; + } + }); + var response = await service.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + ctrl.navs = []; + angular.forEach(response.data.items, function (e) { + e.disabled = + $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; + // var item = { + // priority: e.priority, + // description: e.data.title, + // postId: e.id, + // image: e.thumbnailUrl, + // specificulture: e.specificulture, + // status: 'Published', + // isActived: false + // }; + // item[ctrl.srcField] = ctrl.srcId; + // ctrl.navs.push(item); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + ctrl.select = function (value, isSelected) { + if (isSelected) { + if (ctrl.parentId) { + var nav = { + mixDatabaseName: ctrl.mixDatabaseName, + parentId: ctrl.parentId, + parentType: ctrl.parentType, + id: value, + }; + navService.save(nav).then((resp) => { + if (resp.isSucceed) { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + } + } else { + if (ctrl.parentId) { + navService + .delete([ctrl.parentId, ctrl.parentType, data.id]) + .then((resp) => { + if (resp.isSucceed) { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); + } + } + if (ctrl.selectCallback) { + ctrl.selectCallback({ data: data }); } - - // switch (portalUrl) { - // case '/portal': - // default: - // ctrl.trustedUrl = $sce.trustAsResourceUrl(defaultUrl); - // break; - // } + }; + ctrl.createData = function () { + var data = { + title: ctrl.newTitle, + slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), + type: ctrl.type, + }; + service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { + if (resp.isSucceed) { + ctrl.data.items.push(resp.data); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); }; }, ], @@ -12268,213 +12505,6 @@ modules.component("modalNavPages", { ], }); -modules.component("modalNavDatas", { - templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", - bindings: { - mixDatabaseId: "=?", - mixDatabaseName: "=?", - parentId: "=?", - parentType: "=?", - type: "=?", - columnDisplay: "=?", - selectedList: "=?", - selectCallback: "&", - save: "&", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestRelatedMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, service, navService) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.request.key = "readData"; - ctrl.navs = []; - - ctrl.queries = {}; - ctrl.data = { items: [] }; - ctrl.$onInit = function () { - if (!ctrl.selectedList) { - ctrl.selectedList = []; - } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - }; - ctrl.loadData = async function (pageIndex) { - ctrl.request.query = ""; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var d = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = d.toISOString(); - } - if (ctrl.request.toDate !== null) { - var d = new Date(ctrl.request.toDate); - ctrl.request.toDate = d.toISOString(); - } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - Object.keys(ctrl.queries).forEach((e) => { - if (ctrl.queries[e]) { - ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; - } - }); - var response = await service.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - ctrl.navs = []; - angular.forEach(response.data.items, function (e) { - e.disabled = - $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; - // var item = { - // priority: e.priority, - // description: e.data.title, - // postId: e.id, - // image: e.thumbnailUrl, - // specificulture: e.specificulture, - // status: 'Published', - // isActived: false - // }; - // item[ctrl.srcField] = ctrl.srcId; - // ctrl.navs.push(item); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.select = function (value, isSelected) { - if (isSelected) { - if (ctrl.parentId) { - var nav = { - mixDatabaseName: ctrl.mixDatabaseName, - parentId: ctrl.parentId, - parentType: ctrl.parentType, - id: value, - }; - navService.save(nav).then((resp) => { - if (resp.isSucceed) { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - } - } else { - if (ctrl.parentId) { - navService - .delete([ctrl.parentId, ctrl.parentType, data.id]) - .then((resp) => { - if (resp.isSucceed) { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); - } - } - if (ctrl.selectCallback) { - ctrl.selectCallback({ data: data }); - } - }; - ctrl.createData = function () { - var data = { - title: ctrl.newTitle, - slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), - type: ctrl.type, - }; - service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { - if (resp.isSucceed) { - ctrl.data.items.push(resp.data); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - }; - }, - ], -}); - -modules.component("modalPermission", { - templateUrl: - "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", - controller: "PermissionController", - bindings: { - message: "=", - }, -}); - modules.component("modalNavPosts", { templateUrl: "/mix-app/views/app-portal/components/modal-nav-posts/modal-nav-posts.html", @@ -12691,6 +12721,15 @@ modules.component("modalNavs", { ], }); +modules.component("modalPermission", { + templateUrl: + "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", + controller: "PermissionController", + bindings: { + message: "=", + }, +}); + modules.component("modalTemplate", { templateUrl: "/mix-app/views/app-portal/components/modal-template/view.html", controller: [ diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js index e438147ec..c51caa61d 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-shared.min.js @@ -1743,6 +1743,15 @@ appShared.factory("BaseRestService", [ return await this.getRestApiResult(req); }; + var _saveMany = async function (models) { + var req = { + method: "POST", + url: this.prefixUrl + "/save-many", + data: JSON.stringify(models), + }; + return await this.getRestApiResult(req); + }; + var _applyList = async function (objData) { var url = this.prefixUrl + "/list-action"; var req = { @@ -1835,6 +1844,7 @@ appShared.factory("BaseRestService", [ serviceFactory.update = _update; serviceFactory.save = _save; serviceFactory.saveFields = _saveFields; + serviceFactory.saveMany = _saveMany; serviceFactory.delete = _delete; serviceFactory.ajaxSubmitForm = _ajaxSubmitForm; serviceFactory.parseQuery = _parseQuery; @@ -2846,42 +2856,42 @@ appShared.factory("TranslatorService", [ ]); "use strict"; -appShared.factory("RestMixDatabaseColumnPortalService", [ +appShared.factory("RestMixDatabasePortalService", [ "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { + function (baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database-column/portal", true); - var _initData = async function (mixDatabaseName) { - var url = this.prefixUrl + "/init/" + mixDatabaseName; + serviceFactory.init("mix-database/portal"); + var _migrate = async function (data) { + var url = `${this.prefixUrl}/migrate/${data.id}`; var req = { - method: "GET", + method: "POST", url: url, + data: JSON.stringify(data), }; - return await apiService.getRestApiResult(req); + return await this.getRestApiResult(req); }; - serviceFactory.initData = _initData; + serviceFactory.migrate = _migrate; return serviceFactory; }, ]); "use strict"; -appShared.factory("RestMixDatabasePortalService", [ +appShared.factory("RestMixDatabaseColumnPortalService", [ "BaseRestService", - function (baseService) { + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("mix-database/portal"); - var _migrate = async function (data) { - var url = `${this.prefixUrl}/migrate/${data.id}`; + serviceFactory.init("mix-database-column/portal", true); + var _initData = async function (mixDatabaseName) { + var url = this.prefixUrl + "/init/" + mixDatabaseName; var req = { - method: "POST", + method: "GET", url: url, - data: JSON.stringify(data), }; - return await this.getRestApiResult(req); + return await apiService.getRestApiResult(req); }; - serviceFactory.migrate = _migrate; + serviceFactory.initData = _initData; return serviceFactory; }, ]); @@ -4576,6 +4586,48 @@ sharedComponents.component("apiFile", { }, }); +sharedComponents.component("breadcrumbs", { + templateUrl: + "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + }, + ], + bindings: { + breadCrumbs: "=", + }, +}); + +sharedComponents.component("checkboxSwitch", { + templateUrl: "/mix-app/views/app-shared/components/checkbox-switch/view.html", + controller: [ + "$rootScope", + "$location", + function ($rootScope, $location) { + var ctrl = this; + ctrl.guid = $rootScope.generateUUID(); + ctrl.$onInit = function () { + ctrl.isSelected = ctrl.isSelected || false; + }; + ctrl.limString = function (str, max) { + if (str) { + return str.length > max ? str.substring(0, max) + " ..." : str; + } + }; + }, + ], + + bindings: { + value: "=", + isSelected: "=?", + detailsUrl: "=?", + callback: "&", + description: "=", + }, +}); + sharedComponents.component("azureStorage", { templateUrl: "/mix-app/views/app-shared/components/azure-storage/view.html", bindings: { @@ -4684,48 +4736,6 @@ sharedComponents.component("azureStorage", { ], }); -sharedComponents.component("breadcrumbs", { - templateUrl: - "/mix-app/views/app-shared/components/breadcrumbs/breadcrumbs.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], - bindings: { - breadCrumbs: "=", - }, -}); - -sharedComponents.component("checkboxSwitch", { - templateUrl: "/mix-app/views/app-shared/components/checkbox-switch/view.html", - controller: [ - "$rootScope", - "$location", - function ($rootScope, $location) { - var ctrl = this; - ctrl.guid = $rootScope.generateUUID(); - ctrl.$onInit = function () { - ctrl.isSelected = ctrl.isSelected || false; - }; - ctrl.limString = function (str, max) { - if (str) { - return str.length > max ? str.substring(0, max) + " ..." : str; - } - }; - }, - ], - - bindings: { - value: "=", - isSelected: "=?", - detailsUrl: "=?", - callback: "&", - description: "=", - }, -}); - sharedComponents.component("cultures", { templateUrl: "/mix-app/views/app-shared/components/cultures/cultures.html", bindings: { @@ -4864,6 +4874,21 @@ sharedComponents.component("customFile", { ], }); +sharedComponents.component("swDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/data-preview/data-preview.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + }, + ], + bindings: { + type: "=", + value: "=", + }, +}); + "use trick"; sharedComponents.directive("pane", function () { return { @@ -4906,21 +4931,6 @@ sharedComponents.directive("tabs", function () { }; }); -sharedComponents.component("swDataPreview", { - templateUrl: - "/mix-app/views/app-shared/components/data-preview/data-preview.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - }, - ], - bindings: { - type: "=", - value: "=", - }, -}); - sharedComponents.component("fbLogin", { templateUrl: "/mix-app/views/app-shared/components/fb-login/view.html", bindings: { @@ -5181,58 +5191,6 @@ sharedComponents.component("googlePay", { ], }); -sharedComponents.component("limitString", { - templateUrl: - "/mix-app/views/app-shared/components/limit-string/limit-string.html", - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - function ($rootScope, $scope, ngAppSettings) { - var ctrl = this; - ctrl.shortenString = ""; - ctrl.previousContentId = undefined; - - this.$onInit = () => { - ctrl.previousContentId = angular.copy(ctrl.contentId); - }; - - this.$doCheck = () => { - if (ctrl.contentId !== ctrl.previousContentId) { - ctrl.loadModuleData(); - ctrl.previousContentId = ctrl.contentId; - } - }; - ctrl.shortString = function () { - var data = decodeURIComponent(ctrl.content); - if (data) { - if (ctrl.max < data.length) { - ctrl.shortenString = - data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; - } else { - ctrl.shortenString = data.replace(/[+]/g, " "); - } - } - }; - ctrl.view = function () { - var obj = { - moduleId: ctrl.moduleId, - id: ctrl.contentId, - }; - $rootScope.preview("module-data", obj, null, "modal-lg"); - }; - ctrl.translate = $rootScope.translate; - }, - ], - bindings: { - content: "=", - showData: "=", - max: "=", - moduleId: "=", - contentId: "=", - }, -}); - (function (angular) { appShared.component("languageSwitcher", { templateUrl: @@ -5293,40 +5251,92 @@ sharedComponents.component("limitString", { }); })(window.angular); -appShared.component("loginPopup", { - templateUrl: "/mix-app/views/app-shared/components/login-popup/view.html", - controller: "LoginPopupController", -}); +sharedComponents.component("limitString", { + templateUrl: + "/mix-app/views/app-shared/components/limit-string/limit-string.html", + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + function ($rootScope, $scope, ngAppSettings) { + var ctrl = this; + ctrl.shortenString = ""; + ctrl.previousContentId = undefined; -appShared.controller("LoginPopupController", [ - "$scope", - "$rootScope", - "AuthService", - "ApiService", - "CommonService", - function LoginPopupController( - $scope, - $rootScope, - authService, - commonService - ) { - $scope.loginData = { - userName: "", - password: "", - rememberMe: false, - }; - $scope.login = async function () { - var result = await authService.loginPopup($scope.loginData); - if (result && result.isSucceed) { - $rootScope.isBusy = false; - $scope.message = result.errors[0]; - $("#login-popup").modal("hide"); - $scope.$apply(); + this.$onInit = () => { + ctrl.previousContentId = angular.copy(ctrl.contentId); + }; - if ($rootScope.loginCallbackRequest) { - if ($rootScope.loginCallbackType == "rest") { - apiService.getRestApiResult($rootScope.loginCallbackRequest); - } else { + this.$doCheck = () => { + if (ctrl.contentId !== ctrl.previousContentId) { + ctrl.loadModuleData(); + ctrl.previousContentId = ctrl.contentId; + } + }; + ctrl.shortString = function () { + var data = decodeURIComponent(ctrl.content); + if (data) { + if (ctrl.max < data.length) { + ctrl.shortenString = + data.replace(/[+]/g, " ").substr(0, ctrl.max) + " ..."; + } else { + ctrl.shortenString = data.replace(/[+]/g, " "); + } + } + }; + ctrl.view = function () { + var obj = { + moduleId: ctrl.moduleId, + id: ctrl.contentId, + }; + $rootScope.preview("module-data", obj, null, "modal-lg"); + }; + ctrl.translate = $rootScope.translate; + }, + ], + bindings: { + content: "=", + showData: "=", + max: "=", + moduleId: "=", + contentId: "=", + }, +}); + +appShared.component("loginPopup", { + templateUrl: "/mix-app/views/app-shared/components/login-popup/view.html", + controller: "LoginPopupController", +}); + +appShared.controller("LoginPopupController", [ + "$scope", + "$rootScope", + "AuthService", + "ApiService", + "CommonService", + function LoginPopupController( + $scope, + $rootScope, + authService, + commonService + ) { + $scope.loginData = { + userName: "", + password: "", + rememberMe: false, + }; + $scope.login = async function () { + var result = await authService.loginPopup($scope.loginData); + if (result && result.isSucceed) { + $rootScope.isBusy = false; + $scope.message = result.errors[0]; + $("#login-popup").modal("hide"); + $scope.$apply(); + + if ($rootScope.loginCallbackRequest) { + if ($rootScope.loginCallbackType == "rest") { + apiService.getRestApiResult($rootScope.loginCallbackRequest); + } else { apiService.getRestResult($rootScope.loginCallbackRequest); } $rootScope.loginCallbackRequest = null; @@ -6919,26 +6929,6 @@ sharedComponents.component("mixLoader", { }, }); -sharedComponents.component("mixSelect", { - templateUrl: "/mix-app/views/app-shared/components/mix-select/view.html", - bindings: { - options: "=", - model: "=", - allowNull: "=?", - callback: "&?", - }, - controller: [ - "$rootScope", - "$scope", - function PortalTemplateController($rootScope, $scope) { - var ctrl = this; - ctrl.onSelect = function () { - ctrl.callback({ type: ctrl.model }); - }; - }, - ], -}); - sharedComponents.component("mixModuleDataTable", { templateUrl: "/mix-app/views/app-shared/components/mix-module-data-table/mix-module-data-table.html", @@ -7025,6 +7015,26 @@ sharedComponents.component("mixModuleDataTable", { }, }); +sharedComponents.component("mixSelect", { + templateUrl: "/mix-app/views/app-shared/components/mix-select/view.html", + bindings: { + options: "=", + model: "=", + allowNull: "=?", + callback: "&?", + }, + controller: [ + "$rootScope", + "$scope", + function PortalTemplateController($rootScope, $scope) { + var ctrl = this; + ctrl.onSelect = function () { + ctrl.callback({ type: ctrl.model }); + }; + }, + ], +}); + "use strict"; appShared.controller("ModalPostController", [ "$scope", @@ -7375,6 +7385,30 @@ sharedComponents.controller( } ); +sharedComponents.component("moduleDataPreview", { + templateUrl: + "/mix-app/views/app-shared/components/module-data-preview/module-data-preview.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + + ctrl.translate = $rootScope.translate; + ctrl.$onInit = () => { + if (!ctrl.datatype) { + ctrl.datatype = ctrl.data.dataType; + } + }; + }, + ], + bindings: { + data: "=", + datatype: "=?", + width: "=", + header: "=", + }, +}); + "use strict"; appShared.controller("SharedModuleDataController", [ "$scope", @@ -7671,30 +7705,6 @@ appShared.factory("SharedModuleDataService", [ }, ]); -sharedComponents.component("moduleDataPreview", { - templateUrl: - "/mix-app/views/app-shared/components/module-data-preview/module-data-preview.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - - ctrl.translate = $rootScope.translate; - ctrl.$onInit = () => { - if (!ctrl.datatype) { - ctrl.datatype = ctrl.data.dataType; - } - }; - }, - ], - bindings: { - data: "=", - datatype: "=?", - width: "=", - header: "=", - }, -}); - sharedComponents.component("moduleForm", { templateUrl: "/mix-app/views/app-shared/components/module-form/view.html", bindings: { @@ -8088,6 +8098,58 @@ sharedComponents.component("qrCode", { }, }); +sharedComponents.component("recaptcha", { + templateUrl: "/mix-app/views/app-shared/components/recaptcha/recaptcha.html", + controller: [ + "$rootScope", + "ApiService", + "CommonService", + function ($rootScope, apiService, commonService) { + var ctrl = this; + ctrl.shortenString = ""; + ctrl.previousContentId = undefined; + ctrl.recaptcha_key = null; + ctrl.token = null; + this.$onInit = () => { + ctrl.recaptcha_key = $rootScope.globalSettings.data.Recaptcha_Key; + ctrl.recaptcha_secret = $rootScope.globalSettings.data.Recaptcha_Secret; + grecaptcha.ready(function () { + grecaptcha + .execute(ctrl.recaptcha_key, { action: ctrl.action }) + .then(function (token) { + ctrl.token = token; + }); + }); + }; + ctrl.verify = function () { + var url = "https://www.google.com/recaptcha/api/siteverify"; + var data = { + secret: ctrl.recaptcha_secret, + response: ctrl.token, + }; + var req = { + method: "POST", + url: url, + data: data, + }; + return apiService.getApiResult(req).then(function (response) { + if (response.success) { + ctrl.callback(); + } else { + angular.forEach(response.error - codes, function (err) { + commonService.showAlertMsg("Recaptcha Error", err); + }); + } + }); + }; + }, + ], + bindings: { + action: "=", + callback: "&", + }, +}); + sharedComponents.component("quillEditor", { templateUrl: "/mix-app/views/app-shared/components/quill-editor/view.html", controller: [ @@ -8186,73 +8248,30 @@ sharedComponents.component("quillEditor", { }, }); -sharedComponents.component("recaptcha", { - templateUrl: "/mix-app/views/app-shared/components/recaptcha/recaptcha.html", +sharedComponents.component("codeEditor", { + templateUrl: "codeEditor.html", + bindings: { + product: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + +sharedComponents.component("serviceHub", { + templateUrl: "/mix-app/views/app-shared/components/service-hub/view.html", + bindings: { + hubName: "=", + }, controller: [ "$rootScope", - "ApiService", - "CommonService", - function ($rootScope, apiService, commonService) { + "$scope", + function ($rootScope, $scope) { var ctrl = this; - ctrl.shortenString = ""; - ctrl.previousContentId = undefined; - ctrl.recaptcha_key = null; - ctrl.token = null; - this.$onInit = () => { - ctrl.recaptcha_key = $rootScope.globalSettings.data.Recaptcha_Key; - ctrl.recaptcha_secret = $rootScope.globalSettings.data.Recaptcha_Secret; - grecaptcha.ready(function () { - grecaptcha - .execute(ctrl.recaptcha_key, { action: ctrl.action }) - .then(function (token) { - ctrl.token = token; - }); - }); - }; - ctrl.verify = function () { - var url = "https://www.google.com/recaptcha/api/siteverify"; - var data = { - secret: ctrl.recaptcha_secret, - response: ctrl.token, - }; - var req = { - method: "POST", - url: url, - data: data, - }; - return apiService.getApiResult(req).then(function (response) { - if (response.success) { - ctrl.callback(); - } else { - angular.forEach(response.error - codes, function (err) { - commonService.showAlertMsg("Recaptcha Error", err); - }); - } - }); - }; - }, - ], - bindings: { - action: "=", - callback: "&", - }, -}); - -sharedComponents.component("serviceHub", { - templateUrl: "/mix-app/views/app-shared/components/service-hub/view.html", - bindings: { - hubName: "=", - }, - controller: [ - "$rootScope", - "$scope", - function ($rootScope, $scope) { - var ctrl = this; - BaseHub.call(this, ctrl); - - ctrl.user = { - loggedIn: false, - connection: {}, + BaseHub.call(this, ctrl); + + ctrl.user = { + loggedIn: false, + connection: {}, }; ctrl.isHide = true; ctrl.hideContact = true; @@ -8543,15 +8562,6 @@ sharedComponents.component("snowy", { bindings: {}, }); -sharedComponents.component("codeEditor", { - templateUrl: "codeEditor.html", - bindings: { - product: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - sharedComponents.component("starRating", { templateUrl: "/mix-app/views/app-shared/components/star-rating/star-rating.html", @@ -8610,142 +8620,6 @@ sharedComponents.component("statuses", { }, }); -"use trick"; -sharedComponents.directive("paneV", function () { - return { - require: "^tabs-v", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@", class: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabsV", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/tabs-verticle/tabs.html", - replace: true, - }; -}); - -"use trick"; -sharedComponents.directive("pane", function () { - return { - require: "^tabs", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabs", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", - replace: true, - }; -}); - -"use trick"; -sharedComponents.directive("paneH", function () { - return { - require: "^tabs-h", - restrict: "E", - transclude: true, - scope: { header: "@", id: "@", icon: "@" }, - link: function (scope, element, attrs, tabsController) { - tabsController.addPane(scope); - }, - template: - '
    ' + - "
    ", - replace: true, - }; -}); - -sharedComponents.directive("tabsH", function () { - return { - restrict: "E", - transclude: true, - scope: { - selectCallback: "&", - }, - controller: function ($scope, $element) { - var panes = ($scope.panes = []); - - $scope.select = function (pane) { - angular.forEach(panes, function (pane) { - pane.selected = false; - }); - pane.selected = true; - this.selectCallback({ pane: pane }); - }; - - this.addPane = function (pane) { - if (panes.length === 0) $scope.select(pane); - panes.push(pane); - }; - }, - templateUrl: - "/mix-app/views/app-shared/components/tabs-horizontal/tabs.html", - replace: true, - }; -}); - sharedComponents.component("mixStore", { templateUrl: "/mix-app/views/app-shared/components/store/view.html", bindings: { @@ -8886,6 +8760,142 @@ sharedComponents.component("mixStore", { ], }); +"use trick"; +sharedComponents.directive("pane", function () { + return { + require: "^tabs", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabs", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/tabs/tabs.html", + replace: true, + }; +}); + +"use trick"; +sharedComponents.directive("paneH", function () { + return { + require: "^tabs-h", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabsH", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: + "/mix-app/views/app-shared/components/tabs-horizontal/tabs.html", + replace: true, + }; +}); + +"use trick"; +sharedComponents.directive("paneV", function () { + return { + require: "^tabs-v", + restrict: "E", + transclude: true, + scope: { header: "@", id: "@", icon: "@", class: "@" }, + link: function (scope, element, attrs, tabsController) { + tabsController.addPane(scope); + }, + template: + '
    ' + + "
    ", + replace: true, + }; +}); + +sharedComponents.directive("tabsV", function () { + return { + restrict: "E", + transclude: true, + scope: { + selectCallback: "&", + }, + controller: function ($scope, $element) { + var panes = ($scope.panes = []); + + $scope.select = function (pane) { + angular.forEach(panes, function (pane) { + pane.selected = false; + }); + pane.selected = true; + this.selectCallback({ pane: pane }); + }; + + this.addPane = function (pane) { + if (panes.length === 0) $scope.select(pane); + panes.push(pane); + }; + }, + templateUrl: "/mix-app/views/app-shared/components/tabs-verticle/tabs.html", + replace: true, + }; +}); + sharedComponents.component("tags", { templateUrl: "/mix-app/views/app-shared/components/tags/tags.html", controller: [ @@ -8929,58 +8939,6 @@ sharedComponents.component("tagsView", { }, }); -sharedComponents.component("tuiEditor", { - templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", - controller: [ - "$rootScope", - "$scope", - "$element", - "ngAppSettings", - function ($rootScope, $scope, $element, ngAppSettings) { - var ctrl = this; - ctrl.previousId = null; - ctrl.editor = null; - ctrl.init = function () { - ctrl.guid = $rootScope.generateUUID(); - setTimeout(() => { - ctrl.editor = new tui.Editor({ - el: document.querySelector("#tui-" + ctrl.guid), - initialEditType: "markdown", - previewStyle: "vertical", - height: "300px", - initialValue: ctrl.content, - events: { - // change: ctrl.updateContent, - // focus: () => onFocus(), - blur: () => ctrl.updateContent(), - }, - }); - ctrl.toolbar = ctrl.editor.getUI().getToolbar(); - ctrl.toolbar.addButton( - { - name: "fullscreen", - tooltip: "fullscreen", - $el: $( - '' - ), - }, - 1 - ); - }, 100); - }; - window.fsClick = function () { - $(".tui-editor-defaultUI").toggleClass("fs"); - }; - ctrl.updateContent = function () { - ctrl.content = ctrl.editor.getMarkdown(); - }; - }, - ], - bindings: { - content: "=", - }, -}); - sharedComponents.component("trumbowyg", { templateUrl: "/mix-app/views/app-shared/components/trumbowyg/trumbowyg.html", bindings: { @@ -9025,7 +8983,13 @@ sharedComponents.component("trumbowyg", { plugins: { removeformatPasted: false, imageWidthModalEdit: true, - semantic: false, + resetCss: true, + tagsToRemove: ["p"], + tagClasses: { + p: "p", + h1: "h1", + blockquote: "bg-grey-100 rounded-xl", + }, btnsDef: { // Customizables dropdowns image: { @@ -9145,6 +9109,58 @@ sharedComponents.component("trumbowyg", { ], }); +sharedComponents.component("tuiEditor", { + templateUrl: "/mix-app/views/app-shared/components/tui-editor/view.html", + controller: [ + "$rootScope", + "$scope", + "$element", + "ngAppSettings", + function ($rootScope, $scope, $element, ngAppSettings) { + var ctrl = this; + ctrl.previousId = null; + ctrl.editor = null; + ctrl.init = function () { + ctrl.guid = $rootScope.generateUUID(); + setTimeout(() => { + ctrl.editor = new tui.Editor({ + el: document.querySelector("#tui-" + ctrl.guid), + initialEditType: "markdown", + previewStyle: "vertical", + height: "300px", + initialValue: ctrl.content, + events: { + // change: ctrl.updateContent, + // focus: () => onFocus(), + blur: () => ctrl.updateContent(), + }, + }); + ctrl.toolbar = ctrl.editor.getUI().getToolbar(); + ctrl.toolbar.addButton( + { + name: "fullscreen", + tooltip: "fullscreen", + $el: $( + '' + ), + }, + 1 + ); + }, 100); + }; + window.fsClick = function () { + $(".tui-editor-defaultUI").toggleClass("fs"); + }; + ctrl.updateContent = function () { + ctrl.content = ctrl.editor.getMarkdown(); + }; + }, + ], + bindings: { + content: "=", + }, +}); + sharedComponents.component("uploadCroppie", { templateUrl: "/mix-app/views/app-shared/components/upload-croppie/view.html?v=1", @@ -9377,47 +9393,6 @@ sharedComponents.component("uploadCroppie", { ], }); -sharedComponents.component("youtubeEditor", { - templateUrl: - "/mix-app/views/app-shared/components/youtube-editor/youtube-editor.html", - controller: [ - "$rootScope", - "$scope", - "$sce", - function ($rootScope, $scope, $sce) { - var ctrl = this; - ctrl.isPlay = false; - ctrl.loadVideo = function () { - ctrl.isPlay = false; - ctrl.src = ""; - if (ctrl.code) { - ctrl.img = - "https://img.youtube.com/vi/" + ctrl.code + "/sddefault.jpg"; - } - }; - ctrl.playVideo = function () { - ctrl.isPlay = true; - ctrl.src = $sce.trustAsResourceUrl( - "https://www.youtube.com/embed/" + - ctrl.code + - "?rel=0&showinfo=0&autoplay=1" - ); - }; - ctrl.searchVideo = function () { - // search - $rootScope.preview( - "message", - "ToDo: Integrate youtube search (https://developers.google.com/youtube/v3/docs/search/list) \r\n PATH: portal-app/app/app-shared/components/youtube-editor/youtube-editor.js" - ); - }; - }, - ], - bindings: { - code: "=", - hideInput: "=?", - }, -}); - "use strict"; appShared.controller("VideoCallController", [ "$scope", @@ -9751,6 +9726,47 @@ sharedComponents.component("videoCall", { }, }); +sharedComponents.component("youtubeEditor", { + templateUrl: + "/mix-app/views/app-shared/components/youtube-editor/youtube-editor.html", + controller: [ + "$rootScope", + "$scope", + "$sce", + function ($rootScope, $scope, $sce) { + var ctrl = this; + ctrl.isPlay = false; + ctrl.loadVideo = function () { + ctrl.isPlay = false; + ctrl.src = ""; + if (ctrl.code) { + ctrl.img = + "https://img.youtube.com/vi/" + ctrl.code + "/sddefault.jpg"; + } + }; + ctrl.playVideo = function () { + ctrl.isPlay = true; + ctrl.src = $sce.trustAsResourceUrl( + "https://www.youtube.com/embed/" + + ctrl.code + + "?rel=0&showinfo=0&autoplay=1" + ); + }; + ctrl.searchVideo = function () { + // search + $rootScope.preview( + "message", + "ToDo: Integrate youtube search (https://developers.google.com/youtube/v3/docs/search/list) \r\n PATH: portal-app/app/app-shared/components/youtube-editor/youtube-editor.js" + ); + }; + }, + ], + bindings: { + code: "=", + hideInput: "=?", + }, +}); + /*! * angular-loading-bar v0.9.0 * https://chieffancypants.github.io/angular-loading-bar diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html index 8e463863c..495964d1d 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html @@ -1 +1 @@ -
    Additional Data Columns
    Column:
    Type {{col.dataType}}
    Width
    Height


    Column:
    Type
    \ No newline at end of file +
    Additional Data Columns
    Column:
    Type {{col.dataType}}
    Width
    Height


    Column:
    Type
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/media-file-upload/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/media-file-upload/view.html index 8e091a159..225403a3d 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/media-file-upload/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/media-file-upload/view.html @@ -1 +1 @@ -
    {{$ctrl.header}}
    View
    URL

    Loaded {{$ctrl.progress}}%

    \ No newline at end of file +
    {{$ctrl.header}}
    View
    URL

    Loaded {{$ctrl.progress}}%

    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html index 0543b194c..ba5b07d14 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-shared/components/mix-column-editor/view.html @@ -1 +1 @@ -
    Loading...
    {{$ctrl.translate($ctrl.column.name)}}: {{$ctrl.translate($ctrl.column.dataType)}}
    \ No newline at end of file +
    Loading...
    {{$ctrl.translate($ctrl.column.name)}}: {{$ctrl.translate($ctrl.column.dataType)}}
    \ No newline at end of file From e00c77705f49a5717f79a97d81a2c20344d08777 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Sun, 5 Sep 2021 02:06:07 +0700 Subject: [PATCH 17/83] Add User register to FE app --- .../MixDatabaseDataPortalController.cs | 24 +- .../Controllers/v1/ApiAccountController.cs | 92 +++- src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs | 27 +- .../Account/MixRegisterViewModel.cs | 4 + .../MixDatabaseDatas/AdditionalViewModel.cs | 1 + .../ViewModels/MixDatabaseDatas/Helper.cs | 21 + .../ViewModels/MixPages/ReadMvcViewModel.cs | 2 +- .../ViewModels/SiteStructureViewModel.cs | 2 +- src/Mix.Cms.Web/MixContent/mix-cms1.db-shm | Bin 0 -> 32768 bytes src/Mix.Cms.Web/MixContent/mix-cms1.db-wal | 0 .../wwwroot/mix-app/js/app-client.min.js | 429 +++++++++++++----- .../components/additional-column/view.html | 2 +- .../main-side-bar-item-dynamic.html | 2 +- .../app-portal/pages/permission/list.html | 2 +- 14 files changed, 441 insertions(+), 167 deletions(-) create mode 100644 src/Mix.Cms.Web/MixContent/mix-cms1.db-shm create mode 100644 src/Mix.Cms.Web/MixContent/mix-cms1.db-wal diff --git a/src/Mix.Cms.Api.RestFul/Controllers/v1/MixDatabaseDatas/MixDatabaseDataPortalController.cs b/src/Mix.Cms.Api.RestFul/Controllers/v1/MixDatabaseDatas/MixDatabaseDataPortalController.cs index 0eed8ba00..8ec678799 100644 --- a/src/Mix.Cms.Api.RestFul/Controllers/v1/MixDatabaseDatas/MixDatabaseDataPortalController.cs +++ b/src/Mix.Cms.Api.RestFul/Controllers/v1/MixDatabaseDatas/MixDatabaseDataPortalController.cs @@ -124,36 +124,16 @@ public async Task SaveAdditionalData([FromBody] AdditionalViewMod [HttpGet("init/{mixDatabase}")] public async Task> Init(string mixDatabase) { - var formData = await getFormDataAsync(mixDatabase); + var formData = await Helper.GetFormDataAsync(mixDatabase, _lang); return formData != null ? Ok(formData) : BadRequest(mixDatabase); } - private async Task getFormDataAsync(string mixDatabase) - { - _ = int.TryParse(mixDatabase, out int mixDatabaseId); - var getAttrSet = await Lib.ViewModels.MixDatabases.UpdateViewModel.Repository.GetSingleModelAsync(m => m.Name == mixDatabase || m.Id == mixDatabaseId); - if (getAttrSet.IsSucceed) - { - FormViewModel result = new FormViewModel() - { - Specificulture = _lang, - MixDatabaseId = getAttrSet.Data.Id, - MixDatabaseName = getAttrSet.Data.Name, - Status = MixContentStatus.Published, - Columns = getAttrSet.Data.Columns - }; - result.ExpandView(); - return result; - } - return null; - } - [HttpPost("save-data/{mixDatabase}")] public async Task> SaveData([FromRoute]string mixDatabase, [FromBody] JObject data) { - var formData = await getFormDataAsync(mixDatabase); + var formData = await Helper.GetFormDataAsync(mixDatabase, _lang); if (formData!=null) { formData.Obj = data; diff --git a/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs b/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs index 1c4824420..4aa17d1f4 100644 --- a/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs +++ b/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs @@ -72,7 +72,7 @@ public async Task> Logout() } [Route("login")] - [HttpPost, HttpOptions] + [HttpPost] [AllowAnonymous] public async Task Login([FromBody] JObject data) { @@ -89,6 +89,20 @@ public async Task Login([FromBody] JObject data) return BadRequest(loginResult.Errors); } + [Route("user-login")] + [HttpPost] + [AllowAnonymous] + public async Task UserLogin([FromBody] LoginViewModel model) + { + RepositoryResponse loginResult = new RepositoryResponse(); + loginResult = await _idService.Login(model); + if (loginResult.IsSucceed) + { + return Ok(loginResult.Data); + } + return BadRequest(loginResult.Errors); + } + [Route("external-login")] [HttpPost] [AllowAnonymous] @@ -114,7 +128,7 @@ public async Task> RefreshToken([FromBody] RenewToke } [Route("Register")] - [HttpPost, HttpOptions] + [HttpPost] [AllowAnonymous] public async Task>> Register([FromBody] MixRegisterViewModel model) { @@ -134,6 +148,20 @@ public async Task>> Regist var createResult = await _userManager.CreateAsync(user, password: model.Password).ConfigureAwait(false); if (createResult.Succeeded) { + // Save Additional Data + var formData = await Mix.Cms.Lib.ViewModels.MixDatabaseDatas.Helper.GetFormDataAsync( + MixDatabaseNames.SYSTEM_USER_DATA, MixService.GetAppSetting("DefaultCulture")); + if (formData != null) + { + formData.ParentId = user.UserName; + formData.ParentType = MixDatabaseParentType.User; + formData.Obj = model.UserData; + var saveData = await formData.SaveModelAsync(true); + result.IsSucceed = saveData.IsSucceed; + result.Errors = saveData.Errors; + result.Exception = saveData.Exception; + } + _logger.LogInformation("User created a new account with password."); user = await _userManager.FindByNameAsync(model.Username).ConfigureAwait(false); var rsaKeys = RSAEncryptionHelper.GenerateKeys(); @@ -172,7 +200,7 @@ public async Task> ManageUserInRole([FromBody] UserRole { var role = await _roleManager.FindByIdAsync(model.RoleId); var result = new RepositoryResponse(); - + List errors = new List(); if (role == null) @@ -264,7 +292,7 @@ public async Task> MyProfile() return BadRequest(); } - // POST api/template + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [MixAuthorize] [HttpPost] @@ -312,6 +340,62 @@ public async Task> Save( return result; } + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + [HttpPost] + [Route("save-my-profile")] + public async Task> SaveMyProfile( + [FromBody] MixUserViewModel model) + { + var result = new RepositoryResponse() { IsSucceed = true }; + string id = User.Claims.SingleOrDefault(c => c.Type == "Id")?.Value; + + + if (model != null && model.User != null) + { + if (id != model.User.Id) + { + result.IsSucceed = false; + result.Errors.Add("Invalid request"); + return result; + } + + var user = await _userManager.FindByIdAsync(model.User.Id); + user.Email = model.User.Email; + user.FirstName = model.User.FirstName; + user.LastName = model.User.LastName; + user.Avatar = model.User.Avatar; + var updInfo = await _userManager.UpdateAsync(user); + result.IsSucceed = updInfo.Succeeded; + if (result.IsSucceed) + { + var saveData = await model.UserData.SaveModelAsync(true); + result.IsSucceed = saveData.IsSucceed; + result.Errors = saveData.Errors; + result.Exception = saveData.Exception; + } + if (result.IsSucceed && model.IsChangePassword) + { + var changePwd = await _userManager.ChangePasswordAsync(model.User, model.ChangePassword.CurrentPassword, model.ChangePassword.NewPassword); + if (!changePwd.Succeeded) + { + foreach (var err in changePwd.Errors) + { + result.Errors.Add(err.Description); + } + } + else + { + // Remove other token if change password success + var refreshToken = User.Claims.SingleOrDefault(c => c.Type == "RefreshToken")?.Value; + await RefreshTokenViewModel.Repository.RemoveModelAsync(r => r.Id != refreshToken); + } + } + MixFileRepository.Instance.EmptyFolder($"{MixFolders.MixCacheFolder}/Mix/Cms/Lib/ViewModels/Account/MixUsers/_{model.User.Id}"); + return result; + } + return result; + } + // POST api/account/list [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [MixAuthorize] diff --git a/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs b/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs index 5f287a563..63f4244aa 100644 --- a/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs +++ b/src/Mix.Cms.Lib/Helpers/MixCmsHelper.cs @@ -607,25 +607,28 @@ public static string TranslateUrl(string url, string srcCulture, string destCult : $"/{destCulture}{url}"; } - public static string BuildUrl(HttpContext context, NameValueCollection nameValueCollection) - { - var request = context.Request; - var uri = string.Format("{0}://{1}{2}", request.Scheme, request.Host, request.Path); - var queryString = HttpUtility.ParseQueryString(request.QueryString.Value); - var uriBuilder = new UriBuilder(uri); - queryString.Add(nameValueCollection); - uriBuilder.Query = queryString.ToString(); - return uriBuilder.ToString(); - } - public static string BuildUrl(HttpContext context, string key, string value) { var nameValueCollection = new NameValueCollection { { key, value } }; + var request = context.Request; + var uri = string.Format("{0}://{1}{2}", request.Scheme, request.Host, request.Path); + var queryString = HttpUtility.ParseQueryString(request.QueryString.Value); + + var uriBuilder = new UriBuilder(uri); - return BuildUrl(context, nameValueCollection); + if (context.Request.Query.ContainsKey(key)) + { + queryString.Set(key, value); + } + else + { + queryString.Add(nameValueCollection); + } + uriBuilder.Query = queryString.ToString(); + return uriBuilder.ToString(); } } } \ No newline at end of file diff --git a/src/Mix.Cms.Lib/ViewModels/Account/MixRegisterViewModel.cs b/src/Mix.Cms.Lib/ViewModels/Account/MixRegisterViewModel.cs index 7eeec1fc5..79106f296 100644 --- a/src/Mix.Cms.Lib/ViewModels/Account/MixRegisterViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/Account/MixRegisterViewModel.cs @@ -11,6 +11,7 @@ using Mix.Infrastructure.Repositories; using Mix.Services; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -104,6 +105,9 @@ public string AvatarUrl { [JsonProperty("mediaFile")] public FileViewModel MediaFile { get; set; } = new FileViewModel(); + [JsonProperty("userData")] + public JObject UserData { get; set; } + #endregion Views #endregion Properties diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/AdditionalViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/AdditionalViewModel.cs index 9c1602e9f..b4ea50902 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/AdditionalViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/AdditionalViewModel.cs @@ -117,6 +117,7 @@ public override void ExpandView(MixCmsContext _context = null, IDbContextTransac .Where(v => v.Column != null && !Columns.Any(f => f.Id == v.Column?.Id)) .Select(v => v.Column) .ToList()); + Columns = Columns.OrderBy(c => c.Priority).ToList(); var properties = getValues.Data.Select(m => m.ToJProperty(_context, _transaction)); Obj = new JObject( new JProperty("id", Id), diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs index 6321afca0..542a3a905 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs @@ -167,6 +167,27 @@ public static async Task> LoadAdditional } } + public static async Task GetFormDataAsync(string mixDatabase, string culture) + { + _ = int.TryParse(mixDatabase, out int mixDatabaseId); + var getAttrSet = await MixDatabases.UpdateViewModel.Repository.GetSingleModelAsync( + m => m.Name == mixDatabase || m.Id == mixDatabaseId); + if (getAttrSet.IsSucceed) + { + FormViewModel result = new FormViewModel() + { + Specificulture = culture, + MixDatabaseId = getAttrSet.Data.Id, + MixDatabaseName = getAttrSet.Data.Name, + Status = MixContentStatus.Published, + Columns = getAttrSet.Data.Columns + }; + result.ExpandView(); + return result; + } + return null; + } + public static RepositoryResponse LoadAdditionalData( MixDatabaseParentType parentType, string parentId, diff --git a/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs b/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs index 9548db597..3d317e02f 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixPages/ReadMvcViewModel.cs @@ -245,7 +245,7 @@ public void LoadData(int? pageSize = null, int? pageIndex = null Expression> postExp = null; foreach (var item in Modules) { - item.Module.LoadData(_context: context, _transaction: transaction); + item.Module.LoadData(_context: context, _transaction: transaction, pageIndex: pageIndex); } switch (Type) { diff --git a/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs b/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs index 1fcdfa50c..e1d3c59e0 100644 --- a/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/SiteStructureViewModel.cs @@ -108,7 +108,7 @@ public RepositoryResponse ExportSelectedItemsAsync() if (IsIncludePermissions) { - Permissions = MixPortalPages.UpdateViewModel.Repository.GetModelList(context, transaction).Data; + Permissions = MixPortalPages.UpdateViewModel.Repository.GetModelListBy(m => m.Level == 0, context, transaction).Data; } ExportPages(context, transaction); diff --git a/src/Mix.Cms.Web/MixContent/mix-cms1.db-shm b/src/Mix.Cms.Web/MixContent/mix-cms1.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 zcmeIuAr62r3 { - FB.XFBML.parse(); - }, 200); - }; - }, - ], - bindings: { - fbPageId: "=", - themeColor: "=", - inGreeting: "=", - outGreeting: "=", - }, -}); - modules.component("booking", { templateUrl: "/mix-app/views/app-client/components/booking/index.html", controller: [ @@ -462,6 +440,28 @@ modules.component("booking", { }, }); +modules.component("fbCustomerChat", { + templateUrl: + "/mix-app/views/app-client/components/fb-customer-chat/view.html", + controller: [ + "$location", + function ($location) { + var ctrl = this; + this.$onInit = function () { + setTimeout(() => { + FB.XFBML.parse(); + }, 200); + }; + }, + ], + bindings: { + fbPageId: "=", + themeColor: "=", + inGreeting: "=", + outGreeting: "=", + }, +}); + modules.component("fbLike", { templateUrl: "/mix-app/views/app-client/components/fb-like/fb-like.html", controller: [ @@ -1995,6 +1995,121 @@ modules.component("haiyenLoader", { bindings: {}, }); +modules.component("tclLogin", { + binding: { + user: "=", + }, + templateUrl: "/mix-app/views/app-client/components/customs/login/view.html", + controller: [ + "$scope", + "$rootScope", + "RestMixDatabaseDataClientService", + function ($scope, $rootScope, service) { + var ctrl = this; + ctrl.loginData = { + username: "", + password: "", + pageSize: 1, + pageIndex: 0, + mixDatabaseName: "tcl_user", + filterType: "equal", + }; + ctrl.$onInit = async function () {}; + ctrl.isBusy = false; + ctrl.translate = $rootScope.translate; + ctrl.submit = async function () { + $rootScope.isBusy = true; + var result = await service.getList(ctrl.loginData); + if (result.isSucceed) { + if (result.data.totalItems > 0) { + if ( + result.data.items[0].obj.password == ctrl.loginData.password && + result.data.items[0].obj.username == ctrl.loginData.username + ) { + ctrl.onSuccess(result); + } else { + ctrl.onFail(result); + } + } else { + ctrl.onFail(result); + } + $rootScope.isBusy = false; + $scope.$apply(); + } else { + ctrl.onFail(result); + ctrl.isBusy = false; + $scope.$apply(); + } + }; + + ctrl.onSuccess = function (result) { + $rootScope.isLogin = true; + ctrl.user = result.data.items[0]; + $rootScope.user = result.data.items[0]; + $scope.$apply(); + }; + + ctrl.onFail = function (result) { + ctrl.msg = { + color: "red", + text: "Sai tên đăng nhập hoặc mật khẩu!", + }; + }; + }, + ], +}); + +modules.component("haiyenSubscriber", { + binding: {}, + templateUrl: + "/mix-app/views/app-client/components/customs/subscriber/view.html", + controller: [ + "$scope", + "$rootScope", + "RestMixDatabaseDataClientService", + function ($scope, $rootScope, service) { + var ctrl = this; + ctrl.subscriber = null; + ctrl.formName = "subscribers"; + ctrl.$onInit = async function () { + var initData = await service.initData(ctrl.formName); + if (initData.isSucceed) { + ctrl.default = initData.data; + ctrl.subscriber = angular.copy(ctrl.default); + $scope.$apply(); + } + }; + ctrl.isBusy = false; + ctrl.submit = async function () { + ctrl.isBusy = true; + var result = await service.save(ctrl.subscriber); + if (result.isSucceed) { + ctrl.onSuccess(result); + ctrl.subscriber = angular.copy(ctrl.default); + ctrl.isBusy = false; + } else { + ctrl.onFail(result); + ctrl.isBusy = false; + } + $scope.$apply(); + }; + ctrl.onSuccess = function (result) { + ctrl.msg = { + color: "green", + text: "Cám ơn bạn đã đăng ký thành công!", + }; + }; + + ctrl.onFail = function (result) { + ctrl.msg = { + color: "red", + text: result.errors[0], + }; + }; + }, + ], +}); + modules.component("tclOrder", { binding: { user: "=", @@ -2226,117 +2341,183 @@ modules.component("tclOrder", { ], }); -modules.component("tclLogin", { - binding: { - user: "=", - }, - templateUrl: "/mix-app/views/app-client/components/customs/login/view.html", - controller: [ - "$scope", - "$rootScope", - "RestMixDatabaseDataClientService", - function ($scope, $rootScope, service) { - var ctrl = this; - ctrl.loginData = { - username: "", - password: "", - pageSize: 1, - pageIndex: 0, - mixDatabaseName: "tcl_user", - filterType: "equal", - }; - ctrl.$onInit = async function () {}; - ctrl.isBusy = false; - ctrl.translate = $rootScope.translate; - ctrl.submit = async function () { - $rootScope.isBusy = true; - var result = await service.getList(ctrl.loginData); - if (result.isSucceed) { - if (result.data.totalItems > 0) { - if ( - result.data.items[0].obj.password == ctrl.loginData.password && - result.data.items[0].obj.username == ctrl.loginData.username - ) { - ctrl.onSuccess(result); - } else { - ctrl.onFail(result); - } - } else { - ctrl.onFail(result); - } - $rootScope.isBusy = false; - $scope.$apply(); +app.controller("UserController", [ + "$rootScope", + "$scope", + "AuthService", + "UserService", + function ($rootScope, $scope, authService, userService) { + $scope.loginData = { + userName: "", + password: "", + rememberme: true, + }; + $scope.user = { + firstName: "", + lastName: "", + username: "", + email: "", + password: "", + userData: {}, + }; + $scope.init = function () { + authService.fillAuthData().then((resp) => { + if (authService.authentication.info) { + $scope.showLogin = false; + $scope.userData = authService.authentication.info.userData.obj; } else { - ctrl.onFail(result); - ctrl.isBusy = false; - $scope.$apply(); + $scope.showLogin = true; } - }; + }); + }; + $scope.logout = function () { + authService.logOut(); + window.top.location = window.top.location; + }; + $scope.login = async function () { + var result = await authService.login($scope.loginData); + if (result.isSucceed) { + window.top.location = window.top.location; + } else { + alert(result.errors[0]); + } + }; - ctrl.onSuccess = function (result) { - $rootScope.isLogin = true; - ctrl.user = result.data.items[0]; - $rootScope.user = result.data.items[0]; + $scope.register = async function () { + $rootScope.isBusy = true; + var resp = await userService.register($scope.user); + if (resp && resp.isSucceed) { + $scope.activedUser = resp.data; + $rootScope.showMessage("Update successfully!", "success"); + $rootScope.isBusy = false; $scope.$apply(); - }; - - ctrl.onFail = function (result) { - ctrl.msg = { - color: "red", - text: "Sai tên đăng nhập hoặc mật khẩu!", - }; - }; - }, - ], -}); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; -modules.component("haiyenSubscriber", { - binding: {}, - templateUrl: - "/mix-app/views/app-client/components/customs/subscriber/view.html", - controller: [ - "$scope", - "$rootScope", - "RestMixDatabaseDataClientService", - function ($scope, $rootScope, service) { - var ctrl = this; - ctrl.subscriber = null; - ctrl.formName = "subscribers"; - ctrl.$onInit = async function () { - var initData = await service.initData(ctrl.formName); - if (initData.isSucceed) { - ctrl.default = initData.data; - ctrl.subscriber = angular.copy(ctrl.default); - $scope.$apply(); + $scope.getMyProfile = async function () { + $rootScope.isBusy = true; + var response = await userService.getMyProfile(); + if (response.isSucceed) { + $scope.activedUser = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.save = async function () { + $rootScope.isBusy = true; + var resp = await userService.saveUser($scope.activedUser); + if (resp && resp.isSucceed) { + $rootScope.showMessage("Update successfully!", "success"); + if ($scope.activedUser.id == authService.authentication.id) { + authService + .refreshToken( + authService.authentication.refresh_token, + authService.authentication.access_token + ) + .then(() => { + window.location = window.location; + }); } - }; - ctrl.isBusy = false; - ctrl.submit = async function () { - ctrl.isBusy = true; - var result = await service.save(ctrl.subscriber); - if (result.isSucceed) { - ctrl.onSuccess(result); - ctrl.subscriber = angular.copy(ctrl.default); - ctrl.isBusy = false; - } else { - ctrl.onFail(result); - ctrl.isBusy = false; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); } + $rootScope.isBusy = false; $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("RestNavigationService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = angular.copy(baseService); + serviceFactory.init("mix-database-data/navigation"); + var _initData = async function (mixDatabaseName) { + var url = this.prefixUrl + "/init/" + mixDatabaseName; + var req = { + method: "GET", + url: url, + }; + return await apiService.getRestApiResult(req); + }; + + var _export = async function (objData) { + var data = serviceFactory.parseQuery(objData); + var url = this.prefixUrl; + + if (data) { + url += "/export?"; + url = url.concat(data); + } + var req = { + method: "GET", + url: url, }; - ctrl.onSuccess = function (result) { - ctrl.msg = { - color: "green", - text: "Cám ơn bạn đã đăng ký thành công!", - }; + return await apiService.getRestApiResult(req); + }; + + serviceFactory.initData = _initData; + serviceFactory.export = _export; + return serviceFactory; + }, +]); + +"use strict"; +app.factory("UserService", [ + "ApiService", + function (apiService) { + var usersServiceFactory = {}; + + var _getMyProfile = async function () { + var apiUrl = "/account/"; + var url = apiUrl + "my-profile"; + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; + + var _saveUser = async function (user) { + var apiUrl = "/account/"; + var req = { + method: "POST", + url: apiUrl + "save-my-profile", + data: JSON.stringify(user), }; + return await apiService.getApiResult(req); + }; - ctrl.onFail = function (result) { - ctrl.msg = { - color: "red", - text: result.errors[0], - }; + var _register = async function (user) { + var apiUrl = "/account/"; + var req = { + method: "POST", + url: apiUrl + "register", + data: JSON.stringify(user), }; - }, - ], -}); + return await apiService.getApiResult(req); + }; + + usersServiceFactory.getMyProfile = _getMyProfile; + usersServiceFactory.saveUser = _saveUser; + usersServiceFactory.register = _register; + return usersServiceFactory; + }, +]); diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html index 495964d1d..e554fda43 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/additional-column/view.html @@ -1 +1 @@ -
    Additional Data Columns
    Column:
    Type {{col.dataType}}
    Width
    Height


    Column:
    Type
    \ No newline at end of file +
    Additional Data Columns
    Column:
    Type {{col.dataType}}
    Width
    Height


    Column:
    Type
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html index 7a5a3eb20..73d875901 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/main-side-bar-item-dynamic/main-side-bar-item-dynamic.html @@ -1 +1 @@ -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/permission/list.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/permission/list.html index ad6b81b61..979814a08 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/permission/list.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/permission/list.html @@ -1 +1 @@ -
    KeywordDefaultUrlCreated Date
    {{item.post.createdDateTime | utcToLocal:'dd.MM.yy hh:mm a'}}
    \ No newline at end of file +
    KeywordDefaultUrlCreated Date
    {{item.post.createdDateTime | utcToLocal:'dd.MM.yy hh:mm a'}}
    \ No newline at end of file From aab2c85fd30d6da19ca1a9a1d5f225279b22ef63 Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Sun, 5 Sep 2021 22:37:26 +0700 Subject: [PATCH 18/83] fix portal --- src/Mix.Cms.Web/MixContent/mix-cms1.db-shm | Bin 32768 -> 0 bytes src/Mix.Cms.Web/MixContent/mix-cms1.db-wal | 0 src/Mix.Cms.Web/Views/Home/Index.cshtml | 2 +- src/Mix.Cms.Web/Views/Page/Index.cshtml | 2 +- src/Mix.Cms.Web/Views/Post/Index.cshtml | 2 +- .../wwwroot/mix-app/js/app-portal.min.js | 4767 +++++++++-------- .../components/header-nav/headerNav.html | 2 +- .../app-portal/pages/configuration/list.html | 2 +- 8 files changed, 2390 insertions(+), 2387 deletions(-) delete mode 100644 src/Mix.Cms.Web/MixContent/mix-cms1.db-shm delete mode 100644 src/Mix.Cms.Web/MixContent/mix-cms1.db-wal diff --git a/src/Mix.Cms.Web/MixContent/mix-cms1.db-shm b/src/Mix.Cms.Web/MixContent/mix-cms1.db-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3@(MixService.GetConfig("SiteName", ViewBag.culture)) - @Model.SeoTitle + @Model.SeoTitle diff --git a/src/Mix.Cms.Web/Views/Page/Index.cshtml b/src/Mix.Cms.Web/Views/Page/Index.cshtml index 8b1f23076..7405039e7 100644 --- a/src/Mix.Cms.Web/Views/Page/Index.cshtml +++ b/src/Mix.Cms.Web/Views/Page/Index.cshtml @@ -50,7 +50,7 @@ else string image = ViewData["OgImage"] != null ? (string)ViewData["OgImage"] : Model.ThumbnailUrl; } @section Seo{ - @(MixService.GetConfig<string>("SiteName", ViewBag.culture)) - @Model.SeoTitle + @Model.SeoTitle diff --git a/src/Mix.Cms.Web/Views/Post/Index.cshtml b/src/Mix.Cms.Web/Views/Post/Index.cshtml index dad90debe..8677be1b9 100644 --- a/src/Mix.Cms.Web/Views/Post/Index.cshtml +++ b/src/Mix.Cms.Web/Views/Post/Index.cshtml @@ -54,7 +54,7 @@ else var domain = url.IndexOf("http") == -1 ? $"{Context.Request.Scheme}://{Context.Request.Host}" : string.Empty; } @section Seo{ - @(MixService.GetConfig<string>("SiteName", ViewBag.culture)) - @Model.SeoTitle + @Model.SeoTitle diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js index 4cb8e2e19..9fe8a9476 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal.min.js @@ -1,4 +1,4 @@ -/* Fri Sep 03 2021 12:25:04 GMT+0700 (Indochina Time) */"use strict"; +/* Sun Sep 05 2021 22:19:44 GMT+0700 (Indochina Time) */"use strict"; var app = angular.module("MixPortal", [ "angularCroppie", "ui.bootstrap", @@ -368,13 +368,16 @@ app.controller("ConfigurationController", [ ngAppSettings, service ); - + $scope.init = function () { + $scope.request.category = $routeParams.category; + $scope.getList(); + }; $scope.getSingleSuccessCallback = function () { $scope.cates = ngAppSettings.enums.configuration_cates; $scope.globalSettings = $rootScope.globalSettings; $scope.request.category = $routeParams.category || ""; - if(!$scope.viewmodel.id){ - $scope.viewmodel.property.dataType = 'Text'; + if (!$scope.viewmodel.id) { + $scope.viewmodel.property.dataType = "Text"; } if (!$scope.viewmodel.category) { $scope.viewmodel.category = "Site"; @@ -1111,6 +1114,238 @@ app.factory("DashboardServices", [ }, ]); +"use strict"; +app.controller("FileController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$timeout", + "$location", + "AuthService", + "FileServices", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $timeout, + $location, + authService, + fileServices + ) { + $scope.request = { + pageSize: "10", + pageIndex: 0, + status: "Published", + orderBy: "CreatedDateTime", + direction: "Desc", + fromDate: null, + toDate: null, + keyword: "", + key: "", + }; + + $scope.activedFile = null; + $scope.relatedFiles = []; + $rootScope.isBusy = false; + $scope.data = { + pageIndex: 0, + pageSize: 1, + totalItems: 0, + }; + $scope.errors = []; + + $scope.range = function (max) { + var input = []; + for (var i = 1; i <= max; i += 1) input.push(i); + return input; + }; + $scope.loadPage = async function (folder) { + if (folder) { + $scope.request.key += $scope.request.key !== "" ? "/" : ""; + $scope.request.key += folder; + } + $location.url( + "/portal/file/list?folder=" + encodeURIComponent($scope.request.key) + ); + }; + $scope.loadFile = async function () { + $rootScope.isBusy = true; + $scope.listUrl = "/portal/file/list?folder/" + $routeParams.folder; + $rootScope.isBusy = true; + var response = await fileServices.getFile( + $routeParams.folder, + $routeParams.filename + ); + if (response.isSucceed) { + $scope.activedFile = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.loadFiles = async function (folder) { + if (folder) { + $scope.request.key += + $scope.request.key !== "" ? "wwwroot/" : "wwwroot"; + $scope.request.key += folder; + } else { + $scope.request.key = $routeParams.folder + ? $routeParams.folder + : "wwwroot"; + } + if ($routeParams.folder) { + $scope.backUrl = + "/portal/file/list?folder=" + + $routeParams.folder.substring( + 0, + $routeParams.folder.lastIndexOf("/") + ); + } + $rootScope.isBusy = true; + var resp = await fileServices.getFiles($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + $.each($scope.data.items, function (i, file) { + $.each($scope.activedFiles, function (i, e) { + if (e.fileId === file.id) { + file.isHidden = true; + } + }); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.removeFile = async function (id) { + if (confirm("Are you sure!")) { + $rootScope.isBusy = true; + var resp = await fileServices.removeFile(id); + if (resp && resp.isSucceed) { + $scope.loadFiles(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } + }; + + $scope.saveFile = async function (file) { + $rootScope.isBusy = true; + var resp = await fileServices.saveFile(file); + if (resp && resp.isSucceed) { + $scope.activedFile = resp.data; + $rootScope.showMessage("Update successfully!", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateTemplateContent = function (content) { + $scope.activedFile.content = content; + }; + }, +]); + +"use strict"; +app.factory("FileServices", [ + "$http", + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($http, $rootScope, apiService, commonService, baseService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var filesServiceFactory = angular.copy(baseService); + filesServiceFactory.init("file", true); + var settings = $rootScope.globalSettings; + + var _getFile = async function (folder, filename) { + var apiUrl = "/file/"; + var url = apiUrl + "details?folder=" + folder + "&filename=" + filename; + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; + + var _initFile = async function (type) { + var apiUrl = "/file/"; + var req = { + method: "GET", + url: apiUrl + "init/" + type, + }; + return await apiService.getApiResult(req); + }; + + var _getFiles = async function (request) { + var apiUrl = "/file/"; + var req = { + method: "POST", + url: apiUrl + "list", + data: JSON.stringify(request), + }; + + return await apiService.getApiResult(req); + }; + + var _removeFile = async function (fullPath) { + var apiUrl = "/file/"; + var req = { + method: "GET", + url: apiUrl + "delete/?fullPath=" + fullPath, + }; + return await apiService.getApiResult(req); + }; + + var _saveFile = async function (file) { + var apiUrl = "/file/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(file), + }; + return await apiService.getApiResult(req); + }; + var _uploadFile = async function (file, folder) { + var apiUrl = "/file/upload-file"; + var fd = new FormData(); + fd.append("folder", folder); + fd.append("file", file); + return await filesServiceFactory.ajaxSubmitForm(fd, apiUrl); + }; + + filesServiceFactory.getFile = _getFile; + filesServiceFactory.initFile = _initFile; + filesServiceFactory.getFiles = _getFiles; + filesServiceFactory.removeFile = _removeFile; + filesServiceFactory.saveFile = _saveFile; + filesServiceFactory.uploadFile = _uploadFile; + return filesServiceFactory; + }, +]); + "use strict"; app.controller("CustomerController", [ "$scope", @@ -1368,7 +1603,7 @@ app.factory("ImportFileServices", [ ]); "use strict"; -app.controller("FileController", [ +app.controller("JsonDataController", [ "$scope", "$rootScope", "ngAppSettings", @@ -1376,7 +1611,7 @@ app.controller("FileController", [ "$timeout", "$location", "AuthService", - "FileServices", + "JsonDataService", function ( $scope, $rootScope, @@ -1385,7 +1620,7 @@ app.controller("FileController", [ $timeout, $location, authService, - fileServices + service ) { $scope.request = { pageSize: "10", @@ -1400,243 +1635,11 @@ app.controller("FileController", [ }; $scope.activedFile = null; + $scope.editorVisible = false; + $scope.data = null; $scope.relatedFiles = []; $rootScope.isBusy = false; - $scope.data = { - pageIndex: 0, - pageSize: 1, - totalItems: 0, - }; - $scope.errors = []; - - $scope.range = function (max) { - var input = []; - for (var i = 1; i <= max; i += 1) input.push(i); - return input; - }; - $scope.loadPage = async function (folder) { - if (folder) { - $scope.request.key += $scope.request.key !== "" ? "/" : ""; - $scope.request.key += folder; - } - $location.url( - "/portal/file/list?folder=" + encodeURIComponent($scope.request.key) - ); - }; - $scope.loadFile = async function () { - $rootScope.isBusy = true; - $scope.listUrl = "/portal/file/list?folder/" + $routeParams.folder; - $rootScope.isBusy = true; - var response = await fileServices.getFile( - $routeParams.folder, - $routeParams.filename - ); - if (response.isSucceed) { - $scope.activedFile = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.loadFiles = async function (folder) { - if (folder) { - $scope.request.key += - $scope.request.key !== "" ? "wwwroot/" : "wwwroot"; - $scope.request.key += folder; - } else { - $scope.request.key = $routeParams.folder - ? $routeParams.folder - : "wwwroot"; - } - if ($routeParams.folder) { - $scope.backUrl = - "/portal/file/list?folder=" + - $routeParams.folder.substring( - 0, - $routeParams.folder.lastIndexOf("/") - ); - } - $rootScope.isBusy = true; - var resp = await fileServices.getFiles($scope.request); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - $.each($scope.data.items, function (i, file) { - $.each($scope.activedFiles, function (i, e) { - if (e.fileId === file.id) { - file.isHidden = true; - } - }); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.removeFile = async function (id) { - if (confirm("Are you sure!")) { - $rootScope.isBusy = true; - var resp = await fileServices.removeFile(id); - if (resp && resp.isSucceed) { - $scope.loadFiles(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } - }; - - $scope.saveFile = async function (file) { - $rootScope.isBusy = true; - var resp = await fileServices.saveFile(file); - if (resp && resp.isSucceed) { - $scope.activedFile = resp.data; - $rootScope.showMessage("Update successfully!", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.updateTemplateContent = function (content) { - $scope.activedFile.content = content; - }; - }, -]); - -"use strict"; -app.factory("FileServices", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - "BaseService", - function ($http, $rootScope, apiService, commonService, baseService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var filesServiceFactory = angular.copy(baseService); - filesServiceFactory.init("file", true); - var settings = $rootScope.globalSettings; - - var _getFile = async function (folder, filename) { - var apiUrl = "/file/"; - var url = apiUrl + "details?folder=" + folder + "&filename=" + filename; - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _initFile = async function (type) { - var apiUrl = "/file/"; - var req = { - method: "GET", - url: apiUrl + "init/" + type, - }; - return await apiService.getApiResult(req); - }; - - var _getFiles = async function (request) { - var apiUrl = "/file/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _removeFile = async function (fullPath) { - var apiUrl = "/file/"; - var req = { - method: "GET", - url: apiUrl + "delete/?fullPath=" + fullPath, - }; - return await apiService.getApiResult(req); - }; - - var _saveFile = async function (file) { - var apiUrl = "/file/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(file), - }; - return await apiService.getApiResult(req); - }; - var _uploadFile = async function (file, folder) { - var apiUrl = "/file/upload-file"; - var fd = new FormData(); - fd.append("folder", folder); - fd.append("file", file); - return await filesServiceFactory.ajaxSubmitForm(fd, apiUrl); - }; - - filesServiceFactory.getFile = _getFile; - filesServiceFactory.initFile = _initFile; - filesServiceFactory.getFiles = _getFiles; - filesServiceFactory.removeFile = _removeFile; - filesServiceFactory.saveFile = _saveFile; - filesServiceFactory.uploadFile = _uploadFile; - return filesServiceFactory; - }, -]); - -"use strict"; -app.controller("JsonDataController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$timeout", - "$location", - "AuthService", - "JsonDataService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $timeout, - $location, - authService, - service - ) { - $scope.request = { - pageSize: "10", - pageIndex: 0, - status: "Published", - orderBy: "CreatedDateTime", - direction: "Desc", - fromDate: null, - toDate: null, - keyword: "", - key: "", - }; - - $scope.activedFile = null; - $scope.editorVisible = false; - $scope.data = null; - $scope.relatedFiles = []; - $rootScope.isBusy = false; - + $scope.errors = []; $scope.loadPage = async function (folder) { @@ -1815,123 +1818,20 @@ app.factory("JsonDataService", [ ]); "use strict"; -app.controller("LocalizeController", [ - "$scope", +app.controller("loginController", [ "$rootScope", + "$scope", "ngAppSettings", - "$routeParams", "$location", - "LocalizeService", - "ApiService", - "CommonService", + "AuthService", + "ngAppSettings", function ( - $scope, $rootScope, + $scope, ngAppSettings, - $routeParams, $location, - service, - commonService - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - - $scope.getSingleSuccessCallback = function () { - $scope.cates = ngAppSettings.enums.configuration_cates; - $scope.globalSettings = $rootScope.globalSettings; - $scope.request.category = $routeParams.category || ""; - if (!$scope.viewmodel.id) { - $scope.viewmodel.property.dataType = "Text"; - } - if (!$scope.viewmodel.category) { - $scope.viewmodel.category = "Site"; - } - }; - $scope.saveSuccessCallback = function () { - commonService.initAllSettings().then(function () { - // $location.url($scope.referrerUrl); - $rootScope.isBusy = false; - $scope.$apply(); - }); - }; - $scope.removeCallback = function () { - commonService.initAllSettings().then(function () { - $location.url($scope.referrerUrl); - }); - }; - - $scope.generateName = function () { - $scope.viewmodel.keyword = $rootScope.generateKeyword( - $scope.viewmodel.keyword, - "_", - true - ); - }; - }, -]); - -"use strict"; -app.factory("LocalizeService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("language"); - - var _uploadLanguage = async function (languageFile) { - //var container = $(this).parents('.model-language').first().find('.custom-file').first(); - if (languageFile.file !== undefined && languageFile.file !== null) { - // Create FormData object - var files = new FormData(); - - // Looping over all files and add it to FormData object - files.append(languageFile.file.name, languageFile.file); - - // Adding one more key to FormData object - files.append("fileFolder", languageFile.folder); - files.append("title", languageFile.title); - files.append("description", languageFile.description); - - var req = { - url: this.prefixUrl + "/upload", - type: "POST", - headers: {}, - contentType: false, // Not to set any content header - processData: false, // Not to process data - data: files, - }; - - return await apiService.getApiResult(req); - } - }; - serviceFactory.uploadLanguage = _uploadLanguage; - return serviceFactory; - }, -]); - -"use strict"; -app.controller("loginController", [ - "$rootScope", - "$scope", - "ngAppSettings", - "$location", - "AuthService", - "ngAppSettings", - function ( - $rootScope, - $scope, - ngAppSettings, - $location, - authService, - ngAuthSettings + authService, + ngAuthSettings ) { if ( authService.authentication && @@ -2029,6 +1929,109 @@ app.controller("loginController", [ }, ]); +"use strict"; +app.controller("LocalizeController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "LocalizeService", + "ApiService", + "CommonService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service, + commonService + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + + $scope.getSingleSuccessCallback = function () { + $scope.cates = ngAppSettings.enums.configuration_cates; + $scope.globalSettings = $rootScope.globalSettings; + $scope.request.category = $routeParams.category || ""; + if (!$scope.viewmodel.id) { + $scope.viewmodel.property.dataType = "Text"; + } + if (!$scope.viewmodel.category) { + $scope.viewmodel.category = "Site"; + } + }; + $scope.saveSuccessCallback = function () { + commonService.initAllSettings().then(function () { + // $location.url($scope.referrerUrl); + $rootScope.isBusy = false; + $scope.$apply(); + }); + }; + $scope.removeCallback = function () { + commonService.initAllSettings().then(function () { + $location.url($scope.referrerUrl); + }); + }; + + $scope.generateName = function () { + $scope.viewmodel.keyword = $rootScope.generateKeyword( + $scope.viewmodel.keyword, + "_", + true + ); + }; + }, +]); + +"use strict"; +app.factory("LocalizeService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("language"); + + var _uploadLanguage = async function (languageFile) { + //var container = $(this).parents('.model-language').first().find('.custom-file').first(); + if (languageFile.file !== undefined && languageFile.file !== null) { + // Create FormData object + var files = new FormData(); + + // Looping over all files and add it to FormData object + files.append(languageFile.file.name, languageFile.file); + + // Adding one more key to FormData object + files.append("fileFolder", languageFile.folder); + files.append("title", languageFile.title); + files.append("description", languageFile.description); + + var req = { + url: this.prefixUrl + "/upload", + type: "POST", + headers: {}, + contentType: false, // Not to set any content header + processData: false, // Not to process data + data: files, + }; + + return await apiService.getApiResult(req); + } + }; + serviceFactory.uploadLanguage = _uploadLanguage; + return serviceFactory; + }, +]); + "use strict"; app.controller("MixDatabaseController", [ "$scope", @@ -2448,28 +2451,25 @@ app.controller("MixDatabaseDataController", [ ]); "use strict"; -app.controller("ModuleController", [ +app.controller("ModuleDataController", [ "$scope", "$rootScope", "ngAppSettings", - "$location", "$routeParams", + "$location", + "ModuleDataRestService", "ModuleRestService", - "SharedModuleDataService", - "RestRelatedMixDatabasePortalService", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", + "ApiService", + "CommonService", function ( $scope, $rootScope, ngAppSettings, - $location, $routeParams, - moduleServices, - moduleDataService, - RestRelatedMixDatabasePortalService, - dataService, - columnService + $location, + service, + moduleService, + commonService ) { BaseRestCtrl.call( this, @@ -2478,25 +2478,204 @@ app.controller("ModuleController", [ $location, $routeParams, ngAppSettings, - moduleServices, - "product" + service ); - $scope.viewmodelType = "module"; - $scope.contentUrl = ""; - $scope.getSingleSuccessCallback = function () { - $scope.loadAdditionalData(); - - if ($scope.viewmodel.id > 0) { - // module => list post or list product - if ($scope.viewmodel.type == 2 || $scope.viewmodel.type == 6) { - $scope.contentUrl = "/portal/module-post/list/" + $scope.viewmodel.id; - } else { - $scope.contentUrl = "/portal/module/data/" + $scope.viewmodel.id; + // $scope.request.orderBy = "Priority"; + // $scope.request.direction = "Asc"; + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.moduleId = $routeParams.moduleId; + $scope.backUrl = `/portal/module-data/list/${$scope.moduleId}`; + $scope.module = null; + $scope.dataColumns = []; + $scope.editDataUrl = "/portal/module-data/details/" + $scope.moduleId; + $scope.init = async function () { + $scope.id = $routeParams.id; + if (!$scope.module) { + var getModule = await moduleService.getSingle([$scope.moduleId]); + if (getModule.isSucceed) { + $scope.module = getModule.data; + angular.forEach($scope.module.columns, function (e, i) { + if (e.isDisplay) { + $scope.dataColumns.push({ + title: e.title, + name: e.name, + datatype: e.dataType, + filter: true, + type: 0, // string - ngAppSettings.dataTypes[0] + }); + } + }); + $scope.$apply(); } } - if ($scope.viewmodel.sysCategories) { - angular.forEach($scope.viewmodel.sysCategories, function (e) { - e.attributeData.obj.isActived = true; + }; + $scope.getList = async function () { + $rootScope.isBusy = true; + $scope.request.module_id = $scope.moduleId; + var response = await service.getList($scope.request); + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.export = async function () { + $rootScope.isBusy = true; + $scope.request.module_id = $scope.moduleId; + var response = await service.export($scope.request); + if (response.isSucceed) { + window.top.location = response.data.webPath; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.getSingle = async function () { + $rootScope.isBusy = true; + var resp = await service.getSingle($routeParams.id, "portal"); + if (resp && resp.isSucceed) { + $scope.activedModuleData = resp.data; + $rootScope.initEditor(); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.remove = function (dataId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [dataId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeConfirmed = async function (dataId) { + $rootScope.isBusy = true; + var result = await service.delete([dataId]); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.removeCallback = function () {}; + + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("ModuleDataRestService", [ + "BaseRestService", + "ApiService", + "CommonService", + function (baseService, apiService, commonService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("module-data/portal"); + // Define more service methods here + + var _initForm = async function (moduleId) { + var url = `${this.prefixUrl}/init-form/${moduleId}`; + var req = { + method: "GET", + url: url, + }; + return await apiService.getRestApiResult(req); + }; + serviceFactory.initForm = _initForm; + return serviceFactory; + }, +]); + +"use strict"; +app.controller("ModuleController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$location", + "$routeParams", + "ModuleRestService", + "SharedModuleDataService", + "RestRelatedMixDatabasePortalService", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", + function ( + $scope, + $rootScope, + ngAppSettings, + $location, + $routeParams, + moduleServices, + moduleDataService, + RestRelatedMixDatabasePortalService, + dataService, + columnService + ) { + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + moduleServices, + "product" + ); + $scope.viewmodelType = "module"; + $scope.contentUrl = ""; + $scope.getSingleSuccessCallback = function () { + $scope.loadAdditionalData(); + + if ($scope.viewmodel.id > 0) { + // module => list post or list product + if ($scope.viewmodel.type == 2 || $scope.viewmodel.type == 6) { + $scope.contentUrl = "/portal/module-post/list/" + $scope.viewmodel.id; + } else { + $scope.contentUrl = "/portal/module/data/" + $scope.viewmodel.id; + } + } + if ($scope.viewmodel.sysCategories) { + angular.forEach($scope.viewmodel.sysCategories, function (e) { + e.attributeData.obj.isActived = true; }); } @@ -2755,14 +2934,13 @@ app.factory("ModuleRestService", [ ]); "use strict"; -app.controller("ModuleDataController", [ +app.controller("ModuleGalleryController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "ModuleDataRestService", - "ModuleRestService", + "ModuleGalleryService", "ApiService", "CommonService", function ( @@ -2772,52 +2950,33 @@ app.controller("ModuleDataController", [ $routeParams, $location, service, - moduleService, + apiService, commonService ) { - BaseRestCtrl.call( + BaseCtrl.call( this, $scope, $rootScope, - $location, $routeParams, ngAppSettings, service ); - // $scope.request.orderBy = "Priority"; - // $scope.request.direction = "Asc"; $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = $routeParams.moduleId; - $scope.backUrl = `/portal/module-data/list/${$scope.moduleId}`; - $scope.module = null; - $scope.dataColumns = []; - $scope.editDataUrl = "/portal/module-data/details/" + $scope.moduleId; - $scope.init = async function () { - $scope.id = $routeParams.id; - if (!$scope.module) { - var getModule = await moduleService.getSingle([$scope.moduleId]); - if (getModule.isSucceed) { - $scope.module = getModule.data; - angular.forEach($scope.module.columns, function (e, i) { - if (e.isDisplay) { - $scope.dataColumns.push({ - title: e.title, - name: e.name, - datatype: e.dataType, - filter: true, - type: 0, // string - ngAppSettings.dataTypes[0] - }); - } - }); - $scope.$apply(); - } - } - }; + $scope.moduleId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.translate = $rootScope.translate; + $scope.moduleId = $routeParams.id; $scope.getList = async function () { $rootScope.isBusy = true; - $scope.request.module_id = $scope.moduleId; + var id = $routeParams.id; + $scope.moduleId = $routeParams.id; + $scope.request.query = "&module_id=" + id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; var response = await service.getList($scope.request); if (response.isSucceed) { $scope.data = response.data; @@ -2829,176 +2988,20 @@ app.controller("ModuleDataController", [ $scope.$apply(); } }; - - $scope.export = async function () { - $rootScope.isBusy = true; - $scope.request.module_id = $scope.moduleId; - var response = await service.export($scope.request); - if (response.isSucceed) { - window.top.location = response.data.webPath; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.getSingle = async function () { - $rootScope.isBusy = true; - var resp = await service.getSingle($routeParams.id, "portal"); - if (resp && resp.isSucceed) { - $scope.activedModuleData = resp.data; - $rootScope.initEditor(); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.remove = function (dataId) { + $scope.remove = function (moduleId, postId) { $rootScope.showConfirm( $scope, "removeConfirmed", - [dataId], + [moduleId, postId], null, "Remove", "Deleted data will not able to recover, are you sure you want to delete this item?" ); }; - $scope.removeConfirmed = async function (dataId) { + $scope.removeConfirmed = async function (moduleId, postId) { $rootScope.isBusy = true; - var result = await service.delete([dataId]); - if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.removeCallback = function () {}; - - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - }, -]); - -"use strict"; -app.factory("ModuleDataRestService", [ - "BaseRestService", - "ApiService", - "CommonService", - function (baseService, apiService, commonService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("module-data/portal"); - // Define more service methods here - - var _initForm = async function (moduleId) { - var url = `${this.prefixUrl}/init-form/${moduleId}`; - var req = { - method: "GET", - url: url, - }; - return await apiService.getRestApiResult(req); - }; - serviceFactory.initForm = _initForm; - return serviceFactory; - }, -]); - -"use strict"; -app.controller("ModuleGalleryController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$routeParams", - "$location", - "ModuleGalleryService", - "ApiService", - "CommonService", - function ( - $scope, - $rootScope, - ngAppSettings, - $routeParams, - $location, - service, - apiService, - commonService - ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.moduleId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.translate = $rootScope.translate; - $scope.moduleId = $routeParams.id; - $scope.getList = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.moduleId = $routeParams.id; - $scope.request.query = "&module_id=" + id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; - var response = await service.getList($scope.request); - if (response.isSucceed) { - $scope.data = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.remove = function (moduleId, postId) { - $rootScope.showConfirm( - $scope, - "removeConfirmed", - [moduleId, postId], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeConfirmed = async function (moduleId, postId) { - $rootScope.isBusy = true; - var result = await service.delete(moduleId, postId); + var result = await service.delete(moduleId, postId); if (result.isSucceed) { if ($scope.removeCallback) { $rootScope.executeFunctionByName( @@ -3241,58 +3244,62 @@ app.factory("ModulePostRestService", [ ]); "use strict"; -app.controller("OrderController", [ +app.controller("PageController", [ "$scope", "$rootScope", "ngAppSettings", - "$routeParams", - "$timeout", "$location", - "AuthService", - "OrderServices", - "ngAppSettings", + "$routeParams", + "PageRestService", + "PagePostRestService", + "PagePageRestService", + "UrlAliasService", + "RestMixDatabaseDataPortalService", + "RestMixDatabaseColumnPortalService", function ( $scope, $rootScope, ngAppSettings, - $routeParams, - $timeout, $location, - authService, - orderServices + $routeParams, + service, + pagePostRestService, + pagePageRestService, + urlAliasService, + dataService, + columnService ) { - $scope.request = angular.copy(ngAppSettings.request); - $scope.request.contentStatuses = [ - "Waiting", - "Serving", - "Rated", - "Finished", - ]; - $scope.request.status = "2"; - $scope.activedOrder = null; - $scope.relatedOrders = []; - $rootScope.isBusy = false; - $scope.data = { - pageIndex: 0, - pageSize: 1, - totalItems: 0, - items: [], - }; - $scope.errors = []; - - $scope.range = function (max) { - var input = []; - for (var i = 1; i <= max; i += 1) input.push(i); - return input; + BaseRestCtrl.call( + this, + $scope, + $rootScope, + $location, + $routeParams, + ngAppSettings, + service + ); + $scope.viewmodelType = "page"; + $scope.request.query = "level=0"; + $scope.pageType = ""; + $scope.pageTypes = $rootScope.globalSettings.pageTypes; + $scope.selectedCategories = []; + $scope.selectedTags = []; + $scope.pageData = { + posts: [], + products: [], + data: [], }; - - $scope.loadOrder = async function () { + $scope.postRequest = angular.copy(ngAppSettings.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; + $scope.loadPosts = async function () { $rootScope.isBusy = true; var id = $routeParams.id; - var response = await orderServices.getOrder(id, "portal"); + $scope.postRequest.query += "&page_id=" + id; + var response = await pagePostRestService.getList($scope.postRequest); + if (response.isSucceed) { - $scope.activedOrder = response.data; - $rootScope.initEditor(); + $scope.pageData.posts = response.data; $rootScope.isBusy = false; $scope.$apply(); } else { @@ -3301,267 +3308,44 @@ app.controller("OrderController", [ $scope.$apply(); } }; - $scope.loadOrders = async function (pageIndex) { - if (pageIndex !== undefined) { - $scope.request.pageIndex = pageIndex; - } - if ($scope.request.fromDate !== null) { - var d = new Date($scope.request.fromDate); - $scope.request.fromDate = d.toISOString(); + $scope.getSingleSuccessCallback = function () { + $scope.loadAdditionalData(); + if ($routeParams.template) { + $scope.viewmodel.view = $rootScope.findObjectByKey( + $scope.viewmodel.templates, + "fileName", + $routeParams.template + ); } - if ($scope.request.toDate !== null) { - var d = new Date($scope.request.toDate); - $scope.request.toDate = d.toISOString(); + }; + $scope.getListSuccessCallback = function () { + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + }; + $scope.loadAdditionalData = async function () { + const obj = { + parentType: "Page", + parentId: $scope.viewmodel.id, + databaseName: "sys_additional_column_page", + }; + const getData = await dataService.getAdditionalData(obj); + if (getData.isSucceed) { + $scope.additionalData = getData.data; + $scope.$apply(); } + }; + $scope.showChilds = function (id) { + $("#childs-" + id).toggleClass("collapse"); + }; + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); $rootScope.isBusy = true; - var resp = await orderServices.getOrders($scope.request); - if (resp && resp.isSucceed) { - $scope.data = resp.data; - //$("html, body").animate({ "scrollTop": "0px" }, 500); - $.each($scope.data.items, function (i, order) { - $.each($scope.activedOrders, function (i, e) { - if (e.orderId === order.id) { - order.isHidden = true; - } - }); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.removeOrder = function (id) { - $rootScope.showConfirm( - $scope, - "removeOrderConfirmed", - [id], - null, - "Remove Order", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); - }; - - $scope.removeOrderConfirmed = async function (id) { - $rootScope.isBusy = true; - var result = await orderServices.removeOrder(id); - if (result.isSucceed) { - $scope.loadOrders(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.saveOrder = async function (order) { - order.content = $(".editor-content.content").val(); - order.excerpt = $(".editor-content.excerpt").val(); - $rootScope.isBusy = true; - var resp = await orderServices.saveOrder(order); - if (resp && resp.isSucceed) { - $scope.activedOrder = resp.data; - $rootScope.showMessage("Update successfully!", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - //$location.path('/portal/order/details/' + resp.data.id); - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - $scope.preview = function (item) { - $rootScope.preview("order", item, item.title, "modal-lg"); - }; - }, -]); - -"use strict"; -app.factory("OrderServices", [ - "$http", - "$rootScope", - "ApiService", - "CommonService", - function ($http, $rootScope, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var ordersServiceFactory = {}; - - var settings = $rootScope.globalSettings; - - var _getOrder = async function (id, type) { - var apiUrl = "/" + settings.lang + "/order/"; - var url = apiUrl + "details/" + type; - if (id) { - url += "/" + id; - } - var req = { - method: "GET", - url: url, - }; - return await apiService.getApiResult(req); - }; - - var _initOrder = async function (type) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "GET", - url: apiUrl + "init/" + type, - }; - return await apiService.getApiResult(req); - }; - - var _getOrders = async function (request) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "POST", - url: apiUrl + "list", - data: JSON.stringify(request), - }; - - return await apiService.getApiResult(req); - }; - - var _removeOrder = async function (id) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "GET", - url: apiUrl + "delete/" + id, - }; - return await apiService.getApiResult(req); - }; - - var _saveOrder = async function (order) { - var apiUrl = "/" + settings.lang + "/order/"; - var req = { - method: "POST", - url: apiUrl + "save", - data: JSON.stringify(order), - }; - return await apiService.getApiResult(req); - }; - - ordersServiceFactory.getOrder = _getOrder; - ordersServiceFactory.initOrder = _initOrder; - ordersServiceFactory.getOrders = _getOrders; - ordersServiceFactory.removeOrder = _removeOrder; - ordersServiceFactory.saveOrder = _saveOrder; - return ordersServiceFactory; - }, -]); - -"use strict"; -app.controller("PageController", [ - "$scope", - "$rootScope", - "ngAppSettings", - "$location", - "$routeParams", - "PageRestService", - "PagePostRestService", - "PagePageRestService", - "UrlAliasService", - "RestMixDatabaseDataPortalService", - "RestMixDatabaseColumnPortalService", - function ( - $scope, - $rootScope, - ngAppSettings, - $location, - $routeParams, - service, - pagePostRestService, - pagePageRestService, - urlAliasService, - dataService, - columnService - ) { - BaseRestCtrl.call( - this, - $scope, - $rootScope, - $location, - $routeParams, - ngAppSettings, - service - ); - $scope.viewmodelType = "page"; - $scope.request.query = "level=0"; - $scope.pageType = ""; - $scope.pageTypes = $rootScope.globalSettings.pageTypes; - $scope.selectedCategories = []; - $scope.selectedTags = []; - $scope.pageData = { - posts: [], - products: [], - data: [], - }; - $scope.postRequest = angular.copy(ngAppSettings.request); - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.loadPosts = async function () { - $rootScope.isBusy = true; - var id = $routeParams.id; - $scope.postRequest.query += "&page_id=" + id; - var response = await pagePostRestService.getList($scope.postRequest); - - if (response.isSucceed) { - $scope.pageData.posts = response.data; - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.getSingleSuccessCallback = function () { - $scope.loadAdditionalData(); - if ($routeParams.template) { - $scope.viewmodel.view = $rootScope.findObjectByKey( - $scope.viewmodel.templates, - "fileName", - $routeParams.template - ); - } - }; - $scope.getListSuccessCallback = function () { - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; - }; - $scope.loadAdditionalData = async function () { - const obj = { - parentType: "Page", - parentId: $scope.viewmodel.id, - databaseName: "sys_additional_column_page", - }; - const getData = await dataService.getAdditionalData(obj); - if (getData.isSucceed) { - $scope.additionalData = getData.data; - $scope.$apply(); - } - }; - $scope.showChilds = function (id) { - $("#childs-" + id).toggleClass("collapse"); - }; - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); - $rootScope.isBusy = true; - var startIndex = $scope.data.items[0].priority - 1; - for (var i = 0; i < $scope.data.items.length; i++) { - $scope.data.items[i].priority = startIndex + i + 1; - } - var resp = await service.updateInfos($scope.data.items); + var startIndex = $scope.data.items[0].priority - 1; + for (var i = 0; i < $scope.data.items.length; i++) { + $scope.data.items[i].priority = startIndex + i + 1; + } + var resp = await service.updateInfos($scope.data.items); if (resp && resp.isSucceed) { $scope.activedPage = resp.data; $rootScope.showMessage("success", "success"); @@ -3720,51 +3504,58 @@ app.factory("PageRestService", [ ]); "use strict"; -app.controller("PageGalleryController", [ +app.controller("OrderController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", + "$timeout", "$location", - "PageGalleryService", - "PostRestService", - "ApiService", - "CommonService", + "AuthService", + "OrderServices", + "ngAppSettings", function ( $scope, $rootScope, ngAppSettings, $routeParams, + $timeout, $location, - service, - postService, - apiService, - commonService + authService, + orderServices ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); - $scope.cates = ["Site", "System"]; - $scope.others = []; - $scope.localizeSettings = $rootScope.globalSettings; - $scope.pageId = $routeParams.id; - $scope.canDrag = - $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; - $scope.getList = async function () { + $scope.request = angular.copy(ngAppSettings.request); + $scope.request.contentStatuses = [ + "Waiting", + "Serving", + "Rated", + "Finished", + ]; + $scope.request.status = "2"; + $scope.activedOrder = null; + $scope.relatedOrders = []; + $rootScope.isBusy = false; + $scope.data = { + pageIndex: 0, + pageSize: 1, + totalItems: 0, + items: [], + }; + $scope.errors = []; + + $scope.range = function (max) { + var input = []; + for (var i = 1; i <= max; i += 1) input.push(i); + return input; + }; + + $scope.loadOrder = async function () { $rootScope.isBusy = true; var id = $routeParams.id; - $scope.request.query = "&page_id=" + id; - var response = await service.getList($scope.request); - $scope.canDrag = - $scope.request.orderBy !== "Priority" || - $scope.request.direction !== "0"; + var response = await orderServices.getOrder(id, "portal"); if (response.isSucceed) { - $scope.data = response.data; + $scope.activedOrder = response.data; + $rootScope.initEditor(); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -3773,29 +3564,57 @@ app.controller("PageGalleryController", [ $scope.$apply(); } }; - $scope.remove = function (pageId, postId) { + $scope.loadOrders = async function (pageIndex) { + if (pageIndex !== undefined) { + $scope.request.pageIndex = pageIndex; + } + if ($scope.request.fromDate !== null) { + var d = new Date($scope.request.fromDate); + $scope.request.fromDate = d.toISOString(); + } + if ($scope.request.toDate !== null) { + var d = new Date($scope.request.toDate); + $scope.request.toDate = d.toISOString(); + } + $rootScope.isBusy = true; + var resp = await orderServices.getOrders($scope.request); + if (resp && resp.isSucceed) { + $scope.data = resp.data; + //$("html, body").animate({ "scrollTop": "0px" }, 500); + $.each($scope.data.items, function (i, order) { + $.each($scope.activedOrders, function (i, e) { + if (e.orderId === order.id) { + order.isHidden = true; + } + }); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.removeOrder = function (id) { $rootScope.showConfirm( $scope, - "removeConfirmed", - [pageId, postId], + "removeOrderConfirmed", + [id], null, - "Remove", + "Remove Order", "Deleted data will not able to recover, are you sure you want to delete this item?" ); }; - $scope.removeConfirmed = async function (pageId, postId) { + $scope.removeOrderConfirmed = async function (id) { $rootScope.isBusy = true; - var result = await service.delete(pageId, postId); + var result = await orderServices.removeOrder(id); if (result.isSucceed) { - if ($scope.removeCallback) { - $rootScope.executeFunctionByName( - "removeCallback", - $scope.removeCallbackArgs, - $scope - ); - } - $scope.getList(); + $scope.loadOrders(); } else { $rootScope.showMessage("failed"); $rootScope.isBusy = false; @@ -3803,30 +3622,17 @@ app.controller("PageGalleryController", [ } }; - $scope.saveOthers = async function () { - var response = await service.saveList($scope.others); - if (response.isSucceed) { - $scope.getList(); - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - $scope.updateInfos = async function (index) { - $scope.data.items.splice(index, 1); + $scope.saveOrder = async function (order) { + order.content = $(".editor-content.content").val(); + order.excerpt = $(".editor-content.excerpt").val(); $rootScope.isBusy = true; - var startIndex = $scope.data.items[0].priority - 1; - for (var i = 0; i < $scope.data.items.length; i++) { - $scope.data.items[i].priority = startIndex + i + 1; - } - var resp = await service.updateInfos($scope.data.items); + var resp = await orderServices.saveOrder(order); if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - $rootScope.showMessage("success", "success"); + $scope.activedOrder = resp.data; + $rootScope.showMessage("Update successfully!", "success"); $rootScope.isBusy = false; $scope.$apply(); + //$location.path('/portal/order/details/' + resp.data.id); } else { if (resp) { $rootScope.showErrors(resp.errors); @@ -3835,48 +3641,95 @@ app.controller("PageGalleryController", [ $scope.$apply(); } }; + + $scope.preview = function (item) { + $rootScope.preview("order", item, item.title, "modal-lg"); + }; }, ]); "use strict"; -app.factory("PageGalleryService", [ +app.factory("OrderServices", [ + "$http", "$rootScope", "ApiService", "CommonService", - "BaseService", - function ($rootScope, apiService, commonService, baseService) { - var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (pageId, postId) { - var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; + function ($http, $rootScope, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var ordersServiceFactory = {}; + + var settings = $rootScope.globalSettings; + + var _getOrder = async function (id, type) { + var apiUrl = "/" + settings.lang + "/order/"; + var url = apiUrl + "details/" + type; + if (id) { + url += "/" + id; + } var req = { method: "GET", url: url, }; return await apiService.getApiResult(req); }; - var _updateInfos = async function (pages) { + + var _initOrder = async function (type) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "GET", + url: apiUrl + "init/" + type, + }; + return await apiService.getApiResult(req); + }; + + var _getOrders = async function (request) { + var apiUrl = "/" + settings.lang + "/order/"; var req = { method: "POST", - url: this.prefixUrl + "/update-infos", - data: JSON.stringify(pages), + url: apiUrl + "list", + data: JSON.stringify(request), }; + return await apiService.getApiResult(req); }; - serviceFactory.delete = _delete; - serviceFactory.updateInfos = _updateInfos; - return serviceFactory; + + var _removeOrder = async function (id) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "GET", + url: apiUrl + "delete/" + id, + }; + return await apiService.getApiResult(req); + }; + + var _saveOrder = async function (order) { + var apiUrl = "/" + settings.lang + "/order/"; + var req = { + method: "POST", + url: apiUrl + "save", + data: JSON.stringify(order), + }; + return await apiService.getApiResult(req); + }; + + ordersServiceFactory.getOrder = _getOrder; + ordersServiceFactory.initOrder = _initOrder; + ordersServiceFactory.getOrders = _getOrders; + ordersServiceFactory.removeOrder = _removeOrder; + ordersServiceFactory.saveOrder = _saveOrder; + return ordersServiceFactory; }, ]); "use strict"; -app.controller("PagePageController", [ +app.controller("PageGalleryController", [ "$scope", "$rootScope", "ngAppSettings", "$routeParams", "$location", - "PagePostRestService", + "PageGalleryService", "PostRestService", "ApiService", "CommonService", @@ -3989,14 +3842,14 @@ app.controller("PagePageController", [ ]); "use strict"; -app.factory("PagePageRestService", [ +app.factory("PageGalleryService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-page"); + serviceFactory.init("page-post"); var _delete = async function (pageId, postId) { var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; var req = { @@ -4020,7 +3873,7 @@ app.factory("PagePageRestService", [ ]); "use strict"; -app.controller("PagePostController", [ +app.controller("PagePageController", [ "$scope", "$rootScope", "ngAppSettings", @@ -4038,6 +3891,7 @@ app.controller("PagePostController", [ $location, service, postService, + apiService, commonService ) { BaseCtrl.call( @@ -4051,24 +3905,9 @@ app.controller("PagePostController", [ $scope.cates = ["Site", "System"]; $scope.others = []; $scope.localizeSettings = $rootScope.globalSettings; - $scope.init = function () { - $scope.pageId = $routeParams.id; - $scope.type = $routeParams.type; - $scope.template = $routeParams.template || ""; - $scope.pageIds = $routeParams.page_ids || $routeParams.id; - $scope.moduleIds = $routeParams.module_ids || ""; - $scope.canDrag = - $scope.request.orderBy === "Priority" && - $scope.request.direction === "Asc"; - $scope.createUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/create-gallery" - : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; - $scope.updateUrl = - $routeParams.post_type === "gallery" - ? "/portal/post/gallery-details" - : "/portal/post/details"; - }; + $scope.pageId = $routeParams.id; + $scope.canDrag = + $scope.request.orderBy !== "Priority" || $scope.request.direction !== "0"; $scope.getList = async function () { $rootScope.isBusy = true; var id = $routeParams.id; @@ -4087,10 +3926,6 @@ app.controller("PagePostController", [ $scope.$apply(); } }; - $scope.preview = function (item) { - item.editUrl = "/portal/post/details/" + item.id; - $rootScope.preview("post", item, item.title, "modal-lg"); - }; $scope.remove = function (pageId, postId) { $rootScope.showConfirm( $scope, @@ -4102,9 +3937,9 @@ app.controller("PagePostController", [ ); }; - $scope.removeConfirmed = async function (id) { + $scope.removeConfirmed = async function (pageId, postId) { $rootScope.isBusy = true; - var result = await service.delete(id); + var result = await service.delete(pageId, postId); if (result.isSucceed) { if ($scope.removeCallback) { $rootScope.executeFunctionByName( @@ -4157,16 +3992,16 @@ app.controller("PagePostController", [ ]); "use strict"; -app.factory("PagePostRestService", [ +app.factory("PagePageRestService", [ "$rootScope", "ApiService", "CommonService", "BaseService", function ($rootScope, apiService, commonService, baseService) { var serviceFactory = Object.create(baseService); - serviceFactory.init("page-post"); - var _delete = async function (id) { - var url = this.prefixUrl + "/delete/" + id; + serviceFactory.init("page-page"); + var _delete = async function (pageId, postId) { + var url = this.prefixUrl + "/delete/" + pageId + "/" + postId; var req = { method: "GET", url: url, @@ -4341,6 +4176,174 @@ app.factory("PagePositionService", [ }, ]); +"use strict"; +app.controller("PagePostController", [ + "$scope", + "$rootScope", + "ngAppSettings", + "$routeParams", + "$location", + "PagePostRestService", + "PostRestService", + "ApiService", + "CommonService", + function ( + $scope, + $rootScope, + ngAppSettings, + $routeParams, + $location, + service, + postService, + commonService + ) { + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); + $scope.cates = ["Site", "System"]; + $scope.others = []; + $scope.localizeSettings = $rootScope.globalSettings; + $scope.init = function () { + $scope.pageId = $routeParams.id; + $scope.type = $routeParams.type; + $scope.template = $routeParams.template || ""; + $scope.pageIds = $routeParams.page_ids || $routeParams.id; + $scope.moduleIds = $routeParams.module_ids || ""; + $scope.canDrag = + $scope.request.orderBy === "Priority" && + $scope.request.direction === "Asc"; + $scope.createUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/create-gallery" + : `/portal/post/create?page_ids=${$scope.pageIds}&module_ids=${$scope.moduleIds}&type=${$scope.type}&template=${$scope.template}`; + $scope.updateUrl = + $routeParams.post_type === "gallery" + ? "/portal/post/gallery-details" + : "/portal/post/details"; + }; + $scope.getList = async function () { + $rootScope.isBusy = true; + var id = $routeParams.id; + $scope.request.query = "&page_id=" + id; + var response = await service.getList($scope.request); + $scope.canDrag = + $scope.request.orderBy !== "Priority" || + $scope.request.direction !== "0"; + if (response.isSucceed) { + $scope.data = response.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.preview = function (item) { + item.editUrl = "/portal/post/details/" + item.id; + $rootScope.preview("post", item, item.title, "modal-lg"); + }; + $scope.remove = function (pageId, postId) { + $rootScope.showConfirm( + $scope, + "removeConfirmed", + [pageId, postId], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + + $scope.removeConfirmed = async function (id) { + $rootScope.isBusy = true; + var result = await service.delete(id); + if (result.isSucceed) { + if ($scope.removeCallback) { + $rootScope.executeFunctionByName( + "removeCallback", + $scope.removeCallbackArgs, + $scope + ); + } + $scope.getList(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + $scope.saveOthers = async function () { + var response = await service.saveList($scope.others); + if (response.isSucceed) { + $scope.getList(); + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.updateInfos = async function (index) { + $scope.data.items.splice(index, 1); + $rootScope.isBusy = true; + var startIndex = $scope.data.items[0].priority - 1; + for (var i = 0; i < $scope.data.items.length; i++) { + $scope.data.items[i].priority = startIndex + i + 1; + } + var resp = await service.updateInfos($scope.data.items); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + }, +]); + +"use strict"; +app.factory("PagePostRestService", [ + "$rootScope", + "ApiService", + "CommonService", + "BaseService", + function ($rootScope, apiService, commonService, baseService) { + var serviceFactory = Object.create(baseService); + serviceFactory.init("page-post"); + var _delete = async function (id) { + var url = this.prefixUrl + "/delete/" + id; + var req = { + method: "GET", + url: url, + }; + return await apiService.getApiResult(req); + }; + var _updateInfos = async function (pages) { + var req = { + method: "POST", + url: this.prefixUrl + "/update-infos", + data: JSON.stringify(pages), + }; + return await apiService.getApiResult(req); + }; + serviceFactory.delete = _delete; + serviceFactory.updateInfos = _updateInfos; + return serviceFactory; + }, +]); + "use strict"; app.controller("PermissionController", [ "$scope", @@ -6560,20 +6563,6 @@ app.component("appSettingsHeart", { ], }); -app.component("appSettingsSmtp", { - templateUrl: - "/mix-app/views/app-portal/pages/app-settings/components/smtp/view.html", - controller: [ - "ngAppSettings", - function (ngAppSettings) { - var ctrl = this; - }, - ], - bindings: { - appSettings: "=", - }, -}); - modules.component("portalMenus", { templateUrl: "/mix-app/views/app-portal/pages/app-settings/components/portal-menus/view.html", @@ -6606,6 +6595,20 @@ modules.component("portalMenus", { ], }); +app.component("appSettingsSmtp", { + templateUrl: + "/mix-app/views/app-portal/pages/app-settings/components/smtp/view.html", + controller: [ + "ngAppSettings", + function (ngAppSettings) { + var ctrl = this; + }, + ], + bindings: { + appSettings: "=", + }, +}); + app.component("customerMain", { templateUrl: "/mix-app/views/app-portal/pages/customer/components/main/customer-main.html", @@ -6699,6 +6702,25 @@ app.component("mixDatabaseMain", { }, }); +app.component("moduleAdvanced", { + templateUrl: + "/mix-app/views/app-portal/pages/module/components/module-advanced/view.html", + bindings: { + model: "=", + additionalData: "=", + }, + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = function () { + ctrl.isAdmin = $rootScope.isAdmin; + }; + }, + ], +}); + app.component("moduleMain", { templateUrl: "/mix-app/views/app-portal/pages/module/components/main/main.html", @@ -6723,25 +6745,6 @@ app.component("moduleMain", { }, }); -app.component("moduleAdvanced", { - templateUrl: - "/mix-app/views/app-portal/pages/module/components/module-advanced/view.html", - bindings: { - model: "=", - additionalData: "=", - }, - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - ctrl.isAdmin = $rootScope.isAdmin; - }; - }, - ], -}); - app.component("moduleContent", { templateUrl: "/mix-app/views/app-portal/pages/module/components/module-content/view.html", @@ -6879,16 +6882,6 @@ app.component("pageGeneral", { }, }); -app.component("pageModules", { - templateUrl: - "/mix-app/views/app-portal/pages/page/components/modules/modules.html", - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("pageMain", { templateUrl: "/mix-app/views/app-portal/pages/page/components/main/main.html", controller: [ @@ -6932,6 +6925,16 @@ app.component("pageMain", { }, }); +app.component("pageModules", { + templateUrl: + "/mix-app/views/app-portal/pages/page/components/modules/modules.html", + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("pageAdvanced", { templateUrl: "/mix-app/views/app-portal/pages/page/components/page-advanced/view.html", @@ -7066,24 +7069,6 @@ app.component("productRelated", { }, }); -app.component("pageSeo", { - templateUrl: "/mix-app/views/app-portal/pages/page/components/seo/seo.html", - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - }, - ], - bindings: { - page: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("permissionMain", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/main/main.html", @@ -7122,6 +7107,24 @@ app.component("permissionMain", { }, }); +app.component("pageSeo", { + templateUrl: "/mix-app/views/app-portal/pages/page/components/seo/seo.html", + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + }, + ], + bindings: { + page: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("permissionParents", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/parents/parents.html", @@ -7132,6 +7135,35 @@ app.component("permissionParents", { }, }); +app.component("postGeneral", { + templateUrl: + "/mix-app/views/app-portal/pages/post/components/general/view.html", + controller: [ + "$rootScope", + "ngAppSettings", + function ($rootScope, ngAppSettings) { + var ctrl = this; + ctrl.dataTypes = $rootScope.globalSettings.dataTypes; + ctrl.$onInit = function () {}; + ctrl.addProperty = function (type) { + var i = $(".property").length; + ctrl.post.properties.push({ + title: "", + name: "", + value: null, + dataType: "text", + }); + }; + }, + ], + bindings: { + post: "=", + isAdmin: "=", + onDelete: "&", + onUpdate: "&", + }, +}); + app.component("permissionPlugPlay", { templateUrl: "/mix-app/views/app-portal/pages/permission/components/plug-play/plug-play.html", @@ -7231,35 +7263,6 @@ app.component("permissionPlugPlay", { ], }); -app.component("postGeneral", { - templateUrl: - "/mix-app/views/app-portal/pages/post/components/general/view.html", - controller: [ - "$rootScope", - "ngAppSettings", - function ($rootScope, ngAppSettings) { - var ctrl = this; - ctrl.dataTypes = $rootScope.globalSettings.dataTypes; - ctrl.$onInit = function () {}; - ctrl.addProperty = function (type) { - var i = $(".property").length; - ctrl.post.properties.push({ - title: "", - name: "", - value: null, - dataType: "text", - }); - }; - }, - ], - bindings: { - post: "=", - isAdmin: "=", - onDelete: "&", - onUpdate: "&", - }, -}); - app.component("postMain", { templateUrl: "/mix-app/views/app-portal/pages/post/components/main/view.html", bindings: { @@ -7659,25 +7662,21 @@ app.component("serviceMain", { }, }); -app.component("themeExportMixDatabases", { +app.component("themeExportModules", { templateUrl: - "/mix-app/views/app-portal/pages/theme/components/theme-export-mix-databases/view.html", + "/mix-app/views/app-portal/pages/theme/components/theme-export-modules/view.html", controller: [ "$rootScope", "$scope", "ngAppSettings", function ($rootScope, $scope) { var ctrl = this; - ctrl.updateMixDatabaseExport = function () { - ctrl.selectedExport.mixDatabases = angular.copy( - $rootScope.filterArray( - ctrl.exportData.mixDatabases, - ["isActived"], - [true] - ) + ctrl.updateModuleExport = function () { + ctrl.selectedExport.modules = angular.copy( + $rootScope.filterArray(ctrl.exportData.modules, ["isActived"], [true]) ); - // angular.forEach(ctrl.selectedExport.mixDatabases,function(e){ - // e.data = angular.copy($rootScope.filterArray(e.data, ['isActived'], [true])); + // angular.forEach(ctrl.selectedExport.modules,function(e){ + // e.data.items = angular.copy($rootScope.filterArray(e.data.items, ['isActived'], [true])); // }); }; ctrl.selectAll = function (arr) { @@ -7686,7 +7685,7 @@ app.component("themeExportMixDatabases", { e.isActived = ctrl.selectedList.isSelectAll; e.isExportData = ctrl.selectedList.isExportData; }); - ctrl.updateMixDatabaseExport(); + ctrl.updateModuleExport(); }; }, ], @@ -7696,21 +7695,25 @@ app.component("themeExportMixDatabases", { }, }); -app.component("themeExportModules", { +app.component("themeExportMixDatabases", { templateUrl: - "/mix-app/views/app-portal/pages/theme/components/theme-export-modules/view.html", + "/mix-app/views/app-portal/pages/theme/components/theme-export-mix-databases/view.html", controller: [ "$rootScope", "$scope", "ngAppSettings", function ($rootScope, $scope) { var ctrl = this; - ctrl.updateModuleExport = function () { - ctrl.selectedExport.modules = angular.copy( - $rootScope.filterArray(ctrl.exportData.modules, ["isActived"], [true]) + ctrl.updateMixDatabaseExport = function () { + ctrl.selectedExport.mixDatabases = angular.copy( + $rootScope.filterArray( + ctrl.exportData.mixDatabases, + ["isActived"], + [true] + ) ); - // angular.forEach(ctrl.selectedExport.modules,function(e){ - // e.data.items = angular.copy($rootScope.filterArray(e.data.items, ['isActived'], [true])); + // angular.forEach(ctrl.selectedExport.mixDatabases,function(e){ + // e.data = angular.copy($rootScope.filterArray(e.data, ['isActived'], [true])); // }); }; ctrl.selectAll = function (arr) { @@ -7719,7 +7722,7 @@ app.component("themeExportModules", { e.isActived = ctrl.selectedList.isSelectAll; e.isExportData = ctrl.selectedList.isExportData; }); - ctrl.updateModuleExport(); + ctrl.updateMixDatabaseExport(); }; }, ], @@ -8197,6 +8200,55 @@ modules.component("actions", { ], }); +modules.component("additionalValue", { + templateUrl: + "/mix-app/views/app-portal/components/additional-value/view.html", + bindings: { + additionalData: "=?", + additionalDataId: "=?", + parentType: "=?", + parentId: "=?", + databaseName: "=?", + }, + controller: [ + "$rootScope", + "$scope", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, dataService) { + var ctrl = this; + ctrl.value = {}; + ctrl.column = { dataType: "Text" }; + ctrl.selectedCol = null; + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = async function () { + if (!ctrl.additionalData) { + if (!ctrl.additionalDataId) { + const obj = { + parentType: ctrl.parentType, + parentId: ctrl.parentId, + databaseName: ctrl.databaseName, + }; + const getData = await dataService.getAdditionalData(obj); + if (getData.isSucceed) { + ctrl.additionalData = getData.data; + ctrl.additionalData.mixDatabaseName = ctrl.databaseName; + ctrl.additionalData.parentType = ctrl.parentType; + ctrl.additionalData.parentId = ctrl.parentId; + $scope.$apply(); + } else { + $rootScope.showErrors(getData.errors); + } + } else { + var getData = await dataService.getSingle([ctrl.additionalDataId]); + ctrl.additionalData = getData.data; + $scope.$apply(); + } + } + }; + }, + ], +}); + modules.component("additionalColumn", { templateUrl: "/mix-app/views/app-portal/components/additional-column/view.html", @@ -8315,55 +8367,6 @@ modules.component("additionalColumn", { ], }); -modules.component("additionalValue", { - templateUrl: - "/mix-app/views/app-portal/components/additional-value/view.html", - bindings: { - additionalData: "=?", - additionalDataId: "=?", - parentType: "=?", - parentId: "=?", - databaseName: "=?", - }, - controller: [ - "$rootScope", - "$scope", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, dataService) { - var ctrl = this; - ctrl.value = {}; - ctrl.column = { dataType: "Text" }; - ctrl.selectedCol = null; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () { - if (!ctrl.additionalData) { - if (!ctrl.additionalDataId) { - const obj = { - parentType: ctrl.parentType, - parentId: ctrl.parentId, - databaseName: ctrl.databaseName, - }; - const getData = await dataService.getAdditionalData(obj); - if (getData.isSucceed) { - ctrl.additionalData = getData.data; - ctrl.additionalData.mixDatabaseName = ctrl.databaseName; - ctrl.additionalData.parentType = ctrl.parentType; - ctrl.additionalData.parentId = ctrl.parentId; - $scope.$apply(); - } else { - $rootScope.showErrors(getData.errors); - } - } else { - var getData = await dataService.getSingle([ctrl.additionalDataId]); - ctrl.additionalData = getData.data; - $scope.$apply(); - } - } - }; - }, - ], -}); - modules.component("customImage", { templateUrl: "/mix-app/views/app-portal/components/custom-image/custom-image.html", @@ -8681,8 +8684,9 @@ modules.component("funding", { bindings: {}, }); -modules.component("githubReleases", { - templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", +modules.component("githubContributers", { + templateUrl: + "/mix-app/views/app-portal/components/github-contributers/view.html", controller: [ "$rootScope", "$http", @@ -8692,7 +8696,7 @@ modules.component("githubReleases", { ctrl.init = function () { var req = { method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/releases", + url: "https://api.github.com/repos/mixcore/mix.core/contributors", }; ctrl.getGithubApiResult(req); }; @@ -8718,9 +8722,8 @@ modules.component("githubReleases", { bindings: {}, }); -modules.component("githubContributers", { - templateUrl: - "/mix-app/views/app-portal/components/github-contributers/view.html", +modules.component("githubReleases", { + templateUrl: "/mix-app/views/app-portal/components/github-releases/view.html", controller: [ "$rootScope", "$http", @@ -8730,7 +8733,7 @@ modules.component("githubContributers", { ctrl.init = function () { var req = { method: "GET", - url: "https://api.github.com/repos/mixcore/mix.core/contributors", + url: "https://api.github.com/repos/mixcore/mix.core/releases", }; ctrl.getGithubApiResult(req); }; @@ -9438,74 +9441,74 @@ modules.component("listMixColumn", { }, }); -modules.component("mainSideBar", { +modules.component("mainSideBarDynamic", { templateUrl: - "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", + "/mix-app/views/app-portal/components/main-side-bar-dynamic/main-side-bar-dynamic.html", controller: [ "$rootScope", "$scope", "ngAppSettings", - "TranslatorService", - "ApiService", "CommonService", + "TranslatorService", + "AuthService", function ( $rootScope, $scope, ngAppSettings, + commonService, translatorService, - apiService, - commonService + authService ) { var ctrl = this; - ctrl.items = []; ctrl.init = function () { - var routes = JSON.parse($("#portal-menus").val()); - ctrl.items = routes.data; + commonService.getPermissions().then(function (response) { + if (response && response.isSucceed) { + ctrl.isInit = true; + ctrl.roles = response.data; + if (ctrl.roles.data) { + ctrl.role = ctrl.roles.data[0]; + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }); }; }, ], - bindings: {}, + bindings: { + roles: "=", + activedRole: "=", + translate: "&", + }, }); -modules.component("mainSideBarDynamic", { +modules.component("mainSideBar", { templateUrl: - "/mix-app/views/app-portal/components/main-side-bar-dynamic/main-side-bar-dynamic.html", + "/mix-app/views/app-portal/components/main-side-bar/main-side-bar.html", controller: [ "$rootScope", "$scope", "ngAppSettings", - "CommonService", "TranslatorService", - "AuthService", + "ApiService", + "CommonService", function ( $rootScope, $scope, ngAppSettings, - commonService, translatorService, - authService + apiService, + commonService ) { var ctrl = this; + ctrl.items = []; ctrl.init = function () { - commonService.getPermissions().then(function (response) { - if (response && response.isSucceed) { - ctrl.isInit = true; - ctrl.roles = response.data; - if (ctrl.roles.data) { - ctrl.role = ctrl.roles.data[0]; - } - $rootScope.isBusy = false; - $scope.$apply(); - } - }); + var routes = JSON.parse($("#portal-menus").val()); + ctrl.items = routes.data; }; }, ], - bindings: { - roles: "=", - activedRole: "=", - translate: "&", - }, + bindings: {}, }); modules.component("mainSideBarItem", { @@ -9712,6 +9715,44 @@ modules.component("mainSideBarItemDynamic", { }, }); +modules.component("mediumNews", { + templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", + controller: [ + "$rootScope", + "$http", + function ($rootScope, $http) { + var ctrl = this; + ctrl.items = []; + ctrl.init = function () { + var req = { + method: "GET", + url: + "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + + Math.floor(Date.now() / 1000), + }; + ctrl.getMediumApiResult(req); + }; + + ctrl.getMediumApiResult = async function (req) { + return $http(req).then( + function (resp) { + if (resp.status == "200") { + ctrl.items = resp.data.items; + } + }, + function (error) { + return { + isSucceed: false, + errors: [error.statusText || error.status], + }; + } + ); + }; + }, + ], + bindings: {}, +}); + modules.component("mediaUpload", { templateUrl: "/mix-app/views/app-portal/components/media-upload/media-upload.html", @@ -9773,42 +9814,128 @@ modules.component("mediaUpload", { }, }); -modules.component("mediumNews", { - templateUrl: "/mix-app/views/app-portal/components/medium-news/view.html", +modules.component("mixDatabaseDataFilter", { + templateUrl: + "/mix-app/views/app-portal/components/mix-database-data-filter/view.html", + bindings: { + query: "=", + mixDatabaseName: "=?", + mixDatabaseId: "=?", + selectedList: "=", + initData: "=?", + columns: "=?", + selected: "=", + callback: "&?", + save: "&?", + }, controller: [ "$rootScope", - "$http", - function ($rootScope, $http) { + "$scope", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, ngAppSettings, dataService) { var ctrl = this; - ctrl.items = []; - ctrl.init = function () { - var req = { - method: "GET", - url: - "https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/mixcore&api_key=qww481wpgat3g4iqvqss7spzrilkbekpxpjgrbof&t=" + - Math.floor(Date.now() / 1000), - }; - ctrl.getMediumApiResult(req); + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.types = ["Page", "Post"]; + ctrl.type = "Page"; + ctrl.navs = []; + ctrl.data = { items: [] }; + ctrl.goToPath = $rootScope.goToPath; + ctrl.$onInit = function () { + if (ctrl.initData) { + ctrl.data = ctrl.initData; + } else { + ctrl.loadData(); + } }; + ctrl.loadData = async function (pageIndex) { + ctrl.isBusy = true; - ctrl.getMediumApiResult = async function (req) { - return $http(req).then( - function (resp) { - if (resp.status == "200") { - ctrl.items = resp.data.items; - } - }, - function (error) { - return { - isSucceed: false, - errors: [error.statusText || error.status], - }; + // ctrl.request.query = ctrl.query + ctrl.srcId; + ctrl.navs = []; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var df = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = df.toISOString(); + } + if (ctrl.request.toDate !== null) { + var dt = new Date(ctrl.request.toDate); + ctrl.request.toDate = dt.toISOString(); + } + if (ctrl.mixDatabaseId) { + ctrl.request.mixDatabaseId = ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.mixDatabaseName = ctrl.mixDatabaseName; + } + if (ctrl.filterType) { + ctrl.request.filterType = ctrl.filterType; + } + + var response = await dataService.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + ctrl.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + ctrl.isBusy = false; + $scope.$apply(); + } + }; + ctrl.edit = function (nav) { + switch (ctrl.type) { + case "Page": + ctrl.goToPath(`/portal/page/details/${nav.id}`); + break; + case "Post": + ctrl.goToPath(`/portal/post/details/${nav.id}`); + break; + case "Module": + ctrl.goToPath(`/portal/module/details/${nav.id}`); + break; + } + }; + ctrl.onClose = function () { + ctrl.callback(); + }; + ctrl.select = function (nav) { + var current = $rootScope.findObjectByKey(ctrl.data.items, "id", nav.id); + if (!nav.isActive && ctrl.callback) { + ctrl.callback({ nav: nav }); + } + if (ctrl.isMultiple) { + current.isActive = !current.isActive; + } else { + if (!nav.isActive) { + angular.forEach(ctrl.data.items, (element) => { + element.isActive = false; + }); } + current.isActive = !nav.isActive; + } + }; + ctrl.saveSelected = function () { + ctrl.selected = $rootScope.filterArray( + ctrl.data, + ["isActived"], + [true] ); + setTimeout(() => { + ctrl.save().then(() => { + ctrl.loadPosts(); + }); + }, 500); + }; + ctrl.limString = function (str, max) { + if (str) { + return str.length > max ? str.substring(0, max) + " ..." : str; + } }; }, ], - bindings: {}, }); modules.component("mixDatabaseColumn", { @@ -9921,154 +10048,30 @@ modules.component("mixDatabaseColumn", { ], }); -modules.component("mixDatabaseDataFilter", { +modules.component("mixDatabaseDataValueEditor", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-filter/view.html", + "/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html", bindings: { - query: "=", - mixDatabaseName: "=?", - mixDatabaseId: "=?", - selectedList: "=", - initData: "=?", - columns: "=?", - selected: "=", - callback: "&?", - save: "&?", + mixDatabaseDataValue: "=?", + parentType: "=?", + parentId: "=?", + isShowTitle: "=?", }, controller: [ "$rootScope", "$scope", "ngAppSettings", + "$location", + "RestRelatedMixDatabasePortalService", "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, ngAppSettings, dataService) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.types = ["Page", "Post"]; - ctrl.type = "Page"; - ctrl.navs = []; - ctrl.data = { items: [] }; - ctrl.goToPath = $rootScope.goToPath; - ctrl.$onInit = function () { - if (ctrl.initData) { - ctrl.data = ctrl.initData; - } else { - ctrl.loadData(); - } - }; - ctrl.loadData = async function (pageIndex) { - ctrl.isBusy = true; - - // ctrl.request.query = ctrl.query + ctrl.srcId; - ctrl.navs = []; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var df = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = df.toISOString(); - } - if (ctrl.request.toDate !== null) { - var dt = new Date(ctrl.request.toDate); - ctrl.request.toDate = dt.toISOString(); - } - if (ctrl.mixDatabaseId) { - ctrl.request.mixDatabaseId = ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.mixDatabaseName = ctrl.mixDatabaseName; - } - if (ctrl.filterType) { - ctrl.request.filterType = ctrl.filterType; - } - - var response = await dataService.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - ctrl.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - ctrl.isBusy = false; - $scope.$apply(); - } - }; - ctrl.edit = function (nav) { - switch (ctrl.type) { - case "Page": - ctrl.goToPath(`/portal/page/details/${nav.id}`); - break; - case "Post": - ctrl.goToPath(`/portal/post/details/${nav.id}`); - break; - case "Module": - ctrl.goToPath(`/portal/module/details/${nav.id}`); - break; - } - }; - ctrl.onClose = function () { - ctrl.callback(); - }; - ctrl.select = function (nav) { - var current = $rootScope.findObjectByKey(ctrl.data.items, "id", nav.id); - if (!nav.isActive && ctrl.callback) { - ctrl.callback({ nav: nav }); - } - if (ctrl.isMultiple) { - current.isActive = !current.isActive; - } else { - if (!nav.isActive) { - angular.forEach(ctrl.data.items, (element) => { - element.isActive = false; - }); - } - current.isActive = !nav.isActive; - } - }; - ctrl.saveSelected = function () { - ctrl.selected = $rootScope.filterArray( - ctrl.data, - ["isActived"], - [true] - ); - setTimeout(() => { - ctrl.save().then(() => { - ctrl.loadPosts(); - }); - }, 500); - }; - ctrl.limString = function (str, max) { - if (str) { - return str.length > max ? str.substring(0, max) + " ..." : str; - } - }; - }, - ], -}); - -modules.component("mixDatabaseDataValueEditor", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-value-editor/view.html", - bindings: { - mixDatabaseDataValue: "=?", - parentType: "=?", - parentId: "=?", - isShowTitle: "=?", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "$location", - "RestRelatedMixDatabasePortalService", - "RestMixDatabaseDataPortalService", - function ( - $rootScope, - $scope, - ngAppSettings, - $location, - navService, - dataService - ) { + function ( + $rootScope, + $scope, + ngAppSettings, + $location, + navService, + dataService + ) { var ctrl = this; ctrl.goToPath = $rootScope.goToPath; ctrl.icons = ngAppSettings.icons; @@ -10260,240 +10263,96 @@ modules.component("mixDatabaseDataValueEditor", { ], }); -modules.component("mixDatabaseDataValues", { +modules.component("mixDatabaseForm", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-data-values/view.html", + "/mix-app/views/app-portal/components/mix-database-form/view.html", bindings: { - header: "=", - data: "=", - canDrag: "=", - mixDatabaseName: "=?", - mixDatabaseId: "=?", - queries: "=?", - filterType: "=?", - selectedList: "=", - selectSingle: "=?", + mixDatabaseId: "=", + mixDatabaseName: "=", columns: "=?", - onFilterList: "&?", - onApplyList: "&?", - onSendMail: "&?", - onUpdate: "&?", - onDuplicate: "&?", - onDelete: "&?", + mixDatabaseDataId: "=?", + mixDatabaseData: "=", + parentType: "=?", // attribute set = 1 | post = 2 | page = 3 | module = 4 + parentId: "=?", + defaultId: "=", + backUrl: "=?", + level: "=?", + hideAction: "=?", + saveSuccess: "&?", }, controller: [ "$rootScope", "$scope", - "RestMixDatabaseColumnPortalService", + "$location", + "$routeParams", "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, columnService, dataService) { + function ($rootScope, $scope, $location, $routeParams, service) { var ctrl = this; - ctrl.actions = ["Delete", "SendMail"]; - ctrl.filterTypes = ["contain", "equal"]; + ctrl.isBusy = false; + ctrl.attributes = []; + + ctrl.defaultData = null; ctrl.selectedProp = null; ctrl.localizeSettings = $rootScope.globalSettings; ctrl.$onInit = async function () { - if (!ctrl.selectedList) { - ctrl.selectedList = { - action: "Delete", - data: [], - }; - } - if (!ctrl.columns) { - var getFields = await columnService.initData( - ctrl.mixDatabaseName || ctrl.mixDatabaseId - ); - if (getFields.isSucceed) { - ctrl.columns = getFields.data; - $scope.$apply(); - } - } + ctrl.level = ctrl.level || 0; + await ctrl.loadData(); }; - ctrl.select = function (item) { - if (item.isSelected) { - if (ctrl.selectSingle == "true") { - ctrl.selectedList.data = []; - ctrl.selectedList.data.push(item); + ctrl.loadData = async function () { + /* + If input is data id => load ctrl.mixDatabaseData from service and handle it independently + */ + ctrl.isBusy = true; + + if (ctrl.mixDatabaseDataId) { + var getData = await service.getSingle([ctrl.mixDatabaseDataId]); + ctrl.mixDatabaseData = getData.data; + if (ctrl.mixDatabaseData) { + ctrl.mixDatabaseData.parentId = ctrl.parentId; + ctrl.mixDatabaseData.parentType = ctrl.parentType; + ctrl.mixDatabaseId = ctrl.mixDatabaseData.mixDatabaseId; + ctrl.mixDatabaseName = ctrl.mixDatabaseData.mixDatabaseName; + ctrl.mixDatabaseTitle = $routeParams.mixDatabaseTitle; + ctrl.backUrl = `/portal/mix-database-data/list?mixDatabaseId=${ctrl.mixDatabaseData.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseData.mixDatabaseName}&mixDatabaseTitle=test`; + await ctrl.loadDefaultModel(); + ctrl.isBusy = false; + $scope.$apply(); } else { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - item.id - ); - if (!current) { - ctrl.selectedList.data.push(item); + if (getData) { + $rootScope.showErrors(getData.errors); } + ctrl.isBusy = false; + $scope.$apply(); } - } else { - $rootScope.removeObject(ctrl.selectedList, item.id); + } + if ((ctrl.mixDatabaseName || ctrl.mixDatabaseId) && !ctrl.defaultData) { + await ctrl.loadDefaultModel(); + ctrl.isBusy = false; + $scope.$apply(); } }; - ctrl.selectAll = function (isSelected) { - ctrl.selectedList.data = []; - angular.forEach(ctrl.data, function (e) { - e.isSelected = isSelected; - if (isSelected) { - ctrl.selectedList.data.push(e.id); - } - }); - }; - ctrl.filter = function () {}; - ctrl.sendMail = async function (data) { - ctrl.onSendMail({ data: data }); - }; - ctrl.apply = async function () { - ctrl.onApplyList(); - }; - - ctrl.duplicate = function (data) { - ctrl.onDuplicate({ data: data }); - }; - - ctrl.update = function (data) { - ctrl.onUpdate({ data: data }); - }; - - ctrl.delete = function (data) { - ctrl.onDelete({ data: data }); - }; - - ctrl.filterData = function (item, attributeName) { - return $rootScope.findObjectByKey( - item.data, - "attributeName", - attributeName - ); - }; - - ctrl.dragStart = function (index) { - ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.data[0].priority; - }; - ctrl.updateOrders = function (index, items) { - if (index > ctrl.dragStartIndex) { - ctrl.data.splice(ctrl.dragStartIndex, 1); - } else { - ctrl.data.splice(ctrl.dragStartIndex + 1, 1); - } - ctrl.updateDataInfos(); - }; - ctrl.updateDataInfos = async function () { - angular.forEach(ctrl.data, async function (e, i) { - e.priority = ctrl.minPriority + i; - var resp = await dataService.saveFields(e.id, { - priority: e.priority, - }); - if (resp && resp.isSucceed) { - $scope.activedPage = resp.data; - } else { - if (resp) { - $rootScope.showErrors(resp.errors); - } - } - }); - }; - - ctrl.view = function (item) { - var obj = { - columns: ctrl.columns, - item: item, - }; - $rootScope.preview("mix-database-data", obj, null, "modal-lg"); - }; - }, - ], -}); - -modules.component("mixDatabaseForm", { - templateUrl: - "/mix-app/views/app-portal/components/mix-database-form/view.html", - bindings: { - mixDatabaseId: "=", - mixDatabaseName: "=", - columns: "=?", - mixDatabaseDataId: "=?", - mixDatabaseData: "=", - parentType: "=?", // attribute set = 1 | post = 2 | page = 3 | module = 4 - parentId: "=?", - defaultId: "=", - backUrl: "=?", - level: "=?", - hideAction: "=?", - saveSuccess: "&?", - }, - controller: [ - "$rootScope", - "$scope", - "$location", - "$routeParams", - "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, $location, $routeParams, service) { - var ctrl = this; - ctrl.isBusy = false; - ctrl.attributes = []; - - ctrl.defaultData = null; - ctrl.selectedProp = null; - ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = async function () { - ctrl.level = ctrl.level || 0; - await ctrl.loadData(); - }; - ctrl.loadData = async function () { - /* - If input is data id => load ctrl.mixDatabaseData from service and handle it independently - */ - ctrl.isBusy = true; - - if (ctrl.mixDatabaseDataId) { - var getData = await service.getSingle([ctrl.mixDatabaseDataId]); - ctrl.mixDatabaseData = getData.data; - if (ctrl.mixDatabaseData) { - ctrl.mixDatabaseData.parentId = ctrl.parentId; - ctrl.mixDatabaseData.parentType = ctrl.parentType; - ctrl.mixDatabaseId = ctrl.mixDatabaseData.mixDatabaseId; - ctrl.mixDatabaseName = ctrl.mixDatabaseData.mixDatabaseName; - ctrl.mixDatabaseTitle = $routeParams.mixDatabaseTitle; - ctrl.backUrl = `/portal/mix-database-data/list?mixDatabaseId=${ctrl.mixDatabaseData.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseData.mixDatabaseName}&mixDatabaseTitle=test`; - await ctrl.loadDefaultModel(); - ctrl.isBusy = false; - $scope.$apply(); - } else { - if (getData) { - $rootScope.showErrors(getData.errors); - } - ctrl.isBusy = false; - $scope.$apply(); - } - } - if ((ctrl.mixDatabaseName || ctrl.mixDatabaseId) && !ctrl.defaultData) { - await ctrl.loadDefaultModel(); - ctrl.isBusy = false; - $scope.$apply(); - } - }; - ctrl.loadDefaultModel = async function () { - if ($routeParams.parentId) { - ctrl.parentId = $routeParams.parentId; - } - if ($routeParams.parentType) { - ctrl.parentType = $routeParams.parentType; - } - if (!ctrl.backUrl) { - if (ctrl.parentType) { - switch (ctrl.parentType) { - case "Post": - case "Page": - case "Module": - ctrl.backUrl = `/portal/${ctrl.parentType.toLowerCase()}/details/${ - ctrl.parentId - }`; - break; - - default: - ctrl.backUrl = `/portal/mix-database-data/details?dataId=${ctrl.parentId}&mixDatabaseId=${ctrl.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseName}&mixDatabaseTitle=${$routeParams.mixDatabaseTitle}`; - break; - } + ctrl.loadDefaultModel = async function () { + if ($routeParams.parentId) { + ctrl.parentId = $routeParams.parentId; + } + if ($routeParams.parentType) { + ctrl.parentType = $routeParams.parentType; + } + if (!ctrl.backUrl) { + if (ctrl.parentType) { + switch (ctrl.parentType) { + case "Post": + case "Page": + case "Module": + ctrl.backUrl = `/portal/${ctrl.parentType.toLowerCase()}/details/${ + ctrl.parentId + }`; + break; + + default: + ctrl.backUrl = `/portal/mix-database-data/details?dataId=${ctrl.parentId}&mixDatabaseId=${ctrl.mixDatabaseId}&mixDatabaseName=${ctrl.mixDatabaseName}&mixDatabaseTitle=${$routeParams.mixDatabaseTitle}`; + break; + } } } var getDefault = await service.initData( @@ -10606,152 +10465,145 @@ modules.component("mixDatabaseForm", { ], }); -modules.component("mixDatabaseNavData", { +modules.component("mixDatabaseDataValues", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-nav-data/view.html", + "/mix-app/views/app-portal/components/mix-database-data-values/view.html", bindings: { - nav: "=", - parentId: "=", - parentType: "=", + header: "=", + data: "=", + canDrag: "=", + mixDatabaseName: "=?", + mixDatabaseId: "=?", + queries: "=?", + filterType: "=?", + selectedList: "=", + selectSingle: "=?", + columns: "=?", + onFilterList: "&?", + onApplyList: "&?", + onSendMail: "&?", onUpdate: "&?", + onDuplicate: "&?", onDelete: "&?", }, controller: [ "$rootScope", "$scope", - "ngAppSettings", - "RestRelatedAttributeDataPortalService", + "RestMixDatabaseColumnPortalService", "RestMixDatabaseDataPortalService", - function ($rootScope, $scope, ngAppSettings, navService, dataService) { + function ($rootScope, $scope, columnService, dataService) { var ctrl = this; - ctrl.data = null; - ctrl.selected = null; - ctrl.navRequest = angular.copy(ngAppSettings.request); - ctrl.setRequest = angular.copy(ngAppSettings.request); + ctrl.actions = ["Delete", "SendMail"]; + ctrl.filterTypes = ["contain", "equal"]; + ctrl.selectedProp = null; ctrl.localizeSettings = $rootScope.globalSettings; - ctrl.$onInit = function () { - navService - .getDefault([ctrl.parentId, ctrl.parentType, "default"]) - .then((resp) => { - ctrl.defaultData = resp.data; - ctrl.defaultData.parentId = ctrl.parentId; - ctrl.defaultData.parentType = ctrl.parentType; - ctrl.selected = angular.copy(ctrl.defaultData); - ctrl.loadData(); - }); - ctrl.navRequest.parentType = ctrl.parentType; - ctrl.navRequest.parentId = ctrl.parentId; - }; - ctrl.selectPane = function (pane) {}; - ctrl.loadData = function () { - navService.getList(ctrl.navRequest).then((resp) => { - if (resp) { - ctrl.data = resp.data; + ctrl.$onInit = async function () { + if (!ctrl.selectedList) { + ctrl.selectedList = { + action: "Delete", + data: [], + }; + } + if (!ctrl.columns) { + var getFields = await columnService.initData( + ctrl.mixDatabaseName || ctrl.mixDatabaseId + ); + if (getFields.isSucceed) { + ctrl.columns = getFields.data; $scope.$apply(); + } + } + }; + ctrl.select = function (item) { + if (item.isSelected) { + if (ctrl.selectSingle == "true") { + ctrl.selectedList.data = []; + ctrl.selectedList.data.push(item); } else { - if (resp) { - $rootScope.showErrors("Failed"); + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + item.id + ); + if (!current) { + ctrl.selectedList.data.push(item); } - $scope.$apply(); + } + } else { + $rootScope.removeObject(ctrl.selectedList, item.id); + } + }; + ctrl.selectAll = function (isSelected) { + ctrl.selectedList.data = []; + angular.forEach(ctrl.data, function (e) { + e.isSelected = isSelected; + if (isSelected) { + ctrl.selectedList.data.push(e.id); } }); }; - ctrl.updateData = function (nav) { - ctrl.selected = nav; - var e = $(".pane-form-" + ctrl.nav.data.id)[0]; - angular.element(e).triggerHandler("click"); - // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); + ctrl.filter = function () {}; + ctrl.sendMail = async function (data) { + ctrl.onSendMail({ data: data }); }; - ctrl.saveData = function (data) { - $rootScope.isBusy = true; - ctrl.selected.data = data; - dataService.save(data).then((resp) => { - if (resp.isSucceed) { - ctrl.selected.dataId = resp.data.id; - ctrl.selected.mixDatabaseId = resp.data.mixDatabaseId; - ctrl.selected.mixDatabaseName = resp.data.mixDatabaseName; - ctrl.selected.attributeData = resp.data; - navService.save(ctrl.selected).then((resp) => { - if (resp.isSucceed) { - var tmp = $rootScope.findObjectByKey( - ctrl.data, - ["parentId", "parentType", "id"], - [resp.data.parentId, resp.data.parentType, resp.data.id] - ); - if (!tmp) { - ctrl.data.items.push(resp.data); - var e = $(".pane-data-" + ctrl.nav.data.id)[0]; - angular.element(e).triggerHandler("click"); - } - ctrl.selected = angular.copy(ctrl.defautData); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); + ctrl.apply = async function () { + ctrl.onApplyList(); }; - ctrl.removeData = async function (nav) { - $rootScope.showConfirm( - ctrl, - "removeDataConfirmed", - [nav], - null, - "Remove", - "Deleted data will not able to recover, are you sure you want to delete this item?" - ); + + ctrl.duplicate = function (data) { + ctrl.onDuplicate({ data: data }); }; - ctrl.removeDataConfirmed = async function (nav) { - $rootScope.isBusy = true; - var result = await navService.delete([nav.id]); - if (result.isSucceed) { - $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } + + ctrl.update = function (data) { + ctrl.onUpdate({ data: data }); + }; + + ctrl.delete = function (data) { + ctrl.onDelete({ data: data }); + }; + + ctrl.filterData = function (item, attributeName) { + return $rootScope.findObjectByKey( + item.data, + "attributeName", + attributeName + ); }; + ctrl.dragStart = function (index) { ctrl.dragStartIndex = index; ctrl.minPriority = ctrl.data[0].priority; }; - ctrl.updateOrders = function (index) { + ctrl.updateOrders = function (index, items) { if (index > ctrl.dragStartIndex) { ctrl.data.splice(ctrl.dragStartIndex, 1); } else { ctrl.data.splice(ctrl.dragStartIndex + 1, 1); } - var arrNavs = []; - angular.forEach(ctrl.data, function (e, i) { + ctrl.updateDataInfos(); + }; + ctrl.updateDataInfos = async function () { + angular.forEach(ctrl.data, async function (e, i) { e.priority = ctrl.minPriority + i; - var keys = { - parentId: e.parentId, - parentType: e.parentType, - id: e.id, - }; - var properties = { + var resp = await dataService.saveFields(e.id, { priority: e.priority, - }; - arrNavs.push({ - keys: keys, - properties: properties, }); + if (resp && resp.isSucceed) { + $scope.activedPage = resp.data; + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + } + } }); - navService.saveProperties("portal", arrNavs).then((resp) => { - $rootScope.isBusy = false; - $scope.$apply(); - }); + }; + + ctrl.view = function (item) { + var obj = { + columns: ctrl.columns, + item: item, + }; + $rootScope.preview("mix-database-data", obj, null, "modal-lg"); }; }, ], @@ -10946,13 +10798,13 @@ modules.component("mixDatabaseNavValues", { ], }); -modules.component("mixDatabaseNavs", { +modules.component("mixDatabaseNavData", { templateUrl: - "/mix-app/views/app-portal/components/mix-database-navs/view.html", + "/mix-app/views/app-portal/components/mix-database-nav-data/view.html", bindings: { + nav: "=", parentId: "=", parentType: "=", - mixDatabaseNavs: "=?", onUpdate: "&?", onDelete: "&?", }, @@ -10960,140 +10812,120 @@ modules.component("mixDatabaseNavs", { "$rootScope", "$scope", "ngAppSettings", - "RestRelatedMixDatabasePortalService", - "RestMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, navService, setService) { + "RestRelatedAttributeDataPortalService", + "RestMixDatabaseDataPortalService", + function ($rootScope, $scope, ngAppSettings, navService, dataService) { var ctrl = this; - ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; - ctrl.selected = {}; - ctrl.defaultData = null; + ctrl.data = null; + ctrl.selected = null; ctrl.navRequest = angular.copy(ngAppSettings.request); ctrl.setRequest = angular.copy(ngAppSettings.request); - ctrl.localizeSettings = $rootScope.globalSettings; ctrl.$onInit = function () { - // ctrl.setRequest.type = ctrl.parentType; - navService.getDefault().then((resp) => { - resp.parentId = ctrl.parentId; - resp.parentType = ctrl.parentType; - ctrl.defaultData = resp; - ctrl.loadData(); - }); + navService + .getDefault([ctrl.parentId, ctrl.parentType, "default"]) + .then((resp) => { + ctrl.defaultData = resp.data; + ctrl.defaultData.parentId = ctrl.parentId; + ctrl.defaultData.parentType = ctrl.parentType; + ctrl.selected = angular.copy(ctrl.defaultData); + ctrl.loadData(); + }); + ctrl.navRequest.parentType = ctrl.parentType; + ctrl.navRequest.parentId = ctrl.parentId; }; - ctrl.goToPath = $rootScope.goToPath; ctrl.selectPane = function (pane) {}; - ctrl.loadData = async function () { - // Load attr set navs if not in input - if (!ctrl.mixDatabaseNavs) { - ctrl.navRequest.parentType = ctrl.parentType; - ctrl.navRequest.parentId = ctrl.parentId; - var resp = await navService.getList(ctrl.navRequest); + ctrl.loadData = function () { + navService.getList(ctrl.navRequest).then((resp) => { if (resp) { - angular.forEach(resp.data.items, (e) => { - e.isActived = true; - ctrl.mixDatabaseNavs.push(e); - }); + ctrl.data = resp.data; + $scope.$apply(); } else { if (resp) { - $rootScope.showErrors(resp.errors); - } - } - } else { - angular.forEach(ctrl.mixDatabaseNavs, (e) => { - e.isActived = true; - }); - } - - var setResult = await setService.getList(ctrl.setRequest); - if (setResult) { - angular.forEach(setResult.data.items, (element) => { - var e = $rootScope.findObjectByKey( - ctrl.mixDatabaseNavs, - "mixDatabaseId", - element.id - ); - if (!e) { - e = angular.copy(ctrl.defaultData); - e.status = "Published"; - e.mixDatabaseId = element.id; - e.specificulture = navService.lang; - e.data = element; - e.isActived = false; - ctrl.mixDatabaseNavs.push(e); + $rootScope.showErrors("Failed"); } - }); - } else { - if (setResult) { - $rootScope.showErrors("Others Failed"); + $scope.$apply(); } - } - $scope.$apply(); - }; - ctrl.change = async function (nav) { - $rootScope.isBusy = true; - var result; - if (nav.isActived) { - ctrl.active(nav); - } else { - ctrl.deactive(nav); - } + }); }; - - ctrl.deactive = async function (nav) { - let result = null; - if (nav.id) { - result = await navService.delete([nav.id]); - $(".pane-container-" + nav.data.id) - .parent() - .remove(); - } - if (result && result.isSucceed) { - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - } + ctrl.updateData = function (nav) { + ctrl.selected = nav; + var e = $(".pane-form-" + ctrl.nav.data.id)[0]; + angular.element(e).triggerHandler("click"); + // $location.url('/portal/mix-database-data/details?dataId='+ item.id +'&mixDatabaseId=' + item.mixDatabaseId+'&parentType=' + item.parentType+'&parentId=' + item.parentId); }; - - ctrl.active = async function (nav) { + ctrl.saveData = function (data) { $rootScope.isBusy = true; - var result; - result = await navService.save(nav); - if (result && result.isSucceed) { - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - - ctrl.update = function (data) { - ctrl.onUpdate({ - data: data, - }); - }; - - ctrl.delete = function (data) { - ctrl.onDelete({ - data: data, + ctrl.selected.data = data; + dataService.save(data).then((resp) => { + if (resp.isSucceed) { + ctrl.selected.dataId = resp.data.id; + ctrl.selected.mixDatabaseId = resp.data.mixDatabaseId; + ctrl.selected.mixDatabaseName = resp.data.mixDatabaseName; + ctrl.selected.attributeData = resp.data; + navService.save(ctrl.selected).then((resp) => { + if (resp.isSucceed) { + var tmp = $rootScope.findObjectByKey( + ctrl.data, + ["parentId", "parentType", "id"], + [resp.data.parentId, resp.data.parentType, resp.data.id] + ); + if (!tmp) { + ctrl.data.items.push(resp.data); + var e = $(".pane-data-" + ctrl.nav.data.id)[0]; + angular.element(e).triggerHandler("click"); + } + ctrl.selected = angular.copy(ctrl.defautData); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } }); }; - + ctrl.removeData = async function (nav) { + $rootScope.showConfirm( + ctrl, + "removeDataConfirmed", + [nav], + null, + "Remove", + "Deleted data will not able to recover, are you sure you want to delete this item?" + ); + }; + ctrl.removeDataConfirmed = async function (nav) { + $rootScope.isBusy = true; + var result = await navService.delete([nav.id]); + if (result.isSucceed) { + $rootScope.removeObjectByKey(ctrl.data, "id", nav.id); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; ctrl.dragStart = function (index) { ctrl.dragStartIndex = index; - ctrl.minPriority = ctrl.mixDatabaseNavs[0].priority; + ctrl.minPriority = ctrl.data[0].priority; }; ctrl.updateOrders = function (index) { if (index > ctrl.dragStartIndex) { - ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex, 1); + ctrl.data.splice(ctrl.dragStartIndex, 1); } else { - ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex + 1, 1); + ctrl.data.splice(ctrl.dragStartIndex + 1, 1); } var arrNavs = []; - angular.forEach(ctrl.mixDatabaseNavs, function (e, i) { + angular.forEach(ctrl.data, function (e, i) { e.priority = ctrl.minPriority + i; var keys = { parentId: e.parentId, @@ -11206,6 +11038,41 @@ modules.component("mixFileUpload", { ], }); +modules.component("mixSelectIcons", { + templateUrl: + "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", + controller: [ + "$rootScope", + "$scope", + "$location", + "$element", + function ($rootScope, $scope, $location, $element) { + var ctrl = this; + ctrl.limitTo = 20; + ctrl.container = $element[0].querySelector(".list-icon"); + ctrl.translate = function (keyword) { + return $rootScope.translate(keyword); + }; + ctrl.showMore = () => { + if ( + ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && + ctrl.limitTo < ctrl.options.length + ) { + ctrl.limitTo *= 2; + } + }; + ctrl.select = function (ico) { + ctrl.data = ico.class; + }; + }, + ], + bindings: { + data: "=", + prefix: "=", + options: "=", + }, +}); + "use strict"; app.controller("MixNavigationController", [ "$scope", @@ -11327,130 +11194,266 @@ app.controller("MixNavigationController", [ }, ]); -modules.component("mixSelectIcons", { - templateUrl: - "/mix-app/views/app-portal/components/mix-select-icons/mix-select-icons.html", - controller: [ - "$rootScope", - "$scope", - "$location", - "$element", - function ($rootScope, $scope, $location, $element) { - var ctrl = this; - ctrl.limitTo = 20; - ctrl.container = $element[0].querySelector(".list-icon"); - ctrl.translate = function (keyword) { - return $rootScope.translate(keyword); - }; - ctrl.showMore = () => { - if ( - ctrl.container.scrollTop >= ctrl.container.scrollHeight - 200 && - ctrl.limitTo < ctrl.options.length - ) { - ctrl.limitTo *= 2; - } - }; - ctrl.select = function (ico) { - ctrl.data = ico.class; - }; - }, - ], - bindings: { - data: "=", - prefix: "=", - options: "=", - }, -}); - -modules.component("mixTemplateEditor", { +modules.component("mixDatabaseNavs", { templateUrl: - "/mix-app/views/app-portal/components/mix-template-editor/view.html", + "/mix-app/views/app-portal/components/mix-database-navs/view.html", bindings: { - template: "=", - folderType: "=", - isReadonly: "=?", - lineCount: "=?", - hideJs: "=?", - hideCss: "=?", + parentId: "=", + parentType: "=", + mixDatabaseNavs: "=?", + onUpdate: "&?", + onDelete: "&?", }, controller: [ - "$scope", "$rootScope", - "$routeParams", + "$scope", "ngAppSettings", - "GlobalSettingsService", - "TemplateService", - function ( - $scope, - $rootScope, - $routeParams, - ngAppSettings, - globalSettingsService, - service - ) { - BaseCtrl.call( - this, - $scope, - $rootScope, - $routeParams, - ngAppSettings, - service - ); + "RestRelatedMixDatabasePortalService", + "RestMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, navService, setService) { var ctrl = this; - ctrl.isNull = false; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.selectPane = function (pane) { - ctrl.activedPane = pane; - }; - ctrl.selectTemplate = function (template) { - ctrl.template = template; - $scope.$broadcast("updateContentCodeEditors", []); - }; - ctrl.new = function () { - ctrl.template.id = 0; - }; - ctrl.init = async function () { - if (ctrl.folderType) { - var themeId = $rootScope.localizeSettings.data.ThemeId; - ctrl.request.key = ctrl.folderType; - var resp = await service.getList(ctrl.request, [themeId]); + ctrl.mixDatabaseNavs = ctrl.mixDatabaseNavs || []; + ctrl.selected = {}; + ctrl.defaultData = null; + ctrl.navRequest = angular.copy(ngAppSettings.request); + ctrl.setRequest = angular.copy(ngAppSettings.request); - if (resp && resp.isSucceed) { - ctrl.templates = resp.data.items; - if (!ctrl.template) { - ctrl.template = ctrl.templates[0]; - } - $rootScope.isBusy = false; - $scope.$apply(); + ctrl.localizeSettings = $rootScope.globalSettings; + ctrl.$onInit = function () { + // ctrl.setRequest.type = ctrl.parentType; + navService.getDefault().then((resp) => { + resp.parentId = ctrl.parentId; + resp.parentType = ctrl.parentType; + ctrl.defaultData = resp; + ctrl.loadData(); + }); + }; + ctrl.goToPath = $rootScope.goToPath; + ctrl.selectPane = function (pane) {}; + ctrl.loadData = async function () { + // Load attr set navs if not in input + if (!ctrl.mixDatabaseNavs) { + ctrl.navRequest.parentType = ctrl.parentType; + ctrl.navRequest.parentId = ctrl.parentId; + var resp = await navService.getList(ctrl.navRequest); + if (resp) { + angular.forEach(resp.data.items, (e) => { + e.isActived = true; + ctrl.mixDatabaseNavs.push(e); + }); } else { if (resp) { $rootScope.showErrors(resp.errors); - $rootScope.isBusy = false; - $scope.$apply(); } } + } else { + angular.forEach(ctrl.mixDatabaseNavs, (e) => { + e.isActived = true; + }); } - }; - ctrl.updateTemplateContent = function (content) { - ctrl.template.content = content; - }; - ctrl.updateStyleContent = function (content) { - ctrl.template.scripts = content; - }; - ctrl.updateScriptContent = function (content) { - ctrl.template.styles = content; - }; - }, - ], -}); -modules.component("mixValueEditor", { - templateUrl: - "/mix-app/views/app-portal/components/mix-value-editor/view.html", - bindings: { - title: "=?", - isSelect: "=?", - stringValue: "=", + var setResult = await setService.getList(ctrl.setRequest); + if (setResult) { + angular.forEach(setResult.data.items, (element) => { + var e = $rootScope.findObjectByKey( + ctrl.mixDatabaseNavs, + "mixDatabaseId", + element.id + ); + if (!e) { + e = angular.copy(ctrl.defaultData); + e.status = "Published"; + e.mixDatabaseId = element.id; + e.specificulture = navService.lang; + e.data = element; + e.isActived = false; + ctrl.mixDatabaseNavs.push(e); + } + }); + } else { + if (setResult) { + $rootScope.showErrors("Others Failed"); + } + } + $scope.$apply(); + }; + ctrl.change = async function (nav) { + $rootScope.isBusy = true; + var result; + if (nav.isActived) { + ctrl.active(nav); + } else { + ctrl.deactive(nav); + } + }; + + ctrl.deactive = async function (nav) { + let result = null; + if (nav.id) { + result = await navService.delete([nav.id]); + $(".pane-container-" + nav.data.id) + .parent() + .remove(); + } + if (result && result.isSucceed) { + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + } + }; + + ctrl.active = async function (nav) { + $rootScope.isBusy = true; + var result; + result = await navService.save(nav); + if (result && result.isSucceed) { + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + + ctrl.update = function (data) { + ctrl.onUpdate({ + data: data, + }); + }; + + ctrl.delete = function (data) { + ctrl.onDelete({ + data: data, + }); + }; + + ctrl.dragStart = function (index) { + ctrl.dragStartIndex = index; + ctrl.minPriority = ctrl.mixDatabaseNavs[0].priority; + }; + ctrl.updateOrders = function (index) { + if (index > ctrl.dragStartIndex) { + ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex, 1); + } else { + ctrl.mixDatabaseNavs.splice(ctrl.dragStartIndex + 1, 1); + } + var arrNavs = []; + angular.forEach(ctrl.mixDatabaseNavs, function (e, i) { + e.priority = ctrl.minPriority + i; + var keys = { + parentId: e.parentId, + parentType: e.parentType, + id: e.id, + }; + var properties = { + priority: e.priority, + }; + arrNavs.push({ + keys: keys, + properties: properties, + }); + }); + navService.saveProperties("portal", arrNavs).then((resp) => { + $rootScope.isBusy = false; + $scope.$apply(); + }); + }; + }, + ], +}); + +modules.component("mixTemplateEditor", { + templateUrl: + "/mix-app/views/app-portal/components/mix-template-editor/view.html", + bindings: { + template: "=", + folderType: "=", + isReadonly: "=?", + lineCount: "=?", + hideJs: "=?", + hideCss: "=?", + }, + controller: [ + "$scope", + "$rootScope", + "$routeParams", + "ngAppSettings", + "GlobalSettingsService", + "TemplateService", + function ( + $scope, + $rootScope, + $routeParams, + ngAppSettings, + globalSettingsService, + service + ) { + BaseCtrl.call( + this, + $scope, + $rootScope, + $routeParams, + ngAppSettings, + service + ); + var ctrl = this; + ctrl.isNull = false; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.selectPane = function (pane) { + ctrl.activedPane = pane; + }; + ctrl.selectTemplate = function (template) { + ctrl.template = template; + $scope.$broadcast("updateContentCodeEditors", []); + }; + ctrl.new = function () { + ctrl.template.id = 0; + }; + ctrl.init = async function () { + if (ctrl.folderType) { + var themeId = $rootScope.localizeSettings.data.ThemeId; + ctrl.request.key = ctrl.folderType; + var resp = await service.getList(ctrl.request, [themeId]); + + if (resp && resp.isSucceed) { + ctrl.templates = resp.data.items; + if (!ctrl.template) { + ctrl.template = ctrl.templates[0]; + } + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (resp) { + $rootScope.showErrors(resp.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + } + } + }; + ctrl.updateTemplateContent = function (content) { + ctrl.template.content = content; + }; + ctrl.updateStyleContent = function (content) { + ctrl.template.scripts = content; + }; + ctrl.updateScriptContent = function (content) { + ctrl.template.styles = content; + }; + }, + ], +}); + +modules.component("mixValueEditor", { + templateUrl: + "/mix-app/views/app-portal/components/mix-value-editor/view.html", + bindings: { + title: "=?", + isSelect: "=?", + stringValue: "=", type: "=", }, controller: [ @@ -11579,111 +11582,51 @@ modules.component("mixValueEditor", { ], }); -modules.component("modalBookmark", { +modules.component("modalContentFilter", { templateUrl: - "/mix-app/views/app-portal/components/modal-bookmark/modal-bookmark.html", + "/mix-app/views/app-portal/components/modal-content-filter/modal-content-filter.html", + bindings: { + query: "=", + initData: "=?", + selected: "=", + callback: "&?", + save: "&?", + }, controller: [ "$rootScope", "$scope", - "localStorageService", - "$routeParams", - "$location", + "ngAppSettings", + "PostRestService", + "PageRestService", + "ModuleRestService", function ( $rootScope, $scope, - localStorageService, - $routeParams, - $location + ngAppSettings, + postService, + pageService, + moduleService ) { var ctrl = this; - ctrl.searchText = ""; - ctrl.defaultModel = { - url: "", - title: "", + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.types = ["Page", "Post", "Module"]; + ctrl.moduleId = null; + ctrl.type = "Page"; + ctrl.navs = []; + ctrl.data = { + items: [], }; - ctrl.bookmarks = []; - ctrl.model = null; + // ctrl.goToPath = $rootScope.goToPath; ctrl.$onInit = function () { - ctrl.model = angular.copy(ctrl.defaultModel); - ctrl.getCurrentUrl(); - ctrl.bookmarks = localStorageService.get("bookmarks") || []; - }; - ctrl.goToPath = function (url) { - $rootScope.goToPath(url); - $("#dlg-bookmark").modal("hide"); - }; - ctrl.getCurrentUrl = function (url) { - url = url || $location.url(); - ctrl.model.url = url; - ctrl.model.title = url; - }; - ctrl.removeBookmark = function (url) { - $rootScope.removeObjectByKey(ctrl.bookmarks, "url", url); - localStorageService.set("bookmarks", ctrl.bookmarks); - }; - ctrl.addBookmark = function () { - var current = $rootScope.findObjectByKey( - ctrl.bookmarks, - "url", - ctrl.model.url - ); - if (current) { - current.title = ctrl.model.title; - } else { - ctrl.bookmarks.push(ctrl.model); - } - localStorageService.set("bookmarks", ctrl.bookmarks); - ctrl.model = angular.copy(ctrl.defaultModel); - }; - }, - ], -}); - -modules.component("modalContentFilter", { - templateUrl: - "/mix-app/views/app-portal/components/modal-content-filter/modal-content-filter.html", - bindings: { - query: "=", - initData: "=?", - selected: "=", - callback: "&?", - save: "&?", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "PostRestService", - "PageRestService", - "ModuleRestService", - function ( - $rootScope, - $scope, - ngAppSettings, - postService, - pageService, - moduleService - ) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.types = ["Page", "Post", "Module"]; - ctrl.moduleId = null; - ctrl.type = "Page"; - ctrl.navs = []; - ctrl.data = { - items: [], - }; - // ctrl.goToPath = $rootScope.goToPath; - ctrl.$onInit = function () { - $("#modal-content-filter").on("shown.bs.modal", function () { - if (ctrl.initData) { - ctrl.data = ctrl.initData; - } else { - if (!ctrl.data.items.length) { - ctrl.loadData(); - } - } - }); + $("#modal-content-filter").on("shown.bs.modal", function () { + if (ctrl.initData) { + ctrl.data = ctrl.initData; + } else { + if (!ctrl.data.items.length) { + ctrl.loadData(); + } + } + }); }; ctrl.closeDialog = function () { $("#modal-content-filter").modal("hide"); @@ -11807,6 +11750,66 @@ modules.component("modalContentFilter", { ], }); +modules.component("modalBookmark", { + templateUrl: + "/mix-app/views/app-portal/components/modal-bookmark/modal-bookmark.html", + controller: [ + "$rootScope", + "$scope", + "localStorageService", + "$routeParams", + "$location", + function ( + $rootScope, + $scope, + localStorageService, + $routeParams, + $location + ) { + var ctrl = this; + ctrl.searchText = ""; + ctrl.defaultModel = { + url: "", + title: "", + }; + ctrl.bookmarks = []; + ctrl.model = null; + ctrl.$onInit = function () { + ctrl.model = angular.copy(ctrl.defaultModel); + ctrl.getCurrentUrl(); + ctrl.bookmarks = localStorageService.get("bookmarks") || []; + }; + ctrl.goToPath = function (url) { + $rootScope.goToPath(url); + $("#dlg-bookmark").modal("hide"); + }; + ctrl.getCurrentUrl = function (url) { + url = url || $location.url(); + ctrl.model.url = url; + ctrl.model.title = url; + }; + ctrl.removeBookmark = function (url) { + $rootScope.removeObjectByKey(ctrl.bookmarks, "url", url); + localStorageService.set("bookmarks", ctrl.bookmarks); + }; + ctrl.addBookmark = function () { + var current = $rootScope.findObjectByKey( + ctrl.bookmarks, + "url", + ctrl.model.url + ); + if (current) { + current.title = ctrl.model.title; + } else { + ctrl.bookmarks.push(ctrl.model); + } + localStorageService.set("bookmarks", ctrl.bookmarks); + ctrl.model = angular.copy(ctrl.defaultModel); + }; + }, + ], +}); + app.component("modalCroppie", { templateUrl: "/mix-app/views/app-portal/components/modal-croppie/view.html", bidings: { @@ -11848,317 +11851,119 @@ modules.component("modalHelper", { function ( $rootScope, $scope, - localStorageService, - $routeParams, - $location, - $sce - ) { - var ctrl = this; - ctrl.$onInit = function () { - $("#dev-helper-modal").on("shown.bs.modal", function () { - if ($rootScope.helperUrl) { - ctrl.trustedUrl = $sce.trustAsResourceUrl($rootScope.helperUrl); - ctrl.title = "Developer Document"; - } else { - ctrl.loadHelperUrl(); - ctrl.title = "Developer Document"; - } - $rootScope.helperUrl = null; - $scope.$apply(); - }); - }; - ctrl.loadHelperUrl = function () { - var portalUrl = $location.url(); - // var portalabsUrl = $location.absUrl(); - var defaultUrl = "//docs.mixcore.org"; - ctrl.trustedUrl = $sce.trustAsResourceUrl(defaultUrl); - - if (portalUrl.startsWith("/portal")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-administration-screens" - ); - } - if ( - portalUrl.startsWith("/portal/mix-database-data/list?mixDatabaseId=2") - ) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-navigation" - ); - } - if (portalUrl.startsWith("/portal/post")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-writing-posts" - ); - } - if (portalUrl.startsWith("/portal/page")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-page" - ); - } - if (portalUrl.startsWith("/portal/module")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-module" - ); - } - if (portalUrl.startsWith("/portal/mix-database")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-database" - ); - } - if ( - portalUrl.startsWith("/portal/mix-database-data/list?mixDatabaseId=7") - ) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-category" - ); - } - if ( - portalUrl.startsWith("/portal/mix-database-data/list?mixDatabaseId=8") - ) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-tag" - ); - } - if (portalUrl.startsWith("/portal/media")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-media" - ); - } - if (portalUrl.startsWith("/portal/file")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-file" - ); - } - if (portalUrl.startsWith("/portal/user")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-user" - ); - } - if (portalUrl.startsWith("/portal/theme")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-theme" - ); - } - if (portalUrl.startsWith("/portal/app-settings")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-app-settings" - ); - } - if (portalUrl.startsWith("/portal/configuration")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-configuration" - ); - } - if (portalUrl.startsWith("/portal/my-profile")) { - ctrl.trustedUrl = $sce.trustAsResourceUrl( - defaultUrl + "/basic-usage-users-profile" - ); - } - - // switch (portalUrl) { - // case '/portal': - // default: - // ctrl.trustedUrl = $sce.trustAsResourceUrl(defaultUrl); - // break; - // } - }; - }, - ], -}); - -modules.component("modalNavDatas", { - templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", - bindings: { - mixDatabaseId: "=?", - mixDatabaseName: "=?", - parentId: "=?", - parentType: "=?", - type: "=?", - columnDisplay: "=?", - selectedList: "=?", - selectCallback: "&", - save: "&", - }, - controller: [ - "$rootScope", - "$scope", - "ngAppSettings", - "RestMixDatabaseDataPortalService", - "RestRelatedMixDatabasePortalService", - function ($rootScope, $scope, ngAppSettings, service, navService) { - var ctrl = this; - ctrl.request = angular.copy(ngAppSettings.request); - ctrl.request.key = "readData"; - ctrl.navs = []; - - ctrl.queries = {}; - ctrl.data = { items: [] }; - ctrl.$onInit = function () { - if (!ctrl.selectedList) { - ctrl.selectedList = []; - } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - }; - ctrl.loadData = async function (pageIndex) { - ctrl.request.query = ""; - if (pageIndex !== undefined) { - ctrl.request.pageIndex = pageIndex; - } - if (ctrl.request.fromDate !== null) { - var d = new Date(ctrl.request.fromDate); - ctrl.request.fromDate = d.toISOString(); - } - if (ctrl.request.toDate !== null) { - var d = new Date(ctrl.request.toDate); - ctrl.request.toDate = d.toISOString(); - } - if (ctrl.mixDatabaseId) { - ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; - } - if (ctrl.mixDatabaseName) { - ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; - } - Object.keys(ctrl.queries).forEach((e) => { - if (ctrl.queries[e]) { - ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; - } - }); - var response = await service.getList(ctrl.request); - if (response.isSucceed) { - ctrl.data = response.data; - ctrl.navs = []; - angular.forEach(response.data.items, function (e) { - e.disabled = - $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; - // var item = { - // priority: e.priority, - // description: e.data.title, - // postId: e.id, - // image: e.thumbnailUrl, - // specificulture: e.specificulture, - // status: 'Published', - // isActived: false - // }; - // item[ctrl.srcField] = ctrl.srcId; - // ctrl.navs.push(item); - }); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showErrors(response.errors); - $rootScope.isBusy = false; - $scope.$apply(); - } - }; - ctrl.select = function (value, isSelected) { - if (isSelected) { - if (ctrl.parentId) { - var nav = { - mixDatabaseName: ctrl.mixDatabaseName, - parentId: ctrl.parentId, - parentType: ctrl.parentType, - id: value, - }; - navService.save(nav).then((resp) => { - if (resp.isSucceed) { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); - } else { - var current = $rootScope.findObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - if (!current) { - data.disabled = true; - ctrl.selectedList.push(data); - } - } - } else { - if (ctrl.parentId) { - navService - .delete([ctrl.parentId, ctrl.parentType, data.id]) - .then((resp) => { - if (resp.isSucceed) { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey( - ctrl.selectedList, - "id", - data.id - ); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); + localStorageService, + $routeParams, + $location, + $sce + ) { + var ctrl = this; + ctrl.$onInit = function () { + $("#dev-helper-modal").on("shown.bs.modal", function () { + if ($rootScope.helperUrl) { + ctrl.trustedUrl = $sce.trustAsResourceUrl($rootScope.helperUrl); + ctrl.title = "Developer Document"; } else { - data.disabled = false; - var tmp = $rootScope.findObjectByKey( - ctrl.data.items, - "id", - data.id - ); - if (tmp) { - tmp.disabled = false; - } - $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); + ctrl.loadHelperUrl(); + ctrl.title = "Developer Document"; } + $rootScope.helperUrl = null; + $scope.$apply(); + }); + }; + ctrl.loadHelperUrl = function () { + var portalUrl = $location.url(); + // var portalabsUrl = $location.absUrl(); + var defaultUrl = "//docs.mixcore.org"; + ctrl.trustedUrl = $sce.trustAsResourceUrl(defaultUrl); + + if (portalUrl.startsWith("/portal")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-administration-screens" + ); } - if (ctrl.selectCallback) { - ctrl.selectCallback({ data: data }); + if ( + portalUrl.startsWith("/portal/mix-database-data/list?mixDatabaseId=2") + ) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-navigation" + ); } - }; - ctrl.createData = function () { - var data = { - title: ctrl.newTitle, - slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), - type: ctrl.type, - }; - service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { - if (resp.isSucceed) { - ctrl.data.items.push(resp.data); - $rootScope.showMessage("success", "success"); - $rootScope.isBusy = false; - $scope.$apply(); - } else { - $rootScope.showMessage("failed"); - $rootScope.isBusy = false; - $scope.$apply(); - } - }); + if (portalUrl.startsWith("/portal/post")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-writing-posts" + ); + } + if (portalUrl.startsWith("/portal/page")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-page" + ); + } + if (portalUrl.startsWith("/portal/module")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-module" + ); + } + if (portalUrl.startsWith("/portal/mix-database")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-database" + ); + } + if ( + portalUrl.startsWith("/portal/mix-database-data/list?mixDatabaseId=7") + ) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-category" + ); + } + if ( + portalUrl.startsWith("/portal/mix-database-data/list?mixDatabaseId=8") + ) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-tag" + ); + } + if (portalUrl.startsWith("/portal/media")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-media" + ); + } + if (portalUrl.startsWith("/portal/file")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-file" + ); + } + if (portalUrl.startsWith("/portal/user")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-user" + ); + } + if (portalUrl.startsWith("/portal/theme")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-theme" + ); + } + if (portalUrl.startsWith("/portal/app-settings")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-app-settings" + ); + } + if (portalUrl.startsWith("/portal/configuration")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-configuration" + ); + } + if (portalUrl.startsWith("/portal/my-profile")) { + ctrl.trustedUrl = $sce.trustAsResourceUrl( + defaultUrl + "/basic-usage-users-profile" + ); + } + + // switch (portalUrl) { + // case '/portal': + // default: + // ctrl.trustedUrl = $sce.trustAsResourceUrl(defaultUrl); + // break; + // } }; }, ], @@ -12410,23 +12215,221 @@ modules.component("modalNavMetas", { ctrl.mixDatabaseData.obj.type = ctrl.type; dataService.save(ctrl.mixDatabaseData).then((resp) => { if (resp.isSucceed) { - ctrl.data.items.push(resp.data); - ctrl.reload(); - ctrl.select(resp.data.id, true); - ctrl.filterData(); - ctrl.isBusy = false; + ctrl.data.items.push(resp.data); + ctrl.reload(); + ctrl.select(resp.data.id, true); + ctrl.filterData(); + ctrl.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(resp.errors); + ctrl.isBusy = false; + $scope.$apply(); + } + }); + } else { + tmp.isActived = true; + ctrl.select(tmp); + } + } + }; + }, + ], +}); + +modules.component("modalNavDatas", { + templateUrl: "/mix-app/views/app-portal/components/modal-nav-datas/view.html", + bindings: { + mixDatabaseId: "=?", + mixDatabaseName: "=?", + parentId: "=?", + parentType: "=?", + type: "=?", + columnDisplay: "=?", + selectedList: "=?", + selectCallback: "&", + save: "&", + }, + controller: [ + "$rootScope", + "$scope", + "ngAppSettings", + "RestMixDatabaseDataPortalService", + "RestRelatedMixDatabasePortalService", + function ($rootScope, $scope, ngAppSettings, service, navService) { + var ctrl = this; + ctrl.request = angular.copy(ngAppSettings.request); + ctrl.request.key = "readData"; + ctrl.navs = []; + + ctrl.queries = {}; + ctrl.data = { items: [] }; + ctrl.$onInit = function () { + if (!ctrl.selectedList) { + ctrl.selectedList = []; + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } + }; + ctrl.loadData = async function (pageIndex) { + ctrl.request.query = ""; + if (pageIndex !== undefined) { + ctrl.request.pageIndex = pageIndex; + } + if (ctrl.request.fromDate !== null) { + var d = new Date(ctrl.request.fromDate); + ctrl.request.fromDate = d.toISOString(); + } + if (ctrl.request.toDate !== null) { + var d = new Date(ctrl.request.toDate); + ctrl.request.toDate = d.toISOString(); + } + if (ctrl.mixDatabaseId) { + ctrl.request.query = "mixDatabaseId=" + ctrl.mixDatabaseId; + } + if (ctrl.mixDatabaseName) { + ctrl.request.query += "&mixDatabaseName=" + ctrl.mixDatabaseName; + } + Object.keys(ctrl.queries).forEach((e) => { + if (ctrl.queries[e]) { + ctrl.request.query += "&" + e + "=" + ctrl.queries[e]; + } + }); + var response = await service.getList(ctrl.request); + if (response.isSucceed) { + ctrl.data = response.data; + ctrl.navs = []; + angular.forEach(response.data.items, function (e) { + e.disabled = + $rootScope.findObjectByKey(ctrl.selectedList, "id", e.id) != null; + // var item = { + // priority: e.priority, + // description: e.data.title, + // postId: e.id, + // image: e.thumbnailUrl, + // specificulture: e.specificulture, + // status: 'Published', + // isActived: false + // }; + // item[ctrl.srcField] = ctrl.srcId; + // ctrl.navs.push(item); + }); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showErrors(response.errors); + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + ctrl.select = function (value, isSelected) { + if (isSelected) { + if (ctrl.parentId) { + var nav = { + mixDatabaseName: ctrl.mixDatabaseName, + parentId: ctrl.parentId, + parentType: ctrl.parentType, + id: value, + }; + navService.save(nav).then((resp) => { + if (resp.isSucceed) { + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; $scope.$apply(); } else { - $rootScope.showErrors(resp.errors); - ctrl.isBusy = false; + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; $scope.$apply(); } }); } else { - tmp.isActived = true; - ctrl.select(tmp); + var current = $rootScope.findObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + if (!current) { + data.disabled = true; + ctrl.selectedList.push(data); + } + } + } else { + if (ctrl.parentId) { + navService + .delete([ctrl.parentId, ctrl.parentType, data.id]) + .then((resp) => { + if (resp.isSucceed) { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey( + ctrl.selectedList, + "id", + data.id + ); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); + } else { + data.disabled = false; + var tmp = $rootScope.findObjectByKey( + ctrl.data.items, + "id", + data.id + ); + if (tmp) { + tmp.disabled = false; + } + $rootScope.removeObjectByKey(ctrl.selectedList, "id", data.id); } } + if (ctrl.selectCallback) { + ctrl.selectCallback({ data: data }); + } + }; + ctrl.createData = function () { + var data = { + title: ctrl.newTitle, + slug: $rootScope.generateKeyword(ctrl.newTitle, "-"), + type: ctrl.type, + }; + service.saveByName(ctrl.mixDatabaseName, data).then((resp) => { + if (resp.isSucceed) { + ctrl.data.items.push(resp.data); + $rootScope.showMessage("success", "success"); + $rootScope.isBusy = false; + $scope.$apply(); + } else { + $rootScope.showMessage("failed"); + $rootScope.isBusy = false; + $scope.$apply(); + } + }); }; }, ], @@ -12721,15 +12724,6 @@ modules.component("modalNavs", { ], }); -modules.component("modalPermission", { - templateUrl: - "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", - controller: "PermissionController", - bindings: { - message: "=", - }, -}); - modules.component("modalTemplate", { templateUrl: "/mix-app/views/app-portal/components/modal-template/view.html", controller: [ @@ -12772,6 +12766,15 @@ modules.component("modalTemplate", { ], }); +modules.component("modalPermission", { + templateUrl: + "/mix-app/views/app-portal/components/modal-permission/modal-permission.html", + controller: "PermissionController", + bindings: { + message: "=", + }, +}); + modules.component("monacoEditor", { templateUrl: "/mix-app/views/app-portal/components/monaco-editor/view.html", bindings: { @@ -13260,59 +13263,6 @@ modules.component("propertiesValue", { ], }); -modules.component("relatedNavs", { - templateUrl: - "/mix-app/views/app-portal/components/related-navigations/view.html", - bindings: { - request: "=", - prefix: "=", - sourceId: "=", - culture: "=", - navs: "=", - data: "=", - loadData: "&", - }, - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.selected = null; - ctrl.activeItem = function (item, index) { - var currentItem = $rootScope.findObjectByKey( - ctrl.navs, - ["sourceId", "destinationId"], - [ctrl.sourceId, item.id] - ); - if (currentItem === null) { - currentItem = item; - currentItem.priority = ctrl.navs.length + 1; - ctrl.navs.push(currentItem); - ctrl.data.items.splice(index, 1); - } - }; - ctrl.updateOrders = function (index) { - ctrl.navs.splice(index, 1); - for (var i = 0; i < ctrl.data.length; i++) { - ctrl.navs[i].priority = i + 1; - } - }; - ctrl.load = async function (pageIndex) { - if (pageIndex) { - ctrl.request.pageIndex = pageIndex; - } - ctrl.data = await ctrl.loadData({ pageIndex: ctrl.request.pageIndex }); - }; - ctrl.checkActived = function (item) { - if (ctrl.navs) { - return ctrl.navs.find(function (nav) { - return nav.destinationId === item.id; - }); - } - }; - }, - ], -}); - modules.component("serviceHubPortal", { templateUrl: "/mix-app/views/app-portal/components/service-hub-portal/view.html", @@ -13481,6 +13431,59 @@ modules.component("serviceHubPortal", { ], }); +modules.component("relatedNavs", { + templateUrl: + "/mix-app/views/app-portal/components/related-navigations/view.html", + bindings: { + request: "=", + prefix: "=", + sourceId: "=", + culture: "=", + navs: "=", + data: "=", + loadData: "&", + }, + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.selected = null; + ctrl.activeItem = function (item, index) { + var currentItem = $rootScope.findObjectByKey( + ctrl.navs, + ["sourceId", "destinationId"], + [ctrl.sourceId, item.id] + ); + if (currentItem === null) { + currentItem = item; + currentItem.priority = ctrl.navs.length + 1; + ctrl.navs.push(currentItem); + ctrl.data.items.splice(index, 1); + } + }; + ctrl.updateOrders = function (index) { + ctrl.navs.splice(index, 1); + for (var i = 0; i < ctrl.data.length; i++) { + ctrl.navs[i].priority = i + 1; + } + }; + ctrl.load = async function (pageIndex) { + if (pageIndex) { + ctrl.request.pageIndex = pageIndex; + } + ctrl.data = await ctrl.loadData({ pageIndex: ctrl.request.pageIndex }); + }; + ctrl.checkActived = function (item) { + if (ctrl.navs) { + return ctrl.navs.find(function (nav) { + return nav.destinationId === item.id; + }); + } + }; + }, + ], +}); + modules.component("templateEditor", { templateUrl: "/mix-app/views/app-portal/components/template-editor/templateEditor.html", @@ -13559,22 +13562,6 @@ modules.component("templateEditor", { ], }); -modules.component("toastHelper", { - templateUrl: - "/mix-app/views/app-portal/components/toast-helper/toast-helper.html", - bindings: { - url: "=?", - title: "=?", - }, - controller: [ - "$rootScope", - function ($rootScope) { - var ctrl = this; - ctrl.visible = $rootScope.visible; - }, - ], -}); - modules.component("urlAlias", { templateUrl: "/mix-app/views/app-portal/components/url-alias/url-alias.html", controller: [ @@ -13636,6 +13623,22 @@ modules.component("urlAlias", { }, }); +modules.component("toastHelper", { + templateUrl: + "/mix-app/views/app-portal/components/toast-helper/toast-helper.html", + bindings: { + url: "=?", + title: "=?", + }, + controller: [ + "$rootScope", + function ($rootScope) { + var ctrl = this; + ctrl.visible = $rootScope.visible; + }, + ], +}); + !(function (t) { var e = {}; function i(n) { diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/header-nav/headerNav.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/header-nav/headerNav.html index af199935b..b3c715813 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/header-nav/headerNav.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/components/header-nav/headerNav.html @@ -9,4 +9,4 @@ -webkit-mask: url(../mix-app/assets/mixcore-logo-red-2.svg) no-repeat 50% 50%; mask: url(../mix-app/assets/mixcore-logo-red-2.svg) no-repeat 50% - 50%;"> \ No newline at end of file + 50%;"> \ No newline at end of file diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/configuration/list.html b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/configuration/list.html index b3249f373..7d87db89a 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/configuration/list.html +++ b/src/Mix.Cms.Web/wwwroot/mix-app/views/app-portal/pages/configuration/list.html @@ -1 +1 @@ -
    Setting KeyDescriptionValueCategory
    \ No newline at end of file +
    Setting KeyDescriptionValueCategory
    \ No newline at end of file From 5720dabe99236e14f0f21f702f1f13c13bcbbd1c Mon Sep 17 00:00:00 2001 From: Hoang Nguyen Nhat Date: Mon, 6 Sep 2021 15:48:42 +0700 Subject: [PATCH 19/83] clean up user data --- .../Controllers/v1/ApiAccountController.cs | 50 +- .../ViewModels/Account/MixAccountHelper.cs | 4 +- .../Account/MixPortalUserViewModel.cs | 51 + .../ViewModels/Account/MixUserViewModel.cs | 37 +- .../ViewModels/MixDatabaseDatas/Helper.cs | 29 + .../ViewModels/MixThemes/Helper.cs | 4 +- .../wwwroot/mix-app/js/app-client.min.js | 30 +- .../wwwroot/mix-app/js/app-init.min.js | 354 +- .../mix-app/js/app-portal-required.min.js | 2 +- .../wwwroot/mix-app/js/app-portal.min.js | 3910 ++++++++--------- .../wwwroot/mix-app/js/app-security.min.js | 272 +- .../wwwroot/mix-app/js/app-shared.min.js | 1704 +++---- .../wwwroot/mix-app/js/framework.min.js | 2 +- .../views/app-init/pages/step2/view.html | 2 +- .../views/app-portal/pages/user/list.html | 2 +- .../app-portal/pages/user/my-profile.html | 2 +- .../views/app-security/pages/login/view.html | 2 +- .../app-security/pages/register/view.html | 2 +- .../components/login-popup/view.html | 2 +- 19 files changed, 3280 insertions(+), 3181 deletions(-) create mode 100644 src/Mix.Cms.Lib/ViewModels/Account/MixPortalUserViewModel.cs diff --git a/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs b/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs index 4aa17d1f4..f1af3665c 100644 --- a/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs +++ b/src/Mix.Cms.Api/Controllers/v1/ApiAccountController.cs @@ -148,19 +148,11 @@ public async Task>> Regist var createResult = await _userManager.CreateAsync(user, password: model.Password).ConfigureAwait(false); if (createResult.Succeeded) { - // Save Additional Data - var formData = await Mix.Cms.Lib.ViewModels.MixDatabaseDatas.Helper.GetFormDataAsync( - MixDatabaseNames.SYSTEM_USER_DATA, MixService.GetAppSetting("DefaultCulture")); - if (formData != null) - { - formData.ParentId = user.UserName; - formData.ParentType = MixDatabaseParentType.User; - formData.Obj = model.UserData; - var saveData = await formData.SaveModelAsync(true); - result.IsSucceed = saveData.IsSucceed; - result.Errors = saveData.Errors; - result.Exception = saveData.Exception; - } + var saveData = await Mix.Cms.Lib.ViewModels.MixDatabaseDatas.Helper.SaveObjAsync( + MixDatabaseNames.SYSTEM_USER_DATA, model.UserData, user.UserName, MixDatabaseParentType.User); + result.IsSucceed = saveData.IsSucceed; + result.Errors = saveData.Errors; + result.Exception = saveData.Exception; _logger.LogInformation("User created a new account with password."); user = await _userManager.FindByNameAsync(model.Username).ConfigureAwait(false); @@ -274,16 +266,16 @@ public async Task Details(string viewType, string id = null) [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [HttpGet] [Route("my-profile")] - public async Task> MyProfile() + public async Task> MyProfile() { string id = User.Claims.SingleOrDefault(c => c.Type == "Id")?.Value; ApplicationUser user = await _userManager.FindByIdAsync(id); ; if (user != null) { - var mixUser = new MixUserViewModel(user); + var mixUser = new MixPortalUserViewModel(user); await mixUser.LoadUserDataAsync(); - return Ok(new RepositoryResponse() + return Ok(new RepositoryResponse() { IsSucceed = true, Data = mixUser @@ -297,10 +289,10 @@ public async Task> MyProfile() [MixAuthorize] [HttpPost] [Route("save")] - public async Task> Save( - [FromBody] MixUserViewModel model) + public async Task> Save( + [FromBody] MixPortalUserViewModel model) { - var result = new RepositoryResponse() { IsSucceed = true }; + var result = new RepositoryResponse() { IsSucceed = true }; if (model != null && model.User != null) { var user = await _userManager.FindByIdAsync(model.User.Id); @@ -350,32 +342,32 @@ public async Task> SaveMyProfile( string id = User.Claims.SingleOrDefault(c => c.Type == "Id")?.Value; - if (model != null && model.User != null) + if (model != null) { - if (id != model.User.Id) + if (id != model.Id) { result.IsSucceed = false; result.Errors.Add("Invalid request"); return result; } - var user = await _userManager.FindByIdAsync(model.User.Id); - user.Email = model.User.Email; - user.FirstName = model.User.FirstName; - user.LastName = model.User.LastName; - user.Avatar = model.User.Avatar; + var user = await _userManager.FindByIdAsync(model.Id); + user.Email = model.Email; + user.FirstName = model.FirstName; + user.LastName = model.LastName; var updInfo = await _userManager.UpdateAsync(user); result.IsSucceed = updInfo.Succeeded; if (result.IsSucceed) { - var saveData = await model.UserData.SaveModelAsync(true); + var saveData = await Mix.Cms.Lib.ViewModels.MixDatabaseDatas.Helper.SaveObjAsync( + MixDatabaseNames.SYSTEM_USER_DATA, model.UserData, user.UserName, MixDatabaseParentType.User); result.IsSucceed = saveData.IsSucceed; result.Errors = saveData.Errors; result.Exception = saveData.Exception; } if (result.IsSucceed && model.IsChangePassword) { - var changePwd = await _userManager.ChangePasswordAsync(model.User, model.ChangePassword.CurrentPassword, model.ChangePassword.NewPassword); + var changePwd = await _userManager.ChangePasswordAsync(user, model.ChangePassword.CurrentPassword, model.ChangePassword.NewPassword); if (!changePwd.Succeeded) { foreach (var err in changePwd.Errors) @@ -390,7 +382,7 @@ public async Task> SaveMyProfile( await RefreshTokenViewModel.Repository.RemoveModelAsync(r => r.Id != refreshToken); } } - MixFileRepository.Instance.EmptyFolder($"{MixFolders.MixCacheFolder}/Mix/Cms/Lib/ViewModels/Account/MixUsers/_{model.User.Id}"); + MixFileRepository.Instance.EmptyFolder($"{MixFolders.MixCacheFolder}/Mix/Cms/Lib/ViewModels/Account/MixUsers/_{model.Id}"); return result; } return result; diff --git a/src/Mix.Cms.Lib/ViewModels/Account/MixAccountHelper.cs b/src/Mix.Cms.Lib/ViewModels/Account/MixAccountHelper.cs index 890d908d5..05b32a23d 100644 --- a/src/Mix.Cms.Lib/ViewModels/Account/MixAccountHelper.cs +++ b/src/Mix.Cms.Lib/ViewModels/Account/MixAccountHelper.cs @@ -15,14 +15,14 @@ namespace Mix.Cms.Lib.ViewModels.Account { public class MixAccountHelper { - public static async Task LoadUserInfoAsync(string userName, + public static async Task LoadUserInfoAsync(string username, MixCmsContext _context = null, IDbContextTransaction _transaction = null) { var culture = MixService.GetAppSetting(MixAppSettingKeywords.DefaultCulture); UnitOfWorkHelper.InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { - var getInfo = await MixDatabaseDatas.Helper.LoadAdditionalDataAsync(MixDatabaseParentType.User, userName, MixDatabaseNames.SYSTEM_USER_DATA + var getInfo = await MixDatabaseDatas.Helper.LoadAdditionalDataAsync(MixDatabaseParentType.User, username, MixDatabaseNames.SYSTEM_USER_DATA , culture, context, transaction); return getInfo.Data; } diff --git a/src/Mix.Cms.Lib/ViewModels/Account/MixPortalUserViewModel.cs b/src/Mix.Cms.Lib/ViewModels/Account/MixPortalUserViewModel.cs new file mode 100644 index 000000000..1acf28303 --- /dev/null +++ b/src/Mix.Cms.Lib/ViewModels/Account/MixPortalUserViewModel.cs @@ -0,0 +1,51 @@ +using Mix.Heart.Models; +using Mix.Identity.Models; +using Mix.Identity.Models.AccountViewModels; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Mix.Cms.Lib.ViewModels.Account +{ + public class MixPortalUserViewModel + { + [JsonProperty("user")] + public ApplicationUser User { get; set; } + + [JsonProperty("mediaFile")] + public FileViewModel MediaFile { get; set; } = new FileViewModel(); + + [JsonProperty("userData")] + public MixDatabaseDatas.AdditionalViewModel UserData { get; set; } + + [JsonProperty("userRoles")] + public List UserRoles { get; set; } + + #region Change Password + + [JsonProperty("resetPassword")] + public ResetPasswordViewModel ResetPassword { get; set; } + + [JsonProperty("isChangePassword")] + public bool IsChangePassword { get; set; } + + [JsonProperty("changePassword")] + public ChangePasswordViewModel ChangePassword { get; set; } + + #endregion Change Password + + public MixPortalUserViewModel(ApplicationUser user) + { + User = user; + } + + public async Task LoadUserDataAsync() + { + if (User != null) + { + UserData ??= await MixAccountHelper.LoadUserInfoAsync(User.UserName); + UserRoles = MixAccountHelper.GetRoleNavs(User.Id); + } + } + } +} \ No newline at end of file diff --git a/src/Mix.Cms.Lib/ViewModels/Account/MixUserViewModel.cs b/src/Mix.Cms.Lib/ViewModels/Account/MixUserViewModel.cs index 0a12c2407..c355d9bb8 100644 --- a/src/Mix.Cms.Lib/ViewModels/Account/MixUserViewModel.cs +++ b/src/Mix.Cms.Lib/ViewModels/Account/MixUserViewModel.cs @@ -2,6 +2,7 @@ using Mix.Identity.Models; using Mix.Identity.Models.AccountViewModels; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.Threading.Tasks; @@ -9,14 +10,19 @@ namespace Mix.Cms.Lib.ViewModels.Account { public class MixUserViewModel { - [JsonProperty("user")] - public ApplicationUser User { get; set; } - - [JsonProperty("mediaFile")] - public FileViewModel MediaFile { get; set; } = new FileViewModel(); + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("username")] + public string Username { get; set; } + [JsonProperty("email")] + public string Email { get; set; } + [JsonProperty("firstName")] + public string FirstName { get; set; } + [JsonProperty("lastName")] + public string LastName { get; set; } [JsonProperty("userData")] - public MixDatabaseDatas.AdditionalViewModel UserData { get; set; } + public JObject UserData { get; set; } [JsonProperty("userRoles")] public List UserRoles { get; set; } @@ -36,15 +42,26 @@ public class MixUserViewModel public MixUserViewModel(ApplicationUser user) { - User = user; + if (user != null) + { + Id = user.Id; + Username = user.UserName; + Email = user.Email; + FirstName = user.FirstName; + LastName = user.LastName; + } } public async Task LoadUserDataAsync() { - if (User != null) + if (!string.IsNullOrEmpty(Username)) { - UserData ??= await MixAccountHelper.LoadUserInfoAsync(User.UserName); - UserRoles = MixAccountHelper.GetRoleNavs(User.Id); + if(UserData == null) + { + var data = await MixAccountHelper.LoadUserInfoAsync(Username); + UserData = data.Obj; + } + UserRoles = MixAccountHelper.GetRoleNavs(Id); } } } diff --git a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs index 542a3a905..9f9562565 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixDatabaseDatas/Helper.cs @@ -167,6 +167,35 @@ public static async Task> LoadAdditional } } + public static async Task> SaveObjAsync(string databaseName, JObject obj, string parentId = null, MixDatabaseParentType? parentType = null, string culture = null) + { + culture ??= MixService.GetAppSetting("DefaultCulture"); + string id = obj.Value("id"); + FormViewModel formData; + + if (id == null) + { + formData = await GetFormDataAsync(databaseName, culture); + } + else + { + var getFormData = await FormViewModel.Repository.GetSingleModelAsync(m => m.Id == id && m.Specificulture == culture); + formData = getFormData.Data; + } + + if (formData != null) + { + formData.ParentId = parentId; + if (parentType.HasValue) + { + formData.ParentType = parentType.Value; + } + formData.Obj = obj; + return await formData.SaveModelAsync(true); + } + return new(); + } + public static async Task GetFormDataAsync(string mixDatabase, string culture) { _ = int.TryParse(mixDatabase, out int mixDatabaseId); diff --git a/src/Mix.Cms.Lib/ViewModels/MixThemes/Helper.cs b/src/Mix.Cms.Lib/ViewModels/MixThemes/Helper.cs index a1d9776c1..d60e51dab 100644 --- a/src/Mix.Cms.Lib/ViewModels/MixThemes/Helper.cs +++ b/src/Mix.Cms.Lib/ViewModels/MixThemes/Helper.cs @@ -85,13 +85,13 @@ public static async Task> ExportTheme( } } - public static async Task> InitTheme(string model, string userName, string culture, IFormFile assets, IFormFile theme) + public static async Task> InitTheme(string model, string username, string culture, IFormFile assets, IFormFile theme) { var json = JObject.Parse(model); var data = json.ToObject(); if (data != null) { - data.CreatedBy = userName; + data.CreatedBy = username; data.Status = MixContentStatus.Published; string importFolder = MixFolders.ThemePackage; if (theme != null) diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-client.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-client.min.js index ba340b710..0d69cfe26 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-client.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-client.min.js @@ -2348,7 +2348,7 @@ app.controller("UserController", [ "UserService", function ($rootScope, $scope, authService, userService) { $scope.loginData = { - userName: "", + username: "", password: "", rememberme: true, }; @@ -2363,8 +2363,9 @@ app.controller("UserController", [ $scope.init = function () { authService.fillAuthData().then((resp) => { if (authService.authentication.info) { + $scope.user = authService.authentication.info; $scope.showLogin = false; - $scope.userData = authService.authentication.info.userData.obj; + $scope.userData = authService.authentication.info.userData; } else { $scope.showLogin = true; } @@ -2383,12 +2384,25 @@ app.controller("UserController", [ } }; - $scope.register = async function () { + $scope.save = async function () { $rootScope.isBusy = true; - var resp = await userService.register($scope.user); + var resp = null; + if (!user.id) { + resp = await userService.register($scope.user); + } else { + resp = await userService.saveUser($scope.user); + } if (resp && resp.isSucceed) { - $scope.activedUser = resp.data; + $scope.user = resp.data; $rootScope.showMessage("Update successfully!", "success"); + authService + .refreshToken( + authService.authentication.refresh_token, + authService.authentication.access_token + ) + .then(() => { + window.location = window.location; + }); $rootScope.isBusy = false; $scope.$apply(); } else { @@ -2404,7 +2418,7 @@ app.controller("UserController", [ $rootScope.isBusy = true; var response = await userService.getMyProfile(); if (response.isSucceed) { - $scope.activedUser = response.data; + $scope.user = response.data; $rootScope.isBusy = false; $scope.$apply(); } else { @@ -2415,10 +2429,10 @@ app.controller("UserController", [ }; $scope.save = async function () { $rootScope.isBusy = true; - var resp = await userService.saveUser($scope.activedUser); + var resp = await userService.saveUser($scope.user); if (resp && resp.isSucceed) { $rootScope.showMessage("Update successfully!", "success"); - if ($scope.activedUser.id == authService.authentication.id) { + if ($scope.user.id == authService.authentication.info.id) { authService .refreshToken( authService.authentication.refresh_token, diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-init.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-init.min.js index f47a16ed9..f9fb81fe3 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-init.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-init.min.js @@ -37,138 +37,6 @@ app.config(function ($routeProvider, $locationProvider, $sceProvider) { }); }); -"use strict"; -app.controller("Step2Controller", [ - "$scope", - "$rootScope", - "$location", - "ApiService", - "CommonService", - "Step2Services", - "AuthService", - function ( - $scope, - $rootScope, - $location, - apiService, - commonService, - services, - authService - ) { - $scope.user = { - userName: "", - email: "", - password: "", - confirmPassword: "", - isAgreed: false, - }; - $scope.init = async function () {}; - $scope.register = async function () { - if (!$scope.user.isAgreed) { - var ele = document.getElementById("notTNCYetChecked"); - ele.style.display = "block"; - // $rootScope.showMessage('Please agreed with our policy', 'warning'); - } else { - if ($scope.password !== $scope.confirmPassword) { - $rootScope.showErrors(["Confirm Password is not matched"]); - } else { - $rootScope.isBusy = true; - var result = await services.register($scope.user); - if (result.isSucceed) { - await commonService.fillAllSettings(); - var loginData = { - userName: $scope.user.userName, - password: $scope.user.password, - rememberMe: true, - }; - var result = await authService.login(loginData); - if (result.isSucceed) { - $rootScope.isBusy = false; - $rootScope.goToPath("/init/step3"); - $scope.$apply(); - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } - } - }; - $scope.advanceSetup = async function () { - if (!$scope.user.isAgreed) { - var ele = document.getElementById("notTNCYetChecked"); - ele.style.display = "block"; - // $rootScope.showMessage('Please agreed with our policy', 'warning'); - } else { - if ($scope.password !== $scope.confirmPassword) { - $rootScope.showErrors(["Confirm Password is not matched"]); - } else { - $rootScope.isBusy = true; - var result = await services.register($scope.user); - if (result.isSucceed) { - var loginData = { - userName: $scope.user.userName, - password: $scope.user.password, - rememberMe: true, - }; - var result = await authService.login(loginData); - if (result) { - $rootScope.isBusy = false; - // $location.url('/init/step3'); - $scope.$apply(); - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } else { - if (result) { - $rootScope.showErrors(result.errors); - } - $rootScope.isBusy = false; - $scope.$apply(); - } - } - } - }; - }, -]); - -"use strict"; -app.factory("Step2Services", [ - "$http", - "ApiService", - "CommonService", - function ($http, apiService, commonService) { - //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; - - var usersServiceFactory = {}; - var _register = async function (user) { - var req = { - method: "POST", - url: "/init/init-cms/step-2", - data: JSON.stringify(user), - }; - - return await apiService.getApiResult(req); - }; - - usersServiceFactory.register = _register; - return usersServiceFactory; - }, -]); - "use strict"; app.controller("Step1Controller", [ "$scope", @@ -347,71 +215,134 @@ app.factory("Step1Services", [ ]); "use strict"; -app.controller("Step4Controller", [ +app.controller("Step2Controller", [ "$scope", "$rootScope", + "$location", "ApiService", "CommonService", + "Step2Services", "AuthService", - "Step4Services", function ( $scope, $rootScope, + $location, apiService, commonService, - authService, - service + services, + authService ) { - var rand = Math.random(); - $scope.data = []; - $scope.init = async function () { - var getData = await commonService.loadJArrayData("languages.json"); - if (getData.isSucceed) { - $scope.data = getData.data; - $rootScope.isBusy = false; - $scope.$apply(); + $scope.user = { + username: "", + email: "", + password: "", + confirmPassword: "", + isAgreed: false, + }; + $scope.init = async function () {}; + $scope.register = async function () { + if (!$scope.user.isAgreed) { + var ele = document.getElementById("notTNCYetChecked"); + ele.style.display = "block"; + // $rootScope.showMessage('Please agreed with our policy', 'warning'); } else { - if (getData) { - $rootScope.showErrors(getData.errors); + if ($scope.password !== $scope.confirmPassword) { + $rootScope.showErrors(["Confirm Password is not matched"]); + } else { + $rootScope.isBusy = true; + var result = await services.register($scope.user); + if (result.isSucceed) { + await commonService.fillAllSettings(); + var loginData = { + username: $scope.user.username, + password: $scope.user.password, + rememberMe: true, + }; + var result = await authService.login(loginData); + if (result.isSucceed) { + $rootScope.isBusy = false; + $rootScope.goToPath("/init/step3"); + $scope.$apply(); + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } } - $rootScope.isBusy = false; - $scope.$apply(); } }; - $scope.submit = async function () { - $rootScope.isBusy = true; - var result = await service.submit($scope.data); - if (result.isSucceed) { - authService.initSettings().then(function () { - $rootScope.isBusy = false; - window.top.location = "/"; - }); + $scope.advanceSetup = async function () { + if (!$scope.user.isAgreed) { + var ele = document.getElementById("notTNCYetChecked"); + ele.style.display = "block"; + // $rootScope.showMessage('Please agreed with our policy', 'warning'); } else { - if (result) { - $rootScope.showErrors(result.errors); + if ($scope.password !== $scope.confirmPassword) { + $rootScope.showErrors(["Confirm Password is not matched"]); + } else { + $rootScope.isBusy = true; + var result = await services.register($scope.user); + if (result.isSucceed) { + var loginData = { + username: $scope.user.username, + password: $scope.user.password, + rememberMe: true, + }; + var result = await authService.login(loginData); + if (result) { + $rootScope.isBusy = false; + // $location.url('/init/step3'); + $scope.$apply(); + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } } - $rootScope.isBusy = false; } }; }, ]); "use strict"; -app.factory("Step4Services", [ +app.factory("Step2Services", [ + "$http", "ApiService", "CommonService", - function (apiService, commonService) { - var service = {}; - var _submit = async function (data) { + function ($http, apiService, commonService) { + //var serviceBase = 'http://ngauthenticationapi.azurewebsites.net/'; + + var usersServiceFactory = {}; + var _register = async function (user) { var req = { method: "POST", - url: "/init/init-cms/step-4", - data: JSON.stringify(data), + url: "/init/init-cms/step-2", + data: JSON.stringify(user), }; + return await apiService.getApiResult(req); }; - service.submit = _submit; - return service; + + usersServiceFactory.register = _register; + return usersServiceFactory; }, ]); @@ -570,6 +501,75 @@ app.factory("Step3Services", [ }, ]); +"use strict"; +app.controller("Step4Controller", [ + "$scope", + "$rootScope", + "ApiService", + "CommonService", + "AuthService", + "Step4Services", + function ( + $scope, + $rootScope, + apiService, + commonService, + authService, + service + ) { + var rand = Math.random(); + $scope.data = []; + $scope.init = async function () { + var getData = await commonService.loadJArrayData("languages.json"); + if (getData.isSucceed) { + $scope.data = getData.data; + $rootScope.isBusy = false; + $scope.$apply(); + } else { + if (getData) { + $rootScope.showErrors(getData.errors); + } + $rootScope.isBusy = false; + $scope.$apply(); + } + }; + $scope.submit = async function () { + $rootScope.isBusy = true; + var result = await service.submit($scope.data); + if (result.isSucceed) { + authService.initSettings().then(function () { + $rootScope.isBusy = false; + window.top.location = "/"; + }); + } else { + if (result) { + $rootScope.showErrors(result.errors); + } + $rootScope.isBusy = false; + } + }; + }, +]); + +"use strict"; +app.factory("Step4Services", [ + "ApiService", + "CommonService", + function (apiService, commonService) { + var service = {}; + var _submit = async function (data) { + var req = { + method: "POST", + url: "/init/init-cms/step-4", + data: JSON.stringify(data), + }; + return await apiService.getApiResult(req); + }; + service.submit = _submit; + return service; + }, +]); + "use strict"; app.controller("Step5Controller", [ "$scope", @@ -660,9 +660,9 @@ modules.component("mssqlLocalInfo", { }, }); -modules.component("mysqlInfo", { +modules.component("posgresqlInfo", { templateUrl: - "/mix-app/views/app-init/pages/step1/components/mysql-info/view.html", + "/mix-app/views/app-init/pages/step1/components/posgresql-info/view.html", controller: [ "$rootScope", function ($rootScope) { @@ -674,9 +674,9 @@ modules.component("mysqlInfo", { }, }); -modules.component("posgresqlInfo", { +modules.component("mysqlInfo", { templateUrl: - "/mix-app/views/app-init/pages/step1/components/posgresql-info/view.html", + "/mix-app/views/app-init/pages/step1/components/mysql-info/view.html", controller: [ "$rootScope", function ($rootScope) { @@ -702,9 +702,9 @@ modules.component("sqliteInfo", { }, }); -app.component("initCommonLanguages", { +app.component("initPortalLanguages", { templateUrl: - "/mix-app/views/app-init/pages/step4/components/common-languages/view.html", + "/mix-app/views/app-init/pages/step4/components/portal-languages/view.html", controller: [ "$rootScope", function ($rootScope) { @@ -714,7 +714,7 @@ app.component("initCommonLanguages", { ctrl.data = $rootScope.filterArray( ctrl.languages, ["category"], - ["Common"] + ["Portal"] ); }; }, @@ -724,9 +724,9 @@ app.component("initCommonLanguages", { }, }); -app.component("initPortalLanguages", { +app.component("initCommonLanguages", { templateUrl: - "/mix-app/views/app-init/pages/step4/components/portal-languages/view.html", + "/mix-app/views/app-init/pages/step4/components/common-languages/view.html", controller: [ "$rootScope", function ($rootScope) { @@ -736,7 +736,7 @@ app.component("initPortalLanguages", { ctrl.data = $rootScope.filterArray( ctrl.languages, ["category"], - ["Portal"] + ["Common"] ); }; }, diff --git a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js index 900d1c7d4..ed69ce6fc 100644 --- a/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js +++ b/src/Mix.Cms.Web/wwwroot/mix-app/js/app-portal-required.min.js @@ -1 +1 @@ -/* Tue Aug 31 2021 16:59:42 GMT+0700 (Indochina Time) */!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],i=Object.getPrototypeOf,o=n.slice,r=n.flat?function(e){return n.flat.call(e)}:function(e){return n.concat.apply([],e)},s=n.push,a=n.indexOf,l={},c=l.toString,u=l.hasOwnProperty,d=u.toString,h=d.call(Object),f={},p=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},g=function(e){return null!=e&&e===e.window},m=e.document,b={type:!0,src:!0,nonce:!0,noModule:!0};function v(e,t,n){var i,o,r=(n=n||m).createElement("script");if(r.text=e,t)for(i in b)(o=t[i]||t.getAttribute&&t.getAttribute(i))&&r.setAttribute(i,o);n.head.appendChild(r).parentNode.removeChild(r)}function y(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var w="3.6.0",_=function(e,t){return new _.fn.init(e,t)};function x(e){var t=!!e&&"length"in e&&e.length,n=y(e);return!p(e)&&!g(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+R+")"+R+"*"),U=new RegExp(R+"|>"),X=new RegExp(H),K=new RegExp("^"+B+"$"),V={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+H),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+O+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+R+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},ie=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,oe=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){h()},se=we(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{j.apply(L=$.call(_.childNodes),_.childNodes),L[_.childNodes.length].nodeType}catch(t){j={apply:L.length?function(e,t){P.apply(e,$.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function ae(e,t,i,o){var r,a,c,u,d,p,b,v=t&&t.ownerDocument,_=t?t.nodeType:9;if(i=i||[],"string"!=typeof e||!e||1!==_&&9!==_&&11!==_)return i;if(!o&&(h(t),t=t||f,g)){if(11!==_&&(d=J.exec(e)))if(r=d[1]){if(9===_){if(!(c=t.getElementById(r)))return i;if(c.id===r)return i.push(c),i}else if(v&&(c=v.getElementById(r))&&y(t,c)&&c.id===r)return i.push(c),i}else{if(d[2])return j.apply(i,t.getElementsByTagName(e)),i;if((r=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return j.apply(i,t.getElementsByClassName(r)),i}if(n.qsa&&!k[e+" "]&&(!m||!m.test(e))&&(1!==_||"object"!==t.nodeName.toLowerCase())){if(b=e,v=t,1===_&&(U.test(e)||W.test(e))){for((v=ee.test(e)&&be(t.parentNode)||t)===t&&n.scope||((u=t.getAttribute("id"))?u=u.replace(ie,oe):t.setAttribute("id",u=w)),a=(p=s(e)).length;a--;)p[a]=(u?"#"+u:":scope")+" "+ye(p[a]);b=p.join(",")}try{return j.apply(i,v.querySelectorAll(b)),i}catch(t){k(e,!0)}finally{u===w&&t.removeAttribute("id")}}}return l(e.replace(q,"$1"),t,i,o)}function le(){var e=[];return function t(n,o){return e.push(n+" ")>i.cacheLength&&delete t[e.shift()],t[n+" "]=o}}function ce(e){return e[w]=!0,e}function ue(e){var t=f.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var n=e.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=t}function he(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ge(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&se(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function me(e){return ce(function(t){return t=+t,ce(function(n,i){for(var o,r=e([],n.length,t),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))})})}function be(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ae.support={},r=ae.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!G.test(t||n&&n.nodeName||"HTML")},h=ae.setDocument=function(e){var t,o,s=e?e.ownerDocument||e:_;return s!=f&&9===s.nodeType&&s.documentElement&&(p=(f=s).documentElement,g=!r(f),_!=f&&(o=f.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",re,!1):o.attachEvent&&o.attachEvent("onunload",re)),n.scope=ue(function(e){return p.appendChild(e).appendChild(f.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(f.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Z.test(f.getElementsByClassName),n.getById=ue(function(e){return p.appendChild(e).id=w,!f.getElementsByName||!f.getElementsByName(w).length}),n.getById?(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,i,o,r=t.getElementById(e);if(r){if((n=r.getAttributeNode("id"))&&n.value===e)return[r];for(o=t.getElementsByName(e),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===e)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],o=0,r=t.getElementsByTagName(e);if("*"===e){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},b=[],m=[],(n.qsa=Z.test(f.querySelectorAll))&&(ue(function(e){var t;p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+R+"*(?:value|"+O+")"),e.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(t=f.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+R+"*name"+R+"*="+R+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")}),ue(function(e){e.innerHTML="";var t=f.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+R+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(n.matchesSelector=Z.test(v=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=v.call(e,"*"),v.call(e,"[s!='']:x"),b.push("!=",H)}),m=m.length&&new RegExp(m.join("|")),b=b.length&&new RegExp(b.join("|")),t=Z.test(p.compareDocumentPosition),y=t||Z.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},S=t?function(e,t){if(e===t)return d=!0,0;var i=!e.compareDocumentPosition-!t.compareDocumentPosition;return i||(1&(i=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===i?e==f||e.ownerDocument==_&&y(_,e)?-1:t==f||t.ownerDocument==_&&y(_,t)?1:u?I(u,e)-I(u,t):0:4&i?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,i=0,o=e.parentNode,r=t.parentNode,s=[e],a=[t];if(!o||!r)return e==f?-1:t==f?1:o?-1:r?1:u?I(u,e)-I(u,t):0;if(o===r)return he(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?he(s[i],a[i]):s[i]==_?-1:a[i]==_?1:0}),f},ae.matches=function(e,t){return ae(e,null,null,t)},ae.matchesSelector=function(e,t){if(h(e),n.matchesSelector&&g&&!k[t+" "]&&(!b||!b.test(t))&&(!m||!m.test(t)))try{var i=v.call(e,t);if(i||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return i}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ae.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ae.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=s(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(i){var o=ae.attr(i,e);return null==o?"!="===t:!t||(o+="","="===t?o===n:"!="===t?o!==n:"^="===t?n&&0===o.indexOf(n):"*="===t?n&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,t,n){return p(t)?_.grep(e,function(e,i){return!!t.call(e,i,e)!==n}):t.nodeType?_.grep(e,function(e){return e===t!==n}):"string"!=typeof t?_.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(_.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||L,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:N.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof _?t[0]:t,_.merge(this,_.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),S.test(i[1])&&_.isPlainObject(t))for(i in t)p(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=m.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):p(e)?void 0!==n.ready?n.ready(e):e(_):_.makeArray(e,this)}).prototype=_.fn,L=_(m);var P=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function $(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}_.fn.extend({has:function(e){var t=_(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;ue=m.createDocumentFragment().appendChild(m.createElement("div")),(de=m.createElement("input")).setAttribute("type","radio"),de.setAttribute("checked","checked"),de.setAttribute("name","t"),ue.appendChild(de),f.checkClone=ue.cloneNode(!0).cloneNode(!0).lastChild.checked,ue.innerHTML="",f.noCloneChecked=!!ue.cloneNode(!0).lastChild.defaultValue,ue.innerHTML="",f.option=!!ue.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function me(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&k(e,t)?_.merge([e],n):n}function be(e,t){for(var n=0,i=e.length;n",""]);var ve=/<|&#?\w+;/;function ye(e,t,n,i,o){for(var r,s,a,l,c,u,d=t.createDocumentFragment(),h=[],f=0,p=e.length;f\s*$/g;function De(e,t){return k(e,"table")&&k(11!==t.nodeType?t:t.firstChild,"tr")&&_(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ne(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,i,o,r,s,a;if(1===t.nodeType){if(G.hasData(e)&&(a=G.get(e).events))for(o in G.remove(t,"handle events"),a)for(n=0,i=a[o].length;n").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),m.head.appendChild(t[0])},abort:function(){n&&n()}}});var zt,Wt=[],Ut=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Wt.pop()||_.expando+"_"+_t.guid++;return this[e]=!0,e}}),_.ajaxPrefilter("json jsonp",function(t,n,i){var o,r,s,a=!1!==t.jsonp&&(Ut.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return o=t.jsonpCallback=p(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,"$1"+o):!1!==t.jsonp&&(t.url+=(xt.test(t.url)?"&":"?")+t.jsonp+"="+o),t.converters["script json"]=function(){return s||_.error(o+" was not called"),s[0]},t.dataTypes[0]="json",r=e[o],e[o]=function(){s=arguments},i.always(function(){void 0===r?_(e).removeProp(o):e[o]=r,t[o]&&(t.jsonpCallback=n.jsonpCallback,Wt.push(o)),s&&p(r)&&r(s[0]),s=r=void 0}),"script"}),f.createHTMLDocument=((zt=m.implementation.createHTMLDocument("").body).innerHTML="
    ",2===zt.childNodes.length),_.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(f.createHTMLDocument?((i=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(i)):t=m),r=!n&&[],(o=S.exec(e))?[t.createElement(o[1])]:(o=ye([e],t,r),r&&r.length&&_(r).remove(),_.merge([],o.childNodes)));var i,o,r},_.fn.load=function(e,t,n){var i,o,r,s=this,a=e.indexOf(" ");return-1").append(_.parseHTML(e)).find(i):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},_.expr.pseudos.animated=function(e){return _.grep(_.timers,function(t){return e===t.elem}).length},_.offset={setOffset:function(e,t,n){var i,o,r,s,a,l,c=_.css(e,"position"),u=_(e),d={};"static"===c&&(e.style.position="relative"),a=u.offset(),r=_.css(e,"top"),l=_.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(r+l).indexOf("auto")?(s=(i=u.position()).top,o=i.left):(s=parseFloat(r)||0,o=parseFloat(l)||0),p(t)&&(t=t.call(e,n,_.extend({},a))),null!=t.top&&(d.top=t.top-a.top+s),null!=t.left&&(d.left=t.left-a.left+o),"using"in t?t.using.call(e,d):u.css(d)}},_.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){_.offset.setOffset(this,e,t)});var t,n,i=this[0];return i?i.getClientRects().length?(t=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],o={top:0,left:0};if("fixed"===_.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===_.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((o=_(e).offset()).top+=_.css(e,"borderTopWidth",!0),o.left+=_.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-_.css(i,"marginTop",!0),left:t.left-o.left-_.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===_.css(e,"position");)e=e.offsetParent;return e||ie})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;_.fn[e]=function(i){return q(this,function(e,i,o){var r;if(g(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===o)return r?r[t]:e[i];r?r.scrollTo(n?r.pageXOffset:o,n?o:r.pageYOffset):e[i]=o},e,i,arguments.length)}}),_.each(["top","left"],function(e,t){_.cssHooks[t]=He(f.pixelPosition,function(e,n){if(n)return n=Me(e,t),Ie.test(n)?_(e).position()[t]+"px":n})}),_.each({Height:"height",Width:"width"},function(e,t){_.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,i){_.fn[i]=function(o,r){var s=arguments.length&&(n||"boolean"!=typeof o),a=n||(!0===o||!0===r?"margin":"border");return q(this,function(t,n,o){var r;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(r=t.documentElement,Math.max(t.body["scroll"+e],r["scroll"+e],t.body["offset"+e],r["offset"+e],r["client"+e])):void 0===o?_.css(t,n,a):_.style(t,n,o,a)},t,s?o:void 0,s)}})}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){_.fn[t]=function(e){return this.on(t,e)}}),_.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),_.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){_.fn[t]=function(e,n){return 0[].concat(...Element.prototype.querySelectorAll.call(t,e)),findOne:(e,t=document.documentElement)=>Element.prototype.querySelector.call(t,e),children:(e,t)=>[].concat(...e.children).filter(e=>e.matches(t)),parents(e,t){const n=[];let i=e.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(t)&&n.push(i),i=i.parentNode;return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]}},i=e=>{do{e+=Math.floor(1e6*Math.random())}while(document.getElementById(e));return e},o=e=>{let t=e.getAttribute("data-bs-target");if(!t||"#"===t){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n="#"+n.split("#")[1]),t=n&&"#"!==n?n.trim():null}return t},r=e=>{const t=o(e);return t&&document.querySelector(t)?t:null},s=e=>{const t=o(e);return t?document.querySelector(t):null},a=e=>{e.dispatchEvent(new Event("transitionend"))},l=e=>!(!e||"object"!=typeof e)&&(void 0!==e.jquery&&(e=e[0]),void 0!==e.nodeType),c=e=>l(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?n.findOne(e):null,u=(e,t,n)=>{Object.keys(n).forEach(i=>{const o=n[i],r=t[i],s=r&&l(r)?"element":null==(a=r)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(o).test(s))throw new TypeError(`${e.toUpperCase()}: Option "${i}" provided type "${s}" but expected type "${o}".`)})},d=e=>!(!l(e)||0===e.getClientRects().length)&&"visible"===getComputedStyle(e).getPropertyValue("visibility"),h=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled")),f=e=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?f(e.parentNode):null},p=()=>{},g=e=>e.offsetHeight,m=()=>{const{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},b=[],v=()=>"rtl"===document.documentElement.dir,y=e=>{var t;t=(()=>{const t=m();if(t){const n=e.NAME,i=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=(()=>(t.fn[n]=i,e.jQueryInterface))}}),"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{b.forEach(e=>e())}),b.push(t)):t()},w=e=>{"function"==typeof e&&e()},_=(e,t,n=!0)=>{if(!n)return void w(e);const i=(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const i=Number.parseFloat(t),o=Number.parseFloat(n);return i||o?(t=t.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(n))):0})(t)+5;let o=!1;const r=({target:n})=>{n===t&&(o=!0,t.removeEventListener("transitionend",r),w(e))};t.addEventListener("transitionend",r),setTimeout(()=>{o||a(t)},i)},x=(e,t,n,i)=>{let o=e.indexOf(t);if(-1===o)return e[!n&&i?e.length-1:0];const r=e.length;return o+=n?1:-1,i&&(o=(o+r)%r),e[Math.max(0,Math.min(o,r-1))]},C=/[^.]*(?=\..*)\.|.*/,E=/\..*/,A=/::\d+$/,T={};let k=1;const S={mouseenter:"mouseover",mouseleave:"mouseout"},D=/^(mouseenter|mouseleave)/i,L=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function N(e,t){return t&&`${t}::${k++}`||e.uidEvent||k++}function P(e){const t=N(e);return e.uidEvent=t,T[t]=T[t]||{},T[t]}function j(e,t,n=null){const i=Object.keys(e);for(let o=0,r=i.length;o(function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)});i?i=e(i):n=e(n)}const[r,s,a]=$(t,n,i),l=P(e),c=l[a]||(l[a]={}),u=j(c,s,r?n:null);if(u)return void(u.oneOff=u.oneOff&&o);const d=N(s,t.replace(C,"")),h=r?function(e,t,n){return function i(o){const r=e.querySelectorAll(t);for(let{target:s}=o;s&&s!==this;s=s.parentNode)for(let a=r.length;a--;)if(r[a]===s)return o.delegateTarget=s,i.oneOff&&B.off(e,o.type,t,n),n.apply(s,[o]);return null}}(e,n,i):function(e,t){return function n(i){return i.delegateTarget=e,n.oneOff&&B.off(e,i.type,t),t.apply(e,[i])}}(e,n);h.delegationSelector=r?n:null,h.originalHandler=s,h.oneOff=o,h.uidEvent=d,c[d]=h,e.addEventListener(a,h,r)}function O(e,t,n,i,o){const r=j(t[n],i,o);r&&(e.removeEventListener(n,r,Boolean(o)),delete t[n][r.uidEvent])}function R(e){return e=e.replace(E,""),S[e]||e}const B={on(e,t,n,i){I(e,t,n,i,!1)},one(e,t,n,i){I(e,t,n,i,!0)},off(e,t,n,i){if("string"!=typeof t||!e)return;const[o,r,s]=$(t,n,i),a=s!==t,l=P(e),c=t.startsWith(".");if(void 0!==r){if(!l||!l[s])return;return void O(e,l,s,r,o?n:null)}c&&Object.keys(l).forEach(n=>{!function(e,t,n,i){const o=t[n]||{};Object.keys(o).forEach(r=>{if(r.includes(i)){const i=o[r];O(e,t,n,i.originalHandler,i.delegationSelector)}})}(e,l,n,t.slice(1))});const u=l[s]||{};Object.keys(u).forEach(n=>{const i=n.replace(A,"");if(!a||t.includes(i)){const t=u[n];O(e,l,s,t.originalHandler,t.delegationSelector)}})},trigger(e,t,n){if("string"!=typeof t||!e)return null;const i=m(),o=R(t),r=t!==o,s=L.has(o);let a,l=!0,c=!0,u=!1,d=null;return r&&i&&(a=i.Event(t,n),i(e).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),u=a.isDefaultPrevented()),s?(d=document.createEvent("HTMLEvents")).initEvent(o,l,!0):d=new CustomEvent(t,{bubbles:l,cancelable:!0}),void 0!==n&&Object.keys(n).forEach(e=>{Object.defineProperty(d,e,{get:()=>n[e]})}),u&&d.preventDefault(),c&&e.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map;var H={set(e,t,n){M.has(e)||M.set(e,new Map);const i=M.get(e);i.has(t)||0===i.size?i.set(t,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(e,t)=>M.has(e)&&M.get(e).get(t)||null,remove(e,t){if(!M.has(e))return;const n=M.get(e);n.delete(t),0===n.size&&M.delete(e)}};class F{constructor(e){(e=c(e))&&(this._element=e,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,t,n=!0){_(e,t,n)}static getInstance(e){return H.get(e,this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,"object"==typeof t?t:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class q extends F{static get NAME(){return"alert"}close(e){const t=e?this._getRootElement(e):this._element,n=this._triggerCloseEvent(t);null===n||n.defaultPrevented||this._removeElement(t)}_getRootElement(e){return s(e)||e.closest(".alert")}_triggerCloseEvent(e){return B.trigger(e,"close.bs.alert")}_removeElement(e){e.classList.remove("show");const t=e.classList.contains("fade");this._queueCallback(()=>this._destroyElement(e),e,t)}_destroyElement(e){e.remove(),B.trigger(e,"closed.bs.alert")}static jQueryInterface(e){return this.each(function(){const t=q.getOrCreateInstance(this);"close"===e&&t[e](this)})}static handleDismiss(e){return function(t){t&&t.preventDefault(),e.close(this)}}}B.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',q.handleDismiss(new q)),y(q);class z extends F{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each(function(){const t=z.getOrCreateInstance(this);"toggle"===e&&t[e]()})}}function W(e){return"true"===e||"false"!==e&&(e===Number(e).toString()?Number(e):""===e||"null"===e?null:e)}function U(e){return e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())}B.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',e=>{e.preventDefault();const t=e.target.closest('[data-bs-toggle="button"]');z.getOrCreateInstance(t).toggle()}),y(z);const X={setDataAttribute(e,t,n){e.setAttribute("data-bs-"+U(t),n)},removeDataAttribute(e,t){e.removeAttribute("data-bs-"+U(t))},getDataAttributes(e){if(!e)return{};const t={};return Object.keys(e.dataset).filter(e=>e.startsWith("bs")).forEach(n=>{let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),t[i]=W(e.dataset[n])}),t},getDataAttribute:(e,t)=>W(e.getAttribute("data-bs-"+U(t))),offset(e){const t=e.getBoundingClientRect();return{top:t.top+document.body.scrollTop,left:t.left+document.body.scrollLeft}},position:e=>({top:e.offsetTop,left:e.offsetLeft})},K={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},V={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},G="next",Q="prev",Y="left",Z="right",J={ArrowLeft:Z,ArrowRight:Y};class ee extends F{constructor(e,t){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._indicatorsElement=n.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return K}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(Q)}pause(e){e||(this._isPaused=!0),n.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(a(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=n.findOne(".active.carousel-item",this._element);const t=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void B.one(this._element,"slid.bs.carousel",()=>this.to(e));if(t===e)return this.pause(),void this.cycle();const i=e>t?G:Q;this._slide(i,this._items[e])}_getConfig(e){return e={...K,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("carousel",e,V),e}_handleSwipe(){const e=Math.abs(this.touchDeltaX);if(e<=40)return;const t=e/this.touchDeltaX;this.touchDeltaX=0,t&&this._slide(t>0?Z:Y)}_addEventListeners(){this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",e=>this._keydown(e)),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",e=>this.pause(e)),B.on(this._element,"mouseleave.bs.carousel",e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType?this._pointerEvent||(this.touchStartX=e.touches[0].clientX):this.touchStartX=e.clientX},t=e=>{this.touchDeltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this.touchStartX},i=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType||(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(e=>this.cycle(e),500+this._config.interval))};n.find(".carousel-item img",this._element).forEach(e=>{B.on(e,"dragstart.bs.carousel",e=>e.preventDefault())}),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",t=>e(t)),B.on(this._element,"pointerup.bs.carousel",e=>i(e)),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",t=>e(t)),B.on(this._element,"touchmove.bs.carousel",e=>t(e)),B.on(this._element,"touchend.bs.carousel",e=>i(e)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=J[e.key];t&&(e.preventDefault(),this._slide(t))}_getItemIndex(e){return this._items=e&&e.parentNode?n.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,t){const n=e===G;return x(this._items,t,n,this._config.wrap)}_triggerSlideEvent(e,t){const i=this._getItemIndex(e),o=this._getItemIndex(n.findOne(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:t,from:o,to:i})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const t=n.findOne(".active",this._indicatorsElement);t.classList.remove("active"),t.removeAttribute("aria-current");const i=n.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{B.trigger(this._element,"slid.bs.carousel",{relatedTarget:s,direction:h,from:r,to:a})};if(this._element.classList.contains("slide")){s.classList.add(d),g(s),o.classList.add(u),s.classList.add(u);const e=()=>{s.classList.remove(u,d),s.classList.add("active"),o.classList.remove("active",d,u),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(e,o,!0)}else o.classList.remove("active"),s.classList.add("active"),this._isSliding=!1,f();l&&this.cycle()}_directionToOrder(e){return[Z,Y].includes(e)?v()?e===Y?Q:G:e===Y?G:Q:e}_orderToDirection(e){return[G,Q].includes(e)?v()?e===Q?Y:Z:e===Q?Z:Y:e}static carouselInterface(e,t){const n=ee.getOrCreateInstance(e,t);let{_config:i}=n;"object"==typeof t&&(i={...i,...t});const o="string"==typeof t?t:i.slide;if("number"==typeof t)n.to(t);else if("string"==typeof o){if(void 0===n[o])throw new TypeError(`No method named "${o}"`);n[o]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}static jQueryInterface(e){return this.each(function(){ee.carouselInterface(this,e)})}static dataApiClickHandler(e){const t=s(this);if(!t||!t.classList.contains("carousel"))return;const n={...X.getDataAttributes(t),...X.getDataAttributes(this)},i=this.getAttribute("data-bs-slide-to");i&&(n.interval=!1),ee.carouselInterface(t,n),i&&ee.getInstance(t).to(i),e.preventDefault()}}B.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",ee.dataApiClickHandler),B.on(window,"load.bs.carousel.data-api",()=>{const e=n.find('[data-bs-ride="carousel"]');for(let t=0,n=e.length;te===this._element);null!==o&&s.length&&(this._selector=o,this._triggerArray.push(t))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return te}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let e,t;this._parent&&(0===(e=n.find(".show, .collapsing",this._parent).filter(e=>"string"==typeof this._config.parent?e.getAttribute("data-bs-parent")===this._config.parent:e.classList.contains("collapse"))).length&&(e=null));const i=n.findOne(this._selector);if(e){const n=e.find(e=>i!==e);if((t=n?ie.getInstance(n):null)&&t._isTransitioning)return}if(B.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e&&e.forEach(e=>{i!==e&&ie.collapseInterface(e,"hide"),t||H.set(e,"bs.collapse",null)});const o=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[o]=0,this._triggerArray.length&&this._triggerArray.forEach(e=>{e.classList.remove("collapsed"),e.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const r="scroll"+(o[0].toUpperCase()+o.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[o]="",this.setTransitioning(!1),B.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[o]=this._element[r]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(B.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const e=this._getDimension();this._element.style[e]=this._element.getBoundingClientRect()[e]+"px",g(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const t=this._triggerArray.length;if(t>0)for(let e=0;e{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),B.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(e){this._isTransitioning=e}_getConfig(e){return(e={...te,...e}).toggle=Boolean(e.toggle),u("collapse",e,ne),e}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:e}=this._config;const t=`[data-bs-toggle="collapse"][data-bs-parent="${e=c(e)}"]`;return n.find(t,e).forEach(e=>{const t=s(e);this._addAriaAndCollapsedClass(t,[e])}),e}_addAriaAndCollapsedClass(e,t){if(!e||!t.length)return;const n=e.classList.contains("show");t.forEach(e=>{n?e.classList.remove("collapsed"):e.classList.add("collapsed"),e.setAttribute("aria-expanded",n)})}static collapseInterface(e,t){let n=ie.getInstance(e);const i={...te,...X.getDataAttributes(e),..."object"==typeof t&&t?t:{}};if(!n&&i.toggle&&"string"==typeof t&&/show|hide/.test(t)&&(i.toggle=!1),n||(n=new ie(e,i)),"string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){ie.collapseInterface(this,e)})}}B.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const t=X.getDataAttributes(this),i=r(this);n.find(i).forEach(e=>{const n=ie.getInstance(e);let i;n?(null===n._parent&&"string"==typeof t.parent&&(n._config.parent=t.parent,n._parent=n._getParent()),i="toggle"):i=t,ie.collapseInterface(e,i)})}),y(ie);const oe=new RegExp("ArrowUp|ArrowDown|Escape"),re=v()?"top-end":"top-start",se=v()?"top-start":"top-end",ae=v()?"bottom-end":"bottom-start",le=v()?"bottom-start":"bottom-end",ce=v()?"left-start":"right-start",ue=v()?"right-start":"left-start",de={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},he={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class fe extends F{constructor(e,t){super(e),this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return de}static get DefaultType(){return he}static get NAME(){return"dropdown"}toggle(){h(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(h(this._element)||this._menu.classList.contains("show"))return;const e=fe.getParentFromElement(this._element),n={relatedTarget:this._element};if(!B.trigger(this._element,"show.bs.dropdown",n).defaultPrevented){if(this._inNavbar)X.setDataAttribute(this._menu,"popper","none");else{if(void 0===t)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let n=this._element;"parent"===this._config.reference?n=e:l(this._config.reference)?n=c(this._config.reference):"object"==typeof this._config.reference&&(n=this._config.reference);const i=this._getPopperConfig(),o=i.modifiers.find(e=>"applyStyles"===e.name&&!1===e.enabled);this._popper=t.createPopper(n,this._menu,i),o&&X.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(e=>B.on(e,"mouseover",p)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),B.trigger(this._element,"shown.bs.dropdown",n)}}hide(){if(h(this._element)||!this._menu.classList.contains("show"))return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){B.on(this._element,"click.bs.dropdown",e=>{e.preventDefault(),this.toggle()})}_completeHide(e){B.trigger(this._element,"hide.bs.dropdown",e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>B.off(e,"mouseover",p)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),X.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,"hidden.bs.dropdown",e))}_getConfig(e){if(e={...this.constructor.Default,...X.getDataAttributes(this._element),...e},u("dropdown",e,this.constructor.DefaultType),"object"==typeof e.reference&&!l(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return e}_getMenuElement(){return n.next(this._element,".dropdown-menu")[0]}_getPlacement(){const e=this._element.parentNode;if(e.classList.contains("dropend"))return ce;if(e.classList.contains("dropstart"))return ue;const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?se:re:t?le:ae}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:t}){const i=n.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(d);i.length&&x(i,t,"ArrowDown"===e,!i.includes(t)).focus()}static dropdownInterface(e,t){const n=fe.getOrCreateInstance(e,t);if("string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){fe.dropdownInterface(this,e)})}static clearMenus(e){if(e&&(2===e.button||"keyup"===e.type&&"Tab"!==e.key))return;const t=n.find('[data-bs-toggle="dropdown"]');for(let n=0,i=t.length;nthis.matches('[data-bs-toggle="dropdown"]')?this:n.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===e.key?(i().focus(),void fe.clearMenus()):"ArrowUp"===e.key||"ArrowDown"===e.key?(t||i().click(),void fe.getInstance(i())._selectMenuItem(e)):void(t&&"Space"!==e.key||fe.clearMenus())}}B.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',fe.dataApiKeydownHandler),B.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",fe.dataApiKeydownHandler),B.on(document,"click.bs.dropdown.data-api",fe.clearMenus),B.on(document,"keyup.bs.dropdown.data-api",fe.clearMenus),B.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',function(e){e.preventDefault(),fe.dropdownInterface(this)}),y(fe);class pe{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",t=>t+e),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",t=>t+e),this._setElementAttributes(".sticky-top","marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const i=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+i)return;this._saveInitialAttribute(e,t);const o=window.getComputedStyle(e)[t];e.style[t]=n(Number.parseFloat(o))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(e,t){const n=e.style[t];n&&X.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{const n=X.getDataAttribute(e,t);void 0===n?e.style.removeProperty(t):(X.removeDataAttribute(e,t),e.style[t]=n)})}_applyManipulationCallback(e,t){l(e)?t(e):n.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}const ge={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},me={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class be{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){this._config.isVisible?(this._append(),this._config.isAnimated&&g(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{w(e)})):w(e)}hide(e){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),w(e)})):w(e)}_getElement(){if(!this._element){const e=document.createElement("div");e.className="modal-backdrop",this._config.isAnimated&&e.classList.add("fade"),this._element=e}return this._element}_getConfig(e){return(e={...ge,..."object"==typeof e?e:{}}).rootElement=c(e.rootElement),u("backdrop",e,me),e}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),B.on(this._getElement(),"mousedown.bs.backdrop",()=>{w(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(B.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){_(e,this._getElement(),this._config.isAnimated)}}const ve={backdrop:!0,keyboard:!0,focus:!0},ye={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class we extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._dialog=n.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new pe}static get Default(){return ve}static get NAME(){return"modal"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||B.trigger(this._element,"show.bs.modal",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),B.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',e=>this.hide(e)),B.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{B.one(this._element,"mouseup.dismiss.bs.modal",e=>{e.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(e){if(e&&["A","AREA"].includes(e.target.tagName)&&e.preventDefault(),!this._isShown||this._isTransitioning)return;if(B.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),B.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.modal"),B.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,t)}dispose(){[window,this._dialog].forEach(e=>B.off(e,".bs.modal")),this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new be({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(e){return e={...ve,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("modal",e,ye),e}_showElement(e){const t=this._isAnimated(),i=n.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),t&&g(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,B.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,t)}_enforceFocus(){B.off(document,"focusin.bs.modal"),B.on(document,"focusin.bs.modal",e=>{document===e.target||this._element===e.target||this._element.contains(e.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?B.on(this._element,"keydown.dismiss.bs.modal",e=>{this._config.keyboard&&"Escape"===e.key?(e.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==e.key||this._triggerBackdropTransition()}):B.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?B.on(window,"resize.bs.modal",()=>this._adjustDialog()):B.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(e){B.on(this._element,"click.dismiss.bs.modal",e=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:e.target===e.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(B.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:e,scrollHeight:t,style:n}=this._element,i=t>document.documentElement.clientHeight;!i&&"hidden"===n.overflowY||e.contains("modal-static")||(i||(n.overflowY="hidden"),e.add("modal-static"),this._queueCallback(()=>{e.remove("modal-static"),i||this._queueCallback(()=>{n.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;(!n&&e&&!v()||n&&!e&&v())&&(this._element.style.paddingLeft=t+"px"),(n&&!e&&!v()||!n&&e&&v())&&(this._element.style.paddingRight=t+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=we.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e](t)}})}}B.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',function(e){const t=s(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),B.one(t,"show.bs.modal",e=>{e.defaultPrevented||B.one(t,"hidden.bs.modal",()=>{d(this)&&this.focus()})}),we.getOrCreateInstance(t).toggle(this)}),y(we);const _e={backdrop:!0,keyboard:!0,scroll:!1},xe={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Ce extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return _e}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||B.trigger(this._element,"show.bs.offcanvas",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new pe).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{B.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:e})},this._element,!0))}hide(){this._isShown&&(B.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(B.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new pe).reset(),B.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.offcanvas")}_getConfig(e){return e={..._e,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("offcanvas",e,xe),e}_initializeBackDrop(){return new be({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(e){B.off(document,"focusin.bs.offcanvas"),B.on(document,"focusin.bs.offcanvas",t=>{document===t.target||e===t.target||e.contains(t.target)||e.focus()}),e.focus()}_addEventListeners(){B.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),B.on(this._element,"keydown.dismiss.bs.offcanvas",e=>{this._config.keyboard&&"Escape"===e.key&&this.hide()})}static jQueryInterface(e){return this.each(function(){const t=Ce.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}B.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',function(e){const t=s(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this))return;B.one(t,"hidden.bs.offcanvas",()=>{d(this)&&this.focus()});const i=n.findOne(".offcanvas.show");i&&i!==t&&Ce.getInstance(i).hide(),Ce.getOrCreateInstance(t).toggle(this)}),B.on(window,"load.bs.offcanvas.data-api",()=>n.find(".offcanvas.show").forEach(e=>Ce.getOrCreateInstance(e).show())),y(Ce);const Ee=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ae=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Te=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,ke=(e,t)=>{const n=e.nodeName.toLowerCase();if(t.includes(n))return!Ee.has(n)||Boolean(Ae.test(e.nodeValue)||Te.test(e.nodeValue));const i=t.filter(e=>e instanceof RegExp);for(let e=0,t=i.length;e{ke(e,a)||n.removeAttribute(e.nodeName)})}return i.body.innerHTML}const De=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Le=new Set(["sanitize","allowList","sanitizeFn"]),Ne={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Pe={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},je={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},$e={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class Ie extends F{constructor(e,n){if(void 0===t)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(n),this.tip=null,this._setListeners()}static get Default(){return je}static get NAME(){return"tooltip"}static get Event(){return $e}static get DefaultType(){return Ne}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(this._isEnabled)if(e){const t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const e=B.trigger(this._element,this.constructor.Event.SHOW),n=f(this._element),o=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!o)return;const r=this.getTipElement(),s=i(this.constructor.NAME);r.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this.setContent(),this._config.animation&&r.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,r,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:c}=this._config;H.set(r,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(c.appendChild(r),B.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=t.createPopper(this._element,r,this._getPopperConfig(l)),r.classList.add("show");const u="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;u&&r.classList.add(...u.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>{B.on(e,"mouseover",p)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const e=this._hoverState;this._hoverState=null,B.trigger(this._element,this.constructor.Event.SHOWN),"out"===e&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const e=this.getTipElement();if(B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>B.off(e,"mouseover",p)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const t=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),B.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,t),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const e=document.createElement("div");return e.innerHTML=this._config.template,this.tip=e.children[0],this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")}setElementContent(e,t){if(null!==e)return l(t)?(t=c(t),void(this._config.html?t.parentNode!==e&&(e.innerHTML="",e.appendChild(t)):e.textContent=t.textContent)):void(this._config.html?(this._config.sanitize&&(t=Se(t,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=t):e.textContent=t)}getTitle(){let e=this._element.getAttribute("data-bs-original-title");return e||(e="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),e}updateAttachment(e){return"right"===e?"end":"left"===e?"start":e}_initializeOnDelegatedTarget(e,t){const n=this.constructor.DATA_KEY;return(t=t||H.get(e.delegateTarget,n))||(t=new this.constructor(e.delegateTarget,this._getDelegateConfig()),H.set(e.delegateTarget,n,t)),t}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:e=>this._handlePopperPlacementChange(e)}],onFirstUpdate:e=>{e.options.placement!==e.placement&&this._handlePopperPlacementChange(e)}};return{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_addAttachmentClass(e){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(e))}_getAttachment(e){return Pe[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(e=>{if("click"===e)B.on(this._element,this.constructor.Event.CLICK,this._config.selector,e=>this.toggle(e));else if("manual"!==e){const t="hover"===e?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,n="hover"===e?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;B.on(this._element,t,this._config.selector,e=>this._enter(e)),B.on(this._element,n,this._config.selector,e=>this._leave(e))}}),this._hideModalHandler=(()=>{this._element&&this.hide()}),B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||"string"!==t)&&(this._element.setAttribute("data-bs-original-title",e||""),!e||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusin"===e.type?"focus":"hover"]=!0),t.getTipElement().classList.contains("show")||"show"===t._hoverState?t._hoverState="show":(clearTimeout(t._timeout),t._hoverState="show",t._config.delay&&t._config.delay.show?t._timeout=setTimeout(()=>{"show"===t._hoverState&&t.show()},t._config.delay.show):t.show())}_leave(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusout"===e.type?"focus":"hover"]=t._element.contains(e.relatedTarget)),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t._config.delay&&t._config.delay.hide?t._timeout=setTimeout(()=>{"out"===t._hoverState&&t.hide()},t._config.delay.hide):t.hide())}_isWithActiveTrigger(){for(const e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){const t=X.getDataAttributes(this._element);return Object.keys(t).forEach(e=>{Le.has(e)&&delete t[e]}),(e={...this.constructor.Default,...t,..."object"==typeof e&&e?e:{}}).container=!1===e.container?document.body:c(e.container),"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),u("tooltip",e,this.constructor.DefaultType),e.sanitize&&(e.template=Se(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){const e={};if(this._config)for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(De);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}_handlePopperPlacementChange(e){const{state:t}=e;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}static jQueryInterface(e){return this.each(function(){const t=Ie.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}y(Ie);const Oe=new RegExp("(^|\\s)bs-popover\\S+","g"),Re={...Ie.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Be={...Ie.DefaultType,content:"(string|element|function)"},Me={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class He extends Ie{static get Default(){return Re}static get NAME(){return"popover"}static get Event(){return Me}static get DefaultType(){return Be}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||n.findOne(".popover-header",this.tip).remove(),this._getContent()||n.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".popover-header",e),this.getTitle());let t=this._getContent();"function"==typeof t&&(t=t.call(this._element)),this.setElementContent(n.findOne(".popover-body",e),t),e.classList.remove("fade","show")}_addAttachmentClass(e){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(e))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(Oe);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}static jQueryInterface(e){return this.each(function(){const t=He.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}y(He);const Fe={offset:10,method:"auto",target:""},qe={offset:"number",method:"string",target:"(string|element)"};class ze extends F{constructor(e,t){super(e),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(t),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,B.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return Fe}static get NAME(){return"scrollspy"}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":"position",t="auto"===this._config.method?e:this._config.method,i="position"===t?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),n.find(this._selector).map(e=>{const o=r(e),s=o?n.findOne(o):null;if(s){const e=s.getBoundingClientRect();if(e.width||e.height)return[X[t](s).top+i,o]}return null}).filter(e=>e).sort((e,t)=>e[0]-t[0]).forEach(e=>{this._offsets.push(e[0]),this._targets.push(e[1])})}dispose(){B.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(e){if("string"!=typeof(e={...Fe,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}}).target&&l(e.target)){let{id:t}=e.target;t||(t=i("scrollspy"),e.target.id=t),e.target="#"+t}return u("scrollspy",e,qe),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){const e=this._targets[this._targets.length-1];this._activeTarget!==e&&this._activate(e)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(void 0===this._offsets[t+1]||e`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),i=n.findOne(t.join(","));i.classList.contains("dropdown-item")?(n.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add("active"),i.classList.add("active")):(i.classList.add("active"),n.parents(i,".nav, .list-group").forEach(e=>{n.prev(e,".nav-link, .list-group-item").forEach(e=>e.classList.add("active")),n.prev(e,".nav-item").forEach(e=>{n.children(e,".nav-link").forEach(e=>e.classList.add("active"))})})),B.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){n.find(this._selector).filter(e=>e.classList.contains("active")).forEach(e=>e.classList.remove("active"))}static jQueryInterface(e){return this.each(function(){const t=ze.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(window,"load.bs.scrollspy.data-api",()=>{n.find('[data-bs-spy="scroll"]').forEach(e=>new ze(e))}),y(ze);class We extends F{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let e;const t=s(this._element),i=this._element.closest(".nav, .list-group");if(i){const t="UL"===i.nodeName||"OL"===i.nodeName?":scope > li > .active":".active";e=(e=n.find(t,i))[e.length-1]}const o=e?B.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(B.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==o&&o.defaultPrevented)return;this._activate(this._element,i);const r=()=>{B.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),B.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};t?this._activate(t,t.parentNode,r):r()}_activate(e,t,i){const o=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?n.children(t,".active"):n.find(":scope > li > .active",t))[0],r=i&&o&&o.classList.contains("fade"),s=()=>this._transitionComplete(e,o,i);o&&r?(o.classList.remove("show"),this._queueCallback(s,e,!0)):s()}_transitionComplete(e,t,i){if(t){t.classList.remove("active");const e=n.findOne(":scope > .dropdown-menu .active",t.parentNode);e&&e.classList.remove("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),g(e),e.classList.contains("fade")&&e.classList.add("show");let o=e.parentNode;if(o&&"LI"===o.nodeName&&(o=o.parentNode),o&&o.classList.contains("dropdown-menu")){const t=e.closest(".dropdown");t&&n.find(".dropdown-toggle",t).forEach(e=>e.classList.add("active")),e.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(e){return this.each(function(){const t=We.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this)||We.getOrCreateInstance(this).show()}),y(We);const Ue={animation:"boolean",autohide:"boolean",delay:"number"},Xe={animation:!0,autohide:!0,delay:5e3};class Ke extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Ue}static get Default(){return Xe}static get NAME(){return"toast"}show(){B.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),g(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),B.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(B.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),B.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(e){return e={...Xe,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}},u("toast",e,this.constructor.DefaultType),e}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t}if(t)return void this._clearTimeout();const n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),B.on(this._element,"mouseover.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"mouseout.bs.toast",e=>this._onInteraction(e,!1)),B.on(this._element,"focusin.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"focusout.bs.toast",e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Ke.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return y(Ke),{Alert:q,Button:z,Carousel:ee,Collapse:ie,Dropdown:fe,Modal:we,Offcanvas:Ce,Popover:He,ScrollSpy:ze,Tab:We,Toast:Ke,Tooltip:Ie}}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function t(t,i,o){i={content:{message:"object"==typeof i?i.message:i,title:i.title?i.title:"",icon:i.icon?i.icon:"",url:i.url?i.url:"#",target:i.target?i.target:"-"}},o=e.extend(!0,{},i,o),this.settings=e.extend(!0,{},n,o),this._defaults=n,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var n={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var e=arguments[0],t=1;t .progress-bar').removeClass("progress-bar-"+e.settings.type),e.settings.type=i[t],this.$ele.addClass("alert-"+i[t]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[t]);break;case"icon":var o=this.$ele.find('[data-notify="icon"]');"class"==e.settings.icon_type.toLowerCase()?o.removeClass(e.settings.content.icon).addClass(i[t]):(o.is("img")||o.find("img"),o.attr("src",i[t]));break;case"progress":var r=e.settings.delay-e.settings.delay*(i[t]/100);this.$ele.data("notify-delay",r),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[t]).css("width",i[t]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[t]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[t]);break;default:this.$ele.find('[data-notify="'+t+'"]').html(i[t])}var s=this.$ele.outerHeight()+parseInt(e.settings.spacing)+parseInt(e.settings.offset.y);e.reposition(s)},close:function(){e.close()}}},buildNotify:function(){var t=this.settings.content;this.$ele=e(String.format(this.settings.template,this.settings.type,t.title,t.message,t.url,t.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var t=this,n=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},o=!1,r=this.settings;switch(e('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return n=Math.max(n,parseInt(e(this).css(r.placement.from))+parseInt(e(this).outerHeight())+parseInt(r.spacing))}),1==this.settings.newest_on_top&&(n=this.settings.offset.y),i[this.settings.placement.from]=n+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),e.each(Array("webkit","moz","o","ms",""),function(e,n){t.$ele[0].style[n+"AnimationIterationCount"]=1}),e(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(n=parseInt(n)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(n)),e.isFunction(t.settings.onShow)&&t.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(e){o=!0}).one(this.animations.end,function(n){e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)}),setTimeout(function(){o||e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)},600)},bind:function(){var t=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){t.close()}),this.$ele.mouseover(function(t){e(this).data("data-hover","true")}).mouseout(function(t){e(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){t.$ele.data("notify-delay",t.settings.delay);var n=setInterval(function(){var e=parseInt(t.$ele.data("notify-delay"))-t.settings.timer;if("false"===t.$ele.data("data-hover")&&"pause"==t.settings.mouse_over||"pause"!=t.settings.mouse_over){var i=(t.settings.delay-e)/t.settings.delay*100;t.$ele.data("notify-delay",e),t.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}e<=-t.settings.timer&&(clearInterval(n),t.close())},t.settings.timer)}},close:function(){var t=this,n=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),t.reposition(n),e.isFunction(t.settings.onClose)&&t.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(e){i=!0}).one(this.animations.end,function(n){e(this).remove(),e.isFunction(t.settings.onClosed)&&t.settings.onClosed.call(this)}),setTimeout(function(){i||(t.$ele.remove(),t.settings.onClosed&&t.settings.onClosed(t.$ele))},600)},reposition:function(t){var n=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',o=this.$ele.nextAll(i);1==this.settings.newest_on_top&&(o=this.$ele.prevAll(i)),o.each(function(){e(this).css(n.settings.placement.from,t),t=parseInt(t)+parseInt(n.settings.spacing)+e(this).outerHeight()})}}),e.notify=function(e,n){return new t(this,e,n).notify},e.notifyDefaults=function(t){return n=e.extend(!0,{},n,t)},e.notifyClose=function(t){void 0===t||"all"==t?e("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):e('[data-notify-position="'+t+'"]').find('[data-notify="dismiss"]').trigger("click")}});var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof i?new i(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(_ instanceof l)){if(g&&y!=t.length-1){if(h.lastIndex=w,!(k=h.exec(e)))break;for(var x=k.index+(p?k[1].length:0),C=k.index+k[0].length,E=y,A=w,T=t.length;E"+r.content+""},!_self.document)return _self.addEventListener&&(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),i=t.language,o=t.code,r=t.immediateClose;_self.postMessage(n.highlight(o,n.languages[i],i)),r&&_self.close()},!1)),_self.Prism;var o=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return o&&(n.filename=o.src,n.manual||o.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/[a-z0-9_]+(?=\()/i,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,function:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}}}),Prism.languages.javascript["template-string"].inside.interpolation.inside.rest=Prism.languages.javascript,Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(){var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){for(var n,i=t.getAttribute("data-src"),o=t,r=/\blang(?:uage)?-([\w-]+)\b/i;o&&!r.test(o.className);)o=o.parentNode;if(o&&(n=(t.className.match(r)||[,""])[1]),!n){var s=(i.match(/\.(\w+)$/)||[,""])[1];n=e[s]||s}var a=document.createElement("code");a.className="language-"+n,t.textContent="",a.textContent="Loading…",t.appendChild(a);var l=new XMLHttpRequest;l.open("GET",i,!0),l.onreadystatechange=function(){4==l.readyState&&(l.status<400&&l.responseText?(a.textContent=l.responseText,Prism.highlightElement(a)):400<=l.status?a.textContent="✖ Error "+l.status+" while fetching file: "+l.statusText:a.textContent="✖ Error: File does not exist or is empty")},l.send(null)}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),i=document.createElement("a");return i.textContent=t.getAttribute("data-download-link-label")||"Download",i.setAttribute("download",""),i.href=n,i}})},document.addEventListener("DOMContentLoaded",self.Prism.fileHighlight)),function(e,t,n){var i,o=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/en_US/sdk.js",o.parentNode.insertBefore(i,o))}(document,"script","facebook-jssdk"),function(e,t,n,i,o,r){(i=e.gapi||(e.gapi={})).analytics={q:[],ready:function(e){this.q.push(e)}},o=t.createElement(n),r=t.getElementsByTagName(n)[0],o.src="https://apis.google.com/js/platform.js",r.parentNode.insertBefore(o,r),o.onload=function(){i.load("analytics")}}(window,document,"script"),function(e,t,n){var i,o=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/vi_VN/sdk/xfbml.customerchat.js",o.parentNode.insertBefore(i,o))}(document,"script","facebook-jssdk"),function(e){e.fn.qrcode=function(t){var n;function i(e){this.mode=n,this.data=e}function o(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function r(e,t){if(null==e.length)throw Error(e.length+"/"+t);for(var n=0;ne||this.moduleCount<=e||0>t||this.moduleCount<=t)throw Error(e+","+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){var e=1;for(e=1;40>e;e++){for(var t=s.getRSBlocks(e,this.errorCorrectLevel),n=new a,i=0,o=0;o=n;n++)if(!(-1>=e+n||this.moduleCount<=e+n))for(var i=-1;7>=i;i++)-1>=t+i||this.moduleCount<=t+i||(this.modules[e+n][t+i]=0<=n&&6>=n&&(0==i||6==i)||0<=i&&6>=i&&(0==n||6==n)||2<=n&&4>=n&&2<=i&&4>=i)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;8>n;n++){this.makeImpl(!0,n);var i=l.getLostPoint(this);(0==n||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){for(e=e.createEmptyMovieClip(t,n),this.make(),t=0;t=r;r++)for(var s=-2;2>=s;s++)this.modules[i+r][o+s]=-2==r||2==r||-2==s||2==s||0==r&&0==s}},setupTypeNumber:function(e){for(var t=l.getBCHTypeNumber(this.typeNumber),n=0;18>n;n++){var i=!e&&1==(t>>n&1);this.modules[Math.floor(n/3)][n%3+this.moduleCount-8-3]=i}for(n=0;18>n;n++)i=!e&&1==(t>>n&1),this.modules[n%3+this.moduleCount-8-3][Math.floor(n/3)]=i},setupTypeInfo:function(e,t){for(var n=l.getBCHTypeInfo(this.errorCorrectLevel<<3|t),i=0;15>i;i++){var o=!e&&1==(n>>i&1);6>i?this.modules[i][8]=o:8>i?this.modules[i+1][8]=o:this.modules[this.moduleCount-15+i][8]=o}for(i=0;15>i;i++)o=!e&&1==(n>>i&1),8>i?this.modules[8][this.moduleCount-i-1]=o:9>i?this.modules[8][15-i-1+1]=o:this.modules[8][15-i-1]=o;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,o=7,r=0,s=this.moduleCount-1;0a;a++)if(null==this.modules[i][s-a]){var c=!1;r>>o&1)),l.getMask(t,i,s-a)&&(c=!c),this.modules[i][s-a]=c,-1==--o&&(r++,o=7)}if(0>(i+=n)||this.moduleCount<=i){i-=n,n=-n;break}}}},o.PAD0=236,o.PAD1=17,o.createData=function(e,t,n){t=s.getRSBlocks(e,t);for(var i=new a,r=0;r8*e)throw Error("code length overflow. ("+i.getLengthInBits()+">"+8*e+")");for(i.getLengthInBits()+4<=8*e&&i.put(0,4);0!=i.getLengthInBits()%8;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*e||(i.put(o.PAD0,8),i.getLengthInBits()>=8*e));)i.put(o.PAD1,8);return o.createBytes(i,t)},o.createBytes=function(e,t){for(var n=0,i=0,o=0,s=Array(t.length),a=Array(t.length),c=0;c>>=1;return t},getPatternPosition:function(e){return l.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case 0:return 0==(t+n)%2;case 1:return 0==t%2;case 2:return 0==n%3;case 3:return 0==(t+n)%3;case 4:return 0==(Math.floor(t/2)+Math.floor(n/3))%2;case 5:return 0==t*n%2+t*n%3;case 6:return 0==(t*n%2+t*n%3)%2;case 7:return 0==(t*n%3+(t+n)%2)%2;default:throw Error("bad maskPattern:"+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;nt)switch(e){case 1:return 10;case 2:return 9;case n:case 8:return 8;default:throw Error("mode:"+e)}else if(27>t)switch(e){case 1:return 12;case 2:return 11;case n:return 16;case 8:return 10;default:throw Error("mode:"+e)}else{if(!(41>t))throw Error("type:"+t);switch(e){case 1:return 14;case 2:return 13;case n:return 16;case 8:return 12;default:throw Error("mode:"+e)}}},getLostPoint:function(e){for(var t=e.getModuleCount(),n=0,i=0;i=a;a++)if(!(0>i+a||t<=i+a))for(var l=-1;1>=l;l++)0>o+l||t<=o+l||0==a&&0==l||s==e.isDark(i+a,o+l)&&r++;5e)throw Error("glog("+e+")");return c.LOG_TABLE[e]},gexp:function(e){for(;0>e;)e+=255;for(;256<=e;)e-=255;return c.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},u=0;8>u;u++)c.EXP_TABLE[u]=1<u;u++)c.EXP_TABLE[u]=c.EXP_TABLE[u-4]^c.EXP_TABLE[u-5]^c.EXP_TABLE[u-6]^c.EXP_TABLE[u-8];for(u=0;255>u;u++)c.LOG_TABLE[c.EXP_TABLE[u]]=u;return r.prototype={get:function(e){return this.num[e]},getLength:function(){return this.num.length},multiply:function(e){for(var t=Array(this.getLength()+e.getLength()-1),n=0;nthis.getLength()-e.getLength())return this;for(var t=c.glog(this.get(0))-c.glog(e.get(0)),n=Array(this.getLength()),i=0;i>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},"string"==typeof t&&(t={text:t}),t=e.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,correctLevel:2,background:"#ffffff",foreground:"#000000"},t),this.each(function(){var n;if("canvas"==t.render){(n=new o(t.typeNumber,t.correctLevel)).addData(t.text),n.make();var i=document.createElement("canvas");i.width=t.width,i.height=t.height;for(var r=i.getContext("2d"),s=t.width/n.getModuleCount(),a=t.height/n.getModuleCount(),l=0;l").css("width",t.width+"px").css("height",t.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",t.background),r=t.width/n.getModuleCount(),s=t.height/n.getModuleCount(),a=0;a").css("height",s+"px").appendTo(i),c=0;c").css("width",r+"px").css("background-color",n.isDark(a,c)?t.foreground:t.background).appendTo(l);n=i,jQuery(n).appendTo(this)})}}(jQuery),function(){"use strict";var e="undefined"!=typeof window&&void 0!==window.document?window.document:{},t="undefined"!=typeof module&&module.exports,n=function(){for(var t,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=0,o=n.length,r={};i",{class:n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=i("
    "),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=i("",f.noCloneChecked=!!ue.cloneNode(!0).lastChild.defaultValue,ue.innerHTML="",f.option=!!ue.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function me(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&k(e,t)?_.merge([e],n):n}function be(e,t){for(var n=0,i=e.length;n",""]);var ve=/<|&#?\w+;/;function ye(e,t,n,i,o){for(var r,s,a,l,c,u,d=t.createDocumentFragment(),h=[],f=0,p=e.length;f\s*$/g;function De(e,t){return k(e,"table")&&k(11!==t.nodeType?t:t.firstChild,"tr")&&_(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ne(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,i,o,r,s,a;if(1===t.nodeType){if(G.hasData(e)&&(a=G.get(e).events))for(o in G.remove(t,"handle events"),a)for(n=0,i=a[o].length;n").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),m.head.appendChild(t[0])},abort:function(){n&&n()}}});var zt,Wt=[],Ut=/(=)\?(?=&|$)|\?\?/;_.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Wt.pop()||_.expando+"_"+_t.guid++;return this[e]=!0,e}}),_.ajaxPrefilter("json jsonp",function(t,n,i){var o,r,s,a=!1!==t.jsonp&&(Ut.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return o=t.jsonpCallback=p(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ut,"$1"+o):!1!==t.jsonp&&(t.url+=(xt.test(t.url)?"&":"?")+t.jsonp+"="+o),t.converters["script json"]=function(){return s||_.error(o+" was not called"),s[0]},t.dataTypes[0]="json",r=e[o],e[o]=function(){s=arguments},i.always(function(){void 0===r?_(e).removeProp(o):e[o]=r,t[o]&&(t.jsonpCallback=n.jsonpCallback,Wt.push(o)),s&&p(r)&&r(s[0]),s=r=void 0}),"script"}),f.createHTMLDocument=((zt=m.implementation.createHTMLDocument("").body).innerHTML="
    ",2===zt.childNodes.length),_.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(f.createHTMLDocument?((i=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(i)):t=m),r=!n&&[],(o=S.exec(e))?[t.createElement(o[1])]:(o=ye([e],t,r),r&&r.length&&_(r).remove(),_.merge([],o.childNodes)));var i,o,r},_.fn.load=function(e,t,n){var i,o,r,s=this,a=e.indexOf(" ");return-1").append(_.parseHTML(e)).find(i):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,r||[e.responseText,t,e])})}),this},_.expr.pseudos.animated=function(e){return _.grep(_.timers,function(t){return e===t.elem}).length},_.offset={setOffset:function(e,t,n){var i,o,r,s,a,l,c=_.css(e,"position"),u=_(e),d={};"static"===c&&(e.style.position="relative"),a=u.offset(),r=_.css(e,"top"),l=_.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(r+l).indexOf("auto")?(s=(i=u.position()).top,o=i.left):(s=parseFloat(r)||0,o=parseFloat(l)||0),p(t)&&(t=t.call(e,n,_.extend({},a))),null!=t.top&&(d.top=t.top-a.top+s),null!=t.left&&(d.left=t.left-a.left+o),"using"in t?t.using.call(e,d):u.css(d)}},_.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){_.offset.setOffset(this,e,t)});var t,n,i=this[0];return i?i.getClientRects().length?(t=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],o={top:0,left:0};if("fixed"===_.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===_.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((o=_(e).offset()).top+=_.css(e,"borderTopWidth",!0),o.left+=_.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-_.css(i,"marginTop",!0),left:t.left-o.left-_.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===_.css(e,"position");)e=e.offsetParent;return e||ie})}}),_.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;_.fn[e]=function(i){return q(this,function(e,i,o){var r;if(g(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===o)return r?r[t]:e[i];r?r.scrollTo(n?r.pageXOffset:o,n?o:r.pageYOffset):e[i]=o},e,i,arguments.length)}}),_.each(["top","left"],function(e,t){_.cssHooks[t]=He(f.pixelPosition,function(e,n){if(n)return n=Me(e,t),Ie.test(n)?_(e).position()[t]+"px":n})}),_.each({Height:"height",Width:"width"},function(e,t){_.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,i){_.fn[i]=function(o,r){var s=arguments.length&&(n||"boolean"!=typeof o),a=n||(!0===o||!0===r?"margin":"border");return q(this,function(t,n,o){var r;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(r=t.documentElement,Math.max(t.body["scroll"+e],r["scroll"+e],t.body["offset"+e],r["offset"+e],r["client"+e])):void 0===o?_.css(t,n,a):_.style(t,n,o,a)},t,s?o:void 0,s)}})}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){_.fn[t]=function(e){return this.on(t,e)}}),_.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),_.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){_.fn[t]=function(e,n){return 0[].concat(...Element.prototype.querySelectorAll.call(t,e)),findOne:(e,t=document.documentElement)=>Element.prototype.querySelector.call(t,e),children:(e,t)=>[].concat(...e.children).filter(e=>e.matches(t)),parents(e,t){const n=[];let i=e.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(t)&&n.push(i),i=i.parentNode;return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]}},i=e=>{do{e+=Math.floor(1e6*Math.random())}while(document.getElementById(e));return e},o=e=>{let t=e.getAttribute("data-bs-target");if(!t||"#"===t){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n="#"+n.split("#")[1]),t=n&&"#"!==n?n.trim():null}return t},r=e=>{const t=o(e);return t&&document.querySelector(t)?t:null},s=e=>{const t=o(e);return t?document.querySelector(t):null},a=e=>{e.dispatchEvent(new Event("transitionend"))},l=e=>!(!e||"object"!=typeof e)&&(void 0!==e.jquery&&(e=e[0]),void 0!==e.nodeType),c=e=>l(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?n.findOne(e):null,u=(e,t,n)=>{Object.keys(n).forEach(i=>{const o=n[i],r=t[i],s=r&&l(r)?"element":null==(a=r)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(o).test(s))throw new TypeError(`${e.toUpperCase()}: Option "${i}" provided type "${s}" but expected type "${o}".`)})},d=e=>!(!l(e)||0===e.getClientRects().length)&&"visible"===getComputedStyle(e).getPropertyValue("visibility"),h=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled")),f=e=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?f(e.parentNode):null},p=()=>{},g=e=>e.offsetHeight,m=()=>{const{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},b=[],v=()=>"rtl"===document.documentElement.dir,y=e=>{var t;t=(()=>{const t=m();if(t){const n=e.NAME,i=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=(()=>(t.fn[n]=i,e.jQueryInterface))}}),"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{b.forEach(e=>e())}),b.push(t)):t()},w=e=>{"function"==typeof e&&e()},_=(e,t,n=!0)=>{if(!n)return void w(e);const i=(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const i=Number.parseFloat(t),o=Number.parseFloat(n);return i||o?(t=t.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(n))):0})(t)+5;let o=!1;const r=({target:n})=>{n===t&&(o=!0,t.removeEventListener("transitionend",r),w(e))};t.addEventListener("transitionend",r),setTimeout(()=>{o||a(t)},i)},x=(e,t,n,i)=>{let o=e.indexOf(t);if(-1===o)return e[!n&&i?e.length-1:0];const r=e.length;return o+=n?1:-1,i&&(o=(o+r)%r),e[Math.max(0,Math.min(o,r-1))]},C=/[^.]*(?=\..*)\.|.*/,E=/\..*/,A=/::\d+$/,T={};let k=1;const S={mouseenter:"mouseover",mouseleave:"mouseout"},D=/^(mouseenter|mouseleave)/i,L=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function N(e,t){return t&&`${t}::${k++}`||e.uidEvent||k++}function P(e){const t=N(e);return e.uidEvent=t,T[t]=T[t]||{},T[t]}function j(e,t,n=null){const i=Object.keys(e);for(let o=0,r=i.length;o(function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)});i?i=e(i):n=e(n)}const[r,s,a]=$(t,n,i),l=P(e),c=l[a]||(l[a]={}),u=j(c,s,r?n:null);if(u)return void(u.oneOff=u.oneOff&&o);const d=N(s,t.replace(C,"")),h=r?function(e,t,n){return function i(o){const r=e.querySelectorAll(t);for(let{target:s}=o;s&&s!==this;s=s.parentNode)for(let a=r.length;a--;)if(r[a]===s)return o.delegateTarget=s,i.oneOff&&B.off(e,o.type,t,n),n.apply(s,[o]);return null}}(e,n,i):function(e,t){return function n(i){return i.delegateTarget=e,n.oneOff&&B.off(e,i.type,t),t.apply(e,[i])}}(e,n);h.delegationSelector=r?n:null,h.originalHandler=s,h.oneOff=o,h.uidEvent=d,c[d]=h,e.addEventListener(a,h,r)}function O(e,t,n,i,o){const r=j(t[n],i,o);r&&(e.removeEventListener(n,r,Boolean(o)),delete t[n][r.uidEvent])}function R(e){return e=e.replace(E,""),S[e]||e}const B={on(e,t,n,i){I(e,t,n,i,!1)},one(e,t,n,i){I(e,t,n,i,!0)},off(e,t,n,i){if("string"!=typeof t||!e)return;const[o,r,s]=$(t,n,i),a=s!==t,l=P(e),c=t.startsWith(".");if(void 0!==r){if(!l||!l[s])return;return void O(e,l,s,r,o?n:null)}c&&Object.keys(l).forEach(n=>{!function(e,t,n,i){const o=t[n]||{};Object.keys(o).forEach(r=>{if(r.includes(i)){const i=o[r];O(e,t,n,i.originalHandler,i.delegationSelector)}})}(e,l,n,t.slice(1))});const u=l[s]||{};Object.keys(u).forEach(n=>{const i=n.replace(A,"");if(!a||t.includes(i)){const t=u[n];O(e,l,s,t.originalHandler,t.delegationSelector)}})},trigger(e,t,n){if("string"!=typeof t||!e)return null;const i=m(),o=R(t),r=t!==o,s=L.has(o);let a,l=!0,c=!0,u=!1,d=null;return r&&i&&(a=i.Event(t,n),i(e).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),u=a.isDefaultPrevented()),s?(d=document.createEvent("HTMLEvents")).initEvent(o,l,!0):d=new CustomEvent(t,{bubbles:l,cancelable:!0}),void 0!==n&&Object.keys(n).forEach(e=>{Object.defineProperty(d,e,{get:()=>n[e]})}),u&&d.preventDefault(),c&&e.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map;var H={set(e,t,n){M.has(e)||M.set(e,new Map);const i=M.get(e);i.has(t)||0===i.size?i.set(t,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(e,t)=>M.has(e)&&M.get(e).get(t)||null,remove(e,t){if(!M.has(e))return;const n=M.get(e);n.delete(t),0===n.size&&M.delete(e)}};class F{constructor(e){(e=c(e))&&(this._element=e,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,t,n=!0){_(e,t,n)}static getInstance(e){return H.get(e,this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,"object"==typeof t?t:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class q extends F{static get NAME(){return"alert"}close(e){const t=e?this._getRootElement(e):this._element,n=this._triggerCloseEvent(t);null===n||n.defaultPrevented||this._removeElement(t)}_getRootElement(e){return s(e)||e.closest(".alert")}_triggerCloseEvent(e){return B.trigger(e,"close.bs.alert")}_removeElement(e){e.classList.remove("show");const t=e.classList.contains("fade");this._queueCallback(()=>this._destroyElement(e),e,t)}_destroyElement(e){e.remove(),B.trigger(e,"closed.bs.alert")}static jQueryInterface(e){return this.each(function(){const t=q.getOrCreateInstance(this);"close"===e&&t[e](this)})}static handleDismiss(e){return function(t){t&&t.preventDefault(),e.close(this)}}}B.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',q.handleDismiss(new q)),y(q);class z extends F{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each(function(){const t=z.getOrCreateInstance(this);"toggle"===e&&t[e]()})}}function W(e){return"true"===e||"false"!==e&&(e===Number(e).toString()?Number(e):""===e||"null"===e?null:e)}function U(e){return e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())}B.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',e=>{e.preventDefault();const t=e.target.closest('[data-bs-toggle="button"]');z.getOrCreateInstance(t).toggle()}),y(z);const X={setDataAttribute(e,t,n){e.setAttribute("data-bs-"+U(t),n)},removeDataAttribute(e,t){e.removeAttribute("data-bs-"+U(t))},getDataAttributes(e){if(!e)return{};const t={};return Object.keys(e.dataset).filter(e=>e.startsWith("bs")).forEach(n=>{let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),t[i]=W(e.dataset[n])}),t},getDataAttribute:(e,t)=>W(e.getAttribute("data-bs-"+U(t))),offset(e){const t=e.getBoundingClientRect();return{top:t.top+document.body.scrollTop,left:t.left+document.body.scrollLeft}},position:e=>({top:e.offsetTop,left:e.offsetLeft})},K={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},V={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},G="next",Q="prev",Y="left",Z="right",J={ArrowLeft:Z,ArrowRight:Y};class ee extends F{constructor(e,t){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._indicatorsElement=n.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return K}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(Q)}pause(e){e||(this._isPaused=!0),n.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(a(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=n.findOne(".active.carousel-item",this._element);const t=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void B.one(this._element,"slid.bs.carousel",()=>this.to(e));if(t===e)return this.pause(),void this.cycle();const i=e>t?G:Q;this._slide(i,this._items[e])}_getConfig(e){return e={...K,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("carousel",e,V),e}_handleSwipe(){const e=Math.abs(this.touchDeltaX);if(e<=40)return;const t=e/this.touchDeltaX;this.touchDeltaX=0,t&&this._slide(t>0?Z:Y)}_addEventListeners(){this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",e=>this._keydown(e)),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",e=>this.pause(e)),B.on(this._element,"mouseleave.bs.carousel",e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType?this._pointerEvent||(this.touchStartX=e.touches[0].clientX):this.touchStartX=e.clientX},t=e=>{this.touchDeltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this.touchStartX},i=e=>{!this._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType||(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(e=>this.cycle(e),500+this._config.interval))};n.find(".carousel-item img",this._element).forEach(e=>{B.on(e,"dragstart.bs.carousel",e=>e.preventDefault())}),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",t=>e(t)),B.on(this._element,"pointerup.bs.carousel",e=>i(e)),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",t=>e(t)),B.on(this._element,"touchmove.bs.carousel",e=>t(e)),B.on(this._element,"touchend.bs.carousel",e=>i(e)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=J[e.key];t&&(e.preventDefault(),this._slide(t))}_getItemIndex(e){return this._items=e&&e.parentNode?n.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,t){const n=e===G;return x(this._items,t,n,this._config.wrap)}_triggerSlideEvent(e,t){const i=this._getItemIndex(e),o=this._getItemIndex(n.findOne(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:t,from:o,to:i})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const t=n.findOne(".active",this._indicatorsElement);t.classList.remove("active"),t.removeAttribute("aria-current");const i=n.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{B.trigger(this._element,"slid.bs.carousel",{relatedTarget:s,direction:h,from:r,to:a})};if(this._element.classList.contains("slide")){s.classList.add(d),g(s),o.classList.add(u),s.classList.add(u);const e=()=>{s.classList.remove(u,d),s.classList.add("active"),o.classList.remove("active",d,u),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(e,o,!0)}else o.classList.remove("active"),s.classList.add("active"),this._isSliding=!1,f();l&&this.cycle()}_directionToOrder(e){return[Z,Y].includes(e)?v()?e===Y?Q:G:e===Y?G:Q:e}_orderToDirection(e){return[G,Q].includes(e)?v()?e===Q?Y:Z:e===Q?Z:Y:e}static carouselInterface(e,t){const n=ee.getOrCreateInstance(e,t);let{_config:i}=n;"object"==typeof t&&(i={...i,...t});const o="string"==typeof t?t:i.slide;if("number"==typeof t)n.to(t);else if("string"==typeof o){if(void 0===n[o])throw new TypeError(`No method named "${o}"`);n[o]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}static jQueryInterface(e){return this.each(function(){ee.carouselInterface(this,e)})}static dataApiClickHandler(e){const t=s(this);if(!t||!t.classList.contains("carousel"))return;const n={...X.getDataAttributes(t),...X.getDataAttributes(this)},i=this.getAttribute("data-bs-slide-to");i&&(n.interval=!1),ee.carouselInterface(t,n),i&&ee.getInstance(t).to(i),e.preventDefault()}}B.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",ee.dataApiClickHandler),B.on(window,"load.bs.carousel.data-api",()=>{const e=n.find('[data-bs-ride="carousel"]');for(let t=0,n=e.length;te===this._element);null!==o&&s.length&&(this._selector=o,this._triggerArray.push(t))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return te}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let e,t;this._parent&&(0===(e=n.find(".show, .collapsing",this._parent).filter(e=>"string"==typeof this._config.parent?e.getAttribute("data-bs-parent")===this._config.parent:e.classList.contains("collapse"))).length&&(e=null));const i=n.findOne(this._selector);if(e){const n=e.find(e=>i!==e);if((t=n?ie.getInstance(n):null)&&t._isTransitioning)return}if(B.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e&&e.forEach(e=>{i!==e&&ie.collapseInterface(e,"hide"),t||H.set(e,"bs.collapse",null)});const o=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[o]=0,this._triggerArray.length&&this._triggerArray.forEach(e=>{e.classList.remove("collapsed"),e.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const r="scroll"+(o[0].toUpperCase()+o.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[o]="",this.setTransitioning(!1),B.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[o]=this._element[r]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(B.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const e=this._getDimension();this._element.style[e]=this._element.getBoundingClientRect()[e]+"px",g(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const t=this._triggerArray.length;if(t>0)for(let e=0;e{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),B.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(e){this._isTransitioning=e}_getConfig(e){return(e={...te,...e}).toggle=Boolean(e.toggle),u("collapse",e,ne),e}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:e}=this._config;const t=`[data-bs-toggle="collapse"][data-bs-parent="${e=c(e)}"]`;return n.find(t,e).forEach(e=>{const t=s(e);this._addAriaAndCollapsedClass(t,[e])}),e}_addAriaAndCollapsedClass(e,t){if(!e||!t.length)return;const n=e.classList.contains("show");t.forEach(e=>{n?e.classList.remove("collapsed"):e.classList.add("collapsed"),e.setAttribute("aria-expanded",n)})}static collapseInterface(e,t){let n=ie.getInstance(e);const i={...te,...X.getDataAttributes(e),..."object"==typeof t&&t?t:{}};if(!n&&i.toggle&&"string"==typeof t&&/show|hide/.test(t)&&(i.toggle=!1),n||(n=new ie(e,i)),"string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){ie.collapseInterface(this,e)})}}B.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const t=X.getDataAttributes(this),i=r(this);n.find(i).forEach(e=>{const n=ie.getInstance(e);let i;n?(null===n._parent&&"string"==typeof t.parent&&(n._config.parent=t.parent,n._parent=n._getParent()),i="toggle"):i=t,ie.collapseInterface(e,i)})}),y(ie);const oe=new RegExp("ArrowUp|ArrowDown|Escape"),re=v()?"top-end":"top-start",se=v()?"top-start":"top-end",ae=v()?"bottom-end":"bottom-start",le=v()?"bottom-start":"bottom-end",ce=v()?"left-start":"right-start",ue=v()?"right-start":"left-start",de={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},he={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class fe extends F{constructor(e,t){super(e),this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return de}static get DefaultType(){return he}static get NAME(){return"dropdown"}toggle(){h(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(h(this._element)||this._menu.classList.contains("show"))return;const e=fe.getParentFromElement(this._element),n={relatedTarget:this._element};if(!B.trigger(this._element,"show.bs.dropdown",n).defaultPrevented){if(this._inNavbar)X.setDataAttribute(this._menu,"popper","none");else{if(void 0===t)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let n=this._element;"parent"===this._config.reference?n=e:l(this._config.reference)?n=c(this._config.reference):"object"==typeof this._config.reference&&(n=this._config.reference);const i=this._getPopperConfig(),o=i.modifiers.find(e=>"applyStyles"===e.name&&!1===e.enabled);this._popper=t.createPopper(n,this._menu,i),o&&X.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(e=>B.on(e,"mouseover",p)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),B.trigger(this._element,"shown.bs.dropdown",n)}}hide(){if(h(this._element)||!this._menu.classList.contains("show"))return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){B.on(this._element,"click.bs.dropdown",e=>{e.preventDefault(),this.toggle()})}_completeHide(e){B.trigger(this._element,"hide.bs.dropdown",e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>B.off(e,"mouseover",p)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),X.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,"hidden.bs.dropdown",e))}_getConfig(e){if(e={...this.constructor.Default,...X.getDataAttributes(this._element),...e},u("dropdown",e,this.constructor.DefaultType),"object"==typeof e.reference&&!l(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return e}_getMenuElement(){return n.next(this._element,".dropdown-menu")[0]}_getPlacement(){const e=this._element.parentNode;if(e.classList.contains("dropend"))return ce;if(e.classList.contains("dropstart"))return ue;const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?se:re:t?le:ae}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:t}){const i=n.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(d);i.length&&x(i,t,"ArrowDown"===e,!i.includes(t)).focus()}static dropdownInterface(e,t){const n=fe.getOrCreateInstance(e,t);if("string"==typeof t){if(void 0===n[t])throw new TypeError(`No method named "${t}"`);n[t]()}}static jQueryInterface(e){return this.each(function(){fe.dropdownInterface(this,e)})}static clearMenus(e){if(e&&(2===e.button||"keyup"===e.type&&"Tab"!==e.key))return;const t=n.find('[data-bs-toggle="dropdown"]');for(let n=0,i=t.length;nthis.matches('[data-bs-toggle="dropdown"]')?this:n.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===e.key?(i().focus(),void fe.clearMenus()):"ArrowUp"===e.key||"ArrowDown"===e.key?(t||i().click(),void fe.getInstance(i())._selectMenuItem(e)):void(t&&"Space"!==e.key||fe.clearMenus())}}B.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',fe.dataApiKeydownHandler),B.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",fe.dataApiKeydownHandler),B.on(document,"click.bs.dropdown.data-api",fe.clearMenus),B.on(document,"keyup.bs.dropdown.data-api",fe.clearMenus),B.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',function(e){e.preventDefault(),fe.dropdownInterface(this)}),y(fe);class pe{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",t=>t+e),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",t=>t+e),this._setElementAttributes(".sticky-top","marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const i=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+i)return;this._saveInitialAttribute(e,t);const o=window.getComputedStyle(e)[t];e.style[t]=n(Number.parseFloat(o))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(e,t){const n=e.style[t];n&&X.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{const n=X.getDataAttribute(e,t);void 0===n?e.style.removeProperty(t):(X.removeDataAttribute(e,t),e.style[t]=n)})}_applyManipulationCallback(e,t){l(e)?t(e):n.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}const ge={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},me={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class be{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){this._config.isVisible?(this._append(),this._config.isAnimated&&g(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{w(e)})):w(e)}hide(e){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),w(e)})):w(e)}_getElement(){if(!this._element){const e=document.createElement("div");e.className="modal-backdrop",this._config.isAnimated&&e.classList.add("fade"),this._element=e}return this._element}_getConfig(e){return(e={...ge,..."object"==typeof e?e:{}}).rootElement=c(e.rootElement),u("backdrop",e,me),e}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),B.on(this._getElement(),"mousedown.bs.backdrop",()=>{w(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(B.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){_(e,this._getElement(),this._config.isAnimated)}}const ve={backdrop:!0,keyboard:!0,focus:!0},ye={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class we extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._dialog=n.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new pe}static get Default(){return ve}static get NAME(){return"modal"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||B.trigger(this._element,"show.bs.modal",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),B.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',e=>this.hide(e)),B.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{B.one(this._element,"mouseup.dismiss.bs.modal",e=>{e.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(e){if(e&&["A","AREA"].includes(e.target.tagName)&&e.preventDefault(),!this._isShown||this._isTransitioning)return;if(B.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),B.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.modal"),B.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,t)}dispose(){[window,this._dialog].forEach(e=>B.off(e,".bs.modal")),this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new be({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(e){return e={...ve,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("modal",e,ye),e}_showElement(e){const t=this._isAnimated(),i=n.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),t&&g(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,B.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,t)}_enforceFocus(){B.off(document,"focusin.bs.modal"),B.on(document,"focusin.bs.modal",e=>{document===e.target||this._element===e.target||this._element.contains(e.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?B.on(this._element,"keydown.dismiss.bs.modal",e=>{this._config.keyboard&&"Escape"===e.key?(e.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==e.key||this._triggerBackdropTransition()}):B.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?B.on(window,"resize.bs.modal",()=>this._adjustDialog()):B.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(e){B.on(this._element,"click.dismiss.bs.modal",e=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:e.target===e.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(B.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:e,scrollHeight:t,style:n}=this._element,i=t>document.documentElement.clientHeight;!i&&"hidden"===n.overflowY||e.contains("modal-static")||(i||(n.overflowY="hidden"),e.add("modal-static"),this._queueCallback(()=>{e.remove("modal-static"),i||this._queueCallback(()=>{n.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;(!n&&e&&!v()||n&&!e&&v())&&(this._element.style.paddingLeft=t+"px"),(n&&!e&&!v()||!n&&e&&v())&&(this._element.style.paddingRight=t+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=we.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e](t)}})}}B.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',function(e){const t=s(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),B.one(t,"show.bs.modal",e=>{e.defaultPrevented||B.one(t,"hidden.bs.modal",()=>{d(this)&&this.focus()})}),we.getOrCreateInstance(t).toggle(this)}),y(we);const _e={backdrop:!0,keyboard:!0,scroll:!1},xe={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Ce extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return _e}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||B.trigger(this._element,"show.bs.offcanvas",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new pe).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{B.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:e})},this._element,!0))}hide(){this._isShown&&(B.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(B.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new pe).reset(),B.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.offcanvas")}_getConfig(e){return e={..._e,...X.getDataAttributes(this._element),..."object"==typeof e?e:{}},u("offcanvas",e,xe),e}_initializeBackDrop(){return new be({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(e){B.off(document,"focusin.bs.offcanvas"),B.on(document,"focusin.bs.offcanvas",t=>{document===t.target||e===t.target||e.contains(t.target)||e.focus()}),e.focus()}_addEventListeners(){B.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),B.on(this._element,"keydown.dismiss.bs.offcanvas",e=>{this._config.keyboard&&"Escape"===e.key&&this.hide()})}static jQueryInterface(e){return this.each(function(){const t=Ce.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}B.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',function(e){const t=s(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this))return;B.one(t,"hidden.bs.offcanvas",()=>{d(this)&&this.focus()});const i=n.findOne(".offcanvas.show");i&&i!==t&&Ce.getInstance(i).hide(),Ce.getOrCreateInstance(t).toggle(this)}),B.on(window,"load.bs.offcanvas.data-api",()=>n.find(".offcanvas.show").forEach(e=>Ce.getOrCreateInstance(e).show())),y(Ce);const Ee=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ae=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Te=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,ke=(e,t)=>{const n=e.nodeName.toLowerCase();if(t.includes(n))return!Ee.has(n)||Boolean(Ae.test(e.nodeValue)||Te.test(e.nodeValue));const i=t.filter(e=>e instanceof RegExp);for(let e=0,t=i.length;e{ke(e,a)||n.removeAttribute(e.nodeName)})}return i.body.innerHTML}const De=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Le=new Set(["sanitize","allowList","sanitizeFn"]),Ne={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Pe={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},je={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},$e={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class Ie extends F{constructor(e,n){if(void 0===t)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(n),this.tip=null,this._setListeners()}static get Default(){return je}static get NAME(){return"tooltip"}static get Event(){return $e}static get DefaultType(){return Ne}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(this._isEnabled)if(e){const t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const e=B.trigger(this._element,this.constructor.Event.SHOW),n=f(this._element),o=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!o)return;const r=this.getTipElement(),s=i(this.constructor.NAME);r.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this.setContent(),this._config.animation&&r.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,r,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:c}=this._config;H.set(r,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(c.appendChild(r),B.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=t.createPopper(this._element,r,this._getPopperConfig(l)),r.classList.add("show");const u="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;u&&r.classList.add(...u.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>{B.on(e,"mouseover",p)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const e=this._hoverState;this._hoverState=null,B.trigger(this._element,this.constructor.Event.SHOWN),"out"===e&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const e=this.getTipElement();if(B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>B.off(e,"mouseover",p)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const t=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),B.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,t),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const e=document.createElement("div");return e.innerHTML=this._config.template,this.tip=e.children[0],this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")}setElementContent(e,t){if(null!==e)return l(t)?(t=c(t),void(this._config.html?t.parentNode!==e&&(e.innerHTML="",e.appendChild(t)):e.textContent=t.textContent)):void(this._config.html?(this._config.sanitize&&(t=Se(t,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=t):e.textContent=t)}getTitle(){let e=this._element.getAttribute("data-bs-original-title");return e||(e="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),e}updateAttachment(e){return"right"===e?"end":"left"===e?"start":e}_initializeOnDelegatedTarget(e,t){const n=this.constructor.DATA_KEY;return(t=t||H.get(e.delegateTarget,n))||(t=new this.constructor(e.delegateTarget,this._getDelegateConfig()),H.set(e.delegateTarget,n,t)),t}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:e=>this._handlePopperPlacementChange(e)}],onFirstUpdate:e=>{e.options.placement!==e.placement&&this._handlePopperPlacementChange(e)}};return{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_addAttachmentClass(e){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(e))}_getAttachment(e){return Pe[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(e=>{if("click"===e)B.on(this._element,this.constructor.Event.CLICK,this._config.selector,e=>this.toggle(e));else if("manual"!==e){const t="hover"===e?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,n="hover"===e?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;B.on(this._element,t,this._config.selector,e=>this._enter(e)),B.on(this._element,n,this._config.selector,e=>this._leave(e))}}),this._hideModalHandler=(()=>{this._element&&this.hide()}),B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||"string"!==t)&&(this._element.setAttribute("data-bs-original-title",e||""),!e||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusin"===e.type?"focus":"hover"]=!0),t.getTipElement().classList.contains("show")||"show"===t._hoverState?t._hoverState="show":(clearTimeout(t._timeout),t._hoverState="show",t._config.delay&&t._config.delay.show?t._timeout=setTimeout(()=>{"show"===t._hoverState&&t.show()},t._config.delay.show):t.show())}_leave(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusout"===e.type?"focus":"hover"]=t._element.contains(e.relatedTarget)),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t._config.delay&&t._config.delay.hide?t._timeout=setTimeout(()=>{"out"===t._hoverState&&t.hide()},t._config.delay.hide):t.hide())}_isWithActiveTrigger(){for(const e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){const t=X.getDataAttributes(this._element);return Object.keys(t).forEach(e=>{Le.has(e)&&delete t[e]}),(e={...this.constructor.Default,...t,..."object"==typeof e&&e?e:{}}).container=!1===e.container?document.body:c(e.container),"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),u("tooltip",e,this.constructor.DefaultType),e.sanitize&&(e.template=Se(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){const e={};if(this._config)for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(De);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}_handlePopperPlacementChange(e){const{state:t}=e;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}static jQueryInterface(e){return this.each(function(){const t=Ie.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}y(Ie);const Oe=new RegExp("(^|\\s)bs-popover\\S+","g"),Re={...Ie.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Be={...Ie.DefaultType,content:"(string|element|function)"},Me={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class He extends Ie{static get Default(){return Re}static get NAME(){return"popover"}static get Event(){return Me}static get DefaultType(){return Be}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||n.findOne(".popover-header",this.tip).remove(),this._getContent()||n.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const e=this.getTipElement();this.setElementContent(n.findOne(".popover-header",e),this.getTitle());let t=this._getContent();"function"==typeof t&&(t=t.call(this._element)),this.setElementContent(n.findOne(".popover-body",e),t),e.classList.remove("fade","show")}_addAttachmentClass(e){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(e))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const e=this.getTipElement(),t=e.getAttribute("class").match(Oe);null!==t&&t.length>0&&t.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}static jQueryInterface(e){return this.each(function(){const t=He.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}y(He);const Fe={offset:10,method:"auto",target:""},qe={offset:"number",method:"string",target:"(string|element)"};class ze extends F{constructor(e,t){super(e),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(t),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,B.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return Fe}static get NAME(){return"scrollspy"}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":"position",t="auto"===this._config.method?e:this._config.method,i="position"===t?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),n.find(this._selector).map(e=>{const o=r(e),s=o?n.findOne(o):null;if(s){const e=s.getBoundingClientRect();if(e.width||e.height)return[X[t](s).top+i,o]}return null}).filter(e=>e).sort((e,t)=>e[0]-t[0]).forEach(e=>{this._offsets.push(e[0]),this._targets.push(e[1])})}dispose(){B.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(e){if("string"!=typeof(e={...Fe,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}}).target&&l(e.target)){let{id:t}=e.target;t||(t=i("scrollspy"),e.target.id=t),e.target="#"+t}return u("scrollspy",e,qe),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){const e=this._targets[this._targets.length-1];this._activeTarget!==e&&this._activate(e)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(void 0===this._offsets[t+1]||e`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),i=n.findOne(t.join(","));i.classList.contains("dropdown-item")?(n.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add("active"),i.classList.add("active")):(i.classList.add("active"),n.parents(i,".nav, .list-group").forEach(e=>{n.prev(e,".nav-link, .list-group-item").forEach(e=>e.classList.add("active")),n.prev(e,".nav-item").forEach(e=>{n.children(e,".nav-link").forEach(e=>e.classList.add("active"))})})),B.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){n.find(this._selector).filter(e=>e.classList.contains("active")).forEach(e=>e.classList.remove("active"))}static jQueryInterface(e){return this.each(function(){const t=ze.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(window,"load.bs.scrollspy.data-api",()=>{n.find('[data-bs-spy="scroll"]').forEach(e=>new ze(e))}),y(ze);class We extends F{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let e;const t=s(this._element),i=this._element.closest(".nav, .list-group");if(i){const t="UL"===i.nodeName||"OL"===i.nodeName?":scope > li > .active":".active";e=(e=n.find(t,i))[e.length-1]}const o=e?B.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(B.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==o&&o.defaultPrevented)return;this._activate(this._element,i);const r=()=>{B.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),B.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};t?this._activate(t,t.parentNode,r):r()}_activate(e,t,i){const o=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?n.children(t,".active"):n.find(":scope > li > .active",t))[0],r=i&&o&&o.classList.contains("fade"),s=()=>this._transitionComplete(e,o,i);o&&r?(o.classList.remove("show"),this._queueCallback(s,e,!0)):s()}_transitionComplete(e,t,i){if(t){t.classList.remove("active");const e=n.findOne(":scope > .dropdown-menu .active",t.parentNode);e&&e.classList.remove("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),g(e),e.classList.contains("fade")&&e.classList.add("show");let o=e.parentNode;if(o&&"LI"===o.nodeName&&(o=o.parentNode),o&&o.classList.contains("dropdown-menu")){const t=e.closest(".dropdown");t&&n.find(".dropdown-toggle",t).forEach(e=>e.classList.add("active")),e.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(e){return this.each(function(){const t=We.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),h(this)||We.getOrCreateInstance(this).show()}),y(We);const Ue={animation:"boolean",autohide:"boolean",delay:"number"},Xe={animation:!0,autohide:!0,delay:5e3};class Ke extends F{constructor(e,t){super(e),this._config=this._getConfig(t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Ue}static get Default(){return Xe}static get NAME(){return"toast"}show(){B.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),g(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),B.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(B.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),B.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(e){return e={...Xe,...X.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}},u("toast",e,this.constructor.DefaultType),e}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t}if(t)return void this._clearTimeout();const n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),B.on(this._element,"mouseover.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"mouseout.bs.toast",e=>this._onInteraction(e,!1)),B.on(this._element,"focusin.bs.toast",e=>this._onInteraction(e,!0)),B.on(this._element,"focusout.bs.toast",e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Ke.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e](this)}})}}return y(Ke),{Alert:q,Button:z,Carousel:ee,Collapse:ie,Dropdown:fe,Modal:we,Offcanvas:Ce,Popover:He,ScrollSpy:ze,Tab:We,Toast:Ke,Tooltip:Ie}}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function t(t,i,o){i={content:{message:"object"==typeof i?i.message:i,title:i.title?i.title:"",icon:i.icon?i.icon:"",url:i.url?i.url:"#",target:i.target?i.target:"-"}},o=e.extend(!0,{},i,o),this.settings=e.extend(!0,{},n,o),this._defaults=n,"-"==this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),this.init()}var n={element:"body",position:null,type:"info",allow_dismiss:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var e=arguments[0],t=1;t .progress-bar').removeClass("progress-bar-"+e.settings.type),e.settings.type=i[t],this.$ele.addClass("alert-"+i[t]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[t]);break;case"icon":var o=this.$ele.find('[data-notify="icon"]');"class"==e.settings.icon_type.toLowerCase()?o.removeClass(e.settings.content.icon).addClass(i[t]):(o.is("img")||o.find("img"),o.attr("src",i[t]));break;case"progress":var r=e.settings.delay-e.settings.delay*(i[t]/100);this.$ele.data("notify-delay",r),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[t]).css("width",i[t]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[t]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[t]);break;default:this.$ele.find('[data-notify="'+t+'"]').html(i[t])}var s=this.$ele.outerHeight()+parseInt(e.settings.spacing)+parseInt(e.settings.offset.y);e.reposition(s)},close:function(){e.close()}}},buildNotify:function(){var t=this.settings.content;this.$ele=e(String.format(this.settings.template,this.settings.type,t.title,t.message,t.url,t.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"==this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:"0px",position:"absolute",top:"0px",width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var t=this,n=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},o=!1,r=this.settings;switch(e('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){return n=Math.max(n,parseInt(e(this).css(r.placement.from))+parseInt(e(this).outerHeight())+parseInt(r.spacing))}),1==this.settings.newest_on_top&&(n=this.settings.offset.y),i[this.settings.placement.from]=n+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),e.each(Array("webkit","moz","o","ms",""),function(e,n){t.$ele[0].style[n+"AnimationIterationCount"]=1}),e(this.settings.element).append(this.$ele),1==this.settings.newest_on_top&&(n=parseInt(n)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(n)),e.isFunction(t.settings.onShow)&&t.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(e){o=!0}).one(this.animations.end,function(n){e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)}),setTimeout(function(){o||e.isFunction(t.settings.onShown)&&t.settings.onShown.call(this)},600)},bind:function(){var t=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){t.close()}),this.$ele.mouseover(function(t){e(this).data("data-hover","true")}).mouseout(function(t){e(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){t.$ele.data("notify-delay",t.settings.delay);var n=setInterval(function(){var e=parseInt(t.$ele.data("notify-delay"))-t.settings.timer;if("false"===t.$ele.data("data-hover")&&"pause"==t.settings.mouse_over||"pause"!=t.settings.mouse_over){var i=(t.settings.delay-e)/t.settings.delay*100;t.$ele.data("notify-delay",e),t.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}e<=-t.settings.timer&&(clearInterval(n),t.close())},t.settings.timer)}},close:function(){var t=this,n=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.data("closing","true").addClass(this.settings.animate.exit),t.reposition(n),e.isFunction(t.settings.onClose)&&t.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(e){i=!0}).one(this.animations.end,function(n){e(this).remove(),e.isFunction(t.settings.onClosed)&&t.settings.onClosed.call(this)}),setTimeout(function(){i||(t.$ele.remove(),t.settings.onClosed&&t.settings.onClosed(t.$ele))},600)},reposition:function(t){var n=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',o=this.$ele.nextAll(i);1==this.settings.newest_on_top&&(o=this.$ele.prevAll(i)),o.each(function(){e(this).css(n.settings.placement.from,t),t=parseInt(t)+parseInt(n.settings.spacing)+e(this).outerHeight()})}}),e.notify=function(e,n){return new t(this,e,n).notify},e.notifyDefaults=function(t){return n=e.extend(!0,{},n,t)},e.notifyClose=function(t){void 0===t||"all"==t?e("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):e('[data-notify-position="'+t+'"]').find('[data-notify="dismiss"]').trigger("click")}});var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof i?new i(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(_ instanceof l)){if(g&&y!=t.length-1){if(h.lastIndex=w,!(k=h.exec(e)))break;for(var x=k.index+(p?k[1].length:0),C=k.index+k[0].length,E=y,A=w,T=t.length;E"+r.content+""},!_self.document)return _self.addEventListener&&(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),i=t.language,o=t.code,r=t.immediateClose;_self.postMessage(n.highlight(o,n.languages[i],i)),r&&_self.close()},!1)),_self.Prism;var o=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return o&&(n.filename=o.src,n.manual||o.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/[a-z0-9_]+(?=\()/i,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,function:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}}}),Prism.languages.javascript["template-string"].inside.interpolation.inside.rest=Prism.languages.javascript,Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(){var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){for(var n,i=t.getAttribute("data-src"),o=t,r=/\blang(?:uage)?-([\w-]+)\b/i;o&&!r.test(o.className);)o=o.parentNode;if(o&&(n=(t.className.match(r)||[,""])[1]),!n){var s=(i.match(/\.(\w+)$/)||[,""])[1];n=e[s]||s}var a=document.createElement("code");a.className="language-"+n,t.textContent="",a.textContent="Loading…",t.appendChild(a);var l=new XMLHttpRequest;l.open("GET",i,!0),l.onreadystatechange=function(){4==l.readyState&&(l.status<400&&l.responseText?(a.textContent=l.responseText,Prism.highlightElement(a)):400<=l.status?a.textContent="✖ Error "+l.status+" while fetching file: "+l.statusText:a.textContent="✖ Error: File does not exist or is empty")},l.send(null)}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),i=document.createElement("a");return i.textContent=t.getAttribute("data-download-link-label")||"Download",i.setAttribute("download",""),i.href=n,i}})},document.addEventListener("DOMContentLoaded",self.Prism.fileHighlight)),function(e,t,n){var i,o=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/en_US/sdk.js",o.parentNode.insertBefore(i,o))}(document,"script","facebook-jssdk"),function(e,t,n,i,o,r){(i=e.gapi||(e.gapi={})).analytics={q:[],ready:function(e){this.q.push(e)}},o=t.createElement(n),r=t.getElementsByTagName(n)[0],o.src="https://apis.google.com/js/platform.js",r.parentNode.insertBefore(o,r),o.onload=function(){i.load("analytics")}}(window,document,"script"),function(e,t,n){var i,o=e.getElementsByTagName(t)[0];e.getElementById(n)||((i=e.createElement(t)).id=n,i.src="https://connect.facebook.net/vi_VN/sdk/xfbml.customerchat.js",o.parentNode.insertBefore(i,o))}(document,"script","facebook-jssdk"),function(e){e.fn.qrcode=function(t){var n;function i(e){this.mode=n,this.data=e}function o(e,t){this.typeNumber=e,this.errorCorrectLevel=t,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function r(e,t){if(null==e.length)throw Error(e.length+"/"+t);for(var n=0;ne||this.moduleCount<=e||0>t||this.moduleCount<=t)throw Error(e+","+t);return this.modules[e][t]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){var e=1;for(e=1;40>e;e++){for(var t=s.getRSBlocks(e,this.errorCorrectLevel),n=new a,i=0,o=0;o=n;n++)if(!(-1>=e+n||this.moduleCount<=e+n))for(var i=-1;7>=i;i++)-1>=t+i||this.moduleCount<=t+i||(this.modules[e+n][t+i]=0<=n&&6>=n&&(0==i||6==i)||0<=i&&6>=i&&(0==n||6==n)||2<=n&&4>=n&&2<=i&&4>=i)},getBestMaskPattern:function(){for(var e=0,t=0,n=0;8>n;n++){this.makeImpl(!0,n);var i=l.getLostPoint(this);(0==n||e>i)&&(e=i,t=n)}return t},createMovieClip:function(e,t,n){for(e=e.createEmptyMovieClip(t,n),this.make(),t=0;t=r;r++)for(var s=-2;2>=s;s++)this.modules[i+r][o+s]=-2==r||2==r||-2==s||2==s||0==r&&0==s}},setupTypeNumber:function(e){for(var t=l.getBCHTypeNumber(this.typeNumber),n=0;18>n;n++){var i=!e&&1==(t>>n&1);this.modules[Math.floor(n/3)][n%3+this.moduleCount-8-3]=i}for(n=0;18>n;n++)i=!e&&1==(t>>n&1),this.modules[n%3+this.moduleCount-8-3][Math.floor(n/3)]=i},setupTypeInfo:function(e,t){for(var n=l.getBCHTypeInfo(this.errorCorrectLevel<<3|t),i=0;15>i;i++){var o=!e&&1==(n>>i&1);6>i?this.modules[i][8]=o:8>i?this.modules[i+1][8]=o:this.modules[this.moduleCount-15+i][8]=o}for(i=0;15>i;i++)o=!e&&1==(n>>i&1),8>i?this.modules[8][this.moduleCount-i-1]=o:9>i?this.modules[8][15-i-1+1]=o:this.modules[8][15-i-1]=o;this.modules[this.moduleCount-8][8]=!e},mapData:function(e,t){for(var n=-1,i=this.moduleCount-1,o=7,r=0,s=this.moduleCount-1;0a;a++)if(null==this.modules[i][s-a]){var c=!1;r>>o&1)),l.getMask(t,i,s-a)&&(c=!c),this.modules[i][s-a]=c,-1==--o&&(r++,o=7)}if(0>(i+=n)||this.moduleCount<=i){i-=n,n=-n;break}}}},o.PAD0=236,o.PAD1=17,o.createData=function(e,t,n){t=s.getRSBlocks(e,t);for(var i=new a,r=0;r8*e)throw Error("code length overflow. ("+i.getLengthInBits()+">"+8*e+")");for(i.getLengthInBits()+4<=8*e&&i.put(0,4);0!=i.getLengthInBits()%8;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*e||(i.put(o.PAD0,8),i.getLengthInBits()>=8*e));)i.put(o.PAD1,8);return o.createBytes(i,t)},o.createBytes=function(e,t){for(var n=0,i=0,o=0,s=Array(t.length),a=Array(t.length),c=0;c>>=1;return t},getPatternPosition:function(e){return l.PATTERN_POSITION_TABLE[e-1]},getMask:function(e,t,n){switch(e){case 0:return 0==(t+n)%2;case 1:return 0==t%2;case 2:return 0==n%3;case 3:return 0==(t+n)%3;case 4:return 0==(Math.floor(t/2)+Math.floor(n/3))%2;case 5:return 0==t*n%2+t*n%3;case 6:return 0==(t*n%2+t*n%3)%2;case 7:return 0==(t*n%3+(t+n)%2)%2;default:throw Error("bad maskPattern:"+e)}},getErrorCorrectPolynomial:function(e){for(var t=new r([1],0),n=0;nt)switch(e){case 1:return 10;case 2:return 9;case n:case 8:return 8;default:throw Error("mode:"+e)}else if(27>t)switch(e){case 1:return 12;case 2:return 11;case n:return 16;case 8:return 10;default:throw Error("mode:"+e)}else{if(!(41>t))throw Error("type:"+t);switch(e){case 1:return 14;case 2:return 13;case n:return 16;case 8:return 12;default:throw Error("mode:"+e)}}},getLostPoint:function(e){for(var t=e.getModuleCount(),n=0,i=0;i=a;a++)if(!(0>i+a||t<=i+a))for(var l=-1;1>=l;l++)0>o+l||t<=o+l||0==a&&0==l||s==e.isDark(i+a,o+l)&&r++;5e)throw Error("glog("+e+")");return c.LOG_TABLE[e]},gexp:function(e){for(;0>e;)e+=255;for(;256<=e;)e-=255;return c.EXP_TABLE[e]},EXP_TABLE:Array(256),LOG_TABLE:Array(256)},u=0;8>u;u++)c.EXP_TABLE[u]=1<u;u++)c.EXP_TABLE[u]=c.EXP_TABLE[u-4]^c.EXP_TABLE[u-5]^c.EXP_TABLE[u-6]^c.EXP_TABLE[u-8];for(u=0;255>u;u++)c.LOG_TABLE[c.EXP_TABLE[u]]=u;return r.prototype={get:function(e){return this.num[e]},getLength:function(){return this.num.length},multiply:function(e){for(var t=Array(this.getLength()+e.getLength()-1),n=0;nthis.getLength()-e.getLength())return this;for(var t=c.glog(this.get(0))-c.glog(e.get(0)),n=Array(this.getLength()),i=0;i>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(e){var t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},"string"==typeof t&&(t={text:t}),t=e.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,correctLevel:2,background:"#ffffff",foreground:"#000000"},t),this.each(function(){var n;if("canvas"==t.render){(n=new o(t.typeNumber,t.correctLevel)).addData(t.text),n.make();var i=document.createElement("canvas");i.width=t.width,i.height=t.height;for(var r=i.getContext("2d"),s=t.width/n.getModuleCount(),a=t.height/n.getModuleCount(),l=0;l").css("width",t.width+"px").css("height",t.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",t.background),r=t.width/n.getModuleCount(),s=t.height/n.getModuleCount(),a=0;a").css("height",s+"px").appendTo(i),c=0;c").css("width",r+"px").css("background-color",n.isDark(a,c)?t.foreground:t.background).appendTo(l);n=i,jQuery(n).appendTo(this)})}}(jQuery),function(){"use strict";var e="undefined"!=typeof window&&void 0!==window.document?window.document:{},t="undefined"!=typeof module&&module.exports,n=function(){for(var t,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],i=0,o=n.length,r={};i",{class:n+"box "+n+"editor-visible "+n+e.o.lang+" trumbowyg"}),e.isTextarea=e.$ta.is("textarea"),e.isTextarea?(o=e.$ta.val(),e.$ed=i("
    "),e.$box.insertAfter(e.$ta).append(e.$ed,e.$ta)):(e.$ed=e.$ta,o=e.$ed.html(),e.$ta=i("