@masterteam/components 0.0.170 → 0.0.172
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/common.css +1 -1
- package/assets/i18n/ar.json +282 -278
- package/assets/i18n/en.json +282 -257
- package/fesm2022/masterteam-components-dynamic-drawer.mjs +21 -0
- package/fesm2022/masterteam-components-dynamic-drawer.mjs.map +1 -1
- package/fesm2022/masterteam-components-entities.mjs +115 -7
- package/fesm2022/masterteam-components-entities.mjs.map +1 -1
- package/fesm2022/masterteam-components-location-field.mjs +315 -0
- package/fesm2022/masterteam-components-location-field.mjs.map +1 -0
- package/fesm2022/masterteam-components-multi-select-field.mjs +2 -2
- package/fesm2022/masterteam-components-multi-select-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-radio-cards-field.mjs +7 -4
- package/fesm2022/masterteam-components-radio-cards-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-select-field.mjs +2 -2
- package/fesm2022/masterteam-components-select-field.mjs.map +1 -1
- package/fesm2022/masterteam-components-sidebar.mjs +2 -2
- package/fesm2022/masterteam-components-sidebar.mjs.map +1 -1
- package/fesm2022/masterteam-components-table.mjs +30 -8
- package/fesm2022/masterteam-components-table.mjs.map +1 -1
- package/fesm2022/masterteam-components-tabs.mjs +31 -3
- package/fesm2022/masterteam-components-tabs.mjs.map +1 -1
- package/fesm2022/masterteam-components-tree.mjs +13 -0
- package/fesm2022/masterteam-components-tree.mjs.map +1 -1
- package/fesm2022/masterteam-components-upload-field.mjs +86 -5
- package/fesm2022/masterteam-components-upload-field.mjs.map +1 -1
- package/fesm2022/masterteam-components.mjs +12 -1
- package/fesm2022/masterteam-components.mjs.map +1 -1
- package/package.json +5 -1
- package/types/masterteam-components-dynamic-drawer.d.ts +3 -0
- package/types/masterteam-components-entities.d.ts +32 -5
- package/types/masterteam-components-location-field.d.ts +95 -0
- package/types/masterteam-components-radio-cards-field.d.ts +2 -1
- package/types/masterteam-components-tabs.d.ts +3 -0
- package/types/masterteam-components-tree.d.ts +4 -0
- package/types/masterteam-components-upload-field.d.ts +13 -0
- package/types/masterteam-components.d.ts +13 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-components-dynamic-drawer.mjs","sources":["../../../../packages/masterteam/components/dynamic-drawer/dynamic-drawer-host.ts","../../../../packages/masterteam/components/dynamic-drawer/dynamic-drawer.ts","../../../../packages/masterteam/components/dynamic-drawer/masterteam-components-dynamic-drawer.ts"],"sourcesContent":["import { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport {\r\n Component,\r\n ElementRef,\r\n Injector,\r\n Input,\r\n Renderer2,\r\n RendererStyleFlags2,\r\n effect,\r\n inject,\r\n signal,\r\n InjectionToken,\r\n model,\r\n computed,\r\n Injectable,\r\n} from '@angular/core';\r\nimport { NgComponentOutlet } from '@angular/common';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\nexport const DynamicDrawerConfig = new InjectionToken<any>(\r\n 'DynamicDrawerConfig',\r\n);\r\n\r\n/**\r\n * Controller to dynamically update drawer properties from inside the child component.\r\n * Inject this in your drawer content component to modify drawer behavior.\r\n */\r\n@Injectable()\r\nexport class DrawerController {\r\n private _styleClass = signal<string>('');\r\n private _header = signal<string>('');\r\n private _fullScreen = signal<boolean | undefined>(undefined);\r\n private _maximized = signal<boolean>(false);\r\n\r\n /** Get the current additional styleClass */\r\n get styleClass() {\r\n return this._styleClass;\r\n }\r\n\r\n /** Get the current header */\r\n get header() {\r\n return this._header;\r\n }\r\n\r\n /** Get the current fullScreen state */\r\n get fullScreen() {\r\n return this._fullScreen;\r\n }\r\n\r\n /** Get the current maximized (full-width) state */\r\n get maximized() {\r\n return this._maximized;\r\n }\r\n\r\n /** Add or replace the dynamic styleClass */\r\n setStyleClass(styleClass: string) {\r\n this._styleClass.set(styleClass);\r\n }\r\n\r\n /** Append a class to the existing styleClass */\r\n addClass(className: string) {\r\n const current = this._styleClass();\r\n if (!current.includes(className)) {\r\n this._styleClass.set((current + ' ' + className).trim());\r\n }\r\n }\r\n\r\n /** Remove a class from the styleClass */\r\n removeClass(className: string) {\r\n const current = this._styleClass();\r\n this._styleClass.set(\r\n current\r\n .split(' ')\r\n .filter((c) => c !== className)\r\n .join(' '),\r\n );\r\n }\r\n\r\n /** Toggle a class on/off */\r\n toggleClass(className: string) {\r\n if (this._styleClass().includes(className)) {\r\n this.removeClass(className);\r\n } else {\r\n this.addClass(className);\r\n }\r\n }\r\n\r\n /** Update the drawer header */\r\n setHeader(header: string) {\r\n this._header.set(header);\r\n }\r\n\r\n /** Toggle fullScreen mode */\r\n setFullScreen(fullScreen: boolean) {\r\n this._fullScreen.set(fullScreen);\r\n }\r\n\r\n /** Set maximized (full-width) state */\r\n setMaximized(maximized: boolean) {\r\n this._maximized.set(maximized);\r\n }\r\n\r\n /** Toggle maximized (full-width) state */\r\n toggleMaximized() {\r\n this._maximized.set(!this._maximized());\r\n }\r\n}\r\nimport { Button } from '@masterteam/components/button';\r\n\r\n@Component({\r\n selector: 'mt-dynamic-drawer-host',\r\n standalone: true,\r\n imports: [NgComponentOutlet, DrawerModule, Button],\r\n template: `\r\n <p-drawer\r\n [(visible)]=\"visible\"\r\n [appendTo]=\"'self'\"\r\n [style]=\"computedDrawerStyle()\"\r\n [closable]=\"cfg()?.closable\"\r\n [position]=\"cfg()?.position\"\r\n [fullScreen]=\"computedFullScreen()\"\r\n [modal]=\"cfg()?.modal\"\r\n [closeOnEscape]=\"cfg()?.closeOnEscape\"\r\n [dismissible]=\"cfg()?.dismissible\"\r\n [transitionOptions]=\"cfg()?.transitionOptions\"\r\n [styleClass]=\"computedStyleClass()\"\r\n (onShow)=\"onDrawerShow()\"\r\n (onHide)=\"onDrawerHide()\"\r\n >\r\n <ng-template #header>\r\n <div\r\n class=\"flex items-center justify-between px-5 w-full py-3 border-b border-surface\"\r\n >\r\n <h3 class=\"text-xl font-semibold\">{{ computedHeader() }}</h3>\r\n <div class=\"flex items-center gap-2\">\r\n @if (canShowMaximizeToggle()) {\r\n <mt-button\r\n (onClick)=\"toggleMaximized()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n severity=\"secondary\"\r\n [icon]=\"maximizeButtonIcon()\"\r\n [tooltip]=\"maximizeButtonTooltip()\"\r\n >\r\n </mt-button>\r\n }\r\n <mt-button\r\n (onClick)=\"handleHide()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n >\r\n </mt-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n @if (childInjector) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n cmp();\r\n injector: childInjector;\r\n inputs: cmpInputs()\r\n \"\r\n >\r\n </ng-container>\r\n }\r\n </p-drawer>\r\n `,\r\n})\r\nexport class DynamicDrawerHost {\r\n public visible = model<boolean>(false);\r\n cmp = signal<any>(null);\r\n cfg = signal<any>({ position: 'right' });\r\n cmpInputs = signal<Record<string, unknown>>({});\r\n childInjector!: Injector;\r\n private ref?: DynamicDialogRef;\r\n private drawerController = new DrawerController();\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly transloco = inject(TranslocoService);\r\n private resizeAnimTimer: ReturnType<typeof setTimeout> | null = null;\r\n private readonly RESIZE_ANIM_CLASS = 'mt-drawer--anim-resize';\r\n private readonly RESIZE_ANIM_DURATION_MS = 700;\r\n\r\n constructor() {\r\n effect(() => {\r\n // React only when the user toggles maximize while the drawer is open.\r\n // Closing/opening goes through onDrawerShow / onDrawerHide so we never\r\n // race with PrimeNG's slide animation.\r\n const isMaximized = this.drawerController.maximized();\r\n if (!this.visible()) {\r\n return;\r\n }\r\n this.applyMaximizedInlineStyles(isMaximized, true);\r\n });\r\n }\r\n\r\n /** Computed styleClass combining config + dynamic controller class */\r\n computedStyleClass = computed(() => {\r\n const configClass = this.cfg()?.styleClass ?? '';\r\n const dynamicClass = this.drawerController.styleClass();\r\n const maximizedClass = this.drawerController.maximized()\r\n ? 'mt-drawer--maximized'\r\n : '';\r\n return `${configClass} ${dynamicClass} mt-drawer ${maximizedClass}`\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n });\r\n\r\n /** Whether the maximize toggle button is visible in the header */\r\n canShowMaximizeToggle = computed(() => {\r\n const config = this.cfg();\r\n if (config?.showMaximizeToggle === false) {\r\n return false;\r\n }\r\n if (this.computedFullScreen()) {\r\n return false;\r\n }\r\n const position = config?.position ?? 'right';\r\n return position === 'left' || position === 'right';\r\n });\r\n\r\n /** Tooltip for maximize/restore button (state-aware) */\r\n maximizeButtonTooltip = computed(() => {\r\n const config = this.cfg();\r\n return this.drawerController.maximized()\r\n ? (config?.restoreTooltip ??\r\n this.transloco.translate('components.drawer.restoreSize'))\r\n : (config?.maximizeTooltip ??\r\n this.transloco.translate('components.drawer.expandFullWidth'));\r\n });\r\n\r\n /** Icon for maximize/restore button (state-aware) */\r\n maximizeButtonIcon = computed(() =>\r\n this.drawerController.maximized()\r\n ? 'layout.minimize-01'\r\n : 'layout.maximize-01',\r\n );\r\n\r\n /** Toggle the drawer's full-width state */\r\n toggleMaximized() {\r\n this.drawerController.toggleMaximized();\r\n }\r\n\r\n computedDrawerStyle = computed<Record<string, string> | null>(() => {\r\n const appendTo = this.cfg()?.appendTo;\r\n if (!appendTo || appendTo === 'body') {\r\n return { position: 'fixed' };\r\n }\r\n\r\n return null;\r\n });\r\n\r\n /** Computed header - controller overrides config if set */\r\n computedHeader = computed(() => {\r\n const dynamicHeader = this.drawerController.header();\r\n return dynamicHeader || this.cfg()?.header || '';\r\n });\r\n\r\n /** Computed fullScreen - controller overrides config if set */\r\n computedFullScreen = computed(() => {\r\n const dynamicFullScreen = this.drawerController.fullScreen();\r\n return dynamicFullScreen !== undefined\r\n ? dynamicFullScreen\r\n : this.cfg()?.fullScreen;\r\n });\r\n\r\n @Input({ required: true })\r\n connect(opts: {\r\n component: any;\r\n config?: any;\r\n parent: Injector;\r\n ref: DynamicDialogRef;\r\n }) {\r\n this.cmp.set(opts.component);\r\n this.cfg.set(opts.config ?? {});\r\n this.cmpInputs.set(opts.config?.inputValues ?? {});\r\n this.ref = opts.ref;\r\n this.childInjector = Injector.create({\r\n parent: opts.parent,\r\n providers: [\r\n { provide: DynamicDrawerConfig, useValue: opts.config ?? {} },\r\n { provide: DynamicDialogRef, useValue: opts.ref },\r\n { provide: DrawerController, useValue: this.drawerController },\r\n ],\r\n });\r\n\r\n opts.ref.onClose.subscribe(() => {\r\n this.visible.set(false);\r\n });\r\n }\r\n\r\n show() {\r\n this.visible.set(true);\r\n }\r\n\r\n handleHide(data = null) {\r\n this.visible.set(false);\r\n this.ref?.close(data);\r\n }\r\n\r\n onDrawerShow() {\r\n // Drawer DOM only exists after PrimeNG renders it — apply current state\r\n // instantly so the open animation doesn't fight the resize transition.\r\n this.applyMaximizedInlineStyles(this.drawerController.maximized(), false);\r\n }\r\n\r\n onDrawerHide() {\r\n // Instant cleanup — close animation already done; we don't want to start\r\n // a 650ms width transition mid-hide.\r\n this.applyMaximizedInlineStyles(false, false);\r\n }\r\n\r\n private getDrawerElement(): HTMLElement | null {\r\n return this.host.nativeElement.querySelector(\r\n '.p-drawer',\r\n ) as HTMLElement | null;\r\n }\r\n\r\n private applyMaximizedInlineStyles(\r\n isMaximized: boolean,\r\n animate: boolean,\r\n ): void {\r\n const drawerEl = this.getDrawerElement();\r\n if (!drawerEl) {\r\n return;\r\n }\r\n\r\n if (this.resizeAnimTimer) {\r\n clearTimeout(this.resizeAnimTimer);\r\n this.resizeAnimTimer = null;\r\n }\r\n\r\n if (animate) {\r\n this.renderer.addClass(drawerEl, this.RESIZE_ANIM_CLASS);\r\n this.resizeAnimTimer = setTimeout(() => {\r\n this.renderer.removeClass(drawerEl, this.RESIZE_ANIM_CLASS);\r\n this.resizeAnimTimer = null;\r\n }, this.RESIZE_ANIM_DURATION_MS);\r\n } else {\r\n this.renderer.removeClass(drawerEl, this.RESIZE_ANIM_CLASS);\r\n }\r\n\r\n if (isMaximized) {\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'width',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'max-width',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'height',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'max-height',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n } else {\r\n this.renderer.removeStyle(drawerEl, 'width');\r\n this.renderer.removeStyle(drawerEl, 'max-width');\r\n this.renderer.removeStyle(drawerEl, 'height');\r\n this.renderer.removeStyle(drawerEl, 'max-height');\r\n }\r\n }\r\n}\r\n","// dynamic-drawer.service.ts\r\nimport {\r\n Injectable,\r\n Type,\r\n createComponent,\r\n EnvironmentInjector,\r\n ApplicationRef,\r\n Injector,\r\n DestroyRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { DynamicDrawerHost } from './dynamic-drawer-host';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\n\r\nexport interface DynamicDrawerConfigInterface {\r\n header?: string;\r\n position?: string;\r\n data?: any;\r\n fullScreen?: boolean;\r\n modal?: boolean;\r\n closable?: boolean;\r\n closeOnEscape?: boolean;\r\n dismissible?: boolean;\r\n appendTo?: any;\r\n transitionOptions?: string;\r\n styleClass?: string;\r\n inputValues?: any;\r\n showMaximizeToggle?: boolean;\r\n maximizeTooltip?: string;\r\n restoreTooltip?: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DrawerService {\r\n private appRef = inject(ApplicationRef);\r\n private env = inject(EnvironmentInjector);\r\n private rootInjector = inject(Injector);\r\n private destroyRef = inject(DestroyRef);\r\n private doc = inject(DOCUMENT);\r\n private hostRef?: ReturnType<typeof createComponent<DynamicDrawerHost>>;\r\n private transloco = inject(TranslocoService);\r\n defauiltConfig: DynamicDrawerConfigInterface = {\r\n position: 'right',\r\n modal: true,\r\n closable: false,\r\n transitionOptions: '200ms cubic-bezier(0, 0, 1, 1)',\r\n inputValues: {},\r\n showMaximizeToggle: true,\r\n maximizeTooltip: this.transloco.translate(\r\n 'components.drawer.expandFullWidth',\r\n ),\r\n restoreTooltip: this.transloco.translate('components.drawer.restoreSize'),\r\n };\r\n\r\n constructor() {\r\n this.preloadDrawerHost();\r\n }\r\n\r\n open<T>(\r\n component: Type<any>,\r\n config: DynamicDrawerConfigInterface = {},\r\n ): DynamicDialogRef<T> {\r\n config = { ...this.defauiltConfig, ...config };\r\n\r\n const targetEl = this.resolveAppendTarget(config.appendTo);\r\n\r\n this.hostRef = createComponent(DynamicDrawerHost, {\r\n environmentInjector: this.env,\r\n });\r\n\r\n const ref = new DynamicDialogRef<T>();\r\n this.hostRef.instance.connect({\r\n component,\r\n config,\r\n parent: this.rootInjector,\r\n ref,\r\n });\r\n\r\n this.appRef.attachView(this.hostRef.hostView);\r\n\r\n // 📌 append to target (NOT body when provided)\r\n targetEl.appendChild(this.hostRef.location.nativeElement);\r\n\r\n // 🧹 auto-clean if app destroyed (SSR / HMR safety)\r\n this.destroyRef.onDestroy(() => {\r\n this.appRef.detachView(this.hostRef!.hostView);\r\n this.hostRef!.destroy();\r\n this.hostRef = undefined;\r\n });\r\n\r\n const currentHostRef = this.hostRef;\r\n const openDrawer = () => {\r\n if (this.hostRef !== currentHostRef) {\r\n return;\r\n }\r\n\r\n currentHostRef.instance.show();\r\n };\r\n\r\n if (this.doc.defaultView?.requestAnimationFrame) {\r\n this.doc.defaultView.requestAnimationFrame(openDrawer);\r\n } else {\r\n setTimeout(openDrawer, 0);\r\n }\r\n\r\n return ref;\r\n }\r\n\r\n private preloadDrawerHost() {\r\n const preloadHostRef = createComponent(DynamicDrawerHost, {\r\n environmentInjector: this.env,\r\n });\r\n const preloadElement = preloadHostRef.location.nativeElement as HTMLElement;\r\n\r\n preloadElement.style.display = 'none';\r\n\r\n this.appRef.attachView(preloadHostRef.hostView);\r\n this.doc.body.appendChild(preloadElement);\r\n preloadHostRef.changeDetectorRef.detectChanges();\r\n this.appRef.detachView(preloadHostRef.hostView);\r\n preloadElement.remove();\r\n preloadHostRef.destroy();\r\n }\r\n\r\n private resolveAppendTarget(appendTo?: string | HTMLElement): HTMLElement {\r\n if (!appendTo) return this.doc.body;\r\n\r\n if (typeof appendTo === 'string') {\r\n const selector =\r\n appendTo.startsWith('#') || appendTo.startsWith('.')\r\n ? appendTo\r\n : `#${appendTo}`;\r\n const el = this.doc.querySelector(selector) as HTMLElement | null;\r\n if (!el) {\r\n return this.doc.body;\r\n }\r\n return el;\r\n }\r\n\r\n return appendTo; // HTMLElement passed directly\r\n }\r\n}\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-dynamic-drawer.mjs","sources":["../../../../packages/masterteam/components/dynamic-drawer/dynamic-drawer-host.ts","../../../../packages/masterteam/components/dynamic-drawer/dynamic-drawer.ts","../../../../packages/masterteam/components/dynamic-drawer/masterteam-components-dynamic-drawer.ts"],"sourcesContent":["import { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport {\r\n Component,\r\n ElementRef,\r\n Injector,\r\n Input,\r\n Renderer2,\r\n RendererStyleFlags2,\r\n effect,\r\n inject,\r\n signal,\r\n InjectionToken,\r\n model,\r\n computed,\r\n Injectable,\r\n} from '@angular/core';\r\nimport { NgComponentOutlet } from '@angular/common';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\n\r\nexport const DynamicDrawerConfig = new InjectionToken<any>(\r\n 'DynamicDrawerConfig',\r\n);\r\n\r\n/**\r\n * Controller to dynamically update drawer properties from inside the child component.\r\n * Inject this in your drawer content component to modify drawer behavior.\r\n */\r\n@Injectable()\r\nexport class DrawerController {\r\n private _styleClass = signal<string>('');\r\n private _header = signal<string>('');\r\n private _fullScreen = signal<boolean | undefined>(undefined);\r\n private _maximized = signal<boolean>(false);\r\n\r\n /** Get the current additional styleClass */\r\n get styleClass() {\r\n return this._styleClass;\r\n }\r\n\r\n /** Get the current header */\r\n get header() {\r\n return this._header;\r\n }\r\n\r\n /** Get the current fullScreen state */\r\n get fullScreen() {\r\n return this._fullScreen;\r\n }\r\n\r\n /** Get the current maximized (full-width) state */\r\n get maximized() {\r\n return this._maximized;\r\n }\r\n\r\n /** Add or replace the dynamic styleClass */\r\n setStyleClass(styleClass: string) {\r\n this._styleClass.set(styleClass);\r\n }\r\n\r\n /** Append a class to the existing styleClass */\r\n addClass(className: string) {\r\n const current = this._styleClass();\r\n if (!current.includes(className)) {\r\n this._styleClass.set((current + ' ' + className).trim());\r\n }\r\n }\r\n\r\n /** Remove a class from the styleClass */\r\n removeClass(className: string) {\r\n const current = this._styleClass();\r\n this._styleClass.set(\r\n current\r\n .split(' ')\r\n .filter((c) => c !== className)\r\n .join(' '),\r\n );\r\n }\r\n\r\n /** Toggle a class on/off */\r\n toggleClass(className: string) {\r\n if (this._styleClass().includes(className)) {\r\n this.removeClass(className);\r\n } else {\r\n this.addClass(className);\r\n }\r\n }\r\n\r\n /** Update the drawer header */\r\n setHeader(header: string) {\r\n this._header.set(header);\r\n }\r\n\r\n /** Toggle fullScreen mode */\r\n setFullScreen(fullScreen: boolean) {\r\n this._fullScreen.set(fullScreen);\r\n }\r\n\r\n /** Set maximized (full-width) state */\r\n setMaximized(maximized: boolean) {\r\n this._maximized.set(maximized);\r\n }\r\n\r\n /** Toggle maximized (full-width) state */\r\n toggleMaximized() {\r\n this._maximized.set(!this._maximized());\r\n }\r\n}\r\nimport { Button } from '@masterteam/components/button';\r\n\r\n@Component({\r\n selector: 'mt-dynamic-drawer-host',\r\n standalone: true,\r\n imports: [NgComponentOutlet, DrawerModule, Button],\r\n template: `\r\n <p-drawer\r\n [(visible)]=\"visible\"\r\n [appendTo]=\"'self'\"\r\n [style]=\"computedDrawerStyle()\"\r\n [closable]=\"cfg()?.closable\"\r\n [position]=\"cfg()?.position\"\r\n [fullScreen]=\"computedFullScreen()\"\r\n [modal]=\"cfg()?.modal\"\r\n [closeOnEscape]=\"cfg()?.closeOnEscape\"\r\n [dismissible]=\"cfg()?.dismissible\"\r\n [transitionOptions]=\"cfg()?.transitionOptions\"\r\n [styleClass]=\"computedStyleClass()\"\r\n (onShow)=\"onDrawerShow()\"\r\n (onHide)=\"onDrawerHide()\"\r\n >\r\n <ng-template #header>\r\n <div\r\n class=\"flex items-center justify-between px-5 w-full py-3 border-b border-surface\"\r\n >\r\n <h3 class=\"text-xl font-semibold\">{{ computedHeader() }}</h3>\r\n <div class=\"flex items-center gap-2\">\r\n @if (canShowMaximizeToggle()) {\r\n <mt-button\r\n (onClick)=\"toggleMaximized()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n severity=\"secondary\"\r\n [icon]=\"maximizeButtonIcon()\"\r\n [tooltip]=\"maximizeButtonTooltip()\"\r\n >\r\n </mt-button>\r\n }\r\n <mt-button\r\n (onClick)=\"handleHide()\"\r\n variant=\"outlined\"\r\n styleClass=\"!bg-white\"\r\n icon=\"general.x-close\"\r\n severity=\"secondary\"\r\n >\r\n </mt-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n @if (childInjector) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n cmp();\r\n injector: childInjector;\r\n inputs: cmpInputs()\r\n \"\r\n >\r\n </ng-container>\r\n }\r\n </p-drawer>\r\n `,\r\n})\r\nexport class DynamicDrawerHost {\r\n public visible = model<boolean>(false);\r\n cmp = signal<any>(null);\r\n cfg = signal<any>({ position: 'right' });\r\n cmpInputs = signal<Record<string, unknown>>({});\r\n childInjector!: Injector;\r\n private ref?: DynamicDialogRef;\r\n // Guards against emitting onClose twice: the X button closes via\r\n // handleHide() (programmatic visible=false, no PrimeNG onHide), while a\r\n // backdrop click / Escape closes via PrimeNG's own close() which DOES emit\r\n // onHide. Without bridging onHide -> ref.close(), consumers never learn\r\n // about dismiss-by-outside-click / Escape.\r\n private closed = false;\r\n private drawerController = new DrawerController();\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly transloco = inject(TranslocoService);\r\n private resizeAnimTimer: ReturnType<typeof setTimeout> | null = null;\r\n private readonly RESIZE_ANIM_CLASS = 'mt-drawer--anim-resize';\r\n private readonly RESIZE_ANIM_DURATION_MS = 700;\r\n\r\n constructor() {\r\n effect(() => {\r\n // React only when the user toggles maximize while the drawer is open.\r\n // Closing/opening goes through onDrawerShow / onDrawerHide so we never\r\n // race with PrimeNG's slide animation.\r\n const isMaximized = this.drawerController.maximized();\r\n if (!this.visible()) {\r\n return;\r\n }\r\n this.applyMaximizedInlineStyles(isMaximized, true);\r\n });\r\n }\r\n\r\n /** Computed styleClass combining config + dynamic controller class */\r\n computedStyleClass = computed(() => {\r\n const configClass = this.cfg()?.styleClass ?? '';\r\n const dynamicClass = this.drawerController.styleClass();\r\n const maximizedClass = this.drawerController.maximized()\r\n ? 'mt-drawer--maximized'\r\n : '';\r\n return `${configClass} ${dynamicClass} mt-drawer ${maximizedClass}`\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n });\r\n\r\n /** Whether the maximize toggle button is visible in the header */\r\n canShowMaximizeToggle = computed(() => {\r\n const config = this.cfg();\r\n if (config?.showMaximizeToggle === false) {\r\n return false;\r\n }\r\n if (this.computedFullScreen()) {\r\n return false;\r\n }\r\n const position = config?.position ?? 'right';\r\n return position === 'left' || position === 'right';\r\n });\r\n\r\n /** Tooltip for maximize/restore button (state-aware) */\r\n maximizeButtonTooltip = computed(() => {\r\n const config = this.cfg();\r\n return this.drawerController.maximized()\r\n ? (config?.restoreTooltip ??\r\n this.transloco.translate('components.drawer.restoreSize'))\r\n : (config?.maximizeTooltip ??\r\n this.transloco.translate('components.drawer.expandFullWidth'));\r\n });\r\n\r\n /** Icon for maximize/restore button (state-aware) */\r\n maximizeButtonIcon = computed(() =>\r\n this.drawerController.maximized()\r\n ? 'layout.minimize-01'\r\n : 'layout.maximize-01',\r\n );\r\n\r\n /** Toggle the drawer's full-width state */\r\n toggleMaximized() {\r\n this.drawerController.toggleMaximized();\r\n }\r\n\r\n computedDrawerStyle = computed<Record<string, string> | null>(() => {\r\n const appendTo = this.cfg()?.appendTo;\r\n if (!appendTo || appendTo === 'body') {\r\n return { position: 'fixed' };\r\n }\r\n\r\n return null;\r\n });\r\n\r\n /** Computed header - controller overrides config if set */\r\n computedHeader = computed(() => {\r\n const dynamicHeader = this.drawerController.header();\r\n return dynamicHeader || this.cfg()?.header || '';\r\n });\r\n\r\n /** Computed fullScreen - controller overrides config if set */\r\n computedFullScreen = computed(() => {\r\n const dynamicFullScreen = this.drawerController.fullScreen();\r\n return dynamicFullScreen !== undefined\r\n ? dynamicFullScreen\r\n : this.cfg()?.fullScreen;\r\n });\r\n\r\n @Input({ required: true })\r\n connect(opts: {\r\n component: any;\r\n config?: any;\r\n parent: Injector;\r\n ref: DynamicDialogRef;\r\n }) {\r\n this.cmp.set(opts.component);\r\n this.cfg.set(opts.config ?? {});\r\n this.cmpInputs.set(opts.config?.inputValues ?? {});\r\n this.ref = opts.ref;\r\n this.childInjector = Injector.create({\r\n parent: opts.parent,\r\n providers: [\r\n { provide: DynamicDrawerConfig, useValue: opts.config ?? {} },\r\n { provide: DynamicDialogRef, useValue: opts.ref },\r\n { provide: DrawerController, useValue: this.drawerController },\r\n ],\r\n });\r\n\r\n opts.ref.onClose.subscribe(() => {\r\n this.visible.set(false);\r\n });\r\n }\r\n\r\n show() {\r\n this.closed = false;\r\n this.visible.set(true);\r\n }\r\n\r\n handleHide(data = null) {\r\n this.visible.set(false);\r\n this.closeOnce(data);\r\n }\r\n\r\n /** Close the drawer ref at most once, regardless of the close path. */\r\n private closeOnce(data: unknown = null): void {\r\n if (this.closed) {\r\n return;\r\n }\r\n this.closed = true;\r\n this.ref?.close(data);\r\n }\r\n\r\n onDrawerShow() {\r\n // Drawer DOM only exists after PrimeNG renders it — apply current state\r\n // instantly so the open animation doesn't fight the resize transition.\r\n this.applyMaximizedInlineStyles(this.drawerController.maximized(), false);\r\n }\r\n\r\n onDrawerHide() {\r\n // Instant cleanup — close animation already done; we don't want to start\r\n // a 650ms width transition mid-hide.\r\n this.applyMaximizedInlineStyles(false, false);\r\n\r\n // PrimeNG emits (onHide) when the drawer is dismissed via backdrop click\r\n // or Escape (its close() -> hide(true)). The X button instead closes\r\n // programmatically (visible=false -> onAfterLeave -> hide(false)), so it\r\n // does not reach here. Bridge the dismiss paths to ref.close() so\r\n // consumers' onClose runs for every close path. closeOnce() de-dupes.\r\n this.closeOnce();\r\n }\r\n\r\n private getDrawerElement(): HTMLElement | null {\r\n return this.host.nativeElement.querySelector(\r\n '.p-drawer',\r\n ) as HTMLElement | null;\r\n }\r\n\r\n private applyMaximizedInlineStyles(\r\n isMaximized: boolean,\r\n animate: boolean,\r\n ): void {\r\n const drawerEl = this.getDrawerElement();\r\n if (!drawerEl) {\r\n return;\r\n }\r\n\r\n if (this.resizeAnimTimer) {\r\n clearTimeout(this.resizeAnimTimer);\r\n this.resizeAnimTimer = null;\r\n }\r\n\r\n if (animate) {\r\n this.renderer.addClass(drawerEl, this.RESIZE_ANIM_CLASS);\r\n this.resizeAnimTimer = setTimeout(() => {\r\n this.renderer.removeClass(drawerEl, this.RESIZE_ANIM_CLASS);\r\n this.resizeAnimTimer = null;\r\n }, this.RESIZE_ANIM_DURATION_MS);\r\n } else {\r\n this.renderer.removeClass(drawerEl, this.RESIZE_ANIM_CLASS);\r\n }\r\n\r\n if (isMaximized) {\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'width',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'max-width',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'height',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n this.renderer.setStyle(\r\n drawerEl,\r\n 'max-height',\r\n '100%',\r\n RendererStyleFlags2.Important,\r\n );\r\n } else {\r\n this.renderer.removeStyle(drawerEl, 'width');\r\n this.renderer.removeStyle(drawerEl, 'max-width');\r\n this.renderer.removeStyle(drawerEl, 'height');\r\n this.renderer.removeStyle(drawerEl, 'max-height');\r\n }\r\n }\r\n}\r\n","// dynamic-drawer.service.ts\r\nimport {\r\n Injectable,\r\n Type,\r\n createComponent,\r\n EnvironmentInjector,\r\n ApplicationRef,\r\n Injector,\r\n DestroyRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { DynamicDrawerHost } from './dynamic-drawer-host';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\n\r\nexport interface DynamicDrawerConfigInterface {\r\n header?: string;\r\n position?: string;\r\n data?: any;\r\n fullScreen?: boolean;\r\n modal?: boolean;\r\n closable?: boolean;\r\n closeOnEscape?: boolean;\r\n dismissible?: boolean;\r\n appendTo?: any;\r\n transitionOptions?: string;\r\n styleClass?: string;\r\n inputValues?: any;\r\n showMaximizeToggle?: boolean;\r\n maximizeTooltip?: string;\r\n restoreTooltip?: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DrawerService {\r\n private appRef = inject(ApplicationRef);\r\n private env = inject(EnvironmentInjector);\r\n private rootInjector = inject(Injector);\r\n private destroyRef = inject(DestroyRef);\r\n private doc = inject(DOCUMENT);\r\n private hostRef?: ReturnType<typeof createComponent<DynamicDrawerHost>>;\r\n private transloco = inject(TranslocoService);\r\n defauiltConfig: DynamicDrawerConfigInterface = {\r\n position: 'right',\r\n modal: true,\r\n closable: false,\r\n transitionOptions: '200ms cubic-bezier(0, 0, 1, 1)',\r\n inputValues: {},\r\n showMaximizeToggle: true,\r\n maximizeTooltip: this.transloco.translate(\r\n 'components.drawer.expandFullWidth',\r\n ),\r\n restoreTooltip: this.transloco.translate('components.drawer.restoreSize'),\r\n };\r\n\r\n constructor() {\r\n this.preloadDrawerHost();\r\n }\r\n\r\n open<T>(\r\n component: Type<any>,\r\n config: DynamicDrawerConfigInterface = {},\r\n ): DynamicDialogRef<T> {\r\n config = { ...this.defauiltConfig, ...config };\r\n\r\n const targetEl = this.resolveAppendTarget(config.appendTo);\r\n\r\n this.hostRef = createComponent(DynamicDrawerHost, {\r\n environmentInjector: this.env,\r\n });\r\n\r\n const ref = new DynamicDialogRef<T>();\r\n this.hostRef.instance.connect({\r\n component,\r\n config,\r\n parent: this.rootInjector,\r\n ref,\r\n });\r\n\r\n this.appRef.attachView(this.hostRef.hostView);\r\n\r\n // 📌 append to target (NOT body when provided)\r\n targetEl.appendChild(this.hostRef.location.nativeElement);\r\n\r\n // 🧹 auto-clean if app destroyed (SSR / HMR safety)\r\n this.destroyRef.onDestroy(() => {\r\n this.appRef.detachView(this.hostRef!.hostView);\r\n this.hostRef!.destroy();\r\n this.hostRef = undefined;\r\n });\r\n\r\n const currentHostRef = this.hostRef;\r\n const openDrawer = () => {\r\n if (this.hostRef !== currentHostRef) {\r\n return;\r\n }\r\n\r\n currentHostRef.instance.show();\r\n };\r\n\r\n if (this.doc.defaultView?.requestAnimationFrame) {\r\n this.doc.defaultView.requestAnimationFrame(openDrawer);\r\n } else {\r\n setTimeout(openDrawer, 0);\r\n }\r\n\r\n return ref;\r\n }\r\n\r\n private preloadDrawerHost() {\r\n const preloadHostRef = createComponent(DynamicDrawerHost, {\r\n environmentInjector: this.env,\r\n });\r\n const preloadElement = preloadHostRef.location.nativeElement as HTMLElement;\r\n\r\n preloadElement.style.display = 'none';\r\n\r\n this.appRef.attachView(preloadHostRef.hostView);\r\n this.doc.body.appendChild(preloadElement);\r\n preloadHostRef.changeDetectorRef.detectChanges();\r\n this.appRef.detachView(preloadHostRef.hostView);\r\n preloadElement.remove();\r\n preloadHostRef.destroy();\r\n }\r\n\r\n private resolveAppendTarget(appendTo?: string | HTMLElement): HTMLElement {\r\n if (!appendTo) return this.doc.body;\r\n\r\n if (typeof appendTo === 'string') {\r\n const selector =\r\n appendTo.startsWith('#') || appendTo.startsWith('.')\r\n ? appendTo\r\n : `#${appendTo}`;\r\n const el = this.doc.querySelector(selector) as HTMLElement | null;\r\n if (!el) {\r\n return this.doc.body;\r\n }\r\n return el;\r\n }\r\n\r\n return appendTo; // HTMLElement passed directly\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -451,6 +451,8 @@ class EntityAttachment {
|
|
|
451
451
|
displayName = computed(() => this.data()?.name ?? this.name() ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : /* istanbul ignore next */ []));
|
|
452
452
|
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
453
453
|
attachments = signal([], ...(ngDevMode ? [{ debugName: "attachments" }] : /* istanbul ignore next */ []));
|
|
454
|
+
/** Key of the compact chip currently hovered, so it can reveal the download affordance. */
|
|
455
|
+
hoveredAttachmentKey = signal(null, ...(ngDevMode ? [{ debugName: "hoveredAttachmentKey" }] : /* istanbul ignore next */ []));
|
|
454
456
|
attachmentReferences = computed(() => this.normalizeAttachmentValue(this.data()?.value ?? this.value()), ...(ngDevMode ? [{ debugName: "attachmentReferences" }] : /* istanbul ignore next */ []));
|
|
455
457
|
uploadValue = computed(() => {
|
|
456
458
|
const references = this.attachmentReferences().map((reference) => {
|
|
@@ -511,10 +513,22 @@ class EntityAttachment {
|
|
|
511
513
|
return (attachment.id ?? attachment.fileName ?? attachment.name ?? String(index));
|
|
512
514
|
}
|
|
513
515
|
attachmentTooltip(attachment) {
|
|
514
|
-
|
|
516
|
+
const name = attachment.name ??
|
|
515
517
|
attachment.fileName ??
|
|
516
518
|
attachment.id ??
|
|
517
|
-
this.transloco.translate('components.entitiesPreview.attachment')
|
|
519
|
+
this.transloco.translate('components.entitiesPreview.attachment');
|
|
520
|
+
return this.transloco.translate('components.entitiesPreview.downloadAttachment', { name });
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Compact chips are clickable downloads but only show a file-type glyph,
|
|
524
|
+
* which doesn't read as actionable. Swap to a download icon while hovered
|
|
525
|
+
* so the action is obvious.
|
|
526
|
+
*/
|
|
527
|
+
attachmentActionIcon(index, attachment) {
|
|
528
|
+
return this.hoveredAttachmentKey() ===
|
|
529
|
+
this.attachmentTrackBy(index, attachment)
|
|
530
|
+
? 'general.download-01'
|
|
531
|
+
: this.attachmentIcon(attachment);
|
|
518
532
|
}
|
|
519
533
|
attachmentIcon(attachment) {
|
|
520
534
|
const extension = this.resolveExtension(attachment);
|
|
@@ -619,6 +633,29 @@ class EntityAttachment {
|
|
|
619
633
|
return [trimmedValue];
|
|
620
634
|
}
|
|
621
635
|
if (typeof value === 'object') {
|
|
636
|
+
const envelope = value;
|
|
637
|
+
// Backend attachment envelope:
|
|
638
|
+
// { value: <id | id[]>, attachments: [{ value: <id>, name, fileName }] }
|
|
639
|
+
// The stored items don't carry the storage key (their `fileName` is the
|
|
640
|
+
// display name), only the upload id, so resolve every attachment by its
|
|
641
|
+
// id through the metadata endpoint — the same contract
|
|
642
|
+
// `mt-upload-field` uses.
|
|
643
|
+
if (Array.isArray(envelope.attachments)) {
|
|
644
|
+
return envelope.attachments.flatMap((item) => this.normalizeAttachmentValue(item));
|
|
645
|
+
}
|
|
646
|
+
// A single backend attachment item carries its upload id under `value`.
|
|
647
|
+
if (typeof envelope.value === 'string' &&
|
|
648
|
+
envelope.id === undefined &&
|
|
649
|
+
(envelope.fileName !== undefined || envelope.name !== undefined)) {
|
|
650
|
+
return this.normalizeAttachmentValue(envelope.value);
|
|
651
|
+
}
|
|
652
|
+
// Envelope with no resolved attachments yet — unwrap the inner id(s).
|
|
653
|
+
if ('value' in envelope &&
|
|
654
|
+
envelope.id === undefined &&
|
|
655
|
+
envelope.fileName === undefined &&
|
|
656
|
+
envelope.name === undefined) {
|
|
657
|
+
return this.normalizeAttachmentValue(envelope.value);
|
|
658
|
+
}
|
|
622
659
|
return [value];
|
|
623
660
|
}
|
|
624
661
|
return [];
|
|
@@ -670,13 +707,83 @@ class EntityAttachment {
|
|
|
670
707
|
return `.${fileName.split('.').pop().toLowerCase()}`;
|
|
671
708
|
}
|
|
672
709
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityAttachment, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
673
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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 }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, endPoint: { classPropertyName: "endPoint", publicName: "endPoint", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<mt-entity-field\
|
|
710
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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 }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, endPoint: { classPropertyName: "endPoint", publicName: "endPoint", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<mt-entity-field\n [label]=\"displayName()\"\n [configuration]=\"data()?.configuration\"\n gap=\"relaxed\"\n>\n @if (hasAttachments()) {\n @if (shape() === \"compact\") {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (\n attachment of attachments();\n track attachmentTrackBy($index, attachment)\n ) {\n <mt-button\n iconPos=\"top\"\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [icon]=\"attachmentActionIcon($index, attachment)\"\n [tooltip]=\"attachmentTooltip(attachment)\"\n styleClass=\"h-9! w-9! rounded-lg! transition-all duration-200 hover:scale-105 hover:border-primary-500! hover:text-primary-600! hover:bg-primary-50!\"\n (onClick)=\"onCompactAttachmentClick($event, attachment)\"\n (mouseenter)=\"\n hoveredAttachmentKey.set(attachmentTrackBy($index, attachment))\n \"\n (mouseleave)=\"hoveredAttachmentKey.set(null)\"\n (onFocus)=\"\n hoveredAttachmentKey.set(attachmentTrackBy($index, attachment))\n \"\n (onBlur)=\"hoveredAttachmentKey.set(null)\"\n />\n }\n </div>\n } @else {\n <mt-upload-field\n class=\"w-full\"\n [ngModel]=\"uploadValue()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [shape]=\"'card'\"\n [multiple]=\"isMultiple()\"\n [readonly]=\"true\"\n [endPoint]=\"endPoint()\"\n [context]=\"context()\"\n />\n }\n } @else {\n <span class=\"text-sm font-semibold\">{{ empty }}</span>\n }\n</mt-entity-field>\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", "multiple", "accept", "isDragging", "fileSizeLimit", "readonly", "context"], outputs: ["isDraggingChange", "onChange"] }, { 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: EntityField, selector: "mt-entity-field", inputs: ["label", "labelIconName", "configuration", "gap"] }] });
|
|
674
711
|
}
|
|
675
712
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityAttachment, decorators: [{
|
|
676
713
|
type: Component,
|
|
677
|
-
args: [{ selector: 'mt-entity-attachment', standalone: true, imports: [FormsModule, UploadField, Button, EntityField], template: "<mt-entity-field\
|
|
714
|
+
args: [{ selector: 'mt-entity-attachment', standalone: true, imports: [FormsModule, UploadField, Button, EntityField], template: "<mt-entity-field\n [label]=\"displayName()\"\n [configuration]=\"data()?.configuration\"\n gap=\"relaxed\"\n>\n @if (hasAttachments()) {\n @if (shape() === \"compact\") {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (\n attachment of attachments();\n track attachmentTrackBy($index, attachment)\n ) {\n <mt-button\n iconPos=\"top\"\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [icon]=\"attachmentActionIcon($index, attachment)\"\n [tooltip]=\"attachmentTooltip(attachment)\"\n styleClass=\"h-9! w-9! rounded-lg! transition-all duration-200 hover:scale-105 hover:border-primary-500! hover:text-primary-600! hover:bg-primary-50!\"\n (onClick)=\"onCompactAttachmentClick($event, attachment)\"\n (mouseenter)=\"\n hoveredAttachmentKey.set(attachmentTrackBy($index, attachment))\n \"\n (mouseleave)=\"hoveredAttachmentKey.set(null)\"\n (onFocus)=\"\n hoveredAttachmentKey.set(attachmentTrackBy($index, attachment))\n \"\n (onBlur)=\"hoveredAttachmentKey.set(null)\"\n />\n }\n </div>\n } @else {\n <mt-upload-field\n class=\"w-full\"\n [ngModel]=\"uploadValue()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [shape]=\"'card'\"\n [multiple]=\"isMultiple()\"\n [readonly]=\"true\"\n [endPoint]=\"endPoint()\"\n [context]=\"context()\"\n />\n }\n } @else {\n <span class=\"text-sm font-semibold\">{{ empty }}</span>\n }\n</mt-entity-field>\n" }]
|
|
678
715
|
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], endPoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "endPoint", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }] } });
|
|
679
716
|
|
|
717
|
+
class EntityLocation {
|
|
718
|
+
data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : /* istanbul ignore next */ []));
|
|
719
|
+
displayName = computed(() => this.data()?.name ?? '', ...(ngDevMode ? [{ debugName: "displayName" }] : /* istanbul ignore next */ []));
|
|
720
|
+
location = computed(() => normalizeEntityLocation(this.data()?.value), ...(ngDevMode ? [{ debugName: "location" }] : /* istanbul ignore next */ []));
|
|
721
|
+
displayValue = computed(() => displayOrPlaceholder(this.location()?.display_name ?? this.location()?.address ?? null), ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
|
|
722
|
+
coordinates = computed(() => {
|
|
723
|
+
const location = this.location();
|
|
724
|
+
const lat = location?.lat;
|
|
725
|
+
const lon = location?.lon ?? location?.lng;
|
|
726
|
+
if (lat === undefined || lon === undefined || lat === '' || lon === '') {
|
|
727
|
+
return '';
|
|
728
|
+
}
|
|
729
|
+
return `${lat}, ${lon}`;
|
|
730
|
+
}, ...(ngDevMode ? [{ debugName: "coordinates" }] : /* istanbul ignore next */ []));
|
|
731
|
+
mapsUrl = computed(() => {
|
|
732
|
+
const location = this.location();
|
|
733
|
+
const lat = location?.lat;
|
|
734
|
+
const lon = location?.lon ?? location?.lng;
|
|
735
|
+
if (lat === undefined || lon === undefined || lat === '' || lon === '') {
|
|
736
|
+
return '';
|
|
737
|
+
}
|
|
738
|
+
return `https://www.google.com/maps/?q=${encodeURIComponent(`${lat},${lon}`)}`;
|
|
739
|
+
}, ...(ngDevMode ? [{ debugName: "mapsUrl" }] : /* istanbul ignore next */ []));
|
|
740
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityLocation, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
741
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: EntityLocation, isStandalone: true, selector: "mt-entity-location", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<mt-entity-field\n [label]=\"displayName()\"\n [labelIconName]=\"'map.marker-pin-01'\"\n [configuration]=\"data()?.configuration\"\n gap=\"normal\"\n>\n @if (mapsUrl()) {\n <a\n [href]=\"mapsUrl()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"flex min-w-0 max-w-full items-center gap-1.5 text-sm font-semibold text-primary-600 hover:text-primary-700\"\n mtTruncateTooltip\n tooltipPosition=\"top\"\n >\n <mt-icon icon=\"map.marker-pin-01\" size=\"sm\" class=\"shrink-0\" />\n <span class=\"min-w-0 truncate\">{{ displayValue() }}</span>\n </a>\n } @else {\n <div\n class=\"min-w-0 max-w-full truncate text-sm font-semibold\"\n mtTruncateTooltip\n tooltipPosition=\"top\"\n >\n {{ displayValue() }}\n </div>\n }\n\n @if (coordinates()) {\n <div class=\"min-w-0 truncate text-xs text-gray-500\">\n {{ coordinates() }}\n </div>\n }\n</mt-entity-field>\n", dependencies: [{ kind: "component", type: EntityField, selector: "mt-entity-field", inputs: ["label", "labelIconName", "configuration", "gap"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "directive", type: TruncateTooltip, selector: "[mtTruncateTooltip]" }] });
|
|
742
|
+
}
|
|
743
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityLocation, decorators: [{
|
|
744
|
+
type: Component,
|
|
745
|
+
args: [{ selector: 'mt-entity-location', imports: [EntityField, Icon, TruncateTooltip], template: "<mt-entity-field\n [label]=\"displayName()\"\n [labelIconName]=\"'map.marker-pin-01'\"\n [configuration]=\"data()?.configuration\"\n gap=\"normal\"\n>\n @if (mapsUrl()) {\n <a\n [href]=\"mapsUrl()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"flex min-w-0 max-w-full items-center gap-1.5 text-sm font-semibold text-primary-600 hover:text-primary-700\"\n mtTruncateTooltip\n tooltipPosition=\"top\"\n >\n <mt-icon icon=\"map.marker-pin-01\" size=\"sm\" class=\"shrink-0\" />\n <span class=\"min-w-0 truncate\">{{ displayValue() }}</span>\n </a>\n } @else {\n <div\n class=\"min-w-0 max-w-full truncate text-sm font-semibold\"\n mtTruncateTooltip\n tooltipPosition=\"top\"\n >\n {{ displayValue() }}\n </div>\n }\n\n @if (coordinates()) {\n <div class=\"min-w-0 truncate text-xs text-gray-500\">\n {{ coordinates() }}\n </div>\n }\n</mt-entity-field>\n" }]
|
|
746
|
+
}], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
|
|
747
|
+
function normalizeEntityLocation(value) {
|
|
748
|
+
if (value === null || value === undefined || value === '') {
|
|
749
|
+
return null;
|
|
750
|
+
}
|
|
751
|
+
if (typeof value === 'string') {
|
|
752
|
+
const trimmed = value.trim();
|
|
753
|
+
if (!trimmed)
|
|
754
|
+
return null;
|
|
755
|
+
try {
|
|
756
|
+
return normalizeEntityLocation(JSON.parse(trimmed));
|
|
757
|
+
}
|
|
758
|
+
catch {
|
|
759
|
+
return {
|
|
760
|
+
display_name: trimmed,
|
|
761
|
+
address: trimmed,
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
if (typeof value !== 'object' || Array.isArray(value)) {
|
|
766
|
+
return {
|
|
767
|
+
display_name: String(value),
|
|
768
|
+
address: String(value),
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
const source = value;
|
|
772
|
+
const displayName = readString(source['display_name']) ??
|
|
773
|
+
readString(source['displayName']) ??
|
|
774
|
+
readString(source['address']) ??
|
|
775
|
+
readString(source['name']);
|
|
776
|
+
const lon = source['lon'] ?? source['lng'];
|
|
777
|
+
return {
|
|
778
|
+
...source,
|
|
779
|
+
...(displayName ? { display_name: displayName, address: displayName } : {}),
|
|
780
|
+
...(lon !== undefined ? { lon: lon } : {}),
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
function readString(value) {
|
|
784
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
785
|
+
}
|
|
786
|
+
|
|
680
787
|
class EntityLeafDetails {
|
|
681
788
|
data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
682
789
|
leafValue = computed(() => {
|
|
@@ -906,7 +1013,7 @@ class EntityPreviewBody {
|
|
|
906
1013
|
return viewType === 'LookupMatrix' ? 'Lookup' : viewType;
|
|
907
1014
|
}, ...(ngDevMode ? [{ debugName: "previewType" }] : /* istanbul ignore next */ []));
|
|
908
1015
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityPreviewBody, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
909
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: EntityPreviewBody, isStandalone: true, selector: "mt-entity-preview-body", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, attachmentShape: { classPropertyName: "attachmentShape", publicName: "attachmentShape", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "w-full" }, ngImport: i0, template: "@switch (previewType()) {\
|
|
1016
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: EntityPreviewBody, isStandalone: true, selector: "mt-entity-preview-body", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, attachmentShape: { classPropertyName: "attachmentShape", publicName: "attachmentShape", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "w-full" }, ngImport: i0, template: "@switch (previewType()) {\n @case (\"Text\") {\n <mt-entity-text [data]=\"data()\" />\n }\n @case (\"LongText\") {\n <mt-entity-long-text [data]=\"data()\" />\n }\n @case (\"Date\") {\n <mt-entity-date [data]=\"data()\" />\n }\n @case (\"DateTime\") {\n <mt-entity-date [data]=\"data()\" [viewType]=\"'DateTime'\" />\n }\n @case (\"User\") {\n <mt-entity-user [data]=\"data()\" />\n }\n @case (\"Percentage\") {\n <mt-entity-percentage [data]=\"data()\" />\n }\n @case (\"Currency\") {\n <mt-entity-currency [data]=\"data()\" />\n }\n @case (\"Number\") {\n <mt-entity-text [data]=\"data()\" />\n }\n @case (\"Checkbox\") {\n <mt-entity-checkbox [data]=\"data()\" />\n }\n @case (\"Lookup\") {\n <mt-entity-lookup [data]=\"data()\" />\n }\n @case (\"Status\") {\n <mt-entity-status [data]=\"data()\" />\n }\n @case (\"Attachment\") {\n <mt-entity-attachment [data]=\"data()\" [shape]=\"attachmentShape()\" />\n }\n @case (\"Location\") {\n <mt-entity-location [data]=\"data()\" />\n }\n @case (\"LeafDetails\") {\n <mt-entity-leaf-details [data]=\"data()\" />\n }\n @default {\n <mt-entity-text [data]=\"data()\" />\n }\n}\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", "viewType"] }, { 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", "shape", "value", "endPoint", "context"] }, { kind: "component", type: EntityStatus, selector: "mt-entity-status", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityLeafDetails, selector: "mt-entity-leaf-details", inputs: ["data"] }, { kind: "component", type: EntityLocation, selector: "mt-entity-location", inputs: ["data"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
910
1017
|
}
|
|
911
1018
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: EntityPreviewBody, decorators: [{
|
|
912
1019
|
type: Component,
|
|
@@ -922,9 +1029,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
922
1029
|
EntityAttachment,
|
|
923
1030
|
EntityStatus,
|
|
924
1031
|
EntityLeafDetails,
|
|
1032
|
+
EntityLocation,
|
|
925
1033
|
], host: {
|
|
926
1034
|
class: 'w-full',
|
|
927
|
-
}, template: "@switch (previewType()) {\
|
|
1035
|
+
}, template: "@switch (previewType()) {\n @case (\"Text\") {\n <mt-entity-text [data]=\"data()\" />\n }\n @case (\"LongText\") {\n <mt-entity-long-text [data]=\"data()\" />\n }\n @case (\"Date\") {\n <mt-entity-date [data]=\"data()\" />\n }\n @case (\"DateTime\") {\n <mt-entity-date [data]=\"data()\" [viewType]=\"'DateTime'\" />\n }\n @case (\"User\") {\n <mt-entity-user [data]=\"data()\" />\n }\n @case (\"Percentage\") {\n <mt-entity-percentage [data]=\"data()\" />\n }\n @case (\"Currency\") {\n <mt-entity-currency [data]=\"data()\" />\n }\n @case (\"Number\") {\n <mt-entity-text [data]=\"data()\" />\n }\n @case (\"Checkbox\") {\n <mt-entity-checkbox [data]=\"data()\" />\n }\n @case (\"Lookup\") {\n <mt-entity-lookup [data]=\"data()\" />\n }\n @case (\"Status\") {\n <mt-entity-status [data]=\"data()\" />\n }\n @case (\"Attachment\") {\n <mt-entity-attachment [data]=\"data()\" [shape]=\"attachmentShape()\" />\n }\n @case (\"Location\") {\n <mt-entity-location [data]=\"data()\" />\n }\n @case (\"LeafDetails\") {\n <mt-entity-leaf-details [data]=\"data()\" />\n }\n @default {\n <mt-entity-text [data]=\"data()\" />\n }\n}\n" }]
|
|
928
1036
|
}], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], attachmentShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "attachmentShape", required: false }] }] } });
|
|
929
1037
|
|
|
930
1038
|
class ComparisonValue {
|
|
@@ -1283,5 +1391,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1283
1391
|
* Generated bundle index. Do not edit.
|
|
1284
1392
|
*/
|
|
1285
1393
|
|
|
1286
|
-
export { ComparisonEntityList, ComparisonValue, EntitiesManage, EntitiesPreview, EntitiesResizeBase, EntityAttachment, EntityCheckbox, EntityCurrency, EntityDate, EntityField, EntityLeafDetails, EntityLongText, EntityLookup, EntityPercentage, EntityPreview, EntityPreviewBody, EntityStatus, EntityText, EntityUser, LEAF_DETAILS_KEY_SEPARATOR, buildDisplayEntities, expandLeafDetailsEntity, isLeafDetailsCatalogConfiguration, isLeafDetailsCollectionValue, isLeafDetailsRuntimeValue, isLeafDetailsSyntheticKey, isLeafDetailsValue };
|
|
1394
|
+
export { ComparisonEntityList, ComparisonValue, EntitiesManage, EntitiesPreview, EntitiesResizeBase, EntityAttachment, EntityCheckbox, EntityCurrency, EntityDate, EntityField, EntityLeafDetails, EntityLocation, EntityLongText, EntityLookup, EntityPercentage, EntityPreview, EntityPreviewBody, EntityStatus, EntityText, EntityUser, LEAF_DETAILS_KEY_SEPARATOR, buildDisplayEntities, expandLeafDetailsEntity, isLeafDetailsCatalogConfiguration, isLeafDetailsCollectionValue, isLeafDetailsRuntimeValue, isLeafDetailsSyntheticKey, isLeafDetailsValue };
|
|
1287
1395
|
//# sourceMappingURL=masterteam-components-entities.mjs.map
|