@goat-bravos/intern-hub-layout 3.0.7 → 3.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|

|
|
5
5
|

|
|
6
6
|

|
|
7
|
-

|
|
8
8
|
|
|
9
9
|
A comprehensive Angular library providing reusable layout components and shared UI elements for Intern Hub applications. Built with Angular 21, TypeScript 5.9, and designed for seamless integration with modern Angular projects.
|
|
10
10
|
|
|
@@ -32,6 +32,9 @@ A comprehensive Angular library providing reusable layout components and shared
|
|
|
32
32
|
- [Contributing](#-contributing)
|
|
33
33
|
- [Changelog](#-changelog)
|
|
34
34
|
- [License](#-license)
|
|
35
|
+
- [Links & Resources](#-links--resources)
|
|
36
|
+
- [Support](#-support)
|
|
37
|
+
- [Acknowledgments](#-acknowledgments)
|
|
35
38
|
|
|
36
39
|
---
|
|
37
40
|
|
|
@@ -229,6 +232,7 @@ export class MyComponent {
|
|
|
229
232
|
userIcon: "dsi-user-01-line",
|
|
230
233
|
dropdownIcon: "dsi-arrow-down-solid",
|
|
231
234
|
logo: "assets/logo.png",
|
|
235
|
+
minWidth: "1200px",
|
|
232
236
|
};
|
|
233
237
|
}
|
|
234
238
|
```
|
|
@@ -246,6 +250,7 @@ interface HeaderData {
|
|
|
246
250
|
logo?: string;
|
|
247
251
|
logoWidth?: string;
|
|
248
252
|
logoHeight?: string;
|
|
253
|
+
minWidth?: string;
|
|
249
254
|
}
|
|
250
255
|
|
|
251
256
|
interface HeaderAction {
|
|
@@ -837,6 +842,37 @@ interface ApprovalListItemInterface {
|
|
|
837
842
|
|
|
838
843
|
---
|
|
839
844
|
|
|
845
|
+
---
|
|
846
|
+
|
|
847
|
+
#### ApprovalListItemComponent
|
|
848
|
+
|
|
849
|
+
A single item component for the approval list, can be used independently.
|
|
850
|
+
|
|
851
|
+
**Selector:** `app-approval-list-item`
|
|
852
|
+
|
|
853
|
+
```typescript
|
|
854
|
+
import { ApprovalListItemComponent } from "@goat-bravos/intern-hub-layout";
|
|
855
|
+
|
|
856
|
+
@Component({
|
|
857
|
+
imports: [ApprovalListItemComponent],
|
|
858
|
+
template: ` <app-approval-list-item name="John Doe - Request #123" [date]="requestDate"></app-approval-list-item> `,
|
|
859
|
+
})
|
|
860
|
+
export class MyComponent {
|
|
861
|
+
requestDate = new Date();
|
|
862
|
+
}
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
**Inputs:**
|
|
866
|
+
|
|
867
|
+
| Input | Type | Description |
|
|
868
|
+
| --------------- | ------------------ | ------------------------------ |
|
|
869
|
+
| `name` | `string` | Main text/name to display |
|
|
870
|
+
| `date` | `Date` | Date object to display |
|
|
871
|
+
| `rightTemplate` | `TemplateRef<any>` | Custom template for right side |
|
|
872
|
+
| `rightContext` | `any` | Context for the right template |
|
|
873
|
+
|
|
874
|
+
---
|
|
875
|
+
|
|
840
876
|
### Modal Components
|
|
841
877
|
|
|
842
878
|
#### ModalComponent
|
|
@@ -857,7 +893,7 @@ import { CommonModule } from "@angular/common";
|
|
|
857
893
|
|
|
858
894
|
<!-- Modal component -->
|
|
859
895
|
@if (isModalOpen) {
|
|
860
|
-
<app-modal [title]="'User Details'" [isOpen]="isModalOpen" [width]="'600px'" [minHeight]="'400px'" [theme]="'default'" (
|
|
896
|
+
<app-modal [title]="'User Details'" [isOpen]="isModalOpen" [width]="'600px'" [minHeight]="'400px'" [theme]="'default'" (closeModal)="onModalClose()">
|
|
861
897
|
<!-- Modal content goes here -->
|
|
862
898
|
<div class="modal-content">
|
|
863
899
|
<p>This is the modal content area.</p>
|
|
@@ -889,16 +925,16 @@ export class MyComponent {
|
|
|
889
925
|
|
|
890
926
|
**Outputs:**
|
|
891
927
|
|
|
892
|
-
| Output
|
|
893
|
-
|
|
|
894
|
-
| `
|
|
928
|
+
| Output | Type | Description |
|
|
929
|
+
| ------------ | -------------------- | --------------------------------- |
|
|
930
|
+
| `closeModal` | `EventEmitter<void>` | Emits when modal should be closed |
|
|
895
931
|
|
|
896
932
|
**Content Projection:**
|
|
897
933
|
|
|
898
934
|
The modal supports content projection. Place any HTML content between the opening and closing tags:
|
|
899
935
|
|
|
900
936
|
```html
|
|
901
|
-
<app-modal [title]="'Custom Modal'" [isOpen]="true" (
|
|
937
|
+
<app-modal [title]="'Custom Modal'" [isOpen]="true" (closeModal)="closeModal()">
|
|
902
938
|
<form>
|
|
903
939
|
<input type="text" placeholder="Name" />
|
|
904
940
|
<button type="submit">Submit</button>
|
|
@@ -971,50 +1007,60 @@ export class MyComponent {
|
|
|
971
1007
|
|
|
972
1008
|
### Upload Components
|
|
973
1009
|
|
|
974
|
-
|
|
1010
|
+
---
|
|
1011
|
+
|
|
1012
|
+
#### AvatarUploadButtonComponent
|
|
975
1013
|
|
|
976
|
-
A
|
|
1014
|
+
A dedicated button for uploading avatar images with preview functionality.
|
|
977
1015
|
|
|
978
|
-
**Selector:** `app-upload-button`
|
|
1016
|
+
**Selector:** `app-avatar-upload-button`
|
|
979
1017
|
|
|
980
1018
|
```typescript
|
|
981
|
-
import {
|
|
1019
|
+
import { AvatarUploadButtonComponent, AvatarUploadedFile } from "@goat-bravos/intern-hub-layout";
|
|
982
1020
|
|
|
983
1021
|
@Component({
|
|
984
|
-
imports: [
|
|
985
|
-
template: `
|
|
986
|
-
<!-- Basic upload button -->
|
|
987
|
-
<app-upload-button [label]="'Profile Picture'" [required]="true" [buttonText]="'Upload Image'" [acceptFormats]="'.png,.jpg,.jpeg'" [helperText]="'Max size: 5MB (PNG, JPG, JPEG)'" (fileSelected)="onFileSelected($event)"></app-upload-button>
|
|
988
|
-
|
|
989
|
-
<!-- With tooltip -->
|
|
990
|
-
<app-upload-button [label]="'Document Upload'" [showTooltip]="true" [tooltipText]="'Upload your resume or portfolio'" [acceptFormats]="'.pdf,.doc,.docx'" (fileSelected)="onFileSelected($event)"></app-upload-button>
|
|
991
|
-
`,
|
|
1022
|
+
imports: [AvatarUploadButtonComponent],
|
|
1023
|
+
template: ` <app-avatar-upload-button [label]="'Avatar'" [required]="true" [buttonText]="'Upload Avatar'" (fileChange)="onAvatarChange($event)"></app-avatar-upload-button> `,
|
|
992
1024
|
})
|
|
993
1025
|
export class MyComponent {
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
1026
|
+
onAvatarChange(file: AvatarUploadedFile | null) {
|
|
1027
|
+
if (file) {
|
|
1028
|
+
console.log("Avatar uploaded:", file.fileName, file.previewUrl);
|
|
1029
|
+
} else {
|
|
1030
|
+
console.log("Avatar removed");
|
|
1031
|
+
}
|
|
997
1032
|
}
|
|
998
1033
|
}
|
|
999
1034
|
```
|
|
1000
1035
|
|
|
1001
1036
|
**Inputs:**
|
|
1002
1037
|
|
|
1003
|
-
| Input | Type | Default | Description
|
|
1004
|
-
| --------------- | --------- | ------------------------------- |
|
|
1005
|
-
| `label` | `string` | `''` | Label text
|
|
1006
|
-
| `required` | `boolean` | `false` |
|
|
1007
|
-
| `showTooltip` | `boolean` | `false` |
|
|
1008
|
-
| `tooltipText` | `string` | `''` | Tooltip content
|
|
1009
|
-
| `buttonText` | `string` | `'Tải
|
|
1010
|
-
| `acceptFormats` | `string` | `'.png,.jpeg,.jpg'` | Accepted
|
|
1011
|
-
| `helperText` | `string` | `'Định dạng .png, .jpeg, .jpg'` | Helper text below
|
|
1038
|
+
| Input | Type | Default | Description |
|
|
1039
|
+
| --------------- | --------- | ------------------------------- | ------------------ |
|
|
1040
|
+
| `label` | `string` | `''` | Label text |
|
|
1041
|
+
| `required` | `boolean` | `false` | Required indicator |
|
|
1042
|
+
| `showTooltip` | `boolean` | `false` | Show info tooltip |
|
|
1043
|
+
| `tooltipText` | `string` | `''` | Tooltip content |
|
|
1044
|
+
| `buttonText` | `string` | `'Tải file lên'` | Button text |
|
|
1045
|
+
| `acceptFormats` | `string` | `'.png,.jpeg,.jpg'` | Accepted formats |
|
|
1046
|
+
| `helperText` | `string` | `'Định dạng .png, .jpeg, .jpg'` | Helper text below |
|
|
1012
1047
|
|
|
1013
1048
|
**Outputs:**
|
|
1014
1049
|
|
|
1015
|
-
| Output
|
|
1016
|
-
|
|
|
1017
|
-
| `
|
|
1050
|
+
| Output | Type | Description |
|
|
1051
|
+
| ------------ | -------------------------------- | ----------- | -------------------------------- |
|
|
1052
|
+
| `fileChange` | `EventEmitter<AvatarUploadedFile | null>` | Emits uploaded file data or null |
|
|
1053
|
+
|
|
1054
|
+
**Interfaces:**
|
|
1055
|
+
|
|
1056
|
+
```typescript
|
|
1057
|
+
interface AvatarUploadedFile {
|
|
1058
|
+
id: string;
|
|
1059
|
+
file: File;
|
|
1060
|
+
fileName: string;
|
|
1061
|
+
previewUrl: string | null;
|
|
1062
|
+
}
|
|
1063
|
+
```
|
|
1018
1064
|
|
|
1019
1065
|
---
|
|
1020
1066
|
|
|
@@ -1745,6 +1791,6 @@ Special thanks to:
|
|
|
1745
1791
|
|
|
1746
1792
|
Made with 💙 by [FPT IS Intern Team](https://github.com/FPT-IS-Intern)
|
|
1747
1793
|
|
|
1748
|
-
**📦 @goat-bravos/intern-hub-layout** | **v3.0.
|
|
1794
|
+
**📦 @goat-bravos/intern-hub-layout** | **v3.0.10** | **MIT License**
|
|
1749
1795
|
|
|
1750
1796
|
</div>
|
|
@@ -96,11 +96,11 @@ class HeaderComponent {
|
|
|
96
96
|
return icon;
|
|
97
97
|
}
|
|
98
98
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: HeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
99
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: HeaderComponent, isStandalone: true, selector: "app-header-component", inputs: { data: "data", paddingHeader: "paddingHeader" }, ngImport: i0, template: "<header
|
|
99
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: HeaderComponent, isStandalone: true, selector: "app-header-component", inputs: { data: "data", paddingHeader: "paddingHeader" }, ngImport: i0, template: "<header\r\n class=\"app-header\"\r\n [style.padding]=\"paddingHeader\"\r\n [style.min-width]=\"data.minWidth\"\r\n>\r\n <div class=\"header-left\">\r\n <img\r\n class=\"logo\"\r\n [src]=\"data.logo || 'assets/FPT-IS-Logo.png'\"\r\n alt=\"Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"header-right\">\r\n @for (item of data.headerItems; track $index) {\r\n <button\r\n class=\"header-btn\"\r\n [attr.aria-label]=\"item.content\"\r\n (click)=\"handleActionClick(item, $event)\"\r\n >\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n item.icon,\r\n item.colorIcon,\r\n item.width || '16px',\r\n item.height || '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n @if (item.badge) {\r\n <span class=\"badge\">{{ item.badge }}</span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"header-user\">\r\n <button class=\"user-btn\">\r\n @if (data.userIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(data.userIcon, data.userIconColor, '16px', '16px')\r\n \"\r\n ></app-icon>\r\n }\r\n <span class=\"user-name\">{{ data.userName }}</span>\r\n @if (data.dropdownIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n data.dropdownIcon,\r\n data.dropdownIconColor,\r\n '16px',\r\n '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n</header>\r\n", styles: [":host{width:100%;display:flex;justify-content:center}.app-header{height:70px;display:flex;width:100%;align-items:center;justify-content:space-between;background-color:transparent;box-sizing:border-box}.header-left{display:flex;align-items:center}.header-left .logo{height:40px;width:auto;object-fit:contain;cursor:pointer}.header-right{display:flex;align-items:center;gap:12px}.header-btn{position:relative;width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:28px;border:none;cursor:pointer;color:var(--brand-600);transition:all .2s ease-in-out}.header-btn:hover{background-color:var(--neutral-color-100);color:var(--primary-color)}.header-btn .badge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:12px 20px 12px 16px;display:flex;align-items:center;justify-content:center;background-color:var(-utility-500);color:var(--neutral-color-100);border-radius:8px;font-size:10px;font-weight:600;line-height:1}.header-user{margin-left:4px;padding-left:12px 20px 12px 16px}.user-btn{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 20px 12px 16px;background:transparent;border:none;border-radius:8px;cursor:pointer;transition:background-color .2s ease}.user-btn:hover{background-color:var(--neutral-color-100)}.user-btn .user-name{font-size:14px;font-weight:700;color:var(--brand-600);white-space:nowrap;max-width:150px;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IconComponent, selector: "app-icon", inputs: ["iconData", "icon", "colorIcon", "routerLink", "width", "height", "colorIconHover", "backgroundColorHover"], outputs: ["clicked"] }] });
|
|
100
100
|
}
|
|
101
101
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: HeaderComponent, decorators: [{
|
|
102
102
|
type: Component,
|
|
103
|
-
args: [{ selector: 'app-header-component', standalone: true, imports: [CommonModule, IconComponent], template: "<header
|
|
103
|
+
args: [{ selector: 'app-header-component', standalone: true, imports: [CommonModule, IconComponent], template: "<header\r\n class=\"app-header\"\r\n [style.padding]=\"paddingHeader\"\r\n [style.min-width]=\"data.minWidth\"\r\n>\r\n <div class=\"header-left\">\r\n <img\r\n class=\"logo\"\r\n [src]=\"data.logo || 'assets/FPT-IS-Logo.png'\"\r\n alt=\"Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"header-right\">\r\n @for (item of data.headerItems; track $index) {\r\n <button\r\n class=\"header-btn\"\r\n [attr.aria-label]=\"item.content\"\r\n (click)=\"handleActionClick(item, $event)\"\r\n >\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n item.icon,\r\n item.colorIcon,\r\n item.width || '16px',\r\n item.height || '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n @if (item.badge) {\r\n <span class=\"badge\">{{ item.badge }}</span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"header-user\">\r\n <button class=\"user-btn\">\r\n @if (data.userIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(data.userIcon, data.userIconColor, '16px', '16px')\r\n \"\r\n ></app-icon>\r\n }\r\n <span class=\"user-name\">{{ data.userName }}</span>\r\n @if (data.dropdownIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n data.dropdownIcon,\r\n data.dropdownIconColor,\r\n '16px',\r\n '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n</header>\r\n", styles: [":host{width:100%;display:flex;justify-content:center}.app-header{height:70px;display:flex;width:100%;align-items:center;justify-content:space-between;background-color:transparent;box-sizing:border-box}.header-left{display:flex;align-items:center}.header-left .logo{height:40px;width:auto;object-fit:contain;cursor:pointer}.header-right{display:flex;align-items:center;gap:12px}.header-btn{position:relative;width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:transparent;border-radius:28px;border:none;cursor:pointer;color:var(--brand-600);transition:all .2s ease-in-out}.header-btn:hover{background-color:var(--neutral-color-100);color:var(--primary-color)}.header-btn .badge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:12px 20px 12px 16px;display:flex;align-items:center;justify-content:center;background-color:var(-utility-500);color:var(--neutral-color-100);border-radius:8px;font-size:10px;font-weight:600;line-height:1}.header-user{margin-left:4px;padding-left:12px 20px 12px 16px}.user-btn{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 20px 12px 16px;background:transparent;border:none;border-radius:8px;cursor:pointer;transition:background-color .2s ease}.user-btn:hover{background-color:var(--neutral-color-100)}.user-btn .user-name{font-size:14px;font-weight:700;color:var(--brand-600);white-space:nowrap;max-width:150px;overflow:hidden;text-overflow:ellipsis}\n"] }]
|
|
104
104
|
}], propDecorators: { data: [{
|
|
105
105
|
type: Input
|
|
106
106
|
}], paddingHeader: [{
|
|
@@ -902,21 +902,16 @@ class ModalComponent {
|
|
|
902
902
|
minHeight = '300px';
|
|
903
903
|
isOpen = false;
|
|
904
904
|
theme = 'default';
|
|
905
|
-
|
|
906
|
-
onOverlayClick(event) {
|
|
907
|
-
if (event.target === event.currentTarget) {
|
|
908
|
-
this.close.emit();
|
|
909
|
-
}
|
|
910
|
-
}
|
|
905
|
+
closeModal = new EventEmitter();
|
|
911
906
|
onCloseClick() {
|
|
912
|
-
this.
|
|
907
|
+
this.closeModal.emit();
|
|
913
908
|
}
|
|
914
909
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
915
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.2", type: ModalComponent, isStandalone: true, selector: "app-modal", inputs: { title: "title", width: "width", minHeight: "minHeight", isOpen: "isOpen", theme: "theme" }, outputs: {
|
|
910
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.2", type: ModalComponent, isStandalone: true, selector: "app-modal", inputs: { title: "title", width: "width", minHeight: "minHeight", isOpen: "isOpen", theme: "theme" }, outputs: { closeModal: "closeModal" }, ngImport: i0, template: "<div class=\"modal-overlay\" *ngIf=\"isOpen\">\n <button\n class=\"modal-backdrop\"\n (click)=\"onCloseClick()\"\n aria-label=\"Close modal\"\n ></button>\n <div\n class=\"modal-container\"\n [class.theme-white]=\"theme === 'white'\"\n [style.width]=\"width\"\n [style.min-height]=\"minHeight\"\n >\n <div class=\"modal-header\">\n <span class=\"modal-title\">{{ title }}</span>\n <button\n class=\"modal-close-btn\"\n (click)=\"onCloseClick()\"\n title=\"Close\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[modal-body]\"></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"[modal-footer]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [".modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.modal-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;border:none;background:transparent;cursor:default;z-index:0}.modal-container{background-color:var(--brand-100);border-radius:20px;display:flex;flex-direction:column;max-height:90vh;overflow:hidden;position:relative;z-index:1}.modal-container.theme-white{background-color:var(--neutral-color-10)}.modal-header{display:flex;align-items:center;justify-content:space-between;min-height:56px;padding:0 20px;border-bottom:1px solid var(--neutral-color-300);box-sizing:border-box}.modal-title{font-weight:500;font-size:17px;line-height:24px;letter-spacing:-.3px;color:var(--brand-600)}.theme-white .modal-title{color:var(--neutral-color-50)}.modal-close-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;cursor:pointer;border-radius:8px;color:var(--neutral-color-500);transition:background-color .2s ease,color .2s ease}.modal-close-btn:hover{background-color:var(--neutral-color-100);color:var(--neutral-color-700)}.modal-body{flex:1;padding:20px;display:flex;flex-direction:column;overflow-y:auto}.modal-body ::ng-deep [modal-body]{display:flex;flex-direction:column;gap:16px}.modal-footer{min-height:56px;padding:0 20px 16px;display:flex;flex-direction:row;align-items:center;justify-content:flex-end;gap:16px;border-top:1px solid var(--neutral-color-300);box-sizing:border-box}.modal-footer ::ng-deep [modal-footer]{display:flex;flex-direction:row;align-items:center;gap:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
916
911
|
}
|
|
917
912
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ModalComponent, decorators: [{
|
|
918
913
|
type: Component,
|
|
919
|
-
args: [{ selector: 'app-modal', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-overlay\" *ngIf=\"isOpen\"
|
|
914
|
+
args: [{ selector: 'app-modal', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"modal-overlay\" *ngIf=\"isOpen\">\n <button\n class=\"modal-backdrop\"\n (click)=\"onCloseClick()\"\n aria-label=\"Close modal\"\n ></button>\n <div\n class=\"modal-container\"\n [class.theme-white]=\"theme === 'white'\"\n [style.width]=\"width\"\n [style.min-height]=\"minHeight\"\n >\n <div class=\"modal-header\">\n <span class=\"modal-title\">{{ title }}</span>\n <button\n class=\"modal-close-btn\"\n (click)=\"onCloseClick()\"\n title=\"Close\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[modal-body]\"></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"[modal-footer]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [".modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.modal-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;border:none;background:transparent;cursor:default;z-index:0}.modal-container{background-color:var(--brand-100);border-radius:20px;display:flex;flex-direction:column;max-height:90vh;overflow:hidden;position:relative;z-index:1}.modal-container.theme-white{background-color:var(--neutral-color-10)}.modal-header{display:flex;align-items:center;justify-content:space-between;min-height:56px;padding:0 20px;border-bottom:1px solid var(--neutral-color-300);box-sizing:border-box}.modal-title{font-weight:500;font-size:17px;line-height:24px;letter-spacing:-.3px;color:var(--brand-600)}.theme-white .modal-title{color:var(--neutral-color-50)}.modal-close-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;cursor:pointer;border-radius:8px;color:var(--neutral-color-500);transition:background-color .2s ease,color .2s ease}.modal-close-btn:hover{background-color:var(--neutral-color-100);color:var(--neutral-color-700)}.modal-body{flex:1;padding:20px;display:flex;flex-direction:column;overflow-y:auto}.modal-body ::ng-deep [modal-body]{display:flex;flex-direction:column;gap:16px}.modal-footer{min-height:56px;padding:0 20px 16px;display:flex;flex-direction:row;align-items:center;justify-content:flex-end;gap:16px;border-top:1px solid var(--neutral-color-300);box-sizing:border-box}.modal-footer ::ng-deep [modal-footer]{display:flex;flex-direction:row;align-items:center;gap:16px}\n"] }]
|
|
920
915
|
}], propDecorators: { title: [{
|
|
921
916
|
type: Input
|
|
922
917
|
}], width: [{
|
|
@@ -927,7 +922,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
|
|
|
927
922
|
type: Input
|
|
928
923
|
}], theme: [{
|
|
929
924
|
type: Input
|
|
930
|
-
}],
|
|
925
|
+
}], closeModal: [{
|
|
931
926
|
type: Output
|
|
932
927
|
}] } });
|
|
933
928
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goat-bravos-intern-hub-layout.mjs","sources":["../../../src/libs/shared/components/icon/icon.component.ts","../../../src/libs/shared/components/icon/icon.component.html","../../../src/libs/layouts/header/header.component.ts","../../../src/libs/layouts/header/header.component.html","../../../src/libs/shared/components/functional-label/functional-label.component.ts","../../../src/libs/shared/components/functional-label/functional-label.component.html","../../../src/libs/shared/components/button/button-container/button-container.model.ts","../../../src/libs/shared/components/button/button-container/button-container.component.ts","../../../src/libs/shared/components/button/button-container/button-container.component.html","../../../src/libs/layouts/sidebar/sidebar.component.ts","../../../src/libs/layouts/sidebar/sidebar.component.html","../../../src/libs/shared/components/button/label-button/label-button.component.ts","../../../src/libs/shared/components/button/label-button/label-button.component.html","../../../src/libs/shared/components/input/input-text/input-text.component.ts","../../../src/libs/shared/components/input/input-text/input-text.component.html","../../../src/libs/shared/components/input/input-stepper/input-stepper.component.ts","../../../src/libs/shared/components/input/input-stepper/input-stepper.component.html","../../../src/libs/shared/components/input/input-calendar/input-calendar.component.ts","../../../src/libs/shared/components/input/input-calendar/input-calendar.component.html","../../../src/libs/shared/components/table/table-header/table-header.component.ts","../../../src/libs/shared/components/table/table-header/table-header.component.html","../../../src/libs/shared/components/table/table-body/table-body.component.ts","../../../src/libs/shared/components/table/table-body/table-body.component.html","../../../src/libs/shared/components/approval/approval-list-item/approval-list-item.component.ts","../../../src/libs/shared/components/approval/approval-list-item/approval-list-item.component.html","../../../src/libs/shared/components/approval/approval-list/approval-list.component.ts","../../../src/libs/shared/components/approval/approval-list/approval-list.component.html","../../../src/libs/shared/components/pop-up/pop-up-confirm/pop-up-confirm.component.ts","../../../src/libs/shared/components/pop-up/pop-up-confirm/pop-up-confirm.component.html","../../../src/libs/shared/components/modal/modal.component.ts","../../../src/libs/shared/components/modal/modal.component.html","../../../src/libs/shared/components/avatar-upload-button/avatar-upload-button.component.ts","../../../src/libs/shared/components/avatar-upload-button/avatar-upload-button.component.html","../../../src/libs/shared/components/file-upload-dropzone/file-upload-dropzone.component.ts","../../../src/libs/shared/components/file-upload-dropzone/file-upload-dropzone.component.html","../../../src/public-api.ts","../../../src/goat-bravos-intern-hub-layout.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nexport interface IconData {\r\n icon: string;\r\n colorIcon?: string;\r\n backgroundColorHover?: string;\r\n routerLink?: string;\r\n width?: string;\r\n height?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-icon',\r\n standalone: true,\r\n imports: [CommonModule, RouterModule],\r\n templateUrl: './icon.component.html',\r\n styleUrls: ['./icon.component.scss'],\r\n})\r\nexport class IconComponent {\r\n @Input() iconData?: IconData;\r\n @Input() icon?: string;\r\n @Input() colorIcon?: string;\r\n @Input() routerLink?: string;\r\n @Input() width?: string = '20px';\r\n @Input() height?: string = '20px';\r\n @Input() colorIconHover?: string;\r\n @Input() backgroundColorHover?: string;\r\n\r\n @Output() clicked = new EventEmitter<Event>();\r\n\r\n get iconClass(): string {\r\n const iconName = this.iconData?.icon || this.icon || '';\r\n return iconName.includes('dsi') ? iconName : `dsi ${iconName}`;\r\n }\r\n\r\n get iconColor(): string | undefined {\r\n return this.iconData?.colorIcon || this.colorIcon;\r\n }\r\n\r\n get iconWidth(): string {\r\n return this.iconData?.width || this.width || '20px';\r\n }\r\n\r\n get iconHeight(): string {\r\n return this.iconData?.height || this.height || '20px';\r\n }\r\n\r\n get iconRouterLink(): string | undefined {\r\n return this.iconData?.routerLink || this.routerLink;\r\n }\r\n\r\n get backgroundColor(): string | undefined {\r\n return this.iconData?.backgroundColor;\r\n }\r\n\r\n handleClick(event: Event): void {\r\n if (!this.iconRouterLink) {\r\n event.preventDefault();\r\n this.clicked.emit(event);\r\n }\r\n }\r\n}\r\n","<i\r\n class=\"icon\"\r\n [ngClass]=\"iconClass\"\r\n [style.color]=\"iconColor\"\r\n [style.width]=\"iconWidth\"\r\n [style.height]=\"iconHeight\"\r\n [style.backgroundColor]=\"backgroundColor\"\r\n [routerLink]=\"iconRouterLink\"\r\n [attr.tabindex]=\"iconRouterLink ? null : 0\"\r\n [attr.role]=\"iconRouterLink ? null : 'button'\"\r\n (click)=\"handleClick($event)\"\r\n (keydown.enter)=\"handleClick($event)\"\r\n (keydown.space)=\"handleClick($event)\"\r\n></i>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n IconComponent,\r\n IconData,\r\n} from '../../shared/components/icon/icon.component';\r\n\r\nexport interface HeaderAction {\r\n icon: IconData | string;\r\n content: string;\r\n method?: () => void;\r\n badge?: string;\r\n colorIcon?: string;\r\n width?: string;\r\n height?: string;\r\n}\r\n\r\nexport interface HeaderData {\r\n headerItems: HeaderAction[];\r\n userName: string;\r\n userIcon?: IconData | string;\r\n userIconColor?: string;\r\n dropdownIcon?: IconData | string;\r\n dropdownIconColor?: string;\r\n logo?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-header-component',\r\n standalone: true,\r\n imports: [CommonModule, IconComponent],\r\n templateUrl: './header.component.html',\r\n styleUrls: ['./header.component.scss'],\r\n})\r\nexport class HeaderComponent {\r\n @Input() data: HeaderData = {\r\n headerItems: [],\r\n userName: 'Guest',\r\n userIcon: 'dsi-user-01-line',\r\n dropdownIcon: 'dsi-arrow-down-solid',\r\n logo: 'assets/FPT-IS-Logo.png',\r\n };\r\n\r\n @Input() paddingHeader: string = '12px 20px 12px 16px';\r\n\r\n handleActionClick(item: HeaderAction, event: Event): void {\r\n if (item.method) {\r\n event.preventDefault();\r\n item.method();\r\n }\r\n }\r\n\r\n getIconData(\r\n icon: IconData | string | undefined,\r\n colorIcon?: string,\r\n width?: string,\r\n height?: string,\r\n ): IconData | undefined {\r\n if (!icon) return undefined;\r\n\r\n if (typeof icon === 'string') {\r\n return {\r\n icon,\r\n colorIcon,\r\n width,\r\n height,\r\n };\r\n }\r\n\r\n return icon;\r\n }\r\n}\r\n","<header class=\"app-header\" [style.padding]=\"paddingHeader\">\r\n <div class=\"header-left\">\r\n <img\r\n class=\"logo\"\r\n [src]=\"data.logo || 'assets/FPT-IS-Logo.png'\"\r\n alt=\"Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"header-right\">\r\n @for (item of data.headerItems; track $index) {\r\n <button\r\n class=\"header-btn\"\r\n [attr.aria-label]=\"item.content\"\r\n (click)=\"handleActionClick(item, $event)\"\r\n >\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n item.icon,\r\n item.colorIcon,\r\n item.width || '16px',\r\n item.height || '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n @if (item.badge) {\r\n <span class=\"badge\">{{ item.badge }}</span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"header-user\">\r\n <button class=\"user-btn\">\r\n @if (data.userIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(data.userIcon, data.userIconColor, '16px', '16px')\r\n \"\r\n ></app-icon>\r\n }\r\n <span class=\"user-name\">{{ data.userName }}</span>\r\n @if (data.dropdownIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n data.dropdownIcon,\r\n data.dropdownIconColor,\r\n '16px',\r\n '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n</header>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { IconComponent, IconData } from '../icon/icon.component';\r\n\r\n@Component({\r\n selector: 'app-functional-label',\r\n standalone: true,\r\n imports: [CommonModule, RouterModule, IconComponent],\r\n templateUrl: './functional-label.component.html',\r\n styleUrls: ['./functional-label.component.scss'],\r\n})\r\nexport class FunctionalLabelComponent {\r\n @Input() iconLeft?: IconData | string;\r\n @Input() iconRight?: IconData | string;\r\n\r\n @Input() colorIconLeft?: string;\r\n @Input() colorIconRight?: string;\r\n @Input() widthIconLeft?: string = '20px';\r\n @Input() heightIconLeft?: string = '20px';\r\n @Input() widthIconRight?: string = '20px';\r\n @Input() heightIconRight?: string = '20px';\r\n\r\n @Input() colorIconLeftHover?: string;\r\n @Input() colorIconRightHover?: string;\r\n @Input() colorContentHover?: string;\r\n @Input() backgroundColorHover?: string;\r\n @Input() borderRadiusHover?: string;\r\n\r\n @Input() content?: string;\r\n @Input() fontSizeContent?: string = '14px';\r\n @Input() colorContent?: string;\r\n @Input() widthContent?: string = '100%';\r\n @Input() heightContent?: string = '100%';\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderRadius?: string;\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n\r\n @Input() routerLink?: string;\r\n @Input() isSidebarExpanded: boolean = false;\r\n @Output() clicked = new EventEmitter<Event>();\r\n\r\n get currentBackgroundColor(): string | undefined {\r\n return this.backgroundColor;\r\n }\r\n\r\n get currentBorderRadius(): string | undefined {\r\n return this.borderRadius;\r\n }\r\n\r\n get currentColorContent(): string | undefined {\r\n return this.colorContent;\r\n }\r\n\r\n get hasIconLeft(): boolean {\r\n return !!this.iconLeft;\r\n }\r\n\r\n get hasIconRight(): boolean {\r\n return !!this.iconRight;\r\n }\r\n\r\n get iconLeftData(): IconData | undefined {\r\n if (!this.iconLeft) return undefined;\r\n\r\n const color = this.isSidebarExpanded\r\n ? this.colorIconLeftHover || this.colorIconLeft\r\n : this.colorIconLeft;\r\n\r\n if (typeof this.iconLeft === 'string') {\r\n return {\r\n icon: this.iconLeft,\r\n colorIcon: color,\r\n width: this.widthIconLeft,\r\n height: this.heightIconLeft,\r\n };\r\n }\r\n return {\r\n ...this.iconLeft,\r\n colorIcon: color || this.iconLeft.colorIcon,\r\n };\r\n }\r\n\r\n get iconRightData(): IconData | undefined {\r\n if (!this.iconRight) return undefined;\r\n\r\n const color = this.isSidebarExpanded\r\n ? this.colorIconRightHover || this.colorIconRight\r\n : this.colorIconRight;\r\n\r\n if (typeof this.iconRight === 'string') {\r\n return {\r\n icon: this.iconRight,\r\n colorIcon: color,\r\n width: this.widthIconRight,\r\n height: this.heightIconRight,\r\n };\r\n }\r\n return {\r\n ...this.iconRight,\r\n colorIcon: color || this.iconRight.colorIcon,\r\n };\r\n }\r\n\r\n handleClick(event: Event): void {\r\n if (!this.routerLink) {\r\n event.preventDefault();\r\n this.clicked.emit(event);\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"functional-label\"\r\n (click)=\"handleClick($event)\"\r\n (keydown.enter)=\"handleClick($event)\"\r\n (keydown.space)=\"handleClick($event)\"\r\n [attr.tabindex]=\"routerLink ? null : 0\"\r\n [attr.role]=\"routerLink ? null : 'button'\"\r\n [style.--bg-color]=\"backgroundColor\"\r\n [style.--bg-hover-color]=\"backgroundColorHover || backgroundColor\"\r\n [style.border-radius]=\"borderRadius\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.--content-hover-color]=\"colorContentHover\"\r\n>\r\n @if (hasIconLeft && iconLeftData) {\r\n <app-icon\r\n [iconData]=\"iconLeftData\"\r\n [width]=\"widthIconLeft\"\r\n [height]=\"heightIconLeft\"\r\n ></app-icon>\r\n }\r\n\r\n <a\r\n [routerLink]=\"routerLink\"\r\n [style.width]=\"widthContent\"\r\n [style.height]=\"heightContent\"\r\n [style.font-size]=\"fontSizeContent\"\r\n [style.--content-color]=\"colorContent\"\r\n >\r\n {{ content }}\r\n </a>\r\n\r\n @if (hasIconRight && iconRightData) {\r\n <app-icon\r\n [iconData]=\"iconRightData\"\r\n [width]=\"widthIconRight\"\r\n [height]=\"heightIconRight\"\r\n ></app-icon>\r\n }\r\n</div>\r\n","export interface ButtonContainerInterface {\r\n size: ButtonSize;\r\n leftIcon?: string;\r\n rightIcon?: string;\r\n content: string;\r\n event?: string;\r\n fontSize?: string;\r\n color?: string;\r\n backgroundColor?: string;\r\n borderColor?: string;\r\n}\r\n\r\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\r\n\r\nexport interface ButtonSizeConfig {\r\n minWidth: string;\r\n minHeight: string;\r\n fontSize: string;\r\n iconSize: string;\r\n contentWidth: string;\r\n contentHeight: string;\r\n}\r\n\r\nexport const BUTTON_SIZE_MAP: Record<ButtonSize, ButtonSizeConfig> = {\r\n xs: {\r\n minWidth: '47px',\r\n minHeight: '24px',\r\n fontSize: 'var(--font-xs)',\r\n iconSize: '14px',\r\n contentWidth: '32px',\r\n contentHeight: '16px',\r\n },\r\n sm: {\r\n minWidth: '96px',\r\n minHeight: '28px',\r\n fontSize: 'var(--font-sm)',\r\n iconSize: '16px',\r\n contentWidth: '44px',\r\n contentHeight: '20px',\r\n },\r\n md: {\r\n minWidth: '116px',\r\n minHeight: '36px',\r\n fontSize: 'var(--font-sm)',\r\n iconSize: '20px',\r\n contentWidth: '52px',\r\n contentHeight: '20px',\r\n },\r\n lg: {\r\n minWidth: '120px',\r\n minHeight: '44px',\r\n fontSize: 'var(--font-sm)',\r\n iconSize: '20px',\r\n contentWidth: '52px',\r\n contentHeight: '20px',\r\n },\r\n};\r\n\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonSize, BUTTON_SIZE_MAP } from './button-container.model';\r\nimport { IconComponent, IconData } from '../../icon/icon.component';\r\n\r\nexport interface ButtonContainerData {\r\n size?: ButtonSize | '';\r\n content?: string;\r\n fontSize?: string;\r\n leftIcon?: string;\r\n leftIconData?: IconData[];\r\n rightIcon?: string;\r\n rightIconData?: IconData[];\r\n color?: string;\r\n backgroundColor?: string;\r\n border?: string;\r\n borderRadius: '8px';\r\n width?: string;\r\n height: '36px';\r\n padding?: string;\r\n marginLeft?: string;\r\n marginRight?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-button-container',\r\n standalone: true,\r\n imports: [CommonModule, IconComponent],\r\n templateUrl: './button-container.component.html',\r\n styleUrls: ['./button-container.component.scss'],\r\n})\r\nexport class ButtonContainerComponent {\r\n @Input() buttonData?: ButtonContainerData;\r\n\r\n @Input() size: ButtonSize | '' = 'md';\r\n @Input() content?: string;\r\n\r\n @Input() fontSize?: string;\r\n\r\n @Input() leftIcon?: string;\r\n @Input() leftIconData?: IconData[];\r\n\r\n @Input() rightIcon?: string;\r\n @Input() rightIconData?: IconData[];\r\n\r\n @Input() color?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() border?: string;\r\n @Input() borderRadius = '8px';\r\n @Input() width?: string;\r\n @Input() height = '36px';\r\n @Input() padding?: string;\r\n @Input() marginLeft?: string;\r\n @Input() marginRight?: string;\r\n\r\n @Output() buttonClick = new EventEmitter<any>();\r\n\r\n get sizeStyle() {\r\n return this.size\r\n ? BUTTON_SIZE_MAP[this.size as ButtonSize]\r\n : {\r\n minWidth: 'auto',\r\n minHeight: 'auto',\r\n fontSize: 'inherit',\r\n iconSize: '20px',\r\n contentWidth: 'auto',\r\n contentHeight: 'auto',\r\n };\r\n }\r\n\r\n handleClick(): any {\r\n this.buttonClick.emit();\r\n }\r\n}\r\n","<button\r\n class=\"button-container\"\r\n [style.minWidth]=\"sizeStyle.minWidth\"\r\n [style.minHeight]=\"sizeStyle.minHeight\"\r\n [style.color]=\"color\"\r\n [style.backgroundColor]=\"backgroundColor\"\r\n [style.border]=\"border\"\r\n [style.borderRadius]=\"borderRadius\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.padding]=\"padding\"\r\n [style.marginLeft]=\"marginLeft\"\r\n [style.marginRight]=\"marginRight\"\r\n (click)=\"handleClick()\"\r\n>\r\n @if (leftIcon || (leftIconData && leftIconData.length > 0)) {\r\n @for (iconData of leftIconData; track iconData) {\r\n <app-icon [iconData]=\"iconData\"></app-icon>\r\n }\r\n @if (leftIcon && (!leftIconData || leftIconData.length === 0)) {\r\n <app-icon [icon]=\"leftIcon\"></app-icon>\r\n }\r\n }\r\n\r\n @if (content) {\r\n <span\r\n class=\"button-content\"\r\n [style.minWidth]=\"sizeStyle.contentWidth\"\r\n [style.minHeight]=\"sizeStyle.contentHeight\"\r\n [style.fontSize]=\"fontSize || sizeStyle.fontSize\"\r\n [style.color]=\"color\"\r\n >\r\n {{ content }}\r\n </span>\r\n }\r\n\r\n @if (rightIcon || (rightIconData && rightIconData.length > 0)) {\r\n @for (iconData of rightIconData; track iconData) {\r\n <app-icon [iconData]=\"iconData\"></app-icon>\r\n }\r\n @if (rightIcon && (!rightIconData || rightIconData.length === 0)) {\r\n <app-icon [icon]=\"rightIcon\"></app-icon>\r\n }\r\n }\r\n</button>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FunctionalLabelComponent } from '../../shared/components/functional-label/functional-label.component';\r\nimport { ButtonContainerComponent } from '../../shared/components/button/button-container/button-container.component';\r\nimport { IconData } from '../../shared/components/icon/icon.component';\r\n\r\nexport interface SidebarItem {\r\n iconLeft?: IconData | string;\r\n iconRight?: IconData | string;\r\n content: string;\r\n url?: string;\r\n colorIconLeft?: string;\r\n colorIconLeftHover?: string;\r\n colorIconRight?: string;\r\n colorIconRightHover?: string;\r\n colorContent?: string;\r\n colorContentHover?: string;\r\n backgroundColor?: string;\r\n backgroundColorHover?: string;\r\n borderRadius?: string;\r\n borderRadiusHover?: string;\r\n width?: string;\r\n height?: string;\r\n}\r\n\r\nexport interface SidebarData {\r\n menuItems: SidebarItem[];\r\n backgroundColor?: string;\r\n collapseIcon?: string;\r\n expandIcon?: string;\r\n toggleButtonBackgroundColor?: string;\r\n closeButtonBackgroundColor?: string;\r\n toggleButtonIconColor?: string;\r\n toggleButtonSize?: string;\r\n toggleButtonBorderRadius?: string;\r\n toggleButtonPadding?: string;\r\n toggleButtonWidth?: string;\r\n toggleButtonHeight?: string;\r\n closeButtonMarginRight?: string;\r\n closeButtonMarginLeft?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, FunctionalLabelComponent, ButtonContainerComponent],\r\n templateUrl: './sidebar.component.html',\r\n styleUrls: ['./sidebar.component.scss'],\r\n})\r\nexport class SidebarComponent {\r\n @Input() data: SidebarData = { menuItems: [] };\r\n @Input() sidebarWidthCollapse: string = '59px';\r\n @Input() sidebarWidthExpand: string = '227px';\r\n @Input() isSidebarExpanded = false;\r\n\r\n @Input() leftIcon?: string;\r\n @Input() rightIcon?: string;\r\n\r\n @Output() sidebarToggled = new EventEmitter<boolean>();\r\n\r\n @Input() toggleButtonIconData?: IconData[];\r\n\r\n @Input() closeButtonIconData?: IconData[];\r\n\r\n toggleSidebar(): void {\r\n this.isSidebarExpanded = !this.isSidebarExpanded;\r\n this.sidebarToggled.emit(this.isSidebarExpanded);\r\n }\r\n\r\n onMenuItemClick(item: SidebarItem, event: Event): void {\r\n console.log('Menu item clicked:', item, event);\r\n }\r\n}\r\n","<div class=\"sidebar-wrapper\" [class.expanded]=\"isSidebarExpanded\">\r\n <div>\r\n <aside class=\"sidebar\">\r\n @for (item of data.menuItems; track $index) {\r\n <app-functional-label\r\n class=\"sidebar-item\"\r\n [isSidebarExpanded]=\"isSidebarExpanded\"\r\n [iconLeft]=\"item.iconLeft\"\r\n [iconRight]=\"item.iconRight\"\r\n [content]=\"item.content\"\r\n [routerLink]=\"item.url\"\r\n [colorIconLeft]=\"item.colorIconLeft\"\r\n [colorIconRight]=\"item.colorIconRight\"\r\n [colorContent]=\"item.colorContent\"\r\n [colorContentHover]=\"item.colorContentHover\"\r\n [backgroundColor]=\"item.backgroundColor\"\r\n [borderRadius]=\"item.borderRadius\"\r\n (clicked)=\"onMenuItemClick(item, $event)\"\r\n [colorIconLeftHover]=\"item.colorIconLeftHover\"\r\n [colorIconRightHover]=\"item.colorIconRightHover\"\r\n [backgroundColorHover]=\"item.backgroundColorHover\"\r\n [width]=\"item.width\"\r\n [height]=\"item.height\"\r\n ></app-functional-label>\r\n }\r\n </aside>\r\n\r\n <!-- ✅ Toggle button - chỉ hiện khi KHÔNG expanded -->\r\n @if (!isSidebarExpanded) {\r\n <app-button-container\r\n class=\"sidebar-toggle-button\"\r\n [leftIconData]=\"toggleButtonIconData\"\r\n [backgroundColor]=\"data.toggleButtonBackgroundColor || 'transparent'\"\r\n [borderRadius]=\"'8px'\"\r\n [size]=\"'sm'\"\r\n [width]=\"'36px'\"\r\n [height]=\"'36px'\"\r\n (buttonClick)=\"toggleSidebar()\"\r\n ></app-button-container>\r\n }\r\n\r\n <!-- ✅ Close button - chỉ hiện khi expanded -->\r\n @if (isSidebarExpanded) {\r\n <app-button-container\r\n class=\"sidebar-close-button\"\r\n [leftIconData]=\"closeButtonIconData\"\r\n [backgroundColor]=\"\r\n data.closeButtonBackgroundColor || 'var(--brand-400)'\r\n \"\r\n [color]=\"data.toggleButtonIconColor || 'var(--neutral-500)'\"\r\n [borderRadius]=\"'8px'\"\r\n [size]=\"'sm'\"\r\n (buttonClick)=\"toggleSidebar()\"\r\n [width]=\"'36px'\"\r\n [height]=\"'36px'\"\r\n [marginRight]=\"data.closeButtonMarginRight || '24px'\"\r\n [marginLeft]=\"data.closeButtonMarginLeft || 'auto'\"\r\n ></app-button-container>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-label-button',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './label-button.component.html',\n styleUrls: ['./label-button.component.scss'],\n})\nexport class LabelButtonComponent {\n @Input() label: string = '';\n @Input() bgColor: string = '';\n @Input() borderColor: string = '';\n @Input() width: string = '100%';\n @Input() height: string = '28px';\n @Input() textColor: string = 'var(--neutral-100)';\n}\n","<button\n [style.background-color]=\"bgColor\"\n [style.border-color]=\"borderColor\"\n [style.color]=\"textColor\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n class=\"label-button\"\n type=\"button\"\n>\n {{ label }}\n</button>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-input-text',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-text.component.html',\r\n styleUrls: ['./input-text.component.scss'],\r\n})\r\nexport class InputTextComponent {\r\n @Input() headerInput: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() readonly: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() width: string = '100%';\r\n @Input() maxLength: number = 0; // 0 = no limit\r\n @Input() showLimit: boolean = false;\r\n @Input() icon: string = '';\r\n @Input() widthIcon: string = '16px';\r\n @Input() heightIcon: string = '16px';\r\n @Input() typeInput: string = 'text';\r\n @Input() showLabel: boolean = true;\r\n\r\n // Customization\r\n @Input() placeholderColor: string = '';\r\n @Input() border: string = '';\r\n @Input() borderRadius = '8px';\r\n @Input() padding = '8px 12px';\r\n @Input() height = '36px';\r\n @Input() fontSizeContent: string = '14px';\r\n @Input() fontWeightContent: string = '500';\r\n @Input() colorContent: string = 'var(--neutral-color-875)';\r\n\r\n @Input() fontSizeLabel: string = '14px';\r\n @Input() fontWeightLabel: string = '500';\r\n @Input() colorLabel: string = 'var(--neutral-color-875)';\r\n\r\n @Input() backgroundColor: string = 'var(--neutral-color-10)';\r\n\r\n @Output() valueChange = new EventEmitter<string>();\r\n @Output() iconClick = new EventEmitter<void>();\r\n\r\n private _value: string = '';\r\n\r\n onIconClick(): void {\r\n this.iconClick.emit();\r\n }\r\n\r\n @Input()\r\n set value(val: string) {\r\n this._value = val || '';\r\n }\r\n\r\n get value(): string {\r\n return this._value;\r\n }\r\n\r\n get currentLength(): number {\r\n return this._value?.length || 0;\r\n }\r\n\r\n get limit(): string {\r\n if (!this.showLimit || this.maxLength <= 0) return '';\r\n return `${this.currentLength}/${this.maxLength}`;\r\n }\r\n\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n let newValue = input.value;\r\n\r\n // Enforce maxLength if set\r\n if (this.maxLength > 0 && newValue.length > this.maxLength) {\r\n newValue = newValue.substring(0, this.maxLength);\r\n input.value = newValue;\r\n }\r\n\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n}\r\n","<div class=\"input-form\">\r\n <div class=\"input-form-content\">\r\n <label class=\"input-form-label\">\r\n @if (showLabel) {\r\n <span\r\n class=\"label-text\"\r\n [class.hidden]=\"!headerInput\"\r\n [style.font-size]=\"fontSizeLabel || null\"\r\n [style.font-weight]=\"fontWeightLabel || null\"\r\n [style.color]=\"colorLabel || null\"\r\n >\r\n {{ headerInput }}\r\n @if (required) {\r\n <span class=\"required-mark\">*</span>\r\n }\r\n </span>\r\n }\r\n <div class=\"input-field-wrapper\">\r\n <input\r\n [type]=\"typeInput\"\r\n class=\"input-form-field\"\r\n [placeholder]=\"placeholder\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.padding]=\"padding\"\r\n [style.border]=\"border || null\"\r\n [style.border-radius]=\"borderRadius\"\r\n [style.background-color]=\"backgroundColor\"\r\n [style.--placeholder-color]=\"placeholderColor || null\"\r\n [style.font-size]=\"fontSizeContent || null\"\r\n [style.font-weight]=\"fontWeightContent || null\"\r\n [style.color]=\"colorContent || null\"\r\n [value]=\"value\"\r\n (input)=\"onInput($event)\"\r\n [attr.maxlength]=\"maxLength > 0 ? maxLength : null\"\r\n />\r\n @if (icon) {\r\n <button\r\n type=\"button\"\r\n class=\"input-icon-button\"\r\n [class.clickable]=\"iconClick.observed\"\r\n (click)=\"onIconClick()\"\r\n [attr.aria-label]=\"icon\"\r\n [disabled]=\"!iconClick.observed\"\r\n >\r\n <i\r\n [class]=\"icon\"\r\n [style.width]=\"widthIcon\"\r\n [style.height]=\"heightIcon\"\r\n class=\"input-icon\"\r\n ></i>\r\n </button>\r\n }\r\n </div>\r\n </label>\r\n </div>\r\n <div class=\"limit\" [class.hidden]=\"!(maxLength > 0 && showLimit)\">\r\n <span>{{ limit }}</span>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: 'app-input-stepper',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-stepper.component.html',\r\n styleUrls: ['./input-stepper.component.scss'],\r\n})\r\nexport class InputStepperComponent {\r\n protected readonly componentId = `input-stepper-${Math.random().toString(36).substring(2, 9)}`;\r\n @Input() headerInput: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() readonly: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() width: string = '100%';\r\n @Input() min: number = 0;\r\n @Input() max: number = 100;\r\n @Input() error: string = '';\r\n @Input() helperText: string = '';\r\n @Input() step: number = 1;\r\n @Input() state: 'default' | 'negative' | 'positive' = 'default';\r\n\r\n @Output() valueChange = new EventEmitter<number>();\r\n\r\n private _value: number = 0;\r\n\r\n @Input()\r\n set value(val: number) {\r\n this._value = val || 0;\r\n }\r\n\r\n get value(): number {\r\n return this._value;\r\n }\r\n\r\n increment(): void {\r\n if (this.readonly || this.disabled) return;\r\n const newValue = this._value + this.step;\r\n if (newValue <= this.max) {\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n }\r\n\r\n decrement(): void {\r\n if (this.readonly || this.disabled) return;\r\n const newValue = this._value - this.step;\r\n if (newValue >= this.min) {\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n }\r\n\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n let newValue = Number.parseInt(input.value, 10);\r\n\r\n if (Number.isNaN(newValue)) {\r\n newValue = this.min;\r\n }\r\n\r\n if (newValue < this.min) newValue = this.min;\r\n if (newValue > this.max) newValue = this.max;\r\n\r\n input.value = newValue.toString();\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n}","<div\r\n class=\"input-form\"\r\n [style.width]=\"width\"\r\n [class.disabled]=\"disabled\"\r\n [class.state-negative]=\"state === 'negative'\"\r\n [class.state-positive]=\"state === 'positive'\"\r\n>\r\n <div class=\"input-form-content\">\r\n <label class=\"input-form-label\" [for]=\"componentId\">\r\n <span class=\"label-text\">\r\n {{ headerInput }}\r\n @if (required) {\r\n <span class=\"required-mark\">*</span>\r\n }\r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"input-stepper-content\">\r\n <button\r\n type=\"button\"\r\n class=\"input-stepper-button\"\r\n (click)=\"decrement()\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Giảm giá trị\"\r\n >\r\n <span class=\"stepper-icon\">−</span>\r\n </button>\r\n <input\r\n [id]=\"componentId\"\r\n type=\"text\"\r\n class=\"input-stepper-input\"\r\n placeholder=\"0\"\r\n [placeholder]=\"placeholder || '0'\"\r\n title=\"Giá trị\"\r\n [title]=\"headerInput || 'Giá trị'\"\r\n [readonly]=\"readonly\"\r\n [disabled]=\"disabled\"\r\n [required]=\"required\"\r\n [value]=\"value\"\r\n (input)=\"onInput($event)\"\r\n [attr.aria-label]=\"headerInput || 'Giá trị'\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"input-stepper-button\"\r\n (click)=\"increment()\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Tăng giá trị\"\r\n >\r\n <span class=\"stepper-icon\">+</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"input-stepper-footer\">\r\n @if (error) {\r\n <span class=\"input-stepper-error\">{{ error }}</span>\r\n } @else if (helperText) {\r\n <span class=\"input-stepper-helper\">{{ helperText }}</span>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, ElementRef, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-input-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-calendar.component.html',\r\n styleUrls: ['./input-calendar.component.scss'],\r\n})\r\nexport class InputCalendarComponent {\r\n @Input() headerInput: string = '';\r\n @Input() placeholder: string = 'dd/mm/yyyy';\r\n @Input() readonly: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() width: string = '100%';\r\n \r\n @Output() valueChange = new EventEmitter<string>();\r\n \r\n @ViewChild('hiddenDateInput') hiddenDateInput!: ElementRef<HTMLInputElement>;\r\n \r\n displayValue: string = '';\r\n private _value: string = '';\r\n \r\n @Input()\r\n set value(val: string) {\r\n this._value = val;\r\n this.displayValue = this.formatToDisplay(val);\r\n }\r\n \r\n get value(): string {\r\n return this._value;\r\n }\r\n \r\n // Convert ISO format (yyyy-mm-dd) to display format (dd/mm/yyyy)\r\n formatToDisplay(isoDate: string): string {\r\n if (!isoDate) return '';\r\n const parts = isoDate.split('-');\r\n if (parts.length === 3) {\r\n return `${parts[2]}/${parts[1]}/${parts[0]}`;\r\n }\r\n return isoDate;\r\n }\r\n \r\n // Validate if a date string (dd/mm/yyyy) represents a valid date\r\n isValidDate(displayDate: string): boolean {\r\n if (!displayDate || displayDate.length !== 10) return false;\r\n \r\n const parts = displayDate.split('/');\r\n if (parts.length !== 3) return false;\r\n \r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10);\r\n const year = parseInt(parts[2], 10);\r\n \r\n // Basic range validation\r\n if (isNaN(day) || isNaN(month) || isNaN(year)) return false;\r\n if (month < 1 || month > 12) return false;\r\n if (day < 1 || day > 31) return false;\r\n if (year < 1900 || year > 2100) return false;\r\n \r\n // Create date and verify it matches input (handles invalid dates like 31/02)\r\n const date = new Date(year, month - 1, day);\r\n return date.getFullYear() === year && \r\n date.getMonth() === month - 1 && \r\n date.getDate() === day;\r\n }\r\n\r\n // Convert display format (dd/mm/yyyy) to ISO format (yyyy-mm-dd)\r\n formatToISO(displayDate: string): string {\r\n if (!displayDate) return '';\r\n const parts = displayDate.split('/');\r\n if (parts.length === 3) {\r\n return `${parts[2]}-${parts[1]}-${parts[0]}`;\r\n }\r\n return displayDate;\r\n }\r\n \r\n // Handle text input with auto-formatting\r\n onDisplayInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value.replaceAll(/[^\\d/]/g, '');\r\n \r\n // Auto-insert slashes at positions 2 and 5\r\n const parts = value.split('/');\r\n if (parts[0] && parts[0].length >= 2 && parts.length === 1) {\r\n value = parts[0].substring(0, 2) + '/' + parts[0].substring(2);\r\n }\r\n if (value.length >= 5 && value.split('/').length === 2 && !value.endsWith('/')) {\r\n const newParts = value.split('/');\r\n if (newParts[1] && newParts[1].length >= 2) {\r\n value = newParts[0] + '/' + newParts[1].substring(0, 2) + '/' + newParts[1].substring(2);\r\n }\r\n }\r\n \r\n // Limit to dd/mm/yyyy format\r\n if (value.length > 10) {\r\n value = value.substring(0, 10);\r\n }\r\n \r\n this.displayValue = value;\r\n \r\n // Only emit if complete and valid date\r\n if (value.length === 10 && this.isValidDate(value)) {\r\n const isoValue = this.formatToISO(value);\r\n this._value = isoValue;\r\n this.valueChange.emit(isoValue);\r\n }\r\n }\r\n \r\n // Open native date picker\r\n openDatePicker(): void {\r\n if (!this.readonly && this.hiddenDateInput) {\r\n this.hiddenDateInput.nativeElement.showPicker();\r\n }\r\n }\r\n \r\n // Handle date picker selection\r\n onDatePickerChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this._value = input.value;\r\n this.displayValue = this.formatToDisplay(input.value);\r\n this.valueChange.emit(this._value);\r\n }\r\n}","<div class=\"input-form\" [style.width]=\"width\">\r\n <label class=\"input-form-label\">\r\n <div class=\"input-form-label-header\">\r\n <span>{{ headerInput }}</span>\r\n @if (required) {\r\n <span class=\"required-mark\">*</span>\r\n }\r\n </div>\r\n <div class=\"calendar-input-wrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"input-form-field\"\r\n [placeholder]=\"placeholder\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [value]=\"displayValue\"\r\n (input)=\"onDisplayInput($event)\"\r\n maxlength=\"10\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"calendar-icon-btn\"\r\n (click)=\"openDatePicker()\"\r\n [disabled]=\"readonly\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\r\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n </svg>\r\n </button>\r\n <input\r\n #hiddenDateInput\r\n type=\"date\"\r\n class=\"hidden-date-input\"\r\n [value]=\"value\"\r\n (change)=\"onDatePickerChange($event)\"\r\n />\r\n </div>\r\n </label>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface ColumnConfig {\r\n header: string;\r\n key: string;\r\n width: string;\r\n}\r\n\r\n@Component({\r\n selector: 'tr[app-table-header]',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './table-header.component.html',\r\n styleUrl: './table-header.component.scss',\r\n})\r\nexport class TableHeaderComponent {\r\n @Input() columns: ColumnConfig[] = [];\r\n @Input() backgroundColor?: string;\r\n @Input({ transform: (value: string | undefined) => value || '#ffffff' })\r\n textColor: string = '#ffffff';\r\n @Input() headerIconLeft?: string;\r\n @Input() headerIconRight?: string;\r\n @Input() fontSize: string = 'var(--font-xs)';\r\n}\r\n","@for (col of columns; track col.key) {\r\n <th\r\n scope=\"col\"\r\n [style.width]=\"col.width\"\r\n [style.backgroundColor]=\"backgroundColor\"\r\n [style.color]=\"textColor\"\r\n >\r\n <div class=\"header-container\">\r\n <div class=\"header-content\">\r\n @if (headerIconLeft) {\r\n <div class=\"icon-left\">\r\n <i [class]=\"headerIconLeft\"></i>\r\n </div>\r\n }\r\n <div class=\"header-text\" [style.font-size]=\"fontSize\">\r\n {{ col.header }}\r\n </div>\r\n @if (headerIconRight) {\r\n <div class=\"icon-right\">\r\n <i [class]=\"headerIconRight\"></i>\r\n </div>\r\n }\r\n </div>\r\n <p class=\"divider\">|</p>\r\n </div>\r\n </th>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, TemplateRef } from '@angular/core';\r\nimport { ColumnConfig } from '../table-header/table-header.component';\r\n\r\n@Component({\r\n selector: '[app-table-body]', // ✅ Attribute selector\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './table-body.component.html',\r\n styleUrl: './table-body.component.scss',\r\n})\r\nexport class TableBodyComponent {\r\n @Input() rows: any[] = [];\r\n @Input() columns: ColumnConfig[] = [];\r\n @Input() columnTemplates: { [key: string]: TemplateRef<any> } = {};\r\n @Input() fontSize: string = 'var(--font-sm)';\r\n}\r\n","@for (row of rows; track $index) {\r\n <tr>\r\n @for (col of columns; track col.key) {\r\n <td [style.width]=\"col.width\" [style.font-size]=\"fontSize\">\r\n @if (columnTemplates[col.key]) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n columnTemplates[col.key];\r\n context: { $implicit: row[col.key], row: row }\r\n \"\r\n ></ng-container>\r\n } @else {\r\n {{ row[col.key] }}\r\n }\r\n </td>\r\n }\r\n </tr>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, TemplateRef } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-approval-list-item',\r\n templateUrl: './approval-list-item.component.html',\r\n styleUrls: ['./approval-list-item.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true\r\n})\r\nexport class ApprovalListItemComponent {\r\n @Input() name!: string;\r\n @Input() date!: Date;\r\n @Input() rightTemplate?: TemplateRef<any>;\r\n @Input() rightContext: any = {};\r\n\r\n get parsedDate(): Date {\r\n return new Date(this.date);\r\n }\r\n}\r\n","<div class=\"approval-item\">\r\n <!-- LEFT -->\r\n <div class=\"approval-item-left\">\r\n <span class=\"approval-item-left-name\">{{ name }}</span>\r\n <span class=\"approval-item-left-date\">\r\n <span class=\"approval-item-left-date-title\">Ngày tạo đơn:</span>\r\n {{ date | date: 'dd/MM/yyyy' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"approval-item-right\">\r\n <ng-container *ngIf=\"rightTemplate; else defaultRight\">\r\n <ng-container *ngTemplateOutlet=\"rightTemplate; context: rightContext\">\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultRight>\r\n <span class=\"text-gray-400\">—</span>\r\n </ng-template>\r\n </div>\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ApprovalListItemInterface } from '../approval-list-item/approval-list-item.model';\r\nimport { ApprovalListItemComponent } from '../approval-list-item/approval-list-item.component';\r\n\r\n@Component({\r\n selector: 'app-approval-list',\r\n standalone: true,\r\n imports: [CommonModule, ApprovalListItemComponent],\r\n templateUrl: './approval-list.component.html',\r\n styleUrls: ['./approval-list.component.scss'],\r\n})\r\nexport class ApprovalListComponent {\r\n @Input() rows: ApprovalListItemInterface[] = [];\r\n\r\n @Input() headerContentRight!: string;\r\n @Input() headerContentLeft!: string;\r\n @Input() width!: string;\r\n}\r\n","<div class=\"approval-list\" [style.width]=\"width\">\r\n <div class=\"approval-list-header\">\r\n <span class=\"approval-list-header-left\">{{ headerContentLeft }}</span>\r\n <div>\r\n <p>{{ headerContentRight }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"approval-list-content\" [style.width]=\"width\">\r\n <app-approval-list-item\r\n *ngFor=\"let row of rows\"\r\n [name]=\"row.name\"\r\n [date]=\"row.date\"\r\n [rightTemplate]=\"row.rightTemplate\"\r\n [rightContext]=\"row.rightContext\"\r\n >\r\n </app-approval-list-item>\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { ButtonContainerComponent } from \"../../button/button-container/button-container.component\";\r\n\r\n@Component({\r\n selector: 'app-pop-up-confirm',\r\n standalone: true,\r\n imports: [CommonModule, ButtonContainerComponent],\r\n templateUrl: './pop-up-confirm.component.html',\r\n styleUrls: ['./pop-up-confirm.component.scss'],\r\n})\r\nexport class PopUpConfirmComponent {\r\n\r\n @Input() imgUrl: string = '';\r\n @Input() title: string = '';\r\n @Input() content: string = '';\r\n @Input() colorButton: string = 'var(--brand-600)';\r\n\r\n @Output() confirmClick = new EventEmitter<void>();\r\n @Output() cancelClick = new EventEmitter<void>();\r\n\r\n onConfirm(): void {\r\n this.confirmClick.emit();\r\n }\r\n\r\n onCancel(): void {\r\n this.cancelClick.emit();\r\n }\r\n}","<div class=\"pop-up-confirm-overlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"popup-title\">\r\n <div class=\"pop-up-confirm\">\r\n <div class=\"pop-up-confirm-content\">\r\n <img *ngIf=\"imgUrl\" [src]=\"imgUrl\" alt=\"\">\r\n <div class=\"pop-up-confirm-text\">\r\n <p class=\"pop-up-title\" id=\"popup-title\">{{title}}</p>\r\n <p class=\"pop-up-content\">{{content}}</p>\r\n </div>\r\n </div>\r\n <div class=\"pop-up-confirm-actions\">\r\n <app-button-container size=\"md\" content=\"Quay Lại\" backgroundColor=\"var(--neutral-100)\" color=\"var(--neutral-800)\" (buttonClick)=\"onCancel()\"></app-button-container>\r\n <app-button-container size=\"md\" content=\"Đồng Ý\" [backgroundColor]=\"colorButton\" color=\"#fff\" (buttonClick)=\"onConfirm()\"></app-button-container>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-modal',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ModalComponent {\n @Input() title: string = '';\n @Input() width: string = '800px';\n @Input() minHeight: string = '300px';\n @Input() isOpen: boolean = false;\n @Input() theme: 'default' | 'white' = 'default';\n\n @Output() close = new EventEmitter<void>();\n\n onOverlayClick(event: Event) {\n if (event.target === event.currentTarget) {\n this.close.emit();\n }\n }\n\n onCloseClick() {\n this.close.emit();\n }\n}\n","<div class=\"modal-overlay\" *ngIf=\"isOpen\" (click)=\"onOverlayClick($event)\">\n <div\n class=\"modal-container\"\n [class.theme-white]=\"theme === 'white'\"\n [style.width]=\"width\"\n [style.min-height]=\"minHeight\"\n >\n <div class=\"modal-header\">\n <span class=\"modal-title\">{{ title }}</span>\n <button class=\"modal-close-btn\" (click)=\"onCloseClick()\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[modal-body]\"></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"[modal-footer]\"></ng-content>\n </div>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface AvatarUploadedFile {\n id: string;\n file: File;\n fileName: string;\n previewUrl: string | null;\n}\n\n@Component({\n selector: 'app-avatar-upload-button',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './avatar-upload-button.component.html',\n styleUrl: './avatar-upload-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AvatarUploadButtonComponent {\n @Input() label: string = '';\n @Input() required: boolean = false;\n @Input() showTooltip: boolean = false;\n @Input() tooltipText: string = '';\n @Input() buttonText: string = 'Tải file lên';\n @Input() acceptFormats: string = '.png,.jpeg,.jpg';\n @Input() helperText: string = 'Định dạng .png, .jpeg, .jpg';\n\n @Output() fileChange = new EventEmitter<AvatarUploadedFile | null>();\n\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n uploadedFile: AvatarUploadedFile | null = null;\n\n onButtonClick() {\n this.fileInput.nativeElement.click();\n }\n\n onFileChange(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n const file = input.files[0];\n this.uploadedFile = this.createAvatarUploadedFile(file);\n this.fileChange.emit(this.uploadedFile);\n }\n input.value = '';\n }\n\n onRemove() {\n if (this.uploadedFile?.previewUrl) {\n URL.revokeObjectURL(this.uploadedFile.previewUrl);\n }\n this.uploadedFile = null;\n this.fileChange.emit(null);\n }\n\n private createAvatarUploadedFile(file: File): AvatarUploadedFile {\n const isImage = file.type.startsWith('image/');\n return {\n id: this.generateId(),\n file: file,\n fileName: file.name,\n previewUrl: isImage ? URL.createObjectURL(file) : null,\n };\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2, 9);\n }\n}\n","<div class=\"avatar-upload-wrapper\">\n <div class=\"label-row\" *ngIf=\"label\">\n <span class=\"label-text\">{{ label }}</span>\n <span class=\"required-mark\" *ngIf=\"required\">*</span>\n <button type=\"button\" class=\"tooltip-icon\" *ngIf=\"showTooltip\" [title]=\"tooltipText\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M8 7V11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n <circle cx=\"8\" cy=\"5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n </button>\n </div>\n\n <button type=\"button\" class=\"upload-button\" (click)=\"onButtonClick()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 4V13M10 4L6 8M10 4L14 8\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 13V15C3 15.5523 3.44772 16 4 16H16C16.5523 16 17 15.5523 17 15V13\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span>{{ buttonText }}</span>\n </button>\n\n <input\n #fileInput\n type=\"file\"\n class=\"file-input\"\n [accept]=\"acceptFormats\"\n (change)=\"onFileChange($event)\"\n />\n\n <span class=\"helper-text\" *ngIf=\"helperText && !uploadedFile\">{{ helperText }}</span>\n\n <!-- Uploaded File Preview -->\n <div class=\"file-preview\" *ngIf=\"uploadedFile\">\n <img\n *ngIf=\"uploadedFile.previewUrl\"\n [src]=\"uploadedFile.previewUrl\"\n [alt]=\"uploadedFile.fileName\"\n class=\"preview-image\"\n />\n <span class=\"file-name\">{{ uploadedFile.fileName }}</span>\n <button type=\"button\" class=\"remove-btn\" (click)=\"onRemove()\" title=\"Xóa\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface UploadedFile {\n id: string;\n file: File;\n fileName: string;\n fileSize: string;\n dateTime: string;\n fileType: string;\n}\n\n@Component({\n selector: 'app-file-upload-dropzone',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './file-upload-dropzone.component.html',\n styleUrl: './file-upload-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FileUploadDropzoneComponent {\n @Input() label: string = 'Thêm file bài học';\n @Input() buttonText: string = 'Tải lên';\n @Input() maxSize: string = '10MB';\n @Input() acceptFormats: string = '.docx,.xlsx,.png,.jpg,.jpeg,.pdf';\n @Input() helperText: string = '';\n\n @Output() filesChange = new EventEmitter<UploadedFile[]>();\n @Output() fileDownload = new EventEmitter<UploadedFile>();\n @Output() fileDelete = new EventEmitter<UploadedFile>();\n\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n uploadedFiles: UploadedFile[] = [];\n isDragging = false;\n\n get displayHelperText(): string {\n if (this.helperText) return this.helperText;\n return `Dung lượng tối đa ${this.maxSize}(${this.acceptFormats.replace(/\\./g, '').split(',').join(', ')}...)`;\n }\n\n onButtonClick() {\n this.fileInput.nativeElement.click();\n }\n\n onFileChange(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this.addFiles(Array.from(input.files));\n }\n input.value = '';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = true;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = false;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = false;\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.addFiles(Array.from(files));\n }\n }\n\n onDownload(file: UploadedFile) {\n this.fileDownload.emit(file);\n }\n\n onDelete(file: UploadedFile) {\n this.uploadedFiles = this.uploadedFiles.filter((f) => f.id !== file.id);\n this.fileDelete.emit(file);\n this.filesChange.emit(this.uploadedFiles);\n }\n\n getIconType(file: UploadedFile): string {\n const ext = file.fileName.split('.').pop()?.toLowerCase() || '';\n if (ext === 'pdf') return 'pdf';\n if (['doc', 'docx'].includes(ext)) return 'doc';\n if (['xls', 'xlsx'].includes(ext)) return 'xls';\n if (['png', 'jpg', 'jpeg', 'gif', 'webp'].includes(ext)) return 'image';\n return 'file';\n }\n\n private addFiles(files: File[]) {\n const newFiles = files.map((file) => this.createUploadedFile(file));\n this.uploadedFiles = [...this.uploadedFiles, ...newFiles];\n this.filesChange.emit(this.uploadedFiles);\n }\n\n private createUploadedFile(file: File): UploadedFile {\n return {\n id: this.generateId(),\n file: file,\n fileName: file.name,\n fileSize: this.formatFileSize(file.size),\n dateTime: this.formatDateTime(new Date()),\n fileType: file.name.split('.').pop()?.toLowerCase() || '',\n };\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2, 9);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + sizes[i];\n }\n\n private formatDateTime(date: Date): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n return `${day}/${month}/${year} ${hours}:${minutes}`;\n }\n}\n","<div class=\"file-upload-dropzone\">\n <label class=\"dropzone-label\">{{ label }}</label>\n\n <div\n class=\"dropzone-area\"\n [class.dragging]=\"isDragging\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (click)=\"onButtonClick()\"\n >\n <div class=\"dropzone-content\">\n <svg\n class=\"upload-icon\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 16V8M12 8L9 11M12 8L15 11\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M9 22H15C18.866 22 22 18.866 22 15C22 12.0667 20.2333 9.56667 17.6667 8.46667C17.8778 7.98889 18 7.46667 18 6.93333C18 4.41111 15.5778 2.44444 12.8333 3.04444C11.0111 1.15556 8.11111 0.911111 6 2.48889C3.51111 4.35556 3.22222 8.02222 5.11111 10.2444C3.24444 11.2222 2 13.1778 2 15.4444C2 18.9778 5.02222 22 9 22Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n\n <button type=\"button\" class=\"upload-btn\" (click)=\"$event.stopPropagation(); onButtonClick()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 16V8M12 8L9 11M12 8L15 11\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n {{ buttonText }}\n </button>\n\n <span class=\"helper-text\">{{ displayHelperText }}</span>\n </div>\n </div>\n\n <input\n #fileInput\n type=\"file\"\n [accept]=\"acceptFormats\"\n (change)=\"onFileChange($event)\"\n multiple\n hidden\n />\n\n <!-- Attachment List -->\n <div class=\"attachment-list\" *ngIf=\"uploadedFiles.length > 0\">\n <div class=\"attachment-item\" *ngFor=\"let file of uploadedFiles\">\n <div class=\"file-icon\" [ngClass]=\"getIconType(file)\">\n <ng-container [ngSwitch]=\"getIconType(file)\">\n <svg\n *ngSwitchCase=\"'pdf'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#FEE2E2\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#EF4444\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#EF4444\" font-size=\"6\" font-weight=\"600\">\n PDF\n </text>\n </svg>\n <svg\n *ngSwitchCase=\"'doc'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#DBEAFE\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#3B82F6\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#3B82F6\" font-size=\"6\" font-weight=\"600\">\n DOC\n </text>\n </svg>\n <svg\n *ngSwitchCase=\"'xls'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#D1FAE5\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#10B981\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#10B981\" font-size=\"6\" font-weight=\"600\">\n XLS\n </text>\n </svg>\n <svg\n *ngSwitchCase=\"'image'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#FEF3C7\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#F59E0B\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#F59E0B\" font-size=\"6\" font-weight=\"600\">\n IMG\n </text>\n </svg>\n <svg\n *ngSwitchDefault\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#F3F4F6\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#9CA3AF\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#9CA3AF\" font-size=\"6\" font-weight=\"600\">\n FILE\n </text>\n </svg>\n </ng-container>\n </div>\n\n <div class=\"file-info\">\n <span class=\"file-name\">{{ file.fileName }}</span>\n <div class=\"file-meta\">\n <span class=\"file-size\">{{ file.fileSize }}</span>\n <span class=\"separator\">•</span>\n <span class=\"file-date\">{{ file.dateTime }}</span>\n </div>\n </div>\n\n <div class=\"file-actions\">\n <button class=\"action-btn download-btn\" (click)=\"onDownload(file)\" title=\"Tải xuống\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3V13M10 13L6 9M10 13L14 9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15V16C3 16.5523 3.44772 17 4 17H16C16.5523 17 17 16.5523 17 16V15\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <button class=\"action-btn delete-btn\" (click)=\"onDelete(file)\" title=\"Xóa\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 5H16M7 5V4C7 3.44772 7.44772 3 8 3H12C12.5523 3 13 3.44772 13 4V5M8 9V14M12 9V14M5 5L6 16C6 16.5523 6.44772 17 7 17H13C13.5523 17 14 16.5523 14 16L15 5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n","/*\r\n * Public API Surface of intern-hub-layout\r\n */\r\n\r\n// Layout components\r\nexport * from './libs/layouts/header/header.component';\r\nexport * from './libs/layouts/sidebar/sidebar.component';\r\n\r\n// Shared components - Icons\r\nexport * from './libs/shared/components/icon/icon.component';\r\nexport * from './libs/shared/components/functional-label/functional-label.component';\r\n\r\n// Shared components - Buttons\r\nexport * from './libs/shared/components/button/button-container/button-container.component';\r\nexport * from './libs/shared/components/button/button-container/button-container.model';\r\nexport * from './libs/shared/components/button/label-button/label-button.component';\r\n\r\n// Shared components - Inputs\r\nexport * from './libs/shared/components/input/input-text/input-text.component';\r\nexport * from './libs/shared/components/input/input-stepper/input-stepper.component';\r\nexport * from './libs/shared/components/input/input-calendar/input-calendar.component';\r\n\r\n// Shared components - Table\r\nexport * from './libs/shared/components/table/table-header/table-header.component';\r\nexport * from './libs/shared/components/table/table-body/table-body.component';\r\n\r\n// Shared components - Approval\r\nexport * from './libs/shared/components/approval/approval-list/approval-list.component';\r\nexport * from './libs/shared/components/approval/approval-list-item/approval-list-item.component';\r\nexport * from './libs/shared/components/approval/approval-list-item/approval-list-item.model';\r\n\r\n// Shared components - Pop-ups\r\nexport * from './libs/shared/components/pop-up/pop-up-confirm/pop-up-confirm.component';\r\n\r\n// Shared components - Modal\r\nexport * from './libs/shared/components/modal/modal.component';\r\n\r\n// Shared components - Upload Button\r\nexport * from './libs/shared/components/avatar-upload-button/avatar-upload-button.component';\r\n\r\n// Shared components - File Upload Dropzone\r\nexport * from './libs/shared/components/file-upload-dropzone/file-upload-dropzone.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goat-bravos-intern-hub-layout.mjs","sources":["../../../src/libs/shared/components/icon/icon.component.ts","../../../src/libs/shared/components/icon/icon.component.html","../../../src/libs/layouts/header/header.component.ts","../../../src/libs/layouts/header/header.component.html","../../../src/libs/shared/components/functional-label/functional-label.component.ts","../../../src/libs/shared/components/functional-label/functional-label.component.html","../../../src/libs/shared/components/button/button-container/button-container.model.ts","../../../src/libs/shared/components/button/button-container/button-container.component.ts","../../../src/libs/shared/components/button/button-container/button-container.component.html","../../../src/libs/layouts/sidebar/sidebar.component.ts","../../../src/libs/layouts/sidebar/sidebar.component.html","../../../src/libs/shared/components/button/label-button/label-button.component.ts","../../../src/libs/shared/components/button/label-button/label-button.component.html","../../../src/libs/shared/components/input/input-text/input-text.component.ts","../../../src/libs/shared/components/input/input-text/input-text.component.html","../../../src/libs/shared/components/input/input-stepper/input-stepper.component.ts","../../../src/libs/shared/components/input/input-stepper/input-stepper.component.html","../../../src/libs/shared/components/input/input-calendar/input-calendar.component.ts","../../../src/libs/shared/components/input/input-calendar/input-calendar.component.html","../../../src/libs/shared/components/table/table-header/table-header.component.ts","../../../src/libs/shared/components/table/table-header/table-header.component.html","../../../src/libs/shared/components/table/table-body/table-body.component.ts","../../../src/libs/shared/components/table/table-body/table-body.component.html","../../../src/libs/shared/components/approval/approval-list-item/approval-list-item.component.ts","../../../src/libs/shared/components/approval/approval-list-item/approval-list-item.component.html","../../../src/libs/shared/components/approval/approval-list/approval-list.component.ts","../../../src/libs/shared/components/approval/approval-list/approval-list.component.html","../../../src/libs/shared/components/pop-up/pop-up-confirm/pop-up-confirm.component.ts","../../../src/libs/shared/components/pop-up/pop-up-confirm/pop-up-confirm.component.html","../../../src/libs/shared/components/modal/modal.component.ts","../../../src/libs/shared/components/modal/modal.component.html","../../../src/libs/shared/components/avatar-upload-button/avatar-upload-button.component.ts","../../../src/libs/shared/components/avatar-upload-button/avatar-upload-button.component.html","../../../src/libs/shared/components/file-upload-dropzone/file-upload-dropzone.component.ts","../../../src/libs/shared/components/file-upload-dropzone/file-upload-dropzone.component.html","../../../src/public-api.ts","../../../src/goat-bravos-intern-hub-layout.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nexport interface IconData {\r\n icon: string;\r\n colorIcon?: string;\r\n backgroundColorHover?: string;\r\n routerLink?: string;\r\n width?: string;\r\n height?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-icon',\r\n standalone: true,\r\n imports: [CommonModule, RouterModule],\r\n templateUrl: './icon.component.html',\r\n styleUrls: ['./icon.component.scss'],\r\n})\r\nexport class IconComponent {\r\n @Input() iconData?: IconData;\r\n @Input() icon?: string;\r\n @Input() colorIcon?: string;\r\n @Input() routerLink?: string;\r\n @Input() width?: string = '20px';\r\n @Input() height?: string = '20px';\r\n @Input() colorIconHover?: string;\r\n @Input() backgroundColorHover?: string;\r\n\r\n @Output() clicked = new EventEmitter<Event>();\r\n\r\n get iconClass(): string {\r\n const iconName = this.iconData?.icon || this.icon || '';\r\n return iconName.includes('dsi') ? iconName : `dsi ${iconName}`;\r\n }\r\n\r\n get iconColor(): string | undefined {\r\n return this.iconData?.colorIcon || this.colorIcon;\r\n }\r\n\r\n get iconWidth(): string {\r\n return this.iconData?.width || this.width || '20px';\r\n }\r\n\r\n get iconHeight(): string {\r\n return this.iconData?.height || this.height || '20px';\r\n }\r\n\r\n get iconRouterLink(): string | undefined {\r\n return this.iconData?.routerLink || this.routerLink;\r\n }\r\n\r\n get backgroundColor(): string | undefined {\r\n return this.iconData?.backgroundColor;\r\n }\r\n\r\n handleClick(event: Event): void {\r\n if (!this.iconRouterLink) {\r\n event.preventDefault();\r\n this.clicked.emit(event);\r\n }\r\n }\r\n}\r\n","<i\r\n class=\"icon\"\r\n [ngClass]=\"iconClass\"\r\n [style.color]=\"iconColor\"\r\n [style.width]=\"iconWidth\"\r\n [style.height]=\"iconHeight\"\r\n [style.backgroundColor]=\"backgroundColor\"\r\n [routerLink]=\"iconRouterLink\"\r\n [attr.tabindex]=\"iconRouterLink ? null : 0\"\r\n [attr.role]=\"iconRouterLink ? null : 'button'\"\r\n (click)=\"handleClick($event)\"\r\n (keydown.enter)=\"handleClick($event)\"\r\n (keydown.space)=\"handleClick($event)\"\r\n></i>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n IconComponent,\r\n IconData,\r\n} from '../../shared/components/icon/icon.component';\r\n\r\nexport interface HeaderAction {\r\n icon: IconData | string;\r\n content: string;\r\n method?: () => void;\r\n badge?: string;\r\n colorIcon?: string;\r\n width?: string;\r\n height?: string;\r\n}\r\n\r\nexport interface HeaderData {\r\n headerItems: HeaderAction[];\r\n userName: string;\r\n userIcon?: IconData | string;\r\n userIconColor?: string;\r\n dropdownIcon?: IconData | string;\r\n dropdownIconColor?: string;\r\n logo?: string;\r\n minWidth?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-header-component',\r\n standalone: true,\r\n imports: [CommonModule, IconComponent],\r\n templateUrl: './header.component.html',\r\n styleUrls: ['./header.component.scss'],\r\n})\r\nexport class HeaderComponent {\r\n @Input() data: HeaderData = {\r\n headerItems: [],\r\n userName: 'Guest',\r\n userIcon: 'dsi-user-01-line',\r\n dropdownIcon: 'dsi-arrow-down-solid',\r\n logo: 'assets/FPT-IS-Logo.png',\r\n };\r\n\r\n @Input() paddingHeader: string = '12px 20px 12px 16px';\r\n\r\n handleActionClick(item: HeaderAction, event: Event): void {\r\n if (item.method) {\r\n event.preventDefault();\r\n item.method();\r\n }\r\n }\r\n\r\n getIconData(\r\n icon: IconData | string | undefined,\r\n colorIcon?: string,\r\n width?: string,\r\n height?: string,\r\n ): IconData | undefined {\r\n if (!icon) return undefined;\r\n\r\n if (typeof icon === 'string') {\r\n return {\r\n icon,\r\n colorIcon,\r\n width,\r\n height,\r\n };\r\n }\r\n\r\n return icon;\r\n }\r\n}\r\n","<header\r\n class=\"app-header\"\r\n [style.padding]=\"paddingHeader\"\r\n [style.min-width]=\"data.minWidth\"\r\n>\r\n <div class=\"header-left\">\r\n <img\r\n class=\"logo\"\r\n [src]=\"data.logo || 'assets/FPT-IS-Logo.png'\"\r\n alt=\"Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"header-right\">\r\n @for (item of data.headerItems; track $index) {\r\n <button\r\n class=\"header-btn\"\r\n [attr.aria-label]=\"item.content\"\r\n (click)=\"handleActionClick(item, $event)\"\r\n >\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n item.icon,\r\n item.colorIcon,\r\n item.width || '16px',\r\n item.height || '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n @if (item.badge) {\r\n <span class=\"badge\">{{ item.badge }}</span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"header-user\">\r\n <button class=\"user-btn\">\r\n @if (data.userIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(data.userIcon, data.userIconColor, '16px', '16px')\r\n \"\r\n ></app-icon>\r\n }\r\n <span class=\"user-name\">{{ data.userName }}</span>\r\n @if (data.dropdownIcon) {\r\n <app-icon\r\n [iconData]=\"\r\n getIconData(\r\n data.dropdownIcon,\r\n data.dropdownIconColor,\r\n '16px',\r\n '16px'\r\n )\r\n \"\r\n ></app-icon>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n</header>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { IconComponent, IconData } from '../icon/icon.component';\r\n\r\n@Component({\r\n selector: 'app-functional-label',\r\n standalone: true,\r\n imports: [CommonModule, RouterModule, IconComponent],\r\n templateUrl: './functional-label.component.html',\r\n styleUrls: ['./functional-label.component.scss'],\r\n})\r\nexport class FunctionalLabelComponent {\r\n @Input() iconLeft?: IconData | string;\r\n @Input() iconRight?: IconData | string;\r\n\r\n @Input() colorIconLeft?: string;\r\n @Input() colorIconRight?: string;\r\n @Input() widthIconLeft?: string = '20px';\r\n @Input() heightIconLeft?: string = '20px';\r\n @Input() widthIconRight?: string = '20px';\r\n @Input() heightIconRight?: string = '20px';\r\n\r\n @Input() colorIconLeftHover?: string;\r\n @Input() colorIconRightHover?: string;\r\n @Input() colorContentHover?: string;\r\n @Input() backgroundColorHover?: string;\r\n @Input() borderRadiusHover?: string;\r\n\r\n @Input() content?: string;\r\n @Input() fontSizeContent?: string = '14px';\r\n @Input() colorContent?: string;\r\n @Input() widthContent?: string = '100%';\r\n @Input() heightContent?: string = '100%';\r\n\r\n @Input() backgroundColor?: string;\r\n @Input() borderRadius?: string;\r\n @Input() width?: string;\r\n @Input() height?: string;\r\n\r\n @Input() routerLink?: string;\r\n @Input() isSidebarExpanded: boolean = false;\r\n @Output() clicked = new EventEmitter<Event>();\r\n\r\n get currentBackgroundColor(): string | undefined {\r\n return this.backgroundColor;\r\n }\r\n\r\n get currentBorderRadius(): string | undefined {\r\n return this.borderRadius;\r\n }\r\n\r\n get currentColorContent(): string | undefined {\r\n return this.colorContent;\r\n }\r\n\r\n get hasIconLeft(): boolean {\r\n return !!this.iconLeft;\r\n }\r\n\r\n get hasIconRight(): boolean {\r\n return !!this.iconRight;\r\n }\r\n\r\n get iconLeftData(): IconData | undefined {\r\n if (!this.iconLeft) return undefined;\r\n\r\n const color = this.isSidebarExpanded\r\n ? this.colorIconLeftHover || this.colorIconLeft\r\n : this.colorIconLeft;\r\n\r\n if (typeof this.iconLeft === 'string') {\r\n return {\r\n icon: this.iconLeft,\r\n colorIcon: color,\r\n width: this.widthIconLeft,\r\n height: this.heightIconLeft,\r\n };\r\n }\r\n return {\r\n ...this.iconLeft,\r\n colorIcon: color || this.iconLeft.colorIcon,\r\n };\r\n }\r\n\r\n get iconRightData(): IconData | undefined {\r\n if (!this.iconRight) return undefined;\r\n\r\n const color = this.isSidebarExpanded\r\n ? this.colorIconRightHover || this.colorIconRight\r\n : this.colorIconRight;\r\n\r\n if (typeof this.iconRight === 'string') {\r\n return {\r\n icon: this.iconRight,\r\n colorIcon: color,\r\n width: this.widthIconRight,\r\n height: this.heightIconRight,\r\n };\r\n }\r\n return {\r\n ...this.iconRight,\r\n colorIcon: color || this.iconRight.colorIcon,\r\n };\r\n }\r\n\r\n handleClick(event: Event): void {\r\n if (!this.routerLink) {\r\n event.preventDefault();\r\n this.clicked.emit(event);\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"functional-label\"\r\n (click)=\"handleClick($event)\"\r\n (keydown.enter)=\"handleClick($event)\"\r\n (keydown.space)=\"handleClick($event)\"\r\n [attr.tabindex]=\"routerLink ? null : 0\"\r\n [attr.role]=\"routerLink ? null : 'button'\"\r\n [style.--bg-color]=\"backgroundColor\"\r\n [style.--bg-hover-color]=\"backgroundColorHover || backgroundColor\"\r\n [style.border-radius]=\"borderRadius\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.--content-hover-color]=\"colorContentHover\"\r\n>\r\n @if (hasIconLeft && iconLeftData) {\r\n <app-icon\r\n [iconData]=\"iconLeftData\"\r\n [width]=\"widthIconLeft\"\r\n [height]=\"heightIconLeft\"\r\n ></app-icon>\r\n }\r\n\r\n <a\r\n [routerLink]=\"routerLink\"\r\n [style.width]=\"widthContent\"\r\n [style.height]=\"heightContent\"\r\n [style.font-size]=\"fontSizeContent\"\r\n [style.--content-color]=\"colorContent\"\r\n >\r\n {{ content }}\r\n </a>\r\n\r\n @if (hasIconRight && iconRightData) {\r\n <app-icon\r\n [iconData]=\"iconRightData\"\r\n [width]=\"widthIconRight\"\r\n [height]=\"heightIconRight\"\r\n ></app-icon>\r\n }\r\n</div>\r\n","export interface ButtonContainerInterface {\r\n size: ButtonSize;\r\n leftIcon?: string;\r\n rightIcon?: string;\r\n content: string;\r\n event?: string;\r\n fontSize?: string;\r\n color?: string;\r\n backgroundColor?: string;\r\n borderColor?: string;\r\n}\r\n\r\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\r\n\r\nexport interface ButtonSizeConfig {\r\n minWidth: string;\r\n minHeight: string;\r\n fontSize: string;\r\n iconSize: string;\r\n contentWidth: string;\r\n contentHeight: string;\r\n}\r\n\r\nexport const BUTTON_SIZE_MAP: Record<ButtonSize, ButtonSizeConfig> = {\r\n xs: {\r\n minWidth: '47px',\r\n minHeight: '24px',\r\n fontSize: 'var(--font-xs)',\r\n iconSize: '14px',\r\n contentWidth: '32px',\r\n contentHeight: '16px',\r\n },\r\n sm: {\r\n minWidth: '96px',\r\n minHeight: '28px',\r\n fontSize: 'var(--font-sm)',\r\n iconSize: '16px',\r\n contentWidth: '44px',\r\n contentHeight: '20px',\r\n },\r\n md: {\r\n minWidth: '116px',\r\n minHeight: '36px',\r\n fontSize: 'var(--font-sm)',\r\n iconSize: '20px',\r\n contentWidth: '52px',\r\n contentHeight: '20px',\r\n },\r\n lg: {\r\n minWidth: '120px',\r\n minHeight: '44px',\r\n fontSize: 'var(--font-sm)',\r\n iconSize: '20px',\r\n contentWidth: '52px',\r\n contentHeight: '20px',\r\n },\r\n};\r\n\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonSize, BUTTON_SIZE_MAP } from './button-container.model';\r\nimport { IconComponent, IconData } from '../../icon/icon.component';\r\n\r\nexport interface ButtonContainerData {\r\n size?: ButtonSize | '';\r\n content?: string;\r\n fontSize?: string;\r\n leftIcon?: string;\r\n leftIconData?: IconData[];\r\n rightIcon?: string;\r\n rightIconData?: IconData[];\r\n color?: string;\r\n backgroundColor?: string;\r\n border?: string;\r\n borderRadius: '8px';\r\n width?: string;\r\n height: '36px';\r\n padding?: string;\r\n marginLeft?: string;\r\n marginRight?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-button-container',\r\n standalone: true,\r\n imports: [CommonModule, IconComponent],\r\n templateUrl: './button-container.component.html',\r\n styleUrls: ['./button-container.component.scss'],\r\n})\r\nexport class ButtonContainerComponent {\r\n @Input() buttonData?: ButtonContainerData;\r\n\r\n @Input() size: ButtonSize | '' = 'md';\r\n @Input() content?: string;\r\n\r\n @Input() fontSize?: string;\r\n\r\n @Input() leftIcon?: string;\r\n @Input() leftIconData?: IconData[];\r\n\r\n @Input() rightIcon?: string;\r\n @Input() rightIconData?: IconData[];\r\n\r\n @Input() color?: string;\r\n @Input() backgroundColor?: string;\r\n @Input() border?: string;\r\n @Input() borderRadius = '8px';\r\n @Input() width?: string;\r\n @Input() height = '36px';\r\n @Input() padding?: string;\r\n @Input() marginLeft?: string;\r\n @Input() marginRight?: string;\r\n\r\n @Output() buttonClick = new EventEmitter<any>();\r\n\r\n get sizeStyle() {\r\n return this.size\r\n ? BUTTON_SIZE_MAP[this.size as ButtonSize]\r\n : {\r\n minWidth: 'auto',\r\n minHeight: 'auto',\r\n fontSize: 'inherit',\r\n iconSize: '20px',\r\n contentWidth: 'auto',\r\n contentHeight: 'auto',\r\n };\r\n }\r\n\r\n handleClick(): any {\r\n this.buttonClick.emit();\r\n }\r\n}\r\n","<button\r\n class=\"button-container\"\r\n [style.minWidth]=\"sizeStyle.minWidth\"\r\n [style.minHeight]=\"sizeStyle.minHeight\"\r\n [style.color]=\"color\"\r\n [style.backgroundColor]=\"backgroundColor\"\r\n [style.border]=\"border\"\r\n [style.borderRadius]=\"borderRadius\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.padding]=\"padding\"\r\n [style.marginLeft]=\"marginLeft\"\r\n [style.marginRight]=\"marginRight\"\r\n (click)=\"handleClick()\"\r\n>\r\n @if (leftIcon || (leftIconData && leftIconData.length > 0)) {\r\n @for (iconData of leftIconData; track iconData) {\r\n <app-icon [iconData]=\"iconData\"></app-icon>\r\n }\r\n @if (leftIcon && (!leftIconData || leftIconData.length === 0)) {\r\n <app-icon [icon]=\"leftIcon\"></app-icon>\r\n }\r\n }\r\n\r\n @if (content) {\r\n <span\r\n class=\"button-content\"\r\n [style.minWidth]=\"sizeStyle.contentWidth\"\r\n [style.minHeight]=\"sizeStyle.contentHeight\"\r\n [style.fontSize]=\"fontSize || sizeStyle.fontSize\"\r\n [style.color]=\"color\"\r\n >\r\n {{ content }}\r\n </span>\r\n }\r\n\r\n @if (rightIcon || (rightIconData && rightIconData.length > 0)) {\r\n @for (iconData of rightIconData; track iconData) {\r\n <app-icon [iconData]=\"iconData\"></app-icon>\r\n }\r\n @if (rightIcon && (!rightIconData || rightIconData.length === 0)) {\r\n <app-icon [icon]=\"rightIcon\"></app-icon>\r\n }\r\n }\r\n</button>\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FunctionalLabelComponent } from '../../shared/components/functional-label/functional-label.component';\r\nimport { ButtonContainerComponent } from '../../shared/components/button/button-container/button-container.component';\r\nimport { IconData } from '../../shared/components/icon/icon.component';\r\n\r\nexport interface SidebarItem {\r\n iconLeft?: IconData | string;\r\n iconRight?: IconData | string;\r\n content: string;\r\n url?: string;\r\n colorIconLeft?: string;\r\n colorIconLeftHover?: string;\r\n colorIconRight?: string;\r\n colorIconRightHover?: string;\r\n colorContent?: string;\r\n colorContentHover?: string;\r\n backgroundColor?: string;\r\n backgroundColorHover?: string;\r\n borderRadius?: string;\r\n borderRadiusHover?: string;\r\n width?: string;\r\n height?: string;\r\n}\r\n\r\nexport interface SidebarData {\r\n menuItems: SidebarItem[];\r\n backgroundColor?: string;\r\n collapseIcon?: string;\r\n expandIcon?: string;\r\n toggleButtonBackgroundColor?: string;\r\n closeButtonBackgroundColor?: string;\r\n toggleButtonIconColor?: string;\r\n toggleButtonSize?: string;\r\n toggleButtonBorderRadius?: string;\r\n toggleButtonPadding?: string;\r\n toggleButtonWidth?: string;\r\n toggleButtonHeight?: string;\r\n closeButtonMarginRight?: string;\r\n closeButtonMarginLeft?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, FunctionalLabelComponent, ButtonContainerComponent],\r\n templateUrl: './sidebar.component.html',\r\n styleUrls: ['./sidebar.component.scss'],\r\n})\r\nexport class SidebarComponent {\r\n @Input() data: SidebarData = { menuItems: [] };\r\n @Input() sidebarWidthCollapse: string = '59px';\r\n @Input() sidebarWidthExpand: string = '227px';\r\n @Input() isSidebarExpanded = false;\r\n\r\n @Input() leftIcon?: string;\r\n @Input() rightIcon?: string;\r\n\r\n @Output() sidebarToggled = new EventEmitter<boolean>();\r\n\r\n @Input() toggleButtonIconData?: IconData[];\r\n\r\n @Input() closeButtonIconData?: IconData[];\r\n\r\n toggleSidebar(): void {\r\n this.isSidebarExpanded = !this.isSidebarExpanded;\r\n this.sidebarToggled.emit(this.isSidebarExpanded);\r\n }\r\n\r\n onMenuItemClick(item: SidebarItem, event: Event): void {\r\n console.log('Menu item clicked:', item, event);\r\n }\r\n}\r\n","<div class=\"sidebar-wrapper\" [class.expanded]=\"isSidebarExpanded\">\r\n <div>\r\n <aside class=\"sidebar\">\r\n @for (item of data.menuItems; track $index) {\r\n <app-functional-label\r\n class=\"sidebar-item\"\r\n [isSidebarExpanded]=\"isSidebarExpanded\"\r\n [iconLeft]=\"item.iconLeft\"\r\n [iconRight]=\"item.iconRight\"\r\n [content]=\"item.content\"\r\n [routerLink]=\"item.url\"\r\n [colorIconLeft]=\"item.colorIconLeft\"\r\n [colorIconRight]=\"item.colorIconRight\"\r\n [colorContent]=\"item.colorContent\"\r\n [colorContentHover]=\"item.colorContentHover\"\r\n [backgroundColor]=\"item.backgroundColor\"\r\n [borderRadius]=\"item.borderRadius\"\r\n (clicked)=\"onMenuItemClick(item, $event)\"\r\n [colorIconLeftHover]=\"item.colorIconLeftHover\"\r\n [colorIconRightHover]=\"item.colorIconRightHover\"\r\n [backgroundColorHover]=\"item.backgroundColorHover\"\r\n [width]=\"item.width\"\r\n [height]=\"item.height\"\r\n ></app-functional-label>\r\n }\r\n </aside>\r\n\r\n <!-- ✅ Toggle button - chỉ hiện khi KHÔNG expanded -->\r\n @if (!isSidebarExpanded) {\r\n <app-button-container\r\n class=\"sidebar-toggle-button\"\r\n [leftIconData]=\"toggleButtonIconData\"\r\n [backgroundColor]=\"data.toggleButtonBackgroundColor || 'transparent'\"\r\n [borderRadius]=\"'8px'\"\r\n [size]=\"'sm'\"\r\n [width]=\"'36px'\"\r\n [height]=\"'36px'\"\r\n (buttonClick)=\"toggleSidebar()\"\r\n ></app-button-container>\r\n }\r\n\r\n <!-- ✅ Close button - chỉ hiện khi expanded -->\r\n @if (isSidebarExpanded) {\r\n <app-button-container\r\n class=\"sidebar-close-button\"\r\n [leftIconData]=\"closeButtonIconData\"\r\n [backgroundColor]=\"\r\n data.closeButtonBackgroundColor || 'var(--brand-400)'\r\n \"\r\n [color]=\"data.toggleButtonIconColor || 'var(--neutral-500)'\"\r\n [borderRadius]=\"'8px'\"\r\n [size]=\"'sm'\"\r\n (buttonClick)=\"toggleSidebar()\"\r\n [width]=\"'36px'\"\r\n [height]=\"'36px'\"\r\n [marginRight]=\"data.closeButtonMarginRight || '24px'\"\r\n [marginLeft]=\"data.closeButtonMarginLeft || 'auto'\"\r\n ></app-button-container>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-label-button',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './label-button.component.html',\n styleUrls: ['./label-button.component.scss'],\n})\nexport class LabelButtonComponent {\n @Input() label: string = '';\n @Input() bgColor: string = '';\n @Input() borderColor: string = '';\n @Input() width: string = '100%';\n @Input() height: string = '28px';\n @Input() textColor: string = 'var(--neutral-100)';\n}\n","<button\n [style.background-color]=\"bgColor\"\n [style.border-color]=\"borderColor\"\n [style.color]=\"textColor\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n class=\"label-button\"\n type=\"button\"\n>\n {{ label }}\n</button>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-input-text',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-text.component.html',\r\n styleUrls: ['./input-text.component.scss'],\r\n})\r\nexport class InputTextComponent {\r\n @Input() headerInput: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() readonly: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() width: string = '100%';\r\n @Input() maxLength: number = 0; // 0 = no limit\r\n @Input() showLimit: boolean = false;\r\n @Input() icon: string = '';\r\n @Input() widthIcon: string = '16px';\r\n @Input() heightIcon: string = '16px';\r\n @Input() typeInput: string = 'text';\r\n @Input() showLabel: boolean = true;\r\n\r\n // Customization\r\n @Input() placeholderColor: string = '';\r\n @Input() border: string = '';\r\n @Input() borderRadius = '8px';\r\n @Input() padding = '8px 12px';\r\n @Input() height = '36px';\r\n @Input() fontSizeContent: string = '14px';\r\n @Input() fontWeightContent: string = '500';\r\n @Input() colorContent: string = 'var(--neutral-color-875)';\r\n\r\n @Input() fontSizeLabel: string = '14px';\r\n @Input() fontWeightLabel: string = '500';\r\n @Input() colorLabel: string = 'var(--neutral-color-875)';\r\n\r\n @Input() backgroundColor: string = 'var(--neutral-color-10)';\r\n\r\n @Output() valueChange = new EventEmitter<string>();\r\n @Output() iconClick = new EventEmitter<void>();\r\n\r\n private _value: string = '';\r\n\r\n onIconClick(): void {\r\n this.iconClick.emit();\r\n }\r\n\r\n @Input()\r\n set value(val: string) {\r\n this._value = val || '';\r\n }\r\n\r\n get value(): string {\r\n return this._value;\r\n }\r\n\r\n get currentLength(): number {\r\n return this._value?.length || 0;\r\n }\r\n\r\n get limit(): string {\r\n if (!this.showLimit || this.maxLength <= 0) return '';\r\n return `${this.currentLength}/${this.maxLength}`;\r\n }\r\n\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n let newValue = input.value;\r\n\r\n // Enforce maxLength if set\r\n if (this.maxLength > 0 && newValue.length > this.maxLength) {\r\n newValue = newValue.substring(0, this.maxLength);\r\n input.value = newValue;\r\n }\r\n\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n}\r\n","<div class=\"input-form\">\r\n <div class=\"input-form-content\">\r\n <label class=\"input-form-label\">\r\n @if (showLabel) {\r\n <span\r\n class=\"label-text\"\r\n [class.hidden]=\"!headerInput\"\r\n [style.font-size]=\"fontSizeLabel || null\"\r\n [style.font-weight]=\"fontWeightLabel || null\"\r\n [style.color]=\"colorLabel || null\"\r\n >\r\n {{ headerInput }}\r\n @if (required) {\r\n <span class=\"required-mark\">*</span>\r\n }\r\n </span>\r\n }\r\n <div class=\"input-field-wrapper\">\r\n <input\r\n [type]=\"typeInput\"\r\n class=\"input-form-field\"\r\n [placeholder]=\"placeholder\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.padding]=\"padding\"\r\n [style.border]=\"border || null\"\r\n [style.border-radius]=\"borderRadius\"\r\n [style.background-color]=\"backgroundColor\"\r\n [style.--placeholder-color]=\"placeholderColor || null\"\r\n [style.font-size]=\"fontSizeContent || null\"\r\n [style.font-weight]=\"fontWeightContent || null\"\r\n [style.color]=\"colorContent || null\"\r\n [value]=\"value\"\r\n (input)=\"onInput($event)\"\r\n [attr.maxlength]=\"maxLength > 0 ? maxLength : null\"\r\n />\r\n @if (icon) {\r\n <button\r\n type=\"button\"\r\n class=\"input-icon-button\"\r\n [class.clickable]=\"iconClick.observed\"\r\n (click)=\"onIconClick()\"\r\n [attr.aria-label]=\"icon\"\r\n [disabled]=\"!iconClick.observed\"\r\n >\r\n <i\r\n [class]=\"icon\"\r\n [style.width]=\"widthIcon\"\r\n [style.height]=\"heightIcon\"\r\n class=\"input-icon\"\r\n ></i>\r\n </button>\r\n }\r\n </div>\r\n </label>\r\n </div>\r\n <div class=\"limit\" [class.hidden]=\"!(maxLength > 0 && showLimit)\">\r\n <span>{{ limit }}</span>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: 'app-input-stepper',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-stepper.component.html',\r\n styleUrls: ['./input-stepper.component.scss'],\r\n})\r\nexport class InputStepperComponent {\r\n protected readonly componentId = `input-stepper-${Math.random().toString(36).substring(2, 9)}`;\r\n @Input() headerInput: string = '';\r\n @Input() placeholder: string = '';\r\n @Input() readonly: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() width: string = '100%';\r\n @Input() min: number = 0;\r\n @Input() max: number = 100;\r\n @Input() error: string = '';\r\n @Input() helperText: string = '';\r\n @Input() step: number = 1;\r\n @Input() state: 'default' | 'negative' | 'positive' = 'default';\r\n\r\n @Output() valueChange = new EventEmitter<number>();\r\n\r\n private _value: number = 0;\r\n\r\n @Input()\r\n set value(val: number) {\r\n this._value = val || 0;\r\n }\r\n\r\n get value(): number {\r\n return this._value;\r\n }\r\n\r\n increment(): void {\r\n if (this.readonly || this.disabled) return;\r\n const newValue = this._value + this.step;\r\n if (newValue <= this.max) {\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n }\r\n\r\n decrement(): void {\r\n if (this.readonly || this.disabled) return;\r\n const newValue = this._value - this.step;\r\n if (newValue >= this.min) {\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n }\r\n\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n let newValue = Number.parseInt(input.value, 10);\r\n\r\n if (Number.isNaN(newValue)) {\r\n newValue = this.min;\r\n }\r\n\r\n if (newValue < this.min) newValue = this.min;\r\n if (newValue > this.max) newValue = this.max;\r\n\r\n input.value = newValue.toString();\r\n this._value = newValue;\r\n this.valueChange.emit(this._value);\r\n }\r\n}","<div\r\n class=\"input-form\"\r\n [style.width]=\"width\"\r\n [class.disabled]=\"disabled\"\r\n [class.state-negative]=\"state === 'negative'\"\r\n [class.state-positive]=\"state === 'positive'\"\r\n>\r\n <div class=\"input-form-content\">\r\n <label class=\"input-form-label\" [for]=\"componentId\">\r\n <span class=\"label-text\">\r\n {{ headerInput }}\r\n @if (required) {\r\n <span class=\"required-mark\">*</span>\r\n }\r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"input-stepper-content\">\r\n <button\r\n type=\"button\"\r\n class=\"input-stepper-button\"\r\n (click)=\"decrement()\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Giảm giá trị\"\r\n >\r\n <span class=\"stepper-icon\">−</span>\r\n </button>\r\n <input\r\n [id]=\"componentId\"\r\n type=\"text\"\r\n class=\"input-stepper-input\"\r\n placeholder=\"0\"\r\n [placeholder]=\"placeholder || '0'\"\r\n title=\"Giá trị\"\r\n [title]=\"headerInput || 'Giá trị'\"\r\n [readonly]=\"readonly\"\r\n [disabled]=\"disabled\"\r\n [required]=\"required\"\r\n [value]=\"value\"\r\n (input)=\"onInput($event)\"\r\n [attr.aria-label]=\"headerInput || 'Giá trị'\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"input-stepper-button\"\r\n (click)=\"increment()\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Tăng giá trị\"\r\n >\r\n <span class=\"stepper-icon\">+</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"input-stepper-footer\">\r\n @if (error) {\r\n <span class=\"input-stepper-error\">{{ error }}</span>\r\n } @else if (helperText) {\r\n <span class=\"input-stepper-helper\">{{ helperText }}</span>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, ElementRef, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-input-calendar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './input-calendar.component.html',\r\n styleUrls: ['./input-calendar.component.scss'],\r\n})\r\nexport class InputCalendarComponent {\r\n @Input() headerInput: string = '';\r\n @Input() placeholder: string = 'dd/mm/yyyy';\r\n @Input() readonly: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() width: string = '100%';\r\n \r\n @Output() valueChange = new EventEmitter<string>();\r\n \r\n @ViewChild('hiddenDateInput') hiddenDateInput!: ElementRef<HTMLInputElement>;\r\n \r\n displayValue: string = '';\r\n private _value: string = '';\r\n \r\n @Input()\r\n set value(val: string) {\r\n this._value = val;\r\n this.displayValue = this.formatToDisplay(val);\r\n }\r\n \r\n get value(): string {\r\n return this._value;\r\n }\r\n \r\n // Convert ISO format (yyyy-mm-dd) to display format (dd/mm/yyyy)\r\n formatToDisplay(isoDate: string): string {\r\n if (!isoDate) return '';\r\n const parts = isoDate.split('-');\r\n if (parts.length === 3) {\r\n return `${parts[2]}/${parts[1]}/${parts[0]}`;\r\n }\r\n return isoDate;\r\n }\r\n \r\n // Validate if a date string (dd/mm/yyyy) represents a valid date\r\n isValidDate(displayDate: string): boolean {\r\n if (!displayDate || displayDate.length !== 10) return false;\r\n \r\n const parts = displayDate.split('/');\r\n if (parts.length !== 3) return false;\r\n \r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10);\r\n const year = parseInt(parts[2], 10);\r\n \r\n // Basic range validation\r\n if (isNaN(day) || isNaN(month) || isNaN(year)) return false;\r\n if (month < 1 || month > 12) return false;\r\n if (day < 1 || day > 31) return false;\r\n if (year < 1900 || year > 2100) return false;\r\n \r\n // Create date and verify it matches input (handles invalid dates like 31/02)\r\n const date = new Date(year, month - 1, day);\r\n return date.getFullYear() === year && \r\n date.getMonth() === month - 1 && \r\n date.getDate() === day;\r\n }\r\n\r\n // Convert display format (dd/mm/yyyy) to ISO format (yyyy-mm-dd)\r\n formatToISO(displayDate: string): string {\r\n if (!displayDate) return '';\r\n const parts = displayDate.split('/');\r\n if (parts.length === 3) {\r\n return `${parts[2]}-${parts[1]}-${parts[0]}`;\r\n }\r\n return displayDate;\r\n }\r\n \r\n // Handle text input with auto-formatting\r\n onDisplayInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value.replaceAll(/[^\\d/]/g, '');\r\n \r\n // Auto-insert slashes at positions 2 and 5\r\n const parts = value.split('/');\r\n if (parts[0] && parts[0].length >= 2 && parts.length === 1) {\r\n value = parts[0].substring(0, 2) + '/' + parts[0].substring(2);\r\n }\r\n if (value.length >= 5 && value.split('/').length === 2 && !value.endsWith('/')) {\r\n const newParts = value.split('/');\r\n if (newParts[1] && newParts[1].length >= 2) {\r\n value = newParts[0] + '/' + newParts[1].substring(0, 2) + '/' + newParts[1].substring(2);\r\n }\r\n }\r\n \r\n // Limit to dd/mm/yyyy format\r\n if (value.length > 10) {\r\n value = value.substring(0, 10);\r\n }\r\n \r\n this.displayValue = value;\r\n \r\n // Only emit if complete and valid date\r\n if (value.length === 10 && this.isValidDate(value)) {\r\n const isoValue = this.formatToISO(value);\r\n this._value = isoValue;\r\n this.valueChange.emit(isoValue);\r\n }\r\n }\r\n \r\n // Open native date picker\r\n openDatePicker(): void {\r\n if (!this.readonly && this.hiddenDateInput) {\r\n this.hiddenDateInput.nativeElement.showPicker();\r\n }\r\n }\r\n \r\n // Handle date picker selection\r\n onDatePickerChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this._value = input.value;\r\n this.displayValue = this.formatToDisplay(input.value);\r\n this.valueChange.emit(this._value);\r\n }\r\n}","<div class=\"input-form\" [style.width]=\"width\">\r\n <label class=\"input-form-label\">\r\n <div class=\"input-form-label-header\">\r\n <span>{{ headerInput }}</span>\r\n @if (required) {\r\n <span class=\"required-mark\">*</span>\r\n }\r\n </div>\r\n <div class=\"calendar-input-wrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"input-form-field\"\r\n [placeholder]=\"placeholder\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [value]=\"displayValue\"\r\n (input)=\"onDisplayInput($event)\"\r\n maxlength=\"10\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"calendar-icon-btn\"\r\n (click)=\"openDatePicker()\"\r\n [disabled]=\"readonly\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\r\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n </svg>\r\n </button>\r\n <input\r\n #hiddenDateInput\r\n type=\"date\"\r\n class=\"hidden-date-input\"\r\n [value]=\"value\"\r\n (change)=\"onDatePickerChange($event)\"\r\n />\r\n </div>\r\n </label>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport interface ColumnConfig {\r\n header: string;\r\n key: string;\r\n width: string;\r\n}\r\n\r\n@Component({\r\n selector: 'tr[app-table-header]',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './table-header.component.html',\r\n styleUrl: './table-header.component.scss',\r\n})\r\nexport class TableHeaderComponent {\r\n @Input() columns: ColumnConfig[] = [];\r\n @Input() backgroundColor?: string;\r\n @Input({ transform: (value: string | undefined) => value || '#ffffff' })\r\n textColor: string = '#ffffff';\r\n @Input() headerIconLeft?: string;\r\n @Input() headerIconRight?: string;\r\n @Input() fontSize: string = 'var(--font-xs)';\r\n}\r\n","@for (col of columns; track col.key) {\r\n <th\r\n scope=\"col\"\r\n [style.width]=\"col.width\"\r\n [style.backgroundColor]=\"backgroundColor\"\r\n [style.color]=\"textColor\"\r\n >\r\n <div class=\"header-container\">\r\n <div class=\"header-content\">\r\n @if (headerIconLeft) {\r\n <div class=\"icon-left\">\r\n <i [class]=\"headerIconLeft\"></i>\r\n </div>\r\n }\r\n <div class=\"header-text\" [style.font-size]=\"fontSize\">\r\n {{ col.header }}\r\n </div>\r\n @if (headerIconRight) {\r\n <div class=\"icon-right\">\r\n <i [class]=\"headerIconRight\"></i>\r\n </div>\r\n }\r\n </div>\r\n <p class=\"divider\">|</p>\r\n </div>\r\n </th>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, TemplateRef } from '@angular/core';\r\nimport { ColumnConfig } from '../table-header/table-header.component';\r\n\r\n@Component({\r\n selector: '[app-table-body]', // ✅ Attribute selector\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './table-body.component.html',\r\n styleUrl: './table-body.component.scss',\r\n})\r\nexport class TableBodyComponent {\r\n @Input() rows: any[] = [];\r\n @Input() columns: ColumnConfig[] = [];\r\n @Input() columnTemplates: { [key: string]: TemplateRef<any> } = {};\r\n @Input() fontSize: string = 'var(--font-sm)';\r\n}\r\n","@for (row of rows; track $index) {\r\n <tr>\r\n @for (col of columns; track col.key) {\r\n <td [style.width]=\"col.width\" [style.font-size]=\"fontSize\">\r\n @if (columnTemplates[col.key]) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n columnTemplates[col.key];\r\n context: { $implicit: row[col.key], row: row }\r\n \"\r\n ></ng-container>\r\n } @else {\r\n {{ row[col.key] }}\r\n }\r\n </td>\r\n }\r\n </tr>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, TemplateRef } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-approval-list-item',\r\n templateUrl: './approval-list-item.component.html',\r\n styleUrls: ['./approval-list-item.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true\r\n})\r\nexport class ApprovalListItemComponent {\r\n @Input() name!: string;\r\n @Input() date!: Date;\r\n @Input() rightTemplate?: TemplateRef<any>;\r\n @Input() rightContext: any = {};\r\n\r\n get parsedDate(): Date {\r\n return new Date(this.date);\r\n }\r\n}\r\n","<div class=\"approval-item\">\r\n <!-- LEFT -->\r\n <div class=\"approval-item-left\">\r\n <span class=\"approval-item-left-name\">{{ name }}</span>\r\n <span class=\"approval-item-left-date\">\r\n <span class=\"approval-item-left-date-title\">Ngày tạo đơn:</span>\r\n {{ date | date: 'dd/MM/yyyy' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"approval-item-right\">\r\n <ng-container *ngIf=\"rightTemplate; else defaultRight\">\r\n <ng-container *ngTemplateOutlet=\"rightTemplate; context: rightContext\">\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultRight>\r\n <span class=\"text-gray-400\">—</span>\r\n </ng-template>\r\n </div>\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ApprovalListItemInterface } from '../approval-list-item/approval-list-item.model';\r\nimport { ApprovalListItemComponent } from '../approval-list-item/approval-list-item.component';\r\n\r\n@Component({\r\n selector: 'app-approval-list',\r\n standalone: true,\r\n imports: [CommonModule, ApprovalListItemComponent],\r\n templateUrl: './approval-list.component.html',\r\n styleUrls: ['./approval-list.component.scss'],\r\n})\r\nexport class ApprovalListComponent {\r\n @Input() rows: ApprovalListItemInterface[] = [];\r\n\r\n @Input() headerContentRight!: string;\r\n @Input() headerContentLeft!: string;\r\n @Input() width!: string;\r\n}\r\n","<div class=\"approval-list\" [style.width]=\"width\">\r\n <div class=\"approval-list-header\">\r\n <span class=\"approval-list-header-left\">{{ headerContentLeft }}</span>\r\n <div>\r\n <p>{{ headerContentRight }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"approval-list-content\" [style.width]=\"width\">\r\n <app-approval-list-item\r\n *ngFor=\"let row of rows\"\r\n [name]=\"row.name\"\r\n [date]=\"row.date\"\r\n [rightTemplate]=\"row.rightTemplate\"\r\n [rightContext]=\"row.rightContext\"\r\n >\r\n </app-approval-list-item>\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { ButtonContainerComponent } from \"../../button/button-container/button-container.component\";\r\n\r\n@Component({\r\n selector: 'app-pop-up-confirm',\r\n standalone: true,\r\n imports: [CommonModule, ButtonContainerComponent],\r\n templateUrl: './pop-up-confirm.component.html',\r\n styleUrls: ['./pop-up-confirm.component.scss'],\r\n})\r\nexport class PopUpConfirmComponent {\r\n\r\n @Input() imgUrl: string = '';\r\n @Input() title: string = '';\r\n @Input() content: string = '';\r\n @Input() colorButton: string = 'var(--brand-600)';\r\n\r\n @Output() confirmClick = new EventEmitter<void>();\r\n @Output() cancelClick = new EventEmitter<void>();\r\n\r\n onConfirm(): void {\r\n this.confirmClick.emit();\r\n }\r\n\r\n onCancel(): void {\r\n this.cancelClick.emit();\r\n }\r\n}","<div class=\"pop-up-confirm-overlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"popup-title\">\r\n <div class=\"pop-up-confirm\">\r\n <div class=\"pop-up-confirm-content\">\r\n <img *ngIf=\"imgUrl\" [src]=\"imgUrl\" alt=\"\">\r\n <div class=\"pop-up-confirm-text\">\r\n <p class=\"pop-up-title\" id=\"popup-title\">{{title}}</p>\r\n <p class=\"pop-up-content\">{{content}}</p>\r\n </div>\r\n </div>\r\n <div class=\"pop-up-confirm-actions\">\r\n <app-button-container size=\"md\" content=\"Quay Lại\" backgroundColor=\"var(--neutral-100)\" color=\"var(--neutral-800)\" (buttonClick)=\"onCancel()\"></app-button-container>\r\n <app-button-container size=\"md\" content=\"Đồng Ý\" [backgroundColor]=\"colorButton\" color=\"#fff\" (buttonClick)=\"onConfirm()\"></app-button-container>\r\n </div>\r\n </div>\r\n</div>","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-modal',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ModalComponent {\n @Input() title: string = '';\n @Input() width: string = '800px';\n @Input() minHeight: string = '300px';\n @Input() isOpen: boolean = false;\n @Input() theme: 'default' | 'white' = 'default';\n\n @Output() closeModal = new EventEmitter<void>();\n\n onCloseClick() {\n this.closeModal.emit();\n }\n}\n","<div class=\"modal-overlay\" *ngIf=\"isOpen\">\n <button\n class=\"modal-backdrop\"\n (click)=\"onCloseClick()\"\n aria-label=\"Close modal\"\n ></button>\n <div\n class=\"modal-container\"\n [class.theme-white]=\"theme === 'white'\"\n [style.width]=\"width\"\n [style.min-height]=\"minHeight\"\n >\n <div class=\"modal-header\">\n <span class=\"modal-title\">{{ title }}</span>\n <button\n class=\"modal-close-btn\"\n (click)=\"onCloseClick()\"\n title=\"Close\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <ng-content select=\"[modal-body]\"></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"[modal-footer]\"></ng-content>\n </div>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface AvatarUploadedFile {\n id: string;\n file: File;\n fileName: string;\n previewUrl: string | null;\n}\n\n@Component({\n selector: 'app-avatar-upload-button',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './avatar-upload-button.component.html',\n styleUrl: './avatar-upload-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AvatarUploadButtonComponent {\n @Input() label: string = '';\n @Input() required: boolean = false;\n @Input() showTooltip: boolean = false;\n @Input() tooltipText: string = '';\n @Input() buttonText: string = 'Tải file lên';\n @Input() acceptFormats: string = '.png,.jpeg,.jpg';\n @Input() helperText: string = 'Định dạng .png, .jpeg, .jpg';\n\n @Output() fileChange = new EventEmitter<AvatarUploadedFile | null>();\n\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n uploadedFile: AvatarUploadedFile | null = null;\n\n onButtonClick() {\n this.fileInput.nativeElement.click();\n }\n\n onFileChange(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n const file = input.files[0];\n this.uploadedFile = this.createAvatarUploadedFile(file);\n this.fileChange.emit(this.uploadedFile);\n }\n input.value = '';\n }\n\n onRemove() {\n if (this.uploadedFile?.previewUrl) {\n URL.revokeObjectURL(this.uploadedFile.previewUrl);\n }\n this.uploadedFile = null;\n this.fileChange.emit(null);\n }\n\n private createAvatarUploadedFile(file: File): AvatarUploadedFile {\n const isImage = file.type.startsWith('image/');\n return {\n id: this.generateId(),\n file: file,\n fileName: file.name,\n previewUrl: isImage ? URL.createObjectURL(file) : null,\n };\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2, 9);\n }\n}\n","<div class=\"avatar-upload-wrapper\">\n <div class=\"label-row\" *ngIf=\"label\">\n <span class=\"label-text\">{{ label }}</span>\n <span class=\"required-mark\" *ngIf=\"required\">*</span>\n <button type=\"button\" class=\"tooltip-icon\" *ngIf=\"showTooltip\" [title]=\"tooltipText\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M8 7V11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n <circle cx=\"8\" cy=\"5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n </button>\n </div>\n\n <button type=\"button\" class=\"upload-button\" (click)=\"onButtonClick()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 4V13M10 4L6 8M10 4L14 8\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 13V15C3 15.5523 3.44772 16 4 16H16C16.5523 16 17 15.5523 17 15V13\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span>{{ buttonText }}</span>\n </button>\n\n <input\n #fileInput\n type=\"file\"\n class=\"file-input\"\n [accept]=\"acceptFormats\"\n (change)=\"onFileChange($event)\"\n />\n\n <span class=\"helper-text\" *ngIf=\"helperText && !uploadedFile\">{{ helperText }}</span>\n\n <!-- Uploaded File Preview -->\n <div class=\"file-preview\" *ngIf=\"uploadedFile\">\n <img\n *ngIf=\"uploadedFile.previewUrl\"\n [src]=\"uploadedFile.previewUrl\"\n [alt]=\"uploadedFile.fileName\"\n class=\"preview-image\"\n />\n <span class=\"file-name\">{{ uploadedFile.fileName }}</span>\n <button type=\"button\" class=\"remove-btn\" (click)=\"onRemove()\" title=\"Xóa\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 4L12 12M12 4L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface UploadedFile {\n id: string;\n file: File;\n fileName: string;\n fileSize: string;\n dateTime: string;\n fileType: string;\n}\n\n@Component({\n selector: 'app-file-upload-dropzone',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './file-upload-dropzone.component.html',\n styleUrl: './file-upload-dropzone.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FileUploadDropzoneComponent {\n @Input() label: string = 'Thêm file bài học';\n @Input() buttonText: string = 'Tải lên';\n @Input() maxSize: string = '10MB';\n @Input() acceptFormats: string = '.docx,.xlsx,.png,.jpg,.jpeg,.pdf';\n @Input() helperText: string = '';\n\n @Output() filesChange = new EventEmitter<UploadedFile[]>();\n @Output() fileDownload = new EventEmitter<UploadedFile>();\n @Output() fileDelete = new EventEmitter<UploadedFile>();\n\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n uploadedFiles: UploadedFile[] = [];\n isDragging = false;\n\n get displayHelperText(): string {\n if (this.helperText) return this.helperText;\n return `Dung lượng tối đa ${this.maxSize}(${this.acceptFormats.replace(/\\./g, '').split(',').join(', ')}...)`;\n }\n\n onButtonClick() {\n this.fileInput.nativeElement.click();\n }\n\n onFileChange(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this.addFiles(Array.from(input.files));\n }\n input.value = '';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = true;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = false;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging = false;\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.addFiles(Array.from(files));\n }\n }\n\n onDownload(file: UploadedFile) {\n this.fileDownload.emit(file);\n }\n\n onDelete(file: UploadedFile) {\n this.uploadedFiles = this.uploadedFiles.filter((f) => f.id !== file.id);\n this.fileDelete.emit(file);\n this.filesChange.emit(this.uploadedFiles);\n }\n\n getIconType(file: UploadedFile): string {\n const ext = file.fileName.split('.').pop()?.toLowerCase() || '';\n if (ext === 'pdf') return 'pdf';\n if (['doc', 'docx'].includes(ext)) return 'doc';\n if (['xls', 'xlsx'].includes(ext)) return 'xls';\n if (['png', 'jpg', 'jpeg', 'gif', 'webp'].includes(ext)) return 'image';\n return 'file';\n }\n\n private addFiles(files: File[]) {\n const newFiles = files.map((file) => this.createUploadedFile(file));\n this.uploadedFiles = [...this.uploadedFiles, ...newFiles];\n this.filesChange.emit(this.uploadedFiles);\n }\n\n private createUploadedFile(file: File): UploadedFile {\n return {\n id: this.generateId(),\n file: file,\n fileName: file.name,\n fileSize: this.formatFileSize(file.size),\n dateTime: this.formatDateTime(new Date()),\n fileType: file.name.split('.').pop()?.toLowerCase() || '',\n };\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2, 9);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + sizes[i];\n }\n\n private formatDateTime(date: Date): string {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n return `${day}/${month}/${year} ${hours}:${minutes}`;\n }\n}\n","<div class=\"file-upload-dropzone\">\n <label class=\"dropzone-label\">{{ label }}</label>\n\n <div\n class=\"dropzone-area\"\n [class.dragging]=\"isDragging\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n (click)=\"onButtonClick()\"\n >\n <div class=\"dropzone-content\">\n <svg\n class=\"upload-icon\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 16V8M12 8L9 11M12 8L15 11\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M9 22H15C18.866 22 22 18.866 22 15C22 12.0667 20.2333 9.56667 17.6667 8.46667C17.8778 7.98889 18 7.46667 18 6.93333C18 4.41111 15.5778 2.44444 12.8333 3.04444C11.0111 1.15556 8.11111 0.911111 6 2.48889C3.51111 4.35556 3.22222 8.02222 5.11111 10.2444C3.24444 11.2222 2 13.1778 2 15.4444C2 18.9778 5.02222 22 9 22Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n\n <button type=\"button\" class=\"upload-btn\" (click)=\"$event.stopPropagation(); onButtonClick()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 16V8M12 8L9 11M12 8L15 11\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n {{ buttonText }}\n </button>\n\n <span class=\"helper-text\">{{ displayHelperText }}</span>\n </div>\n </div>\n\n <input\n #fileInput\n type=\"file\"\n [accept]=\"acceptFormats\"\n (change)=\"onFileChange($event)\"\n multiple\n hidden\n />\n\n <!-- Attachment List -->\n <div class=\"attachment-list\" *ngIf=\"uploadedFiles.length > 0\">\n <div class=\"attachment-item\" *ngFor=\"let file of uploadedFiles\">\n <div class=\"file-icon\" [ngClass]=\"getIconType(file)\">\n <ng-container [ngSwitch]=\"getIconType(file)\">\n <svg\n *ngSwitchCase=\"'pdf'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#FEE2E2\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#EF4444\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#EF4444\" font-size=\"6\" font-weight=\"600\">\n PDF\n </text>\n </svg>\n <svg\n *ngSwitchCase=\"'doc'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#DBEAFE\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#3B82F6\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#3B82F6\" font-size=\"6\" font-weight=\"600\">\n DOC\n </text>\n </svg>\n <svg\n *ngSwitchCase=\"'xls'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#D1FAE5\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#10B981\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#10B981\" font-size=\"6\" font-weight=\"600\">\n XLS\n </text>\n </svg>\n <svg\n *ngSwitchCase=\"'image'\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#FEF3C7\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#F59E0B\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#F59E0B\" font-size=\"6\" font-weight=\"600\">\n IMG\n </text>\n </svg>\n <svg\n *ngSwitchDefault\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" fill=\"#F3F4F6\" />\n <rect x=\"3\" y=\"2\" width=\"18\" height=\"20\" rx=\"2\" stroke=\"#9CA3AF\" stroke-width=\"1\" />\n <text x=\"12\" y=\"14\" text-anchor=\"middle\" fill=\"#9CA3AF\" font-size=\"6\" font-weight=\"600\">\n FILE\n </text>\n </svg>\n </ng-container>\n </div>\n\n <div class=\"file-info\">\n <span class=\"file-name\">{{ file.fileName }}</span>\n <div class=\"file-meta\">\n <span class=\"file-size\">{{ file.fileSize }}</span>\n <span class=\"separator\">•</span>\n <span class=\"file-date\">{{ file.dateTime }}</span>\n </div>\n </div>\n\n <div class=\"file-actions\">\n <button class=\"action-btn download-btn\" (click)=\"onDownload(file)\" title=\"Tải xuống\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3V13M10 13L6 9M10 13L14 9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15V16C3 16.5523 3.44772 17 4 17H16C16.5523 17 17 16.5523 17 16V15\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n <button class=\"action-btn delete-btn\" (click)=\"onDelete(file)\" title=\"Xóa\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 5H16M7 5V4C7 3.44772 7.44772 3 8 3H12C12.5523 3 13 3.44772 13 4V5M8 9V14M12 9V14M5 5L6 16C6 16.5523 6.44772 17 7 17H13C13.5523 17 14 16.5523 14 16L15 5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n","/*\r\n * Public API Surface of intern-hub-layout\r\n */\r\n\r\n// Layout components\r\nexport * from './libs/layouts/header/header.component';\r\nexport * from './libs/layouts/sidebar/sidebar.component';\r\n\r\n// Shared components - Icons\r\nexport * from './libs/shared/components/icon/icon.component';\r\nexport * from './libs/shared/components/functional-label/functional-label.component';\r\n\r\n// Shared components - Buttons\r\nexport * from './libs/shared/components/button/button-container/button-container.component';\r\nexport * from './libs/shared/components/button/button-container/button-container.model';\r\nexport * from './libs/shared/components/button/label-button/label-button.component';\r\n\r\n// Shared components - Inputs\r\nexport * from './libs/shared/components/input/input-text/input-text.component';\r\nexport * from './libs/shared/components/input/input-stepper/input-stepper.component';\r\nexport * from './libs/shared/components/input/input-calendar/input-calendar.component';\r\n\r\n// Shared components - Table\r\nexport * from './libs/shared/components/table/table-header/table-header.component';\r\nexport * from './libs/shared/components/table/table-body/table-body.component';\r\n\r\n// Shared components - Approval\r\nexport * from './libs/shared/components/approval/approval-list/approval-list.component';\r\nexport * from './libs/shared/components/approval/approval-list-item/approval-list-item.component';\r\nexport * from './libs/shared/components/approval/approval-list-item/approval-list-item.model';\r\n\r\n// Shared components - Pop-ups\r\nexport * from './libs/shared/components/pop-up/pop-up-confirm/pop-up-confirm.component';\r\n\r\n// Shared components - Modal\r\nexport * from './libs/shared/components/modal/modal.component';\r\n\r\n// Shared components - Upload Button\r\nexport * from './libs/shared/components/avatar-upload-button/avatar-upload-button.component';\r\n\r\n// Shared components - File Upload Dropzone\r\nexport * from './libs/shared/components/file-upload-dropzone/file-upload-dropzone.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -49,6 +49,7 @@ interface HeaderData {
|
|
|
49
49
|
dropdownIcon?: IconData | string;
|
|
50
50
|
dropdownIconColor?: string;
|
|
51
51
|
logo?: string;
|
|
52
|
+
minWidth?: string;
|
|
52
53
|
}
|
|
53
54
|
declare class HeaderComponent {
|
|
54
55
|
data: HeaderData;
|
|
@@ -381,11 +382,10 @@ declare class ModalComponent {
|
|
|
381
382
|
minHeight: string;
|
|
382
383
|
isOpen: boolean;
|
|
383
384
|
theme: 'default' | 'white';
|
|
384
|
-
|
|
385
|
-
onOverlayClick(event: Event): void;
|
|
385
|
+
closeModal: EventEmitter<void>;
|
|
386
386
|
onCloseClick(): void;
|
|
387
387
|
static ɵfac: i0.ɵɵFactoryDeclaration<ModalComponent, never>;
|
|
388
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ModalComponent, "app-modal", never, { "title": { "alias": "title"; "required": false; }; "width": { "alias": "width"; "required": false; }; "minHeight": { "alias": "minHeight"; "required": false; }; "isOpen": { "alias": "isOpen"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; }, { "
|
|
388
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ModalComponent, "app-modal", never, { "title": { "alias": "title"; "required": false; }; "width": { "alias": "width"; "required": false; }; "minHeight": { "alias": "minHeight"; "required": false; }; "isOpen": { "alias": "isOpen"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; }, { "closeModal": "closeModal"; }, never, ["[modal-body]", "[modal-footer]"], true, never>;
|
|
389
389
|
}
|
|
390
390
|
|
|
391
391
|
interface AvatarUploadedFile {
|