@yuuvis/client-framework 2.12.2 → 2.12.4

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.
@@ -61,7 +61,6 @@ class ObjectPreviewService {
61
61
  version,
62
62
  sendEvent: !!(object.content?.mimeType &&
63
63
  defaultViewers.filter((v) => v.type === 'OFFICE').map((v) => v.mimeType.includes(object.content?.mimeType || '')).length) || false
64
- // ...(object.content?.mimeType === 'application/pdf'
65
64
  }
66
65
  };
67
66
  }
@@ -103,11 +102,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
103
102
  class ObjectPreviewComponent {
104
103
  #objectPreviewService;
105
104
  #event;
106
- #formerContentstreamId;
105
+ #formerContentStreamId;
107
106
  #objectIdEffect;
108
107
  constructor() {
109
108
  this.#objectPreviewService = inject(ObjectPreviewService);
110
109
  this.#event = inject(EventService);
110
+ this.#formerContentStreamId = undefined;
111
111
  this.objectId = input(undefined);
112
112
  this.dmsObjectInput = input(undefined, { alias: 'dmsObject' });
113
113
  this.version = input(undefined);
@@ -115,16 +115,21 @@ class ObjectPreviewComponent {
115
115
  this.metadata = input({});
116
116
  this.viewerDetails = linkedSignal({
117
117
  source: () => ({ object: this.dmsObject(), version: this.version(), metadata: this.metadata() }),
118
- computation: ({ object, version, metadata }) => {
118
+ computation: ({ object, version, metadata }, previous) => {
119
119
  object = Array.isArray(object) ? object[0] : object;
120
- if (object && this.#formerContentstreamId !== object.content?.contentStreamId) {
120
+ const prev = previous?.source;
121
+ if (object && this.#formerContentStreamId !== object.content?.contentStreamId) {
121
122
  const details = object && this.#objectPreviewService.getViewerDetails(object, version);
122
- this.#formerContentstreamId = object.content?.contentStreamId;
123
+ this.#formerContentStreamId = object.content?.contentStreamId;
123
124
  if (details) {
124
125
  return { ...details, metadata: { ...details.metadata, ...metadata } };
125
126
  }
127
+ return null;
126
128
  }
127
- return undefined;
129
+ if (previous?.value) {
130
+ return { ...previous.value, metadata: { ...previous.value?.metadata, ...metadata } };
131
+ }
132
+ return null;
128
133
  }
129
134
  });
130
135
  this.isTiff = computed(() => this.dmsObject()?.content?.mimeType === 'image/tiff');
@@ -151,7 +156,7 @@ class ObjectPreviewComponent {
151
156
  class="viewer"
152
157
  [id]="viewerDetailsObj.id"
153
158
  [type]="viewerDetailsObj.mimeType"
154
- [src]="viewerDetailsObj.mediaViewerSrc"
159
+ [src]="viewerDetailsObj.mediaViewerSrc ?? null"
155
160
  [metadata]="viewerDetailsObj.metadata"
156
161
  ></yuv-media-viewer>
157
162
  }
@@ -171,7 +176,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
171
176
  class="viewer"
172
177
  [id]="viewerDetailsObj.id"
173
178
  [type]="viewerDetailsObj.mimeType"
174
- [src]="viewerDetailsObj.mediaViewerSrc"
179
+ [src]="viewerDetailsObj.mediaViewerSrc ?? null"
175
180
  [metadata]="viewerDetailsObj.metadata"
176
181
  ></yuv-media-viewer>
177
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-object-preview.mjs","sources":["../../../../../libs/yuuvis/client-framework/object-preview/src/lib/services/object-preview.service.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-preview/object-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-email-preview/object-email-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/yuuvis-client-framework-object-preview.ts"],"sourcesContent":["import { inject, Injectable, signal } from '@angular/core';\nimport { ContentStreamField, DmsObject, DmsService, UserService } from '@yuuvis/client-core';\nimport { defaultViewers, EmailMetadata, MediaViewerService } from '@yuuvis/media-viewer';\nimport { tap } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ObjectPreviewService {\n readonly #dms = inject(DmsService);\n readonly #userService = inject(UserService);\n readonly #mediaViewerService = inject(MediaViewerService);\n\n #dmsObject = signal<DmsObject | undefined>(undefined);\n\n dmsObject = this.#dmsObject.asReadonly();\n\n setDmsObject(object: DmsObject) {\n this.#dmsObject.set(object);\n }\n\n getDmsObject(id: string) {\n return this.#dms.getDmsObject(id).pipe(tap((dmsObject) => this.#dmsObject.set(dmsObject)));\n }\n\n getMediaViewerSrc(id: string, mimeType: string | undefined, version?: number) {\n if (mimeType) {\n if (mimeType === 'image/tiff') {\n return version\n ? `/api/dms/objects/${id}/versions/${version}/contents/renditions/slide?timeout=50000`\n : `/api/dms/objects/${id}/contents/renditions/slide`;\n }\n return version ? `/api/dms/objects/${id}/versions/${version}/contents/file` : `/api/dms/objects/${id}/contents/file`;\n }\n return '';\n }\n\n #isEmailViewer(object: DmsObject) {\n return defaultViewers.filter((viewer) => viewer.type === 'EMAIL')[0].mimeType.includes(object.data[ContentStreamField.MIME_TYPE] as string);\n }\n\n getViewerDetails(object: DmsObject, version: number | undefined) {\n if (object) {\n const type = object?.content && this.#mediaViewerService.getComponentType(object.content.mimeType);\n\n // console.log('type', type);\n\n return this.#isEmailViewer(object)\n ? this.getEmailViewerDetails(object)\n : {\n mediaViewerSrc: this.getMediaViewerSrc(object.id, object.content?.mimeType, version),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: {\n type,\n name: object.data[ContentStreamField.FILENAME] as string,\n dmsObject: object?.data,\n id: object?.id,\n editable: true,\n user: this.#userService.getCurrentUser(),\n theme: 'light',\n version,\n sendEvent:\n !!(\n object.content?.mimeType &&\n defaultViewers.filter((v) => v.type === 'OFFICE').map((v) => v.mimeType.includes(object.content?.mimeType || '')).length\n ) || false\n // ...(object.content?.mimeType === 'application/pdf'\n }\n };\n }\n return undefined;\n }\n\n getEmailViewerDetails(object: DmsObject, MAIL_APP_ID = 'appSystemmail:') {\n return {\n mediaViewerSrc: this.getMediaViewerSrc(object.id, object.content?.mimeType),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: this.getEmailMetadata(object, MAIL_APP_ID)\n };\n }\n\n getEmailMetadata(object: DmsObject, MAIL_APP_ID = 'appSystemmail:'): EmailMetadata {\n return {\n type: 'EMAIL',\n header: {\n subject: object.data[`${MAIL_APP_ID}subject`] as string,\n sent: new Date(object.data[`${MAIL_APP_ID}sent`] as string),\n from: object.data[`${MAIL_APP_ID}from`] as string,\n to: object.data[`${MAIL_APP_ID}to`] as string[],\n cc: object.data[`${MAIL_APP_ID}cc`] as string[],\n bcc: object.data[`${MAIL_APP_ID}bcc`] as string[]\n },\n theme: 'light',\n attachments: object.data[`${MAIL_APP_ID}attachments`] as string[]\n };\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input, linkedSignal, signal, untracked } from '@angular/core';\nimport { DmsObject, EventService, TranslateModule, YuvEventType } from '@yuuvis/client-core';\nimport { DASHLET_MESSAGE_EVENTS, Metadata, YuvMediaViewerComponent } from '@yuuvis/media-viewer';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\nimport { delay, tap } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'yuv-object-preview',\n standalone: true,\n imports: [CommonModule, YuvMediaViewerComponent, TranslateModule],\n template: `\n @let viewerDetailsObj = viewerDetails();\n @if (viewerDetailsObj) {\n <yuv-media-viewer\n class=\"viewer\"\n [id]=\"viewerDetailsObj.id\"\n [type]=\"viewerDetailsObj.mimeType\"\n [src]=\"viewerDetailsObj.mediaViewerSrc\"\n [metadata]=\"viewerDetailsObj.metadata\"\n ></yuv-media-viewer>\n }\n @if (isTiff()) {\n <div class=\"tiff-warning\">\n <div class=\"tiff-warning-text\">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>\n </div>\n }\n `,\n styles: [\n `\n :host {\n --media-viewer-background-color: transparent;\n height: 100%;\n overflow: hidden;\n display: grid;\n grid-auto-columns: 1fr;\n grid-auto-rows: 1fr;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr max-content;\n gap: 0px 0px;\n grid-template-areas:\n 'viewer'\n 'message';\n }\n .viewer {\n grid-area: viewer;\n background-color: var(--media-viewer-background-color);\n ::ng-deep {\n pdf-paging-area {\n display: flex;\n align-items: center;\n\n .paging-right,\n .paging-left {\n display: flex;\n align-items: center;\n }\n }\n pdf-zoom-toolbar {\n div {\n display: flex;\n align-items: center;\n }\n }\n }\n }\n .tiff-warning {\n grid-area: message;\n text-align: center;\n padding: var(--ymt-spacing-xs) 0;\n\n &-text {\n margin: var(--ymt-spacing-m);\n }\n }\n `\n ]\n})\nexport class ObjectPreviewComponent {\n readonly #objectPreviewService = inject(ObjectPreviewService);\n readonly #event = inject(EventService);\n\n #formerContentstreamId?: string;\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n version = input<number | undefined>(undefined);\n dmsObject = this.#objectPreviewService.dmsObject;\n\n metadata = input<Partial<Metadata>>({});\n\n viewerDetails = linkedSignal({\n source: () => ({ object: this.dmsObject(), version: this.version(), metadata: this.metadata() }),\n computation: ({ object, version, metadata }) => {\n object = Array.isArray(object) ? object[0] : object;\n if (object && this.#formerContentstreamId !== object.content?.contentStreamId) {\n const details = object && this.#objectPreviewService.getViewerDetails(object, version);\n this.#formerContentstreamId = object.content?.contentStreamId;\n if (details) {\n return { ...details, metadata: { ...details.metadata, ...metadata } };\n }\n }\n return undefined;\n }\n });\n\n isTiff = computed(() => this.dmsObject()?.content?.mimeType === 'image/tiff');\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n untracked(() => {\n dmsObject && this.#objectPreviewService.setDmsObject(dmsObject);\n objectId && !dmsObject && this.#objectPreviewService.getDmsObject(objectId).subscribe();\n });\n });\n\n constructor() {\n this.#event\n .on(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_UPDATE)\n .pipe(\n takeUntilDestroyed(),\n // delay(2000),\n tap(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true }))\n )\n .subscribe();\n }\n}\n","import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport { MailComponent } from '@yuuvis/media-viewer';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\n\n@Component({\n selector: 'yuv-object-email-preview',\n standalone: true,\n imports: [MailComponent],\n template: `\n @let viewerDetailsObj = viewerDetails();\n @if (viewerDetailsObj) {\n <yuv-mail [id]=\"viewerDetailsObj.id\" [src]=\"viewerDetailsObj.mediaViewerSrc\" [metadata]=\"viewerDetailsObj.metadata\"></yuv-mail>\n }\n `,\n styles: `\n :host {\n height: 100%;\n }\n `\n})\nexport class ObjectEmailPreviewComponent {\n #objectPreviwService = inject(ObjectPreviewService);\n\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObject = this.#objectPreviwService.dmsObject;\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n\n untracked(() => {\n dmsObject && this.#objectPreviwService.setDmsObject(dmsObject);\n if (objectId && !dmsObject) {\n this.#objectPreviwService.getDmsObject(objectId).subscribe();\n }\n });\n });\n\n viewerDetails = computed(() => {\n const object = this.dmsObject();\n return object ? this.#objectPreviwService.getEmailViewerDetails(object) : undefined;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tap"],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-object-preview.mjs","sources":["../../../../../libs/yuuvis/client-framework/object-preview/src/lib/services/object-preview.service.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-preview/object-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-email-preview/object-email-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/yuuvis-client-framework-object-preview.ts"],"sourcesContent":["import { inject, Injectable, signal } from '@angular/core';\nimport { ContentStreamField, DmsObject, DmsService, UserService } from '@yuuvis/client-core';\nimport { defaultViewers, EmailMetadata, MediaViewerService } from '@yuuvis/media-viewer';\nimport { tap } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ObjectPreviewService {\n readonly #dms = inject(DmsService);\n readonly #userService = inject(UserService);\n readonly #mediaViewerService = inject(MediaViewerService);\n\n #dmsObject = signal<DmsObject | undefined>(undefined);\n\n dmsObject = this.#dmsObject.asReadonly();\n\n setDmsObject(object: DmsObject) {\n this.#dmsObject.set(object);\n }\n\n getDmsObject(id: string) {\n return this.#dms.getDmsObject(id).pipe(tap((dmsObject) => this.#dmsObject.set(dmsObject)));\n }\n\n getMediaViewerSrc(id: string, mimeType: string | undefined, version?: number) {\n if (mimeType) {\n if (mimeType === 'image/tiff') {\n return version\n ? `/api/dms/objects/${id}/versions/${version}/contents/renditions/slide?timeout=50000`\n : `/api/dms/objects/${id}/contents/renditions/slide`;\n }\n return version ? `/api/dms/objects/${id}/versions/${version}/contents/file` : `/api/dms/objects/${id}/contents/file`;\n }\n return '';\n }\n\n #isEmailViewer(object: DmsObject) {\n return defaultViewers.filter((viewer) => viewer.type === 'EMAIL')[0].mimeType.includes(object.data[ContentStreamField.MIME_TYPE] as string);\n }\n\n getViewerDetails(object: DmsObject, version: number | undefined) {\n if (object) {\n const type = object?.content && this.#mediaViewerService.getComponentType(object.content.mimeType);\n\n // console.log('type', type);\n\n return this.#isEmailViewer(object)\n ? this.getEmailViewerDetails(object)\n : {\n mediaViewerSrc: this.getMediaViewerSrc(object.id, object.content?.mimeType, version),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: {\n type,\n name: object.data[ContentStreamField.FILENAME] as string,\n dmsObject: object?.data,\n id: object?.id,\n editable: true,\n user: this.#userService.getCurrentUser(),\n theme: 'light',\n version,\n sendEvent:\n !!(\n object.content?.mimeType &&\n defaultViewers.filter((v) => v.type === 'OFFICE').map((v) => v.mimeType.includes(object.content?.mimeType || '')).length\n ) || false\n }\n };\n }\n return undefined;\n }\n\n getEmailViewerDetails(object: DmsObject, MAIL_APP_ID = 'appSystemmail:') {\n return {\n mediaViewerSrc: this.getMediaViewerSrc(object.id, object.content?.mimeType),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: this.getEmailMetadata(object, MAIL_APP_ID)\n };\n }\n\n getEmailMetadata(object: DmsObject, MAIL_APP_ID = 'appSystemmail:'): EmailMetadata {\n return {\n type: 'EMAIL',\n header: {\n subject: object.data[`${MAIL_APP_ID}subject`] as string,\n sent: new Date(object.data[`${MAIL_APP_ID}sent`] as string),\n from: object.data[`${MAIL_APP_ID}from`] as string,\n to: object.data[`${MAIL_APP_ID}to`] as string[],\n cc: object.data[`${MAIL_APP_ID}cc`] as string[],\n bcc: object.data[`${MAIL_APP_ID}bcc`] as string[]\n },\n theme: 'light',\n attachments: object.data[`${MAIL_APP_ID}attachments`] as string[]\n };\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input, linkedSignal, signal, untracked, WritableSignal } from '@angular/core';\nimport { DmsObject, EventService, TranslateModule, YuvEventType } from '@yuuvis/client-core';\nimport { DASHLET_MESSAGE_EVENTS, Metadata, YuvMediaViewerComponent } from '@yuuvis/media-viewer';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\nimport { delay, tap } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\ninterface ViewerDetails {\n id: string;\n mimeType: string | undefined;\n mediaViewerSrc: string | undefined;\n metadata: Partial<Metadata>;\n}\n\n@Component({\n selector: 'yuv-object-preview',\n standalone: true,\n imports: [CommonModule, YuvMediaViewerComponent, TranslateModule],\n template: `\n @let viewerDetailsObj = viewerDetails();\n @if (viewerDetailsObj) {\n <yuv-media-viewer\n class=\"viewer\"\n [id]=\"viewerDetailsObj.id\"\n [type]=\"viewerDetailsObj.mimeType\"\n [src]=\"viewerDetailsObj.mediaViewerSrc ?? null\"\n [metadata]=\"viewerDetailsObj.metadata\"\n ></yuv-media-viewer>\n }\n @if (isTiff()) {\n <div class=\"tiff-warning\">\n <div class=\"tiff-warning-text\">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>\n </div>\n }\n `,\n styles: [\n `\n :host {\n --media-viewer-background-color: transparent;\n height: 100%;\n overflow: hidden;\n display: grid;\n grid-auto-columns: 1fr;\n grid-auto-rows: 1fr;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr max-content;\n gap: 0px 0px;\n grid-template-areas:\n 'viewer'\n 'message';\n }\n .viewer {\n grid-area: viewer;\n background-color: var(--media-viewer-background-color);\n ::ng-deep {\n pdf-paging-area {\n display: flex;\n align-items: center;\n\n .paging-right,\n .paging-left {\n display: flex;\n align-items: center;\n }\n }\n pdf-zoom-toolbar {\n div {\n display: flex;\n align-items: center;\n }\n }\n }\n }\n .tiff-warning {\n grid-area: message;\n text-align: center;\n padding: var(--ymt-spacing-xs) 0;\n\n &-text {\n margin: var(--ymt-spacing-m);\n }\n }\n `\n ]\n})\nexport class ObjectPreviewComponent {\n readonly #objectPreviewService = inject(ObjectPreviewService);\n readonly #event = inject(EventService);\n #formerContentStreamId: string | undefined = undefined;\n\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n version = input<number | undefined>(undefined);\n dmsObject = this.#objectPreviewService.dmsObject;\n\n metadata = input<Partial<Metadata>>({});\n\n viewerDetails: WritableSignal<ViewerDetails | null> = linkedSignal({\n source: () => ({ object: this.dmsObject(), version: this.version(), metadata: this.metadata() }),\n computation: ({ object, version, metadata }, previous): ViewerDetails | null => {\n object = Array.isArray(object) ? object[0] : object;\n const prev = previous?.source;\n\n if (object && this.#formerContentStreamId !== object.content?.contentStreamId) {\n const details = object && this.#objectPreviewService.getViewerDetails(object, version);\n this.#formerContentStreamId = object.content?.contentStreamId;\n if (details) {\n return { ...details, metadata: { ...details.metadata, ...metadata } as Partial<Metadata> };\n }\n return null;\n }\n if (previous?.value) {\n return { ...(previous.value as any), metadata: { ...((previous.value as any)?.metadata as any), ...metadata } } as ViewerDetails;\n }\n\n return null;\n }\n });\n\n isTiff = computed(() => this.dmsObject()?.content?.mimeType === 'image/tiff');\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n untracked(() => {\n dmsObject && this.#objectPreviewService.setDmsObject(dmsObject);\n objectId && !dmsObject && this.#objectPreviewService.getDmsObject(objectId).subscribe();\n });\n });\n\n constructor() {\n this.#event\n .on(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_UPDATE)\n .pipe(\n takeUntilDestroyed(),\n // delay(2000),\n tap(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true }))\n )\n .subscribe();\n }\n}\n","import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport { MailComponent } from '@yuuvis/media-viewer';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\n\n@Component({\n selector: 'yuv-object-email-preview',\n standalone: true,\n imports: [MailComponent],\n template: `\n @let viewerDetailsObj = viewerDetails();\n @if (viewerDetailsObj) {\n <yuv-mail [id]=\"viewerDetailsObj.id\" [src]=\"viewerDetailsObj.mediaViewerSrc\" [metadata]=\"viewerDetailsObj.metadata\"></yuv-mail>\n }\n `,\n styles: `\n :host {\n height: 100%;\n }\n `\n})\nexport class ObjectEmailPreviewComponent {\n #objectPreviwService = inject(ObjectPreviewService);\n\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObject = this.#objectPreviwService.dmsObject;\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n\n untracked(() => {\n dmsObject && this.#objectPreviwService.setDmsObject(dmsObject);\n if (objectId && !dmsObject) {\n this.#objectPreviwService.getDmsObject(objectId).subscribe();\n }\n });\n });\n\n viewerDetails = computed(() => {\n const object = this.dmsObject();\n return object ? this.#objectPreviwService.getEmailViewerDetails(object) : undefined;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tap"],"mappings":";;;;;;;;;;MAQa,oBAAoB,CAAA;AAHjC,IAAA,WAAA,GAAA;AAIW,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;AAClC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAEzD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAwB,SAAS,CAAC;AAErD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAkFzC;AAxFU,IAAA,IAAI;AACJ,IAAA,YAAY;AACZ,IAAA,mBAAmB;AAE5B,IAAA,UAAU;AAIV,IAAA,YAAY,CAAC,MAAiB,EAAA;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;;AAG7B,IAAA,YAAY,CAAC,EAAU,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;;AAG5F,IAAA,iBAAiB,CAAC,EAAU,EAAE,QAA4B,EAAE,OAAgB,EAAA;QAC1E,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;AAC7B,gBAAA,OAAO;AACL,sBAAE,CAAA,iBAAA,EAAoB,EAAE,CAAA,UAAA,EAAa,OAAO,CAA0C,wCAAA;AACtF,sBAAE,CAAA,iBAAA,EAAoB,EAAE,CAAA,0BAAA,CAA4B;;AAExD,YAAA,OAAO,OAAO,GAAG,oBAAoB,EAAE,CAAA,UAAA,EAAa,OAAO,CAAA,cAAA,CAAgB,GAAG,CAAoB,iBAAA,EAAA,EAAE,gBAAgB;;AAEtH,QAAA,OAAO,EAAE;;AAGX,IAAA,cAAc,CAAC,MAAiB,EAAA;AAC9B,QAAA,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAW,CAAC;;IAG7I,gBAAgB,CAAC,MAAiB,EAAE,OAA2B,EAAA;QAC7D,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;;AAIlG,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM;AAC/B,kBAAE,IAAI,CAAC,qBAAqB,CAAC,MAAM;AACnC,kBAAE;AACE,oBAAA,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;oBACpF,EAAE,EAAE,MAAM,CAAC,EAAE;AACb,oBAAA,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ;AAClC,oBAAA,QAAQ,EAAE;wBACR,IAAI;wBACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAW;wBACxD,SAAS,EAAE,MAAM,EAAE,IAAI;wBACvB,EAAE,EAAE,MAAM,EAAE,EAAE;AACd,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE;AACxC,wBAAA,KAAK,EAAE,OAAO;wBACd,OAAO;wBACP,SAAS,EACP,CAAC,EACC,MAAM,CAAC,OAAO,EAAE,QAAQ;AACxB,4BAAA,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CACzH,IAAI;AACR;iBACF;;AAEP,QAAA,OAAO,SAAS;;AAGlB,IAAA,qBAAqB,CAAC,MAAiB,EAAE,WAAW,GAAG,gBAAgB,EAAA;QACrE,OAAO;AACL,YAAA,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC3E,EAAE,EAAE,MAAM,CAAC,EAAE;AACb,YAAA,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ;YAClC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW;SACpD;;AAGH,IAAA,gBAAgB,CAAC,MAAiB,EAAE,WAAW,GAAG,gBAAgB,EAAA;QAChE,OAAO;AACL,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,MAAM,EAAE;gBACN,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,SAAS,CAAW;AACvD,gBAAA,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAM,IAAA,CAAA,CAAW,CAAC;gBAC3D,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,MAAM,CAAW;gBACjD,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,IAAI,CAAa;gBAC/C,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,IAAI,CAAa;gBAC/C,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,KAAK;AACrC,aAAA;AACD,YAAA,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,aAAa;SACrD;;+GAvFQ,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MC+EY,sBAAsB,CAAA;AACxB,IAAA,qBAAqB;AACrB,IAAA,MAAM;AACf,IAAA,sBAAsB;AAiCtB,IAAA,eAAe;AASf,IAAA,WAAA,GAAA;AA5CS,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACpD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;QACtC,IAAsB,CAAA,sBAAA,GAAuB,SAAS;AAEtD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,CAAC;QAC/C,IAAc,CAAA,cAAA,GAAG,KAAK,CAAwB,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChF,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAqB,SAAS,CAAC;AAC9C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS;AAEhD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAoB,EAAE,CAAC;QAEvC,IAAa,CAAA,aAAA,GAAyC,YAAY,CAAC;YACjE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;AAChG,YAAA,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,KAA0B;AAC7E,gBAAA,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM;AACnD,gBAAA,MAAM,IAAI,GAAG,QAAQ,EAAE,MAAM;AAE7B,gBAAA,IAAI,MAAM,IAAI,IAAI,CAAC,sBAAsB,KAAK,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE;AAC7E,oBAAA,MAAM,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC;oBACtF,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,OAAO,EAAE,eAAe;oBAC7D,IAAI,OAAO,EAAE;AACX,wBAAA,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAuB,EAAE;;AAE5F,oBAAA,OAAO,IAAI;;AAEb,gBAAA,IAAI,QAAQ,EAAE,KAAK,EAAE;oBACnB,OAAO,EAAE,GAAI,QAAQ,CAAC,KAAa,EAAE,QAAQ,EAAE,EAAE,GAAK,QAAQ,CAAC,KAAa,EAAE,QAAgB,EAAE,GAAG,QAAQ,EAAE,EAAmB;;AAGlI,gBAAA,OAAO,IAAI;;AAEd,SAAA,CAAC;AAEF,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,KAAK,YAAY,CAAC;AAE7E,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,MAAK;AAC5B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE;YACvC,SAAS,CAAC,MAAK;gBACb,SAAS,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,SAAS,CAAC;AAC/D,gBAAA,QAAQ,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE;AACzF,aAAC,CAAC;AACJ,SAAC,CAAC;AAGA,QAAA,IAAI,CAAC;AACF,aAAA,EAAE,CAAC,sBAAsB,CAAC,sBAAsB;aAChD,IAAI,CACH,kBAAkB,EAAE;;QAEpBA,KAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,0BAA0B,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;AAElG,aAAA,SAAS,EAAE;;+GArDL,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAnEvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjBS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAoErD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAvElC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,uBAAuB,EAAE,eAAe,CAAC,EACvD,QAAA,EAAA;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA;;;MCdU,2BAA2B,CAAA;AAhBxC,IAAA,WAAA,GAAA;AAiBE,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAEnD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,CAAC;QAC/C,IAAc,CAAA,cAAA,GAAG,KAAK,CAAwB,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChF,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS;AAE/C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,MAAK;AAC5B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE;YAEvC,SAAS,CAAC,MAAK;gBACb,SAAS,IAAI,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,SAAS,CAAC;AAC9D,gBAAA,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE;oBAC1B,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE;;AAEhE,aAAC,CAAC;AACJ,SAAC,CAAC;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;AAC/B,YAAA,OAAO,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,SAAS;AACrF,SAAC,CAAC;AACH;AAtBC,IAAA,oBAAoB;AAMpB,IAAA,eAAe;+GAPJ,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAZ5B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;AAKT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EANS,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAaZ,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAhBvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,cACxB,IAAI,EAAA,OAAA,EACP,CAAC,aAAa,CAAC,EACd,QAAA,EAAA;;;;;AAKT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA;;;ACdH;;AAEG;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { CommonModule } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, input, forwardRef, ViewChild, Component } from '@angular/core';
3
+ import { inject, input, signal, forwardRef, ViewChild, Component } from '@angular/core';
4
4
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
5
  import * as i4 from '@angular/forms';
6
6
  import { NonNullableFormBuilder, Validators, ReactiveFormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
@@ -32,7 +32,8 @@ class SequenceListComponent {
32
32
  * Maximum number of sequence items (defaults to 100).
33
33
  */
34
34
  this.maxLength = input(100);
35
- this.maxLengthExceeded = false;
35
+ this.maxLengthExceeded = signal(false);
36
+ this.controlCount = signal(0);
36
37
  // dynamic form for sequence items
37
38
  this.sequenceForm = this.#fb.group({
38
39
  items: this.#fb.array([this.#generateSequenceItem()])
@@ -40,6 +41,7 @@ class SequenceListComponent {
40
41
  this.entries = [];
41
42
  // eslint-disable-next-line @typescript-eslint/no-empty-function
42
43
  this.propagateChange = (_) => { };
44
+ this.#updateState();
43
45
  this.sequenceForm.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {
44
46
  this.#propagate();
45
47
  });
@@ -65,7 +67,8 @@ class SequenceListComponent {
65
67
  }
66
68
  #updateState() {
67
69
  const ml = this.maxLength();
68
- this.maxLengthExceeded = ml !== undefined && this.formItemArray.length >= ml;
70
+ this.maxLengthExceeded.set(ml !== undefined && this.formItemArray.length >= ml);
71
+ this.controlCount.set(this.sequenceForm.controls.items.length);
69
72
  }
70
73
  // eslint-disable-next-line @typescript-eslint/no-empty-function
71
74
  registerOnTouched() { }
@@ -91,6 +94,7 @@ class SequenceListComponent {
91
94
  this.entries.forEach((entry) => {
92
95
  this.formItemArray.push(this.#generateSequenceItem(entry));
93
96
  });
97
+ this.#updateState();
94
98
  }
95
99
  registerOnChange(fn) {
96
100
  this.propagateChange = fn;
@@ -120,7 +124,7 @@ class SequenceListComponent {
120
124
  useExisting: forwardRef(() => SequenceListComponent),
121
125
  multi: true
122
126
  }
123
- ], viewQueries: [{ propertyName: "orgComponent", first: true, predicate: OrganizationComponent, descendants: true }], ngImport: i0, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track item; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button mat-icon-button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItemAt($index)\">\n <mat-icon>add</mat-icon>\n </button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button ymtIconButton icon-button-size=\"small\" class=\"remove\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"sequenceForm.controls.items.controls.length === 1\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.task' | translate }}</mat-label>\n <input matInput [maxLength]=\"128\" formControlName=\"title\" />\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.nextAssignee' | translate }}</mat-label>\n <yuv-organization [classifications]=\"['id:organization:set[user,role]']\"\n [matTooltip]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [multiselect]=\"true\"\n [withMetadata]=\"true\"\n [required]=\"true\"\n formControlName=\"nextAssignee\">\n </yuv-organization>\n </mat-form-field>\n </div>\n @if ($last) {\n <button mat-icon-button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItem()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--_sequence-list-item-background: var(--sequence-list-item-background, var(--ymt-surface-panel));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--ymt-outline-variant));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, var(--ymt-spacing-xs));--_sequence-list-line-color: var(--sequence-list-line-color, var(--ymt-text-color-subtle));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--ymt-surface-panel));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--ymt-primary) r g b/.5);outline-offset:-2px;border-color:var(--ymt-primary)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--ymt-danger);outline:3px solid rgb(from var(--ymt-danger) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% - var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:var(--ymt-spacing-xs);display:grid;column-gap:var(--ymt-spacing-m);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:var(--ymt-spacing-2xs);background-color:transparent;color:var(--ymt-text-color)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user}:host form section .item .item-form .remove{--icon-size: 18px;padding:var(--ymt-spacing-2xs);grid-area:remove;padding:0}:host mat-form-field{margin-block-start:var(--ymt-spacing-s)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: OrganizationComponent, selector: "yuv-organization", inputs: ["situation", "multiselect", "classifications", "readonly", "excludeMe", "withMetadata"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }] }); }
127
+ ], viewQueries: [{ propertyName: "orgComponent", first: true, predicate: OrganizationComponent, descendants: true }], ngImport: i0, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track item; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button mat-icon-button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded()\" (click)=\"addItemAt($index)\">\n <mat-icon>add</mat-icon>\n </button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button ymtIconButton icon-button-size=\"small\" class=\"remove hidden\" [class.hidden]=\"controlCount() < 2\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"controlCount() < 2\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.task' | translate }}</mat-label>\n <input matInput [maxLength]=\"128\" formControlName=\"title\" />\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.nextAssignee' | translate }}</mat-label>\n <yuv-organization [classifications]=\"['id:organization:set[user,role]']\"\n [matTooltip]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [multiselect]=\"true\"\n [withMetadata]=\"true\"\n [required]=\"true\"\n formControlName=\"nextAssignee\">\n </yuv-organization>\n </mat-form-field>\n </div>\n @if ($last) {\n <button mat-icon-button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded()\" (click)=\"addItem()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--_sequence-list-item-background: var(--sequence-list-item-background, var(--ymt-surface-panel));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--ymt-outline-variant));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, var(--ymt-spacing-xs));--_sequence-list-line-color: var(--sequence-list-line-color, var(--ymt-text-color-subtle));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--ymt-surface-panel));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--ymt-primary) r g b/.5);outline-offset:-2px;border-color:var(--ymt-primary)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--ymt-danger);outline:3px solid rgb(from var(--ymt-danger) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% + var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:var(--ymt-spacing-xs);display:grid;column-gap:var(--ymt-spacing-m);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:var(--ymt-spacing-2xs);background-color:transparent;color:var(--ymt-text-color)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user}:host form section .item .item-form .remove{--icon-size: 18px;padding:var(--ymt-spacing-2xs);grid-area:remove;padding:0}:host form section .item .item-form .remove.hidden{visibility:hidden}:host mat-form-field{margin-block-start:var(--ymt-spacing-s)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: OrganizationComponent, selector: "yuv-organization", inputs: ["situation", "multiselect", "classifications", "readonly", "excludeMe", "withMetadata"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }] }); }
124
128
  }
125
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SequenceListComponent, decorators: [{
126
130
  type: Component,
@@ -148,7 +152,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
148
152
  }
149
153
  ], host: {
150
154
  tabindex: '0'
151
- }, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track item; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button mat-icon-button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItemAt($index)\">\n <mat-icon>add</mat-icon>\n </button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button ymtIconButton icon-button-size=\"small\" class=\"remove\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"sequenceForm.controls.items.controls.length === 1\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.task' | translate }}</mat-label>\n <input matInput [maxLength]=\"128\" formControlName=\"title\" />\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.nextAssignee' | translate }}</mat-label>\n <yuv-organization [classifications]=\"['id:organization:set[user,role]']\"\n [matTooltip]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [multiselect]=\"true\"\n [withMetadata]=\"true\"\n [required]=\"true\"\n formControlName=\"nextAssignee\">\n </yuv-organization>\n </mat-form-field>\n </div>\n @if ($last) {\n <button mat-icon-button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItem()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--_sequence-list-item-background: var(--sequence-list-item-background, var(--ymt-surface-panel));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--ymt-outline-variant));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, var(--ymt-spacing-xs));--_sequence-list-line-color: var(--sequence-list-line-color, var(--ymt-text-color-subtle));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--ymt-surface-panel));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--ymt-primary) r g b/.5);outline-offset:-2px;border-color:var(--ymt-primary)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--ymt-danger);outline:3px solid rgb(from var(--ymt-danger) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% - var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:var(--ymt-spacing-xs);display:grid;column-gap:var(--ymt-spacing-m);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:var(--ymt-spacing-2xs);background-color:transparent;color:var(--ymt-text-color)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user}:host form section .item .item-form .remove{--icon-size: 18px;padding:var(--ymt-spacing-2xs);grid-area:remove;padding:0}:host mat-form-field{margin-block-start:var(--ymt-spacing-s)}\n"] }]
155
+ }, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track item; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button mat-icon-button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded()\" (click)=\"addItemAt($index)\">\n <mat-icon>add</mat-icon>\n </button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button ymtIconButton icon-button-size=\"small\" class=\"remove hidden\" [class.hidden]=\"controlCount() < 2\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"controlCount() < 2\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.task' | translate }}</mat-label>\n <input matInput [maxLength]=\"128\" formControlName=\"title\" />\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.nextAssignee' | translate }}</mat-label>\n <yuv-organization [classifications]=\"['id:organization:set[user,role]']\"\n [matTooltip]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [multiselect]=\"true\"\n [withMetadata]=\"true\"\n [required]=\"true\"\n formControlName=\"nextAssignee\">\n </yuv-organization>\n </mat-form-field>\n </div>\n @if ($last) {\n <button mat-icon-button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded()\" (click)=\"addItem()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--_sequence-list-item-background: var(--sequence-list-item-background, var(--ymt-surface-panel));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--ymt-outline-variant));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, var(--ymt-spacing-xs));--_sequence-list-line-color: var(--sequence-list-line-color, var(--ymt-text-color-subtle));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--ymt-surface-panel));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--ymt-primary) r g b/.5);outline-offset:-2px;border-color:var(--ymt-primary)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--ymt-danger);outline:3px solid rgb(from var(--ymt-danger) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% + var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:var(--ymt-spacing-xs);display:grid;column-gap:var(--ymt-spacing-m);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:var(--ymt-spacing-2xs);background-color:transparent;color:var(--ymt-text-color)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user}:host form section .item .item-form .remove{--icon-size: 18px;padding:var(--ymt-spacing-2xs);grid-area:remove;padding:0}:host form section .item .item-form .remove.hidden{visibility:hidden}:host mat-form-field{margin-block-start:var(--ymt-spacing-s)}\n"] }]
152
156
  }], ctorParameters: () => [], propDecorators: { orgComponent: [{
153
157
  type: ViewChild,
154
158
  args: [OrganizationComponent]
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-sequence-list.mjs","sources":["../../../../../libs/yuuvis/client-framework/sequence-list/src/lib/sequence-list.component.ts","../../../../../libs/yuuvis/client-framework/sequence-list/src/lib/sequence-list.component.html","../../../../../libs/yuuvis/client-framework/sequence-list/src/yuuvis-client-framework-sequence-list.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, ViewChild, forwardRef, inject, input } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n ControlValueAccessor,\n FormArray,\n FormControl,\n FormGroup,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n NonNullableFormBuilder,\n ReactiveFormsModule,\n ValidationErrors,\n Validator,\n Validators\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport { OrganizationComponent } from '@yuuvis/client-framework/forms';\nimport { SequenceItem, SequenceListAssignee } from './sequence-list.interface';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DASHLET_MESSAGE_EVENTS } from '@yuuvis/media-viewer';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\n\ntype SequenceFormItem = FormGroup<{\n title: FormControl<string>;\n nextAssignee: FormControl<SequenceListAssignee[]>;\n expiryDatetime: FormControl<any>;\n}>;\ntype SequenceForm = FormGroup<{\n items: FormArray<SequenceFormItem>;\n}>;\n\n/**\n * Task sequence list.\n */\n@Component({\n selector: 'yuv-sequence-list',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n OrganizationComponent,\n MatButtonModule,\n MatIconModule,\n ReactiveFormsModule,\n MatTooltipModule,\n MatInputModule,\n MatFormFieldModule,\n YmtIconButtonDirective\n ],\n templateUrl: './sequence-list.component.html',\n styleUrl: './sequence-list.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SequenceListComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SequenceListComponent),\n multi: true\n }\n ],\n host: {\n tabindex: '0'\n }\n})\nexport class SequenceListComponent implements ControlValueAccessor, Validator {\n #fb = inject(NonNullableFormBuilder);\n\n @ViewChild(OrganizationComponent) orgComponent!: OrganizationComponent;\n\n /**\n * Maximum number of sequence items (defaults to 100).\n */\n maxLength = input<number>(100);\n maxLengthExceeded = false;\n\n // dynamic form for sequence items\n sequenceForm: SequenceForm = this.#fb.group({\n items: this.#fb.array<SequenceFormItem>([this.#generateSequenceItem()])\n });\n\n entries: SequenceItem[] = [];\n\n get formItemArray(): FormArray<SequenceFormItem> {\n return this.sequenceForm.controls.items as FormArray<SequenceFormItem>;\n }\n\n constructor() {\n this.sequenceForm.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {\n this.#propagate();\n });\n }\n\n #generateSequenceItem(sequenceItem?: SequenceItem): SequenceFormItem {\n return this.#fb.group({\n title: [sequenceItem?.title || '', Validators.required],\n nextAssignee: [sequenceItem?.nextAssignee || [], Validators.required],\n expiryDatetime: [sequenceItem?.expiryDatetime || undefined]\n });\n }\n\n addItem() {\n this.sequenceForm.controls.items.push(this.#generateSequenceItem());\n this.#updateState();\n }\n\n addItemAt(idx: number) {\n this.sequenceForm.controls.items.insert(idx, this.#generateSequenceItem());\n this.#updateState();\n }\n\n removeItem(idx: number) {\n this.sequenceForm.controls.items.removeAt(idx);\n this.#updateState();\n }\n\n #updateState() {\n const ml = this.maxLength();\n this.maxLengthExceeded = ml !== undefined && this.formItemArray.length >= ml;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n propagateChange = (_: any) => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n registerOnTouched(): void {}\n\n #propagate() {\n const res: SequenceItem[] = [];\n (this.sequenceForm.value.items || []).forEach((item: any) => {\n const i: SequenceItem = {\n title: item.title,\n nextAssignee: item.nextAssignee\n };\n if (item.expiryDatetime) {\n i.expiryDatetime = item.expiryDatetime;\n }\n res.push(i);\n });\n\n this.propagateChange(res);\n }\n\n writeValue(value: SequenceItem[]): void {\n this.entries = value || [];\n this.formItemArray.clear();\n if (this.entries.length === 0) this.addItem();\n this.entries.forEach((entry) => {\n this.formItemArray.push(this.#generateSequenceItem(entry));\n });\n }\n\n registerOnChange(fn: any): void {\n this.propagateChange = fn;\n }\n\n validate(): ValidationErrors | null {\n const ml = this.maxLength();\n const mlExceeded = ml !== undefined && this.formItemArray.length > ml;\n const valid = this.sequenceForm.valid && !mlExceeded;\n\n return !valid\n ? {\n sequencelist: {\n invalid: this.sequenceForm.invalid,\n maxLengthExceeded: mlExceeded\n }\n }\n : null;\n }\n}\n","<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track item; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button mat-icon-button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItemAt($index)\">\n <mat-icon>add</mat-icon>\n </button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button ymtIconButton icon-button-size=\"small\" class=\"remove\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"sequenceForm.controls.items.controls.length === 1\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.task' | translate }}</mat-label>\n <input matInput [maxLength]=\"128\" formControlName=\"title\" />\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.nextAssignee' | translate }}</mat-label>\n <yuv-organization [classifications]=\"['id:organization:set[user,role]']\"\n [matTooltip]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [multiselect]=\"true\"\n [withMetadata]=\"true\"\n [required]=\"true\"\n formControlName=\"nextAssignee\">\n </yuv-organization>\n </mat-form-field>\n </div>\n @if ($last) {\n <button mat-icon-button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItem()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </div>\n }\n </section>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-sequence-list.mjs","sources":["../../../../../libs/yuuvis/client-framework/sequence-list/src/lib/sequence-list.component.ts","../../../../../libs/yuuvis/client-framework/sequence-list/src/lib/sequence-list.component.html","../../../../../libs/yuuvis/client-framework/sequence-list/src/yuuvis-client-framework-sequence-list.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, ViewChild, computed, forwardRef, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n ControlValueAccessor,\n FormArray,\n FormControl,\n FormGroup,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n NonNullableFormBuilder,\n ReactiveFormsModule,\n ValidationErrors,\n Validator,\n Validators\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport { OrganizationComponent } from '@yuuvis/client-framework/forms';\nimport { SequenceItem, SequenceListAssignee } from './sequence-list.interface';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DASHLET_MESSAGE_EVENTS } from '@yuuvis/media-viewer';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\n\ntype SequenceFormItem = FormGroup<{\n title: FormControl<string>;\n nextAssignee: FormControl<SequenceListAssignee[]>;\n expiryDatetime: FormControl<any>;\n}>;\ntype SequenceForm = FormGroup<{\n items: FormArray<SequenceFormItem>;\n}>;\n\n/**\n * Task sequence list.\n */\n@Component({\n selector: 'yuv-sequence-list',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n OrganizationComponent,\n MatButtonModule,\n MatIconModule,\n ReactiveFormsModule,\n MatTooltipModule,\n MatInputModule,\n MatFormFieldModule,\n YmtIconButtonDirective\n ],\n templateUrl: './sequence-list.component.html',\n styleUrl: './sequence-list.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SequenceListComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SequenceListComponent),\n multi: true\n }\n ],\n host: {\n tabindex: '0'\n }\n})\nexport class SequenceListComponent implements ControlValueAccessor, Validator {\n #fb = inject(NonNullableFormBuilder);\n\n @ViewChild(OrganizationComponent) orgComponent!: OrganizationComponent;\n\n /**\n * Maximum number of sequence items (defaults to 100).\n */\n maxLength = input<number>(100);\n maxLengthExceeded = signal<boolean>(false);\n readonly controlCount = signal<number>(0);\n\n // dynamic form for sequence items\n sequenceForm: SequenceForm = this.#fb.group({\n items: this.#fb.array<SequenceFormItem>([this.#generateSequenceItem()])\n });\n\n entries: SequenceItem[] = [];\n\n get formItemArray(): FormArray<SequenceFormItem> {\n return this.sequenceForm.controls.items as FormArray<SequenceFormItem>;\n }\n\n constructor() {\n this.#updateState();\n this.sequenceForm.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {\n this.#propagate();\n });\n }\n\n #generateSequenceItem(sequenceItem?: SequenceItem): SequenceFormItem {\n return this.#fb.group({\n title: [sequenceItem?.title || '', Validators.required],\n nextAssignee: [sequenceItem?.nextAssignee || [], Validators.required],\n expiryDatetime: [sequenceItem?.expiryDatetime || undefined]\n });\n }\n\n addItem() {\n this.sequenceForm.controls.items.push(this.#generateSequenceItem());\n this.#updateState();\n }\n\n addItemAt(idx: number) {\n this.sequenceForm.controls.items.insert(idx, this.#generateSequenceItem());\n this.#updateState();\n }\n\n removeItem(idx: number) {\n this.sequenceForm.controls.items.removeAt(idx);\n this.#updateState();\n }\n\n #updateState() {\n const ml = this.maxLength();\n this.maxLengthExceeded.set(ml !== undefined && this.formItemArray.length >= ml);\n this.controlCount.set(this.sequenceForm.controls.items.length);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n propagateChange = (_: any) => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n registerOnTouched(): void {}\n\n #propagate() {\n const res: SequenceItem[] = [];\n (this.sequenceForm.value.items || []).forEach((item: any) => {\n const i: SequenceItem = {\n title: item.title,\n nextAssignee: item.nextAssignee\n };\n if (item.expiryDatetime) {\n i.expiryDatetime = item.expiryDatetime;\n }\n res.push(i);\n });\n\n this.propagateChange(res);\n }\n\n writeValue(value: SequenceItem[]): void {\n this.entries = value || [];\n this.formItemArray.clear();\n if (this.entries.length === 0) this.addItem();\n this.entries.forEach((entry) => {\n this.formItemArray.push(this.#generateSequenceItem(entry));\n });\n this.#updateState();\n }\n\n registerOnChange(fn: any): void {\n this.propagateChange = fn;\n }\n\n validate(): ValidationErrors | null {\n const ml = this.maxLength();\n const mlExceeded = ml !== undefined && this.formItemArray.length > ml;\n const valid = this.sequenceForm.valid && !mlExceeded;\n\n return !valid\n ? {\n sequencelist: {\n invalid: this.sequenceForm.invalid,\n maxLengthExceeded: mlExceeded\n }\n }\n : null;\n }\n}\n","<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track item; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button mat-icon-button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded()\" (click)=\"addItemAt($index)\">\n <mat-icon>add</mat-icon>\n </button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button ymtIconButton icon-button-size=\"small\" class=\"remove hidden\" [class.hidden]=\"controlCount() < 2\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"controlCount() < 2\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.task' | translate }}</mat-label>\n <input matInput [maxLength]=\"128\" formControlName=\"title\" />\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{ 'yuv.sequence-list.form.nextAssignee' | translate }}</mat-label>\n <yuv-organization [classifications]=\"['id:organization:set[user,role]']\"\n [matTooltip]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [multiselect]=\"true\"\n [withMetadata]=\"true\"\n [required]=\"true\"\n formControlName=\"nextAssignee\">\n </yuv-organization>\n </mat-form-field>\n </div>\n @if ($last) {\n <button mat-icon-button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded()\" (click)=\"addItem()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </div>\n }\n </section>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -897,7 +897,7 @@ class YuvWidgetGridWorkspacesComponent {
897
897
  this.configChange.emit(this._workspaceConfig());
898
898
  }
899
899
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: YuvWidgetGridWorkspacesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
900
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: YuvWidgetGridWorkspacesComponent, isStandalone: true, selector: "yuv-widget-grid-workspaces", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, workspaceConfig: { classPropertyName: "workspaceConfig", publicName: "workspaceConfig", isSignal: true, isRequired: false, transformFunction: null }, buckets: { classPropertyName: "buckets", publicName: "buckets", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", gridItemEvent: "gridItemEvent", editModeChange: "editModeChange" }, ngImport: i0, template: "@let ws = workspace();\n\n<div class=\"toolbar\">\n @if (ws) {\n @let workspaces = _workspaceConfig()?.workspaces || [];\n\n <button mat-icon-button [disabled]=\"editMode()\" [matMenuTriggerFor]=\"workspacePickerMenu\"><mat-icon>menu</mat-icon></button>\n\n <mat-menu #workspacePickerMenu=\"matMenu\">\n @for (ws of workspaces; track ws.id) {\n <button mat-menu-item (click)=\"setWorkspace(ws.id)\">{{ getLabel(ws) }}</button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"openWorkspaceDialog(true, tplWworkspaceEdit)\">{{ 'yuv.widget-grid.workspaces.workspace.menu.create' | translate }}</button>\n </mat-menu>\n\n @if (!editMode()) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n @if (!ws.preventEdit) {\n <button mat-icon-button [matMenuTriggerFor]=\"workspaceMenu\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #workspaceMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editMode.set(!editMode())\">{{ 'yuv.widget-grid.workspaces.workspace.menu.edit' | translate }}</button>\n <button mat-menu-item (click)=\"deleteCurrentWorkspace()\">{{ 'yuv.widget-grid.workspaces.workspace.menu.delete' | translate }}</button>\n </mat-menu>\n }\n } @else {\n @if (ws.preventRename || ws.translateLabel) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n } @else {\n <input type=\"text\" class=\"label\" [formControl]=\"workspaceLabelControl\" />\n }\n <button ymtButton=\"secondary\" (click)=\"revertWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" (click)=\"persistWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.save' | translate }}\n </button>\n }\n }\n</div>\n\n@if (ws) {\n <yuv-widget-grid\n [gridConfig]=\"_workspaceOptions().gridConfig\"\n [gridItemConfig]=\"gridItemConfig()\"\n [buckets]=\"buckets()\"\n [editMode]=\"editMode()\"\n (gridChange)=\"onGridChange($event)\"\n (gridItemEvent)=\"onGridEvent($event)\"\n >\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"editMode.set(true)\">\n {{ 'yuv.widget-grid.empty.create' | translate }}\n </button>\n </div>\n </yuv-widget-grid>\n} @else {\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.workspaces.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"openWorkspaceDialog(true, tplWworkspaceEdit)\">\n {{ 'yuv.widget-grid.workspaces.empty.button.create' | translate }}\n </button>\n </div>\n}\n\n<ng-template #tplWworkspaceEdit>\n <yuv-workspace-edit [workspaceForm]=\"workspaceForm\" (workspaceSubmit)=\"saveWorkspace()\"></yuv-workspace-edit>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;height:100%;overflow-y:auto}:host .toolbar{display:flex;flex-direction:row;align-items:center;gap:var(--ymt-spacing-m)}:host .toolbar .label{flex:1;font:var(--ymt-font-headline-medium);letter-spacing:var(--ymt-font-headline-medium-tracking);margin-inline:0;margin-block:.75em;padding-inline:.25em 0;padding-block:.25em}:host .toolbar input.label{border:0;background-color:transparent}:host .toolbar input.label:not([disabled]){outline:1px solid var(--ymt-outline)}:host yuv-widget-grid{flex:1}:host .empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: YuvWidgetGridComponent, selector: "yuv-widget-grid", inputs: ["gridConfig", "editMode", "gridItemConfig", "buckets"], outputs: ["gridChange", "gridItemEvent", "widgetPickerOpen"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: WorkspaceEditComponent, selector: "yuv-workspace-edit", inputs: ["workspaceForm"], outputs: ["workspaceSubmit"] }] }); }
900
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: YuvWidgetGridWorkspacesComponent, isStandalone: true, selector: "yuv-widget-grid-workspaces", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, workspaceConfig: { classPropertyName: "workspaceConfig", publicName: "workspaceConfig", isSignal: true, isRequired: false, transformFunction: null }, buckets: { classPropertyName: "buckets", publicName: "buckets", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { configChange: "configChange", gridItemEvent: "gridItemEvent", editModeChange: "editModeChange" }, ngImport: i0, template: "@let ws = workspace();\n\n<div class=\"toolbar\">\n @if (ws) {\n @let workspaces = _workspaceConfig()?.workspaces || [];\n\n <button\n mat-icon-button\n [matTooltip]=\"'yuv.widget-grid.workspaces.workspace.menu.tooltip' | translate\"\n [disabled]=\"editMode()\"\n [matMenuTriggerFor]=\"workspacePickerMenu\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n\n <mat-menu #workspacePickerMenu=\"matMenu\">\n @for (ws of workspaces; track ws.id) {\n <button mat-menu-item (click)=\"setWorkspace(ws.id)\">{{ getLabel(ws) }}</button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"openWorkspaceDialog(true, tplWorkspaceEdit)\">{{ 'yuv.widget-grid.workspaces.workspace.menu.create' | translate }}</button>\n </mat-menu>\n\n @if (!editMode()) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n @if (!ws.preventEdit) {\n <button mat-icon-button [matMenuTriggerFor]=\"workspaceMenu\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #workspaceMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editMode.set(!editMode())\">{{ 'yuv.widget-grid.workspaces.workspace.menu.edit' | translate }}</button>\n <button mat-menu-item (click)=\"deleteCurrentWorkspace()\">{{ 'yuv.widget-grid.workspaces.workspace.menu.delete' | translate }}</button>\n </mat-menu>\n }\n } @else {\n @if (ws.preventRename || ws.translateLabel) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n } @else {\n <input type=\"text\" class=\"label\" [formControl]=\"workspaceLabelControl\" />\n }\n <button ymtButton=\"secondary\" (click)=\"revertWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" (click)=\"persistWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.save' | translate }}\n </button>\n }\n }\n</div>\n\n@if (ws) {\n <yuv-widget-grid\n [gridConfig]=\"_workspaceOptions().gridConfig\"\n [gridItemConfig]=\"gridItemConfig()\"\n [buckets]=\"buckets()\"\n [editMode]=\"editMode()\"\n (gridChange)=\"onGridChange($event)\"\n (gridItemEvent)=\"onGridEvent($event)\"\n >\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"editMode.set(true)\">\n {{ 'yuv.widget-grid.empty.create' | translate }}\n </button>\n </div>\n </yuv-widget-grid>\n} @else {\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.workspaces.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"openWorkspaceDialog(true, tplWorkspaceEdit)\">\n {{ 'yuv.widget-grid.workspaces.empty.button.create' | translate }}\n </button>\n </div>\n}\n\n<ng-template #tplWorkspaceEdit>\n <yuv-workspace-edit [workspaceForm]=\"workspaceForm\" (workspaceSubmit)=\"saveWorkspace()\"></yuv-workspace-edit>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;height:100%;overflow-y:auto}:host .toolbar{display:flex;flex-direction:row;align-items:center;gap:var(--ymt-spacing-m)}:host .toolbar .label{flex:1;font:var(--ymt-font-headline-medium);letter-spacing:var(--ymt-font-headline-medium-tracking);margin-inline:0;margin-block:.75em;padding-inline:.25em 0;padding-block:.25em}:host .toolbar input.label{border:0;background-color:transparent}:host .toolbar input.label:not([disabled]){outline:1px solid var(--ymt-outline)}:host yuv-widget-grid{flex:1}:host .empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: YuvWidgetGridComponent, selector: "yuv-widget-grid", inputs: ["gridConfig", "editMode", "gridItemConfig", "buckets"], outputs: ["gridChange", "gridItemEvent", "widgetPickerOpen"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: WorkspaceEditComponent, selector: "yuv-workspace-edit", inputs: ["workspaceForm"], outputs: ["workspaceSubmit"] }] }); }
901
901
  }
902
902
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: YuvWidgetGridWorkspacesComponent, decorators: [{
903
903
  type: Component,
@@ -912,9 +912,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
912
912
  MatFormFieldModule,
913
913
  MatMenuModule,
914
914
  MatDividerModule,
915
+ MatTooltipModule,
915
916
  TranslateModule,
916
917
  WorkspaceEditComponent
917
- ], template: "@let ws = workspace();\n\n<div class=\"toolbar\">\n @if (ws) {\n @let workspaces = _workspaceConfig()?.workspaces || [];\n\n <button mat-icon-button [disabled]=\"editMode()\" [matMenuTriggerFor]=\"workspacePickerMenu\"><mat-icon>menu</mat-icon></button>\n\n <mat-menu #workspacePickerMenu=\"matMenu\">\n @for (ws of workspaces; track ws.id) {\n <button mat-menu-item (click)=\"setWorkspace(ws.id)\">{{ getLabel(ws) }}</button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"openWorkspaceDialog(true, tplWworkspaceEdit)\">{{ 'yuv.widget-grid.workspaces.workspace.menu.create' | translate }}</button>\n </mat-menu>\n\n @if (!editMode()) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n @if (!ws.preventEdit) {\n <button mat-icon-button [matMenuTriggerFor]=\"workspaceMenu\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #workspaceMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editMode.set(!editMode())\">{{ 'yuv.widget-grid.workspaces.workspace.menu.edit' | translate }}</button>\n <button mat-menu-item (click)=\"deleteCurrentWorkspace()\">{{ 'yuv.widget-grid.workspaces.workspace.menu.delete' | translate }}</button>\n </mat-menu>\n }\n } @else {\n @if (ws.preventRename || ws.translateLabel) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n } @else {\n <input type=\"text\" class=\"label\" [formControl]=\"workspaceLabelControl\" />\n }\n <button ymtButton=\"secondary\" (click)=\"revertWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" (click)=\"persistWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.save' | translate }}\n </button>\n }\n }\n</div>\n\n@if (ws) {\n <yuv-widget-grid\n [gridConfig]=\"_workspaceOptions().gridConfig\"\n [gridItemConfig]=\"gridItemConfig()\"\n [buckets]=\"buckets()\"\n [editMode]=\"editMode()\"\n (gridChange)=\"onGridChange($event)\"\n (gridItemEvent)=\"onGridEvent($event)\"\n >\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"editMode.set(true)\">\n {{ 'yuv.widget-grid.empty.create' | translate }}\n </button>\n </div>\n </yuv-widget-grid>\n} @else {\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.workspaces.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"openWorkspaceDialog(true, tplWworkspaceEdit)\">\n {{ 'yuv.widget-grid.workspaces.empty.button.create' | translate }}\n </button>\n </div>\n}\n\n<ng-template #tplWworkspaceEdit>\n <yuv-workspace-edit [workspaceForm]=\"workspaceForm\" (workspaceSubmit)=\"saveWorkspace()\"></yuv-workspace-edit>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;height:100%;overflow-y:auto}:host .toolbar{display:flex;flex-direction:row;align-items:center;gap:var(--ymt-spacing-m)}:host .toolbar .label{flex:1;font:var(--ymt-font-headline-medium);letter-spacing:var(--ymt-font-headline-medium-tracking);margin-inline:0;margin-block:.75em;padding-inline:.25em 0;padding-block:.25em}:host .toolbar input.label{border:0;background-color:transparent}:host .toolbar input.label:not([disabled]){outline:1px solid var(--ymt-outline)}:host yuv-widget-grid{flex:1}:host .empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}\n"] }]
918
+ ], template: "@let ws = workspace();\n\n<div class=\"toolbar\">\n @if (ws) {\n @let workspaces = _workspaceConfig()?.workspaces || [];\n\n <button\n mat-icon-button\n [matTooltip]=\"'yuv.widget-grid.workspaces.workspace.menu.tooltip' | translate\"\n [disabled]=\"editMode()\"\n [matMenuTriggerFor]=\"workspacePickerMenu\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n\n <mat-menu #workspacePickerMenu=\"matMenu\">\n @for (ws of workspaces; track ws.id) {\n <button mat-menu-item (click)=\"setWorkspace(ws.id)\">{{ getLabel(ws) }}</button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"openWorkspaceDialog(true, tplWorkspaceEdit)\">{{ 'yuv.widget-grid.workspaces.workspace.menu.create' | translate }}</button>\n </mat-menu>\n\n @if (!editMode()) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n @if (!ws.preventEdit) {\n <button mat-icon-button [matMenuTriggerFor]=\"workspaceMenu\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #workspaceMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editMode.set(!editMode())\">{{ 'yuv.widget-grid.workspaces.workspace.menu.edit' | translate }}</button>\n <button mat-menu-item (click)=\"deleteCurrentWorkspace()\">{{ 'yuv.widget-grid.workspaces.workspace.menu.delete' | translate }}</button>\n </mat-menu>\n }\n } @else {\n @if (ws.preventRename || ws.translateLabel) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n } @else {\n <input type=\"text\" class=\"label\" [formControl]=\"workspaceLabelControl\" />\n }\n <button ymtButton=\"secondary\" (click)=\"revertWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" (click)=\"persistWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.save' | translate }}\n </button>\n }\n }\n</div>\n\n@if (ws) {\n <yuv-widget-grid\n [gridConfig]=\"_workspaceOptions().gridConfig\"\n [gridItemConfig]=\"gridItemConfig()\"\n [buckets]=\"buckets()\"\n [editMode]=\"editMode()\"\n (gridChange)=\"onGridChange($event)\"\n (gridItemEvent)=\"onGridEvent($event)\"\n >\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"editMode.set(true)\">\n {{ 'yuv.widget-grid.empty.create' | translate }}\n </button>\n </div>\n </yuv-widget-grid>\n} @else {\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.workspaces.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"openWorkspaceDialog(true, tplWorkspaceEdit)\">\n {{ 'yuv.widget-grid.workspaces.empty.button.create' | translate }}\n </button>\n </div>\n}\n\n<ng-template #tplWorkspaceEdit>\n <yuv-workspace-edit [workspaceForm]=\"workspaceForm\" (workspaceSubmit)=\"saveWorkspace()\"></yuv-workspace-edit>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;height:100%;overflow-y:auto}:host .toolbar{display:flex;flex-direction:row;align-items:center;gap:var(--ymt-spacing-m)}:host .toolbar .label{flex:1;font:var(--ymt-font-headline-medium);letter-spacing:var(--ymt-font-headline-medium-tracking);margin-inline:0;margin-block:.75em;padding-inline:.25em 0;padding-block:.25em}:host .toolbar input.label{border:0;background-color:transparent}:host .toolbar input.label:not([disabled]){outline:1px solid var(--ymt-outline)}:host yuv-widget-grid{flex:1}:host .empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}\n"] }]
918
919
  }] });
919
920
 
920
921
  const cmp = [
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-widget-grid.mjs","sources":["../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-event.service.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widgets/noop/noop.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widgets/noop/noop.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-registry.service.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.utils.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.service.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-picker/widget-picker.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-picker/widget-picker.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/workspace-edit/workspace-edit.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/workspace-edit/workspace-edit.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/widget-grid-workspaces.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/widget-grid-workspaces.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.module.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/yuuvis-client-framework-widget-grid.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { GridItemEvent } from './widget-grid.interface';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WidgetGridEventService {\n private widgetGridEventSource = new ReplaySubject<GridItemEvent>();\n\n public widgetEvents$: Observable<GridItemEvent> =\n this.widgetGridEventSource.asObservable();\n \n trigger(evt: GridItemEvent) {\n this.widgetGridEventSource.next(evt);\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { IWidgetComponent } from '../../widget-grid.interface';\n\n@Component({\n selector: 'yuv-noop',\n templateUrl: './noop.component.html',\n styleUrls: ['./noop.component.scss'],\n})\nexport class NoopComponent implements IWidgetComponent<any> {\n @Input() widgetConfig: any;\n}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><circle cx=\"15.5\" cy=\"9.5\" r=\"1.5\"/><circle cx=\"8.5\" cy=\"9.5\" r=\"1.5\"/><path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-6c-2.33 0-4.32 1.45-5.12 3.5h1.67c.69-1.19 1.97-2 3.45-2s2.75.81 3.45 2h1.67c-.8-2.05-2.79-3.5-5.12-3.5z\"/></svg>","import { inject, Injectable, Type } from '@angular/core';\n\nimport { TranslateService } from '@yuuvis/client-core';\nimport { GridWidget } from './widget-grid.interface';\nimport { NoopComponent } from './widgets/noop/noop.component';\n\n/**\n * This service provides the list of widgets that could be added\n * to a widget grid. You could use it to register your own\n * widgets.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class WidgetGridRegistry {\n readonly translate = inject(TranslateService);\n\n /**\n * List of pre-registered widgets provided out-of-the-box\n * by the widget grid module\n */\n private registeredWidgets: Array<GridWidget<unknown>> = [];\n /**\n * Buckets are collection of widget references.\n * You can put any widget registered gloabally into a bucket. Later on you can grab\n * widgets from a certain bucket. This enables apps to structure their widgets when e.g.\n * using multiple widget grids with their own set of available widgets.\n */\n private widgetBuckets: Record<string, string[]> = {};\n\n /**\n * Get the noop component. This component will be rendered in\n * the grid tile if not matching widget could be found in the\n * list of registered widgets. It will show some kind of 'not\n * found' message and provide the controls to remove that none\n * existing component from the widget grid.\n * @returns NoopComponent\n */\n getNoopWidget(): GridWidget<any> {\n return {\n id: 'noop',\n label: this.translate.instant('yuv.widget-grid.widget.noop.label'),\n widgetComponent: NoopComponent\n };\n }\n\n /**\n * Setup components are the administrative part of a widget. They\n * are used to set up a widget. Not all the widgets will have a setup\n * component.\n * @param widgetName The widgets name\n * @returns The setup component of a widget. Throws error if there\n * is not widget registered with the given name\n */\n getWidgetSetupComponent(widgetName: string): Type<any> | undefined {\n const widget = this.registeredWidgets.find((w) => w.id === widgetName);\n if (!widget) throw Error('Widget setup component not found');\n return widget.setupComponent;\n }\n\n /**\n * Get the component for a widget. This is the component that will\n * be rendered in a grid tile.\n * @param widgetName The widgets name\n * @returns The widget component or noop component if there is\n * no component registered with the given name\n */\n getWidgetComponent(widgetName: string): Type<any> {\n const widget = this.registeredWidgets.find((w) => w.id === widgetName);\n if (!widget) console.error('Widget component not found');\n return widget?.widgetComponent || NoopComponent;\n }\n\n /**\n * Adds a new widget to the list of registered widgets. That way\n * you can create custom widgets that are then available to be\n * added to a users widget grid.\n * @param widget The widget to be registered\n * @param bucket List of buckets to register to. If a bucket does\n * not exist it'll be created.\n */\n registerGridWidget(widget: GridWidget<any>, buckets?: string[]) {\n const existingWidget = this.registeredWidgets.find((w) => w.id === widget.id);\n if (!existingWidget) this.registeredWidgets.push(widget);\n\n if (buckets?.length) {\n buckets.forEach((b: string) => {\n this._addToBucket(b, widget.id);\n });\n }\n }\n\n /**\n * Register a collection of widgets\n * @param widgets The widgets to be registered\n * @param bucket List of buckets to register to. If a bucket does\n * not exist it'll be created.\n */\n registerGridWidgets(widgets: GridWidget<any>[], buckets?: string[]) {\n const alreadyRegisteredWidgetNames = this.registeredWidgets.map((w) => w.id);\n const widgetsToRegister = widgets.filter((w) => !alreadyRegisteredWidgetNames.includes(w.id));\n this.registeredWidgets = [...this.registeredWidgets, ...widgetsToRegister.map((w) => this.#translateLabel(w))];\n\n if (buckets?.length) {\n buckets.forEach((b) => widgets.forEach((w) => this._addToBucket(b, w.id)));\n }\n }\n\n #translateLabel(widget: GridWidget<any>): GridWidget<any> {\n const translatedLabel = this.translate.instant(widget.label);\n return { ...widget, label: translatedLabel && !translatedLabel.startsWith('!missing') ? translatedLabel : widget.label };\n }\n\n private _addToBucket(bucket: string, widgetName: string) {\n if (!this.widgetBuckets[bucket]) this.widgetBuckets[bucket] = [];\n this.widgetBuckets[bucket].push(widgetName);\n }\n\n removeRegisteredWidget(id: string) {\n this.registeredWidgets = this.registeredWidgets.filter((w) => w.id !== id);\n }\n\n clearRegisteredWidget() {\n this.registeredWidgets = [];\n }\n\n /**\n * Get registered widgets. This list could be narrowed down by a list\n * of buckets. Buckets are lists of registered widgets registered for\n * a certain key (the buckets name).\n * @param buckets name of buckets to restrict the widgets to\n * @returns Array of grid widgets\n */\n getRegisteredWidgets(buckets?: string[]): Array<GridWidget<any>> {\n if (buckets?.length) {\n // buckets may contain wildcards ...\n // grab all buckets matching the wildcards\n const matchedBuckets: Record<string, number> = {};\n buckets.forEach((b: string) => {\n if (b.match(/[*?]/)) {\n // bucket has a pattern\n Object.keys(this.widgetBuckets).forEach((wb: string) => {\n if (this._wildcardMatch(wb, b)) matchedBuckets[wb] = 0;\n });\n } else matchedBuckets[b] = 0;\n });\n const bucketWidgetNames: Record<string, number> = {};\n Object.keys(matchedBuckets).forEach((b) =>\n this.widgetBuckets[b].forEach((widgetName: string) => {\n bucketWidgetNames[widgetName] = 0;\n })\n );\n const widgetNames: string[] = Object.keys(bucketWidgetNames);\n return this.registeredWidgets.filter((w: GridWidget<any>) => widgetNames.includes(w.id)).map((w) => this.#translateLabel(w));\n } else return this.registeredWidgets.map((w) => this.#translateLabel(w));\n }\n\n private _wildcardMatch(text: string, pattern: string) {\n const regexPattern = new RegExp('^' + pattern.replace(/\\?/g, '.').replace(/\\*/g, '.*') + '$');\n return regexPattern.test(text);\n }\n}\n","export class WidgetGridUtils {\n static PREF_FUNCTION = 'Function';\n static PREF_RANGEVALUE = 'RangeValue';\n\n /**\n * Takes a `WidgetGridItemConfig` and stringifies it. The challenge\n * here is that callback functions should also be stringified.\n * @param gridItemConfig the config object\n */\n static gridConfigStringify(o: any): string {\n return JSON.stringify(o, (key, value) => {\n if (typeof value === 'function') {\n return `/${WidgetGridUtils.PREF_FUNCTION}(${value.toString()})/`;\n }\n return value;\n });\n }\n\n /**\n * Takes a string stringified with `gridConfigStringify()` and parses it\n * to output a proper WidgetGridItemConfig.\n * @param stringifiedConfig stringified widget grid config\n */\n static gridConfigParse(stringifiedConfig: string): any {\n return JSON.parse(stringifiedConfig, function (key, value) {\n if (\n typeof value === 'string' &&\n value.startsWith(`/${WidgetGridUtils.PREF_FUNCTION}(`) &&\n // value.startsWith('/Function(') &&\n value.endsWith(')/')\n ) {\n value = value.substring(WidgetGridUtils.PREF_FUNCTION.length + 2, value.length - 2);\n return (0, eval)('(' + value + ')');\n }\n return value;\n });\n }\n\n public static uuid(): string {\n return WidgetGridUtils._p8() + WidgetGridUtils._p8(true) + WidgetGridUtils._p8(true) + WidgetGridUtils._p8();\n }\n\n private static _p8(s?: boolean): string {\n const p = (Math.random().toString(16) + '000000000').substr(2, 8);\n return s ? `-${p.substr(0, 4)}-${p.substr(4, 4)}` : p;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\n\nimport { WidgetGridRegistry } from './widget-grid-registry.service';\nimport { WidgetGridItem, WidgetGridItemConfig } from './widget-grid.interface';\nimport { WidgetGridUtils } from './widget-grid.utils';\nimport { NoopComponent } from './widgets/noop/noop.component';\n\n/**\n * Service managing a widget grid. Also includes a set of labels that will be\n * used by the grid and its widgets. Default labels are provided out of the\n * box. But if you want to use custom ones or add i18n you could overwrite\n * them. The grid as well as the widgets will use those labels or fall back\n * to their default ones. If you are developing own widgets you should\n * consider using those labels as well.\n */\n@Injectable()\nexport class WidgetGridService {\n private widgetGrid: WidgetGridItem[] = [];\n private widgetGridSource = new ReplaySubject<WidgetGridItem[]>();\n public widgetGrid$: Observable<WidgetGridItem[]> =\n this.widgetGridSource.asObservable();\n\n private widgetGridUpdateSource = new Subject<string>();\n /**\n * Emitted when the widget grid has been updated\n */\n public widgetGridUpdate$: Observable<string> =\n this.widgetGridUpdateSource.asObservable();\n\n public addItemSize: {\n rows: number;\n cols: number;\n } = {\n rows: 2,\n cols: 3,\n };\n\n constructor(private widgetGridRegistry: WidgetGridRegistry) {}\n\n setWidgetGrid(gridItemConfig: Array<WidgetGridItemConfig> | undefined) {\n if (gridItemConfig) {\n // create actual widget grid from widget grid config\n this.widgetGrid = [...gridItemConfig].map((gic) => {\n const cmp = this.widgetGridRegistry.getWidgetComponent(gic.widgetName);\n const gc: WidgetGridItem = {\n ...gic,\n widget: cmp,\n widgetConfigMap: {\n widgetConfig:\n cmp === NoopComponent\n ? {\n widgetName: gic.widgetName,\n }\n : gic.widgetConfig,\n },\n };\n return gc;\n });\n } else {\n this.widgetGrid = [];\n }\n this.widgetGridSource.next(this.widgetGrid);\n }\n\n /**\n * Update config of an existing widget\n * @param widgetId ID of the widget to be updated\n * @param setupWidgetConfig The updated configuration for that widget\n */\n updateWidget(widgetId: string, setupWidgetConfig: any) {\n const gridWidget = this.widgetGrid.find((w) => w.id === widgetId);\n if (gridWidget && setupWidgetConfig) {\n gridWidget.widgetConfig = setupWidgetConfig;\n gridWidget.widgetConfigMap = { widgetConfig: setupWidgetConfig };\n }\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(widgetId);\n }\n\n replaceWidget(widgetId: string, widgetName: string, setupWidgetConfig?: any) {\n const gridWidgetIndex = this.widgetGrid.findIndex((w) => w.id === widgetId);\n if (gridWidgetIndex !== -1) {\n const w: WidgetGridItem = {\n ...this.widgetGrid[gridWidgetIndex],\n ...{\n widgetName,\n widgetConfig: setupWidgetConfig || {},\n widget: this.widgetGridRegistry.getWidgetComponent(widgetName),\n widgetConfigMap: { widgetConfig: setupWidgetConfig || {} },\n },\n };\n this.widgetGrid[gridWidgetIndex] = w;\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(widgetId);\n }\n }\n\n /**\n * Add a new grid item to the widget grid.\n * @param widgetName The name of the grid item to be added\n * @param setupWidgetConfig\n */\n addWidget(\n widgetName: string,\n setupWidgetConfig?: any\n ) {\n const gridWidget: WidgetGridItem = {\n id: WidgetGridUtils.uuid(),\n widgetName,\n widgetConfig: setupWidgetConfig,\n widget: this.widgetGridRegistry.getWidgetComponent(widgetName),\n widgetConfigMap: { widgetConfig: setupWidgetConfig },\n x: 0,\n y: 0,\n rows: this.addItemSize.rows,\n cols: this.addItemSize.cols,\n };\n this.widgetGrid.push(gridWidget);\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(gridWidget.id);\n }\n\n removeWidget(gridItemId: string) {\n const idx = this.widgetGrid.findIndex((w) => w.id === gridItemId);\n this.widgetGrid.splice(idx, 1);\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(gridItemId);\n }\n}\n","import { Component, effect, inject, input, OnInit, output } from '@angular/core';\nimport { AttributesMap, OutputsType, DynamicIoModule } from 'ng-dynamic-component';\n\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormControlStatus, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport { SignalComponentIoModule } from 'ng-dynamic-component/signal-component-io';\nimport { WidgetGridRegistry } from '../widget-grid-registry.service';\nimport { GridWidget, WidgetPickerData, WidgetPickerOptions } from '../widget-grid.interface';\nimport { WidgetGridService } from '../widget-grid.service';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { MatListModule } from '@angular/material/list';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'yuv-widget-picker',\n imports: [\n CommonModule,\n MatButtonModule,\n TranslateModule,\n MatIconModule,\n DialogComponent,\n YmtButtonDirective,\n MatListModule,\n DynamicIoModule,\n ReactiveFormsModule,\n SignalComponentIoModule\n ],\n templateUrl: './widget-picker.component.html',\n styleUrls: ['./widget-picker.component.scss']\n})\nexport class WidgetPickerComponent implements OnInit {\n #widgetGridRegistry = inject(WidgetGridRegistry);\n #widgetGridService = inject(WidgetGridService);\n #dialogData = inject<WidgetPickerOptions>(MAT_DIALOG_DATA);\n readonly #dialogRef = inject(MatDialogRef<WidgetPickerComponent>);\n\n pickerFormControl = new FormControl();\n\n widgetId: string | undefined;\n selectedWidget: GridWidget<any> | undefined;\n widgetConfigMap: AttributesMap = {};\n setupWidgetConfig: any;\n widgetConfigDirty = false;\n widgetConfigState?: FormControlStatus;\n registeredWidgets: Array<GridWidget<any>> = [];\n setupWidgetDynamicOutputs: OutputsType = {\n widgetConfigChange: (widgetConfig: any) => {\n this.onSetupConfigChange(widgetConfig);\n },\n widgetConfigStateChange: (s?: any) => {\n this.widgetConfigState = s || undefined;\n }\n };\n\n pickerData = input<WidgetPickerData | undefined>(this.#dialogData.pickerData);\n #pickerDataEffect = effect(() => {\n const pd = this.pickerData();\n if (pd) {\n const gridWidget: GridWidget<any> | undefined = this.#widgetGridRegistry.getRegisteredWidgets().find((w) => w.id === pd.widgetName);\n this.selectedWidget = gridWidget?.setupComponent ? gridWidget : undefined;\n this.widgetConfigMap = pd.widgetConfigMap || {};\n this.widgetId = pd.widgetId;\n }\n });\n\n /**\n * Collection of buckets to load available widgets from. Wildcards are also posssible:\n * `[buckets]=\"['app.default', '*.public.*', 'app.no?.widgets']\"`\n *\n * `*` represents any character 0-n times\n * `?` represents exactly one character\n */\n buckets = input<string[] | undefined>(this.#dialogData.buckets);\n\n picked = output();\n canceled = output();\n\n constructor() {\n this.pickerFormControl.valueChanges.pipe(takeUntilDestroyed()).subscribe((widgets: GridWidget<any>[]) => {\n if (widgets.length) this.pick(widgets[0]);\n });\n }\n\n pick(widget: GridWidget<any>) {\n if (widget?.setupComponent) {\n // if the selected widget has a setup component, we'll continue ...\n this.selectedWidget = widget?.setupComponent ? widget : undefined;\n } else {\n if (this.widgetId) {\n // update existing widget\n this.#widgetGridService.replaceWidget(this.widgetId, widget.id);\n } else {\n this.#widgetGridService.addWidget(widget.id);\n }\n this.picked.emit();\n this.#dialogRef.close();\n }\n }\n\n private onSetupConfigChange(setupConfig: any) {\n this.widgetConfigDirty = !!setupConfig;\n this.setupWidgetConfig = setupConfig;\n }\n\n setupComponentSave() {\n // TODO: save/emit config\n if (this.widgetId && this.selectedWidget) {\n if (this.pickerData()?.widgetName !== this.selectedWidget.id) {\n this.#widgetGridService.replaceWidget(this.widgetId, this.selectedWidget.id, this.setupWidgetConfig);\n } else {\n this.#widgetGridService.updateWidget(this.widgetId, this.setupWidgetConfig);\n }\n } else {\n this.#widgetGridService.addWidget(this.selectedWidget!.id, this.setupWidgetConfig);\n }\n this.picked.emit();\n this.#dialogRef.close();\n }\n\n\n setupComponentCancel() {\n this.reset();\n }\n\n cancel() {\n this.canceled.emit();\n this.#dialogRef.close();\n }\n\n reset() {\n this.selectedWidget = undefined;\n this.setupWidgetConfig = undefined;\n }\n\n ngOnInit(): void {\n this.registeredWidgets = this.#widgetGridRegistry.getRegisteredWidgets(this.buckets());\n }\n}\n","<yuv-dialog [headertitel]=\"selectedWidget ? selectedWidget.label : ('yuv.widget-grid.widget-picker.title' | translate)\">\n <!-- <header class=\"dark\" [ngClass]=\"{ listing: !selectedWidget }\">\n @if (selectedWidget) {\n <button mat-icon-button (click)=\"reset()\"><mat-icon>back</mat-icon></button>\n }\n <div class=\"title\">{{ selectedWidget ? selectedWidget.label : ('yuv.widget-grid.widget-picker.title' | translate) }}</div>\n <button mat-icon-button (click)=\"cancel()\"><mat-icon>clear</mat-icon></button>\n </header> -->\n\n <main class=\"{{ !selectedWidget ? 'widget-listing' : 'widget-setup' }}\">\n @if (!selectedWidget) {\n <mat-selection-list role=\"list\" [formControl]=\"pickerFormControl\" [multiple]=\"false\" [hideSingleSelectionIndicator]=\"true\">\n <!-- list of avalable widgets -->\n @for (w of registeredWidgets; track $index) {\n <mat-list-option [value]=\"w\">\n {{ w.label }}\n </mat-list-option>\n } @empty {\n <div class=\"empty\">\n {{ 'yuv.widget-grid.widget-picker.empty' | translate }}\n </div>\n }\n </mat-selection-list>\n } @else {\n <div class=\"component\">\n <ng-container\n *ngComponentOutlet=\"selectedWidget!.setupComponent!; ndcDynamicInputs: widgetConfigMap; ndcDynamicOutputs: setupWidgetDynamicOutputs\"\n ></ng-container>\n </div>\n }\n </main>\n <footer>\n @if (selectedWidget) {\n <button ymtButton=\"secondary\" (click)=\"setupComponentCancel()\">{{ 'yuv.widget-grid.button.cancel' | translate }}</button>\n <button ymtButton=\"primary\" [disabled]=\"!widgetConfigDirty || widgetConfigState === 'INVALID'\" (click)=\"setupComponentSave()\">\n {{ 'yuv.widget-grid.button.save' | translate }}\n </button>\n } @else {\n <button ymtButton=\"secondary\" (click)=\"cancel()\">{{ 'yuv.widget-grid.button.cancel' | translate }}</button>\n }\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, output, signal, TemplateRef, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport {\n DisplayGrid,\n GridsterComponent,\n GridsterConfig,\n GridsterItem,\n GridsterItemComponent,\n GridsterItemComponentInterface,\n GridType\n} from 'angular-gridster2';\nimport { DynamicIoModule } from 'ng-dynamic-component';\nimport { WidgetGridEventService } from './widget-grid-event.service';\nimport { GridItemEvent, WidgetGridConfig, WidgetGridItem, WidgetGridItemConfig, WidgetPickerData } from './widget-grid.interface';\nimport { WidgetGridService } from './widget-grid.service';\nimport { WidgetPickerComponent } from './widget-picker/widget-picker.component';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { SignalComponentIoModule } from 'ng-dynamic-component/signal-component-io';\nimport { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';\n@Component({\n selector: 'yuv-widget-grid',\n imports: [\n CommonModule,\n DynamicIoModule,\n SignalComponentIoModule,\n TranslateModule,\n GridsterComponent,\n MatIconModule,\n MatTooltipModule,\n MatButtonModule,\n WidgetPickerComponent,\n GridsterItemComponent,\n YmtIconButtonDirective,\n MatTooltip\n ],\n providers: [WidgetGridService],\n templateUrl: './widget-grid.component.html',\n styleUrl: './widget-grid.component.scss',\n host: { '[class.widget-grid-edit]': 'editMode()' }\n})\nexport class YuvWidgetGridComponent {\n #dialog = inject(MatDialog);\n #widgetGridService = inject(WidgetGridService);\n #widgetGridEventService = inject(WidgetGridEventService);\n\n gridsterItems = viewChild.required(GridsterItemComponent);\n widgetPicker = viewChild.required('widgetPicker', { read: TemplateRef });\n\n options: GridsterConfig = {\n gridType: GridType.Fit,\n displayGrid: DisplayGrid.None,\n pushItems: false,\n outerMargin: false,\n swap: false,\n draggable: {\n enabled: false,\n ignoreContent: true,\n dragHandleClass: 'dragHandle'\n },\n\n resizable: {\n enabled: false\n },\n itemChangeCallback: (gridsterItem: GridsterItem, gridsterItemComponent: GridsterItemComponentInterface) => {\n this.emitChange();\n }\n };\n\n gridConfig = input<WidgetGridConfig | undefined>();\n #gridConfigEffect = effect(() => {\n const cfg = this.gridConfig();\n if (cfg?.rows) {\n this.options.minRows = cfg.rows;\n this.options.maxRows = cfg.rows;\n }\n if (cfg?.columns) {\n this.options.minCols = cfg.columns;\n this.options.maxCols = cfg.columns;\n }\n if (cfg?.gap) {\n this.options.margin = cfg.gap;\n }\n if (cfg?.newItemWidth || cfg?.newItemHeight) {\n this.#widgetGridService.addItemSize = {\n cols: cfg?.newItemWidth || -1, // default value -1 means the grid will autoposition the new item\n rows: cfg?.newItemHeight || -1 // default value -1 means the grid will autoposition the new item\n };\n }\n });\n\n _editMode = signal<boolean>(false);\n /**\n * Whether or not to enable edit mode. In edit mode controls\n * for editing existing tiles and creating new ones are shown.\n * This mode also enables positioning and resizing of the tiles.\n */\n editMode = input<boolean>(false);\n #editModeEffect = effect(() => {\n const e = this.editMode();\n this._editMode.set(e);\n this.options.draggable!.enabled = !!e;\n this.options.resizable!.enabled = !!e;\n this.options.displayGrid = e ? DisplayGrid.Always : DisplayGrid.None;\n\n // set timeout to ensure that the grid has been redrawn before notifying the widgets about the change\n setTimeout(() => {\n if (this.options.api && this.options.api.optionsChanged) {\n this.options.api.optionsChanged();\n }\n }, 0);\n });\n\n gridItemConfig = input<Array<WidgetGridItemConfig> | undefined>(undefined);\n #gridItemConfigEffect = effect(() => {\n this.#widgetGridService.setWidgetGrid(this.gridItemConfig());\n });\n\n /**\n * Collection of buckets to load available widgets from. Wildcards are also posssible:\n * `[buckets]=\"['app.default', '*.public.*', 'app.no?.widgets']\"`\n *\n * `*` represents any character 0-n times\n * `?` represents exactly one character\n */\n buckets = input<string[] | undefined>(undefined);\n // @Input() buckets?: string[];\n\n /**\n * Emitted when the grid has been changed\n */\n gridChange = output<Array<WidgetGridItemConfig>>();\n gridItemEvent = output<GridItemEvent>();\n /**\n * Emitted when the widget picker is opened or closed in edit mode\n */\n widgetPickerOpen = output<boolean>();\n\n widgetGrid: Array<WidgetGridItem> = [];\n widgetPickerData: WidgetPickerData | undefined;\n\n constructor() {\n this.#widgetGridService.widgetGrid$.pipe(takeUntilDestroyed()).subscribe((widgetGrid: WidgetGridItem[]) => {\n this.widgetGrid = widgetGrid;\n });\n\n this.#widgetGridEventService.widgetEvents$.pipe(takeUntilDestroyed()).subscribe((evt: GridItemEvent) => {\n this.gridItemEvent.emit(evt);\n });\n\n this.#widgetGridService.widgetGridUpdate$.pipe(takeUntilDestroyed()).subscribe((_) => {\n this.emitChange();\n });\n }\n\n openWidgetPicker(item?: WidgetGridItem) {\n if (item) {\n // open setup component for selected grid item\n this.widgetPickerData = {\n widgetName: item.widgetName,\n widgetConfigMap: item.widgetConfigMap,\n widgetId: item.id\n };\n } else {\n this.widgetPickerData = undefined;\n }\n this.widgetPickerOpen.emit(true);\n this.#dialog\n .open(this.widgetPicker(), {\n data: {\n pickerData: this.widgetPickerData,\n buckets: this.buckets()\n }\n })\n .afterClosed()\n .subscribe(() => this.widgetPickerOpen.emit(false));\n }\n\n /**\n * Removes a widget from the grid\n * @param item The widget to be removed\n */\n removeItem(item: WidgetGridItem): void {\n this.#widgetGridService.removeWidget(item.id);\n }\n\n /**\n * Add a new widget to the grid by opening the widget picker\n */\n addItem(): void {\n this.openWidgetPicker();\n }\n\n private emitChange(): void {\n const mapped: WidgetGridItemConfig[] = [];\n this.widgetGrid.forEach((i) => {\n const m: WidgetGridItemConfig = { ...i };\n delete m['widget'];\n delete m['widgetConfigMap'];\n mapped.push(m);\n });\n this.gridChange.emit(mapped);\n }\n}\n","@if (_editMode()) {\n <button class=\"fab\" mat-fab [attr.aria-label]=\"'yuv.widget-grid.widget.add.label' | translate\" (click)=\"addItem()\" [matTooltip]=\"'yuv.widget-grid.widget.add.tooltip' | translate\">\n <mat-icon>add</mat-icon>\n </button>\n}\n\n@if (widgetGrid.length === 0 && !_editMode()) {\n <div class=\"empty\">\n <!-- <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"_editMode.set(true)\">\n {{'yuv.widget-grid.empty.create' | translate}}</button> -->\n <ng-content select=\".empty\"><p>{{ 'yuv.widget-grid.empty' | translate }}</p></ng-content>\n </div>\n} @else {\n <gridster [options]=\"options\">\n @for (item of widgetGrid; track item.id) {\n <gridster-item [item]=\"item\">\n @if (_editMode()) {\n <div class=\"toolbar\">\n <!-- drag handle -->\n <mat-icon class=\"dragHandle ymt-icon--size-s\">drag_indicator</mat-icon>\n <!-- edit -->\n <button ymt-icon-button icon-button-size=\"small\"\n [matTooltip]=\"'yuv.widget-grid.widget.edit.tooltip' | translate\"\n (click)=\"openWidgetPicker(item)\"><mat-icon class=\"ymt-icon--size-s\">edit</mat-icon></button>\n <!-- remove -->\n <button ymt-icon-button icon-button-size=\"small\"\n [matTooltip]=\"'yuv.widget-grid.widget.remove.tooltip' | translate\"\n (click)=\"removeItem(item)\"><mat-icon class=\"ymt-icon--size-s\">clear</mat-icon></button>\n </div>\n }\n <div class=\"cmp\">\n <ng-container *ngComponentOutlet=\"item.widget; ndcDynamicInputs: item.widgetConfigMap\"></ng-container>\n </div>\n </gridster-item>\n }\n </gridster>\n}\n<ng-template #widgetPicker>\n <yuv-widget-picker [pickerData]=\"widgetPickerData\" [buckets]=\"buckets()\"></yuv-widget-picker>\n</ng-template>\n","import { Component, inject, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'yuv-workspace-edit',\n imports: [CommonModule, DialogComponent, MatFormFieldModule, \n MatInputModule,\n YmtButtonDirective,\n TranslateModule,\n ReactiveFormsModule],\n templateUrl: './workspace-edit.component.html',\n styleUrl: './workspace-edit.component.scss'\n})\nexport class WorkspaceEditComponent {\n readonly dialogRef = inject(MatDialogRef<WorkspaceEditComponent>);\n workspaceForm = input.required<FormGroup>();\n\n workspaceSubmit = output();\n}\n","<yuv-dialog [headertitel]=\"'yuv.widget-grid.workspaces.edit.title' | translate\">\n <main>\n <form id=\"workspaceEditForm\" [formGroup]=\"workspaceForm()\" (ngSubmit)=\"workspaceSubmit.emit()\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.widget-grid.workspaces.workspace.label' | translate }}</mat-label>\n <input matInput formControlName=\"label\" />\n </mat-form-field>\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" type=\"button\" (click)=\"dialogRef.close()\">\n {{ 'yuv.widget-grid.workspaces.edit.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" form=\"workspaceEditForm\" type=\"submit\" [disabled]=\"workspaceForm().invalid\">\n {{ 'yuv.widget-grid.workspaces.edit.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input, output, signal, TemplateRef, untracked } from '@angular/core';\nimport { FormBuilder, FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { TranslateModule, TranslateService } from '@yuuvis/client-core';\nimport { ConfirmService } from '@yuuvis/client-framework/common';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { YuvWidgetGridComponent } from '../widget-grid.component';\nimport { GridItemEvent, WidgetGridItemConfig } from '../widget-grid.interface';\nimport { WidgetGridUtils } from '../widget-grid.utils';\nimport { WidgetGridWorkspace, WidgetGridWorkspaceConfig, WidgetGridWorkspaceOptions } from './widget-grid-workspaces.interface';\nimport { WorkspaceEditComponent } from './workspace-edit/workspace-edit.component';\nimport { MatDividerModule } from '@angular/material/divider';\n\n/**\n * Component for managing multiple widget grids in so called workspaces.\n * Each workspace can have its own configuration and widgets. The user can\n * switch between workspaces to use or edit the widgets in the current workspace.\n */\n@Component({\n selector: 'yuv-widget-grid-workspaces',\n imports: [\n CommonModule,\n YuvWidgetGridComponent,\n YmtButtonDirective,\n ReactiveFormsModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatMenuModule,\n MatDividerModule,\n TranslateModule,\n WorkspaceEditComponent\n ],\n templateUrl: './widget-grid-workspaces.component.html',\n styleUrl: './widget-grid-workspaces.component.scss'\n})\nexport class YuvWidgetGridWorkspacesComponent {\n #dialog = inject(MatDialog);\n #fb = inject(FormBuilder);\n #confirm = inject(ConfirmService);\n readonly translate = inject(TranslateService);\n\n workspaceDialogRef?: MatDialogRef<any, any>;\n\n #DEFAULT_WORKSPACE_OPTIONS: WidgetGridWorkspaceOptions = {\n gridConfig: {\n columns: 10,\n rows: 10\n }\n };\n\n workspaceForm = this.#fb.group({\n id: [''],\n label: ['', Validators.required]\n });\n\n get workspaceLabelControl(): FormControl {\n return this.workspaceForm.get('label') as FormControl;\n }\n options = input<WidgetGridWorkspaceOptions>(this.#DEFAULT_WORKSPACE_OPTIONS);\n _workspaceOptions = computed<WidgetGridWorkspaceOptions>(() => ({\n gridConfig: {\n ...this.#DEFAULT_WORKSPACE_OPTIONS.gridConfig,\n ...(this.options().gridConfig || {})\n }\n }));\n\n workspaceConfig = input<WidgetGridWorkspaceConfig | undefined>(undefined);\n _workspaceConfig = signal<WidgetGridWorkspaceConfig | undefined>(undefined);\n #workspaceConfigEffect = effect(() => {\n const wsc = this.workspaceConfig();\n untracked(() => {\n this._workspaceConfig.set(wsc);\n this.#updateOriginalWorkspaceConfig();\n if (wsc?.currentWorkspace) {\n this.setWorkspace(wsc.currentWorkspace, true);\n }\n });\n });\n\n /**\n * Collection of buckets to load available widgets from. Wildcards are also posssible:\n * `[buckets]=\"['app.default', '*.public.*', 'app.no?.widgets']\"`\n *\n * `*` represents any character 0-n times\n * `?` represents exactly one character\n */\n buckets = input<string[] | undefined>(undefined);\n\n configChange = output<WidgetGridWorkspaceConfig | undefined>();\n gridItemEvent = output<GridItemEvent>();\n editModeChange = output<boolean>();\n\n editMode = signal<boolean>(false);\n\n // persist the last 'accepted' workspace config to be able to revert changes\n #originalWidgetGridWorkspaceConfig: string | undefined;\n\n // currently selected workspace\n workspace = signal<WidgetGridWorkspace | undefined>(undefined);\n #workspaceEffect = effect(() => {\n const ws = this.workspace();\n this.workspaceLabel.set(ws ? this.getLabel(ws) : '');\n untracked(() => {\n if(ws) this.workspaceForm.patchValue({ label: this.workspaceLabel(), id: ws.id });\n this.gridItemConfig.set(ws ? JSON.parse(JSON.stringify(ws.grid)) : undefined);\n });\n });\n workspaceLabel = signal<string>('');\n gridItemConfig = signal<Array<WidgetGridItemConfig> | undefined>(undefined);\n\n getLabel(workspace: WidgetGridWorkspace): string {\n return workspace.translateLabel ? this.translate.instant(workspace.label) : workspace.label;\n }\n\n setWorkspace(id: string, silent = false) {\n const workspace = this._workspaceConfig()?.workspaces.find((w) => w.id === id);\n if (workspace) {\n this.workspace.set(workspace);\n this._workspaceConfig.update(\n (cfg) =>\n ({\n ...cfg,\n currentWorkspace: id\n }) as WidgetGridWorkspaceConfig\n );\n this.#updateOriginalWorkspaceConfig();\n } else {\n this.workspace.set(undefined);\n }\n if (!silent) this.emitConfigChange();\n }\n\n openWorkspaceDialog(create: boolean, tplRef: TemplateRef<any>) {\n if (create) {\n this.workspaceForm.reset();\n }\n this.workspaceDialogRef = this.#dialog.open(tplRef);\n }\n\n saveWorkspace() {\n let cfg = this._workspaceConfig();\n if (!cfg) {\n cfg = {\n workspaces: []\n };\n }\n const isNewWorkspace = !this.workspaceForm.value.id;\n\n if (isNewWorkspace) {\n const newWorkspace: WidgetGridWorkspace = {\n id: WidgetGridUtils.uuid(),\n label: this.workspaceForm.value.label as string,\n grid: []\n };\n\n this._workspaceConfig.set({\n ...cfg,\n workspaces: [...cfg.workspaces, newWorkspace],\n currentWorkspace: newWorkspace.id\n });\n this.workspace.set(newWorkspace);\n this.workspaceForm.patchValue({ id: newWorkspace.id, label: newWorkspace.label });\n } else {\n const existingIndex: number = cfg.workspaces.findIndex((w) => w.id === this.workspaceForm.value.id);\n if (existingIndex === -1) {\n const updatedWorkspace = cfg.workspaces[existingIndex];\n updatedWorkspace.label = this.workspaceForm.value.label as string;\n const workspaces: WidgetGridWorkspace[] = cfg.workspaces;\n workspaces[existingIndex] = updatedWorkspace;\n\n this._workspaceConfig.set({\n ...cfg,\n workspaces\n });\n } else {\n // workspace label may have changed\n cfg.workspaces[existingIndex].label = this.workspaceForm.value.label as string;\n }\n }\n\n this.workspaceDialogRef?.close();\n this.emitConfigChange();\n }\n\n #updateOriginalWorkspaceConfig() {\n this.#originalWidgetGridWorkspaceConfig = WidgetGridUtils.gridConfigStringify(this.workspaceConfig());\n }\n\n onGridEvent(e: GridItemEvent) {\n this.gridItemEvent.emit(e);\n }\n\n onGridChange(grid: Array<WidgetGridItemConfig>) {\n const ws = this.workspace();\n if (ws) {\n ws.grid = grid;\n const wsc = this._workspaceConfig();\n const idx: number = wsc ? wsc.workspaces.findIndex((w) => w.id === ws.id) : -1;\n if (idx > -1) {\n const wgw: WidgetGridWorkspace[] = this._workspaceConfig()?.workspaces || [];\n wgw[idx] = ws;\n this._workspaceConfig.update((curr) => ({\n ...curr,\n workspaces: wgw\n }));\n }\n }\n }\n\n // emit current changes and reset original workspace config internally\n persistWorkspaceConfig() {\n this.saveWorkspace();\n // this.#updateOriginalWorkspaceConfig();\n // this.emitConfigChange();\n this.editMode.set(false);\n }\n\n revertWorkspaceConfig() {\n if (this.#originalWidgetGridWorkspaceConfig) {\n this._workspaceConfig.set(WidgetGridUtils.gridConfigParse(this.#originalWidgetGridWorkspaceConfig));\n }\n const cws = this.workspaceConfig()?.currentWorkspace;\n if (cws) this.setWorkspace(cws, true);\n this.editMode.set(false);\n }\n\n deleteCurrentWorkspace() {\n const wsc = this._workspaceConfig();\n const ws = this.workspace();\n if (ws && wsc) {\n const idx: number = wsc.workspaces.findIndex((w) => w.id === ws.id);\n if (idx > -1) {\n this.#confirm\n .confirm({\n message: this.translate.instant('yuv.widget-grid.workspaces.workspace.delete.confirm.message', {\n label: ws.label\n })\n })\n .subscribe((confirmed: boolean) => {\n if (!confirmed) return;\n const workspaces: WidgetGridWorkspace[] = wsc.workspaces;\n workspaces.splice(idx, 1);\n\n // pick another workspace if the current one is deleted\n const newCurrentWorkspace = workspaces.length > 0 ? workspaces[0] : undefined;\n\n this._workspaceConfig.set({\n ...wsc,\n workspaces,\n currentWorkspace: newCurrentWorkspace?.id\n });\n this.workspace.set(newCurrentWorkspace);\n this.emitConfigChange();\n });\n }\n }\n }\n\n emitConfigChange() {\n this.configChange.emit(this._workspaceConfig());\n }\n}\n","@let ws = workspace();\n\n<div class=\"toolbar\">\n @if (ws) {\n @let workspaces = _workspaceConfig()?.workspaces || [];\n\n <button mat-icon-button [disabled]=\"editMode()\" [matMenuTriggerFor]=\"workspacePickerMenu\"><mat-icon>menu</mat-icon></button>\n\n <mat-menu #workspacePickerMenu=\"matMenu\">\n @for (ws of workspaces; track ws.id) {\n <button mat-menu-item (click)=\"setWorkspace(ws.id)\">{{ getLabel(ws) }}</button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"openWorkspaceDialog(true, tplWworkspaceEdit)\">{{ 'yuv.widget-grid.workspaces.workspace.menu.create' | translate }}</button>\n </mat-menu>\n\n @if (!editMode()) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n @if (!ws.preventEdit) {\n <button mat-icon-button [matMenuTriggerFor]=\"workspaceMenu\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #workspaceMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editMode.set(!editMode())\">{{ 'yuv.widget-grid.workspaces.workspace.menu.edit' | translate }}</button>\n <button mat-menu-item (click)=\"deleteCurrentWorkspace()\">{{ 'yuv.widget-grid.workspaces.workspace.menu.delete' | translate }}</button>\n </mat-menu>\n }\n } @else {\n @if (ws.preventRename || ws.translateLabel) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n } @else {\n <input type=\"text\" class=\"label\" [formControl]=\"workspaceLabelControl\" />\n }\n <button ymtButton=\"secondary\" (click)=\"revertWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" (click)=\"persistWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.save' | translate }}\n </button>\n }\n }\n</div>\n\n@if (ws) {\n <yuv-widget-grid\n [gridConfig]=\"_workspaceOptions().gridConfig\"\n [gridItemConfig]=\"gridItemConfig()\"\n [buckets]=\"buckets()\"\n [editMode]=\"editMode()\"\n (gridChange)=\"onGridChange($event)\"\n (gridItemEvent)=\"onGridEvent($event)\"\n >\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"editMode.set(true)\">\n {{ 'yuv.widget-grid.empty.create' | translate }}\n </button>\n </div>\n </yuv-widget-grid>\n} @else {\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.workspaces.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"openWorkspaceDialog(true, tplWworkspaceEdit)\">\n {{ 'yuv.widget-grid.workspaces.empty.button.create' | translate }}\n </button>\n </div>\n}\n\n<ng-template #tplWworkspaceEdit>\n <yuv-workspace-edit [workspaceForm]=\"workspaceForm\" (workspaceSubmit)=\"saveWorkspace()\"></yuv-workspace-edit>\n</ng-template>\n","import { NgModule } from \"@angular/core\";\nimport { YuvWidgetGridComponent } from \"./widget-grid.component\";\nimport { YuvWidgetGridWorkspacesComponent } from \"./widget-grid-workspaces/widget-grid-workspaces.component\";\n\n\nconst cmp = [\n YuvWidgetGridComponent,\n YuvWidgetGridWorkspacesComponent\n]\n\n@NgModule({\n imports: [cmp],\n exports: [cmp]\n })\n export class YuvWidgetGridModule {}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.WidgetGridRegistry","i2","i5","i4","i1","TranslateModule","i3","i6"],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-widget-grid.mjs","sources":["../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-event.service.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widgets/noop/noop.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widgets/noop/noop.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-registry.service.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.utils.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.service.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-picker/widget-picker.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-picker/widget-picker.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/workspace-edit/workspace-edit.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/workspace-edit/workspace-edit.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/widget-grid-workspaces.component.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid-workspaces/widget-grid-workspaces.component.html","../../../../../libs/yuuvis/client-framework/widget-grid/src/lib/widget-grid.module.ts","../../../../../libs/yuuvis/client-framework/widget-grid/src/yuuvis-client-framework-widget-grid.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { GridItemEvent } from './widget-grid.interface';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WidgetGridEventService {\n private widgetGridEventSource = new ReplaySubject<GridItemEvent>();\n\n public widgetEvents$: Observable<GridItemEvent> =\n this.widgetGridEventSource.asObservable();\n \n trigger(evt: GridItemEvent) {\n this.widgetGridEventSource.next(evt);\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { IWidgetComponent } from '../../widget-grid.interface';\n\n@Component({\n selector: 'yuv-noop',\n templateUrl: './noop.component.html',\n styleUrls: ['./noop.component.scss'],\n})\nexport class NoopComponent implements IWidgetComponent<any> {\n @Input() widgetConfig: any;\n}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><circle cx=\"15.5\" cy=\"9.5\" r=\"1.5\"/><circle cx=\"8.5\" cy=\"9.5\" r=\"1.5\"/><path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-6c-2.33 0-4.32 1.45-5.12 3.5h1.67c.69-1.19 1.97-2 3.45-2s2.75.81 3.45 2h1.67c-.8-2.05-2.79-3.5-5.12-3.5z\"/></svg>","import { inject, Injectable, Type } from '@angular/core';\n\nimport { TranslateService } from '@yuuvis/client-core';\nimport { GridWidget } from './widget-grid.interface';\nimport { NoopComponent } from './widgets/noop/noop.component';\n\n/**\n * This service provides the list of widgets that could be added\n * to a widget grid. You could use it to register your own\n * widgets.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class WidgetGridRegistry {\n readonly translate = inject(TranslateService);\n\n /**\n * List of pre-registered widgets provided out-of-the-box\n * by the widget grid module\n */\n private registeredWidgets: Array<GridWidget<unknown>> = [];\n /**\n * Buckets are collection of widget references.\n * You can put any widget registered gloabally into a bucket. Later on you can grab\n * widgets from a certain bucket. This enables apps to structure their widgets when e.g.\n * using multiple widget grids with their own set of available widgets.\n */\n private widgetBuckets: Record<string, string[]> = {};\n\n /**\n * Get the noop component. This component will be rendered in\n * the grid tile if not matching widget could be found in the\n * list of registered widgets. It will show some kind of 'not\n * found' message and provide the controls to remove that none\n * existing component from the widget grid.\n * @returns NoopComponent\n */\n getNoopWidget(): GridWidget<any> {\n return {\n id: 'noop',\n label: this.translate.instant('yuv.widget-grid.widget.noop.label'),\n widgetComponent: NoopComponent\n };\n }\n\n /**\n * Setup components are the administrative part of a widget. They\n * are used to set up a widget. Not all the widgets will have a setup\n * component.\n * @param widgetName The widgets name\n * @returns The setup component of a widget. Throws error if there\n * is not widget registered with the given name\n */\n getWidgetSetupComponent(widgetName: string): Type<any> | undefined {\n const widget = this.registeredWidgets.find((w) => w.id === widgetName);\n if (!widget) throw Error('Widget setup component not found');\n return widget.setupComponent;\n }\n\n /**\n * Get the component for a widget. This is the component that will\n * be rendered in a grid tile.\n * @param widgetName The widgets name\n * @returns The widget component or noop component if there is\n * no component registered with the given name\n */\n getWidgetComponent(widgetName: string): Type<any> {\n const widget = this.registeredWidgets.find((w) => w.id === widgetName);\n if (!widget) console.error('Widget component not found');\n return widget?.widgetComponent || NoopComponent;\n }\n\n /**\n * Adds a new widget to the list of registered widgets. That way\n * you can create custom widgets that are then available to be\n * added to a users widget grid.\n * @param widget The widget to be registered\n * @param bucket List of buckets to register to. If a bucket does\n * not exist it'll be created.\n */\n registerGridWidget(widget: GridWidget<any>, buckets?: string[]) {\n const existingWidget = this.registeredWidgets.find((w) => w.id === widget.id);\n if (!existingWidget) this.registeredWidgets.push(widget);\n\n if (buckets?.length) {\n buckets.forEach((b: string) => {\n this._addToBucket(b, widget.id);\n });\n }\n }\n\n /**\n * Register a collection of widgets\n * @param widgets The widgets to be registered\n * @param bucket List of buckets to register to. If a bucket does\n * not exist it'll be created.\n */\n registerGridWidgets(widgets: GridWidget<any>[], buckets?: string[]) {\n const alreadyRegisteredWidgetNames = this.registeredWidgets.map((w) => w.id);\n const widgetsToRegister = widgets.filter((w) => !alreadyRegisteredWidgetNames.includes(w.id));\n this.registeredWidgets = [...this.registeredWidgets, ...widgetsToRegister.map((w) => this.#translateLabel(w))];\n\n if (buckets?.length) {\n buckets.forEach((b) => widgets.forEach((w) => this._addToBucket(b, w.id)));\n }\n }\n\n #translateLabel(widget: GridWidget<any>): GridWidget<any> {\n const translatedLabel = this.translate.instant(widget.label);\n return { ...widget, label: translatedLabel && !translatedLabel.startsWith('!missing') ? translatedLabel : widget.label };\n }\n\n private _addToBucket(bucket: string, widgetName: string) {\n if (!this.widgetBuckets[bucket]) this.widgetBuckets[bucket] = [];\n this.widgetBuckets[bucket].push(widgetName);\n }\n\n removeRegisteredWidget(id: string) {\n this.registeredWidgets = this.registeredWidgets.filter((w) => w.id !== id);\n }\n\n clearRegisteredWidget() {\n this.registeredWidgets = [];\n }\n\n /**\n * Get registered widgets. This list could be narrowed down by a list\n * of buckets. Buckets are lists of registered widgets registered for\n * a certain key (the buckets name).\n * @param buckets name of buckets to restrict the widgets to\n * @returns Array of grid widgets\n */\n getRegisteredWidgets(buckets?: string[]): Array<GridWidget<any>> {\n if (buckets?.length) {\n // buckets may contain wildcards ...\n // grab all buckets matching the wildcards\n const matchedBuckets: Record<string, number> = {};\n buckets.forEach((b: string) => {\n if (b.match(/[*?]/)) {\n // bucket has a pattern\n Object.keys(this.widgetBuckets).forEach((wb: string) => {\n if (this._wildcardMatch(wb, b)) matchedBuckets[wb] = 0;\n });\n } else matchedBuckets[b] = 0;\n });\n const bucketWidgetNames: Record<string, number> = {};\n Object.keys(matchedBuckets).forEach((b) =>\n this.widgetBuckets[b].forEach((widgetName: string) => {\n bucketWidgetNames[widgetName] = 0;\n })\n );\n const widgetNames: string[] = Object.keys(bucketWidgetNames);\n return this.registeredWidgets.filter((w: GridWidget<any>) => widgetNames.includes(w.id)).map((w) => this.#translateLabel(w));\n } else return this.registeredWidgets.map((w) => this.#translateLabel(w));\n }\n\n private _wildcardMatch(text: string, pattern: string) {\n const regexPattern = new RegExp('^' + pattern.replace(/\\?/g, '.').replace(/\\*/g, '.*') + '$');\n return regexPattern.test(text);\n }\n}\n","export class WidgetGridUtils {\n static PREF_FUNCTION = 'Function';\n static PREF_RANGEVALUE = 'RangeValue';\n\n /**\n * Takes a `WidgetGridItemConfig` and stringifies it. The challenge\n * here is that callback functions should also be stringified.\n * @param gridItemConfig the config object\n */\n static gridConfigStringify(o: any): string {\n return JSON.stringify(o, (key, value) => {\n if (typeof value === 'function') {\n return `/${WidgetGridUtils.PREF_FUNCTION}(${value.toString()})/`;\n }\n return value;\n });\n }\n\n /**\n * Takes a string stringified with `gridConfigStringify()` and parses it\n * to output a proper WidgetGridItemConfig.\n * @param stringifiedConfig stringified widget grid config\n */\n static gridConfigParse(stringifiedConfig: string): any {\n return JSON.parse(stringifiedConfig, function (key, value) {\n if (\n typeof value === 'string' &&\n value.startsWith(`/${WidgetGridUtils.PREF_FUNCTION}(`) &&\n // value.startsWith('/Function(') &&\n value.endsWith(')/')\n ) {\n value = value.substring(WidgetGridUtils.PREF_FUNCTION.length + 2, value.length - 2);\n return (0, eval)('(' + value + ')');\n }\n return value;\n });\n }\n\n public static uuid(): string {\n return WidgetGridUtils._p8() + WidgetGridUtils._p8(true) + WidgetGridUtils._p8(true) + WidgetGridUtils._p8();\n }\n\n private static _p8(s?: boolean): string {\n const p = (Math.random().toString(16) + '000000000').substr(2, 8);\n return s ? `-${p.substr(0, 4)}-${p.substr(4, 4)}` : p;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\n\nimport { WidgetGridRegistry } from './widget-grid-registry.service';\nimport { WidgetGridItem, WidgetGridItemConfig } from './widget-grid.interface';\nimport { WidgetGridUtils } from './widget-grid.utils';\nimport { NoopComponent } from './widgets/noop/noop.component';\n\n/**\n * Service managing a widget grid. Also includes a set of labels that will be\n * used by the grid and its widgets. Default labels are provided out of the\n * box. But if you want to use custom ones or add i18n you could overwrite\n * them. The grid as well as the widgets will use those labels or fall back\n * to their default ones. If you are developing own widgets you should\n * consider using those labels as well.\n */\n@Injectable()\nexport class WidgetGridService {\n private widgetGrid: WidgetGridItem[] = [];\n private widgetGridSource = new ReplaySubject<WidgetGridItem[]>();\n public widgetGrid$: Observable<WidgetGridItem[]> =\n this.widgetGridSource.asObservable();\n\n private widgetGridUpdateSource = new Subject<string>();\n /**\n * Emitted when the widget grid has been updated\n */\n public widgetGridUpdate$: Observable<string> =\n this.widgetGridUpdateSource.asObservable();\n\n public addItemSize: {\n rows: number;\n cols: number;\n } = {\n rows: 2,\n cols: 3,\n };\n\n constructor(private widgetGridRegistry: WidgetGridRegistry) {}\n\n setWidgetGrid(gridItemConfig: Array<WidgetGridItemConfig> | undefined) {\n if (gridItemConfig) {\n // create actual widget grid from widget grid config\n this.widgetGrid = [...gridItemConfig].map((gic) => {\n const cmp = this.widgetGridRegistry.getWidgetComponent(gic.widgetName);\n const gc: WidgetGridItem = {\n ...gic,\n widget: cmp,\n widgetConfigMap: {\n widgetConfig:\n cmp === NoopComponent\n ? {\n widgetName: gic.widgetName,\n }\n : gic.widgetConfig,\n },\n };\n return gc;\n });\n } else {\n this.widgetGrid = [];\n }\n this.widgetGridSource.next(this.widgetGrid);\n }\n\n /**\n * Update config of an existing widget\n * @param widgetId ID of the widget to be updated\n * @param setupWidgetConfig The updated configuration for that widget\n */\n updateWidget(widgetId: string, setupWidgetConfig: any) {\n const gridWidget = this.widgetGrid.find((w) => w.id === widgetId);\n if (gridWidget && setupWidgetConfig) {\n gridWidget.widgetConfig = setupWidgetConfig;\n gridWidget.widgetConfigMap = { widgetConfig: setupWidgetConfig };\n }\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(widgetId);\n }\n\n replaceWidget(widgetId: string, widgetName: string, setupWidgetConfig?: any) {\n const gridWidgetIndex = this.widgetGrid.findIndex((w) => w.id === widgetId);\n if (gridWidgetIndex !== -1) {\n const w: WidgetGridItem = {\n ...this.widgetGrid[gridWidgetIndex],\n ...{\n widgetName,\n widgetConfig: setupWidgetConfig || {},\n widget: this.widgetGridRegistry.getWidgetComponent(widgetName),\n widgetConfigMap: { widgetConfig: setupWidgetConfig || {} },\n },\n };\n this.widgetGrid[gridWidgetIndex] = w;\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(widgetId);\n }\n }\n\n /**\n * Add a new grid item to the widget grid.\n * @param widgetName The name of the grid item to be added\n * @param setupWidgetConfig\n */\n addWidget(\n widgetName: string,\n setupWidgetConfig?: any\n ) {\n const gridWidget: WidgetGridItem = {\n id: WidgetGridUtils.uuid(),\n widgetName,\n widgetConfig: setupWidgetConfig,\n widget: this.widgetGridRegistry.getWidgetComponent(widgetName),\n widgetConfigMap: { widgetConfig: setupWidgetConfig },\n x: 0,\n y: 0,\n rows: this.addItemSize.rows,\n cols: this.addItemSize.cols,\n };\n this.widgetGrid.push(gridWidget);\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(gridWidget.id);\n }\n\n removeWidget(gridItemId: string) {\n const idx = this.widgetGrid.findIndex((w) => w.id === gridItemId);\n this.widgetGrid.splice(idx, 1);\n this.widgetGridSource.next(this.widgetGrid);\n this.widgetGridUpdateSource.next(gridItemId);\n }\n}\n","import { Component, effect, inject, input, OnInit, output } from '@angular/core';\nimport { AttributesMap, OutputsType, DynamicIoModule } from 'ng-dynamic-component';\n\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormControlStatus, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport { SignalComponentIoModule } from 'ng-dynamic-component/signal-component-io';\nimport { WidgetGridRegistry } from '../widget-grid-registry.service';\nimport { GridWidget, WidgetPickerData, WidgetPickerOptions } from '../widget-grid.interface';\nimport { WidgetGridService } from '../widget-grid.service';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { MatListModule } from '@angular/material/list';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'yuv-widget-picker',\n imports: [\n CommonModule,\n MatButtonModule,\n TranslateModule,\n MatIconModule,\n DialogComponent,\n YmtButtonDirective,\n MatListModule,\n DynamicIoModule,\n ReactiveFormsModule,\n SignalComponentIoModule\n ],\n templateUrl: './widget-picker.component.html',\n styleUrls: ['./widget-picker.component.scss']\n})\nexport class WidgetPickerComponent implements OnInit {\n #widgetGridRegistry = inject(WidgetGridRegistry);\n #widgetGridService = inject(WidgetGridService);\n #dialogData = inject<WidgetPickerOptions>(MAT_DIALOG_DATA);\n readonly #dialogRef = inject(MatDialogRef<WidgetPickerComponent>);\n\n pickerFormControl = new FormControl();\n\n widgetId: string | undefined;\n selectedWidget: GridWidget<any> | undefined;\n widgetConfigMap: AttributesMap = {};\n setupWidgetConfig: any;\n widgetConfigDirty = false;\n widgetConfigState?: FormControlStatus;\n registeredWidgets: Array<GridWidget<any>> = [];\n setupWidgetDynamicOutputs: OutputsType = {\n widgetConfigChange: (widgetConfig: any) => {\n this.onSetupConfigChange(widgetConfig);\n },\n widgetConfigStateChange: (s?: any) => {\n this.widgetConfigState = s || undefined;\n }\n };\n\n pickerData = input<WidgetPickerData | undefined>(this.#dialogData.pickerData);\n #pickerDataEffect = effect(() => {\n const pd = this.pickerData();\n if (pd) {\n const gridWidget: GridWidget<any> | undefined = this.#widgetGridRegistry.getRegisteredWidgets().find((w) => w.id === pd.widgetName);\n this.selectedWidget = gridWidget?.setupComponent ? gridWidget : undefined;\n this.widgetConfigMap = pd.widgetConfigMap || {};\n this.widgetId = pd.widgetId;\n }\n });\n\n /**\n * Collection of buckets to load available widgets from. Wildcards are also posssible:\n * `[buckets]=\"['app.default', '*.public.*', 'app.no?.widgets']\"`\n *\n * `*` represents any character 0-n times\n * `?` represents exactly one character\n */\n buckets = input<string[] | undefined>(this.#dialogData.buckets);\n\n picked = output();\n canceled = output();\n\n constructor() {\n this.pickerFormControl.valueChanges.pipe(takeUntilDestroyed()).subscribe((widgets: GridWidget<any>[]) => {\n if (widgets.length) this.pick(widgets[0]);\n });\n }\n\n pick(widget: GridWidget<any>) {\n if (widget?.setupComponent) {\n // if the selected widget has a setup component, we'll continue ...\n this.selectedWidget = widget?.setupComponent ? widget : undefined;\n } else {\n if (this.widgetId) {\n // update existing widget\n this.#widgetGridService.replaceWidget(this.widgetId, widget.id);\n } else {\n this.#widgetGridService.addWidget(widget.id);\n }\n this.picked.emit();\n this.#dialogRef.close();\n }\n }\n\n private onSetupConfigChange(setupConfig: any) {\n this.widgetConfigDirty = !!setupConfig;\n this.setupWidgetConfig = setupConfig;\n }\n\n setupComponentSave() {\n // TODO: save/emit config\n if (this.widgetId && this.selectedWidget) {\n if (this.pickerData()?.widgetName !== this.selectedWidget.id) {\n this.#widgetGridService.replaceWidget(this.widgetId, this.selectedWidget.id, this.setupWidgetConfig);\n } else {\n this.#widgetGridService.updateWidget(this.widgetId, this.setupWidgetConfig);\n }\n } else {\n this.#widgetGridService.addWidget(this.selectedWidget!.id, this.setupWidgetConfig);\n }\n this.picked.emit();\n this.#dialogRef.close();\n }\n\n\n setupComponentCancel() {\n this.reset();\n }\n\n cancel() {\n this.canceled.emit();\n this.#dialogRef.close();\n }\n\n reset() {\n this.selectedWidget = undefined;\n this.setupWidgetConfig = undefined;\n }\n\n ngOnInit(): void {\n this.registeredWidgets = this.#widgetGridRegistry.getRegisteredWidgets(this.buckets());\n }\n}\n","<yuv-dialog [headertitel]=\"selectedWidget ? selectedWidget.label : ('yuv.widget-grid.widget-picker.title' | translate)\">\n <!-- <header class=\"dark\" [ngClass]=\"{ listing: !selectedWidget }\">\n @if (selectedWidget) {\n <button mat-icon-button (click)=\"reset()\"><mat-icon>back</mat-icon></button>\n }\n <div class=\"title\">{{ selectedWidget ? selectedWidget.label : ('yuv.widget-grid.widget-picker.title' | translate) }}</div>\n <button mat-icon-button (click)=\"cancel()\"><mat-icon>clear</mat-icon></button>\n </header> -->\n\n <main class=\"{{ !selectedWidget ? 'widget-listing' : 'widget-setup' }}\">\n @if (!selectedWidget) {\n <mat-selection-list role=\"list\" [formControl]=\"pickerFormControl\" [multiple]=\"false\" [hideSingleSelectionIndicator]=\"true\">\n <!-- list of avalable widgets -->\n @for (w of registeredWidgets; track $index) {\n <mat-list-option [value]=\"w\">\n {{ w.label }}\n </mat-list-option>\n } @empty {\n <div class=\"empty\">\n {{ 'yuv.widget-grid.widget-picker.empty' | translate }}\n </div>\n }\n </mat-selection-list>\n } @else {\n <div class=\"component\">\n <ng-container\n *ngComponentOutlet=\"selectedWidget!.setupComponent!; ndcDynamicInputs: widgetConfigMap; ndcDynamicOutputs: setupWidgetDynamicOutputs\"\n ></ng-container>\n </div>\n }\n </main>\n <footer>\n @if (selectedWidget) {\n <button ymtButton=\"secondary\" (click)=\"setupComponentCancel()\">{{ 'yuv.widget-grid.button.cancel' | translate }}</button>\n <button ymtButton=\"primary\" [disabled]=\"!widgetConfigDirty || widgetConfigState === 'INVALID'\" (click)=\"setupComponentSave()\">\n {{ 'yuv.widget-grid.button.save' | translate }}\n </button>\n } @else {\n <button ymtButton=\"secondary\" (click)=\"cancel()\">{{ 'yuv.widget-grid.button.cancel' | translate }}</button>\n }\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, output, signal, TemplateRef, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport {\n DisplayGrid,\n GridsterComponent,\n GridsterConfig,\n GridsterItem,\n GridsterItemComponent,\n GridsterItemComponentInterface,\n GridType\n} from 'angular-gridster2';\nimport { DynamicIoModule } from 'ng-dynamic-component';\nimport { WidgetGridEventService } from './widget-grid-event.service';\nimport { GridItemEvent, WidgetGridConfig, WidgetGridItem, WidgetGridItemConfig, WidgetPickerData } from './widget-grid.interface';\nimport { WidgetGridService } from './widget-grid.service';\nimport { WidgetPickerComponent } from './widget-picker/widget-picker.component';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { SignalComponentIoModule } from 'ng-dynamic-component/signal-component-io';\nimport { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';\n@Component({\n selector: 'yuv-widget-grid',\n imports: [\n CommonModule,\n DynamicIoModule,\n SignalComponentIoModule,\n TranslateModule,\n GridsterComponent,\n MatIconModule,\n MatTooltipModule,\n MatButtonModule,\n WidgetPickerComponent,\n GridsterItemComponent,\n YmtIconButtonDirective,\n MatTooltip\n ],\n providers: [WidgetGridService],\n templateUrl: './widget-grid.component.html',\n styleUrl: './widget-grid.component.scss',\n host: { '[class.widget-grid-edit]': 'editMode()' }\n})\nexport class YuvWidgetGridComponent {\n #dialog = inject(MatDialog);\n #widgetGridService = inject(WidgetGridService);\n #widgetGridEventService = inject(WidgetGridEventService);\n\n gridsterItems = viewChild.required(GridsterItemComponent);\n widgetPicker = viewChild.required('widgetPicker', { read: TemplateRef });\n\n options: GridsterConfig = {\n gridType: GridType.Fit,\n displayGrid: DisplayGrid.None,\n pushItems: false,\n outerMargin: false,\n swap: false,\n draggable: {\n enabled: false,\n ignoreContent: true,\n dragHandleClass: 'dragHandle'\n },\n\n resizable: {\n enabled: false\n },\n itemChangeCallback: (gridsterItem: GridsterItem, gridsterItemComponent: GridsterItemComponentInterface) => {\n this.emitChange();\n }\n };\n\n gridConfig = input<WidgetGridConfig | undefined>();\n #gridConfigEffect = effect(() => {\n const cfg = this.gridConfig();\n if (cfg?.rows) {\n this.options.minRows = cfg.rows;\n this.options.maxRows = cfg.rows;\n }\n if (cfg?.columns) {\n this.options.minCols = cfg.columns;\n this.options.maxCols = cfg.columns;\n }\n if (cfg?.gap) {\n this.options.margin = cfg.gap;\n }\n if (cfg?.newItemWidth || cfg?.newItemHeight) {\n this.#widgetGridService.addItemSize = {\n cols: cfg?.newItemWidth || -1, // default value -1 means the grid will autoposition the new item\n rows: cfg?.newItemHeight || -1 // default value -1 means the grid will autoposition the new item\n };\n }\n });\n\n _editMode = signal<boolean>(false);\n /**\n * Whether or not to enable edit mode. In edit mode controls\n * for editing existing tiles and creating new ones are shown.\n * This mode also enables positioning and resizing of the tiles.\n */\n editMode = input<boolean>(false);\n #editModeEffect = effect(() => {\n const e = this.editMode();\n this._editMode.set(e);\n this.options.draggable!.enabled = !!e;\n this.options.resizable!.enabled = !!e;\n this.options.displayGrid = e ? DisplayGrid.Always : DisplayGrid.None;\n\n // set timeout to ensure that the grid has been redrawn before notifying the widgets about the change\n setTimeout(() => {\n if (this.options.api && this.options.api.optionsChanged) {\n this.options.api.optionsChanged();\n }\n }, 0);\n });\n\n gridItemConfig = input<Array<WidgetGridItemConfig> | undefined>(undefined);\n #gridItemConfigEffect = effect(() => {\n this.#widgetGridService.setWidgetGrid(this.gridItemConfig());\n });\n\n /**\n * Collection of buckets to load available widgets from. Wildcards are also posssible:\n * `[buckets]=\"['app.default', '*.public.*', 'app.no?.widgets']\"`\n *\n * `*` represents any character 0-n times\n * `?` represents exactly one character\n */\n buckets = input<string[] | undefined>(undefined);\n // @Input() buckets?: string[];\n\n /**\n * Emitted when the grid has been changed\n */\n gridChange = output<Array<WidgetGridItemConfig>>();\n gridItemEvent = output<GridItemEvent>();\n /**\n * Emitted when the widget picker is opened or closed in edit mode\n */\n widgetPickerOpen = output<boolean>();\n\n widgetGrid: Array<WidgetGridItem> = [];\n widgetPickerData: WidgetPickerData | undefined;\n\n constructor() {\n this.#widgetGridService.widgetGrid$.pipe(takeUntilDestroyed()).subscribe((widgetGrid: WidgetGridItem[]) => {\n this.widgetGrid = widgetGrid;\n });\n\n this.#widgetGridEventService.widgetEvents$.pipe(takeUntilDestroyed()).subscribe((evt: GridItemEvent) => {\n this.gridItemEvent.emit(evt);\n });\n\n this.#widgetGridService.widgetGridUpdate$.pipe(takeUntilDestroyed()).subscribe((_) => {\n this.emitChange();\n });\n }\n\n openWidgetPicker(item?: WidgetGridItem) {\n if (item) {\n // open setup component for selected grid item\n this.widgetPickerData = {\n widgetName: item.widgetName,\n widgetConfigMap: item.widgetConfigMap,\n widgetId: item.id\n };\n } else {\n this.widgetPickerData = undefined;\n }\n this.widgetPickerOpen.emit(true);\n this.#dialog\n .open(this.widgetPicker(), {\n data: {\n pickerData: this.widgetPickerData,\n buckets: this.buckets()\n }\n })\n .afterClosed()\n .subscribe(() => this.widgetPickerOpen.emit(false));\n }\n\n /**\n * Removes a widget from the grid\n * @param item The widget to be removed\n */\n removeItem(item: WidgetGridItem): void {\n this.#widgetGridService.removeWidget(item.id);\n }\n\n /**\n * Add a new widget to the grid by opening the widget picker\n */\n addItem(): void {\n this.openWidgetPicker();\n }\n\n private emitChange(): void {\n const mapped: WidgetGridItemConfig[] = [];\n this.widgetGrid.forEach((i) => {\n const m: WidgetGridItemConfig = { ...i };\n delete m['widget'];\n delete m['widgetConfigMap'];\n mapped.push(m);\n });\n this.gridChange.emit(mapped);\n }\n}\n","@if (_editMode()) {\n <button class=\"fab\" mat-fab [attr.aria-label]=\"'yuv.widget-grid.widget.add.label' | translate\" (click)=\"addItem()\" [matTooltip]=\"'yuv.widget-grid.widget.add.tooltip' | translate\">\n <mat-icon>add</mat-icon>\n </button>\n}\n\n@if (widgetGrid.length === 0 && !_editMode()) {\n <div class=\"empty\">\n <!-- <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"_editMode.set(true)\">\n {{'yuv.widget-grid.empty.create' | translate}}</button> -->\n <ng-content select=\".empty\"><p>{{ 'yuv.widget-grid.empty' | translate }}</p></ng-content>\n </div>\n} @else {\n <gridster [options]=\"options\">\n @for (item of widgetGrid; track item.id) {\n <gridster-item [item]=\"item\">\n @if (_editMode()) {\n <div class=\"toolbar\">\n <!-- drag handle -->\n <mat-icon class=\"dragHandle ymt-icon--size-s\">drag_indicator</mat-icon>\n <!-- edit -->\n <button ymt-icon-button icon-button-size=\"small\"\n [matTooltip]=\"'yuv.widget-grid.widget.edit.tooltip' | translate\"\n (click)=\"openWidgetPicker(item)\"><mat-icon class=\"ymt-icon--size-s\">edit</mat-icon></button>\n <!-- remove -->\n <button ymt-icon-button icon-button-size=\"small\"\n [matTooltip]=\"'yuv.widget-grid.widget.remove.tooltip' | translate\"\n (click)=\"removeItem(item)\"><mat-icon class=\"ymt-icon--size-s\">clear</mat-icon></button>\n </div>\n }\n <div class=\"cmp\">\n <ng-container *ngComponentOutlet=\"item.widget; ndcDynamicInputs: item.widgetConfigMap\"></ng-container>\n </div>\n </gridster-item>\n }\n </gridster>\n}\n<ng-template #widgetPicker>\n <yuv-widget-picker [pickerData]=\"widgetPickerData\" [buckets]=\"buckets()\"></yuv-widget-picker>\n</ng-template>\n","import { Component, inject, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'yuv-workspace-edit',\n imports: [CommonModule, DialogComponent, MatFormFieldModule, \n MatInputModule,\n YmtButtonDirective,\n TranslateModule,\n ReactiveFormsModule],\n templateUrl: './workspace-edit.component.html',\n styleUrl: './workspace-edit.component.scss'\n})\nexport class WorkspaceEditComponent {\n readonly dialogRef = inject(MatDialogRef<WorkspaceEditComponent>);\n workspaceForm = input.required<FormGroup>();\n\n workspaceSubmit = output();\n}\n","<yuv-dialog [headertitel]=\"'yuv.widget-grid.workspaces.edit.title' | translate\">\n <main>\n <form id=\"workspaceEditForm\" [formGroup]=\"workspaceForm()\" (ngSubmit)=\"workspaceSubmit.emit()\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.widget-grid.workspaces.workspace.label' | translate }}</mat-label>\n <input matInput formControlName=\"label\" />\n </mat-form-field>\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" type=\"button\" (click)=\"dialogRef.close()\">\n {{ 'yuv.widget-grid.workspaces.edit.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" form=\"workspaceEditForm\" type=\"submit\" [disabled]=\"workspaceForm().invalid\">\n {{ 'yuv.widget-grid.workspaces.edit.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input, output, signal, TemplateRef, untracked } from '@angular/core';\nimport { FormBuilder, FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { TranslateModule, TranslateService } from '@yuuvis/client-core';\nimport { ConfirmService } from '@yuuvis/client-framework/common';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { YuvWidgetGridComponent } from '../widget-grid.component';\nimport { GridItemEvent, WidgetGridItemConfig } from '../widget-grid.interface';\nimport { WidgetGridUtils } from '../widget-grid.utils';\nimport { WidgetGridWorkspace, WidgetGridWorkspaceConfig, WidgetGridWorkspaceOptions } from './widget-grid-workspaces.interface';\nimport { WorkspaceEditComponent } from './workspace-edit/workspace-edit.component';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n/**\n * Component for managing multiple widget grids in so called workspaces.\n * Each workspace can have its own configuration and widgets. The user can\n * switch between workspaces to use or edit the widgets in the current workspace.\n */\n@Component({\n selector: 'yuv-widget-grid-workspaces',\n imports: [\n CommonModule,\n YuvWidgetGridComponent,\n YmtButtonDirective,\n ReactiveFormsModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatMenuModule,\n MatDividerModule,\n MatTooltipModule,\n TranslateModule,\n WorkspaceEditComponent\n ],\n templateUrl: './widget-grid-workspaces.component.html',\n styleUrl: './widget-grid-workspaces.component.scss'\n})\nexport class YuvWidgetGridWorkspacesComponent {\n #dialog = inject(MatDialog);\n #fb = inject(FormBuilder);\n #confirm = inject(ConfirmService);\n readonly translate = inject(TranslateService);\n\n workspaceDialogRef?: MatDialogRef<any, any>;\n\n #DEFAULT_WORKSPACE_OPTIONS: WidgetGridWorkspaceOptions = {\n gridConfig: {\n columns: 10,\n rows: 10\n }\n };\n\n workspaceForm = this.#fb.group({\n id: [''],\n label: ['', Validators.required]\n });\n\n get workspaceLabelControl(): FormControl {\n return this.workspaceForm.get('label') as FormControl;\n }\n options = input<WidgetGridWorkspaceOptions>(this.#DEFAULT_WORKSPACE_OPTIONS);\n _workspaceOptions = computed<WidgetGridWorkspaceOptions>(() => ({\n gridConfig: {\n ...this.#DEFAULT_WORKSPACE_OPTIONS.gridConfig,\n ...(this.options().gridConfig || {})\n }\n }));\n\n workspaceConfig = input<WidgetGridWorkspaceConfig | undefined>(undefined);\n _workspaceConfig = signal<WidgetGridWorkspaceConfig | undefined>(undefined);\n #workspaceConfigEffect = effect(() => {\n const wsc = this.workspaceConfig();\n untracked(() => {\n this._workspaceConfig.set(wsc);\n this.#updateOriginalWorkspaceConfig();\n if (wsc?.currentWorkspace) {\n this.setWorkspace(wsc.currentWorkspace, true);\n }\n });\n });\n\n /**\n * Collection of buckets to load available widgets from. Wildcards are also posssible:\n * `[buckets]=\"['app.default', '*.public.*', 'app.no?.widgets']\"`\n *\n * `*` represents any character 0-n times\n * `?` represents exactly one character\n */\n buckets = input<string[] | undefined>(undefined);\n\n configChange = output<WidgetGridWorkspaceConfig | undefined>();\n gridItemEvent = output<GridItemEvent>();\n editModeChange = output<boolean>();\n\n editMode = signal<boolean>(false);\n\n // persist the last 'accepted' workspace config to be able to revert changes\n #originalWidgetGridWorkspaceConfig: string | undefined;\n\n // currently selected workspace\n workspace = signal<WidgetGridWorkspace | undefined>(undefined);\n #workspaceEffect = effect(() => {\n const ws = this.workspace();\n this.workspaceLabel.set(ws ? this.getLabel(ws) : '');\n untracked(() => {\n if (ws) this.workspaceForm.patchValue({ label: this.workspaceLabel(), id: ws.id });\n this.gridItemConfig.set(ws ? JSON.parse(JSON.stringify(ws.grid)) : undefined);\n });\n });\n workspaceLabel = signal<string>('');\n gridItemConfig = signal<Array<WidgetGridItemConfig> | undefined>(undefined);\n\n getLabel(workspace: WidgetGridWorkspace): string {\n return workspace.translateLabel ? this.translate.instant(workspace.label) : workspace.label;\n }\n\n setWorkspace(id: string, silent = false) {\n const workspace = this._workspaceConfig()?.workspaces.find((w) => w.id === id);\n if (workspace) {\n this.workspace.set(workspace);\n this._workspaceConfig.update(\n (cfg) =>\n ({\n ...cfg,\n currentWorkspace: id\n }) as WidgetGridWorkspaceConfig\n );\n this.#updateOriginalWorkspaceConfig();\n } else {\n this.workspace.set(undefined);\n }\n if (!silent) this.emitConfigChange();\n }\n\n openWorkspaceDialog(create: boolean, tplRef: TemplateRef<any>) {\n if (create) {\n this.workspaceForm.reset();\n }\n this.workspaceDialogRef = this.#dialog.open(tplRef);\n }\n\n saveWorkspace() {\n let cfg = this._workspaceConfig();\n if (!cfg) {\n cfg = {\n workspaces: []\n };\n }\n const isNewWorkspace = !this.workspaceForm.value.id;\n\n if (isNewWorkspace) {\n const newWorkspace: WidgetGridWorkspace = {\n id: WidgetGridUtils.uuid(),\n label: this.workspaceForm.value.label as string,\n grid: []\n };\n\n this._workspaceConfig.set({\n ...cfg,\n workspaces: [...cfg.workspaces, newWorkspace],\n currentWorkspace: newWorkspace.id\n });\n this.workspace.set(newWorkspace);\n this.workspaceForm.patchValue({ id: newWorkspace.id, label: newWorkspace.label });\n } else {\n const existingIndex: number = cfg.workspaces.findIndex((w) => w.id === this.workspaceForm.value.id);\n if (existingIndex === -1) {\n const updatedWorkspace = cfg.workspaces[existingIndex];\n updatedWorkspace.label = this.workspaceForm.value.label as string;\n const workspaces: WidgetGridWorkspace[] = cfg.workspaces;\n workspaces[existingIndex] = updatedWorkspace;\n\n this._workspaceConfig.set({\n ...cfg,\n workspaces\n });\n } else {\n // workspace label may have changed\n cfg.workspaces[existingIndex].label = this.workspaceForm.value.label as string;\n }\n }\n\n this.workspaceDialogRef?.close();\n this.emitConfigChange();\n }\n\n #updateOriginalWorkspaceConfig() {\n this.#originalWidgetGridWorkspaceConfig = WidgetGridUtils.gridConfigStringify(this.workspaceConfig());\n }\n\n onGridEvent(e: GridItemEvent) {\n this.gridItemEvent.emit(e);\n }\n\n onGridChange(grid: Array<WidgetGridItemConfig>) {\n const ws = this.workspace();\n if (ws) {\n ws.grid = grid;\n const wsc = this._workspaceConfig();\n const idx: number = wsc ? wsc.workspaces.findIndex((w) => w.id === ws.id) : -1;\n if (idx > -1) {\n const wgw: WidgetGridWorkspace[] = this._workspaceConfig()?.workspaces || [];\n wgw[idx] = ws;\n this._workspaceConfig.update((curr) => ({\n ...curr,\n workspaces: wgw\n }));\n }\n }\n }\n\n // emit current changes and reset original workspace config internally\n persistWorkspaceConfig() {\n this.saveWorkspace();\n // this.#updateOriginalWorkspaceConfig();\n // this.emitConfigChange();\n this.editMode.set(false);\n }\n\n revertWorkspaceConfig() {\n if (this.#originalWidgetGridWorkspaceConfig) {\n this._workspaceConfig.set(WidgetGridUtils.gridConfigParse(this.#originalWidgetGridWorkspaceConfig));\n }\n const cws = this.workspaceConfig()?.currentWorkspace;\n if (cws) this.setWorkspace(cws, true);\n this.editMode.set(false);\n }\n\n deleteCurrentWorkspace() {\n const wsc = this._workspaceConfig();\n const ws = this.workspace();\n if (ws && wsc) {\n const idx: number = wsc.workspaces.findIndex((w) => w.id === ws.id);\n if (idx > -1) {\n this.#confirm\n .confirm({\n message: this.translate.instant('yuv.widget-grid.workspaces.workspace.delete.confirm.message', {\n label: ws.label\n })\n })\n .subscribe((confirmed: boolean) => {\n if (!confirmed) return;\n const workspaces: WidgetGridWorkspace[] = wsc.workspaces;\n workspaces.splice(idx, 1);\n\n // pick another workspace if the current one is deleted\n const newCurrentWorkspace = workspaces.length > 0 ? workspaces[0] : undefined;\n\n this._workspaceConfig.set({\n ...wsc,\n workspaces,\n currentWorkspace: newCurrentWorkspace?.id\n });\n this.workspace.set(newCurrentWorkspace);\n this.emitConfigChange();\n });\n }\n }\n }\n\n emitConfigChange() {\n this.configChange.emit(this._workspaceConfig());\n }\n}\n","@let ws = workspace();\n\n<div class=\"toolbar\">\n @if (ws) {\n @let workspaces = _workspaceConfig()?.workspaces || [];\n\n <button\n mat-icon-button\n [matTooltip]=\"'yuv.widget-grid.workspaces.workspace.menu.tooltip' | translate\"\n [disabled]=\"editMode()\"\n [matMenuTriggerFor]=\"workspacePickerMenu\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n\n <mat-menu #workspacePickerMenu=\"matMenu\">\n @for (ws of workspaces; track ws.id) {\n <button mat-menu-item (click)=\"setWorkspace(ws.id)\">{{ getLabel(ws) }}</button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"openWorkspaceDialog(true, tplWorkspaceEdit)\">{{ 'yuv.widget-grid.workspaces.workspace.menu.create' | translate }}</button>\n </mat-menu>\n\n @if (!editMode()) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n @if (!ws.preventEdit) {\n <button mat-icon-button [matMenuTriggerFor]=\"workspaceMenu\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #workspaceMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editMode.set(!editMode())\">{{ 'yuv.widget-grid.workspaces.workspace.menu.edit' | translate }}</button>\n <button mat-menu-item (click)=\"deleteCurrentWorkspace()\">{{ 'yuv.widget-grid.workspaces.workspace.menu.delete' | translate }}</button>\n </mat-menu>\n }\n } @else {\n @if (ws.preventRename || ws.translateLabel) {\n <h2 class=\"label\">{{ workspaceLabel() }}</h2>\n } @else {\n <input type=\"text\" class=\"label\" [formControl]=\"workspaceLabelControl\" />\n }\n <button ymtButton=\"secondary\" (click)=\"revertWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" (click)=\"persistWorkspaceConfig()\">\n {{ 'yuv.widget-grid.workspaces.editMode.save' | translate }}\n </button>\n }\n }\n</div>\n\n@if (ws) {\n <yuv-widget-grid\n [gridConfig]=\"_workspaceOptions().gridConfig\"\n [gridItemConfig]=\"gridItemConfig()\"\n [buckets]=\"buckets()\"\n [editMode]=\"editMode()\"\n (gridChange)=\"onGridChange($event)\"\n (gridItemEvent)=\"onGridEvent($event)\"\n >\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"editMode.set(true)\">\n {{ 'yuv.widget-grid.empty.create' | translate }}\n </button>\n </div>\n </yuv-widget-grid>\n} @else {\n <div class=\"empty\">\n <p>{{ 'yuv.widget-grid.workspaces.empty' | translate }}</p>\n <button ymtButton=\"primary\" (click)=\"openWorkspaceDialog(true, tplWorkspaceEdit)\">\n {{ 'yuv.widget-grid.workspaces.empty.button.create' | translate }}\n </button>\n </div>\n}\n\n<ng-template #tplWorkspaceEdit>\n <yuv-workspace-edit [workspaceForm]=\"workspaceForm\" (workspaceSubmit)=\"saveWorkspace()\"></yuv-workspace-edit>\n</ng-template>\n","import { NgModule } from \"@angular/core\";\nimport { YuvWidgetGridComponent } from \"./widget-grid.component\";\nimport { YuvWidgetGridWorkspacesComponent } from \"./widget-grid-workspaces/widget-grid-workspaces.component\";\n\n\nconst cmp = [\n YuvWidgetGridComponent,\n YuvWidgetGridWorkspacesComponent\n]\n\n@NgModule({\n imports: [cmp],\n exports: [cmp]\n })\n export class YuvWidgetGridModule {}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.WidgetGridRegistry","i2","i5","i4","i1","TranslateModule","i3","i6","i7"],"mappings":"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"}
@@ -158,6 +158,8 @@
158
158
  "yuv.object-versions.list.version": "Version {{version}}",
159
159
  "yuv.object-versions.tabs.content.title": "Inhalt",
160
160
  "yuv.object-versions.tabs.indexdata.title": "Metadaten",
161
+ "yuv.popout.popin.tooltip": "",
162
+ "yuv.popout.popout.tooltip": "",
161
163
  "yuv.table.renderer.moreEntries": "Es werden nur die ersten 10 Einträge angezeigt. Insgesamt: {{ count }}",
162
164
  "yuv.sequence-list.form.nextAssignee": "Empfänger",
163
165
  "yuv.sequence-list.form.task": "Aufgabe",
@@ -204,5 +206,6 @@
204
206
  "yuv.widget-grid.workspaces.workspace.label": "Workspace",
205
207
  "yuv.widget-grid.workspaces.workspace.menu.create": "Workspace erstellen",
206
208
  "yuv.widget-grid.workspaces.workspace.menu.delete": "Workspace löschen",
207
- "yuv.widget-grid.workspaces.workspace.menu.edit": "Workspace bearbeiten"
209
+ "yuv.widget-grid.workspaces.workspace.menu.edit": "Workspace bearbeiten",
210
+ "yuv.widget-grid.workspaces.workspace.menu.tooltip": "Workspace verwalten"
208
211
  }
@@ -158,6 +158,8 @@
158
158
  "yuv.object-versions.list.version": "Version {{version}}",
159
159
  "yuv.object-versions.tabs.content.title": "Content",
160
160
  "yuv.object-versions.tabs.indexdata.title": "Metadata",
161
+ "yuv.popout.popin.tooltip": "",
162
+ "yuv.popout.popout.tooltip": "",
161
163
  "yuv.table.renderer.moreEntries": "Only the first ten entries are shown. Total: {{ count }}",
162
164
  "yuv.sequence-list.form.nextAssignee": "Recipient",
163
165
  "yuv.sequence-list.form.task": "Task",
@@ -204,5 +206,6 @@
204
206
  "yuv.widget-grid.workspaces.workspace.label": "Workspace",
205
207
  "yuv.widget-grid.workspaces.workspace.menu.create": "Create workspace",
206
208
  "yuv.widget-grid.workspaces.workspace.menu.delete": "Delete workspace",
207
- "yuv.widget-grid.workspaces.workspace.menu.edit": "Edit workspace"
209
+ "yuv.widget-grid.workspaces.workspace.menu.edit": "Edit workspace",
210
+ "yuv.widget-grid.workspaces.workspace.menu.tooltip": "Select workspace"
208
211
  }
@@ -1,6 +1,13 @@
1
+ import { WritableSignal } from '@angular/core';
1
2
  import { DmsObject } from '@yuuvis/client-core';
2
3
  import { Metadata } from '@yuuvis/media-viewer';
3
4
  import * as i0 from "@angular/core";
5
+ interface ViewerDetails {
6
+ id: string;
7
+ mimeType: string | undefined;
8
+ mediaViewerSrc: string | undefined;
9
+ metadata: Partial<Metadata>;
10
+ }
4
11
  export declare class ObjectPreviewComponent {
5
12
  #private;
6
13
  objectId: import("@angular/core").InputSignal<string | undefined>;
@@ -8,105 +15,10 @@ export declare class ObjectPreviewComponent {
8
15
  version: import("@angular/core").InputSignal<number | undefined>;
9
16
  dmsObject: import("@angular/core").Signal<DmsObject | undefined>;
10
17
  metadata: import("@angular/core").InputSignal<Partial<Metadata>>;
11
- viewerDetails: import("@angular/core").WritableSignal<{
12
- metadata: {
13
- type: "EMAIL";
14
- header: import("@yuuvis/media-viewer").Email;
15
- attachments: string[];
16
- theme: string;
17
- } | {
18
- type: "EMAIL" | "audio";
19
- mode?: "oscilloscope" | "frequency" | "off" | undefined;
20
- header: import("@yuuvis/media-viewer").Email;
21
- attachments: string[];
22
- theme: string;
23
- } | {
24
- type: "EMAIL" | "image";
25
- disableMenu?: boolean | undefined;
26
- header: import("@yuuvis/media-viewer").Email;
27
- attachments: string[];
28
- theme: string;
29
- } | {
30
- type: "EMAIL" | "office";
31
- id?: string | undefined;
32
- dmsObject?: Record<string, unknown> | undefined;
33
- editable?: boolean | undefined;
34
- user?: import("@yuuvis/media-viewer").MetadatUser | undefined;
35
- sendEvent?: boolean | undefined;
36
- version?: number | undefined;
37
- header: import("@yuuvis/media-viewer").Email;
38
- attachments: string[];
39
- theme: string;
40
- } | {
41
- type: "EMAIL" | "pdf";
42
- search?: boolean | undefined;
43
- searchTerm?: string | undefined;
44
- theme: string;
45
- header: import("@yuuvis/media-viewer").Email;
46
- attachments: string[];
47
- } | {
48
- type: Uppercase<string> | undefined;
49
- header?: import("@yuuvis/media-viewer").Email | undefined;
50
- attachments?: string[] | undefined;
51
- theme: string;
52
- name: string;
53
- dmsObject: Record<string, unknown>;
54
- id: string;
55
- editable: boolean;
56
- user: import("@yuuvis/client-core").YuvUser;
57
- version: number | undefined;
58
- sendEvent: boolean;
59
- } | {
60
- type: Uppercase<string> | "audio" | undefined;
61
- mode?: "oscilloscope" | "frequency" | "off" | undefined;
62
- name: string;
63
- dmsObject: Record<string, unknown>;
64
- id: string;
65
- editable: boolean;
66
- user: import("@yuuvis/client-core").YuvUser;
67
- theme: string;
68
- version: number | undefined;
69
- sendEvent: boolean;
70
- } | {
71
- type: Uppercase<string> | "image" | undefined;
72
- disableMenu?: boolean | undefined;
73
- name: string;
74
- dmsObject: Record<string, unknown>;
75
- id: string;
76
- editable: boolean;
77
- user: import("@yuuvis/client-core").YuvUser;
78
- theme: string;
79
- version: number | undefined;
80
- sendEvent: boolean;
81
- } | {
82
- type: Uppercase<string> | "office" | undefined;
83
- id: string;
84
- dmsObject: Record<string, unknown>;
85
- editable: boolean;
86
- user: import("@yuuvis/media-viewer").MetadatUser;
87
- sendEvent: boolean;
88
- version: number;
89
- name: string;
90
- theme: string;
91
- } | {
92
- type: Uppercase<string> | "pdf" | undefined;
93
- search?: boolean | undefined;
94
- searchTerm?: string | undefined;
95
- theme: string;
96
- name: string;
97
- dmsObject: Record<string, unknown>;
98
- id: string;
99
- editable: boolean;
100
- user: import("@yuuvis/client-core").YuvUser;
101
- version: number | undefined;
102
- sendEvent: boolean;
103
- };
104
- mediaViewerSrc: string;
105
- id: string;
106
- mimeType: string | undefined;
107
- } | undefined>;
18
+ viewerDetails: WritableSignal<ViewerDetails | null>;
108
19
  isTiff: import("@angular/core").Signal<boolean>;
109
20
  constructor();
110
21
  static ɵfac: i0.ɵɵFactoryDeclaration<ObjectPreviewComponent, never>;
111
22
  static ɵcmp: i0.ɵɵComponentDeclaration<ObjectPreviewComponent, "yuv-object-preview", never, { "objectId": { "alias": "objectId"; "required": false; "isSignal": true; }; "dmsObjectInput": { "alias": "dmsObject"; "required": false; "isSignal": true; }; "version": { "alias": "version"; "required": false; "isSignal": true; }; "metadata": { "alias": "metadata"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
112
23
  }
24
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuuvis/client-framework",
3
- "version": "2.12.2",
3
+ "version": "2.12.4",
4
4
  "author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,16 +8,16 @@
8
8
  "@angular/common": "^19.2.1",
9
9
  "@angular/core": "^19.2.1",
10
10
  "angular-gridster2": "^19.0.0",
11
- "@yuuvis/client-core": "^2.12.2",
12
- "@yuuvis/client-shell-core": "^2.12.2",
11
+ "@yuuvis/client-core": "^2.12.4",
12
+ "@yuuvis/client-shell-core": "^2.12.4",
13
13
  "ng-dynamic-component": "^10.8.2",
14
14
  "modern-normalize": "^3.0.1"
15
15
  },
16
16
  "dependencies": {
17
17
  "@angular/material": "^19.2.15",
18
18
  "@ngrx/signals": "^19.2.0",
19
- "@yuuvis/material": "2.12.2",
20
- "@yuuvis/media-viewer": "^2.0.13",
19
+ "@yuuvis/material": "2.12.4",
20
+ "@yuuvis/media-viewer": "^2.1.1",
21
21
  "angular-split": "^19.0.0",
22
22
  "vis-network": "^10.0.2",
23
23
  "tslib": "^2.3.0"
@@ -20,7 +20,8 @@ export declare class SequenceListComponent implements ControlValueAccessor, Vali
20
20
  * Maximum number of sequence items (defaults to 100).
21
21
  */
22
22
  maxLength: import("@angular/core").InputSignal<number>;
23
- maxLengthExceeded: boolean;
23
+ maxLengthExceeded: import("@angular/core").WritableSignal<boolean>;
24
+ readonly controlCount: import("@angular/core").WritableSignal<number>;
24
25
  sequenceForm: SequenceForm;
25
26
  entries: SequenceItem[];
26
27
  get formItemArray(): FormArray<SequenceFormItem>;