cmat 0.0.79 → 0.0.80

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 (133) hide show
  1. package/fesm2022/cmat-components-adapter.mjs +9 -9
  2. package/fesm2022/cmat-components-breadcrumb.mjs +9 -9
  3. package/fesm2022/cmat-components-card.mjs +3 -3
  4. package/fesm2022/cmat-components-carousel.mjs +21 -21
  5. package/fesm2022/cmat-components-carousel.mjs.map +1 -1
  6. package/fesm2022/cmat-components-cascade.mjs +14 -14
  7. package/fesm2022/cmat-components-cascade.mjs.map +1 -1
  8. package/fesm2022/cmat-components-chip-input.mjs +3 -3
  9. package/fesm2022/cmat-components-code-editor.mjs +3 -3
  10. package/fesm2022/cmat-components-custom-formly.mjs +119 -116
  11. package/fesm2022/cmat-components-custom-formly.mjs.map +1 -1
  12. package/fesm2022/cmat-components-date-range.mjs +12 -12
  13. package/fesm2022/cmat-components-date-range.mjs.map +1 -1
  14. package/fesm2022/cmat-components-date-time-display.mjs +3 -3
  15. package/fesm2022/cmat-components-drawer.mjs +10 -10
  16. package/fesm2022/cmat-components-drawer.mjs.map +1 -1
  17. package/fesm2022/cmat-components-empty-state.mjs +3 -3
  18. package/fesm2022/cmat-components-file-preview.mjs +3 -3
  19. package/fesm2022/cmat-components-filter-toolbar.mjs +3 -3
  20. package/fesm2022/cmat-components-form-actions.mjs +3 -3
  21. package/fesm2022/cmat-components-fullscreen.mjs +3 -3
  22. package/fesm2022/cmat-components-highlight.mjs +6 -7
  23. package/fesm2022/cmat-components-highlight.mjs.map +1 -1
  24. package/fesm2022/cmat-components-image-viewer.mjs +12 -15
  25. package/fesm2022/cmat-components-image-viewer.mjs.map +1 -1
  26. package/fesm2022/cmat-components-inline-loading.mjs +3 -3
  27. package/fesm2022/cmat-components-json-editor.mjs +4 -6
  28. package/fesm2022/cmat-components-json-editor.mjs.map +1 -1
  29. package/fesm2022/cmat-components-knob-input.mjs +11 -11
  30. package/fesm2022/cmat-components-knob-input.mjs.map +1 -1
  31. package/fesm2022/cmat-components-masonry.mjs +8 -11
  32. package/fesm2022/cmat-components-masonry.mjs.map +1 -1
  33. package/fesm2022/cmat-components-material-color-picker.mjs +13 -14
  34. package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
  35. package/fesm2022/cmat-components-material-datetimepicker.mjs +73 -81
  36. package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
  37. package/fesm2022/cmat-components-navigation.mjs +155 -163
  38. package/fesm2022/cmat-components-navigation.mjs.map +1 -1
  39. package/fesm2022/cmat-components-opt-input.mjs +3 -3
  40. package/fesm2022/cmat-components-org-chart.mjs +9 -9
  41. package/fesm2022/cmat-components-page-header.mjs +3 -3
  42. package/fesm2022/cmat-components-pagination.mjs +34 -32
  43. package/fesm2022/cmat-components-pagination.mjs.map +1 -1
  44. package/fesm2022/cmat-components-password-strength.mjs +13 -15
  45. package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
  46. package/fesm2022/cmat-components-popover.mjs +10 -12
  47. package/fesm2022/cmat-components-popover.mjs.map +1 -1
  48. package/fesm2022/cmat-components-progress-bar.mjs +11 -14
  49. package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
  50. package/fesm2022/cmat-components-qrcode.mjs +3 -3
  51. package/fesm2022/cmat-components-rating.mjs +14 -14
  52. package/fesm2022/cmat-components-rating.mjs.map +1 -1
  53. package/fesm2022/cmat-components-rich-text-editor.mjs +3 -3
  54. package/fesm2022/cmat-components-select-search.mjs +17 -19
  55. package/fesm2022/cmat-components-select-search.mjs.map +1 -1
  56. package/fesm2022/cmat-components-select-table.mjs +19 -20
  57. package/fesm2022/cmat-components-select-table.mjs.map +1 -1
  58. package/fesm2022/cmat-components-select-tree.mjs +31 -32
  59. package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
  60. package/fesm2022/cmat-components-skeleton.mjs +3 -3
  61. package/fesm2022/cmat-components-speed-dial.mjs +14 -17
  62. package/fesm2022/cmat-components-speed-dial.mjs.map +1 -1
  63. package/fesm2022/cmat-components-status-tag.mjs +3 -3
  64. package/fesm2022/cmat-components-table-toolbar.mjs +3 -3
  65. package/fesm2022/cmat-components-timeline.mjs +12 -12
  66. package/fesm2022/cmat-components-toast.mjs +14 -16
  67. package/fesm2022/cmat-components-toast.mjs.map +1 -1
  68. package/fesm2022/cmat-components-transfer-picker.mjs +103 -90
  69. package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
  70. package/fesm2022/cmat-components-treetable.mjs +17 -19
  71. package/fesm2022/cmat-components-treetable.mjs.map +1 -1
  72. package/fesm2022/cmat-components-upload.mjs +24 -31
  73. package/fesm2022/cmat-components-upload.mjs.map +1 -1
  74. package/fesm2022/cmat-components-x6-angular-shape.mjs +0 -3
  75. package/fesm2022/cmat-components-x6-angular-shape.mjs.map +1 -1
  76. package/fesm2022/cmat-directives-animate-on-scroll.mjs +6 -6
  77. package/fesm2022/cmat-directives-arrow-cursor.mjs +3 -3
  78. package/fesm2022/cmat-directives-autofocus.mjs +3 -3
  79. package/fesm2022/cmat-directives-data-exporter.mjs +21 -21
  80. package/fesm2022/cmat-directives-debounce.mjs +9 -9
  81. package/fesm2022/cmat-directives-digit-only.mjs +6 -6
  82. package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
  83. package/fesm2022/cmat-directives-seamless-auto-scroll.mjs +3 -3
  84. package/fesm2022/cmat-lib-mock-api.mjs +6 -6
  85. package/fesm2022/cmat-pipes-bytes.mjs +3 -3
  86. package/fesm2022/cmat-pipes-date-format.mjs +3 -3
  87. package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
  88. package/fesm2022/cmat-pipes-group-by.mjs +3 -3
  89. package/fesm2022/cmat-pipes-keys.mjs +3 -3
  90. package/fesm2022/cmat-pipes-secure.mjs +3 -3
  91. package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
  92. package/fesm2022/cmat-services-alert.mjs +3 -3
  93. package/fesm2022/cmat-services-config.mjs +6 -6
  94. package/fesm2022/cmat-services-confirmation.mjs +6 -6
  95. package/fesm2022/cmat-services-data.mjs +3 -3
  96. package/fesm2022/cmat-services-export-as.mjs +3 -3
  97. package/fesm2022/cmat-services-loading.mjs +6 -6
  98. package/fesm2022/cmat-services-local-storage.mjs +3 -3
  99. package/fesm2022/cmat-services-media-watcher.mjs +3 -3
  100. package/fesm2022/cmat-services-platform.mjs +3 -3
  101. package/fesm2022/cmat-services-splash-screen.mjs +3 -3
  102. package/fesm2022/cmat-services-title.mjs +3 -3
  103. package/fesm2022/cmat-services-translation.mjs +3 -3
  104. package/fesm2022/cmat-services-utils.mjs +3 -3
  105. package/fesm2022/cmat.mjs +964 -1000
  106. package/fesm2022/cmat.mjs.map +1 -1
  107. package/package.json +1 -1
  108. package/types/cmat-components-carousel.d.ts +2 -2
  109. package/types/cmat-components-cascade.d.ts +3 -3
  110. package/types/cmat-components-custom-formly.d.ts +8 -9
  111. package/types/cmat-components-date-range.d.ts +1 -1
  112. package/types/cmat-components-drawer.d.ts +2 -2
  113. package/types/cmat-components-image-viewer.d.ts +5 -6
  114. package/types/cmat-components-json-editor.d.ts +0 -1
  115. package/types/cmat-components-knob-input.d.ts +2 -2
  116. package/types/cmat-components-masonry.d.ts +1 -2
  117. package/types/cmat-components-material-color-picker.d.ts +1 -2
  118. package/types/cmat-components-material-datetimepicker.d.ts +6 -9
  119. package/types/cmat-components-navigation.d.ts +10 -7
  120. package/types/cmat-components-pagination.d.ts +5 -4
  121. package/types/cmat-components-password-strength.d.ts +1 -2
  122. package/types/cmat-components-popover.d.ts +0 -1
  123. package/types/cmat-components-progress-bar.d.ts +6 -7
  124. package/types/cmat-components-rating.d.ts +6 -7
  125. package/types/cmat-components-select-search.d.ts +1 -1
  126. package/types/cmat-components-select-table.d.ts +7 -8
  127. package/types/cmat-components-select-tree.d.ts +10 -11
  128. package/types/cmat-components-speed-dial.d.ts +1 -2
  129. package/types/cmat-components-toast.d.ts +1 -2
  130. package/types/cmat-components-transfer-picker.d.ts +21 -11
  131. package/types/cmat-components-treetable.d.ts +3 -4
  132. package/types/cmat-components-upload.d.ts +5 -7
  133. package/types/cmat.d.ts +83 -88
@@ -1 +1 @@
1
- {"version":3,"file":"cmat-components-toast.mjs","sources":["../../../projects/cmat/components/toast/toast-modal.component.ts","../../../projects/cmat/components/toast/toast-modal.component.html","../../../projects/cmat/components/toast/toast.service.ts","../../../projects/cmat/components/toast/toast.component.ts","../../../projects/cmat/components/toast/toast.component.html","../../../projects/cmat/components/toast/cmat-components-toast.ts"],"sourcesContent":["import { NgClass, NgStyle } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, ViewEncapsulation, inject } from '@angular/core';\r\nimport { CmatToastModel } from './models/toast.model';\r\n\r\n@Component({\r\n selector: 'cmat-toast-modal',\r\n templateUrl: './toast-modal.component.html',\r\n styleUrls: ['./toast-modal.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'cmatToastModal',\r\n imports: [NgClass, NgStyle]\r\n})\r\nexport class CmatToastModalComponent implements AfterViewInit {\r\n @Input() toast: CmatToastModel;\r\n @Output() closeToastEvent = new EventEmitter<number>();\r\n\r\n progressPercent = 0;\r\n timeout: number;\r\n\r\n private _ref = inject(ChangeDetectorRef);\r\n private _progressInterval: number;\r\n private _startTime: number = performance.now();\r\n\r\n ngAfterViewInit(): void {\r\n this.handleProgress();\r\n }\r\n\r\n handleProgress(): void {\r\n this.timeout = this.toast.timeout ?? 0;\r\n\r\n if (this.toast.showDuration && this.timeout > 0) {\r\n this._progressInterval = window.setInterval(() => {\r\n this.progressPercent = (100 - ((performance.now() - this._startTime) / this.timeout * 100));\r\n if (this.toast.isCountdown) {\r\n const timeRemaining = (this.timeout - (performance.now() - this._startTime));\r\n const secondsRemaining = Math.ceil(timeRemaining / 1000);\r\n this.toast.title = `剩余时间: ${secondsRemaining.toString()}秒`;\r\n this.toast.type = 'toasta-type-wait';\r\n this.toast.message = '';\r\n }\r\n this._ref.detectChanges();\r\n\r\n if (this.progressPercent <= 0) {\r\n clearInterval(this._progressInterval);\r\n this.close(this.toast);\r\n }\r\n });\r\n }\r\n }\r\n\r\n close(toast: CmatToastModel): void {\r\n if (toast.id) {\r\n this.closeToastEvent.emit(toast.id);\r\n }\r\n\r\n if (this._progressInterval) {\r\n clearInterval(this._progressInterval);\r\n }\r\n }\r\n}\r\n","<div class=\"toast\" [ngClass]=\"[toast.type, toast.theme]\">\r\n @if (toast.showClose) {\r\n <button type=\"button\" class=\"close-button\" (click)=\"close(toast)\">\r\n </button>\r\n }\r\n @if (toast.title || toast.message) {\r\n <div class=\"toast-text\">\r\n @if (toast.title) {\r\n <span class=\"toast-title\">{{toast.title}}</span>\r\n }\r\n @if (toast.title && toast.message) {\r\n <br />\r\n }\r\n @if (toast.message) {\r\n <span class=\"toast-message\">{{toast.message}}</span>\r\n }\r\n </div>\r\n }\r\n @if (toast.showDuration && timeout > 0) {\r\n <div class=\"durationbackground\">\r\n <div class=\"durationbar\" [ngStyle]=\"{'width':progressPercent+'%'}\">\r\n </div>\r\n </div>\r\n }\r\n</div>","import { Injectable, signal } from '@angular/core';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { GlobalConfigModel } from './models/global-config.model';\r\nimport { CmatToastModel } from './models/toast.model';\r\nimport { GlobalPosition, GlobalTheme, GlobalType } from './models/type.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CmatToastService {\r\n toasts: CmatToastModel[] = [];\r\n\r\n private _positionSubject = signal<string>('toasta-position-bottom-right');\r\n private readonly _position$ = toObservable(this._positionSubject);\r\n private _toastPopSubject = new Subject<CmatToastModel[]>();\r\n private _globalConfigs: GlobalConfigModel;\r\n private _counter = 1;\r\n\r\n get position$(): Observable<string> {\r\n return this._position$;\r\n }\r\n get toastPop$(): Observable<CmatToastModel[]> {\r\n return this._toastPopSubject.asObservable();\r\n }\r\n\r\n\r\n receiveGlobalConfigs(configs: GlobalConfigModel): void {\r\n this._globalConfigs = { ...configs };\r\n }\r\n\r\n removeToast(toastId: number): void {\r\n this.toasts = this.toasts.filter(t => t.id !== toastId);\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n\r\n clearAll(): void {\r\n this.toasts.length = 0;\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n\r\n clearLast(): void {\r\n this.toasts.pop();\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n\r\n addToast(toast: CmatToastModel): void {\r\n const defaultToast = this._getDefaultToast();\r\n const globalToast = this._setGlobalValues(defaultToast);\r\n\r\n const finalToast: CmatToastModel = {\r\n type: `toasta-type-${toast.type}` as GlobalType,\r\n message: toast.message,\r\n title: toast.title ?? globalToast.title,\r\n showClose: toast.showClose ?? globalToast.showClose,\r\n showDuration: toast.showDuration ?? globalToast.showDuration,\r\n theme: toast.theme ? (`toasta-theme-${toast.theme}` as GlobalTheme) : globalToast.theme,\r\n timeout: toast.timeout !== null ? toast.timeout : globalToast.timeout,\r\n position: toast.position ? (`toasta-position-${toast.position}` as GlobalPosition) : globalToast.position,\r\n limit: toast.limit ?? globalToast.limit,\r\n isCountdown: toast.isCountdown ?? globalToast.isCountdown,\r\n };\r\n\r\n if (toast.showClose === false) {\r\n finalToast.showClose = false;\r\n }\r\n\r\n if (toast.showDuration === false) {\r\n finalToast.showDuration = false;\r\n }\r\n\r\n this._setPosition(finalToast);\r\n this._serveToast(finalToast);\r\n }\r\n\r\n getGlobalConfigs(): GlobalConfigModel {\r\n return this._globalConfigs;\r\n }\r\n\r\n getToasts(): CmatToastModel[] {\r\n return this.toasts;\r\n }\r\n\r\n private _getDefaultToast(): GlobalConfigModel {\r\n const defaultToast: GlobalConfigModel = {\r\n title: '',\r\n showClose: true,\r\n showDuration: true,\r\n theme: 'toasta-theme-material',\r\n timeout: 5000,\r\n position: 'toasta-position-bottom-right',\r\n limit: 5,\r\n isCountdown: false,\r\n };\r\n\r\n return defaultToast;\r\n }\r\n\r\n private _setGlobalValues(toast: GlobalConfigModel): GlobalConfigModel {\r\n if (this._globalConfigs) {\r\n for (const [key, value] of Object.entries(this._globalConfigs)) {\r\n toast = {\r\n ...toast,\r\n [key]: value,\r\n };\r\n }\r\n\r\n if (this._globalConfigs.theme) {\r\n toast.theme = `toasta-theme-${this._globalConfigs.theme}` as GlobalTheme;\r\n }\r\n\r\n if (this._globalConfigs.position) {\r\n toast.position = `toasta-position-${this._globalConfigs.position}` as GlobalPosition;\r\n }\r\n\r\n if (this._globalConfigs.showClose === false) {\r\n toast.showClose = false;\r\n }\r\n\r\n if (this._globalConfigs.showDuration === false) {\r\n toast.showDuration = false;\r\n }\r\n }\r\n return toast;\r\n }\r\n\r\n private _setPosition(toast: CmatToastModel): void {\r\n const position = toast.position ?? 'toasta-position-bottom-right';\r\n\r\n this._positionSubject.set(position);\r\n }\r\n\r\n private _serveToast(toast: any): void {\r\n const latestToast = {\r\n ...toast,\r\n id: this._counter++,\r\n };\r\n\r\n if (this.toasts.length >= toast.limit) {\r\n this.toasts.shift();\r\n }\r\n this.toasts.push(latestToast);\r\n\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n}\r\n","import { NgClass, AsyncPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, OnInit, ViewEncapsulation, inject } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { CmatToastModel } from './models/toast.model';\r\nimport { CmatToastModalComponent } from './toast-modal.component';\r\nimport { CmatToastService } from './toast.service';\r\n\r\n@Component({\r\n selector: 'cmat-toast',\r\n templateUrl: './toast.component.html',\r\n styleUrls: ['./toast.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'cmatToast',\r\n imports: [NgClass, CmatToastModalComponent, AsyncPipe]\r\n})\r\nexport class CmatToastComponent implements OnInit {\r\n\r\n toasts$: Observable<CmatToastModel[]>;\r\n position$: Observable<string>;\r\n\r\n private _cmatToastService = inject(CmatToastService);\r\n\r\n ngOnInit(): void {\r\n this.listenForToastEvent();\r\n }\r\n\r\n listenForToastEvent(): void {\r\n this.toasts$ = this._cmatToastService.toastPop$;\r\n this.position$ = this._cmatToastService.position$;\r\n }\r\n\r\n clearToast(toastId: any): void {\r\n this._cmatToastService.removeToast(toastId);\r\n }\r\n\r\n trackByFn(index: number, item: CmatToastModel): any {\r\n return item.id ?? index;\r\n }\r\n}\r\n","@if ((toasts$ | async); as toasts) {\r\n <div class=\"toast-wrapper\" [ngClass]=\"[position$ | async]\">\r\n @for (toast of toasts; track trackByFn($index, toast)) {\r\n <cmat-toast-modal [toast]=\"toast\"\r\n (closeToastEvent)=\"clearToast($event)\">\r\n </cmat-toast-modal>\r\n }\r\n </div>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cmat-components-toast.mjs","sources":["../../../projects/cmat/components/toast/toast-modal.component.ts","../../../projects/cmat/components/toast/toast-modal.component.html","../../../projects/cmat/components/toast/toast.service.ts","../../../projects/cmat/components/toast/toast.component.ts","../../../projects/cmat/components/toast/toast.component.html","../../../projects/cmat/components/toast/cmat-components-toast.ts"],"sourcesContent":["import { NgClass, NgStyle } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n signal,\r\n} from '@angular/core';\r\nimport { CmatToastModel } from './models/toast.model';\r\n\r\n@Component({\r\n selector: 'cmat-toast-modal',\r\n templateUrl: './toast-modal.component.html',\r\n styleUrls: ['./toast-modal.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'cmatToastModal',\r\n imports: [NgClass, NgStyle]\r\n})\r\nexport class CmatToastModalComponent implements AfterViewInit {\r\n @Input() toast: CmatToastModel;\r\n @Output() closeToastEvent = new EventEmitter<number>();\r\n\r\n readonly progressPercent = signal(0);\r\n timeout: number;\r\n\r\n private _progressInterval: number;\r\n private _startTime: number = performance.now();\r\n\r\n ngAfterViewInit(): void {\r\n this.handleProgress();\r\n }\r\n\r\n handleProgress(): void {\r\n this.timeout = this.toast.timeout ?? 0;\r\n\r\n if (this.toast.showDuration && this.timeout > 0) {\r\n this._progressInterval = window.setInterval(() => {\r\n this.progressPercent.set(100 - ((performance.now() - this._startTime) / this.timeout * 100));\r\n if (this.toast.isCountdown) {\r\n const timeRemaining = (this.timeout - (performance.now() - this._startTime));\r\n const secondsRemaining = Math.ceil(timeRemaining / 1000);\r\n this.toast.title = `剩余时间: ${secondsRemaining.toString()}秒`;\r\n this.toast.type = 'toasta-type-wait';\r\n this.toast.message = '';\r\n }\r\n\r\n if (this.progressPercent() <= 0) {\r\n clearInterval(this._progressInterval);\r\n this.close(this.toast);\r\n }\r\n });\r\n }\r\n }\r\n\r\n close(toast: CmatToastModel): void {\r\n if (toast.id) {\r\n this.closeToastEvent.emit(toast.id);\r\n }\r\n\r\n if (this._progressInterval) {\r\n clearInterval(this._progressInterval);\r\n }\r\n }\r\n}\r\n","<div class=\"toast\" [ngClass]=\"[toast.type, toast.theme]\">\r\n @if (toast.showClose) {\r\n <button type=\"button\" class=\"close-button\" (click)=\"close(toast)\">\r\n </button>\r\n }\r\n @if (toast.title || toast.message) {\r\n <div class=\"toast-text\">\r\n @if (toast.title) {\r\n <span class=\"toast-title\">{{toast.title}}</span>\r\n }\r\n @if (toast.title && toast.message) {\r\n <br />\r\n }\r\n @if (toast.message) {\r\n <span class=\"toast-message\">{{toast.message}}</span>\r\n }\r\n </div>\r\n }\r\n @if (toast.showDuration && timeout > 0) {\r\n <div class=\"durationbackground\">\r\n <div class=\"durationbar\" [ngStyle]=\"{'width':progressPercent()+'%'}\">\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { Injectable, signal } from '@angular/core';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { GlobalConfigModel } from './models/global-config.model';\r\nimport { CmatToastModel } from './models/toast.model';\r\nimport { GlobalPosition, GlobalTheme, GlobalType } from './models/type.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CmatToastService {\r\n toasts: CmatToastModel[] = [];\r\n\r\n private _positionSubject = signal<string>('toasta-position-bottom-right');\r\n private readonly _position$ = toObservable(this._positionSubject);\r\n private _toastPopSubject = new Subject<CmatToastModel[]>();\r\n private _globalConfigs: GlobalConfigModel;\r\n private _counter = 1;\r\n\r\n get position$(): Observable<string> {\r\n return this._position$;\r\n }\r\n get toastPop$(): Observable<CmatToastModel[]> {\r\n return this._toastPopSubject.asObservable();\r\n }\r\n\r\n\r\n receiveGlobalConfigs(configs: GlobalConfigModel): void {\r\n this._globalConfigs = { ...configs };\r\n }\r\n\r\n removeToast(toastId: number): void {\r\n this.toasts = this.toasts.filter(t => t.id !== toastId);\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n\r\n clearAll(): void {\r\n this.toasts.length = 0;\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n\r\n clearLast(): void {\r\n this.toasts.pop();\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n\r\n addToast(toast: CmatToastModel): void {\r\n const defaultToast = this._getDefaultToast();\r\n const globalToast = this._setGlobalValues(defaultToast);\r\n\r\n const finalToast: CmatToastModel = {\r\n type: `toasta-type-${toast.type}` as GlobalType,\r\n message: toast.message,\r\n title: toast.title ?? globalToast.title,\r\n showClose: toast.showClose ?? globalToast.showClose,\r\n showDuration: toast.showDuration ?? globalToast.showDuration,\r\n theme: toast.theme ? (`toasta-theme-${toast.theme}` as GlobalTheme) : globalToast.theme,\r\n timeout: toast.timeout !== null ? toast.timeout : globalToast.timeout,\r\n position: toast.position ? (`toasta-position-${toast.position}` as GlobalPosition) : globalToast.position,\r\n limit: toast.limit ?? globalToast.limit,\r\n isCountdown: toast.isCountdown ?? globalToast.isCountdown,\r\n };\r\n\r\n if (toast.showClose === false) {\r\n finalToast.showClose = false;\r\n }\r\n\r\n if (toast.showDuration === false) {\r\n finalToast.showDuration = false;\r\n }\r\n\r\n this._setPosition(finalToast);\r\n this._serveToast(finalToast);\r\n }\r\n\r\n getGlobalConfigs(): GlobalConfigModel {\r\n return this._globalConfigs;\r\n }\r\n\r\n getToasts(): CmatToastModel[] {\r\n return this.toasts;\r\n }\r\n\r\n private _getDefaultToast(): GlobalConfigModel {\r\n const defaultToast: GlobalConfigModel = {\r\n title: '',\r\n showClose: true,\r\n showDuration: true,\r\n theme: 'toasta-theme-material',\r\n timeout: 5000,\r\n position: 'toasta-position-bottom-right',\r\n limit: 5,\r\n isCountdown: false,\r\n };\r\n\r\n return defaultToast;\r\n }\r\n\r\n private _setGlobalValues(toast: GlobalConfigModel): GlobalConfigModel {\r\n if (this._globalConfigs) {\r\n for (const [key, value] of Object.entries(this._globalConfigs)) {\r\n toast = {\r\n ...toast,\r\n [key]: value,\r\n };\r\n }\r\n\r\n if (this._globalConfigs.theme) {\r\n toast.theme = `toasta-theme-${this._globalConfigs.theme}` as GlobalTheme;\r\n }\r\n\r\n if (this._globalConfigs.position) {\r\n toast.position = `toasta-position-${this._globalConfigs.position}` as GlobalPosition;\r\n }\r\n\r\n if (this._globalConfigs.showClose === false) {\r\n toast.showClose = false;\r\n }\r\n\r\n if (this._globalConfigs.showDuration === false) {\r\n toast.showDuration = false;\r\n }\r\n }\r\n return toast;\r\n }\r\n\r\n private _setPosition(toast: CmatToastModel): void {\r\n const position = toast.position ?? 'toasta-position-bottom-right';\r\n\r\n this._positionSubject.set(position);\r\n }\r\n\r\n private _serveToast(toast: any): void {\r\n const latestToast = {\r\n ...toast,\r\n id: this._counter++,\r\n };\r\n\r\n if (this.toasts.length >= toast.limit) {\r\n this.toasts.shift();\r\n }\r\n this.toasts.push(latestToast);\r\n\r\n this._toastPopSubject.next(this.toasts);\r\n }\r\n}\r\n","import { NgClass, AsyncPipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, OnInit, ViewEncapsulation, inject } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { CmatToastModel } from './models/toast.model';\r\nimport { CmatToastModalComponent } from './toast-modal.component';\r\nimport { CmatToastService } from './toast.service';\r\n\r\n@Component({\r\n selector: 'cmat-toast',\r\n templateUrl: './toast.component.html',\r\n styleUrls: ['./toast.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'cmatToast',\r\n imports: [NgClass, CmatToastModalComponent, AsyncPipe]\r\n})\r\nexport class CmatToastComponent implements OnInit {\r\n\r\n toasts$: Observable<CmatToastModel[]>;\r\n position$: Observable<string>;\r\n\r\n private _cmatToastService = inject(CmatToastService);\r\n\r\n ngOnInit(): void {\r\n this.listenForToastEvent();\r\n }\r\n\r\n listenForToastEvent(): void {\r\n this.toasts$ = this._cmatToastService.toastPop$;\r\n this.position$ = this._cmatToastService.position$;\r\n }\r\n\r\n clearToast(toastId: any): void {\r\n this._cmatToastService.removeToast(toastId);\r\n }\r\n\r\n trackByFn(index: number, item: CmatToastModel): any {\r\n return item.id ?? index;\r\n }\r\n}\r\n","@if ((toasts$ | async); as toasts) {\r\n <div class=\"toast-wrapper\" [ngClass]=\"[position$ | async]\">\r\n @for (toast of toasts; track trackByFn($index, toast)) {\r\n <cmat-toast-modal [toast]=\"toast\"\r\n (closeToastEvent)=\"clearToast($event)\">\r\n </cmat-toast-modal>\r\n }\r\n </div>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { PortalModule } from '@angular/cdk/portal';
5
5
  import * as i3 from '@angular/common';
6
6
  import { CommonModule } from '@angular/common';
7
7
  import * as i0 from '@angular/core';
8
- import { signal, Injectable, inject, ViewChild, Input, ChangeDetectionStrategy, ViewEncapsulation, Component, ChangeDetectorRef, DestroyRef, EventEmitter, Output } from '@angular/core';
8
+ import { signal, Injectable, inject, ViewChild, Input, ChangeDetectionStrategy, ViewEncapsulation, Component, computed, DestroyRef, EventEmitter, Output, Injector, afterNextRender } from '@angular/core';
9
9
  import * as i5 from '@angular/material/button';
10
10
  import { MatButtonModule } from '@angular/material/button';
11
11
  import * as i1 from '@angular/material/button-toggle';
@@ -35,10 +35,11 @@ import { MatListModule } from '@angular/material/list';
35
35
  class CmatTransferPickerService {
36
36
  constructor() {
37
37
  this._dataSourceChange = signal([], ...(ngDevMode ? [{ debugName: "_dataSourceChange" }] : /* istanbul ignore next */ []));
38
- this._refreshDataSourceChange = signal(true, ...(ngDevMode ? [{ debugName: "_refreshDataSourceChange" }] : /* istanbul ignore next */ []));
38
+ this._refreshDataSourceChange = signal({ clear: true, nonce: 0 }, ...(ngDevMode ? [{ debugName: "_refreshDataSourceChange" }] : /* istanbul ignore next */ []));
39
39
  this._filtersChange = signal([], ...(ngDevMode ? [{ debugName: "_filtersChange" }] : /* istanbul ignore next */ []));
40
40
  this._sourceOptionsChange = signal(void 0, ...(ngDevMode ? [{ debugName: "_sourceOptionsChange" }] : /* istanbul ignore next */ []));
41
41
  this._selectedValuesChange = signal([], ...(ngDevMode ? [{ debugName: "_selectedValuesChange" }] : /* istanbul ignore next */ []));
42
+ this._refreshNonce = 0;
42
43
  this._dataSourceChange$ = toObservable(this._dataSourceChange);
43
44
  this._refreshDataSourceChange$ = toObservable(this._refreshDataSourceChange);
44
45
  this._filtersChange$ = toObservable(this._filtersChange);
@@ -129,7 +130,7 @@ class CmatTransferPickerService {
129
130
  resetDataSource(clear) {
130
131
  this.dataSource = this._originalDataSource;
131
132
  this._filteredDataSource = [];
132
- this._refreshDataSourceChange.set(clear);
133
+ this._refreshDataSourceChange.set({ clear, nonce: ++this._refreshNonce });
133
134
  }
134
135
  _filterDataSourceByType(dataSource, type) {
135
136
  this._filteredDataSource = [];
@@ -142,7 +143,7 @@ class CmatTransferPickerService {
142
143
  break;
143
144
  }
144
145
  this.dataSource = this._filteredDataSource;
145
- this._refreshDataSourceChange.set(false);
146
+ this._refreshDataSourceChange.set({ clear: false, nonce: ++this._refreshNonce });
146
147
  }
147
148
  _setFilteredDataSourceByFilters(dataSource) {
148
149
  dataSource.map((data) => {
@@ -176,10 +177,10 @@ class CmatTransferPickerService {
176
177
  }
177
178
  });
178
179
  }
179
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
180
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerService, providedIn: 'root' }); }
180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
181
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerService, providedIn: 'root' }); }
181
182
  }
182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerService, decorators: [{
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerService, decorators: [{
183
184
  type: Injectable,
184
185
  args: [{
185
186
  providedIn: 'root'
@@ -246,10 +247,10 @@ class CmatTransferPickerFilterComponent {
246
247
  changeFilterData() {
247
248
  this._service.filterDataSource({ filterData: this.filterData });
248
249
  }
249
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
250
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: CmatTransferPickerFilterComponent, isStandalone: true, selector: "cmat-transfer-picker-filter", inputs: { filters: "filters" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: CdkOverlayOrigin, descendants: true, static: true }, { propertyName: "filterTemplate", first: true, predicate: ["filterTemplate"], descendants: true, static: true }], exportAs: ["cmatTransferPickerFilter"], ngImport: i0, template: "<button type=\"button\" class=\"mr-2 mt-1\" matIconButton cdk-overlay-origin (click)=\"toggleFilter()\">\r\n <mat-icon svgIcon=\"mat_outline:filter_list\"></mat-icon>\r\n</button>\r\n<ng-template #filterTemplate=\"cdkPortal\" cdkPortal>\r\n <div\r\n class=\"transfer-picker-filter-panel bg-card flex flex-col flex-nowrap place-content-start box-border items-start w-full shadow\">\r\n <mat-button-toggle-group name=\"condition\" [hideSingleSelectionIndicator]=\"true\" (change)=\"onConditionChange($event.value)\">\r\n <mat-button-toggle value=\"or\" [checked]=\"filterData.condition === 'or'\">\u6216</mat-button-toggle>\r\n <mat-button-toggle value=\"and\" [checked]=\"filterData.condition === 'and'\">\u4E14</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n\r\n <div class=\"chip-list\">\r\n @for (item of filters; track $index) {\r\n <div class=\"chip-wrapper\" role=\"presentation\"\r\n (click)=\"onFilterClick(item)\">\r\n <span class=\"chip\" [ngClass]=\"{selected: item?.selected}\">{{item.label}}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".transfer-picker-filter-panel{min-width:276px;padding:10px 0;border-width:1px}.transfer-picker-filter-panel .mat-button-toggle-group{font-size:12px;margin-right:15px;margin-bottom:20px;align-self:flex-end}.transfer-picker-filter-panel .mat-button-toggle-group .mat-button-toggle-label-content{line-height:1.8}.transfer-picker-filter-panel .chip-list{width:276px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;box-sizing:border-box}.transfer-picker-filter-panel .chip-list:after{content:\"\";flex:1 1 0%;max-width:33.333333%}.transfer-picker-filter-panel .chip-list .chip-wrapper{flex:1 1 0%;box-sizing:border-box;max-width:33.333333%;text-align:center;margin-bottom:20px}.transfer-picker-filter-panel .chip-list .chip-wrapper .chip{display:inline-block;min-width:50%;cursor:pointer;padding:5px 10px;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i4.CdkPortal, selector: "[cdkPortal]", exportAs: ["cdkPortal"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
250
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
251
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmatTransferPickerFilterComponent, isStandalone: true, selector: "cmat-transfer-picker-filter", inputs: { filters: "filters" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: CdkOverlayOrigin, descendants: true, static: true }, { propertyName: "filterTemplate", first: true, predicate: ["filterTemplate"], descendants: true, static: true }], exportAs: ["cmatTransferPickerFilter"], ngImport: i0, template: "<button type=\"button\" class=\"mr-2 mt-1\" matIconButton cdk-overlay-origin (click)=\"toggleFilter()\">\r\n <mat-icon svgIcon=\"mat_outline:filter_list\"></mat-icon>\r\n</button>\r\n<ng-template #filterTemplate=\"cdkPortal\" cdkPortal>\r\n <div\r\n class=\"transfer-picker-filter-panel bg-card flex flex-col flex-nowrap place-content-start box-border items-start w-full shadow\">\r\n <mat-button-toggle-group name=\"condition\" [hideSingleSelectionIndicator]=\"true\" (change)=\"onConditionChange($event.value)\">\r\n <mat-button-toggle value=\"or\" [checked]=\"filterData.condition === 'or'\">\u6216</mat-button-toggle>\r\n <mat-button-toggle value=\"and\" [checked]=\"filterData.condition === 'and'\">\u4E14</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n\r\n <div class=\"chip-list\">\r\n @for (item of filters; track $index) {\r\n <div class=\"chip-wrapper\" role=\"presentation\"\r\n (click)=\"onFilterClick(item)\">\r\n <span class=\"chip\" [ngClass]=\"{selected: item?.selected}\">{{item.label}}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".transfer-picker-filter-panel{min-width:276px;padding:10px 0;border-width:1px}.transfer-picker-filter-panel .mat-button-toggle-group{font-size:12px;margin-right:15px;margin-bottom:20px;align-self:flex-end}.transfer-picker-filter-panel .mat-button-toggle-group .mat-button-toggle-label-content{line-height:1.8}.transfer-picker-filter-panel .chip-list{width:276px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;box-sizing:border-box}.transfer-picker-filter-panel .chip-list:after{content:\"\";flex:1 1 0%;max-width:33.333333%}.transfer-picker-filter-panel .chip-list .chip-wrapper{flex:1 1 0%;box-sizing:border-box;max-width:33.333333%;text-align:center;margin-bottom:20px}.transfer-picker-filter-panel .chip-list .chip-wrapper .chip{display:inline-block;min-width:50%;cursor:pointer;padding:5px 10px;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i4.CdkPortal, selector: "[cdkPortal]", exportAs: ["cdkPortal"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
251
252
  }
252
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerFilterComponent, decorators: [{
253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerFilterComponent, decorators: [{
253
254
  type: Component,
254
255
  args: [{ selector: 'cmat-transfer-picker-filter', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatTransferPickerFilter', imports: [MatButtonToggleModule, MatIconModule, CommonModule, PortalModule, MatButtonModule, OverlayModule], template: "<button type=\"button\" class=\"mr-2 mt-1\" matIconButton cdk-overlay-origin (click)=\"toggleFilter()\">\r\n <mat-icon svgIcon=\"mat_outline:filter_list\"></mat-icon>\r\n</button>\r\n<ng-template #filterTemplate=\"cdkPortal\" cdkPortal>\r\n <div\r\n class=\"transfer-picker-filter-panel bg-card flex flex-col flex-nowrap place-content-start box-border items-start w-full shadow\">\r\n <mat-button-toggle-group name=\"condition\" [hideSingleSelectionIndicator]=\"true\" (change)=\"onConditionChange($event.value)\">\r\n <mat-button-toggle value=\"or\" [checked]=\"filterData.condition === 'or'\">\u6216</mat-button-toggle>\r\n <mat-button-toggle value=\"and\" [checked]=\"filterData.condition === 'and'\">\u4E14</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n\r\n <div class=\"chip-list\">\r\n @for (item of filters; track $index) {\r\n <div class=\"chip-wrapper\" role=\"presentation\"\r\n (click)=\"onFilterClick(item)\">\r\n <span class=\"chip\" [ngClass]=\"{selected: item?.selected}\">{{item.label}}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".transfer-picker-filter-panel{min-width:276px;padding:10px 0;border-width:1px}.transfer-picker-filter-panel .mat-button-toggle-group{font-size:12px;margin-right:15px;margin-bottom:20px;align-self:flex-end}.transfer-picker-filter-panel .mat-button-toggle-group .mat-button-toggle-label-content{line-height:1.8}.transfer-picker-filter-panel .chip-list{width:276px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;box-sizing:border-box}.transfer-picker-filter-panel .chip-list:after{content:\"\";flex:1 1 0%;max-width:33.333333%}.transfer-picker-filter-panel .chip-list .chip-wrapper{flex:1 1 0%;box-sizing:border-box;max-width:33.333333%;text-align:center;margin-bottom:20px}.transfer-picker-filter-panel .chip-list .chip-wrapper .chip{display:inline-block;min-width:50%;cursor:pointer;padding:5px 10px;font-size:12px}\n"] }]
255
256
  }], ctorParameters: () => [], propDecorators: { filters: [{
@@ -276,10 +277,10 @@ class CmatTransferPickerSearchComponent {
276
277
  reset() {
277
278
  this.keyword.setValue('');
278
279
  }
279
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
280
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: CmatTransferPickerSearchComponent, isStandalone: true, selector: "cmat-transfer-picker-search", inputs: { searchPlaceholder: "searchPlaceholder" }, exportAs: ["cmatTransferPickerSearch"], ngImport: i0, template: "<mat-form-field>\r\n <input placeholder=\"{{searchPlaceholder}}\" matInput type=\"text\" [formControl]=\"keyword\">\r\n @if (keyword.value) {\r\n <button type=\"button\" matSuffix matIconButton (click)=\"reset()\">\r\n <mat-icon svgIcon=\"mat_outline:close\"></mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>", styles: ["cmat-transfer-picker-search{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center}cmat-transfer-picker-search .mat-mdc-form-field{width:88%}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
280
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
281
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmatTransferPickerSearchComponent, isStandalone: true, selector: "cmat-transfer-picker-search", inputs: { searchPlaceholder: "searchPlaceholder" }, exportAs: ["cmatTransferPickerSearch"], ngImport: i0, template: "<mat-form-field>\r\n <input placeholder=\"{{searchPlaceholder}}\" matInput type=\"text\" [formControl]=\"keyword\">\r\n @if (keyword.value) {\r\n <button type=\"button\" matSuffix matIconButton (click)=\"reset()\">\r\n <mat-icon svgIcon=\"mat_outline:close\"></mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>", styles: ["cmat-transfer-picker-search{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center}cmat-transfer-picker-search .mat-mdc-form-field{width:88%}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
281
282
  }
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerSearchComponent, decorators: [{
283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerSearchComponent, decorators: [{
283
284
  type: Component,
284
285
  args: [{ selector: 'cmat-transfer-picker-search', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatTransferPickerSearch', imports: [MatFormFieldModule, MatIconModule, ReactiveFormsModule, MatButtonModule, MatInputModule], template: "<mat-form-field>\r\n <input placeholder=\"{{searchPlaceholder}}\" matInput type=\"text\" [formControl]=\"keyword\">\r\n @if (keyword.value) {\r\n <button type=\"button\" matSuffix matIconButton (click)=\"reset()\">\r\n <mat-icon svgIcon=\"mat_outline:close\"></mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>", styles: ["cmat-transfer-picker-search{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center}cmat-transfer-picker-search .mat-mdc-form-field{width:88%}\n"] }]
285
286
  }], ctorParameters: () => [], propDecorators: { searchPlaceholder: [{
@@ -302,20 +303,20 @@ var CmatTransferFilterCondition;
302
303
  class CmatTransferPickerSourceComponent {
303
304
  constructor() {
304
305
  this.nestedNodeMap = new Map();
305
- this.dataSource = [];
306
- this.dataFlatNodes = [];
306
+ this.dataSource = signal([], ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
307
+ this.dataFlatNodes = signal([], ...(ngDevMode ? [{ debugName: "dataFlatNodes" }] : /* istanbul ignore next */ []));
307
308
  this.checklistSelection = new SelectionModel(true /* multiple */);
308
- this.options = {
309
+ this.options = signal({
309
310
  title: '',
310
311
  filterable: false,
311
312
  searchable: false,
312
313
  searchPlaceholder: '',
313
314
  filters: []
314
- };
315
- this.selectedList = [];
315
+ }, ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
316
+ this.committedSelection = signal([], ...(ngDevMode ? [{ debugName: "committedSelection" }] : /* istanbul ignore next */ []));
317
+ this.committedValueSet = computed(() => new Set(this.committedSelection().map(node => node.value)), ...(ngDevMode ? [{ debugName: "committedValueSet" }] : /* istanbul ignore next */ []));
316
318
  this._flatNodeByValue = new Map();
317
319
  this._service = inject(CmatTransferPickerService);
318
- this._changeDetectorRef = inject(ChangeDetectorRef);
319
320
  this._destroyRef = inject(DestroyRef);
320
321
  this.childrenAccessor = (node) => node.children ?? [];
321
322
  this.hasChild = (_, node) => !!node.children && node.children.length > 0;
@@ -342,28 +343,20 @@ class CmatTransferPickerSourceComponent {
342
343
  .dataSourceChange
343
344
  .pipe(takeUntilDestroyed(this._destroyRef))
344
345
  .subscribe((data) => {
345
- this.dataSource = data;
346
+ this.dataSource.set(data);
346
347
  this._flatNodeByValue.clear();
347
- this.dataFlatNodes = this._getFlattenNodes(this.dataSource);
348
- this._changeDetectorRef.markForCheck();
348
+ this.dataFlatNodes.set(this._getFlattenNodes(this.dataSource()));
349
349
  });
350
350
  this._service.refreshDataSourceChange.pipe(takeUntilDestroyed(this._destroyRef))
351
- .subscribe((state) => {
351
+ .subscribe(({ clear }) => {
352
352
  // 刷新时按状态重置或恢复选择
353
- if (state) {
353
+ if (clear) {
354
354
  this.checklistSelection.clear();
355
- this._changeDetectorRef.markForCheck();
355
+ this.committedSelection.set([]);
356
356
  }
357
357
  else {
358
- const selectedNodes = [...this.checklistSelection.selected];
359
- for (const selectedNode of selectedNodes) {
360
- const matchedNode = this._flatNodeByValue.get(selectedNode.value);
361
- if (matchedNode) {
362
- this.checklistSelection.deselect(selectedNode);
363
- this.checklistSelection.select(matchedNode);
364
- }
365
- }
366
- this.getSelectedList();
358
+ this._selectNodesByValues(this.checklistSelection.selected.map(node => node.value));
359
+ this.commitSelection();
367
360
  }
368
361
  });
369
362
  this._service
@@ -371,44 +364,35 @@ class CmatTransferPickerSourceComponent {
371
364
  .pipe(filter((values) => !!values.length), takeUntilDestroyed(this._destroyRef))
372
365
  .subscribe((values) => {
373
366
  // 根据外部值同步选中节点
374
- for (const value of values) {
375
- const node = this._flatNodeByValue.get(value);
376
- if (node) {
377
- this.checklistSelection.select(node);
378
- }
379
- }
380
- this._changeDetectorRef.markForCheck();
367
+ this._selectNodesByValues(values);
368
+ this.commitSelection();
381
369
  });
382
370
  this._service
383
371
  .sourceOptionsChange
384
372
  .pipe(takeUntilDestroyed(this._destroyRef))
385
373
  .subscribe((options) => { if (options)
386
- this.options = options; this._changeDetectorRef.markForCheck(); });
374
+ this.options.set(options); });
387
375
  }
388
376
  ngAfterViewInit() {
389
377
  // 初始化时展开整棵树
390
378
  this.tree.expandAll();
391
379
  }
392
- getSelectedList() {
393
- // 同步并返回当前选中列表
394
- this.selectedList = this.checklistSelection.selected;
395
- if (this.selectedList.length) {
396
- for (const item of this.selectedList) {
397
- item.disabled = true;
398
- this.checklistSelection.select(item);
399
- }
400
- }
401
- this._changeDetectorRef.markForCheck();
402
- return this.selectedList;
380
+ getCommittedSelection() {
381
+ return this.committedSelection();
382
+ }
383
+ commitSelection() {
384
+ this.committedSelection.set(this._cloneFlatNodes(this.checklistSelection.selected));
385
+ return this.committedSelection();
403
386
  }
404
387
  resetSelectedItem(item) {
405
- // 取消单个节点的禁用与选中状态
406
- const s = this._flatNodeByValue.get(item.value) ?? this.checklistSelection.selected.find(i => i.value === item.value);
407
- if (s) {
408
- s.disabled = false;
409
- this.checklistSelection.deselect(s);
410
- this._changeDetectorRef.markForCheck();
388
+ const target = this._flatNodeByValue.get(item.value) ?? this.checklistSelection.selected.find(i => i.value === item.value);
389
+ if (!target) {
390
+ return;
411
391
  }
392
+ const descendants = this._getDescendants(target);
393
+ this.checklistSelection.deselect(target, ...descendants.filter(node => this.checklistSelection.isSelected(node)));
394
+ this._checkAllParentsSelection(target);
395
+ this.commitSelection();
412
396
  }
413
397
  descendantsAllSelected(node) {
414
398
  // 判断后代是否全部选中
@@ -425,7 +409,7 @@ class CmatTransferPickerSourceComponent {
425
409
  // 切换分支节点选择状态
426
410
  this.checklistSelection.toggle(node);
427
411
  let descendants = this._getDescendants(node);
428
- descendants = descendants.filter(n => !n.disabled);
412
+ descendants = descendants.filter(n => !this.isNodeDisabled(n));
429
413
  this.checklistSelection.isSelected(node)
430
414
  ? this.checklistSelection.select(...descendants)
431
415
  : this.checklistSelection.deselect(...descendants);
@@ -437,12 +421,16 @@ class CmatTransferPickerSourceComponent {
437
421
  this.checklistSelection.toggle(node);
438
422
  this._checkAllParentsSelection(node);
439
423
  }
424
+ isNodeDisabled(node) {
425
+ return !!node.disabled || this.committedValueSet().has(node.value);
426
+ }
440
427
  _getDescendants(dataNode) {
441
428
  // 收集当前节点的所有后代节点
442
- const startIndex = this.dataFlatNodes.findIndex(j => j === dataNode);
429
+ const flatNodes = this.dataFlatNodes();
430
+ const startIndex = flatNodes.findIndex(j => j === dataNode);
443
431
  const results = [];
444
- for (let i = startIndex + 1; i < this.dataFlatNodes.length && this._getLevel(dataNode) < this._getLevel(this.dataFlatNodes[i]); i++) {
445
- results.push(this.dataFlatNodes[i]);
432
+ for (let i = startIndex + 1; i < flatNodes.length && this._getLevel(dataNode) < this._getLevel(flatNodes[i]); i++) {
433
+ results.push(flatNodes[i]);
446
434
  }
447
435
  return results;
448
436
  }
@@ -477,28 +465,50 @@ class CmatTransferPickerSourceComponent {
477
465
  this.checklistSelection.select(node);
478
466
  }
479
467
  }
468
+ _cloneFlatNode(node) {
469
+ return {
470
+ label: node.label,
471
+ value: node.value,
472
+ level: node.level,
473
+ disabled: node.disabled,
474
+ expandable: node.expandable
475
+ };
476
+ }
477
+ _cloneFlatNodes(nodes) {
478
+ return nodes.map(node => this._cloneFlatNode(node));
479
+ }
480
480
  _getParentNode(node) {
481
481
  // 获取当前节点的父节点
482
482
  const currentLevel = this._getLevel(node);
483
+ const flatNodes = this.dataFlatNodes();
483
484
  if (currentLevel < 1) {
484
485
  return null;
485
486
  }
486
- const startIndex = this.dataFlatNodes.findIndex(j => j === node) - 1;
487
+ const startIndex = flatNodes.findIndex(j => j === node) - 1;
487
488
  for (let i = startIndex; i >= 0; i--) {
488
- const currentNode = this.dataFlatNodes[i];
489
+ const currentNode = flatNodes[i];
489
490
  if (this._getLevel(currentNode) < currentLevel) {
490
491
  return currentNode;
491
492
  }
492
493
  }
493
494
  return null;
494
495
  }
495
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerSourceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
496
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: CmatTransferPickerSourceComponent, isStandalone: true, selector: "cmat-transfer-picker-source", viewQueries: [{ propertyName: "tree", first: true, predicate: ["componentTree"], descendants: true }], exportAs: ["cmatTransferPickerSource"], ngImport: i0, template: "<mat-card class=\"transfer-picker-source shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-source-title\">{{options?.title}}</mat-card-title>\r\n @if (options?.filterable) {\r\n <cmat-transfer-picker-filter\r\n [filters]=\"options?.filters\"></cmat-transfer-picker-filter>\r\n }\r\n </mat-card-header>\r\n <mat-card-content class=\"transfer-picker-source-content\">\r\n @if (options?.searchable) {\r\n <cmat-transfer-picker-search\r\n [searchPlaceholder]=\"options?.searchPlaceholder\"></cmat-transfer-picker-search>\r\n }\r\n\r\n <cdk-virtual-scroll-viewport itemSize=\"48\"\r\n class=\"transfer-picker-source-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-tree #componentTree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton disabled> </button>\r\n <mat-checkbox class=\"checklist-leaf-node\" [checked]=\"checklistSelection.isSelected(nestedNodeMap.get(node)!)\"\r\n [disabled]=\"nestedNodeMap.get(node)?.disabled\" (change)=\"transferLeafItemSelectionToggle(nestedNodeMap.get(node)!);\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton matTreeNodeToggle>\r\n <mat-icon svgIcon=\"{{componentTree.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'}}\"\r\n class=\"mat-icon-rtl-mirror\">\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox [checked]=\"descendantsAllSelected(nestedNodeMap.get(node)!)||nestedNodeMap.get(node)?.disabled\"\r\n [indeterminate]=\"descendantsPartiallySelected(nestedNodeMap.get(node)!)\" [disabled]=\"nestedNodeMap.get(node)?.disabled\"\r\n (change)=\"transferItemSelectionToggle(nestedNodeMap.get(node)!)\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n </mat-tree>\r\n @if (!dataSource.length) {\r\n <div class=\"transfer-picker-source-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [".transfer-picker-source{width:276px;height:100%;padding:0}.transfer-picker-source .mat-mdc-card-header{display:flex;flex-direction:row;flex-wrap:nowrap;box-sizing:border-box;place-content:space-between;align-items:flex-start;margin-bottom:-8px}.transfer-picker-source-title{font-size:1rem;margin-bottom:0}.transfer-picker-source-scroll-wrapper{height:300px}.transfer-picker-source-empty{text-align:center;font-size:1rem;margin-top:20px;color:#00000040}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i1$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i1$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i2$1.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i2$1.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i2$1.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i2$1.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i2$1.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3$2.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: CmatTransferPickerFilterComponent, selector: "cmat-transfer-picker-filter", inputs: ["filters"], exportAs: ["cmatTransferPickerFilter"] }, { kind: "component", type: CmatTransferPickerSearchComponent, selector: "cmat-transfer-picker-search", inputs: ["searchPlaceholder"], exportAs: ["cmatTransferPickerSearch"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i6.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "component", type: i6.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
496
+ _selectNodesByValues(values) {
497
+ this.checklistSelection.clear();
498
+ for (const value of values) {
499
+ const node = this._flatNodeByValue.get(value);
500
+ if (node) {
501
+ this.checklistSelection.select(node);
502
+ }
503
+ }
504
+ }
505
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerSourceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
506
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmatTransferPickerSourceComponent, isStandalone: true, selector: "cmat-transfer-picker-source", viewQueries: [{ propertyName: "tree", first: true, predicate: ["componentTree"], descendants: true }], exportAs: ["cmatTransferPickerSource"], ngImport: i0, template: "<mat-card class=\"transfer-picker-source shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-source-title\">{{options().title}}</mat-card-title>\r\n @if (options().filterable) {\r\n <cmat-transfer-picker-filter\r\n [filters]=\"options().filters\"></cmat-transfer-picker-filter>\r\n }\r\n </mat-card-header>\r\n <mat-card-content class=\"transfer-picker-source-content\">\r\n @if (options().searchable) {\r\n <cmat-transfer-picker-search\r\n [searchPlaceholder]=\"options().searchPlaceholder\"></cmat-transfer-picker-search>\r\n }\r\n\r\n <cdk-virtual-scroll-viewport itemSize=\"48\"\r\n class=\"transfer-picker-source-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-tree #componentTree [dataSource]=\"dataSource()\" [childrenAccessor]=\"childrenAccessor\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton disabled> </button>\r\n <mat-checkbox class=\"checklist-leaf-node\" [checked]=\"checklistSelection.isSelected(nestedNodeMap.get(node)!)\"\r\n [disabled]=\"isNodeDisabled(nestedNodeMap.get(node)!)\" (change)=\"transferLeafItemSelectionToggle(nestedNodeMap.get(node)!);\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton matTreeNodeToggle>\r\n <mat-icon svgIcon=\"{{componentTree.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'}}\"\r\n class=\"mat-icon-rtl-mirror\">\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox [checked]=\"descendantsAllSelected(nestedNodeMap.get(node)!)||committedValueSet().has(nestedNodeMap.get(node)!.value)\"\r\n [indeterminate]=\"descendantsPartiallySelected(nestedNodeMap.get(node)!)\" [disabled]=\"isNodeDisabled(nestedNodeMap.get(node)!)\"\r\n (change)=\"transferItemSelectionToggle(nestedNodeMap.get(node)!)\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n </mat-tree>\r\n @if (!dataSource().length) {\r\n <div class=\"transfer-picker-source-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [".transfer-picker-source{width:276px;height:100%;padding:0}.transfer-picker-source .mat-mdc-card-header{display:flex;flex-direction:row;flex-wrap:nowrap;box-sizing:border-box;place-content:space-between;align-items:flex-start;margin-bottom:-8px}.transfer-picker-source-title{font-size:1rem;margin-bottom:0}.transfer-picker-source-scroll-wrapper{height:300px}.transfer-picker-source-empty{text-align:center;font-size:1rem;margin-top:20px;color:#00000040}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i1$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i1$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i2$1.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i2$1.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i2$1.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i2$1.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i2$1.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3$2.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: CmatTransferPickerFilterComponent, selector: "cmat-transfer-picker-filter", inputs: ["filters"], exportAs: ["cmatTransferPickerFilter"] }, { kind: "component", type: CmatTransferPickerSearchComponent, selector: "cmat-transfer-picker-search", inputs: ["searchPlaceholder"], exportAs: ["cmatTransferPickerSearch"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i6.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "component", type: i6.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
497
507
  }
498
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerSourceComponent, decorators: [{
508
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerSourceComponent, decorators: [{
499
509
  type: Component,
500
510
  args: [{ selector: 'cmat-transfer-picker-source', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatTransferPickerSource', imports: [MatCardModule, MatTreeModule, MatCheckboxModule, MatIconModule, MatButtonModule,
501
- CmatTransferPickerFilterComponent, CmatTransferPickerSearchComponent, ScrollingModule], template: "<mat-card class=\"transfer-picker-source shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-source-title\">{{options?.title}}</mat-card-title>\r\n @if (options?.filterable) {\r\n <cmat-transfer-picker-filter\r\n [filters]=\"options?.filters\"></cmat-transfer-picker-filter>\r\n }\r\n </mat-card-header>\r\n <mat-card-content class=\"transfer-picker-source-content\">\r\n @if (options?.searchable) {\r\n <cmat-transfer-picker-search\r\n [searchPlaceholder]=\"options?.searchPlaceholder\"></cmat-transfer-picker-search>\r\n }\r\n\r\n <cdk-virtual-scroll-viewport itemSize=\"48\"\r\n class=\"transfer-picker-source-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-tree #componentTree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton disabled> </button>\r\n <mat-checkbox class=\"checklist-leaf-node\" [checked]=\"checklistSelection.isSelected(nestedNodeMap.get(node)!)\"\r\n [disabled]=\"nestedNodeMap.get(node)?.disabled\" (change)=\"transferLeafItemSelectionToggle(nestedNodeMap.get(node)!);\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton matTreeNodeToggle>\r\n <mat-icon svgIcon=\"{{componentTree.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'}}\"\r\n class=\"mat-icon-rtl-mirror\">\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox [checked]=\"descendantsAllSelected(nestedNodeMap.get(node)!)||nestedNodeMap.get(node)?.disabled\"\r\n [indeterminate]=\"descendantsPartiallySelected(nestedNodeMap.get(node)!)\" [disabled]=\"nestedNodeMap.get(node)?.disabled\"\r\n (change)=\"transferItemSelectionToggle(nestedNodeMap.get(node)!)\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n </mat-tree>\r\n @if (!dataSource.length) {\r\n <div class=\"transfer-picker-source-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [".transfer-picker-source{width:276px;height:100%;padding:0}.transfer-picker-source .mat-mdc-card-header{display:flex;flex-direction:row;flex-wrap:nowrap;box-sizing:border-box;place-content:space-between;align-items:flex-start;margin-bottom:-8px}.transfer-picker-source-title{font-size:1rem;margin-bottom:0}.transfer-picker-source-scroll-wrapper{height:300px}.transfer-picker-source-empty{text-align:center;font-size:1rem;margin-top:20px;color:#00000040}\n"] }]
511
+ CmatTransferPickerFilterComponent, CmatTransferPickerSearchComponent, ScrollingModule], template: "<mat-card class=\"transfer-picker-source shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-source-title\">{{options().title}}</mat-card-title>\r\n @if (options().filterable) {\r\n <cmat-transfer-picker-filter\r\n [filters]=\"options().filters\"></cmat-transfer-picker-filter>\r\n }\r\n </mat-card-header>\r\n <mat-card-content class=\"transfer-picker-source-content\">\r\n @if (options().searchable) {\r\n <cmat-transfer-picker-search\r\n [searchPlaceholder]=\"options().searchPlaceholder\"></cmat-transfer-picker-search>\r\n }\r\n\r\n <cdk-virtual-scroll-viewport itemSize=\"48\"\r\n class=\"transfer-picker-source-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-tree #componentTree [dataSource]=\"dataSource()\" [childrenAccessor]=\"childrenAccessor\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton disabled> </button>\r\n <mat-checkbox class=\"checklist-leaf-node\" [checked]=\"checklistSelection.isSelected(nestedNodeMap.get(node)!)\"\r\n [disabled]=\"isNodeDisabled(nestedNodeMap.get(node)!)\" (change)=\"transferLeafItemSelectionToggle(nestedNodeMap.get(node)!);\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" [matTreeNodePadding]=\"nestedNodeMap.get(node)?.level\">\r\n <button type=\"button\" matIconButton matTreeNodeToggle>\r\n <mat-icon svgIcon=\"{{componentTree.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'}}\"\r\n class=\"mat-icon-rtl-mirror\">\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox [checked]=\"descendantsAllSelected(nestedNodeMap.get(node)!)||committedValueSet().has(nestedNodeMap.get(node)!.value)\"\r\n [indeterminate]=\"descendantsPartiallySelected(nestedNodeMap.get(node)!)\" [disabled]=\"isNodeDisabled(nestedNodeMap.get(node)!)\"\r\n (change)=\"transferItemSelectionToggle(nestedNodeMap.get(node)!)\">\r\n {{node.label}}\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n </mat-tree>\r\n @if (!dataSource().length) {\r\n <div class=\"transfer-picker-source-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [".transfer-picker-source{width:276px;height:100%;padding:0}.transfer-picker-source .mat-mdc-card-header{display:flex;flex-direction:row;flex-wrap:nowrap;box-sizing:border-box;place-content:space-between;align-items:flex-start;margin-bottom:-8px}.transfer-picker-source-title{font-size:1rem;margin-bottom:0}.transfer-picker-source-scroll-wrapper{height:300px}.transfer-picker-source-empty{text-align:center;font-size:1rem;margin-top:20px;color:#00000040}\n"] }]
502
512
  }], propDecorators: { tree: [{
503
513
  type: ViewChild,
504
514
  args: ['componentTree', { static: false }]
@@ -509,16 +519,15 @@ class CmatTransferPickerTargetComponent {
509
519
  this.clearItemChange = new EventEmitter();
510
520
  }
511
521
  clearItem(item) {
512
- this.selectedList.splice(this.selectedList.findIndex(j => j === item), 1);
513
522
  this.clearItemChange.emit(item);
514
523
  }
515
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerTargetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
516
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: CmatTransferPickerTargetComponent, isStandalone: true, selector: "cmat-transfer-picker-target", inputs: { selectedList: "selectedList" }, outputs: { clearItemChange: "clearItemChange" }, exportAs: ["cmatTransferPickerTarget"], ngImport: i0, template: "<mat-card class=\"transfer-picker-target shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-target-title\">\u5DF2\u9009\u62E9 {{selectedList.length}} \u9879</mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <cdk-virtual-scroll-viewport itemSize=\"40\"\r\n class=\"transfer-picker-target-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-list dense>\r\n @for (item of selectedList; track $index) {\r\n <mat-list-item class=\"transfer-picker-target-item\">\r\n <div mat-line class=\"flex flex-row items-center\">\r\n <div class=\"flex-1\">{{item.label}}</div>\r\n <button type=\"button\" matIconButton (click)=\"clearItem(item)\">\r\n <mat-icon svgIcon=\"heroicons_solid:x-circle\"></mat-icon>\r\n </button>\r\n </div>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n @if (!selectedList.length) {\r\n <div class=\"transfer-picker-target-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>", styles: [".transfer-picker-target{height:100%;padding:0;width:276px}.transfer-picker-target .mat-mdc-card-header{margin-bottom:-8px}.transfer-picker-target-title{font-size:1rem;margin-bottom:0;padding:12px 0}.transfer-picker-target-item{width:100%}.transfer-picker-target-scroll-wrapper{height:356px}.transfer-picker-target-empty{text-align:center;margin-top:20px;color:#00000040}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i1$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i1$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i2$2.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i2$2.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i6.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "component", type: i6.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
524
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerTargetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
525
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmatTransferPickerTargetComponent, isStandalone: true, selector: "cmat-transfer-picker-target", inputs: { committedSelection: "committedSelection" }, outputs: { clearItemChange: "clearItemChange" }, exportAs: ["cmatTransferPickerTarget"], ngImport: i0, template: "<mat-card class=\"transfer-picker-target shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-target-title\">\u5DF2\u9009\u62E9 {{committedSelection.length}} \u9879</mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <cdk-virtual-scroll-viewport itemSize=\"40\"\r\n class=\"transfer-picker-target-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-list dense>\r\n @for (item of committedSelection; track $index) {\r\n <mat-list-item class=\"transfer-picker-target-item\">\r\n <div mat-line class=\"flex flex-row items-center\">\r\n <div class=\"flex-1\">{{item.label}}</div>\r\n <button type=\"button\" matIconButton (click)=\"clearItem(item)\">\r\n <mat-icon svgIcon=\"heroicons_solid:x-circle\"></mat-icon>\r\n </button>\r\n </div>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n @if (!committedSelection.length) {\r\n <div class=\"transfer-picker-target-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [".transfer-picker-target{height:100%;padding:0;width:276px}.transfer-picker-target .mat-mdc-card-header{margin-bottom:-8px}.transfer-picker-target-title{font-size:1rem;margin-bottom:0;padding:12px 0}.transfer-picker-target-item{width:100%}.transfer-picker-target-scroll-wrapper{height:356px}.transfer-picker-target-empty{text-align:center;margin-top:20px;color:#00000040}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1$2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1$2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i1$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i1$2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i2$2.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i2$2.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i6.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "component", type: i6.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
517
526
  }
518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerTargetComponent, decorators: [{
527
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerTargetComponent, decorators: [{
519
528
  type: Component,
520
- args: [{ selector: 'cmat-transfer-picker-target', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatTransferPickerTarget', imports: [MatCardModule, MatListModule, MatIconModule, ScrollingModule, MatButtonModule], template: "<mat-card class=\"transfer-picker-target shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-target-title\">\u5DF2\u9009\u62E9 {{selectedList.length}} \u9879</mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <cdk-virtual-scroll-viewport itemSize=\"40\"\r\n class=\"transfer-picker-target-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-list dense>\r\n @for (item of selectedList; track $index) {\r\n <mat-list-item class=\"transfer-picker-target-item\">\r\n <div mat-line class=\"flex flex-row items-center\">\r\n <div class=\"flex-1\">{{item.label}}</div>\r\n <button type=\"button\" matIconButton (click)=\"clearItem(item)\">\r\n <mat-icon svgIcon=\"heroicons_solid:x-circle\"></mat-icon>\r\n </button>\r\n </div>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n @if (!selectedList.length) {\r\n <div class=\"transfer-picker-target-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>", styles: [".transfer-picker-target{height:100%;padding:0;width:276px}.transfer-picker-target .mat-mdc-card-header{margin-bottom:-8px}.transfer-picker-target-title{font-size:1rem;margin-bottom:0;padding:12px 0}.transfer-picker-target-item{width:100%}.transfer-picker-target-scroll-wrapper{height:356px}.transfer-picker-target-empty{text-align:center;margin-top:20px;color:#00000040}\n"] }]
521
- }], ctorParameters: () => [], propDecorators: { selectedList: [{
529
+ args: [{ selector: 'cmat-transfer-picker-target', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatTransferPickerTarget', imports: [MatCardModule, MatListModule, MatIconModule, ScrollingModule, MatButtonModule], template: "<mat-card class=\"transfer-picker-target shadow\">\r\n <mat-card-header class=\"pb-3 items-center\">\r\n <mat-card-title class=\"transfer-picker-target-title\">\u5DF2\u9009\u62E9 {{committedSelection.length}} \u9879</mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <cdk-virtual-scroll-viewport itemSize=\"40\"\r\n class=\"transfer-picker-target-scroll-wrapper overflow-y-auto scrollbar-custom\">\r\n <mat-list dense>\r\n @for (item of committedSelection; track $index) {\r\n <mat-list-item class=\"transfer-picker-target-item\">\r\n <div mat-line class=\"flex flex-row items-center\">\r\n <div class=\"flex-1\">{{item.label}}</div>\r\n <button type=\"button\" matIconButton (click)=\"clearItem(item)\">\r\n <mat-icon svgIcon=\"heroicons_solid:x-circle\"></mat-icon>\r\n </button>\r\n </div>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n @if (!committedSelection.length) {\r\n <div class=\"transfer-picker-target-empty\">\u6682\u65E0\u6570\u636E</div>\r\n }\r\n </cdk-virtual-scroll-viewport>\r\n </mat-card-content>\r\n</mat-card>\r\n", styles: [".transfer-picker-target{height:100%;padding:0;width:276px}.transfer-picker-target .mat-mdc-card-header{margin-bottom:-8px}.transfer-picker-target-title{font-size:1rem;margin-bottom:0;padding:12px 0}.transfer-picker-target-item{width:100%}.transfer-picker-target-scroll-wrapper{height:356px}.transfer-picker-target-empty{text-align:center;margin-top:20px;color:#00000040}\n"] }]
530
+ }], ctorParameters: () => [], propDecorators: { committedSelection: [{
522
531
  type: Input
523
532
  }], clearItemChange: [{
524
533
  type: Output
@@ -526,12 +535,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
526
535
 
527
536
  class CmatTransferPickerComponent {
528
537
  constructor() {
538
+ this.committedSelection = signal([], ...(ngDevMode ? [{ debugName: "committedSelection" }] : /* istanbul ignore next */ []));
529
539
  this._service = inject(CmatTransferPickerService);
530
- this._changeDetectorRef = inject(ChangeDetectorRef);
540
+ this._injector = inject(Injector);
531
541
  this.filterable = true;
532
542
  this.dataSource = [];
533
543
  this.filters = [];
534
- this.selectedList = [];
544
+ this.committedSelection.set([]);
535
545
  this.selectedValues = [];
536
546
  }
537
547
  ngOnInit() {
@@ -548,36 +558,39 @@ class CmatTransferPickerComponent {
548
558
  }
549
559
  ngAfterViewInit() {
550
560
  if (this.selectedValues.length) {
551
- this.pick();
561
+ afterNextRender(() => {
562
+ this.pick();
563
+ }, { injector: this._injector });
552
564
  }
553
565
  }
554
566
  pick() {
555
- this.selectedList = this.source.getSelectedList() || [];
556
- this._emitterChange();
567
+ this._commitSelection(this.source.commitSelection());
557
568
  }
558
569
  reset() {
559
- if (this.selectedList.length) {
560
- this.selectedList = [];
570
+ if (this.committedSelection().length) {
571
+ this._commitSelection([]);
561
572
  this._service.resetDataSource(true);
562
- this._emitterChange();
563
573
  }
564
574
  }
565
575
  onClearItemChange(item) {
566
576
  if (item) {
567
577
  this.source.resetSelectedItem(item);
568
- this._emitterChange();
578
+ this._commitSelection(this.source.getCommittedSelection());
569
579
  }
570
580
  }
581
+ _commitSelection(selectedList) {
582
+ this.committedSelection.set([...selectedList]);
583
+ this._emitterChange();
584
+ }
571
585
  _emitterChange() {
572
- this.selectChange.emit(this.selectedList);
573
- this._changeDetectorRef.detectChanges();
586
+ this.selectChange.emit(this.committedSelection());
574
587
  }
575
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
576
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: CmatTransferPickerComponent, isStandalone: true, selector: "cmat-transfer-picker", inputs: { title: "title", filterable: "filterable", searchable: "searchable", searchPlaceholder: "searchPlaceholder", dataSource: "dataSource", filters: "filters", selectedValues: "selectedValues" }, outputs: { selectChange: "selectChange" }, viewQueries: [{ propertyName: "source", first: true, predicate: CmatTransferPickerSourceComponent, descendants: true, static: true }], exportAs: ["cmatTransferPicker"], ngImport: i0, template: "<cmat-transfer-picker-source></cmat-transfer-picker-source>\r\n<div class=\"cmat-transfer-picker-operation flex flex-col flex-nowrap gap-2 mx-2\">\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"pick()\">\r\n \u9009\u62E9<mat-icon svgIcon=\"mat_outline:chevron_right\"></mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"reset()\">\r\n <mat-icon svgIcon=\"mat_outline:chevron_left\"></mat-icon>\u91CD\u7F6E\r\n </button>\r\n</div>\r\n<cmat-transfer-picker-target [selectedList]=\"selectedList\" (clearItemChange)=\"onClearItemChange($event)\">\r\n</cmat-transfer-picker-target>", styles: ["cmat-transfer-picker{height:100%;overflow:hidden;padding:1rem;display:flex;flex-wrap:nowrap;justify-items:center;align-items:center;gap:.5rem}cmat-transfer-picker cmat-transfer-picker-source,cmat-transfer-picker cmat-transfer-picker-target{height:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: CmatTransferPickerSourceComponent, selector: "cmat-transfer-picker-source", exportAs: ["cmatTransferPickerSource"] }, { kind: "component", type: CmatTransferPickerTargetComponent, selector: "cmat-transfer-picker-target", inputs: ["selectedList"], outputs: ["clearItemChange"], exportAs: ["cmatTransferPickerTarget"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
588
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
589
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CmatTransferPickerComponent, isStandalone: true, selector: "cmat-transfer-picker", inputs: { title: "title", filterable: "filterable", searchable: "searchable", searchPlaceholder: "searchPlaceholder", dataSource: "dataSource", filters: "filters", selectedValues: "selectedValues" }, outputs: { selectChange: "selectChange" }, viewQueries: [{ propertyName: "source", first: true, predicate: CmatTransferPickerSourceComponent, descendants: true, static: true }], exportAs: ["cmatTransferPicker"], ngImport: i0, template: "<cmat-transfer-picker-source></cmat-transfer-picker-source>\r\n<div class=\"cmat-transfer-picker-operation flex flex-col flex-nowrap gap-2 mx-2\">\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"pick()\">\r\n \u9009\u62E9<mat-icon svgIcon=\"mat_outline:chevron_right\"></mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"reset()\">\r\n <mat-icon svgIcon=\"mat_outline:chevron_left\"></mat-icon>\u91CD\u7F6E\r\n </button>\r\n</div>\r\n<cmat-transfer-picker-target [committedSelection]=\"committedSelection()\" (clearItemChange)=\"onClearItemChange($event)\">\r\n</cmat-transfer-picker-target>\r\n", styles: ["cmat-transfer-picker{height:100%;overflow:hidden;padding:1rem;display:flex;flex-wrap:nowrap;justify-items:center;align-items:center;gap:.5rem}cmat-transfer-picker cmat-transfer-picker-source,cmat-transfer-picker cmat-transfer-picker-target{height:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: CmatTransferPickerSourceComponent, selector: "cmat-transfer-picker-source", exportAs: ["cmatTransferPickerSource"] }, { kind: "component", type: CmatTransferPickerTargetComponent, selector: "cmat-transfer-picker-target", inputs: ["committedSelection"], outputs: ["clearItemChange"], exportAs: ["cmatTransferPickerTarget"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
577
590
  }
578
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatTransferPickerComponent, decorators: [{
591
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatTransferPickerComponent, decorators: [{
579
592
  type: Component,
580
- args: [{ selector: 'cmat-transfer-picker', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatTransferPicker', imports: [MatIconModule, MatButtonModule, CmatTransferPickerSourceComponent, CmatTransferPickerTargetComponent], template: "<cmat-transfer-picker-source></cmat-transfer-picker-source>\r\n<div class=\"cmat-transfer-picker-operation flex flex-col flex-nowrap gap-2 mx-2\">\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"pick()\">\r\n \u9009\u62E9<mat-icon svgIcon=\"mat_outline:chevron_right\"></mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"reset()\">\r\n <mat-icon svgIcon=\"mat_outline:chevron_left\"></mat-icon>\u91CD\u7F6E\r\n </button>\r\n</div>\r\n<cmat-transfer-picker-target [selectedList]=\"selectedList\" (clearItemChange)=\"onClearItemChange($event)\">\r\n</cmat-transfer-picker-target>", styles: ["cmat-transfer-picker{height:100%;overflow:hidden;padding:1rem;display:flex;flex-wrap:nowrap;justify-items:center;align-items:center;gap:.5rem}cmat-transfer-picker cmat-transfer-picker-source,cmat-transfer-picker cmat-transfer-picker-target{height:100%}\n"] }]
593
+ args: [{ selector: 'cmat-transfer-picker', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatTransferPicker', imports: [MatIconModule, MatButtonModule, CmatTransferPickerSourceComponent, CmatTransferPickerTargetComponent], template: "<cmat-transfer-picker-source></cmat-transfer-picker-source>\r\n<div class=\"cmat-transfer-picker-operation flex flex-col flex-nowrap gap-2 mx-2\">\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"pick()\">\r\n \u9009\u62E9<mat-icon svgIcon=\"mat_outline:chevron_right\"></mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"pl-2\" matButton=\"filled\" color=\"primary\" (click)=\"reset()\">\r\n <mat-icon svgIcon=\"mat_outline:chevron_left\"></mat-icon>\u91CD\u7F6E\r\n </button>\r\n</div>\r\n<cmat-transfer-picker-target [committedSelection]=\"committedSelection()\" (clearItemChange)=\"onClearItemChange($event)\">\r\n</cmat-transfer-picker-target>\r\n", styles: ["cmat-transfer-picker{height:100%;overflow:hidden;padding:1rem;display:flex;flex-wrap:nowrap;justify-items:center;align-items:center;gap:.5rem}cmat-transfer-picker cmat-transfer-picker-source,cmat-transfer-picker cmat-transfer-picker-target{height:100%}\n"] }]
581
594
  }], ctorParameters: () => [], propDecorators: { title: [{
582
595
  type: Input
583
596
  }], filterable: [{