@sd-angular/core 19.0.0-beta.28 → 19.0.0-beta.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,3 @@
1
- export * from '@sd-angular/core/modules/oidc';
2
1
  export * from '@sd-angular/core/modules/keycloak';
3
2
  export * from '@sd-angular/core/modules/permission';
4
3
  export * from '@sd-angular/core/modules/auth';
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-modules.mjs","sources":["../../../projects/sd-angular/modules/sd-angular-core-modules.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"sd-angular-core-modules.mjs","sources":["../../../projects/sd-angular/modules/sd-angular-core-modules.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAAA;;AAEG"}
@@ -74,7 +74,7 @@ class SdToastComponent {
74
74
  return this.isMultiMessage && this.messages.length > this.MAX_SHOW;
75
75
  }
76
76
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdToastComponent, deps: [{ token: SdNotifyService }], target: i0.ɵɵFactoryTarget.Component });
77
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdToastComponent, isStandalone: true, selector: "sd-toast", inputs: { data: "data" }, host: { listeners: { "mouseenter": "pauseTimer()", "mouseleave": "resumeTimer()" }, properties: { "@toastAnimation": "true", "class": "\"bg-white sd-toast\"" } }, ngImport: i0, template: "<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\r\n\r\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\r\n @switch (data.type) {\r\n @case ('success') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\r\n }\r\n @case ('info') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\r\n }\r\n @case ('warning') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\r\n }\r\n @case ('error') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"sd-toast__content\">\r\n <div class=\"sd-toast__header\">\r\n <strong class=\"sd-toast__title\">{{ data.title || (data.type | titlecase) }}</strong>\r\n <button class=\"sd-toast__close\" (click)=\"close()\">\u2715</button>\r\n </div>\r\n\r\n <div class=\"sd-toast__body\">\r\n @if (!isMultiMessage) {\r\n <div [innerHTML]=\"data.message\"></div>\r\n } \r\n @else {\r\n <ul class=\"msg-list\">\r\n @for (msg of displayMessages; track msg) {\r\n <li [innerHTML]=\"'- ' + msg\"></li>\r\n }\r\n </ul>\r\n\r\n @if (hasMore) {\r\n <button type=\"button\" \r\n class=\"toggle-more btn-link\" \r\n [class]=\"'text-' + data.type\" \r\n (click)=\"toggleExpand()\">\r\n {{ isExpanded() ? 'Show less' : 'Show more (' + restCount + ')' }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n @if (data.actionLabel) {\r\n <div class=\"sd-toast__actions\">\r\n <button class=\"btn-action\" \r\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\r\n (click)=\"onActionClick()\">\r\n {{ data.actionLabel }}\r\n </button>\r\n </div>\r\n }\r\n</div>", styles: ["@charset \"UTF-8\";:host{display:flex;width:350px;border-radius:8px;box-shadow:0 4px 12px #00000026;margin-bottom:12px;overflow:hidden;position:relative;font-family:Roboto,sans-serif;pointer-events:auto}.sd-toast__bar{width:6px;flex-shrink:0}.sd-toast__icon{padding:12px 0 0 12px;flex-shrink:0}.sd-toast__icon svg{width:24px;height:24px}.sd-toast__content{flex-grow:1;padding:12px;display:flex;flex-direction:column}.sd-toast__header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4px}.sd-toast__title{font-size:16px;font-weight:600}.sd-toast__close{background:none;border:none;font-size:16px;cursor:pointer;line-height:1;padding:0;opacity:.5;transition:opacity .2s}.sd-toast__close:hover{opacity:1}.sd-toast__body{font-size:14px;line-height:1.4}.sd-toast__actions{display:flex;justify-content:flex-end;margin-top:8px}.msg-list{padding-left:0;list-style:none;margin:0}.toggle-more{background:none;border:none;padding:0;font:inherit;cursor:pointer;font-size:13px;margin-top:4px;font-weight:500;text-align:left}.toggle-more:hover{text-decoration:underline}.toggle-more:focus-visible{outline:2px solid currentColor;outline-offset:2px}.btn-action{border:none;padding:6px 12px;border-radius:4px;font-weight:600;cursor:pointer;font-size:13px;transition:filter .2s}.btn-action:hover{filter:brightness(.95)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }], animations: [
77
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdToastComponent, isStandalone: true, selector: "sd-toast", inputs: { data: "data" }, host: { listeners: { "mouseenter": "pauseTimer()", "mouseleave": "resumeTimer()" }, properties: { "@toastAnimation": "true", "class": "\"bg-white sd-toast\"" } }, ngImport: i0, template: "<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\r\n\r\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\r\n @switch (data.type) {\r\n @case ('success') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\r\n }\r\n @case ('info') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\r\n }\r\n @case ('warning') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\r\n }\r\n @case ('error') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"sd-toast__content\">\r\n <div class=\"sd-toast__header\">\r\n <strong class=\"sd-toast__title\">{{ data.title || (data.type | titlecase) }}</strong>\r\n <button class=\"sd-toast__close\" (click)=\"close()\">\u2715</button>\r\n </div>\r\n\r\n <div class=\"sd-toast__body\">\r\n @if (!isMultiMessage) {\r\n <div [innerHTML]=\"data.message\"></div>\r\n } \r\n @else {\r\n <ul class=\"msg-list\">\r\n @for (msg of displayMessages; track msg) {\r\n <li [innerHTML]=\"'- ' + msg\"></li>\r\n }\r\n </ul>\r\n\r\n @if (hasMore) {\r\n <button type=\"button\" \r\n class=\"toggle-more btn-link\" \r\n [class]=\"'text-' + data.type\" \r\n (click)=\"toggleExpand()\">\r\n {{ isExpanded() ? 'Show less' : 'Show more (' + restCount + ')' }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n @if (data.actionLabel) {\r\n <div class=\"sd-toast__actions\">\r\n <button class=\"btn-action\" \r\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\r\n (click)=\"onActionClick()\">\r\n {{ data.actionLabel }}\r\n </button>\r\n </div>\r\n }\r\n</div>", styles: ["@charset \"UTF-8\";:host{display:flex;width:350px;border-radius:8px;box-shadow:0 4px 12px #00000026;margin-bottom:12px;overflow:hidden;position:relative;font-family:Roboto,sans-serif;pointer-events:auto}.sd-toast__bar{width:6px;flex-shrink:0}.sd-toast__icon{padding:12px 0 0 12px;flex-shrink:0}.sd-toast__icon svg{width:24px;height:24px}.sd-toast__content{flex-grow:1;padding:12px;display:flex;flex-direction:column}.sd-toast__header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4px}.sd-toast__title{font-size:16px;font-weight:600}.sd-toast__close{background:none;border:none;font-size:16px;cursor:pointer;line-height:1;padding:0;opacity:.5;transition:opacity .2s}.sd-toast__close:hover{opacity:1}.sd-toast__body{font-size:14px;line-height:1.4;word-break:break-word}.sd-toast__actions{display:flex;justify-content:flex-end;margin-top:8px}.msg-list{padding-left:0;list-style:none;margin:0}.toggle-more{background:none;border:none;padding:0;font:inherit;cursor:pointer;font-size:13px;margin-top:4px;font-weight:500;text-align:left}.toggle-more:hover{text-decoration:underline}.toggle-more:focus-visible{outline:2px solid currentColor;outline-offset:2px}.btn-action{border:none;padding:6px 12px;border-radius:4px;font-weight:600;cursor:pointer;font-size:13px;transition:filter .2s}.btn-action:hover{filter:brightness(.95)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }], animations: [
78
78
  trigger('toastAnimation', [
79
79
  transition(':enter', [
80
80
  style({ transform: 'translateX(100%)', opacity: 0 }),
@@ -101,7 +101,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
101
101
  ], host: {
102
102
  '[@toastAnimation]': 'true',
103
103
  '[class]': '"bg-white sd-toast"'
104
- }, template: "<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\r\n\r\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\r\n @switch (data.type) {\r\n @case ('success') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\r\n }\r\n @case ('info') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\r\n }\r\n @case ('warning') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\r\n }\r\n @case ('error') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"sd-toast__content\">\r\n <div class=\"sd-toast__header\">\r\n <strong class=\"sd-toast__title\">{{ data.title || (data.type | titlecase) }}</strong>\r\n <button class=\"sd-toast__close\" (click)=\"close()\">\u2715</button>\r\n </div>\r\n\r\n <div class=\"sd-toast__body\">\r\n @if (!isMultiMessage) {\r\n <div [innerHTML]=\"data.message\"></div>\r\n } \r\n @else {\r\n <ul class=\"msg-list\">\r\n @for (msg of displayMessages; track msg) {\r\n <li [innerHTML]=\"'- ' + msg\"></li>\r\n }\r\n </ul>\r\n\r\n @if (hasMore) {\r\n <button type=\"button\" \r\n class=\"toggle-more btn-link\" \r\n [class]=\"'text-' + data.type\" \r\n (click)=\"toggleExpand()\">\r\n {{ isExpanded() ? 'Show less' : 'Show more (' + restCount + ')' }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n @if (data.actionLabel) {\r\n <div class=\"sd-toast__actions\">\r\n <button class=\"btn-action\" \r\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\r\n (click)=\"onActionClick()\">\r\n {{ data.actionLabel }}\r\n </button>\r\n </div>\r\n }\r\n</div>", styles: ["@charset \"UTF-8\";:host{display:flex;width:350px;border-radius:8px;box-shadow:0 4px 12px #00000026;margin-bottom:12px;overflow:hidden;position:relative;font-family:Roboto,sans-serif;pointer-events:auto}.sd-toast__bar{width:6px;flex-shrink:0}.sd-toast__icon{padding:12px 0 0 12px;flex-shrink:0}.sd-toast__icon svg{width:24px;height:24px}.sd-toast__content{flex-grow:1;padding:12px;display:flex;flex-direction:column}.sd-toast__header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4px}.sd-toast__title{font-size:16px;font-weight:600}.sd-toast__close{background:none;border:none;font-size:16px;cursor:pointer;line-height:1;padding:0;opacity:.5;transition:opacity .2s}.sd-toast__close:hover{opacity:1}.sd-toast__body{font-size:14px;line-height:1.4}.sd-toast__actions{display:flex;justify-content:flex-end;margin-top:8px}.msg-list{padding-left:0;list-style:none;margin:0}.toggle-more{background:none;border:none;padding:0;font:inherit;cursor:pointer;font-size:13px;margin-top:4px;font-weight:500;text-align:left}.toggle-more:hover{text-decoration:underline}.toggle-more:focus-visible{outline:2px solid currentColor;outline-offset:2px}.btn-action{border:none;padding:6px 12px;border-radius:4px;font-weight:600;cursor:pointer;font-size:13px;transition:filter .2s}.btn-action:hover{filter:brightness(.95)}\n"] }]
104
+ }, template: "<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\r\n\r\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\r\n @switch (data.type) {\r\n @case ('success') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\r\n }\r\n @case ('info') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\r\n }\r\n @case ('warning') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\r\n }\r\n @case ('error') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"sd-toast__content\">\r\n <div class=\"sd-toast__header\">\r\n <strong class=\"sd-toast__title\">{{ data.title || (data.type | titlecase) }}</strong>\r\n <button class=\"sd-toast__close\" (click)=\"close()\">\u2715</button>\r\n </div>\r\n\r\n <div class=\"sd-toast__body\">\r\n @if (!isMultiMessage) {\r\n <div [innerHTML]=\"data.message\"></div>\r\n } \r\n @else {\r\n <ul class=\"msg-list\">\r\n @for (msg of displayMessages; track msg) {\r\n <li [innerHTML]=\"'- ' + msg\"></li>\r\n }\r\n </ul>\r\n\r\n @if (hasMore) {\r\n <button type=\"button\" \r\n class=\"toggle-more btn-link\" \r\n [class]=\"'text-' + data.type\" \r\n (click)=\"toggleExpand()\">\r\n {{ isExpanded() ? 'Show less' : 'Show more (' + restCount + ')' }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n @if (data.actionLabel) {\r\n <div class=\"sd-toast__actions\">\r\n <button class=\"btn-action\" \r\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\r\n (click)=\"onActionClick()\">\r\n {{ data.actionLabel }}\r\n </button>\r\n </div>\r\n }\r\n</div>", styles: ["@charset \"UTF-8\";:host{display:flex;width:350px;border-radius:8px;box-shadow:0 4px 12px #00000026;margin-bottom:12px;overflow:hidden;position:relative;font-family:Roboto,sans-serif;pointer-events:auto}.sd-toast__bar{width:6px;flex-shrink:0}.sd-toast__icon{padding:12px 0 0 12px;flex-shrink:0}.sd-toast__icon svg{width:24px;height:24px}.sd-toast__content{flex-grow:1;padding:12px;display:flex;flex-direction:column}.sd-toast__header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4px}.sd-toast__title{font-size:16px;font-weight:600}.sd-toast__close{background:none;border:none;font-size:16px;cursor:pointer;line-height:1;padding:0;opacity:.5;transition:opacity .2s}.sd-toast__close:hover{opacity:1}.sd-toast__body{font-size:14px;line-height:1.4;word-break:break-word}.sd-toast__actions{display:flex;justify-content:flex-end;margin-top:8px}.msg-list{padding-left:0;list-style:none;margin:0}.toggle-more{background:none;border:none;padding:0;font:inherit;cursor:pointer;font-size:13px;margin-top:4px;font-weight:500;text-align:left}.toggle-more:hover{text-decoration:underline}.toggle-more:focus-visible{outline:2px solid currentColor;outline-offset:2px}.btn-action{border:none;padding:6px 12px;border-radius:4px;font-weight:600;cursor:pointer;font-size:13px;transition:filter .2s}.btn-action:hover{filter:brightness(.95)}\n"] }]
105
105
  }], ctorParameters: () => [{ type: SdNotifyService }], propDecorators: { data: [{
106
106
  type: Input,
107
107
  args: [{ required: true }]
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-services-notify.mjs","sources":["../../../projects/sd-angular/services/notify/src/components/toast/toast.component.ts","../../../projects/sd-angular/services/notify/src/components/toast/toast.component.html","../../../projects/sd-angular/services/notify/src/components/toast-container.component.ts","../../../projects/sd-angular/services/notify/src/notify.service.ts","../../../projects/sd-angular/services/notify/sd-angular-core-services-notify.ts"],"sourcesContent":["import { Component, Input, signal, HostListener, OnInit, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { animate, style, transition, trigger } from '@angular/animations';\r\nimport { ToastData } from '../../notify.model';\r\nimport { SdNotifyService } from '../../notify.service';\r\n\r\n@Component({\r\n selector: 'sd-toast',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './toast.component.html',\r\n styleUrls: ['./toast.component.scss'],\r\n animations: [\r\n trigger('toastAnimation', [\r\n transition(':enter', [\r\n style({ transform: 'translateX(100%)', opacity: 0 }),\r\n animate('300ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\r\n ])\r\n ])\r\n ],\r\n host: {\r\n '[@toastAnimation]': 'true',\r\n '[class]': '\"bg-white sd-toast\"'\r\n }\r\n})\r\nexport class SdToastComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) data!: ToastData;\r\n \r\n isExpanded = signal(false);\r\n readonly MAX_SHOW = 2;\r\n\r\n // --- Logic Timer ---\r\n private timer: any;\r\n private start!: number;\r\n private remaining!: number;\r\n\r\n constructor(private notifyService: SdNotifyService) {}\r\n\r\n ngOnInit() {\r\n // Khởi tạo thời gian còn lại bằng duration ban đầu\r\n this.remaining = this.data.duration;\r\n // Bắt đầu đếm ngược ngay khi hiện ra\r\n this.resumeTimer();\r\n }\r\n\r\n ngOnDestroy() {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n // --- Logic Pause/Resume ---\r\n\r\n @HostListener('mouseenter')\r\n pauseTimer() {\r\n if (this.timer) {\r\n // Xóa timer hiện tại\r\n clearTimeout(this.timer);\r\n this.timer = null;\r\n // Tính toán thời gian đã trôi qua để trừ đi\r\n this.remaining -= Date.now() - this.start;\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n resumeTimer() {\r\n // Chỉ chạy tiếp nếu còn thời gian và timer chưa chạy\r\n if (this.remaining > 0 && !this.timer) {\r\n this.start = Date.now();\r\n this.timer = setTimeout(() => {\r\n this.close();\r\n }, this.remaining);\r\n }\r\n }\r\n\r\n // --- Logic cũ ---\r\n\r\n close() {\r\n this.notifyService.remove(this.data.id);\r\n }\r\n\r\n onActionClick() {\r\n this.data.onAction?.();\r\n }\r\n\r\n toggleExpand() {\r\n this.isExpanded.update(v => !v);\r\n }\r\n\r\n get isMultiMessage(): boolean {\r\n return Array.isArray(this.data.message);\r\n }\r\n\r\n get messages(): string[] {\r\n return this.data.message as string[];\r\n }\r\n\r\n get displayMessages(): string[] {\r\n const msgs = this.messages;\r\n if (this.isExpanded()) return msgs;\r\n return msgs.slice(0, this.MAX_SHOW);\r\n }\r\n\r\n get restCount(): number {\r\n return this.messages.length - this.MAX_SHOW;\r\n }\r\n\r\n get hasMore(): boolean {\r\n return this.isMultiMessage && this.messages.length > this.MAX_SHOW;\r\n }\r\n}","<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\r\n\r\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\r\n @switch (data.type) {\r\n @case ('success') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\r\n }\r\n @case ('info') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\r\n }\r\n @case ('warning') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\r\n }\r\n @case ('error') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"sd-toast__content\">\r\n <div class=\"sd-toast__header\">\r\n <strong class=\"sd-toast__title\">{{ data.title || (data.type | titlecase) }}</strong>\r\n <button class=\"sd-toast__close\" (click)=\"close()\">✕</button>\r\n </div>\r\n\r\n <div class=\"sd-toast__body\">\r\n @if (!isMultiMessage) {\r\n <div [innerHTML]=\"data.message\"></div>\r\n } \r\n @else {\r\n <ul class=\"msg-list\">\r\n @for (msg of displayMessages; track msg) {\r\n <li [innerHTML]=\"'- ' + msg\"></li>\r\n }\r\n </ul>\r\n\r\n @if (hasMore) {\r\n <button type=\"button\" \r\n class=\"toggle-more btn-link\" \r\n [class]=\"'text-' + data.type\" \r\n (click)=\"toggleExpand()\">\r\n {{ isExpanded() ? 'Show less' : 'Show more (' + restCount + ')' }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n @if (data.actionLabel) {\r\n <div class=\"sd-toast__actions\">\r\n <button class=\"btn-action\" \r\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\r\n (click)=\"onActionClick()\">\r\n {{ data.actionLabel }}\r\n </button>\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, signal, WritableSignal } from '@angular/core';\r\nimport { ToastData } from '../notify.model';\r\nimport { SdToastComponent } from './toast/toast.component';\r\n\r\n@Component({\r\n selector: 'sd-toast-container',\r\n standalone: true,\r\n imports: [CommonModule, SdToastComponent],\r\n template: `\r\n <div class=\"toast-container\">\r\n <sd-toast *ngFor=\"let toast of toasts()\" [data]=\"toast\"> </sd-toast>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .toast-container {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n z-index: 9999;\r\n display: flex;\r\n flex-direction: column;\r\n pointer-events: none; /* Cho phép click xuyên qua vùng trống */\r\n }\r\n sd-toast {\r\n pointer-events: auto; /* Bật lại click cho toast */\r\n }\r\n `,\r\n ],\r\n})\r\nexport class SdToastContainerComponent {\r\n // 1. Khai báo biến để nhận Signal từ Service\r\n // Khởi tạo mặc định là mảng rỗng để không bị lỗi null\r\n toasts: WritableSignal<ToastData[]> = signal([]);\r\n\r\n // 2. XÓA constructor inject SdNotifyService\r\n constructor() {}\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ApplicationRef,\r\n createComponent,\r\n EnvironmentInjector,\r\n Inject,\r\n Injectable,\r\n signal\r\n} from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport { SdToastContainerComponent } from './components/toast-container.component';\r\nimport { NotifyOption, ToastData, ToastType } from './notify.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdNotifyService {\r\n readonly toasts = signal<ToastData[]>([]);\r\n\r\n // Constants\r\n readonly #DEBOUNCE_TIME = 500;\r\n readonly #DEFAULT_SUCCESS_DURATION = 3000;\r\n readonly #DEFAULT_BUFFERED_DURATION = 5000;\r\n readonly #MAX_TOASTS = 5;\r\n\r\n // State\r\n #buffer: Record<string, string[]> = {};\r\n #timers: Record<string, ReturnType<typeof setTimeout> | null> = {};\r\n\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: EnvironmentInjector,\r\n @Inject(DOCUMENT) private document: Document\r\n ) {\r\n this.#initContainer();\r\n }\r\n\r\n #initContainer() {\r\n const componentRef = createComponent(SdToastContainerComponent, {\r\n environmentInjector: this.injector,\r\n });\r\n componentRef.instance.toasts = this.toasts;\r\n this.appRef.attachView(componentRef.hostView);\r\n const domElem = (componentRef.hostView as any).rootNodes[0] as HTMLElement;\r\n this.document.body.appendChild(domElem);\r\n }\r\n\r\n // Public API\r\n success(message: string, option?: NotifyOption) {\r\n this.#addImmediate('success', message, option);\r\n }\r\n\r\n info(message: string, option?: NotifyOption) {\r\n this.#addImmediate('info', message, option);\r\n }\r\n\r\n warning(message: string | string[], option?: NotifyOption) {\r\n this.#addToBuffer('warning', message, option);\r\n }\r\n\r\n error(message: string | string[], option?: NotifyOption) {\r\n this.#addToBuffer('error', message, option);\r\n }\r\n\r\n remove(id: string) {\r\n this.toasts.update((current) => current.filter((t) => t.id !== id));\r\n }\r\n\r\n clearAll() {\r\n this.toasts.set([]);\r\n this.#clearAllTimers();\r\n }\r\n\r\n clearByType(type: ToastType) {\r\n this.toasts.update((current) => current.filter((t) => t.type !== type));\r\n }\r\n\r\n // Private helpers\r\n #addImmediate(type: ToastType, message: string, option?: NotifyOption) {\r\n const newToast: ToastData = {\r\n id: SdUtilities.generateUuid(),\r\n type,\r\n message,\r\n title: option?.title,\r\n duration: option?.duration ?? this.#DEFAULT_SUCCESS_DURATION,\r\n actionLabel: option?.actionLabel,\r\n onAction: option?.onAction\r\n };\r\n\r\n this.toasts.update((current) => {\r\n const updated = [newToast, ...current];\r\n return updated.slice(0, this.#MAX_TOASTS);\r\n });\r\n }\r\n\r\n #addToBuffer(type: ToastType, message: string | string[], option?: NotifyOption) {\r\n if (!this.#buffer[type]) {\r\n this.#buffer[type] = [];\r\n }\r\n \r\n const msgs = Array.isArray(message) ? message : [message];\r\n this.#buffer[type].push(...msgs);\r\n\r\n // Clear existing timer and set new one\r\n if (this.#timers[type]) {\r\n clearTimeout(this.#timers[type]!);\r\n }\r\n\r\n this.#timers[type] = setTimeout(() => {\r\n this.#flushBuffer(type, option);\r\n }, this.#DEBOUNCE_TIME);\r\n }\r\n\r\n #flushBuffer(type: ToastType, option?: NotifyOption) {\r\n const messages = [...new Set(this.#buffer[type])];\r\n \r\n // Cleanup\r\n this.#buffer[type] = [];\r\n this.#timers[type] = null;\r\n\r\n if (messages.length === 0) return;\r\n\r\n const typeLabel = type === 'error' ? 'Error' : 'Warning';\r\n const title = option?.title ?? typeLabel;\r\n const finalTitle = messages.length > 1 ? `${title} (${messages.length})` : title;\r\n\r\n const newToast: ToastData = {\r\n id: SdUtilities.generateUuid(),\r\n type,\r\n message: messages.length === 1 ? messages[0] : messages, \r\n title: finalTitle,\r\n duration: option?.duration ?? this.#DEFAULT_BUFFERED_DURATION,\r\n actionLabel: option?.actionLabel,\r\n onAction: option?.onAction\r\n };\r\n\r\n this.toasts.update((current) => {\r\n const updated = [newToast, ...current];\r\n return updated.slice(0, this.#MAX_TOASTS);\r\n });\r\n }\r\n\r\n #clearAllTimers() {\r\n Object.values(this.#timers).forEach(timer => {\r\n if (timer) clearTimeout(timer);\r\n });\r\n this.#timers = {};\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SdNotifyService"],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-services-notify.mjs","sources":["../../../projects/sd-angular/services/notify/src/components/toast/toast.component.ts","../../../projects/sd-angular/services/notify/src/components/toast/toast.component.html","../../../projects/sd-angular/services/notify/src/components/toast-container.component.ts","../../../projects/sd-angular/services/notify/src/notify.service.ts","../../../projects/sd-angular/services/notify/sd-angular-core-services-notify.ts"],"sourcesContent":["import { Component, Input, signal, HostListener, OnInit, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { animate, style, transition, trigger } from '@angular/animations';\r\nimport { ToastData } from '../../notify.model';\r\nimport { SdNotifyService } from '../../notify.service';\r\n\r\n@Component({\r\n selector: 'sd-toast',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './toast.component.html',\r\n styleUrls: ['./toast.component.scss'],\r\n animations: [\r\n trigger('toastAnimation', [\r\n transition(':enter', [\r\n style({ transform: 'translateX(100%)', opacity: 0 }),\r\n animate('300ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\r\n ])\r\n ])\r\n ],\r\n host: {\r\n '[@toastAnimation]': 'true',\r\n '[class]': '\"bg-white sd-toast\"'\r\n }\r\n})\r\nexport class SdToastComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) data!: ToastData;\r\n \r\n isExpanded = signal(false);\r\n readonly MAX_SHOW = 2;\r\n\r\n // --- Logic Timer ---\r\n private timer: any;\r\n private start!: number;\r\n private remaining!: number;\r\n\r\n constructor(private notifyService: SdNotifyService) {}\r\n\r\n ngOnInit() {\r\n // Khởi tạo thời gian còn lại bằng duration ban đầu\r\n this.remaining = this.data.duration;\r\n // Bắt đầu đếm ngược ngay khi hiện ra\r\n this.resumeTimer();\r\n }\r\n\r\n ngOnDestroy() {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n // --- Logic Pause/Resume ---\r\n\r\n @HostListener('mouseenter')\r\n pauseTimer() {\r\n if (this.timer) {\r\n // Xóa timer hiện tại\r\n clearTimeout(this.timer);\r\n this.timer = null;\r\n // Tính toán thời gian đã trôi qua để trừ đi\r\n this.remaining -= Date.now() - this.start;\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n resumeTimer() {\r\n // Chỉ chạy tiếp nếu còn thời gian và timer chưa chạy\r\n if (this.remaining > 0 && !this.timer) {\r\n this.start = Date.now();\r\n this.timer = setTimeout(() => {\r\n this.close();\r\n }, this.remaining);\r\n }\r\n }\r\n\r\n // --- Logic cũ ---\r\n\r\n close() {\r\n this.notifyService.remove(this.data.id);\r\n }\r\n\r\n onActionClick() {\r\n this.data.onAction?.();\r\n }\r\n\r\n toggleExpand() {\r\n this.isExpanded.update(v => !v);\r\n }\r\n\r\n get isMultiMessage(): boolean {\r\n return Array.isArray(this.data.message);\r\n }\r\n\r\n get messages(): string[] {\r\n return this.data.message as string[];\r\n }\r\n\r\n get displayMessages(): string[] {\r\n const msgs = this.messages;\r\n if (this.isExpanded()) return msgs;\r\n return msgs.slice(0, this.MAX_SHOW);\r\n }\r\n\r\n get restCount(): number {\r\n return this.messages.length - this.MAX_SHOW;\r\n }\r\n\r\n get hasMore(): boolean {\r\n return this.isMultiMessage && this.messages.length > this.MAX_SHOW;\r\n }\r\n}","<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\r\n\r\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\r\n @switch (data.type) {\r\n @case ('success') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\r\n }\r\n @case ('info') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\r\n }\r\n @case ('warning') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\r\n }\r\n @case ('error') {\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"sd-toast__content\">\r\n <div class=\"sd-toast__header\">\r\n <strong class=\"sd-toast__title\">{{ data.title || (data.type | titlecase) }}</strong>\r\n <button class=\"sd-toast__close\" (click)=\"close()\">✕</button>\r\n </div>\r\n\r\n <div class=\"sd-toast__body\">\r\n @if (!isMultiMessage) {\r\n <div [innerHTML]=\"data.message\"></div>\r\n } \r\n @else {\r\n <ul class=\"msg-list\">\r\n @for (msg of displayMessages; track msg) {\r\n <li [innerHTML]=\"'- ' + msg\"></li>\r\n }\r\n </ul>\r\n\r\n @if (hasMore) {\r\n <button type=\"button\" \r\n class=\"toggle-more btn-link\" \r\n [class]=\"'text-' + data.type\" \r\n (click)=\"toggleExpand()\">\r\n {{ isExpanded() ? 'Show less' : 'Show more (' + restCount + ')' }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n @if (data.actionLabel) {\r\n <div class=\"sd-toast__actions\">\r\n <button class=\"btn-action\" \r\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\r\n (click)=\"onActionClick()\">\r\n {{ data.actionLabel }}\r\n </button>\r\n </div>\r\n }\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, signal, WritableSignal } from '@angular/core';\r\nimport { ToastData } from '../notify.model';\r\nimport { SdToastComponent } from './toast/toast.component';\r\n\r\n@Component({\r\n selector: 'sd-toast-container',\r\n standalone: true,\r\n imports: [CommonModule, SdToastComponent],\r\n template: `\r\n <div class=\"toast-container\">\r\n <sd-toast *ngFor=\"let toast of toasts()\" [data]=\"toast\"> </sd-toast>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .toast-container {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n z-index: 9999;\r\n display: flex;\r\n flex-direction: column;\r\n pointer-events: none; /* Cho phép click xuyên qua vùng trống */\r\n }\r\n sd-toast {\r\n pointer-events: auto; /* Bật lại click cho toast */\r\n }\r\n `,\r\n ],\r\n})\r\nexport class SdToastContainerComponent {\r\n // 1. Khai báo biến để nhận Signal từ Service\r\n // Khởi tạo mặc định là mảng rỗng để không bị lỗi null\r\n toasts: WritableSignal<ToastData[]> = signal([]);\r\n\r\n // 2. XÓA constructor inject SdNotifyService\r\n constructor() {}\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ApplicationRef,\r\n createComponent,\r\n EnvironmentInjector,\r\n Inject,\r\n Injectable,\r\n signal\r\n} from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport { SdToastContainerComponent } from './components/toast-container.component';\r\nimport { NotifyOption, ToastData, ToastType } from './notify.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdNotifyService {\r\n readonly toasts = signal<ToastData[]>([]);\r\n\r\n // Constants\r\n readonly #DEBOUNCE_TIME = 500;\r\n readonly #DEFAULT_SUCCESS_DURATION = 3000;\r\n readonly #DEFAULT_BUFFERED_DURATION = 5000;\r\n readonly #MAX_TOASTS = 5;\r\n\r\n // State\r\n #buffer: Record<string, string[]> = {};\r\n #timers: Record<string, ReturnType<typeof setTimeout> | null> = {};\r\n\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: EnvironmentInjector,\r\n @Inject(DOCUMENT) private document: Document\r\n ) {\r\n this.#initContainer();\r\n }\r\n\r\n #initContainer() {\r\n const componentRef = createComponent(SdToastContainerComponent, {\r\n environmentInjector: this.injector,\r\n });\r\n componentRef.instance.toasts = this.toasts;\r\n this.appRef.attachView(componentRef.hostView);\r\n const domElem = (componentRef.hostView as any).rootNodes[0] as HTMLElement;\r\n this.document.body.appendChild(domElem);\r\n }\r\n\r\n // Public API\r\n success(message: string, option?: NotifyOption) {\r\n this.#addImmediate('success', message, option);\r\n }\r\n\r\n info(message: string, option?: NotifyOption) {\r\n this.#addImmediate('info', message, option);\r\n }\r\n\r\n warning(message: string | string[], option?: NotifyOption) {\r\n this.#addToBuffer('warning', message, option);\r\n }\r\n\r\n error(message: string | string[], option?: NotifyOption) {\r\n this.#addToBuffer('error', message, option);\r\n }\r\n\r\n remove(id: string) {\r\n this.toasts.update((current) => current.filter((t) => t.id !== id));\r\n }\r\n\r\n clearAll() {\r\n this.toasts.set([]);\r\n this.#clearAllTimers();\r\n }\r\n\r\n clearByType(type: ToastType) {\r\n this.toasts.update((current) => current.filter((t) => t.type !== type));\r\n }\r\n\r\n // Private helpers\r\n #addImmediate(type: ToastType, message: string, option?: NotifyOption) {\r\n const newToast: ToastData = {\r\n id: SdUtilities.generateUuid(),\r\n type,\r\n message,\r\n title: option?.title,\r\n duration: option?.duration ?? this.#DEFAULT_SUCCESS_DURATION,\r\n actionLabel: option?.actionLabel,\r\n onAction: option?.onAction\r\n };\r\n\r\n this.toasts.update((current) => {\r\n const updated = [newToast, ...current];\r\n return updated.slice(0, this.#MAX_TOASTS);\r\n });\r\n }\r\n\r\n #addToBuffer(type: ToastType, message: string | string[], option?: NotifyOption) {\r\n if (!this.#buffer[type]) {\r\n this.#buffer[type] = [];\r\n }\r\n \r\n const msgs = Array.isArray(message) ? message : [message];\r\n this.#buffer[type].push(...msgs);\r\n\r\n // Clear existing timer and set new one\r\n if (this.#timers[type]) {\r\n clearTimeout(this.#timers[type]!);\r\n }\r\n\r\n this.#timers[type] = setTimeout(() => {\r\n this.#flushBuffer(type, option);\r\n }, this.#DEBOUNCE_TIME);\r\n }\r\n\r\n #flushBuffer(type: ToastType, option?: NotifyOption) {\r\n const messages = [...new Set(this.#buffer[type])];\r\n \r\n // Cleanup\r\n this.#buffer[type] = [];\r\n this.#timers[type] = null;\r\n\r\n if (messages.length === 0) return;\r\n\r\n const typeLabel = type === 'error' ? 'Error' : 'Warning';\r\n const title = option?.title ?? typeLabel;\r\n const finalTitle = messages.length > 1 ? `${title} (${messages.length})` : title;\r\n\r\n const newToast: ToastData = {\r\n id: SdUtilities.generateUuid(),\r\n type,\r\n message: messages.length === 1 ? messages[0] : messages, \r\n title: finalTitle,\r\n duration: option?.duration ?? this.#DEFAULT_BUFFERED_DURATION,\r\n actionLabel: option?.actionLabel,\r\n onAction: option?.onAction\r\n };\r\n\r\n this.toasts.update((current) => {\r\n const updated = [newToast, ...current];\r\n return updated.slice(0, this.#MAX_TOASTS);\r\n });\r\n }\r\n\r\n #clearAllTimers() {\r\n Object.values(this.#timers).forEach(timer => {\r\n if (timer) clearTimeout(timer);\r\n });\r\n this.#timers = {};\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SdNotifyService"],"mappings":"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"}
@@ -18,18 +18,19 @@
18
18
  const REGEX_EMAIL = '^(([^<>()[\\].,;:\\s@"]+(\\.[^<>()[\\].,;:\\s@"]+)*)|(".+"))@(([^<>()[\\].,;:\\s@"]+\\.)+[^<>()[\\].,;:\\s@"]{2,})$';
19
19
  const REGEX_PHONE = '^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\s./0-9]*$';
20
20
  const REGEX_PHONE_VN = '^(?:\\+84|0|84)(3[2-9]|5[2689]|7[06-9]|8[1-689]|9[0-9])\\d{7}$';
21
+ const REGEX_IDVN_OR_PASSPORT = '^(\\d{9}|\\d{12}|[A-Z]\\d{7})$';
21
22
  const isValidEmail = (value) => {
22
23
  if (!value) {
23
24
  return false;
24
25
  }
25
- const re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
26
+ const re = new RegExp(REGEX_EMAIL);
26
27
  return re.test(value);
27
28
  };
28
29
  const isValidPhone = (value) => {
29
30
  if (!value) {
30
31
  return false;
31
32
  }
32
- const re = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$/;
33
+ const re = new RegExp(REGEX_PHONE);
33
34
  return re.test(value);
34
35
  };
35
36
  const isValidCode = (value) => {
@@ -190,6 +191,7 @@ const StringUtilities = {
190
191
  REGEX_EMAIL,
191
192
  REGEX_PHONE,
192
193
  REGEX_PHONE_VN,
194
+ REGEX_IDVN_OR_PASSPORT,
193
195
  isValidEmail,
194
196
  isValidPhone,
195
197
  isValidCode,
@@ -203,7 +205,7 @@ const StringUtilities = {
203
205
  isNullOrEmpty,
204
206
  isNullOrWhiteSpace,
205
207
  convertToSnakeCaseCode,
206
- generateUniqueCode
208
+ generateUniqueCode,
207
209
  };
208
210
 
209
211
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-utilities-extensions.mjs","sources":["../../../projects/sd-angular/utilities/extensions/src/string.extension.ts","../../../projects/sd-angular/utilities/extensions/src/array.extension.ts","../../../projects/sd-angular/utilities/extensions/src/number.extension.ts","../../../projects/sd-angular/utilities/extensions/src/date.extension.ts","../../../projects/sd-angular/utilities/extensions/src/utility.extension.ts","../../../projects/sd-angular/utilities/extensions/src/color.extension.ts","../../../projects/sd-angular/utilities/extensions/sd-angular-core-utilities-extensions.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// declare global {\r\n// interface StringConstructor {\r\n// isValidEmail(value: any): boolean;\r\n// isValidPhone(value: any): boolean;\r\n// isValidCode(value: any): boolean;\r\n// changeAliasLowerCase(alias: any): string;\r\n// aliasIncludes(alias: any, searchText: any): boolean;\r\n// format(template: string, ...arr: any[]): string;\r\n// templateToDisplay(template: string, entity: any): string; // Convert theo format ${key}\r\n// encrypt(obj: any): string;\r\n// decrypt(encripted: string): any;\r\n// isNullOrEmpty(value: any): boolean;\r\n// isNullOrWhiteSpace(value: any): boolean;\r\n// }\r\n// }\r\n\r\nconst REGEX_EMAIL = '^(([^<>()[\\\\].,;:\\\\s@\"]+(\\\\.[^<>()[\\\\].,;:\\\\s@\"]+)*)|(\".+\"))@(([^<>()[\\\\].,;:\\\\s@\"]+\\\\.)+[^<>()[\\\\].,;:\\\\s@\"]{2,})$';\r\n\r\nconst REGEX_PHONE = '^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\\\s./0-9]*$';\r\n\r\nconst REGEX_PHONE_VN = '^(?:\\\\+84|0|84)(3[2-9]|5[2689]|7[06-9]|8[1-689]|9[0-9])\\\\d{7}$';\r\n\r\nconst isValidEmail = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\r\n return re.test(value);\r\n};\r\n\r\nconst isValidPhone = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\s\\./0-9]*$/;\r\n return re.test(value);\r\n};\r\n\r\nconst isValidCode = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^[a-zA-Z0-9\\@\\_\\-]{2,20}$/;\r\n return re.test(value);\r\n};\r\n\r\nconst isNullOrEmpty = (value: any) => {\r\n return value === undefined || value === null || value === '';\r\n};\r\n\r\nconst isNullOrWhiteSpace = (value: any) => {\r\n return value === undefined || value === null || typeof value !== 'string' || value.match(/^ *$/) !== null;\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: any) => {\r\n let str: string = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst aliasIncludes = (alias: any, searchText: any) => {\r\n return changeAliasLowerCase(alias).includes(changeAliasLowerCase(searchText));\r\n};\r\n\r\nconst format = (template: string, ...arr: any[]) => {\r\n for (let i = 0; i < arr.length; i++) {\r\n const regexp = new RegExp(`\\\\{${i}\\\\}`, 'gi');\r\n template = template.replace(regexp, arr[i]);\r\n }\r\n return template;\r\n};\r\n\r\n// Convert: `[${code}] ${name}` => `[Mã] Tên`;\r\nconst templateToDisplay = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return template;\r\n }\r\n const regex = /\\$\\{([A-Za-z0-9._-]*)\\}/g;\r\n const matches = template.match(regex) || [];\r\n for (const match of matches) {\r\n const key = match.slice(2, match.length - 1);\r\n if (key) {\r\n template = template.replace(match, entity?.[key] || '');\r\n }\r\n }\r\n return template;\r\n};\r\n\r\n// Convert: `${name} === \"Tên\"` => true/false;\r\nconst parseExpression = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return undefined;\r\n }\r\n const regex = /\\$\\{([A-Za-z0-9._-]*)\\}/g;\r\n const matches = template.match(regex) || [];\r\n for (const match of matches) {\r\n const key = match.slice(2, match.length - 1);\r\n if (key) {\r\n // Xử lý trong trường hợp key có định dạng a.b.c ...\r\n let val: any = entity;\r\n const strs = key.split('.');\r\n for (const str of strs) {\r\n val = val?.[str];\r\n }\r\n if (typeof val === 'string') {\r\n // Nếu là chuỗi thì thêm dấu nháy khi replace giá trị để so sánh, ví dụ 'a' === 'a'\r\n // Nếu là số hay boolean thì không cần, ví dụ 121 === 121\r\n template = template.replace(match, `'${val}'`);\r\n } else {\r\n // Nếu là object/array thì phải dùng JSON.stringify\r\n if (typeof val === 'object' && !!val) {\r\n template = template.replace(match, JSON.stringify(val) ?? `undefined`);\r\n } else {\r\n template = template.replace(match, val ?? `undefined`);\r\n }\r\n }\r\n }\r\n }\r\n if (!template) {\r\n return undefined;\r\n }\r\n try {\r\n const result = new Function('return ' + template)();\r\n return result;\r\n } catch (ex) {\r\n console.error(ex);\r\n return undefined;\r\n }\r\n};\r\n\r\nconst SALT = 'cb9f4b2a-d26c-4787-a66e-e7130ee00f95';\r\n\r\nconst encrypt = (obj: any) => {\r\n obj = JSON.stringify(obj).split('');\r\n for (let i = 0, l = obj.length; i < l; i++)\r\n if (obj[i] == '{') obj[i] = '}';\r\n else if (obj[i] == '}') obj[i] = '{';\r\n return encodeURI(SALT + obj.join(''));\r\n};\r\n\r\nconst decrypt = (encripted: string) => {\r\n encripted = decodeURI(encripted);\r\n if (SALT && encripted.indexOf(SALT) != 0) throw new Error('object cannot be decrypted');\r\n const strs = encripted.substring(SALT.length).split('');\r\n for (let i = 0, l = strs.length; i < l; i++)\r\n if (strs[i] == '{') strs[i] = '}';\r\n else if (encripted[i] == '}') strs[i] = '{';\r\n return JSON.parse(strs.join(''));\r\n};\r\n\r\n// Conver \"Đội Kỹ Thuật\" thành \"doi_ky_thuat\"\r\nconst convertToSnakeCaseCode = (name: string): string => {\r\n if (typeof name !== 'string') {\r\n throw new Error('Invalid name');\r\n }\r\n return name\r\n .normalize('NFD') // Tách dấu\r\n .replace(/[\\u0300-\\u036f]/g, '') // Xóa các dấu vừa tách\r\n .replace(/[đĐ]/g, 'd') // Quan trọng: Xử lý chữ đ/Đ thành d\r\n .trim()\r\n .replace(/[^a-zA-Z0-9]+/g, '_') // Thay ký tự đặc biệt bằng _\r\n .replace(/^_+|_+$/g, '') // Xóa _ ở đầu/cuối\r\n .toLowerCase(); // Chuyển thành chữ thường: doi_ky_thuat\r\n};\r\n\r\n/**\r\n * Tạo code duy nhất, tự động thêm suffix _n nếu bị trùng\r\n * @param name Tên cần convert\r\n * @param existingCodes Danh sách các code đã tồn tại\r\n */\r\nconst generateUniqueCode = (name: string, existingCodes: string[]): string => {\r\n // 1. Tạo base code trước\r\n const baseCode = convertToSnakeCaseCode(name);\r\n // 2. Nếu code chưa tồn tại thì trả về luôn\r\n if (!existingCodes.includes(baseCode)) {\r\n return baseCode;\r\n }\r\n // 3. Nếu trùng, bắt đầu loop để tìm index phù hợp\r\n let index = 1;\r\n let newCode = `${baseCode}_${index}`;\r\n\r\n while (existingCodes.includes(newCode)) {\r\n index++;\r\n newCode = `${baseCode}_${index}`;\r\n }\r\n return newCode;\r\n};\r\n\r\nexport const StringUtilities = {\r\n REGEX_EMAIL,\r\n REGEX_PHONE,\r\n REGEX_PHONE_VN,\r\n isValidEmail,\r\n isValidPhone,\r\n isValidCode,\r\n changeAliasLowerCase,\r\n aliasIncludes,\r\n format,\r\n templateToDisplay,\r\n parseExpression,\r\n encrypt,\r\n decrypt,\r\n isNullOrEmpty,\r\n isNullOrWhiteSpace,\r\n convertToSnakeCaseCode,\r\n generateUniqueCode\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { StringUtilities } from './string.extension';\r\n\r\n// declare global {\r\n// interface Array<T = any> {\r\n// search(searchText: string | number, fields?: (string | undefined) | (string | undefined)[], children?: string): T[];\r\n// paging(pageSize: number, page?: number): T[];\r\n// toObject(key: string): Record<string, T>;\r\n// union(key: string, ...args: T[][]): T[];\r\n// distinct(): T[];\r\n// }\r\n// interface ArrayConstructor {\r\n// search<T = any>(items: T[], searchText: string | number, fields?: (string | undefined) | (string | undefined)[]): T[];\r\n// union<T = any>(key: string, ...args: T[][]): T[];\r\n// toObject<T = any>(key: string, items: T[]): Record<string, T>;\r\n// }\r\n// }\r\n\r\nconst search = <T = any>(items: T[], searchText: any, fields?: (string | undefined) | (string | undefined)[], children?: string): T[] => {\r\n if (!searchText?.toString()) {\r\n return items;\r\n }\r\n if (!items?.length) {\r\n return items;\r\n }\r\n if (Array.isArray(fields)) {\r\n const fs = fields.filter(e => e !== undefined && e !== null && e !== '') as string[];\r\n if (!fs.length) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && fs.some(field => StringUtilities.aliasIncludes((item as any)[field], searchText))) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n }\r\n if (!fields) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && StringUtilities.aliasIncludes((item as any)[fields], searchText)) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n};\r\n\r\n// Array.prototype.search = function <T = any>(\r\n// searchText: any,\r\n// fields?: (string | undefined) | (string | undefined)[],\r\n// children?: string\r\n// ): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return search(items, searchText, fields, children);\r\n// };\r\n\r\n// Array.prototype.paging = function <T extends Record<string, any> = any>(pageSize: number, page = 0): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items.filter((_, index) => {\r\n// return index >= page * pageSize && index < (page + 1) * pageSize;\r\n// });\r\n// };\r\n\r\n// Array.prototype.toObject = function <T = any>(key: string): Record<string, T> {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items\r\n// .filter(item => item !== undefined && item !== null)\r\n// .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n// const objKey = item?.[key]?.toString();\r\n// if (typeof objKey === 'string') {\r\n// obj[objKey] = item;\r\n// }\r\n// return obj;\r\n// }, {});\r\n// };\r\n\r\n// Array.prototype.union = function <T = Record<string, any>>(key: string, ...args: T[][]) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// let results: T[] = this;\r\n// const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n// val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n// if (!args?.length) {\r\n// return results.filter(filterUnion);\r\n// }\r\n// for (const arg of args) {\r\n// if (Array.isArray(arg)) {\r\n// results = [...results, ...arg].filter(filterUnion);\r\n// }\r\n// }\r\n// return results;\r\n// };\r\n\r\n// Array.prototype.distinct = function () {\r\n// if (Array.isArray(this)) {\r\n// return [...new Set(this)];\r\n// }\r\n// return this;\r\n// };\r\n\r\nconst union = <T = unknown>(key: string, ...args: (T[] | undefined | null)[]) => {\r\n let results: T[] = [];\r\n const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n if (!args?.length) {\r\n return [];\r\n }\r\n for (const arg of args) {\r\n if (Array.isArray(arg)) {\r\n results = [...results, ...arg].filter(filterUnion);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nconst toObject = <T>(key: string, items: T[] | undefined | null): Record<string, T> => {\r\n if (!Array.isArray(items)) {\r\n return {};\r\n }\r\n return items\r\n .filter(item => item !== undefined && item !== null)\r\n .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n const objKey = item?.[key]?.toString();\r\n if (typeof objKey === 'string') {\r\n obj[objKey] = item;\r\n }\r\n return obj;\r\n }, {});\r\n};\r\n\r\nconst distinct = <T = any>(items: T[] | undefined | null) => {\r\n if (Array.isArray(items)) {\r\n return [...new Set(items)];\r\n }\r\n return [];\r\n};\r\n\r\nconst paging = <T = any>(items: T[] | undefined | null, pageSize: number, page = 0): T[] => {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n return items.filter((_, index) => {\r\n return index >= page * pageSize && index < (page + 1) * pageSize;\r\n });\r\n};\r\n\r\nexport const ArrayUtilities = {\r\n search,\r\n union,\r\n toObject,\r\n distinct,\r\n paging,\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// export {};\n\n// declare global {\n// interface NumberConstructor {\n// toVNCurrency(value: any): string | null;\n// toISO(value: any): string | null;\n// isNumber(value: any): boolean;\n// isPositiveInteger(value: any): boolean;\n// isPositiveNumber(value: any): boolean;\n// round(value: any, digits?: number): number | null;\n// }\n// }\n\nconst toVNCurrency = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toVN = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toISO = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('en-US', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst isPositiveInteger = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isPositiveNumber = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)(\\.[0-9]+$){0,1}$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isNumber = (value: any) => {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n return !Number.isNaN(+value);\n};\n\nconst round = (value: any, digits?: number): number | null => {\n digits = digits ?? 2;\n if (!NumberUtilities.isNumber(value)) {\n return null;\n }\n const val = Math.pow(10, digits);\n return Math.round(value * val) / val;\n};\n\nconst NumberUtilities = {\n toVNCurrency,\n toVN,\n toISO,\n isPositiveInteger,\n isPositiveNumber,\n isNumber,\n round,\n};\n\nexport { NumberUtilities };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { NumberUtilities } from './number.extension';\r\n\r\n// declare global {\r\n// interface Date {\r\n// begin(): Date;\r\n// end(): Date;\r\n// addMiliseconds(miliseconds: number): Date;\r\n// addHours(hours: number): Date;\r\n// addDays(days: number): Date;\r\n// addMonths(months: number): Date;\r\n// toFormat(format: string): string;\r\n// }\r\n// interface DateConstructor {\r\n// equal(date1: any, date2: any): boolean;\r\n// dayDiff(date1: any, date2: any): number | null;\r\n// monthDiff(date1: any, date2: any): number | null;\r\n// yearDiff(date1: any, date2: any): number | null;\r\n// age(date1: any, date2: any): number | null;\r\n// parseFrom(value: any, format: string): Date | null;\r\n// isDate(value: any): boolean;\r\n// toFormat(value: any, format: string): string;\r\n// addMiliseconds(value: any, miliseconds: number): Date | null;\r\n// addHours(value: any, hours: number): Date | null;\r\n// addDays(value: any, days: number): Date | null;\r\n// addMonths(value: any, months: number): Date | null;\r\n// begin(value: any): Date | null;\r\n// end(value: any): Date | null;\r\n// timeDifference(previous: any, current?: any): string;\r\n// }\r\n// }\r\n\r\nconst isDate = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n if (typeof value === 'string') {\r\n // Kiểm tra regex\r\n if (value.length < 8) {\r\n return false;\r\n } else {\r\n const date1 = value.substring(0, 10); // yyyy/MM/dd\r\n const date2 = value.substring(0, 9); // yyyy/M/dd, yyyy/MM/d\r\n const date3 = value.substring(0, 8); // yyyy/M/d\r\n const regex1 = /^(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])(-|\\/)(\\d{4})$/; // MM/dd/yyyy, MM-dd-yyyy\r\n const regex2 = /^(\\d{4})(-|\\/)(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])$/; // yyyy/MM/dd, yyyy-MM-dd\r\n const result =\r\n regex1.test(date1) || regex2.test(date1) || regex1.test(date2) || regex2.test(date2) || regex1.test(date3) || regex2.test(date3);\r\n if (result) {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n } else {\r\n return false;\r\n }\r\n }\r\n } else {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n }\r\n};\r\n\r\n// const toFormatBackup = (value: any, format: string): string => {\r\n// if (!isDate(value)) {\r\n// return '';\r\n// }\r\n// const date: Date = new Date(value);\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst toFormat = (value: any, format: string): string => {\r\n if (!isDate(value)) {\r\n return '';\r\n }\r\n\r\n const isDatePart = (type: Intl.DateTimeFormatPart['type']): type is 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' => {\r\n return type === 'year' || type === 'month' || type === 'day' || type === 'hour' || type === 'minute' || type === 'second';\r\n };\r\n\r\n const date = new Date(value);\r\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const parts = new Intl.DateTimeFormat('en-GB', {\r\n timeZone,\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n }).formatToParts(date);\r\n const map: Partial<Record<'year' | 'month' | 'day' | 'hour' | 'minute' | 'second', string>> = {};\r\n parts.forEach(part => {\r\n if (isDatePart(part.type)) {\r\n map[part.type] = part.value;\r\n }\r\n });\r\n\r\n return format\r\n .replace('yyyy', map.year ?? '')\r\n .replace('MM', map.month ?? '')\r\n .replace('dd', map.day ?? '')\r\n .replace('HH', map.hour ?? '')\r\n .replace('mm', map.minute ?? '')\r\n .replace('ss', map.second ?? '');\r\n};\r\n\r\nconst addDays = (value: any, days: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setDate(date.getDate() + days);\r\n return date;\r\n};\r\n\r\nconst addMiliseconds = (value: any, miliseconds: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n return date;\r\n};\r\n\r\nconst begin = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return new Date(toFormat(value, 'MM/dd/yyyy'));\r\n};\r\n\r\nconst end = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return addMiliseconds(begin(addDays(value, 1)), -1);\r\n};\r\n\r\nconst equal = (date1: any, date2: any) => {\r\n if (!isDate(date1) && !isDate(date2)) {\r\n return true;\r\n }\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return false;\r\n }\r\n return new Date(date1).getTime() === new Date(date2).getTime();\r\n};\r\n\r\nconst dayDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const diff = new Date(date2).getTime() - new Date(date1).getTime();\r\n return Math.floor(diff / (24 * 3600 * 1000));\r\n};\r\n\r\nconst monthDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const d1Y = date1.getFullYear();\r\n const d2Y = date2.getFullYear();\r\n const d1M = date2.getMonth();\r\n const d2M = date2.getMonth();\r\n return d2M + 12 * d2Y - (d1M + 12 * d1Y);\r\n};\r\n\r\nconst yearDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n return new Date(date2).getFullYear() - new Date(date1).getFullYear();\r\n};\r\n\r\nconst age = (date1: any, date2: any) => {\r\n const diff = monthDiff(date1, date2);\r\n if (!diff) {\r\n return null;\r\n }\r\n return NumberUtilities.round(diff / 12);\r\n};\r\n\r\nconst parseFrom = (value: any, format: string) => {\r\n if (!value) {\r\n return null;\r\n }\r\n if (!format) {\r\n return null;\r\n }\r\n value = value.toString();\r\n const dmy = format.indexOf('dd') > -1 && format.indexOf('MM') > -1 && format.indexOf('yyyy') > -1;\r\n const hms = format.indexOf('HH') > -1 || format.indexOf('mm') > -1 || format.indexOf('ss') > -1;\r\n let strDate = '';\r\n if (dmy) {\r\n const dd = value.substr(format.indexOf('dd'), 'dd'.length);\r\n const MM = value.substr(format.indexOf('MM'), 'MM'.length);\r\n const yyyy = value.substr(format.indexOf('yyyy'), 'yyyy'.length);\r\n if (+yyyy > 0 && +MM > 0 && +dd > 0) {\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n const today = new Date();\r\n const yyyy = today.getFullYear().toString();\r\n const MM = (today.getMonth() + 1).toString().padStart(2, '0');\r\n const dd = today.getDate().toString().padStart(2, '0');\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n }\r\n if (hms) {\r\n const HH = format.indexOf('HH') > -1 ? value.substr(format.indexOf('HH'), 'HH'.length) : '00';\r\n const mm = format.indexOf('mm') > -1 ? value.substr(format.indexOf('mm'), 'mm'.length) : '00';\r\n const ss = format.indexOf('ss') > -1 ? value.substr(format.indexOf('ss'), 'ss'.length) : '00';\r\n strDate += ` ${HH || '00'}:${mm || '00'}:${ss || '00'}`;\r\n }\r\n if (!isDate(strDate)) {\r\n return null;\r\n }\r\n return new Date(strDate);\r\n};\r\n\r\nconst addHours = (value: any, hours: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setHours(date.getHours() + hours);\r\n return date;\r\n};\r\n\r\nconst addMonths = (value: any, months: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMonth(date.getMonth() + months);\r\n return date;\r\n};\r\n\r\nconst timeDifference = function (previous: any, current: any = new Date()) {\r\n if (!isDate(previous)) {\r\n return '';\r\n }\r\n if (!isDate(current)) {\r\n return '';\r\n }\r\n const from = new Date(previous);\r\n const to = new Date(current);\r\n const msPerMinute = 60 * 1000;\r\n const msPerHour = msPerMinute * 60;\r\n const msPerDay = msPerHour * 24;\r\n const msPerMonth = msPerDay * 30;\r\n const msPerYear = msPerDay * 365;\r\n const elapsed = to.getTime() - from.getTime();\r\n\r\n if (elapsed < msPerMinute) {\r\n return `${Math.round(elapsed / 1000)} seconds ago`;\r\n }\r\n\r\n if (elapsed < msPerHour) {\r\n return `${Math.round(elapsed / msPerMinute)} minutes ago`;\r\n }\r\n\r\n if (elapsed < msPerDay) {\r\n return `${Math.round(elapsed / msPerHour)} hours ago`;\r\n }\r\n\r\n if (elapsed < msPerMonth) {\r\n return `${Math.round(elapsed / msPerDay)} days ago`;\r\n }\r\n\r\n if (elapsed < msPerYear) {\r\n return `${Math.round(elapsed / msPerMonth)} months ago`;\r\n }\r\n return `${Math.round(elapsed / msPerYear)} years ago`;\r\n};\r\n\r\n// Date.prototype.begin = function () {\r\n// return new Date(this.toFormat('MM/dd/yyyy'));\r\n// };\r\n\r\n// Date.prototype.end = function () {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// return date.addDays(1).begin().addMiliseconds(-1);\r\n// };\r\n\r\n// Date.prototype.addMiliseconds = function (miliseconds: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addHours = function (hours: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setHours(date.getHours() + hours);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addDays = function (days: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setDate(date.getDate() + days);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addMonths = function (months: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMonth(date.getMonth() + months);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.toFormat = function (format: string) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst DateUtilities = {\r\n equal,\r\n dayDiff,\r\n monthDiff,\r\n yearDiff,\r\n age,\r\n parseFrom,\r\n isDate,\r\n toFormat,\r\n addMiliseconds,\r\n addHours,\r\n addDays,\r\n addMonths,\r\n begin,\r\n end,\r\n timeDifference,\r\n};\r\n\r\nexport { DateUtilities };\r\n","import { DateUtilities } from './date.extension';\r\nimport { StringUtilities } from './string.extension';\r\n// interface SdUtilityContructor {\r\n// upload: (option?: {\r\n// extensions?: string[];\r\n// maxSizeInMb?: number;\r\n// validator?: (fileName: string) => string;\r\n// multiple?: boolean;\r\n// }) => Promise<File | File[] | null>;\r\n// download: (filePath: string, fileName?: string) => void;\r\n// downloadBlob: (blob: Blob, fileName?: string) => void;\r\n// changeAliasLowerCase: (alias: string) => string;\r\n// copyToClipboard: (text: string) => void;\r\n// allWithPaging: <T = any>(\r\n// func: (\r\n// pageSize: number,\r\n// pageNumber: number\r\n// ) => Promise<{\r\n// items: T[];\r\n// total: number;\r\n// }>,\r\n// defaultPageSize?: number\r\n// ) => Promise<T[]>;\r\n// isIncognito: () => Promise<boolean>;\r\n// isMobile: () => boolean;\r\n// }\r\n\r\nconst upload = (option?: { extensions?: string[]; maxSizeInMb?: number; validator?: (fileName: string) => string; multiple?: boolean }) => {\r\n const uploadId = 'U1e09c1c0-b647-437e-995e-d7a1a1b60550';\r\n const promise = new Promise<File | File[] | null>((resolve, reject) => {\r\n const body = document.getElementsByTagName('body')?.[0];\r\n if (!body) {\r\n resolve(null);\r\n return;\r\n }\r\n const existedElement = document.getElementById(uploadId);\r\n if (existedElement) {\r\n existedElement.remove();\r\n }\r\n const element = document.createElement('input');\r\n element.setAttribute('id', uploadId);\r\n element.setAttribute('type', 'file');\r\n if (option?.multiple) {\r\n element.setAttribute('multiple', '');\r\n }\r\n element.style.display = 'none';\r\n body.appendChild(element);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n element.addEventListener('change', (evt: any) => {\r\n try {\r\n const target = evt.target as DataTransfer;\r\n\r\n if (option?.multiple) {\r\n const files: File[] = [];\r\n for (const file of target.files) {\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;\r\n throw new Error(message);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n files.push(file);\r\n }\r\n resolve(files);\r\n }\r\n } else {\r\n const file = target.files.item(0);\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;\r\n throw new Error(message);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n resolve(file);\r\n }\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n element.click();\r\n });\r\n return promise;\r\n};\r\n\r\nconst generateFileName = (fileName?: string | null) => {\r\n if (!fileName) {\r\n return `file_${randomId()}`;\r\n }\r\n return fileName;\r\n};\r\n\r\nconst download = (fileOrPath: File | string | undefined | null, fileName?: string | null) => {\r\n if (!fileOrPath) {\r\n console.warn('No file or path provided for download');\r\n return;\r\n }\r\n fileName = generateFileName(fileName);\r\n if (fileOrPath instanceof File) {\r\n // Hoặc sử dụng cách thông thường:\r\n const url = URL.createObjectURL(fileOrPath);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileOrPath.name || fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url); // Giải phóng tài nguyên\r\n return;\r\n }\r\n const a = document.createElement('a');\r\n a.href = fileOrPath;\r\n if (fileOrPath.startsWith('http')) {\r\n a.target = '_blank'; // mở tab mới\r\n } else {\r\n a.download = fileName;\r\n }\r\n a.style.visibility = 'hidden';\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n return;\r\n};\r\n\r\nconst downloadBlob = (blob: Blob, fileName?: string) => {\r\n try {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n if (link.download !== undefined) {\r\n // feature detection\r\n link.download = generateFileName(fileName);\r\n link.href = url;\r\n link.style.visibility = 'hidden';\r\n document.body.appendChild(link);\r\n link.click();\r\n window.URL.revokeObjectURL(url);\r\n link.remove();\r\n }\r\n } catch (e) {\r\n console.error('BlobToSaveAs error', e);\r\n }\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: string) => {\r\n let str = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n // eslint-disable-next-line no-useless-escape\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst copyToClipboard = (text: string) => {\r\n navigator.clipboard.writeText(text);\r\n};\r\n\r\nconst allWithPaging = async <T = unknown>(\r\n func: (pageSize: number, pageNumber: number) => Promise<{ items: T[]; total: number }>,\r\n defaultPageSize?: number\r\n): Promise<T[]> => {\r\n const pageSize = defaultPageSize || 1000;\r\n let pageNumber = 0;\r\n let count = 0;\r\n let items: T[] = [];\r\n while (true) {\r\n const res = await func(pageSize, pageNumber);\r\n if (Array(res?.items) && res?.total > 0) {\r\n items = [...items, ...res.items];\r\n count += res.items.length;\r\n pageNumber++;\r\n if (count >= res.total || !res.items?.length) {\r\n return items;\r\n }\r\n } else {\r\n return [];\r\n }\r\n }\r\n};\r\n\r\nconst isIncognito = async (): Promise<boolean> => {\r\n // Chrome-based\r\n if ('storage' in navigator && 'estimate' in navigator.storage) {\r\n try {\r\n const { quota } = await navigator.storage.estimate();\r\n if (quota && quota < 120 * 1024 * 1024) return true;\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n // Safari fallback\r\n try {\r\n localStorage.setItem('__incognito_test', '1');\r\n localStorage.removeItem('__incognito_test');\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\nconst isMobile = (): boolean => {\r\n return /Mobi|Android/i.test(navigator.userAgent);\r\n};\r\n\r\nconst randomId = (prefix?: string | null): string => {\r\n const id = new Date().getTime().toString(36);\r\n if (prefix) {\r\n return `${prefix}_${id}`;\r\n }\r\n return id;\r\n};\r\n\r\nconst hash = (obj: any): string => {\r\n const json = stableStringify(obj);\r\n let hash = 0;\r\n\r\n for (let i = 0; i < json.length; i++) {\r\n hash = (hash << 5) - hash + json.charCodeAt(i);\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n\r\n return `h${Math.abs(hash)}`;\r\n};\r\n\r\n/**\r\n * Convert object to stable JSON string (keys sorted)\r\n */\r\nconst stableStringify = (obj: any): string => {\r\n if (obj === null || typeof obj !== 'object') {\r\n return JSON.stringify(obj);\r\n }\r\n\r\n if (obj instanceof File) {\r\n // Chỉ serialize các thuộc tính quan trọng của File\r\n return JSON.stringify({\r\n __type: 'File',\r\n name: obj.name,\r\n size: obj.size,\r\n type: obj.type,\r\n lastModified: obj.lastModified,\r\n });\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return `[${obj.map(stableStringify).join(',')}]`;\r\n }\r\n\r\n const keys = Object.keys(obj).sort();\r\n const keyValuePairs = keys.map(key => `\"${key}\":${stableStringify(obj[key])}`);\r\n\r\n return `{${keyValuePairs.join(',')}}`;\r\n};\r\n\r\n// Hàm `parseQueryParams` dùng để phân tích chuỗi query string (phần sau dấu `?` trên URL)\r\n// và chuyển đổi nó thành một đối tượng JavaScript với các cặp key-value.\r\nconst parseQueryParams = (queryString?: string): Record<string, string> => {\r\n const params = new URLSearchParams(queryString || '');\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Lấy địa chỉ IP public của client bằng cách gọi API bên thứ ba.\r\n */\r\nconst getClientPublicIp = async (): Promise<string | null> => {\r\n try {\r\n // Gọi đến API của ipify để lấy IP dưới dạng JSON\r\n const response = await fetch('https://api.ipify.org?format=json');\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n const data = await response.json();\r\n // Trả về địa chỉ IP\r\n return data.ip;\r\n } catch (error) {\r\n console.error('Không thể lấy địa chỉ IP:', error);\r\n return null; // Trả về null nếu có lỗi\r\n }\r\n};\r\n\r\n// var SdUtility: SdUtilityContructor = {\r\n// upload,\r\n// download,\r\n// downloadBlob,\r\n// changeAliasLowerCase,\r\n// copyToClipboard,\r\n// allWithPaging,\r\n// isIncognito,\r\n// isMobile,\r\n// };\r\n\r\n// declare global {\r\n// var SdUtility: SdUtilityContructor;\r\n// }\r\n// globalThis.SdUtility = SdUtility;\r\n\r\n// Helper function với fallback\r\nconst generateUuid = (): string => {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback cho browser cũ\r\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n}\r\n\r\nconst SdUtilities = {\r\n upload,\r\n download,\r\n downloadBlob,\r\n changeAliasLowerCase,\r\n copyToClipboard,\r\n allWithPaging,\r\n isIncognito,\r\n isMobile,\r\n randomId,\r\n hash,\r\n parseQueryParams,\r\n getClientPublicIp,\r\n generateUuid\r\n};\r\nexport { SdUtilities };\r\n","/**\r\n * Color Utilities Extension\r\n * Các tiện ích xử lý màu\r\n */\r\n\r\n/**\r\n * Chuyển đổi màu HSL sang định dạng hex\r\n * @param h - Hue (0-360)\r\n * @param s - Saturation (0-100)\r\n * @param l - Lightness (0-100)\r\n * @returns Mã màu hex\r\n */\r\nexport function hslToHex(h: number, s: number, l: number): string {\r\n // Chuyển đổi sang định dạng 0-1\r\n const hNormalized = h / 360;\r\n const sNormalized = s / 100;\r\n const lNormalized = l / 100;\r\n\r\n let r: number, g: number, b: number;\r\n\r\n if (sNormalized === 0) {\r\n // Màu xám (grayscale)\r\n r = g = b = lNormalized;\r\n } else {\r\n const hue2rgb = (p: number, q: number, t: number) => {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1/6) return p + (q - p) * 6 * t;\r\n if (t < 1/2) return q;\r\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n };\r\n\r\n const q = lNormalized < 0.5 \r\n ? lNormalized * (1 + sNormalized) \r\n : lNormalized + sNormalized - lNormalized * sNormalized;\r\n const p = 2 * lNormalized - q;\r\n\r\n r = hue2rgb(p, q, hNormalized + 1/3);\r\n g = hue2rgb(p, q, hNormalized);\r\n b = hue2rgb(p, q, hNormalized - 1/3);\r\n }\r\n\r\n // Chuyển đổi sang hex\r\n const toHex = (x: number) => {\r\n const hex = Math.round(x * 255).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/**\r\n * Chuyển đổi màu RGB sang hex\r\n * @param r - Red (0-255)\r\n * @param g - Green (0-255)\r\n * @param b - Blue (0-255)\r\n * @returns Mã màu hex\r\n */\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (x: number) => {\r\n const hex = Math.round(Math.max(0, Math.min(255, x))).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n \r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["changeAliasLowerCase"],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-utilities-extensions.mjs","sources":["../../../projects/sd-angular/utilities/extensions/src/string.extension.ts","../../../projects/sd-angular/utilities/extensions/src/array.extension.ts","../../../projects/sd-angular/utilities/extensions/src/number.extension.ts","../../../projects/sd-angular/utilities/extensions/src/date.extension.ts","../../../projects/sd-angular/utilities/extensions/src/utility.extension.ts","../../../projects/sd-angular/utilities/extensions/src/color.extension.ts","../../../projects/sd-angular/utilities/extensions/sd-angular-core-utilities-extensions.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// declare global {\r\n// interface StringConstructor {\r\n// isValidEmail(value: any): boolean;\r\n// isValidPhone(value: any): boolean;\r\n// isValidCode(value: any): boolean;\r\n// changeAliasLowerCase(alias: any): string;\r\n// aliasIncludes(alias: any, searchText: any): boolean;\r\n// format(template: string, ...arr: any[]): string;\r\n// templateToDisplay(template: string, entity: any): string; // Convert theo format ${key}\r\n// encrypt(obj: any): string;\r\n// decrypt(encripted: string): any;\r\n// isNullOrEmpty(value: any): boolean;\r\n// isNullOrWhiteSpace(value: any): boolean;\r\n// }\r\n// }\r\n\r\nconst REGEX_EMAIL = '^(([^<>()[\\\\].,;:\\\\s@\"]+(\\\\.[^<>()[\\\\].,;:\\\\s@\"]+)*)|(\".+\"))@(([^<>()[\\\\].,;:\\\\s@\"]+\\\\.)+[^<>()[\\\\].,;:\\\\s@\"]{2,})$';\r\n\r\nconst REGEX_PHONE = '^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\\\s./0-9]*$';\r\n\r\nconst REGEX_PHONE_VN = '^(?:\\\\+84|0|84)(3[2-9]|5[2689]|7[06-9]|8[1-689]|9[0-9])\\\\d{7}$';\r\n\r\nconst REGEX_IDVN_OR_PASSPORT = '^(\\\\d{9}|\\\\d{12}|[A-Z]\\\\d{7})$';\r\n\r\nconst isValidEmail = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = new RegExp(REGEX_EMAIL);\r\n return re.test(value);\r\n};\r\n\r\nconst isValidPhone = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = new RegExp(REGEX_PHONE);\r\n return re.test(value);\r\n};\r\n\r\nconst isValidCode = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n const re = /^[a-zA-Z0-9\\@\\_\\-]{2,20}$/;\r\n return re.test(value);\r\n};\r\n\r\nconst isNullOrEmpty = (value: any) => {\r\n return value === undefined || value === null || value === '';\r\n};\r\n\r\nconst isNullOrWhiteSpace = (value: any) => {\r\n return value === undefined || value === null || typeof value !== 'string' || value.match(/^ *$/) !== null;\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: any) => {\r\n let str: string = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst aliasIncludes = (alias: any, searchText: any) => {\r\n return changeAliasLowerCase(alias).includes(changeAliasLowerCase(searchText));\r\n};\r\n\r\nconst format = (template: string, ...arr: any[]) => {\r\n for (let i = 0; i < arr.length; i++) {\r\n const regexp = new RegExp(`\\\\{${i}\\\\}`, 'gi');\r\n template = template.replace(regexp, arr[i]);\r\n }\r\n return template;\r\n};\r\n\r\n// Convert: `[${code}] ${name}` => `[Mã] Tên`;\r\nconst templateToDisplay = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return template;\r\n }\r\n const regex = /\\$\\{([A-Za-z0-9._-]*)\\}/g;\r\n const matches = template.match(regex) || [];\r\n for (const match of matches) {\r\n const key = match.slice(2, match.length - 1);\r\n if (key) {\r\n template = template.replace(match, entity?.[key] || '');\r\n }\r\n }\r\n return template;\r\n};\r\n\r\n// Convert: `${name} === \"Tên\"` => true/false;\r\nconst parseExpression = (template: string, entity: Record<string, any>) => {\r\n if (!template) {\r\n return undefined;\r\n }\r\n const regex = /\\$\\{([A-Za-z0-9._-]*)\\}/g;\r\n const matches = template.match(regex) || [];\r\n for (const match of matches) {\r\n const key = match.slice(2, match.length - 1);\r\n if (key) {\r\n // Xử lý trong trường hợp key có định dạng a.b.c ...\r\n let val: any = entity;\r\n const strs = key.split('.');\r\n for (const str of strs) {\r\n val = val?.[str];\r\n }\r\n if (typeof val === 'string') {\r\n // Nếu là chuỗi thì thêm dấu nháy khi replace giá trị để so sánh, ví dụ 'a' === 'a'\r\n // Nếu là số hay boolean thì không cần, ví dụ 121 === 121\r\n template = template.replace(match, `'${val}'`);\r\n } else {\r\n // Nếu là object/array thì phải dùng JSON.stringify\r\n if (typeof val === 'object' && !!val) {\r\n template = template.replace(match, JSON.stringify(val) ?? `undefined`);\r\n } else {\r\n template = template.replace(match, val ?? `undefined`);\r\n }\r\n }\r\n }\r\n }\r\n if (!template) {\r\n return undefined;\r\n }\r\n try {\r\n const result = new Function('return ' + template)();\r\n return result;\r\n } catch (ex) {\r\n console.error(ex);\r\n return undefined;\r\n }\r\n};\r\n\r\nconst SALT = 'cb9f4b2a-d26c-4787-a66e-e7130ee00f95';\r\n\r\nconst encrypt = (obj: any) => {\r\n obj = JSON.stringify(obj).split('');\r\n for (let i = 0, l = obj.length; i < l; i++)\r\n if (obj[i] == '{') obj[i] = '}';\r\n else if (obj[i] == '}') obj[i] = '{';\r\n return encodeURI(SALT + obj.join(''));\r\n};\r\n\r\nconst decrypt = (encripted: string) => {\r\n encripted = decodeURI(encripted);\r\n if (SALT && encripted.indexOf(SALT) != 0) throw new Error('object cannot be decrypted');\r\n const strs = encripted.substring(SALT.length).split('');\r\n for (let i = 0, l = strs.length; i < l; i++)\r\n if (strs[i] == '{') strs[i] = '}';\r\n else if (encripted[i] == '}') strs[i] = '{';\r\n return JSON.parse(strs.join(''));\r\n};\r\n\r\n// Conver \"Đội Kỹ Thuật\" thành \"doi_ky_thuat\"\r\nconst convertToSnakeCaseCode = (name: string): string => {\r\n if (typeof name !== 'string') {\r\n throw new Error('Invalid name');\r\n }\r\n return name\r\n .normalize('NFD') // Tách dấu\r\n .replace(/[\\u0300-\\u036f]/g, '') // Xóa các dấu vừa tách\r\n .replace(/[đĐ]/g, 'd') // Quan trọng: Xử lý chữ đ/Đ thành d\r\n .trim()\r\n .replace(/[^a-zA-Z0-9]+/g, '_') // Thay ký tự đặc biệt bằng _\r\n .replace(/^_+|_+$/g, '') // Xóa _ ở đầu/cuối\r\n .toLowerCase(); // Chuyển thành chữ thường: doi_ky_thuat\r\n};\r\n\r\n/**\r\n * Tạo code duy nhất, tự động thêm suffix _n nếu bị trùng\r\n * @param name Tên cần convert\r\n * @param existingCodes Danh sách các code đã tồn tại\r\n */\r\nconst generateUniqueCode = (name: string, existingCodes: string[]): string => {\r\n // 1. Tạo base code trước\r\n const baseCode = convertToSnakeCaseCode(name);\r\n // 2. Nếu code chưa tồn tại thì trả về luôn\r\n if (!existingCodes.includes(baseCode)) {\r\n return baseCode;\r\n }\r\n // 3. Nếu trùng, bắt đầu loop để tìm index phù hợp\r\n let index = 1;\r\n let newCode = `${baseCode}_${index}`;\r\n\r\n while (existingCodes.includes(newCode)) {\r\n index++;\r\n newCode = `${baseCode}_${index}`;\r\n }\r\n return newCode;\r\n};\r\n\r\nexport const StringUtilities = {\r\n REGEX_EMAIL,\r\n REGEX_PHONE,\r\n REGEX_PHONE_VN,\r\n REGEX_IDVN_OR_PASSPORT,\r\n isValidEmail,\r\n isValidPhone,\r\n isValidCode,\r\n changeAliasLowerCase,\r\n aliasIncludes,\r\n format,\r\n templateToDisplay,\r\n parseExpression,\r\n encrypt,\r\n decrypt,\r\n isNullOrEmpty,\r\n isNullOrWhiteSpace,\r\n convertToSnakeCaseCode,\r\n generateUniqueCode,\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { StringUtilities } from './string.extension';\r\n\r\n// declare global {\r\n// interface Array<T = any> {\r\n// search(searchText: string | number, fields?: (string | undefined) | (string | undefined)[], children?: string): T[];\r\n// paging(pageSize: number, page?: number): T[];\r\n// toObject(key: string): Record<string, T>;\r\n// union(key: string, ...args: T[][]): T[];\r\n// distinct(): T[];\r\n// }\r\n// interface ArrayConstructor {\r\n// search<T = any>(items: T[], searchText: string | number, fields?: (string | undefined) | (string | undefined)[]): T[];\r\n// union<T = any>(key: string, ...args: T[][]): T[];\r\n// toObject<T = any>(key: string, items: T[]): Record<string, T>;\r\n// }\r\n// }\r\n\r\nconst search = <T = any>(items: T[], searchText: any, fields?: (string | undefined) | (string | undefined)[], children?: string): T[] => {\r\n if (!searchText?.toString()) {\r\n return items;\r\n }\r\n if (!items?.length) {\r\n return items;\r\n }\r\n if (Array.isArray(fields)) {\r\n const fs = fields.filter(e => e !== undefined && e !== null && e !== '') as string[];\r\n if (!fs.length) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && fs.some(field => StringUtilities.aliasIncludes((item as any)[field], searchText))) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n }\r\n if (!fields) {\r\n return items.filter(item => item !== undefined && item !== null && StringUtilities.aliasIncludes(item, searchText));\r\n }\r\n return items.filter(\r\n item =>\r\n (item !== undefined && item !== null && StringUtilities.aliasIncludes((item as any)[fields], searchText)) ||\r\n (children && search((item as any)[children], searchText, fields, children)?.length)\r\n );\r\n};\r\n\r\n// Array.prototype.search = function <T = any>(\r\n// searchText: any,\r\n// fields?: (string | undefined) | (string | undefined)[],\r\n// children?: string\r\n// ): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return search(items, searchText, fields, children);\r\n// };\r\n\r\n// Array.prototype.paging = function <T extends Record<string, any> = any>(pageSize: number, page = 0): T[] {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items.filter((_, index) => {\r\n// return index >= page * pageSize && index < (page + 1) * pageSize;\r\n// });\r\n// };\r\n\r\n// Array.prototype.toObject = function <T = any>(key: string): Record<string, T> {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const items: T[] = this;\r\n// return items\r\n// .filter(item => item !== undefined && item !== null)\r\n// .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n// const objKey = item?.[key]?.toString();\r\n// if (typeof objKey === 'string') {\r\n// obj[objKey] = item;\r\n// }\r\n// return obj;\r\n// }, {});\r\n// };\r\n\r\n// Array.prototype.union = function <T = Record<string, any>>(key: string, ...args: T[][]) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// let results: T[] = this;\r\n// const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n// val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n// if (!args?.length) {\r\n// return results.filter(filterUnion);\r\n// }\r\n// for (const arg of args) {\r\n// if (Array.isArray(arg)) {\r\n// results = [...results, ...arg].filter(filterUnion);\r\n// }\r\n// }\r\n// return results;\r\n// };\r\n\r\n// Array.prototype.distinct = function () {\r\n// if (Array.isArray(this)) {\r\n// return [...new Set(this)];\r\n// }\r\n// return this;\r\n// };\r\n\r\nconst union = <T = unknown>(key: string, ...args: (T[] | undefined | null)[]) => {\r\n let results: T[] = [];\r\n const filterUnion = <T = any>(val: T, index: number, self: T[]) =>\r\n val !== undefined && val !== null && self.findIndex(e => (e as any)[key] === (val as any)[key]) === index;\r\n if (!args?.length) {\r\n return [];\r\n }\r\n for (const arg of args) {\r\n if (Array.isArray(arg)) {\r\n results = [...results, ...arg].filter(filterUnion);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nconst toObject = <T>(key: string, items: T[] | undefined | null): Record<string, T> => {\r\n if (!Array.isArray(items)) {\r\n return {};\r\n }\r\n return items\r\n .filter(item => item !== undefined && item !== null)\r\n .reduce<Record<string, any>>((obj, item: Record<string, any>) => {\r\n const objKey = item?.[key]?.toString();\r\n if (typeof objKey === 'string') {\r\n obj[objKey] = item;\r\n }\r\n return obj;\r\n }, {});\r\n};\r\n\r\nconst distinct = <T = any>(items: T[] | undefined | null) => {\r\n if (Array.isArray(items)) {\r\n return [...new Set(items)];\r\n }\r\n return [];\r\n};\r\n\r\nconst paging = <T = any>(items: T[] | undefined | null, pageSize: number, page = 0): T[] => {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n return items.filter((_, index) => {\r\n return index >= page * pageSize && index < (page + 1) * pageSize;\r\n });\r\n};\r\n\r\nexport const ArrayUtilities = {\r\n search,\r\n union,\r\n toObject,\r\n distinct,\r\n paging,\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// export {};\n\n// declare global {\n// interface NumberConstructor {\n// toVNCurrency(value: any): string | null;\n// toISO(value: any): string | null;\n// isNumber(value: any): boolean;\n// isPositiveInteger(value: any): boolean;\n// isPositiveNumber(value: any): boolean;\n// round(value: any, digits?: number): number | null;\n// }\n// }\n\nconst toVNCurrency = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toVN = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('vi-VN', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst toISO = (value: any) => {\n value = (value ?? '').toString().replace(/,/g, '');\n if (!value) {\n return null;\n }\n const val = +value;\n if (!Number.isNaN(val)) {\n return val.toLocaleString('en-US', { maximumFractionDigits: 10 });\n }\n return null;\n};\n\nconst isPositiveInteger = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isPositiveNumber = (value: any) => {\n if (!value) {\n return false;\n }\n const regex = /^([0-9]*)(\\.[0-9]+$){0,1}$/;\n return regex.test(value) && +value > 0;\n};\n\nconst isNumber = (value: any) => {\n if (value === undefined || value === null || value === '') {\n return false;\n }\n return !Number.isNaN(+value);\n};\n\nconst round = (value: any, digits?: number): number | null => {\n digits = digits ?? 2;\n if (!NumberUtilities.isNumber(value)) {\n return null;\n }\n const val = Math.pow(10, digits);\n return Math.round(value * val) / val;\n};\n\nconst NumberUtilities = {\n toVNCurrency,\n toVN,\n toISO,\n isPositiveInteger,\n isPositiveNumber,\n isNumber,\n round,\n};\n\nexport { NumberUtilities };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// export {};\r\n\r\nimport { NumberUtilities } from './number.extension';\r\n\r\n// declare global {\r\n// interface Date {\r\n// begin(): Date;\r\n// end(): Date;\r\n// addMiliseconds(miliseconds: number): Date;\r\n// addHours(hours: number): Date;\r\n// addDays(days: number): Date;\r\n// addMonths(months: number): Date;\r\n// toFormat(format: string): string;\r\n// }\r\n// interface DateConstructor {\r\n// equal(date1: any, date2: any): boolean;\r\n// dayDiff(date1: any, date2: any): number | null;\r\n// monthDiff(date1: any, date2: any): number | null;\r\n// yearDiff(date1: any, date2: any): number | null;\r\n// age(date1: any, date2: any): number | null;\r\n// parseFrom(value: any, format: string): Date | null;\r\n// isDate(value: any): boolean;\r\n// toFormat(value: any, format: string): string;\r\n// addMiliseconds(value: any, miliseconds: number): Date | null;\r\n// addHours(value: any, hours: number): Date | null;\r\n// addDays(value: any, days: number): Date | null;\r\n// addMonths(value: any, months: number): Date | null;\r\n// begin(value: any): Date | null;\r\n// end(value: any): Date | null;\r\n// timeDifference(previous: any, current?: any): string;\r\n// }\r\n// }\r\n\r\nconst isDate = (value: any) => {\r\n if (!value) {\r\n return false;\r\n }\r\n if (typeof value === 'string') {\r\n // Kiểm tra regex\r\n if (value.length < 8) {\r\n return false;\r\n } else {\r\n const date1 = value.substring(0, 10); // yyyy/MM/dd\r\n const date2 = value.substring(0, 9); // yyyy/M/dd, yyyy/MM/d\r\n const date3 = value.substring(0, 8); // yyyy/M/d\r\n const regex1 = /^(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])(-|\\/)(\\d{4})$/; // MM/dd/yyyy, MM-dd-yyyy\r\n const regex2 = /^(\\d{4})(-|\\/)(0[1-9]|[1-9]|1[0-2])(-|\\/)(0[1-9]|[1-9]|[12][0-9]|3[01])$/; // yyyy/MM/dd, yyyy-MM-dd\r\n const result =\r\n regex1.test(date1) || regex2.test(date1) || regex1.test(date2) || regex2.test(date2) || regex1.test(date3) || regex2.test(date3);\r\n if (result) {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n } else {\r\n return false;\r\n }\r\n }\r\n } else {\r\n const date = new Date(value);\r\n return !isNaN(date.getTime());\r\n }\r\n};\r\n\r\n// const toFormatBackup = (value: any, format: string): string => {\r\n// if (!isDate(value)) {\r\n// return '';\r\n// }\r\n// const date: Date = new Date(value);\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst toFormat = (value: any, format: string): string => {\r\n if (!isDate(value)) {\r\n return '';\r\n }\r\n\r\n const isDatePart = (type: Intl.DateTimeFormatPart['type']): type is 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' => {\r\n return type === 'year' || type === 'month' || type === 'day' || type === 'hour' || type === 'minute' || type === 'second';\r\n };\r\n\r\n const date = new Date(value);\r\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n const parts = new Intl.DateTimeFormat('en-GB', {\r\n timeZone,\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n }).formatToParts(date);\r\n const map: Partial<Record<'year' | 'month' | 'day' | 'hour' | 'minute' | 'second', string>> = {};\r\n parts.forEach(part => {\r\n if (isDatePart(part.type)) {\r\n map[part.type] = part.value;\r\n }\r\n });\r\n\r\n return format\r\n .replace('yyyy', map.year ?? '')\r\n .replace('MM', map.month ?? '')\r\n .replace('dd', map.day ?? '')\r\n .replace('HH', map.hour ?? '')\r\n .replace('mm', map.minute ?? '')\r\n .replace('ss', map.second ?? '');\r\n};\r\n\r\nconst addDays = (value: any, days: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setDate(date.getDate() + days);\r\n return date;\r\n};\r\n\r\nconst addMiliseconds = (value: any, miliseconds: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n return date;\r\n};\r\n\r\nconst begin = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return new Date(toFormat(value, 'MM/dd/yyyy'));\r\n};\r\n\r\nconst end = (value: any): Date | null => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n return addMiliseconds(begin(addDays(value, 1)), -1);\r\n};\r\n\r\nconst equal = (date1: any, date2: any) => {\r\n if (!isDate(date1) && !isDate(date2)) {\r\n return true;\r\n }\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return false;\r\n }\r\n return new Date(date1).getTime() === new Date(date2).getTime();\r\n};\r\n\r\nconst dayDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const diff = new Date(date2).getTime() - new Date(date1).getTime();\r\n return Math.floor(diff / (24 * 3600 * 1000));\r\n};\r\n\r\nconst monthDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n const d1Y = date1.getFullYear();\r\n const d2Y = date2.getFullYear();\r\n const d1M = date2.getMonth();\r\n const d2M = date2.getMonth();\r\n return d2M + 12 * d2Y - (d1M + 12 * d1Y);\r\n};\r\n\r\nconst yearDiff = (date1: any, date2: any) => {\r\n if (!isDate(date1) || !isDate(date2)) {\r\n return null;\r\n }\r\n return new Date(date2).getFullYear() - new Date(date1).getFullYear();\r\n};\r\n\r\nconst age = (date1: any, date2: any) => {\r\n const diff = monthDiff(date1, date2);\r\n if (!diff) {\r\n return null;\r\n }\r\n return NumberUtilities.round(diff / 12);\r\n};\r\n\r\nconst parseFrom = (value: any, format: string) => {\r\n if (!value) {\r\n return null;\r\n }\r\n if (!format) {\r\n return null;\r\n }\r\n value = value.toString();\r\n const dmy = format.indexOf('dd') > -1 && format.indexOf('MM') > -1 && format.indexOf('yyyy') > -1;\r\n const hms = format.indexOf('HH') > -1 || format.indexOf('mm') > -1 || format.indexOf('ss') > -1;\r\n let strDate = '';\r\n if (dmy) {\r\n const dd = value.substr(format.indexOf('dd'), 'dd'.length);\r\n const MM = value.substr(format.indexOf('MM'), 'MM'.length);\r\n const yyyy = value.substr(format.indexOf('yyyy'), 'yyyy'.length);\r\n if (+yyyy > 0 && +MM > 0 && +dd > 0) {\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n const today = new Date();\r\n const yyyy = today.getFullYear().toString();\r\n const MM = (today.getMonth() + 1).toString().padStart(2, '0');\r\n const dd = today.getDate().toString().padStart(2, '0');\r\n strDate += `${MM}/${dd}/${yyyy}`;\r\n }\r\n if (hms) {\r\n const HH = format.indexOf('HH') > -1 ? value.substr(format.indexOf('HH'), 'HH'.length) : '00';\r\n const mm = format.indexOf('mm') > -1 ? value.substr(format.indexOf('mm'), 'mm'.length) : '00';\r\n const ss = format.indexOf('ss') > -1 ? value.substr(format.indexOf('ss'), 'ss'.length) : '00';\r\n strDate += ` ${HH || '00'}:${mm || '00'}:${ss || '00'}`;\r\n }\r\n if (!isDate(strDate)) {\r\n return null;\r\n }\r\n return new Date(strDate);\r\n};\r\n\r\nconst addHours = (value: any, hours: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setHours(date.getHours() + hours);\r\n return date;\r\n};\r\n\r\nconst addMonths = (value: any, months: number) => {\r\n if (!isDate(value)) {\r\n return null;\r\n }\r\n const date: Date = new Date(value);\r\n date.setMonth(date.getMonth() + months);\r\n return date;\r\n};\r\n\r\nconst timeDifference = function (previous: any, current: any = new Date()) {\r\n if (!isDate(previous)) {\r\n return '';\r\n }\r\n if (!isDate(current)) {\r\n return '';\r\n }\r\n const from = new Date(previous);\r\n const to = new Date(current);\r\n const msPerMinute = 60 * 1000;\r\n const msPerHour = msPerMinute * 60;\r\n const msPerDay = msPerHour * 24;\r\n const msPerMonth = msPerDay * 30;\r\n const msPerYear = msPerDay * 365;\r\n const elapsed = to.getTime() - from.getTime();\r\n\r\n if (elapsed < msPerMinute) {\r\n return `${Math.round(elapsed / 1000)} seconds ago`;\r\n }\r\n\r\n if (elapsed < msPerHour) {\r\n return `${Math.round(elapsed / msPerMinute)} minutes ago`;\r\n }\r\n\r\n if (elapsed < msPerDay) {\r\n return `${Math.round(elapsed / msPerHour)} hours ago`;\r\n }\r\n\r\n if (elapsed < msPerMonth) {\r\n return `${Math.round(elapsed / msPerDay)} days ago`;\r\n }\r\n\r\n if (elapsed < msPerYear) {\r\n return `${Math.round(elapsed / msPerMonth)} months ago`;\r\n }\r\n return `${Math.round(elapsed / msPerYear)} years ago`;\r\n};\r\n\r\n// Date.prototype.begin = function () {\r\n// return new Date(this.toFormat('MM/dd/yyyy'));\r\n// };\r\n\r\n// Date.prototype.end = function () {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// return date.addDays(1).begin().addMiliseconds(-1);\r\n// };\r\n\r\n// Date.prototype.addMiliseconds = function (miliseconds: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMilliseconds(date.getMilliseconds() + miliseconds);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addHours = function (hours: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setHours(date.getHours() + hours);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addDays = function (days: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setDate(date.getDate() + days);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.addMonths = function (months: number) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// date.setMonth(date.getMonth() + months);\r\n// return date;\r\n// };\r\n\r\n// Date.prototype.toFormat = function (format: string) {\r\n// // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n// const date: Date = this;\r\n// let result = format;\r\n// result = result.replace('yyyy', date.getFullYear().toString());\r\n// result = result.replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'));\r\n// result = result.replace('dd', date.getDate().toString().padStart(2, '0'));\r\n// result = result.replace('HH', date.getHours().toString().padStart(2, '0'));\r\n// result = result.replace('mm', date.getMinutes().toString().padStart(2, '0'));\r\n// result = result.replace('ss', date.getSeconds().toString().padStart(2, '0'));\r\n// return result;\r\n// };\r\n\r\nconst DateUtilities = {\r\n equal,\r\n dayDiff,\r\n monthDiff,\r\n yearDiff,\r\n age,\r\n parseFrom,\r\n isDate,\r\n toFormat,\r\n addMiliseconds,\r\n addHours,\r\n addDays,\r\n addMonths,\r\n begin,\r\n end,\r\n timeDifference,\r\n};\r\n\r\nexport { DateUtilities };\r\n","import { DateUtilities } from './date.extension';\r\nimport { StringUtilities } from './string.extension';\r\n// interface SdUtilityContructor {\r\n// upload: (option?: {\r\n// extensions?: string[];\r\n// maxSizeInMb?: number;\r\n// validator?: (fileName: string) => string;\r\n// multiple?: boolean;\r\n// }) => Promise<File | File[] | null>;\r\n// download: (filePath: string, fileName?: string) => void;\r\n// downloadBlob: (blob: Blob, fileName?: string) => void;\r\n// changeAliasLowerCase: (alias: string) => string;\r\n// copyToClipboard: (text: string) => void;\r\n// allWithPaging: <T = any>(\r\n// func: (\r\n// pageSize: number,\r\n// pageNumber: number\r\n// ) => Promise<{\r\n// items: T[];\r\n// total: number;\r\n// }>,\r\n// defaultPageSize?: number\r\n// ) => Promise<T[]>;\r\n// isIncognito: () => Promise<boolean>;\r\n// isMobile: () => boolean;\r\n// }\r\n\r\nconst upload = (option?: { extensions?: string[]; maxSizeInMb?: number; validator?: (fileName: string) => string; multiple?: boolean }) => {\r\n const uploadId = 'U1e09c1c0-b647-437e-995e-d7a1a1b60550';\r\n const promise = new Promise<File | File[] | null>((resolve, reject) => {\r\n const body = document.getElementsByTagName('body')?.[0];\r\n if (!body) {\r\n resolve(null);\r\n return;\r\n }\r\n const existedElement = document.getElementById(uploadId);\r\n if (existedElement) {\r\n existedElement.remove();\r\n }\r\n const element = document.createElement('input');\r\n element.setAttribute('id', uploadId);\r\n element.setAttribute('type', 'file');\r\n if (option?.multiple) {\r\n element.setAttribute('multiple', '');\r\n }\r\n element.style.display = 'none';\r\n body.appendChild(element);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n element.addEventListener('change', (evt: any) => {\r\n try {\r\n const target = evt.target as DataTransfer;\r\n\r\n if (option?.multiple) {\r\n const files: File[] = [];\r\n for (const file of target.files) {\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;\r\n throw new Error(message);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n files.push(file);\r\n }\r\n resolve(files);\r\n }\r\n } else {\r\n const file = target.files.item(0);\r\n if (file) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n const extension = file.name.substring(lastDot + 1);\r\n if (option) {\r\n if (option.extensions?.length && !option.extensions.some(e => e.toLowerCase() === extension.toLowerCase())) {\r\n throw new Error(`[${file.name}] File tải lên không đúng định dạng. Vui lòng chọn lại`);\r\n }\r\n if (option.maxSizeInMb && option.maxSizeInMb > 0 && option.maxSizeInMb * 1024 * 1024 < file.size) {\r\n const message = `[${file.name}] Kích thước file không hợp lệ. Vui lòng chọn một file khác`;\r\n throw new Error(message);\r\n }\r\n if (option.validator && option.validator(file.name)) {\r\n const message = option.validator(file.name);\r\n throw new Error(message);\r\n }\r\n }\r\n resolve(file);\r\n }\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n element.click();\r\n });\r\n return promise;\r\n};\r\n\r\nconst generateFileName = (fileName?: string | null) => {\r\n if (!fileName) {\r\n return `file_${randomId()}`;\r\n }\r\n return fileName;\r\n};\r\n\r\nconst download = (fileOrPath: File | string | undefined | null, fileName?: string | null) => {\r\n if (!fileOrPath) {\r\n console.warn('No file or path provided for download');\r\n return;\r\n }\r\n fileName = generateFileName(fileName);\r\n if (fileOrPath instanceof File) {\r\n // Hoặc sử dụng cách thông thường:\r\n const url = URL.createObjectURL(fileOrPath);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileOrPath.name || fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url); // Giải phóng tài nguyên\r\n return;\r\n }\r\n const a = document.createElement('a');\r\n a.href = fileOrPath;\r\n if (fileOrPath.startsWith('http')) {\r\n a.target = '_blank'; // mở tab mới\r\n } else {\r\n a.download = fileName;\r\n }\r\n a.style.visibility = 'hidden';\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n return;\r\n};\r\n\r\nconst downloadBlob = (blob: Blob, fileName?: string) => {\r\n try {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n if (link.download !== undefined) {\r\n // feature detection\r\n link.download = generateFileName(fileName);\r\n link.href = url;\r\n link.style.visibility = 'hidden';\r\n document.body.appendChild(link);\r\n link.click();\r\n window.URL.revokeObjectURL(url);\r\n link.remove();\r\n }\r\n } catch (e) {\r\n console.error('BlobToSaveAs error', e);\r\n }\r\n};\r\n\r\nconst changeAliasLowerCase = (alias: string) => {\r\n let str = alias?.toString() ?? '';\r\n str = str.toString().toLowerCase();\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');\r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e');\r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');\r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');\r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');\r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');\r\n str = str.replace(/đ/g, 'd');\r\n // eslint-disable-next-line no-useless-escape\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, ' ');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n};\r\n\r\nconst copyToClipboard = (text: string) => {\r\n navigator.clipboard.writeText(text);\r\n};\r\n\r\nconst allWithPaging = async <T = unknown>(\r\n func: (pageSize: number, pageNumber: number) => Promise<{ items: T[]; total: number }>,\r\n defaultPageSize?: number\r\n): Promise<T[]> => {\r\n const pageSize = defaultPageSize || 1000;\r\n let pageNumber = 0;\r\n let count = 0;\r\n let items: T[] = [];\r\n while (true) {\r\n const res = await func(pageSize, pageNumber);\r\n if (Array(res?.items) && res?.total > 0) {\r\n items = [...items, ...res.items];\r\n count += res.items.length;\r\n pageNumber++;\r\n if (count >= res.total || !res.items?.length) {\r\n return items;\r\n }\r\n } else {\r\n return [];\r\n }\r\n }\r\n};\r\n\r\nconst isIncognito = async (): Promise<boolean> => {\r\n // Chrome-based\r\n if ('storage' in navigator && 'estimate' in navigator.storage) {\r\n try {\r\n const { quota } = await navigator.storage.estimate();\r\n if (quota && quota < 120 * 1024 * 1024) return true;\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n // Safari fallback\r\n try {\r\n localStorage.setItem('__incognito_test', '1');\r\n localStorage.removeItem('__incognito_test');\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\nconst isMobile = (): boolean => {\r\n return /Mobi|Android/i.test(navigator.userAgent);\r\n};\r\n\r\nconst randomId = (prefix?: string | null): string => {\r\n const id = new Date().getTime().toString(36);\r\n if (prefix) {\r\n return `${prefix}_${id}`;\r\n }\r\n return id;\r\n};\r\n\r\nconst hash = (obj: any): string => {\r\n const json = stableStringify(obj);\r\n let hash = 0;\r\n\r\n for (let i = 0; i < json.length; i++) {\r\n hash = (hash << 5) - hash + json.charCodeAt(i);\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n\r\n return `h${Math.abs(hash)}`;\r\n};\r\n\r\n/**\r\n * Convert object to stable JSON string (keys sorted)\r\n */\r\nconst stableStringify = (obj: any): string => {\r\n if (obj === null || typeof obj !== 'object') {\r\n return JSON.stringify(obj);\r\n }\r\n\r\n if (obj instanceof File) {\r\n // Chỉ serialize các thuộc tính quan trọng của File\r\n return JSON.stringify({\r\n __type: 'File',\r\n name: obj.name,\r\n size: obj.size,\r\n type: obj.type,\r\n lastModified: obj.lastModified,\r\n });\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return `[${obj.map(stableStringify).join(',')}]`;\r\n }\r\n\r\n const keys = Object.keys(obj).sort();\r\n const keyValuePairs = keys.map(key => `\"${key}\":${stableStringify(obj[key])}`);\r\n\r\n return `{${keyValuePairs.join(',')}}`;\r\n};\r\n\r\n// Hàm `parseQueryParams` dùng để phân tích chuỗi query string (phần sau dấu `?` trên URL)\r\n// và chuyển đổi nó thành một đối tượng JavaScript với các cặp key-value.\r\nconst parseQueryParams = (queryString?: string): Record<string, string> => {\r\n const params = new URLSearchParams(queryString || '');\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Lấy địa chỉ IP public của client bằng cách gọi API bên thứ ba.\r\n */\r\nconst getClientPublicIp = async (): Promise<string | null> => {\r\n try {\r\n // Gọi đến API của ipify để lấy IP dưới dạng JSON\r\n const response = await fetch('https://api.ipify.org?format=json');\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n const data = await response.json();\r\n // Trả về địa chỉ IP\r\n return data.ip;\r\n } catch (error) {\r\n console.error('Không thể lấy địa chỉ IP:', error);\r\n return null; // Trả về null nếu có lỗi\r\n }\r\n};\r\n\r\n// var SdUtility: SdUtilityContructor = {\r\n// upload,\r\n// download,\r\n// downloadBlob,\r\n// changeAliasLowerCase,\r\n// copyToClipboard,\r\n// allWithPaging,\r\n// isIncognito,\r\n// isMobile,\r\n// };\r\n\r\n// declare global {\r\n// var SdUtility: SdUtilityContructor;\r\n// }\r\n// globalThis.SdUtility = SdUtility;\r\n\r\n// Helper function với fallback\r\nconst generateUuid = (): string => {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n // Fallback cho browser cũ\r\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n}\r\n\r\nconst SdUtilities = {\r\n upload,\r\n download,\r\n downloadBlob,\r\n changeAliasLowerCase,\r\n copyToClipboard,\r\n allWithPaging,\r\n isIncognito,\r\n isMobile,\r\n randomId,\r\n hash,\r\n parseQueryParams,\r\n getClientPublicIp,\r\n generateUuid\r\n};\r\nexport { SdUtilities };\r\n","/**\r\n * Color Utilities Extension\r\n * Các tiện ích xử lý màu\r\n */\r\n\r\n/**\r\n * Chuyển đổi màu HSL sang định dạng hex\r\n * @param h - Hue (0-360)\r\n * @param s - Saturation (0-100)\r\n * @param l - Lightness (0-100)\r\n * @returns Mã màu hex\r\n */\r\nexport function hslToHex(h: number, s: number, l: number): string {\r\n // Chuyển đổi sang định dạng 0-1\r\n const hNormalized = h / 360;\r\n const sNormalized = s / 100;\r\n const lNormalized = l / 100;\r\n\r\n let r: number, g: number, b: number;\r\n\r\n if (sNormalized === 0) {\r\n // Màu xám (grayscale)\r\n r = g = b = lNormalized;\r\n } else {\r\n const hue2rgb = (p: number, q: number, t: number) => {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1/6) return p + (q - p) * 6 * t;\r\n if (t < 1/2) return q;\r\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n };\r\n\r\n const q = lNormalized < 0.5 \r\n ? lNormalized * (1 + sNormalized) \r\n : lNormalized + sNormalized - lNormalized * sNormalized;\r\n const p = 2 * lNormalized - q;\r\n\r\n r = hue2rgb(p, q, hNormalized + 1/3);\r\n g = hue2rgb(p, q, hNormalized);\r\n b = hue2rgb(p, q, hNormalized - 1/3);\r\n }\r\n\r\n // Chuyển đổi sang hex\r\n const toHex = (x: number) => {\r\n const hex = Math.round(x * 255).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/**\r\n * Chuyển đổi màu RGB sang hex\r\n * @param r - Red (0-255)\r\n * @param g - Green (0-255)\r\n * @param b - Blue (0-255)\r\n * @returns Mã màu hex\r\n */\r\nexport function rgbToHex(r: number, g: number, b: number): string {\r\n const toHex = (x: number) => {\r\n const hex = Math.round(Math.max(0, Math.min(255, x))).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n \r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["changeAliasLowerCase"],"mappings":"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"}
@@ -20,6 +20,12 @@ const SdPatternCommons = [
20
20
  regex: StringUtilities.REGEX_PHONE_VN,
21
21
  errorMessage: 'Số điện thoại không hợp lệ',
22
22
  },
23
+ {
24
+ type: 'IDVN_OR_PASSPORT',
25
+ name: 'CCCD/Hộ chiếu',
26
+ regex: StringUtilities.REGEX_IDVN_OR_PASSPORT,
27
+ errorMessage: 'CCCD/CMND hoặc Hộ chiếu không hợp lệ',
28
+ },
23
29
  ];
24
30
 
25
31
  const SD_EMPTY_STR = '--';
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-utilities-models.mjs","sources":["../../../projects/sd-angular/utilities/models/src/pattern.model.ts","../../../projects/sd-angular/utilities/models/src/empty.model.ts","../../../projects/sd-angular/utilities/models/src/maybe-async.model.ts","../../../projects/sd-angular/utilities/models/src/operator.model.ts","../../../projects/sd-angular/utilities/models/sd-angular-core-utilities-models.ts"],"sourcesContent":["import { StringUtilities } from '@sd-angular/core/utilities/extensions';\r\n\r\nexport type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN';\r\n\r\nexport interface SdPatternCommon {\r\n type: SdPatternType;\r\n name: string;\r\n regex: string;\r\n errorMessage: string;\r\n}\r\n\r\nexport const SdPatternCommons: SdPatternCommon[] = [\r\n {\r\n type: 'EMAIL',\r\n name: 'Email',\r\n regex: StringUtilities.REGEX_EMAIL,\r\n errorMessage: 'Email không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE',\r\n name: 'SĐT',\r\n regex: StringUtilities.REGEX_PHONE,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE_VN',\r\n name: 'SĐT VN',\r\n regex: StringUtilities.REGEX_PHONE_VN,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n];\r\n","export const SD_EMPTY_STR = '--';\r\n","import { firstValueFrom, from, Observable, of } from 'rxjs';\r\n\r\nexport type SdMaybeAsync<T> = T | Promise<T> | Observable<T>;\r\n\r\nexport const SdResolveMaybeAsync = <T>(value: SdMaybeAsync<T>): Promise<T> => {\r\n if (value instanceof Promise) {\r\n return value;\r\n }\r\n if (isObservable(value)) {\r\n return firstValueFrom(value);\r\n }\r\n return Promise.resolve(value);\r\n};\r\n\r\nexport const SdNormalizeAsync = <T>(value: SdMaybeAsync<T>): Observable<T> => {\r\n if (isObservable(value)) {\r\n return value; // Nếu là Observable, giữ nguyên\r\n }\r\n if (value instanceof Promise) {\r\n return from(value); // Nếu là Promise, chuyển sang Observable\r\n }\r\n return of(value); // Nếu là giá trị thuần (Object, string...), bọc lại bằng of\r\n};\r\n\r\nfunction isObservable(obj: any): obj is Observable<any> {\r\n return obj && typeof obj.subscribe === 'function';\r\n}","export type SdOperator = SdOperatorHasData | SdOperatorNoData;\r\n\r\nexport type SdOperatorHasData =\r\n | 'EQUAL'\r\n | 'NOT_EQUAL'\r\n | 'CONTAIN'\r\n | 'NOT_CONTAIN'\r\n | 'IN'\r\n | 'NOT_IN'\r\n | 'START_WITH'\r\n | 'END_WITH'\r\n | 'GREATER_THAN'\r\n | 'LESS_THAN'\r\n | 'GREATER_OR_EQUAL'\r\n | 'LESS_OR_EQUAL'\r\n | 'BETWEEN';\r\n\r\nexport type SdOperatorNoData = 'NULL' | 'NOT_NULL';\r\n\r\nexport const SdOperators: {\r\n value: SdOperator;\r\n symbol?: string;\r\n display: string;\r\n}[] = [\r\n {\r\n value: 'EQUAL',\r\n symbol: '=',\r\n display: 'Bằng',\r\n },\r\n {\r\n value: 'NOT_EQUAL',\r\n symbol: '≠',\r\n display: 'Không bằng',\r\n },\r\n {\r\n value: 'GREATER_THAN',\r\n symbol: '>',\r\n display: 'Lớn hơn',\r\n },\r\n {\r\n value: 'LESS_THAN',\r\n symbol: '<',\r\n display: 'Nhỏ hơn',\r\n },\r\n {\r\n value: 'GREATER_OR_EQUAL',\r\n symbol: '≥',\r\n display: 'Lớn hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'LESS_OR_EQUAL',\r\n symbol: '≤',\r\n display: 'Nhỏ hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'CONTAIN',\r\n symbol: 'join_inner',\r\n display: 'Chứa',\r\n },\r\n {\r\n value: 'NOT_CONTAIN',\r\n symbol: 'join',\r\n display: 'Không chứa',\r\n },\r\n {\r\n value: 'START_WITH',\r\n symbol: 'line_start_circle',\r\n display: 'Bắt đầu bởi',\r\n },\r\n {\r\n value: 'END_WITH',\r\n symbol: 'line_end_circle',\r\n display: 'Kết thúc bởi',\r\n },\r\n {\r\n value: 'IN',\r\n symbol: 'checklist_rtl',\r\n display: 'Nằm trong',\r\n },\r\n {\r\n value: 'NOT_IN',\r\n symbol: 'event_list',\r\n display: 'Không nằm trong',\r\n },\r\n {\r\n value: 'NULL',\r\n symbol: 'motion_photos_off',\r\n display: 'Là rỗng',\r\n },\r\n {\r\n value: 'NOT_NULL',\r\n symbol: 'adjust',\r\n display: 'Không rỗng',\r\n },\r\n];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-utilities-models.mjs","sources":["../../../projects/sd-angular/utilities/models/src/pattern.model.ts","../../../projects/sd-angular/utilities/models/src/empty.model.ts","../../../projects/sd-angular/utilities/models/src/maybe-async.model.ts","../../../projects/sd-angular/utilities/models/src/operator.model.ts","../../../projects/sd-angular/utilities/models/sd-angular-core-utilities-models.ts"],"sourcesContent":["import { StringUtilities } from '@sd-angular/core/utilities/extensions';\r\n\r\nexport type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN' | 'IDVN_OR_PASSPORT';\r\n\r\nexport interface SdPatternCommon {\r\n type: SdPatternType;\r\n name: string;\r\n regex: string;\r\n errorMessage: string;\r\n}\r\n\r\nexport const SdPatternCommons: SdPatternCommon[] = [\r\n {\r\n type: 'EMAIL',\r\n name: 'Email',\r\n regex: StringUtilities.REGEX_EMAIL,\r\n errorMessage: 'Email không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE',\r\n name: 'SĐT',\r\n regex: StringUtilities.REGEX_PHONE,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n {\r\n type: 'PHONE_VN',\r\n name: 'SĐT VN',\r\n regex: StringUtilities.REGEX_PHONE_VN,\r\n errorMessage: 'Số điện thoại không hợp lệ',\r\n },\r\n {\r\n type: 'IDVN_OR_PASSPORT',\r\n name: 'CCCD/Hộ chiếu',\r\n regex: StringUtilities.REGEX_IDVN_OR_PASSPORT,\r\n errorMessage: 'CCCD/CMND hoặc Hộ chiếu không hợp lệ',\r\n },\r\n];\r\n","export const SD_EMPTY_STR = '--';\r\n","import { firstValueFrom, from, Observable, of } from 'rxjs';\r\n\r\nexport type SdMaybeAsync<T> = T | Promise<T> | Observable<T>;\r\n\r\nexport const SdResolveMaybeAsync = <T>(value: SdMaybeAsync<T>): Promise<T> => {\r\n if (value instanceof Promise) {\r\n return value;\r\n }\r\n if (isObservable(value)) {\r\n return firstValueFrom(value);\r\n }\r\n return Promise.resolve(value);\r\n};\r\n\r\nexport const SdNormalizeAsync = <T>(value: SdMaybeAsync<T>): Observable<T> => {\r\n if (isObservable(value)) {\r\n return value; // Nếu là Observable, giữ nguyên\r\n }\r\n if (value instanceof Promise) {\r\n return from(value); // Nếu là Promise, chuyển sang Observable\r\n }\r\n return of(value); // Nếu là giá trị thuần (Object, string...), bọc lại bằng of\r\n};\r\n\r\nfunction isObservable(obj: any): obj is Observable<any> {\r\n return obj && typeof obj.subscribe === 'function';\r\n}","export type SdOperator = SdOperatorHasData | SdOperatorNoData;\r\n\r\nexport type SdOperatorHasData =\r\n | 'EQUAL'\r\n | 'NOT_EQUAL'\r\n | 'CONTAIN'\r\n | 'NOT_CONTAIN'\r\n | 'IN'\r\n | 'NOT_IN'\r\n | 'START_WITH'\r\n | 'END_WITH'\r\n | 'GREATER_THAN'\r\n | 'LESS_THAN'\r\n | 'GREATER_OR_EQUAL'\r\n | 'LESS_OR_EQUAL'\r\n | 'BETWEEN';\r\n\r\nexport type SdOperatorNoData = 'NULL' | 'NOT_NULL';\r\n\r\nexport const SdOperators: {\r\n value: SdOperator;\r\n symbol?: string;\r\n display: string;\r\n}[] = [\r\n {\r\n value: 'EQUAL',\r\n symbol: '=',\r\n display: 'Bằng',\r\n },\r\n {\r\n value: 'NOT_EQUAL',\r\n symbol: '≠',\r\n display: 'Không bằng',\r\n },\r\n {\r\n value: 'GREATER_THAN',\r\n symbol: '>',\r\n display: 'Lớn hơn',\r\n },\r\n {\r\n value: 'LESS_THAN',\r\n symbol: '<',\r\n display: 'Nhỏ hơn',\r\n },\r\n {\r\n value: 'GREATER_OR_EQUAL',\r\n symbol: '≥',\r\n display: 'Lớn hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'LESS_OR_EQUAL',\r\n symbol: '≤',\r\n display: 'Nhỏ hơn, hoặc bằng',\r\n },\r\n {\r\n value: 'CONTAIN',\r\n symbol: 'join_inner',\r\n display: 'Chứa',\r\n },\r\n {\r\n value: 'NOT_CONTAIN',\r\n symbol: 'join',\r\n display: 'Không chứa',\r\n },\r\n {\r\n value: 'START_WITH',\r\n symbol: 'line_start_circle',\r\n display: 'Bắt đầu bởi',\r\n },\r\n {\r\n value: 'END_WITH',\r\n symbol: 'line_end_circle',\r\n display: 'Kết thúc bởi',\r\n },\r\n {\r\n value: 'IN',\r\n symbol: 'checklist_rtl',\r\n display: 'Nằm trong',\r\n },\r\n {\r\n value: 'NOT_IN',\r\n symbol: 'event_list',\r\n display: 'Không nằm trong',\r\n },\r\n {\r\n value: 'NULL',\r\n symbol: 'motion_photos_off',\r\n display: 'Là rỗng',\r\n },\r\n {\r\n value: 'NOT_NULL',\r\n symbol: 'adjust',\r\n display: 'Không rỗng',\r\n },\r\n];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- export * from '@sd-angular/core/modules/oidc';
2
1
  export * from '@sd-angular/core/modules/keycloak';
3
2
  export * from '@sd-angular/core/modules/permission';
4
3
  export * from '@sd-angular/core/modules/auth';
package/package.json CHANGED
@@ -1,14 +1,11 @@
1
1
  {
2
2
  "name": "@sd-angular/core",
3
- "version": "19.0.0-beta.28",
3
+ "version": "19.0.0-beta.30",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0",
6
6
  "@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0",
7
7
  "@angular/material": "^19.0.0 || ^20.0.0 || ^21.0.0",
8
- "@angular/material-moment-adapter": "^19.0.0 || ^20.0.0 || ^21.0.0",
9
- "@omer-go/docx-parser-converter-ts": "^1.0.0",
10
- "angular-auth-oidc-client": "^19.0.0 || ^20.0.0 || ^21.0.0",
11
- "mammoth": "^1.11.0"
8
+ "@angular/material-moment-adapter": "^19.0.0 || ^20.0.0 || ^21.0.0"
12
9
  },
13
10
  "dependencies": {
14
11
  "@ckeditor/ckeditor5-angular": "^11.0.0",
@@ -32,6 +29,10 @@
32
29
  "types": "./index.d.ts",
33
30
  "default": "./fesm2022/sd-angular-core.mjs"
34
31
  },
32
+ "./configurations": {
33
+ "types": "./configurations/index.d.ts",
34
+ "default": "./fesm2022/sd-angular-core-configurations.mjs"
35
+ },
35
36
  "./directives": {
36
37
  "types": "./directives/index.d.ts",
37
38
  "default": "./fesm2022/sd-angular-core-directives.mjs"
@@ -40,14 +41,6 @@
40
41
  "types": "./components/index.d.ts",
41
42
  "default": "./fesm2022/sd-angular-core-components.mjs"
42
43
  },
43
- "./configurations": {
44
- "types": "./configurations/index.d.ts",
45
- "default": "./fesm2022/sd-angular-core-configurations.mjs"
46
- },
47
- "./forms": {
48
- "types": "./forms/index.d.ts",
49
- "default": "./fesm2022/sd-angular-core-forms.mjs"
50
- },
51
44
  "./guards": {
52
45
  "types": "./guards/index.d.ts",
53
46
  "default": "./fesm2022/sd-angular-core-guards.mjs"
@@ -56,6 +49,10 @@
56
49
  "types": "./handlers/index.d.ts",
57
50
  "default": "./fesm2022/sd-angular-core-handlers.mjs"
58
51
  },
52
+ "./forms": {
53
+ "types": "./forms/index.d.ts",
54
+ "default": "./fesm2022/sd-angular-core-forms.mjs"
55
+ },
59
56
  "./interceptors": {
60
57
  "types": "./interceptors/index.d.ts",
61
58
  "default": "./fesm2022/sd-angular-core-interceptors.mjs"
@@ -104,10 +101,6 @@
104
101
  "types": "./components/document-builder/index.d.ts",
105
102
  "default": "./fesm2022/sd-angular-core-components-document-builder.mjs"
106
103
  },
107
- "./components/import-excel": {
108
- "types": "./components/import-excel/index.d.ts",
109
- "default": "./fesm2022/sd-angular-core-components-import-excel.mjs"
110
- },
111
104
  "./components/history": {
112
105
  "types": "./components/history/index.d.ts",
113
106
  "default": "./fesm2022/sd-angular-core-components-history.mjs"
@@ -116,9 +109,9 @@
116
109
  "types": "./components/modal/index.d.ts",
117
110
  "default": "./fesm2022/sd-angular-core-components-modal.mjs"
118
111
  },
119
- "./components/preview": {
120
- "types": "./components/preview/index.d.ts",
121
- "default": "./fesm2022/sd-angular-core-components-preview.mjs"
112
+ "./components/import-excel": {
113
+ "types": "./components/import-excel/index.d.ts",
114
+ "default": "./fesm2022/sd-angular-core-components-import-excel.mjs"
122
115
  },
123
116
  "./components/mini-editor": {
124
117
  "types": "./components/mini-editor/index.d.ts",
@@ -128,6 +121,10 @@
128
121
  "types": "./components/query-builder/index.d.ts",
129
122
  "default": "./fesm2022/sd-angular-core-components-query-builder.mjs"
130
123
  },
124
+ "./components/preview": {
125
+ "types": "./components/preview/index.d.ts",
126
+ "default": "./fesm2022/sd-angular-core-components-preview.mjs"
127
+ },
131
128
  "./components/quick-action": {
132
129
  "types": "./components/quick-action/index.d.ts",
133
130
  "default": "./fesm2022/sd-angular-core-components-quick-action.mjs"
@@ -152,30 +149,34 @@
152
149
  "types": "./components/workflow/index.d.ts",
153
150
  "default": "./fesm2022/sd-angular-core-components-workflow.mjs"
154
151
  },
152
+ "./guards/permission": {
153
+ "types": "./guards/permission/index.d.ts",
154
+ "default": "./fesm2022/sd-angular-core-guards-permission.mjs"
155
+ },
155
156
  "./forms/autocomplete": {
156
157
  "types": "./forms/autocomplete/index.d.ts",
157
158
  "default": "./fesm2022/sd-angular-core-forms-autocomplete.mjs"
158
159
  },
159
- "./components/upload-file": {
160
- "types": "./components/upload-file/index.d.ts",
161
- "default": "./fesm2022/sd-angular-core-components-upload-file.mjs"
162
- },
163
160
  "./forms/checkbox": {
164
161
  "types": "./forms/checkbox/index.d.ts",
165
162
  "default": "./fesm2022/sd-angular-core-forms-checkbox.mjs"
166
163
  },
164
+ "./components/upload-file": {
165
+ "types": "./components/upload-file/index.d.ts",
166
+ "default": "./fesm2022/sd-angular-core-components-upload-file.mjs"
167
+ },
167
168
  "./forms/chip": {
168
169
  "types": "./forms/chip/index.d.ts",
169
170
  "default": "./fesm2022/sd-angular-core-forms-chip.mjs"
170
171
  },
171
- "./forms/date": {
172
- "types": "./forms/date/index.d.ts",
173
- "default": "./fesm2022/sd-angular-core-forms-date.mjs"
174
- },
175
172
  "./forms/chip-calendar": {
176
173
  "types": "./forms/chip-calendar/index.d.ts",
177
174
  "default": "./fesm2022/sd-angular-core-forms-chip-calendar.mjs"
178
175
  },
176
+ "./forms/date": {
177
+ "types": "./forms/date/index.d.ts",
178
+ "default": "./fesm2022/sd-angular-core-forms-date.mjs"
179
+ },
179
180
  "./forms/date-range": {
180
181
  "types": "./forms/date-range/index.d.ts",
181
182
  "default": "./fesm2022/sd-angular-core-forms-date-range.mjs"
@@ -188,17 +189,13 @@
188
189
  "types": "./forms/directives/index.d.ts",
189
190
  "default": "./fesm2022/sd-angular-core-forms-directives.mjs"
190
191
  },
191
- "./forms/input": {
192
- "types": "./forms/input/index.d.ts",
193
- "default": "./fesm2022/sd-angular-core-forms-input.mjs"
194
- },
195
192
  "./forms/input-number": {
196
193
  "types": "./forms/input-number/index.d.ts",
197
194
  "default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
198
195
  },
199
- "./forms/label": {
200
- "types": "./forms/label/index.d.ts",
201
- "default": "./fesm2022/sd-angular-core-forms-label.mjs"
196
+ "./forms/input": {
197
+ "types": "./forms/input/index.d.ts",
198
+ "default": "./fesm2022/sd-angular-core-forms-input.mjs"
202
199
  },
203
200
  "./forms/models": {
204
201
  "types": "./forms/models/index.d.ts",
@@ -208,6 +205,10 @@
208
205
  "types": "./forms/radio/index.d.ts",
209
206
  "default": "./fesm2022/sd-angular-core-forms-radio.mjs"
210
207
  },
208
+ "./forms/label": {
209
+ "types": "./forms/label/index.d.ts",
210
+ "default": "./fesm2022/sd-angular-core-forms-label.mjs"
211
+ },
211
212
  "./forms/select": {
212
213
  "types": "./forms/select/index.d.ts",
213
214
  "default": "./fesm2022/sd-angular-core-forms-select.mjs"
@@ -220,10 +221,6 @@
220
221
  "types": "./forms/textarea/index.d.ts",
221
222
  "default": "./fesm2022/sd-angular-core-forms-textarea.mjs"
222
223
  },
223
- "./guards/permission": {
224
- "types": "./guards/permission/index.d.ts",
225
- "default": "./fesm2022/sd-angular-core-guards-permission.mjs"
226
- },
227
224
  "./modules/auth": {
228
225
  "types": "./modules/auth/index.d.ts",
229
226
  "default": "./fesm2022/sd-angular-core-modules-auth.mjs"
@@ -232,21 +229,13 @@
232
229
  "types": "./modules/keycloak/index.d.ts",
233
230
  "default": "./fesm2022/sd-angular-core-modules-keycloak.mjs"
234
231
  },
235
- "./modules/layout": {
236
- "types": "./modules/layout/index.d.ts",
237
- "default": "./fesm2022/sd-angular-core-modules-layout.mjs"
238
- },
239
- "./modules/oidc": {
240
- "types": "./modules/oidc/index.d.ts",
241
- "default": "./fesm2022/sd-angular-core-modules-oidc.mjs"
242
- },
243
232
  "./modules/permission": {
244
233
  "types": "./modules/permission/index.d.ts",
245
234
  "default": "./fesm2022/sd-angular-core-modules-permission.mjs"
246
235
  },
247
- "./services/confirm": {
248
- "types": "./services/confirm/index.d.ts",
249
- "default": "./fesm2022/sd-angular-core-services-confirm.mjs"
236
+ "./modules/layout": {
237
+ "types": "./modules/layout/index.d.ts",
238
+ "default": "./fesm2022/sd-angular-core-modules-layout.mjs"
250
239
  },
251
240
  "./services/api": {
252
241
  "types": "./services/api/index.d.ts",
@@ -256,6 +245,10 @@
256
245
  "types": "./services/cache/index.d.ts",
257
246
  "default": "./fesm2022/sd-angular-core-services-cache.mjs"
258
247
  },
248
+ "./services/confirm": {
249
+ "types": "./services/confirm/index.d.ts",
250
+ "default": "./fesm2022/sd-angular-core-services-confirm.mjs"
251
+ },
259
252
  "./services/docx": {
260
253
  "types": "./services/docx/index.d.ts",
261
254
  "default": "./fesm2022/sd-angular-core-services-docx.mjs"
@@ -268,6 +261,10 @@
268
261
  "types": "./services/firebase/index.d.ts",
269
262
  "default": "./fesm2022/sd-angular-core-services-firebase.mjs"
270
263
  },
264
+ "./services/notify": {
265
+ "types": "./services/notify/index.d.ts",
266
+ "default": "./fesm2022/sd-angular-core-services-notify.mjs"
267
+ },
271
268
  "./services/license": {
272
269
  "types": "./services/license/index.d.ts",
273
270
  "default": "./fesm2022/sd-angular-core-services-license.mjs"
@@ -276,22 +273,18 @@
276
273
  "types": "./services/loading/index.d.ts",
277
274
  "default": "./fesm2022/sd-angular-core-services-loading.mjs"
278
275
  },
279
- "./services/notify": {
280
- "types": "./services/notify/index.d.ts",
281
- "default": "./fesm2022/sd-angular-core-services-notify.mjs"
282
- },
283
276
  "./services/storage": {
284
277
  "types": "./services/storage/index.d.ts",
285
278
  "default": "./fesm2022/sd-angular-core-services-storage.mjs"
286
279
  },
287
- "./utilities/models": {
288
- "types": "./utilities/models/index.d.ts",
289
- "default": "./fesm2022/sd-angular-core-utilities-models.mjs"
290
- },
291
280
  "./utilities/extensions": {
292
281
  "types": "./utilities/extensions/index.d.ts",
293
282
  "default": "./fesm2022/sd-angular-core-utilities-extensions.mjs"
294
283
  },
284
+ "./utilities/models": {
285
+ "types": "./utilities/models/index.d.ts",
286
+ "default": "./fesm2022/sd-angular-core-utilities-models.mjs"
287
+ },
295
288
  "./components/view": {
296
289
  "types": "./components/view/index.d.ts",
297
290
  "default": "./fesm2022/sd-angular-core-components-view.mjs"
@@ -2,6 +2,7 @@ export declare const StringUtilities: {
2
2
  REGEX_EMAIL: string;
3
3
  REGEX_PHONE: string;
4
4
  REGEX_PHONE_VN: string;
5
+ REGEX_IDVN_OR_PASSPORT: string;
5
6
  isValidEmail: (value: any) => boolean;
6
7
  isValidPhone: (value: any) => boolean;
7
8
  isValidCode: (value: any) => boolean;
@@ -1,4 +1,4 @@
1
- export type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN';
1
+ export type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN' | 'IDVN_OR_PASSPORT';
2
2
  export interface SdPatternCommon {
3
3
  type: SdPatternType;
4
4
  name: string;
@@ -1,125 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, Inject, Injectable, NgModule } from '@angular/core';
3
- import { CommonModule } from '@angular/common';
4
- import { StsConfigLoader, LogLevel, provideAuth, authInterceptor } from 'angular-auth-oidc-client';
5
- import { from, map } from 'rxjs';
6
- import { provideHttpClient, withInterceptors } from '@angular/common/http';
7
-
8
- const SD_OIDC_CONFIGURATION = new InjectionToken('sd-oidc.configuration');
9
-
10
- class DynamicStsLoader extends StsConfigLoader {
11
- oidcConfiguration;
12
- constructor(oidcConfiguration) {
13
- super();
14
- this.oidcConfiguration = oidcConfiguration;
15
- }
16
- // SỬA LỖI TYPE: Trả về Observable<OpenIdConfiguration[]>
17
- loadConfigs() {
18
- const loaderPromise = this.oidcConfiguration.loadTenantConfig();
19
- // Dùng 'from' chuyển Promise -> Observable
20
- return from(loaderPromise).pipe(map(tenantConfig => {
21
- const authority = `${tenantConfig.url}/realms/${tenantConfig.realm}`;
22
- const config = {
23
- authority,
24
- redirectUrl: window.location.origin,
25
- postLogoutRedirectUri: window.location.origin,
26
- clientId: tenantConfig.clientId,
27
- scope: 'openid profile email offline_access',
28
- responseType: 'code',
29
- silentRenew: true, // Tự động Refresh Token
30
- useRefreshToken: true,
31
- ignoreNonceAfterRefresh: true,
32
- renewTimeBeforeTokenExpiresInSeconds: 10,
33
- logLevel: LogLevel.Warn,
34
- // Cập nhật domain API của bạn vào đây để Interceptor tự đính Token
35
- secureRoutes: tenantConfig.secureRoutes?.filter(route => !!route)?.map(route => route.trim()),
36
- };
37
- // Trả về mảng (bắt buộc với bản mới)
38
- return [config];
39
- }));
40
- }
41
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DynamicStsLoader, deps: [{ token: SD_OIDC_CONFIGURATION }], target: i0.ɵɵFactoryTarget.Injectable });
42
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DynamicStsLoader });
43
- }
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DynamicStsLoader, decorators: [{
45
- type: Injectable
46
- }], ctorParameters: () => [{ type: undefined, decorators: [{
47
- type: Inject,
48
- args: [SD_OIDC_CONFIGURATION]
49
- }] }] });
50
-
51
- // 5. Module Wrapper
52
- class SdOidcModule {
53
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
- static forRoot(options) {
55
- if (options.useFactory) {
56
- return {
57
- ngModule: SdOidcModule,
58
- providers: [
59
- {
60
- provide: SD_OIDC_CONFIGURATION,
61
- useFactory: options.useFactory,
62
- deps: options.deps,
63
- },
64
- // B. Provide Auth Logic (Dùng cú pháp provideAuth mới ngay trong NgModule)
65
- provideAuth({
66
- loader: {
67
- provide: StsConfigLoader,
68
- useClass: DynamicStsLoader,
69
- },
70
- }),
71
- provideHttpClient(withInterceptors([authInterceptor()])),
72
- ],
73
- };
74
- }
75
- if (options.useClass) {
76
- return {
77
- ngModule: SdOidcModule,
78
- providers: [
79
- {
80
- provide: SD_OIDC_CONFIGURATION,
81
- useClass: options.useClass,
82
- },
83
- // B. Provide Auth Logic (Dùng cú pháp provideAuth mới ngay trong NgModule)
84
- provideAuth({
85
- loader: {
86
- provide: StsConfigLoader,
87
- useClass: DynamicStsLoader,
88
- },
89
- }),
90
- provideHttpClient(withInterceptors([authInterceptor()])),
91
- ],
92
- };
93
- }
94
- return {
95
- ngModule: SdOidcModule,
96
- providers: [
97
- // B. Provide Auth Logic (Dùng cú pháp provideAuth mới ngay trong NgModule)
98
- provideAuth({
99
- loader: {
100
- provide: StsConfigLoader,
101
- useClass: DynamicStsLoader,
102
- },
103
- }),
104
- provideHttpClient(withInterceptors([authInterceptor()])),
105
- ],
106
- };
107
- }
108
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdOidcModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
109
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.17", ngImport: i0, type: SdOidcModule, imports: [CommonModule] });
110
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdOidcModule, imports: [CommonModule] });
111
- }
112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdOidcModule, decorators: [{
113
- type: NgModule,
114
- args: [{
115
- imports: [CommonModule],
116
- exports: [],
117
- }]
118
- }] });
119
-
120
- /**
121
- * Generated bundle index. Do not edit.
122
- */
123
-
124
- export { SD_OIDC_CONFIGURATION, SdOidcModule };
125
- //# sourceMappingURL=sd-angular-core-modules-oidc.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sd-angular-core-modules-oidc.mjs","sources":["../../../projects/sd-angular/modules/oidc/oidc.configuration.ts","../../../projects/sd-angular/modules/oidc/dynamic-sts.loader.ts","../../../projects/sd-angular/modules/oidc/oidc.module.ts","../../../projects/sd-angular/modules/oidc/sd-angular-core-modules-oidc.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\n\r\nexport interface SdOidcTenantConfig {\r\n url: string;\r\n realm: string;\r\n clientId: string;\r\n // Cập nhật domain API của bạn vào đây để Interceptor tự đính Token, ví dụ: ['https://dev.api.com']\r\n secureRoutes: string[];\r\n}\r\n\r\nexport interface ISdOidcConfiguration {\r\n loadTenantConfig: () => Promise<SdOidcTenantConfig>;\r\n}\r\n\r\nexport const SD_OIDC_CONFIGURATION = new InjectionToken<ISdOidcConfiguration>('sd-oidc.configuration');","import { Inject, Injectable } from '@angular/core';\r\nimport { LogLevel, OpenIdConfiguration, StsConfigLoader } from 'angular-auth-oidc-client';\r\nimport { from, map, Observable } from 'rxjs';\r\nimport { ISdOidcConfiguration, SD_OIDC_CONFIGURATION } from './oidc.configuration';\r\n\r\n@Injectable()\r\nexport class DynamicStsLoader extends StsConfigLoader {\r\n constructor(@Inject(SD_OIDC_CONFIGURATION) private oidcConfiguration: ISdOidcConfiguration) {\r\n super();\r\n }\r\n\r\n // SỬA LỖI TYPE: Trả về Observable<OpenIdConfiguration[]>\r\n override loadConfigs(): Observable<OpenIdConfiguration[]> {\r\n const loaderPromise = this.oidcConfiguration.loadTenantConfig();\r\n\r\n // Dùng 'from' chuyển Promise -> Observable\r\n return from(loaderPromise).pipe(\r\n map(tenantConfig => {\r\n const authority = `${tenantConfig.url}/realms/${tenantConfig.realm}`;\r\n const config: OpenIdConfiguration = {\r\n authority,\r\n redirectUrl: window.location.origin,\r\n postLogoutRedirectUri: window.location.origin,\r\n clientId: tenantConfig.clientId,\r\n scope: 'openid profile email offline_access',\r\n responseType: 'code',\r\n silentRenew: true, // Tự động Refresh Token\r\n useRefreshToken: true,\r\n ignoreNonceAfterRefresh: true,\r\n renewTimeBeforeTokenExpiresInSeconds: 10,\r\n logLevel: LogLevel.Warn,\r\n // Cập nhật domain API của bạn vào đây để Interceptor tự đính Token\r\n secureRoutes: tenantConfig.secureRoutes?.filter(route => !!route)?.map(route => route.trim()),\r\n };\r\n // Trả về mảng (bắt buộc với bản mới)\r\n return [config];\r\n })\r\n );\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ModuleWithProviders, NgModule, Type } from '@angular/core';\r\nimport { authInterceptor, provideAuth, StsConfigLoader } from 'angular-auth-oidc-client';\r\nimport { DynamicStsLoader } from './dynamic-sts.loader';\r\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { ISdOidcConfiguration, SD_OIDC_CONFIGURATION } from './oidc.configuration';\r\n\r\n// 5. Module Wrapper\r\n@NgModule({\r\n imports: [CommonModule],\r\n exports: [],\r\n})\r\nexport class SdOidcModule {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static forRoot(options: {\r\n useClass?: Type<ISdOidcConfiguration>;\r\n useFactory?: (...args: any[]) => ISdOidcConfiguration;\r\n deps?: any[];\r\n }): ModuleWithProviders<SdOidcModule> {\r\n if (options.useFactory) {\r\n return {\r\n ngModule: SdOidcModule,\r\n providers: [\r\n {\r\n provide: SD_OIDC_CONFIGURATION,\r\n useFactory: options.useFactory,\r\n deps: options.deps,\r\n },\r\n // B. Provide Auth Logic (Dùng cú pháp provideAuth mới ngay trong NgModule)\r\n provideAuth({\r\n loader: {\r\n provide: StsConfigLoader,\r\n useClass: DynamicStsLoader,\r\n },\r\n }),\r\n provideHttpClient(withInterceptors([authInterceptor()])),\r\n ],\r\n };\r\n }\r\n if (options.useClass) {\r\n return {\r\n ngModule: SdOidcModule,\r\n providers: [\r\n {\r\n provide: SD_OIDC_CONFIGURATION,\r\n useClass: options.useClass,\r\n },\r\n // B. Provide Auth Logic (Dùng cú pháp provideAuth mới ngay trong NgModule)\r\n provideAuth({\r\n loader: {\r\n provide: StsConfigLoader,\r\n useClass: DynamicStsLoader,\r\n },\r\n }),\r\n provideHttpClient(withInterceptors([authInterceptor()])),\r\n ],\r\n };\r\n }\r\n return {\r\n ngModule: SdOidcModule,\r\n providers: [\r\n // B. Provide Auth Logic (Dùng cú pháp provideAuth mới ngay trong NgModule)\r\n provideAuth({\r\n loader: {\r\n provide: StsConfigLoader,\r\n useClass: DynamicStsLoader,\r\n },\r\n }),\r\n provideHttpClient(withInterceptors([authInterceptor()])),\r\n ],\r\n };\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import { OpenIdConfiguration, StsConfigLoader } from 'angular-auth-oidc-client';
2
- import { Observable } from 'rxjs';
3
- import { ISdOidcConfiguration } from './oidc.configuration';
4
- import * as i0 from "@angular/core";
5
- export declare class DynamicStsLoader extends StsConfigLoader {
6
- private oidcConfiguration;
7
- constructor(oidcConfiguration: ISdOidcConfiguration);
8
- loadConfigs(): Observable<OpenIdConfiguration[]>;
9
- static ɵfac: i0.ɵɵFactoryDeclaration<DynamicStsLoader, never>;
10
- static ɵprov: i0.ɵɵInjectableDeclaration<DynamicStsLoader>;
11
- }
@@ -1,2 +0,0 @@
1
- export * from './oidc.configuration';
2
- export * from './oidc.module';
@@ -1,11 +0,0 @@
1
- import { InjectionToken } from "@angular/core";
2
- export interface SdOidcTenantConfig {
3
- url: string;
4
- realm: string;
5
- clientId: string;
6
- secureRoutes: string[];
7
- }
8
- export interface ISdOidcConfiguration {
9
- loadTenantConfig: () => Promise<SdOidcTenantConfig>;
10
- }
11
- export declare const SD_OIDC_CONFIGURATION: InjectionToken<ISdOidcConfiguration>;
@@ -1,14 +0,0 @@
1
- import { ModuleWithProviders, Type } from '@angular/core';
2
- import { ISdOidcConfiguration } from './oidc.configuration';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- export declare class SdOidcModule {
6
- static forRoot(options: {
7
- useClass?: Type<ISdOidcConfiguration>;
8
- useFactory?: (...args: any[]) => ISdOidcConfiguration;
9
- deps?: any[];
10
- }): ModuleWithProviders<SdOidcModule>;
11
- static ɵfac: i0.ɵɵFactoryDeclaration<SdOidcModule, never>;
12
- static ɵmod: i0.ɵɵNgModuleDeclaration<SdOidcModule, never, [typeof i1.CommonModule], never>;
13
- static ɵinj: i0.ɵɵInjectorDeclaration<SdOidcModule>;
14
- }
Binary file