@masterteam/components 0.0.89 → 0.0.90

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.
@@ -0,0 +1,427 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, Component, inject, ElementRef, NgZone, output, signal, Directive, model } from '@angular/core';
3
+ import { Avatar } from '@masterteam/components/avatar';
4
+ import { Button } from '@masterteam/components/button';
5
+ import { SecureImagePipe } from '@masterteam/components/upload-field';
6
+ import { Progress } from '@masterteam/components/progress';
7
+ import { CdkDrag, CdkDropList, CdkDragPlaceholder } from '@angular/cdk/drag-drop';
8
+ import { DOCUMENT } from '@angular/common';
9
+
10
+ class EntityText {
11
+ /** Full entity data object */
12
+ data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
13
+ /** Individual inputs (used when data is not provided) */
14
+ name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
15
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
16
+ displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : []));
17
+ displayValue = computed(() => {
18
+ const d = this.data();
19
+ if (d) {
20
+ return typeof d.value === 'string' ? d.value : '';
21
+ }
22
+ return this.value() ?? '';
23
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
24
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityText, deps: [], target: i0.ɵɵFactoryTarget.Component });
25
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.3", type: EntityText, isStandalone: true, selector: "mt-entity-text", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n" });
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityText, decorators: [{
28
+ type: Component,
29
+ args: [{ selector: 'mt-entity-text', standalone: true, template: "<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n" }]
30
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
31
+
32
+ class EntityDate {
33
+ /** Full entity data object */
34
+ data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
35
+ /** Individual inputs (used when data is not provided) */
36
+ name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
37
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
38
+ displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : []));
39
+ displayValue = computed(() => {
40
+ const d = this.data();
41
+ if (d) {
42
+ return typeof d.value === 'string' ? d.value : '';
43
+ }
44
+ return this.value() ?? '';
45
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityDate, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.3", type: EntityDate, isStandalone: true, selector: "mt-entity-date", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n" });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityDate, decorators: [{
50
+ type: Component,
51
+ args: [{ selector: 'mt-entity-date', standalone: true, template: "<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n" }]
52
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
53
+
54
+ class EntityStatus {
55
+ /** Full entity data object */
56
+ data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
57
+ /** Individual inputs (used when data is not provided) */
58
+ name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
59
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
60
+ displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : []));
61
+ statusValue = computed(() => {
62
+ const d = this.data();
63
+ if (d && typeof d.value === 'object' && d.value !== null) {
64
+ return d.value;
65
+ }
66
+ return this.value() ?? null;
67
+ }, ...(ngDevMode ? [{ debugName: "statusValue" }] : []));
68
+ badgeStyle = computed(() => {
69
+ const status = this.statusValue();
70
+ if (!status?.color)
71
+ return {};
72
+ return {
73
+ color: status.color,
74
+ backgroundColor: this.hexToRgba(status.color, 0.12),
75
+ };
76
+ }, ...(ngDevMode ? [{ debugName: "badgeStyle" }] : []));
77
+ hexToRgba(hex, alpha) {
78
+ const r = parseInt(hex.slice(1, 3), 16);
79
+ const g = parseInt(hex.slice(3, 5), 16);
80
+ const b = parseInt(hex.slice(5, 7), 16);
81
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
82
+ }
83
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityStatus, deps: [], target: i0.ɵɵFactoryTarget.Component });
84
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityStatus, isStandalone: true, selector: "mt-entity-status", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex flex-col gap-1\">\r\n @if (statusValue(); as status) {\r\n <span\r\n class=\"inline-flex items-center px-3 py-2 rounded-md text-xs font-semibold w-fit\"\r\n [style]=\"badgeStyle()\"\r\n >\r\n {{ status.display }}\r\n </span>\r\n }\r\n <!-- <span class=\"text-xs text-gray-500\">{{ displayName() }}</span> -->\r\n</div>\r\n" });
85
+ }
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityStatus, decorators: [{
87
+ type: Component,
88
+ args: [{ selector: 'mt-entity-status', standalone: true, template: "<div class=\"flex flex-col gap-1\">\r\n @if (statusValue(); as status) {\r\n <span\r\n class=\"inline-flex items-center px-3 py-2 rounded-md text-xs font-semibold w-fit\"\r\n [style]=\"badgeStyle()\"\r\n >\r\n {{ status.display }}\r\n </span>\r\n }\r\n <!-- <span class=\"text-xs text-gray-500\">{{ displayName() }}</span> -->\r\n</div>\r\n" }]
89
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
90
+
91
+ class EntityUser {
92
+ /** Full entity data object */
93
+ data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
94
+ /** Individual inputs (used when data is not provided) */
95
+ displayName = input(...(ngDevMode ? [undefined, { debugName: "displayName" }] : []));
96
+ photoUrl = input(...(ngDevMode ? [undefined, { debugName: "photoUrl" }] : []));
97
+ userName = computed(() => this.data()?.displayName ?? this.displayName() ?? '', ...(ngDevMode ? [{ debugName: "userName" }] : []));
98
+ userPhoto = computed(() => this.data()?.photoUrl ?? this.photoUrl() ?? '', ...(ngDevMode ? [{ debugName: "userPhoto" }] : []));
99
+ labelText = computed(() => '', ...(ngDevMode ? [{ debugName: "labelText" }] : []));
100
+ initials = computed(() => {
101
+ const name = this.userName();
102
+ if (!name)
103
+ return '';
104
+ const parts = name.trim().split(/\s+/);
105
+ if (parts.length >= 2) {
106
+ return (parts[0][0] + parts[1][0]).toUpperCase();
107
+ }
108
+ return name.substring(0, 2).toUpperCase();
109
+ }, ...(ngDevMode ? [{ debugName: "initials" }] : []));
110
+ // ── Configuration-driven visibility ──
111
+ config = computed(() => this.data()?.configuration ?? {}, ...(ngDevMode ? [{ debugName: "config" }] : []));
112
+ showDisplayName = computed(() => this.config().showDisplayName ?? true, ...(ngDevMode ? [{ debugName: "showDisplayName" }] : []));
113
+ showPhoneNumber = computed(() => this.config().showPhoneNumber ?? false, ...(ngDevMode ? [{ debugName: "showPhoneNumber" }] : []));
114
+ showEmail = computed(() => this.config().showEmail ?? false, ...(ngDevMode ? [{ debugName: "showEmail" }] : []));
115
+ phoneNumber = computed(() => this.data()?.phoneNumber ?? '', ...(ngDevMode ? [{ debugName: "phoneNumber" }] : []));
116
+ email = computed(() => this.data()?.email ?? '', ...(ngDevMode ? [{ debugName: "email" }] : []));
117
+ hasContactInfo = computed(() => (this.showPhoneNumber() && !!this.phoneNumber()) ||
118
+ (this.showEmail() && !!this.email()), ...(ngDevMode ? [{ debugName: "hasContactInfo" }] : []));
119
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityUser, deps: [], target: i0.ɵɵFactoryTarget.Component });
120
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityUser, isStandalone: true, selector: "mt-entity-user", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, displayName: { classPropertyName: "displayName", publicName: "displayName", isSignal: true, isRequired: false, transformFunction: null }, photoUrl: { classPropertyName: "photoUrl", publicName: "photoUrl", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex items-center gap-2\">\r\n <mt-avatar\r\n [image]=\"\r\n userPhoto()\r\n ? (userPhoto() | secureImage: true : undefined : 'avatar/')\r\n : ''\r\n \"\r\n [label]=\"initials()\"\r\n styleClass=\"w-11! h-11! text-lg! text-white! bg-primary-500!\"\r\n ></mt-avatar>\r\n\r\n @if (showDisplayName()) {\r\n <div class=\"flex flex-col min-w-0 flex-1\">\r\n <span class=\"text-sm font-semibold truncate\">{{ userName() }}</span>\r\n @if (labelText()) {\r\n <span class=\"text-xs text-gray-500 truncate\">{{ labelText() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasContactInfo()) {\r\n <div class=\"flex items-center gap-1 ms-auto shrink-0\">\r\n @if (showPhoneNumber() && phoneNumber()) {\r\n <a [href]=\"'tel:' + phoneNumber()\" [title]=\"phoneNumber()\">\r\n <mt-button\r\n icon=\"communication.phone\"\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [tooltip]=\"phoneNumber()\"\r\n />\r\n </a>\r\n }\r\n @if (showEmail() && email()) {\r\n <a [href]=\"'mailto:' + email()\" [title]=\"email()\">\r\n <mt-button\r\n icon=\"communication.mail-01\"\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [tooltip]=\"email()\"\r\n />\r\n </a>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: SecureImagePipe, name: "secureImage" }] });
121
+ }
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityUser, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'mt-entity-user', standalone: true, imports: [Avatar, Button, SecureImagePipe], template: "<div class=\"flex items-center gap-2\">\r\n <mt-avatar\r\n [image]=\"\r\n userPhoto()\r\n ? (userPhoto() | secureImage: true : undefined : 'avatar/')\r\n : ''\r\n \"\r\n [label]=\"initials()\"\r\n styleClass=\"w-11! h-11! text-lg! text-white! bg-primary-500!\"\r\n ></mt-avatar>\r\n\r\n @if (showDisplayName()) {\r\n <div class=\"flex flex-col min-w-0 flex-1\">\r\n <span class=\"text-sm font-semibold truncate\">{{ userName() }}</span>\r\n @if (labelText()) {\r\n <span class=\"text-xs text-gray-500 truncate\">{{ labelText() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasContactInfo()) {\r\n <div class=\"flex items-center gap-1 ms-auto shrink-0\">\r\n @if (showPhoneNumber() && phoneNumber()) {\r\n <a [href]=\"'tel:' + phoneNumber()\" [title]=\"phoneNumber()\">\r\n <mt-button\r\n icon=\"communication.phone\"\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [tooltip]=\"phoneNumber()\"\r\n />\r\n </a>\r\n }\r\n @if (showEmail() && email()) {\r\n <a [href]=\"'mailto:' + email()\" [title]=\"email()\">\r\n <mt-button\r\n icon=\"communication.mail-01\"\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [tooltip]=\"email()\"\r\n />\r\n </a>\r\n }\r\n </div>\r\n }\r\n</div>\r\n" }]
125
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], displayName: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayName", required: false }] }], photoUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "photoUrl", required: false }] }] } });
126
+
127
+ class EntityPercentage {
128
+ /** Full entity data object */
129
+ data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
130
+ /** Individual inputs (used when data is not provided) */
131
+ name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
132
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
133
+ rawValue = input(...(ngDevMode ? [undefined, { debugName: "rawValue" }] : []));
134
+ displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : []));
135
+ displayValue = computed(() => {
136
+ const d = this.data();
137
+ if (d) {
138
+ return typeof d.value === 'string' ? d.value : '';
139
+ }
140
+ return this.value() ?? '';
141
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
142
+ numericValue = computed(() => {
143
+ const raw = this.data()?.rawValue ?? this.rawValue() ?? this.value();
144
+ const num = parseFloat(raw ?? '0');
145
+ return isNaN(num) ? 0 : Math.min(num, 100);
146
+ }, ...(ngDevMode ? [{ debugName: "numericValue" }] : []));
147
+ maxValue = computed(() => {
148
+ const raw = this.data()?.rawValue ?? this.rawValue() ?? this.value();
149
+ const num = parseFloat(raw ?? '0');
150
+ if (isNaN(num))
151
+ return 100;
152
+ return num > 100 ? Math.ceil(num) : 100;
153
+ }, ...(ngDevMode ? [{ debugName: "maxValue" }] : []));
154
+ // ── Configuration-driven visibility ──
155
+ config = computed(() => this.data()?.configuration ?? {}, ...(ngDevMode ? [{ debugName: "config" }] : []));
156
+ showName = computed(() => this.config().showName ?? true, ...(ngDevMode ? [{ debugName: "showName" }] : []));
157
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityPercentage, deps: [], target: i0.ɵɵFactoryTarget.Component });
158
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityPercentage, isStandalone: true, selector: "mt-entity-percentage", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, rawValue: { classPropertyName: "rawValue", publicName: "rawValue", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex flex-col gap-1\">\r\n <div class=\"flex items-center justify-between\">\r\n @if (showName()) {\r\n <span class=\"text-xs font-semibold\">{{ displayName() }}</span>\r\n }\r\n <span class=\"text-xs font-bold\" [class.ms-auto]=\"!showName()\">{{\r\n displayValue()\r\n }}</span>\r\n </div>\r\n <mt-progress\r\n [value]=\"numericValue()\"\r\n [showLabel]=\"false\"\r\n [height]=\"9\"\r\n [maxValue]=\"maxValue()\"\r\n >\r\n </mt-progress>\r\n</div>\r\n", dependencies: [{ kind: "component", type: Progress, selector: "mt-progress", inputs: ["value", "mode", "showLabel", "unit", "color", "minValue", "maxValue", "height", "circleSize", "strokeWidth", "customClass"] }] });
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityPercentage, decorators: [{
161
+ type: Component,
162
+ args: [{ selector: 'mt-entity-percentage', standalone: true, imports: [Progress], template: "<div class=\"flex flex-col gap-1\">\r\n <div class=\"flex items-center justify-between\">\r\n @if (showName()) {\r\n <span class=\"text-xs font-semibold\">{{ displayName() }}</span>\r\n }\r\n <span class=\"text-xs font-bold\" [class.ms-auto]=\"!showName()\">{{\r\n displayValue()\r\n }}</span>\r\n </div>\r\n <mt-progress\r\n [value]=\"numericValue()\"\r\n [showLabel]=\"false\"\r\n [height]=\"9\"\r\n [maxValue]=\"maxValue()\"\r\n >\r\n </mt-progress>\r\n</div>\r\n" }]
163
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], rawValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "rawValue", required: false }] }] } });
164
+
165
+ class EntityCurrency {
166
+ /** Full entity data object */
167
+ data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
168
+ /** Individual inputs (used when data is not provided) */
169
+ name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
170
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
171
+ displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : []));
172
+ displayValue = computed(() => {
173
+ const d = this.data();
174
+ if (d) {
175
+ return typeof d.value === 'string' ? d.value : '';
176
+ }
177
+ return this.value() ?? '';
178
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
179
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityCurrency, deps: [], target: i0.ɵɵFactoryTarget.Component });
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.3", type: EntityCurrency, isStandalone: true, selector: "mt-entity-currency", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n" });
181
+ }
182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityCurrency, decorators: [{
183
+ type: Component,
184
+ args: [{ selector: 'mt-entity-currency', standalone: true, template: "<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n" }]
185
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
186
+
187
+ class EntityCheckbox {
188
+ /** Full entity data object */
189
+ data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
190
+ /** Individual inputs (used when data is not provided) */
191
+ name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
192
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
193
+ rawValue = input(...(ngDevMode ? [undefined, { debugName: "rawValue" }] : []));
194
+ displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : []));
195
+ isChecked = computed(() => {
196
+ const raw = this.data()?.rawValue ?? this.rawValue();
197
+ if (raw !== undefined) {
198
+ return raw.toLowerCase() === 'true';
199
+ }
200
+ const val = this.data()?.value ?? this.value();
201
+ if (typeof val === 'string') {
202
+ return val.toLowerCase() === 'true';
203
+ }
204
+ return false;
205
+ }, ...(ngDevMode ? [{ debugName: "isChecked" }] : []));
206
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
207
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityCheckbox, isStandalone: true, selector: "mt-entity-checkbox", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, rawValue: { classPropertyName: "rawValue", publicName: "rawValue", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex items-center gap-2\">\r\n @if (isChecked()) {\r\n <svg class=\"w-5 h-5 text-green-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fill-rule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\r\n clip-rule=\"evenodd\"\r\n />\r\n </svg>\r\n } @else {\r\n <svg class=\"w-5 h-5 text-gray-300\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fill-rule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm-1-5.414l-2.293-2.293a1 1 0 011.414-1.414L10 11.172l3.879-3.879a1 1 0 111.414 1.414L10 13.414l-.707-.707-.293-.293z\"\r\n clip-rule=\"evenodd\"\r\n />\r\n </svg>\r\n }\r\n <span class=\"text-sm font-semibold\">{{ displayName() }}</span>\r\n</div>\r\n" });
208
+ }
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityCheckbox, decorators: [{
210
+ type: Component,
211
+ args: [{ selector: 'mt-entity-checkbox', standalone: true, template: "<div class=\"flex items-center gap-2\">\r\n @if (isChecked()) {\r\n <svg class=\"w-5 h-5 text-green-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fill-rule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\r\n clip-rule=\"evenodd\"\r\n />\r\n </svg>\r\n } @else {\r\n <svg class=\"w-5 h-5 text-gray-300\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fill-rule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm-1-5.414l-2.293-2.293a1 1 0 011.414-1.414L10 11.172l3.879-3.879a1 1 0 111.414 1.414L10 13.414l-.707-.707-.293-.293z\"\r\n clip-rule=\"evenodd\"\r\n />\r\n </svg>\r\n }\r\n <span class=\"text-sm font-semibold\">{{ displayName() }}</span>\r\n</div>\r\n" }]
212
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], rawValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "rawValue", required: false }] }] } });
213
+
214
+ class EntityPreview {
215
+ /** Single entity data to display */
216
+ data = input.required(...(ngDevMode ? [{ debugName: "data" }] : []));
217
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityPreview, deps: [], target: i0.ɵɵFactoryTarget.Component });
218
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityPreview, isStandalone: true, selector: "mt-entity-preview", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "w-full" }, ngImport: i0, template: "@switch (data().viewType) {\r\n @case (\"Text\") {\r\n <mt-entity-text [data]=\"data()\" />\r\n }\r\n @case (\"Date\") {\r\n <mt-entity-date [data]=\"data()\" />\r\n }\r\n @case (\"DateTime\") {\r\n <mt-entity-date [data]=\"data()\" />\r\n }\r\n @case (\"Status\") {\r\n <mt-entity-status [data]=\"data()\" />\r\n }\r\n @case (\"User\") {\r\n <mt-entity-user [data]=\"data()\" />\r\n }\r\n @case (\"Percentage\") {\r\n <mt-entity-percentage [data]=\"data()\" />\r\n }\r\n @case (\"Currency\") {\r\n <mt-entity-currency [data]=\"data()\" />\r\n }\r\n @case (\"Checkbox\") {\r\n <mt-entity-checkbox [data]=\"data()\" />\r\n }\r\n @default {\r\n <mt-entity-text [data]=\"data()\" />\r\n }\r\n}\r\n", dependencies: [{ kind: "component", type: EntityText, selector: "mt-entity-text", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityDate, selector: "mt-entity-date", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityStatus, selector: "mt-entity-status", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityUser, selector: "mt-entity-user", inputs: ["data", "displayName", "photoUrl"] }, { kind: "component", type: EntityPercentage, selector: "mt-entity-percentage", inputs: ["data", "name", "value", "rawValue"] }, { kind: "component", type: EntityCurrency, selector: "mt-entity-currency", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityCheckbox, selector: "mt-entity-checkbox", inputs: ["data", "name", "value", "rawValue"] }] });
219
+ }
220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityPreview, decorators: [{
221
+ type: Component,
222
+ args: [{ selector: 'mt-entity-preview', standalone: true, imports: [
223
+ EntityText,
224
+ EntityDate,
225
+ EntityStatus,
226
+ EntityUser,
227
+ EntityPercentage,
228
+ EntityCurrency,
229
+ EntityCheckbox,
230
+ ], host: {
231
+ class: 'w-full',
232
+ }, template: "@switch (data().viewType) {\r\n @case (\"Text\") {\r\n <mt-entity-text [data]=\"data()\" />\r\n }\r\n @case (\"Date\") {\r\n <mt-entity-date [data]=\"data()\" />\r\n }\r\n @case (\"DateTime\") {\r\n <mt-entity-date [data]=\"data()\" />\r\n }\r\n @case (\"Status\") {\r\n <mt-entity-status [data]=\"data()\" />\r\n }\r\n @case (\"User\") {\r\n <mt-entity-user [data]=\"data()\" />\r\n }\r\n @case (\"Percentage\") {\r\n <mt-entity-percentage [data]=\"data()\" />\r\n }\r\n @case (\"Currency\") {\r\n <mt-entity-currency [data]=\"data()\" />\r\n }\r\n @case (\"Checkbox\") {\r\n <mt-entity-checkbox [data]=\"data()\" />\r\n }\r\n @default {\r\n <mt-entity-text [data]=\"data()\" />\r\n }\r\n}\r\n" }]
233
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
234
+
235
+ class EntitiesPreview {
236
+ /** Array of entity data to display */
237
+ entities = input.required(...(ngDevMode ? [{ debugName: "entities" }] : []));
238
+ /** Entities sorted by order */
239
+ sortedEntities = computed(() => [...this.entities()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), ...(ngDevMode ? [{ debugName: "sortedEntities" }] : []));
240
+ /** Returns the grid-column span for a given entity size (1-12) */
241
+ getColSpan(entity) {
242
+ const size = entity.configuration?.size ?? 4;
243
+ return `span ${size}`;
244
+ }
245
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntitiesPreview, deps: [], target: i0.ɵɵFactoryTarget.Component });
246
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntitiesPreview, isStandalone: true, selector: "mt-entities-preview", inputs: { entities: { classPropertyName: "entities", publicName: "entities", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"grid grid-cols-12 gap-x-4 gap-y-10\">\r\n @for (entity of sortedEntities(); track $index) {\r\n <div\r\n class=\"min-w-0 flex items-center p-3\"\r\n [class.border]=\"entity.configuration?.showBorder\"\r\n [class.border-dashed]=\"entity.configuration?.showBorder\"\r\n [class.border-gray-200]=\"entity.configuration?.showBorder\"\r\n [class.rounded-lg]=\"entity.configuration?.showBorder\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n >\r\n <mt-entity-preview [data]=\"entity\" />\r\n </div>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "component", type: EntityPreview, selector: "mt-entity-preview", inputs: ["data"] }] });
247
+ }
248
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntitiesPreview, decorators: [{
249
+ type: Component,
250
+ args: [{ selector: 'mt-entities-preview', standalone: true, imports: [EntityPreview], template: "<div class=\"grid grid-cols-12 gap-x-4 gap-y-10\">\r\n @for (entity of sortedEntities(); track $index) {\r\n <div\r\n class=\"min-w-0 flex items-center p-3\"\r\n [class.border]=\"entity.configuration?.showBorder\"\r\n [class.border-dashed]=\"entity.configuration?.showBorder\"\r\n [class.border-gray-200]=\"entity.configuration?.showBorder\"\r\n [class.rounded-lg]=\"entity.configuration?.showBorder\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n >\r\n <mt-entity-preview [data]=\"entity\" />\r\n </div>\r\n }\r\n</div>\r\n" }]
251
+ }], propDecorators: { entities: [{ type: i0.Input, args: [{ isSignal: true, alias: "entities", required: true }] }] } });
252
+
253
+ /**
254
+ * Base class that encapsulates all entity resize-via-drag logic.
255
+ *
256
+ * Extend this directive in any component that needs column-resize behaviour
257
+ * on a 12-column CSS grid. The subclass must:
258
+ * - Provide a `model.required<EntityData[]>()` (or equivalent) for the
259
+ * entity list so `updateEntitySize()` can be called after resize.
260
+ * - Contain a `.grid` element (or override `getGridElement()`).
261
+ *
262
+ * Resize flow:
263
+ * 1. `onResizeStart(event, entity)` — called from a mousedown on the handle
264
+ * 2. mousemove → snaps to nearest column, updates `resizePreviewSize`
265
+ * 3. mouseup → emits `entityResized` with previous & new size
266
+ */
267
+ class EntitiesResizeBase {
268
+ elRef = inject(ElementRef);
269
+ zone = inject(NgZone);
270
+ doc = inject(DOCUMENT);
271
+ /** Emits when an entity is resized via the drag handle */
272
+ entityResized = output();
273
+ // ── Resize state ──
274
+ /** The entity currently being resized (null when idle) */
275
+ resizingEntity = signal(null, ...(ngDevMode ? [{ debugName: "resizingEntity" }] : []));
276
+ /** Live preview size while dragging */
277
+ resizePreviewSize = signal(null, ...(ngDevMode ? [{ debugName: "resizePreviewSize" }] : []));
278
+ /** Bound listeners kept for cleanup */
279
+ _onMouseMove = null;
280
+ _onMouseUp = null;
281
+ // ── Public API ──
282
+ /**
283
+ * Returns the grid element used to compute column widths.
284
+ * Override if the grid selector differs.
285
+ */
286
+ getGridElement() {
287
+ return this.elRef.nativeElement.querySelector('.grid');
288
+ }
289
+ /**
290
+ * Returns the grid-column span string for a given entity.
291
+ * While resizing the active entity, returns the preview size.
292
+ */
293
+ getResizeColSpan(entity) {
294
+ if (this.resizingEntity() === entity && this.resizePreviewSize() !== null) {
295
+ return `span ${this.resizePreviewSize()}`;
296
+ }
297
+ const size = entity.configuration?.size ?? 4;
298
+ return `span ${size}`;
299
+ }
300
+ /** Starts a resize operation from the right-edge handle */
301
+ onResizeStart(event, entity) {
302
+ // Prevent the drag-drop from starting
303
+ event.preventDefault();
304
+ event.stopPropagation();
305
+ const gridEl = this.getGridElement();
306
+ if (!gridEl)
307
+ return;
308
+ const gridRect = gridEl.getBoundingClientRect();
309
+ const gridWidth = gridRect.width;
310
+ const columnWidth = gridWidth / 12;
311
+ const previousSize = entity.configuration?.size ?? 4;
312
+ // Left edge of the entity cell
313
+ const cellEl = event.target.closest('.entity-cell');
314
+ if (!cellEl)
315
+ return;
316
+ const cellLeft = cellEl.getBoundingClientRect().left;
317
+ this.resizingEntity.set(entity);
318
+ this.resizePreviewSize.set(previousSize);
319
+ // Run mouse listeners outside Angular zone for performance
320
+ this.zone.runOutsideAngular(() => {
321
+ this._onMouseMove = (e) => {
322
+ const rawWidth = e.clientX - cellLeft;
323
+ // Snap to nearest full column (min 1, max 12)
324
+ let cols = Math.round(rawWidth / columnWidth);
325
+ cols = Math.max(1, Math.min(12, cols));
326
+ const current = this.resizePreviewSize();
327
+ if (current !== cols) {
328
+ this.zone.run(() => this.resizePreviewSize.set(cols));
329
+ }
330
+ };
331
+ this._onMouseUp = () => {
332
+ this._cleanupListeners();
333
+ const newSize = this.resizePreviewSize();
334
+ this.resizingEntity.set(null);
335
+ this.resizePreviewSize.set(null);
336
+ if (newSize !== previousSize) {
337
+ this.zone.run(() => {
338
+ this.onResizeComplete(entity, previousSize, newSize);
339
+ });
340
+ }
341
+ };
342
+ this.doc.addEventListener('mousemove', this._onMouseMove);
343
+ this.doc.addEventListener('mouseup', this._onMouseUp, { once: true });
344
+ });
345
+ }
346
+ /** Removes global mouse listeners */
347
+ _cleanupListeners() {
348
+ if (this._onMouseMove) {
349
+ this.doc.removeEventListener('mousemove', this._onMouseMove);
350
+ this._onMouseMove = null;
351
+ }
352
+ if (this._onMouseUp) {
353
+ this.doc.removeEventListener('mouseup', this._onMouseUp);
354
+ this._onMouseUp = null;
355
+ }
356
+ }
357
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntitiesResizeBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
358
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.3", type: EntitiesResizeBase, isStandalone: true, outputs: { entityResized: "entityResized" }, ngImport: i0 });
359
+ }
360
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntitiesResizeBase, decorators: [{
361
+ type: Directive
362
+ }], propDecorators: { entityResized: [{ type: i0.Output, args: ["entityResized"] }] } });
363
+
364
+ class EntitiesManage extends EntitiesResizeBase {
365
+ /** Array of entity data – supports two-way binding to keep order in sync */
366
+ entities = model.required(...(ngDevMode ? [{ debugName: "entities" }] : []));
367
+ /** Emits the reordered entities array after each drag-drop */
368
+ entitiesReordered = output();
369
+ /** Entities sorted by their order field */
370
+ sortedEntities = computed(() => [...this.entities()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), ...(ngDevMode ? [{ debugName: "sortedEntities" }] : []));
371
+ /** Returns the grid-column span for a given entity size (1-12) */
372
+ getColSpan(entity) {
373
+ return this.getResizeColSpan(entity);
374
+ }
375
+ /** Handle drag-drop reorder */
376
+ onDrop(event) {
377
+ if (event.previousIndex === event.currentIndex)
378
+ return;
379
+ const items = [...this.sortedEntities()];
380
+ const [moved] = items.splice(event.previousIndex, 1);
381
+ items.splice(event.currentIndex, 0, moved);
382
+ // Reassign order based on new positions
383
+ const reordered = items.map((item, index) => ({
384
+ ...item,
385
+ order: index + 1,
386
+ }));
387
+ // Update the model (two-way binding)
388
+ this.entities.set(reordered);
389
+ // Emit the reordered list
390
+ this.entitiesReordered.emit(reordered);
391
+ }
392
+ // ── Resize completion (from EntitiesResizeBase) ──
393
+ onResizeComplete(entity, previousSize, newSize) {
394
+ // Update entity in the list
395
+ const updated = this.entities().map((e) => e === entity
396
+ ? {
397
+ ...e,
398
+ configuration: {
399
+ ...e.configuration,
400
+ size: newSize,
401
+ },
402
+ }
403
+ : e);
404
+ this.entities.set(updated);
405
+ this.entityResized.emit({
406
+ entity: {
407
+ ...entity,
408
+ configuration: { ...entity.configuration, size: newSize },
409
+ },
410
+ previousSize,
411
+ newSize,
412
+ });
413
+ }
414
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntitiesManage, deps: null, target: i0.ɵɵFactoryTarget.Component });
415
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntitiesManage, isStandalone: true, selector: "mt-entities-manage", inputs: { entities: { classPropertyName: "entities", publicName: "entities", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { entities: "entitiesChange", entitiesReordered: "entitiesReordered" }, usesInheritance: true, ngImport: i0, template: "<div\r\n cdkDropList\r\n cdkDropListOrientation=\"mixed\"\r\n [cdkDropListData]=\"sortedEntities()\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n class=\"grid grid-cols-12 gap-x-4 gap-y-10\"\r\n>\r\n @for (entity of sortedEntities(); track entity.order) {\r\n <div\r\n cdkDrag\r\n [cdkDragData]=\"entity\"\r\n class=\"entity-cell group relative min-w-0 flex items-center p-3 cursor-grab active:cursor-grabbing\"\r\n [class.border]=\"entity.configuration?.showBorder\"\r\n [class.border-dashed]=\"entity.configuration?.showBorder\"\r\n [class.border-gray-200]=\"entity.configuration?.showBorder\"\r\n [class.rounded-lg]=\"entity.configuration?.showBorder\"\r\n [class.resizing]=\"resizingEntity() === entity\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n >\r\n <!-- Drag placeholder -->\r\n <div\r\n *cdkDragPlaceholder\r\n class=\"h-full min-h-12 bg-black/10 rounded-xl\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n ></div>\r\n\r\n <mt-entity-preview [data]=\"entity\" class=\"flex-1 min-w-0\" />\r\n\r\n <!-- Resize handle (right edge) -->\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, entity)\">\r\n <div class=\"resize-handle-bar\"></div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".cdk-drag{cursor:grab}.cdk-drag:active,.cdk-drag-preview{cursor:grabbing}.cdk-drag-placeholder{opacity:.5}.cdk-drop-list-dragging .cdk-drag{cursor:grabbing}.entity-cell{position:relative}.resize-handle{position:absolute;top:0;right:-4px;width:8px;height:100%;cursor:col-resize;z-index:10;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s ease}.entity-cell:hover .resize-handle,.entity-cell.resizing .resize-handle{opacity:1}.resize-handle-bar{width:3px;height:24px;border-radius:2px;background-color:var(--p-primary-color, #6366f1);transition:height .15s ease,background-color .15s ease}.resize-handle:hover .resize-handle-bar{height:36px;background-color:var(--p-primary-color, #4f46e5)}.entity-cell.resizing{outline:2px dashed var(--p-primary-color, #6366f1);outline-offset:-1px;border-radius:8px;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "component", type: EntityPreview, selector: "mt-entity-preview", inputs: ["data"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }] });
416
+ }
417
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntitiesManage, decorators: [{
418
+ type: Component,
419
+ args: [{ selector: 'mt-entities-manage', standalone: true, imports: [EntityPreview, CdkDrag, CdkDropList, CdkDragPlaceholder], template: "<div\r\n cdkDropList\r\n cdkDropListOrientation=\"mixed\"\r\n [cdkDropListData]=\"sortedEntities()\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n class=\"grid grid-cols-12 gap-x-4 gap-y-10\"\r\n>\r\n @for (entity of sortedEntities(); track entity.order) {\r\n <div\r\n cdkDrag\r\n [cdkDragData]=\"entity\"\r\n class=\"entity-cell group relative min-w-0 flex items-center p-3 cursor-grab active:cursor-grabbing\"\r\n [class.border]=\"entity.configuration?.showBorder\"\r\n [class.border-dashed]=\"entity.configuration?.showBorder\"\r\n [class.border-gray-200]=\"entity.configuration?.showBorder\"\r\n [class.rounded-lg]=\"entity.configuration?.showBorder\"\r\n [class.resizing]=\"resizingEntity() === entity\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n >\r\n <!-- Drag placeholder -->\r\n <div\r\n *cdkDragPlaceholder\r\n class=\"h-full min-h-12 bg-black/10 rounded-xl\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n ></div>\r\n\r\n <mt-entity-preview [data]=\"entity\" class=\"flex-1 min-w-0\" />\r\n\r\n <!-- Resize handle (right edge) -->\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, entity)\">\r\n <div class=\"resize-handle-bar\"></div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".cdk-drag{cursor:grab}.cdk-drag:active,.cdk-drag-preview{cursor:grabbing}.cdk-drag-placeholder{opacity:.5}.cdk-drop-list-dragging .cdk-drag{cursor:grabbing}.entity-cell{position:relative}.resize-handle{position:absolute;top:0;right:-4px;width:8px;height:100%;cursor:col-resize;z-index:10;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s ease}.entity-cell:hover .resize-handle,.entity-cell.resizing .resize-handle{opacity:1}.resize-handle-bar{width:3px;height:24px;border-radius:2px;background-color:var(--p-primary-color, #6366f1);transition:height .15s ease,background-color .15s ease}.resize-handle:hover .resize-handle-bar{height:36px;background-color:var(--p-primary-color, #4f46e5)}.entity-cell.resizing{outline:2px dashed var(--p-primary-color, #6366f1);outline-offset:-1px;border-radius:8px;-webkit-user-select:none;user-select:none}\n"] }]
420
+ }], propDecorators: { entities: [{ type: i0.Input, args: [{ isSignal: true, alias: "entities", required: true }] }, { type: i0.Output, args: ["entitiesChange"] }], entitiesReordered: [{ type: i0.Output, args: ["entitiesReordered"] }] } });
421
+
422
+ /**
423
+ * Generated bundle index. Do not edit.
424
+ */
425
+
426
+ export { EntitiesManage, EntitiesPreview, EntitiesResizeBase, EntityCheckbox, EntityCurrency, EntityDate, EntityPercentage, EntityPreview, EntityStatus, EntityText, EntityUser };
427
+ //# sourceMappingURL=masterteam-components-entities.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masterteam-components-entities.mjs","sources":["../../../../packages/masterteam/components/entities/entity-text/entity-text.ts","../../../../packages/masterteam/components/entities/entity-text/entity-text.html","../../../../packages/masterteam/components/entities/entity-date/entity-date.ts","../../../../packages/masterteam/components/entities/entity-date/entity-date.html","../../../../packages/masterteam/components/entities/entity-status/entity-status.ts","../../../../packages/masterteam/components/entities/entity-status/entity-status.html","../../../../packages/masterteam/components/entities/entity-user/entity-user.ts","../../../../packages/masterteam/components/entities/entity-user/entity-user.html","../../../../packages/masterteam/components/entities/entity-percentage/entity-percentage.ts","../../../../packages/masterteam/components/entities/entity-percentage/entity-percentage.html","../../../../packages/masterteam/components/entities/entity-currency/entity-currency.ts","../../../../packages/masterteam/components/entities/entity-currency/entity-currency.html","../../../../packages/masterteam/components/entities/entity-checkbox/entity-checkbox.ts","../../../../packages/masterteam/components/entities/entity-checkbox/entity-checkbox.html","../../../../packages/masterteam/components/entities/entity-preview/entity-preview.ts","../../../../packages/masterteam/components/entities/entity-preview/entity-preview.html","../../../../packages/masterteam/components/entities/entities-preview/entities-preview.ts","../../../../packages/masterteam/components/entities/entities-preview/entities-preview.html","../../../../packages/masterteam/components/entities/entities-manage/entities-resize-base.ts","../../../../packages/masterteam/components/entities/entities-manage/entities-manage.ts","../../../../packages/masterteam/components/entities/entities-manage/entities-manage.html","../../../../packages/masterteam/components/entities/masterteam-components-entities.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\r\nimport { EntityData } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-text',\r\n standalone: true,\r\n templateUrl: './entity-text.html',\r\n})\r\nexport class EntityText {\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Individual inputs (used when data is not provided) */\r\n readonly name = input<string>();\r\n readonly value = input<string>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n readonly displayValue = computed(() => {\r\n const d = this.data();\r\n if (d) {\r\n return typeof d.value === 'string' ? d.value : '';\r\n }\r\n return this.value() ?? '';\r\n });\r\n}\r\n","<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { EntityData } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-date',\r\n standalone: true,\r\n templateUrl: './entity-date.html',\r\n})\r\nexport class EntityDate {\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Individual inputs (used when data is not provided) */\r\n readonly name = input<string>();\r\n readonly value = input<string>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n readonly displayValue = computed(() => {\r\n const d = this.data();\r\n if (d) {\r\n return typeof d.value === 'string' ? d.value : '';\r\n }\r\n return this.value() ?? '';\r\n });\r\n}\r\n","<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { EntityData, EntityStatusValue } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-status',\r\n standalone: true,\r\n templateUrl: './entity-status.html',\r\n})\r\nexport class EntityStatus {\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Individual inputs (used when data is not provided) */\r\n readonly name = input<string>();\r\n readonly value = input<EntityStatusValue>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n\r\n readonly statusValue = computed<EntityStatusValue | null>(() => {\r\n const d = this.data();\r\n if (d && typeof d.value === 'object' && d.value !== null) {\r\n return d.value as EntityStatusValue;\r\n }\r\n return this.value() ?? null;\r\n });\r\n\r\n readonly badgeStyle = computed(() => {\r\n const status = this.statusValue();\r\n if (!status?.color) return {};\r\n return {\r\n color: status.color,\r\n backgroundColor: this.hexToRgba(status.color, 0.12),\r\n };\r\n });\r\n\r\n private hexToRgba(hex: string, alpha: number): string {\r\n const r = parseInt(hex.slice(1, 3), 16);\r\n const g = parseInt(hex.slice(3, 5), 16);\r\n const b = parseInt(hex.slice(5, 7), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n }\r\n}\r\n","<div class=\"flex flex-col gap-1\">\r\n @if (statusValue(); as status) {\r\n <span\r\n class=\"inline-flex items-center px-3 py-2 rounded-md text-xs font-semibold w-fit\"\r\n [style]=\"badgeStyle()\"\r\n >\r\n {{ status.display }}\r\n </span>\r\n }\r\n <!-- <span class=\"text-xs text-gray-500\">{{ displayName() }}</span> -->\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { EntityData, EntityUserConfig } from '../entity.model';\r\nimport { SecureImagePipe } from '@masterteam/components/upload-field';\r\n\r\n@Component({\r\n selector: 'mt-entity-user',\r\n standalone: true,\r\n imports: [Avatar, Button, SecureImagePipe],\r\n templateUrl: './entity-user.html',\r\n})\r\nexport class EntityUser {\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Individual inputs (used when data is not provided) */\r\n readonly displayName = input<string>();\r\n readonly photoUrl = input<string>();\r\n\r\n readonly userName = computed(\r\n () => this.data()?.displayName ?? this.displayName() ?? '',\r\n );\r\n\r\n readonly userPhoto = computed(\r\n () => this.data()?.photoUrl ?? this.photoUrl() ?? '',\r\n );\r\n\r\n readonly labelText = computed(() => '');\r\n\r\n readonly initials = computed(() => {\r\n const name = this.userName();\r\n if (!name) return '';\r\n const parts = name.trim().split(/\\s+/);\r\n if (parts.length >= 2) {\r\n return (parts[0][0] + parts[1][0]).toUpperCase();\r\n }\r\n return name.substring(0, 2).toUpperCase();\r\n });\r\n\r\n // ── Configuration-driven visibility ──\r\n\r\n private readonly config = computed(\r\n () => (this.data()?.configuration as EntityUserConfig) ?? {},\r\n );\r\n\r\n readonly showDisplayName = computed(\r\n () => this.config().showDisplayName ?? true,\r\n );\r\n\r\n readonly showPhoneNumber = computed(\r\n () => this.config().showPhoneNumber ?? false,\r\n );\r\n\r\n readonly showEmail = computed(() => this.config().showEmail ?? false);\r\n\r\n readonly phoneNumber = computed(() => this.data()?.phoneNumber ?? '');\r\n\r\n readonly email = computed(() => this.data()?.email ?? '');\r\n\r\n readonly hasContactInfo = computed(\r\n () =>\r\n (this.showPhoneNumber() && !!this.phoneNumber()) ||\r\n (this.showEmail() && !!this.email()),\r\n );\r\n}\r\n","<div class=\"flex items-center gap-2\">\r\n <mt-avatar\r\n [image]=\"\r\n userPhoto()\r\n ? (userPhoto() | secureImage: true : undefined : 'avatar/')\r\n : ''\r\n \"\r\n [label]=\"initials()\"\r\n styleClass=\"w-11! h-11! text-lg! text-white! bg-primary-500!\"\r\n ></mt-avatar>\r\n\r\n @if (showDisplayName()) {\r\n <div class=\"flex flex-col min-w-0 flex-1\">\r\n <span class=\"text-sm font-semibold truncate\">{{ userName() }}</span>\r\n @if (labelText()) {\r\n <span class=\"text-xs text-gray-500 truncate\">{{ labelText() }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasContactInfo()) {\r\n <div class=\"flex items-center gap-1 ms-auto shrink-0\">\r\n @if (showPhoneNumber() && phoneNumber()) {\r\n <a [href]=\"'tel:' + phoneNumber()\" [title]=\"phoneNumber()\">\r\n <mt-button\r\n icon=\"communication.phone\"\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [tooltip]=\"phoneNumber()\"\r\n />\r\n </a>\r\n }\r\n @if (showEmail() && email()) {\r\n <a [href]=\"'mailto:' + email()\" [title]=\"email()\">\r\n <mt-button\r\n icon=\"communication.mail-01\"\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n [tooltip]=\"email()\"\r\n />\r\n </a>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { Progress } from '@masterteam/components/progress';\r\nimport { EntityData, EntityPercentageConfig } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-percentage',\r\n standalone: true,\r\n imports: [Progress],\r\n templateUrl: './entity-percentage.html',\r\n})\r\nexport class EntityPercentage {\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Individual inputs (used when data is not provided) */\r\n readonly name = input<string>();\r\n readonly value = input<string>();\r\n readonly rawValue = input<string>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n\r\n readonly displayValue = computed(() => {\r\n const d = this.data();\r\n if (d) {\r\n return typeof d.value === 'string' ? d.value : '';\r\n }\r\n return this.value() ?? '';\r\n });\r\n\r\n readonly numericValue = computed(() => {\r\n const raw = this.data()?.rawValue ?? this.rawValue() ?? this.value();\r\n const num = parseFloat(raw ?? '0');\r\n return isNaN(num) ? 0 : Math.min(num, 100);\r\n });\r\n\r\n readonly maxValue = computed(() => {\r\n const raw = this.data()?.rawValue ?? this.rawValue() ?? this.value();\r\n const num = parseFloat(raw ?? '0');\r\n if (isNaN(num)) return 100;\r\n return num > 100 ? Math.ceil(num) : 100;\r\n });\r\n\r\n // ── Configuration-driven visibility ──\r\n\r\n private readonly config = computed(\r\n () => (this.data()?.configuration as EntityPercentageConfig) ?? {},\r\n );\r\n\r\n readonly showName = computed(() => this.config().showName ?? true);\r\n}\r\n","<div class=\"flex flex-col gap-1\">\r\n <div class=\"flex items-center justify-between\">\r\n @if (showName()) {\r\n <span class=\"text-xs font-semibold\">{{ displayName() }}</span>\r\n }\r\n <span class=\"text-xs font-bold\" [class.ms-auto]=\"!showName()\">{{\r\n displayValue()\r\n }}</span>\r\n </div>\r\n <mt-progress\r\n [value]=\"numericValue()\"\r\n [showLabel]=\"false\"\r\n [height]=\"9\"\r\n [maxValue]=\"maxValue()\"\r\n >\r\n </mt-progress>\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { EntityData } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-currency',\r\n standalone: true,\r\n templateUrl: './entity-currency.html',\r\n})\r\nexport class EntityCurrency {\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Individual inputs (used when data is not provided) */\r\n readonly name = input<string>();\r\n readonly value = input<string>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n readonly displayValue = computed(() => {\r\n const d = this.data();\r\n if (d) {\r\n return typeof d.value === 'string' ? d.value : '';\r\n }\r\n return this.value() ?? '';\r\n });\r\n}\r\n","<div class=\"flex flex-col gap-0.5\">\r\n <span class=\"text-sm font-semibold\">{{ displayValue() }}</span>\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { EntityData } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-checkbox',\r\n standalone: true,\r\n templateUrl: './entity-checkbox.html',\r\n})\r\nexport class EntityCheckbox {\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Individual inputs (used when data is not provided) */\r\n readonly name = input<string>();\r\n readonly value = input<string>();\r\n readonly rawValue = input<string>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n\r\n readonly isChecked = computed(() => {\r\n const raw = this.data()?.rawValue ?? this.rawValue();\r\n if (raw !== undefined) {\r\n return raw.toLowerCase() === 'true';\r\n }\r\n const val = this.data()?.value ?? this.value();\r\n if (typeof val === 'string') {\r\n return val.toLowerCase() === 'true';\r\n }\r\n return false;\r\n });\r\n}\r\n","<div class=\"flex items-center gap-2\">\r\n @if (isChecked()) {\r\n <svg class=\"w-5 h-5 text-green-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fill-rule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\"\r\n clip-rule=\"evenodd\"\r\n />\r\n </svg>\r\n } @else {\r\n <svg class=\"w-5 h-5 text-gray-300\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\r\n <path\r\n fill-rule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm-1-5.414l-2.293-2.293a1 1 0 011.414-1.414L10 11.172l3.879-3.879a1 1 0 111.414 1.414L10 13.414l-.707-.707-.293-.293z\"\r\n clip-rule=\"evenodd\"\r\n />\r\n </svg>\r\n }\r\n <span class=\"text-sm font-semibold\">{{ displayName() }}</span>\r\n</div>\r\n","import { Component, input } from '@angular/core';\r\nimport { EntityData } from '../entity.model';\r\nimport { EntityText } from '../entity-text/entity-text';\r\nimport { EntityDate } from '../entity-date/entity-date';\r\nimport { EntityStatus } from '../entity-status/entity-status';\r\nimport { EntityUser } from '../entity-user/entity-user';\r\nimport { EntityPercentage } from '../entity-percentage/entity-percentage';\r\nimport { EntityCurrency } from '../entity-currency/entity-currency';\r\nimport { EntityCheckbox } from '../entity-checkbox/entity-checkbox';\r\n\r\n@Component({\r\n selector: 'mt-entity-preview',\r\n standalone: true,\r\n imports: [\r\n EntityText,\r\n EntityDate,\r\n EntityStatus,\r\n EntityUser,\r\n EntityPercentage,\r\n EntityCurrency,\r\n EntityCheckbox,\r\n ],\r\n templateUrl: './entity-preview.html',\r\n host: {\r\n class: 'w-full',\r\n },\r\n})\r\nexport class EntityPreview {\r\n /** Single entity data to display */\r\n readonly data = input.required<EntityData>();\r\n}\r\n","@switch (data().viewType) {\r\n @case (\"Text\") {\r\n <mt-entity-text [data]=\"data()\" />\r\n }\r\n @case (\"Date\") {\r\n <mt-entity-date [data]=\"data()\" />\r\n }\r\n @case (\"DateTime\") {\r\n <mt-entity-date [data]=\"data()\" />\r\n }\r\n @case (\"Status\") {\r\n <mt-entity-status [data]=\"data()\" />\r\n }\r\n @case (\"User\") {\r\n <mt-entity-user [data]=\"data()\" />\r\n }\r\n @case (\"Percentage\") {\r\n <mt-entity-percentage [data]=\"data()\" />\r\n }\r\n @case (\"Currency\") {\r\n <mt-entity-currency [data]=\"data()\" />\r\n }\r\n @case (\"Checkbox\") {\r\n <mt-entity-checkbox [data]=\"data()\" />\r\n }\r\n @default {\r\n <mt-entity-text [data]=\"data()\" />\r\n }\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { EntityData, EntitySize } from '../entity.model';\r\nimport { EntityPreview } from '../entity-preview/entity-preview';\r\n\r\n@Component({\r\n selector: 'mt-entities-preview',\r\n standalone: true,\r\n imports: [EntityPreview],\r\n templateUrl: './entities-preview.html',\r\n})\r\nexport class EntitiesPreview {\r\n /** Array of entity data to display */\r\n readonly entities = input.required<EntityData[]>();\r\n\r\n /** Entities sorted by order */\r\n readonly sortedEntities = computed(() =>\r\n [...this.entities()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\r\n );\r\n\r\n /** Returns the grid-column span for a given entity size (1-12) */\r\n getColSpan(entity: EntityData): string {\r\n const size: EntitySize = entity.configuration?.size ?? 4;\r\n return `span ${size}`;\r\n }\r\n}\r\n","<div class=\"grid grid-cols-12 gap-x-4 gap-y-10\">\r\n @for (entity of sortedEntities(); track $index) {\r\n <div\r\n class=\"min-w-0 flex items-center p-3\"\r\n [class.border]=\"entity.configuration?.showBorder\"\r\n [class.border-dashed]=\"entity.configuration?.showBorder\"\r\n [class.border-gray-200]=\"entity.configuration?.showBorder\"\r\n [class.rounded-lg]=\"entity.configuration?.showBorder\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n >\r\n <mt-entity-preview [data]=\"entity\" />\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n NgZone,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { EntityData, EntityResizeEvent, EntitySize } from '../entity.model';\r\n\r\n/**\r\n * Base class that encapsulates all entity resize-via-drag logic.\r\n *\r\n * Extend this directive in any component that needs column-resize behaviour\r\n * on a 12-column CSS grid. The subclass must:\r\n * - Provide a `model.required<EntityData[]>()` (or equivalent) for the\r\n * entity list so `updateEntitySize()` can be called after resize.\r\n * - Contain a `.grid` element (or override `getGridElement()`).\r\n *\r\n * Resize flow:\r\n * 1. `onResizeStart(event, entity)` — called from a mousedown on the handle\r\n * 2. mousemove → snaps to nearest column, updates `resizePreviewSize`\r\n * 3. mouseup → emits `entityResized` with previous & new size\r\n */\r\n@Directive()\r\nexport abstract class EntitiesResizeBase {\r\n protected readonly elRef = inject(ElementRef);\r\n protected readonly zone = inject(NgZone);\r\n protected readonly doc = inject(DOCUMENT);\r\n\r\n /** Emits when an entity is resized via the drag handle */\r\n readonly entityResized = output<EntityResizeEvent>();\r\n\r\n // ── Resize state ──\r\n\r\n /** The entity currently being resized (null when idle) */\r\n readonly resizingEntity = signal<EntityData | null>(null);\r\n\r\n /** Live preview size while dragging */\r\n readonly resizePreviewSize = signal<EntitySize | null>(null);\r\n\r\n /** Bound listeners kept for cleanup */\r\n private _onMouseMove: ((e: MouseEvent) => void) | null = null;\r\n private _onMouseUp: ((e: MouseEvent) => void) | null = null;\r\n\r\n // ── Public API ──\r\n\r\n /**\r\n * Returns the grid element used to compute column widths.\r\n * Override if the grid selector differs.\r\n */\r\n protected getGridElement(): HTMLElement | null {\r\n return this.elRef.nativeElement.querySelector('.grid');\r\n }\r\n\r\n /**\r\n * Returns the grid-column span string for a given entity.\r\n * While resizing the active entity, returns the preview size.\r\n */\r\n getResizeColSpan(entity: EntityData): string {\r\n if (this.resizingEntity() === entity && this.resizePreviewSize() !== null) {\r\n return `span ${this.resizePreviewSize()}`;\r\n }\r\n const size: EntitySize = entity.configuration?.size ?? 4;\r\n return `span ${size}`;\r\n }\r\n\r\n /** Starts a resize operation from the right-edge handle */\r\n onResizeStart(event: MouseEvent, entity: EntityData): void {\r\n // Prevent the drag-drop from starting\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const gridEl = this.getGridElement();\r\n if (!gridEl) return;\r\n\r\n const gridRect = gridEl.getBoundingClientRect();\r\n const gridWidth = gridRect.width;\r\n const columnWidth = gridWidth / 12;\r\n\r\n const previousSize: EntitySize = entity.configuration?.size ?? 4;\r\n\r\n // Left edge of the entity cell\r\n const cellEl = (event.target as HTMLElement).closest(\r\n '.entity-cell',\r\n ) as HTMLElement | null;\r\n if (!cellEl) return;\r\n const cellLeft = cellEl.getBoundingClientRect().left;\r\n\r\n this.resizingEntity.set(entity);\r\n this.resizePreviewSize.set(previousSize);\r\n\r\n // Run mouse listeners outside Angular zone for performance\r\n this.zone.runOutsideAngular(() => {\r\n this._onMouseMove = (e: MouseEvent) => {\r\n const rawWidth = e.clientX - cellLeft;\r\n // Snap to nearest full column (min 1, max 12)\r\n let cols = Math.round(rawWidth / columnWidth);\r\n cols = Math.max(1, Math.min(12, cols)) as EntitySize;\r\n const current = this.resizePreviewSize();\r\n if (current !== cols) {\r\n this.zone.run(() => this.resizePreviewSize.set(cols as EntitySize));\r\n }\r\n };\r\n\r\n this._onMouseUp = () => {\r\n this._cleanupListeners();\r\n\r\n const newSize = this.resizePreviewSize() as EntitySize;\r\n this.resizingEntity.set(null);\r\n this.resizePreviewSize.set(null);\r\n\r\n if (newSize !== previousSize) {\r\n this.zone.run(() => {\r\n this.onResizeComplete(entity, previousSize, newSize);\r\n });\r\n }\r\n };\r\n\r\n this.doc.addEventListener('mousemove', this._onMouseMove);\r\n this.doc.addEventListener('mouseup', this._onMouseUp, { once: true });\r\n });\r\n }\r\n\r\n /**\r\n * Called when a resize operation completes with a changed size.\r\n * Subclasses should update the entity list and emit events here.\r\n */\r\n protected abstract onResizeComplete(\r\n entity: EntityData,\r\n previousSize: EntitySize,\r\n newSize: EntitySize,\r\n ): void;\r\n\r\n /** Removes global mouse listeners */\r\n private _cleanupListeners(): void {\r\n if (this._onMouseMove) {\r\n this.doc.removeEventListener('mousemove', this._onMouseMove);\r\n this._onMouseMove = null;\r\n }\r\n if (this._onMouseUp) {\r\n this.doc.removeEventListener('mouseup', this._onMouseUp);\r\n this._onMouseUp = null;\r\n }\r\n }\r\n}\r\n","import { Component, computed, model, output } from '@angular/core';\r\nimport {\r\n CdkDrag,\r\n CdkDragDrop,\r\n CdkDragPlaceholder,\r\n CdkDropList,\r\n} from '@angular/cdk/drag-drop';\r\nimport { EntityData, EntitySize } from '../entity.model';\r\nimport { EntityPreview } from '../entity-preview/entity-preview';\r\nimport { EntitiesResizeBase } from './entities-resize-base';\r\n\r\n@Component({\r\n selector: 'mt-entities-manage',\r\n standalone: true,\r\n imports: [EntityPreview, CdkDrag, CdkDropList, CdkDragPlaceholder],\r\n templateUrl: './entities-manage.html',\r\n styleUrl: './entities-manage.scss',\r\n})\r\nexport class EntitiesManage extends EntitiesResizeBase {\r\n /** Array of entity data – supports two-way binding to keep order in sync */\r\n readonly entities = model.required<EntityData[]>();\r\n\r\n /** Emits the reordered entities array after each drag-drop */\r\n readonly entitiesReordered = output<EntityData[]>();\r\n\r\n /** Entities sorted by their order field */\r\n readonly sortedEntities = computed(() =>\r\n [...this.entities()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\r\n );\r\n\r\n /** Returns the grid-column span for a given entity size (1-12) */\r\n getColSpan(entity: EntityData): string {\r\n return this.getResizeColSpan(entity);\r\n }\r\n\r\n /** Handle drag-drop reorder */\r\n onDrop(event: CdkDragDrop<EntityData[]>): void {\r\n if (event.previousIndex === event.currentIndex) return;\r\n\r\n const items = [...this.sortedEntities()];\r\n const [moved] = items.splice(event.previousIndex, 1);\r\n items.splice(event.currentIndex, 0, moved);\r\n\r\n // Reassign order based on new positions\r\n const reordered = items.map((item, index) => ({\r\n ...item,\r\n order: index + 1,\r\n }));\r\n\r\n // Update the model (two-way binding)\r\n this.entities.set(reordered);\r\n\r\n // Emit the reordered list\r\n this.entitiesReordered.emit(reordered);\r\n }\r\n\r\n // ── Resize completion (from EntitiesResizeBase) ──\r\n\r\n protected override onResizeComplete(\r\n entity: EntityData,\r\n previousSize: EntitySize,\r\n newSize: EntitySize,\r\n ): void {\r\n // Update entity in the list\r\n const updated = this.entities().map((e) =>\r\n e === entity\r\n ? {\r\n ...e,\r\n configuration: {\r\n ...e.configuration,\r\n size: newSize,\r\n },\r\n }\r\n : e,\r\n );\r\n this.entities.set(updated);\r\n\r\n this.entityResized.emit({\r\n entity: {\r\n ...entity,\r\n configuration: { ...entity.configuration, size: newSize },\r\n },\r\n previousSize,\r\n newSize,\r\n });\r\n }\r\n}\r\n","<div\r\n cdkDropList\r\n cdkDropListOrientation=\"mixed\"\r\n [cdkDropListData]=\"sortedEntities()\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n class=\"grid grid-cols-12 gap-x-4 gap-y-10\"\r\n>\r\n @for (entity of sortedEntities(); track entity.order) {\r\n <div\r\n cdkDrag\r\n [cdkDragData]=\"entity\"\r\n class=\"entity-cell group relative min-w-0 flex items-center p-3 cursor-grab active:cursor-grabbing\"\r\n [class.border]=\"entity.configuration?.showBorder\"\r\n [class.border-dashed]=\"entity.configuration?.showBorder\"\r\n [class.border-gray-200]=\"entity.configuration?.showBorder\"\r\n [class.rounded-lg]=\"entity.configuration?.showBorder\"\r\n [class.resizing]=\"resizingEntity() === entity\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n >\r\n <!-- Drag placeholder -->\r\n <div\r\n *cdkDragPlaceholder\r\n class=\"h-full min-h-12 bg-black/10 rounded-xl\"\r\n [style.grid-column]=\"getColSpan(entity)\"\r\n ></div>\r\n\r\n <mt-entity-preview [data]=\"entity\" class=\"flex-1 min-w-0\" />\r\n\r\n <!-- Resize handle (right edge) -->\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, entity)\">\r\n <div class=\"resize-handle-bar\"></div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}