@masterteam/components 0.0.97 → 0.0.98
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/fesm2022/masterteam-components-entities.mjs +46 -4
- package/fesm2022/masterteam-components-entities.mjs.map +1 -1
- package/fesm2022/masterteam-components-upload-field.mjs +2 -2
- package/fesm2022/masterteam-components-upload-field.mjs.map +1 -1
- package/package.json +2 -2
- package/types/masterteam-components-entities.d.ts +27 -4
|
@@ -2,8 +2,10 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { input, computed, Component, inject, ElementRef, NgZone, output, signal, Directive, model } from '@angular/core';
|
|
3
3
|
import { Avatar } from '@masterteam/components/avatar';
|
|
4
4
|
import { Button } from '@masterteam/components/button';
|
|
5
|
-
import { SecureImagePipe } from '@masterteam/components/upload-field';
|
|
5
|
+
import { SecureImagePipe, UploadField } from '@masterteam/components/upload-field';
|
|
6
6
|
import { Progress } from '@masterteam/components/progress';
|
|
7
|
+
import * as i1 from '@angular/forms';
|
|
8
|
+
import { FormsModule } from '@angular/forms';
|
|
7
9
|
import { CdkDrag, CdkDropList, CdkDragPlaceholder } from '@angular/cdk/drag-drop';
|
|
8
10
|
import { DOCUMENT } from '@angular/common';
|
|
9
11
|
|
|
@@ -330,11 +332,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
330
332
|
args: [{ selector: 'mt-entity-lookup', standalone: true, template: "<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" }]
|
|
331
333
|
}], 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 }] }] } });
|
|
332
334
|
|
|
335
|
+
class EntityAttachment {
|
|
336
|
+
data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : []));
|
|
337
|
+
name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
|
|
338
|
+
value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
|
|
339
|
+
displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : []));
|
|
340
|
+
hideName = computed(() => this.data()?.configuration?.hideName ?? false, ...(ngDevMode ? [{ debugName: "hideName" }] : []));
|
|
341
|
+
attachments = computed(() => {
|
|
342
|
+
const value = this.data()?.value ?? this.value();
|
|
343
|
+
if (Array.isArray(value)) {
|
|
344
|
+
return value.filter((item) => {
|
|
345
|
+
return !!item && typeof item === 'object';
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
if (value && typeof value === 'object') {
|
|
349
|
+
return [value];
|
|
350
|
+
}
|
|
351
|
+
return [];
|
|
352
|
+
}, ...(ngDevMode ? [{ debugName: "attachments" }] : []));
|
|
353
|
+
empty = '-';
|
|
354
|
+
toUploadValue(attachment) {
|
|
355
|
+
if (attachment.contentType || attachment.extension) {
|
|
356
|
+
return attachment;
|
|
357
|
+
}
|
|
358
|
+
return attachment.fileName || attachment.id || attachment.name || null;
|
|
359
|
+
}
|
|
360
|
+
trackAttachment(index, attachment) {
|
|
361
|
+
return (attachment.fileName ||
|
|
362
|
+
attachment.id ||
|
|
363
|
+
attachment.name ||
|
|
364
|
+
`attachment-${index}`);
|
|
365
|
+
}
|
|
366
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityAttachment, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
367
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityAttachment, isStandalone: true, selector: "mt-entity-attachment", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex w-full flex-col gap-2\">\n @if (!hideName()) {\n <span class=\"text-sm text-gray-500\">{{ displayName() }}</span>\n }\n\n @if (attachments().length) {\n <div class=\"grid gap-2\">\n @for (attachment of attachments(); track trackAttachment($index, attachment)) {\n <mt-upload-field\n class=\"w-full\"\n [ngModel]=\"toUploadValue(attachment)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [shape]=\"'card'\"\n [readonly]=\"true\"\n />\n }\n </div>\n } @else {\n <span class=\"text-sm font-semibold\">{{ empty }}</span>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: UploadField, selector: "mt-upload-field", inputs: ["label", "title", "description", "endPoint", "size", "userImgClass", "shape", "accept", "isDragging", "fileSizeLimit", "readonly", "context"], outputs: ["isDraggingChange", "onChange"] }] });
|
|
368
|
+
}
|
|
369
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityAttachment, decorators: [{
|
|
370
|
+
type: Component,
|
|
371
|
+
args: [{ selector: 'mt-entity-attachment', standalone: true, imports: [FormsModule, UploadField], template: "<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 (attachments().length) {\n <div class=\"grid gap-2\">\n @for (attachment of attachments(); track trackAttachment($index, attachment)) {\n <mt-upload-field\n class=\"w-full\"\n [ngModel]=\"toUploadValue(attachment)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [shape]=\"'card'\"\n [readonly]=\"true\"\n />\n }\n </div>\n } @else {\n <span class=\"text-sm font-semibold\">{{ empty }}</span>\n }\n</div>\n" }]
|
|
372
|
+
}], 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 }] }] } });
|
|
373
|
+
|
|
333
374
|
class EntityPreview {
|
|
334
375
|
/** Single entity data to display */
|
|
335
376
|
data = input.required(...(ngDevMode ? [{ debugName: "data" }] : []));
|
|
336
377
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityPreview, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
337
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityPreview, isStandalone: true, selector: "mt-entity-preview", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "w-full" }, ngImport: i0, template: "@switch (data().viewType) {\r\n
|
|
378
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: EntityPreview, isStandalone: true, selector: "mt-entity-preview", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "w-full" }, ngImport: i0, template: "@switch (data().viewType) {\r\n@case (\"Text\") {\r\n<mt-entity-text [data]=\"data()\" />\r\n}\r\n@case (\"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\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", dependencies: [{ kind: "component", type: EntityText, selector: "mt-entity-text", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityLongText, selector: "mt-entity-long-text", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityDate, selector: "mt-entity-date", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityStatus, selector: "mt-entity-status", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityUser, selector: "mt-entity-user", inputs: ["data"] }, { kind: "component", type: EntityPercentage, selector: "mt-entity-percentage", inputs: ["data", "name", "value", "rawValue"] }, { kind: "component", type: EntityCurrency, selector: "mt-entity-currency", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityCheckbox, selector: "mt-entity-checkbox", inputs: ["data", "name", "value", "rawValue"] }, { kind: "component", type: EntityLookup, selector: "mt-entity-lookup", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityAttachment, selector: "mt-entity-attachment", inputs: ["data", "name", "value"] }] });
|
|
338
379
|
}
|
|
339
380
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: EntityPreview, decorators: [{
|
|
340
381
|
type: Component,
|
|
@@ -348,9 +389,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
348
389
|
EntityCurrency,
|
|
349
390
|
EntityCheckbox,
|
|
350
391
|
EntityLookup,
|
|
392
|
+
EntityAttachment,
|
|
351
393
|
], host: {
|
|
352
394
|
class: 'w-full',
|
|
353
|
-
}, template: "@switch (data().viewType) {\r\n
|
|
395
|
+
}, template: "@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\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" }]
|
|
354
396
|
}], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
|
|
355
397
|
|
|
356
398
|
class EntitiesPreview {
|
|
@@ -544,5 +586,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
544
586
|
* Generated bundle index. Do not edit.
|
|
545
587
|
*/
|
|
546
588
|
|
|
547
|
-
export { EntitiesManage, EntitiesPreview, EntitiesResizeBase, EntityCheckbox, EntityCurrency, EntityDate, EntityLongText, EntityLookup, EntityPercentage, EntityPreview, EntityStatus, EntityText, EntityUser };
|
|
589
|
+
export { EntitiesManage, EntitiesPreview, EntitiesResizeBase, EntityAttachment, EntityCheckbox, EntityCurrency, EntityDate, EntityLongText, EntityLookup, EntityPercentage, EntityPreview, EntityStatus, EntityText, EntityUser };
|
|
548
590
|
//# sourceMappingURL=masterteam-components-entities.mjs.map
|
|
@@ -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-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, 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\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 ],\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 @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 { 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<EntityAttachmentValue | EntityAttachmentItemValue>();\n\n readonly displayName = computed(() => this.data()?.name ?? this.name() ?? '');\n readonly hideName = computed(\n () => this.data()?.configuration?.hideName ?? false,\n );\n\n readonly attachments = computed(() => {\n const value = this.data()?.value ?? this.value();\n\n if (Array.isArray(value)) {\n return value.filter((item): item is EntityAttachmentItemValue => {\n return !!item && typeof item === 'object';\n });\n }\n\n if (value && typeof value === 'object') {\n return [value as EntityAttachmentItemValue];\n }\n\n return [];\n });\n\n protected readonly empty = '-';\n\n protected toUploadValue(attachment: EntityAttachmentItemValue): unknown {\n if (attachment.contentType || attachment.extension) {\n return attachment;\n }\n\n return attachment.fileName || attachment.id || attachment.name || null;\n }\n\n protected trackAttachment(\n index: number,\n attachment: EntityAttachmentItemValue,\n ): string {\n return (\n attachment.fileName ||\n attachment.id ||\n attachment.name ||\n `attachment-${index}`\n );\n }\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 (attachments().length) {\n <div class=\"grid gap-2\">\n @for (attachment of attachments(); track trackAttachment($index, attachment)) {\n <mt-upload-field\n class=\"w-full\"\n [ngModel]=\"toUploadValue(attachment)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [shape]=\"'card'\"\n [readonly]=\"true\"\n />\n }\n </div>\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';\nimport { EntityCurrency } from '../entity-currency/entity-currency';\nimport { EntityCheckbox } from '../entity-checkbox/entity-checkbox';\nimport { EntityLookup } from '../entity-lookup/entity-lookup';\nimport { EntityAttachment } from '../entity-attachment/entity-attachment';\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,\n EntityCheckbox,\n EntityLookup,\n EntityAttachment,\n ],\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\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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"}
|
|
@@ -145,11 +145,11 @@ class UploadFilePreview {
|
|
|
145
145
|
}
|
|
146
146
|
}, ...(ngDevMode ? [{ debugName: "defaultIcon" }] : []));
|
|
147
147
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: UploadFilePreview, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
148
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: UploadFilePreview, isStandalone: true, selector: "mt-upload-file-preview", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, imgPath: { classPropertyName: "imgPath", publicName: "imgPath", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, uploadProgress: { classPropertyName: "uploadProgress", publicName: "uploadProgress", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onUploadInputClicked: "onUploadInputClicked", ondDownloadFile: "ondDownloadFile", onDeleteFile: "onDeleteFile", disabled: "disabledChange" }, ngImport: i0, template: "<div class=\"flex items-center justify-between gap-2 w-full p-2 overflow-hidden\">\r\n <div class=\"flex gap-2 items-center flex-1 min-w-0 overflow-hidden\">\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [shape]=\"'square'\"\r\n [image]=\"\r\n isImag() && imgPath() ? (imgPath() | secureImage: context()) : ''\r\n \"\r\n [icon]=\"defaultIcon()\"\r\n styleClass=\"text-2xl!\"\r\n >\r\n </mt-avatar>\r\n\r\n <span class=\"truncate\" [mtTooltip]=\"value().name\" tooltipPosition=\"top\">\r\n {{ value().name }}\r\n </span>\r\n </div>\
|
|
148
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: UploadFilePreview, isStandalone: true, selector: "mt-upload-file-preview", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, imgPath: { classPropertyName: "imgPath", publicName: "imgPath", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, uploadProgress: { classPropertyName: "uploadProgress", publicName: "uploadProgress", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onUploadInputClicked: "onUploadInputClicked", ondDownloadFile: "ondDownloadFile", onDeleteFile: "onDeleteFile", disabled: "disabledChange" }, ngImport: i0, template: "<div class=\"flex items-center justify-between gap-2 w-full p-2 overflow-hidden\">\r\n <div class=\"flex gap-2 items-center flex-1 min-w-0 overflow-hidden\">\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [shape]=\"'square'\"\r\n [image]=\"\r\n isImag() && imgPath() ? (imgPath() | secureImage: context()) : ''\r\n \"\r\n [icon]=\"defaultIcon()\"\r\n styleClass=\"text-2xl!\"\r\n >\r\n </mt-avatar>\r\n\r\n <span class=\"truncate\" [mtTooltip]=\"value().name\" tooltipPosition=\"top\">\r\n {{ value().name }}\r\n </span>\r\n </div>\n <div class=\"flex items-center justify-center shrink-0\">\n @if (!!value() && !loading() && (!disabled() || readonly())) {\n <mt-button\n variant=\"text\"\n icon=\"general.download-01\"\n [tooltip]=\"'components.upload.download' | transloco\"\n (onClick)=\"ondDownloadFile.emit(value())\"\n (click)=\"$event.stopPropagation()\"\n >\n </mt-button>\n }\n @if (!disabled() && !readonly() && !!value() && !loading()) {\n <mt-button\n variant=\"text\"\n icon=\"general.trash-01\"\n [tooltip]=\"'components.upload.delete' | transloco\"\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ 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: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: Tooltip, selector: "[mtTooltip]" }, { kind: "pipe", type: SecureImagePipe, name: "secureImage" }, { kind: "pipe", type: i1.TranslocoPipe, name: "transloco" }] });
|
|
149
149
|
}
|
|
150
150
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: UploadFilePreview, decorators: [{
|
|
151
151
|
type: Component,
|
|
152
|
-
args: [{ selector: 'mt-upload-file-preview', standalone: true, imports: [SecureImagePipe, Button, Avatar, TranslocoModule, Tooltip], template: "<div class=\"flex items-center justify-between gap-2 w-full p-2 overflow-hidden\">\r\n <div class=\"flex gap-2 items-center flex-1 min-w-0 overflow-hidden\">\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [shape]=\"'square'\"\r\n [image]=\"\r\n isImag() && imgPath() ? (imgPath() | secureImage: context()) : ''\r\n \"\r\n [icon]=\"defaultIcon()\"\r\n styleClass=\"text-2xl!\"\r\n >\r\n </mt-avatar>\r\n\r\n <span class=\"truncate\" [mtTooltip]=\"value().name\" tooltipPosition=\"top\">\r\n {{ value().name }}\r\n </span>\r\n </div>\
|
|
152
|
+
args: [{ selector: 'mt-upload-file-preview', standalone: true, imports: [SecureImagePipe, Button, Avatar, TranslocoModule, Tooltip], template: "<div class=\"flex items-center justify-between gap-2 w-full p-2 overflow-hidden\">\r\n <div class=\"flex gap-2 items-center flex-1 min-w-0 overflow-hidden\">\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [shape]=\"'square'\"\r\n [image]=\"\r\n isImag() && imgPath() ? (imgPath() | secureImage: context()) : ''\r\n \"\r\n [icon]=\"defaultIcon()\"\r\n styleClass=\"text-2xl!\"\r\n >\r\n </mt-avatar>\r\n\r\n <span class=\"truncate\" [mtTooltip]=\"value().name\" tooltipPosition=\"top\">\r\n {{ value().name }}\r\n </span>\r\n </div>\n <div class=\"flex items-center justify-center shrink-0\">\n @if (!!value() && !loading() && (!disabled() || readonly())) {\n <mt-button\n variant=\"text\"\n icon=\"general.download-01\"\n [tooltip]=\"'components.upload.download' | transloco\"\n (onClick)=\"ondDownloadFile.emit(value())\"\n (click)=\"$event.stopPropagation()\"\n >\n </mt-button>\n }\n @if (!disabled() && !readonly() && !!value() && !loading()) {\n <mt-button\n variant=\"text\"\n icon=\"general.trash-01\"\n [tooltip]=\"'components.upload.delete' | transloco\"\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n</div>\r\n" }]
|
|
153
153
|
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], imgPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "imgPath", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], uploadProgress: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadProgress", required: false }] }], onUploadInputClicked: [{ type: i0.Output, args: ["onUploadInputClicked"] }], ondDownloadFile: [{ type: i0.Output, args: ["ondDownloadFile"] }], onDeleteFile: [{ type: i0.Output, args: ["onDeleteFile"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
|
|
154
154
|
|
|
155
155
|
class UploadUserPreview {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-upload-field.mjs","sources":["../../../../packages/masterteam/components/upload-field/secure-image.pipe.ts","../../../../packages/masterteam/components/upload-field/upload-file-preview/upload-file-preview.ts","../../../../packages/masterteam/components/upload-field/upload-file-preview/upload-file-preview.html","../../../../packages/masterteam/components/upload-field/upload-user-preview/upload-user-preview.ts","../../../../packages/masterteam/components/upload-field/upload-user-preview/upload-user-preview.html","../../../../packages/masterteam/components/upload-field/upload-field.ts","../../../../packages/masterteam/components/upload-field/upload-field.html","../../../../packages/masterteam/components/upload-field/masterteam-components-upload-field.ts"],"sourcesContent":["import {\r\n filter,\r\n switchMap,\r\n map,\r\n catchError,\r\n tap,\r\n distinctUntilChanged,\r\n finalize,\r\n} from 'rxjs/operators';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport { Subscription, BehaviorSubject, of } from 'rxjs';\r\nimport {\r\n Pipe,\r\n PipeTransform,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { HttpClient, HttpContext, HttpResponse } from '@angular/common/http';\r\n@Pipe({\r\n name: 'secureImage',\r\n pure: false,\r\n standalone: true,\r\n})\r\nexport class SecureImagePipe implements PipeTransform, OnDestroy {\r\n httpClient = inject(HttpClient);\r\n domSanitizer = inject(DomSanitizer);\r\n cdr = inject(ChangeDetectorRef);\r\n constructor() {\r\n this.setUpSubscription();\r\n }\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n private subscription = new Subscription();\r\n private latestValue!: string | SafeUrl;\r\n private transformValue = new BehaviorSubject<string>('');\r\n private loading = true;\r\n private context: HttpContext | undefined;\r\n private wrapUrl = true;\r\n private useEndpoint = false;\r\n private endPoint = '';\r\n private sanitize = true;\r\n\r\n transform(\r\n imagePath: string,\r\n wrapUrlOrContext?: boolean | HttpContext,\r\n contextOrEndpoint?: HttpContext | string,\r\n endPoint: string = 'uploader/',\r\n ): string {\r\n const hasExtraArgs = arguments.length > 1;\r\n const isWrapFlag = typeof wrapUrlOrContext === 'boolean';\r\n\r\n this.context = undefined;\r\n this.wrapUrl = true;\r\n this.useEndpoint = false;\r\n this.endPoint = '';\r\n this.sanitize = true;\r\n\r\n if (!hasExtraArgs || isWrapFlag) {\r\n // Backward compatible mode: (imagePath, wrapUrl?, context?, endPoint?)\r\n this.wrapUrl = isWrapFlag ? wrapUrlOrContext : false;\r\n this.useEndpoint = true;\r\n this.endPoint = endPoint;\r\n if (contextOrEndpoint instanceof HttpContext) {\r\n this.context = contextOrEndpoint;\r\n } else if (typeof contextOrEndpoint === 'string') {\r\n this.endPoint = contextOrEndpoint;\r\n }\r\n this.sanitize = false;\r\n } else {\r\n // Components mode: (imagePath, context)\r\n this.context = wrapUrlOrContext as HttpContext | undefined;\r\n this.wrapUrl = true;\r\n this.useEndpoint = false;\r\n this.endPoint = '';\r\n this.sanitize = true;\r\n }\r\n\r\n const fullPath = this.useEndpoint\r\n ? imagePath\r\n ? this.endPoint + imagePath\r\n : ''\r\n : imagePath;\r\n this.transformValue.next(fullPath);\r\n\r\n if (this.loading || !this.latestValue) {\r\n return '';\r\n }\r\n\r\n if (!this.useEndpoint || this.wrapUrl) {\r\n return this.latestValue as string;\r\n }\r\n\r\n return `url('${this.latestValue}')`;\r\n }\r\n\r\n private setUpSubscription(): void {\r\n const transformSubscription = this.transformValue\r\n .asObservable()\r\n .pipe(\r\n distinctUntilChanged(),\r\n filter((v): v is string => !!v && !v.includes('null')),\r\n switchMap((imagePath: string) => {\r\n this.latestValue = '';\r\n this.loading = true;\r\n return this.httpClient\r\n .get(imagePath, {\r\n observe: 'response',\r\n responseType: 'blob',\r\n context: this.context,\r\n })\r\n .pipe(\r\n map((response: HttpResponse<any>) =>\r\n URL.createObjectURL(response.body),\r\n ),\r\n map((unsafeBlobUrl: string) =>\r\n this.sanitize\r\n ? this.domSanitizer.bypassSecurityTrustUrl(unsafeBlobUrl)\r\n : unsafeBlobUrl,\r\n ),\r\n filter((blobUrl) => blobUrl !== this.latestValue),\r\n catchError(() => of('')),\r\n finalize(() => (this.loading = false)),\r\n );\r\n }),\r\n tap((imagePath: string | SafeUrl) => {\r\n this.latestValue = imagePath;\r\n this.cdr.markForCheck();\r\n }),\r\n )\r\n .subscribe();\r\n this.subscription.add(transformSubscription);\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n input,\r\n model,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SecureImagePipe } from '../secure-image.pipe';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\n\r\n@Component({\r\n selector: 'mt-upload-file-preview',\r\n standalone: true,\r\n imports: [SecureImagePipe, Button, Avatar, TranslocoModule, Tooltip],\r\n templateUrl: './upload-file-preview.html',\r\n styleUrl: './upload-file-preview.scss',\r\n})\r\nexport class UploadFilePreview implements OnInit {\r\n value = input<any | null>(null);\r\n imgPath = input<any | undefined>();\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n loading = input<boolean>(false);\r\n uploadProgress = input<number>(0);\r\n onUploadInputClicked = output<any>();\r\n ondDownloadFile = output<any>();\r\n onDeleteFile = output<any>();\r\n readonly disabled = model<boolean>(false);\r\n readonly readonly = input<boolean>(false);\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n isImag = computed(() => {\r\n return this.value()?.contentType?.startsWith('image/');\r\n });\r\n ngOnInit(): void {\r\n if (this.readonly()) {\r\n this.disabled.set(true);\r\n }\r\n }\r\n defaultIcon = computed(() => {\r\n switch (this.value()?.extension) {\r\n case '.pdf':\r\n return 'file.file-06';\r\n case '.docx':\r\n case '.doc':\r\n return 'file.file-06';\r\n case '.xlsx':\r\n case '.xls':\r\n return 'file.file-06';\r\n default:\r\n return 'image.image-03';\r\n }\r\n });\r\n}\r\n","<div class=\"flex items-center justify-between gap-2 w-full p-2 overflow-hidden\">\r\n <div class=\"flex gap-2 items-center flex-1 min-w-0 overflow-hidden\">\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [shape]=\"'square'\"\r\n [image]=\"\r\n isImag() && imgPath() ? (imgPath() | secureImage: context()) : ''\r\n \"\r\n [icon]=\"defaultIcon()\"\r\n styleClass=\"text-2xl!\"\r\n >\r\n </mt-avatar>\r\n\r\n <span class=\"truncate\" [mtTooltip]=\"value().name\" tooltipPosition=\"top\">\r\n {{ value().name }}\r\n </span>\r\n </div>\r\n <div class=\"flex items-center justify-center shrink-0\">\r\n @if (!disabled() && !!value() && !loading()) {\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.download-01\"\r\n [tooltip]=\"'components.upload.download' | transloco\"\r\n (onClick)=\"ondDownloadFile.emit(value())\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"'components.upload.delete' | transloco\"\r\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n</div>\r\n","import { SecureImagePipe } from '../secure-image.pipe';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Component, input, model, OnInit, output, signal } from '@angular/core';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\n@Component({\r\n selector: 'mt-upload-user-preview',\r\n standalone: true,\r\n imports: [Icon, SecureImagePipe, Button, Icon, Avatar, TranslocoModule],\r\n templateUrl: './upload-user-preview.html',\r\n styleUrl: './upload-user-preview.css',\r\n})\r\nexport class UploadUserPreview implements OnInit {\r\n value = input<any | null>(null);\r\n imgPath = input<any | undefined>();\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n loading = input<boolean>(false);\r\n uploadProgress = input<number>(0);\r\n isDragging = input<boolean>(false);\r\n defaultIcon = signal<string>('image.image-03');\r\n onUploadInputClicked = output<any>();\r\n ondDownloadFile = output<any>();\r\n onDeleteFile = output<any>();\r\n onDragOver = output<any>();\r\n onDragLeave = output<any>();\r\n onDrop = output<any>();\r\n readonly disabled = model<boolean>(false);\r\n readonly readonly = input<boolean>(false);\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n readonly userImgClass = input<string>('');\r\n OnUploadInputClicked(): void {\r\n if (!this.imgPath() && !this.loading() && !this.disabled()) {\r\n this.onUploadInputClicked.emit(true);\r\n }\r\n }\r\n ngOnInit(): void {\r\n if (this.readonly()) {\r\n this.disabled.set(true);\r\n }\r\n }\r\n OnDragOver(event: DragEvent): void {\r\n this.onDragOver.emit(event);\r\n }\r\n OnDragLeave(event: DragEvent): void {\r\n this.onDragLeave.emit(event);\r\n }\r\n\r\n OnDrop(event: DragEvent): void {\r\n this.onDrop.emit(event);\r\n }\r\n}\r\n","<div\r\n class=\"rounded-full p-1 w-fit\"\r\n [style.background]=\"\r\n 'conic-gradient(var(--p-primary-300) ' +\r\n uploadProgress() +\r\n '%, transparent ' +\r\n uploadProgress() +\r\n '%)'\r\n \"\r\n>\r\n <div\r\n class=\"relative rounded-full w-fit border-2 border-dashed border-gray-300 bg-white\"\r\n [class.opacity-50]=\"isDragging()\"\r\n >\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [image]=\"imgPath() ? (imgPath() | secureImage: context()) : ''\"\r\n [icon]=\"defaultIcon()\"\r\n [styleClass]=\"userImgClass()\"\r\n >\r\n </mt-avatar>\r\n\r\n @if (!loading()) {\r\n <div\r\n class=\"absolute inset-0 flex items-center justify-center rounded-full bg-surface-400/50 opacity-0 hover:opacity-100 transition-opacity\"\r\n [class]=\"!imgPath() && !disabled() ? 'cursor-pointer' : ''\"\r\n (click)=\"OnUploadInputClicked()\"\r\n (dragover)=\"OnDragOver($event)\"\r\n (dragleave)=\"OnDragLeave($event)\"\r\n (drop)=\"OnDrop($event)\"\r\n >\r\n @if (!disabled() && !!imgPath()) {\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.download-01\"\r\n [tooltip]=\"'components.upload.download' | transloco\"\r\n (onClick)=\"ondDownloadFile.emit(value())\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"'components.upload.delete' | transloco\"\r\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n >\r\n </mt-button>\r\n }\r\n @if (!imgPath() && !disabled()) {\r\n <mt-icon\r\n icon=\"general.upload-01\"\r\n class=\"text-primary-400 text-xl\"\r\n ></mt-icon>\r\n }\r\n </div>\r\n } @else if (loading()) {\r\n <div\r\n class=\"absolute inset-0 flex items-center justify-center rounded-full bg-surface-400/50\"\r\n >\r\n @if (uploadProgress() === 100) {\r\n <mt-icon\r\n icon=\"general.check\"\r\n class=\"text-primary-400 text-2xl\"\r\n ></mt-icon>\r\n } @else {\r\n <small class=\"text-primary-300 font-bold text-lg\">{{\r\n uploadProgress() + \"%\"\r\n }}</small>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { UploadFilePreview } from './upload-file-preview/upload-file-preview';\r\nimport { UploadUserPreview } from './upload-user-preview/upload-user-preview';\r\nimport {\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { catchError, finalize, take, throwError } from 'rxjs';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\ninterface FileMetadata {\r\n id: string;\r\n name: string;\r\n contentType: string;\r\n extension: string;\r\n fileName: string;\r\n size?: number;\r\n}\r\n\r\ninterface MetadataResponse {\r\n data: FileMetadata;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-upload-field',\r\n standalone: true,\r\n imports: [\r\n Icon,\r\n UploadUserPreview,\r\n UploadFilePreview,\r\n FieldValidation,\r\n Card,\r\n Button,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './upload-field.html',\r\n})\r\nexport class UploadField implements ControlValueAccessor {\r\n readonly label = input<string>();\r\n readonly title = input<string>('Upload File');\r\n readonly description = input<string>('Click or drop a file to upload');\r\n readonly endPoint = input<string>('uploader');\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n readonly userImgClass = input<string | undefined>(\r\n 'w-25! h-25! text-4xl! text-gray-400!',\r\n );\r\n readonly shape = input<'circle' | 'field' | 'card'>('field');\r\n readonly accept = input<string | undefined>('.pdf,.doc,.docx,.xlsx,image/*');\r\n readonly isDragging = model<boolean>(false);\r\n readonly fileSizeLimit = input<number | undefined>();\r\n readonly = input<boolean>(false);\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n\r\n onChange = output<any>();\r\n requiredValidator = Validators.required;\r\n value = signal<any | null>(null);\r\n disabled = signal<boolean>(false);\r\n uploadProgress = signal<number>(0);\r\n httpClient = inject(HttpClient);\r\n loading = signal<boolean>(false);\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: any[]) => void = () => {};\r\n public ngControl = inject(NgControl, { self: true });\r\n imgPath = computed(() => {\r\n if (this.value()?.fileName) {\r\n return this.value()?.fileName\r\n ? this.endPoint() + '/' + this.value().fileName\r\n : '';\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n writeValue(value: any) {\r\n if (value && typeof value === 'string') {\r\n // Value is a string (file ID), fetch metadata\r\n this.fetchMetadata(value);\r\n } else {\r\n this.value.set(value);\r\n }\r\n }\r\n\r\n private fetchMetadata(fileId: string): void {\r\n this.loading.set(true);\r\n const metadataUrl = `${this.endPoint()}/${fileId}/metaData`;\r\n\r\n this.httpClient\r\n .get<MetadataResponse>(metadataUrl, {\r\n context: this.context(),\r\n })\r\n .pipe(\r\n take(1),\r\n finalize(() => this.loading.set(false)),\r\n catchError((error) => {\r\n console.error('Failed to fetch file metadata:', error);\r\n // Set minimal value with just the ID so download might still work\r\n this.value.set({ fileName: fileId, id: fileId });\r\n return throwError(() => error);\r\n }),\r\n )\r\n .subscribe((response) => {\r\n this.value.set(response.data);\r\n });\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n onAdd(item: any) {\r\n console.log('onAdd', item);\r\n if (!this.disabled()) {\r\n this.value.set(item);\r\n this.onModelChange(this.value() ?? null);\r\n this.onChange.emit(this.value());\r\n }\r\n }\r\n\r\n onDelete() {\r\n if (!this.disabled()) {\r\n console.log('onDelete');\r\n this.value.set(null);\r\n this.onModelChange(this.value() ?? null);\r\n this.onChange.emit(this.value());\r\n }\r\n }\r\n\r\n onFileSelect(event: any) {\r\n console.log('event', event);\r\n if (event.target.files.length) {\r\n this.value.set(null);\r\n const files: FileList = event.target.files;\r\n this.prepareImage(files);\r\n }\r\n }\r\n\r\n prepareImage(files: FileList) {\r\n this.ngControl.control?.setErrors({ uploading: true });\r\n\r\n if (files.length) {\r\n if (this.shape() === 'circle' && !files[0]?.type.startsWith('image/')) {\r\n this.ngControl.control?.setErrors({ invalidFileType: true });\r\n return;\r\n }\r\n this.uploadFile(files[0]);\r\n }\r\n }\r\n\r\n uploadFile(file: File) {\r\n this.loading.set(true);\r\n this.uploadProgress.set(10);\r\n\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n this.httpClient\r\n .post<any>(this.endPoint(), formData, {\r\n // 1. Crucial options to report upload progress\r\n reportProgress: true,\r\n observe: 'events',\r\n context: this.context(),\r\n })\r\n .pipe(\r\n finalize(() => {\r\n setTimeout(() => {\r\n this.uploadProgress.set(0);\r\n this.loading.set(false);\r\n }, 700);\r\n }),\r\n catchError(() => {\r\n this.uploadProgress.set(0); // Reset on error\r\n return throwError(() => new Error('Upload failed'));\r\n }),\r\n )\r\n .subscribe((event: any) => {\r\n console.log('event', event);\r\n\r\n if (!event?.body) {\r\n if (event.total) {\r\n const percentDone = Math.round((100 * event.loaded) / event.total);\r\n this.uploadProgress.set(percentDone);\r\n console.log(`Upload Progress: ${percentDone}%`);\r\n }\r\n } else {\r\n this.uploadProgress.set(100);\r\n this.handleUploadDone({ ...event.body?.data, size: file.size });\r\n console.log('Upload Complete', event.body);\r\n }\r\n });\r\n }\r\n\r\n handleUploadDone(file: any) {\r\n if (file) {\r\n this.onAdd(file);\r\n if (this.fileSizeLimit() && file.size > this.fileSizeLimit()!) {\r\n this.ngControl.control?.setErrors({ fileSizeLimited: true });\r\n } else {\r\n this.ngControl.control?.setErrors(null);\r\n }\r\n console.log('this.ngControl.control', this.ngControl.control);\r\n }\r\n\r\n console.log('handleUploadDone', this.value());\r\n }\r\n\r\n downloadFile(value: any) {\r\n const downloadFileName = value?.name;\r\n const mimeType = value?.contentType;\r\n const storedFileName = value?.fileName;\r\n\r\n if (!storedFileName || !mimeType || !downloadFileName) {\r\n console.error('File metadata is incomplete. Cannot download.');\r\n return;\r\n }\r\n\r\n this.httpClient\r\n .get(this.imgPath()!, {\r\n responseType: 'blob',\r\n context: this.context(),\r\n })\r\n .pipe(take(1))\r\n .subscribe((res: Blob) => {\r\n const blob = new Blob([res], { type: mimeType });\r\n\r\n const data = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = data;\r\n\r\n link.download = downloadFileName;\r\n\r\n link.click();\r\n\r\n window.URL.revokeObjectURL(data);\r\n });\r\n }\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!this.disabled()) {\r\n this.isDragging.set(true);\r\n }\r\n }\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging.set(false);\r\n\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n const fileEvent = {\r\n target: {\r\n files: files,\r\n },\r\n } as unknown as Event;\r\n this.onFileSelect(fileEvent);\r\n }\r\n }\r\n}\r\n","<input\r\n #uploadInput\r\n type=\"file\"\r\n name=\"file[]\"\r\n (change)=\"onFileSelect($event)\"\r\n style=\"display: none\"\r\n [accept]=\"shape() === 'circle' ? 'image/*' : accept()\"\r\n/>\r\n\r\n@if (shape() === \"circle\") {\r\n <div class=\"flex flex-col items-center gap-2 w-full\">\r\n <div class=\"flex\">\r\n <div class=\"flex flex-col items-center\">\r\n <mt-upload-user-preview\r\n [value]=\"value()\"\r\n [imgPath]=\"imgPath()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [size]=\"size()\"\r\n [context]=\"context()\"\r\n [userImgClass]=\"userImgClass()\"\r\n [isDragging]=\"isDragging()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile($event)\"\r\n (onDeleteFile)=\"onDelete()\"\r\n (onDragOver)=\"onDragOver($event)\"\r\n (onDragLeave)=\"onDragLeave($event)\"\r\n (onDrop)=\"onDrop($event)\"\r\n ></mt-upload-user-preview>\r\n @if (label()) {\r\n <label\r\n [class.required]=\"\r\n ngControl?.control?.hasValidator(requiredValidator)\r\n \"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else if (shape() === \"card\") {\r\n <mt-card\r\n headless\r\n class=\"border-2 border-dashed border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50\"\r\n >\r\n <div class=\"content flex flex-col gap-5 items-center text-center\">\r\n @if (!value() && !loading()) {\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (value()) {\r\n <mt-upload-file-preview\r\n style=\"width: 100%\"\r\n [value]=\"value()\"\r\n [imgPath]=\"imgPath()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [context]=\"context()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile($event)\"\r\n (onDeleteFile)=\"onDelete()\"\r\n />\r\n } @else {\r\n @if (loading()) {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <p class=\"text-lg text-gray-500\">\r\n {{\r\n (\"components.upload.uploading\" | transloco) +\r\n uploadProgress() +\r\n \"%\"\r\n }}\r\n </p>\r\n </div>\r\n } @else {\r\n <mt-button\r\n [size]=\"'small'\"\r\n [label]=\"'components.upload.upload' | transloco\"\r\n [icon]=\"'general.upload-01'\"\r\n (onClick)=\"\r\n !this.loading() && !this.disabled() && !this.readonly()\r\n ? uploadInput.click()\r\n : ''\r\n \"\r\n [disabled]=\"disabled() || loading() || readonly()\"\r\n />\r\n }\r\n }\r\n </div>\r\n </mt-card>\r\n} @else {\r\n <div class=\"flex flex-col items-start gap-2 w-full\">\r\n @if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n }\r\n\r\n <div\r\n class=\"w-full flex gap-3 items-center justify-center border-2 border-dashed border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50\"\r\n [class]=\"this.disabled() ? 'bg-gray-50' : ''\"\r\n (click)=\"\r\n !this.loading() && !this.disabled() && !this.readonly()\r\n ? uploadInput.click()\r\n : ''\r\n \"\r\n [class.border-blue-500]=\"isDragging()\"\r\n [class.bg-blue-50]=\"isDragging()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n @if (value()) {\r\n <mt-upload-file-preview\r\n style=\"width: 100%\"\r\n [value]=\"value()\"\r\n [imgPath]=\"imgPath()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [context]=\"context()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile($event)\"\r\n (onDeleteFile)=\"onDelete()\"\r\n />\r\n } @else {\r\n @if (loading()) {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <p class=\"text-lg text-gray-500\">\r\n {{\r\n (\"components.upload.uploading\" | transloco) +\r\n uploadProgress() +\r\n \"%\"\r\n }}\r\n </p>\r\n </div>\r\n } @else {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <mt-icon icon=\"general.upload-01\" />\r\n <p class=\"text-lg text-gray-500\">\r\n {{ \"components.upload.clickOrDrop\" | transloco }}\r\n </p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n}\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["finalize","catchError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-components-upload-field.mjs","sources":["../../../../packages/masterteam/components/upload-field/secure-image.pipe.ts","../../../../packages/masterteam/components/upload-field/upload-file-preview/upload-file-preview.ts","../../../../packages/masterteam/components/upload-field/upload-file-preview/upload-file-preview.html","../../../../packages/masterteam/components/upload-field/upload-user-preview/upload-user-preview.ts","../../../../packages/masterteam/components/upload-field/upload-user-preview/upload-user-preview.html","../../../../packages/masterteam/components/upload-field/upload-field.ts","../../../../packages/masterteam/components/upload-field/upload-field.html","../../../../packages/masterteam/components/upload-field/masterteam-components-upload-field.ts"],"sourcesContent":["import {\r\n filter,\r\n switchMap,\r\n map,\r\n catchError,\r\n tap,\r\n distinctUntilChanged,\r\n finalize,\r\n} from 'rxjs/operators';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport { Subscription, BehaviorSubject, of } from 'rxjs';\r\nimport {\r\n Pipe,\r\n PipeTransform,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { HttpClient, HttpContext, HttpResponse } from '@angular/common/http';\r\n@Pipe({\r\n name: 'secureImage',\r\n pure: false,\r\n standalone: true,\r\n})\r\nexport class SecureImagePipe implements PipeTransform, OnDestroy {\r\n httpClient = inject(HttpClient);\r\n domSanitizer = inject(DomSanitizer);\r\n cdr = inject(ChangeDetectorRef);\r\n constructor() {\r\n this.setUpSubscription();\r\n }\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n private subscription = new Subscription();\r\n private latestValue!: string | SafeUrl;\r\n private transformValue = new BehaviorSubject<string>('');\r\n private loading = true;\r\n private context: HttpContext | undefined;\r\n private wrapUrl = true;\r\n private useEndpoint = false;\r\n private endPoint = '';\r\n private sanitize = true;\r\n\r\n transform(\r\n imagePath: string,\r\n wrapUrlOrContext?: boolean | HttpContext,\r\n contextOrEndpoint?: HttpContext | string,\r\n endPoint: string = 'uploader/',\r\n ): string {\r\n const hasExtraArgs = arguments.length > 1;\r\n const isWrapFlag = typeof wrapUrlOrContext === 'boolean';\r\n\r\n this.context = undefined;\r\n this.wrapUrl = true;\r\n this.useEndpoint = false;\r\n this.endPoint = '';\r\n this.sanitize = true;\r\n\r\n if (!hasExtraArgs || isWrapFlag) {\r\n // Backward compatible mode: (imagePath, wrapUrl?, context?, endPoint?)\r\n this.wrapUrl = isWrapFlag ? wrapUrlOrContext : false;\r\n this.useEndpoint = true;\r\n this.endPoint = endPoint;\r\n if (contextOrEndpoint instanceof HttpContext) {\r\n this.context = contextOrEndpoint;\r\n } else if (typeof contextOrEndpoint === 'string') {\r\n this.endPoint = contextOrEndpoint;\r\n }\r\n this.sanitize = false;\r\n } else {\r\n // Components mode: (imagePath, context)\r\n this.context = wrapUrlOrContext as HttpContext | undefined;\r\n this.wrapUrl = true;\r\n this.useEndpoint = false;\r\n this.endPoint = '';\r\n this.sanitize = true;\r\n }\r\n\r\n const fullPath = this.useEndpoint\r\n ? imagePath\r\n ? this.endPoint + imagePath\r\n : ''\r\n : imagePath;\r\n this.transformValue.next(fullPath);\r\n\r\n if (this.loading || !this.latestValue) {\r\n return '';\r\n }\r\n\r\n if (!this.useEndpoint || this.wrapUrl) {\r\n return this.latestValue as string;\r\n }\r\n\r\n return `url('${this.latestValue}')`;\r\n }\r\n\r\n private setUpSubscription(): void {\r\n const transformSubscription = this.transformValue\r\n .asObservable()\r\n .pipe(\r\n distinctUntilChanged(),\r\n filter((v): v is string => !!v && !v.includes('null')),\r\n switchMap((imagePath: string) => {\r\n this.latestValue = '';\r\n this.loading = true;\r\n return this.httpClient\r\n .get(imagePath, {\r\n observe: 'response',\r\n responseType: 'blob',\r\n context: this.context,\r\n })\r\n .pipe(\r\n map((response: HttpResponse<any>) =>\r\n URL.createObjectURL(response.body),\r\n ),\r\n map((unsafeBlobUrl: string) =>\r\n this.sanitize\r\n ? this.domSanitizer.bypassSecurityTrustUrl(unsafeBlobUrl)\r\n : unsafeBlobUrl,\r\n ),\r\n filter((blobUrl) => blobUrl !== this.latestValue),\r\n catchError(() => of('')),\r\n finalize(() => (this.loading = false)),\r\n );\r\n }),\r\n tap((imagePath: string | SafeUrl) => {\r\n this.latestValue = imagePath;\r\n this.cdr.markForCheck();\r\n }),\r\n )\r\n .subscribe();\r\n this.subscription.add(transformSubscription);\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n input,\r\n model,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SecureImagePipe } from '../secure-image.pipe';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\n\r\n@Component({\r\n selector: 'mt-upload-file-preview',\r\n standalone: true,\r\n imports: [SecureImagePipe, Button, Avatar, TranslocoModule, Tooltip],\r\n templateUrl: './upload-file-preview.html',\r\n styleUrl: './upload-file-preview.scss',\r\n})\r\nexport class UploadFilePreview implements OnInit {\r\n value = input<any | null>(null);\r\n imgPath = input<any | undefined>();\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n loading = input<boolean>(false);\r\n uploadProgress = input<number>(0);\r\n onUploadInputClicked = output<any>();\r\n ondDownloadFile = output<any>();\r\n onDeleteFile = output<any>();\r\n readonly disabled = model<boolean>(false);\r\n readonly readonly = input<boolean>(false);\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n isImag = computed(() => {\r\n return this.value()?.contentType?.startsWith('image/');\r\n });\r\n ngOnInit(): void {\r\n if (this.readonly()) {\r\n this.disabled.set(true);\r\n }\r\n }\r\n defaultIcon = computed(() => {\r\n switch (this.value()?.extension) {\r\n case '.pdf':\r\n return 'file.file-06';\r\n case '.docx':\r\n case '.doc':\r\n return 'file.file-06';\r\n case '.xlsx':\r\n case '.xls':\r\n return 'file.file-06';\r\n default:\r\n return 'image.image-03';\r\n }\r\n });\r\n}\r\n","<div class=\"flex items-center justify-between gap-2 w-full p-2 overflow-hidden\">\r\n <div class=\"flex gap-2 items-center flex-1 min-w-0 overflow-hidden\">\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [shape]=\"'square'\"\r\n [image]=\"\r\n isImag() && imgPath() ? (imgPath() | secureImage: context()) : ''\r\n \"\r\n [icon]=\"defaultIcon()\"\r\n styleClass=\"text-2xl!\"\r\n >\r\n </mt-avatar>\r\n\r\n <span class=\"truncate\" [mtTooltip]=\"value().name\" tooltipPosition=\"top\">\r\n {{ value().name }}\r\n </span>\r\n </div>\n <div class=\"flex items-center justify-center shrink-0\">\n @if (!!value() && !loading() && (!disabled() || readonly())) {\n <mt-button\n variant=\"text\"\n icon=\"general.download-01\"\n [tooltip]=\"'components.upload.download' | transloco\"\n (onClick)=\"ondDownloadFile.emit(value())\"\n (click)=\"$event.stopPropagation()\"\n >\n </mt-button>\n }\n @if (!disabled() && !readonly() && !!value() && !loading()) {\n <mt-button\n variant=\"text\"\n icon=\"general.trash-01\"\n [tooltip]=\"'components.upload.delete' | transloco\"\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n</div>\r\n","import { SecureImagePipe } from '../secure-image.pipe';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Component, input, model, OnInit, output, signal } from '@angular/core';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\n@Component({\r\n selector: 'mt-upload-user-preview',\r\n standalone: true,\r\n imports: [Icon, SecureImagePipe, Button, Icon, Avatar, TranslocoModule],\r\n templateUrl: './upload-user-preview.html',\r\n styleUrl: './upload-user-preview.css',\r\n})\r\nexport class UploadUserPreview implements OnInit {\r\n value = input<any | null>(null);\r\n imgPath = input<any | undefined>();\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n loading = input<boolean>(false);\r\n uploadProgress = input<number>(0);\r\n isDragging = input<boolean>(false);\r\n defaultIcon = signal<string>('image.image-03');\r\n onUploadInputClicked = output<any>();\r\n ondDownloadFile = output<any>();\r\n onDeleteFile = output<any>();\r\n onDragOver = output<any>();\r\n onDragLeave = output<any>();\r\n onDrop = output<any>();\r\n readonly disabled = model<boolean>(false);\r\n readonly readonly = input<boolean>(false);\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n readonly userImgClass = input<string>('');\r\n OnUploadInputClicked(): void {\r\n if (!this.imgPath() && !this.loading() && !this.disabled()) {\r\n this.onUploadInputClicked.emit(true);\r\n }\r\n }\r\n ngOnInit(): void {\r\n if (this.readonly()) {\r\n this.disabled.set(true);\r\n }\r\n }\r\n OnDragOver(event: DragEvent): void {\r\n this.onDragOver.emit(event);\r\n }\r\n OnDragLeave(event: DragEvent): void {\r\n this.onDragLeave.emit(event);\r\n }\r\n\r\n OnDrop(event: DragEvent): void {\r\n this.onDrop.emit(event);\r\n }\r\n}\r\n","<div\r\n class=\"rounded-full p-1 w-fit\"\r\n [style.background]=\"\r\n 'conic-gradient(var(--p-primary-300) ' +\r\n uploadProgress() +\r\n '%, transparent ' +\r\n uploadProgress() +\r\n '%)'\r\n \"\r\n>\r\n <div\r\n class=\"relative rounded-full w-fit border-2 border-dashed border-gray-300 bg-white\"\r\n [class.opacity-50]=\"isDragging()\"\r\n >\r\n <mt-avatar\r\n [size]=\"size()\"\r\n [image]=\"imgPath() ? (imgPath() | secureImage: context()) : ''\"\r\n [icon]=\"defaultIcon()\"\r\n [styleClass]=\"userImgClass()\"\r\n >\r\n </mt-avatar>\r\n\r\n @if (!loading()) {\r\n <div\r\n class=\"absolute inset-0 flex items-center justify-center rounded-full bg-surface-400/50 opacity-0 hover:opacity-100 transition-opacity\"\r\n [class]=\"!imgPath() && !disabled() ? 'cursor-pointer' : ''\"\r\n (click)=\"OnUploadInputClicked()\"\r\n (dragover)=\"OnDragOver($event)\"\r\n (dragleave)=\"OnDragLeave($event)\"\r\n (drop)=\"OnDrop($event)\"\r\n >\r\n @if (!disabled() && !!imgPath()) {\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.download-01\"\r\n [tooltip]=\"'components.upload.download' | transloco\"\r\n (onClick)=\"ondDownloadFile.emit(value())\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n variant=\"text\"\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"'components.upload.delete' | transloco\"\r\n severity=\"danger\"\r\n (onClick)=\"onDeleteFile.emit(true)\"\r\n >\r\n </mt-button>\r\n }\r\n @if (!imgPath() && !disabled()) {\r\n <mt-icon\r\n icon=\"general.upload-01\"\r\n class=\"text-primary-400 text-xl\"\r\n ></mt-icon>\r\n }\r\n </div>\r\n } @else if (loading()) {\r\n <div\r\n class=\"absolute inset-0 flex items-center justify-center rounded-full bg-surface-400/50\"\r\n >\r\n @if (uploadProgress() === 100) {\r\n <mt-icon\r\n icon=\"general.check\"\r\n class=\"text-primary-400 text-2xl\"\r\n ></mt-icon>\r\n } @else {\r\n <small class=\"text-primary-300 font-bold text-lg\">{{\r\n uploadProgress() + \"%\"\r\n }}</small>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { UploadFilePreview } from './upload-file-preview/upload-file-preview';\r\nimport { UploadUserPreview } from './upload-user-preview/upload-user-preview';\r\nimport {\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { catchError, finalize, take, throwError } from 'rxjs';\r\nimport { FieldValidation } from '@masterteam/components/field-validation';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\ninterface FileMetadata {\r\n id: string;\r\n name: string;\r\n contentType: string;\r\n extension: string;\r\n fileName: string;\r\n size?: number;\r\n}\r\n\r\ninterface MetadataResponse {\r\n data: FileMetadata;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-upload-field',\r\n standalone: true,\r\n imports: [\r\n Icon,\r\n UploadUserPreview,\r\n UploadFilePreview,\r\n FieldValidation,\r\n Card,\r\n Button,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './upload-field.html',\r\n})\r\nexport class UploadField implements ControlValueAccessor {\r\n readonly label = input<string>();\r\n readonly title = input<string>('Upload File');\r\n readonly description = input<string>('Click or drop a file to upload');\r\n readonly endPoint = input<string>('uploader');\r\n readonly size = input<'normal' | 'large' | 'xlarge' | undefined>();\r\n readonly userImgClass = input<string | undefined>(\r\n 'w-25! h-25! text-4xl! text-gray-400!',\r\n );\r\n readonly shape = input<'circle' | 'field' | 'card'>('field');\r\n readonly accept = input<string | undefined>('.pdf,.doc,.docx,.xlsx,image/*');\r\n readonly isDragging = model<boolean>(false);\r\n readonly fileSizeLimit = input<number | undefined>();\r\n readonly = input<boolean>(false);\r\n readonly context = input<HttpContext | undefined>(undefined);\r\n\r\n onChange = output<any>();\r\n requiredValidator = Validators.required;\r\n value = signal<any | null>(null);\r\n disabled = signal<boolean>(false);\r\n uploadProgress = signal<number>(0);\r\n httpClient = inject(HttpClient);\r\n loading = signal<boolean>(false);\r\n onTouched: () => void = () => {};\r\n onModelChange: (value: any[]) => void = () => {};\r\n public ngControl = inject(NgControl, { self: true });\r\n imgPath = computed(() => {\r\n if (this.value()?.fileName) {\r\n return this.value()?.fileName\r\n ? this.endPoint() + '/' + this.value().fileName\r\n : '';\r\n } else {\r\n return undefined;\r\n }\r\n });\r\n\r\n constructor() {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n writeValue(value: any) {\r\n if (value && typeof value === 'string') {\r\n // Value is a string (file ID), fetch metadata\r\n this.fetchMetadata(value);\r\n } else {\r\n this.value.set(value);\r\n }\r\n }\r\n\r\n private fetchMetadata(fileId: string): void {\r\n this.loading.set(true);\r\n const metadataUrl = `${this.endPoint()}/${fileId}/metaData`;\r\n\r\n this.httpClient\r\n .get<MetadataResponse>(metadataUrl, {\r\n context: this.context(),\r\n })\r\n .pipe(\r\n take(1),\r\n finalize(() => this.loading.set(false)),\r\n catchError((error) => {\r\n console.error('Failed to fetch file metadata:', error);\r\n // Set minimal value with just the ID so download might still work\r\n this.value.set({ fileName: fileId, id: fileId });\r\n return throwError(() => error);\r\n }),\r\n )\r\n .subscribe((response) => {\r\n this.value.set(response.data);\r\n });\r\n }\r\n\r\n registerOnChange(fn: any) {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any) {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean) {\r\n this.disabled.set(disabled);\r\n }\r\n\r\n onAdd(item: any) {\r\n console.log('onAdd', item);\r\n if (!this.disabled()) {\r\n this.value.set(item);\r\n this.onModelChange(this.value() ?? null);\r\n this.onChange.emit(this.value());\r\n }\r\n }\r\n\r\n onDelete() {\r\n if (!this.disabled()) {\r\n console.log('onDelete');\r\n this.value.set(null);\r\n this.onModelChange(this.value() ?? null);\r\n this.onChange.emit(this.value());\r\n }\r\n }\r\n\r\n onFileSelect(event: any) {\r\n console.log('event', event);\r\n if (event.target.files.length) {\r\n this.value.set(null);\r\n const files: FileList = event.target.files;\r\n this.prepareImage(files);\r\n }\r\n }\r\n\r\n prepareImage(files: FileList) {\r\n this.ngControl.control?.setErrors({ uploading: true });\r\n\r\n if (files.length) {\r\n if (this.shape() === 'circle' && !files[0]?.type.startsWith('image/')) {\r\n this.ngControl.control?.setErrors({ invalidFileType: true });\r\n return;\r\n }\r\n this.uploadFile(files[0]);\r\n }\r\n }\r\n\r\n uploadFile(file: File) {\r\n this.loading.set(true);\r\n this.uploadProgress.set(10);\r\n\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n this.httpClient\r\n .post<any>(this.endPoint(), formData, {\r\n // 1. Crucial options to report upload progress\r\n reportProgress: true,\r\n observe: 'events',\r\n context: this.context(),\r\n })\r\n .pipe(\r\n finalize(() => {\r\n setTimeout(() => {\r\n this.uploadProgress.set(0);\r\n this.loading.set(false);\r\n }, 700);\r\n }),\r\n catchError(() => {\r\n this.uploadProgress.set(0); // Reset on error\r\n return throwError(() => new Error('Upload failed'));\r\n }),\r\n )\r\n .subscribe((event: any) => {\r\n console.log('event', event);\r\n\r\n if (!event?.body) {\r\n if (event.total) {\r\n const percentDone = Math.round((100 * event.loaded) / event.total);\r\n this.uploadProgress.set(percentDone);\r\n console.log(`Upload Progress: ${percentDone}%`);\r\n }\r\n } else {\r\n this.uploadProgress.set(100);\r\n this.handleUploadDone({ ...event.body?.data, size: file.size });\r\n console.log('Upload Complete', event.body);\r\n }\r\n });\r\n }\r\n\r\n handleUploadDone(file: any) {\r\n if (file) {\r\n this.onAdd(file);\r\n if (this.fileSizeLimit() && file.size > this.fileSizeLimit()!) {\r\n this.ngControl.control?.setErrors({ fileSizeLimited: true });\r\n } else {\r\n this.ngControl.control?.setErrors(null);\r\n }\r\n console.log('this.ngControl.control', this.ngControl.control);\r\n }\r\n\r\n console.log('handleUploadDone', this.value());\r\n }\r\n\r\n downloadFile(value: any) {\r\n const downloadFileName = value?.name;\r\n const mimeType = value?.contentType;\r\n const storedFileName = value?.fileName;\r\n\r\n if (!storedFileName || !mimeType || !downloadFileName) {\r\n console.error('File metadata is incomplete. Cannot download.');\r\n return;\r\n }\r\n\r\n this.httpClient\r\n .get(this.imgPath()!, {\r\n responseType: 'blob',\r\n context: this.context(),\r\n })\r\n .pipe(take(1))\r\n .subscribe((res: Blob) => {\r\n const blob = new Blob([res], { type: mimeType });\r\n\r\n const data = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = data;\r\n\r\n link.download = downloadFileName;\r\n\r\n link.click();\r\n\r\n window.URL.revokeObjectURL(data);\r\n });\r\n }\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!this.disabled()) {\r\n this.isDragging.set(true);\r\n }\r\n }\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging.set(false);\r\n\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n const fileEvent = {\r\n target: {\r\n files: files,\r\n },\r\n } as unknown as Event;\r\n this.onFileSelect(fileEvent);\r\n }\r\n }\r\n}\r\n","<input\r\n #uploadInput\r\n type=\"file\"\r\n name=\"file[]\"\r\n (change)=\"onFileSelect($event)\"\r\n style=\"display: none\"\r\n [accept]=\"shape() === 'circle' ? 'image/*' : accept()\"\r\n/>\r\n\r\n@if (shape() === \"circle\") {\r\n <div class=\"flex flex-col items-center gap-2 w-full\">\r\n <div class=\"flex\">\r\n <div class=\"flex flex-col items-center\">\r\n <mt-upload-user-preview\r\n [value]=\"value()\"\r\n [imgPath]=\"imgPath()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [size]=\"size()\"\r\n [context]=\"context()\"\r\n [userImgClass]=\"userImgClass()\"\r\n [isDragging]=\"isDragging()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile($event)\"\r\n (onDeleteFile)=\"onDelete()\"\r\n (onDragOver)=\"onDragOver($event)\"\r\n (onDragLeave)=\"onDragLeave($event)\"\r\n (onDrop)=\"onDrop($event)\"\r\n ></mt-upload-user-preview>\r\n @if (label()) {\r\n <label\r\n [class.required]=\"\r\n ngControl?.control?.hasValidator(requiredValidator)\r\n \"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n} @else if (shape() === \"card\") {\r\n <mt-card\r\n headless\r\n class=\"border-2 border-dashed border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50\"\r\n >\r\n <div class=\"content flex flex-col gap-5 items-center text-center\">\r\n @if (!value() && !loading()) {\r\n <div class=\"flex flex-col gap-1\">\r\n @if (title()) {\r\n <div class=\"title text-lg font-semibold\">\r\n {{ title() }}\r\n </div>\r\n }\r\n @if (description()) {\r\n <div\r\n class=\"description text-sm text-muted-foreground secondary text-surface-500\"\r\n >\r\n {{ description() }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (value()) {\r\n <mt-upload-file-preview\r\n style=\"width: 100%\"\r\n [value]=\"value()\"\r\n [imgPath]=\"imgPath()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [context]=\"context()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile($event)\"\r\n (onDeleteFile)=\"onDelete()\"\r\n />\r\n } @else {\r\n @if (loading()) {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <p class=\"text-lg text-gray-500\">\r\n {{\r\n (\"components.upload.uploading\" | transloco) +\r\n uploadProgress() +\r\n \"%\"\r\n }}\r\n </p>\r\n </div>\r\n } @else {\r\n <mt-button\r\n [size]=\"'small'\"\r\n [label]=\"'components.upload.upload' | transloco\"\r\n [icon]=\"'general.upload-01'\"\r\n (onClick)=\"\r\n !this.loading() && !this.disabled() && !this.readonly()\r\n ? uploadInput.click()\r\n : ''\r\n \"\r\n [disabled]=\"disabled() || loading() || readonly()\"\r\n />\r\n }\r\n }\r\n </div>\r\n </mt-card>\r\n} @else {\r\n <div class=\"flex flex-col items-start gap-2 w-full\">\r\n @if (label()) {\r\n <label\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n }\r\n\r\n <div\r\n class=\"w-full flex gap-3 items-center justify-center border-2 border-dashed border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50\"\r\n [class]=\"this.disabled() ? 'bg-gray-50' : ''\"\r\n (click)=\"\r\n !this.loading() && !this.disabled() && !this.readonly()\r\n ? uploadInput.click()\r\n : ''\r\n \"\r\n [class.border-blue-500]=\"isDragging()\"\r\n [class.bg-blue-50]=\"isDragging()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n @if (value()) {\r\n <mt-upload-file-preview\r\n style=\"width: 100%\"\r\n [value]=\"value()\"\r\n [imgPath]=\"imgPath()\"\r\n [disabled]=\"disabled()\"\r\n [readonly]=\"readonly()\"\r\n [loading]=\"loading()\"\r\n [context]=\"context()\"\r\n [uploadProgress]=\"uploadProgress()\"\r\n (onUploadInputClicked)=\"uploadInput.click()\"\r\n (ondDownloadFile)=\"downloadFile($event)\"\r\n (onDeleteFile)=\"onDelete()\"\r\n />\r\n } @else {\r\n @if (loading()) {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <p class=\"text-lg text-gray-500\">\r\n {{\r\n (\"components.upload.uploading\" | transloco) +\r\n uploadProgress() +\r\n \"%\"\r\n }}\r\n </p>\r\n </div>\r\n } @else {\r\n <div class=\"w-full flex gap-3 items-center justify-center p-3\">\r\n <mt-icon icon=\"general.upload-01\" />\r\n <p class=\"text-lg text-gray-500\">\r\n {{ \"components.upload.clickOrDrop\" | transloco }}\r\n </p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n}\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["finalize","catchError"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.98",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/components",
|
|
6
6
|
"linkDirectory": true,
|
|
@@ -253,4 +253,4 @@
|
|
|
253
253
|
"dependencies": {
|
|
254
254
|
"tslib": "^2.8.1"
|
|
255
255
|
}
|
|
256
|
-
}
|
|
256
|
+
}
|
|
@@ -2,7 +2,7 @@ import * as _angular_core from '@angular/core';
|
|
|
2
2
|
import { ElementRef, NgZone } from '@angular/core';
|
|
3
3
|
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
4
4
|
|
|
5
|
-
type EntityViewType = 'Text' | 'LongText' | 'Date' | 'DateTime' | 'Percentage' | 'Status' | 'Currency' | 'Checkbox' | 'User' | 'Lookup';
|
|
5
|
+
type EntityViewType = 'Text' | 'LongText' | 'Date' | 'DateTime' | 'Percentage' | 'Status' | 'Currency' | 'Checkbox' | 'User' | 'Lookup' | 'Attachment';
|
|
6
6
|
/** Entity size – controls column span (1-24) inside a 24-column grid */
|
|
7
7
|
type EntitySize = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24;
|
|
8
8
|
interface EntityBaseConfig {
|
|
@@ -40,6 +40,15 @@ interface EntityUserValue {
|
|
|
40
40
|
phoneNumber?: string;
|
|
41
41
|
email?: string;
|
|
42
42
|
}
|
|
43
|
+
interface EntityAttachmentItemValue {
|
|
44
|
+
id?: string;
|
|
45
|
+
name?: string;
|
|
46
|
+
fileName?: string;
|
|
47
|
+
contentType?: string;
|
|
48
|
+
extension?: string;
|
|
49
|
+
size?: number;
|
|
50
|
+
}
|
|
51
|
+
type EntityAttachmentValue = EntityAttachmentItemValue[];
|
|
43
52
|
interface EntityData {
|
|
44
53
|
id?: number;
|
|
45
54
|
propertyId?: number;
|
|
@@ -48,7 +57,7 @@ interface EntityData {
|
|
|
48
57
|
name?: string;
|
|
49
58
|
rawValue?: string;
|
|
50
59
|
order?: number;
|
|
51
|
-
value: string | EntityStatusValue | EntityUserValue | EntityLookupValue;
|
|
60
|
+
value: string | EntityStatusValue | EntityUserValue | EntityLookupValue | EntityAttachmentValue;
|
|
52
61
|
viewType: EntityViewType;
|
|
53
62
|
type?: string;
|
|
54
63
|
configuration?: EntityConfiguration;
|
|
@@ -212,6 +221,20 @@ declare class EntityLookup {
|
|
|
212
221
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityLookup, "mt-entity-lookup", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
213
222
|
}
|
|
214
223
|
|
|
224
|
+
declare class EntityAttachment {
|
|
225
|
+
readonly data: _angular_core.InputSignal<EntityData | undefined>;
|
|
226
|
+
readonly name: _angular_core.InputSignal<string | undefined>;
|
|
227
|
+
readonly value: _angular_core.InputSignal<EntityAttachmentItemValue | EntityAttachmentValue | undefined>;
|
|
228
|
+
readonly displayName: _angular_core.Signal<string>;
|
|
229
|
+
readonly hideName: _angular_core.Signal<boolean>;
|
|
230
|
+
readonly attachments: _angular_core.Signal<EntityAttachmentItemValue[]>;
|
|
231
|
+
protected readonly empty = "-";
|
|
232
|
+
protected toUploadValue(attachment: EntityAttachmentItemValue): unknown;
|
|
233
|
+
protected trackAttachment(index: number, attachment: EntityAttachmentItemValue): string;
|
|
234
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntityAttachment, never>;
|
|
235
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntityAttachment, "mt-entity-attachment", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
236
|
+
}
|
|
237
|
+
|
|
215
238
|
declare class EntityPreview {
|
|
216
239
|
/** Single entity data to display */
|
|
217
240
|
readonly data: _angular_core.InputSignal<EntityData>;
|
|
@@ -296,5 +319,5 @@ declare class EntitiesManage extends EntitiesResizeBase {
|
|
|
296
319
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitiesManage, "mt-entities-manage", never, { "entities": { "alias": "entities"; "required": true; "isSignal": true; }; }, { "entities": "entitiesChange"; "entitiesReordered": "entitiesReordered"; }, never, never, true, never>;
|
|
297
320
|
}
|
|
298
321
|
|
|
299
|
-
export { EntitiesManage, EntitiesPreview, EntitiesResizeBase, EntityCheckbox, EntityCurrency, EntityDate, EntityLongText, EntityLookup, EntityPercentage, EntityPreview, EntityStatus, EntityText, EntityUser };
|
|
300
|
-
export type { EntityBaseConfig, EntityConfiguration, EntityData, EntityLookupValue, EntityPercentageConfig, EntityResizeEvent, EntitySize, EntityStatusValue, EntityUserConfig, EntityUserValue, EntityViewType };
|
|
322
|
+
export { EntitiesManage, EntitiesPreview, EntitiesResizeBase, EntityAttachment, EntityCheckbox, EntityCurrency, EntityDate, EntityLongText, EntityLookup, EntityPercentage, EntityPreview, EntityStatus, EntityText, EntityUser };
|
|
323
|
+
export type { EntityAttachmentItemValue, EntityAttachmentValue, EntityBaseConfig, EntityConfiguration, EntityData, EntityLookupValue, EntityPercentageConfig, EntityResizeEvent, EntitySize, EntityStatusValue, EntityUserConfig, EntityUserValue, EntityViewType };
|