qms-angular 1.1.71 → 1.1.73

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 (80) hide show
  1. package/bundles/qms-angular.umd.js +50 -161
  2. package/bundles/qms-angular.umd.js.map +1 -1
  3. package/esm2015/lib/components/select-access-dialog/model/access-config-custom.model.js +3 -0
  4. package/esm2015/lib/components/select-access-dialog/model/select-access-config.model.js +4 -1
  5. package/esm2015/lib/components/select-access-dialog/select-access-dialog.component.js +9 -5
  6. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.js +1 -1
  7. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.component.js +28 -1
  8. package/fesm2015/qms-angular.js +40 -4
  9. package/fesm2015/qms-angular.js.map +1 -1
  10. package/lib/components/select-access-dialog/model/access-config-custom.model.d.ts +3 -0
  11. package/lib/components/select-access-dialog/model/select-access-config.model.d.ts +4 -0
  12. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.d.ts +1 -0
  13. package/package.json +1 -1
  14. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js +1 -1
  15. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js.map +1 -1
  16. package/src/assets/qms-ckeditor-plugin/build/translations/af.js +1 -0
  17. package/src/assets/qms-ckeditor-plugin/build/translations/ar.js +1 -0
  18. package/src/assets/qms-ckeditor-plugin/build/translations/ast.js +1 -0
  19. package/src/assets/qms-ckeditor-plugin/build/translations/az.js +1 -0
  20. package/src/assets/qms-ckeditor-plugin/build/translations/bg.js +1 -0
  21. package/src/assets/qms-ckeditor-plugin/build/translations/ca.js +1 -0
  22. package/src/assets/qms-ckeditor-plugin/build/translations/cs.js +1 -0
  23. package/src/assets/qms-ckeditor-plugin/build/translations/da.js +1 -0
  24. package/src/assets/qms-ckeditor-plugin/build/translations/de-ch.js +1 -0
  25. package/src/assets/qms-ckeditor-plugin/build/translations/de.js +1 -0
  26. package/src/assets/qms-ckeditor-plugin/build/translations/el.js +1 -0
  27. package/src/assets/qms-ckeditor-plugin/build/translations/en-au.js +1 -0
  28. package/src/assets/qms-ckeditor-plugin/build/translations/en-gb.js +1 -0
  29. package/src/assets/qms-ckeditor-plugin/build/translations/eo.js +1 -0
  30. package/src/assets/qms-ckeditor-plugin/build/translations/es.js +1 -0
  31. package/src/assets/qms-ckeditor-plugin/build/translations/et.js +1 -0
  32. package/src/assets/qms-ckeditor-plugin/build/translations/eu.js +1 -0
  33. package/src/assets/qms-ckeditor-plugin/build/translations/fa.js +1 -0
  34. package/src/assets/qms-ckeditor-plugin/build/translations/fi.js +1 -0
  35. package/src/assets/qms-ckeditor-plugin/build/translations/fr.js +1 -0
  36. package/src/assets/qms-ckeditor-plugin/build/translations/gl.js +1 -0
  37. package/src/assets/qms-ckeditor-plugin/build/translations/gu.js +1 -0
  38. package/src/assets/qms-ckeditor-plugin/build/translations/he.js +1 -0
  39. package/src/assets/qms-ckeditor-plugin/build/translations/hi.js +1 -0
  40. package/src/assets/qms-ckeditor-plugin/build/translations/hr.js +1 -0
  41. package/src/assets/qms-ckeditor-plugin/build/translations/hu.js +1 -0
  42. package/src/assets/qms-ckeditor-plugin/build/translations/id.js +1 -0
  43. package/src/assets/qms-ckeditor-plugin/build/translations/it.js +1 -0
  44. package/src/assets/qms-ckeditor-plugin/build/translations/ja.js +1 -0
  45. package/src/assets/qms-ckeditor-plugin/build/translations/kk.js +1 -0
  46. package/src/assets/qms-ckeditor-plugin/build/translations/km.js +1 -0
  47. package/src/assets/qms-ckeditor-plugin/build/translations/kn.js +1 -0
  48. package/src/assets/qms-ckeditor-plugin/build/translations/ko.js +1 -0
  49. package/src/assets/qms-ckeditor-plugin/build/translations/ku.js +1 -0
  50. package/src/assets/qms-ckeditor-plugin/build/translations/lt.js +1 -0
  51. package/src/assets/qms-ckeditor-plugin/build/translations/lv.js +1 -0
  52. package/src/assets/qms-ckeditor-plugin/build/translations/ms.js +1 -0
  53. package/src/assets/qms-ckeditor-plugin/build/translations/nb.js +1 -0
  54. package/src/assets/qms-ckeditor-plugin/build/translations/ne.js +1 -0
  55. package/src/assets/qms-ckeditor-plugin/build/translations/nl.js +1 -0
  56. package/src/assets/qms-ckeditor-plugin/build/translations/no.js +1 -0
  57. package/src/assets/qms-ckeditor-plugin/build/translations/oc.js +1 -0
  58. package/src/assets/qms-ckeditor-plugin/build/translations/pl.js +1 -0
  59. package/src/assets/qms-ckeditor-plugin/build/translations/pt-br.js +1 -0
  60. package/src/assets/qms-ckeditor-plugin/build/translations/pt.js +1 -0
  61. package/src/assets/qms-ckeditor-plugin/build/translations/ro.js +1 -0
  62. package/src/assets/qms-ckeditor-plugin/build/translations/ru.js +1 -0
  63. package/src/assets/qms-ckeditor-plugin/build/translations/si.js +1 -0
  64. package/src/assets/qms-ckeditor-plugin/build/translations/sk.js +1 -0
  65. package/src/assets/qms-ckeditor-plugin/build/translations/sl.js +1 -0
  66. package/src/assets/qms-ckeditor-plugin/build/translations/sq.js +1 -0
  67. package/src/assets/qms-ckeditor-plugin/build/translations/sr-latn.js +1 -0
  68. package/src/assets/qms-ckeditor-plugin/build/translations/sr.js +1 -0
  69. package/src/assets/qms-ckeditor-plugin/build/translations/sv.js +1 -0
  70. package/src/assets/qms-ckeditor-plugin/build/translations/th.js +1 -0
  71. package/src/assets/qms-ckeditor-plugin/build/translations/tk.js +1 -0
  72. package/src/assets/qms-ckeditor-plugin/build/translations/tr.js +1 -0
  73. package/src/assets/qms-ckeditor-plugin/build/translations/tt.js +1 -0
  74. package/src/assets/qms-ckeditor-plugin/build/translations/ug.js +1 -0
  75. package/src/assets/qms-ckeditor-plugin/build/translations/uk.js +1 -0
  76. package/src/assets/qms-ckeditor-plugin/build/translations/vi.js +1 -0
  77. package/src/assets/qms-ckeditor-plugin/build/translations/zh-cn.js +1 -0
  78. package/src/assets/qms-ckeditor-plugin/build/translations/zh.js +1 -0
  79. package/src/assets/qms-ckeditor-plugin/package-lock.json +5717 -8776
  80. package/src/assets/qms-ckeditor-plugin/src/ckeditor.js +21 -4
@@ -3152,7 +3152,7 @@
3152
3152
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
3153
3153
  PERFORMANCE OF THIS SOFTWARE.
3154
3154
  ***************************************************************************** */
3155
- /* global Reflect, Promise, SuppressedError, Symbol */
3155
+ /* global Reflect, Promise */
3156
3156
  var extendStatics = function (d, b) {
3157
3157
  extendStatics = Object.setPrototypeOf ||
3158
3158
  ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
@@ -3205,64 +3205,6 @@
3205
3205
  function __param(paramIndex, decorator) {
3206
3206
  return function (target, key) { decorator(target, key, paramIndex); };
3207
3207
  }
3208
- function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3209
- function accept(f) { if (f !== void 0 && typeof f !== "function")
3210
- throw new TypeError("Function expected"); return f; }
3211
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
3212
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
3213
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
3214
- var _, done = false;
3215
- for (var i = decorators.length - 1; i >= 0; i--) {
3216
- var context = {};
3217
- for (var p in contextIn)
3218
- context[p] = p === "access" ? {} : contextIn[p];
3219
- for (var p in contextIn.access)
3220
- context.access[p] = contextIn.access[p];
3221
- context.addInitializer = function (f) { if (done)
3222
- throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
3223
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
3224
- if (kind === "accessor") {
3225
- if (result === void 0)
3226
- continue;
3227
- if (result === null || typeof result !== "object")
3228
- throw new TypeError("Object expected");
3229
- if (_ = accept(result.get))
3230
- descriptor.get = _;
3231
- if (_ = accept(result.set))
3232
- descriptor.set = _;
3233
- if (_ = accept(result.init))
3234
- initializers.unshift(_);
3235
- }
3236
- else if (_ = accept(result)) {
3237
- if (kind === "field")
3238
- initializers.unshift(_);
3239
- else
3240
- descriptor[key] = _;
3241
- }
3242
- }
3243
- if (target)
3244
- Object.defineProperty(target, contextIn.name, descriptor);
3245
- done = true;
3246
- }
3247
- ;
3248
- function __runInitializers(thisArg, initializers, value) {
3249
- var useValue = arguments.length > 2;
3250
- for (var i = 0; i < initializers.length; i++) {
3251
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
3252
- }
3253
- return useValue ? value : void 0;
3254
- }
3255
- ;
3256
- function __propKey(x) {
3257
- return typeof x === "symbol" ? x : "".concat(x);
3258
- }
3259
- ;
3260
- function __setFunctionName(f, name, prefix) {
3261
- if (typeof name === "symbol")
3262
- name = name.description ? "[".concat(name.description, "]") : "";
3263
- return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
3264
- }
3265
- ;
3266
3208
  function __metadata(metadataKey, metadataValue) {
3267
3209
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
3268
3210
  return Reflect.metadata(metadataKey, metadataValue);
@@ -3294,7 +3236,7 @@
3294
3236
  function step(op) {
3295
3237
  if (f)
3296
3238
  throw new TypeError("Generator is already executing.");
3297
- while (g && (g = 0, op[0] && (_ = 0)), _)
3239
+ while (_)
3298
3240
  try {
3299
3241
  if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
3300
3242
  return t;
@@ -3444,13 +3386,9 @@
3444
3386
  if (!Symbol.asyncIterator)
3445
3387
  throw new TypeError("Symbol.asyncIterator is not defined.");
3446
3388
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
3447
- return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
3448
- function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
3449
- function verb(n, f) { if (g[n]) {
3450
- i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); };
3451
- if (f)
3452
- i[n] = f(i[n]);
3453
- } }
3389
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
3390
+ function verb(n) { if (g[n])
3391
+ i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
3454
3392
  function resume(n, v) { try {
3455
3393
  step(g[n](v));
3456
3394
  }
@@ -3466,7 +3404,7 @@
3466
3404
  function __asyncDelegator(o) {
3467
3405
  var i, p;
3468
3406
  return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
3469
- function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
3407
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
3470
3408
  }
3471
3409
  function __asyncValues(o) {
3472
3410
  if (!Symbol.asyncIterator)
@@ -3525,95 +3463,7 @@
3525
3463
  if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function"))
3526
3464
  throw new TypeError("Cannot use 'in' operator on non-object");
3527
3465
  return typeof state === "function" ? receiver === state : state.has(receiver);
3528
- }
3529
- function __addDisposableResource(env, value, async) {
3530
- if (value !== null && value !== void 0) {
3531
- if (typeof value !== "object" && typeof value !== "function")
3532
- throw new TypeError("Object expected.");
3533
- var dispose, inner;
3534
- if (async) {
3535
- if (!Symbol.asyncDispose)
3536
- throw new TypeError("Symbol.asyncDispose is not defined.");
3537
- dispose = value[Symbol.asyncDispose];
3538
- }
3539
- if (dispose === void 0) {
3540
- if (!Symbol.dispose)
3541
- throw new TypeError("Symbol.dispose is not defined.");
3542
- dispose = value[Symbol.dispose];
3543
- if (async)
3544
- inner = dispose;
3545
- }
3546
- if (typeof dispose !== "function")
3547
- throw new TypeError("Object not disposable.");
3548
- if (inner)
3549
- dispose = function () { try {
3550
- inner.call(this);
3551
- }
3552
- catch (e) {
3553
- return Promise.reject(e);
3554
- } };
3555
- env.stack.push({ value: value, dispose: dispose, async: async });
3556
- }
3557
- else if (async) {
3558
- env.stack.push({ async: true });
3559
- }
3560
- return value;
3561
- }
3562
- var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
3563
- var e = new Error(message);
3564
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
3565
- };
3566
- function __disposeResources(env) {
3567
- function fail(e) {
3568
- env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
3569
- env.hasError = true;
3570
- }
3571
- function next() {
3572
- while (env.stack.length) {
3573
- var rec = env.stack.pop();
3574
- try {
3575
- var result = rec.dispose && rec.dispose.call(rec.value);
3576
- if (rec.async)
3577
- return Promise.resolve(result).then(next, function (e) { fail(e); return next(); });
3578
- }
3579
- catch (e) {
3580
- fail(e);
3581
- }
3582
- }
3583
- if (env.hasError)
3584
- throw env.error;
3585
- }
3586
- return next();
3587
- }
3588
- var tslib_es6 = {
3589
- __extends: __extends,
3590
- __assign: __assign,
3591
- __rest: __rest,
3592
- __decorate: __decorate,
3593
- __param: __param,
3594
- __metadata: __metadata,
3595
- __awaiter: __awaiter,
3596
- __generator: __generator,
3597
- __createBinding: __createBinding,
3598
- __exportStar: __exportStar,
3599
- __values: __values,
3600
- __read: __read,
3601
- __spread: __spread,
3602
- __spreadArrays: __spreadArrays,
3603
- __spreadArray: __spreadArray,
3604
- __await: __await,
3605
- __asyncGenerator: __asyncGenerator,
3606
- __asyncDelegator: __asyncDelegator,
3607
- __asyncValues: __asyncValues,
3608
- __makeTemplateObject: __makeTemplateObject,
3609
- __importStar: __importStar,
3610
- __importDefault: __importDefault,
3611
- __classPrivateFieldGet: __classPrivateFieldGet,
3612
- __classPrivateFieldSet: __classPrivateFieldSet,
3613
- __classPrivateFieldIn: __classPrivateFieldIn,
3614
- __addDisposableResource: __addDisposableResource,
3615
- __disposeResources: __disposeResources,
3616
- };
3466
+ }
3617
3467
 
3618
3468
  var BUTTON_TOGGLE_DEFAULT_OPTIONS = new i0.InjectionToken('BUTTON_TOGGLE_DEFAULT_OPTIONS');
3619
3469
  var BUTTON_TOGGLE_GROUP = new i0.InjectionToken('QMSButtonToggleGroup');
@@ -32737,11 +32587,38 @@
32737
32587
  var wordsBox = document.querySelector("#" + _this.editorId + " .wordcount-content");
32738
32588
  if (!!wordsBox) {
32739
32589
  wordsBox.textContent = _this.LANG.QMSCKEDITOR.WORDS + ": " + stats.words + " / " + _this.LANG.QMSCKEDITOR.CHARACTERS + ": " + stats.characters;
32590
+ if (_this.qmsckData.maxLength) {
32591
+ wordsBox.textContent = _this.LANG.QMSCKEDITOR.MAXIMIZE + " " + _this.LANG.QMSCKEDITOR.CHARACTERS + ": " + _this.qmsckData.maxLength;
32592
+ var tempDiv = document.createElement('div');
32593
+ tempDiv.innerHTML = editor.getData();
32594
+ var plainText = tempDiv.textContent || tempDiv.innerText || '';
32595
+ if (plainText.length > _this.qmsckData.maxLength) {
32596
+ var trimmedText = plainText.slice(0, _this.qmsckData.maxLength);
32597
+ _this.editorInstance.setData(trimmedText);
32598
+ setTimeout(function () {
32599
+ var editorElement = _this.editorInstance.editing.view.domRoots.get('main');
32600
+ if (editorElement) {
32601
+ editorElement.blur();
32602
+ }
32603
+ }, 0);
32604
+ }
32605
+ }
32740
32606
  }
32741
32607
  });
32742
32608
  if (this.qmsckData.isReadOnly) {
32743
32609
  editor.isReadOnly = true;
32744
32610
  }
32611
+ this.editorInstance.editing.view.document.on('keydown', function (event, data) {
32612
+ if (_this.qmsckData.maxLength) {
32613
+ var tempDiv = document.createElement('div');
32614
+ tempDiv.innerHTML = editor.getData();
32615
+ var plainText = tempDiv.textContent || tempDiv.innerText || '';
32616
+ if (plainText.length > _this.qmsckData.maxLength) {
32617
+ data.preventDefault();
32618
+ event.stop();
32619
+ }
32620
+ }
32621
+ });
32745
32622
  this._setEditorInstanceObserver(this.editorId);
32746
32623
  };
32747
32624
  /**
@@ -38818,6 +38695,12 @@
38818
38695
  },] }
38819
38696
  ];
38820
38697
 
38698
+ var QMSCustomConfigDialog = /** @class */ (function () {
38699
+ function QMSCustomConfigDialog() {
38700
+ }
38701
+ return QMSCustomConfigDialog;
38702
+ }());
38703
+
38821
38704
  var QMSSelectAccessDialog = /** @class */ (function () {
38822
38705
  function QMSSelectAccessDialog() {
38823
38706
  this.enableSelectPerson = true;
@@ -38838,6 +38721,8 @@
38838
38721
  this.formatMsgDisable = null;
38839
38722
  this.maxWidthNode = 510;
38840
38723
  this.skipFirstAskingScreen = false;
38724
+ this.userGroupConfig = new QMSCustomConfigDialog();
38725
+ this.personConfig = new QMSCustomConfigDialog();
38841
38726
  }
38842
38727
  return QMSSelectAccessDialog;
38843
38728
  }());
@@ -39018,8 +38903,12 @@
39018
38903
  }
39019
38904
  if (this.options.length === 1 || this.dialogData.skipFirstAskingScreen) {
39020
38905
  this.dialogRef.updateSize(this.dialogData.sizeUpdateDefault);
39021
- this.optionSelect.setValue(this.options[0].type);
39022
- var event$ = new select.MatSelectChange(null, this.options[0].type);
38906
+ var defaultType = this.options[0].type;
38907
+ if (this.dialogData.defaultSelectMode) {
38908
+ defaultType = this.dialogData.defaultSelectMode;
38909
+ }
38910
+ this.optionSelect.setValue(defaultType);
38911
+ var event$ = new select.MatSelectChange(null, defaultType);
39023
38912
  this.onSelectionTypeChange(event$);
39024
38913
  }
39025
38914
  };
@@ -39372,7 +39261,7 @@
39372
39261
  this.onPagingEvent.emit(Object.assign(Object.assign({}, val), { type: type }));
39373
39262
  };
39374
39263
  QMSSelectAccessDialogComponent.prototype.onResultDepartmentChange = function (event) {
39375
- // this.resultAccess.departments = event;
39264
+ this.resultAccess.departments = event;
39376
39265
  };
39377
39266
  QMSSelectAccessDialogComponent.prototype.updateResultSearchDepartment = function (data) {
39378
39267
  var _this = this;
@@ -39432,7 +39321,7 @@
39432
39321
  QMSSelectAccessDialogComponent.decorators = [
39433
39322
  { type: i0.Component, args: [{
39434
39323
  selector: 'qms-select-access-dialog',
39435
- template: "<div qms-dialog-container-v2 class=\"select-access-dialog-container\">\n <div qms-dialog-header>\n <div class=\"access-dialog-header mb-2\">\n <span class=\"header-title\">{{dialogData.titleDialog || LANG.SELECT_ACCESS}}</span>\n <button matDialogClose class=\"btn-close-dialog\" qms-btn-icon color=\"light\">\n <mat-icon class=\"mat-icons-outlined\">close</mat-icon>\n </button>\n </div>\n </div>\n <div [class.active]=\"optionSelect.value !== null\" qms-dialog-content class=\"qms-dialog-content\">\n <div class=\"access-dialog-wraper\">\n <mat-form-field *ngIf=\"options.length > 1\" qms-form qms-select-input class=\"field-select-option w-100\"\n appearance=\"fill\">\n <mat-label qms-select-input>{{LANG.TYPE}}</mat-label>\n <mat-select (selectionChange)=\"onSelectionTypeChange($event)\" [formControl]=\"optionSelect\" placeholder=\"Select\"\n disableOptionCentering #singleSelect panelClass=\"qms-select-panel\" qms-select>\n\n <mat-option *ngFor=\"let item of options\" [value]=\"item.type\">\n {{ LANG[item.displayName] }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"body-dialog-container\">\n <!-- Person Access -->\n <div class=\"option-selected-content\">\n <ng-container *ngIf=\"optionSelect.value === OPTION_ENUM.PERSON\">\n <form *ngIf=\"personForm\" [formGroup]=\"personForm\">\n <mat-dialog-content>\n <div class=\"group-filter-person-option\">\n <mat-form-field *ngIf=\"optionFilterPersonDataGlobal.userGroups.length\" qms-form qms-select-input\n class=\"w-100\" appearance=\"fill\">\n <mat-label qms-select-input>{{LANG.ROLE}}</mat-label>\n <mat-select panelClass=\"qms-select-panel\" qms-select formControlName=\"userGroup\"\n disableOptionCentering>\n <mat-select-trigger>\n {{personForm.controls['userGroup'].value?.name || ''}}\n </mat-select-trigger>\n <mat-option>\n <ngx-mat-select-search formControlName=\"userGroupFilter\" placeholderLabel=\"{{ LANG.ROLE }}\"\n noEntriesFoundLabel=\"\">\n </ngx-mat-select-search>\n </mat-option>\n <mat-option mode=\"dark\" class=\"opt-check-icon\"\n *ngFor=\"let item of filteredSearchTextBox.userGroup.value\" [value]=\"item\">\n <span qms-elipsify position=\"top\" mode=\"dark\" class=\"text-option-content\">{{ item.name }}</span>\n <mat-icon class=\"check-icon\"\n *ngIf=\"personForm.controls['userGroup'].value?.id == item.id\">check</mat-icon>\n </mat-option>\n </mat-select>\n <span [@inOutAnimation] (click)=\"personForm.get('userGroup').setValue('')\" class=\"pointer \"\n matSuffix aria-label=\"Clear\" *ngIf=\"personForm.get('userGroup').value && !getLoading$.value\">\n <mat-icon>close</mat-icon>\n </span>\n </mat-form-field>\n <!-- input field department filter person -->\n <mat-form-field *ngIf=\"optionFilterPersonDataGlobal.departments.length\"\n class=\"w-100 input-select-option\" qms-form qms-select-input>\n <mat-label>{{LANG.DEPARTMENT_UNIT}}</mat-label>\n <mat-select panelClass=\"qms-select-panel\" qms-select disableOptionCentering\n formControlName=\"department\">\n <mat-select-trigger>\n {{personForm.controls['department'].value?.name || ''}}\n </mat-select-trigger>\n <mat-option>\n <ngx-mat-select-search formControlName=\"departmentFilter\"\n [placeholderLabel]=\"LANG.DEPARTMENT_UNIT\" noEntriesFoundLabel=\"\">\n </ngx-mat-select-search>\n </mat-option>\n <mat-option class=\"opt-check-icon\" *ngFor=\"let item of filteredSearchTextBox.department.value\"\n [value]=\"item\">\n <span qms-elipsify mode=\"dark\" position=\"top\" class=\"text-option-content\">{{ item.name }}</span>\n <mat-icon class=\"check-icon\"\n *ngIf=\"personForm.controls['department'].value?.id == item.id\">check</mat-icon>\n </mat-option>\n </mat-select>\n <span (click)=\"setFormControlValue(['recursive','department'], [false,''])\" [@inOutAnimation]\n class=\"pointer\" matSuffix aria-label=\"Clear\"\n *ngIf=\"personForm.get('department').value && !getLoading$.value\">\n <mat-icon>close</mat-icon>\n </span>\n </mat-form-field>\n </div>\n\n <mat-slide-toggle [@inOutAnimation] *ngIf=\"personForm.controls['department'].value\"\n class=\"w-100 slide-toggle\" formControlName=\"recursive\" color=\"default\" qms-group-options>\n <span class=\"text-label\">{{LANG.INCLUDE_SUB_DEPARTMENTS}}</span>\n </mat-slide-toggle>\n\n <mat-form-field class=\"w-100\" appearance=\"fill\" qms-form qms-search-field>\n <input matInput appearance=\"off\" [placeholder]=\"LANG.SEARCH_WITH_NAME\" formControlName=\"keyword\"\n type=\"text\" autocomplete=\"off\" />\n <button *ngIf=\"!getLoading$.value\" qms-btn-icon color=\"light\" [@inOutAnimation]\n (click)=\"onSearchPersonFreeText()\" class=\"pointer me-1\" matSuffix aria-label=\"Search\">\n <mat-icon>search</mat-icon>\n </button>\n <mat-progress-spinner [@inOutAnimation] *ngIf=\"getLoading$.value\" matSuffix mode=\"indeterminate\"\n diameter=\"20\"></mat-progress-spinner>\n <span [@inOutAnimation] (click)=\"personForm.get('keyword').setValue('')\"\n class=\"pointer btn-icon-clear d-flex justify-content-center align-items-center \" matSuffix\n aria-label=\"Clear\" *ngIf=\"personForm.get('keyword').value && !getLoading$.value\">\n <button qms-btn-icon color=\"light\">\n <mat-icon>close</mat-icon>\n </button>\n </span>\n </mat-form-field>\n <button (click)=\"onFilterPerson()\" qms-btn-outlined class=\"w-100 my-1\">\n {{LANG.FILTER}}\n </button>\n </mat-dialog-content>\n\n <mat-dialog-content class=\"items-list\">\n <div qms-scrollbar>\n <div class=\"item\">\n <mat-checkbox [@inOutAnimation]\n *ngIf=\"!getLoading$.value && personFiltered.length && !dialogData.modeSelectOnePerson\"\n [disabled]=\"isDisabledSelectAll(OPTION_ENUM.PERSON)\" #checkPerson class=\"w-100 mb-1 checkbox-all\"\n (click)=\"personFiltered.length && onCheckAll(OPTION_ENUM.PERSON,checkPerson)\"\n [checked]=\"isCheckAll(OPTION_ENUM.PERSON)\" [indeterminate]=\"isIndeterminate(OPTION_ENUM.PERSON)\"\n color=\"default\" qms-group-options>\n <span class=\"text-label header-title\">{{LANG.CHOOSE_ALL}} </span>\n <span>(<b>{{personFiltered.length}}</b>)</span>\n </mat-checkbox>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <ng-container *ngIf=\"getLoading$.value; then loading\">\n </ng-container>\n <div [@inOutAnimation] *ngIf=\"personFiltered.length && !getLoading$.value\" [@listAnimation]\n class=\"item-list-wrapper\">\n <div class=\"item mt-1\" [@inOutAnimation]\n *ngFor=\"let employee of personFiltered; trackBy: trackByFn\">\n <ng-container\n [ngTemplateOutlet]=\"dialogData.modeSelectOnePerson ?itemWithoutCheckboxTemplate : itemCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{item: employee, type: OPTION_ENUM.PERSON}\">\n </ng-container>\n </div>\n </div>\n <div [@inOutAnimation] *ngIf=\"!personFiltered.length && !getLoading$.value\"\n class=\"item-list-wrapper no-result\">\n <ng-container *ngTemplateOutlet=\"noResult\"></ng-container>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <qms-paginator overlayPanelClass=\"select-access-paginator\" #pagingPerson\n *ngIf=\"getPerson$.value.length > 10\" [length]=\"getPerson$.value.length\" [numHidden]=\"0\"\n [pageSize]=\"getPerson$.value.pageSize\" [pageSizeOptions]=\"PAGE_SIZE_OPTION\"\n (page)='onPaginatorEvent($event, OPTION_ENUM.PERSON)' [size]='PAGINATION_SIZE.medium'>\n </qms-paginator>\n </div>\n </mat-dialog-content>\n </form>\n </ng-container>\n\n <!-- UserGroup Access -->\n <ng-container *ngIf=\"optionSelect.value === OPTION_ENUM.USER_GROUP\">\n <div>\n <mat-dialog-content>\n <form (submit)=\"onFilterUserGroup()\">\n <mat-form-field class=\"w-100\" qms-form qms-search-field>\n <input [formControl]=\"userGroupForm\" matInput type=\"text\" autocomplete=\"off\"\n placeholder=\"User group\" />\n <button [@inOutAnimation] *ngIf=\"!getLoading$.value\" type=\"submit\" qms-btn-icon color=\"light\"\n matSuffix>\n <mat-icon>search</mat-icon>\n </button>\n <mat-progress-spinner [@inOutAnimation] *ngIf=\"getLoading$.value\" matSuffix mode=\"indeterminate\"\n diameter=\"20\"></mat-progress-spinner>\n <div [@inOutAnimation] *ngIf=\"!!userGroupForm.value && !getLoading$.value\" matSuffix\n qms-input-clear>\n <button (click)=\"userGroupForm.setValue('')\" qms-btn-icon color=\"light\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </mat-form-field>\n </form>\n </mat-dialog-content>\n <mat-dialog-content class=\"items-list\">\n <div qms-scrollbar>\n <div class=\"item\">\n <mat-checkbox [@inOutAnimation]\n *ngIf=\"!getLoading$.value && (userGroupFiltered.length && !dialogData.modeSelectOneUserGroup)\"\n [disabled]=\"isDisabledSelectAll(OPTION_ENUM.USER_GROUP)\" #checkUserGroup\n class=\"w-100 checkbox-all mb-1\" color=\"default\" [checked]=\"isCheckAll(OPTION_ENUM.USER_GROUP)\"\n [indeterminate]=\"isIndeterminate(OPTION_ENUM.USER_GROUP)\"\n (click)=\"userGroupFiltered.length && onCheckAll(OPTION_ENUM.USER_GROUP,checkUserGroup)\"\n qms-group-options>\n <span class=\"text-label header-title\">{{LANG.CHOOSE_ALL}}</span>\n <span>(<b>{{userGroupFiltered.length}}</b>)</span>\n </mat-checkbox>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <ng-container *ngIf=\"getLoading$.value;then loading\">\n </ng-container>\n <div *ngIf=\"userGroupFiltered.length && !getLoading$.value\" [@listAnimation]\n class=\"item-list-wrapper\">\n <div [@inOutAnimation] class=\"item mt-1\" *ngFor=\"let userGroup of userGroupFiltered\">\n <ng-container\n [ngTemplateOutlet]=\"dialogData.modeSelectOneUserGroup ? itemWithoutCheckboxTemplate : itemCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{item: userGroup,type: OPTION_ENUM.USER_GROUP}\">\n </ng-container>\n </div>\n </div>\n <div [@inOutAnimation] *ngIf=\"!userGroupFiltered.length && !getLoading$.value\"\n class=\"item-list-wrapper no-result\">\n <ng-container *ngTemplateOutlet=\"noResult\"></ng-container>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <qms-paginator overlayPanelClass=\"select-access-paginator\" #pagingUserGroup class=\"my-1\"\n *ngIf=\"getUserGroup$.value.length > 10 \" [length]=\"getUserGroup$.value.length\" [numHidden]=\"0\"\n [pageSize]=\"getUserGroup$.value.pageSize\" [pageSizeOptions]=\"PAGE_SIZE_OPTION\"\n (page)='onPaginatorEvent($event, OPTION_ENUM.USER_GROUP)' [size]='PAGINATION_SIZE.medium'>\n </qms-paginator>\n </div>\n </mat-dialog-content>\n </div>\n </ng-container>\n\n <!-- Department Access -->\n <ng-container\n *ngIf=\"optionSelect.value === OPTION_ENUM.DEPARTMENT && getLoading$.value; then loading\"></ng-container>\n <ng-container *ngIf=\"optionSelect.value === OPTION_ENUM.DEPARTMENT && !getLoading$.value\"\n class=\"person-access\">\n <qms-select-department-tree #tree [rowsSkeleton]=\"8\" [config]=\"dialogData.treeDepartmentConfig\"\n [maxWidthNode]=\"dialogData.maxWidthNode\" (onSearchEvent)=\"onSearchDepartmentEvent.emit($event)\"\n (onValueChangeEvent)=\"onResultDepartmentChange($event)\"\n (selectionNodeChangeEvent)=\"onSelectionNodeDepartmentChange($event)\"\n (onPagingSearchEvent)=\"onPaginatorEvent($event, OPTION_ENUM.DEPARTMENT)\">\n </qms-select-department-tree>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"optionSelect.value !== null\" class=\"result-wrapper\">\n <div class=\"result-selected-container\">\n <div [@inOutAnimation] *ngIf=\"(options.length === 1) || (options.length > 1 && optionSelect.value !== null)\"\n class=\"header-title result-header\">\n <span>\n {{\n dialogData.titleResult || LANG.RESULTS}}\n <span *ngIf=\"options.length === 1 && hasItemSelected()\">\n ({{getResultTabActive().length}})\n </span>\n </span>\n </div>\n <div class=\"result-body\">\n <!-- Result Person -->\n <ng-container *ngIf=\"checkExistOptionSelect(OPTION_ENUM.PERSON)\"\n [ngTemplateOutlet]=\"options?.length == 1 ? listChip : viewResultCollapse\"\n [ngTemplateOutletContext]=\"{data:resultAccess.persons, type:OPTION_ENUM.PERSON, title:LANG.PERSON}\">\n </ng-container>\n <!-- Result User group -->\n <ng-container *ngIf=\"checkExistOptionSelect(OPTION_ENUM.USER_GROUP)\"\n [ngTemplateOutlet]=\"options?.length == 1 ? listChip : viewResultCollapse\"\n [ngTemplateOutletContext]=\"{data:resultAccess.userGroups, type:OPTION_ENUM.USER_GROUP, title:LANG.USER_GROUP}\">\n </ng-container>\n <!-- Result Department -->\n <ng-container *ngIf=\"checkExistOptionSelect(OPTION_ENUM.DEPARTMENT)\"\n [ngTemplateOutlet]=\"options?.length == 1 ? listChip : viewResultCollapse\"\n [ngTemplateOutletContext]=\"{data: resultAccess.departments, type:OPTION_ENUM.DEPARTMENT, title:LANG.DEPARTMENT}\">\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <div qms-dialog-footer class=\"confirm__button__groups\" [class.none-option]=\"optionSelect.value === null\">\n <button *ngIf=\"optionSelect.value !== null\"\n [disabled]=\"!hasItemSelected() && !dialogData.treeDepartmentConfig.canAddNullResult\" class=\"btn-add\"\n [class.qms-btn-disabled]=\"!hasItemSelected() && !dialogData.treeDepartmentConfig.canAddNullResult\"\n [mat-dialog-close]=\"resultAccess\" qms-btn>\n <span>{{dialogData.confirmTitle || LANG.ADD}}</span>\n </button>\n <button qms-btn-text mat-dialog-close>\n {{dialogData.cancelTitle || LANG.CANCEL}}\n </button>\n </div>\n</div>\n\n<!-- Template -->\n<ng-template #noResult>\n <svg width=\"89\" height=\"130\" viewBox=\"0 0 89 88\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.5\" width=\"88\" height=\"88\" rx=\"44\" fill=\"white\" />\n <rect x=\"0.5\" width=\"88\" height=\"88\" rx=\"44\" fill=\"#0163B2\" fill-opacity=\"0.12\" />\n <path\n d=\"M44.5 56.6936L58.096 64.8996L54.488 49.4336L66.5 39.0276L50.682 37.6856L44.5 23.0996L38.318 37.6856L22.5 39.0276L34.512 49.4336L30.904 64.8996L44.5 56.6936Z\"\n fill=\"#0163B3\" />\n <text x=\"10\" y=\"105\" fill=\"#0163B2\">{{LANG.NO_RESULT}}</text>\n </svg>\n</ng-template>\n\n<!-- Template list chip -->\n<ng-template #listChip let-data=\"data\" let-type=\"type\">\n <mat-chip-list [@inOutAnimation] *ngIf=\"data?.length\" class=\"panel__item qms-scrollbar\">\n <div [@inOutAnimation_2] *ngFor=\"let item of data; let i = index\">\n <mat-chip (click)=\"onScollToNodeTreeDepartment(item)\" [@updateItemAnimation]\n *qmsContentChanges=\"item.children?.length\" class=\"chip-item-result\" qms-chip [removable]=\"true\">\n <span qms-chip-body>\n <span [qms-tool-tip]=\"generateTooltip(item)\" position=\"top\" mode=\"dark\" class=\"text-label\">\n {{item.name}}\n <span *ngIf=\"item.subName\">({{ item.subName }})</span>\n </span>\n <span class=\"chip-item-children__count ms-1\" *ngIf=\"item?.children && item?.isGroup\">\n {{item.children.length}}/{{item.childCount}}\n </span>\n </span>\n <mat-icon *ngIf=\"allowRemove(type, item)\" (click)=\"onRemoveChip(type,item, i)\"\n class=\"remove-chip-icon\">cancel</mat-icon>\n <mat-icon *ngIf=\"!allowRemove(type, item) && dialogData.formatMsgDisable\" position=\"top\" mode=\"dark\"\n [qms-tool-tip]=\"dialogData.formatMsgDisable(item)\" class=\"remove-chip-icon\">info_i</mat-icon>\n </mat-chip>\n </div>\n </mat-chip-list>\n</ng-template>\n\n<!-- Template result with collapse -->\n<ng-template #viewResultCollapse let-title=\"title\" let-data=\"data\" let-type=\"type\">\n <mat-expansion-panel qms-expansion [expanded]=\"optionSelect.value === type\">\n <mat-expansion-panel-header>\n <div class=\"title-content\">\n <div class=\"qms-list-text\">\n <div qms-line color=\"default-subtitle\">{{title}}\n <span class=\"fw-600\">\n ({{data?.length}})\n </span>\n </div>\n </div>\n </div>\n </mat-expansion-panel-header>\n <ng-container [ngTemplateOutlet]=\"listChip\" [ngTemplateOutletContext]=\"{data: data,type: type}\">\n </ng-container>\n </mat-expansion-panel>\n</ng-template>\n\n<!-- Template row without checkbox -->\n<ng-template #itemWithoutCheckboxTemplate let-item=\"item\" let-type=\"type\">\n <div (click)=\"onSelectItem(type,item)\" class=\"item-without-checkbox w-100\" [class.active]=\"item.selected\">\n <div class=\"item-content\">\n <div class=\"text-label\">\n <span class=\"text-label label-item fs-14 \">\n {{ item.name }}\n </span>\n <span *ngIf=\"item.subName\" class=\"ms-1 sub-label\">({{item.subName}})</span>\n </div>\n <small *ngIf=\"item.helpText\" class=\"text-help px-1 fs-12 sub-label\">{{ item.helpText }}</small>\n </div>\n <div class=\"item-state\">\n <mat-icon [@inOutAnimation] *ngIf=\"item.selected\">check</mat-icon>\n </div>\n </div>\n</ng-template>\n\n<!-- Template checkbox -->\n<ng-template #itemCheckboxTemplate let-item=\"item\" let-type=\"type\">\n <mat-checkbox [disabled]=\"!allowRemove(type, item)\" [checked]=\"item.selected\" (click)=\"onSelectItem(type,item)\"\n class=\"w-100\" color=\"default\" qms-group-options>\n <div class=\"text-label\">\n <span class=\"text-label label-item fs-14 \">\n {{ item.name }}\n </span>\n <span *ngIf=\"item.subName\" class=\"ms-1 sub-label\">({{item.subName}})</span>\n </div>\n <small *ngIf=\"item.helpText\" class=\"text-help px-1 fs-12 sub-label\">{{ item.helpText }}</small>\n </mat-checkbox>\n</ng-template>\n\n<!-- Template loading -->\n<ng-template #loading>\n <div class=\"qms-loading-container\">\n <div class=\"qms-loader\" *ngFor=\"let item of arrSkeleton\">\n <div class=\"qms-loader__wrapper\">\n <div class=\"row-loader\">\n </div>\n </div>\n </div>\n </div>\n</ng-template>",
39324
+ template: "<div qms-dialog-container-v2 class=\"select-access-dialog-container\">\n <div qms-dialog-header>\n <div class=\"access-dialog-header mb-2\">\n <span class=\"header-title\">{{dialogData.titleDialog || LANG.SELECT_ACCESS}}</span>\n <button matDialogClose class=\"btn-close-dialog\" qms-btn-icon color=\"light\">\n <mat-icon class=\"mat-icons-outlined\">close</mat-icon>\n </button>\n </div>\n </div>\n <div [class.active]=\"optionSelect.value !== null\" qms-dialog-content class=\"qms-dialog-content\">\n <div class=\"access-dialog-wraper\">\n <mat-form-field *ngIf=\"options.length > 1\" qms-form qms-select-input class=\"field-select-option w-100\"\n appearance=\"fill\">\n <mat-label qms-select-input>{{LANG.TYPE}}</mat-label>\n <mat-select (selectionChange)=\"onSelectionTypeChange($event)\" [formControl]=\"optionSelect\" placeholder=\"Select\"\n disableOptionCentering #singleSelect panelClass=\"qms-select-panel\" qms-select>\n\n <mat-option *ngFor=\"let item of options\" [value]=\"item.type\">\n {{ LANG[item.displayName] }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"body-dialog-container\">\n <!-- Person Access -->\n <div class=\"option-selected-content\">\n <ng-container *ngIf=\"optionSelect.value === OPTION_ENUM.PERSON\">\n <form *ngIf=\"personForm\" [formGroup]=\"personForm\">\n <mat-dialog-content>\n <div class=\"group-filter-person-option\">\n <mat-form-field *ngIf=\"optionFilterPersonDataGlobal.userGroups.length\" qms-form qms-select-input\n class=\"w-100\" appearance=\"fill\">\n <mat-label qms-select-input>{{LANG.ROLE}}</mat-label>\n <mat-select panelClass=\"qms-select-panel\" qms-select formControlName=\"userGroup\"\n (selectionChange)=\"onFilterPerson()\"\n disableOptionCentering>\n <mat-select-trigger>\n {{personForm.controls['userGroup'].value?.name || ''}}\n </mat-select-trigger>\n <mat-option>\n <ngx-mat-select-search formControlName=\"userGroupFilter\" placeholderLabel=\"{{ LANG.ROLE }}\"\n noEntriesFoundLabel=\"\">\n </ngx-mat-select-search>\n </mat-option>\n <mat-option mode=\"dark\" class=\"opt-check-icon\"\n *ngFor=\"let item of filteredSearchTextBox.userGroup.value\" [value]=\"item\">\n <span qms-elipsify position=\"top\" mode=\"dark\" class=\"text-option-content\">{{ item.name }}</span>\n <mat-icon class=\"check-icon\"\n *ngIf=\"personForm.controls['userGroup'].value?.id == item.id\">check</mat-icon>\n </mat-option>\n </mat-select>\n <span [@inOutAnimation] (click)=\"personForm.get('userGroup').setValue(''); onFilterPerson()\" class=\"pointer \"\n matSuffix aria-label=\"Clear\" *ngIf=\"personForm.get('userGroup').value && !getLoading$.value\">\n <mat-icon>close</mat-icon>\n </span>\n </mat-form-field>\n <!-- input field department filter person -->\n <mat-form-field *ngIf=\"optionFilterPersonDataGlobal.departments.length\"\n class=\"w-100 input-select-option\" qms-form qms-select-input>\n <mat-label>{{LANG.DEPARTMENT_UNIT}}</mat-label>\n <mat-select panelClass=\"qms-select-panel\" qms-select disableOptionCentering\n (selectionChange)=\"onFilterPerson()\"\n formControlName=\"department\">\n <mat-select-trigger>\n {{personForm.controls['department'].value?.name || ''}}\n </mat-select-trigger>\n <mat-option>\n <ngx-mat-select-search formControlName=\"departmentFilter\"\n [placeholderLabel]=\"LANG.DEPARTMENT_UNIT\" noEntriesFoundLabel=\"\">\n </ngx-mat-select-search>\n </mat-option>\n <mat-option class=\"opt-check-icon\" *ngFor=\"let item of filteredSearchTextBox.department.value\"\n [value]=\"item\">\n <span qms-elipsify mode=\"dark\" position=\"top\" class=\"text-option-content\">{{ item.name }}</span>\n <mat-icon class=\"check-icon\"\n *ngIf=\"personForm.controls['department'].value?.id == item.id\">check</mat-icon>\n </mat-option>\n </mat-select>\n <span (click)=\"setFormControlValue(['recursive','department'], [false,'']); onFilterPerson()\" [@inOutAnimation]\n class=\"pointer\" matSuffix aria-label=\"Clear\"\n *ngIf=\"personForm.get('department').value && !getLoading$.value\">\n <mat-icon>close</mat-icon>\n </span>\n </mat-form-field>\n </div>\n\n <mat-slide-toggle [@inOutAnimation] *ngIf=\"personForm.controls['department'].value\"\n class=\"w-100 slide-toggle\" formControlName=\"recursive\" color=\"default\" qms-group-options>\n <span class=\"text-label\">{{LANG.INCLUDE_SUB_DEPARTMENTS}}</span>\n </mat-slide-toggle>\n\n <mat-form-field class=\"w-100\" appearance=\"fill\" qms-form qms-search-field>\n <input matInput appearance=\"off\" [placeholder]=\"LANG.SEARCH_WITH_NAME\" formControlName=\"keyword\"\n type=\"text\" autocomplete=\"off\" />\n <button *ngIf=\"!getLoading$.value\" qms-btn-icon color=\"light\" [@inOutAnimation]\n (click)=\"onSearchPersonFreeText()\" class=\"pointer me-1\" matSuffix aria-label=\"Search\">\n <mat-icon>search</mat-icon>\n </button>\n <mat-progress-spinner [@inOutAnimation] *ngIf=\"getLoading$.value\" matSuffix mode=\"indeterminate\"\n diameter=\"20\"></mat-progress-spinner>\n <span [@inOutAnimation] (click)=\"personForm.get('keyword').setValue('')\"\n class=\"pointer btn-icon-clear d-flex justify-content-center align-items-center \" matSuffix\n aria-label=\"Clear\" *ngIf=\"personForm.get('keyword').value && !getLoading$.value\">\n <button qms-btn-icon color=\"light\">\n <mat-icon>close</mat-icon>\n </button>\n </span>\n </mat-form-field>\n <button (click)=\"onFilterPerson()\" qms-btn-outlined class=\"w-100 my-1\">\n {{LANG.FILTER}}\n </button>\n </mat-dialog-content>\n\n <mat-dialog-content class=\"items-list\">\n <div qms-scrollbar>\n <div class=\"item\">\n <mat-checkbox [@inOutAnimation]\n *ngIf=\"!getLoading$.value && personFiltered.length && !dialogData.modeSelectOnePerson\"\n [disabled]=\"isDisabledSelectAll(OPTION_ENUM.PERSON)\" #checkPerson class=\"w-100 mb-1 checkbox-all\"\n (click)=\"personFiltered.length && onCheckAll(OPTION_ENUM.PERSON,checkPerson)\"\n [checked]=\"isCheckAll(OPTION_ENUM.PERSON)\" [indeterminate]=\"isIndeterminate(OPTION_ENUM.PERSON)\"\n color=\"default\" qms-group-options>\n <span class=\"text-label header-title\">{{LANG.CHOOSE_ALL}} </span>\n <span>(<b>{{personFiltered.length}}</b>)</span>\n </mat-checkbox>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <ng-container *ngIf=\"getLoading$.value; then loading\">\n </ng-container>\n <div [@inOutAnimation] *ngIf=\"personFiltered.length && !getLoading$.value\" [@listAnimation]\n class=\"item-list-wrapper\">\n <div class=\"item mt-1\" [@inOutAnimation]\n *ngFor=\"let employee of personFiltered; trackBy: trackByFn\">\n <ng-container\n [ngTemplateOutlet]=\"dialogData.modeSelectOnePerson ?itemWithoutCheckboxTemplate : itemCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{item: employee, type: OPTION_ENUM.PERSON}\">\n </ng-container>\n </div>\n </div>\n <div [@inOutAnimation] *ngIf=\"!personFiltered.length && !getLoading$.value\"\n class=\"item-list-wrapper no-result\">\n <ng-container *ngTemplateOutlet=\"noResult\"></ng-container>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <qms-paginator overlayPanelClass=\"select-access-paginator\" #pagingPerson\n *ngIf=\"getPerson$.value.length > 10\" [length]=\"getPerson$.value.length\" [numHidden]=\"0\"\n [pageSize]=\"getPerson$.value.pageSize\" [pageSizeOptions]=\"PAGE_SIZE_OPTION\"\n (page)='onPaginatorEvent($event, OPTION_ENUM.PERSON)' [size]='PAGINATION_SIZE.medium'>\n </qms-paginator>\n </div>\n </mat-dialog-content>\n </form>\n </ng-container>\n\n <!-- UserGroup Access -->\n <ng-container *ngIf=\"optionSelect.value === OPTION_ENUM.USER_GROUP\">\n <div>\n <mat-dialog-content>\n <form (submit)=\"onFilterUserGroup()\">\n <mat-form-field class=\"w-100\" qms-form qms-search-field>\n <input [formControl]=\"userGroupForm\" matInput type=\"text\" autocomplete=\"off\"\n [placeholder]=\"dialogData.userGroupConfig?.searchName || LANG.USER_GROUP\" />\n <button [@inOutAnimation] *ngIf=\"!getLoading$.value\" type=\"submit\" qms-btn-icon color=\"light\"\n matSuffix>\n <mat-icon>search</mat-icon>\n </button>\n <mat-progress-spinner [@inOutAnimation] *ngIf=\"getLoading$.value\" matSuffix mode=\"indeterminate\"\n diameter=\"20\"></mat-progress-spinner>\n <div [@inOutAnimation] *ngIf=\"!!userGroupForm.value && !getLoading$.value\" matSuffix\n qms-input-clear>\n <button (click)=\"userGroupForm.setValue('')\" qms-btn-icon color=\"light\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </mat-form-field>\n </form>\n </mat-dialog-content>\n <mat-dialog-content class=\"items-list\">\n <div qms-scrollbar>\n <div class=\"item\">\n <mat-checkbox [@inOutAnimation]\n *ngIf=\"!getLoading$.value && (userGroupFiltered.length && !dialogData.modeSelectOneUserGroup)\"\n [disabled]=\"isDisabledSelectAll(OPTION_ENUM.USER_GROUP)\" #checkUserGroup\n class=\"w-100 checkbox-all mb-1\" color=\"default\" [checked]=\"isCheckAll(OPTION_ENUM.USER_GROUP)\"\n [indeterminate]=\"isIndeterminate(OPTION_ENUM.USER_GROUP)\"\n (click)=\"userGroupFiltered.length && onCheckAll(OPTION_ENUM.USER_GROUP,checkUserGroup)\"\n qms-group-options>\n <span class=\"text-label header-title\">{{LANG.CHOOSE_ALL}}</span>\n <span>(<b>{{userGroupFiltered.length}}</b>)</span>\n </mat-checkbox>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <ng-container *ngIf=\"getLoading$.value;then loading\">\n </ng-container>\n <div *ngIf=\"userGroupFiltered.length && !getLoading$.value\" [@listAnimation]\n class=\"item-list-wrapper\">\n <div [@inOutAnimation] class=\"item mt-1\" *ngFor=\"let userGroup of userGroupFiltered\">\n <ng-container\n [ngTemplateOutlet]=\"dialogData.modeSelectOneUserGroup ? itemWithoutCheckboxTemplate : itemCheckboxTemplate\"\n [ngTemplateOutletContext]=\"{item: userGroup,type: OPTION_ENUM.USER_GROUP}\">\n </ng-container>\n </div>\n </div>\n <div [@inOutAnimation] *ngIf=\"!userGroupFiltered.length && !getLoading$.value\"\n class=\"item-list-wrapper no-result\">\n <ng-container *ngTemplateOutlet=\"noResult\"></ng-container>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <qms-paginator overlayPanelClass=\"select-access-paginator\" #pagingUserGroup class=\"my-1\"\n *ngIf=\"getUserGroup$.value.length > 10 \" [length]=\"getUserGroup$.value.length\" [numHidden]=\"0\"\n [pageSize]=\"getUserGroup$.value.pageSize\" [pageSizeOptions]=\"PAGE_SIZE_OPTION\"\n (page)='onPaginatorEvent($event, OPTION_ENUM.USER_GROUP)' [size]='PAGINATION_SIZE.medium'>\n </qms-paginator>\n </div>\n </mat-dialog-content>\n </div>\n </ng-container>\n\n <!-- Department Access -->\n <ng-container\n *ngIf=\"optionSelect.value === OPTION_ENUM.DEPARTMENT && getLoading$.value; then loading\"></ng-container>\n <ng-container *ngIf=\"optionSelect.value === OPTION_ENUM.DEPARTMENT && !getLoading$.value\"\n class=\"person-access\">\n <qms-select-department-tree #tree [rowsSkeleton]=\"8\" [config]=\"dialogData.treeDepartmentConfig\"\n [maxWidthNode]=\"dialogData.maxWidthNode\" (onSearchEvent)=\"onSearchDepartmentEvent.emit($event)\"\n (onValueChangeEvent)=\"onResultDepartmentChange($event)\"\n (selectionNodeChangeEvent)=\"onSelectionNodeDepartmentChange($event)\"\n (onPagingSearchEvent)=\"onPaginatorEvent($event, OPTION_ENUM.DEPARTMENT)\">\n </qms-select-department-tree>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"optionSelect.value !== null\" class=\"result-wrapper\">\n <div class=\"result-selected-container\">\n <div [@inOutAnimation] *ngIf=\"(options.length === 1) || (options.length > 1 && optionSelect.value !== null)\"\n class=\"header-title result-header\">\n <span>\n {{\n dialogData.titleResult || LANG.RESULTS}}\n <span *ngIf=\"options.length === 1 && hasItemSelected()\">\n ({{getResultTabActive().length}})\n </span>\n </span>\n </div>\n <div class=\"result-body\">\n <!-- Result Person -->\n <ng-container *ngIf=\"checkExistOptionSelect(OPTION_ENUM.PERSON)\"\n [ngTemplateOutlet]=\"options?.length == 1 ? listChip : viewResultCollapse\"\n [ngTemplateOutletContext]=\"{data:resultAccess.persons, type:OPTION_ENUM.PERSON, title:LANG.PERSON}\">\n </ng-container>\n <!-- Result User group -->\n <ng-container *ngIf=\"checkExistOptionSelect(OPTION_ENUM.USER_GROUP)\"\n [ngTemplateOutlet]=\"options?.length == 1 ? listChip : viewResultCollapse\"\n [ngTemplateOutletContext]=\"{data:resultAccess.userGroups, type:OPTION_ENUM.USER_GROUP, title: dialogData.userGroupConfig?.searchName || LANG.USER_GROUP}\">\n </ng-container>\n <!-- Result Department -->\n <ng-container *ngIf=\"checkExistOptionSelect(OPTION_ENUM.DEPARTMENT)\"\n [ngTemplateOutlet]=\"options?.length == 1 ? listChip : viewResultCollapse\"\n [ngTemplateOutletContext]=\"{data: resultAccess.departments, type:OPTION_ENUM.DEPARTMENT, title:LANG.DEPARTMENT}\">\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <mat-divider class=\"mx-auto\"></mat-divider>\n <div qms-dialog-footer class=\"confirm__button__groups\" [class.none-option]=\"optionSelect.value === null\">\n <button *ngIf=\"optionSelect.value !== null\"\n [disabled]=\"!hasItemSelected() && !dialogData.treeDepartmentConfig.canAddNullResult\" class=\"btn-add\"\n [class.qms-btn-disabled]=\"!hasItemSelected() && !dialogData.treeDepartmentConfig.canAddNullResult\"\n [mat-dialog-close]=\"resultAccess\" qms-btn>\n <span>{{dialogData.confirmTitle || LANG.ADD}}</span>\n </button>\n <button qms-btn-text mat-dialog-close>\n {{dialogData.cancelTitle || LANG.CANCEL}}\n </button>\n </div>\n</div>\n\n<!-- Template -->\n<ng-template #noResult>\n <svg width=\"89\" height=\"130\" viewBox=\"0 0 89 88\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.5\" width=\"88\" height=\"88\" rx=\"44\" fill=\"white\" />\n <rect x=\"0.5\" width=\"88\" height=\"88\" rx=\"44\" fill=\"#0163B2\" fill-opacity=\"0.12\" />\n <path\n d=\"M44.5 56.6936L58.096 64.8996L54.488 49.4336L66.5 39.0276L50.682 37.6856L44.5 23.0996L38.318 37.6856L22.5 39.0276L34.512 49.4336L30.904 64.8996L44.5 56.6936Z\"\n fill=\"#0163B3\" />\n <text x=\"10\" y=\"105\" fill=\"#0163B2\">{{LANG.NO_RESULT}}</text>\n </svg>\n</ng-template>\n\n<!-- Template list chip -->\n<ng-template #listChip let-data=\"data\" let-type=\"type\">\n <mat-chip-list [@inOutAnimation] *ngIf=\"data?.length\" class=\"panel__item qms-scrollbar\">\n <div [@inOutAnimation_2] *ngFor=\"let item of data; let i = index\">\n <mat-chip (click)=\"onScollToNodeTreeDepartment(item)\" [@updateItemAnimation]\n *qmsContentChanges=\"item.children?.length\" class=\"chip-item-result\" qms-chip [removable]=\"true\">\n <span qms-chip-body>\n <span [qms-tool-tip]=\"generateTooltip(item)\" position=\"top\" mode=\"dark\" class=\"text-label\">\n {{item.name}}\n <span *ngIf=\"item.subName\">({{ item.subName }})</span>\n </span>\n <span class=\"chip-item-children__count ms-1\" *ngIf=\"item?.children && item?.isGroup\">\n {{item.children.length}}/{{item.childCount}}\n </span>\n </span>\n <mat-icon *ngIf=\"allowRemove(type, item)\" (click)=\"onRemoveChip(type,item, i)\"\n class=\"remove-chip-icon\">cancel</mat-icon>\n <mat-icon *ngIf=\"!allowRemove(type, item) && dialogData.formatMsgDisable\" position=\"top\" mode=\"dark\"\n [qms-tool-tip]=\"dialogData.formatMsgDisable(item)\" class=\"remove-chip-icon\">info_i</mat-icon>\n </mat-chip>\n </div>\n </mat-chip-list>\n</ng-template>\n\n<!-- Template result with collapse -->\n<ng-template #viewResultCollapse let-title=\"title\" let-data=\"data\" let-type=\"type\">\n <mat-expansion-panel qms-expansion [expanded]=\"optionSelect.value === type\">\n <mat-expansion-panel-header>\n <div class=\"title-content\">\n <div class=\"qms-list-text\">\n <div qms-line color=\"default-subtitle\">{{title}}\n <span class=\"fw-600\">\n ({{data?.length}})\n </span>\n </div>\n </div>\n </div>\n </mat-expansion-panel-header>\n <ng-container [ngTemplateOutlet]=\"listChip\" [ngTemplateOutletContext]=\"{data: data,type: type}\">\n </ng-container>\n </mat-expansion-panel>\n</ng-template>\n\n<!-- Template row without checkbox -->\n<ng-template #itemWithoutCheckboxTemplate let-item=\"item\" let-type=\"type\">\n <div (click)=\"onSelectItem(type,item)\" class=\"item-without-checkbox w-100\" [class.active]=\"item.selected\">\n <div class=\"item-content\">\n <div class=\"text-label\">\n <span class=\"text-label label-item fs-14 \">\n {{ item.name }}\n </span>\n <span *ngIf=\"item.subName\" class=\"ms-1 sub-label\">({{item.subName}})</span>\n </div>\n <small *ngIf=\"item.helpText\" class=\"text-help px-1 fs-12 sub-label\">{{ item.helpText }}</small>\n </div>\n <div class=\"item-state\">\n <mat-icon [@inOutAnimation] *ngIf=\"item.selected\">check</mat-icon>\n </div>\n </div>\n</ng-template>\n\n<!-- Template checkbox -->\n<ng-template #itemCheckboxTemplate let-item=\"item\" let-type=\"type\">\n <mat-checkbox [disabled]=\"!allowRemove(type, item)\" [checked]=\"item.selected\" (click)=\"onSelectItem(type,item)\"\n class=\"w-100\" color=\"default\" qms-group-options>\n <div class=\"text-label\">\n <span class=\"text-label label-item fs-14 \">\n {{ item.name }}\n </span>\n <span *ngIf=\"item.subName\" class=\"ms-1 sub-label\">({{item.subName}})</span>\n </div>\n <small *ngIf=\"item.helpText\" class=\"text-help px-1 fs-12 sub-label\">{{ item.helpText }}</small>\n </mat-checkbox>\n</ng-template>\n\n<!-- Template loading -->\n<ng-template #loading>\n <div class=\"qms-loading-container\">\n <div class=\"qms-loader\" *ngFor=\"let item of arrSkeleton\">\n <div class=\"qms-loader__wrapper\">\n <div class=\"row-loader\">\n </div>\n </div>\n </div>\n </div>\n</ng-template>",
39436
39325
  animations: [SelectAccessAnimationTrigger],
39437
39326
  providers: [
39438
39327
  {