@dso-design-system/ui 0.0.2 → 0.1.1
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/esm2022/lib/alert/alert.component.mjs +54 -0
- package/esm2022/lib/badge/badge.component.mjs +22 -0
- package/esm2022/lib/badge/badge.directive.mjs +68 -0
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +29 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +82 -0
- package/esm2022/lib/datepicker/datepicker.component.mjs +161 -0
- package/esm2022/lib/dialog/dialog.component.mjs +25 -0
- package/esm2022/lib/dropdown-list/dropdown-list.component.mjs +89 -0
- package/esm2022/lib/file-upload-items/file-upload-items.component.mjs +65 -0
- package/esm2022/lib/file-upload-multiple/file-upload-multiple.component.mjs +232 -0
- package/esm2022/lib/file-upload-multiple/upload-item.model.mjs +2 -0
- package/esm2022/lib/file-upload-multiple/upload-simulator.service.mjs +76 -0
- package/esm2022/lib/file-upload-single/file-upload-single.component.mjs +100 -0
- package/esm2022/lib/input-text/input-text.component.mjs +93 -0
- package/esm2022/lib/pagination/pagination.component.mjs +115 -0
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +25 -0
- package/esm2022/lib/radio/radio.component.mjs +41 -0
- package/esm2022/lib/select-dropdown/select-dropdown.component.mjs +228 -0
- package/esm2022/lib/service/toast.service.mjs +20 -0
- package/esm2022/lib/side-navigation-bar/side-navigation-bar.component.mjs +113 -0
- package/esm2022/lib/spinner/spinner.component.mjs +60 -0
- package/esm2022/lib/table/table.component.mjs +136 -0
- package/esm2022/lib/tabs/tab.component.mjs +20 -0
- package/esm2022/lib/tabs/tabs.component.mjs +40 -0
- package/esm2022/lib/tag/tag.component.mjs +27 -0
- package/esm2022/lib/text-area/text-area.component.mjs +74 -0
- package/esm2022/lib/toast/toast.component.mjs +36 -0
- package/esm2022/lib/tooltip/tooltip.component.mjs +38 -0
- package/esm2022/lib/tooltip/tooltip.directive.mjs +105 -0
- package/esm2022/lib/top-navigation-bar/top-navigation-bar.component.mjs +24 -0
- package/esm2022/public-api.mjs +29 -2
- package/fesm2022/dso-design-system-ui.mjs +2053 -3
- package/fesm2022/dso-design-system-ui.mjs.map +1 -1
- package/lib/alert/alert.component.d.ts +20 -0
- package/lib/badge/badge.component.d.ts +8 -0
- package/lib/badge/badge.directive.d.ts +15 -0
- package/lib/breadcrumb/breadcrumb.component.d.ts +15 -0
- package/lib/checkbox/checkbox.component.d.ts +42 -0
- package/lib/datepicker/datepicker.component.d.ts +48 -0
- package/lib/dialog/dialog.component.d.ts +10 -0
- package/lib/dropdown-list/dropdown-list.component.d.ts +33 -0
- package/lib/file-upload-items/file-upload-items.component.d.ts +27 -0
- package/lib/file-upload-multiple/file-upload-multiple.component.d.ts +44 -0
- package/lib/file-upload-multiple/upload-item.model.d.ts +7 -0
- package/lib/file-upload-multiple/upload-simulator.service.d.ts +34 -0
- package/lib/file-upload-single/file-upload-single.component.d.ts +28 -0
- package/lib/input-text/input-text.component.d.ts +24 -0
- package/lib/pagination/pagination.component.d.ts +31 -0
- package/lib/progress-bar/progress-bar.component.d.ts +11 -0
- package/lib/radio/radio.component.d.ts +14 -0
- package/lib/select-dropdown/select-dropdown.component.d.ts +78 -0
- package/lib/service/toast.service.d.ts +16 -0
- package/lib/side-navigation-bar/side-navigation-bar.component.d.ts +74 -0
- package/lib/spinner/spinner.component.d.ts +23 -0
- package/lib/table/table.component.d.ts +43 -0
- package/lib/tabs/tab.component.d.ts +9 -0
- package/lib/tabs/tabs.component.d.ts +15 -0
- package/lib/tag/tag.component.d.ts +10 -0
- package/lib/text-area/text-area.component.d.ts +21 -0
- package/lib/toast/toast.component.d.ts +13 -0
- package/lib/tooltip/tooltip.component.d.ts +15 -0
- package/lib/tooltip/tooltip.directive.d.ts +19 -0
- package/lib/top-navigation-bar/top-navigation-bar.component.d.ts +16 -0
- package/package.json +1 -1
- package/public-api.d.ts +27 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, Input } from '@angular/core';
|
|
3
|
+
import { ButtonComponent } from '../button/button.component';
|
|
4
|
+
import { IconComponent } from '../icon/icon.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
export class AlertComponent {
|
|
8
|
+
type = 'info';
|
|
9
|
+
message = '';
|
|
10
|
+
showActions = false;
|
|
11
|
+
isDismissable = true;
|
|
12
|
+
actions = [];
|
|
13
|
+
isVisible = true;
|
|
14
|
+
isHiding = false;
|
|
15
|
+
close() {
|
|
16
|
+
this.isHiding = true;
|
|
17
|
+
// Wait for fadeOut animation to finish before removing the alert
|
|
18
|
+
setTimeout(() => {
|
|
19
|
+
this.isVisible = false;
|
|
20
|
+
}, 300); // match duration in CSS
|
|
21
|
+
}
|
|
22
|
+
// Pick the icon name based on alert type
|
|
23
|
+
get iconName() {
|
|
24
|
+
switch (this.type) {
|
|
25
|
+
case 'success': return 'icon-slanted-check';
|
|
26
|
+
case 'error': return 'icon-left-align';
|
|
27
|
+
case 'warning': return 'icon-van';
|
|
28
|
+
default: return 'icon-notification';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Handle when a button inside the alert is clicked */
|
|
32
|
+
handleAction(action) {
|
|
33
|
+
if (action.onClick) {
|
|
34
|
+
action.onClick();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AlertComponent, isStandalone: true, selector: "dso-alert", inputs: { type: "type", message: "message", showActions: "showActions", isDismissable: "isDismissable", actions: "actions" }, ngImport: i0, template: "\r\n<div\r\n*ngIf=\"isVisible\"\r\nclass=\"alert\"\r\n[ngClass]=\"[type, isHiding ? 'hide' : '']\"> \r\n <div class=\"positioning\">\r\n <dso-icon [iconName]=\"iconName\" [size]=\"'medium'\"></dso-icon>\r\n </div>\r\n <span [innerHTML]=\"message\"></span>\r\n\r\n <div class=\"positioning\" *ngIf=\"actions && actions.length > 0 || isDismissable\">\r\n <div class=\"button-wrapper\">\r\n <dso-button\r\n *ngFor=\"let action of actions\"\r\n [btnLabel]=\"action.btnLabel\"\r\n [btnType]=\"action.btnType || 'contrast'\" \r\n [btnSize]=\"action.btnSize || 'mdBtn'\"\r\n [btnIconName]=\"action.btnIconName ?? null\"\r\n [isDisabled]=\"action.isDisabled || false\"\r\n (click)=\"handleAction(action)\">\r\n </dso-button>\r\n </div>\r\n <button (click)=\"close()\" *ngIf=\"isDismissable\" class=\"close-btn\">×</button>\r\n </div>\r\n \r\n</div>", styles: ["@charset \"UTF-8\";@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.alert{padding:12px 16px;border-radius:5px;gap:16px;display:flex;align-items:stretch;font-size:16px;animation:fadeIn .4s ease-in}.alert.hide{animation:fadeOut .4s ease-out forwards}.success{background-color:#77c98a;color:#fff}.error{background-color:#dc3545;color:#fff}.info{background-color:#17a2b8;color:#fff}.warning{background-color:#ffc107;color:#000}.close-btn{width:24px;height:24px;padding:0;margin:0;display:flex;align-items:center;justify-content:center;background:none;border:none;font-size:24px;line-height:1;color:inherit;cursor:pointer}.close-btn:hover{opacity:.7}.content-wrapper{display:flex;align-items:center;flex:1;gap:12px}.positioning{display:flex;align-items:flex-start;align-self:stretch}span{flex-grow:1;line-height:1.4;max-height:7em;overflow-y:auto}.button-wrapper{display:flex;flex-direction:column;gap:8px;padding-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "dso-button", inputs: ["btnLabel", "btnType", "btnSize", "btnIconName", "isDisabled", "isActive"], outputs: ["onClick"] }, { kind: "component", type: IconComponent, selector: "dso-icon", inputs: ["iconName", "size"] }] });
|
|
39
|
+
}
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertComponent, decorators: [{
|
|
41
|
+
type: Component,
|
|
42
|
+
args: [{ selector: 'dso-alert', standalone: true, imports: [CommonModule, ButtonComponent, IconComponent], template: "\r\n<div\r\n*ngIf=\"isVisible\"\r\nclass=\"alert\"\r\n[ngClass]=\"[type, isHiding ? 'hide' : '']\"> \r\n <div class=\"positioning\">\r\n <dso-icon [iconName]=\"iconName\" [size]=\"'medium'\"></dso-icon>\r\n </div>\r\n <span [innerHTML]=\"message\"></span>\r\n\r\n <div class=\"positioning\" *ngIf=\"actions && actions.length > 0 || isDismissable\">\r\n <div class=\"button-wrapper\">\r\n <dso-button\r\n *ngFor=\"let action of actions\"\r\n [btnLabel]=\"action.btnLabel\"\r\n [btnType]=\"action.btnType || 'contrast'\" \r\n [btnSize]=\"action.btnSize || 'mdBtn'\"\r\n [btnIconName]=\"action.btnIconName ?? null\"\r\n [isDisabled]=\"action.isDisabled || false\"\r\n (click)=\"handleAction(action)\">\r\n </dso-button>\r\n </div>\r\n <button (click)=\"close()\" *ngIf=\"isDismissable\" class=\"close-btn\">×</button>\r\n </div>\r\n \r\n</div>", styles: ["@charset \"UTF-8\";@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.alert{padding:12px 16px;border-radius:5px;gap:16px;display:flex;align-items:stretch;font-size:16px;animation:fadeIn .4s ease-in}.alert.hide{animation:fadeOut .4s ease-out forwards}.success{background-color:#77c98a;color:#fff}.error{background-color:#dc3545;color:#fff}.info{background-color:#17a2b8;color:#fff}.warning{background-color:#ffc107;color:#000}.close-btn{width:24px;height:24px;padding:0;margin:0;display:flex;align-items:center;justify-content:center;background:none;border:none;font-size:24px;line-height:1;color:inherit;cursor:pointer}.close-btn:hover{opacity:.7}.content-wrapper{display:flex;align-items:center;flex:1;gap:12px}.positioning{display:flex;align-items:flex-start;align-self:stretch}span{flex-grow:1;line-height:1.4;max-height:7em;overflow-y:auto}.button-wrapper{display:flex;flex-direction:column;gap:8px;padding-right:8px}\n"] }]
|
|
43
|
+
}], propDecorators: { type: [{
|
|
44
|
+
type: Input
|
|
45
|
+
}], message: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}], showActions: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}], isDismissable: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], actions: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}] } });
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9hbGVydC9hbGVydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2FsZXJ0L2FsZXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBZXZELE1BQU0sT0FBTyxjQUFjO0lBQ2hCLElBQUksR0FBNkMsTUFBTSxDQUFDO0lBQ3hELE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDYixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDckIsT0FBTyxHQUFrQixFQUFFLENBQUM7SUFHckMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNqQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWpCLEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixpRUFBaUU7UUFDakUsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUNuQyxDQUFDO0lBRUMseUNBQXlDO0lBQzNDLElBQUksUUFBUTtRQUNWLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssU0FBUyxDQUFDLENBQUMsT0FBTyxvQkFBb0IsQ0FBQztZQUM1QyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8saUJBQWlCLENBQUM7WUFDdkMsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQztZQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLG1CQUFtQixDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUMsdURBQXVEO0lBQ3pELFlBQVksQ0FBQyxNQUFtQjtRQUM5QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7d0dBbENVLGNBQWM7NEZBQWQsY0FBYyxtTUNsQjNCLDg5QkF5Qk0sZ2pDRFpPLFlBQVksOFZBQUUsZUFBZSxrS0FBRSxhQUFhOzs0RkFLNUMsY0FBYztrQkFSMUIsU0FBUzsrQkFDRSxXQUFXLGNBQ1QsSUFBSSxXQUNQLENBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUU7OEJBTWhELElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50LCBCdXR0b25Db25maWcgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFsZXJ0QWN0aW9uIGV4dGVuZHMgQnV0dG9uQ29uZmlnIHtcclxuICBvbkNsaWNrPzogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkc28tYWxlcnQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogWyBDb21tb25Nb2R1bGUsIEJ1dHRvbkNvbXBvbmVudCwgSWNvbkNvbXBvbmVudCBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGVydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FsZXJ0LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEFsZXJ0Q29tcG9uZW50IHtcclxuICBASW5wdXQoKSB0eXBlOiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nIHwgJ3dhcm5pbmcnID0gJ2luZm8nO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2UgPSAnJztcclxuICBASW5wdXQoKSBzaG93QWN0aW9ucyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzRGlzbWlzc2FibGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGFjdGlvbnM6IEFsZXJ0QWN0aW9uW10gPSBbXTtcclxuXHJcblxyXG4gIGlzVmlzaWJsZSA9IHRydWU7XHJcbiAgaXNIaWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmlzSGlkaW5nID0gdHJ1ZTtcclxuICAgIC8vIFdhaXQgZm9yIGZhZGVPdXQgYW5pbWF0aW9uIHRvIGZpbmlzaCBiZWZvcmUgcmVtb3ZpbmcgdGhlIGFsZXJ0XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTtcclxuICAgIH0sIDMwMCk7IC8vIG1hdGNoIGR1cmF0aW9uIGluIENTU1xyXG4gIH1cclxuXHJcbiAgICAvLyBQaWNrIHRoZSBpY29uIG5hbWUgYmFzZWQgb24gYWxlcnQgdHlwZVxyXG4gIGdldCBpY29uTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3VjY2Vzcyc6IHJldHVybiAnaWNvbi1zbGFudGVkLWNoZWNrJztcclxuICAgICAgY2FzZSAnZXJyb3InOiByZXR1cm4gJ2ljb24tbGVmdC1hbGlnbic7XHJcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOiByZXR1cm4gJ2ljb24tdmFuJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuICdpY29uLW5vdGlmaWNhdGlvbic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAgIC8qKiBIYW5kbGUgd2hlbiBhIGJ1dHRvbiBpbnNpZGUgdGhlIGFsZXJ0IGlzIGNsaWNrZWQgKi9cclxuICBoYW5kbGVBY3Rpb24oYWN0aW9uOiBBbGVydEFjdGlvbikge1xyXG4gICAgaWYgKGFjdGlvbi5vbkNsaWNrKSB7XHJcbiAgICAgIGFjdGlvbi5vbkNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSIsIlxyXG48ZGl2XHJcbipuZ0lmPVwiaXNWaXNpYmxlXCJcclxuY2xhc3M9XCJhbGVydFwiXHJcbltuZ0NsYXNzXT1cIlt0eXBlLCBpc0hpZGluZyA/ICdoaWRlJyA6ICcnXVwiPiAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uaW5nXCI+XHJcbiAgICAgICAgPGRzby1pY29uIFtpY29uTmFtZV09XCJpY29uTmFtZVwiIFtzaXplXT1cIidtZWRpdW0nXCI+PC9kc28taWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHNwYW4gW2lubmVySFRNTF09XCJtZXNzYWdlXCI+PC9zcGFuPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbmluZ1wiICpuZ0lmPVwiYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCA+IDAgfHwgaXNEaXNtaXNzYWJsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24td3JhcHBlclwiPlxyXG4gICAgICAgIDxkc28tYnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiXHJcbiAgICAgICAgICAgIFtidG5MYWJlbF09XCJhY3Rpb24uYnRuTGFiZWxcIlxyXG4gICAgICAgICAgICBbYnRuVHlwZV09XCJhY3Rpb24uYnRuVHlwZSB8fCAnY29udHJhc3QnXCIgXHJcbiAgICAgICAgICAgIFtidG5TaXplXT1cImFjdGlvbi5idG5TaXplIHx8ICdtZEJ0bidcIlxyXG4gICAgICAgICAgICBbYnRuSWNvbk5hbWVdPVwiYWN0aW9uLmJ0bkljb25OYW1lID8/IG51bGxcIlxyXG4gICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJhY3Rpb24uaXNEaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBY3Rpb24oYWN0aW9uKVwiPlxyXG4gICAgICAgIDwvZHNvLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCIgKm5nSWY9XCJpc0Rpc21pc3NhYmxlXCIgY2xhc3M9XCJjbG9zZS1idG5cIj4mdGltZXM7PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, Input } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class BadgeComponent {
|
|
6
|
+
label = null;
|
|
7
|
+
color = 'primary';
|
|
8
|
+
get isDot() {
|
|
9
|
+
return this.label === null || this.label === '' || this.label === undefined;
|
|
10
|
+
}
|
|
11
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
12
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BadgeComponent, isStandalone: true, selector: "dso-badge", inputs: { label: "label", color: "color" }, ngImport: i0, template: "<span class=\"badge\" [ngClass]=\"[color, isDot ? 'dot' : '']\">\r\n <ng-container *ngIf=\"!isDot\">{{ label }}</ng-container>\r\n</span>", styles: [".badge{display:inline-flex;align-items:center;justify-content:center;padding:.25rem .5rem;border-radius:1rem;font-size:.75rem;font-weight:600;text-transform:uppercase;color:#fff;line-height:1;min-width:1.25rem}.primary{background-color:#007bff}.success{background-color:#28a745}.warning{background-color:#ffc107;color:#000}.danger{background-color:#dc3545}.badge.dot{padding:0;width:.5rem;height:.5rem;min-width:0;border-radius:50%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeComponent, decorators: [{
|
|
15
|
+
type: Component,
|
|
16
|
+
args: [{ selector: 'dso-badge', standalone: true, imports: [CommonModule], template: "<span class=\"badge\" [ngClass]=\"[color, isDot ? 'dot' : '']\">\r\n <ng-container *ngIf=\"!isDot\">{{ label }}</ng-container>\r\n</span>", styles: [".badge{display:inline-flex;align-items:center;justify-content:center;padding:.25rem .5rem;border-radius:1rem;font-size:.75rem;font-weight:600;text-transform:uppercase;color:#fff;line-height:1;min-width:1.25rem}.primary{background-color:#007bff}.success{background-color:#28a745}.warning{background-color:#ffc107;color:#000}.danger{background-color:#dc3545}.badge.dot{padding:0;width:.5rem;height:.5rem;min-width:0;border-radius:50%}\n"] }]
|
|
17
|
+
}], propDecorators: { label: [{
|
|
18
|
+
type: Input
|
|
19
|
+
}], color: [{
|
|
20
|
+
type: Input
|
|
21
|
+
}] } });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9iYWRnZS9iYWRnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2JhZGdlL2JhZGdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBVWpELE1BQU0sT0FBTyxjQUFjO0lBRWhCLEtBQUssR0FBMkIsSUFBSSxDQUFDO0lBQ3JDLEtBQUssR0FBaUQsU0FBUyxDQUFDO0lBRXpFLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7SUFDOUUsQ0FBQzt3R0FQVSxjQUFjOzRGQUFkLGNBQWMsaUhDWDNCLDRJQUVPLDJlRE1LLFlBQVk7OzRGQUdYLGNBQWM7a0JBUjFCLFNBQVM7K0JBQ0UsV0FBVyxjQUNULElBQUksV0FHUCxDQUFDLFlBQVksQ0FBQzs4QkFLZCxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkc28tYmFkZ2UnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JhZGdlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9iYWRnZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFkZ2VDb21wb25lbnQge1xyXG4gIFxyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBjb2xvcjogJ3ByaW1hcnknIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcicgPSAncHJpbWFyeSc7XHJcblxyXG4gIGdldCBpc0RvdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsID09PSBudWxsIHx8IHRoaXMubGFiZWwgPT09ICcnIHx8IHRoaXMubGFiZWwgPT09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG59XHJcbiIsIjxzcGFuIGNsYXNzPVwiYmFkZ2VcIiBbbmdDbGFzc109XCJbY29sb3IsIGlzRG90ID8gJ2RvdCcgOiAnJ11cIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRG90XCI+e3sgbGFiZWwgfX08L25nLWNvbnRhaW5lcj5cclxuPC9zcGFuPiJdfQ==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Directive, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class BadgeDirective {
|
|
4
|
+
el;
|
|
5
|
+
renderer;
|
|
6
|
+
// The text or number displayed inside the badge (e.g. "5" or empty for a dot)
|
|
7
|
+
label = null;
|
|
8
|
+
// Optional color input, defaulting to 'primary'
|
|
9
|
+
badgeColor = 'info';
|
|
10
|
+
// We'll store a reference to the created badge element here
|
|
11
|
+
badgeEl = null;
|
|
12
|
+
constructor(el, // Reference to the host element (the one with [dsoDirectiveBadge])
|
|
13
|
+
renderer // Used for safe DOM manipulation in Angular
|
|
14
|
+
) {
|
|
15
|
+
this.el = el;
|
|
16
|
+
this.renderer = renderer;
|
|
17
|
+
// Ensure the host element is relatively positioned so the badge can be placed absolutely
|
|
18
|
+
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
|
|
19
|
+
}
|
|
20
|
+
// Called automatically whenever @Input values change (label or badgeColor)
|
|
21
|
+
ngOnChanges(changes) {
|
|
22
|
+
this.updateBadge();
|
|
23
|
+
}
|
|
24
|
+
// Create or update the badge element
|
|
25
|
+
updateBadge() {
|
|
26
|
+
// console.log('BadgeDirective running on', this.el.nativeElement);
|
|
27
|
+
// ✅ STEP 1: If we don’t already have a badge element, create one
|
|
28
|
+
if (!this.badgeEl) {
|
|
29
|
+
this.badgeEl = this.renderer.createElement('span'); // create <span>
|
|
30
|
+
this.renderer.addClass(this.badgeEl, 'badge-directive'); // add base class
|
|
31
|
+
// Append the badge <span> inside the host element (the icon, button, avatar, etc.)
|
|
32
|
+
this.renderer.appendChild(this.el.nativeElement, this.badgeEl);
|
|
33
|
+
}
|
|
34
|
+
// At this point, badgeEl definitely exists, but TypeScript doesn’t know that.
|
|
35
|
+
// So, we use a non-null assertion (!) to tell TypeScript “we’re sure it’s not null”.
|
|
36
|
+
const badge = this.badgeEl;
|
|
37
|
+
// ✅ STEP 2: Update label and style
|
|
38
|
+
// If the label is empty/null, it becomes a dot badge
|
|
39
|
+
if (this.label === null || this.label === '' || this.label === undefined) {
|
|
40
|
+
this.renderer.addClass(badge, 'dot');
|
|
41
|
+
badge.textContent = ''; // no text, just a dot
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.renderer.removeClass(badge, 'dot');
|
|
45
|
+
badge.textContent = this.label.toString();
|
|
46
|
+
}
|
|
47
|
+
// ✅ STEP 3: Update color classes
|
|
48
|
+
// First, remove all possible color classes
|
|
49
|
+
badge.classList.remove('info', 'success', 'warning', 'danger');
|
|
50
|
+
// Then, add the one we want
|
|
51
|
+
badge.classList.add(this.badgeColor);
|
|
52
|
+
}
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
|
|
54
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BadgeDirective, isStandalone: true, selector: "[dsoDirectiveBadge]", inputs: { label: ["dsoDirectiveBadge", "label"], badgeColor: "badgeColor" }, usesOnChanges: true, ngImport: i0 });
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeDirective, decorators: [{
|
|
57
|
+
type: Directive,
|
|
58
|
+
args: [{
|
|
59
|
+
selector: '[dsoDirectiveBadge]', // This directive is used like: <app-icon dsoDirectiveBadge="5"></app-icon>
|
|
60
|
+
standalone: true
|
|
61
|
+
}]
|
|
62
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { label: [{
|
|
63
|
+
type: Input,
|
|
64
|
+
args: ['dsoDirectiveBadge']
|
|
65
|
+
}], badgeColor: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}] } });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2UuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9iYWRnZS9iYWRnZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQXVDLE1BQU0sZUFBZSxDQUFDOztBQU1sRyxNQUFNLE9BQU8sY0FBYztJQVdmO0lBQ0E7SUFYViw4RUFBOEU7SUFDbEQsS0FBSyxHQUEyQixJQUFJLENBQUM7SUFFakUsZ0RBQWdEO0lBQ3ZDLFVBQVUsR0FBOEMsTUFBTSxDQUFDO0lBRXhFLDREQUE0RDtJQUNwRCxPQUFPLEdBQXVCLElBQUksQ0FBQztJQUUzQyxZQUNVLEVBQWMsRUFBRSxtRUFBbUU7SUFDbkYsUUFBbUIsQ0FBQyw0Q0FBNEM7O1FBRGhFLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBRTNCLHlGQUF5RjtRQUN6RixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxxQ0FBcUM7SUFDN0IsV0FBVztRQUNqQixtRUFBbUU7UUFFbkUsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtZQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUI7WUFFMUUsbUZBQW1GO1lBQ25GLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsOEVBQThFO1FBQzlFLHFGQUFxRjtRQUNyRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDO1FBRTVCLG1DQUFtQztRQUNuQyxxREFBcUQ7UUFDckQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyQyxLQUFLLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUMsQ0FBQztRQUVELGlDQUFpQztRQUNqQywyQ0FBMkM7UUFDM0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0QsNEJBQTRCO1FBQzVCLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2QyxDQUFDO3dHQXZEVSxjQUFjOzRGQUFkLGNBQWM7OzRGQUFkLGNBQWM7a0JBSjFCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHFCQUFxQixFQUFFLDJFQUEyRTtvQkFDNUcsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO3VHQUc2QixLQUFLO3NCQUFoQyxLQUFLO3VCQUFDLG1CQUFtQjtnQkFHakIsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIFJlbmRlcmVyMiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkc29EaXJlY3RpdmVCYWRnZV0nLCAvLyBUaGlzIGRpcmVjdGl2ZSBpcyB1c2VkIGxpa2U6IDxhcHAtaWNvbiBkc29EaXJlY3RpdmVCYWRnZT1cIjVcIj48L2FwcC1pY29uPlxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIEJhZGdlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICAvLyBUaGUgdGV4dCBvciBudW1iZXIgZGlzcGxheWVkIGluc2lkZSB0aGUgYmFkZ2UgKGUuZy4gXCI1XCIgb3IgZW1wdHkgZm9yIGEgZG90KVxyXG4gIEBJbnB1dCgnZHNvRGlyZWN0aXZlQmFkZ2UnKSBsYWJlbDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIE9wdGlvbmFsIGNvbG9yIGlucHV0LCBkZWZhdWx0aW5nIHRvICdwcmltYXJ5J1xyXG4gIEBJbnB1dCgpIGJhZGdlQ29sb3I6ICdpbmZvJyB8ICdzdWNjZXNzJyB8ICd3YXJuaW5nJyB8ICdkYW5nZXInID0gJ2luZm8nO1xyXG5cclxuICAvLyBXZSdsbCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgY3JlYXRlZCBiYWRnZSBlbGVtZW50IGhlcmVcclxuICBwcml2YXRlIGJhZGdlRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgLy8gUmVmZXJlbmNlIHRvIHRoZSBob3N0IGVsZW1lbnQgKHRoZSBvbmUgd2l0aCBbZHNvRGlyZWN0aXZlQmFkZ2VdKVxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyIC8vIFVzZWQgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbiBpbiBBbmd1bGFyXHJcbiAgKSB7XHJcbiAgICAvLyBFbnN1cmUgdGhlIGhvc3QgZWxlbWVudCBpcyByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgc28gdGhlIGJhZGdlIGNhbiBiZSBwbGFjZWQgYWJzb2x1dGVseVxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbmV2ZXIgQElucHV0IHZhbHVlcyBjaGFuZ2UgKGxhYmVsIG9yIGJhZGdlQ29sb3IpXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgdGhpcy51cGRhdGVCYWRnZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgYmFkZ2UgZWxlbWVudFxyXG4gIHByaXZhdGUgdXBkYXRlQmFkZ2UoKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnQmFkZ2VEaXJlY3RpdmUgcnVubmluZyBvbicsIHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgLy8g4pyFIFNURVAgMTogSWYgd2UgZG9u4oCZdCBhbHJlYWR5IGhhdmUgYSBiYWRnZSBlbGVtZW50LCBjcmVhdGUgb25lXHJcbiAgICBpZiAoIXRoaXMuYmFkZ2VFbCkge1xyXG4gICAgICB0aGlzLmJhZGdlRWwgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgLy8gY3JlYXRlIDxzcGFuPlxyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYmFkZ2VFbCwgJ2JhZGdlLWRpcmVjdGl2ZScpOyAvLyBhZGQgYmFzZSBjbGFzc1xyXG5cclxuICAgICAgLy8gQXBwZW5kIHRoZSBiYWRnZSA8c3Bhbj4gaW5zaWRlIHRoZSBob3N0IGVsZW1lbnQgKHRoZSBpY29uLCBidXR0b24sIGF2YXRhciwgZXRjLilcclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuYmFkZ2VFbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgYmFkZ2VFbCBkZWZpbml0ZWx5IGV4aXN0cywgYnV0IFR5cGVTY3JpcHQgZG9lc27igJl0IGtub3cgdGhhdC5cclxuICAgIC8vIFNvLCB3ZSB1c2UgYSBub24tbnVsbCBhc3NlcnRpb24gKCEpIHRvIHRlbGwgVHlwZVNjcmlwdCDigJx3ZeKAmXJlIHN1cmUgaXTigJlzIG5vdCBudWxs4oCdLlxyXG4gICAgY29uc3QgYmFkZ2UgPSB0aGlzLmJhZGdlRWwhO1xyXG5cclxuICAgIC8vIOKchSBTVEVQIDI6IFVwZGF0ZSBsYWJlbCBhbmQgc3R5bGVcclxuICAgIC8vIElmIHRoZSBsYWJlbCBpcyBlbXB0eS9udWxsLCBpdCBiZWNvbWVzIGEgZG90IGJhZGdlXHJcbiAgICBpZiAodGhpcy5sYWJlbCA9PT0gbnVsbCB8fCB0aGlzLmxhYmVsID09PSAnJyB8fCB0aGlzLmxhYmVsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhiYWRnZSwgJ2RvdCcpO1xyXG4gICAgICBiYWRnZS50ZXh0Q29udGVudCA9ICcnOyAvLyBubyB0ZXh0LCBqdXN0IGEgZG90XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGJhZGdlLCAnZG90Jyk7XHJcbiAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gdGhpcy5sYWJlbC50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKchSBTVEVQIDM6IFVwZGF0ZSBjb2xvciBjbGFzc2VzXHJcbiAgICAvLyBGaXJzdCwgcmVtb3ZlIGFsbCBwb3NzaWJsZSBjb2xvciBjbGFzc2VzXHJcbiAgICBiYWRnZS5jbGFzc0xpc3QucmVtb3ZlKCdpbmZvJywgJ3N1Y2Nlc3MnLCAnd2FybmluZycsICdkYW5nZXInKTtcclxuICAgIC8vIFRoZW4sIGFkZCB0aGUgb25lIHdlIHdhbnRcclxuICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQodGhpcy5iYWRnZUNvbG9yKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
+
import { RouterLink } from '@angular/router';
|
|
4
|
+
import { ButtonComponent } from '../button/button.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
export class BreadcrumbComponent {
|
|
8
|
+
items = [];
|
|
9
|
+
itemSelected = new EventEmitter();
|
|
10
|
+
// Default separator → you can allow this to be set via @Input() later
|
|
11
|
+
separator = '/';
|
|
12
|
+
onItemClicked(item) {
|
|
13
|
+
this.itemSelected.emit(item);
|
|
14
|
+
console.log('breadcrumb emitted -> ', item);
|
|
15
|
+
}
|
|
16
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
17
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BreadcrumbComponent, isStandalone: true, selector: "dso-breadcrumb", inputs: { items: "items", separator: "separator" }, outputs: { itemSelected: "itemSelected" }, ngImport: i0, template: "<nav aria-label=\"Breadcrumb\" class=\"breadcrumb\">\r\n <ol>\r\n <li *ngFor=\"let item of items; let last = last\" class=\"crumb\">\r\n\r\n <!-- Normal breadcrumb link -->\r\n <ng-container *ngIf=\"!last && item.url; else lastItem\">\r\n\r\n <dso-button\r\n btnType=\"text\"\r\n btnSize=\"smBtn\"\r\n [btnLabel]=\"item.label\"\r\n [isDisabled]=\"false\"\r\n (onClick)=\"onItemClicked(item)\"\r\n [routerLink]=\"item.url\">\r\n </dso-button>\r\n\r\n </ng-container>\r\n\r\n <!-- Last breadcrumb item (non-clickable) -->\r\n <ng-template #lastItem>\r\n <span class=\"current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n\r\n <!-- Separator -->\r\n <span class=\"separator\" *ngIf=\"!last\">{{ separator }}</span>\r\n\r\n </li>\r\n </ol>\r\n <!-- <dso-button btnType=\"text\" btnLabel=\"Go Home\" [routerLink]=\"['/page1']\"></dso-button> -->\r\n\r\n</nav>\r\n\r\n\r\n", styles: [".breadcrumb{font-size:14px;color:var(--ui-text-muted, #666)}.breadcrumb ol{list-style:none;padding:0;margin:0;display:flex;align-items:center;flex-wrap:wrap}.breadcrumb .crumb{display:flex;align-items:center}.breadcrumb .crumb a{color:var(--ui-primary, #4a5cff);text-decoration:none;font-weight:500}.breadcrumb .crumb a:hover{text-decoration:underline}.breadcrumb .crumb .current{color:var(--ui-text, #222);font-weight:600;padding:0 8px}.breadcrumb .crumb .separator{margin:0 8px;color:var(--ui-text-muted, #999);font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ButtonComponent, selector: "dso-button", inputs: ["btnLabel", "btnType", "btnSize", "btnIconName", "isDisabled", "isActive"], outputs: ["onClick"] }] });
|
|
18
|
+
}
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BreadcrumbComponent, decorators: [{
|
|
20
|
+
type: Component,
|
|
21
|
+
args: [{ selector: 'dso-breadcrumb', standalone: true, imports: [CommonModule, RouterLink, ButtonComponent], template: "<nav aria-label=\"Breadcrumb\" class=\"breadcrumb\">\r\n <ol>\r\n <li *ngFor=\"let item of items; let last = last\" class=\"crumb\">\r\n\r\n <!-- Normal breadcrumb link -->\r\n <ng-container *ngIf=\"!last && item.url; else lastItem\">\r\n\r\n <dso-button\r\n btnType=\"text\"\r\n btnSize=\"smBtn\"\r\n [btnLabel]=\"item.label\"\r\n [isDisabled]=\"false\"\r\n (onClick)=\"onItemClicked(item)\"\r\n [routerLink]=\"item.url\">\r\n </dso-button>\r\n\r\n </ng-container>\r\n\r\n <!-- Last breadcrumb item (non-clickable) -->\r\n <ng-template #lastItem>\r\n <span class=\"current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n\r\n <!-- Separator -->\r\n <span class=\"separator\" *ngIf=\"!last\">{{ separator }}</span>\r\n\r\n </li>\r\n </ol>\r\n <!-- <dso-button btnType=\"text\" btnLabel=\"Go Home\" [routerLink]=\"['/page1']\"></dso-button> -->\r\n\r\n</nav>\r\n\r\n\r\n", styles: [".breadcrumb{font-size:14px;color:var(--ui-text-muted, #666)}.breadcrumb ol{list-style:none;padding:0;margin:0;display:flex;align-items:center;flex-wrap:wrap}.breadcrumb .crumb{display:flex;align-items:center}.breadcrumb .crumb a{color:var(--ui-primary, #4a5cff);text-decoration:none;font-weight:500}.breadcrumb .crumb a:hover{text-decoration:underline}.breadcrumb .crumb .current{color:var(--ui-text, #222);font-weight:600;padding:0 8px}.breadcrumb .crumb .separator{margin:0 8px;color:var(--ui-text-muted, #999);font-size:12px}\n"] }]
|
|
22
|
+
}], propDecorators: { items: [{
|
|
23
|
+
type: Input
|
|
24
|
+
}], itemSelected: [{
|
|
25
|
+
type: Output
|
|
26
|
+
}], separator: [{
|
|
27
|
+
type: Input
|
|
28
|
+
}] } });
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFlN0QsTUFBTSxPQUFPLG1CQUFtQjtJQUNyQixLQUFLLEdBQXFCLEVBQUUsQ0FBQztJQUM1QixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7SUFFNUQsc0VBQXNFO0lBQzdELFNBQVMsR0FBVyxHQUFHLENBQUM7SUFFakMsYUFBYSxDQUFDLElBQW9CO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQzt3R0FWVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix5S0NsQmhDLG1oQ0FtQ0EsMmtCRG5CYSxZQUFZLGdRQUFFLFVBQVUsb09BQUUsZUFBZTs7NEZBRXpDLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDRSxnQkFBZ0IsY0FHZCxJQUFJLFdBQ1AsQ0FBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBRTs4QkFHN0MsS0FBSztzQkFBYixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0UsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFkY3J1bWJJdGVtIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHVybD86IHN0cmluZztcclxuICBpY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Rzby1icmVhZGNydW1iJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYnJlYWRjcnVtYi5jb21wb25lbnQuc2NzcyddLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogWyBDb21tb25Nb2R1bGUsIFJvdXRlckxpbmssIEJ1dHRvbkNvbXBvbmVudCBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1iQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBpdGVtczogQnJlYWRjcnVtYkl0ZW1bXSA9IFtdO1xyXG4gIEBPdXRwdXQoKSBpdGVtU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJyZWFkY3J1bWJJdGVtPigpO1xyXG5cclxuICAvLyBEZWZhdWx0IHNlcGFyYXRvciDihpIgeW91IGNhbiBhbGxvdyB0aGlzIHRvIGJlIHNldCB2aWEgQElucHV0KCkgbGF0ZXJcclxuICBASW5wdXQoKSBzZXBhcmF0b3I6IHN0cmluZyA9ICcvJztcclxuXHJcbiAgb25JdGVtQ2xpY2tlZChpdGVtOiBCcmVhZGNydW1iSXRlbSkge1xyXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgIGNvbnNvbGUubG9nKCdicmVhZGNydW1iIGVtaXR0ZWQgLT4gJywgaXRlbSk7XHJcbiAgfVxyXG59XHJcbiIsIjxuYXYgYXJpYS1sYWJlbD1cIkJyZWFkY3J1bWJcIiBjbGFzcz1cImJyZWFkY3J1bWJcIj5cclxuICA8b2w+XHJcbiAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiY3J1bWJcIj5cclxuXHJcbiAgICAgIDwhLS0gTm9ybWFsIGJyZWFkY3J1bWIgbGluayAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0ICYmIGl0ZW0udXJsOyBlbHNlIGxhc3RJdGVtXCI+XHJcblxyXG4gICAgICAgIDxkc28tYnV0dG9uXHJcbiAgICAgICAgICBidG5UeXBlPVwidGV4dFwiXHJcbiAgICAgICAgICBidG5TaXplPVwic21CdG5cIlxyXG4gICAgICAgICAgW2J0bkxhYmVsXT1cIml0ZW0ubGFiZWxcIlxyXG4gICAgICAgICAgW2lzRGlzYWJsZWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgKG9uQ2xpY2spPVwib25JdGVtQ2xpY2tlZChpdGVtKVwiXHJcbiAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnVybFwiPlxyXG4gICAgICAgIDwvZHNvLWJ1dHRvbj5cclxuXHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSBMYXN0IGJyZWFkY3J1bWIgaXRlbSAobm9uLWNsaWNrYWJsZSkgLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbGFzdEl0ZW0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50XCIgYXJpYS1jdXJyZW50PVwicGFnZVwiPlxyXG4gICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDwhLS0gU2VwYXJhdG9yIC0tPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNlcGFyYXRvclwiICpuZ0lmPVwiIWxhc3RcIj57eyBzZXBhcmF0b3IgfX08L3NwYW4+XHJcblxyXG4gICAgPC9saT5cclxuICA8L29sPlxyXG4gIDwhLS0gPGRzby1idXR0b24gYnRuVHlwZT1cInRleHRcIiBidG5MYWJlbD1cIkdvIEhvbWVcIiBbcm91dGVyTGlua109XCJbJy9wYWdlMSddXCI+PC9kc28tYnV0dG9uPiAtLT5cclxuXHJcbjwvbmF2PlxyXG5cclxuXHJcbiJdfQ==
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
+
import { IconComponent } from '../icon/icon.component';
|
|
4
|
+
import { FormsModule } from '@angular/forms';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
/**
|
|
9
|
+
* Reusable Checkbox Component
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Optional label
|
|
13
|
+
* - Configurable size, error state, and disabled state
|
|
14
|
+
* - Emits changes to parent component
|
|
15
|
+
* - Supports custom icons
|
|
16
|
+
*/
|
|
17
|
+
export class CheckboxComponent {
|
|
18
|
+
/** Text label displayed next to the checkbox */
|
|
19
|
+
label;
|
|
20
|
+
/** Whether the checkbox is checked */
|
|
21
|
+
isChecked = true;
|
|
22
|
+
/** Whether the checkbox is disabled */
|
|
23
|
+
disabled = false;
|
|
24
|
+
/** Size of the checkbox: small, medium, or large */
|
|
25
|
+
size = 'medium';
|
|
26
|
+
/** Error state for styling purposes */
|
|
27
|
+
error = false;
|
|
28
|
+
/** Whether the checkbox is required */
|
|
29
|
+
required = false;
|
|
30
|
+
/** Error message to display when error is true */
|
|
31
|
+
errorMessage = '';
|
|
32
|
+
/** Icon name for the checkbox (default is a checkmark) */
|
|
33
|
+
iconName = 'icon-slanted-check';
|
|
34
|
+
/** Emits the updated checked state whenever the checkbox is toggled */
|
|
35
|
+
change = new EventEmitter();
|
|
36
|
+
/**
|
|
37
|
+
* Toggles the checked state of the checkbox
|
|
38
|
+
* and emits the new value to the parent component
|
|
39
|
+
*/
|
|
40
|
+
toggleCheckbox() {
|
|
41
|
+
if (!this.disabled) {
|
|
42
|
+
this.isChecked = !this.isChecked;
|
|
43
|
+
this.change.emit(this.isChecked);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Maps the checkbox size to icon size
|
|
48
|
+
*/
|
|
49
|
+
getIconSize() {
|
|
50
|
+
switch (this.size) {
|
|
51
|
+
case 'large': return 'large';
|
|
52
|
+
case 'medium': return 'medium';
|
|
53
|
+
case 'small': return 'small';
|
|
54
|
+
default: return 'medium'; // fallback to medium
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
58
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CheckboxComponent, isStandalone: true, selector: "dso-checkbox", inputs: { label: "label", isChecked: "isChecked", disabled: "disabled", size: "size", error: "error", required: "required", errorMessage: "errorMessage", iconName: "iconName" }, outputs: { change: "change" }, ngImport: i0, template: "<!--\r\n Checkbox Component Template\r\n --------------------------\r\n Features:\r\n - Clickable wrapper to toggle checkbox (disabled-safe)\r\n - Custom checkbox with icon\r\n - Label support\r\n - Error state styling\r\n - Size-based styling: small, medium, large\r\n-->\r\n\r\n<div \r\n class=\"checkbox-wrapper\"\r\n (click)=\"!disabled && toggleCheckbox()\"\r\n [ngClass]=\"{\r\n 'small': size === 'small', \r\n 'medium': size === 'medium', \r\n 'large': size === 'large',\r\n 'disabled': disabled\r\n }\">\r\n\r\n <!-- Hidden native checkbox for accessibility and form integration -->\r\n <input\r\n class=\"checkbox-input\"\r\n type=\"checkbox\"\r\n [ngModel]=\"isChecked\"\r\n [disabled]=\"disabled\"/>\r\n\r\n <!-- Custom checkbox UI -->\r\n <span \r\n class=\"custom-checkbox\" \r\n [class.checked]=\"isChecked\" \r\n [class.error]=\"error\">\r\n \r\n <!-- Display check icon only when checked -->\r\n <dso-icon \r\n *ngIf=\"isChecked\" \r\n [iconName]=\"iconName\" \r\n [size]=\"getIconSize()\">\r\n </dso-icon>\r\n\r\n </span> \r\n\r\n <!-- Optional label -->\r\n <span class=\"checkbox-label\">\r\n {{ label }}\r\n </span>\r\n\r\n</div>\r\n", styles: [".checkbox-wrapper{display:inline-flex;align-items:center;gap:8px;cursor:pointer;vertical-align:middle}.checkbox-wrapper.error .custom-checkbox{border-color:red}.checkbox-wrapper.disabled{cursor:not-allowed}.checkbox-wrapper.disabled .custom-checkbox{pointer-events:none;background-color:#f0f0f0;border-color:#d0d0d0}.checkbox-wrapper.disabled .custom-checkbox.checked{background-color:#00f;border-color:#00f;opacity:.3}.checkbox-input{width:1px;height:1px;margin:-1px;border:0;padding:0;clip:rect(0 0 0 0);clip-path:inset(100%);overflow:hidden;white-space:nowrap}.custom-checkbox{display:inline-flex;justify-content:center;border:1px solid #ccc;border-radius:4px;cursor:pointer;width:24px;height:24px}.custom-checkbox.checked{border-color:#00f;background-color:#00f;color:#fff}.checkbox-wrapper:not(.disabled):hover .custom-checkbox{background-color:#eeeff9;border-color:#0000ffc0;cursor:pointer}.checkbox-wrapper:not(.disabled):hover .custom-checkbox.checked{background-color:#0000ffa9;border-color:#0000ffc0}.custom-checkbox.small .checkbox-custom{width:12px;height:12px}.custom-checkbox.medium .checkbox-custom{width:16px;height:16px}.custom-checkbox.large .checkbox-custom{width:24px;height:24px}.checkbox-label{font-size:14px;font-weight:400}.error-message{color:red;font-size:12px;margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "dso-icon", inputs: ["iconName", "size"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
59
|
+
}
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxComponent, decorators: [{
|
|
61
|
+
type: Component,
|
|
62
|
+
args: [{ selector: 'dso-checkbox', standalone: true, imports: [CommonModule, IconComponent, FormsModule], template: "<!--\r\n Checkbox Component Template\r\n --------------------------\r\n Features:\r\n - Clickable wrapper to toggle checkbox (disabled-safe)\r\n - Custom checkbox with icon\r\n - Label support\r\n - Error state styling\r\n - Size-based styling: small, medium, large\r\n-->\r\n\r\n<div \r\n class=\"checkbox-wrapper\"\r\n (click)=\"!disabled && toggleCheckbox()\"\r\n [ngClass]=\"{\r\n 'small': size === 'small', \r\n 'medium': size === 'medium', \r\n 'large': size === 'large',\r\n 'disabled': disabled\r\n }\">\r\n\r\n <!-- Hidden native checkbox for accessibility and form integration -->\r\n <input\r\n class=\"checkbox-input\"\r\n type=\"checkbox\"\r\n [ngModel]=\"isChecked\"\r\n [disabled]=\"disabled\"/>\r\n\r\n <!-- Custom checkbox UI -->\r\n <span \r\n class=\"custom-checkbox\" \r\n [class.checked]=\"isChecked\" \r\n [class.error]=\"error\">\r\n \r\n <!-- Display check icon only when checked -->\r\n <dso-icon \r\n *ngIf=\"isChecked\" \r\n [iconName]=\"iconName\" \r\n [size]=\"getIconSize()\">\r\n </dso-icon>\r\n\r\n </span> \r\n\r\n <!-- Optional label -->\r\n <span class=\"checkbox-label\">\r\n {{ label }}\r\n </span>\r\n\r\n</div>\r\n", styles: [".checkbox-wrapper{display:inline-flex;align-items:center;gap:8px;cursor:pointer;vertical-align:middle}.checkbox-wrapper.error .custom-checkbox{border-color:red}.checkbox-wrapper.disabled{cursor:not-allowed}.checkbox-wrapper.disabled .custom-checkbox{pointer-events:none;background-color:#f0f0f0;border-color:#d0d0d0}.checkbox-wrapper.disabled .custom-checkbox.checked{background-color:#00f;border-color:#00f;opacity:.3}.checkbox-input{width:1px;height:1px;margin:-1px;border:0;padding:0;clip:rect(0 0 0 0);clip-path:inset(100%);overflow:hidden;white-space:nowrap}.custom-checkbox{display:inline-flex;justify-content:center;border:1px solid #ccc;border-radius:4px;cursor:pointer;width:24px;height:24px}.custom-checkbox.checked{border-color:#00f;background-color:#00f;color:#fff}.checkbox-wrapper:not(.disabled):hover .custom-checkbox{background-color:#eeeff9;border-color:#0000ffc0;cursor:pointer}.checkbox-wrapper:not(.disabled):hover .custom-checkbox.checked{background-color:#0000ffa9;border-color:#0000ffc0}.custom-checkbox.small .checkbox-custom{width:12px;height:12px}.custom-checkbox.medium .checkbox-custom{width:16px;height:16px}.custom-checkbox.large .checkbox-custom{width:24px;height:24px}.checkbox-label{font-size:14px;font-weight:400}.error-message{color:red;font-size:12px;margin-top:4px}\n"] }]
|
|
63
|
+
}], propDecorators: { label: [{
|
|
64
|
+
type: Input
|
|
65
|
+
}], isChecked: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}], disabled: [{
|
|
68
|
+
type: Input
|
|
69
|
+
}], size: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}], error: [{
|
|
72
|
+
type: Input
|
|
73
|
+
}], required: [{
|
|
74
|
+
type: Input
|
|
75
|
+
}], errorMessage: [{
|
|
76
|
+
type: Input
|
|
77
|
+
}], iconName: [{
|
|
78
|
+
type: Input
|
|
79
|
+
}], change: [{
|
|
80
|
+
type: Output
|
|
81
|
+
}] } });
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFN0M7Ozs7Ozs7O0dBUUc7QUFRSCxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLGdEQUFnRDtJQUN2QyxLQUFLLENBQVU7SUFFeEIsc0NBQXNDO0lBQzdCLFNBQVMsR0FBWSxJQUFJLENBQUM7SUFFbkMsdUNBQXVDO0lBQzlCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFFbkMsb0RBQW9EO0lBQzNDLElBQUksR0FBaUMsUUFBUSxDQUFDO0lBRXZELHVDQUF1QztJQUM5QixLQUFLLEdBQVksS0FBSyxDQUFDO0lBRWhDLHVDQUF1QztJQUM5QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBRW5DLGtEQUFrRDtJQUN6QyxZQUFZLEdBQVcsRUFBRSxDQUFDO0lBRW5DLDBEQUEwRDtJQUNqRCxRQUFRLEdBQVcsb0JBQW9CLENBQUM7SUFFakQsdUVBQXVFO0lBQzdELE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRS9DOzs7T0FHRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUM7WUFDN0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQztZQUMvQixLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMscUJBQXFCO1FBQ2pELENBQUM7SUFDSCxDQUFDO3dHQWxEVSxpQkFBaUI7NEZBQWpCLGlCQUFpQix5UkNyQjlCLDB0Q0FpREEsaTFDRGhDWSxZQUFZLGlPQUFFLGFBQWEsa0ZBQUUsV0FBVzs7NEZBSXZDLGlCQUFpQjtrQkFQN0IsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUM7OEJBTzFDLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLyoqXHJcbiAqIFJldXNhYmxlIENoZWNrYm94IENvbXBvbmVudFxyXG4gKiBcclxuICogRmVhdHVyZXM6XHJcbiAqIC0gT3B0aW9uYWwgbGFiZWxcclxuICogLSBDb25maWd1cmFibGUgc2l6ZSwgZXJyb3Igc3RhdGUsIGFuZCBkaXNhYmxlZCBzdGF0ZVxyXG4gKiAtIEVtaXRzIGNoYW5nZXMgdG8gcGFyZW50IGNvbXBvbmVudFxyXG4gKiAtIFN1cHBvcnRzIGN1c3RvbSBpY29uc1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkc28tY2hlY2tib3gnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hlY2tib3guY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoZWNrYm94Q29tcG9uZW50IHtcclxuXHJcbiAgLyoqIFRleHQgbGFiZWwgZGlzcGxheWVkIG5leHQgdG8gdGhlIGNoZWNrYm94ICovXHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBjaGVja2JveCBpcyBjaGVja2VkICovXHJcbiAgQElucHV0KCkgaXNDaGVja2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGRpc2FibGVkICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFNpemUgb2YgdGhlIGNoZWNrYm94OiBzbWFsbCwgbWVkaXVtLCBvciBsYXJnZSAqL1xyXG4gIEBJbnB1dCgpIHNpemU6ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScgPSAnbWVkaXVtJztcclxuXHJcbiAgLyoqIEVycm9yIHN0YXRlIGZvciBzdHlsaW5nIHB1cnBvc2VzICovXHJcbiAgQElucHV0KCkgZXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIHJlcXVpcmVkICovXHJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIGVycm9yIGlzIHRydWUgKi9cclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogSWNvbiBuYW1lIGZvciB0aGUgY2hlY2tib3ggKGRlZmF1bHQgaXMgYSBjaGVja21hcmspICovXHJcbiAgQElucHV0KCkgaWNvbk5hbWU6IHN0cmluZyA9ICdpY29uLXNsYW50ZWQtY2hlY2snO1xyXG5cclxuICAvKiogRW1pdHMgdGhlIHVwZGF0ZWQgY2hlY2tlZCBzdGF0ZSB3aGVuZXZlciB0aGUgY2hlY2tib3ggaXMgdG9nZ2xlZCAqL1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIGNoZWNrYm94XHJcbiAgICogYW5kIGVtaXRzIHRoZSBuZXcgdmFsdWUgdG8gdGhlIHBhcmVudCBjb21wb25lbnRcclxuICAgKi9cclxuICB0b2dnbGVDaGVja2JveCgpIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmlzQ2hlY2tlZCA9ICF0aGlzLmlzQ2hlY2tlZDtcclxuICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLmlzQ2hlY2tlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXBzIHRoZSBjaGVja2JveCBzaXplIHRvIGljb24gc2l6ZVxyXG4gICAqL1xyXG4gIGdldEljb25TaXplKCk6ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScge1xyXG4gICAgc3dpdGNoICh0aGlzLnNpemUpIHtcclxuICAgICAgY2FzZSAnbGFyZ2UnOiByZXR1cm4gJ2xhcmdlJztcclxuICAgICAgY2FzZSAnbWVkaXVtJzogcmV0dXJuICdtZWRpdW0nO1xyXG4gICAgICBjYXNlICdzbWFsbCc6IHJldHVybiAnc21hbGwnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ21lZGl1bSc7IC8vIGZhbGxiYWNrIHRvIG1lZGl1bVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8IS0tXHJcbiAgQ2hlY2tib3ggQ29tcG9uZW50IFRlbXBsYXRlXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBGZWF0dXJlczpcclxuICAtIENsaWNrYWJsZSB3cmFwcGVyIHRvIHRvZ2dsZSBjaGVja2JveCAoZGlzYWJsZWQtc2FmZSlcclxuICAtIEN1c3RvbSBjaGVja2JveCB3aXRoIGljb25cclxuICAtIExhYmVsIHN1cHBvcnRcclxuICAtIEVycm9yIHN0YXRlIHN0eWxpbmdcclxuICAtIFNpemUtYmFzZWQgc3R5bGluZzogc21hbGwsIG1lZGl1bSwgbGFyZ2VcclxuLS0+XHJcblxyXG48ZGl2IFxyXG4gIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiXHJcbiAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiB0b2dnbGVDaGVja2JveCgpXCJcclxuICBbbmdDbGFzc109XCJ7XHJcbiAgICAnc21hbGwnOiBzaXplID09PSAnc21hbGwnLCBcclxuICAgICdtZWRpdW0nOiBzaXplID09PSAnbWVkaXVtJywgXHJcbiAgICAnbGFyZ2UnOiBzaXplID09PSAnbGFyZ2UnLFxyXG4gICAgJ2Rpc2FibGVkJzogZGlzYWJsZWRcclxuICB9XCI+XHJcblxyXG4gIDwhLS0gSGlkZGVuIG5hdGl2ZSBjaGVja2JveCBmb3IgYWNjZXNzaWJpbGl0eSBhbmQgZm9ybSBpbnRlZ3JhdGlvbiAtLT5cclxuICA8aW5wdXRcclxuICAgIGNsYXNzPVwiY2hlY2tib3gtaW5wdXRcIlxyXG4gICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgIFtuZ01vZGVsXT1cImlzQ2hlY2tlZFwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIi8+XHJcblxyXG4gIDwhLS0gQ3VzdG9tIGNoZWNrYm94IFVJIC0tPlxyXG4gIDxzcGFuIFxyXG4gICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIiBcclxuICAgIFtjbGFzcy5jaGVja2VkXT1cImlzQ2hlY2tlZFwiIFxyXG4gICAgW2NsYXNzLmVycm9yXT1cImVycm9yXCI+XHJcbiAgICBcclxuICAgIDwhLS0gRGlzcGxheSBjaGVjayBpY29uIG9ubHkgd2hlbiBjaGVja2VkIC0tPlxyXG4gICAgPGRzby1pY29uIFxyXG4gICAgICAqbmdJZj1cImlzQ2hlY2tlZFwiIFxyXG4gICAgICBbaWNvbk5hbWVdPVwiaWNvbk5hbWVcIiBcclxuICAgICAgW3NpemVdPVwiZ2V0SWNvblNpemUoKVwiPlxyXG4gICAgPC9kc28taWNvbj5cclxuXHJcbiAgPC9zcGFuPiAgICAgXHJcblxyXG4gIDwhLS0gT3B0aW9uYWwgbGFiZWwgLS0+XHJcbiAgPHNwYW4gY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxyXG4gICAge3sgbGFiZWwgfX1cclxuICA8L3NwYW4+XHJcblxyXG48L2Rpdj5cclxuIl19
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { CommonModule, DatePipe } from '@angular/common';
|
|
2
|
+
import { Component, ViewChild, HostListener, Input } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class DatepickerComponent {
|
|
6
|
+
/** Label displayed above the input */
|
|
7
|
+
inputTextLabel = 'Datepicker Title';
|
|
8
|
+
/** Disable the datepicker input */
|
|
9
|
+
isDisabled = false;
|
|
10
|
+
/** Currently selected date */
|
|
11
|
+
selectedDate = null;
|
|
12
|
+
/** Whether the calendar popup is visible */
|
|
13
|
+
calendarVisible = false;
|
|
14
|
+
/** Current month displayed in the calendar */
|
|
15
|
+
currentMonth = new Date();
|
|
16
|
+
/** View mode: day, month, or year */
|
|
17
|
+
viewMode = 'day';
|
|
18
|
+
/** Minimum and maximum year range */
|
|
19
|
+
minYear = 1990;
|
|
20
|
+
maxYear = 2099;
|
|
21
|
+
/** Month names for display */
|
|
22
|
+
months = [
|
|
23
|
+
'January', 'February', 'March', 'April', 'May', 'June',
|
|
24
|
+
'July', 'August', 'September', 'October', 'November', 'December'
|
|
25
|
+
];
|
|
26
|
+
yearListRef;
|
|
27
|
+
calendarWrapper;
|
|
28
|
+
// --------------------------
|
|
29
|
+
// Calendar Visibility & Toggle
|
|
30
|
+
// --------------------------
|
|
31
|
+
/** Toggle the calendar popup */
|
|
32
|
+
toggleCalendar() {
|
|
33
|
+
this.calendarVisible = !this.calendarVisible;
|
|
34
|
+
this.viewMode = 'day';
|
|
35
|
+
}
|
|
36
|
+
/** Close calendar if clicking outside */
|
|
37
|
+
handleClickOutside(event) {
|
|
38
|
+
if (!this.calendarWrapper)
|
|
39
|
+
return;
|
|
40
|
+
const target = event.target;
|
|
41
|
+
if (this.calendarVisible && !this.calendarWrapper.nativeElement.contains(target)) {
|
|
42
|
+
this.calendarVisible = false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// --------------------------
|
|
46
|
+
// View Switching
|
|
47
|
+
// --------------------------
|
|
48
|
+
switchToMonthView() {
|
|
49
|
+
this.viewMode = 'month';
|
|
50
|
+
}
|
|
51
|
+
switchToYearView() {
|
|
52
|
+
this.viewMode = 'year';
|
|
53
|
+
setTimeout(() => this.scrollToCurrentYear(), 50);
|
|
54
|
+
}
|
|
55
|
+
// --------------------------
|
|
56
|
+
// Navigation (Month / Year)
|
|
57
|
+
// --------------------------
|
|
58
|
+
changeMonth(direction) {
|
|
59
|
+
this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() + direction, 1);
|
|
60
|
+
}
|
|
61
|
+
changeYear(direction) {
|
|
62
|
+
const newYear = this.currentMonth.getFullYear() + direction;
|
|
63
|
+
if (newYear >= this.minYear && newYear <= this.maxYear) {
|
|
64
|
+
this.currentMonth = new Date(newYear, this.currentMonth.getMonth(), 1);
|
|
65
|
+
setTimeout(() => this.scrollToCurrentYear(), 0);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// --------------------------
|
|
69
|
+
// Helpers
|
|
70
|
+
// --------------------------
|
|
71
|
+
/** Returns array of days in the current month, with leading nulls for empty grid cells */
|
|
72
|
+
getDaysInMonth() {
|
|
73
|
+
const month = this.currentMonth.getMonth();
|
|
74
|
+
const year = this.currentMonth.getFullYear();
|
|
75
|
+
const firstDay = new Date(year, month, 1).getDay();
|
|
76
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
77
|
+
const daysArray = Array.from({ length: daysInMonth }, (_, i) => i + 1);
|
|
78
|
+
return Array(firstDay).fill(null).concat(daysArray);
|
|
79
|
+
}
|
|
80
|
+
/** Returns array of years in the defined range */
|
|
81
|
+
getYearsRange() {
|
|
82
|
+
const years = [];
|
|
83
|
+
for (let y = this.minYear; y <= this.maxYear; y++)
|
|
84
|
+
years.push(y);
|
|
85
|
+
return years;
|
|
86
|
+
}
|
|
87
|
+
/** Scroll the year list to show the current year */
|
|
88
|
+
scrollToCurrentYear() {
|
|
89
|
+
if (!this.yearListRef)
|
|
90
|
+
return;
|
|
91
|
+
const container = this.yearListRef.nativeElement;
|
|
92
|
+
const currentYear = this.currentMonth.getFullYear();
|
|
93
|
+
const yearIndex = currentYear - this.minYear;
|
|
94
|
+
const columns = 4; // 4 columns grid layout
|
|
95
|
+
const rowIndex = Math.floor(yearIndex / columns);
|
|
96
|
+
const yearCell = container.querySelector('.year-cell');
|
|
97
|
+
if (!yearCell)
|
|
98
|
+
return;
|
|
99
|
+
const scrollTop = rowIndex * yearCell.offsetHeight;
|
|
100
|
+
container.scrollTop = scrollTop;
|
|
101
|
+
}
|
|
102
|
+
// --------------------------
|
|
103
|
+
// Selection Handlers
|
|
104
|
+
// --------------------------
|
|
105
|
+
selectDate(day) {
|
|
106
|
+
if (day === null)
|
|
107
|
+
return;
|
|
108
|
+
this.selectedDate = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth(), day);
|
|
109
|
+
this.calendarVisible = false;
|
|
110
|
+
}
|
|
111
|
+
selectMonth(monthIndex) {
|
|
112
|
+
this.currentMonth = new Date(this.currentMonth.getFullYear(), monthIndex, 1);
|
|
113
|
+
this.viewMode = 'day';
|
|
114
|
+
}
|
|
115
|
+
selectYear(year) {
|
|
116
|
+
this.currentMonth = new Date(year, this.currentMonth.getMonth(), 1);
|
|
117
|
+
this.viewMode = 'month';
|
|
118
|
+
}
|
|
119
|
+
/** Check if a day is currently selected */
|
|
120
|
+
isSelected(day) {
|
|
121
|
+
if (!this.selectedDate || day === null)
|
|
122
|
+
return false;
|
|
123
|
+
return (this.selectedDate.getDate() === day &&
|
|
124
|
+
this.selectedDate.getMonth() === this.currentMonth.getMonth() &&
|
|
125
|
+
this.selectedDate.getFullYear() === this.currentMonth.getFullYear());
|
|
126
|
+
}
|
|
127
|
+
// --------------------------
|
|
128
|
+
// Footer Actions
|
|
129
|
+
// --------------------------
|
|
130
|
+
/** Set today’s date */
|
|
131
|
+
setToday() {
|
|
132
|
+
const today = new Date();
|
|
133
|
+
this.selectedDate = today;
|
|
134
|
+
this.currentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
|
|
135
|
+
this.calendarVisible = false;
|
|
136
|
+
}
|
|
137
|
+
/** Clear the selected date */
|
|
138
|
+
clearDate() {
|
|
139
|
+
this.selectedDate = null;
|
|
140
|
+
}
|
|
141
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
142
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DatepickerComponent, isStandalone: true, selector: "dso-datepicker", inputs: { inputTextLabel: "inputTextLabel", isDisabled: "isDisabled" }, host: { listeners: { "document:click": "handleClickOutside($event)" } }, viewQueries: [{ propertyName: "yearListRef", first: true, predicate: ["yearList"], descendants: true }, { propertyName: "calendarWrapper", first: true, predicate: ["calendarWrapper"], descendants: true }], ngImport: i0, template: "<div class=\"datepicker-wrapper\" #calendarWrapper>\r\n \r\n <!-- Label above the input -->\r\n <div *ngIf=\"inputTextLabel\" class=\"datepicker-label\">{{ inputTextLabel }}</div>\r\n\r\n <!-- Input field (readonly) -->\r\n <input\r\n type=\"text\"\r\n class=\"datepicker-input\"\r\n [value]=\"selectedDate ? (selectedDate | date:'MMM d, y') : ''\"\r\n placeholder=\"Select a date\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n [disabled]=\"isDisabled\"\r\n [class.disabled]=\"isDisabled\"\r\n />\r\n\r\n <!-- Calendar popup -->\r\n <div class=\"calendar\" *ngIf=\"calendarVisible\">\r\n\r\n <!-- Header -->\r\n <div class=\"calendar-header\">\r\n <div class=\"header-row\">\r\n\r\n <!-- Year & Month Navigation Buttons -->\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(-1)\" class=\"nav-btn\">\u00AB</button>\r\n <button *ngIf=\"viewMode === 'day'\" \r\n (click)=\"changeMonth(-1)\" class=\"nav-btn\">\u2039</button>\r\n\r\n <!-- Calendar Title (Month / Year display) -->\r\n <span class=\"calendar-title\">\r\n\r\n <!-- Day view: show Month + Year -->\r\n <ng-container *ngIf=\"viewMode === 'day'\">\r\n <span class=\"month-label\" (click)=\"switchToMonthView()\">\r\n {{ currentMonth | date:'MMMM' }}\r\n </span>\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Month view: show Year -->\r\n <ng-container *ngIf=\"viewMode === 'month'\">\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Year view: show Year only -->\r\n <ng-container *ngIf=\"viewMode === 'year'\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </ng-container>\r\n\r\n </span>\r\n\r\n <!-- Forward navigation buttons -->\r\n <button *ngIf=\"viewMode === 'day'\" (click)=\"changeMonth(1)\" class=\"nav-btn\">\u203A</button>\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(1)\" class=\"nav-btn\">\u00BB</button>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n DAY VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'day'\">\r\n\r\n <!-- Weekday Labels -->\r\n <div class=\"calendar-weekdays\">\r\n <div *ngFor=\"let day of ['S','M','T','W','T','F','S']\">{{ day }}</div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"calendar-grid days-grid\">\r\n <div\r\n *ngFor=\"let day of getDaysInMonth()\"\r\n [class.empty]=\"day === null\"\r\n [class.selected]=\"isSelected(day)\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n MONTH VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'month'\" class=\"calendar-grid months-grid\">\r\n <div *ngFor=\"let m of months; let i = index\" \r\n (click)=\"selectMonth(i)\" \r\n class=\"month-cell\">\r\n {{ m }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n YEAR VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'year'\" \r\n class=\"calendar-grid years-grid scrollable\" \r\n #yearList>\r\n <div\r\n *ngFor=\"let y of getYearsRange()\"\r\n (click)=\"selectYear(y)\"\r\n class=\"year-cell\"\r\n [class.current-year]=\"y === currentMonth.getFullYear()\"\r\n >\r\n {{ y }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n Footer Buttons\r\n ---------------------- -->\r\n <div class=\"calendar-footer\">\r\n <button class=\"footer-btn clear-btn\" (click)=\"clearDate()\">Clear</button>\r\n <button class=\"footer-btn today-btn\" (click)=\"setToday()\">Today</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n", styles: [".datepicker-wrapper{position:relative;display:flex;flex-direction:column;gap:8px}.datepicker-input{padding:10px;font-size:15px;width:190px;border:1px solid #ccc;border-radius:4px;cursor:pointer;background-color:#fff}.datepicker-input:hover{border:1px solid #071d35}.datepicker-input.disabled{background-color:#f5f5f5;border-color:#ccc;cursor:not-allowed}.datepicker-input.disabled .selected-option{pointer-events:none;color:#aaa}.calendar{position:absolute;top:0;left:100px;width:280px;background:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 4px 10px #0000001a;padding:10px;z-index:100;animation:fadeIn .2s ease-in-out}.calendar-header{margin-bottom:8px}.header-row{display:flex;justify-content:center;align-items:center;gap:4px}.nav-btn{background:none;border:none;font-size:16px;cursor:pointer;padding:4px 6px;color:#333;border-radius:4px;transition:background-color .2s}.nav-btn:hover{background-color:#f0f0f0}.calendar-title{font-weight:600;font-size:16px;min-width:90px;text-align:center;display:flex;flex:1;gap:4px;align-items:center;justify-content:center}.month-label,.year-label{cursor:pointer;transition:color .2s}.month-label:hover,.year-label:hover{color:#007bff}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-weight:600;font-size:13px;margin-bottom:4px;color:#666}.calendar-grid{display:grid;gap:4px;text-align:center;min-height:200px}.days-grid{grid-template-columns:repeat(7,1fr)}.months-grid{grid-template-columns:repeat(3,1fr)}.years-grid{grid-template-columns:repeat(4,1fr)}.scrollable{max-height:160px;overflow-y:auto;padding-right:5px}.scrollable::-webkit-scrollbar{width:6px}.scrollable::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:3px}.scrollable::-webkit-scrollbar-thumb:hover{background-color:#999}.calendar-grid div{padding:8px 0;border-radius:4px;cursor:pointer;transition:background-color .2s}.calendar-grid div:hover{background-color:#f0f0f0}.selected{background-color:#007bff;color:#fff!important}.current-year{background-color:#007bff1a;font-weight:700}.empty{visibility:hidden}.calendar-footer{display:flex;justify-content:space-between;margin-top:8px;border-top:1px solid #eee;padding-top:8px}.footer-btn{flex:1;padding:6px 0;font-size:14px;border-radius:4px;cursor:pointer;transition:background .2s;border:none}.clear-btn{background-color:#f8f9fa;color:#333;margin-right:5px}.clear-btn:hover{background-color:#e9ecef}.today-btn{background-color:#007bff;color:#fff}.today-btn:hover{background-color:#0069d9}@keyframes fadeIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
143
|
+
}
|
|
144
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, decorators: [{
|
|
145
|
+
type: Component,
|
|
146
|
+
args: [{ selector: 'dso-datepicker', standalone: true, imports: [CommonModule, DatePipe], template: "<div class=\"datepicker-wrapper\" #calendarWrapper>\r\n \r\n <!-- Label above the input -->\r\n <div *ngIf=\"inputTextLabel\" class=\"datepicker-label\">{{ inputTextLabel }}</div>\r\n\r\n <!-- Input field (readonly) -->\r\n <input\r\n type=\"text\"\r\n class=\"datepicker-input\"\r\n [value]=\"selectedDate ? (selectedDate | date:'MMM d, y') : ''\"\r\n placeholder=\"Select a date\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n [disabled]=\"isDisabled\"\r\n [class.disabled]=\"isDisabled\"\r\n />\r\n\r\n <!-- Calendar popup -->\r\n <div class=\"calendar\" *ngIf=\"calendarVisible\">\r\n\r\n <!-- Header -->\r\n <div class=\"calendar-header\">\r\n <div class=\"header-row\">\r\n\r\n <!-- Year & Month Navigation Buttons -->\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(-1)\" class=\"nav-btn\">\u00AB</button>\r\n <button *ngIf=\"viewMode === 'day'\" \r\n (click)=\"changeMonth(-1)\" class=\"nav-btn\">\u2039</button>\r\n\r\n <!-- Calendar Title (Month / Year display) -->\r\n <span class=\"calendar-title\">\r\n\r\n <!-- Day view: show Month + Year -->\r\n <ng-container *ngIf=\"viewMode === 'day'\">\r\n <span class=\"month-label\" (click)=\"switchToMonthView()\">\r\n {{ currentMonth | date:'MMMM' }}\r\n </span>\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Month view: show Year -->\r\n <ng-container *ngIf=\"viewMode === 'month'\">\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Year view: show Year only -->\r\n <ng-container *ngIf=\"viewMode === 'year'\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </ng-container>\r\n\r\n </span>\r\n\r\n <!-- Forward navigation buttons -->\r\n <button *ngIf=\"viewMode === 'day'\" (click)=\"changeMonth(1)\" class=\"nav-btn\">\u203A</button>\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(1)\" class=\"nav-btn\">\u00BB</button>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n DAY VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'day'\">\r\n\r\n <!-- Weekday Labels -->\r\n <div class=\"calendar-weekdays\">\r\n <div *ngFor=\"let day of ['S','M','T','W','T','F','S']\">{{ day }}</div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"calendar-grid days-grid\">\r\n <div\r\n *ngFor=\"let day of getDaysInMonth()\"\r\n [class.empty]=\"day === null\"\r\n [class.selected]=\"isSelected(day)\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n MONTH VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'month'\" class=\"calendar-grid months-grid\">\r\n <div *ngFor=\"let m of months; let i = index\" \r\n (click)=\"selectMonth(i)\" \r\n class=\"month-cell\">\r\n {{ m }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n YEAR VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'year'\" \r\n class=\"calendar-grid years-grid scrollable\" \r\n #yearList>\r\n <div\r\n *ngFor=\"let y of getYearsRange()\"\r\n (click)=\"selectYear(y)\"\r\n class=\"year-cell\"\r\n [class.current-year]=\"y === currentMonth.getFullYear()\"\r\n >\r\n {{ y }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n Footer Buttons\r\n ---------------------- -->\r\n <div class=\"calendar-footer\">\r\n <button class=\"footer-btn clear-btn\" (click)=\"clearDate()\">Clear</button>\r\n <button class=\"footer-btn today-btn\" (click)=\"setToday()\">Today</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n", styles: [".datepicker-wrapper{position:relative;display:flex;flex-direction:column;gap:8px}.datepicker-input{padding:10px;font-size:15px;width:190px;border:1px solid #ccc;border-radius:4px;cursor:pointer;background-color:#fff}.datepicker-input:hover{border:1px solid #071d35}.datepicker-input.disabled{background-color:#f5f5f5;border-color:#ccc;cursor:not-allowed}.datepicker-input.disabled .selected-option{pointer-events:none;color:#aaa}.calendar{position:absolute;top:0;left:100px;width:280px;background:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 4px 10px #0000001a;padding:10px;z-index:100;animation:fadeIn .2s ease-in-out}.calendar-header{margin-bottom:8px}.header-row{display:flex;justify-content:center;align-items:center;gap:4px}.nav-btn{background:none;border:none;font-size:16px;cursor:pointer;padding:4px 6px;color:#333;border-radius:4px;transition:background-color .2s}.nav-btn:hover{background-color:#f0f0f0}.calendar-title{font-weight:600;font-size:16px;min-width:90px;text-align:center;display:flex;flex:1;gap:4px;align-items:center;justify-content:center}.month-label,.year-label{cursor:pointer;transition:color .2s}.month-label:hover,.year-label:hover{color:#007bff}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-weight:600;font-size:13px;margin-bottom:4px;color:#666}.calendar-grid{display:grid;gap:4px;text-align:center;min-height:200px}.days-grid{grid-template-columns:repeat(7,1fr)}.months-grid{grid-template-columns:repeat(3,1fr)}.years-grid{grid-template-columns:repeat(4,1fr)}.scrollable{max-height:160px;overflow-y:auto;padding-right:5px}.scrollable::-webkit-scrollbar{width:6px}.scrollable::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:3px}.scrollable::-webkit-scrollbar-thumb:hover{background-color:#999}.calendar-grid div{padding:8px 0;border-radius:4px;cursor:pointer;transition:background-color .2s}.calendar-grid div:hover{background-color:#f0f0f0}.selected{background-color:#007bff;color:#fff!important}.current-year{background-color:#007bff1a;font-weight:700}.empty{visibility:hidden}.calendar-footer{display:flex;justify-content:space-between;margin-top:8px;border-top:1px solid #eee;padding-top:8px}.footer-btn{flex:1;padding:6px 0;font-size:14px;border-radius:4px;cursor:pointer;transition:background .2s;border:none}.clear-btn{background-color:#f8f9fa;color:#333;margin-right:5px}.clear-btn:hover{background-color:#e9ecef}.today-btn{background-color:#007bff;color:#fff}.today-btn:hover{background-color:#0069d9}@keyframes fadeIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"] }]
|
|
147
|
+
}], propDecorators: { inputTextLabel: [{
|
|
148
|
+
type: Input
|
|
149
|
+
}], isDisabled: [{
|
|
150
|
+
type: Input
|
|
151
|
+
}], yearListRef: [{
|
|
152
|
+
type: ViewChild,
|
|
153
|
+
args: ['yearList']
|
|
154
|
+
}], calendarWrapper: [{
|
|
155
|
+
type: ViewChild,
|
|
156
|
+
args: ['calendarWrapper', { static: false }]
|
|
157
|
+
}], handleClickOutside: [{
|
|
158
|
+
type: HostListener,
|
|
159
|
+
args: ['document:click', ['$event']]
|
|
160
|
+
}] } });
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQWMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVN0RixNQUFNLE9BQU8sbUJBQW1CO0lBRTlCLHNDQUFzQztJQUM3QixjQUFjLEdBQVcsa0JBQWtCLENBQUM7SUFFckQsbUNBQW1DO0lBQzFCLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFFckMsOEJBQThCO0lBQzlCLFlBQVksR0FBZ0IsSUFBSSxDQUFDO0lBRWpDLDRDQUE0QztJQUM1QyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLDhDQUE4QztJQUM5QyxZQUFZLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUVoQyxxQ0FBcUM7SUFDckMsUUFBUSxHQUE2QixLQUFLLENBQUM7SUFFM0MscUNBQXFDO0lBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDZixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRWYsOEJBQThCO0lBQzlCLE1BQU0sR0FBRztRQUNQLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTTtRQUN0RCxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7S0FDakUsQ0FBQztJQUVxQixXQUFXLENBQThCO0lBQ2YsZUFBZSxDQUE4QjtJQUU5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QUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixTQUFTO1FBQ1AsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQzt3R0ExS1UsbUJBQW1COzRGQUFuQixtQkFBbUIseWFDVmhDLHF2SUE2SEEsZ21GRHJIWSxZQUFZOzs0RkFFWCxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUdQLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQzs4QkFLeEIsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQXdCaUIsV0FBVztzQkFBakMsU0FBUzt1QkFBQyxVQUFVO2dCQUM0QixlQUFlO3NCQUEvRCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFjL0Msa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Rzby1kYXRlcGlja2VyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGF0ZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IHtcclxuXHJcbiAgLyoqIExhYmVsIGRpc3BsYXllZCBhYm92ZSB0aGUgaW5wdXQgKi9cclxuICBASW5wdXQoKSBpbnB1dFRleHRMYWJlbDogc3RyaW5nID0gJ0RhdGVwaWNrZXIgVGl0bGUnO1xyXG5cclxuICAvKiogRGlzYWJsZSB0aGUgZGF0ZXBpY2tlciBpbnB1dCAqL1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBkYXRlICovXHJcbiAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBwb3B1cCBpcyB2aXNpYmxlICovXHJcbiAgY2FsZW5kYXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBDdXJyZW50IG1vbnRoIGRpc3BsYXllZCBpbiB0aGUgY2FsZW5kYXIgKi9cclxuICBjdXJyZW50TW9udGg6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAvKiogVmlldyBtb2RlOiBkYXksIG1vbnRoLCBvciB5ZWFyICovXHJcbiAgdmlld01vZGU6ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyA9ICdkYXknO1xyXG5cclxuICAvKiogTWluaW11bSBhbmQgbWF4aW11bSB5ZWFyIHJhbmdlICovXHJcbiAgbWluWWVhciA9IDE5OTA7XHJcbiAgbWF4WWVhciA9IDIwOTk7XHJcblxyXG4gIC8qKiBNb250aCBuYW1lcyBmb3IgZGlzcGxheSAqL1xyXG4gIG1vbnRocyA9IFtcclxuICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJyxcclxuICAgICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlcidcclxuICBdO1xyXG5cclxuICBAVmlld0NoaWxkKCd5ZWFyTGlzdCcpIHllYXJMaXN0UmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXJXcmFwcGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNhbGVuZGFyV3JhcHBlciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIENhbGVuZGFyIFZpc2liaWxpdHkgJiBUb2dnbGVcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogVG9nZ2xlIHRoZSBjYWxlbmRhciBwb3B1cCAqL1xyXG4gIHRvZ2dsZUNhbGVuZGFyKCkge1xyXG4gICAgdGhpcy5jYWxlbmRhclZpc2libGUgPSAhdGhpcy5jYWxlbmRhclZpc2libGU7XHJcbiAgICB0aGlzLnZpZXdNb2RlID0gJ2RheSc7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xvc2UgY2FsZW5kYXIgaWYgY2xpY2tpbmcgb3V0c2lkZSAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVDbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXJXcmFwcGVyKSByZXR1cm47XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhclZpc2libGUgJiYgIXRoaXMuY2FsZW5kYXJXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBWaWV3IFN3aXRjaGluZ1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHN3aXRjaFRvTW9udGhWaWV3KCkge1xyXG4gICAgdGhpcy52aWV3TW9kZSA9ICdtb250aCc7XHJcbiAgfVxyXG5cclxuICBzd2l0Y2hUb1llYXJWaWV3KCkge1xyXG4gICAgdGhpcy52aWV3TW9kZSA9ICd5ZWFyJztcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0N1cnJlbnRZZWFyKCksIDUwKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gTmF2aWdhdGlvbiAoTW9udGggLyBZZWFyKVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGNoYW5nZU1vbnRoKGRpcmVjdGlvbjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ldyBEYXRlKFxyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpLFxyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpICsgZGlyZWN0aW9uLFxyXG4gICAgICAxXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlWWVhcihkaXJlY3Rpb246IG51bWJlcikge1xyXG4gICAgY29uc3QgbmV3WWVhciA9IHRoaXMuY3VycmVudE1vbnRoLmdldEZ1bGxZZWFyKCkgKyBkaXJlY3Rpb247XHJcbiAgICBpZiAobmV3WWVhciA+PSB0aGlzLm1pblllYXIgJiYgbmV3WWVhciA8PSB0aGlzLm1heFllYXIpIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZShuZXdZZWFyLCB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpLCAxKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvQ3VycmVudFllYXIoKSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEhlbHBlcnNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogUmV0dXJucyBhcnJheSBvZiBkYXlzIGluIHRoZSBjdXJyZW50IG1vbnRoLCB3aXRoIGxlYWRpbmcgbnVsbHMgZm9yIGVtcHR5IGdyaWQgY2VsbHMgKi9cclxuICBnZXREYXlzSW5Nb250aCgpOiAobnVtYmVyIHwgbnVsbClbXSB7XHJcbiAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudE1vbnRoLmdldE1vbnRoKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpO1xyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcclxuXHJcbiAgICBjb25zdCBkYXlzQXJyYXkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBkYXlzSW5Nb250aCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gICAgcmV0dXJuIEFycmF5KGZpcnN0RGF5KS5maWxsKG51bGwpLmNvbmNhdChkYXlzQXJyYXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgYXJyYXkgb2YgeWVhcnMgaW4gdGhlIGRlZmluZWQgcmFuZ2UgKi9cclxuICBnZXRZZWFyc1JhbmdlKCk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IHllYXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgeSA9IHRoaXMubWluWWVhcjsgeSA8PSB0aGlzLm1heFllYXI7IHkrKykgeWVhcnMucHVzaCh5KTtcclxuICAgIHJldHVybiB5ZWFycztcclxuICB9XHJcblxyXG4gIC8qKiBTY3JvbGwgdGhlIHllYXIgbGlzdCB0byBzaG93IHRoZSBjdXJyZW50IHllYXIgKi9cclxuICBzY3JvbGxUb0N1cnJlbnRZZWFyKCkge1xyXG4gICAgaWYgKCF0aGlzLnllYXJMaXN0UmVmKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy55ZWFyTGlzdFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgeWVhckluZGV4ID0gY3VycmVudFllYXIgLSB0aGlzLm1pblllYXI7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gNDsgLy8gNCBjb2x1bW5zIGdyaWQgbGF5b3V0XHJcbiAgICBjb25zdCByb3dJbmRleCA9IE1hdGguZmxvb3IoeWVhckluZGV4IC8gY29sdW1ucyk7XHJcblxyXG4gICAgY29uc3QgeWVhckNlbGwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnllYXItY2VsbCcpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCF5ZWFyQ2VsbCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHJvd0luZGV4ICogeWVhckNlbGwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gU2VsZWN0aW9uIEhhbmRsZXJzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgc2VsZWN0RGF0ZShkYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkYXkgPT09IG51bGwpIHJldHVybjtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKSwgdGhpcy5jdXJyZW50TW9udGguZ2V0TW9udGgoKSwgZGF5KTtcclxuICAgIHRoaXMuY2FsZW5kYXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gbmV3IERhdGUodGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKSwgbW9udGhJbmRleCwgMSk7XHJcbiAgICB0aGlzLnZpZXdNb2RlID0gJ2RheSc7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlcikge1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZSh5ZWFyLCB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpLCAxKTtcclxuICAgIHRoaXMudmlld01vZGUgPSAnbW9udGgnO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoZWNrIGlmIGEgZGF5IGlzIGN1cnJlbnRseSBzZWxlY3RlZCAqL1xyXG4gIGlzU2VsZWN0ZWQoZGF5OiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlIHx8IGRheSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUuZ2V0RGF0ZSgpID09PSBkYXkgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy5jdXJyZW50TW9udGguZ2V0TW9udGgoKSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBGb290ZXIgQWN0aW9uc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBTZXQgdG9kYXnigJlzIGRhdGUgKi9cclxuICBzZXRUb2RheSgpIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gdG9kYXk7XHJcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpO1xyXG4gICAgdGhpcy5jYWxlbmRhclZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciB0aGUgc2VsZWN0ZWQgZGF0ZSAqL1xyXG4gIGNsZWFyRGF0ZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItd3JhcHBlclwiICNjYWxlbmRhcldyYXBwZXI+XHJcbiAgXHJcbiAgPCEtLSBMYWJlbCBhYm92ZSB0aGUgaW5wdXQgLS0+XHJcbiAgPGRpdiAqbmdJZj1cImlucHV0VGV4dExhYmVsXCIgY2xhc3M9XCJkYXRlcGlja2VyLWxhYmVsXCI+e3sgaW5wdXRUZXh0TGFiZWwgfX08L2Rpdj5cclxuXHJcbiAgPCEtLSBJbnB1dCBmaWVsZCAocmVhZG9ubHkpIC0tPlxyXG4gIDxpbnB1dFxyXG4gICAgdHlwZT1cInRleHRcIlxyXG4gICAgY2xhc3M9XCJkYXRlcGlja2VyLWlucHV0XCJcclxuICAgIFt2YWx1ZV09XCJzZWxlY3RlZERhdGUgPyAoc2VsZWN0ZWREYXRlIHwgZGF0ZTonTU1NIGQsIHknKSA6ICcnXCJcclxuICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGEgZGF0ZVwiXHJcbiAgICByZWFkb25seVxyXG4gICAgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKClcIlxyXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gIC8+XHJcblxyXG4gIDwhLS0gQ2FsZW5kYXIgcG9wdXAgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCIgKm5nSWY9XCJjYWxlbmRhclZpc2libGVcIj5cclxuXHJcbiAgICA8IS0tIEhlYWRlciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yb3dcIj5cclxuXHJcbiAgICAgICAgPCEtLSBZZWFyICYgTW9udGggTmF2aWdhdGlvbiBCdXR0b25zIC0tPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ2RheScgfHwgdmlld01vZGUgPT09ICdtb250aCdcIiBcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VZZWFyKC0xKVwiIGNsYXNzPVwibmF2LWJ0blwiPsKrPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpZXdNb2RlID09PSAnZGF5J1wiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vbnRoKC0xKVwiIGNsYXNzPVwibmF2LWJ0blwiPuKAuTwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8IS0tIENhbGVuZGFyIFRpdGxlIChNb250aCAvIFllYXIgZGlzcGxheSkgLS0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxlbmRhci10aXRsZVwiPlxyXG5cclxuICAgICAgICAgIDwhLS0gRGF5IHZpZXc6IHNob3cgTW9udGggKyBZZWFyIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdNb2RlID09PSAnZGF5J1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vbnRoLWxhYmVsXCIgKGNsaWNrKT1cInN3aXRjaFRvTW9udGhWaWV3KClcIj5cclxuICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGggfCBkYXRlOidNTU1NJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwieWVhci1sYWJlbFwiIChjbGljayk9XCJzd2l0Y2hUb1llYXJWaWV3KClcIj5cclxuICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGggfCBkYXRlOid5eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vbnRoIHZpZXc6IHNob3cgWWVhciAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ21vbnRoJ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInllYXItbGFiZWxcIiAoY2xpY2spPVwic3dpdGNoVG9ZZWFyVmlldygpXCI+XHJcbiAgICAgICAgICAgICAge3sgY3VycmVudE1vbnRoIHwgZGF0ZToneXl5eScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPCEtLSBZZWFyIHZpZXc6IHNob3cgWWVhciBvbmx5IC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdNb2RlID09PSAneWVhcidcIj5cclxuICAgICAgICAgICAge3sgY3VycmVudE1vbnRoIHwgZGF0ZToneXl5eScgfX1cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDwhLS0gRm9yd2FyZCBuYXZpZ2F0aW9uIGJ1dHRvbnMgLS0+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpZXdNb2RlID09PSAnZGF5J1wiIChjbGljayk9XCJjaGFuZ2VNb250aCgxKVwiIGNsYXNzPVwibmF2LWJ0blwiPuKAujwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ2RheScgfHwgdmlld01vZGUgPT09ICdtb250aCdcIiBcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VZZWFyKDEpXCIgY2xhc3M9XCJuYXYtYnRuXCI+wrs8L2J1dHRvbj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgIERBWSBWSUVXXHJcbiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidmlld01vZGUgPT09ICdkYXknXCI+XHJcblxyXG4gICAgICA8IS0tIFdlZWtkYXkgTGFiZWxzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItd2Vla2RheXNcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkYXkgb2YgWydTJywnTScsJ1QnLCdXJywnVCcsJ0YnLCdTJ11cIj57eyBkYXkgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIERheXMgR3JpZCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWdyaWQgZGF5cy1ncmlkXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBnZXREYXlzSW5Nb250aCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5lbXB0eV09XCJkYXkgPT09IG51bGxcIlxyXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoZGF5KVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBkYXkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgTU9OVEggVklFV1xyXG4gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInZpZXdNb2RlID09PSAnbW9udGgnXCIgY2xhc3M9XCJjYWxlbmRhci1ncmlkIG1vbnRocy1ncmlkXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG0gb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgXHJcbiAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKGkpXCIgXHJcbiAgICAgICAgICAgY2xhc3M9XCJtb250aC1jZWxsXCI+XHJcbiAgICAgICAge3sgbSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICBZRUFSIFZJRVdcclxuICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ3llYXInXCIgXHJcbiAgICAgICAgIGNsYXNzPVwiY2FsZW5kYXItZ3JpZCB5ZWFycy1ncmlkIHNjcm9sbGFibGVcIiBcclxuICAgICAgICAgI3llYXJMaXN0PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHkgb2YgZ2V0WWVhcnNSYW5nZSgpXCJcclxuICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5KVwiXHJcbiAgICAgICAgY2xhc3M9XCJ5ZWFyLWNlbGxcIlxyXG4gICAgICAgIFtjbGFzcy5jdXJyZW50LXllYXJdPVwieSA9PT0gY3VycmVudE1vbnRoLmdldEZ1bGxZZWFyKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgeSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICBGb290ZXIgQnV0dG9uc1xyXG4gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWZvb3RlclwiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZm9vdGVyLWJ0biBjbGVhci1idG5cIiAoY2xpY2spPVwiY2xlYXJEYXRlKClcIj5DbGVhcjwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZm9vdGVyLWJ0biB0b2RheS1idG5cIiAoY2xpY2spPVwic2V0VG9kYXkoKVwiPlRvZGF5PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class DialogComponent {
|
|
6
|
+
visible = false;
|
|
7
|
+
title = 'Dialog Title';
|
|
8
|
+
close = new EventEmitter();
|
|
9
|
+
onClose() {
|
|
10
|
+
this.close.emit();
|
|
11
|
+
}
|
|
12
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
13
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DialogComponent, isStandalone: true, selector: "dso-dialog", inputs: { visible: "visible", title: "title" }, outputs: { close: "close" }, ngImport: i0, template: "<div class=\"dialog-overlay\" *ngIf=\"visible\" (click)=\"onClose()\">\r\n <div class=\"dialog\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dialog-header\">{{ title }}</div>\r\n <div class=\"dialog-body\">\r\n <ng-content></ng-content> <!-- Projected content -->\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dialog-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.dialog{background:#fff;padding:24px;border-radius:8px;width:400px;max-width:90%;box-shadow:0 2px 8px #00000040;position:relative;display:flex;flex-direction:column;gap:12px}.dialog-header{font-size:20px;font-weight:700}.dialog-close{background:none;border:none;font-size:1.5rem;line-height:1;cursor:pointer}.dialog-body{display:flex;flex-direction:column;gap:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DialogComponent, decorators: [{
|
|
16
|
+
type: Component,
|
|
17
|
+
args: [{ selector: 'dso-dialog', standalone: true, imports: [CommonModule], template: "<div class=\"dialog-overlay\" *ngIf=\"visible\" (click)=\"onClose()\">\r\n <div class=\"dialog\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dialog-header\">{{ title }}</div>\r\n <div class=\"dialog-body\">\r\n <ng-content></ng-content> <!-- Projected content -->\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dialog-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.dialog{background:#fff;padding:24px;border-radius:8px;width:400px;max-width:90%;box-shadow:0 2px 8px #00000040;position:relative;display:flex;flex-direction:column;gap:12px}.dialog-header{font-size:20px;font-weight:700}.dialog-close{background:none;border:none;font-size:1.5rem;line-height:1;cursor:pointer}.dialog-body{display:flex;flex-direction:column;gap:16px}\n"] }]
|
|
18
|
+
}], propDecorators: { visible: [{
|
|
19
|
+
type: Input
|
|
20
|
+
}], title: [{
|
|
21
|
+
type: Input
|
|
22
|
+
}], close: [{
|
|
23
|
+
type: Output
|
|
24
|
+
}] } });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVN2RSxNQUFNLE9BQU8sZUFBZTtJQUNqQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssR0FBVyxjQUFjLENBQUM7SUFFOUIsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFM0MsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQzt3R0FSVSxlQUFlOzRGQUFmLGVBQWUsbUpDVjVCLHdVQVFBLHdrQkRBYSxZQUFZOzs0RkFFWixlQUFlO2tCQVAzQixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLFdBR1AsQ0FBRSxZQUFZLENBQUU7OEJBR2hCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZHNvLWRpYWxvZycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcclxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0RpYWxvZyBUaXRsZSc7XHJcblxyXG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGlhbG9nLW92ZXJsYXlcIiAqbmdJZj1cInZpc2libGVcIiAoY2xpY2spPVwib25DbG9zZSgpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRpYWxvZ1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctaGVhZGVyXCI+e3sgdGl0bGUgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm9keVwiPlxyXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IDwhLS0gUHJvamVjdGVkIGNvbnRlbnQgLS0+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|