tnx-shared 5.1.26 → 5.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/tnx-shared.umd.js +1999 -249
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/base/data-list-base.d.ts +2 -0
- package/classes/base/data-list-base.d.ts.map +1 -1
- package/classes/form-schema.d.ts +3 -0
- package/classes/form-schema.d.ts.map +1 -1
- package/components/chat/chat-box/chat-box.component.d.ts +102 -0
- package/components/chat/chat-box/chat-box.component.d.ts.map +1 -0
- package/components/chat/chat-box/chat-box.component.ngfactory.d.ts.map +1 -0
- package/components/chat/chat-box/chat-box.component.scss.shim.ngstyle.d.ts.map +1 -0
- package/components/chat/chat-send-message-box/chat-send-message-box.component.d.ts +37 -0
- package/components/chat/chat-send-message-box/chat-send-message-box.component.d.ts.map +1 -0
- package/components/chat/chat-send-message-box/chat-send-message-box.component.ngfactory.d.ts.map +1 -0
- package/components/chat/chat-send-message-box/chat-send-message-box.component.scss.shim.ngstyle.d.ts.map +1 -0
- package/components/chat/common-style.scss.shim.ngstyle.d.ts.map +1 -0
- package/components/chat/models/enums.d.ts +11 -0
- package/components/chat/models/enums.d.ts.map +1 -0
- package/components/chat/models/models.d.ts +10 -0
- package/components/chat/models/models.d.ts.map +1 -0
- package/components/chat/services/chat.service.d.ts +34 -0
- package/components/chat/services/chat.service.d.ts.map +1 -0
- package/components/chat/services/chat.service.ngfactory.d.ts.map +1 -0
- package/components/chat/services/content.service.d.ts +20 -0
- package/components/chat/services/content.service.d.ts.map +1 -0
- package/components/chat/services/content.service.ngfactory.d.ts.map +1 -0
- package/components/chat/services/message-board.service.d.ts +15 -0
- package/components/chat/services/message-board.service.d.ts.map +1 -0
- package/components/chat/services/message-board.service.ngfactory.d.ts.map +1 -0
- package/components/chat/services/status.service.d.ts +14 -0
- package/components/chat/services/status.service.d.ts.map +1 -0
- package/components/chat/services/status.service.ngfactory.d.ts.map +1 -0
- package/components/crud/crud-list/crud-list.component.d.ts +6 -0
- package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
- package/components/file-explorer/file-manager/file-manager.component.d.ts +6 -0
- package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
- package/components/file-explorer/models/service-request-model.d.ts +1 -0
- package/components/file-explorer/models/service-request-model.d.ts.map +1 -1
- package/components/statemachines/models/enums.d.ts +4 -0
- package/components/statemachines/models/enums.d.ts.map +1 -1
- package/components/statemachines/statemachines-designer/statemachines-designer.component.d.ts +1 -1
- package/components/statemachines/statemachines-designer/statemachines-designer.component.d.ts.map +1 -1
- package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts +1 -0
- package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
- package/components/tn-dialog/tn-dialog.component.d.ts +1 -0
- package/components/tn-dialog/tn-dialog.component.d.ts.map +1 -1
- package/components/user-picker/user-picker-dialog/user-picker-dialog.component.d.ts +23 -0
- package/components/user-picker/user-picker-dialog/user-picker-dialog.component.d.ts.map +1 -0
- package/components/user-picker/user-picker-dialog/user-picker-dialog.component.ngfactory.d.ts.map +1 -0
- package/components/user-picker/user-picker-dialog/user-picker-dialog.component.scss.shim.ngstyle.d.ts.map +1 -0
- package/components/workflow/permission-sharing/permission-sharing.component.d.ts +21 -0
- package/components/workflow/permission-sharing/permission-sharing.component.d.ts.map +1 -0
- package/components/workflow/permission-sharing/permission-sharing.component.ngfactory.d.ts.map +1 -0
- package/components/workflow/permission-sharing/permission-sharing.component.scss.shim.ngstyle.d.ts.map +1 -0
- package/components/workflow/services/workflow-permission.service.d.ts +10 -0
- package/components/workflow/services/workflow-permission.service.d.ts.map +1 -0
- package/components/workflow/services/workflow-permission.service.ngfactory.d.ts.map +1 -0
- package/components/workflow/workflow-history-new/workflow-history-new.component.d.ts.map +1 -1
- package/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.d.ts +6 -2
- package/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.d.ts.map +1 -1
- package/congviec/congviec/congviec-form/congviec-form.component.d.ts +9 -1
- package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
- package/esm2015/classes/base/data-form-base.js +3 -3
- package/esm2015/classes/base/data-list-base.js +41 -6
- package/esm2015/classes/form-schema.js +1 -1
- package/esm2015/components/chat/chat-box/chat-box.component.js +626 -0
- package/esm2015/components/chat/chat-send-message-box/chat-send-message-box.component.js +245 -0
- package/esm2015/components/chat/models/enums.js +13 -0
- package/esm2015/components/chat/models/models.js +12 -0
- package/esm2015/components/chat/services/chat.service.js +113 -0
- package/esm2015/components/chat/services/content.service.js +57 -0
- package/esm2015/components/chat/services/message-board.service.js +40 -0
- package/esm2015/components/chat/services/status.service.js +36 -0
- package/esm2015/components/crud/crud-list/crud-list.component.js +55 -4
- package/esm2015/components/file-explorer/file-manager/file-manager.component.js +69 -16
- package/esm2015/components/file-explorer/file-viewer/file-viewer.component.js +2 -2
- package/esm2015/components/file-explorer/models/service-request-model.js +5 -2
- package/esm2015/components/statemachines/models/enums.js +6 -1
- package/esm2015/components/tn-custom-scrollbar/tn-custom-scrollbar.component.js +26 -11
- package/esm2015/components/tn-dialog/tn-dialog.component.js +4 -2
- package/esm2015/components/user-picker/user-picker-dialog/user-picker-dialog.component.js +52 -0
- package/esm2015/components/workflow/permission-sharing/permission-sharing.component.js +123 -0
- package/esm2015/components/workflow/services/workflow-permission.service.js +27 -0
- package/esm2015/components/workflow/workflow-history-new/workflow-history-new.component.js +4 -1
- package/esm2015/congviec/cauhinh-workflow/cauhinh-workflow-detail/cauhinh-workflow-detail.component.js +2 -2
- package/esm2015/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.js +38 -14
- package/esm2015/congviec/congviec/congviec-form/congviec-form.component.js +25 -4
- package/esm2015/congviec/congviec/congviec.component.js +3 -3
- package/esm2015/models/basic-user-info.js +6 -1
- package/esm2015/public-api.js +4 -1
- package/esm2015/services/base.service.js +33 -9
- package/esm2015/services/common.service.js +3 -18
- package/esm2015/services/crud.service.js +56 -41
- package/esm2015/services/notifier.service.js +2 -2
- package/esm2015/services/user.service.js +37 -23
- package/esm2015/tnx-shared.js +49 -43
- package/esm2015/tnx-shared.module.js +10 -2
- package/fesm2015/tnx-shared.js +1705 -202
- package/fesm2015/tnx-shared.js.map +1 -1
- package/models/basic-user-info.d.ts +2 -3
- package/models/basic-user-info.d.ts.map +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +3 -0
- package/public-api.d.ts.map +1 -1
- package/services/base.service.d.ts +5 -1
- package/services/base.service.d.ts.map +1 -1
- package/services/common.service.d.ts +3 -3
- package/services/common.service.d.ts.map +1 -1
- package/services/crud.service.d.ts.map +1 -1
- package/services/notifier.service.d.ts +1 -1
- package/services/notifier.service.d.ts.map +1 -1
- package/services/user.service.d.ts +14 -2
- package/services/user.service.d.ts.map +1 -1
- package/tnx-shared.d.ts +48 -42
- package/tnx-shared.d.ts.map +1 -1
- package/tnx-shared.metadata.json +1 -1
- package/tnx-shared.module.d.ts +5 -1
- package/tnx-shared.module.d.ts.map +1 -1
- package/tnx-shared.module.ngfactory.d.ts.map +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core'), require('@angular/forms'), require('@ngx-translate/core'), require('angular-split'), require('ng2-currency-mask'), require('ngx-device-detector'), require('ngx-img-fallback'), require('ngx-mask'), require('ngx-perfect-scrollbar'), require('tn-custom-primeng/autocomplete'), require('tn-custom-primeng/blockui'), require('tn-custom-primeng/breadcrumb'), require('tn-custom-primeng/button'), require('tn-custom-primeng/calendar'), require('tn-custom-primeng/card'), require('tn-custom-primeng/chart'), require('tn-custom-primeng/checkbox'), require('tn-custom-primeng/chips'), require('tn-custom-primeng/colorpicker'), require('tn-custom-primeng/confirmdialog'), require('tn-custom-primeng/contextmenu'), require('tn-custom-primeng/dataview'), require('tn-custom-primeng/dialog'), require('tn-custom-primeng/dropdown'), require('tn-custom-primeng/fieldset'), require('tn-custom-primeng/fileupload'), require('tn-custom-primeng/focustrap'), require('tn-custom-primeng/inputmask'), require('tn-custom-primeng/inputswitch'), require('tn-custom-primeng/inputtext'), require('tn-custom-primeng/inputtextarea'), require('tn-custom-primeng/menu'), require('tn-custom-primeng/menubar'), require('tn-custom-primeng/multiselect'), require('tn-custom-primeng/overlaypanel'), require('tn-custom-primeng/paginator'), require('tn-custom-primeng/panel'), require('tn-custom-primeng/radiobutton'), require('tn-custom-primeng/scrollpanel'), require('tn-custom-primeng/selectbutton'), require('tn-custom-primeng/sidebar'), require('tn-custom-primeng/slider'), require('tn-custom-primeng/spinner'), require('tn-custom-primeng/splitbutton'), require('tn-custom-primeng/steps'), require('tn-custom-primeng/table'), require('tn-custom-primeng/tabview'), require('tn-custom-primeng/toast'), require('tn-custom-primeng/tooltip'), require('tn-custom-primeng/tree'), require('tn-custom-primeng/treetable'), require('tn-custom-primeng/tristatecheckbox'), require('@angular/router'), require('rxjs'), require('rxjs/operators'), require('fast-safe-stringify'), require('moment'), require('underscore'), require('angular-oauth2-oidc'), require('tn-custom-primeng/api'), require('@angular/common/http'), require('@aspnet/signalr'), require('file-saver'), require('print-js'), require('jwt-decode'), require('@angular/platform-browser'), require('jquery'), require('nanoid'), require('@angular/animations'), require('hammerjs'), require('ng2-signalr'), require('tn-custom-primeng/dom'), require('qrcode'), require('jsplumb'), require('rtf.js'), require('@angular/common/locales/vi'), require('@angular/platform-browser/animations')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define('tnx-shared', ['exports', '@angular/common', '@angular/core', '@angular/forms', '@ngx-translate/core', 'angular-split', 'ng2-currency-mask', 'ngx-device-detector', 'ngx-img-fallback', 'ngx-mask', 'ngx-perfect-scrollbar', 'tn-custom-primeng/autocomplete', 'tn-custom-primeng/blockui', 'tn-custom-primeng/breadcrumb', 'tn-custom-primeng/button', 'tn-custom-primeng/calendar', 'tn-custom-primeng/card', 'tn-custom-primeng/chart', 'tn-custom-primeng/checkbox', 'tn-custom-primeng/chips', 'tn-custom-primeng/colorpicker', 'tn-custom-primeng/confirmdialog', 'tn-custom-primeng/contextmenu', 'tn-custom-primeng/dataview', 'tn-custom-primeng/dialog', 'tn-custom-primeng/dropdown', 'tn-custom-primeng/fieldset', 'tn-custom-primeng/fileupload', 'tn-custom-primeng/focustrap', 'tn-custom-primeng/inputmask', 'tn-custom-primeng/inputswitch', 'tn-custom-primeng/inputtext', 'tn-custom-primeng/inputtextarea', 'tn-custom-primeng/menu', 'tn-custom-primeng/menubar', 'tn-custom-primeng/multiselect', 'tn-custom-primeng/overlaypanel', 'tn-custom-primeng/paginator', 'tn-custom-primeng/panel', 'tn-custom-primeng/radiobutton', 'tn-custom-primeng/scrollpanel', 'tn-custom-primeng/selectbutton', 'tn-custom-primeng/sidebar', 'tn-custom-primeng/slider', 'tn-custom-primeng/spinner', 'tn-custom-primeng/splitbutton', 'tn-custom-primeng/steps', 'tn-custom-primeng/table', 'tn-custom-primeng/tabview', 'tn-custom-primeng/toast', 'tn-custom-primeng/tooltip', 'tn-custom-primeng/tree', 'tn-custom-primeng/treetable', 'tn-custom-primeng/tristatecheckbox', '@angular/router', 'rxjs', 'rxjs/operators', 'fast-safe-stringify', 'moment', 'underscore', 'angular-oauth2-oidc', 'tn-custom-primeng/api', '@angular/common/http', '@aspnet/signalr', 'file-saver', 'print-js', 'jwt-decode', '@angular/platform-browser', 'jquery', 'nanoid', '@angular/animations', 'hammerjs', 'ng2-signalr', 'tn-custom-primeng/dom', 'qrcode', 'jsplumb', 'rtf.js', '@angular/common/locales/vi', '@angular/platform-browser/animations'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['tnx-shared'] = {}, global.ng.common, global.ng.core, global.ng.forms, global.i2, global.angularSplit, global.ng2CurrencyMask, global.ngxDeviceDetector, global.ngxImgFallback, global.ngxMask, global.ngxPerfectScrollbar, global.autocomplete, global.blockui, global.breadcrumb, global.button, global.calendar, global.card, global.chart, global.checkbox, global.chips, global.colorpicker, global.confirmdialog, global.contextmenu, global.dataview, global.dialog, global.dropdown, global.fieldset, global.fileupload, global.focustrap, global.inputmask, global.inputswitch, global.inputtext, global.inputtextarea, global.menu, global.menubar, global.multiselect, global.overlaypanel, global.paginator, global.panel, global.radiobutton, global.scrollpanel, global.selectbutton, global.sidebar, global.slider, global.spinner, global.splitbutton, global.steps, global.table, global.tabview, global.toast, global.tooltip, global.tree, global.treetable, global.tristatecheckbox, global.ng.router, global.rxjs, global.rxjs.operators, global.stringify, global.moment_, global._, global.i4, global.i1, global.ng.common.http, global.signalR, global.FileSaver, global.printJS_, global.JWT_, global.ng.platformBrowser, global.jQuery_, global.nanoid_, global.ng.animations, global.Hammer, global.ng2Signalr, global.dom, global.QRCode, global.jsplumb, global.rtf_js, global.ng.common.locales.vi, global.ng.platformBrowser.animations));
|
|
5
|
-
}(this, (function (exports, i2$1, i0, forms, i2, angularSplit, ng2CurrencyMask, ngxDeviceDetector, ngxImgFallback, ngxMask, ngxPerfectScrollbar, autocomplete, blockui, breadcrumb, button, calendar, card, chart, checkbox, chips, colorpicker, confirmdialog, contextmenu, dataview, dialog, dropdown, fieldset, fileupload, focustrap, inputmask, inputswitch, inputtext, inputtextarea, menu, menubar, multiselect, overlaypanel, paginator, panel, radiobutton, scrollpanel, selectbutton, sidebar, slider, spinner, splitbutton, steps, table, tabview, toast, tooltip, tree, treetable, tristatecheckbox, i3, rxjs, operators, stringify, moment_, _, i4, i1, i1$1, signalR, FileSaver, printJS_, JWT_, platformBrowser, jQuery_, nanoid_, animations, Hammer, ng2Signalr, dom, QRCode, jsplumb, rtf_js, localeVi, animations$1) { 'use strict';
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core'), require('@angular/forms'), require('@ngx-translate/core'), require('angular-split'), require('ng2-currency-mask'), require('ngx-device-detector'), require('ngx-img-fallback'), require('ngx-mask'), require('ngx-perfect-scrollbar'), require('tn-custom-primeng/autocomplete'), require('tn-custom-primeng/blockui'), require('tn-custom-primeng/breadcrumb'), require('tn-custom-primeng/button'), require('tn-custom-primeng/calendar'), require('tn-custom-primeng/card'), require('tn-custom-primeng/chart'), require('tn-custom-primeng/checkbox'), require('tn-custom-primeng/chips'), require('tn-custom-primeng/colorpicker'), require('tn-custom-primeng/confirmdialog'), require('tn-custom-primeng/contextmenu'), require('tn-custom-primeng/dataview'), require('tn-custom-primeng/dialog'), require('tn-custom-primeng/dropdown'), require('tn-custom-primeng/fieldset'), require('tn-custom-primeng/fileupload'), require('tn-custom-primeng/focustrap'), require('tn-custom-primeng/inputmask'), require('tn-custom-primeng/inputswitch'), require('tn-custom-primeng/inputtext'), require('tn-custom-primeng/inputtextarea'), require('tn-custom-primeng/menu'), require('tn-custom-primeng/menubar'), require('tn-custom-primeng/multiselect'), require('tn-custom-primeng/overlaypanel'), require('tn-custom-primeng/paginator'), require('tn-custom-primeng/panel'), require('tn-custom-primeng/radiobutton'), require('tn-custom-primeng/scrollpanel'), require('tn-custom-primeng/selectbutton'), require('tn-custom-primeng/sidebar'), require('tn-custom-primeng/slider'), require('tn-custom-primeng/spinner'), require('tn-custom-primeng/splitbutton'), require('tn-custom-primeng/steps'), require('tn-custom-primeng/table'), require('tn-custom-primeng/tabview'), require('tn-custom-primeng/toast'), require('tn-custom-primeng/tooltip'), require('tn-custom-primeng/tree'), require('tn-custom-primeng/treetable'), require('tn-custom-primeng/tristatecheckbox'), require('@angular/router'), require('rxjs'), require('rxjs/operators'), require('uuid'), require('fast-safe-stringify'), require('moment'), require('underscore'), require('angular-oauth2-oidc'), require('tn-custom-primeng/api'), require('@angular/common/http'), require('@aspnet/signalr'), require('file-saver'), require('print-js'), require('jwt-decode'), require('@angular/platform-browser'), require('jquery'), require('nanoid'), require('@angular/animations'), require('hammerjs'), require('ng2-signalr'), require('tn-custom-primeng/dom'), require('qrcode'), require('jsplumb'), require('rtf.js'), require('@angular/common/locales/vi'), require('@angular/platform-browser/animations')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define('tnx-shared', ['exports', '@angular/common', '@angular/core', '@angular/forms', '@ngx-translate/core', 'angular-split', 'ng2-currency-mask', 'ngx-device-detector', 'ngx-img-fallback', 'ngx-mask', 'ngx-perfect-scrollbar', 'tn-custom-primeng/autocomplete', 'tn-custom-primeng/blockui', 'tn-custom-primeng/breadcrumb', 'tn-custom-primeng/button', 'tn-custom-primeng/calendar', 'tn-custom-primeng/card', 'tn-custom-primeng/chart', 'tn-custom-primeng/checkbox', 'tn-custom-primeng/chips', 'tn-custom-primeng/colorpicker', 'tn-custom-primeng/confirmdialog', 'tn-custom-primeng/contextmenu', 'tn-custom-primeng/dataview', 'tn-custom-primeng/dialog', 'tn-custom-primeng/dropdown', 'tn-custom-primeng/fieldset', 'tn-custom-primeng/fileupload', 'tn-custom-primeng/focustrap', 'tn-custom-primeng/inputmask', 'tn-custom-primeng/inputswitch', 'tn-custom-primeng/inputtext', 'tn-custom-primeng/inputtextarea', 'tn-custom-primeng/menu', 'tn-custom-primeng/menubar', 'tn-custom-primeng/multiselect', 'tn-custom-primeng/overlaypanel', 'tn-custom-primeng/paginator', 'tn-custom-primeng/panel', 'tn-custom-primeng/radiobutton', 'tn-custom-primeng/scrollpanel', 'tn-custom-primeng/selectbutton', 'tn-custom-primeng/sidebar', 'tn-custom-primeng/slider', 'tn-custom-primeng/spinner', 'tn-custom-primeng/splitbutton', 'tn-custom-primeng/steps', 'tn-custom-primeng/table', 'tn-custom-primeng/tabview', 'tn-custom-primeng/toast', 'tn-custom-primeng/tooltip', 'tn-custom-primeng/tree', 'tn-custom-primeng/treetable', 'tn-custom-primeng/tristatecheckbox', '@angular/router', 'rxjs', 'rxjs/operators', 'uuid', 'fast-safe-stringify', 'moment', 'underscore', 'angular-oauth2-oidc', 'tn-custom-primeng/api', '@angular/common/http', '@aspnet/signalr', 'file-saver', 'print-js', 'jwt-decode', '@angular/platform-browser', 'jquery', 'nanoid', '@angular/animations', 'hammerjs', 'ng2-signalr', 'tn-custom-primeng/dom', 'qrcode', 'jsplumb', 'rtf.js', '@angular/common/locales/vi', '@angular/platform-browser/animations'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['tnx-shared'] = {}, global.ng.common, global.ng.core, global.ng.forms, global.i2, global.angularSplit, global.ng2CurrencyMask, global.ngxDeviceDetector, global.ngxImgFallback, global.ngxMask, global.ngxPerfectScrollbar, global.autocomplete, global.blockui, global.breadcrumb, global.button, global.calendar, global.card, global.chart, global.checkbox, global.chips, global.colorpicker, global.confirmdialog, global.contextmenu, global.dataview, global.dialog, global.dropdown, global.fieldset, global.fileupload, global.focustrap, global.inputmask, global.inputswitch, global.inputtext, global.inputtextarea, global.menu, global.menubar, global.multiselect, global.overlaypanel, global.paginator, global.panel, global.radiobutton, global.scrollpanel, global.selectbutton, global.sidebar, global.slider, global.spinner, global.splitbutton, global.steps, global.table, global.tabview, global.toast, global.tooltip, global.tree, global.treetable, global.tristatecheckbox, global.ng.router, global.rxjs, global.rxjs.operators, global.uuid, global.stringify, global.moment_, global._, global.i4, global.i1, global.ng.common.http, global.signalR, global.FileSaver, global.printJS_, global.JWT_, global.ng.platformBrowser, global.jQuery_, global.nanoid_, global.ng.animations, global.Hammer, global.ng2Signalr, global.dom, global.QRCode, global.jsplumb, global.rtf_js, global.ng.common.locales.vi, global.ng.platformBrowser.animations));
|
|
5
|
+
}(this, (function (exports, i2$1, i0, forms, i2, angularSplit, ng2CurrencyMask, ngxDeviceDetector, ngxImgFallback, ngxMask, ngxPerfectScrollbar, autocomplete, blockui, breadcrumb, button, calendar, card, chart, checkbox, chips, colorpicker, confirmdialog, contextmenu, dataview, dialog, dropdown, fieldset, fileupload, focustrap, inputmask, inputswitch, inputtext, inputtextarea, menu, menubar, multiselect, overlaypanel, paginator, panel, radiobutton, scrollpanel, selectbutton, sidebar, slider, spinner, splitbutton, steps, table, tabview, toast, tooltip, tree, treetable, tristatecheckbox, i3, rxjs, operators, uuid, stringify, moment_, _, i4, i1, i1$1, signalR, FileSaver, printJS_, JWT_, platformBrowser, jQuery_, nanoid_, animations, Hammer, ng2Signalr, dom, QRCode, jsplumb, rtf_js, localeVi, animations$1) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
8
|
|
|
@@ -904,7 +904,7 @@
|
|
|
904
904
|
life: life
|
|
905
905
|
});
|
|
906
906
|
};
|
|
907
|
-
NotifierService.prototype.
|
|
907
|
+
NotifierService.prototype.showWarningByResponse = function (res) {
|
|
908
908
|
var message = res.message;
|
|
909
909
|
if (!message)
|
|
910
910
|
message = res.error;
|
|
@@ -1212,23 +1212,7 @@
|
|
|
1212
1212
|
this.STORAGE_KEY = 'CLIPBOARD_CONTENT';
|
|
1213
1213
|
}
|
|
1214
1214
|
CommonService.prototype.guid = function () {
|
|
1215
|
-
|
|
1216
|
-
return Math.floor((1 + Math.random()) * 0x10000)
|
|
1217
|
-
.toString(16)
|
|
1218
|
-
.substring(1);
|
|
1219
|
-
}
|
|
1220
|
-
return (s4() +
|
|
1221
|
-
s4() +
|
|
1222
|
-
'-' +
|
|
1223
|
-
s4() +
|
|
1224
|
-
'-' +
|
|
1225
|
-
s4() +
|
|
1226
|
-
'-' +
|
|
1227
|
-
s4() +
|
|
1228
|
-
'-' +
|
|
1229
|
-
s4() +
|
|
1230
|
-
s4() +
|
|
1231
|
-
s4());
|
|
1215
|
+
return uuid.v4();
|
|
1232
1216
|
};
|
|
1233
1217
|
CommonService.prototype.randomString = function () {
|
|
1234
1218
|
return this.guid();
|
|
@@ -5491,16 +5475,16 @@
|
|
|
5491
5475
|
return Math.ceil(milisecond / 3600000) + ' giờ trước';
|
|
5492
5476
|
}
|
|
5493
5477
|
else {
|
|
5494
|
-
return ('Hôm qua lúc '
|
|
5495
|
-
this.datePipe.transform(datetime, 'HH:mm'));
|
|
5478
|
+
return ('Hôm qua lúc '
|
|
5479
|
+
+ this.datePipe.transform(datetime, 'HH:mm'));
|
|
5496
5480
|
}
|
|
5497
5481
|
}
|
|
5498
5482
|
if (milisecond >= 86400000) {
|
|
5499
|
-
if (datetime.getDate() == now.getDate() - 1
|
|
5500
|
-
datetime.getMonth() == now.getMonth()
|
|
5501
|
-
datetime.getYear() == now.getYear()) {
|
|
5502
|
-
return ('Hôm qua lúc '
|
|
5503
|
-
this.datePipe.transform(datetime, 'HH:mm'));
|
|
5483
|
+
if (datetime.getDate() == now.getDate() - 1
|
|
5484
|
+
&& datetime.getMonth() == now.getMonth()
|
|
5485
|
+
&& datetime.getYear() == now.getYear()) {
|
|
5486
|
+
return ('Hôm qua lúc '
|
|
5487
|
+
+ this.datePipe.transform(datetime, 'HH:mm'));
|
|
5504
5488
|
}
|
|
5505
5489
|
else {
|
|
5506
5490
|
return this.datePipe.transform(datetime, 'dd/MM/yyyy HH:mm');
|
|
@@ -5535,25 +5519,25 @@
|
|
|
5535
5519
|
return Math.ceil(milisecond / 3600000) + ' giờ nữa';
|
|
5536
5520
|
}
|
|
5537
5521
|
else {
|
|
5538
|
-
return ('Ngày mai lúc '
|
|
5539
|
-
this.datePipe.transform(datetime, 'HH:mm'));
|
|
5522
|
+
return ('Ngày mai lúc '
|
|
5523
|
+
+ this.datePipe.transform(datetime, 'HH:mm'));
|
|
5540
5524
|
}
|
|
5541
5525
|
}
|
|
5542
5526
|
if (milisecond >= 86400000) {
|
|
5543
|
-
if (datetime.getDate() == now.getDate() - 1
|
|
5544
|
-
datetime.getMonth() == now.getMonth()
|
|
5545
|
-
datetime.getYear() == now.getYear()) {
|
|
5546
|
-
return ('Ngày mai lúc '
|
|
5547
|
-
this.datePipe.transform(datetime, 'HH:mm'));
|
|
5548
|
-
}
|
|
5549
|
-
if (datetime.getDate() == now.getDate() - 2
|
|
5550
|
-
datetime.getMonth() == now.getMonth()
|
|
5551
|
-
datetime.getYear() == now.getYear()) {
|
|
5527
|
+
if (datetime.getDate() == now.getDate() - 1
|
|
5528
|
+
&& datetime.getMonth() == now.getMonth()
|
|
5529
|
+
&& datetime.getYear() == now.getYear()) {
|
|
5530
|
+
return ('Ngày mai lúc '
|
|
5531
|
+
+ this.datePipe.transform(datetime, 'HH:mm'));
|
|
5532
|
+
}
|
|
5533
|
+
if (datetime.getDate() == now.getDate() - 2
|
|
5534
|
+
&& datetime.getMonth() == now.getMonth()
|
|
5535
|
+
&& datetime.getYear() == now.getYear()) {
|
|
5552
5536
|
return 'Hai ngày nữa';
|
|
5553
5537
|
}
|
|
5554
|
-
else if (datetime.getDate() == now.getDate() - 3
|
|
5555
|
-
datetime.getMonth() == now.getMonth()
|
|
5556
|
-
datetime.getYear() == now.getYear()) {
|
|
5538
|
+
else if (datetime.getDate() == now.getDate() - 3
|
|
5539
|
+
&& datetime.getMonth() == now.getMonth()
|
|
5540
|
+
&& datetime.getYear() == now.getYear()) {
|
|
5557
5541
|
return 'Ba ngày nữa';
|
|
5558
5542
|
}
|
|
5559
5543
|
else {
|
|
@@ -5574,8 +5558,8 @@
|
|
|
5574
5558
|
return this.datePipe.transform(datetime, 'dd/MM/yyyy');
|
|
5575
5559
|
}
|
|
5576
5560
|
var now = new Date();
|
|
5577
|
-
if (datetime.getMonth() == now.getMonth()
|
|
5578
|
-
datetime.getYear() == now.getYear()) {
|
|
5561
|
+
if (datetime.getMonth() == now.getMonth()
|
|
5562
|
+
&& datetime.getYear() == now.getYear()) {
|
|
5579
5563
|
var days = datetime.getDate() - now.getDate();
|
|
5580
5564
|
if (days == 0) {
|
|
5581
5565
|
return 'Hôm nay';
|
|
@@ -5606,7 +5590,8 @@
|
|
|
5606
5590
|
return this.datePipe.transform(datetime, 'dd/MM/yyyy');
|
|
5607
5591
|
}
|
|
5608
5592
|
};
|
|
5609
|
-
CrudService.prototype.hideControlAndLabel = function () {
|
|
5593
|
+
CrudService.prototype.hideControlAndLabel = function () {
|
|
5594
|
+
};
|
|
5610
5595
|
CrudService.prototype.buildFilter = function (field, operator, value) {
|
|
5611
5596
|
return new Filter({ field: field, operator: operator, value: value });
|
|
5612
5597
|
};
|
|
@@ -5713,7 +5698,8 @@
|
|
|
5713
5698
|
_this.createDropdownOptions(schema));
|
|
5714
5699
|
}
|
|
5715
5700
|
promise.then(function (res) {
|
|
5716
|
-
var funcSetValueRow = function (rowItem, data) {
|
|
5701
|
+
var funcSetValueRow = function (rowItem, data) {
|
|
5702
|
+
};
|
|
5717
5703
|
if (schema.funcSetValueRow) {
|
|
5718
5704
|
funcSetValueRow = schema.funcSetValueRow;
|
|
5719
5705
|
}
|
|
@@ -6040,19 +6026,24 @@
|
|
|
6040
6026
|
this._injector.get(NotifierService).showWarning('Có lỗi xảy ra. Liên hệ quản trị viên để biết thêm chi tiết.');
|
|
6041
6027
|
}
|
|
6042
6028
|
else {
|
|
6043
|
-
if (res.message != null && res.message != '')
|
|
6029
|
+
if (res.message != null && res.message != '') {
|
|
6044
6030
|
this._injector.get(NotifierService).showWarning(res.message);
|
|
6045
|
-
|
|
6031
|
+
}
|
|
6032
|
+
else {
|
|
6046
6033
|
this._injector.get(NotifierService).showWarning(res.error);
|
|
6034
|
+
}
|
|
6047
6035
|
}
|
|
6048
|
-
if (callBackError)
|
|
6036
|
+
if (callBackError) {
|
|
6049
6037
|
callBackError(res);
|
|
6038
|
+
}
|
|
6050
6039
|
return;
|
|
6051
6040
|
}
|
|
6052
|
-
if (message)
|
|
6041
|
+
if (message) {
|
|
6053
6042
|
this._injector.get(NotifierService).showSuccess(message);
|
|
6054
|
-
|
|
6043
|
+
}
|
|
6044
|
+
if (callBack) {
|
|
6055
6045
|
callBack(res);
|
|
6046
|
+
}
|
|
6056
6047
|
};
|
|
6057
6048
|
CrudService.prototype.handleReponsePromise = function (res, messageSuccess) {
|
|
6058
6049
|
var _this = this;
|
|
@@ -6103,14 +6094,16 @@
|
|
|
6103
6094
|
};
|
|
6104
6095
|
if (model.hasOwnProperty(sourceField)) {
|
|
6105
6096
|
valueFilter = model[sourceField];
|
|
6106
|
-
if (canAccessSubField(valueFilter))
|
|
6097
|
+
if (canAccessSubField(valueFilter)) {
|
|
6107
6098
|
valueFilter = valueFilter[subField];
|
|
6099
|
+
}
|
|
6108
6100
|
}
|
|
6109
6101
|
else if (rootModel) {
|
|
6110
6102
|
if (rootModel.hasOwnProperty(sourceField)) {
|
|
6111
6103
|
valueFilter = rootModel[sourceField];
|
|
6112
|
-
if (canAccessSubField(valueFilter))
|
|
6104
|
+
if (canAccessSubField(valueFilter)) {
|
|
6113
6105
|
valueFilter = valueFilter[subField];
|
|
6106
|
+
}
|
|
6114
6107
|
}
|
|
6115
6108
|
else {
|
|
6116
6109
|
var fields = sourceField.split('.');
|
|
@@ -6134,25 +6127,30 @@
|
|
|
6134
6127
|
}
|
|
6135
6128
|
finally { if (e_1) throw e_1.error; }
|
|
6136
6129
|
}
|
|
6137
|
-
if (canAccessSubField(temp))
|
|
6130
|
+
if (canAccessSubField(temp)) {
|
|
6138
6131
|
valueFilter = temp[subField];
|
|
6132
|
+
}
|
|
6139
6133
|
}
|
|
6140
6134
|
}
|
|
6141
|
-
if (filter.logic == null && (valueFilter == null || valueFilter === '' || valueFilter.length == 0))
|
|
6135
|
+
if (filter.logic == null && (valueFilter == null || valueFilter === '' || valueFilter.length == 0)) {
|
|
6142
6136
|
return;
|
|
6137
|
+
}
|
|
6143
6138
|
var tmpFilter = new Filter(filter);
|
|
6144
6139
|
delete tmpFilter.sourceField;
|
|
6145
|
-
if (tmpFilter.funcGetValue)
|
|
6140
|
+
if (tmpFilter.funcGetValue) {
|
|
6146
6141
|
valueFilter = tmpFilter.funcGetValue(valueFilter);
|
|
6142
|
+
}
|
|
6147
6143
|
tmpFilter.value = JSON.stringify(valueFilter);
|
|
6148
6144
|
tmpFilter.filters = [];
|
|
6149
6145
|
if (filter.logic && filter.filters) {
|
|
6150
6146
|
filter.filters.forEach(function (f) { return _this.deQuyReplaceValue(tmpFilter.filters, f, model, rootModel); });
|
|
6151
|
-
if (tmpFilter.filters.length > 0)
|
|
6147
|
+
if (tmpFilter.filters.length > 0) {
|
|
6152
6148
|
filters.push(tmpFilter);
|
|
6149
|
+
}
|
|
6153
6150
|
}
|
|
6154
|
-
else
|
|
6151
|
+
else {
|
|
6155
6152
|
filters.push(tmpFilter);
|
|
6153
|
+
}
|
|
6156
6154
|
};
|
|
6157
6155
|
CrudService.prototype.getWorkflowCoreStatusText = function (workflowCoreStatusValue) {
|
|
6158
6156
|
var item = DataSourceWorkflowCoreStatus.find(function (x) { return x.id == workflowCoreStatusValue; });
|
|
@@ -6298,7 +6296,8 @@
|
|
|
6298
6296
|
if (schema.funcGetLabel) {
|
|
6299
6297
|
funcGetLabel = schema.funcGetLabel;
|
|
6300
6298
|
}
|
|
6301
|
-
var funcSetValueRow = function (rowItem, data) {
|
|
6299
|
+
var funcSetValueRow = function (rowItem, data) {
|
|
6300
|
+
};
|
|
6302
6301
|
var funcGetRefDataRow = function (refItems) {
|
|
6303
6302
|
return refItems.map(function (item) { return funcGetLabel(item); }).join(schema.separator + " ");
|
|
6304
6303
|
};
|
|
@@ -6455,14 +6454,17 @@
|
|
|
6455
6454
|
}
|
|
6456
6455
|
}
|
|
6457
6456
|
});
|
|
6458
|
-
if (apiUrl.indexOf('?') == -1)
|
|
6457
|
+
if (apiUrl.indexOf('?') == -1) {
|
|
6459
6458
|
apiUrl += "?";
|
|
6460
|
-
|
|
6459
|
+
}
|
|
6460
|
+
else {
|
|
6461
6461
|
apiUrl += "&";
|
|
6462
|
+
}
|
|
6462
6463
|
apiUrl += "_keySignalr=" + topic;
|
|
6463
6464
|
_this._http.get(apiUrl)
|
|
6464
6465
|
.pipe(operators.shareReplay(_this.REPLAY_COUNT), operators.retry(_this.RETRY_COUNT), operators.catchError(function (err) { return _this.handleError(err, _this._injector); })).toPromise()
|
|
6465
|
-
.then(function (res) {
|
|
6466
|
+
.then(function (res) {
|
|
6467
|
+
})
|
|
6466
6468
|
.catch(function (err) {
|
|
6467
6469
|
_this.unSubscribeSignalR(topic);
|
|
6468
6470
|
reject(err);
|
|
@@ -6484,14 +6486,17 @@
|
|
|
6484
6486
|
}
|
|
6485
6487
|
}
|
|
6486
6488
|
});
|
|
6487
|
-
if (apiUrl.indexOf('?') == -1)
|
|
6489
|
+
if (apiUrl.indexOf('?') == -1) {
|
|
6488
6490
|
apiUrl += "?";
|
|
6489
|
-
|
|
6491
|
+
}
|
|
6492
|
+
else {
|
|
6490
6493
|
apiUrl += "&";
|
|
6494
|
+
}
|
|
6491
6495
|
apiUrl += "_keySignalr=" + topic;
|
|
6492
6496
|
_this._http.post(apiUrl, data)
|
|
6493
6497
|
.pipe(operators.shareReplay(_this.REPLAY_COUNT), operators.retry(_this.RETRY_COUNT), operators.catchError(function (err) { return _this.handleError(err, _this._injector); })).toPromise()
|
|
6494
|
-
.then(function (res) {
|
|
6498
|
+
.then(function (res) {
|
|
6499
|
+
})
|
|
6495
6500
|
.catch(function (err) {
|
|
6496
6501
|
_this.unSubscribeSignalR(topic);
|
|
6497
6502
|
reject(err);
|
|
@@ -6769,8 +6774,13 @@
|
|
|
6769
6774
|
var url = this.serviceUri + "/" + id;
|
|
6770
6775
|
return this.defaultGet(url);
|
|
6771
6776
|
};
|
|
6772
|
-
BaseService.prototype.getDetailWithPermission = function (id) {
|
|
6773
|
-
|
|
6777
|
+
BaseService.prototype.getDetailWithPermission = function (id, pid) {
|
|
6778
|
+
if (pid === void 0) { pid = null; }
|
|
6779
|
+
var url = this.serviceUri + "/DetailWithPermission/" + id + "?pid=" + pid;
|
|
6780
|
+
return this.defaultGet(url);
|
|
6781
|
+
};
|
|
6782
|
+
BaseService.prototype.getDetailByPid = function (pid) {
|
|
6783
|
+
var url = this.serviceUri + "/DetailWithByPid/" + pid;
|
|
6774
6784
|
return this.defaultGet(url);
|
|
6775
6785
|
};
|
|
6776
6786
|
BaseService.prototype.getByInstanceId = function (instanceId) {
|
|
@@ -6830,6 +6840,11 @@
|
|
|
6830
6840
|
var url = this.serviceUri + "/" + id;
|
|
6831
6841
|
return this._http.delete(url).toPromise();
|
|
6832
6842
|
};
|
|
6843
|
+
BaseService.prototype.deleteById = function (id) {
|
|
6844
|
+
var _this = this;
|
|
6845
|
+
var url = this.serviceUri + "/" + id;
|
|
6846
|
+
return this._http.delete(url).pipe(operators.catchError(function (err) { return _this.handleError(err, _this._injector); })).toPromise();
|
|
6847
|
+
};
|
|
6833
6848
|
BaseService.prototype.deleteMany = function (lstId) {
|
|
6834
6849
|
var url = this.serviceUri + "/DeleteManyAsync/" + lstId;
|
|
6835
6850
|
return this._http.delete(url).toPromise();
|
|
@@ -7035,6 +7050,16 @@
|
|
|
7035
7050
|
BaseService.prototype.choYKien = function (itemWorkflowHistory) {
|
|
7036
7051
|
return this.defaultPost(this.serviceUri + "/ChoYKienBase", itemWorkflowHistory);
|
|
7037
7052
|
};
|
|
7053
|
+
BaseService.prototype.getSharedKey = function (ids) {
|
|
7054
|
+
return this.defaultPost(this.serviceUri + "/GetSharedKeyItemBase", {
|
|
7055
|
+
listGuidValue: ids
|
|
7056
|
+
});
|
|
7057
|
+
};
|
|
7058
|
+
BaseService.prototype.deleteLinkSharing = function (ids) {
|
|
7059
|
+
return this.defaultPost(this.serviceUri + "/DeleteLinkSharing", {
|
|
7060
|
+
listGuidValue: ids
|
|
7061
|
+
});
|
|
7062
|
+
};
|
|
7038
7063
|
BaseService.prototype.rollback = function (rowData, lstObjectName) {
|
|
7039
7064
|
return this.defaultPost(this.serviceUri + "/RollbackBase/" + rowData.__workflowCode + "/" + rowData.id, {
|
|
7040
7065
|
ListStringValue: lstObjectName
|
|
@@ -9178,6 +9203,12 @@
|
|
|
9178
9203
|
});
|
|
9179
9204
|
}
|
|
9180
9205
|
};
|
|
9206
|
+
/**
|
|
9207
|
+
* Hàm dùng để lấy thông tin cơ bản nhiều người dùng dựa vào userName,
|
|
9208
|
+
* hiện tại chưa có thông tin về đơn vị và chức vụ người dùng để giảm load và vì chưa dùng đến
|
|
9209
|
+
* @param {string} userName
|
|
9210
|
+
* @return {Promise<BasicUserInfo[]>
|
|
9211
|
+
*/
|
|
9181
9212
|
UserService.prototype.getBasicUserInfoByUserName = function (userName) {
|
|
9182
9213
|
var _this = this;
|
|
9183
9214
|
var storageItem = localStorage.getItem(this.USER_INFO_KEY + '_' + userName);
|
|
@@ -9212,24 +9243,37 @@
|
|
|
9212
9243
|
}); });
|
|
9213
9244
|
}
|
|
9214
9245
|
};
|
|
9215
|
-
|
|
9216
|
-
|
|
9217
|
-
|
|
9218
|
-
|
|
9219
|
-
|
|
9220
|
-
|
|
9221
|
-
|
|
9222
|
-
|
|
9223
|
-
|
|
9224
|
-
|
|
9225
|
-
|
|
9226
|
-
|
|
9227
|
-
|
|
9228
|
-
|
|
9229
|
-
|
|
9230
|
-
|
|
9246
|
+
/**
|
|
9247
|
+
* Hàm dùng để lấy thông tin cơ bản nhiều người dùng dựa vào userName,
|
|
9248
|
+
* hiện tại chưa có thông tin về đơn vị và chức vụ người dùng để giảm load và vì chưa dùng đến
|
|
9249
|
+
* @param {string} userNames
|
|
9250
|
+
* @return {Promise<BasicUserInfo[]>
|
|
9251
|
+
*/
|
|
9252
|
+
UserService.prototype.getBasicUsersInfoByUserNames = function (userNames) {
|
|
9253
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
9254
|
+
var storageItem, userInfos, check, svUrl;
|
|
9255
|
+
var _this = this;
|
|
9256
|
+
return __generator(this, function (_b) {
|
|
9257
|
+
switch (_b.label) {
|
|
9258
|
+
case 0:
|
|
9259
|
+
storageItem = localStorage.getItem(this.USER_INFO_KEY);
|
|
9260
|
+
userInfos = JSON.parse(storageItem);
|
|
9261
|
+
check = userInfos ? userNames.indexOf(userInfos['userName']) > -1 : null;
|
|
9262
|
+
if (!check) return [3 /*break*/, 1];
|
|
9263
|
+
return [2 /*return*/, userInfos];
|
|
9264
|
+
case 1:
|
|
9265
|
+
svUrl = this.serviceUri + "/GetBasicUsersInfoByUserNames?userNames=" + userNames;
|
|
9266
|
+
return [4 /*yield*/, this._http.get(svUrl).pipe(operators.shareReplay(this.REPLAY_COUNT), operators.retry(this.RETRY_COUNT), operators.catchError(function (err) { return _this.handleError(err, _this._injector); }), operators.map(function (repsonse) {
|
|
9267
|
+
localStorage.setItem(_this.USER_INFO_KEY + '_' + repsonse.data.map(function (x) {
|
|
9268
|
+
if (x.userName)
|
|
9269
|
+
return x.userName;
|
|
9270
|
+
}), JSON.stringify(repsonse.data));
|
|
9271
|
+
return repsonse.data;
|
|
9272
|
+
})).toPromise().catch(function (err) { return []; })];
|
|
9273
|
+
case 2: return [2 /*return*/, _b.sent()];
|
|
9274
|
+
}
|
|
9231
9275
|
});
|
|
9232
|
-
}
|
|
9276
|
+
});
|
|
9233
9277
|
};
|
|
9234
9278
|
UserService.prototype.convertListUserIdToString = function (userIds) {
|
|
9235
9279
|
if (userIds.length > 0) {
|
|
@@ -9237,14 +9281,14 @@
|
|
|
9237
9281
|
}
|
|
9238
9282
|
return ',';
|
|
9239
9283
|
};
|
|
9240
|
-
UserService.prototype.fillBasicUserInfo = function (dataSource, propertyName
|
|
9284
|
+
UserService.prototype.fillBasicUserInfo = function (dataSource, propertyName) {
|
|
9241
9285
|
dataSource.forEach(function (item) {
|
|
9242
9286
|
var userId = item[propertyName].id ? item[propertyName].id : item[propertyName];
|
|
9243
9287
|
// tslint:disable-next-line:no-shadowed-variable
|
|
9244
|
-
|
|
9245
|
-
if (user) {
|
|
9246
|
-
|
|
9247
|
-
}
|
|
9288
|
+
// const user = users.find(user => user.id === userId);
|
|
9289
|
+
// if (user) {
|
|
9290
|
+
// item[propertyName] = user;
|
|
9291
|
+
// }
|
|
9248
9292
|
});
|
|
9249
9293
|
return dataSource;
|
|
9250
9294
|
};
|
|
@@ -10958,6 +11002,8 @@
|
|
|
10958
11002
|
}
|
|
10959
11003
|
this.checkAllowTrinhKy = this.checkAllowTrinhKy.bind(this);
|
|
10960
11004
|
this.setting.checkAllowTrinhKy = this.checkAllowTrinhKy;
|
|
11005
|
+
this.setting.getItemState = this.getItemState;
|
|
11006
|
+
this.getItemState = this.getItemState.bind(this);
|
|
10961
11007
|
this.getMenuButtons = this.getMenuButtons.bind(this);
|
|
10962
11008
|
this.loadItemFromQueryParam();
|
|
10963
11009
|
};
|
|
@@ -10965,9 +11011,11 @@
|
|
|
10965
11011
|
var _this = this;
|
|
10966
11012
|
if (this.loadDetailFromQueryParam === undefined || this.loadDetailFromQueryParam === true) {
|
|
10967
11013
|
var idInQueryString = null;
|
|
11014
|
+
var pid = null; // permission Id được người khác share
|
|
10968
11015
|
if (this._activatedRoute.snapshot
|
|
10969
11016
|
&& this._activatedRoute.snapshot.queryParams) {
|
|
10970
11017
|
idInQueryString = this._activatedRoute.snapshot.queryParams.id;
|
|
11018
|
+
pid = this._activatedRoute.snapshot.queryParams.pid;
|
|
10971
11019
|
}
|
|
10972
11020
|
if (idInQueryString) {
|
|
10973
11021
|
// get detail data
|
|
@@ -10988,8 +11036,31 @@
|
|
|
10988
11036
|
_this._notifierService.showWarning('Không tìm thấy bản ghi cần xem chi tiết');
|
|
10989
11037
|
});
|
|
10990
11038
|
}
|
|
11039
|
+
else if (pid) {
|
|
11040
|
+
this.loadDetailPid(pid);
|
|
11041
|
+
}
|
|
10991
11042
|
}
|
|
10992
11043
|
};
|
|
11044
|
+
DataListBase.prototype.loadDetailPid = function (pid) {
|
|
11045
|
+
var _this = this;
|
|
11046
|
+
this.setting.baseService.getDetailByPid(pid)
|
|
11047
|
+
.then(function (res) { return _this.handleResponse(res, '', function (f) {
|
|
11048
|
+
if (!res.data) {
|
|
11049
|
+
_this._notifierService.showWarning('Không tìm thấy bản ghi cần xem chi tiết');
|
|
11050
|
+
}
|
|
11051
|
+
if ((res.data.basePermission & exports.PermissionBase.EDIT) == exports.PermissionBase.EDIT
|
|
11052
|
+
|| (res.data.basePermission & exports.PermissionBase.READ) == exports.PermissionBase.READ) {
|
|
11053
|
+
res.data.pid = pid;
|
|
11054
|
+
_this._edit(res.data);
|
|
11055
|
+
}
|
|
11056
|
+
else {
|
|
11057
|
+
_this._notifierService.showWarning('Bạn không có quyền xem bản ghi');
|
|
11058
|
+
}
|
|
11059
|
+
}); }).catch(function (err) {
|
|
11060
|
+
console.error('error on get detail from querystring', err);
|
|
11061
|
+
_this._notifierService.showWarning('Không tìm thấy bản ghi cần xem chi tiết');
|
|
11062
|
+
});
|
|
11063
|
+
};
|
|
10993
11064
|
DataListBase.prototype.ngAfterViewInit = function () {
|
|
10994
11065
|
this.handleAfterViewInit();
|
|
10995
11066
|
};
|
|
@@ -11220,6 +11291,18 @@
|
|
|
11220
11291
|
this.crudList.buildFilterColumn([colForAdmin]);
|
|
11221
11292
|
}
|
|
11222
11293
|
};
|
|
11294
|
+
DataListBase.prototype.getItemState = function (lstRowData) {
|
|
11295
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
11296
|
+
var result;
|
|
11297
|
+
return __generator(this, function (_a) {
|
|
11298
|
+
result = {};
|
|
11299
|
+
lstRowData.forEach(function (item) {
|
|
11300
|
+
result[item.id] = {};
|
|
11301
|
+
});
|
|
11302
|
+
return [2 /*return*/, result];
|
|
11303
|
+
});
|
|
11304
|
+
});
|
|
11305
|
+
};
|
|
11223
11306
|
DataListBase.prototype.checkAllowTrinhKy = function (rowData) {
|
|
11224
11307
|
return __awaiter(this, void 0, void 0, function () {
|
|
11225
11308
|
return __generator(this, function (_a) {
|
|
@@ -11453,6 +11536,7 @@
|
|
|
11453
11536
|
};
|
|
11454
11537
|
DataListBase.prototype.cloneData = function (rowData) {
|
|
11455
11538
|
return {
|
|
11539
|
+
pid: rowData.pid,
|
|
11456
11540
|
id: rowData[this.setting.entityKey]
|
|
11457
11541
|
};
|
|
11458
11542
|
};
|
|
@@ -11481,7 +11565,7 @@
|
|
|
11481
11565
|
_this._notifierService.showDeleteDataSuccess();
|
|
11482
11566
|
}
|
|
11483
11567
|
else {
|
|
11484
|
-
_this._notifierService.
|
|
11568
|
+
_this._notifierService.showWarningByResponse(response);
|
|
11485
11569
|
}
|
|
11486
11570
|
}, function (error) {
|
|
11487
11571
|
_this._notifierService.showDeleteDataError();
|
|
@@ -11506,7 +11590,7 @@
|
|
|
11506
11590
|
_this._notifierService.showDeleteDataSuccess();
|
|
11507
11591
|
}
|
|
11508
11592
|
else {
|
|
11509
|
-
_this._notifierService.
|
|
11593
|
+
_this._notifierService.showWarningByResponse(response);
|
|
11510
11594
|
}
|
|
11511
11595
|
});
|
|
11512
11596
|
}
|
|
@@ -11765,7 +11849,7 @@
|
|
|
11765
11849
|
return [4 /*yield*/, this._workflowPermissionDetailService.getAll([
|
|
11766
11850
|
this.newFilter('itemId', exports.Operator.in, dataSource.map(function (q) { return q.id; })),
|
|
11767
11851
|
this.newFilter('userId', exports.Operator.equal, userIdCurrent_1)
|
|
11768
|
-
], 'itemId,userId,trangThai,textTrangThai,workflowCode,
|
|
11852
|
+
], 'itemId,userId,trangThai,textTrangThai,workflowCode,permission')];
|
|
11769
11853
|
case 3:
|
|
11770
11854
|
dataStatus_1 = (_a.sent()).data;
|
|
11771
11855
|
if (dataStatus_1 == null) {
|
|
@@ -11780,7 +11864,7 @@
|
|
|
11780
11864
|
};
|
|
11781
11865
|
}
|
|
11782
11866
|
else {
|
|
11783
|
-
itemStatus = lstItemStatus.find(function (q) { return q.
|
|
11867
|
+
itemStatus = lstItemStatus.find(function (q) { return (q.permission & exports.PermissionBase.EDIT) == exports.PermissionBase.EDIT; });
|
|
11784
11868
|
if (itemStatus == null) {
|
|
11785
11869
|
itemStatus = lstItemStatus[0];
|
|
11786
11870
|
}
|
|
@@ -11788,7 +11872,6 @@
|
|
|
11788
11872
|
rowItem.__trangThai = itemStatus.trangThai;
|
|
11789
11873
|
rowItem.__textTrangThai = itemStatus.textTrangThai;
|
|
11790
11874
|
rowItem.__workflowCode = itemStatus.workflowCode;
|
|
11791
|
-
rowItem.__allowEdit = itemStatus.allowEdit;
|
|
11792
11875
|
rowItem.__permission = itemStatus.permission;
|
|
11793
11876
|
rowItem.__disableEdit = true;
|
|
11794
11877
|
rowItem.__disableDelete = true;
|
|
@@ -18220,7 +18303,7 @@
|
|
|
18220
18303
|
return __awaiter(this, void 0, void 0, function () {
|
|
18221
18304
|
return __generator(this, function (_a) {
|
|
18222
18305
|
switch (_a.label) {
|
|
18223
|
-
case 0: return [4 /*yield*/, this.setting.baseService.getDetailWithPermission(this.model.data.id)];
|
|
18306
|
+
case 0: return [4 /*yield*/, this.setting.baseService.getDetailWithPermission(this.model.data.id, this.model.data.pid)];
|
|
18224
18307
|
case 1: return [2 /*return*/, _a.sent()];
|
|
18225
18308
|
}
|
|
18226
18309
|
});
|
|
@@ -18347,7 +18430,7 @@
|
|
|
18347
18430
|
this.model.data = data;
|
|
18348
18431
|
this.checkPermission(data.basePermission);
|
|
18349
18432
|
if (this.crudForm) {
|
|
18350
|
-
this.crudForm.switchViewMode(
|
|
18433
|
+
this.crudForm.switchViewMode(this.__isFormView);
|
|
18351
18434
|
this.crudForm.data = data;
|
|
18352
18435
|
this.crudForm.setIsLoadedDataEdit(true);
|
|
18353
18436
|
}
|
|
@@ -26220,6 +26303,7 @@
|
|
|
26220
26303
|
_this.escape = true;
|
|
26221
26304
|
_this.config = new CrudListConfig();
|
|
26222
26305
|
_this.enableReorderRow = false;
|
|
26306
|
+
_this.disableShare = false;
|
|
26223
26307
|
_this.fieldOrder = '_index';
|
|
26224
26308
|
_this._style = {};
|
|
26225
26309
|
_this._dataSource = [];
|
|
@@ -26297,6 +26381,10 @@
|
|
|
26297
26381
|
_this.workflowHistoryModel = new DialogModel({
|
|
26298
26382
|
header: 'Xem lịch sử'
|
|
26299
26383
|
});
|
|
26384
|
+
_this.permissionSharingModel = new DialogModel({
|
|
26385
|
+
header: 'Xem danh sách link chia sẻ',
|
|
26386
|
+
popupSize: new PopupSize({ width: 1100, height: 650 }),
|
|
26387
|
+
});
|
|
26300
26388
|
_this.congViecModel = new DialogModel({
|
|
26301
26389
|
header: 'Chạy quy trình công việc',
|
|
26302
26390
|
popupSize: new PopupSize({ width: 1100, height: 650 }),
|
|
@@ -26571,8 +26659,10 @@
|
|
|
26571
26659
|
}
|
|
26572
26660
|
this.initColumnSchema(this.setting.cols);
|
|
26573
26661
|
this.createSearchSchema();
|
|
26574
|
-
if (!this.setting.hiddenTrinhKy
|
|
26575
|
-
this.menuButtons
|
|
26662
|
+
if (!this.setting.hiddenTrinhKy || !this.disableShare) {
|
|
26663
|
+
if (!this.menuButtons) {
|
|
26664
|
+
this.menuButtons = function () { return []; };
|
|
26665
|
+
}
|
|
26576
26666
|
}
|
|
26577
26667
|
// Nếu mà ẩn advancesearch => sẽ không có trigger load data từ advance search => phải tự gọi getData ở OnInit
|
|
26578
26668
|
if (this.setting.hiddenAdvanceSearch) {
|
|
@@ -27723,6 +27813,66 @@
|
|
|
27723
27813
|
.catch(function (err) { return _this.hideWaitBox(); });
|
|
27724
27814
|
}
|
|
27725
27815
|
};
|
|
27816
|
+
CrudListComponent.prototype.createShareLink = function () {
|
|
27817
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
27818
|
+
var rowData, dicPermissionId, dicState, shareLink;
|
|
27819
|
+
return __generator(this, function (_b) {
|
|
27820
|
+
switch (_b.label) {
|
|
27821
|
+
case 0:
|
|
27822
|
+
rowData = this.rowDataCurrent;
|
|
27823
|
+
return [4 /*yield*/, this.setting.baseService.getSharedKey([rowData.id])];
|
|
27824
|
+
case 1:
|
|
27825
|
+
dicPermissionId = (_b.sent()).data;
|
|
27826
|
+
if (!dicPermissionId) {
|
|
27827
|
+
this._notifierService.showWarning('Bạn không có quyền chia sẻ bản ghi');
|
|
27828
|
+
}
|
|
27829
|
+
return [4 /*yield*/, this.setting.getItemState([rowData])];
|
|
27830
|
+
case 2:
|
|
27831
|
+
dicState = _b.sent();
|
|
27832
|
+
shareLink = this.generateShareLink(rowData.id, dicPermissionId[rowData.id], dicState[rowData.id]);
|
|
27833
|
+
this.copyToClipboard(shareLink);
|
|
27834
|
+
this._notifierService.showSuccess('Copy đường dẫn chia sẻ vào clipboard thành công');
|
|
27835
|
+
return [2 /*return*/];
|
|
27836
|
+
}
|
|
27837
|
+
});
|
|
27838
|
+
});
|
|
27839
|
+
};
|
|
27840
|
+
CrudListComponent.prototype.createShareLinkMultiple = function () {
|
|
27841
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
27842
|
+
var ids, dicPermissionId, dicState, content;
|
|
27843
|
+
var _this = this;
|
|
27844
|
+
return __generator(this, function (_b) {
|
|
27845
|
+
switch (_b.label) {
|
|
27846
|
+
case 0:
|
|
27847
|
+
ids = this.model.selectedItems.map(function (q) { return q.id; });
|
|
27848
|
+
return [4 /*yield*/, this.setting.baseService.getSharedKey(ids)];
|
|
27849
|
+
case 1:
|
|
27850
|
+
dicPermissionId = (_b.sent()).data;
|
|
27851
|
+
if (!dicPermissionId) {
|
|
27852
|
+
this._notifierService.showWarning('Bạn không có quyền chia sẻ bản ghi');
|
|
27853
|
+
}
|
|
27854
|
+
return [4 /*yield*/, this.setting.getItemState(this.model.selectedItems)];
|
|
27855
|
+
case 2:
|
|
27856
|
+
dicState = _b.sent();
|
|
27857
|
+
content = '';
|
|
27858
|
+
ids.forEach(function (id) {
|
|
27859
|
+
content += _this.generateShareLink(id, dicPermissionId[id], dicState[id]) + "\n";
|
|
27860
|
+
});
|
|
27861
|
+
this.copyToClipboard(content);
|
|
27862
|
+
this._notifierService.showSuccess('Copy đường dẫn chia sẻ vào clipboard thành công');
|
|
27863
|
+
return [2 /*return*/];
|
|
27864
|
+
}
|
|
27865
|
+
});
|
|
27866
|
+
});
|
|
27867
|
+
};
|
|
27868
|
+
CrudListComponent.prototype.generateShareLink = function (id, pid, state) {
|
|
27869
|
+
var result = "" + top.location.origin + top.location.pathname + "?pid=" + pid;
|
|
27870
|
+
result += "serviceCode=" + this.setting.baseService.serviceCode;
|
|
27871
|
+
result += "&entity=" + this.setting.baseService.entityName;
|
|
27872
|
+
result += "&entityKey=" + id;
|
|
27873
|
+
result += "&state=" + encodeURIComponent(JSON.stringify(state));
|
|
27874
|
+
return result;
|
|
27875
|
+
};
|
|
27726
27876
|
CrudListComponent.prototype.checkHasPermissionInLastStatus = function (rowData) {
|
|
27727
27877
|
return __awaiter(this, void 0, void 0, function () {
|
|
27728
27878
|
var statusKetThuc;
|
|
@@ -27781,6 +27931,9 @@
|
|
|
27781
27931
|
}
|
|
27782
27932
|
_f.label = 7;
|
|
27783
27933
|
case 7:
|
|
27934
|
+
if (!this.disableShare) {
|
|
27935
|
+
this.buttonContexts.push({ label: 'Chia sẻ', icon: 'pi pi-link', command: this.createShareLink.bind(this) }, { label: 'Danh sách chia sẻ', icon: 'pi pi-list', command: this.showLinkSharing.bind(this) });
|
|
27936
|
+
}
|
|
27784
27937
|
if (this.buttonContexts.length > 0) {
|
|
27785
27938
|
this._showContextMenu(evt);
|
|
27786
27939
|
}
|
|
@@ -28977,6 +29130,9 @@
|
|
|
28977
29130
|
CrudListComponent.prototype.showSettingsWorkflowNew = function () {
|
|
28978
29131
|
this.workflowSettingModel.showEditForm = true;
|
|
28979
29132
|
};
|
|
29133
|
+
CrudListComponent.prototype.showLinkSharing = function () {
|
|
29134
|
+
this.permissionSharingModel.showEditForm = true;
|
|
29135
|
+
};
|
|
28980
29136
|
CrudListComponent.prototype.onSaveWorkflowSettings = function (event) {
|
|
28981
29137
|
this.setting.workflowSetting = event;
|
|
28982
29138
|
this._commonService.reloadPage();
|
|
@@ -29033,7 +29189,7 @@
|
|
|
29033
29189
|
{ type: i0.Component, args: [{
|
|
29034
29190
|
// tslint:disable-next-line: component-selector
|
|
29035
29191
|
selector: 'crud-list',
|
|
29036
|
-
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n <button *ngIf=\"setting.showExportSelectedItems && model.selectedItems.length > 0\"\r\n type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <button\r\n *ngIf=\"!hiddenCopyLink && model.selectedItems.length > 0 && !disableMultipleCopyLink()\"\r\n label=\"Sao ch\u00E9p li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n pTooltip=\"{{'Sao ch\u00E9p li\u00EAn k\u1EBFt' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"copyLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"hasTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new>\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <process-workflow-form #formBase [businessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"setting\" [rowItem]=\"choYKienModel.data.rowData\"\r\n (onSaved)=\"choYKienModel.showEditForm = false\" (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [businessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\" [style.width]=\"widthCheckbox\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflow()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflowNew\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflowNew()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { 'ui-state-highlight': rowData._checked })\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n pTooltip=\"{{'FORM.EDIT' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenCopyLink\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableCopyLink(rowData)\" pTooltip=\"{{'Sao ch\u00E9p li\u00EAn k\u1EBFt' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-link\" (click)=\"copyLink(rowData)\"></button>\r\n <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode\" pButton class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\"\r\n style=\"border: 1px solid #7ca9cd;\" pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflowNew($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflowNew(rowData)\"></button>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>",
|
|
29192
|
+
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n <button *ngIf=\"setting.showExportSelectedItems && model.selectedItems.length > 0\"\r\n type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <button\r\n *ngIf=\"!hiddenCopyLink && model.selectedItems.length > 0 && !disableMultipleCopyLink()\"\r\n label=\"Sao ch\u00E9p li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n pTooltip=\"{{'Sao ch\u00E9p li\u00EAn k\u1EBFt' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"copyLinkMultiple()\"></button>\r\n <button *ngIf=\"!disableShare && model.selectedItems.length > 0\" label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\"\r\n type=\"button\" pButton pRipple [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\"\r\n tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"createShareLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"hasTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new>\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <process-workflow-form #formBase [businessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"setting\" [rowItem]=\"choYKienModel.data.rowData\"\r\n (onSaved)=\"choYKienModel.showEditForm = false\" (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [businessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"permissionSharingModel.showEditForm\" #dialog [header]=\"permissionSharingModel.header | translate\"\r\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"permissionSharingModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\r\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\r\n </permission-sharing>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\" [style.width]=\"widthCheckbox\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflow()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflowNew\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflowNew()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { 'ui-state-highlight': rowData._checked })\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n pTooltip=\"{{'FORM.EDIT' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenCopyLink\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableCopyLink(rowData)\" pTooltip=\"{{'Sao ch\u00E9p li\u00EAn k\u1EBFt' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-link\" (click)=\"copyLink(rowData)\"></button>\r\n <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode\" pButton class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\"\r\n style=\"border: 1px solid #7ca9cd;\" pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflowNew($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflowNew(rowData)\"></button>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>",
|
|
29037
29193
|
providers: [i2$1.DecimalPipe, i2$1.DatePipe],
|
|
29038
29194
|
styles: [".container-table{display:flex;flex-direction:column;overflow:hidden}.container-table .container-table-inner{display:flex;height:auto;max-height:100%;min-height:60px;position:relative}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{border:1px solid #d1d1d1;border-radius:2px;bottom:0;cursor:pointer;display:flex;flex-wrap:wrap;height:1.4em;left:0;margin:auto;position:absolute;right:0;top:0;width:1.4em}.pick-color-row>div{background:#84d140;border:1px solid #fff;flex:0 0 50%}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}.group-icon{color:#256aa2;font-weight:400}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{height:100%;left:0;position:absolute;top:0;width:5px}.column-function{min-width:80px;padding:0}.custom-search-area{background-color:#f2f2f2;margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em}.main-container-search-inner{margin-bottom:-.5em}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{align-items:center;display:flex;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem;left:50%;position:absolute;top:50%;transform:translate(-50%,calc(-50% - 1px));width:2rem}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;font-weight:700;white-space:nowrap}::ng-deep crud-list .advance-search-container{display:flex;justify-content:flex-end}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{min-width:200px;position:fixed;z-index:10}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{height:0;position:absolute;width:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{background-color:#fff;border-radius:3px;display:flex;min-width:0}::ng-deep crud-list .cell-header-filter .filter-box>div{border:1px solid #ced4da;border-radius:3px 0 0 3px;border-right:none;flex:1;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{align-items:center;background:#f5f6f8;border:1px solid #ced4da;color:#6c757d;cursor:pointer;display:inline-flex;flex-basis:32px;height:32px;justify-content:center;min-width:unset;outline:none}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{border:none;box-shadow:none!important;padding-left:5px;padding-right:5px}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter.focus-within,::ng-deep crud-list .cell-header-filter:focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box{box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763);min-width:250px;position:absolute;top:calc(50% - 16px);z-index:2}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;flex:1;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{background-color:#eee;position:absolute;z-index:5}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{bottom:0;top:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{height:1px;left:0;right:0}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
|
|
29039
29195
|
},] }
|
|
@@ -29098,6 +29254,7 @@
|
|
|
29098
29254
|
templatesFromParent: [{ type: i0.Input }],
|
|
29099
29255
|
childrenFromParent: [{ type: i0.Input }],
|
|
29100
29256
|
menuButtons: [{ type: i0.Input }],
|
|
29257
|
+
disableShare: [{ type: i0.Input }],
|
|
29101
29258
|
fieldOrder: [{ type: i0.Input }],
|
|
29102
29259
|
style: [{ type: i0.Input }],
|
|
29103
29260
|
tableClass: [{ type: i0.Input }],
|
|
@@ -32785,6 +32942,8 @@
|
|
|
32785
32942
|
},
|
|
32786
32943
|
breadcrumbs: []
|
|
32787
32944
|
};
|
|
32945
|
+
_this.showAttachLinkBox = false;
|
|
32946
|
+
_this.typedLink = '';
|
|
32788
32947
|
_this._moduleConfig = _this._moduleConfigService.getConfig();
|
|
32789
32948
|
_this.apiUploadUrl = _this._fileObjectService.getUploadUrl();
|
|
32790
32949
|
_this.userId = _this._userService.getUserIdCombine();
|
|
@@ -33040,35 +33199,41 @@
|
|
|
33040
33199
|
visible: this._deviceDetectorService.isDesktop()
|
|
33041
33200
|
},
|
|
33042
33201
|
{
|
|
33043
|
-
label: '
|
|
33202
|
+
label: 'Ký số', icon: 'fas fa-signature',
|
|
33044
33203
|
command: function () {
|
|
33045
|
-
_this.
|
|
33046
|
-
}
|
|
33204
|
+
_this.signFile(item);
|
|
33205
|
+
},
|
|
33206
|
+
visible: !this.readonly
|
|
33047
33207
|
},
|
|
33048
33208
|
{
|
|
33049
|
-
label: 'Tải về
|
|
33209
|
+
label: 'Tải về', icon: 'fas fa-download',
|
|
33050
33210
|
command: function () {
|
|
33051
33211
|
_this.download(item);
|
|
33052
33212
|
}
|
|
33053
33213
|
},
|
|
33054
33214
|
{
|
|
33055
|
-
label: '
|
|
33215
|
+
label: 'Sao chép đường dẫn', icon: 'fas fa-link',
|
|
33056
33216
|
command: function () {
|
|
33057
|
-
_this.
|
|
33058
|
-
}
|
|
33059
|
-
visible: !this.readonly
|
|
33217
|
+
_this.copyDownloadLink(item);
|
|
33218
|
+
}
|
|
33060
33219
|
},
|
|
33061
33220
|
{
|
|
33062
|
-
label: '
|
|
33221
|
+
label: 'Đổi tên', icon: 'fas fa-eraser',
|
|
33063
33222
|
command: function () {
|
|
33064
|
-
_this.
|
|
33223
|
+
_this.renameFile(item);
|
|
33065
33224
|
},
|
|
33066
33225
|
visible: !this.readonly
|
|
33067
33226
|
},
|
|
33068
33227
|
{
|
|
33069
|
-
label: '
|
|
33228
|
+
label: 'Xem các phiên bản khác', icon: 'fas fa-history',
|
|
33070
33229
|
command: function () {
|
|
33071
|
-
_this.
|
|
33230
|
+
_this.openFileVersions(item);
|
|
33231
|
+
}
|
|
33232
|
+
},
|
|
33233
|
+
{
|
|
33234
|
+
label: 'Xóa tệp tin', icon: 'far fa-trash-alt',
|
|
33235
|
+
command: function () {
|
|
33236
|
+
_this.deleteFile(item);
|
|
33072
33237
|
},
|
|
33073
33238
|
visible: !this.readonly
|
|
33074
33239
|
}
|
|
@@ -33317,7 +33482,7 @@
|
|
|
33317
33482
|
_this._notifierService.showDeleteDataSuccess();
|
|
33318
33483
|
}
|
|
33319
33484
|
else {
|
|
33320
|
-
_this._notifierService.
|
|
33485
|
+
_this._notifierService.showWarningByResponse(response);
|
|
33321
33486
|
}
|
|
33322
33487
|
});
|
|
33323
33488
|
});
|
|
@@ -33333,6 +33498,29 @@
|
|
|
33333
33498
|
});
|
|
33334
33499
|
});
|
|
33335
33500
|
};
|
|
33501
|
+
FileManagerComponent.prototype.copyDownloadLink = function (explorerItem) {
|
|
33502
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
33503
|
+
var model;
|
|
33504
|
+
var _this = this;
|
|
33505
|
+
return __generator(this, function (_a) {
|
|
33506
|
+
model = this._downloadLinkService.getGenerateDownloadLinkModel(explorerItem);
|
|
33507
|
+
this._downloadLinkService.generateDownloadLink(model)
|
|
33508
|
+
.then(function (rs) {
|
|
33509
|
+
if (rs.success) {
|
|
33510
|
+
_this._commonService.copyMessage(_this._downloadLinkService.getAnonymousDownloadUrl(rs.data));
|
|
33511
|
+
_this._notifierService.showSuccess('Đã sao chép vào bộ nhớ tạm. Đường dẫn này sẽ hết hạn sau 60 giây!');
|
|
33512
|
+
}
|
|
33513
|
+
else {
|
|
33514
|
+
_this._notifierService.showWarning('Không thể sao chép liên kết tải tệp tin!');
|
|
33515
|
+
}
|
|
33516
|
+
})
|
|
33517
|
+
.catch(function (err) {
|
|
33518
|
+
_this._notifierService.showWarning('Không thể sao chép liên kết tải tệp tin!');
|
|
33519
|
+
});
|
|
33520
|
+
return [2 /*return*/];
|
|
33521
|
+
});
|
|
33522
|
+
});
|
|
33523
|
+
};
|
|
33336
33524
|
// Tải nhiều thư mục/ tệp.
|
|
33337
33525
|
FileManagerComponent.prototype.downloadMultiple = function () {
|
|
33338
33526
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -33415,7 +33603,7 @@
|
|
|
33415
33603
|
_this.data.moving = {};
|
|
33416
33604
|
}
|
|
33417
33605
|
else {
|
|
33418
|
-
_this._notifierService.
|
|
33606
|
+
_this._notifierService.showWarningByResponse(response);
|
|
33419
33607
|
}
|
|
33420
33608
|
});
|
|
33421
33609
|
};
|
|
@@ -33592,13 +33780,41 @@
|
|
|
33592
33780
|
FileManagerComponent.prototype.onRowSelect = function (evt) {
|
|
33593
33781
|
this.onSelected.emit(this.model.selectedItems);
|
|
33594
33782
|
};
|
|
33783
|
+
FileManagerComponent.prototype.addAttachLink = function () {
|
|
33784
|
+
if (this.typedLink && this.typedLink.length > 0) {
|
|
33785
|
+
var obj = this.parseAttachLink(this.typedLink);
|
|
33786
|
+
if (obj) {
|
|
33787
|
+
// do logic copy file by hash
|
|
33788
|
+
alert(obj);
|
|
33789
|
+
this.typedLink = '';
|
|
33790
|
+
this.showAttachLinkBox = false;
|
|
33791
|
+
this.getFolderContent(this.data.currentFolderId);
|
|
33792
|
+
this._notifierService.showSuccess('Tải thành công!');
|
|
33793
|
+
}
|
|
33794
|
+
else {
|
|
33795
|
+
this._notifierService.showWarning('Không hỗ trợ liên kết từ hệ thống khác hoặc liên kết không đúng!');
|
|
33796
|
+
}
|
|
33797
|
+
}
|
|
33798
|
+
};
|
|
33799
|
+
FileManagerComponent.prototype.parseAttachLink = function (link) {
|
|
33800
|
+
if (link) {
|
|
33801
|
+
var parts = link.split('/file/v5/DownloadLink/Download/');
|
|
33802
|
+
if (parts.length == 2) {
|
|
33803
|
+
return parts[1];
|
|
33804
|
+
}
|
|
33805
|
+
}
|
|
33806
|
+
return null;
|
|
33807
|
+
};
|
|
33808
|
+
FileManagerComponent.prototype.focusInput = function (input) {
|
|
33809
|
+
input.focus();
|
|
33810
|
+
};
|
|
33595
33811
|
return FileManagerComponent;
|
|
33596
33812
|
}(DataListBase));
|
|
33597
33813
|
FileManagerComponent.decorators = [
|
|
33598
33814
|
{ type: i0.Component, args: [{
|
|
33599
33815
|
// tslint:disable-next-line: component-selector
|
|
33600
33816
|
selector: 'file-manager',
|
|
33601
|
-
template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\">\r\n <div class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton pRipple type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\"\r\n tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\" label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\"\r\n (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i t\u1EC7p tin t\u1EEB m\u00E1y t\u00EDnh c\u1EE7a b\u1EA1n\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i l\u00EAn\"\r\n (click)=\"selectFile()\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\"\r\n iconPos=\"left\" label=\"Di chuy\u1EC3n\" (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn t\u1EDBi \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\"\r\n iconPos=\"left\" label=\"\u0110\u1EB7t t\u1EA1i \u0111\u00E2y\" (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" icon=\"pi pi-undo\" pButton class=\"p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" label=\"B\u1ECF qua\"\r\n (click)=\"cancelMove()\">\r\n </button>\r\n\r\n <button *ngIf=\"hasSelect()\" pButton type=\"button\"\r\n pTooltip=\"{{ 'X\u00F3a th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn' | translate }}\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n iconPos=\"left\" class=\"p-button-text p-button-danger\" label=\"X\u00F3a\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n <button *ngIf=\"readonly && hasSelect()\" class=\"p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\" label=\"T\u1EA3i v\u1EC1\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" (onReload)=\"_triggerProcessData($event)\"\r\n class=\"--auto-height-content --no-wrapper-padding\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span (click)=\"openObject(rowData)\" class=\"pull-left file-ex-icon\"\r\n [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\">\r\n </span>\r\n\r\n <span (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n {{rowData.name}}\r\n <div class=\"pull-right signature\" (click)=\"viewListSign($event, rowData.signatures)\"\r\n *ngIf=\"rowData.signatures\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\" tooltipPosition=\"top\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text link-or-action\" pButton type=\"button\"\r\n tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\" (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\" pButton\r\n type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded link-or-action\" pTooltip=\"Th\u00EAm\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"pi pi-cloud-download\"\r\n (click)=\"download(rowData)\"></button>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div *ngIf=\"!readonly || data.breadcrumbs.length > 0\" class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" (click)=\"createFolder()\" pButton pRipple type=\"button\"\r\n pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\" tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\"\r\n label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\">\r\n </button>\r\n <button type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-cloud-upload\" (click)=\"selectFile()\" label=\"T\u1EA3i l\u00EAn\"></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\">\r\n </span>\r\n <!-- <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>{{rowData.nameWithoutExtension}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n <a (click)=\"openObject(rowData)\" class=\"file-ex-extension\">{{rowData.extension}}</a> -->\r\n\r\n <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>\r\n <span>{{rowData.nameWithoutExtension}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n <span class=\"file-ex-extension\">{{rowData.extension}}</span>\r\n </a>\r\n </div>\r\n\r\n <div *ngIf=\"rowData.isFile\" class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text link-or-action\" (click)=\"onButtonClick(rowData)\"\r\n pButton type=\"button\" tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\"\r\n (click)=\"deleteFile(rowData)\" pButton type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded link-or-action\" pTooltip=\"Th\u00EAm\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n (click)=\"download(rowData)\" pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\"\r\n icon=\"pi pi-cloud-download\"></button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #breadCrumb>\r\n <div *ngIf=\"data.breadcrumbs.length > 0\" class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n</ng-template>\r\n\r\n<p-fileUpload #fileControl [ngStyle]=\"{'display': 'none'}\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file\"\r\n [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" (onClose)=\"closeFileViewer()\" [readonly]=\"readonly\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n<!--\r\n\r\n<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>\r\n\r\n\r\n\r\n<signature-detail *ngIf=\"forms.signatureDetail.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.signatureDetail.formData\">\r\n</signature-detail> -->",
|
|
33817
|
+
template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\">\r\n <div class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton pRipple type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\"\r\n tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\" label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\"\r\n (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i t\u1EC7p tin t\u1EEB m\u00E1y t\u00EDnh c\u1EE7a b\u1EA1n\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i l\u00EAn\"\r\n (click)=\"selectFile()\"></button>\r\n\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\"\r\n iconPos=\"left\" label=\"Di chuy\u1EC3n\" (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn t\u1EDBi \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\"\r\n iconPos=\"left\" label=\"\u0110\u1EB7t t\u1EA1i \u0111\u00E2y\" (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" icon=\"pi pi-undo\" pButton class=\"p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" label=\"B\u1ECF qua\"\r\n (click)=\"cancelMove()\">\r\n </button>\r\n\r\n <button *ngIf=\"hasSelect()\" pButton type=\"button\"\r\n pTooltip=\"{{ 'X\u00F3a th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn' | translate }}\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n iconPos=\"left\" class=\"p-button-text p-button-danger\" label=\"X\u00F3a\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n <button *ngIf=\"readonly && hasSelect()\" class=\"p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\" label=\"T\u1EA3i v\u1EC1\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" (onReload)=\"_triggerProcessData($event)\"\r\n class=\"--auto-height-content --no-wrapper-padding\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span (click)=\"openObject(rowData)\" class=\"pull-left file-ex-icon\"\r\n [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\">\r\n </span>\r\n\r\n <span (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n {{rowData.name}}\r\n <div class=\"pull-right signature\" (click)=\"viewListSign($event, rowData.signatures)\"\r\n *ngIf=\"rowData.signatures\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\" tooltipPosition=\"top\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text link-or-action\" pButton type=\"button\"\r\n tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\" (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\" pButton\r\n type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded link-or-action\" pTooltip=\"Th\u00EAm\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"pi pi-cloud-download\"\r\n (click)=\"download(rowData)\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div *ngIf=\"!readonly || data.breadcrumbs.length > 0\" class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" (click)=\"createFolder()\" pButton pRipple type=\"button\"\r\n pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\" tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\"\r\n label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\">\r\n </button>\r\n <button type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-cloud-upload\" (click)=\"selectFile()\" label=\"T\u1EA3i l\u00EAn\"></button>\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\">\r\n </span>\r\n <!-- <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>{{rowData.nameWithoutExtension}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n <a (click)=\"openObject(rowData)\" class=\"file-ex-extension\">{{rowData.extension}}</a> -->\r\n\r\n <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>\r\n <span>{{rowData.nameWithoutExtension}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n <span class=\"file-ex-extension\">{{rowData.extension}}</span>\r\n </a>\r\n </div>\r\n\r\n <div *ngIf=\"rowData.isFile\" class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text link-or-action\" (click)=\"onButtonClick(rowData)\"\r\n pButton type=\"button\" tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\"\r\n (click)=\"deleteFile(rowData)\" pButton type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded link-or-action\" pTooltip=\"Th\u00EAm\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n (click)=\"download(rowData)\" pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\"\r\n icon=\"pi pi-cloud-download\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #breadCrumb>\r\n <div *ngIf=\"data.breadcrumbs.length > 0\" class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n</ng-template>\r\n\r\n<p-fileUpload #fileControl [ngStyle]=\"{'display': 'none'}\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file\"\r\n [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" (onClose)=\"closeFileViewer()\" [readonly]=\"readonly\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"showAttachLinkBox\" #dialog2 [maximizable]=\"false\"\r\n [header]=\"'Nh\u1EADp li\u00EAn k\u1EBFt' | translate\" [popupSize]=\"{ width: 600, height: 50}\" (onHide)=\"showAttachLinkBox = false; typedLink=''\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-grid\">\r\n <div class=\"p-md-10\">\r\n <input #input type=\"text\" placeholder=\"Nh\u1EADp li\u00EAn k\u1EBFt sao ch\u00E9p t\u1EEB t\u1EC7p tin kh\u00E1c...\" (keyup.enter)=\"addAttachLink()\" pInputText [(ngModel)]=\"typedLink\" class=\"p-col-12\"/>\r\n </div>\r\n <div class=\"p-md-2\">\r\n <button type=\"button\" (click)=\"addAttachLink()\" [disabled]=\"typedLink != ''? null : true\" pButton class=\"p-button-primary p-col-12\" label=\"Ok\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <after-view-checked (loaded)=\"focusInput(input)\"></after-view-checked>\r\n</tn-dialog>\r\n<!--\r\n\r\n<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>\r\n\r\n\r\n\r\n<signature-detail *ngIf=\"forms.signatureDetail.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.signatureDetail.formData\">\r\n</signature-detail> -->",
|
|
33602
33818
|
providers: [
|
|
33603
33819
|
{
|
|
33604
33820
|
provide: forms.NG_VALUE_ACCESSOR,
|
|
@@ -34394,7 +34610,7 @@
|
|
|
34394
34610
|
_this.onClose.next(true);
|
|
34395
34611
|
}
|
|
34396
34612
|
else {
|
|
34397
|
-
_this._notifierService.
|
|
34613
|
+
_this._notifierService.showWarningByResponse(response);
|
|
34398
34614
|
}
|
|
34399
34615
|
});
|
|
34400
34616
|
});
|
|
@@ -37071,7 +37287,11 @@
|
|
|
37071
37287
|
EnumWorkflowHistoryStatus[EnumWorkflowHistoryStatus["IN_MAIN_THREAD"] = 0] = "IN_MAIN_THREAD";
|
|
37072
37288
|
EnumWorkflowHistoryStatus[EnumWorkflowHistoryStatus["NOT_IN_MAIN_THREAD"] = 1] = "NOT_IN_MAIN_THREAD";
|
|
37073
37289
|
EnumWorkflowHistoryStatus[EnumWorkflowHistoryStatus["RECALLED"] = 2] = "RECALLED";
|
|
37074
|
-
})(exports.EnumWorkflowHistoryStatus || (exports.EnumWorkflowHistoryStatus = {}));
|
|
37290
|
+
})(exports.EnumWorkflowHistoryStatus || (exports.EnumWorkflowHistoryStatus = {}));
|
|
37291
|
+
(function (EnumPermissionType) {
|
|
37292
|
+
EnumPermissionType[EnumPermissionType["MAIN"] = 0] = "MAIN";
|
|
37293
|
+
EnumPermissionType[EnumPermissionType["SHARE"] = 1] = "SHARE"; // Bản ghi tạo ra để chia sẻ
|
|
37294
|
+
})(exports.EnumPermissionType || (exports.EnumPermissionType = {}));
|
|
37075
37295
|
|
|
37076
37296
|
var StateMachineTopic = {
|
|
37077
37297
|
CONNECTION_CHANGE: 'CONNECTION_CHANGE'
|
|
@@ -40069,24 +40289,39 @@
|
|
|
40069
40289
|
var divs = this.elementRef.getElementsByClassName('ps-content');
|
|
40070
40290
|
if (divs && divs.length > 0) {
|
|
40071
40291
|
var contentDiv_1 = divs[0];
|
|
40072
|
-
var
|
|
40073
|
-
if (
|
|
40074
|
-
|
|
40075
|
-
|
|
40076
|
-
|
|
40292
|
+
var scrollYHolder = this.findNext(contentDiv_1, 'ps__rail-y');
|
|
40293
|
+
if (scrollYHolder) {
|
|
40294
|
+
var scrollYs_1 = scrollYHolder.getElementsByClassName('ps__thumb-y');
|
|
40295
|
+
if (scrollYs_1 && scrollYs_1.length > 0) {
|
|
40296
|
+
setTimeout(function () {
|
|
40297
|
+
_this.checkScrollBar(contentDiv_1, scrollYs_1[0]);
|
|
40298
|
+
}, this._intervalTime);
|
|
40299
|
+
}
|
|
40077
40300
|
}
|
|
40078
40301
|
}
|
|
40079
40302
|
};
|
|
40303
|
+
TnCustomScrollbarComponent.prototype.findNext = function (curentNode, className) {
|
|
40304
|
+
var nextSibling = curentNode.nextSibling;
|
|
40305
|
+
while (nextSibling) {
|
|
40306
|
+
if (nextSibling.classList && nextSibling.classList.contains(className)) {
|
|
40307
|
+
return nextSibling;
|
|
40308
|
+
}
|
|
40309
|
+
nextSibling = nextSibling.nextSibling;
|
|
40310
|
+
}
|
|
40311
|
+
return null;
|
|
40312
|
+
};
|
|
40080
40313
|
TnCustomScrollbarComponent.prototype.checkScrollBar = function (contentDiv, scrollY) {
|
|
40081
40314
|
var _this = this;
|
|
40082
40315
|
try {
|
|
40083
40316
|
var contentHeight = contentDiv.clientHeight;
|
|
40084
40317
|
var holderHeight = contentDiv.parentElement.clientHeight;
|
|
40085
|
-
if (holderHeight
|
|
40086
|
-
|
|
40087
|
-
|
|
40088
|
-
|
|
40089
|
-
|
|
40318
|
+
if (holderHeight > 0) {
|
|
40319
|
+
if (holderHeight >= contentHeight) {
|
|
40320
|
+
scrollY.style.display = 'none';
|
|
40321
|
+
}
|
|
40322
|
+
else {
|
|
40323
|
+
scrollY.style.display = '';
|
|
40324
|
+
}
|
|
40090
40325
|
}
|
|
40091
40326
|
if (this._checkScrollBar) {
|
|
40092
40327
|
setTimeout(function () {
|
|
@@ -40267,6 +40502,7 @@
|
|
|
40267
40502
|
this.closeOnEscape = true;
|
|
40268
40503
|
this.showFooter = true;
|
|
40269
40504
|
this.hiddenSave = true;
|
|
40505
|
+
this.maximizable = true;
|
|
40270
40506
|
this.scrollConfig = { suppressScrollX: true, suppressScrollY: false };
|
|
40271
40507
|
this.scrollStyle = {};
|
|
40272
40508
|
this.onSave = new i0.EventEmitter();
|
|
@@ -40343,7 +40579,7 @@
|
|
|
40343
40579
|
TnDialogComponent.decorators = [
|
|
40344
40580
|
{ type: i0.Component, args: [{
|
|
40345
40581
|
selector: 'tn-dialog',
|
|
40346
|
-
template: "<p-dialog #dialog [closeOnEscape]=\"closeOnEscape\" [appendTo]=\"'body'\" [focusOnShow]=\"false\" [focusTrap]=\"false\"\r\n [header]=\"header | translate\" [(visible)]=\"visible\" [modal]=\"modal\" [responsive]=\"true\" [maximizable]=\"
|
|
40582
|
+
template: "<p-dialog #dialog [closeOnEscape]=\"closeOnEscape\" [appendTo]=\"'body'\" [focusOnShow]=\"false\" [focusTrap]=\"false\"\r\n [header]=\"header | translate\" [(visible)]=\"visible\" [modal]=\"modal\" [responsive]=\"true\" [maximizable]=\"maximizable\"\r\n [autoZIndex]=\"true\" [styleClass]=\"styleClass\" [maskStyleClass]=\"maskClass\"\r\n [style]=\"{'width': popupSize.width + 'px', 'min-width': popupSize.width + 'px', 'height': popupSize.height + 'px', 'min-height': popupSize.height + 'px'}\"\r\n (onShow)=\"handleShowDialog($event)\" (onHide)=\"handleHideDialog($event)\" (onShow)=\"handleShowDialog($event)\">\r\n <tn-custom-scrollbar #scrollbar [useDefaultScrollBar]=\"useDefaultScrollBar\" [class]=\"scrollBarStyleClass\"\r\n [config]=\"scrollConfig\" [style]=\"scrollStyle\" class=\"tn-dialog-scrollbar\">\r\n <ng-content></ng-content>\r\n </tn-custom-scrollbar>\r\n <p-footer *ngIf=\"showFooter && formBase && formBase.buttonTemplate\">\r\n <ng-container *ngTemplateOutlet=\"formBase.buttonTemplate\">\r\n </ng-container>\r\n </p-footer>\r\n <p-footer *ngIf=\"showFooter && footer\">\r\n <ng-container *ngTemplateOutlet=\"footer\"></ng-container>\r\n </p-footer>\r\n</p-dialog>",
|
|
40347
40583
|
styles: [""]
|
|
40348
40584
|
},] }
|
|
40349
40585
|
];
|
|
@@ -40371,6 +40607,7 @@
|
|
|
40371
40607
|
positionTop: [{ type: i0.Input }],
|
|
40372
40608
|
minY: [{ type: i0.Input }],
|
|
40373
40609
|
hiddenSave: [{ type: i0.Input }],
|
|
40610
|
+
maximizable: [{ type: i0.Input }],
|
|
40374
40611
|
onSave: [{ type: i0.Output }],
|
|
40375
40612
|
onCancel: [{ type: i0.Output }],
|
|
40376
40613
|
onShow: [{ type: i0.Output }],
|
|
@@ -42495,6 +42732,155 @@
|
|
|
42495
42732
|
rowItem: [{ type: i0.Input }]
|
|
42496
42733
|
};
|
|
42497
42734
|
|
|
42735
|
+
var WorkflowPermissionService = /** @class */ (function (_super) {
|
|
42736
|
+
__extends(WorkflowPermissionService, _super);
|
|
42737
|
+
function WorkflowPermissionService(http, injector, _moduleConfigService) {
|
|
42738
|
+
var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint + "/WorkflowPermission") || this;
|
|
42739
|
+
_this.entityName = 'WorkflowPermission';
|
|
42740
|
+
_this.serviceCode = 'workflow';
|
|
42741
|
+
_this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint;
|
|
42742
|
+
return _this;
|
|
42743
|
+
}
|
|
42744
|
+
return WorkflowPermissionService;
|
|
42745
|
+
}(BaseService));
|
|
42746
|
+
WorkflowPermissionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WorkflowPermissionService_Factory() { return new WorkflowPermissionService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: WorkflowPermissionService, providedIn: "root" });
|
|
42747
|
+
WorkflowPermissionService.decorators = [
|
|
42748
|
+
{ type: i0.Injectable, args: [{
|
|
42749
|
+
providedIn: 'root'
|
|
42750
|
+
},] }
|
|
42751
|
+
];
|
|
42752
|
+
WorkflowPermissionService.ctorParameters = function () { return [
|
|
42753
|
+
{ type: i1$1.HttpClient },
|
|
42754
|
+
{ type: i0.Injector },
|
|
42755
|
+
{ type: ModuleConfigService }
|
|
42756
|
+
]; };
|
|
42757
|
+
|
|
42758
|
+
var PermissionSharingComponent = /** @class */ (function (_super) {
|
|
42759
|
+
__extends(PermissionSharingComponent, _super);
|
|
42760
|
+
function PermissionSharingComponent(_injector, _workflowPermissionService) {
|
|
42761
|
+
var _this = _super.call(this, _injector) || this;
|
|
42762
|
+
_this._injector = _injector;
|
|
42763
|
+
_this._workflowPermissionService = _workflowPermissionService;
|
|
42764
|
+
return _this;
|
|
42765
|
+
}
|
|
42766
|
+
PermissionSharingComponent.prototype.ngOnInit = function () {
|
|
42767
|
+
this.setting.baseService = this._workflowPermissionService;
|
|
42768
|
+
this.setting.settingKey = 'permission-sharing';
|
|
42769
|
+
this.setting.title = '';
|
|
42770
|
+
this.setting.heightType = exports.HeightType.dynamic;
|
|
42771
|
+
this.setting.showEditLink = false;
|
|
42772
|
+
this.setting.hiddenToolbar = true;
|
|
42773
|
+
this.setting.hiddenWorkflowColumn = true;
|
|
42774
|
+
this.setting.hiddenSettingWorkflow = true;
|
|
42775
|
+
this.setting.hiddenSettingWorkflowNew = true;
|
|
42776
|
+
this.setting.hiddenSettingPermission = true;
|
|
42777
|
+
this.init();
|
|
42778
|
+
};
|
|
42779
|
+
PermissionSharingComponent.prototype.init = function () {
|
|
42780
|
+
this.setting.modelSchemas = [
|
|
42781
|
+
new ModelSchema({ field: 'userIdCreated', name: 'Người chia sẻ', fullName: 'Người chia sẻ', description: '' }),
|
|
42782
|
+
new ModelSchema({ field: 'permission', name: 'Quyền', fullName: 'Quyền', description: '' }),
|
|
42783
|
+
new ModelSchema({ field: 'created', name: 'Thời gian', fullName: 'Thời gian', description: '' }),
|
|
42784
|
+
];
|
|
42785
|
+
this.setting.cols = [
|
|
42786
|
+
new ColumnSchemaBase({
|
|
42787
|
+
field: 'userIdCreated',
|
|
42788
|
+
baseService: this._userService,
|
|
42789
|
+
displayField: 'fullNameNew'
|
|
42790
|
+
}),
|
|
42791
|
+
new ColumnSchemaBase({
|
|
42792
|
+
field: 'strPermissions',
|
|
42793
|
+
label: this._translateService.instant('Quyền'),
|
|
42794
|
+
}),
|
|
42795
|
+
new ColumnSchemaBase({
|
|
42796
|
+
field: 'created',
|
|
42797
|
+
dataType: 'datetime',
|
|
42798
|
+
width: '20%'
|
|
42799
|
+
})
|
|
42800
|
+
];
|
|
42801
|
+
this.model.ready = true;
|
|
42802
|
+
_super.prototype.ngOnInit.call(this);
|
|
42803
|
+
};
|
|
42804
|
+
PermissionSharingComponent.prototype.modifyGridInfo = function (gridInfo) {
|
|
42805
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
42806
|
+
return __generator(this, function (_a) {
|
|
42807
|
+
gridInfo.filters.unshift(this.newFilter('itemId', exports.Operator.equal, this.item.id), this.newFilter('type', exports.Operator.equal, exports.EnumPermissionType.SHARE));
|
|
42808
|
+
gridInfo.sorts.unshift(this.newSort('created', -1));
|
|
42809
|
+
return [2 /*return*/];
|
|
42810
|
+
});
|
|
42811
|
+
});
|
|
42812
|
+
};
|
|
42813
|
+
PermissionSharingComponent.prototype.beforeRenderDataSource = function (dataSource) {
|
|
42814
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
42815
|
+
var separator;
|
|
42816
|
+
var _this = this;
|
|
42817
|
+
return __generator(this, function (_a) {
|
|
42818
|
+
separator = ', ';
|
|
42819
|
+
dataSource.forEach(function (item) {
|
|
42820
|
+
item.hiddenEdit = true;
|
|
42821
|
+
item.hiddenCopyLink = true;
|
|
42822
|
+
// Tổng hợp quyền của bản ghi
|
|
42823
|
+
var strPermissions = '';
|
|
42824
|
+
if (_this.checkHasPermission(item.permission, exports.PermissionBase.READ)) {
|
|
42825
|
+
strPermissions += "xem" + separator;
|
|
42826
|
+
}
|
|
42827
|
+
if (_this.checkHasPermission(item.permission, exports.PermissionBase.EDIT)) {
|
|
42828
|
+
strPermissions += "s\u1EEDa" + separator;
|
|
42829
|
+
}
|
|
42830
|
+
if (_this.checkHasPermission(item.permission, exports.PermissionBase.DELETE)) {
|
|
42831
|
+
strPermissions += "x\u00F3a" + separator;
|
|
42832
|
+
}
|
|
42833
|
+
if (strPermissions.length > 0) {
|
|
42834
|
+
strPermissions = strPermissions.substring(0, strPermissions.length - separator.length);
|
|
42835
|
+
strPermissions = strPermissions.substring(0, 1).toUpperCase() + strPermissions.substring(1);
|
|
42836
|
+
}
|
|
42837
|
+
item.strPermissions = strPermissions;
|
|
42838
|
+
});
|
|
42839
|
+
return [2 /*return*/];
|
|
42840
|
+
});
|
|
42841
|
+
});
|
|
42842
|
+
};
|
|
42843
|
+
PermissionSharingComponent.prototype.checkHasPermission = function (permission, permissionCheck) {
|
|
42844
|
+
return (permission & permissionCheck) == permissionCheck;
|
|
42845
|
+
};
|
|
42846
|
+
PermissionSharingComponent.prototype.delete = function (item) {
|
|
42847
|
+
this.deletePermissionSharing([item.id]);
|
|
42848
|
+
};
|
|
42849
|
+
PermissionSharingComponent.prototype.deleteMultiple = function (items) {
|
|
42850
|
+
this.deletePermissionSharing(items.map(function (q) { return q.id; }));
|
|
42851
|
+
};
|
|
42852
|
+
PermissionSharingComponent.prototype.deletePermissionSharing = function (ids) {
|
|
42853
|
+
var _this = this;
|
|
42854
|
+
if (ids.length == 0) {
|
|
42855
|
+
return this._notifierService.showWarning('Bạn chưa chọn link muốn xóa');
|
|
42856
|
+
}
|
|
42857
|
+
this._notifierService.showConfirm('Bạn có chắc chắn muốn xóa link đã chọn')
|
|
42858
|
+
.then(function (res) {
|
|
42859
|
+
if (!res)
|
|
42860
|
+
return;
|
|
42861
|
+
_this.baseService.deleteLinkSharing(ids)
|
|
42862
|
+
.then(function (res) { return _this.handleResponse(res, 'Xóa thành công', function (f) { return _this._triggerProcessData(); }); });
|
|
42863
|
+
});
|
|
42864
|
+
};
|
|
42865
|
+
return PermissionSharingComponent;
|
|
42866
|
+
}(DataListBase));
|
|
42867
|
+
PermissionSharingComponent.decorators = [
|
|
42868
|
+
{ type: i0.Component, args: [{
|
|
42869
|
+
selector: 'permission-sharing',
|
|
42870
|
+
template: "<crud-list *ngIf=\"model.ready\" #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\r\n [disableShare]=\"true\" [hiddenCopyLink]=\"true\" [hiddenAdd]=\"true\" (onReload)=\"_triggerProcessData($event)\"\r\n (onAdd)=\"_add($event)\" (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"delete($event)\"\r\n (onDeleteMultiple)=\"deleteMultiple($event)\" (onReloaded)=\"_handleReloaded($event)\">\r\n</crud-list>",
|
|
42871
|
+
providers: [ComponentContextService],
|
|
42872
|
+
styles: [".state-designer-container>div:first-child{font-size:.9em;font-weight:700;padding:.5em 0}.container-receiver div{margin-bottom:10px}.container-receiver div:last-child{margin-bottom:0}::ng-deep workflow-history-new tr.recalled{opacity:.5}"]
|
|
42873
|
+
},] }
|
|
42874
|
+
];
|
|
42875
|
+
PermissionSharingComponent.ctorParameters = function () { return [
|
|
42876
|
+
{ type: i0.Injector },
|
|
42877
|
+
{ type: WorkflowPermissionService }
|
|
42878
|
+
]; };
|
|
42879
|
+
PermissionSharingComponent.propDecorators = {
|
|
42880
|
+
baseService: [{ type: i0.Input }],
|
|
42881
|
+
item: [{ type: i0.Input }]
|
|
42882
|
+
};
|
|
42883
|
+
|
|
42498
42884
|
var CanBoHoSoService = /** @class */ (function (_super) {
|
|
42499
42885
|
__extends(CanBoHoSoService, _super);
|
|
42500
42886
|
function CanBoHoSoService(http, injector, _moduleConfigService) {
|
|
@@ -43550,6 +43936,9 @@
|
|
|
43550
43936
|
item.jsonModelChange = [];
|
|
43551
43937
|
}
|
|
43552
43938
|
}
|
|
43939
|
+
else if (item.actionCode == ActionThuHoiBase) {
|
|
43940
|
+
item.class = 'recalled';
|
|
43941
|
+
}
|
|
43553
43942
|
}
|
|
43554
43943
|
else if (item.status == exports.EnumWorkflowHistoryStatus.RECALLED) {
|
|
43555
43944
|
item.class = 'recalled';
|
|
@@ -44477,7 +44866,7 @@
|
|
|
44477
44866
|
BaseCauHinhWorkflowDetailComponent.decorators = [
|
|
44478
44867
|
{ type: i0.Component, args: [{
|
|
44479
44868
|
selector: 'base-cauhinh-workflow-detail',
|
|
44480
|
-
template: "<workflow-picker #workflowPicker *ngIf=\"readyGenWorkflow\" #formBase [data]=\"workflowData\" [showButtonSave]=\"true\"\r\n (onSaveSetting)=\"handleSave($event)\"></workflow-picker>\r\n<after-view-checked *ngIf=\"hasCountDown\" (loaded)=\"handleReadyToGetWorkflowData()\">\r\n</after-view-checked
|
|
44869
|
+
template: "<workflow-picker #workflowPicker *ngIf=\"readyGenWorkflow\" #formBase [data]=\"workflowData\" [showButtonSave]=\"true\"\r\n (onSaveSetting)=\"handleSave($event)\"></workflow-picker>\r\n<after-view-checked *ngIf=\"hasCountDown\" (loaded)=\"handleReadyToGetWorkflowData()\">\r\n</after-view-checked>\r\n",
|
|
44481
44870
|
providers: [ComponentContextService],
|
|
44482
44871
|
styles: [".container-task-info .percent-done{background-color:#f0f0f0;border-radius:2px;height:5px;margin-top:5px;overflow:hidden;position:relative}.container-task-info .percent-done .detail{border-radius:2px;color:#fff;font-size:13px;height:5px;left:0;position:absolute;text-align:center;top:0}"]
|
|
44483
44872
|
},] }
|
|
@@ -44663,8 +45052,10 @@
|
|
|
44663
45052
|
_this.fileDataService = fileDataService;
|
|
44664
45053
|
_this.formState = exports.FormState.VIEW;
|
|
44665
45054
|
_this.layoutFile = exports.EnumFileLayout;
|
|
44666
|
-
_this.formModel = {};
|
|
44667
45055
|
_this.enumFormState = exports.FormState;
|
|
45056
|
+
_this.formModel = {};
|
|
45057
|
+
_this.showAttachLinkBox = false;
|
|
45058
|
+
_this.typedLink = '';
|
|
44668
45059
|
return _this;
|
|
44669
45060
|
}
|
|
44670
45061
|
BaseCongviecDinhkemComponent.prototype.ngOnInit = function () {
|
|
@@ -44798,40 +45189,63 @@
|
|
|
44798
45189
|
return __generator(this, function (_a) {
|
|
44799
45190
|
content = this._commonService.pasteByStorage();
|
|
44800
45191
|
if (content) {
|
|
44801
|
-
obj = this.
|
|
44802
|
-
console.log('obj parsed', obj);
|
|
45192
|
+
obj = this.parseAttachLink(content);
|
|
44803
45193
|
if (obj.length > 0) {
|
|
44804
|
-
this._notifierService.showSuccess('Đang thêm mục đính kèm');
|
|
44805
45194
|
this._congViecDinhKemService.themDinhKemNghiepVu(this.taskId, obj).then(function (rs) {
|
|
44806
45195
|
if (rs.success) {
|
|
44807
|
-
_this._notifierService.showSuccess('Thêm mục đính kèm thành công');
|
|
45196
|
+
_this._notifierService.showSuccess('Thêm mục đính kèm thành công!');
|
|
44808
45197
|
_this.reload();
|
|
44809
45198
|
_this._commonService.clearClipboardStorage();
|
|
44810
45199
|
}
|
|
44811
45200
|
else {
|
|
44812
|
-
_this.
|
|
45201
|
+
_this.showAttachLinkBox = true;
|
|
44813
45202
|
}
|
|
44814
45203
|
}).catch(function (err) {
|
|
44815
|
-
|
|
44816
|
-
_this._notifierService.showWarning('Thêm mục đính kèm không thành công');
|
|
45204
|
+
_this.showAttachLinkBox = true;
|
|
44817
45205
|
});
|
|
44818
45206
|
}
|
|
44819
45207
|
else {
|
|
44820
|
-
this.
|
|
45208
|
+
this.showAttachLinkBox = true;
|
|
44821
45209
|
}
|
|
44822
45210
|
}
|
|
44823
45211
|
else {
|
|
44824
|
-
this.
|
|
45212
|
+
this.showAttachLinkBox = true;
|
|
44825
45213
|
}
|
|
44826
45214
|
return [2 /*return*/];
|
|
44827
45215
|
});
|
|
44828
45216
|
});
|
|
44829
45217
|
};
|
|
45218
|
+
BaseCongviecDinhkemComponent.prototype.addAttachLink = function () {
|
|
45219
|
+
var _this = this;
|
|
45220
|
+
if (this.typedLink && this.typedLink.length > 0) {
|
|
45221
|
+
var obj = this.parseAttachLink(this.typedLink);
|
|
45222
|
+
if (obj.length > 0) {
|
|
45223
|
+
this._congViecDinhKemService.themDinhKemNghiepVu(this.taskId, obj).then(function (rs) {
|
|
45224
|
+
if (rs.success) {
|
|
45225
|
+
_this._notifierService.showSuccess('Thêm mục đính kèm thành công!');
|
|
45226
|
+
_this.showAttachLinkBox = false;
|
|
45227
|
+
_this.typedLink = '';
|
|
45228
|
+
_this.reload();
|
|
45229
|
+
}
|
|
45230
|
+
else {
|
|
45231
|
+
_this._notifierService.showWarning('Liên kết không hợp lệ!');
|
|
45232
|
+
}
|
|
45233
|
+
}).catch(function (err) {
|
|
45234
|
+
_this._notifierService.showWarning('Liên kết không hợp lệ!');
|
|
45235
|
+
});
|
|
45236
|
+
}
|
|
45237
|
+
else {
|
|
45238
|
+
this._notifierService.showWarning('Liên kết không hợp lệ!');
|
|
45239
|
+
}
|
|
45240
|
+
}
|
|
45241
|
+
};
|
|
45242
|
+
BaseCongviecDinhkemComponent.prototype.focusInput = function (input) {
|
|
45243
|
+
input.focus();
|
|
45244
|
+
};
|
|
44830
45245
|
// http://localhost:27230/universal-link?serviceCode=congviec&entity=DM_Priority&entityKey=0911f3e7-3db0-4b68-87cd-07d425741e9e&state=&sourcePath=http://localhost:27230/dm-priority
|
|
44831
|
-
BaseCongviecDinhkemComponent.prototype.
|
|
45246
|
+
BaseCongviecDinhkemComponent.prototype.parseAttachLink = function (content) {
|
|
44832
45247
|
var e_2, _a;
|
|
44833
45248
|
var links = content.split('\r\n');
|
|
44834
|
-
console.log('links', links);
|
|
44835
45249
|
var op = [];
|
|
44836
45250
|
try {
|
|
44837
45251
|
for (var links_1 = __values(links), links_1_1 = links_1.next(); !links_1_1.done; links_1_1 = links_1.next()) {
|
|
@@ -44897,7 +45311,7 @@
|
|
|
44897
45311
|
BaseCongviecDinhkemComponent.decorators = [
|
|
44898
45312
|
{ type: i0.Component, args: [{
|
|
44899
45313
|
selector: 'base-congviec-dinhkem',
|
|
44900
|
-
template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [hiddenAdd]=\"true\"\r\n
|
|
45314
|
+
template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [hiddenAdd]=\"true\"\r\n [hiddenEdit]=\"true\" [hiddenDelete]=\"true\" [hiddenCopyLink]=\"true\" (onReload)=\"_triggerProcessData($event)\"\r\n (onView)=\"viewLinkItem($event)\" (onDelete)=\"deleteLinkItem($event)\"\r\n (onDeleteMultiple)=\"deleteLinkItemMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\r\n <ng-template #tieuDe let-rowData=\"rowData\">\r\n {{rowData.tenHienThiDoiTuong}}: [{{rowData.tieuDe}}]\r\n </ng-template>\r\n <ng-template #buttonAfterToolbar>\r\n <button *ngIf=\"formState == enumFormState.EDIT || formState == enumFormState.ADD\" type=\"button\" pButton pRipple\r\n label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text p-button-primary\" (click)=\"themDinhKem()\"></button>\r\n <button type=\"button\"\r\n *ngIf=\"(formState == enumFormState.EDIT || formState == enumFormState.ADD) && model.selectedItems.length > 0\"\r\n pButton pRipple label=\"X\u00F3a\" icon=\"pi pi-trash\" class=\"p-button-rounded p-button-text p-button-danger\"\r\n (click)=\"deleteLinkItemMultiple($event)\"></button>\r\n </ng-template>\r\n <ng-template #function let-rowData=\"rowData\">\r\n <button *ngIf=\"formState == enumFormState.EDIT || formState == enumFormState.ADD\" type=\"button\" pButton pRipple\r\n icon=\"pi pi-trash\" class=\"p-button-rounded p-button-text p-button-danger\" pTooltip=\"H\u1EE7y \u0111\u00EDnh k\u00E8m\"\r\n tooltipPosition=\"top\" (click)=\"deleteLinkItem(rowData)\"></button>\r\n </ng-template>\r\n <ng-template #fileDinhKem let-rowData=\"rowData\">\r\n <file-manager [readonly]=\"true\" [serviceCode]=\"rowData.serviceCode\" [entity]=\"rowData.entity\"\r\n [entityKey]=\"rowData.entityKey\" [layout]=\"layoutFile.SIMPLE\" [fileDataService]=\"fileDataService\">\r\n </file-manager>\r\n </ng-template>\r\n</crud-list>\r\n\r\n<tn-dialog *ngIf=\"showDetailForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"setting.popupHeader | translate\" [popupSize]=\"setting.popupSize\" (onHide)=\"showDetailForm = false\">\r\n <base-congviec-dinhkem-form #formBase [taskId]=\"taskId\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"formModel\" (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"\r\n (onAfterSaved)=\"onAfterSaved($event)\">\r\n </base-congviec-dinhkem-form>\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"showAttachLinkBox\" #dialog2 [maximizable]=\"false\" [header]=\"'Nh\u1EADp li\u00EAn k\u1EBFt' | translate\"\r\n [popupSize]=\"{ width: 600, height: 50}\" (onHide)=\"showAttachLinkBox = false; typedLink=''\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-grid\">\r\n <div class=\"p-md-10\">\r\n <input #input type=\"text\" placeholder=\"Nh\u1EADp li\u00EAn k\u1EBFt sao ch\u00E9p t\u1EEB ph\u00E2n h\u1EC7 kh\u00E1c...\" pInputText\r\n class=\"p-col-12\" [(ngModel)]=\"typedLink\" (keyup.enter)=\"addAttachLink()\" />\r\n </div>\r\n <div class=\"p-md-2\">\r\n <button type=\"button\" pButton class=\"p-button-primary p-col-12\" label=\"Ok\"\r\n [disabled]=\"typedLink != ''? null : true\" (click)=\"addAttachLink()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <after-view-checked (loaded)=\"focusInput(input)\"></after-view-checked>\r\n</tn-dialog>",
|
|
44901
45315
|
providers: [ComponentContextService],
|
|
44902
45316
|
styles: [""]
|
|
44903
45317
|
},] }
|
|
@@ -45005,6 +45419,12 @@
|
|
|
45005
45419
|
_this.autoFocus = true;
|
|
45006
45420
|
_this.enumFormState = exports.FormState;
|
|
45007
45421
|
_this.enumLoaiDanhSachCongViec = exports.EnumLoaiDanhSachCongViec;
|
|
45422
|
+
_this.users = {
|
|
45423
|
+
taskName: '',
|
|
45424
|
+
assigner: 0,
|
|
45425
|
+
assignee: 0,
|
|
45426
|
+
relatedUsers: [],
|
|
45427
|
+
};
|
|
45008
45428
|
_this.tabDataChild = [
|
|
45009
45429
|
{
|
|
45010
45430
|
code: 'fileDinhKem',
|
|
@@ -45020,6 +45440,11 @@
|
|
|
45020
45440
|
code: 'taskLienQuan',
|
|
45021
45441
|
icon: 'pi pi-share-alt',
|
|
45022
45442
|
label: 'Công việc liên quan'
|
|
45443
|
+
},
|
|
45444
|
+
{
|
|
45445
|
+
code: 'traoDoiCongViec',
|
|
45446
|
+
icon: 'pi pi-comment',
|
|
45447
|
+
label: 'Trao đổi công việc',
|
|
45023
45448
|
}
|
|
45024
45449
|
];
|
|
45025
45450
|
_this.handleChangeLoaiCongViecWhenAdd = function (evt) { return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -45035,6 +45460,9 @@
|
|
|
45035
45460
|
}
|
|
45036
45461
|
});
|
|
45037
45462
|
}); };
|
|
45463
|
+
_this.users.assigner = 0;
|
|
45464
|
+
_this.users.assignee = 0;
|
|
45465
|
+
_this.users.relatedUsers = [];
|
|
45038
45466
|
return _this;
|
|
45039
45467
|
}
|
|
45040
45468
|
Object.defineProperty(BaseCongViecFormComponent.prototype, "tenCongViec", {
|
|
@@ -45150,19 +45578,25 @@
|
|
|
45150
45578
|
});
|
|
45151
45579
|
});
|
|
45152
45580
|
};
|
|
45153
|
-
BaseCongViecFormComponent.prototype.onBeforeSave = function () {
|
|
45154
|
-
};
|
|
45155
45581
|
BaseCongViecFormComponent.prototype.onAfterSave = function (res) {
|
|
45156
45582
|
if (this.model.formState == exports.FormState.ADD && res && res.success && res.data) {
|
|
45157
45583
|
this.onAfterSaved.emit(res.data);
|
|
45158
45584
|
}
|
|
45159
45585
|
};
|
|
45586
|
+
BaseCongViecFormComponent.prototype.onTabChange = function (evt) {
|
|
45587
|
+
this.currentTabIndex = evt.index;
|
|
45588
|
+
this.users.taskName = this.model.data.ten;
|
|
45589
|
+
};
|
|
45590
|
+
BaseCongViecFormComponent.prototype.forcusToFirstInputControl = function (event) {
|
|
45591
|
+
event.preventDefault();
|
|
45592
|
+
this.context.fireEvent(ComCtxConstants.COMMON.FOCUS_TO_FIRST_INPUT_CONTROL);
|
|
45593
|
+
};
|
|
45160
45594
|
return BaseCongViecFormComponent;
|
|
45161
45595
|
}(DataFormBase));
|
|
45162
45596
|
BaseCongViecFormComponent.decorators = [
|
|
45163
45597
|
{ type: i0.Component, args: [{
|
|
45164
45598
|
selector: 'base-congviec-form',
|
|
45165
|
-
template: "<crud-form #crudForm [(data)]=\"model.data\" [setting]=\"setting\" [context]=\"context\" [disableCaching]=\"true\"\r\n
|
|
45599
|
+
template: "<crud-form #crudForm [(data)]=\"model.data\" [setting]=\"setting\" [context]=\"context\" [disableCaching]=\"true\"\r\n [autoFocus]=\"autoFocus\" (onFormReady)=\"_handleFormReady($event)\">\r\n</crud-form>\r\n<base-congviec-dinhkem [loadDetailFromQueryParam]=\"false\" [formState]=\"model.formState\" [taskId]=\"model.data.id\">\r\n</base-congviec-dinhkem>\r\n<div class=\"tab-child\">\r\n <tn-tabview [data]=\"tabDataChild\" (onTabChange)=\"onTabChange($event)\">\r\n <ng-template #fileDinhKem>\r\n <file-manager [loadDetailFromQueryParam]=\"false\" [serviceCode]=\"setting.baseService.serviceCode\"\r\n [entity]=\"setting.baseService.entityName\" [entityKey]=\"model.data.id\"\r\n [readonly]=\"model.formState == enumFormState.VIEW\">\r\n </file-manager>\r\n </ng-template>\r\n <ng-template #taskChild>\r\n <div style=\"height: 100%\">\r\n <base-congviec [loadDetailFromQueryParam]=\"false\" [isChildView]=\"true\" [formState]=\"model.formState\"\r\n [loaiDanhSach]=\"enumLoaiDanhSachCongViec.CongViecCon\" [idCongViec]=\"model.data.id\">\r\n </base-congviec>\r\n </div>\r\n </ng-template>\r\n <ng-template #taskLienQuan>\r\n <base-congviec [loadDetailFromQueryParam]=\"false\" [isChildView]=\"true\" [formState]=\"model.formState\"\r\n [loaiDanhSach]=\"enumLoaiDanhSachCongViec.CongViecLienQuan\" [idCongViec]=\"model.data.id\">\r\n </base-congviec>\r\n </ng-template>\r\n <ng-template #traoDoiCongViec>\r\n <div style=\"height: 350px;\">\r\n <chat-box [showSendMessageBox]=\"false\" [serviceCode]=\"'congviec'\" [entity]=\"'congviec'\"\r\n [taskId]=\"model.data.id\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [users]=\"users\"\r\n ></chat-box>\r\n </div>\r\n <chat-send-message-box [parentContext]=\"context\">\r\n </chat-send-message-box>\r\n </ng-template>\r\n </tn-tabview>\r\n</div>\r\n<ng-template #buttonTemplate>\r\n <button *ngIf=\"!model.data.__disableEdit && !__isFormView\" type=\"button\" pButton icon=\"pi pi-save\"\r\n class=\"p-button-text\" [label]=\"'FORM.SAVE' | translate\" (click)=\"_handleSave($event)\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'FORM.CANCEL' | translate\" preventTab (click)=\"_handleCancel($event)\"></button>\r\n</ng-template>\r\n",
|
|
45166
45600
|
providers: [ComponentContextService],
|
|
45167
45601
|
styles: [".tab-child{padding:1em}"]
|
|
45168
45602
|
},] }
|
|
@@ -45526,7 +45960,7 @@
|
|
|
45526
45960
|
_this.reload();
|
|
45527
45961
|
}
|
|
45528
45962
|
else {
|
|
45529
|
-
_this._notifierService.
|
|
45963
|
+
_this._notifierService.showWarningByResponse(response);
|
|
45530
45964
|
}
|
|
45531
45965
|
}, function (error) {
|
|
45532
45966
|
_this._notifierService.showDeleteDataError();
|
|
@@ -45540,7 +45974,7 @@
|
|
|
45540
45974
|
_this.reload();
|
|
45541
45975
|
}
|
|
45542
45976
|
else {
|
|
45543
|
-
_this._notifierService.
|
|
45977
|
+
_this._notifierService.showWarningByResponse(response);
|
|
45544
45978
|
}
|
|
45545
45979
|
}, function (error) {
|
|
45546
45980
|
_this._notifierService.showDeleteDataError();
|
|
@@ -47460,6 +47894,1368 @@
|
|
|
47460
47894
|
{ type: UserService }
|
|
47461
47895
|
]; };
|
|
47462
47896
|
|
|
47897
|
+
var ServiceRequestModel = /** @class */ (function () {
|
|
47898
|
+
function ServiceRequestModel(init) {
|
|
47899
|
+
this.service = '';
|
|
47900
|
+
this.entityInstanceId = '';
|
|
47901
|
+
this.parent = null;
|
|
47902
|
+
this.serviceCode = '';
|
|
47903
|
+
this.entity = '';
|
|
47904
|
+
this.entityKey = '';
|
|
47905
|
+
for (var key in init) {
|
|
47906
|
+
this[key] = init[key];
|
|
47907
|
+
}
|
|
47908
|
+
}
|
|
47909
|
+
return ServiceRequestModel;
|
|
47910
|
+
}());
|
|
47911
|
+
|
|
47912
|
+
var ContentsService = /** @class */ (function (_super) {
|
|
47913
|
+
__extends(ContentsService, _super);
|
|
47914
|
+
function ContentsService(_injector, _httpClient, _moduleConfigService, _fileService) {
|
|
47915
|
+
var _this = _super.call(this, _httpClient, _injector, _moduleConfigService.getConfig().environment.apiDomain.chatEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/Contents") || this;
|
|
47916
|
+
_this._moduleConfigService = _moduleConfigService;
|
|
47917
|
+
_this._fileService = _fileService;
|
|
47918
|
+
_this.entityName = 'Contents';
|
|
47919
|
+
_this.serviceCode = 'chat';
|
|
47920
|
+
_this.endPoint = "" + _moduleConfigService.getConfig().environment.apiDomain.chatEndpoint;
|
|
47921
|
+
return _this;
|
|
47922
|
+
}
|
|
47923
|
+
ContentsService.prototype.getByService = function (model, page) {
|
|
47924
|
+
if (page === void 0) { page = 0; }
|
|
47925
|
+
var serviceCode = model.serviceCode, entity = model.entity, entityKey = model.entityKey;
|
|
47926
|
+
var url = this.serviceUri + "/GetByService?serviceCode=" + serviceCode + "&entity=" + entity + "&entityKey=" + entityKey + "&page=" + page;
|
|
47927
|
+
return this.defaultGet(url);
|
|
47928
|
+
};
|
|
47929
|
+
ContentsService.prototype.getByTaskId = function (model, taskId) {
|
|
47930
|
+
var serviceCode = model.serviceCode, entity = model.entity, entityKey = model.entityKey;
|
|
47931
|
+
var url = this.serviceUri + "/GetByTaskId?serviceCode=" + serviceCode + "&entity=" + entity + "&entityKey=" + entityKey + "&taskId=" + taskId;
|
|
47932
|
+
return this.defaultGet(url);
|
|
47933
|
+
};
|
|
47934
|
+
ContentsService.prototype.getContentById = function (data) {
|
|
47935
|
+
var url = this.serviceUri + "/GetByChatId/" + data.instanceId;
|
|
47936
|
+
if (data.page) {
|
|
47937
|
+
url += url + "?page=" + data.page;
|
|
47938
|
+
}
|
|
47939
|
+
return this.defaultGet(url);
|
|
47940
|
+
};
|
|
47941
|
+
ContentsService.prototype.sendMessage = function (messageContent) {
|
|
47942
|
+
var url = this.serviceUri + "/SendMessage";
|
|
47943
|
+
return this.defaultPost(url, messageContent);
|
|
47944
|
+
};
|
|
47945
|
+
ContentsService.prototype.markAsReadAllContents = function (chatId) {
|
|
47946
|
+
var url = this.serviceUri + "ReadInfo/MarkAsReadAllContents/" + chatId;
|
|
47947
|
+
return this.defaultPost(url, chatId);
|
|
47948
|
+
};
|
|
47949
|
+
return ContentsService;
|
|
47950
|
+
}(BaseService));
|
|
47951
|
+
ContentsService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ContentsService_Factory() { return new ContentsService(i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(FileExplorerService)); }, token: ContentsService, providedIn: "root" });
|
|
47952
|
+
ContentsService.decorators = [
|
|
47953
|
+
{ type: i0.Injectable, args: [{
|
|
47954
|
+
providedIn: 'root'
|
|
47955
|
+
},] }
|
|
47956
|
+
];
|
|
47957
|
+
ContentsService.ctorParameters = function () { return [
|
|
47958
|
+
{ type: i0.Injector },
|
|
47959
|
+
{ type: i1$1.HttpClient },
|
|
47960
|
+
{ type: ModuleConfigService },
|
|
47961
|
+
{ type: FileExplorerService }
|
|
47962
|
+
]; };
|
|
47963
|
+
|
|
47964
|
+
var StatusExtendsService = /** @class */ (function (_super) {
|
|
47965
|
+
__extends(StatusExtendsService, _super);
|
|
47966
|
+
function StatusExtendsService(_injector, _http, _moduleConfigService) {
|
|
47967
|
+
var _this = _super.call(this, _http, _injector, _moduleConfigService.getConfig().environment.apiDomain.chatEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/StatusExtends") || this;
|
|
47968
|
+
_this._moduleConfigService = _moduleConfigService;
|
|
47969
|
+
_this.entityName = 'StatusExtends';
|
|
47970
|
+
_this.serviceCode = 'chat';
|
|
47971
|
+
_this.endPoint = "" + _moduleConfigService.getConfig().environment.apiDomain.chatEndpoint;
|
|
47972
|
+
return _this;
|
|
47973
|
+
}
|
|
47974
|
+
StatusExtendsService.prototype.insertUserOnline = function (chatId) {
|
|
47975
|
+
var statusExtends = { chatId: chatId };
|
|
47976
|
+
var url = this.serviceUri + "/InsertUserOnline";
|
|
47977
|
+
return this.defaultPost(url, statusExtends);
|
|
47978
|
+
};
|
|
47979
|
+
StatusExtendsService.prototype.removeUserOnline = function (id) {
|
|
47980
|
+
return this.deleteById(id);
|
|
47981
|
+
};
|
|
47982
|
+
return StatusExtendsService;
|
|
47983
|
+
}(BaseService));
|
|
47984
|
+
StatusExtendsService.ɵprov = i0.ɵɵdefineInjectable({ factory: function StatusExtendsService_Factory() { return new StatusExtendsService(i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(ModuleConfigService)); }, token: StatusExtendsService, providedIn: "root" });
|
|
47985
|
+
StatusExtendsService.decorators = [
|
|
47986
|
+
{ type: i0.Injectable, args: [{
|
|
47987
|
+
providedIn: 'root'
|
|
47988
|
+
},] }
|
|
47989
|
+
];
|
|
47990
|
+
StatusExtendsService.ctorParameters = function () { return [
|
|
47991
|
+
{ type: i0.Injector },
|
|
47992
|
+
{ type: i1$1.HttpClient },
|
|
47993
|
+
{ type: ModuleConfigService }
|
|
47994
|
+
]; };
|
|
47995
|
+
|
|
47996
|
+
var ChatService = /** @class */ (function (_super) {
|
|
47997
|
+
__extends(ChatService, _super);
|
|
47998
|
+
function ChatService(_injector, _httpClient, _moduleConfigService, _folderService, _myDriveService, _fileService, _contentService, _statusService) {
|
|
47999
|
+
var _this = _super.call(this, _httpClient, _injector, _moduleConfigService.getConfig().environment.apiDomain.chatEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/Instances") || this;
|
|
48000
|
+
_this._moduleConfigService = _moduleConfigService;
|
|
48001
|
+
_this._folderService = _folderService;
|
|
48002
|
+
_this._myDriveService = _myDriveService;
|
|
48003
|
+
_this._fileService = _fileService;
|
|
48004
|
+
_this._contentService = _contentService;
|
|
48005
|
+
_this._statusService = _statusService;
|
|
48006
|
+
_this.entityName = 'Instances';
|
|
48007
|
+
_this.serviceCode = 'chat';
|
|
48008
|
+
_this.SERVICE = 'chat';
|
|
48009
|
+
_this.ENTITY_CONTENT = 'contents';
|
|
48010
|
+
_this.endPoint = "" + _moduleConfigService.getConfig().environment.apiDomain.chatEndpoint;
|
|
48011
|
+
return _this;
|
|
48012
|
+
}
|
|
48013
|
+
ChatService.prototype.getListAttachment = function (id) {
|
|
48014
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48015
|
+
var request;
|
|
48016
|
+
return __generator(this, function (_a) {
|
|
48017
|
+
request = new ServiceRequestModel({
|
|
48018
|
+
service: this.SERVICE,
|
|
48019
|
+
serviceCode: this.SERVICE,
|
|
48020
|
+
entity: this.ENTITY_CONTENT,
|
|
48021
|
+
entityInstanceId: id,
|
|
48022
|
+
entityKey: 'id',
|
|
48023
|
+
});
|
|
48024
|
+
// const result = await this._folderService.getServiceFolderId(request);
|
|
48025
|
+
// if (!result.success || !result.data) {
|
|
48026
|
+
// return [];
|
|
48027
|
+
// }
|
|
48028
|
+
// const folder = await this._folderService.getDetail(result.data);
|
|
48029
|
+
// // const folder = await this._myDriveService.getByFolderId(result.data);
|
|
48030
|
+
// if (result.success) {
|
|
48031
|
+
// if (folder.data.length > 0) {
|
|
48032
|
+
// return folder.data.map(x => {
|
|
48033
|
+
// const item = <any>{
|
|
48034
|
+
// id: x.id,
|
|
48035
|
+
// fileName: x.name,
|
|
48036
|
+
// type: this._commonService.isImage(x.name) ? 'image' : ''
|
|
48037
|
+
// };
|
|
48038
|
+
//
|
|
48039
|
+
// item.url = this._fileService.getFileDownloadUrl(x.id);
|
|
48040
|
+
//
|
|
48041
|
+
// return item;
|
|
48042
|
+
// });
|
|
48043
|
+
// }
|
|
48044
|
+
// }
|
|
48045
|
+
return [2 /*return*/, []];
|
|
48046
|
+
});
|
|
48047
|
+
});
|
|
48048
|
+
};
|
|
48049
|
+
ChatService.prototype.getChatId = function (model) {
|
|
48050
|
+
var serviceCode = model.serviceCode, entity = model.entity, entityKey = model.entityKey;
|
|
48051
|
+
var url = this.serviceUri + "/GetIdByService?serviceCode=" + serviceCode + "&entity=" + entity + "&entityKey=" + entityKey;
|
|
48052
|
+
return this.defaultGet(url);
|
|
48053
|
+
};
|
|
48054
|
+
ChatService.prototype.getChatIdByTask = function (serviceRequest, taskId) {
|
|
48055
|
+
var serviceCode = serviceRequest.serviceCode, entity = serviceRequest.entity, entityKey = serviceRequest.entityKey;
|
|
48056
|
+
var url = this.serviceUri + "/GetIdByTaskId?serviceCode=" + serviceCode + "&entity=" + entity + "&entityKey=" + entityKey + "&taskId=" + taskId;
|
|
48057
|
+
return this.defaultGet(url);
|
|
48058
|
+
};
|
|
48059
|
+
ChatService.prototype.getByService = function (model, page) {
|
|
48060
|
+
if (page === void 0) { page = 0; }
|
|
48061
|
+
return this._contentService.getByService(model, page);
|
|
48062
|
+
};
|
|
48063
|
+
ChatService.prototype.getContentByTaskId = function (serviceRequest, taskId) {
|
|
48064
|
+
return this._contentService.getByTaskId(serviceRequest, taskId);
|
|
48065
|
+
};
|
|
48066
|
+
ChatService.prototype.markAsReadAllContents = function (chatId) {
|
|
48067
|
+
return this._contentService.markAsReadAllContents(chatId);
|
|
48068
|
+
};
|
|
48069
|
+
ChatService.prototype.sendMessage = function (messageContent) {
|
|
48070
|
+
return this._contentService.sendMessage(messageContent);
|
|
48071
|
+
};
|
|
48072
|
+
ChatService.prototype.insertUserOnline = function (chatId) {
|
|
48073
|
+
return this._statusService.insertUserOnline(chatId);
|
|
48074
|
+
};
|
|
48075
|
+
ChatService.prototype.removeUserOnline = function (id) {
|
|
48076
|
+
return this._statusService.removeUserOnline(id);
|
|
48077
|
+
};
|
|
48078
|
+
return ChatService;
|
|
48079
|
+
}(BaseService));
|
|
48080
|
+
ChatService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ChatService_Factory() { return new ChatService(i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(FolderService), i0.ɵɵinject(MyDriveService), i0.ɵɵinject(FileExplorerService), i0.ɵɵinject(ContentsService), i0.ɵɵinject(StatusExtendsService)); }, token: ChatService, providedIn: "root" });
|
|
48081
|
+
ChatService.decorators = [
|
|
48082
|
+
{ type: i0.Injectable, args: [{
|
|
48083
|
+
providedIn: 'root'
|
|
48084
|
+
},] }
|
|
48085
|
+
];
|
|
48086
|
+
ChatService.ctorParameters = function () { return [
|
|
48087
|
+
{ type: i0.Injector },
|
|
48088
|
+
{ type: i1$1.HttpClient },
|
|
48089
|
+
{ type: ModuleConfigService },
|
|
48090
|
+
{ type: FolderService },
|
|
48091
|
+
{ type: MyDriveService },
|
|
48092
|
+
{ type: FileExplorerService },
|
|
48093
|
+
{ type: ContentsService },
|
|
48094
|
+
{ type: StatusExtendsService }
|
|
48095
|
+
]; };
|
|
48096
|
+
|
|
48097
|
+
var MessageBoardService = /** @class */ (function (_super) {
|
|
48098
|
+
__extends(MessageBoardService, _super);
|
|
48099
|
+
function MessageBoardService(_injector, _http, _moduleConfigService) {
|
|
48100
|
+
var _this = _super.call(this, _http, _injector, _moduleConfigService.getConfig().environment.apiDomain.chatEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/MessageBoards") || this;
|
|
48101
|
+
_this._moduleConfigService = _moduleConfigService;
|
|
48102
|
+
_this.entityName = 'MessageBoards';
|
|
48103
|
+
_this.serviceCode = 'chat';
|
|
48104
|
+
_this.endPoint = "" + _this._moduleConfigService.getConfig().environment.apiDomain.chatEndpoint;
|
|
48105
|
+
return _this;
|
|
48106
|
+
}
|
|
48107
|
+
MessageBoardService.prototype.pinMessage = function (messageId, pinned, correlationId) {
|
|
48108
|
+
var url = this.serviceUri + "/PinnedMessage";
|
|
48109
|
+
return this.defaultPost(url, { pinned: pinned, id: messageId, correlationId: correlationId });
|
|
48110
|
+
};
|
|
48111
|
+
MessageBoardService.prototype.getLatestPinnedMessage = function (chatId) {
|
|
48112
|
+
var url = this.serviceUri + "/GetLatestPinnedMessage?chatId=" + chatId;
|
|
48113
|
+
return this.defaultGet(url);
|
|
48114
|
+
};
|
|
48115
|
+
MessageBoardService.prototype.getListPinnedMessage = function (chatId) {
|
|
48116
|
+
var url = this.serviceUri + "/GetListPinnedMessage?chatId=" + chatId;
|
|
48117
|
+
return this.defaultGet(url);
|
|
48118
|
+
};
|
|
48119
|
+
return MessageBoardService;
|
|
48120
|
+
}(BaseService));
|
|
48121
|
+
MessageBoardService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MessageBoardService_Factory() { return new MessageBoardService(i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(ModuleConfigService)); }, token: MessageBoardService, providedIn: "root" });
|
|
48122
|
+
MessageBoardService.decorators = [
|
|
48123
|
+
{ type: i0.Injectable, args: [{
|
|
48124
|
+
providedIn: 'root'
|
|
48125
|
+
},] }
|
|
48126
|
+
];
|
|
48127
|
+
MessageBoardService.ctorParameters = function () { return [
|
|
48128
|
+
{ type: i0.Injector },
|
|
48129
|
+
{ type: i1$1.HttpClient },
|
|
48130
|
+
{ type: ModuleConfigService }
|
|
48131
|
+
]; };
|
|
48132
|
+
|
|
48133
|
+
var CheckControlVisibleService = /** @class */ (function () {
|
|
48134
|
+
function CheckControlVisibleService() {
|
|
48135
|
+
}
|
|
48136
|
+
CheckControlVisibleService.prototype.checkDisplayStatus = function (elem) {
|
|
48137
|
+
var _this = this;
|
|
48138
|
+
return new Promise(function (resolve, reject) {
|
|
48139
|
+
_this.doCheck(resolve, elem);
|
|
48140
|
+
});
|
|
48141
|
+
};
|
|
48142
|
+
CheckControlVisibleService.prototype.doCheck = function (resolve, elem) {
|
|
48143
|
+
var _this = this;
|
|
48144
|
+
var timeoutCheckDisplayStatus;
|
|
48145
|
+
timeoutCheckDisplayStatus = setTimeout(function () {
|
|
48146
|
+
_this.doCheck(resolve, elem);
|
|
48147
|
+
}, 100);
|
|
48148
|
+
var newStatus = this.isVisible(elem);
|
|
48149
|
+
if (newStatus) {
|
|
48150
|
+
setTimeout(function () {
|
|
48151
|
+
// show control
|
|
48152
|
+
resolve(true);
|
|
48153
|
+
});
|
|
48154
|
+
clearTimeout(timeoutCheckDisplayStatus);
|
|
48155
|
+
}
|
|
48156
|
+
};
|
|
48157
|
+
CheckControlVisibleService.prototype.isVisible = function (elem) {
|
|
48158
|
+
var style = getComputedStyle(elem);
|
|
48159
|
+
if (style.display === 'none')
|
|
48160
|
+
return false;
|
|
48161
|
+
if (style.visibility !== 'visible')
|
|
48162
|
+
return false;
|
|
48163
|
+
if (+style.opacity < 0.1)
|
|
48164
|
+
return false;
|
|
48165
|
+
if (elem.offsetWidth + elem.offsetHeight + elem.getBoundingClientRect().height +
|
|
48166
|
+
elem.getBoundingClientRect().width === 0) {
|
|
48167
|
+
return false;
|
|
48168
|
+
}
|
|
48169
|
+
var elemCenter = {
|
|
48170
|
+
x: elem.getBoundingClientRect().left + elem.offsetWidth / 2,
|
|
48171
|
+
y: elem.getBoundingClientRect().top + elem.offsetHeight / 2
|
|
48172
|
+
};
|
|
48173
|
+
var pointContainer = document.elementFromPoint(elemCenter.x, elemCenter.y);
|
|
48174
|
+
if (pointContainer) {
|
|
48175
|
+
do {
|
|
48176
|
+
if (pointContainer === elem)
|
|
48177
|
+
return true;
|
|
48178
|
+
} while (pointContainer = pointContainer.parentNode);
|
|
48179
|
+
}
|
|
48180
|
+
return false;
|
|
48181
|
+
};
|
|
48182
|
+
return CheckControlVisibleService;
|
|
48183
|
+
}());
|
|
48184
|
+
CheckControlVisibleService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CheckControlVisibleService_Factory() { return new CheckControlVisibleService(); }, token: CheckControlVisibleService, providedIn: "root" });
|
|
48185
|
+
CheckControlVisibleService.decorators = [
|
|
48186
|
+
{ type: i0.Injectable, args: [{
|
|
48187
|
+
providedIn: 'root'
|
|
48188
|
+
},] }
|
|
48189
|
+
];
|
|
48190
|
+
CheckControlVisibleService.ctorParameters = function () { return []; };
|
|
48191
|
+
|
|
48192
|
+
var NEW_MESSAGE = 'NewMessage';
|
|
48193
|
+
var PINNED_CHANGED = 'PinnedChanged';
|
|
48194
|
+
var NotificationType;
|
|
48195
|
+
(function (NotificationType) {
|
|
48196
|
+
NotificationType[NotificationType["NewMessage"] = 0] = "NewMessage";
|
|
48197
|
+
NotificationType[NotificationType["PinnedChanged"] = 1] = "PinnedChanged";
|
|
48198
|
+
})(NotificationType || (NotificationType = {}));
|
|
48199
|
+
var MessageType;
|
|
48200
|
+
(function (MessageType) {
|
|
48201
|
+
MessageType[MessageType["TEXT"] = 0] = "TEXT";
|
|
48202
|
+
MessageType[MessageType["FILE"] = 1] = "FILE";
|
|
48203
|
+
})(MessageType || (MessageType = {}));
|
|
48204
|
+
|
|
48205
|
+
// fix for build prod
|
|
48206
|
+
var moment$1 = moment___namespace;
|
|
48207
|
+
var ChatBoxComponent = /** @class */ (function (_super) {
|
|
48208
|
+
__extends(ChatBoxComponent, _super);
|
|
48209
|
+
function ChatBoxComponent(injector, _chatService, _messageBoardService, _userService, _checkControlVisible, _signalrService, _fileService, _crudService, _notifierService, _moduleConfigService) {
|
|
48210
|
+
var _this = _super.call(this, injector) || this;
|
|
48211
|
+
_this._chatService = _chatService;
|
|
48212
|
+
_this._messageBoardService = _messageBoardService;
|
|
48213
|
+
_this._userService = _userService;
|
|
48214
|
+
_this._checkControlVisible = _checkControlVisible;
|
|
48215
|
+
_this._signalrService = _signalrService;
|
|
48216
|
+
_this._fileService = _fileService;
|
|
48217
|
+
_this._crudService = _crudService;
|
|
48218
|
+
_this._notifierService = _notifierService;
|
|
48219
|
+
_this._moduleConfigService = _moduleConfigService;
|
|
48220
|
+
_this.showSendMessageBox = true;
|
|
48221
|
+
_this.userPickerForm = {
|
|
48222
|
+
selectedValue: [],
|
|
48223
|
+
data: null,
|
|
48224
|
+
};
|
|
48225
|
+
_this.topic = '';
|
|
48226
|
+
_this.firstTime = true;
|
|
48227
|
+
_this.multiple = true;
|
|
48228
|
+
_this.showAddNoteForm = false;
|
|
48229
|
+
_this.fileApi = '';
|
|
48230
|
+
_this.peopleAll = [];
|
|
48231
|
+
_this.correlationIds = [];
|
|
48232
|
+
_this.attachments = [];
|
|
48233
|
+
_this.image = '';
|
|
48234
|
+
_this.peopleAllUsers = [];
|
|
48235
|
+
_this.peopleRelatedUsers = [];
|
|
48236
|
+
_this.editFormModel = {};
|
|
48237
|
+
_this._moduleConfig = _this._moduleConfigService.getConfig();
|
|
48238
|
+
_this.environment = _this._moduleConfig.environment;
|
|
48239
|
+
_this.defaultAvatar = _this.environment.appMetadata.main.defaultMaleAvatar;
|
|
48240
|
+
_this.fileApi = _this.environment.apiDomain.fileEndpoint;
|
|
48241
|
+
_this.model.userPickerForm = { popupSize: PopupSize, data: {} };
|
|
48242
|
+
_this.model.quickNoteForm = { popupSize: {}, data: {} };
|
|
48243
|
+
_this.context.subscribe('QUICK_NOTE_POPUP.CLOSE_POPUP', function (response) {
|
|
48244
|
+
_this.model.editFormModel.showQuickNoteForm = false;
|
|
48245
|
+
});
|
|
48246
|
+
return _this;
|
|
48247
|
+
}
|
|
48248
|
+
ChatBoxComponent.prototype.updateUsers = function (assignee, assigner, relatedUser) {
|
|
48249
|
+
this.assignee = assignee;
|
|
48250
|
+
this.assigner = assigner;
|
|
48251
|
+
this.relatedUser = relatedUser;
|
|
48252
|
+
var all = [];
|
|
48253
|
+
all.push(assignee);
|
|
48254
|
+
all.push(assigner);
|
|
48255
|
+
if (this.relatedUser.length > 0) {
|
|
48256
|
+
all = all.concat(relatedUser);
|
|
48257
|
+
}
|
|
48258
|
+
this.peopleAll = all.filter(function (x, i, a) { return a.indexOf(x) == i; });
|
|
48259
|
+
};
|
|
48260
|
+
ChatBoxComponent.prototype.ngOnInit = function () {
|
|
48261
|
+
var _this = this;
|
|
48262
|
+
this.initClassVar();
|
|
48263
|
+
this.getMessages(null);
|
|
48264
|
+
this._chatService.getChatIdByTask(this.serviceRequestModel, this.taskId).then(function (rs) {
|
|
48265
|
+
if (!rs.success)
|
|
48266
|
+
_this._notifierService.showWarning(rs.message);
|
|
48267
|
+
if (!rs.data)
|
|
48268
|
+
return;
|
|
48269
|
+
_this.model.id = rs.data;
|
|
48270
|
+
_this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_INSTANCE_ID_LOADED, _this.model.id);
|
|
48271
|
+
_this.topic = "chat." + _this.model.id;
|
|
48272
|
+
_this._signalrService.start(null, _this.topic, function (data) { return _this.handleChanges(data); });
|
|
48273
|
+
// get pinned message
|
|
48274
|
+
if (_this.model.id) {
|
|
48275
|
+
_this._messageBoardService.getLatestPinnedMessage(_this.model.id).then(function (rs) {
|
|
48276
|
+
if (rs.data) {
|
|
48277
|
+
_this.model.pinnedMessage = rs.data.content;
|
|
48278
|
+
}
|
|
48279
|
+
});
|
|
48280
|
+
}
|
|
48281
|
+
});
|
|
48282
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENDING, function (data) { return __awaiter(_this, void 0, void 0, function () {
|
|
48283
|
+
var temp;
|
|
48284
|
+
return __generator(this, function (_c) {
|
|
48285
|
+
switch (_c.label) {
|
|
48286
|
+
case 0:
|
|
48287
|
+
this.model.correlationIds.push(data.message.correlationId);
|
|
48288
|
+
if (data.attachments && data.attachments.length > 0) {
|
|
48289
|
+
data.attachments = data.attachments.map(function (x) {
|
|
48290
|
+
x.url = null;
|
|
48291
|
+
return x;
|
|
48292
|
+
});
|
|
48293
|
+
}
|
|
48294
|
+
return [4 /*yield*/, this.appendMessage(data.message.messageContent, 'own', 'sending', this.currentUser.userName, data.attachments, data.message.correlationId, false)];
|
|
48295
|
+
case 1:
|
|
48296
|
+
temp = _c.sent();
|
|
48297
|
+
console.log(temp);
|
|
48298
|
+
return [2 /*return*/];
|
|
48299
|
+
}
|
|
48300
|
+
});
|
|
48301
|
+
}); });
|
|
48302
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENT, function (data) {
|
|
48303
|
+
});
|
|
48304
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_LOAD_MORE, function (data) {
|
|
48305
|
+
// this.getMessages(this.model.createdFrom);
|
|
48306
|
+
});
|
|
48307
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_SCROLLING, function (scrolling) {
|
|
48308
|
+
if (scrolling) {
|
|
48309
|
+
_this.model.scrolling = true;
|
|
48310
|
+
}
|
|
48311
|
+
else {
|
|
48312
|
+
_this.model.scrolling = false;
|
|
48313
|
+
_this.model.newMessageNotUpdatedCount = 0;
|
|
48314
|
+
}
|
|
48315
|
+
});
|
|
48316
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE_NOT_UPDATED, function (count) {
|
|
48317
|
+
_this.model.scrolling = count !== 0;
|
|
48318
|
+
_this.model.newMessageNotUpdatedCount = count;
|
|
48319
|
+
});
|
|
48320
|
+
this.context.subscribe('CLOSE_POPUP', function (rs) {
|
|
48321
|
+
_this.model.userPickerForm.show = false;
|
|
48322
|
+
_this.parentContext.fireEvent('TASK.RELATED_USER_CHANGED', rs);
|
|
48323
|
+
});
|
|
48324
|
+
this.parentContext.subscribe('TASK.DATA_CHANGED', function (rs) {
|
|
48325
|
+
_this.updateUsers(rs.assignee, rs.assigner, rs.relatedUser);
|
|
48326
|
+
});
|
|
48327
|
+
};
|
|
48328
|
+
ChatBoxComponent.prototype.handleChanges = function (data) {
|
|
48329
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48330
|
+
var newMessage, _c, ind;
|
|
48331
|
+
return __generator(this, function (_d) {
|
|
48332
|
+
switch (_d.label) {
|
|
48333
|
+
case 0:
|
|
48334
|
+
newMessage = JSON.parse(data);
|
|
48335
|
+
if (!newMessage || !newMessage.data) {
|
|
48336
|
+
this._notifierService.showWarning('SYS_ERR_DEV: Lỗi SignalR');
|
|
48337
|
+
return [2 /*return*/];
|
|
48338
|
+
}
|
|
48339
|
+
_c = newMessage.notificationType;
|
|
48340
|
+
switch (_c) {
|
|
48341
|
+
case NotificationType.NewMessage: return [3 /*break*/, 1];
|
|
48342
|
+
case NEW_MESSAGE: return [3 /*break*/, 1];
|
|
48343
|
+
case NotificationType.PinnedChanged: return [3 /*break*/, 3];
|
|
48344
|
+
case PINNED_CHANGED: return [3 /*break*/, 3];
|
|
48345
|
+
}
|
|
48346
|
+
return [3 /*break*/, 7];
|
|
48347
|
+
case 1: return [4 /*yield*/, this.handleNewMessageNotification(newMessage.data)];
|
|
48348
|
+
case 2:
|
|
48349
|
+
_d.sent();
|
|
48350
|
+
return [3 /*break*/, 7];
|
|
48351
|
+
case 3:
|
|
48352
|
+
ind = this.model.correlationIds.findIndex(function (x) { return x == newMessage.correlationId; });
|
|
48353
|
+
if (!(ind > -1)) return [3 /*break*/, 4];
|
|
48354
|
+
this.model.correlationIds.splice(ind, 1);
|
|
48355
|
+
return [3 /*break*/, 6];
|
|
48356
|
+
case 4: return [4 /*yield*/, this.handlePinnedChangeNotification(newMessage.data)];
|
|
48357
|
+
case 5:
|
|
48358
|
+
_d.sent();
|
|
48359
|
+
_d.label = 6;
|
|
48360
|
+
case 6: return [3 /*break*/, 7];
|
|
48361
|
+
case 7: return [2 /*return*/];
|
|
48362
|
+
}
|
|
48363
|
+
});
|
|
48364
|
+
});
|
|
48365
|
+
};
|
|
48366
|
+
ChatBoxComponent.prototype.initClassVar = function () {
|
|
48367
|
+
var _this = this;
|
|
48368
|
+
this.fileViewerModel = {
|
|
48369
|
+
data: {},
|
|
48370
|
+
showEditForm: false,
|
|
48371
|
+
};
|
|
48372
|
+
this.userPickerControl = new UserPickerControlSchema({
|
|
48373
|
+
field: 'id',
|
|
48374
|
+
label: '',
|
|
48375
|
+
fullLabel: '',
|
|
48376
|
+
multiple: true,
|
|
48377
|
+
hiddenCheck: function () { return _this.userPickerForm.show; },
|
|
48378
|
+
});
|
|
48379
|
+
this.serviceRequestModel = {
|
|
48380
|
+
service: this.serviceCode,
|
|
48381
|
+
serviceCode: this.serviceCode,
|
|
48382
|
+
entity: this.entity,
|
|
48383
|
+
entityKey: 'id',
|
|
48384
|
+
entityInstanceId: this.taskId
|
|
48385
|
+
};
|
|
48386
|
+
this.model.dataSource = [];
|
|
48387
|
+
this.model.correlationIds = [];
|
|
48388
|
+
this.model.attachments = [];
|
|
48389
|
+
this.model.maxFileSize = 3000000;
|
|
48390
|
+
this.model.img = {};
|
|
48391
|
+
this.currentUser = this._userService.getCurrentUser();
|
|
48392
|
+
this.peopleAllUsers = [];
|
|
48393
|
+
this.peopleRelatedUsers = [];
|
|
48394
|
+
this.model.editFormModel = [];
|
|
48395
|
+
if (this.users) {
|
|
48396
|
+
this.model.taskName = this.users.taskName;
|
|
48397
|
+
this.updateUsers(this.users.assignee, this.users.assigner, this.users.relatedUsers);
|
|
48398
|
+
this.getRelatedUserInfo();
|
|
48399
|
+
}
|
|
48400
|
+
};
|
|
48401
|
+
ChatBoxComponent.prototype.getRelatedUserInfo = function () {
|
|
48402
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48403
|
+
var peopleRelatedUsers, peopleRelatedUsers_1, peopleRelatedUsers_1_1, item;
|
|
48404
|
+
var e_1, _c;
|
|
48405
|
+
return __generator(this, function (_d) {
|
|
48406
|
+
switch (_d.label) {
|
|
48407
|
+
case 0: return [4 /*yield*/, this._userService.getBasicUsersInfo(this.relatedUser.join())];
|
|
48408
|
+
case 1:
|
|
48409
|
+
peopleRelatedUsers = _d.sent();
|
|
48410
|
+
if (peopleRelatedUsers == null || peopleRelatedUsers.length == 0) {
|
|
48411
|
+
return [2 /*return*/];
|
|
48412
|
+
}
|
|
48413
|
+
try {
|
|
48414
|
+
for (peopleRelatedUsers_1 = __values(peopleRelatedUsers), peopleRelatedUsers_1_1 = peopleRelatedUsers_1.next(); !peopleRelatedUsers_1_1.done; peopleRelatedUsers_1_1 = peopleRelatedUsers_1.next()) {
|
|
48415
|
+
item = peopleRelatedUsers_1_1.value;
|
|
48416
|
+
this.peopleRelatedUsers.push({
|
|
48417
|
+
title: item.fullName,
|
|
48418
|
+
label: item.fullName,
|
|
48419
|
+
value: item.id
|
|
48420
|
+
});
|
|
48421
|
+
}
|
|
48422
|
+
}
|
|
48423
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
48424
|
+
finally {
|
|
48425
|
+
try {
|
|
48426
|
+
if (peopleRelatedUsers_1_1 && !peopleRelatedUsers_1_1.done && (_c = peopleRelatedUsers_1.return)) _c.call(peopleRelatedUsers_1);
|
|
48427
|
+
}
|
|
48428
|
+
finally { if (e_1) throw e_1.error; }
|
|
48429
|
+
}
|
|
48430
|
+
return [2 /*return*/];
|
|
48431
|
+
}
|
|
48432
|
+
});
|
|
48433
|
+
});
|
|
48434
|
+
};
|
|
48435
|
+
ChatBoxComponent.prototype.handlePinnedChangeNotification = function (data) {
|
|
48436
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48437
|
+
return __generator(this, function (_c) {
|
|
48438
|
+
if (data.pinned) {
|
|
48439
|
+
this.model.pinnedMessage = data.message;
|
|
48440
|
+
}
|
|
48441
|
+
else {
|
|
48442
|
+
this.model.pinnedMessage = null;
|
|
48443
|
+
}
|
|
48444
|
+
return [2 /*return*/];
|
|
48445
|
+
});
|
|
48446
|
+
});
|
|
48447
|
+
};
|
|
48448
|
+
ChatBoxComponent.prototype.handleNewMessageNotification = function (newMessage) {
|
|
48449
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48450
|
+
var ind, _c;
|
|
48451
|
+
return __generator(this, function (_d) {
|
|
48452
|
+
switch (_d.label) {
|
|
48453
|
+
case 0:
|
|
48454
|
+
ind = this.model.correlationIds.findIndex(function (x) { return x == newMessage.correlationId; });
|
|
48455
|
+
if (!(newMessage.messageType == MessageType.FILE)) return [3 /*break*/, 2];
|
|
48456
|
+
_c = newMessage;
|
|
48457
|
+
return [4 /*yield*/, this._chatService.getListAttachment(newMessage.id)];
|
|
48458
|
+
case 1:
|
|
48459
|
+
_c.attachments = _d.sent();
|
|
48460
|
+
_d.label = 2;
|
|
48461
|
+
case 2:
|
|
48462
|
+
if (!(ind === -1)) return [3 /*break*/, 4];
|
|
48463
|
+
return [4 /*yield*/, this.appendMessage(newMessage.content, this.getTypeOfMessage(newMessage.createdBy), 'received', newMessage.createdBy, newMessage.attachments, '', true)];
|
|
48464
|
+
case 3:
|
|
48465
|
+
_d.sent();
|
|
48466
|
+
return [3 /*break*/, 5];
|
|
48467
|
+
case 4:
|
|
48468
|
+
this.updateMessage(newMessage.correlationId, newMessage);
|
|
48469
|
+
this.model.correlationIds.splice(ind, 1);
|
|
48470
|
+
_d.label = 5;
|
|
48471
|
+
case 5: return [2 /*return*/];
|
|
48472
|
+
}
|
|
48473
|
+
});
|
|
48474
|
+
});
|
|
48475
|
+
};
|
|
48476
|
+
ChatBoxComponent.prototype.getMessages = function (createdFrom) {
|
|
48477
|
+
var _this = this;
|
|
48478
|
+
this._chatService.getContentByTaskId(this.serviceRequestModel, this.taskId).then(function (rs) { return __awaiter(_this, void 0, void 0, function () {
|
|
48479
|
+
var currentUserName, nearByCreated, index, userNames, _c, _d, item, _e, e_2_1, userInfos, _loop_1, _f, _g, item;
|
|
48480
|
+
var e_2, _h, e_3, _j;
|
|
48481
|
+
return __generator(this, function (_k) {
|
|
48482
|
+
switch (_k.label) {
|
|
48483
|
+
case 0:
|
|
48484
|
+
currentUserName = this.currentUser.userName;
|
|
48485
|
+
nearByCreated = '';
|
|
48486
|
+
index = 0;
|
|
48487
|
+
userNames = '';
|
|
48488
|
+
if (!rs.success) {
|
|
48489
|
+
return [2 /*return*/, this._notifierService.showWarning(rs.message)];
|
|
48490
|
+
}
|
|
48491
|
+
_k.label = 1;
|
|
48492
|
+
case 1:
|
|
48493
|
+
_k.trys.push([1, 7, 8, 9]);
|
|
48494
|
+
_c = __values(rs.data), _d = _c.next();
|
|
48495
|
+
_k.label = 2;
|
|
48496
|
+
case 2:
|
|
48497
|
+
if (!!_d.done) return [3 /*break*/, 6];
|
|
48498
|
+
item = _d.value;
|
|
48499
|
+
if (item.createdBy && item.createdBy != '')
|
|
48500
|
+
userNames += "" + (index == 0 ? '' : ',') + item.createdBy;
|
|
48501
|
+
if (index === 0)
|
|
48502
|
+
this.model.createdFrom = item.created;
|
|
48503
|
+
item.type = item.createdBy === currentUserName ? 'own' : 'from';
|
|
48504
|
+
if (!(item.messageType === MessageType.FILE)) return [3 /*break*/, 4];
|
|
48505
|
+
_e = item;
|
|
48506
|
+
return [4 /*yield*/, this._chatService.getListAttachment(item.id)];
|
|
48507
|
+
case 3:
|
|
48508
|
+
_e.attachments = _k.sent();
|
|
48509
|
+
_k.label = 4;
|
|
48510
|
+
case 4:
|
|
48511
|
+
item.isLastMessageFlow = false;
|
|
48512
|
+
if (item.createdBy !== nearByCreated) {
|
|
48513
|
+
if (+item > -0) {
|
|
48514
|
+
rs.data[+item - 1].isLastMessageFlow = true;
|
|
48515
|
+
}
|
|
48516
|
+
nearByCreated = item.createdBy;
|
|
48517
|
+
item.isFirstMessageFlow = true;
|
|
48518
|
+
}
|
|
48519
|
+
else {
|
|
48520
|
+
item.isFirstMessageFlow = false;
|
|
48521
|
+
}
|
|
48522
|
+
if (+index === rs.data.length - 1)
|
|
48523
|
+
item.isLastMessageFlow = true;
|
|
48524
|
+
index++;
|
|
48525
|
+
_k.label = 5;
|
|
48526
|
+
case 5:
|
|
48527
|
+
_d = _c.next();
|
|
48528
|
+
return [3 /*break*/, 2];
|
|
48529
|
+
case 6: return [3 /*break*/, 9];
|
|
48530
|
+
case 7:
|
|
48531
|
+
e_2_1 = _k.sent();
|
|
48532
|
+
e_2 = { error: e_2_1 };
|
|
48533
|
+
return [3 /*break*/, 9];
|
|
48534
|
+
case 8:
|
|
48535
|
+
try {
|
|
48536
|
+
if (_d && !_d.done && (_h = _c.return)) _h.call(_c);
|
|
48537
|
+
}
|
|
48538
|
+
finally { if (e_2) throw e_2.error; }
|
|
48539
|
+
return [7 /*endfinally*/];
|
|
48540
|
+
case 9:
|
|
48541
|
+
if (createdFrom) {
|
|
48542
|
+
this.model.dataSource = __spread(rs.data, this.model.dataSource);
|
|
48543
|
+
}
|
|
48544
|
+
else {
|
|
48545
|
+
this.model.dataSource = rs.data;
|
|
48546
|
+
}
|
|
48547
|
+
if (!(userNames != '')) return [3 /*break*/, 11];
|
|
48548
|
+
return [4 /*yield*/, this._userService.getBasicUsersInfoByUserNames(userNames)];
|
|
48549
|
+
case 10:
|
|
48550
|
+
userInfos = _k.sent();
|
|
48551
|
+
if (userInfos != null) {
|
|
48552
|
+
_loop_1 = function (item) {
|
|
48553
|
+
var user = userInfos.find(function (x) { return x.userName == item.createdBy; });
|
|
48554
|
+
if (!user) {
|
|
48555
|
+
return "continue";
|
|
48556
|
+
}
|
|
48557
|
+
item.avatar = user.avatar;
|
|
48558
|
+
item.fullName = user.fullName;
|
|
48559
|
+
};
|
|
48560
|
+
try {
|
|
48561
|
+
for (_f = __values(this.model.dataSource), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
48562
|
+
item = _g.value;
|
|
48563
|
+
_loop_1(item);
|
|
48564
|
+
}
|
|
48565
|
+
}
|
|
48566
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
48567
|
+
finally {
|
|
48568
|
+
try {
|
|
48569
|
+
if (_g && !_g.done && (_j = _f.return)) _j.call(_f);
|
|
48570
|
+
}
|
|
48571
|
+
finally { if (e_3) throw e_3.error; }
|
|
48572
|
+
}
|
|
48573
|
+
}
|
|
48574
|
+
_k.label = 11;
|
|
48575
|
+
case 11:
|
|
48576
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_DATA_LOADED, true);
|
|
48577
|
+
return [2 /*return*/];
|
|
48578
|
+
}
|
|
48579
|
+
});
|
|
48580
|
+
}); });
|
|
48581
|
+
};
|
|
48582
|
+
ChatBoxComponent.prototype.scrollToBottom = function (speed, force, sent) {
|
|
48583
|
+
if (speed === void 0) { speed = 0; }
|
|
48584
|
+
if (force === void 0) { force = false; }
|
|
48585
|
+
if (!this.model.scrolling) {
|
|
48586
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE, { speed: speed, force: true });
|
|
48587
|
+
}
|
|
48588
|
+
else if (sent !== false) {
|
|
48589
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE, { speed: speed, force: force });
|
|
48590
|
+
}
|
|
48591
|
+
};
|
|
48592
|
+
ChatBoxComponent.prototype.appendMessage = function (message, type, status, createdBy, attachments, correlationId, sent) {
|
|
48593
|
+
if (attachments === void 0) { attachments = []; }
|
|
48594
|
+
if (correlationId === void 0) { correlationId = ''; }
|
|
48595
|
+
var _a, _b;
|
|
48596
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48597
|
+
var fullName, avatar, user, clonedAttachment;
|
|
48598
|
+
return __generator(this, function (_c) {
|
|
48599
|
+
switch (_c.label) {
|
|
48600
|
+
case 0:
|
|
48601
|
+
fullName = '';
|
|
48602
|
+
avatar = '';
|
|
48603
|
+
return [4 /*yield*/, this._userService.getBasicUserInfoByUserName(createdBy)];
|
|
48604
|
+
case 1:
|
|
48605
|
+
user = _c.sent();
|
|
48606
|
+
fullName = (_a = user.fullName) !== null && _a !== void 0 ? _a : '';
|
|
48607
|
+
avatar = (_b = user.avatar) !== null && _b !== void 0 ? _b : '';
|
|
48608
|
+
if (attachments && attachments.length > 0) {
|
|
48609
|
+
clonedAttachment = JSON.parse(JSON.stringify(attachments));
|
|
48610
|
+
this.model.dataSource.push({
|
|
48611
|
+
created: new Date(),
|
|
48612
|
+
createdBy: createdBy,
|
|
48613
|
+
fullName: fullName,
|
|
48614
|
+
status: status,
|
|
48615
|
+
type: type,
|
|
48616
|
+
avatar: avatar,
|
|
48617
|
+
attachments: clonedAttachment,
|
|
48618
|
+
correlationId: correlationId,
|
|
48619
|
+
isFirstMessageFlow: false,
|
|
48620
|
+
isLastMessageFlow: false,
|
|
48621
|
+
sent: sent
|
|
48622
|
+
});
|
|
48623
|
+
this.updateFirstOrLastMessage();
|
|
48624
|
+
}
|
|
48625
|
+
if (message && message.trim() != '') {
|
|
48626
|
+
this.model.dataSource.push({
|
|
48627
|
+
created: new Date(),
|
|
48628
|
+
createdBy: createdBy,
|
|
48629
|
+
fullName: fullName,
|
|
48630
|
+
content: message,
|
|
48631
|
+
status: status,
|
|
48632
|
+
type: type,
|
|
48633
|
+
avatar: avatar,
|
|
48634
|
+
correlationId: correlationId,
|
|
48635
|
+
isFirstMessageFlow: false,
|
|
48636
|
+
isLastMessageFlow: false,
|
|
48637
|
+
sent: sent
|
|
48638
|
+
});
|
|
48639
|
+
this.updateFirstOrLastMessage();
|
|
48640
|
+
}
|
|
48641
|
+
return [2 /*return*/, this.model.dataSource];
|
|
48642
|
+
}
|
|
48643
|
+
});
|
|
48644
|
+
});
|
|
48645
|
+
};
|
|
48646
|
+
ChatBoxComponent.prototype.updateFirstOrLastMessage = function () {
|
|
48647
|
+
if (this.model.dataSource.length > 0) {
|
|
48648
|
+
var length = this.model.dataSource.length;
|
|
48649
|
+
if (length === 1) {
|
|
48650
|
+
this.model.dataSource[0].isFirstMessageFlow = true;
|
|
48651
|
+
}
|
|
48652
|
+
else {
|
|
48653
|
+
var createdBy = this.model.dataSource[length - 2].createdBy;
|
|
48654
|
+
var createdBy2 = this.model.dataSource[length - 1].createdBy;
|
|
48655
|
+
if (createdBy !== createdBy2) {
|
|
48656
|
+
this.model.dataSource[length - 2].isLastMessageFlow = true;
|
|
48657
|
+
this.model.dataSource[length - 1].isFirstMessageFlow = true;
|
|
48658
|
+
}
|
|
48659
|
+
else {
|
|
48660
|
+
this.model.dataSource[length - 2].isLastMessageFlow = false;
|
|
48661
|
+
this.model.dataSource[length - 1].isLastMessageFlow = true;
|
|
48662
|
+
}
|
|
48663
|
+
}
|
|
48664
|
+
}
|
|
48665
|
+
};
|
|
48666
|
+
ChatBoxComponent.prototype.updateMessage = function (correlationId, message) {
|
|
48667
|
+
var item = this.model.dataSource.find(function (x) { return x.correlationId === correlationId; });
|
|
48668
|
+
if (item) {
|
|
48669
|
+
if (message.attachments && message.attachments.length > 0) {
|
|
48670
|
+
item.attachments = message.attachments;
|
|
48671
|
+
}
|
|
48672
|
+
item.id = message.id;
|
|
48673
|
+
item.sent = true;
|
|
48674
|
+
}
|
|
48675
|
+
};
|
|
48676
|
+
ChatBoxComponent.prototype.updateMessageStatus = function (message, status, errorMessage) {
|
|
48677
|
+
if (errorMessage === void 0) { errorMessage = ''; }
|
|
48678
|
+
var item = this.model.dataSource.find(function (x) { return x.message === message; });
|
|
48679
|
+
item.status = status;
|
|
48680
|
+
item.errorMessage = errorMessage;
|
|
48681
|
+
};
|
|
48682
|
+
ChatBoxComponent.prototype.getDisplayStatus = function (status) {
|
|
48683
|
+
switch (status) {
|
|
48684
|
+
case 'sending':
|
|
48685
|
+
return 'Đang gửi';
|
|
48686
|
+
case 'sent':
|
|
48687
|
+
return 'Đã gửi';
|
|
48688
|
+
default:
|
|
48689
|
+
return '';
|
|
48690
|
+
}
|
|
48691
|
+
};
|
|
48692
|
+
ChatBoxComponent.prototype.ngOnDestroy = function () {
|
|
48693
|
+
// unscrible signalr
|
|
48694
|
+
this._signalrService.unSubscribeViewCode(null, this.topic);
|
|
48695
|
+
this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENDING);
|
|
48696
|
+
this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENT);
|
|
48697
|
+
this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_LOAD_MORE);
|
|
48698
|
+
this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_SCROLLING);
|
|
48699
|
+
this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE_NOT_UPDATED);
|
|
48700
|
+
_super.prototype.ngOnDestroy.call(this);
|
|
48701
|
+
};
|
|
48702
|
+
ChatBoxComponent.prototype.getTypeOfMessage = function (createdBy) {
|
|
48703
|
+
return createdBy === this.currentUser.userName ? 'own' : 'from';
|
|
48704
|
+
};
|
|
48705
|
+
ChatBoxComponent.prototype.trackByFunc = function (index, item) {
|
|
48706
|
+
return item.id;
|
|
48707
|
+
};
|
|
48708
|
+
ChatBoxComponent.prototype.trackAttachmentByFunc = function (index, item) {
|
|
48709
|
+
return item.fileName;
|
|
48710
|
+
};
|
|
48711
|
+
ChatBoxComponent.prototype.handlePaste = function (event) {
|
|
48712
|
+
var objectData = this.getImageClipboardData(event);
|
|
48713
|
+
if (objectData) {
|
|
48714
|
+
this.model.attachments.push({
|
|
48715
|
+
type: 'image',
|
|
48716
|
+
url: objectData.url,
|
|
48717
|
+
data: objectData.blob,
|
|
48718
|
+
fileName: this._commonService.guid() + '.png'
|
|
48719
|
+
});
|
|
48720
|
+
}
|
|
48721
|
+
};
|
|
48722
|
+
ChatBoxComponent.prototype.getImageClipboardData = function (e) {
|
|
48723
|
+
for (var i = 0; i < e.clipboardData.items.length; i++) {
|
|
48724
|
+
var item = e.clipboardData.items[i];
|
|
48725
|
+
if (item.type.indexOf('image') != -1) {
|
|
48726
|
+
var imageObj = item.getAsFile();
|
|
48727
|
+
if (imageObj.size < this.model.maxFileSize) {
|
|
48728
|
+
return { url: URL.createObjectURL(imageObj), blob: imageObj };
|
|
48729
|
+
}
|
|
48730
|
+
else {
|
|
48731
|
+
return null;
|
|
48732
|
+
}
|
|
48733
|
+
}
|
|
48734
|
+
}
|
|
48735
|
+
return null;
|
|
48736
|
+
};
|
|
48737
|
+
ChatBoxComponent.prototype.viewOrDownloadFile = function (evt, attachmentItem) {
|
|
48738
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48739
|
+
var _c;
|
|
48740
|
+
return __generator(this, function (_d) {
|
|
48741
|
+
switch (_d.label) {
|
|
48742
|
+
case 0:
|
|
48743
|
+
if (!this._fileService.isSupportedViewOnline(attachmentItem.fileName)) return [3 /*break*/, 1];
|
|
48744
|
+
// this.model.fileViewer.data = {};
|
|
48745
|
+
// this.model.fileViewer.data.fileId = attachmentItem.id;
|
|
48746
|
+
// this.model.fileViewer.data.fileName = attachmentItem.fileName;
|
|
48747
|
+
// this.model.fileViewer.data.isFileVersion = false;
|
|
48748
|
+
// this.model.fileViewer.show = true;
|
|
48749
|
+
this.fileViewerModel = {
|
|
48750
|
+
data: {
|
|
48751
|
+
fileId: attachmentItem.id,
|
|
48752
|
+
fileName: attachmentItem.fileName,
|
|
48753
|
+
isFileVersion: false,
|
|
48754
|
+
},
|
|
48755
|
+
showEditForm: true,
|
|
48756
|
+
};
|
|
48757
|
+
return [3 /*break*/, 3];
|
|
48758
|
+
case 1:
|
|
48759
|
+
_c = top.location;
|
|
48760
|
+
return [4 /*yield*/, this.getDownloadLink(attachmentItem)];
|
|
48761
|
+
case 2:
|
|
48762
|
+
_c.href = _d.sent();
|
|
48763
|
+
_d.label = 3;
|
|
48764
|
+
case 3: return [2 /*return*/];
|
|
48765
|
+
}
|
|
48766
|
+
});
|
|
48767
|
+
});
|
|
48768
|
+
};
|
|
48769
|
+
ChatBoxComponent.prototype.getDownloadLink = function (file) {
|
|
48770
|
+
var _this = this;
|
|
48771
|
+
return new Promise(function (resolve, reject) {
|
|
48772
|
+
var model = new GenerateLinkDownloadDTO();
|
|
48773
|
+
model.fileId = file.id;
|
|
48774
|
+
model.isFileVersion = false;
|
|
48775
|
+
_this._fileService.generateLinkDownload(model)
|
|
48776
|
+
.then(function (response) {
|
|
48777
|
+
var downloadUrl = _this._fileService.getAnonymousDownloadUrl(response.data);
|
|
48778
|
+
resolve(downloadUrl);
|
|
48779
|
+
}, function (error) {
|
|
48780
|
+
throw new Error('Cannot get download link');
|
|
48781
|
+
});
|
|
48782
|
+
});
|
|
48783
|
+
};
|
|
48784
|
+
ChatBoxComponent.prototype.browseFileFromPersonal = function () {
|
|
48785
|
+
};
|
|
48786
|
+
ChatBoxComponent.prototype.browseFileFromComputer = function () {
|
|
48787
|
+
this.fileElement.advancedFileInput.nativeElement.click();
|
|
48788
|
+
};
|
|
48789
|
+
ChatBoxComponent.prototype.onSelectFileFromComputer = function (evt) {
|
|
48790
|
+
try {
|
|
48791
|
+
if (evt.files && evt.files.length > 0) {
|
|
48792
|
+
for (var index = 0; index < evt.files.length; index++) {
|
|
48793
|
+
var fileName = evt.files[index].name;
|
|
48794
|
+
var type = this._commonService.isImage(fileName) ? 'image' : 'file';
|
|
48795
|
+
var attachmentItem = {
|
|
48796
|
+
type: type,
|
|
48797
|
+
data: evt.files[index], fileName: fileName
|
|
48798
|
+
};
|
|
48799
|
+
if (attachmentItem.type == 'image') {
|
|
48800
|
+
attachmentItem.url = evt.files[index].objectURL.changingThisBreaksApplicationSecurity;
|
|
48801
|
+
}
|
|
48802
|
+
this.model.attachments.push(attachmentItem);
|
|
48803
|
+
}
|
|
48804
|
+
}
|
|
48805
|
+
}
|
|
48806
|
+
catch (e) {
|
|
48807
|
+
console.error('error on process select file computer', e);
|
|
48808
|
+
}
|
|
48809
|
+
// this.fileElement.clear();
|
|
48810
|
+
};
|
|
48811
|
+
ChatBoxComponent.prototype.removeAttachment = function (item) {
|
|
48812
|
+
var ind = this.model.attachments.findIndex(function (x) { return x.url === item.url; });
|
|
48813
|
+
this.model.attachments.splice(ind, 1);
|
|
48814
|
+
};
|
|
48815
|
+
ChatBoxComponent.prototype.hasAttachment = function (item) {
|
|
48816
|
+
return item.attachments && item.attachments.length > 0;
|
|
48817
|
+
};
|
|
48818
|
+
ChatBoxComponent.prototype.loadImg = function (evt, parentIndex, index) {
|
|
48819
|
+
this.model.img["" + parentIndex + index] = true;
|
|
48820
|
+
this.model.img[parentIndex + "width" + index] = (evt.target.width + 32) + 'px';
|
|
48821
|
+
};
|
|
48822
|
+
ChatBoxComponent.prototype.inTheSameTime = function (i, item, dataSource) {
|
|
48823
|
+
if (i < dataSource.length - 1) {
|
|
48824
|
+
var d1 = new Date(dataSource[i + 1].created);
|
|
48825
|
+
var d2 = new Date(item.created);
|
|
48826
|
+
var ms = d1.getTime() - d2.getTime();
|
|
48827
|
+
return ms < 30000;
|
|
48828
|
+
}
|
|
48829
|
+
return false;
|
|
48830
|
+
};
|
|
48831
|
+
ChatBoxComponent.prototype.pinMessage = function (item) {
|
|
48832
|
+
var _this = this;
|
|
48833
|
+
if (this.model.pinnedMessage) {
|
|
48834
|
+
if (this.model.pinnedMessage.id != item.id) {
|
|
48835
|
+
this._notifierService.showConfirm('Bạn có chắc chắn muốn ghim tin nhắn này? Tin nhắn đã ghim trước đó sẽ được bỏ ghim.').then(function (rs) {
|
|
48836
|
+
if (!rs)
|
|
48837
|
+
return;
|
|
48838
|
+
_this.doPin(item, item.id, true);
|
|
48839
|
+
});
|
|
48840
|
+
}
|
|
48841
|
+
else {
|
|
48842
|
+
this.doPin(item, item.id, false);
|
|
48843
|
+
}
|
|
48844
|
+
}
|
|
48845
|
+
else {
|
|
48846
|
+
this.doPin(item, item.id, true);
|
|
48847
|
+
}
|
|
48848
|
+
};
|
|
48849
|
+
ChatBoxComponent.prototype.doPin = function (item, id, pinned) {
|
|
48850
|
+
var _this = this;
|
|
48851
|
+
var correlationId = this._commonService.guid();
|
|
48852
|
+
this.model.correlationIds.push(correlationId);
|
|
48853
|
+
this._messageBoardService.pinMessage(id, pinned, correlationId).then(function (rs) {
|
|
48854
|
+
if (pinned) {
|
|
48855
|
+
_this.model.pinnedMessage = item;
|
|
48856
|
+
}
|
|
48857
|
+
else {
|
|
48858
|
+
_this.model.pinnedMessage = null;
|
|
48859
|
+
}
|
|
48860
|
+
});
|
|
48861
|
+
};
|
|
48862
|
+
ChatBoxComponent.prototype.getCurrentUserAvatar = function (avatar) {
|
|
48863
|
+
if (avatar != null) {
|
|
48864
|
+
return this.fileApi + "/file/public/" + avatar + "/Download";
|
|
48865
|
+
}
|
|
48866
|
+
else {
|
|
48867
|
+
return this.defaultAvatar;
|
|
48868
|
+
}
|
|
48869
|
+
};
|
|
48870
|
+
ChatBoxComponent.prototype.addPeople = function () {
|
|
48871
|
+
this.userPickerForm.selectedValue = this.peopleRelatedUsers;
|
|
48872
|
+
this.userPickerForm.multiple = this.multiple;
|
|
48873
|
+
this.userPickerForm.show = true;
|
|
48874
|
+
};
|
|
48875
|
+
ChatBoxComponent.prototype.quickNote = function (item) {
|
|
48876
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48877
|
+
var userResult;
|
|
48878
|
+
return __generator(this, function (_c) {
|
|
48879
|
+
switch (_c.label) {
|
|
48880
|
+
case 0: return [4 /*yield*/, this._userService.getBasicUserInfo(item.createdBy)];
|
|
48881
|
+
case 1:
|
|
48882
|
+
userResult = _c.sent();
|
|
48883
|
+
this.context.data.noteDataModel = {
|
|
48884
|
+
editFormModel: {
|
|
48885
|
+
showEditForm: true,
|
|
48886
|
+
showQuickNoteForm: true,
|
|
48887
|
+
popupSize: {},
|
|
48888
|
+
data: {
|
|
48889
|
+
name: item.content1,
|
|
48890
|
+
content: '<b>' + userResult.fullName + '</b>' + ' đã chat tại công việc '
|
|
48891
|
+
+ '<b>' + this.model.taskName + '</b>' + ' với nội dung '
|
|
48892
|
+
+ '<b>' + item.content1 + '</b>' + ' vào lúc ' + moment$1(new Date(item.created)).format('YYYY-MM-DD hh:mm:ss A')
|
|
48893
|
+
}
|
|
48894
|
+
}
|
|
48895
|
+
};
|
|
48896
|
+
this.model.editFormModel.showQuickNoteForm = true;
|
|
48897
|
+
this.showAddNoteForm = true;
|
|
48898
|
+
return [2 /*return*/];
|
|
48899
|
+
}
|
|
48900
|
+
});
|
|
48901
|
+
});
|
|
48902
|
+
};
|
|
48903
|
+
ChatBoxComponent.prototype.onMouseUp = function (event) {
|
|
48904
|
+
event.cancelBubble = true;
|
|
48905
|
+
event.stopPropagation();
|
|
48906
|
+
};
|
|
48907
|
+
ChatBoxComponent.prototype.addClassToMessage = function (item, isPinnedMessage) {
|
|
48908
|
+
var styleClass = '';
|
|
48909
|
+
if (!isPinnedMessage) {
|
|
48910
|
+
if (item.isFirstMessageFlow) {
|
|
48911
|
+
styleClass = 'first';
|
|
48912
|
+
}
|
|
48913
|
+
else if (item.isLastMessageFlow) {
|
|
48914
|
+
styleClass = 'last';
|
|
48915
|
+
}
|
|
48916
|
+
else {
|
|
48917
|
+
styleClass = 'middle';
|
|
48918
|
+
}
|
|
48919
|
+
}
|
|
48920
|
+
if (item.sent == false) {
|
|
48921
|
+
styleClass = 'sending';
|
|
48922
|
+
}
|
|
48923
|
+
return styleClass;
|
|
48924
|
+
};
|
|
48925
|
+
return ChatBoxComponent;
|
|
48926
|
+
}(ComponentBase));
|
|
48927
|
+
ChatBoxComponent.decorators = [
|
|
48928
|
+
{ type: i0.Component, args: [{
|
|
48929
|
+
selector: 'chat-box',
|
|
48930
|
+
template: "<div class=\"dashboard\">\r\n <div class=\"chat\">\r\n <div class=\"group-info\">\r\n <a href=\"javascript:\">C\u00F3 {{peopleAll.length}} ng\u01B0\u1EDDi trong nh\u00F3m n\u00E0y</a>\r\n <div class=\"circleButton\" pTooltip=\"Xem to\u00E0n b\u1ED9 \u0111\u00EDnh k\u00E8m\" tooltipPosition=\"top\">\r\n <a href=\"javascript:\"><i class=\"far fa-images\"></i></a>\r\n </div>\r\n <div (click)=\"addPeople()\" class=\"circleButton\" pTooltip=\"Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi v\u00E0o nh\u00F3m\" tooltipPosition=\"top\"\r\n disabled=\"true\">\r\n <a href=\"javascript:\"><i class=\"fas fa-user-plus\"></i></a>\r\n </div>\r\n </div>\r\n <ul #scrollMe [ngClass]=\"{'hasPin': model.pinnedMessage != null}\">\r\n <li *ngIf=\"model.pinnedMessage\" class=\"clearfix pin\" [ngClass]=\"{'message-from': true}\">\r\n <ng-container\r\n *ngTemplateOutlet=\"messageItem; context: { i : -1, item: model.pinnedMessage, isPinnedMessage: true}\">\r\n </ng-container>\r\n </li>\r\n <li *ngFor=\"let item of model.dataSource; let i = index; trackBy: trackByFunc\" class=\"clearfix\"\r\n [ngClass]=\"{ 'message-own': item.type == 'own'}\">\r\n <ng-container *ngTemplateOutlet=\"messageItem; context: { i : i, item: item}\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <!-- <chat-send-message-box *ngIf=\"showSendMessageBox\"></chat-send-message-box>-->\r\n <div [ngClass]=\"{'visible2': model.scrolling, 'hidden2': !model.scrolling}\" class=\"scroll-to-bottom\">\r\n <span *ngIf=\"model.newMessageNotUpdatedCount > 0\" (click)=\"scrollToBottom(350, true, null)\">\r\n {{model.newMessageNotUpdatedCount <= 5 ? model.newMessageNotUpdatedCount : '5+' }} </span>\r\n <span (click)=\"scrollToBottom(350, true, null)\" *ngIf=\"model.newMessageNotUpdatedCount == 0\">\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<file-viewer *ngIf=\"fileViewerModel.showEditForm\" [parentContext]=\"context\" [parentModel]=\"model\"\r\n [model]=\"fileViewerModel\">\r\n</file-viewer>\r\n\r\n<ng-template #messageItem let-i=\"i\" let-isPinnedMessage=\"isPinnedMessage\" let-item=\"item\">\r\n <img *ngIf=\"item.isFirstMessageFlow && item.type != 'own' && !isPinnedMessage && item.avatar != null\" alt=\"\"\r\n class=\"chat-avatar\" src=\"{{getCurrentUserAvatar(item.avatar)}}\">\r\n <p *ngIf=\"(item.isFirstMessageFlow && item.type != 'own') && !isPinnedMessage\" class=\"message-created-by\">\r\n {{item.fullName}}\r\n </p>\r\n <span *ngIf=\"!hasAttachment(item)\">\r\n <!-- [class]=\"addClassToMessage(item, isPinnedMessage)\">-->\r\n <p *ngIf=\"!hasAttachment(item)\" class=\"message-content\">\r\n <i (click)=\"pinMessage(item)\" class=\"fas fa-thumbtack\" style=\"right: 0;\"></i>\r\n <i (click)=\"quickNote(item)\" class=\"fas fa-sticky-note\"></i>\r\n {{item.content}}\r\n </p>\r\n <p *ngIf=\"!isPinnedMessage && (item.isLastMessageFlow || !inTheSameTime(i, item, model.dataSource))\"\r\n class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n <p *ngIf=\"isPinnedMessage\" class=\"message-created\">\r\n {{item.createdBy}} \u0111\u00E3 g\u1EEDi l\u00FAc {{item.created | date:'dd/MM/yyyy HH:mm'}}\r\n </p>\r\n </span>\r\n <ng-container *ngIf=\"hasAttachment(item)\">\r\n <ng-container *ngFor=\"let attachmentItem of item.attachments;let index=index\">\r\n <div class=\"file\"\r\n [ngClass]=\"{'first':item.isFirstMessageFlow && index == 0, 'middle':index > 0 || !item.isFirstMessageFlow, 'image' : attachmentItem.type == 'image'}\"\r\n [ngStyle]=\"{'width': model.img[i + 'width' + index]}\">\r\n <p class=\"attachment\">\r\n <span (mouseup)=\"onMouseUp($event)\" class=\"attachment-item\">\r\n <a *ngIf=\"attachmentItem.type != 'image'\" (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <i class=\"fas fa-paperclip\"></i>{{attachmentItem.fileName}}\r\n </a>\r\n <a *ngIf=\"attachmentItem.type == 'image'\" #aElement\r\n [ngClass]=\"{'hidden': !model.img[i + '' + index], 'visible':model.img[i + '' + index]}\"\r\n (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <img class=\"message-img\" (load)=\"loadImg($event, i, index)\"\r\n [src]=\"attachmentItem.url | secure | async\" />\r\n </a>\r\n </span>\r\n </p>\r\n <div style=\"clear: both\"></div>\r\n <p class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n </div>\r\n <div style=\"clear: both\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <after-view-checked *ngIf=\"model.dataSource.length == i + 1\" (loading)=\"scrollToBottom(0, false, item.sent)\">\r\n </after-view-checked>\r\n</ng-template>\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\"-->\r\n<!-- (onCancel)=\"userPickerForm.show = false\"-->\r\n<!-- (onHide)=\"userPickerForm.show = false\">-->\r\n<!-- <!– <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"–>-->\r\n<!-- <!– (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"–>-->\r\n<!-- <!– (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>–>-->\r\n<!-- <user-picker-box #formBase [control]=\"userPickerControl\"-->\r\n<!-- [(ngModel)]=\"this.peopleAll\" [multiple]=\"userPickerControl.multiple\">-->\r\n<!-- </user-picker-box>-->\r\n<!--</tn-dialog>-->\r\n\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\" (onHide)=\"userPickerForm.show == false\">-->\r\n<!-- <!– <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"–>-->\r\n<!-- <!– (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"–>-->\r\n<!-- <!– (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>–>-->\r\n\r\n<!-- <!–<quick-add-form *ngIf=\"model.editFormModel.showQuickNoteForm\" [parentContext]=\"context\"–>-->\r\n<!-- <!– [parentModel]=\"context.data.noteDataModel\"></quick-add-form>–>-->\r\n<!--</tn-dialog>-->",
|
|
48931
|
+
providers: [ComponentContextService, CheckControlVisibleService],
|
|
48932
|
+
styles: [".paging-advance{list-style:none;margin:3px 0;padding-left:0}.paging-advance li{line-height:30;padding-left:15px;width:150px}.paging-advance li.disabled{color:#bdbdbd;outline:none}.paging-advance li.disabled:hover{background:none;cursor:default}.paging-advance li:hover{background:red;cursor:pointer}.paging-advance-overlay .ui-overlaypanel-content{padding:0}.paging-advance-overlay.ui-overlaypanel-shifted:before{left:1.25em;margin-left:-10;right:auto}.paging-advance-overlay.ui-overlaypanel-shifted:after{left:1.25em;margin-left:-8px;right:auto}.chat-avatar{border:2px solid #eee;height:36px}", "@charset \"UTF-8\";@import url(C:\\Users\\vietp\\source\\repos\\5.1\\shared\\AppSharedV5\\node_modules\\@angular\\material\\prebuilt-themes\\indigo-pink.css);@import url(C:\\Users\\vietp\\source\\repos\\5.1\\shared\\AppSharedV5\\node_modules\\jsoneditor\\dist\\jsoneditor.min.css);.flex{display:flex}.flex .fit{flex:1 1}.flex.flex-column{flex-direction:column}.flex.flex-wrap{flex-wrap:wrap}.flex.center-v{align-items:center}.flex.center-all,.flex.center-h{justify-content:center}.flex.center-all{align-items:center}.validate-item{color:#e00000;display:inline-block;font-size:.9em;white-space:nowrap}.tn-scroll-bar.bgWhite>div,.validate-item{background-color:#fff}.label-primary{background-color:#1ab394;padding:2px}.label-danger,.label-primary{border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px}.label-danger{background-color:#ed5565;padding:2px 5px}.label-warning{background-color:#b8860b}.label-secondary,.label-warning{border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px;padding:2px}.label-secondary{background-color:#a9a9a9}.label-done{background-color:#3b1ef7;border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px;padding:2px}.text-navy{color:#1ab394!important}.text-danger{color:red!important}.fa-user-edit{font-size:14px}.flexcolumn{border:1px solid #eee;border-radius:5px;min-height:80px;overflow-x:hidden;overflow-y:hidden}.flexcolumn,.has2ScrollZone2 .flexcolumn{max-height:calc(100vh - 180px)}.headerNoBorder>th{border:none!important;border-bottom:1px solid #eee!important}.cellNoBorder table tr td{border:0!important}.layout-wrapper .layout-main{overflow:hidden;padding:60px 0 0}div.circleButton{border-radius:50%;display:inline-block;height:32px;line-height:32px;margin-bottom:4px;margin-top:4px;overflow:hidden;position:relative;text-align:center;transform:perspective(1px);width:32px}div.circleButton>a{line-height:32px;padding:0!important}div.circleButton>a>i{width:24px!important}div.circleButton:before{background:#e6e6e6;border-radius:50%;bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;transform:scale(0);transition:all .3s cubic-bezier(.4,.34,.01,.97);z-index:-1}div.circleButton:hover:before{transform:scale(1)}.message-notice{background:#e0e0e0;text-align:center}.message-created-by{color:#888;font-size:.82em;font-weight:400;margin-bottom:3px;margin-left:45px;margin-top:5px}.message-created{color:#495057;display:inline-block;font-size:.82em;margin-bottom:0;margin-top:0}.message-own .message-created{padding-left:10px;padding-right:6px}.message-from .message-created{padding-left:6px;padding-right:10px}.message-content{color:#000;line-height:20px;margin-bottom:6px;margin-top:3px;position:relative}.message-content i{display:none}.message-content:hover i{display:block}.message-content:hover{padding-right:20px!important}.chat-box-content{max-height:500px}.attachment-list .attachment-item{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;background:#f1f1f1;border:1px solid #ccc;border-radius:8px;box-shadow:1px 2px 3px rgba(0,0,0,.06);float:left;height:84px;margin:8px;overflow:hidden;position:relative;text-align:center;user-select:none;width:84px}.attachment-list .attachment-item img{height:100%;width:100%}.attachment-list .attachment-item span{left:0;padding:5px;position:absolute;top:25px;width:100%;word-break:break-all}.clearfix{clear:both}.dashboard .chat ul li img.message-img{float:none;height:120px;margin-left:0;width:auto}.message-attachment{cursor:pointer;font-size:1.5em;margin:0 5px 0 0;position:relative}.hidden{display:none}.message-input{width:100%}.message-input label{font-size:1.2rem}.remove-file-attachment{background:#495057;border-radius:50%;color:#fff;cursor:pointer;font-size:20px;position:absolute;right:5px;top:5px}.attachment-list{background:#fff;bottom:51px;box-shadow:0 -2px 3px -3px rgba(0,0,0,.21176470588235294);display:none;height:100px;left:-15px;position:absolute;width:calc(100% + 30px)}.attachment-list.attached-file{display:block}.dashboard{margin-bottom:-15px;margin-top:-5px}.dashboard .timeline>.ui-g .ui-g-9 .event-text{color:#555;white-space:nowrap}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2{line-height:18px;padding-left:30px;text-align:justify;white-space:pre-wrap}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2 i{left:20px;margin-top:3px;position:absolute}.new-message{align-items:center;justify-content:center}.dashboard .chat .new-message{border:0;display:flex;margin:0;padding:0;text-align:left}.dashboard .chat .new-message i{color:#495057}.dashboard .chat .new-message .message-attachment{border:0}.dashboard .chat .new-message .button-send{display:inline-block;line-height:40px;position:relative}.dashboard .chat .new-message .button-send .p-button-label{text-align:center}.dashboard .chat .new-message .message-emotion{display:inline-block;height:100%;line-height:40px;text-align:center;width:40px}.dashboard .chat .new-message .message-emotion i{font-size:24px;line-height:inherit}.dashboard .chat .new-message .message-input{width:calc(100% - 155px)}.dashboard .chat ul li.message-from,.dashboard .chat ul li.message-own{padding:0}.dashboard .chat ul li.message-from>span{background-color:#f0e3fd;border:0;border-radius:2px 20px 20px 2px}.dashboard .chat ul li.message-from>.first,.dashboard .chat ul li.message-from>.middle{margin-left:45px!important}.dashboard .chat ul li.message-from>.last{border-radius:2px 20px 20px 20px;margin-left:45px!important}.dashboard .chat ul li.message-from>img{border-radius:50%;margin-top:5px;position:absolute;width:36px}.dashboard .chat ul li.message-own>span{background-color:#def6f8;border:0;border-radius:20px 2px 2px 20px;text-align:right}.dashboard .chat ul li.message-own>span.sending{background-color:#eee}.dashboard .chat ul li.message-own>span.last{border-radius:20px 2px 20px 20px}.dashboard .chat ul li.message-own .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-left:0;padding-right:0}.dashboard .chat ul li.message-own .attachment span.attachment-item a{color:#555;cursor:pointer;display:inline-block;font-weight:700}.dashboard .chat ul li.message-own>div.file{background:#f1f1f1;border:1px solid #e4e4e4;border-radius:6px;display:inline-block;margin:1px;overflow:hidden;text-align:right}.dashboard .chat ul li.message-from .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-left:0;padding-right:0}.dashboard .chat ul li.message-from .attachment span.attachment-item a{color:#555;cursor:pointer;display:inline-block;font-weight:700}.dashboard .chat ul li.message-from .attachment span.attachment-item a img{margin-right:0}.dashboard .chat ul li.message-from>div.file{background:#f1f1f1;border:1px solid #e4e4e4;border-radius:6px;display:inline-block;margin:1px;overflow:hidden;text-align:left}.dashboard .chat ul li .attachment span.attachment-item a>i{padding-right:8px}.dashboard .chat ul li div.file p.attachment{display:inline-block;margin-bottom:5px}.dashboard .chat ul li.message-from{text-align:left}.dashboard .chat ul li.message-own{text-align:right}.dashboard .chat ul li>div.file.image{height:170px;max-width:100%;padding:15px;transition:width .15s linear;width:220px}.dashboard .chat ul li>div.file.image p.attachment{height:120px}.dashboard .chat ul li>div.file{padding:15px}.dashboard .chat ul li>div.file p,.dashboard .chat ul li>div.file span{display:inline-block;margin:0;padding:0}.visible{opacity:1;transition:opacity .15s linear;visibility:visible}.hidden{opacity:0;transition:visibility 0s .1s,opacity .1s linear;visibility:hidden}.visible2{opacity:1;transition:opacity .35s linear;visibility:visible}.hidden2{opacity:0;transition:visibility 0s .3s,opacity .3s linear;visibility:hidden}.dashboard .chat{position:relative}.dashboard .chat .scroll-to-bottom{bottom:6px;min-height:40px;padding-right:12px;position:sticky;text-align:right}.dashboard .chat .scroll-to-bottom span{background:#495057;border:2px solid #fff;border-radius:50%;box-shadow:0 0 10px rgba(0,0,0,.34901960784313724);color:#fff;cursor:pointer;display:inline-block;font-size:20px;height:35px;line-height:35px;overflow:hidden;text-align:center;width:35px}.dashboard .chat .group-info{line-height:30px;margin:-10px;padding:5px 10px;top:0;z-index:99}.dashboard .chat .group-info,.dashboard .chat .pin{background:#fff;box-shadow:0 0 3px -1px rgba(0,0,0,.21176470588235294);position:sticky}.dashboard .chat .pin{margin-bottom:10px;margin-left:-10px;top:40px;width:calc(100% + 20px);z-index:98}.dashboard .chat ul li.message-from.pin>span,.dashboard .chat ul li.message-own.pin>span{background-color:transparent}.dashboard .chat ul li.message-from.pin>span{margin-left:0}.dashboard .chat .message-content i{color:#495057;cursor:pointer;font-size:11px}.dashboard .chat .pin .message-content i{display:block}.dashboard .chat li.message-from .message-content{padding-left:6px}.dashboard .chat li.message-from .message-content i{padding:5px}.dashboard .chat li.message-own .message-content i{padding:5px;position:absolute;right:-15px}.dashboard .chat .group-info .circleButton{float:right;margin-bottom:0;margin-top:0}.dashboard .chat ul{margin-top:20px;padding:0}.dashboard .chat .new-message .message-input input.ui-inputtext:focus{box-shadow:none;outline:none}.dashboard .chat ul.hasPin{margin-top:10px}.dashboard .chat .group-info a{color:#495057}.normalHtml,.normalHtml b,.normalHtml strong{font-weight:400}.normalHtml{display:inline-block}.avatar-viewer .profile-image{border:1px solid #fff;border-radius:50%;height:40px;margin-top:-6px;width:40px}a.button>i{margin-right:5px}.dashboard .timeline{padding-top:20px}.ui-inputgroup .ui-inputtext{padding-right:0}.new-message .ui-inputtext{width:100%}.full-screen,.full-screen>.p-dialog{height:100%!important;left:0!important;max-height:100%;min-height:unset!important;min-width:100%!important;top:0!important;width:100%!important}#image-view-list.image-gallery-2{background-color:rgba(0,0,0,.4);height:calc(100vh - 41px);margin:-14px auto 0;touch-action:none;width:100%}#image-view-list.image-gallery-2 .image-container{background-color:transparent;border:0;bottom:0;height:85%;margin:auto}#image-view-list.image-gallery-2 .image-container .iv-snap-view{bottom:20px;left:calc(50% - 75px);top:auto}#image-view-list.image-gallery-2 .image-container .iv-image-view img{touch-action:auto}#image-view-list .inline-icon{margin-top:-41px}#image-view-list .footer-info,#image-view-list .material-icons.next,#image-view-list .material-icons.prev{display:none}#image-view-list .options-image-viewer{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;margin-right:37px;user-select:none}.mobile-image-viewer-close{color:#fff;cursor:pointer;font-size:x-large;height:42px;line-height:42px;padding-right:7px;padding-top:2px;position:absolute;right:0;text-align:center;top:0;vertical-align:middle;width:37px}.mobile-image-viewer-close:hover{color:#feca37!important}.hide-holder{padding:0}.file-ex-name{word-break:break-all}.box-function{background:#fff;border-radius:0 0 5px 5px;border-top:1px solid #e8e8e8;bottom:0;left:0;padding:8px 30px;position:absolute;text-align:right;width:100%}.box-function button{margin-left:5px}.quick-note-button-holder{bottom:40px;display:none;height:50px;position:absolute;right:50px;width:50px;z-index:99}.quick-note-button{background:#ffc107;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:2em;height:50px;line-height:50px;outline:none;text-align:center;width:50px}.quick-note-button:hover{color:#fff}.all-note-button{background:#ffd24b;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:1.5em;height:40px;line-height:40px;outline:none;position:absolute;right:5px;text-align:center;top:5px;transition:right;transition-duration:.16s;transition-timing-function:ease-in;width:40px;z-index:-1}.all-note-button:hover{color:#fff}.setting-note-button{background:#ffd24b;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:1.5em;height:40px;line-height:40px;outline:none;position:absolute;right:5px;text-align:center;top:5px;transition:right;transition-duration:.16s;transition-timing-function:ease-in;width:40px;z-index:-1}.setting-note-button:hover{color:#fff}.pinned-notes-holder{bottom:20px;display:none;left:20px;position:absolute;width:250px;z-index:98}.pinned-notes{background:transparent;display:block;outline:none;padding:0}.pinned-notes-header{font-size:1rem;font-weight:700}.pinned-notes-setting{position:absolute;right:.5rem}.pinned-note{background-color:#fff1ac;box-shadow:1px 2px 3px rgba(185,139,6,.6313725490196078);font-size:.8rem;margin-bottom:10px;padding:0;position:relative}.pinned-note:last-child{margin-bottom:0}.pinned-notes-minimize-button{background:#ffc003;border:1px solid #fff;border-radius:50%;box-shadow:1px 2px 3px rgba(185,139,6,.6313725490196078);color:#fff;cursor:pointer;height:25px;padding-top:5px;position:absolute;right:-15px;text-align:center;top:-15px;width:25px;z-index:1}.pinned-note-header-line{border:1px solid #fff;box-shadow:1px 1px 2px rgba(0,0,0,.4);height:calc(100% - 1rem);left:3px;margin-bottom:.5rem;margin-top:.5rem;max-height:20px;position:absolute;width:13px}.pinned-note-header-right{cursor:pointer;float:right;margin-left:3px;width:32px}.pinned-note-header-time{font-size:.6rem}.pinned-note-header-button-unpin{display:none;float:left;height:14px;margin-right:2px;opacity:.8;width:14px}.pinned-note-header-button-complete{display:none;padding-top:2px}.pinned-note-body{float:right;padding:.5rem .5rem .5rem 25px;width:100%}.pinned-note-body:hover{background-color:#feeb82}.pinned-note-body:hover .pinned-note-header-time{display:none}.pinned-note-body:hover .pinned-note-header-button-complete,.pinned-note-body:hover .pinned-note-header-button-unpin{display:block}.pinned-note-line-title{color:#333;display:block;font-weight:700;padding-bottom:6px}.pinned-note-line{display:block}.view-port{border-radius:5px;box-shadow:0 0 0 9999px rgba(0,0,0,.5882352941176471);display:none;height:0;width:0;z-index:999}.view-port,.view-port-mask{background:transparent;position:absolute}.view-port-mask{display:block;height:100%;left:0;top:0;width:100%;z-index:9998}.tinymce-control{border:1px solid #ccc;display:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;width:100%}.input-tab-trap{filter:alpha(opacity=0)!important;opacity:0!important;overflow:hidden!important;width:0!important}.color-value input{font-size:.8em;line-height:16px}.dialog-material.mobile{width:100%!important}audio,audio:focus,video,video:focus{outline:none}.iv-image-view img.iv-image{-webkit-animation:fadein .5s;animation:fadein .5s;visibility:hidden!important}@-webkit-keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.iv-image-view img.iv-image.show{visibility:visible!important}.row-line{padding-bottom:0;padding-top:0}.fc-ltr{padding-bottom:7px}.padding-bottom-5px{padding-bottom:5px}.no-margin{margin:0!important}.no-padding{padding:0}.no-padding-left{padding-left:0}.float-left{float:left}body .fc .fc-toolbar .fc-button{background-color:#007ad9;border:1px solid #007ad9;border-radius:3px;color:#fff;font-size:14px;transition:background-color .2s,box-shadow .2s}body .fc .fc-toolbar .fc-button:enabled:hover{background-color:#116fbf;border-color:#116fbf;color:#fff}body .fc .fc-toolbar .fc-button:focus{box-shadow:0 0 0 .2em #8dcdff;outline:0 none;outline-offset:0}body .fc .fc-toolbar .fc-button-group .fc-button{border-radius:0}body .fc .fc-toolbar .fc-button-group .fc-button:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}body .fc .fc-toolbar .fc-button-group .fc-button:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}body .fc .fc-toolbar .fc-right .fc-button{border-radius:0}body .fc .fc-toolbar .fc-right .fc-button:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}body .fc .fc-toolbar .fc-right .fc-button:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.fc-toolbar>*>:not(:first-child){margin-left:0}.fc-axis,.fc-dayGridMonth-button,.fc-timeGridDay-button,.fc-timeGridWeek-button,.old-content{line-height:0;text-indent:-9999px}.fc-axis:after,.fc-dayGridMonth-button:after,.fc-timeGridDay-button:after,.fc-timeGridWeek-button:after,.new-content{display:block;line-height:normal;text-indent:0}.fc-dayGridMonth-button:after{content:\"Th\u00E1ng\";padding:.2em}.fc-timeGridWeek-button:after{content:\"Tu\u1EA7n\";padding:.2em}.fc-timeGridDay-button:after{content:\"Ng\u00E0y\";padding:.2em}body .fc th{background-color:#f4f4f4;border:1px solid #c8c8c8;color:#333;padding:.571em 1em}.ui-fluid .button-group button,.ui-fluid .button-group p-button{margin-right:.5em!important;text-align:left;width:auto}.layout-wrapper .layout-menu-container{z-index:97}.base-status,.base-status-aborted,.base-status-approved,.base-status-completed,.base-status-create-new,.base-status-ended,.base-status-high,.base-status-immediately,.base-status-low,.base-status-medium,.base-status-on-conducting,.base-status-on-going,.base-status-pending,.base-status-rejected,.base-status-returned,.base-status-urgent{border-radius:.25em;color:#fff;font-size:.8em;padding:3px;text-align:center}.base-status-create-new{background-color:#f2f2f2;color:#666}.base-status-on-conducting,.base-status-on-going{background-color:#337ab7}.base-status-pending{background-color:#ffba01}.base-status-approved{background-color:#34a835}.base-status-returned{background-color:#ffba01}.base-status-rejected{background-color:#d9534f}.base-status-completed{background-color:#34a835}.base-status-aborted{background-color:#ffba01}.base-status-ended{background-color:#34a835}.base-status-low,.base-status-medium{background-color:#f2f2f2;color:#666}.base-status-high{background-color:#ffba01}.base-status-immediately,.base-status-urgent{background-color:#d9534f}.text-align-center{text-align:center}.font-weight-bold{font-weight:700}.landing-body .landing-menu li a:hover{border-bottom:none}.landing-body .landing-menu li:first-child{margin-left:8px}.crud-form .label-control p{margin:0;padding:0}.crud-form .tn-check-box-list .p-row{display:block;padding:.5em;width:100%}.crud-form dropdown,.crud-form tn-mask{width:100%}.crud-form .tn-dropdown{min-height:32px}.crud-form .tn-dropdown.free-text.horizontal{display:flex}.crud-form .tn-dropdown.free-text.horizontal>div{flex-grow:1;padding-left:.5em;padding-right:.5em}.crud-form .tn-dropdown.free-text.horizontal>div:first-child{padding-left:0}.crud-form .tn-dropdown.free-text.horizontal>div:last-child{padding-right:0}.crud-form .tn-dropdown.free-text.vertical input.ui-inputtext.input-free-text{margin-top:.5em}.crud-form.assessment .label-control{font-weight:700}.crud-form.assessment .label-control.haveIndex{display:block;margin-bottom:5px;padding-left:20px;position:relative}.crud-form.assessment .label-control.haveIndex:before{content:\" \" attr(label-index) \".\";left:0;position:absolute;top:0}.crud-form.assessment .ViewMode{border-bottom:none}.crud-form.assessment .ViewMode .label-control{margin-bottom:0}body .ui-inputtext.min-width{padding:6px}.ps__rail-x,.ps__rail-y{z-index:2}.zIndex5 .ps__rail-x,.zIndex5 .ps__rail-y{z-index:5}.table-sticky table{border-collapse:separate;border-spacing:0}.table-sticky tr td,.table-sticky tr th{border:1px solid #eee!important;border-left:none!important;border-top:none!important}.table-sticky tr td:first-child,.table-sticky tr th:first-child{border-left:1px solid #eee!important}.table-sticky tr td:last-child,.table-sticky tr th:last-child{border-right:none!important}.table-sticky tr:first-child th{border-top:1px solid #eee!important}.table-sticky th{background:#eee}.table-sticky tbody td.disabled{background:#eee!important}.table-sticky tbody td.disabled:not(:last-child){border-right:1px solid #fff!important}.table-sticky.fix-height tr:first-child th{position:sticky;top:0;z-index:2}.container-flex{align-items:center;display:flex}.container-flex>div:first-child{flex:0 0 auto;margin-right:.5em}.container-flex>div:last-child{flex-grow:1}.container-control{display:flex}.container-control>span.label{flex:0 0 auto;padding-right:.5em;padding-top:.5em}.container-control>span.label+*{flex-grow:1;flex-shrink:1;position:relative}.container-control>span.label+* .tn-dropdown,.container-control>span.label+* .ui-autocomplete-multiple,.container-control>span.label+* .ui-inputgroup .ui-inputtext{width:100%}.container-control>span.label+* .validation-container{margin-top:3px}.container-control>span.label+* .validation-container .validate-item{white-space:unset}.container-control>span.label+*>div{left:0;position:absolute;top:0;width:100%}.container-control.no-label>span.label{display:none}.container-control.inline{display:inline-flex}.align-flex-center{align-items:center;display:flex;justify-content:center}@media print{.isPrinting>*{display:none}.isPrinting app-print-layout{display:block}}.layout-wrapper .topbar .topbar-left,.layout-wrapper .topbar .topbar-right{background:#397ac3}#searchResultPanel-holder{padding:0 .5em}.cus-dropdown{line-height:normal;margin-right:1em}.tn-thumbnail{padding:.5rem}.tn-thumbnail.tn-thumbnail.tn-thumbnail{box-sizing:border-box}.fa-10:before{content:\"A+\";font-family:cursive;font-weight:700}.layout-wrapper .topbar .topbar-right #menu-button i{font-size:20px;margin-top:4px}.layout-wrapper .layout-menu li a i.menuitem-toggle-icon{font-size:15px;margin-left:auto}.flex-container-main-content{display:flex;flex-direction:column}.flex-container-main-content>div:last-child{background-color:#f4f4f4;display:flex;flex:1 1;overflow:hidden;position:relative}.flex-container-main-content>div:last-child>div{height:100%;left:0;overflow:hidden;padding-top:.5em;position:absolute;top:0;width:100%}.flex-container-main-content .block-with-button-search{display:flex;justify-content:flex-end}.flex-container-main-content .block-with-button-search>*{margin-left:.5em}.flex-container-main-content .block-with-button-search>input{height:26px;margin-left:0;max-width:200px;width:100%}.flex-container-main-content .block-with-button-search>dropdown{max-width:140px;width:100%}.flex-container-main-content .title-main-component{border-bottom:2px solid #1ca7ff}.clickable-table.clickable-table{cursor:pointer}.main-crud-container{height:calc(100vh - 76px)}.flex-container-fit-child{display:flex;flex-direction:column;height:100%;overflow:hidden}.flex-container-fit-child>div.fit-content{flex:1 1;position:relative}.flex-container-fit-child>div.fit-content>div{height:100%;overflow:auto;position:absolute;width:100%}.waiting-box{display:none;height:100%;left:0;position:fixed;top:0;width:100%;z-index:9999}.waiting-box .overlay{background-color:red;background-color:hsla(0,0%,42.7%,.5019607843137255);height:100%;width:100%}.waiting-box .content-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.waiting-box.show{display:block}.function-topbar>*{vertical-align:top}.function-topbar button{width:auto}.function-topbar p-fileUpload{margin-right:1em}.function-topbar .container-control{display:inline-flex;line-height:normal}.function-topbar .container-control dropdown{width:100%}:focus{outline-color:#a6d5fa!important}address{font-style:normal}body .p-toast .p-toast-message{border-radius:0;border-width:0 0 0 4px!important}.__status span,.status span{font-size:.8rem}p-table.single-check .p-datatable .p-datatable-tbody>tr{cursor:pointer}p-table.single-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight{background:#e3f2fd!important;outline:2px solid #a6d5fa}p-table.single-check .p-datatable .p-datatable-tbody>tr td.sticky .fix-sticky.top{display:none}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight{background:#e3f2fd!important}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight td{border-color:#fff}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight td .fix-sticky{background-color:#fff}.tn-animated-left-arrow-icon,.tn-animated-right-arrow-icon{height:32px;position:relative;width:14px;z-index:10}.tn-animated-right-arrow-icon{-webkit-animation:arrowBounceToRight .8s ease-in-out infinite alternate;animation:arrowBounceToRight .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon{-webkit-animation:arrowBounceToLeft .8s ease-in-out infinite alternate;animation:arrowBounceToLeft .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon:after,.tn-animated-left-arrow-icon:before,.tn-animated-right-arrow-icon:after,.tn-animated-right-arrow-icon:before{background-color:#88b0dd;content:\"\";display:block;height:20px;position:absolute;width:5px}.tn-animated-right-arrow-icon:before{left:4px;top:0;transform:rotate(-35deg)}.tn-animated-right-arrow-icon:after{left:4px;top:14px;transform:rotate(35deg)}.tn-animated-left-arrow-icon:before{right:4px;top:0;transform:rotate(35deg)}.tn-animated-left-arrow-icon:after{right:4px;top:14px;transform:rotate(-35deg)}@-webkit-keyframes arrowBounceToLeft{0%{transform:translateX(-3px)}to{transform:translateX(3px)}}@keyframes arrowBounceToLeft{0%{transform:translateX(-3px)}to{transform:translateX(3px)}}@-webkit-keyframes arrowBounceToRight{0%{transform:translateX(3px)}to{transform:translateX(-3px)}}@keyframes arrowBounceToRight{0%{transform:translateX(3px)}to{transform:translateX(-3px)}}.pass{color:#49c949}.not-pass,.pass{margin:5px;text-align:center}.not-pass{color:red}"]
|
|
48933
|
+
},] }
|
|
48934
|
+
];
|
|
48935
|
+
ChatBoxComponent.ctorParameters = function () { return [
|
|
48936
|
+
{ type: i0.Injector },
|
|
48937
|
+
{ type: ChatService },
|
|
48938
|
+
{ type: MessageBoardService },
|
|
48939
|
+
{ type: UserService },
|
|
48940
|
+
{ type: CheckControlVisibleService },
|
|
48941
|
+
{ type: SignalRService },
|
|
48942
|
+
{ type: FileExplorerService },
|
|
48943
|
+
{ type: CrudService },
|
|
48944
|
+
{ type: NotifierService },
|
|
48945
|
+
{ type: ModuleConfigService }
|
|
48946
|
+
]; };
|
|
48947
|
+
ChatBoxComponent.propDecorators = {
|
|
48948
|
+
taskId: [{ type: i0.Input }],
|
|
48949
|
+
serviceCode: [{ type: i0.Input }],
|
|
48950
|
+
entity: [{ type: i0.Input }],
|
|
48951
|
+
users: [{ type: i0.Input }],
|
|
48952
|
+
showSendMessageBox: [{ type: i0.Input }],
|
|
48953
|
+
input: [{ type: i0.ViewChild, args: ['input',] }],
|
|
48954
|
+
fileElement: [{ type: i0.ViewChild, args: ['fileElement',] }]
|
|
48955
|
+
};
|
|
48956
|
+
|
|
48957
|
+
// fix for prod build
|
|
48958
|
+
// const objectToFormData = objectToFormData_;
|
|
48959
|
+
var ChatSendMessageBoxComponent = /** @class */ (function (_super) {
|
|
48960
|
+
__extends(ChatSendMessageBoxComponent, _super);
|
|
48961
|
+
function ChatSendMessageBoxComponent(injector, _chatService, _checkControlVisible, _fileExplorerNewService, _notifierService) {
|
|
48962
|
+
var _this = _super.call(this, injector) || this;
|
|
48963
|
+
_this._chatService = _chatService;
|
|
48964
|
+
_this._checkControlVisible = _checkControlVisible;
|
|
48965
|
+
_this._fileExplorerNewService = _fileExplorerNewService;
|
|
48966
|
+
_this._notifierService = _notifierService;
|
|
48967
|
+
_this.model.driveFileDialog = { popupSize: {} };
|
|
48968
|
+
return _this;
|
|
48969
|
+
}
|
|
48970
|
+
ChatSendMessageBoxComponent.prototype.ngOnInit = function () {
|
|
48971
|
+
var _this = this;
|
|
48972
|
+
console.log('inside ChatSendMessageBoxComponent');
|
|
48973
|
+
this.model.dataSource = [];
|
|
48974
|
+
this.model.correlationIds = [];
|
|
48975
|
+
this.model.attachments = [];
|
|
48976
|
+
this.model.maxFileSize = 3000000;
|
|
48977
|
+
this.model.fileViewer = {};
|
|
48978
|
+
this._checkControlVisible.checkDisplayStatus(this.input.nativeElement).then(function (rs) {
|
|
48979
|
+
_this.input.nativeElement.focus();
|
|
48980
|
+
});
|
|
48981
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_INSTANCE_ID_LOADED, function (data) {
|
|
48982
|
+
if (data) {
|
|
48983
|
+
_this.model.id = data;
|
|
48984
|
+
_this.chatInstanceId = data;
|
|
48985
|
+
_this.notifiUserOnline(_this.model.id);
|
|
48986
|
+
}
|
|
48987
|
+
});
|
|
48988
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_MOUSE_UP, function (data) {
|
|
48989
|
+
if (data) {
|
|
48990
|
+
_this.onMouseUp(null);
|
|
48991
|
+
}
|
|
48992
|
+
});
|
|
48993
|
+
this.rootContext.subscribe('DRIVE_FILE_DIALOG.CLOSE_POPUP', function (response) {
|
|
48994
|
+
if (response != null) {
|
|
48995
|
+
var type = _this._commonService.isImage(response.name) ? 'image' : 'file';
|
|
48996
|
+
var attachmentItem_1 = {
|
|
48997
|
+
type: type,
|
|
48998
|
+
fileId: response.id,
|
|
48999
|
+
fileName: response.name
|
|
49000
|
+
};
|
|
49001
|
+
if (attachmentItem_1.type == 'image') {
|
|
49002
|
+
// Get preview url
|
|
49003
|
+
_this._fileExplorerNewService.getImageFileBase64(response.id).then(function (result) {
|
|
49004
|
+
attachmentItem_1.url = result;
|
|
49005
|
+
});
|
|
49006
|
+
}
|
|
49007
|
+
_this.model.attachments.push(attachmentItem_1);
|
|
49008
|
+
_this.input.nativeElement.focus();
|
|
49009
|
+
_this.model.classHasAttachment = 'attached-file';
|
|
49010
|
+
_this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_ATTACH_FILE, true);
|
|
49011
|
+
}
|
|
49012
|
+
_this.model.driveFileDialog.show = false;
|
|
49013
|
+
});
|
|
49014
|
+
this.rootContext.subscribe(ComCtxConstants.ROOT.DESTROY_TASK_DETAIL_COMPONENT, function (data) {
|
|
49015
|
+
if (_this.model.userOnlineId) {
|
|
49016
|
+
_this.removeUserOnline(_this.model.userOnlineId);
|
|
49017
|
+
}
|
|
49018
|
+
});
|
|
49019
|
+
};
|
|
49020
|
+
ChatSendMessageBoxComponent.prototype.browseFileFromPersonal = function () {
|
|
49021
|
+
this.model.driveFileDialog = {
|
|
49022
|
+
show: true
|
|
49023
|
+
};
|
|
49024
|
+
};
|
|
49025
|
+
ChatSendMessageBoxComponent.prototype.onSendMessage = function (message) {
|
|
49026
|
+
var e_1, _a;
|
|
49027
|
+
var _this = this;
|
|
49028
|
+
if ((!message || message.trim() == '') && this.model.attachments.length === 0) {
|
|
49029
|
+
return;
|
|
49030
|
+
}
|
|
49031
|
+
if (!message) {
|
|
49032
|
+
message = '';
|
|
49033
|
+
}
|
|
49034
|
+
message = message.trim();
|
|
49035
|
+
var objToSend = {
|
|
49036
|
+
chatId: this.model.id,
|
|
49037
|
+
messageContent: message,
|
|
49038
|
+
correlationId: this._commonService.guid()
|
|
49039
|
+
};
|
|
49040
|
+
var formData = new FormData();
|
|
49041
|
+
for (var key in objToSend) {
|
|
49042
|
+
formData.append(key, objToSend[key]);
|
|
49043
|
+
}
|
|
49044
|
+
try {
|
|
49045
|
+
for (var _b = __values(this.model.attachments), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
49046
|
+
var item = _c.value;
|
|
49047
|
+
// const item = this.model.attachments[itejm];
|
|
49048
|
+
if (item.fileId != null) {
|
|
49049
|
+
formData.append('fileId', item.fileId);
|
|
49050
|
+
}
|
|
49051
|
+
else {
|
|
49052
|
+
if (item.type == 'image') {
|
|
49053
|
+
formData.append('files', item.data, item.fileName);
|
|
49054
|
+
}
|
|
49055
|
+
else {
|
|
49056
|
+
formData.append('files', item.data);
|
|
49057
|
+
}
|
|
49058
|
+
}
|
|
49059
|
+
}
|
|
49060
|
+
}
|
|
49061
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
49062
|
+
finally {
|
|
49063
|
+
try {
|
|
49064
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
49065
|
+
}
|
|
49066
|
+
finally { if (e_1) throw e_1.error; }
|
|
49067
|
+
}
|
|
49068
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_SENDING, {
|
|
49069
|
+
message: objToSend,
|
|
49070
|
+
attachments: this.model.attachments
|
|
49071
|
+
});
|
|
49072
|
+
// reset attachment list
|
|
49073
|
+
this.model.attachments.length = 0;
|
|
49074
|
+
this.model.content = '';
|
|
49075
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_ATTACH_FILE, false);
|
|
49076
|
+
this.model.classHasAttachment = '';
|
|
49077
|
+
this._chatService.sendMessage(formData).then(function (rs) {
|
|
49078
|
+
_this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_SENT, { message: objToSend, status: true });
|
|
49079
|
+
}).catch(function (err) {
|
|
49080
|
+
_this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_SENT, {
|
|
49081
|
+
message: objToSend,
|
|
49082
|
+
status: false,
|
|
49083
|
+
error: err.error
|
|
49084
|
+
});
|
|
49085
|
+
_this._notifierService.showWarningByResponse(err);
|
|
49086
|
+
});
|
|
49087
|
+
};
|
|
49088
|
+
ChatSendMessageBoxComponent.prototype.handlePaste = function (event) {
|
|
49089
|
+
// console.log(event.clipboardData);
|
|
49090
|
+
var objectData = this.getImageClipboardData(event);
|
|
49091
|
+
if (objectData) {
|
|
49092
|
+
this.model.attachments.push({
|
|
49093
|
+
type: 'image',
|
|
49094
|
+
url: objectData.url,
|
|
49095
|
+
data: objectData.blob, fileName: this._commonService.guid() + '.png'
|
|
49096
|
+
});
|
|
49097
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_ATTACH_FILE, true);
|
|
49098
|
+
this.model.classHasAttachment = 'attached-file';
|
|
49099
|
+
}
|
|
49100
|
+
};
|
|
49101
|
+
ChatSendMessageBoxComponent.prototype.getImageClipboardData = function (e) {
|
|
49102
|
+
for (var i = 0; i < e.clipboardData.items.length; i++) {
|
|
49103
|
+
var item = e.clipboardData.items[i];
|
|
49104
|
+
if (item.type.indexOf('image') != -1) {
|
|
49105
|
+
var imageObj = item.getAsFile();
|
|
49106
|
+
if (imageObj.size < this.model.maxFileSize) {
|
|
49107
|
+
return { url: URL.createObjectURL(imageObj), blob: imageObj };
|
|
49108
|
+
}
|
|
49109
|
+
else {
|
|
49110
|
+
return null;
|
|
49111
|
+
}
|
|
49112
|
+
}
|
|
49113
|
+
}
|
|
49114
|
+
return null;
|
|
49115
|
+
};
|
|
49116
|
+
ChatSendMessageBoxComponent.prototype.browseFileFromComputer = function () {
|
|
49117
|
+
this.fileElement.advancedFileInput.nativeElement.click();
|
|
49118
|
+
};
|
|
49119
|
+
ChatSendMessageBoxComponent.prototype.onSelectFileFromComputer = function (evt) {
|
|
49120
|
+
try {
|
|
49121
|
+
if (evt.files && evt.files.length > 0) {
|
|
49122
|
+
for (var index = 0; index < evt.files.length; index++) {
|
|
49123
|
+
var fileName = evt.files[index].name;
|
|
49124
|
+
var type = this._commonService.isImage(fileName) ? 'image' : 'file';
|
|
49125
|
+
var attachmentItem = {
|
|
49126
|
+
type: type,
|
|
49127
|
+
data: evt.files[index], fileName: fileName
|
|
49128
|
+
};
|
|
49129
|
+
if (attachmentItem.type == 'image') {
|
|
49130
|
+
attachmentItem.url = evt.files[index].objectURL.changingThisBreaksApplicationSecurity;
|
|
49131
|
+
}
|
|
49132
|
+
this.model.attachments.push(attachmentItem);
|
|
49133
|
+
}
|
|
49134
|
+
this.input.nativeElement.focus();
|
|
49135
|
+
this.model.classHasAttachment = 'attached-file';
|
|
49136
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_ATTACH_FILE, true);
|
|
49137
|
+
}
|
|
49138
|
+
}
|
|
49139
|
+
catch (e) {
|
|
49140
|
+
console.error('error on process select file computer', e);
|
|
49141
|
+
}
|
|
49142
|
+
this.fileElement.clear();
|
|
49143
|
+
};
|
|
49144
|
+
ChatSendMessageBoxComponent.prototype.removeAttachment = function (item) {
|
|
49145
|
+
var attachments = this.model.attachments;
|
|
49146
|
+
var index = attachments.findIndex(function (x) { return x.url == item.url; });
|
|
49147
|
+
this.model.attachments.splice(index, 1);
|
|
49148
|
+
if (this.model.attachments.length === 0) {
|
|
49149
|
+
this.model.classHasAttachment = '';
|
|
49150
|
+
this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_MESSAGE_ATTACH_FILE, false);
|
|
49151
|
+
}
|
|
49152
|
+
};
|
|
49153
|
+
ChatSendMessageBoxComponent.prototype.onMouseUp = function ($event) {
|
|
49154
|
+
this.input.nativeElement.focus();
|
|
49155
|
+
};
|
|
49156
|
+
ChatSendMessageBoxComponent.prototype.cancelBlur = function (event) {
|
|
49157
|
+
event.preventDefault();
|
|
49158
|
+
};
|
|
49159
|
+
ChatSendMessageBoxComponent.prototype.ngOnDestroy = function () {
|
|
49160
|
+
this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_INSTANCE_ID_LOADED);
|
|
49161
|
+
this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_MOUSE_UP);
|
|
49162
|
+
};
|
|
49163
|
+
ChatSendMessageBoxComponent.prototype.notifiUserOnline = function (chatId) {
|
|
49164
|
+
var _this = this;
|
|
49165
|
+
this._chatService.insertUserOnline(chatId).then(function (rs) {
|
|
49166
|
+
if (rs.success) {
|
|
49167
|
+
_this.model.userOnlineId = rs.data;
|
|
49168
|
+
}
|
|
49169
|
+
});
|
|
49170
|
+
};
|
|
49171
|
+
ChatSendMessageBoxComponent.prototype.removeUserOnline = function (userOnlineId) {
|
|
49172
|
+
var _this = this;
|
|
49173
|
+
this.chatInstanceId = '';
|
|
49174
|
+
this._chatService.removeUserOnline(userOnlineId).then(function (rs) {
|
|
49175
|
+
if (rs.success) {
|
|
49176
|
+
_this._notifierService.showWarning('Đã bỏ người dùng thành công');
|
|
49177
|
+
}
|
|
49178
|
+
});
|
|
49179
|
+
};
|
|
49180
|
+
ChatSendMessageBoxComponent.prototype.clickInputText = function () {
|
|
49181
|
+
if (this.model.instanceId) {
|
|
49182
|
+
this._chatService.markAsReadAllContents(this.model.id).then(function (rs) {
|
|
49183
|
+
console.log('markAsReadAllContents');
|
|
49184
|
+
});
|
|
49185
|
+
}
|
|
49186
|
+
};
|
|
49187
|
+
return ChatSendMessageBoxComponent;
|
|
49188
|
+
}(ComponentBase));
|
|
49189
|
+
ChatSendMessageBoxComponent.decorators = [
|
|
49190
|
+
{ type: i0.Component, args: [{
|
|
49191
|
+
selector: 'chat-send-message-box',
|
|
49192
|
+
template: "<div class=\"dashboard\" (mouseup)=\"onMouseUp($event)\">\r\n <div class=\"chat\">\r\n <div class=\"new-message\">\r\n <div class=\"message-emotion\">\r\n <i class=\"far fa-smile\" style=\"color: gray;\" disabled=\"true\"></i>\r\n </div>\r\n <div class=\"message-attachment\" pTooltip=\"\u0110\u00EDnh k\u00E8m file\" tooltipPosition=\"top\" (click)=\"op.toggle($event)\">\r\n <i class=\"fas fa-paperclip\"></i>\r\n </div>\r\n <p-overlayPanel #op [dismissable]=\"true\" [appendTo]=\"'body'\" [styleClass]=\"'paging-advance-overlay'\"\r\n (mouseup)=\"onMouseUp($event)\">\r\n <ul class=\"paging-advance\">\r\n <li (click)=\"browseFileFromPersonal()\">T\u1EEB file c\u00E1 nh\u00E2n</li>\r\n <li (click)=\"browseFileFromComputer()\">T\u1EA3i l\u00EAn t\u1EEB m\u00E1y t\u00EDnh</li>\r\n </ul>\r\n </p-overlayPanel>\r\n <div class=\"message-input p-float-label\">\r\n <input #input pInputText\r\n id=\"message\"\r\n autocomplete=\"off\" autocorrect=\"off\"\r\n spellcheck=\"false\" class=\"ui-inputtext\"\r\n type=\"text\" placeholder=\"N\u1ED9i dung tin nh\u1EAFn\"\r\n [(ngModel)]=\"model.content\"\r\n (keyup.enter)=\"onSendMessage($event.target.value)\" (keydown.shift.tab)=\"cancelBlur($event)\"\r\n (keydown.tab)=\"cancelBlur($event)\" (paste)=\"handlePaste($event)\" (click)=\"clickInputText()\"/>\r\n </div>\r\n <div>\r\n <button pButton class=\"p-button-danger\" icon=\"fas fa-send\" type=\"button\" label=\"G\u1EEDi\"\r\n (click)=\"onSendMessage(model.content)\">\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"attachment-list\" [ngClass]=\"model.classHasAttachment\">\r\n <tn-custom-scrollbar #scrollbar [style]=\"{'height': '100px'}\">\r\n <div *ngFor=\"let item of model.attachments\" class=\"attachment-item\">\r\n <img *ngIf=\"item.type == 'image'\" [src]=\"item.url | safeUrl\"/>\r\n <span *ngIf=\"item.type == 'file'\">{{item.fileName}}</span>\r\n <i class=\"far fa-times-circle label-danger remove-file-attachment\"\r\n (click)=\"removeAttachment(item)\"></i>\r\n </div>\r\n </tn-custom-scrollbar>\r\n <!-- <div class=\"clearfix\"></div>-->\r\n </div>\r\n </div>\r\n</div>\r\n<p-fileUpload [ngStyle]=\"{'display': 'none'}\" #fileElement (onSelect)=\"onSelectFileFromComputer($event)\"\r\n multiple=\"multiple\" name=\"fileUpload\" [maxFileSize]=\"model.maxFileSize\" auto=\"false\">\r\n</p-fileUpload>\r\n\r\n<!-- <app-drive-file-dialog *ngIf=\"model.driveFileDialog.show\" [parentDataContext]=\"dataContext\"\r\n []=\"model.driveFileDialog\" #driveFileDialog>\r\n</app-drive-file-dialog> -->\r\n",
|
|
49193
|
+
providers: [ComponentContextService],
|
|
49194
|
+
styles: ["", "@charset \"UTF-8\";@import url(C:\\Users\\vietp\\source\\repos\\5.1\\shared\\AppSharedV5\\node_modules\\@angular\\material\\prebuilt-themes\\indigo-pink.css);@import url(C:\\Users\\vietp\\source\\repos\\5.1\\shared\\AppSharedV5\\node_modules\\jsoneditor\\dist\\jsoneditor.min.css);.flex{display:flex}.flex .fit{flex:1 1}.flex.flex-column{flex-direction:column}.flex.flex-wrap{flex-wrap:wrap}.flex.center-v{align-items:center}.flex.center-all,.flex.center-h{justify-content:center}.flex.center-all{align-items:center}.validate-item{color:#e00000;display:inline-block;font-size:.9em;white-space:nowrap}.tn-scroll-bar.bgWhite>div,.validate-item{background-color:#fff}.label-primary{background-color:#1ab394;padding:2px}.label-danger,.label-primary{border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px}.label-danger{background-color:#ed5565;padding:2px 5px}.label-warning{background-color:#b8860b}.label-secondary,.label-warning{border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px;padding:2px}.label-secondary{background-color:#a9a9a9}.label-done{background-color:#3b1ef7;border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px;padding:2px}.text-navy{color:#1ab394!important}.text-danger{color:red!important}.fa-user-edit{font-size:14px}.flexcolumn{border:1px solid #eee;border-radius:5px;min-height:80px;overflow-x:hidden;overflow-y:hidden}.flexcolumn,.has2ScrollZone2 .flexcolumn{max-height:calc(100vh - 180px)}.headerNoBorder>th{border:none!important;border-bottom:1px solid #eee!important}.cellNoBorder table tr td{border:0!important}.layout-wrapper .layout-main{overflow:hidden;padding:60px 0 0}div.circleButton{border-radius:50%;display:inline-block;height:32px;line-height:32px;margin-bottom:4px;margin-top:4px;overflow:hidden;position:relative;text-align:center;transform:perspective(1px);width:32px}div.circleButton>a{line-height:32px;padding:0!important}div.circleButton>a>i{width:24px!important}div.circleButton:before{background:#e6e6e6;border-radius:50%;bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;transform:scale(0);transition:all .3s cubic-bezier(.4,.34,.01,.97);z-index:-1}div.circleButton:hover:before{transform:scale(1)}.message-notice{background:#e0e0e0;text-align:center}.message-created-by{color:#888;font-size:.82em;font-weight:400;margin-bottom:3px;margin-left:45px;margin-top:5px}.message-created{color:#495057;display:inline-block;font-size:.82em;margin-bottom:0;margin-top:0}.message-own .message-created{padding-left:10px;padding-right:6px}.message-from .message-created{padding-left:6px;padding-right:10px}.message-content{color:#000;line-height:20px;margin-bottom:6px;margin-top:3px;position:relative}.message-content i{display:none}.message-content:hover i{display:block}.message-content:hover{padding-right:20px!important}.chat-box-content{max-height:500px}.attachment-list .attachment-item{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;background:#f1f1f1;border:1px solid #ccc;border-radius:8px;box-shadow:1px 2px 3px rgba(0,0,0,.06);float:left;height:84px;margin:8px;overflow:hidden;position:relative;text-align:center;user-select:none;width:84px}.attachment-list .attachment-item img{height:100%;width:100%}.attachment-list .attachment-item span{left:0;padding:5px;position:absolute;top:25px;width:100%;word-break:break-all}.clearfix{clear:both}.dashboard .chat ul li img.message-img{float:none;height:120px;margin-left:0;width:auto}.message-attachment{cursor:pointer;font-size:1.5em;margin:0 5px 0 0;position:relative}.hidden{display:none}.message-input{width:100%}.message-input label{font-size:1.2rem}.remove-file-attachment{background:#495057;border-radius:50%;color:#fff;cursor:pointer;font-size:20px;position:absolute;right:5px;top:5px}.attachment-list{background:#fff;bottom:51px;box-shadow:0 -2px 3px -3px rgba(0,0,0,.21176470588235294);display:none;height:100px;left:-15px;position:absolute;width:calc(100% + 30px)}.attachment-list.attached-file{display:block}.dashboard{margin-bottom:-15px;margin-top:-5px}.dashboard .timeline>.ui-g .ui-g-9 .event-text{color:#555;white-space:nowrap}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2{line-height:18px;padding-left:30px;text-align:justify;white-space:pre-wrap}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2 i{left:20px;margin-top:3px;position:absolute}.new-message{align-items:center;justify-content:center}.dashboard .chat .new-message{border:0;display:flex;margin:0;padding:0;text-align:left}.dashboard .chat .new-message i{color:#495057}.dashboard .chat .new-message .message-attachment{border:0}.dashboard .chat .new-message .button-send{display:inline-block;line-height:40px;position:relative}.dashboard .chat .new-message .button-send .p-button-label{text-align:center}.dashboard .chat .new-message .message-emotion{display:inline-block;height:100%;line-height:40px;text-align:center;width:40px}.dashboard .chat .new-message .message-emotion i{font-size:24px;line-height:inherit}.dashboard .chat .new-message .message-input{width:calc(100% - 155px)}.dashboard .chat ul li.message-from,.dashboard .chat ul li.message-own{padding:0}.dashboard .chat ul li.message-from>span{background-color:#f0e3fd;border:0;border-radius:2px 20px 20px 2px}.dashboard .chat ul li.message-from>.first,.dashboard .chat ul li.message-from>.middle{margin-left:45px!important}.dashboard .chat ul li.message-from>.last{border-radius:2px 20px 20px 20px;margin-left:45px!important}.dashboard .chat ul li.message-from>img{border-radius:50%;margin-top:5px;position:absolute;width:36px}.dashboard .chat ul li.message-own>span{background-color:#def6f8;border:0;border-radius:20px 2px 2px 20px;text-align:right}.dashboard .chat ul li.message-own>span.sending{background-color:#eee}.dashboard .chat ul li.message-own>span.last{border-radius:20px 2px 20px 20px}.dashboard .chat ul li.message-own .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-left:0;padding-right:0}.dashboard .chat ul li.message-own .attachment span.attachment-item a{color:#555;cursor:pointer;display:inline-block;font-weight:700}.dashboard .chat ul li.message-own>div.file{background:#f1f1f1;border:1px solid #e4e4e4;border-radius:6px;display:inline-block;margin:1px;overflow:hidden;text-align:right}.dashboard .chat ul li.message-from .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-left:0;padding-right:0}.dashboard .chat ul li.message-from .attachment span.attachment-item a{color:#555;cursor:pointer;display:inline-block;font-weight:700}.dashboard .chat ul li.message-from .attachment span.attachment-item a img{margin-right:0}.dashboard .chat ul li.message-from>div.file{background:#f1f1f1;border:1px solid #e4e4e4;border-radius:6px;display:inline-block;margin:1px;overflow:hidden;text-align:left}.dashboard .chat ul li .attachment span.attachment-item a>i{padding-right:8px}.dashboard .chat ul li div.file p.attachment{display:inline-block;margin-bottom:5px}.dashboard .chat ul li.message-from{text-align:left}.dashboard .chat ul li.message-own{text-align:right}.dashboard .chat ul li>div.file.image{height:170px;max-width:100%;padding:15px;transition:width .15s linear;width:220px}.dashboard .chat ul li>div.file.image p.attachment{height:120px}.dashboard .chat ul li>div.file{padding:15px}.dashboard .chat ul li>div.file p,.dashboard .chat ul li>div.file span{display:inline-block;margin:0;padding:0}.visible{opacity:1;transition:opacity .15s linear;visibility:visible}.hidden{opacity:0;transition:visibility 0s .1s,opacity .1s linear;visibility:hidden}.visible2{opacity:1;transition:opacity .35s linear;visibility:visible}.hidden2{opacity:0;transition:visibility 0s .3s,opacity .3s linear;visibility:hidden}.dashboard .chat{position:relative}.dashboard .chat .scroll-to-bottom{bottom:6px;min-height:40px;padding-right:12px;position:sticky;text-align:right}.dashboard .chat .scroll-to-bottom span{background:#495057;border:2px solid #fff;border-radius:50%;box-shadow:0 0 10px rgba(0,0,0,.34901960784313724);color:#fff;cursor:pointer;display:inline-block;font-size:20px;height:35px;line-height:35px;overflow:hidden;text-align:center;width:35px}.dashboard .chat .group-info{line-height:30px;margin:-10px;padding:5px 10px;top:0;z-index:99}.dashboard .chat .group-info,.dashboard .chat .pin{background:#fff;box-shadow:0 0 3px -1px rgba(0,0,0,.21176470588235294);position:sticky}.dashboard .chat .pin{margin-bottom:10px;margin-left:-10px;top:40px;width:calc(100% + 20px);z-index:98}.dashboard .chat ul li.message-from.pin>span,.dashboard .chat ul li.message-own.pin>span{background-color:transparent}.dashboard .chat ul li.message-from.pin>span{margin-left:0}.dashboard .chat .message-content i{color:#495057;cursor:pointer;font-size:11px}.dashboard .chat .pin .message-content i{display:block}.dashboard .chat li.message-from .message-content{padding-left:6px}.dashboard .chat li.message-from .message-content i{padding:5px}.dashboard .chat li.message-own .message-content i{padding:5px;position:absolute;right:-15px}.dashboard .chat .group-info .circleButton{float:right;margin-bottom:0;margin-top:0}.dashboard .chat ul{margin-top:20px;padding:0}.dashboard .chat .new-message .message-input input.ui-inputtext:focus{box-shadow:none;outline:none}.dashboard .chat ul.hasPin{margin-top:10px}.dashboard .chat .group-info a{color:#495057}.normalHtml,.normalHtml b,.normalHtml strong{font-weight:400}.normalHtml{display:inline-block}.avatar-viewer .profile-image{border:1px solid #fff;border-radius:50%;height:40px;margin-top:-6px;width:40px}a.button>i{margin-right:5px}.dashboard .timeline{padding-top:20px}.ui-inputgroup .ui-inputtext{padding-right:0}.new-message .ui-inputtext{width:100%}.full-screen,.full-screen>.p-dialog{height:100%!important;left:0!important;max-height:100%;min-height:unset!important;min-width:100%!important;top:0!important;width:100%!important}#image-view-list.image-gallery-2{background-color:rgba(0,0,0,.4);height:calc(100vh - 41px);margin:-14px auto 0;touch-action:none;width:100%}#image-view-list.image-gallery-2 .image-container{background-color:transparent;border:0;bottom:0;height:85%;margin:auto}#image-view-list.image-gallery-2 .image-container .iv-snap-view{bottom:20px;left:calc(50% - 75px);top:auto}#image-view-list.image-gallery-2 .image-container .iv-image-view img{touch-action:auto}#image-view-list .inline-icon{margin-top:-41px}#image-view-list .footer-info,#image-view-list .material-icons.next,#image-view-list .material-icons.prev{display:none}#image-view-list .options-image-viewer{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;margin-right:37px;user-select:none}.mobile-image-viewer-close{color:#fff;cursor:pointer;font-size:x-large;height:42px;line-height:42px;padding-right:7px;padding-top:2px;position:absolute;right:0;text-align:center;top:0;vertical-align:middle;width:37px}.mobile-image-viewer-close:hover{color:#feca37!important}.hide-holder{padding:0}.file-ex-name{word-break:break-all}.box-function{background:#fff;border-radius:0 0 5px 5px;border-top:1px solid #e8e8e8;bottom:0;left:0;padding:8px 30px;position:absolute;text-align:right;width:100%}.box-function button{margin-left:5px}.quick-note-button-holder{bottom:40px;display:none;height:50px;position:absolute;right:50px;width:50px;z-index:99}.quick-note-button{background:#ffc107;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:2em;height:50px;line-height:50px;outline:none;text-align:center;width:50px}.quick-note-button:hover{color:#fff}.all-note-button{background:#ffd24b;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:1.5em;height:40px;line-height:40px;outline:none;position:absolute;right:5px;text-align:center;top:5px;transition:right;transition-duration:.16s;transition-timing-function:ease-in;width:40px;z-index:-1}.all-note-button:hover{color:#fff}.setting-note-button{background:#ffd24b;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:1.5em;height:40px;line-height:40px;outline:none;position:absolute;right:5px;text-align:center;top:5px;transition:right;transition-duration:.16s;transition-timing-function:ease-in;width:40px;z-index:-1}.setting-note-button:hover{color:#fff}.pinned-notes-holder{bottom:20px;display:none;left:20px;position:absolute;width:250px;z-index:98}.pinned-notes{background:transparent;display:block;outline:none;padding:0}.pinned-notes-header{font-size:1rem;font-weight:700}.pinned-notes-setting{position:absolute;right:.5rem}.pinned-note{background-color:#fff1ac;box-shadow:1px 2px 3px rgba(185,139,6,.6313725490196078);font-size:.8rem;margin-bottom:10px;padding:0;position:relative}.pinned-note:last-child{margin-bottom:0}.pinned-notes-minimize-button{background:#ffc003;border:1px solid #fff;border-radius:50%;box-shadow:1px 2px 3px rgba(185,139,6,.6313725490196078);color:#fff;cursor:pointer;height:25px;padding-top:5px;position:absolute;right:-15px;text-align:center;top:-15px;width:25px;z-index:1}.pinned-note-header-line{border:1px solid #fff;box-shadow:1px 1px 2px rgba(0,0,0,.4);height:calc(100% - 1rem);left:3px;margin-bottom:.5rem;margin-top:.5rem;max-height:20px;position:absolute;width:13px}.pinned-note-header-right{cursor:pointer;float:right;margin-left:3px;width:32px}.pinned-note-header-time{font-size:.6rem}.pinned-note-header-button-unpin{display:none;float:left;height:14px;margin-right:2px;opacity:.8;width:14px}.pinned-note-header-button-complete{display:none;padding-top:2px}.pinned-note-body{float:right;padding:.5rem .5rem .5rem 25px;width:100%}.pinned-note-body:hover{background-color:#feeb82}.pinned-note-body:hover .pinned-note-header-time{display:none}.pinned-note-body:hover .pinned-note-header-button-complete,.pinned-note-body:hover .pinned-note-header-button-unpin{display:block}.pinned-note-line-title{color:#333;display:block;font-weight:700;padding-bottom:6px}.pinned-note-line{display:block}.view-port{border-radius:5px;box-shadow:0 0 0 9999px rgba(0,0,0,.5882352941176471);display:none;height:0;width:0;z-index:999}.view-port,.view-port-mask{background:transparent;position:absolute}.view-port-mask{display:block;height:100%;left:0;top:0;width:100%;z-index:9998}.tinymce-control{border:1px solid #ccc;display:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;width:100%}.input-tab-trap{filter:alpha(opacity=0)!important;opacity:0!important;overflow:hidden!important;width:0!important}.color-value input{font-size:.8em;line-height:16px}.dialog-material.mobile{width:100%!important}audio,audio:focus,video,video:focus{outline:none}.iv-image-view img.iv-image{-webkit-animation:fadein .5s;animation:fadein .5s;visibility:hidden!important}@-webkit-keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.iv-image-view img.iv-image.show{visibility:visible!important}.row-line{padding-bottom:0;padding-top:0}.fc-ltr{padding-bottom:7px}.padding-bottom-5px{padding-bottom:5px}.no-margin{margin:0!important}.no-padding{padding:0}.no-padding-left{padding-left:0}.float-left{float:left}body .fc .fc-toolbar .fc-button{background-color:#007ad9;border:1px solid #007ad9;border-radius:3px;color:#fff;font-size:14px;transition:background-color .2s,box-shadow .2s}body .fc .fc-toolbar .fc-button:enabled:hover{background-color:#116fbf;border-color:#116fbf;color:#fff}body .fc .fc-toolbar .fc-button:focus{box-shadow:0 0 0 .2em #8dcdff;outline:0 none;outline-offset:0}body .fc .fc-toolbar .fc-button-group .fc-button{border-radius:0}body .fc .fc-toolbar .fc-button-group .fc-button:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}body .fc .fc-toolbar .fc-button-group .fc-button:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}body .fc .fc-toolbar .fc-right .fc-button{border-radius:0}body .fc .fc-toolbar .fc-right .fc-button:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}body .fc .fc-toolbar .fc-right .fc-button:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.fc-toolbar>*>:not(:first-child){margin-left:0}.fc-axis,.fc-dayGridMonth-button,.fc-timeGridDay-button,.fc-timeGridWeek-button,.old-content{line-height:0;text-indent:-9999px}.fc-axis:after,.fc-dayGridMonth-button:after,.fc-timeGridDay-button:after,.fc-timeGridWeek-button:after,.new-content{display:block;line-height:normal;text-indent:0}.fc-dayGridMonth-button:after{content:\"Th\u00E1ng\";padding:.2em}.fc-timeGridWeek-button:after{content:\"Tu\u1EA7n\";padding:.2em}.fc-timeGridDay-button:after{content:\"Ng\u00E0y\";padding:.2em}body .fc th{background-color:#f4f4f4;border:1px solid #c8c8c8;color:#333;padding:.571em 1em}.ui-fluid .button-group button,.ui-fluid .button-group p-button{margin-right:.5em!important;text-align:left;width:auto}.layout-wrapper .layout-menu-container{z-index:97}.base-status,.base-status-aborted,.base-status-approved,.base-status-completed,.base-status-create-new,.base-status-ended,.base-status-high,.base-status-immediately,.base-status-low,.base-status-medium,.base-status-on-conducting,.base-status-on-going,.base-status-pending,.base-status-rejected,.base-status-returned,.base-status-urgent{border-radius:.25em;color:#fff;font-size:.8em;padding:3px;text-align:center}.base-status-create-new{background-color:#f2f2f2;color:#666}.base-status-on-conducting,.base-status-on-going{background-color:#337ab7}.base-status-pending{background-color:#ffba01}.base-status-approved{background-color:#34a835}.base-status-returned{background-color:#ffba01}.base-status-rejected{background-color:#d9534f}.base-status-completed{background-color:#34a835}.base-status-aborted{background-color:#ffba01}.base-status-ended{background-color:#34a835}.base-status-low,.base-status-medium{background-color:#f2f2f2;color:#666}.base-status-high{background-color:#ffba01}.base-status-immediately,.base-status-urgent{background-color:#d9534f}.text-align-center{text-align:center}.font-weight-bold{font-weight:700}.landing-body .landing-menu li a:hover{border-bottom:none}.landing-body .landing-menu li:first-child{margin-left:8px}.crud-form .label-control p{margin:0;padding:0}.crud-form .tn-check-box-list .p-row{display:block;padding:.5em;width:100%}.crud-form dropdown,.crud-form tn-mask{width:100%}.crud-form .tn-dropdown{min-height:32px}.crud-form .tn-dropdown.free-text.horizontal{display:flex}.crud-form .tn-dropdown.free-text.horizontal>div{flex-grow:1;padding-left:.5em;padding-right:.5em}.crud-form .tn-dropdown.free-text.horizontal>div:first-child{padding-left:0}.crud-form .tn-dropdown.free-text.horizontal>div:last-child{padding-right:0}.crud-form .tn-dropdown.free-text.vertical input.ui-inputtext.input-free-text{margin-top:.5em}.crud-form.assessment .label-control{font-weight:700}.crud-form.assessment .label-control.haveIndex{display:block;margin-bottom:5px;padding-left:20px;position:relative}.crud-form.assessment .label-control.haveIndex:before{content:\" \" attr(label-index) \".\";left:0;position:absolute;top:0}.crud-form.assessment .ViewMode{border-bottom:none}.crud-form.assessment .ViewMode .label-control{margin-bottom:0}body .ui-inputtext.min-width{padding:6px}.ps__rail-x,.ps__rail-y{z-index:2}.zIndex5 .ps__rail-x,.zIndex5 .ps__rail-y{z-index:5}.table-sticky table{border-collapse:separate;border-spacing:0}.table-sticky tr td,.table-sticky tr th{border:1px solid #eee!important;border-left:none!important;border-top:none!important}.table-sticky tr td:first-child,.table-sticky tr th:first-child{border-left:1px solid #eee!important}.table-sticky tr td:last-child,.table-sticky tr th:last-child{border-right:none!important}.table-sticky tr:first-child th{border-top:1px solid #eee!important}.table-sticky th{background:#eee}.table-sticky tbody td.disabled{background:#eee!important}.table-sticky tbody td.disabled:not(:last-child){border-right:1px solid #fff!important}.table-sticky.fix-height tr:first-child th{position:sticky;top:0;z-index:2}.container-flex{align-items:center;display:flex}.container-flex>div:first-child{flex:0 0 auto;margin-right:.5em}.container-flex>div:last-child{flex-grow:1}.container-control{display:flex}.container-control>span.label{flex:0 0 auto;padding-right:.5em;padding-top:.5em}.container-control>span.label+*{flex-grow:1;flex-shrink:1;position:relative}.container-control>span.label+* .tn-dropdown,.container-control>span.label+* .ui-autocomplete-multiple,.container-control>span.label+* .ui-inputgroup .ui-inputtext{width:100%}.container-control>span.label+* .validation-container{margin-top:3px}.container-control>span.label+* .validation-container .validate-item{white-space:unset}.container-control>span.label+*>div{left:0;position:absolute;top:0;width:100%}.container-control.no-label>span.label{display:none}.container-control.inline{display:inline-flex}.align-flex-center{align-items:center;display:flex;justify-content:center}@media print{.isPrinting>*{display:none}.isPrinting app-print-layout{display:block}}.layout-wrapper .topbar .topbar-left,.layout-wrapper .topbar .topbar-right{background:#397ac3}#searchResultPanel-holder{padding:0 .5em}.cus-dropdown{line-height:normal;margin-right:1em}.tn-thumbnail{padding:.5rem}.tn-thumbnail.tn-thumbnail.tn-thumbnail{box-sizing:border-box}.fa-10:before{content:\"A+\";font-family:cursive;font-weight:700}.layout-wrapper .topbar .topbar-right #menu-button i{font-size:20px;margin-top:4px}.layout-wrapper .layout-menu li a i.menuitem-toggle-icon{font-size:15px;margin-left:auto}.flex-container-main-content{display:flex;flex-direction:column}.flex-container-main-content>div:last-child{background-color:#f4f4f4;display:flex;flex:1 1;overflow:hidden;position:relative}.flex-container-main-content>div:last-child>div{height:100%;left:0;overflow:hidden;padding-top:.5em;position:absolute;top:0;width:100%}.flex-container-main-content .block-with-button-search{display:flex;justify-content:flex-end}.flex-container-main-content .block-with-button-search>*{margin-left:.5em}.flex-container-main-content .block-with-button-search>input{height:26px;margin-left:0;max-width:200px;width:100%}.flex-container-main-content .block-with-button-search>dropdown{max-width:140px;width:100%}.flex-container-main-content .title-main-component{border-bottom:2px solid #1ca7ff}.clickable-table.clickable-table{cursor:pointer}.main-crud-container{height:calc(100vh - 76px)}.flex-container-fit-child{display:flex;flex-direction:column;height:100%;overflow:hidden}.flex-container-fit-child>div.fit-content{flex:1 1;position:relative}.flex-container-fit-child>div.fit-content>div{height:100%;overflow:auto;position:absolute;width:100%}.waiting-box{display:none;height:100%;left:0;position:fixed;top:0;width:100%;z-index:9999}.waiting-box .overlay{background-color:red;background-color:hsla(0,0%,42.7%,.5019607843137255);height:100%;width:100%}.waiting-box .content-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.waiting-box.show{display:block}.function-topbar>*{vertical-align:top}.function-topbar button{width:auto}.function-topbar p-fileUpload{margin-right:1em}.function-topbar .container-control{display:inline-flex;line-height:normal}.function-topbar .container-control dropdown{width:100%}:focus{outline-color:#a6d5fa!important}address{font-style:normal}body .p-toast .p-toast-message{border-radius:0;border-width:0 0 0 4px!important}.__status span,.status span{font-size:.8rem}p-table.single-check .p-datatable .p-datatable-tbody>tr{cursor:pointer}p-table.single-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight{background:#e3f2fd!important;outline:2px solid #a6d5fa}p-table.single-check .p-datatable .p-datatable-tbody>tr td.sticky .fix-sticky.top{display:none}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight{background:#e3f2fd!important}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight td{border-color:#fff}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight td .fix-sticky{background-color:#fff}.tn-animated-left-arrow-icon,.tn-animated-right-arrow-icon{height:32px;position:relative;width:14px;z-index:10}.tn-animated-right-arrow-icon{-webkit-animation:arrowBounceToRight .8s ease-in-out infinite alternate;animation:arrowBounceToRight .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon{-webkit-animation:arrowBounceToLeft .8s ease-in-out infinite alternate;animation:arrowBounceToLeft .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon:after,.tn-animated-left-arrow-icon:before,.tn-animated-right-arrow-icon:after,.tn-animated-right-arrow-icon:before{background-color:#88b0dd;content:\"\";display:block;height:20px;position:absolute;width:5px}.tn-animated-right-arrow-icon:before{left:4px;top:0;transform:rotate(-35deg)}.tn-animated-right-arrow-icon:after{left:4px;top:14px;transform:rotate(35deg)}.tn-animated-left-arrow-icon:before{right:4px;top:0;transform:rotate(35deg)}.tn-animated-left-arrow-icon:after{right:4px;top:14px;transform:rotate(-35deg)}@-webkit-keyframes arrowBounceToLeft{0%{transform:translateX(-3px)}to{transform:translateX(3px)}}@keyframes arrowBounceToLeft{0%{transform:translateX(-3px)}to{transform:translateX(3px)}}@-webkit-keyframes arrowBounceToRight{0%{transform:translateX(3px)}to{transform:translateX(-3px)}}@keyframes arrowBounceToRight{0%{transform:translateX(3px)}to{transform:translateX(-3px)}}.pass{color:#49c949}.not-pass,.pass{margin:5px;text-align:center}.not-pass{color:red}"]
|
|
49195
|
+
},] }
|
|
49196
|
+
];
|
|
49197
|
+
ChatSendMessageBoxComponent.ctorParameters = function () { return [
|
|
49198
|
+
{ type: i0.Injector },
|
|
49199
|
+
{ type: ChatService },
|
|
49200
|
+
{ type: CheckControlVisibleService },
|
|
49201
|
+
{ type: FileExplorerNewService },
|
|
49202
|
+
{ type: NotifierService }
|
|
49203
|
+
]; };
|
|
49204
|
+
ChatSendMessageBoxComponent.propDecorators = {
|
|
49205
|
+
fileElement: [{ type: i0.ViewChild, args: ['fileElement', { static: false },] }],
|
|
49206
|
+
input: [{ type: i0.ViewChild, args: ['input', { static: true },] }],
|
|
49207
|
+
driveFileDialog: [{ type: i0.ViewChild, args: ['driveFileDialog', { static: false },] }]
|
|
49208
|
+
};
|
|
49209
|
+
|
|
49210
|
+
var UserPickerDialogComponent = /** @class */ (function (_super) {
|
|
49211
|
+
__extends(UserPickerDialogComponent, _super);
|
|
49212
|
+
function UserPickerDialogComponent(_userService, _injector) {
|
|
49213
|
+
var _this = _super.call(this, _injector) || this;
|
|
49214
|
+
_this._userService = _userService;
|
|
49215
|
+
_this.STORAGE_KEY_USER_PICKER_NAME = 'user_picker_storage_name';
|
|
49216
|
+
_this.STORAGE_KEY_USER_PICKER_ID_USER = 'user_picker_storage_id_user';
|
|
49217
|
+
_this.STORAGE_KEY_USER_PICKER_SEARCH_KEY = 'user_picker_storage_search_key';
|
|
49218
|
+
_this.STORAGE_KEY_USER_PICKER_NODE_SELECTED = 'user_picker_storage_node';
|
|
49219
|
+
_this.rootTreeNode = [
|
|
49220
|
+
{
|
|
49221
|
+
label: '',
|
|
49222
|
+
data: '-1',
|
|
49223
|
+
expandedIcon: 'pi pi-folder-open',
|
|
49224
|
+
collapsedIcon: 'pi pi-folder',
|
|
49225
|
+
children: []
|
|
49226
|
+
}
|
|
49227
|
+
];
|
|
49228
|
+
_this.multiple = false;
|
|
49229
|
+
_this.enableCaching = true;
|
|
49230
|
+
_this.isFirstLoad = true;
|
|
49231
|
+
_this.rootFilter = {};
|
|
49232
|
+
return _this;
|
|
49233
|
+
}
|
|
49234
|
+
UserPickerDialogComponent.prototype.ngOnInit = function () {
|
|
49235
|
+
this.setting.baseService = this._userService;
|
|
49236
|
+
_super.prototype.ngOnInit.call(this);
|
|
49237
|
+
};
|
|
49238
|
+
return UserPickerDialogComponent;
|
|
49239
|
+
}(DataListBase));
|
|
49240
|
+
UserPickerDialogComponent.decorators = [
|
|
49241
|
+
{ type: i0.Component, args: [{
|
|
49242
|
+
selector: 'app-user-picker-dialog',
|
|
49243
|
+
template: "<p>\r\n user-picker-dialog works!\r\n</p>\r\n",
|
|
49244
|
+
providers: [ComponentContextService],
|
|
49245
|
+
styles: [""]
|
|
49246
|
+
},] }
|
|
49247
|
+
];
|
|
49248
|
+
UserPickerDialogComponent.ctorParameters = function () { return [
|
|
49249
|
+
{ type: UserService },
|
|
49250
|
+
{ type: i0.Injector }
|
|
49251
|
+
]; };
|
|
49252
|
+
UserPickerDialogComponent.propDecorators = {
|
|
49253
|
+
dialog: [{ type: i0.ViewChild, args: ['dialog',] }],
|
|
49254
|
+
multiple: [{ type: i0.Input }],
|
|
49255
|
+
enableCaching: [{ type: i0.Input }],
|
|
49256
|
+
control: [{ type: i0.Input }]
|
|
49257
|
+
};
|
|
49258
|
+
|
|
47463
49259
|
function coreDeclaration() {
|
|
47464
49260
|
return [
|
|
47465
49261
|
AddressComponent,
|
|
@@ -47535,6 +49331,7 @@
|
|
|
47535
49331
|
StartWorkflowComponent,
|
|
47536
49332
|
WorkflowPickerComponent,
|
|
47537
49333
|
WorkflowSettingNewComponent,
|
|
49334
|
+
PermissionSharingComponent,
|
|
47538
49335
|
TnDialogComponent,
|
|
47539
49336
|
TnColorPickerComponent,
|
|
47540
49337
|
TnCustomScrollbarComponent,
|
|
@@ -47601,7 +49398,10 @@
|
|
|
47601
49398
|
AddNewsComponent,
|
|
47602
49399
|
CommonDashboardComponent,
|
|
47603
49400
|
NotFoundComponent,
|
|
47604
|
-
UniversalLinkProcessorComponent
|
|
49401
|
+
UniversalLinkProcessorComponent,
|
|
49402
|
+
ChatBoxComponent,
|
|
49403
|
+
ChatSendMessageBoxComponent,
|
|
49404
|
+
UserPickerDialogComponent
|
|
47605
49405
|
];
|
|
47606
49406
|
}
|
|
47607
49407
|
function coreModuleImport() {
|
|
@@ -48845,65 +50645,6 @@
|
|
|
48845
50645
|
{ type: ModuleConfigService }
|
|
48846
50646
|
]; };
|
|
48847
50647
|
|
|
48848
|
-
var CheckControlVisibleService = /** @class */ (function () {
|
|
48849
|
-
function CheckControlVisibleService() {
|
|
48850
|
-
}
|
|
48851
|
-
CheckControlVisibleService.prototype.checkDisplayStatus = function (elem) {
|
|
48852
|
-
var _this = this;
|
|
48853
|
-
return new Promise(function (resolve, reject) {
|
|
48854
|
-
_this.doCheck(resolve, elem);
|
|
48855
|
-
});
|
|
48856
|
-
};
|
|
48857
|
-
CheckControlVisibleService.prototype.doCheck = function (resolve, elem) {
|
|
48858
|
-
var _this = this;
|
|
48859
|
-
var timeoutCheckDisplayStatus;
|
|
48860
|
-
timeoutCheckDisplayStatus = setTimeout(function () {
|
|
48861
|
-
_this.doCheck(resolve, elem);
|
|
48862
|
-
}, 100);
|
|
48863
|
-
var newStatus = this.isVisible(elem);
|
|
48864
|
-
if (newStatus) {
|
|
48865
|
-
setTimeout(function () {
|
|
48866
|
-
// show control
|
|
48867
|
-
resolve(true);
|
|
48868
|
-
});
|
|
48869
|
-
clearTimeout(timeoutCheckDisplayStatus);
|
|
48870
|
-
}
|
|
48871
|
-
};
|
|
48872
|
-
CheckControlVisibleService.prototype.isVisible = function (elem) {
|
|
48873
|
-
var style = getComputedStyle(elem);
|
|
48874
|
-
if (style.display === 'none')
|
|
48875
|
-
return false;
|
|
48876
|
-
if (style.visibility !== 'visible')
|
|
48877
|
-
return false;
|
|
48878
|
-
if (+style.opacity < 0.1)
|
|
48879
|
-
return false;
|
|
48880
|
-
if (elem.offsetWidth + elem.offsetHeight + elem.getBoundingClientRect().height +
|
|
48881
|
-
elem.getBoundingClientRect().width === 0) {
|
|
48882
|
-
return false;
|
|
48883
|
-
}
|
|
48884
|
-
var elemCenter = {
|
|
48885
|
-
x: elem.getBoundingClientRect().left + elem.offsetWidth / 2,
|
|
48886
|
-
y: elem.getBoundingClientRect().top + elem.offsetHeight / 2
|
|
48887
|
-
};
|
|
48888
|
-
var pointContainer = document.elementFromPoint(elemCenter.x, elemCenter.y);
|
|
48889
|
-
if (pointContainer) {
|
|
48890
|
-
do {
|
|
48891
|
-
if (pointContainer === elem)
|
|
48892
|
-
return true;
|
|
48893
|
-
} while (pointContainer = pointContainer.parentNode);
|
|
48894
|
-
}
|
|
48895
|
-
return false;
|
|
48896
|
-
};
|
|
48897
|
-
return CheckControlVisibleService;
|
|
48898
|
-
}());
|
|
48899
|
-
CheckControlVisibleService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CheckControlVisibleService_Factory() { return new CheckControlVisibleService(); }, token: CheckControlVisibleService, providedIn: "root" });
|
|
48900
|
-
CheckControlVisibleService.decorators = [
|
|
48901
|
-
{ type: i0.Injectable, args: [{
|
|
48902
|
-
providedIn: 'root'
|
|
48903
|
-
},] }
|
|
48904
|
-
];
|
|
48905
|
-
CheckControlVisibleService.ctorParameters = function () { return []; };
|
|
48906
|
-
|
|
48907
50648
|
var ImageService = /** @class */ (function () {
|
|
48908
50649
|
function ImageService(_moduleConfigService) {
|
|
48909
50650
|
this._moduleConfigService = _moduleConfigService;
|
|
@@ -49579,6 +51320,8 @@
|
|
|
49579
51320
|
exports.CanBoHoSoService = CanBoHoSoService;
|
|
49580
51321
|
exports.CauHinhWorkflowService = CauHinhWorkflowService;
|
|
49581
51322
|
exports.CellExcel = CellExcel;
|
|
51323
|
+
exports.ChatBoxComponent = ChatBoxComponent;
|
|
51324
|
+
exports.ChatSendMessageBoxComponent = ChatSendMessageBoxComponent;
|
|
49582
51325
|
exports.CheckBoxListControlSchema = CheckBoxListControlSchema;
|
|
49583
51326
|
exports.CheckControlVisibleService = CheckControlVisibleService;
|
|
49584
51327
|
exports.CheckDuplicateFieldsValidator = CheckDuplicateFieldsValidator;
|
|
@@ -49848,6 +51591,7 @@
|
|
|
49848
51591
|
exports.UserFormatPipe = UserFormatPipe;
|
|
49849
51592
|
exports.UserGroupService = UserGroupService;
|
|
49850
51593
|
exports.UserPickerControlSchema = UserPickerControlSchema;
|
|
51594
|
+
exports.UserPickerDialogComponent = UserPickerDialogComponent;
|
|
49851
51595
|
exports.UserService = UserService;
|
|
49852
51596
|
exports.UserV5Service = UserV5Service;
|
|
49853
51597
|
exports.UsersFormatPipe = UsersFormatPipe;
|
|
@@ -49968,50 +51712,56 @@
|
|
|
49968
51712
|
exports.ɵco = StartWorkflowComponent;
|
|
49969
51713
|
exports.ɵcp = WorkflowSettingsService;
|
|
49970
51714
|
exports.ɵcq = WorkflowSettingNewComponent;
|
|
49971
|
-
exports.ɵcr =
|
|
49972
|
-
exports.ɵcs =
|
|
49973
|
-
exports.ɵct =
|
|
49974
|
-
exports.ɵcu =
|
|
49975
|
-
exports.ɵcv =
|
|
49976
|
-
exports.ɵcw =
|
|
49977
|
-
exports.ɵcx =
|
|
49978
|
-
exports.ɵcy =
|
|
49979
|
-
exports.ɵcz =
|
|
51715
|
+
exports.ɵcr = PermissionSharingComponent;
|
|
51716
|
+
exports.ɵcs = WorkflowPermissionService;
|
|
51717
|
+
exports.ɵct = TnDialogComponent;
|
|
51718
|
+
exports.ɵcu = TnColorPickerComponent;
|
|
51719
|
+
exports.ɵcv = TnTinymceComponent;
|
|
51720
|
+
exports.ɵcw = TnTabViewComponent;
|
|
51721
|
+
exports.ɵcx = TableDetailFormComponent;
|
|
51722
|
+
exports.ɵcy = FileIconPipe;
|
|
51723
|
+
exports.ɵcz = FileSizePipe;
|
|
49980
51724
|
exports.ɵd = ExceptionHandlerService;
|
|
49981
|
-
exports.ɵda =
|
|
49982
|
-
exports.ɵdb =
|
|
49983
|
-
exports.ɵdc =
|
|
49984
|
-
exports.ɵdd =
|
|
49985
|
-
exports.ɵde =
|
|
49986
|
-
exports.ɵdf =
|
|
49987
|
-
exports.ɵdg =
|
|
49988
|
-
exports.ɵdh =
|
|
49989
|
-
exports.ɵdi =
|
|
49990
|
-
exports.ɵdj =
|
|
49991
|
-
exports.ɵdk =
|
|
49992
|
-
exports.ɵdl =
|
|
49993
|
-
exports.ɵdm =
|
|
49994
|
-
exports.ɵdn =
|
|
49995
|
-
exports.ɵdo =
|
|
49996
|
-
exports.ɵdp =
|
|
49997
|
-
exports.ɵdq =
|
|
49998
|
-
exports.ɵdr =
|
|
49999
|
-
exports.ɵds =
|
|
50000
|
-
exports.ɵdt =
|
|
50001
|
-
exports.ɵdu =
|
|
50002
|
-
exports.ɵdv =
|
|
50003
|
-
exports.ɵdw =
|
|
50004
|
-
exports.ɵdx =
|
|
50005
|
-
exports.ɵdy =
|
|
50006
|
-
exports.ɵdz =
|
|
51725
|
+
exports.ɵda = QuickAddFormComponent;
|
|
51726
|
+
exports.ɵdb = PreventShiftTabDirective;
|
|
51727
|
+
exports.ɵdc = TnTemplateDirective;
|
|
51728
|
+
exports.ɵdd = UserPickerComponent;
|
|
51729
|
+
exports.ɵde = UserPickerBoxComponent;
|
|
51730
|
+
exports.ɵdf = TnAppHelpComponent;
|
|
51731
|
+
exports.ɵdg = PathNameService;
|
|
51732
|
+
exports.ɵdh = HelperCurrentPageComponent;
|
|
51733
|
+
exports.ɵdi = TnAppNotificationListComponent;
|
|
51734
|
+
exports.ɵdj = TnAppNotificationComponent;
|
|
51735
|
+
exports.ɵdk = MyDriveService;
|
|
51736
|
+
exports.ɵdl = FileVersionService;
|
|
51737
|
+
exports.ɵdm = FileExplorerNewService;
|
|
51738
|
+
exports.ɵdn = FolderFormComponent;
|
|
51739
|
+
exports.ɵdo = FileFormComponent;
|
|
51740
|
+
exports.ɵdp = FileViewerComponent;
|
|
51741
|
+
exports.ɵdq = FileVersionListComponent;
|
|
51742
|
+
exports.ɵdr = WorkflowHistoryComponent;
|
|
51743
|
+
exports.ɵds = EntityWorkflowHistoryService;
|
|
51744
|
+
exports.ɵdt = WorkflowHistoryDialogComponent;
|
|
51745
|
+
exports.ɵdu = WorkflowHistoryNewComponent;
|
|
51746
|
+
exports.ɵdv = WorkflowSettingComponent;
|
|
51747
|
+
exports.ɵdw = EntityWorkflowSettingService;
|
|
51748
|
+
exports.ɵdx = WorkflowSettingDialogComponent;
|
|
51749
|
+
exports.ɵdy = QrCodeGeneratorComponent;
|
|
51750
|
+
exports.ɵdz = AccessDeniedV1Component;
|
|
50007
51751
|
exports.ɵe = CanBo_HoSoService;
|
|
50008
|
-
exports.ɵea =
|
|
50009
|
-
exports.ɵeb =
|
|
50010
|
-
exports.ɵec =
|
|
50011
|
-
exports.ɵed =
|
|
50012
|
-
exports.ɵee =
|
|
50013
|
-
exports.ɵef =
|
|
50014
|
-
exports.ɵeg =
|
|
51752
|
+
exports.ɵea = AddNewsComponent;
|
|
51753
|
+
exports.ɵeb = ArticleService;
|
|
51754
|
+
exports.ɵec = NewsCategoryService;
|
|
51755
|
+
exports.ɵed = NotFoundComponent;
|
|
51756
|
+
exports.ɵee = UniversalLinkProcessorComponent;
|
|
51757
|
+
exports.ɵef = ChatService;
|
|
51758
|
+
exports.ɵeg = ContentsService;
|
|
51759
|
+
exports.ɵeh = StatusExtendsService;
|
|
51760
|
+
exports.ɵei = MessageBoardService;
|
|
51761
|
+
exports.ɵej = CheckReadyComponent;
|
|
51762
|
+
exports.ɵek = SendAccessTokenInterceptor;
|
|
51763
|
+
exports.ɵel = LogInterceptor;
|
|
51764
|
+
exports.ɵem = PermissionUtilsInterceptor;
|
|
50015
51765
|
exports.ɵf = AfterViewCheckedComponent;
|
|
50016
51766
|
exports.ɵg = AdvanceSearchComponent;
|
|
50017
51767
|
exports.ɵh = AppRootMenuComponent;
|