@yuuvis/client-framework 2.6.3 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/lib/components/busy-overlay/busy-overlay.component.d.ts +0 -1
- package/fesm2022/yuuvis-client-framework-common.mjs +1 -4
- package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-forms.mjs +7 -4
- package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-list.mjs +92 -58
- package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs +2 -2
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-versions.mjs +1 -1
- package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-query-list.mjs +269 -0
- package/fesm2022/yuuvis-client-framework-query-list.mjs.map +1 -0
- package/fesm2022/yuuvis-client-framework-tile-list.mjs +83 -202
- package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tree.mjs +8 -5
- package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework.mjs +716 -160
- package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
- package/lib/config/halo-focus-defaults/halo-excluded-elements.const.d.ts +26 -0
- package/lib/config/halo-focus-defaults/halo-focus-navigation-keys.const.d.ts +25 -0
- package/lib/config/halo-focus-defaults/halo-focus-offset.const.d.ts +25 -0
- package/lib/config/halo-focus-defaults/halo-focus-styles.const.d.ts +26 -0
- package/lib/config/halo-focus-defaults/index.d.ts +4 -0
- package/lib/config/index.d.ts +1 -0
- package/lib/models/halo-focus-config/halo-focus-config.model.d.ts +48 -0
- package/lib/models/halo-focus-config/index.d.ts +1 -0
- package/lib/models/index.d.ts +1 -0
- package/lib/providers/halo-focus/index.d.ts +1 -0
- package/lib/providers/halo-focus/provide-halo-focus.d.ts +58 -6
- package/lib/providers/index.d.ts +1 -1
- package/lib/services/halo-focus/halo-focus.service.d.ts +80 -17
- package/lib/services/halo-utility/halo-utility.service.d.ts +230 -0
- package/lib/services/index.d.ts +1 -0
- package/list/lib/list.component.d.ts +35 -6
- package/package.json +19 -15
- package/query-list/README.md +3 -0
- package/query-list/index.d.ts +2 -0
- package/query-list/lib/query-list.component.d.ts +139 -0
- package/query-list/lib/query-list.module.d.ts +7 -0
- package/tile-list/lib/tile-list/tile-list.component.d.ts +52 -34
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yuuvis-client-framework-query-list.mjs","sources":["../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.ts","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.html","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.module.ts","../../../../../libs/yuuvis/client-framework/query-list/src/yuuvis-client-framework-query-list.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, computed, contentChild, effect, HostBinding, inject, input, output, signal, TemplateRef, untracked, viewChild } from '@angular/core';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { SearchQuery, SearchResult, SearchResultItem, SearchService } from '@yuuvis/client-core';\nimport { ClickDoubleDirective, DragSelectDirective, DragSelectItemDirective } from '@yuuvis/client-framework/common';\nimport { ListComponent, YuvListModule } from '@yuuvis/client-framework/list';\nimport { Pagination } from '@yuuvis/client-framework/pagination';\nimport { DeviceService } from '@yuuvis/material';\n\n/**\n * Component to display a list of items based on a search query. \n * It will execute the query and render the results using the provided item template.\n * \n * The component supports pagination, multi-selection, and drag selection.\n * \n * If you don't provide a transformer function, the raw SearchResultItem objects will be \n * used as items and passed to the template. The transformer function allows you to map\n * the SearchResultItem objects to a custom format before rendering. \n *\n * Example usage:\n * ```html\n * <yuv-query-list [transformer]=\"transformResult\" [query]=\"query\" (itemSelect)=\"onItemSelect($event)\">\n \n <!-- template used to render result item -->\n <ng-template #yuvQueryListItem let-item>\n <yuv-list-tile>\n <ng-template #titleSlot>{{ item.id }}</ng-template>\n <ng-template #descriptionSlot>{{ item.modified }}</ng-template>\n </yuv-list-tile>\n </ng-template>\n\n <!-- Content to display when the list is empty -->\n <ng-template #yuvQueryListEmpty>\n <div>No documents found.</div>\n </ng-template>\n\n </yuv-query-list>\n * ```\n *\n * ```ts\n * @Component({...})\n * export class TestQueryListComponent {\n * query = 'SELECT * FROM system:document';\n * \n * transformResult = (items: SearchResultItem[]) =>\n * items.map((item) => ({\n * id: item.fields.get(BaseObjectTypeField.OBJECT_ID),\n * modified: item.fields.get(BaseObjectTypeField.MODIFICATION_DATE)\n * }));\n * } * \n * ```\n */\n@Component({\n selector: 'yuv-query-list',\n imports: [CommonModule, YuvListModule, ClickDoubleDirective, DragSelectDirective, DragSelectItemDirective, MatPaginatorModule],\n templateUrl: './query-list.component.html',\n styleUrl: './query-list.component.scss'\n})\nexport class QueryListComponent {\n #device = inject(DeviceService);\n #searchService = inject(SearchService);\n list = viewChild.required<ListComponent>('list');\n itemTemplate = contentChild<TemplateRef<any>>('yuvQueryListItem');\n emptyTemplate = contentChild<TemplateRef<any>>('yuvQueryListEmpty');\n\n isTouchDevice = this.#device.isTouchEnabled;\n /**\n * The query to execute (SearchQuery object or CMIS query string).\n */\n query = input<SearchQuery | string | null>();\n\n /**\n * Optional transformer function to map SearchResultItem to a custom format.\n */\n transformer = input<((items: SearchResultItem[]) => unknown[]) | null>();\n /**\n * Function that returns `true` if selection changes should be prevented.\n * This can be used to temporarily block selection changes, e.g. while\n * there is a pending change inside another component that refers to the\n * current selection.\n */\n preventChangeUntil = input<() => boolean>(() => false);\n /**\n * Event emitted when items are selected. Emits an array of selected item indices.\n *\n */\n itemSelect = output<number[]>();\n /**\n * Event emitted during drag selection, providing the current selection of item indices.\n */\n dragSelectChange = output<number[]>();\n /**\n * Event emitted when an item is double-clicked, providing the index of the item.\n */\n itemDoubleClick = output<number>();\n /**\n * Event emitted when the query result is available, providing total count of items.\n */\n queryResult = output<{ totalCount: number }>();\n\n #items = signal<SearchResultItem[]>([]);\n /**\n * The list of result items after applying the optional transformer.\n */\n resultItems = computed(() => {\n const items = this.#items();\n const transformer = this.transformer();\n return transformer ? transformer(items) : items;\n });\n\n /**\n * Number of items to fetch per page when executing the query.\n * @default SearchService.DEFAULT_QUERY_SIZE\n */\n pageSize = input<number>(SearchService.DEFAULT_QUERY_SIZE);\n\n /**\n * Enables or disables drag selection of items. If `true`, users can select multiple items by dragging the mouse.\n * @default true\n */\n enableDragSelect = input<boolean>(true);\n\n /**\n * Sets up the ability to select multiple tiles\n * @default false\n */\n multiselect = input<boolean>(false);\n /**\n * If `true`, the component will handle selection itself. This means that\n * the parent component will be responsible for styling the selected and\n * focused items. If `false`, the component will take care of visualizing\n * the selection and focus states.\n * @default false\n */\n selfHandleSelection = input<boolean>(false);\n\n /**\n * Indicator signal whether a query is currently being executed.\n * You could use this to show a loading indicator in the UI.\n */\n busy = signal<boolean>(false);\n\n // state of pagination\n @HostBinding('class.pagination') pagination?: Pagination;\n\n #executeQueryEffect = effect(() => {\n // execute the query each time it changes\n const query = this.query();\n if (query)\n untracked(() => {\n this.#executeQuery(query || null);\n });\n });\n\n onItemClick(idx: number, event: MouseEvent) {\n this.list().select(idx, event.shiftKey, event.ctrlKey);\n this.list().focus();\n }\n\n onItemDoubleClick(idx: number, event: MouseEvent) {\n this.itemDoubleClick.emit(idx);\n }\n\n onDragSelectChange(sel: number[]) {\n this.list().multiSelect(sel);\n this.dragSelectChange.emit(sel);\n }\n\n onDragSelect(sel: number[]) {\n this.list().focus();\n this.itemSelect.emit(sel);\n }\n\n /**\n * Selects multiple items in the list.\n */\n multiSelect(index: number[]): void {\n this.list().multiSelect(index);\n }\n\n /**\n * Refreshes the list by re-executing the current query/page.\n */\n refresh() {\n const query = this.query();\n if (query) {\n if (this.pagination) {\n this.goToPage(this.pagination.page);\n } else this.#executeQuery(query || null);\n }\n }\n\n changePage(pe: PageEvent) {\n this.goToPage(pe.pageIndex + 1);\n }\n\n goToPage(page: number) {\n const query = this.query();\n if (!query) return;\n this.busy.set(true);\n this.#searchService\n .getPage(query, page, this.pageSize())\n\n .subscribe({\n next: (res: SearchResult) => {\n this.#setupPagination(res);\n this.#items.set(res.items);\n this.busy.set(false);\n },\n error: (err) => {\n // TODO: how should errors be handles in case hat loading pages fail\n this.busy.set(false);\n console.error(err);\n }\n });\n }\n\n /**\n * Executes a search query.\n * @param query The search query to execute. This may be a SearchQuery object or a string. If it's a string, it is supposed to\n * be a CMIS query statement.\n */\n #executeQuery(query: SearchQuery | string | null) {\n if (query && !this.busy()) {\n // reset items to avoid old data being shown while new stuff is loaded\n this.#items.set([]);\n this.busy.set(true);\n\n (typeof query === 'string'\n ? this.#searchService.searchCmis(query as string, this.pageSize())\n : this.#searchService.search(query as SearchQuery)\n ).subscribe({\n next: (res: SearchResult) => {\n this.#setupPagination(res);\n this.#items.set(res.items);\n this.queryResult.emit({ totalCount: res.totalNumItems });\n this.busy.set(false);\n },\n error: (err) => {\n this.busy.set(false);\n console.error(err);\n }\n });\n }\n }\n\n #setupPagination(searchResult: SearchResult) {\n this.pagination = undefined;\n this.pagination = searchResult.paging\n ? {\n total: searchResult.totalNumItems,\n pages: searchResult.paging.totalPages,\n page: searchResult.paging.page\n }\n : undefined;\n }\n}\n","<yuv-list\n #list\n [multiselect]=\"multiselect()\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [selfHandleClick]=\"true\"\n [selfHandleSelection]=\"selfHandleSelection()\"\n [yuvDragSelect]=\"{ disabled: !enableDragSelect() || !multiselect() || isTouchDevice }\"\n (dragSelectChange)=\"onDragSelectChange($event)\"\n (dragSelect)=\"onDragSelect($event)\"\n (itemSelect)=\"itemSelect.emit($event)\"\n>\n @for (i of resultItems(); track $index) {\n <div yuvListItem yuvDragSelectItem \n (click.single)=\"onItemClick($index, $event)\"\n (click.double)=\"onItemDoubleClick($index, $event)\" >\n <ng-container *ngTemplateOutlet=\"itemTemplate() || null; context: { $implicit: i, index: $index }\"></ng-container>\n </div>\n } @empty {\n <ng-container *ngTemplateOutlet=\"emptyTemplate() || null\"></ng-container>\n }\n</yuv-list>\n@if (pagination) {\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageSize]=\"pageSize()\" (page)=\"changePage($event)\" hidePageSize> </mat-paginator>\n}\n","import { NgModule } from '@angular/core';\nimport { QueryListComponent } from './query-list.component';\n\nconst cmp = [QueryListComponent];\n@NgModule({\n imports: cmp,\n exports: cmp\n})\nexport class YuvQueryListModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CG;MAOU,kBAAkB,CAAA;AAN/B,IAAA,WAAA,GAAA;AAOE,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;AAC/B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;AACtC,QAAA,IAAA,CAAA,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAgB,MAAM,CAAC;AAChD,QAAA,IAAA,CAAA,YAAY,GAAG,YAAY,CAAmB,kBAAkB,CAAC;AACjE,QAAA,IAAA,CAAA,aAAa,GAAG,YAAY,CAAmB,mBAAmB,CAAC;AAEnE,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc;AAC3C;;AAEG;QACH,IAAK,CAAA,KAAA,GAAG,KAAK,EAA+B;AAE5C;;AAEG;QACH,IAAW,CAAA,WAAA,GAAG,KAAK,EAAqD;AACxE;;;;;AAKG;QACH,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAgB,MAAM,KAAK,CAAC;AACtD;;;AAGG;QACH,IAAU,CAAA,UAAA,GAAG,MAAM,EAAY;AAC/B;;AAEG;QACH,IAAgB,CAAA,gBAAA,GAAG,MAAM,EAAY;AACrC;;AAEG;QACH,IAAe,CAAA,eAAA,GAAG,MAAM,EAAU;AAClC;;AAEG;QACH,IAAW,CAAA,WAAA,GAAG,MAAM,EAA0B;AAE9C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAqB,EAAE,CAAC;AACvC;;AAEG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,OAAO,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,KAAK;AACjD,SAAC,CAAC;AAEF;;;AAGG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,aAAa,CAAC,kBAAkB,CAAC;AAE1D;;;AAGG;AACH,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAU,IAAI,CAAC;AAEvC;;;AAGG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAU,KAAK,CAAC;AACnC;;;;;;AAMG;AACH,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAU,KAAK,CAAC;AAE3C;;;AAGG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAU,KAAK,CAAC;AAK7B,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,MAAK;;AAEhC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,KAAK;gBACP,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,CAAC;AACnC,iBAAC,CAAC;AACN,SAAC,CAAC;AAwGH;AArMC,IAAA,OAAO;AACP,IAAA,cAAc;AAwCd,IAAA,MAAM;AA6CN,IAAA,mBAAmB;IASnB,WAAW,CAAC,GAAW,EAAE,KAAiB,EAAA;AACxC,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;AACtD,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;;IAGrB,iBAAiB,CAAC,GAAW,EAAE,KAAiB,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;;AAGhC,IAAA,kBAAkB,CAAC,GAAa,EAAA;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;;AAGjC,IAAA,YAAY,CAAC,GAAa,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;;AAG3B;;AAEG;AACH,IAAA,WAAW,CAAC,KAAe,EAAA;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC;;AAGhC;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;;AAC9B,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,CAAC;;;AAI5C,IAAA,UAAU,CAAC,EAAa,EAAA;QACtB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;;AAGjC,IAAA,QAAQ,CAAC,IAAY,EAAA;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC;aACF,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;AAEpC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAiB,KAAI;AAC1B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;aACrB;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;;AAEb,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,gBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;;AAErB,SAAA,CAAC;;AAGN;;;;AAIG;AACH,IAAA,aAAa,CAAC,KAAkC,EAAA;QAC9C,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;;AAEzB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAEnB,CAAC,OAAO,KAAK,KAAK;AAChB,kBAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAe,EAAE,IAAI,CAAC,QAAQ,EAAE;AACjE,kBAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAoB,CAAC,EAClD,SAAS,CAAC;AACV,gBAAA,IAAI,EAAE,CAAC,GAAiB,KAAI;AAC1B,oBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;oBAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;AACxD,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;iBACrB;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;;AAErB,aAAA,CAAC;;;AAIN,IAAA,gBAAgB,CAAC,YAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC;AAC7B,cAAE;gBACE,KAAK,EAAE,YAAY,CAAC,aAAa;AACjC,gBAAA,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU;AACrC,gBAAA,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;AAC3B;cACD,SAAS;;+GApMJ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EC1D/B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,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,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,qhCAwBA,ED8BY,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,oBAAoB,EAAE,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,mBAAmB,EAAE,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,uBAAuB,+DAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIlH,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EACjB,OAAA,EAAA,CAAC,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,kBAAkB,CAAC,EAAA,QAAA,EAAA,qhCAAA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA;8BAyF7F,UAAU,EAAA,CAAA;sBAA1C,WAAW;uBAAC,kBAAkB;;;AE5IjC,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC;MAKnB,kBAAkB,CAAA;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAlB,kBAAkB,EAAA,OAAA,EAAA,CALlB,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAAlB,kBAAkB,CAAA,EAAA,CAAA,CAAA;AAKlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAHpB,GAAG,CAAA,EAAA,CAAA,CAAA;;4FAGD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,GAAG;AACZ,oBAAA,OAAO,EAAE;AACV,iBAAA;;;ACPD;;AAEG;;;;"}
|
|
@@ -1,32 +1,33 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, output, viewChild, ChangeDetectionStrategy, Component, Injectable, inject, ViewContainerRef, effect, Directive, DestroyRef, ElementRef, contentChild, computed,
|
|
2
|
+
import { input, output, viewChild, ChangeDetectionStrategy, Component, Injectable, inject, ViewContainerRef, effect, Directive, DestroyRef, ElementRef, contentChild, computed, untracked, signal, HostListener } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@yuuvis/client-core';
|
|
4
|
-
import { ObjectConfigService,
|
|
5
|
-
import { ClickDoubleDirective, DragSelectDirective, DragSelectItemDirective, DialogComponent } from '@yuuvis/client-framework/common';
|
|
4
|
+
import { ObjectConfigService, DmsService, DmsObject, SearchService, BaseObjectTypeField, TranslateModule, SystemService, ContentStreamField, Utils, Sort } from '@yuuvis/client-core';
|
|
6
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
7
6
|
import * as i1$3 from '@angular/forms';
|
|
8
7
|
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
9
|
-
import * as
|
|
8
|
+
import * as i3 from '@angular/material/icon';
|
|
10
9
|
import { MatIcon, MatIconModule } from '@angular/material/icon';
|
|
11
10
|
import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
|
|
12
|
-
import * as i3 from '@angular/material/paginator';
|
|
13
11
|
import { MatPaginatorModule } from '@angular/material/paginator';
|
|
14
12
|
import * as i2$1 from '@angular/material/tooltip';
|
|
15
13
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
16
14
|
import { ActionsService } from '@yuuvis/client-framework/actions';
|
|
17
|
-
import { YUV_ICONS, ObjectTypeIconComponent } from '@yuuvis/client-framework/icons';
|
|
18
15
|
import * as i1 from '@yuuvis/client-framework/list';
|
|
19
|
-
import {
|
|
16
|
+
import { YuvListModule } from '@yuuvis/client-framework/list';
|
|
17
|
+
import * as i2 from '@yuuvis/client-framework/query-list';
|
|
18
|
+
import { YuvQueryListModule } from '@yuuvis/client-framework/query-list';
|
|
20
19
|
import { RendererDirective } from '@yuuvis/client-framework/renderer';
|
|
21
|
-
import {
|
|
22
|
-
import { switchMap
|
|
20
|
+
import { YmtMatIconRegistryService, YmtIconButtonDirective, YmtButtonDirective } from '@yuuvis/material';
|
|
21
|
+
import { switchMap } from 'rxjs';
|
|
23
22
|
import * as i1$2 from '@angular/material/button';
|
|
24
23
|
import { MatButtonModule } from '@angular/material/button';
|
|
25
24
|
import { MatDialogModule, MatDialog } from '@angular/material/dialog';
|
|
26
25
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
27
26
|
import * as i3$1 from '@angular/material/select';
|
|
28
27
|
import { MatSelectModule } from '@angular/material/select';
|
|
28
|
+
import { DialogComponent } from '@yuuvis/client-framework/common';
|
|
29
29
|
import { NgClass, CommonModule } from '@angular/common';
|
|
30
|
+
import { ObjectTypeIconComponent } from '@yuuvis/client-framework/icons';
|
|
30
31
|
import { TranslateModule as TranslateModule$1 } from '@ngx-translate/core';
|
|
31
32
|
|
|
32
33
|
class TileActionsMenuComponent {
|
|
@@ -141,51 +142,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
141
142
|
* List that renders the result of a search query as object config based tiles. It also contains a component to
|
|
142
143
|
* set up that configuration.
|
|
143
144
|
*
|
|
144
|
-
* ## Paging
|
|
145
|
-
* If the search result contains more items than the page size, the list will show a
|
|
146
|
-
* pagination control to navigate inbetween the pages.
|
|
147
|
-
*
|
|
148
|
-
* ## Staggered animation
|
|
149
|
-
* Adding a class of `staggered` to the `yuv-tile-list` component will animate
|
|
150
|
-
* the tiles in a staggered way (only if the user has not set up the OS to not
|
|
151
|
-
* play animation).
|
|
152
145
|
*/
|
|
153
146
|
const MATERIAL_IMPORTS = [MatIconModule, MatPaginatorModule, MatTooltipModule, MatMenuTrigger];
|
|
154
147
|
class TileListComponent {
|
|
155
|
-
#objectConfigService;
|
|
156
|
-
#system;
|
|
157
|
-
#searchService;
|
|
158
|
-
#destroyRef;
|
|
159
|
-
#device;
|
|
160
|
-
#elRef;
|
|
161
|
-
#events;
|
|
162
|
-
#actionService;
|
|
163
|
-
#dmsService;
|
|
164
|
-
#contextFlag;
|
|
165
|
-
onCopy(event) {
|
|
166
|
-
event.preventDefault();
|
|
167
|
-
if (this._selection.length)
|
|
168
|
-
this.tileCopy.emit(this._selectionToTileData(this._selection));
|
|
169
|
-
}
|
|
170
|
-
onCut(event) {
|
|
171
|
-
event.preventDefault();
|
|
172
|
-
if (this._selection.length)
|
|
173
|
-
this.tileCut.emit(this._selectionToTileData(this._selection));
|
|
174
|
-
}
|
|
175
|
-
#currBusy;
|
|
176
|
-
#_busyEffect;
|
|
177
|
-
#preselect;
|
|
178
|
-
#preselectEffect;
|
|
179
|
-
#query;
|
|
180
|
-
#executeQueryEffect;
|
|
181
148
|
constructor() {
|
|
182
149
|
this.#objectConfigService = inject(ObjectConfigService);
|
|
183
|
-
this.#system = inject(SystemService);
|
|
184
|
-
this.#searchService = inject(SearchService);
|
|
185
150
|
this.#destroyRef = inject(DestroyRef);
|
|
186
|
-
this.#device = inject(DeviceService);
|
|
187
151
|
this.#elRef = inject(ElementRef);
|
|
188
|
-
this.#events = inject(EventService);
|
|
189
152
|
this.#actionService = inject(ActionsService);
|
|
190
153
|
this.#dmsService = inject(DmsService);
|
|
191
154
|
this.menuComponent = contentChild(TileActionsMenuComponent);
|
|
@@ -194,27 +157,31 @@ class TileListComponent {
|
|
|
194
157
|
return comp?.matMenu() ?? null;
|
|
195
158
|
});
|
|
196
159
|
this.emptyContent = contentChild('empty');
|
|
197
|
-
|
|
198
|
-
this.tiles = viewChildren(ListTileComponent);
|
|
160
|
+
// tiles = viewChildren(ListTileComponent);
|
|
199
161
|
this.list = viewChild.required('list');
|
|
200
|
-
this
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
162
|
+
this.transformer = (res) => {
|
|
163
|
+
this.#rawResultItems = res;
|
|
164
|
+
const mappedItems = this.#mapToTileData(res.map((i) => new DmsObject(i)));
|
|
165
|
+
const items = mappedItems.map((item) => ({
|
|
166
|
+
...item,
|
|
167
|
+
actions: (item.actions || [])
|
|
168
|
+
.map((a) => this.#actionService.getActionById(a.id, this.options()?.actionContext))
|
|
169
|
+
.filter((a) => a !== undefined)
|
|
170
|
+
}));
|
|
171
|
+
untracked(() => this.items.set(items));
|
|
172
|
+
return items;
|
|
173
|
+
};
|
|
174
|
+
this._busy = computed(() => this.list().busy());
|
|
175
|
+
this.#busyEffect = effect(() => {
|
|
205
176
|
const preselect = this.#preselect();
|
|
206
|
-
|
|
177
|
+
const busy = this._busy();
|
|
178
|
+
if (!busy && preselect.length) {
|
|
207
179
|
this.selectById(preselect);
|
|
208
180
|
this.#preselect.set([]);
|
|
209
181
|
}
|
|
210
|
-
if (b !== this.#currBusy) {
|
|
211
|
-
this.#currBusy = b;
|
|
212
|
-
this.busy.emit(b);
|
|
213
|
-
}
|
|
214
182
|
});
|
|
215
183
|
this._selection = [];
|
|
216
184
|
this.selectedTile = signal([]);
|
|
217
|
-
this.empytIcon = signal(YUV_ICONS.trash);
|
|
218
185
|
/**
|
|
219
186
|
* The ID of the selected list item
|
|
220
187
|
*/
|
|
@@ -226,15 +193,29 @@ class TileListComponent {
|
|
|
226
193
|
* retrieved. Buckets should be unique so be sure to use a unique namespace.
|
|
227
194
|
*/
|
|
228
195
|
this.bucket = input();
|
|
196
|
+
/**
|
|
197
|
+
* The number of items to display per page.
|
|
198
|
+
*/
|
|
229
199
|
this.pageSize = input(SearchService.DEFAULT_QUERY_SIZE);
|
|
230
200
|
/**
|
|
231
|
-
* Sets up the ability to select
|
|
201
|
+
* Sets up the ability to select multiple tiles
|
|
202
|
+
* @default false
|
|
232
203
|
*/
|
|
233
204
|
this.multiselect = input(false);
|
|
205
|
+
/**
|
|
206
|
+
* If `true`, the tiles will be rendered in a more compact, denser style.
|
|
207
|
+
* @default false
|
|
208
|
+
*/
|
|
234
209
|
this.dense = input(false);
|
|
210
|
+
/**
|
|
211
|
+
* Configuration options for the tile list component.
|
|
212
|
+
*/
|
|
235
213
|
this.options = input(undefined);
|
|
214
|
+
/**
|
|
215
|
+
* The object flavor to be applied to the tiles.
|
|
216
|
+
*/
|
|
236
217
|
this.flavor = input();
|
|
237
|
-
this
|
|
218
|
+
this.#flavorEffect = effect(() => {
|
|
238
219
|
const f = this.flavor();
|
|
239
220
|
if (f)
|
|
240
221
|
this.applyFlavor(f);
|
|
@@ -258,6 +239,9 @@ class TileListComponent {
|
|
|
258
239
|
});
|
|
259
240
|
return x;
|
|
260
241
|
});
|
|
242
|
+
/**
|
|
243
|
+
* Prevent selection changes while the provided function returns false.
|
|
244
|
+
*/
|
|
261
245
|
this.preventChangeUntil = input(() => true);
|
|
262
246
|
this.disableCustomContextMenu = input(false);
|
|
263
247
|
/**
|
|
@@ -275,43 +259,34 @@ class TileListComponent {
|
|
|
275
259
|
*/
|
|
276
260
|
this.selectionChange = output();
|
|
277
261
|
/**
|
|
278
|
-
* Emitted when a list item has been
|
|
262
|
+
* Emitted when a list item has been double-clicked
|
|
279
263
|
*/
|
|
280
264
|
this.itemDblClick = output();
|
|
281
265
|
this.ctxMenu = output();
|
|
282
266
|
// the items rendered in the list
|
|
283
267
|
this.items = signal([]);
|
|
284
|
-
this._items = computed(() => {
|
|
285
|
-
const items = this.items();
|
|
286
|
-
return items.map((item) => ({
|
|
287
|
-
...item,
|
|
288
|
-
actions: (item.actions || [])
|
|
289
|
-
.map((a) => this.#actionService.getActionById(a.id, this.options()?.actionContext))
|
|
290
|
-
.filter((a) => a !== undefined)
|
|
291
|
-
}));
|
|
292
|
-
});
|
|
293
268
|
this.searchExecuted = false;
|
|
294
|
-
this.#executeQueryEffect = effect(() => {
|
|
295
|
-
// execute the query each time it changes
|
|
296
|
-
this.#query = this.query();
|
|
297
|
-
if (this.#query && this.oc)
|
|
298
|
-
untracked(() => {
|
|
299
|
-
this.#executeQuery(this.#query || undefined);
|
|
300
|
-
this.empytIcon.set(YUV_ICONS.refresh);
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
this.#events
|
|
304
|
-
.on(YuvEventType.DMS_OBJECT_UPDATED)
|
|
305
|
-
.pipe(takeUntilDestroyed())
|
|
306
|
-
.subscribe((e) => {
|
|
307
|
-
const dmsObject = e.data;
|
|
308
|
-
// check if the updated object is part of the list
|
|
309
|
-
this.items().findIndex((item) => item.id === dmsObject.id) >= 0 && this.updateTileList([dmsObject]);
|
|
310
|
-
});
|
|
311
269
|
}
|
|
312
|
-
|
|
313
|
-
|
|
270
|
+
#objectConfigService;
|
|
271
|
+
#destroyRef;
|
|
272
|
+
#elRef;
|
|
273
|
+
#actionService;
|
|
274
|
+
#dmsService;
|
|
275
|
+
onCopy(event) {
|
|
276
|
+
event.preventDefault();
|
|
277
|
+
if (this._selection.length)
|
|
278
|
+
this.tileCopy.emit(this._selectionToTileData(this._selection));
|
|
314
279
|
}
|
|
280
|
+
onCut(event) {
|
|
281
|
+
event.preventDefault();
|
|
282
|
+
if (this._selection.length)
|
|
283
|
+
this.tileCut.emit(this._selectionToTileData(this._selection));
|
|
284
|
+
}
|
|
285
|
+
#busyEffect;
|
|
286
|
+
#flavorEffect;
|
|
287
|
+
#preselect;
|
|
288
|
+
#preselectEffect;
|
|
289
|
+
#rawResultItems;
|
|
315
290
|
contextMenuHandler(event, index) {
|
|
316
291
|
if (this.disableCustomContextMenu())
|
|
317
292
|
return;
|
|
@@ -332,14 +307,6 @@ class TileListComponent {
|
|
|
332
307
|
.pipe(switchMap((o) => a.run([o])))
|
|
333
308
|
.subscribe();
|
|
334
309
|
}
|
|
335
|
-
select(i, evt) {
|
|
336
|
-
const check = this.preventChangeUntil();
|
|
337
|
-
const checked = check();
|
|
338
|
-
if (checked) {
|
|
339
|
-
const idx = this.items().findIndex((item) => item.id === i.id);
|
|
340
|
-
this.selectByIndex(idx, evt);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
310
|
selectById(ids) {
|
|
344
311
|
if (this._busy())
|
|
345
312
|
this.#preselect.set(ids);
|
|
@@ -351,38 +318,25 @@ class TileListComponent {
|
|
|
351
318
|
this.selectionChange.emit(tiles);
|
|
352
319
|
}
|
|
353
320
|
}
|
|
354
|
-
|
|
355
|
-
this
|
|
356
|
-
this._selection = sel;
|
|
357
|
-
this._selection.sort();
|
|
321
|
+
selectByIndex(idx, evt) {
|
|
322
|
+
this.#select(idx, evt?.shiftKey, evt?.ctrlKey);
|
|
358
323
|
}
|
|
359
|
-
|
|
360
|
-
this
|
|
361
|
-
this.
|
|
362
|
-
const tiles = this._selectionToTileData(sel);
|
|
363
|
-
this.selectionChange.emit(tiles);
|
|
324
|
+
onQueryResult(e) {
|
|
325
|
+
this.searchExecuted = true;
|
|
326
|
+
this.queryResult.emit(e);
|
|
364
327
|
}
|
|
365
328
|
onListItemsSelect(sel) {
|
|
366
329
|
this._selection = sel;
|
|
367
330
|
if (sel.length)
|
|
368
331
|
this.selectByIndex(sel[0]);
|
|
369
332
|
}
|
|
370
|
-
selectByIndex(idx, evt) {
|
|
371
|
-
this.#select(idx, evt?.shiftKey, evt?.ctrlKey);
|
|
372
|
-
}
|
|
373
333
|
refresh() {
|
|
374
|
-
|
|
375
|
-
if (this.pagination) {
|
|
376
|
-
this.goToPage(this.pagination.page);
|
|
377
|
-
}
|
|
378
|
-
else
|
|
379
|
-
this.#executeQuery(this.query() || undefined);
|
|
380
|
-
}
|
|
334
|
+
this.list().refresh();
|
|
381
335
|
}
|
|
382
336
|
applyFlavor(flavor) {
|
|
383
337
|
this.appliedFlavor = this.appliedFlavor?.id === flavor.id ? undefined : flavor;
|
|
384
|
-
if (this
|
|
385
|
-
this.items.set(this
|
|
338
|
+
if (this.#rawResultItems)
|
|
339
|
+
this.items.set(this.#mapToTileData(this.#rawResultItems.map((i) => new DmsObject(i))));
|
|
386
340
|
}
|
|
387
341
|
clearSelection(silent = false) {
|
|
388
342
|
if (this._selection.length) {
|
|
@@ -407,26 +361,6 @@ class TileListComponent {
|
|
|
407
361
|
this.#select(this._lastSelection - 1);
|
|
408
362
|
}
|
|
409
363
|
}
|
|
410
|
-
changePage(pe) {
|
|
411
|
-
this.goToPage(pe.pageIndex + 1);
|
|
412
|
-
}
|
|
413
|
-
goToPage(page) {
|
|
414
|
-
if (!this.#query)
|
|
415
|
-
return;
|
|
416
|
-
this._busy.set(true);
|
|
417
|
-
this.#searchService
|
|
418
|
-
.getPage(this.#query, page, this.getPageSize())
|
|
419
|
-
.pipe(finalize(() => this._busy.set(false)))
|
|
420
|
-
.subscribe({
|
|
421
|
-
next: (res) => {
|
|
422
|
-
this.#setupPagination(res);
|
|
423
|
-
this.items.set(this._mapSearchResult(res));
|
|
424
|
-
},
|
|
425
|
-
error: (err) => {
|
|
426
|
-
// TODO: how should errors be handles in case hat loading pages fail
|
|
427
|
-
}
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
364
|
#select(index, shiftKey = false, ctrlKey = false) {
|
|
431
365
|
this.#elRef.nativeElement.focus();
|
|
432
366
|
if (index === -1) {
|
|
@@ -471,47 +405,6 @@ class TileListComponent {
|
|
|
471
405
|
_selectionToTileData(selection) {
|
|
472
406
|
return selection.map((idx) => this.items()[idx]);
|
|
473
407
|
}
|
|
474
|
-
/**
|
|
475
|
-
* Executes a search query.
|
|
476
|
-
* @param query The search query to execute. This may be a SearchQuery object or a string. If it's a string, it is supposed to
|
|
477
|
-
* be a CMIS query statement.
|
|
478
|
-
*/
|
|
479
|
-
#executeQuery(query) {
|
|
480
|
-
if (query && this.#system.system && !this._busy()) {
|
|
481
|
-
this.searchExecuted = false;
|
|
482
|
-
// reset items to avoid old data being shown while new stuff is loaded
|
|
483
|
-
this.items.set([]);
|
|
484
|
-
this._busy.set(true);
|
|
485
|
-
const isSearchQuery = query && typeof query !== 'string';
|
|
486
|
-
if (isSearchQuery) {
|
|
487
|
-
query.fields = undefined;
|
|
488
|
-
}
|
|
489
|
-
(isSearchQuery ? this.#searchService.search(query) : this.#searchService.searchCmis(query, this.getPageSize()))
|
|
490
|
-
.pipe(finalize(() => this._busy.set(false)))
|
|
491
|
-
.subscribe({
|
|
492
|
-
next: (res) => {
|
|
493
|
-
this.#setupPagination(res);
|
|
494
|
-
this.items.set(this._mapSearchResult(res));
|
|
495
|
-
this.queryResult.emit({ totalCount: res.items.length });
|
|
496
|
-
const preselect = this.preselect();
|
|
497
|
-
if (preselect) {
|
|
498
|
-
this.selectById(preselect);
|
|
499
|
-
}
|
|
500
|
-
},
|
|
501
|
-
error: (err) => console.error(err)
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
#setupPagination(searchResult) {
|
|
506
|
-
this.pagination = undefined;
|
|
507
|
-
this.pagination = searchResult.paging
|
|
508
|
-
? {
|
|
509
|
-
total: searchResult.totalNumItems,
|
|
510
|
-
pages: searchResult.paging.totalPages,
|
|
511
|
-
page: searchResult.paging.page
|
|
512
|
-
}
|
|
513
|
-
: undefined;
|
|
514
|
-
}
|
|
515
408
|
#mapToTileData(objects) {
|
|
516
409
|
return objects.map((dmsObject) => {
|
|
517
410
|
const sots = dmsObject.sots || [];
|
|
@@ -562,11 +455,6 @@ class TileListComponent {
|
|
|
562
455
|
return tli;
|
|
563
456
|
});
|
|
564
457
|
}
|
|
565
|
-
_mapSearchResult(res) {
|
|
566
|
-
this.searchExecuted = true;
|
|
567
|
-
this._rawResult = res;
|
|
568
|
-
return this.oc ? this.#mapToTileData(res.items.map((i) => new DmsObject(i))) : [];
|
|
569
|
-
}
|
|
570
458
|
#getResolvedObjectConfigItem(propertyName, instanceData) {
|
|
571
459
|
const item = {
|
|
572
460
|
propertyName: propertyName,
|
|
@@ -597,6 +485,7 @@ class TileListComponent {
|
|
|
597
485
|
});
|
|
598
486
|
}
|
|
599
487
|
ngOnInit() {
|
|
488
|
+
this._busy = this.list().busy;
|
|
600
489
|
this.#objectConfigService
|
|
601
490
|
.getObjectConfigs$(this.bucket() || '', true)
|
|
602
491
|
.pipe(takeUntilDestroyed(this.#destroyRef))
|
|
@@ -604,15 +493,12 @@ class TileListComponent {
|
|
|
604
493
|
next: (res) => {
|
|
605
494
|
this.oc = res;
|
|
606
495
|
const q = this.query();
|
|
607
|
-
q && this.#executeQuery(q);
|
|
496
|
+
// q && this.#executeQuery(q);
|
|
608
497
|
}
|
|
609
498
|
});
|
|
610
499
|
}
|
|
611
|
-
ngOnDestroy() {
|
|
612
|
-
// this._keyManager?.destroy();
|
|
613
|
-
}
|
|
614
500
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
615
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileListComponent, isStandalone: true, selector: "yuv-tile-list", inputs: { bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, flavor: { classPropertyName: "flavor", publicName: "flavor", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, preselect: { classPropertyName: "preselect", publicName: "preselect", isSignal: true, isRequired: false, transformFunction: null }, highlights: { classPropertyName: "highlights", publicName: "highlights", isSignal: true, isRequired: false, transformFunction: null }, preventChangeUntil: { classPropertyName: "preventChangeUntil", publicName: "preventChangeUntil", isSignal: true, isRequired: false, transformFunction: null }, disableCustomContextMenu: { classPropertyName: "disableCustomContextMenu", publicName: "disableCustomContextMenu", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelect: "itemSelect", tileCopy: "tileCopy", tileCut: "tileCut", busy: "busy", queryResult: "queryResult", selectionChange: "selectionChange", itemDblClick: "itemDblClick", ctxMenu: "ctxMenu" }, host: { listeners: { "keydown.control.c": "onCopy($event)", "keydown.control.x": "onCut($event)" }, properties: { "class.dense": "dense()"
|
|
501
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileListComponent, isStandalone: true, selector: "yuv-tile-list", inputs: { bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, flavor: { classPropertyName: "flavor", publicName: "flavor", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, preselect: { classPropertyName: "preselect", publicName: "preselect", isSignal: true, isRequired: false, transformFunction: null }, highlights: { classPropertyName: "highlights", publicName: "highlights", isSignal: true, isRequired: false, transformFunction: null }, preventChangeUntil: { classPropertyName: "preventChangeUntil", publicName: "preventChangeUntil", isSignal: true, isRequired: false, transformFunction: null }, disableCustomContextMenu: { classPropertyName: "disableCustomContextMenu", publicName: "disableCustomContextMenu", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelect: "itemSelect", tileCopy: "tileCopy", tileCut: "tileCut", busy: "busy", queryResult: "queryResult", selectionChange: "selectionChange", itemDblClick: "itemDblClick", ctxMenu: "ctxMenu" }, host: { listeners: { "keydown.control.c": "onCopy($event)", "keydown.control.x": "onCut($event)" }, properties: { "class.dense": "dense()" } }, providers: [], queries: [{ propertyName: "menuComponent", first: true, predicate: TileActionsMenuComponent, descendants: true, isSignal: true }, { propertyName: "emptyContent", first: true, predicate: ["empty"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }], ngImport: i0, template: "<yuv-query-list\n #list\n [query]=\"query()\"\n [transformer]=\"transformer\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [pageSize]=\"pageSize()\"\n [multiselect]=\"multiselect()\"\n (itemDoubleClick)=\"selectByIndex($event)\"\n (itemSelect)=\"onListItemsSelect($event)\"\n (queryResult)=\"onQueryResult($event)\"\n>\n\n <ng-template #yuvQueryListItem let-item let-index=\"index\">\n <yuv-list-tile\n [class.dense]=\"dense()\"\n (contextmenu)=\"contextMenuHandler($event, index)\"\n >\n <ng-template #iconSlot><ng-container *yuvRenderer=\"item.icon\"></ng-container></ng-template>\n <ng-template #titleSlot><ng-container *yuvRenderer=\"item.title\"></ng-container></ng-template>\n <ng-template #descriptionSlot><ng-container *yuvRenderer=\"item.description\"></ng-container></ng-template>\n <ng-template #metaSlot><ng-container *yuvRenderer=\"item.meta\"></ng-container></ng-template>\n <ng-template #asideSlot><ng-container *yuvRenderer=\"item.aside\"></ng-container></ng-template>\n <ng-template #actionsSlot>\n @for (a of item.actions; track a.id) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"a.label\" (click)=\"executeAction(item, a, $event)\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n\n @if (menu()) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matMenuTriggerFor]=\"menu()\">\n <mat-icon inert=\"true\">more_vert</mat-icon>\n </button>\n }\n <ng-content select=\"yuv-tile-actions-menu, [yuv-tile-actions-menu]\"></ng-content>\n </ng-template>\n <ng-template #extensionSlot> <ng-container *yuvTileExtension=\"{ typeId: item.objectTypeId, data: item.instanceData }\"></ng-container> </ng-template>\n <ng-template #badgesSlot>{{ item.badges }}</ng-template>\n </yuv-list-tile>\n </ng-template>\n\n <ng-template #yuvQueryListEmpty>\n <div class=\"empyt-list\">\n @if (searchExecuted && emptyContent()) {\n <ng-content></ng-content>\n }\n </div>\n </ng-template>\n <div class=\"offset\" (click)=\"clearSelection()\"></div>\n</yuv-query-list>\n", styles: [":host{--paging-background: var(--ymt-surface);display:flex;flex-direction:column}:host yuv-list{overflow-y:auto;display:flex;flex-flow:column;height:100%}:host yuv-list .offset{flex:1 1 auto}:host .paginator{border-block-start:1px solid var(--ymt-outline-variant);font:inherit;background-color:var(--paging-background)}:host yuv-tile{cursor:pointer}:host yuv-tile:not(.last){border:var(--tile-border);border-width:var(--tile-border-width);margin-block-end:var(--tile-gap)}:host .empyt-list{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: YuvListModule }, { kind: "component", type: i1.ListTileComponent, selector: "yuv-list-tile" }, { kind: "ngmodule", type: YuvQueryListModule }, { kind: "component", type: i2.QueryListComponent, selector: "yuv-query-list", inputs: ["query", "transformer", "preventChangeUntil", "pageSize", "enableDragSelect", "multiselect", "selfHandleSelection"], outputs: ["itemSelect", "dragSelectChange", "itemDoubleClick", "queryResult"] }, { kind: "directive", type: RendererDirective, selector: "[yuvRenderer]", inputs: ["yuvRenderer"] }, { kind: "directive", type: TileExtensionDirective, selector: "[yuvTileExtension]", inputs: ["yuvTileExtension"] }, { 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"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }] }); }
|
|
616
502
|
}
|
|
617
503
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileListComponent, decorators: [{
|
|
618
504
|
type: Component,
|
|
@@ -620,26 +506,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
620
506
|
TranslateModule,
|
|
621
507
|
ReactiveFormsModule,
|
|
622
508
|
YuvListModule,
|
|
623
|
-
|
|
509
|
+
YuvQueryListModule,
|
|
624
510
|
YuvListModule,
|
|
625
|
-
DragSelectDirective,
|
|
626
|
-
DragSelectItemDirective,
|
|
627
511
|
RendererDirective,
|
|
628
512
|
TileExtensionDirective,
|
|
629
513
|
YmtIconButtonDirective,
|
|
630
514
|
...MATERIAL_IMPORTS
|
|
631
515
|
], host: {
|
|
632
516
|
'[class.dense]': 'dense()'
|
|
633
|
-
}, template: "<yuv-list\n #list\n [
|
|
634
|
-
}],
|
|
517
|
+
}, template: "<yuv-query-list\n #list\n [query]=\"query()\"\n [transformer]=\"transformer\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [pageSize]=\"pageSize()\"\n [multiselect]=\"multiselect()\"\n (itemDoubleClick)=\"selectByIndex($event)\"\n (itemSelect)=\"onListItemsSelect($event)\"\n (queryResult)=\"onQueryResult($event)\"\n>\n\n <ng-template #yuvQueryListItem let-item let-index=\"index\">\n <yuv-list-tile\n [class.dense]=\"dense()\"\n (contextmenu)=\"contextMenuHandler($event, index)\"\n >\n <ng-template #iconSlot><ng-container *yuvRenderer=\"item.icon\"></ng-container></ng-template>\n <ng-template #titleSlot><ng-container *yuvRenderer=\"item.title\"></ng-container></ng-template>\n <ng-template #descriptionSlot><ng-container *yuvRenderer=\"item.description\"></ng-container></ng-template>\n <ng-template #metaSlot><ng-container *yuvRenderer=\"item.meta\"></ng-container></ng-template>\n <ng-template #asideSlot><ng-container *yuvRenderer=\"item.aside\"></ng-container></ng-template>\n <ng-template #actionsSlot>\n @for (a of item.actions; track a.id) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"a.label\" (click)=\"executeAction(item, a, $event)\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n\n @if (menu()) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matMenuTriggerFor]=\"menu()\">\n <mat-icon inert=\"true\">more_vert</mat-icon>\n </button>\n }\n <ng-content select=\"yuv-tile-actions-menu, [yuv-tile-actions-menu]\"></ng-content>\n </ng-template>\n <ng-template #extensionSlot> <ng-container *yuvTileExtension=\"{ typeId: item.objectTypeId, data: item.instanceData }\"></ng-container> </ng-template>\n <ng-template #badgesSlot>{{ item.badges }}</ng-template>\n </yuv-list-tile>\n </ng-template>\n\n <ng-template #yuvQueryListEmpty>\n <div class=\"empyt-list\">\n @if (searchExecuted && emptyContent()) {\n <ng-content></ng-content>\n }\n </div>\n </ng-template>\n <div class=\"offset\" (click)=\"clearSelection()\"></div>\n</yuv-query-list>\n", styles: [":host{--paging-background: var(--ymt-surface);display:flex;flex-direction:column}:host yuv-list{overflow-y:auto;display:flex;flex-flow:column;height:100%}:host yuv-list .offset{flex:1 1 auto}:host .paginator{border-block-start:1px solid var(--ymt-outline-variant);font:inherit;background-color:var(--paging-background)}:host yuv-tile{cursor:pointer}:host yuv-tile:not(.last){border:var(--tile-border);border-width:var(--tile-border-width);margin-block-end:var(--tile-gap)}:host .empyt-list{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}\n"] }]
|
|
518
|
+
}], propDecorators: { onCopy: [{
|
|
635
519
|
type: HostListener,
|
|
636
520
|
args: ['keydown.control.c', ['$event']]
|
|
637
521
|
}], onCut: [{
|
|
638
522
|
type: HostListener,
|
|
639
523
|
args: ['keydown.control.x', ['$event']]
|
|
640
|
-
}], pagination: [{
|
|
641
|
-
type: HostBinding,
|
|
642
|
-
args: ['class.pagination']
|
|
643
524
|
}] } });
|
|
644
525
|
|
|
645
526
|
class ActionSelectComponent {
|
|
@@ -654,7 +535,7 @@ class ActionSelectComponent {
|
|
|
654
535
|
this.actionSelect = output();
|
|
655
536
|
}
|
|
656
537
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ActionSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
657
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: ActionSelectComponent, isStandalone: true, selector: "yuv-tile-action-select", inputs: { objectType: { classPropertyName: "objectType", publicName: "objectType", isSignal: true, isRequired: true, transformFunction: null }, selectedActionIds: { classPropertyName: "selectedActionIds", publicName: "selectedActionIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionSelect: "actionSelect" }, ngImport: i0, template: "<div class=\"actions\">\n @for (a of actions(); track a.id) {\n <button [ngClass]=\"{ selected: selectedActionIds().includes(a.id) }\" (click)=\"actionSelect.emit(a)\">\n <mat-icon>{{ a.icon }}</mat-icon\n >{{ a.label }}\n </button>\n }\n</div>\n", styles: [":host .actions{display:flex;gap:var(--ymt-spacing-xs)}:host .actions button{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;background-color:var(--mat-sys-secondary-container);color:var(--mat-sys-on-secondary-container);border:0;display:inline-flex;gap:var(--ymt-spacing-xs);padding:var(--ymt-spacing-2xs) var(--ymt-spacing-xs);align-items:center;border-radius:var(--ymt-corner-s)}:host .actions button.selected{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type:
|
|
538
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: ActionSelectComponent, isStandalone: true, selector: "yuv-tile-action-select", inputs: { objectType: { classPropertyName: "objectType", publicName: "objectType", isSignal: true, isRequired: true, transformFunction: null }, selectedActionIds: { classPropertyName: "selectedActionIds", publicName: "selectedActionIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionSelect: "actionSelect" }, ngImport: i0, template: "<div class=\"actions\">\n @for (a of actions(); track a.id) {\n <button [ngClass]=\"{ selected: selectedActionIds().includes(a.id) }\" (click)=\"actionSelect.emit(a)\">\n <mat-icon>{{ a.icon }}</mat-icon\n >{{ a.label }}\n </button>\n }\n</div>\n", styles: [":host .actions{display:flex;gap:var(--ymt-spacing-xs)}:host .actions button{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;background-color:var(--mat-sys-secondary-container);color:var(--mat-sys-on-secondary-container);border:0;display:inline-flex;gap:var(--ymt-spacing-xs);padding:var(--ymt-spacing-2xs) var(--ymt-spacing-xs);align-items:center;border-radius:var(--ymt-corner-s)}:host .actions button.selected{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
658
539
|
}
|
|
659
540
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ActionSelectComponent, decorators: [{
|
|
660
541
|
type: Component,
|
|
@@ -781,7 +662,7 @@ class PropertySelectComponent {
|
|
|
781
662
|
return this.system.getLocalizedLabel(otf.id) || otf.id;
|
|
782
663
|
}
|
|
783
664
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PropertySelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
784
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: PropertySelectComponent, isStandalone: true, selector: "yuv-tile-property-select", inputs: { objectType: { classPropertyName: "objectType", publicName: "objectType", isSignal: true, isRequired: false, transformFunction: null }, selectedProperty: { classPropertyName: "selectedProperty", publicName: "selectedProperty", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { propertySelect: "propertySelect" }, ngImport: i0, template: "<!-- TODO: enable once filtering of properties makes sense -->\n<!-- <form class=\"filter\">\n <div class=\"filter-input\">\n <input type=\"text\" [placeholder]=\"'yuv.tile-config.property-select.filter.placeholder' | translate\" name=\"query\" [(ngModel)]=\"query\" />\n @if (query()) {\n <button class=\"icn\" (click)=\"query.set(null)\">\n <yuv-icon [svg]=\"clearIcon\"></yuv-icon>\n </button>\n }\n </div>\n</form> -->\n\n<ul class=\"properties\">\n @for (p of filteredObjectTypeFields(); track $index) {\n <li\n tabindex=\"0\"\n [ngClass]=\"{ baseProperty: p.baseProperty, selected: p.id === selectedProperty()?.propertyName }\"\n (click)=\"selectProperty(p)\"\n (keydown.enter)=\"selectPropertyOnKeydown($event, p)\"\n (keydown.space)=\"selectPropertyOnKeydown($event, p)\"\n >\n <div class=\"label\">{{ p.label }}</div>\n <button\n mat-icon-button\n (click)=\"removeProperty($event)\"\n (keydown.enter)=\"removePropertyOnKeydown($event)\"\n (keydown.space)=\"removePropertyOnKeydown($event)\"\n >\n <mat-icon aria-hidden=\"true\" [attr.inert]=\"true\">close</mat-icon>\n </button>\n </li>\n }\n</ul>\n", styles: [":host{display:flex;flex-flow:column;max-height:100%}:host .filter{flex:0 0 auto}:host .filter .filter-input{background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline-variant);display:flex;padding:.25em;align-items:center}:host .filter .filter-input input{background-color:transparent;border:0;outline:0;flex:1;color:var(--ymt-text-color)}:host .properties{flex:1;column-count:3;column-width:30ch;column-rule:1px dotted var(--ymt-outline);column-gap:2em;margin-block-start:var(--ymt-spacing-m)}:host .properties li{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;display:flex;align-items:center;justify-content:space-between;cursor:default}:host .properties li:hover{background-color:var(--ymt-hover-background)}:host .properties li.baseProperty{font-style:italic}:host .properties li.selected{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host .properties li:not(.selected) button{display:none}:host .properties li .label{padding:var(--ymt-spacing-xs) var(--ymt-spacing-m)}:host .properties li button{color:currentColor}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type:
|
|
665
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: PropertySelectComponent, isStandalone: true, selector: "yuv-tile-property-select", inputs: { objectType: { classPropertyName: "objectType", publicName: "objectType", isSignal: true, isRequired: false, transformFunction: null }, selectedProperty: { classPropertyName: "selectedProperty", publicName: "selectedProperty", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { propertySelect: "propertySelect" }, ngImport: i0, template: "<!-- TODO: enable once filtering of properties makes sense -->\n<!-- <form class=\"filter\">\n <div class=\"filter-input\">\n <input type=\"text\" [placeholder]=\"'yuv.tile-config.property-select.filter.placeholder' | translate\" name=\"query\" [(ngModel)]=\"query\" />\n @if (query()) {\n <button class=\"icn\" (click)=\"query.set(null)\">\n <yuv-icon [svg]=\"clearIcon\"></yuv-icon>\n </button>\n }\n </div>\n</form> -->\n\n<ul class=\"properties\">\n @for (p of filteredObjectTypeFields(); track $index) {\n <li\n tabindex=\"0\"\n [ngClass]=\"{ baseProperty: p.baseProperty, selected: p.id === selectedProperty()?.propertyName }\"\n (click)=\"selectProperty(p)\"\n (keydown.enter)=\"selectPropertyOnKeydown($event, p)\"\n (keydown.space)=\"selectPropertyOnKeydown($event, p)\"\n >\n <div class=\"label\">{{ p.label }}</div>\n <button\n mat-icon-button\n (click)=\"removeProperty($event)\"\n (keydown.enter)=\"removePropertyOnKeydown($event)\"\n (keydown.space)=\"removePropertyOnKeydown($event)\"\n >\n <mat-icon aria-hidden=\"true\" [attr.inert]=\"true\">close</mat-icon>\n </button>\n </li>\n }\n</ul>\n", styles: [":host{display:flex;flex-flow:column;max-height:100%}:host .filter{flex:0 0 auto}:host .filter .filter-input{background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline-variant);display:flex;padding:.25em;align-items:center}:host .filter .filter-input input{background-color:transparent;border:0;outline:0;flex:1;color:var(--ymt-text-color)}:host .properties{flex:1;column-count:3;column-width:30ch;column-rule:1px dotted var(--ymt-outline);column-gap:2em;margin-block-start:var(--ymt-spacing-m)}:host .properties li{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;display:flex;align-items:center;justify-content:space-between;cursor:default}:host .properties li:hover{background-color:var(--ymt-hover-background)}:host .properties li.baseProperty{font-style:italic}:host .properties li.selected{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host .properties li:not(.selected) button{display:none}:host .properties li .label{padding:var(--ymt-spacing-xs) var(--ymt-spacing-m)}:host .properties li button{color:currentColor}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.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"] }] }); }
|
|
785
666
|
}
|
|
786
667
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PropertySelectComponent, decorators: [{
|
|
787
668
|
type: Component,
|
|
@@ -839,7 +720,7 @@ class TileConfigTileComponent {
|
|
|
839
720
|
});
|
|
840
721
|
}
|
|
841
722
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileConfigTileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
842
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileConfigTileComponent, isStandalone: true, selector: "yuv-tile-config-tile", inputs: { disableIconSlot: { classPropertyName: "disableIconSlot", publicName: "disableIconSlot", isSignal: true, isRequired: false, transformFunction: null }, disableBadgesSlot: { classPropertyName: "disableBadgesSlot", publicName: "disableBadgesSlot", isSignal: true, isRequired: false, transformFunction: null }, objectConfig: { classPropertyName: "objectConfig", publicName: "objectConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { slotSelect: "slotSelect" }, ngImport: i0, template: "@let oc = _objectConfig();\n\n<div\n data-slot=\"icon\"\n [attr.disabled]=\"disableIconSlot()\"\n tabindex=\"0\"\n (click)=\"selectSlot('icon')\"\n (keydown.enter)=\"selectSlot('icon')\"\n (keydown.space)=\"selectSlot('icon'); $event.preventDefault()\"\n>\n @if (oc && oc.icon) {\n <mat-icon aria-hidden=\"true\" [attr.inert]=\"true\">{{ oc.icon.svg }}</mat-icon>\n } @else if (oc && oc.objectTypeId) {\n <yuv-object-type-icon [objectTypeId]=\"oc.objectTypeId\"></yuv-object-type-icon>\n }\n</div>\n<div\n data-slot=\"title\"\n tabindex=\"0\"\n (click)=\"selectSlot('title')\"\n (keydown.enter)=\"selectSlot('title')\"\n (keydown.space)=\"selectSlot('title'); $event.preventDefault()\"\n>\n {{ oc?.title?.label }}\n</div>\n<div\n data-slot=\"actions\"\n tabindex=\"0\"\n (click)=\"selectSlot('actions')\"\n (keydown.enter)=\"selectSlot('actions')\"\n (keydown.space)=\"selectSlot('actions'); $event.preventDefault()\"\n>\n @for (a of actions(); track a.id) {\n <button mat-icon-button [matTooltip]=\"a.label\" [attr.inert]=\"true\" aria-hidden=\"true\">\n <mat-icon inert=\"true\" aria-hidden=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n</div>\n<div\n data-slot=\"description\"\n tabindex=\"0\"\n (click)=\"selectSlot('description')\"\n (keydown.enter)=\"selectSlot('description')\"\n (keydown.space)=\"selectSlot('description'); $event.preventDefault()\"\n>\n {{ oc?.description?.label }}\n</div>\n<div\n data-slot=\"aside\"\n tabindex=\"0\"\n (click)=\"selectSlot('aside')\"\n (keydown.enter)=\"selectSlot('aside')\"\n (keydown.space)=\"selectSlot('aside'); $event.preventDefault()\"\n>\n {{ oc?.aside?.label }}\n</div>\n<div\n data-slot=\"meta\"\n tabindex=\"0\"\n (click)=\"selectSlot('meta')\"\n (keydown.enter)=\"selectSlot('meta')\"\n (keydown.space)=\"selectSlot('meta'); $event.preventDefault()\"\n>\n {{ oc?.meta?.label }}\n</div>\n@if (!disableBadgesSlot()) {\n <div\n data-slot=\"badges\"\n tabindex=\"0\"\n (click)=\"selectSlot('badges')\"\n (keydown.enter)=\"selectSlot('badges')\"\n (keydown.space)=\"selectSlot('badges'); $event.preventDefault()\"\n >\n {{ oc?.badges }}\n </div>\n}\n", styles: [":host{--tile-item-gap: .5em;--tile-background: transparent;--tile-icon-fill: currentColor;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:3rem 1fr auto;grid-template-areas:\"icon title title actions\" \"icon description aside aside\" \"icon meta meta badges\";gap:var(--tile-item-gap);padding:var(--ymt-spacing-m);background-color:var(--tile-background)}:host:hover [data-slot=actions]{opacity:1}:host [data-slot=icon]{grid-area:icon;display:flex;align-items:center;justify-content:center}:host [data-slot=title]{grid-area:title;font-weight:700}:host [data-slot=description]{grid-area:description}:host [data-slot=meta]{grid-area:meta}:host [data-slot=aside]{flex:0 0 auto;grid-area:aside}:host [data-slot=actions]{flex:0 0 auto;display:flex;justify-self:end;grid-area:actions}:host [data-slot=actions] button{padding:0;gap:2px}:host [data-slot=badges]{grid-area:badges;justify-self:end;flex:0 0 auto}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]){display:flex;align-items:center;background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline);padding:.25em .5em;box-sizing:border-box;min-height:2.2em;border-radius:var(--ymt-corner-xs)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]){cursor:pointer}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]):hover{background-color:var(--ymt-focus-background);color:var(--ymt-on-focus-background)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]).active{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta])[disabled]{border:none;background-color:transparent}:host :where([data-slot=badges],[data-slot=actions]){min-width:3em}:host :where([data-slot=badges],[data-slot=actions]) button{width:24px;height:24px;pointer-events:none;color:currentColor}:host [data-slot=aside]{min-width:4em}:host [data-slot=icon]{height:3em;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type:
|
|
723
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileConfigTileComponent, isStandalone: true, selector: "yuv-tile-config-tile", inputs: { disableIconSlot: { classPropertyName: "disableIconSlot", publicName: "disableIconSlot", isSignal: true, isRequired: false, transformFunction: null }, disableBadgesSlot: { classPropertyName: "disableBadgesSlot", publicName: "disableBadgesSlot", isSignal: true, isRequired: false, transformFunction: null }, objectConfig: { classPropertyName: "objectConfig", publicName: "objectConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { slotSelect: "slotSelect" }, ngImport: i0, template: "@let oc = _objectConfig();\n\n<div\n data-slot=\"icon\"\n [attr.disabled]=\"disableIconSlot()\"\n tabindex=\"0\"\n (click)=\"selectSlot('icon')\"\n (keydown.enter)=\"selectSlot('icon')\"\n (keydown.space)=\"selectSlot('icon'); $event.preventDefault()\"\n>\n @if (oc && oc.icon) {\n <mat-icon aria-hidden=\"true\" [attr.inert]=\"true\">{{ oc.icon.svg }}</mat-icon>\n } @else if (oc && oc.objectTypeId) {\n <yuv-object-type-icon [objectTypeId]=\"oc.objectTypeId\"></yuv-object-type-icon>\n }\n</div>\n<div\n data-slot=\"title\"\n tabindex=\"0\"\n (click)=\"selectSlot('title')\"\n (keydown.enter)=\"selectSlot('title')\"\n (keydown.space)=\"selectSlot('title'); $event.preventDefault()\"\n>\n {{ oc?.title?.label }}\n</div>\n<div\n data-slot=\"actions\"\n tabindex=\"0\"\n (click)=\"selectSlot('actions')\"\n (keydown.enter)=\"selectSlot('actions')\"\n (keydown.space)=\"selectSlot('actions'); $event.preventDefault()\"\n>\n @for (a of actions(); track a.id) {\n <button mat-icon-button [matTooltip]=\"a.label\" [attr.inert]=\"true\" aria-hidden=\"true\">\n <mat-icon inert=\"true\" aria-hidden=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n</div>\n<div\n data-slot=\"description\"\n tabindex=\"0\"\n (click)=\"selectSlot('description')\"\n (keydown.enter)=\"selectSlot('description')\"\n (keydown.space)=\"selectSlot('description'); $event.preventDefault()\"\n>\n {{ oc?.description?.label }}\n</div>\n<div\n data-slot=\"aside\"\n tabindex=\"0\"\n (click)=\"selectSlot('aside')\"\n (keydown.enter)=\"selectSlot('aside')\"\n (keydown.space)=\"selectSlot('aside'); $event.preventDefault()\"\n>\n {{ oc?.aside?.label }}\n</div>\n<div\n data-slot=\"meta\"\n tabindex=\"0\"\n (click)=\"selectSlot('meta')\"\n (keydown.enter)=\"selectSlot('meta')\"\n (keydown.space)=\"selectSlot('meta'); $event.preventDefault()\"\n>\n {{ oc?.meta?.label }}\n</div>\n@if (!disableBadgesSlot()) {\n <div\n data-slot=\"badges\"\n tabindex=\"0\"\n (click)=\"selectSlot('badges')\"\n (keydown.enter)=\"selectSlot('badges')\"\n (keydown.space)=\"selectSlot('badges'); $event.preventDefault()\"\n >\n {{ oc?.badges }}\n </div>\n}\n", styles: [":host{--tile-item-gap: .5em;--tile-background: transparent;--tile-icon-fill: currentColor;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:3rem 1fr auto;grid-template-areas:\"icon title title actions\" \"icon description aside aside\" \"icon meta meta badges\";gap:var(--tile-item-gap);padding:var(--ymt-spacing-m);background-color:var(--tile-background)}:host:hover [data-slot=actions]{opacity:1}:host [data-slot=icon]{grid-area:icon;display:flex;align-items:center;justify-content:center}:host [data-slot=title]{grid-area:title;font-weight:700}:host [data-slot=description]{grid-area:description}:host [data-slot=meta]{grid-area:meta}:host [data-slot=aside]{flex:0 0 auto;grid-area:aside}:host [data-slot=actions]{flex:0 0 auto;display:flex;justify-self:end;grid-area:actions}:host [data-slot=actions] button{padding:0;gap:2px}:host [data-slot=badges]{grid-area:badges;justify-self:end;flex:0 0 auto}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]){display:flex;align-items:center;background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline);padding:.25em .5em;box-sizing:border-box;min-height:2.2em;border-radius:var(--ymt-corner-xs)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]){cursor:pointer}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]):hover{background-color:var(--ymt-focus-background);color:var(--ymt-on-focus-background)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]).active{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta])[disabled]{border:none;background-color:transparent}:host :where([data-slot=badges],[data-slot=actions]){min-width:3em}:host :where([data-slot=badges],[data-slot=actions]) button{width:24px;height:24px;pointer-events:none;color:currentColor}:host [data-slot=aside]{min-width:4em}:host [data-slot=icon]{height:3em;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: ObjectTypeIconComponent, selector: "yuv-object-type-icon", inputs: ["objectTypeId"] }] }); }
|
|
843
724
|
}
|
|
844
725
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileConfigTileComponent, decorators: [{
|
|
845
726
|
type: Component,
|