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.
Files changed (120) hide show
  1. package/bundles/tnx-shared.umd.js +1999 -249
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/base/data-list-base.d.ts +2 -0
  6. package/classes/base/data-list-base.d.ts.map +1 -1
  7. package/classes/form-schema.d.ts +3 -0
  8. package/classes/form-schema.d.ts.map +1 -1
  9. package/components/chat/chat-box/chat-box.component.d.ts +102 -0
  10. package/components/chat/chat-box/chat-box.component.d.ts.map +1 -0
  11. package/components/chat/chat-box/chat-box.component.ngfactory.d.ts.map +1 -0
  12. package/components/chat/chat-box/chat-box.component.scss.shim.ngstyle.d.ts.map +1 -0
  13. package/components/chat/chat-send-message-box/chat-send-message-box.component.d.ts +37 -0
  14. package/components/chat/chat-send-message-box/chat-send-message-box.component.d.ts.map +1 -0
  15. package/components/chat/chat-send-message-box/chat-send-message-box.component.ngfactory.d.ts.map +1 -0
  16. package/components/chat/chat-send-message-box/chat-send-message-box.component.scss.shim.ngstyle.d.ts.map +1 -0
  17. package/components/chat/common-style.scss.shim.ngstyle.d.ts.map +1 -0
  18. package/components/chat/models/enums.d.ts +11 -0
  19. package/components/chat/models/enums.d.ts.map +1 -0
  20. package/components/chat/models/models.d.ts +10 -0
  21. package/components/chat/models/models.d.ts.map +1 -0
  22. package/components/chat/services/chat.service.d.ts +34 -0
  23. package/components/chat/services/chat.service.d.ts.map +1 -0
  24. package/components/chat/services/chat.service.ngfactory.d.ts.map +1 -0
  25. package/components/chat/services/content.service.d.ts +20 -0
  26. package/components/chat/services/content.service.d.ts.map +1 -0
  27. package/components/chat/services/content.service.ngfactory.d.ts.map +1 -0
  28. package/components/chat/services/message-board.service.d.ts +15 -0
  29. package/components/chat/services/message-board.service.d.ts.map +1 -0
  30. package/components/chat/services/message-board.service.ngfactory.d.ts.map +1 -0
  31. package/components/chat/services/status.service.d.ts +14 -0
  32. package/components/chat/services/status.service.d.ts.map +1 -0
  33. package/components/chat/services/status.service.ngfactory.d.ts.map +1 -0
  34. package/components/crud/crud-list/crud-list.component.d.ts +6 -0
  35. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  36. package/components/file-explorer/file-manager/file-manager.component.d.ts +6 -0
  37. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  38. package/components/file-explorer/models/service-request-model.d.ts +1 -0
  39. package/components/file-explorer/models/service-request-model.d.ts.map +1 -1
  40. package/components/statemachines/models/enums.d.ts +4 -0
  41. package/components/statemachines/models/enums.d.ts.map +1 -1
  42. package/components/statemachines/statemachines-designer/statemachines-designer.component.d.ts +1 -1
  43. package/components/statemachines/statemachines-designer/statemachines-designer.component.d.ts.map +1 -1
  44. package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts +1 -0
  45. package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
  46. package/components/tn-dialog/tn-dialog.component.d.ts +1 -0
  47. package/components/tn-dialog/tn-dialog.component.d.ts.map +1 -1
  48. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.d.ts +23 -0
  49. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.d.ts.map +1 -0
  50. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.ngfactory.d.ts.map +1 -0
  51. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.scss.shim.ngstyle.d.ts.map +1 -0
  52. package/components/workflow/permission-sharing/permission-sharing.component.d.ts +21 -0
  53. package/components/workflow/permission-sharing/permission-sharing.component.d.ts.map +1 -0
  54. package/components/workflow/permission-sharing/permission-sharing.component.ngfactory.d.ts.map +1 -0
  55. package/components/workflow/permission-sharing/permission-sharing.component.scss.shim.ngstyle.d.ts.map +1 -0
  56. package/components/workflow/services/workflow-permission.service.d.ts +10 -0
  57. package/components/workflow/services/workflow-permission.service.d.ts.map +1 -0
  58. package/components/workflow/services/workflow-permission.service.ngfactory.d.ts.map +1 -0
  59. package/components/workflow/workflow-history-new/workflow-history-new.component.d.ts.map +1 -1
  60. package/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.d.ts +6 -2
  61. package/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.d.ts.map +1 -1
  62. package/congviec/congviec/congviec-form/congviec-form.component.d.ts +9 -1
  63. package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
  64. package/esm2015/classes/base/data-form-base.js +3 -3
  65. package/esm2015/classes/base/data-list-base.js +41 -6
  66. package/esm2015/classes/form-schema.js +1 -1
  67. package/esm2015/components/chat/chat-box/chat-box.component.js +626 -0
  68. package/esm2015/components/chat/chat-send-message-box/chat-send-message-box.component.js +245 -0
  69. package/esm2015/components/chat/models/enums.js +13 -0
  70. package/esm2015/components/chat/models/models.js +12 -0
  71. package/esm2015/components/chat/services/chat.service.js +113 -0
  72. package/esm2015/components/chat/services/content.service.js +57 -0
  73. package/esm2015/components/chat/services/message-board.service.js +40 -0
  74. package/esm2015/components/chat/services/status.service.js +36 -0
  75. package/esm2015/components/crud/crud-list/crud-list.component.js +55 -4
  76. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +69 -16
  77. package/esm2015/components/file-explorer/file-viewer/file-viewer.component.js +2 -2
  78. package/esm2015/components/file-explorer/models/service-request-model.js +5 -2
  79. package/esm2015/components/statemachines/models/enums.js +6 -1
  80. package/esm2015/components/tn-custom-scrollbar/tn-custom-scrollbar.component.js +26 -11
  81. package/esm2015/components/tn-dialog/tn-dialog.component.js +4 -2
  82. package/esm2015/components/user-picker/user-picker-dialog/user-picker-dialog.component.js +52 -0
  83. package/esm2015/components/workflow/permission-sharing/permission-sharing.component.js +123 -0
  84. package/esm2015/components/workflow/services/workflow-permission.service.js +27 -0
  85. package/esm2015/components/workflow/workflow-history-new/workflow-history-new.component.js +4 -1
  86. package/esm2015/congviec/cauhinh-workflow/cauhinh-workflow-detail/cauhinh-workflow-detail.component.js +2 -2
  87. package/esm2015/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.js +38 -14
  88. package/esm2015/congviec/congviec/congviec-form/congviec-form.component.js +25 -4
  89. package/esm2015/congviec/congviec/congviec.component.js +3 -3
  90. package/esm2015/models/basic-user-info.js +6 -1
  91. package/esm2015/public-api.js +4 -1
  92. package/esm2015/services/base.service.js +33 -9
  93. package/esm2015/services/common.service.js +3 -18
  94. package/esm2015/services/crud.service.js +56 -41
  95. package/esm2015/services/notifier.service.js +2 -2
  96. package/esm2015/services/user.service.js +37 -23
  97. package/esm2015/tnx-shared.js +49 -43
  98. package/esm2015/tnx-shared.module.js +10 -2
  99. package/fesm2015/tnx-shared.js +1705 -202
  100. package/fesm2015/tnx-shared.js.map +1 -1
  101. package/models/basic-user-info.d.ts +2 -3
  102. package/models/basic-user-info.d.ts.map +1 -1
  103. package/package.json +2 -2
  104. package/public-api.d.ts +3 -0
  105. package/public-api.d.ts.map +1 -1
  106. package/services/base.service.d.ts +5 -1
  107. package/services/base.service.d.ts.map +1 -1
  108. package/services/common.service.d.ts +3 -3
  109. package/services/common.service.d.ts.map +1 -1
  110. package/services/crud.service.d.ts.map +1 -1
  111. package/services/notifier.service.d.ts +1 -1
  112. package/services/notifier.service.d.ts.map +1 -1
  113. package/services/user.service.d.ts +14 -2
  114. package/services/user.service.d.ts.map +1 -1
  115. package/tnx-shared.d.ts +48 -42
  116. package/tnx-shared.d.ts.map +1 -1
  117. package/tnx-shared.metadata.json +1 -1
  118. package/tnx-shared.module.d.ts +5 -1
  119. package/tnx-shared.module.d.ts.map +1 -1
  120. 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.showWarningByReponse = function (res) {
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
- function s4() {
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
- else
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
- if (callBack)
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
- else
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
- else
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
- var url = this.serviceUri + "/DetailWithPermission/" + id;
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
- UserService.prototype.getBasicUsersInfoByUserName = function (userNames) {
9216
- var _this = this;
9217
- var storageItem = localStorage.getItem(this.USER_INFO_KEY);
9218
- var userInfos = JSON.parse(storageItem);
9219
- var check = userInfos ? userNames.indexOf(userInfos['userName']) > -1 : null;
9220
- if (check) {
9221
- return new Promise(function (resolve, reject) { return resolve(userInfos); });
9222
- }
9223
- else {
9224
- return new Promise(function (resolve, reject) {
9225
- var svUrl = _this.serviceUri + "/GetBasicUsersInfoByUserName?userNames=" + userNames;
9226
- _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) { return repsonse.data; })).toPromise().then(function (success) {
9227
- resolve(success);
9228
- }).catch(function (err) {
9229
- resolve([]);
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, users) {
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
- var user = users.find(function (user) { return user.id === userId; });
9245
- if (user) {
9246
- item[propertyName] = user;
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.showWarningByReponse(response);
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.showWarningByReponse(response);
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,allowEdit,permission')];
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.allowEdit; });
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(true);
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 && !this.menuButtons) {
26575
- this.menuButtons = function () { return []; };
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: 'Xem các phiên bản khác', icon: 'fas fa-history',
33202
+ label: ' số', icon: 'fas fa-signature',
33044
33203
  command: function () {
33045
- _this.openFileVersions(item);
33046
- }
33204
+ _this.signFile(item);
33205
+ },
33206
+ visible: !this.readonly
33047
33207
  },
33048
33208
  {
33049
- label: 'Tải về bản công khai', icon: 'fas fa-download',
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: ' số', icon: 'fas fa-signature',
33215
+ label: 'Sao chép đường dẫn', icon: 'fas fa-link',
33056
33216
  command: function () {
33057
- _this.signFile(item);
33058
- },
33059
- visible: !this.readonly
33217
+ _this.copyDownloadLink(item);
33218
+ }
33060
33219
  },
33061
33220
  {
33062
- label: 'Xóa tệp tin', icon: 'far fa-trash-alt',
33221
+ label: 'Đổi tên', icon: 'fas fa-eraser',
33063
33222
  command: function () {
33064
- _this.deleteFile(item);
33223
+ _this.renameFile(item);
33065
33224
  },
33066
33225
  visible: !this.readonly
33067
33226
  },
33068
33227
  {
33069
- label: 'Đổi tên', icon: 'fas fa-eraser',
33228
+ label: 'Xem các phiên bản khác', icon: 'fas fa-history',
33070
33229
  command: function () {
33071
- _this.renameFile(item);
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.showWarningByReponse(response);
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.showWarningByReponse(response);
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.showWarningByReponse(response);
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 scrollYs_1 = contentDiv_1.parentElement.getElementsByClassName('ps__thumb-y');
40073
- if (scrollYs_1 && scrollYs_1.length > 0) {
40074
- setTimeout(function () {
40075
- _this.checkScrollBar(contentDiv_1, scrollYs_1[0]);
40076
- }, this._intervalTime);
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 >= contentHeight) {
40086
- scrollY.style.display = 'none';
40087
- }
40088
- else {
40089
- scrollY.style.display = '';
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]=\"true\"\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>",
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.parseFromClipboard(content);
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._notifierService.showWarning('Thêm mục đính kèm không thành công');
45201
+ _this.showAttachLinkBox = true;
44813
45202
  }
44814
45203
  }).catch(function (err) {
44815
- console.error(err);
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._notifierService.showWarning('Không tìm thấy mục đính kèm trong bộ nhớ tạm, vui lòng sao chép mục đính kèm vào bộ nhớ tạm trước khi thêm');
45208
+ this.showAttachLinkBox = true;
44821
45209
  }
44822
45210
  }
44823
45211
  else {
44824
- this._notifierService.showWarning('Không tìm thấy mục đính kèm trong bộ nhớ tạm, vui lòng sao chép mục đính kèm vào bộ nhớ tạm trước khi thêm');
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.parseFromClipboard = function (content) {
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 [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 label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text p-button-primary\" pTooltip=\"Th\u00EAm m\u1EDBi t\u1EEB b\u1ED9 nh\u1EDB t\u1EA1m\" (click)=\"themDinhKem()\"></button>\r\n <button type=\"button\" *ngIf=\"(formState == enumFormState.EDIT || formState == enumFormState.ADD) && model.selectedItems.length > 0\" pButton pRipple\r\n 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 icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" pTooltip=\"H\u1EE7y \u0111\u00EDnh k\u00E8m\" tooltipPosition=\"top\"\r\n (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>",
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 [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\">\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 </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>",
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.showWarningByReponse(response);
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.showWarningByReponse(response);
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<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\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<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n\r\n<!-- &lt;!&ndash;<quick-add-form *ngIf=\"model.editFormModel.showQuickNoteForm\" [parentContext]=\"context\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; [parentModel]=\"context.data.noteDataModel\"></quick-add-form>&ndash;&gt;-->\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 = TnDialogComponent;
49972
- exports.ɵcs = TnColorPickerComponent;
49973
- exports.ɵct = TnTinymceComponent;
49974
- exports.ɵcu = TnTabViewComponent;
49975
- exports.ɵcv = TableDetailFormComponent;
49976
- exports.ɵcw = FileIconPipe;
49977
- exports.ɵcx = FileSizePipe;
49978
- exports.ɵcy = QuickAddFormComponent;
49979
- exports.ɵcz = PreventShiftTabDirective;
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 = TnTemplateDirective;
49982
- exports.ɵdb = UserPickerComponent;
49983
- exports.ɵdc = UserPickerBoxComponent;
49984
- exports.ɵdd = TnAppHelpComponent;
49985
- exports.ɵde = PathNameService;
49986
- exports.ɵdf = HelperCurrentPageComponent;
49987
- exports.ɵdg = TnAppNotificationListComponent;
49988
- exports.ɵdh = TnAppNotificationComponent;
49989
- exports.ɵdi = MyDriveService;
49990
- exports.ɵdj = FileVersionService;
49991
- exports.ɵdk = FileExplorerNewService;
49992
- exports.ɵdl = FolderFormComponent;
49993
- exports.ɵdm = FileFormComponent;
49994
- exports.ɵdn = FileViewerComponent;
49995
- exports.ɵdo = FileVersionListComponent;
49996
- exports.ɵdp = WorkflowHistoryComponent;
49997
- exports.ɵdq = EntityWorkflowHistoryService;
49998
- exports.ɵdr = WorkflowHistoryDialogComponent;
49999
- exports.ɵds = WorkflowHistoryNewComponent;
50000
- exports.ɵdt = WorkflowSettingComponent;
50001
- exports.ɵdu = EntityWorkflowSettingService;
50002
- exports.ɵdv = WorkflowSettingDialogComponent;
50003
- exports.ɵdw = QrCodeGeneratorComponent;
50004
- exports.ɵdx = AccessDeniedV1Component;
50005
- exports.ɵdy = AddNewsComponent;
50006
- exports.ɵdz = ArticleService;
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 = NewsCategoryService;
50009
- exports.ɵeb = NotFoundComponent;
50010
- exports.ɵec = UniversalLinkProcessorComponent;
50011
- exports.ɵed = CheckReadyComponent;
50012
- exports.ɵee = SendAccessTokenInterceptor;
50013
- exports.ɵef = LogInterceptor;
50014
- exports.ɵeg = PermissionUtilsInterceptor;
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;