@masterteam/components 0.0.99 → 0.0.100
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/assets/common.css +1 -1
- package/fesm2022/masterteam-components-client-page-menu.mjs +53 -4
- package/fesm2022/masterteam-components-client-page-menu.mjs.map +1 -1
- package/fesm2022/masterteam-components-client-page.mjs +2 -2
- package/fesm2022/masterteam-components-client-page.mjs.map +1 -1
- package/fesm2022/masterteam-components-entities.mjs +7 -13
- package/fesm2022/masterteam-components-entities.mjs.map +1 -1
- package/fesm2022/masterteam-components-sidebar.mjs +2 -2
- package/fesm2022/masterteam-components-sidebar.mjs.map +1 -1
- package/fesm2022/masterteam-components-upload-field.mjs +3 -5
- package/fesm2022/masterteam-components-upload-field.mjs.map +1 -1
- package/fesm2022/masterteam-components.mjs.map +1 -1
- package/package.json +1 -1
- package/types/masterteam-components-client-page-menu.d.ts +9 -1
- package/types/masterteam-components-entities.d.ts +2 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, computed, Component, inject, ElementRef, NgZone, output, signal, Directive, model } from '@angular/core';
|
|
3
|
+
import { HttpContext } from '@angular/common/http';
|
|
3
4
|
import { Avatar } from '@masterteam/components/avatar';
|
|
4
5
|
import { Button } from '@masterteam/components/button';
|
|
5
6
|
import { SecureImagePipe, UploadField } from '@masterteam/components/upload-field';
|
|
7
|
+
import { REQUEST_CONTEXT } from '@masterteam/components';
|
|
6
8
|
import { Progress } from '@masterteam/components/progress';
|
|
7
9
|
import * as i1 from '@angular/forms';
|
|
8
10
|
import { FormsModule } from '@angular/forms';
|
|
@@ -112,6 +114,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
112
114
|
}], 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 }] }] } });
|
|
113
115
|
|
|
114
116
|
class EntityUser {
|
|
117
|
+
httpContext = new HttpContext().set(REQUEST_CONTEXT, {
|
|
118
|
+
useBaseUrl: true,
|
|
119
|
+
});
|
|
115
120
|
/** Full entity data object */
|
|
116
121
|
data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
|
|
117
122
|
/** Resolved user value object from data().value */
|
|
@@ -126,17 +131,6 @@ class EntityUser {
|
|
|
126
131
|
userName = computed(() => displayOrPlaceholder(this.rawUserName()), ...(ngDevMode ? [{ debugName: "userName" }] : []));
|
|
127
132
|
userPhoto = computed(() => this.userValue()?.photoUrl ?? '', ...(ngDevMode ? [{ debugName: "userPhoto" }] : []));
|
|
128
133
|
labelText = computed(() => '', ...(ngDevMode ? [{ debugName: "labelText" }] : []));
|
|
129
|
-
initials = computed(() => {
|
|
130
|
-
const rawName = this.rawUserName();
|
|
131
|
-
if (isValueMissing(rawName))
|
|
132
|
-
return '';
|
|
133
|
-
const name = String(rawName).trim();
|
|
134
|
-
const parts = name.split(/\s+/);
|
|
135
|
-
if (parts.length >= 2) {
|
|
136
|
-
return (parts[0][0] + parts[1][0]).toUpperCase();
|
|
137
|
-
}
|
|
138
|
-
return name.substring(0, 2).toUpperCase();
|
|
139
|
-
}, ...(ngDevMode ? [{ debugName: "initials" }] : []));
|
|
140
134
|
// ── Configuration-driven visibility ──
|
|
141
135
|
config = computed(() => this.data()?.configuration ?? {}, ...(ngDevMode ? [{ debugName: "config" }] : []));
|
|
142
136
|
showDisplayName = computed(() => this.config().showDisplayName ?? true, ...(ngDevMode ? [{ debugName: "showDisplayName" }] : []));
|
|
@@ -147,11 +141,11 @@ class EntityUser {
|
|
|
147
141
|
hasContactInfo = computed(() => (this.showPhoneNumber() && !!this.phoneNumber()) ||
|
|
148
142
|
(this.showEmail() && !!this.email()), ...(ngDevMode ? [{ debugName: "hasContactInfo" }] : []));
|
|
149
143
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityUser, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
150
|
-
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 } }, 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 :
|
|
144
|
+
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 } }, 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 : httpContext : 'avatar/')\r\n : ''\r\n \"\r\n [icon]=\"'user.user-01'\"\r\n styleClass=\"w-10! h-10! text-white! text-xl! 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 text-gray-700 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" }] });
|
|
151
145
|
}
|
|
152
146
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityUser, decorators: [{
|
|
153
147
|
type: Component,
|
|
154
|
-
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 :
|
|
148
|
+
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 : httpContext : 'avatar/')\r\n : ''\r\n \"\r\n [icon]=\"'user.user-01'\"\r\n styleClass=\"w-10! h-10! text-white! text-xl! 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 text-gray-700 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" }]
|
|
155
149
|
}], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
|
|
156
150
|
|
|
157
151
|
class EntityPercentage {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-entities.mjs","sources":["../../../../packages/masterteam/components/entities/entity-display.utils.ts","../../../../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-long-text/entity-long-text.ts","../../../../packages/masterteam/components/entities/entity-long-text/entity-long-text.html","../../../../packages/masterteam/components/entities/entity-lookup/entity-lookup.ts","../../../../packages/masterteam/components/entities/entity-lookup/entity-lookup.html","../../../../packages/masterteam/components/entities/entity-attachment/entity-attachment.ts","../../../../packages/masterteam/components/entities/entity-attachment/entity-attachment.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":["export const ENTITY_EMPTY_VALUE_PLACEHOLDER = '_';\n\nexport function isValueMissing(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n return false;\n}\n\nexport function displayOrPlaceholder(value: unknown): string {\n if (isValueMissing(value)) {\n return ENTITY_EMPTY_VALUE_PLACEHOLDER;\n }\n\n return String(value);\n}\n","import { Component, computed, input } from '@angular/core';\r\nimport { displayOrPlaceholder } from '../entity-display.utils';\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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { displayOrPlaceholder } from '../entity-display.utils';\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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n displayOrPlaceholder,\r\n ENTITY_EMPTY_VALUE_PLACEHOLDER,\r\n} from '../entity-display.utils';\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 readonly emptyLabel = ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n\r\n readonly statusLabel = computed(() =>\r\n displayOrPlaceholder(this.statusValue()?.display),\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 {{ statusLabel() }}\r\n </span>\r\n } @else {\r\n <span\r\n class=\"inline-flex items-center px-3 py-2 rounded-md text-xs font-semibold w-fit text-gray-500 bg-gray-100\"\r\n >\r\n {{ emptyLabel }}\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, EntityUserValue } from '../entity.model';\r\nimport { SecureImagePipe } from '@masterteam/components/upload-field';\r\nimport { displayOrPlaceholder, isValueMissing } from '../entity-display.utils';\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 /** Resolved user value object from data().value */\r\n private readonly userValue = computed(() => {\r\n const val = this.data()?.value;\r\n if (val && typeof val === 'object' && 'displayName' in val) {\r\n return val as EntityUserValue;\r\n }\r\n return null;\r\n });\r\n\r\n readonly rawUserName = computed(() => this.userValue()?.displayName ?? null);\r\n\r\n readonly userName = computed(() => displayOrPlaceholder(this.rawUserName()));\r\n\r\n readonly userPhoto = computed(() => this.userValue()?.photoUrl ?? '');\r\n\r\n readonly labelText = computed(() => '');\r\n\r\n readonly initials = computed(() => {\r\n const rawName = this.rawUserName();\r\n if (isValueMissing(rawName)) return '';\r\n\r\n const name = String(rawName).trim();\r\n const parts = name.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.userValue()?.phoneNumber ?? '');\r\n\r\n readonly email = computed(() => this.userValue()?.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-10! h-10! 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 text-gray-700 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 { displayOrPlaceholder, isValueMissing } from '../entity-display.utils';\r\nimport { EntityData } 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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n private readonly rawNumericValue = computed(\r\n () => this.data()?.rawValue ?? this.rawValue() ?? this.value(),\r\n );\r\n\r\n readonly hasNumericValue = computed(() => {\r\n const raw = this.rawNumericValue();\r\n if (isValueMissing(raw)) {\r\n return false;\r\n }\r\n\r\n return !Number.isNaN(parseFloat(String(raw)));\r\n });\r\n\r\n readonly numericValue = computed(() => {\r\n const raw = this.rawNumericValue();\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.rawNumericValue();\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 readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\r\n );\r\n}\r\n","<div class=\"flex flex-col gap-1\">\r\n <div class=\"flex items-center justify-between\">\r\n @if (!hideName()) {\r\n <span class=\"text-xs font-semibold\">{{ displayName() }}</span>\r\n }\r\n <span class=\"text-xs font-bold\" [class.ms-auto]=\"hideName()\">{{\r\n displayValue()\r\n }}</span>\r\n </div>\r\n @if (hasNumericValue()) {\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 } @else {\r\n <div class=\"h-[9px] rounded-full bg-gray-200\"></div>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { displayOrPlaceholder } from '../entity-display.utils';\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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { ENTITY_EMPTY_VALUE_PLACEHOLDER } from '../entity-display.utils';\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 readonly emptyLabel = ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\r\n );\r\n\r\n readonly checkboxState = computed<boolean | null>(() => {\r\n const raw = this.data()?.rawValue ?? this.rawValue();\r\n if (raw !== undefined && raw !== null) {\r\n return this.parseBoolean(raw);\r\n }\r\n\r\n const val = this.data()?.value ?? this.value();\r\n if (typeof val === 'string') {\r\n return this.parseBoolean(val);\r\n }\r\n\r\n return null;\r\n });\r\n\r\n private parseBoolean(value: string): boolean | null {\r\n const normalized = value.trim().toLowerCase();\r\n if (!normalized.length) {\r\n return null;\r\n }\r\n\r\n if (normalized === 'true') {\r\n return true;\r\n }\r\n\r\n if (normalized === 'false') {\r\n return false;\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","<div class=\"flex items-center gap-2\">\r\n @if (checkboxState() === true) {\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 if (checkboxState() === false) {\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 } @else {\r\n <span\r\n class=\"inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-gray-100 px-1 text-[10px] font-semibold text-gray-500\"\r\n >\r\n {{ emptyLabel }}\r\n </span>\r\n }\r\n @if (!hideName()) {\r\n <span class=\"text-sm font-semibold\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n ENTITY_EMPTY_VALUE_PLACEHOLDER,\r\n isValueMissing,\r\n} from '../entity-display.utils';\r\nimport { EntityData } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-long-text',\r\n standalone: true,\r\n templateUrl: './entity-long-text.html',\r\n})\r\nexport class EntityLongText {\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\r\n readonly displayValue = computed(() => {\r\n const d = this.data();\r\n const raw = d\r\n ? typeof d.value === 'string'\r\n ? d.value\r\n : null\r\n : this.value();\r\n\r\n if (isValueMissing(raw)) {\r\n return ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n }\r\n\r\n return raw as string;\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\r\n );\r\n}\r\n","<div class=\"flex flex-col gap-0.5\">\r\n <div class=\"text-sm font-semibold\" [innerHTML]=\"displayValue()\"></div>\r\n @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n displayOrPlaceholder,\r\n ENTITY_EMPTY_VALUE_PLACEHOLDER,\r\n} from '../entity-display.utils';\r\nimport { EntityData, EntityLookupValue } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-lookup',\r\n standalone: true,\r\n templateUrl: './entity-lookup.html',\r\n})\r\nexport class EntityLookup {\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<EntityLookupValue>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n\r\n readonly lookupValue = computed<EntityLookupValue | null>(() => {\r\n const d = this.data();\r\n if (d && typeof d.value === 'object' && d.value !== null) {\r\n return d.value as EntityLookupValue;\r\n }\r\n return this.value() ?? null;\r\n });\r\n\r\n readonly badgeStyle = computed(() => {\r\n const lookup = this.lookupValue();\r\n if (!lookup?.color) return {};\r\n return {\r\n color: lookup.color,\r\n backgroundColor: this.hexToRgba(lookup.color, 0.12),\r\n };\r\n });\r\n\r\n readonly emptyLabel = ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n\r\n readonly lookupLabel = computed(() =>\r\n displayOrPlaceholder(this.lookupValue()?.display),\r\n );\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 (lookupValue(); as lookup) {\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 {{ lookupLabel() }}\r\n </span>\r\n } @else {\r\n <span\r\n class=\"inline-flex items-center px-3 py-2 rounded-md text-xs font-semibold w-fit text-gray-500 bg-gray-100\"\r\n >\r\n {{ emptyLabel }}\r\n </span>\r\n }\r\n @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { UploadField } from '@masterteam/components/upload-field';\n\nimport {\n EntityAttachmentItemValue,\n EntityAttachmentValue,\n EntityData,\n} from '../entity.model';\n\n@Component({\n selector: 'mt-entity-attachment',\n standalone: true,\n imports: [FormsModule, UploadField],\n templateUrl: './entity-attachment.html',\n})\nexport class EntityAttachment {\n readonly data = input<EntityData>();\n readonly name = input<string>();\n readonly value = input<\n EntityAttachmentValue | EntityAttachmentItemValue | string | null\n >();\n\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\n readonly hideName = computed(\n () => this.data()?.configuration?.hideName ?? false,\n );\n\n readonly uploadValue = computed(() => {\n const value = this.data()?.value ?? this.value();\n\n if (Array.isArray(value)) {\n return value.filter((item) => item != null);\n }\n\n return value ?? null;\n });\n readonly hasAttachments = computed(() => {\n const value = this.uploadValue();\n return Array.isArray(value) ? value.length > 0 : !!value;\n });\n readonly isMultiple = computed(() => Array.isArray(this.uploadValue()));\n\n protected readonly empty = '-';\n}\n","<div class=\"flex w-full flex-col gap-2\">\n @if (!hideName()) {\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\n }\n\n @if (hasAttachments()) {\n <mt-upload-field\n class=\"w-full\"\n [ngModel]=\"uploadValue()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [shape]=\"'card'\"\n [multiple]=\"isMultiple()\"\n [readonly]=\"true\"\n />\n } @else {\n <span class=\"text-sm font-semibold\">{{ empty }}</span>\n }\n</div>\n","import { Component, input } from '@angular/core';\r\nimport { EntityData } from '../entity.model';\r\nimport { EntityText } from '../entity-text/entity-text';\r\nimport { EntityLongText } from '../entity-long-text/entity-long-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\nimport { EntityLookup } from '../entity-lookup/entity-lookup';\r\nimport { EntityAttachment } from '../entity-attachment/entity-attachment';\r\n\r\n@Component({\r\n selector: 'mt-entity-preview',\r\n standalone: true,\r\n imports: [\r\n EntityText,\r\n EntityLongText,\r\n EntityDate,\r\n EntityStatus,\r\n EntityUser,\r\n EntityPercentage,\r\n EntityCurrency,\r\n EntityCheckbox,\r\n EntityLookup,\r\n EntityAttachment,\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 (\"LongText\") {\r\n <mt-entity-long-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 @case (\"Lookup\") {\r\n <mt-entity-lookup [data]=\"data()\" />\r\n }\r\n @case (\"Attachment\") {\r\n <mt-entity-attachment [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-24) */\r\n getColSpan(entity: EntityData): string {\r\n const size: EntitySize = entity.configuration?.size ?? 8;\r\n return `span ${size}`;\r\n }\r\n}\r\n","<div class=\"grid grid-cols-24 gap-x-4 gap-y-7\">\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 24-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 ?? 8;\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 / 24;\r\n\r\n const previousSize: EntitySize = entity.configuration?.size ?? 8;\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(24, 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-24) */\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-24 gap-x-4 gap-y-7\"\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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"}
|
|
1
|
+
{"version":3,"file":"masterteam-components-entities.mjs","sources":["../../../../packages/masterteam/components/entities/entity-display.utils.ts","../../../../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-long-text/entity-long-text.ts","../../../../packages/masterteam/components/entities/entity-long-text/entity-long-text.html","../../../../packages/masterteam/components/entities/entity-lookup/entity-lookup.ts","../../../../packages/masterteam/components/entities/entity-lookup/entity-lookup.html","../../../../packages/masterteam/components/entities/entity-attachment/entity-attachment.ts","../../../../packages/masterteam/components/entities/entity-attachment/entity-attachment.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":["export const ENTITY_EMPTY_VALUE_PLACEHOLDER = '_';\n\nexport function isValueMissing(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n return false;\n}\n\nexport function displayOrPlaceholder(value: unknown): string {\n if (isValueMissing(value)) {\n return ENTITY_EMPTY_VALUE_PLACEHOLDER;\n }\n\n return String(value);\n}\n","import { Component, computed, input } from '@angular/core';\r\nimport { displayOrPlaceholder } from '../entity-display.utils';\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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { displayOrPlaceholder } from '../entity-display.utils';\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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n displayOrPlaceholder,\r\n ENTITY_EMPTY_VALUE_PLACEHOLDER,\r\n} from '../entity-display.utils';\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 readonly emptyLabel = ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n\r\n readonly statusLabel = computed(() =>\r\n displayOrPlaceholder(this.statusValue()?.display),\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 {{ statusLabel() }}\r\n </span>\r\n } @else {\r\n <span\r\n class=\"inline-flex items-center px-3 py-2 rounded-md text-xs font-semibold w-fit text-gray-500 bg-gray-100\"\r\n >\r\n {{ emptyLabel }}\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 { HttpContext } from '@angular/common/http';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { EntityData, EntityUserConfig, EntityUserValue } from '../entity.model';\r\nimport { SecureImagePipe } from '@masterteam/components/upload-field';\r\nimport { displayOrPlaceholder } from '../entity-display.utils';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\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 readonly httpContext = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: true,\r\n });\r\n\r\n /** Full entity data object */\r\n readonly data = input<EntityData>();\r\n\r\n /** Resolved user value object from data().value */\r\n private readonly userValue = computed(() => {\r\n const val = this.data()?.value;\r\n if (val && typeof val === 'object' && 'displayName' in val) {\r\n return val as EntityUserValue;\r\n }\r\n return null;\r\n });\r\n\r\n readonly rawUserName = computed(() => this.userValue()?.displayName ?? null);\r\n\r\n readonly userName = computed(() => displayOrPlaceholder(this.rawUserName()));\r\n\r\n readonly userPhoto = computed(() => this.userValue()?.photoUrl ?? '');\r\n\r\n readonly labelText = computed(() => '');\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.userValue()?.phoneNumber ?? '');\r\n\r\n readonly email = computed(() => this.userValue()?.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 : httpContext : 'avatar/')\r\n : ''\r\n \"\r\n [icon]=\"'user.user-01'\"\r\n styleClass=\"w-10! h-10! text-white! text-xl! 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 text-gray-700 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 { displayOrPlaceholder, isValueMissing } from '../entity-display.utils';\r\nimport { EntityData } 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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n private readonly rawNumericValue = computed(\r\n () => this.data()?.rawValue ?? this.rawValue() ?? this.value(),\r\n );\r\n\r\n readonly hasNumericValue = computed(() => {\r\n const raw = this.rawNumericValue();\r\n if (isValueMissing(raw)) {\r\n return false;\r\n }\r\n\r\n return !Number.isNaN(parseFloat(String(raw)));\r\n });\r\n\r\n readonly numericValue = computed(() => {\r\n const raw = this.rawNumericValue();\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.rawNumericValue();\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 readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\r\n );\r\n}\r\n","<div class=\"flex flex-col gap-1\">\r\n <div class=\"flex items-center justify-between\">\r\n @if (!hideName()) {\r\n <span class=\"text-xs font-semibold\">{{ displayName() }}</span>\r\n }\r\n <span class=\"text-xs font-bold\" [class.ms-auto]=\"hideName()\">{{\r\n displayValue()\r\n }}</span>\r\n </div>\r\n @if (hasNumericValue()) {\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 } @else {\r\n <div class=\"h-[9px] rounded-full bg-gray-200\"></div>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { displayOrPlaceholder } from '../entity-display.utils';\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 displayOrPlaceholder(typeof d.value === 'string' ? d.value : null);\r\n }\r\n return displayOrPlaceholder(this.value());\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { ENTITY_EMPTY_VALUE_PLACEHOLDER } from '../entity-display.utils';\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 readonly emptyLabel = ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\r\n );\r\n\r\n readonly checkboxState = computed<boolean | null>(() => {\r\n const raw = this.data()?.rawValue ?? this.rawValue();\r\n if (raw !== undefined && raw !== null) {\r\n return this.parseBoolean(raw);\r\n }\r\n\r\n const val = this.data()?.value ?? this.value();\r\n if (typeof val === 'string') {\r\n return this.parseBoolean(val);\r\n }\r\n\r\n return null;\r\n });\r\n\r\n private parseBoolean(value: string): boolean | null {\r\n const normalized = value.trim().toLowerCase();\r\n if (!normalized.length) {\r\n return null;\r\n }\r\n\r\n if (normalized === 'true') {\r\n return true;\r\n }\r\n\r\n if (normalized === 'false') {\r\n return false;\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","<div class=\"flex items-center gap-2\">\r\n @if (checkboxState() === true) {\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 if (checkboxState() === false) {\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 } @else {\r\n <span\r\n class=\"inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-gray-100 px-1 text-[10px] font-semibold text-gray-500\"\r\n >\r\n {{ emptyLabel }}\r\n </span>\r\n }\r\n @if (!hideName()) {\r\n <span class=\"text-sm font-semibold\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n ENTITY_EMPTY_VALUE_PLACEHOLDER,\r\n isValueMissing,\r\n} from '../entity-display.utils';\r\nimport { EntityData } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-long-text',\r\n standalone: true,\r\n templateUrl: './entity-long-text.html',\r\n})\r\nexport class EntityLongText {\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\r\n readonly displayValue = computed(() => {\r\n const d = this.data();\r\n const raw = d\r\n ? typeof d.value === 'string'\r\n ? d.value\r\n : null\r\n : this.value();\r\n\r\n if (isValueMissing(raw)) {\r\n return ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n }\r\n\r\n return raw as string;\r\n });\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\r\n );\r\n}\r\n","<div class=\"flex flex-col gap-0.5\">\r\n <div class=\"text-sm font-semibold\" [innerHTML]=\"displayValue()\"></div>\r\n @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n displayOrPlaceholder,\r\n ENTITY_EMPTY_VALUE_PLACEHOLDER,\r\n} from '../entity-display.utils';\r\nimport { EntityData, EntityLookupValue } from '../entity.model';\r\n\r\n@Component({\r\n selector: 'mt-entity-lookup',\r\n standalone: true,\r\n templateUrl: './entity-lookup.html',\r\n})\r\nexport class EntityLookup {\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<EntityLookupValue>();\r\n\r\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\r\n\r\n readonly lookupValue = computed<EntityLookupValue | null>(() => {\r\n const d = this.data();\r\n if (d && typeof d.value === 'object' && d.value !== null) {\r\n return d.value as EntityLookupValue;\r\n }\r\n return this.value() ?? null;\r\n });\r\n\r\n readonly badgeStyle = computed(() => {\r\n const lookup = this.lookupValue();\r\n if (!lookup?.color) return {};\r\n return {\r\n color: lookup.color,\r\n backgroundColor: this.hexToRgba(lookup.color, 0.12),\r\n };\r\n });\r\n\r\n readonly emptyLabel = ENTITY_EMPTY_VALUE_PLACEHOLDER;\r\n\r\n readonly lookupLabel = computed(() =>\r\n displayOrPlaceholder(this.lookupValue()?.display),\r\n );\r\n\r\n readonly hideName = computed(\r\n () => this.data()?.configuration?.hideName ?? false,\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 (lookupValue(); as lookup) {\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 {{ lookupLabel() }}\r\n </span>\r\n } @else {\r\n <span\r\n class=\"inline-flex items-center px-3 py-2 rounded-md text-xs font-semibold w-fit text-gray-500 bg-gray-100\"\r\n >\r\n {{ emptyLabel }}\r\n </span>\r\n }\r\n @if (!hideName()) {\r\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\r\n }\r\n</div>\r\n","import { Component, computed, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { UploadField } from '@masterteam/components/upload-field';\n\nimport {\n EntityAttachmentItemValue,\n EntityAttachmentValue,\n EntityData,\n} from '../entity.model';\n\n@Component({\n selector: 'mt-entity-attachment',\n standalone: true,\n imports: [FormsModule, UploadField],\n templateUrl: './entity-attachment.html',\n})\nexport class EntityAttachment {\n readonly data = input<EntityData>();\n readonly name = input<string>();\n readonly value = input<\n EntityAttachmentValue | EntityAttachmentItemValue | string | null\n >();\n\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\n readonly hideName = computed(\n () => this.data()?.configuration?.hideName ?? false,\n );\n\n readonly uploadValue = computed(() => {\n const value = this.data()?.value ?? this.value();\n\n if (Array.isArray(value)) {\n return value.filter((item) => item != null);\n }\n\n return value ?? null;\n });\n readonly hasAttachments = computed(() => {\n const value = this.uploadValue();\n return Array.isArray(value) ? value.length > 0 : !!value;\n });\n readonly isMultiple = computed(() => Array.isArray(this.uploadValue()));\n\n protected readonly empty = '-';\n}\n","<div class=\"flex w-full flex-col gap-2\">\n @if (!hideName()) {\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\n }\n\n @if (hasAttachments()) {\n <mt-upload-field\n class=\"w-full\"\n [ngModel]=\"uploadValue()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [shape]=\"'card'\"\n [multiple]=\"isMultiple()\"\n [readonly]=\"true\"\n />\n } @else {\n <span class=\"text-sm font-semibold\">{{ empty }}</span>\n }\n</div>\n","import { Component, input } from '@angular/core';\r\nimport { EntityData } from '../entity.model';\r\nimport { EntityText } from '../entity-text/entity-text';\r\nimport { EntityLongText } from '../entity-long-text/entity-long-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\nimport { EntityLookup } from '../entity-lookup/entity-lookup';\r\nimport { EntityAttachment } from '../entity-attachment/entity-attachment';\r\n\r\n@Component({\r\n selector: 'mt-entity-preview',\r\n standalone: true,\r\n imports: [\r\n EntityText,\r\n EntityLongText,\r\n EntityDate,\r\n EntityStatus,\r\n EntityUser,\r\n EntityPercentage,\r\n EntityCurrency,\r\n EntityCheckbox,\r\n EntityLookup,\r\n EntityAttachment,\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 (\"LongText\") {\r\n <mt-entity-long-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 @case (\"Lookup\") {\r\n <mt-entity-lookup [data]=\"data()\" />\r\n }\r\n @case (\"Attachment\") {\r\n <mt-entity-attachment [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-24) */\r\n getColSpan(entity: EntityData): string {\r\n const size: EntitySize = entity.configuration?.size ?? 8;\r\n return `span ${size}`;\r\n }\r\n}\r\n","<div class=\"grid grid-cols-24 gap-x-4 gap-y-7\">\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 24-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 ?? 8;\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 / 24;\r\n\r\n const previousSize: EntitySize = entity.configuration?.size ?? 8;\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(24, 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-24) */\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-24 gap-x-4 gap-y-7\"\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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"}
|
|
@@ -21,11 +21,11 @@ class Sidebar {
|
|
|
21
21
|
this.expandedChange.emit(this.expanded());
|
|
22
22
|
}
|
|
23
23
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Sidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: Sidebar, isStandalone: true, selector: "mt-sidebar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, logo: { classPropertyName: "logo", publicName: "logo", isSignal: true, isRequired: false, transformFunction: null }, logoLink: { classPropertyName: "logoLink", publicName: "logoLink", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subTitle: { classPropertyName: "subTitle", publicName: "subTitle", isSignal: true, isRequired: false, transformFunction: null }, bgColor: { classPropertyName: "bgColor", publicName: "bgColor", isSignal: true, isRequired: false, transformFunction: null }, bgImage: { classPropertyName: "bgImage", publicName: "bgImage", isSignal: true, isRequired: false, transformFunction: null }, bgRepeat: { classPropertyName: "bgRepeat", publicName: "bgRepeat", isSignal: true, isRequired: false, transformFunction: null }, iconsColor: { classPropertyName: "iconsColor", publicName: "iconsColor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, ngImport: i0, template: "<div\r\n class=\"flex
|
|
24
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: Sidebar, isStandalone: true, selector: "mt-sidebar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, logo: { classPropertyName: "logo", publicName: "logo", isSignal: true, isRequired: false, transformFunction: null }, logoLink: { classPropertyName: "logoLink", publicName: "logoLink", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subTitle: { classPropertyName: "subTitle", publicName: "subTitle", isSignal: true, isRequired: false, transformFunction: null }, bgColor: { classPropertyName: "bgColor", publicName: "bgColor", isSignal: true, isRequired: false, transformFunction: null }, bgImage: { classPropertyName: "bgImage", publicName: "bgImage", isSignal: true, isRequired: false, transformFunction: null }, bgRepeat: { classPropertyName: "bgRepeat", publicName: "bgRepeat", isSignal: true, isRequired: false, transformFunction: null }, iconsColor: { classPropertyName: "iconsColor", publicName: "iconsColor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, ngImport: i0, template: "<div\r\n class=\"flex h-full min-h-0 flex-col overflow-hidden border-e-1 border-surface-300 bg-surface-200 transition-all duration-400 ease-in-out dark:bg-surface-800\"\r\n [style.width]=\"expanded() ? '16rem' : '4rem'\"\r\n>\r\n <div\r\n class=\"flex h-full min-h-0 flex-col gap-3 px-2 py-4\"\r\n [style.backgroundColor]=\"bgColor()\"\r\n [style.backgroundImage]=\"bgImage() ? 'url(' + bgImage() + ')' : null\"\r\n [class.bg-no-repeat]=\"!bgRepeat()\"\r\n [class.bg-repeat-y]=\"bgRepeat()\"\r\n >\r\n <!-- Toggle Button & Branding -->\r\n <div class=\"flex shrink-0 items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n size=\"large\"\r\n class=\"flex items-center justify-center w-[47px] h-[40px] hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors rounded-xl cursor-pointer shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n (click)=\"toggleSidebar()\"\r\n >\r\n <mt-icon\r\n icon=\"general.menu-01\"\r\n class=\"text-lg transition-transform duration-400 ease-in-out\"\r\n [class.rotate-180]=\"expanded()\"\r\n />\r\n </button>\r\n\r\n @if (logo() || title()) {\r\n <div\r\n class=\"flex items-center gap-2 overflow-hidden transition-all duration-400 ease-in-out\"\r\n [class.max-w-0]=\"!expanded()\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n @if (logo()) {\r\n <img\r\n [src]=\"logo()\"\r\n alt=\"Logo\"\r\n class=\"h-8 shrink-0\"\r\n [routerLink]=\"logoLink()\"\r\n [class.cursor-pointer]=\"logoLink()\"\r\n />\r\n }\r\n @if (logo() && (title() || subTitle())) {\r\n <div\r\n class=\"h-6 w-[1px] bg-current opacity-30 shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n ></div>\r\n }\r\n @if (title() || subTitle()) {\r\n <div\r\n class=\"flex flex-col gap-0.5 min-w-0\"\r\n [style.color]=\"iconsColor()\"\r\n >\r\n <span class=\"text-sm font-semibold truncate\">{{ title() }}</span>\r\n @if (subTitle()) {\r\n <span class=\"text-xs opacity-70 truncate\">{{\r\n subTitle()\r\n }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"mt-sidebar-menu flex min-h-0 flex-1 flex-col gap-1 overflow-x-hidden overflow-y-auto overscroll-contain\"\r\n [class.mt-sidebar-menu-collapsed]=\"!expanded()\"\r\n [class.pr-1]=\"expanded()\"\r\n [class.pr-px]=\"!expanded()\"\r\n >\r\n @for (item of items(); track item.id) {\r\n <a\r\n [routerLink]=\"item.routerLink\"\r\n routerLinkActive=\"bg-primary-50 dark:bg-primary-900\"\r\n #rla=\"routerLinkActive\"\r\n class=\"flex items-center gap-3 h-[47px] min-w-[47px] shrink-0 dark:hover:bg-surface-900 hover:bg-primary-50 transition-colors rounded-xl overflow-hidden\"\r\n mtTooltip=\"{{ item.title }}\"\r\n [style.color]=\"rla.isActive ? 'var(--p-primary-500)' : iconsColor()\"\r\n >\r\n <div class=\"px-4\">\r\n <mt-icon [icon]=\"item.icon\" class=\"shrink-0\" />\r\n </div>\r\n <div\r\n class=\"whitespace-nowrap text-sm font-medium transition-all duration-400 ease-in-out overflow-hidden\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n {{ item.title }}\r\n </div>\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.mt-sidebar-menu{scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-sidebar-menu::-webkit-scrollbar{width:6px}.mt-sidebar-menu::-webkit-scrollbar-track{background:transparent}.mt-sidebar-menu::-webkit-scrollbar-thumb{border-radius:9999px;background:color-mix(in srgb,var(--p-surface-500) 58%,transparent)}.mt-sidebar-menu::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 72%,transparent)}.mt-sidebar-menu-collapsed{scrollbar-color:var(--p-surface-500) transparent}.mt-sidebar-menu-collapsed::-webkit-scrollbar{width:2px}.mt-sidebar-menu-collapsed::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-600) 82%,transparent)}\n"], dependencies: [{ kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "directive", type: Tooltip, selector: "[mtTooltip]" }] });
|
|
25
25
|
}
|
|
26
26
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Sidebar, decorators: [{
|
|
27
27
|
type: Component,
|
|
28
|
-
args: [{ selector: 'mt-sidebar', standalone: true, imports: [RouterLinkActive, RouterLink, Icon, Tooltip], template: "<div\r\n class=\"flex
|
|
28
|
+
args: [{ selector: 'mt-sidebar', standalone: true, imports: [RouterLinkActive, RouterLink, Icon, Tooltip], template: "<div\r\n class=\"flex h-full min-h-0 flex-col overflow-hidden border-e-1 border-surface-300 bg-surface-200 transition-all duration-400 ease-in-out dark:bg-surface-800\"\r\n [style.width]=\"expanded() ? '16rem' : '4rem'\"\r\n>\r\n <div\r\n class=\"flex h-full min-h-0 flex-col gap-3 px-2 py-4\"\r\n [style.backgroundColor]=\"bgColor()\"\r\n [style.backgroundImage]=\"bgImage() ? 'url(' + bgImage() + ')' : null\"\r\n [class.bg-no-repeat]=\"!bgRepeat()\"\r\n [class.bg-repeat-y]=\"bgRepeat()\"\r\n >\r\n <!-- Toggle Button & Branding -->\r\n <div class=\"flex shrink-0 items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n size=\"large\"\r\n class=\"flex items-center justify-center w-[47px] h-[40px] hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors rounded-xl cursor-pointer shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n (click)=\"toggleSidebar()\"\r\n >\r\n <mt-icon\r\n icon=\"general.menu-01\"\r\n class=\"text-lg transition-transform duration-400 ease-in-out\"\r\n [class.rotate-180]=\"expanded()\"\r\n />\r\n </button>\r\n\r\n @if (logo() || title()) {\r\n <div\r\n class=\"flex items-center gap-2 overflow-hidden transition-all duration-400 ease-in-out\"\r\n [class.max-w-0]=\"!expanded()\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n @if (logo()) {\r\n <img\r\n [src]=\"logo()\"\r\n alt=\"Logo\"\r\n class=\"h-8 shrink-0\"\r\n [routerLink]=\"logoLink()\"\r\n [class.cursor-pointer]=\"logoLink()\"\r\n />\r\n }\r\n @if (logo() && (title() || subTitle())) {\r\n <div\r\n class=\"h-6 w-[1px] bg-current opacity-30 shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n ></div>\r\n }\r\n @if (title() || subTitle()) {\r\n <div\r\n class=\"flex flex-col gap-0.5 min-w-0\"\r\n [style.color]=\"iconsColor()\"\r\n >\r\n <span class=\"text-sm font-semibold truncate\">{{ title() }}</span>\r\n @if (subTitle()) {\r\n <span class=\"text-xs opacity-70 truncate\">{{\r\n subTitle()\r\n }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"mt-sidebar-menu flex min-h-0 flex-1 flex-col gap-1 overflow-x-hidden overflow-y-auto overscroll-contain\"\r\n [class.mt-sidebar-menu-collapsed]=\"!expanded()\"\r\n [class.pr-1]=\"expanded()\"\r\n [class.pr-px]=\"!expanded()\"\r\n >\r\n @for (item of items(); track item.id) {\r\n <a\r\n [routerLink]=\"item.routerLink\"\r\n routerLinkActive=\"bg-primary-50 dark:bg-primary-900\"\r\n #rla=\"routerLinkActive\"\r\n class=\"flex items-center gap-3 h-[47px] min-w-[47px] shrink-0 dark:hover:bg-surface-900 hover:bg-primary-50 transition-colors rounded-xl overflow-hidden\"\r\n mtTooltip=\"{{ item.title }}\"\r\n [style.color]=\"rla.isActive ? 'var(--p-primary-500)' : iconsColor()\"\r\n >\r\n <div class=\"px-4\">\r\n <mt-icon [icon]=\"item.icon\" class=\"shrink-0\" />\r\n </div>\r\n <div\r\n class=\"whitespace-nowrap text-sm font-medium transition-all duration-400 ease-in-out overflow-hidden\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n {{ item.title }}\r\n </div>\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.mt-sidebar-menu{scrollbar-width:thin;scrollbar-color:var(--p-surface-400) transparent}.mt-sidebar-menu::-webkit-scrollbar{width:6px}.mt-sidebar-menu::-webkit-scrollbar-track{background:transparent}.mt-sidebar-menu::-webkit-scrollbar-thumb{border-radius:9999px;background:color-mix(in srgb,var(--p-surface-500) 58%,transparent)}.mt-sidebar-menu::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p-surface-600) 72%,transparent)}.mt-sidebar-menu-collapsed{scrollbar-color:var(--p-surface-500) transparent}.mt-sidebar-menu-collapsed::-webkit-scrollbar{width:2px}.mt-sidebar-menu-collapsed::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p-surface-600) 82%,transparent)}\n"] }]
|
|
29
29
|
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], logo: [{ type: i0.Input, args: [{ isSignal: true, alias: "logo", required: false }] }], logoLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "logoLink", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subTitle", required: false }] }], bgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgColor", required: false }] }], bgImage: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgImage", required: false }] }], bgRepeat: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgRepeat", required: false }] }], iconsColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconsColor", required: false }] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }] } });
|
|
30
30
|
|
|
31
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-sidebar.mjs","sources":["../../../../packages/masterteam/components/sidebar/sidebar.ts","../../../../packages/masterteam/components/sidebar/sidebar.html","../../../../packages/masterteam/components/sidebar/masterteam-components-sidebar.ts"],"sourcesContent":["import {\r\n booleanAttribute,\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { Icon, MTIcon } from '@masterteam/icons';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\n\r\nexport interface SidebarItem {\r\n id: string | number;\r\n title: string;\r\n icon?: MTIcon;\r\n routerLink?: any[] | string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-sidebar',\r\n standalone: true,\r\n imports: [RouterLinkActive, RouterLink, Icon, Tooltip],\r\n templateUrl: './sidebar.html',\r\n})\r\nexport class Sidebar {\r\n items = input<SidebarItem[]>([]);\r\n\r\n logo = input<string>();\r\n logoLink = input<string | any[]>();\r\n title = input<string>();\r\n subTitle = input<string>();\r\n\r\n bgColor = input<string>();\r\n bgImage = input<string>();\r\n bgRepeat = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n iconsColor = input<string>('var(--p-text-color)');\r\n\r\n expanded = signal(false);\r\n expandedChange = output<boolean>();\r\n\r\n toggleSidebar(): void {\r\n this.expanded.update((v) => !v);\r\n this.expandedChange.emit(this.expanded());\r\n }\r\n}\r\n","<div\r\n class=\"flex
|
|
1
|
+
{"version":3,"file":"masterteam-components-sidebar.mjs","sources":["../../../../packages/masterteam/components/sidebar/sidebar.ts","../../../../packages/masterteam/components/sidebar/sidebar.html","../../../../packages/masterteam/components/sidebar/masterteam-components-sidebar.ts"],"sourcesContent":["import {\r\n booleanAttribute,\r\n Component,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { Icon, MTIcon } from '@masterteam/icons';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\n\r\nexport interface SidebarItem {\r\n id: string | number;\r\n title: string;\r\n icon?: MTIcon;\r\n routerLink?: any[] | string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-sidebar',\r\n standalone: true,\r\n imports: [RouterLinkActive, RouterLink, Icon, Tooltip],\r\n templateUrl: './sidebar.html',\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n height: 100%;\r\n min-height: 0;\r\n }\r\n\r\n .mt-sidebar-menu {\r\n scrollbar-width: thin;\r\n scrollbar-color: var(--p-surface-400) transparent;\r\n }\r\n\r\n .mt-sidebar-menu::-webkit-scrollbar {\r\n width: 6px;\r\n }\r\n\r\n .mt-sidebar-menu::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n\r\n .mt-sidebar-menu::-webkit-scrollbar-thumb {\r\n border-radius: 9999px;\r\n background: color-mix(in srgb, var(--p-surface-500) 58%, transparent);\r\n }\r\n\r\n .mt-sidebar-menu::-webkit-scrollbar-thumb:hover {\r\n background: color-mix(in srgb, var(--p-surface-600) 72%, transparent);\r\n }\r\n\r\n .mt-sidebar-menu-collapsed {\r\n scrollbar-color: var(--p-surface-500) transparent;\r\n }\r\n\r\n .mt-sidebar-menu-collapsed::-webkit-scrollbar {\r\n width: 2px;\r\n }\r\n\r\n .mt-sidebar-menu-collapsed::-webkit-scrollbar-thumb {\r\n background: color-mix(in srgb, var(--p-surface-600) 82%, transparent);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class Sidebar {\r\n items = input<SidebarItem[]>([]);\r\n\r\n logo = input<string>();\r\n logoLink = input<string | any[]>();\r\n title = input<string>();\r\n subTitle = input<string>();\r\n\r\n bgColor = input<string>();\r\n bgImage = input<string>();\r\n bgRepeat = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n iconsColor = input<string>('var(--p-text-color)');\r\n\r\n expanded = signal(false);\r\n expandedChange = output<boolean>();\r\n\r\n toggleSidebar(): void {\r\n this.expanded.update((v) => !v);\r\n this.expandedChange.emit(this.expanded());\r\n }\r\n}\r\n","<div\r\n class=\"flex h-full min-h-0 flex-col overflow-hidden border-e-1 border-surface-300 bg-surface-200 transition-all duration-400 ease-in-out dark:bg-surface-800\"\r\n [style.width]=\"expanded() ? '16rem' : '4rem'\"\r\n>\r\n <div\r\n class=\"flex h-full min-h-0 flex-col gap-3 px-2 py-4\"\r\n [style.backgroundColor]=\"bgColor()\"\r\n [style.backgroundImage]=\"bgImage() ? 'url(' + bgImage() + ')' : null\"\r\n [class.bg-no-repeat]=\"!bgRepeat()\"\r\n [class.bg-repeat-y]=\"bgRepeat()\"\r\n >\r\n <!-- Toggle Button & Branding -->\r\n <div class=\"flex shrink-0 items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n size=\"large\"\r\n class=\"flex items-center justify-center w-[47px] h-[40px] hover:bg-surface-100 dark:hover:bg-surface-900 transition-colors rounded-xl cursor-pointer shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n (click)=\"toggleSidebar()\"\r\n >\r\n <mt-icon\r\n icon=\"general.menu-01\"\r\n class=\"text-lg transition-transform duration-400 ease-in-out\"\r\n [class.rotate-180]=\"expanded()\"\r\n />\r\n </button>\r\n\r\n @if (logo() || title()) {\r\n <div\r\n class=\"flex items-center gap-2 overflow-hidden transition-all duration-400 ease-in-out\"\r\n [class.max-w-0]=\"!expanded()\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n @if (logo()) {\r\n <img\r\n [src]=\"logo()\"\r\n alt=\"Logo\"\r\n class=\"h-8 shrink-0\"\r\n [routerLink]=\"logoLink()\"\r\n [class.cursor-pointer]=\"logoLink()\"\r\n />\r\n }\r\n @if (logo() && (title() || subTitle())) {\r\n <div\r\n class=\"h-6 w-[1px] bg-current opacity-30 shrink-0\"\r\n [style.color]=\"iconsColor()\"\r\n ></div>\r\n }\r\n @if (title() || subTitle()) {\r\n <div\r\n class=\"flex flex-col gap-0.5 min-w-0\"\r\n [style.color]=\"iconsColor()\"\r\n >\r\n <span class=\"text-sm font-semibold truncate\">{{ title() }}</span>\r\n @if (subTitle()) {\r\n <span class=\"text-xs opacity-70 truncate\">{{\r\n subTitle()\r\n }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"mt-sidebar-menu flex min-h-0 flex-1 flex-col gap-1 overflow-x-hidden overflow-y-auto overscroll-contain\"\r\n [class.mt-sidebar-menu-collapsed]=\"!expanded()\"\r\n [class.pr-1]=\"expanded()\"\r\n [class.pr-px]=\"!expanded()\"\r\n >\r\n @for (item of items(); track item.id) {\r\n <a\r\n [routerLink]=\"item.routerLink\"\r\n routerLinkActive=\"bg-primary-50 dark:bg-primary-900\"\r\n #rla=\"routerLinkActive\"\r\n class=\"flex items-center gap-3 h-[47px] min-w-[47px] shrink-0 dark:hover:bg-surface-900 hover:bg-primary-50 transition-colors rounded-xl overflow-hidden\"\r\n mtTooltip=\"{{ item.title }}\"\r\n [style.color]=\"rla.isActive ? 'var(--p-primary-500)' : iconsColor()\"\r\n >\r\n <div class=\"px-4\">\r\n <mt-icon [icon]=\"item.icon\" class=\"shrink-0\" />\r\n </div>\r\n <div\r\n class=\"whitespace-nowrap text-sm font-medium transition-all duration-400 ease-in-out overflow-hidden\"\r\n [class.opacity-0]=\"!expanded()\"\r\n [class.max-w-xs]=\"expanded()\"\r\n [class.opacity-100]=\"expanded()\"\r\n >\r\n {{ item.title }}\r\n </div>\r\n </a>\r\n }\r\n </div>\r\n </div>\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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"}
|
|
@@ -421,7 +421,7 @@ class UploadField {
|
|
|
421
421
|
.map((fileId) => fileId.trim())
|
|
422
422
|
.filter((fileId) => fileId.length > 0);
|
|
423
423
|
if (!normalizedIds.length) {
|
|
424
|
-
this.value.set(forceArray ? existingFiles : existingFiles[0] ?? null);
|
|
424
|
+
this.value.set(forceArray ? existingFiles : (existingFiles[0] ?? null));
|
|
425
425
|
return;
|
|
426
426
|
}
|
|
427
427
|
this.loading.set(true);
|
|
@@ -444,7 +444,7 @@ class UploadField {
|
|
|
444
444
|
const resolvedFiles = [...existingFiles, ...files];
|
|
445
445
|
const resolvedValue = forceArray || this.multiple() || resolvedFiles.length > 1
|
|
446
446
|
? resolvedFiles
|
|
447
|
-
: resolvedFiles[0] ?? null;
|
|
447
|
+
: (resolvedFiles[0] ?? null);
|
|
448
448
|
this.value.set(resolvedValue);
|
|
449
449
|
});
|
|
450
450
|
}
|
|
@@ -469,9 +469,7 @@ function isSameFile(source, target) {
|
|
|
469
469
|
}
|
|
470
470
|
return (source === target ||
|
|
471
471
|
(source.id && target.id && source.id === target.id) ||
|
|
472
|
-
(source.fileName &&
|
|
473
|
-
target.fileName &&
|
|
474
|
-
source.fileName === target.fileName));
|
|
472
|
+
(source.fileName && target.fileName && source.fileName === target.fileName));
|
|
475
473
|
}
|
|
476
474
|
|
|
477
475
|
/**
|