@myrmidon/cadmus-graph-ui-ex
Version:
Cadmus - extensions to semantic graph components.
1 lines • 135 kB
Source Map (JSON)
{"version":3,"file":"myrmidon-cadmus-graph-ui-ex.mjs","sources":["../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/triple-filter/triple-filter.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/triple-filter/triple-filter.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-node-filter/linked-node-filter.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-node-filter/linked-node-filter.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-literal-filter/linked-literal-filter.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-literal-filter/linked-literal-filter.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/pipes/graph-node-label.pipe.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/graph-walker.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/graph-walker/graph-walker.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/graph-walker/graph-walker.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/public-api.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/myrmidon-cadmus-graph-ui-ex.ts"],"sourcesContent":["import { Component, effect, input, model } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { PageEvent, MatPaginator } from '@angular/material/paginator';\r\nimport { forkJoin, from } from 'rxjs';\r\n\r\nimport { MatTabGroup, MatTab } from '@angular/material/tabs';\r\nimport { MatCheckbox } from '@angular/material/checkbox';\r\nimport { MatList, MatListItem } from '@angular/material/list';\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\n\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { GraphNodeLookupService } from '@myrmidon/cadmus-graph-ui';\r\nimport { GraphService, UriNode } from '@myrmidon/cadmus-api';\r\n\r\nimport { PagedTripleFilter } from '../../graph-walker';\r\n\r\n/**\r\n * Triples filter.\r\n */\r\n@Component({\r\n selector: 'cadmus-walker-triple-filter',\r\n templateUrl: './triple-filter.component.html',\r\n styleUrls: ['./triple-filter.component.css'],\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatPaginator,\r\n MatTabGroup,\r\n MatTab,\r\n RefLookupComponent,\r\n MatCheckbox,\r\n MatList,\r\n MatListItem,\r\n MatIconButton,\r\n MatIcon,\r\n MatFormField,\r\n MatInput,\r\n MatTooltip,\r\n ],\r\n})\r\nexport class TripleFilterComponent {\r\n /**\r\n * True if this component is disabled.\r\n */\r\n public readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * True if this component should show a pager.\r\n */\r\n public readonly hasPager = input<boolean>(false);\r\n\r\n /**\r\n * The total number of triples returned from the last\r\n * page fetch operation. Used when hasPager is true.\r\n */\r\n public readonly total = input<number>(0);\r\n\r\n /**\r\n * The filter.\r\n */\r\n public readonly filter = model<PagedTripleFilter>({\r\n pageNumber: 1,\r\n pageSize: 10,\r\n });\r\n\r\n public pageNumber: FormControl<number>;\r\n public pageSize: FormControl<number>;\r\n public litPattern: FormControl<string | null>;\r\n public litType: FormControl<string | null>;\r\n public litLanguage: FormControl<string | null>;\r\n public minLitNumber: FormControl<number | null>;\r\n public maxLitNumber: FormControl<number | null>;\r\n\r\n public subj: FormControl<UriNode | null>;\r\n public isNotPred: FormControl<boolean>;\r\n public preds: FormControl<UriNode[]>;\r\n public notPreds: FormControl<UriNode[]>;\r\n public hasLiteralObj: FormControl<boolean | null>;\r\n public obj: FormControl<UriNode | null>;\r\n public sid: FormControl<string | null>;\r\n public isSidPrefix: FormControl<boolean>;\r\n public tag: FormControl<string | null>;\r\n\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n public lookupService: GraphNodeLookupService,\r\n private _graphService: GraphService\r\n ) {\r\n // form\r\n this.pageNumber = formBuilder.control(1, { nonNullable: true });\r\n this.pageSize = formBuilder.control(10, { nonNullable: true });\r\n this.litPattern = formBuilder.control(null);\r\n this.litType = formBuilder.control(null);\r\n this.litLanguage = formBuilder.control(null);\r\n this.minLitNumber = formBuilder.control(null);\r\n this.maxLitNumber = formBuilder.control(null);\r\n\r\n this.subj = formBuilder.control(null);\r\n this.preds = formBuilder.control([], { nonNullable: true });\r\n this.isNotPred = formBuilder.control(false, { nonNullable: true });\r\n this.notPreds = formBuilder.control([], { nonNullable: true });\r\n this.hasLiteralObj = formBuilder.control(null);\r\n this.obj = formBuilder.control(null);\r\n this.sid = formBuilder.control(null);\r\n this.isSidPrefix = formBuilder.control(false, { nonNullable: true });\r\n this.tag = formBuilder.control(null);\r\n\r\n this.form = formBuilder.group({\r\n pageNumber: this.pageNumber,\r\n pageSize: this.pageSize,\r\n litPattern: this.litPattern,\r\n litType: this.litType,\r\n litLanguage: this.litLanguage,\r\n minLitNumber: this.minLitNumber,\r\n maxLitNumber: this.maxLitNumber,\r\n\r\n subj: this.subj,\r\n preds: this.preds,\r\n isNotPred: this.isNotPred,\r\n notPreds: this.notPreds,\r\n hasLiteralObj: this.hasLiteralObj,\r\n obj: this.obj,\r\n sid: this.sid,\r\n isSidPrefix: this.isSidPrefix,\r\n tag: this.tag,\r\n });\r\n\r\n effect(() => {\r\n this.updateForm(this.filter());\r\n });\r\n }\r\n\r\n private updateForm(filter: PagedTripleFilter): void {\r\n this.pageNumber.setValue(filter.pageNumber);\r\n this.pageSize.setValue(filter.pageSize);\r\n this.litPattern.setValue(filter.literalPattern || null);\r\n this.litType.setValue(filter.literalType || null);\r\n this.litLanguage.setValue(filter.literalLanguage || null);\r\n this.minLitNumber.setValue(filter.minLiteralNumber || null);\r\n this.maxLitNumber.setValue(filter.maxLiteralNumber || null);\r\n\r\n this.hasLiteralObj.setValue(filter.hasLiteralObject || null);\r\n this.sid.setValue(filter.sid || null);\r\n this.isSidPrefix.setValue(filter.isSidPrefix || false);\r\n this.tag.setValue(filter.tag || null);\r\n\r\n // load the referenced nodes so we can show them by label\r\n forkJoin({\r\n s: filter.subjectId\r\n ? this._graphService.getNode(filter.subjectId)\r\n : from([null]),\r\n p: filter.predicateIds?.length\r\n ? this._graphService.getNodeSet(filter.predicateIds)\r\n : from([]),\r\n o: filter.objectId\r\n ? this._graphService.getNode(filter.objectId)\r\n : from([null]),\r\n }).subscribe((result) => {\r\n this.subj.setValue(result.s);\r\n this.preds.setValue(result.p.filter((n) => n) as UriNode[]);\r\n this.obj.setValue(result.o);\r\n this.form.markAsPristine();\r\n });\r\n }\r\n\r\n private getFilter(): PagedTripleFilter {\r\n return {\r\n pageNumber: +this.pageNumber.value,\r\n pageSize: +this.pageSize.value,\r\n literalPattern: this.litPattern.value || undefined,\r\n literalType: this.litType.value || undefined,\r\n literalLanguage: this.litLanguage.value || undefined,\r\n minLiteralNumber: this.minLitNumber.value || undefined,\r\n maxLiteralNumber: this.maxLitNumber.value || undefined,\r\n\r\n subjectId: this.subj.value?.id || undefined,\r\n predicateIds: this.preds.value?.length\r\n ? this.preds.value.map((n) => n.id)\r\n : undefined,\r\n notPredicateIds: this.notPreds.value?.length\r\n ? this.notPreds.value.map((n) => n.id)\r\n : undefined,\r\n hasLiteralObject:\r\n this.hasLiteralObj.value !== null\r\n ? this.hasLiteralObj.value\r\n : undefined,\r\n objectId: this.obj.value?.id || undefined,\r\n sid: this.sid.value || undefined,\r\n isSidPrefix: this.isSidPrefix.value,\r\n tag: this.tag.value || undefined,\r\n };\r\n }\r\n\r\n public onPageChange(page: PageEvent): void {\r\n this.pageNumber.setValue(page.pageIndex + 1);\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public onSubjectNodeChange(node: unknown): void {\r\n this.subj.setValue(node as UriNode);\r\n }\r\n\r\n public onObjectNodeChange(node: unknown): void {\r\n this.obj.setValue(node as UriNode);\r\n }\r\n\r\n public onPredicateNodeChange(node: unknown): void {\r\n if (!node) {\r\n return;\r\n }\r\n const un = node as UriNode;\r\n if (this.isNotPred.value) {\r\n const nodes = [...this.notPreds.value];\r\n if (nodes.some((n) => n.id === un.id)) {\r\n return;\r\n }\r\n nodes.push(un);\r\n this.notPreds.setValue(nodes);\r\n this.notPreds.updateValueAndValidity();\r\n this.notPreds.markAsDirty();\r\n } else {\r\n const nodes = [...this.preds.value];\r\n if (nodes.some((n) => n.id === un.id)) {\r\n return;\r\n }\r\n nodes.push(un);\r\n this.preds.setValue(nodes);\r\n this.preds.updateValueAndValidity();\r\n this.preds.markAsDirty();\r\n }\r\n }\r\n\r\n public deleteNotPred(node: UriNode): void {\r\n const nodes = [...this.notPreds.value];\r\n const i = nodes.indexOf(node);\r\n nodes.splice(i, 1);\r\n this.notPreds.setValue(nodes);\r\n this.notPreds.updateValueAndValidity();\r\n this.notPreds.markAsDirty();\r\n }\r\n\r\n public deletePred(node: UriNode): void {\r\n const nodes = [...this.preds.value];\r\n const i = nodes.indexOf(node);\r\n nodes.splice(i, 1);\r\n this.preds.setValue(nodes);\r\n this.preds.updateValueAndValidity();\r\n this.preds.markAsDirty();\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public apply(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.filter.set(this.getFilter());\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" [attr.disabled]=\"disabled()\">\r\n <!-- paginator -->\r\n @if (hasPager()) {\r\n <mat-paginator\r\n [length]=\"total\"\r\n [pageSize]=\"pageSize.value || 10\"\r\n [pageSizeOptions]=\"[5, 10, 20]\"\r\n (page)=\"onPageChange($event)\"\r\n aria-label=\"Select page\"\r\n />\r\n }\r\n <mat-tab-group>\r\n <!-- TRIPLE -->\r\n <mat-tab label=\"triple\">\r\n <!-- subject ID -->\r\n <div>\r\n <cadmus-ref-lookup\r\n label=\"subject\"\r\n [service]=\"lookupService\"\r\n (itemChange)=\"onSubjectNodeChange($event)\"\r\n />\r\n </div>\r\n <!-- predicate IDs -->\r\n <div>\r\n <cadmus-ref-lookup\r\n label=\"predicate\"\r\n [service]=\"lookupService\"\r\n [baseFilter]=\"{ tag: 'property' }\"\r\n (itemChange)=\"onPredicateNodeChange($event)\"\r\n />\r\n <mat-checkbox [formControl]=\"isNotPred\">not</mat-checkbox>\r\n <!-- notPreds -->\r\n @if (isNotPred.value) {\r\n <div>\r\n <mat-list dense>\r\n @for (n of notPreds.value; track n.id) {\r\n <mat-list-item>\r\n <span>{{ n.label }}</span>\r\n <button type=\"button\" mat-icon-button (click)=\"deleteNotPred(n)\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n </div>\r\n }\r\n <!-- preds -->\r\n @if (!isNotPred.value) {\r\n <div>\r\n <mat-list dense>\r\n @for (n of preds.value; track n.id) {\r\n <mat-list-item>\r\n <span>{{ n.label }}</span>\r\n <button type=\"button\" mat-icon-button (click)=\"deletePred(n)\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n </div>\r\n }\r\n </div>\r\n <!-- object ID -->\r\n <div>\r\n <cadmus-ref-lookup\r\n label=\"object\"\r\n [service]=\"lookupService\"\r\n (itemChange)=\"onObjectNodeChange($event)\"\r\n />\r\n </div>\r\n <!-- sid -->\r\n <div>\r\n <mat-form-field>\r\n <input\r\n matInput\r\n [formControl]=\"sid\"\r\n placeholder=\"sid\"\r\n maxlength=\"500\"\r\n />\r\n </mat-form-field>\r\n \r\n <mat-checkbox [formControl]=\"isSidPrefix\">prefix</mat-checkbox>\r\n </div>\r\n <!-- tag -->\r\n <div>\r\n <mat-form-field>\r\n <input\r\n matInput\r\n [formControl]=\"tag\"\r\n placeholder=\"tag\"\r\n maxlength=\"50\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n <!-- LITERAL -->\r\n <mat-tab label=\"literal\">\r\n <!-- litPattern -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litPattern\" placeholder=\"pattern\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litType -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litType\" placeholder=\"type\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litLanguage-->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litLanguage\" placeholder=\"language\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- minLitNumber, maxLitNumber -->\r\n <div>\r\n <mat-form-field style=\"width: 4em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"minLitNumber\"\r\n placeholder=\"min.\"\r\n />\r\n </mat-form-field>\r\n -\r\n <mat-form-field style=\"width: 4em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"maxLitNumber\"\r\n placeholder=\"max.\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"toolbar\"\r\n style=\"margin-bottom: 10px\"\r\n >\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n [disabled]=\"disabled()\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, model } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { PageEvent, MatPaginator } from '@angular/material/paginator';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatSelect } from '@angular/material/select';\r\nimport { MatOption } from '@angular/material/core';\r\nimport { MatCheckbox } from '@angular/material/checkbox';\r\nimport {\r\n MatChipListbox,\r\n MatChipOption,\r\n MatChipRemove,\r\n} from '@angular/material/chips';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatIconButton } from '@angular/material/button';\r\n\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { GraphNodeLookupService } from '@myrmidon/cadmus-graph-ui';\r\nimport { GraphService, UriNode, NodeSourceType } from '@myrmidon/cadmus-api';\r\n\r\nimport { PagedLinkedNodeFilter } from '../../graph-walker';\r\n\r\n/**\r\n * Linked non-literal node filter.\r\n */\r\n@Component({\r\n selector: 'cadmus-walker-linked-node-filter',\r\n templateUrl: './linked-node-filter.component.html',\r\n styleUrls: ['./linked-node-filter.component.css'],\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatPaginator,\r\n MatFormField,\r\n MatInput,\r\n MatSelect,\r\n MatOption,\r\n MatCheckbox,\r\n RefLookupComponent,\r\n MatChipListbox,\r\n MatChipOption,\r\n MatTooltip,\r\n MatChipRemove,\r\n MatIcon,\r\n MatIconButton,\r\n ],\r\n})\r\nexport class LinkedNodeFilterComponent {\r\n /**\r\n * True if this component is disabled.\r\n */\r\n public readonly disabled = input<boolean>();\r\n\r\n /**\r\n * True if this component should show a pager.\r\n */\r\n public readonly hasPager = input<boolean>(false);\r\n\r\n /**\r\n * The total number of nodes returned from the last\r\n * page fetch operation. Used when hasPager is true.\r\n */\r\n public readonly total = input<number>(0);\r\n\r\n /**\r\n * The filter.\r\n */\r\n public readonly filter = model<PagedLinkedNodeFilter>({\r\n pageNumber: 1,\r\n pageSize: 10,\r\n otherNodeId: 0,\r\n predicateId: 0,\r\n });\r\n\r\n public otherNodeId: number;\r\n public predicateId: number;\r\n public isObject: boolean;\r\n\r\n public pageNumber: FormControl<number>;\r\n public pageSize: FormControl<number>;\r\n public uid: FormControl<string | null>;\r\n public isClass: FormControl<boolean | null>;\r\n public tag: FormControl<string | null>;\r\n public label: FormControl<string | null>;\r\n public sourceType: FormControl<NodeSourceType | null>;\r\n public sid: FormControl<string | null>;\r\n public isSidPrefix: FormControl<boolean>;\r\n public classes: FormControl<UriNode[]>;\r\n\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n public lookupService: GraphNodeLookupService,\r\n private _graphService: GraphService\r\n ) {\r\n this.otherNodeId = 0;\r\n this.predicateId = 0;\r\n this.isObject = false;\r\n // form\r\n this.pageNumber = formBuilder.control(1, { nonNullable: true });\r\n this.pageSize = formBuilder.control(10, { nonNullable: true });\r\n this.uid = formBuilder.control(null);\r\n this.isClass = formBuilder.control(null);\r\n this.tag = formBuilder.control(null);\r\n this.label = formBuilder.control(null);\r\n this.sourceType = formBuilder.control(null);\r\n this.sid = formBuilder.control(null);\r\n this.isSidPrefix = formBuilder.control(false, { nonNullable: true });\r\n this.classes = formBuilder.control([], { nonNullable: true });\r\n\r\n this.form = formBuilder.group({\r\n pageNumber: this.pageNumber,\r\n pageSize: this.pageSize,\r\n uid: this.uid,\r\n isClass: this.isClass,\r\n tag: this.tag,\r\n label: this.label,\r\n sourceType: this.sourceType,\r\n sid: this.sid,\r\n isSidPrefix: this.isSidPrefix,\r\n classes: this.classes,\r\n });\r\n\r\n effect(() => {\r\n this.updateForm(this.filter());\r\n });\r\n }\r\n\r\n private updateForm(filter: PagedLinkedNodeFilter): void {\r\n this.otherNodeId = filter.otherNodeId;\r\n this.predicateId = filter.predicateId;\r\n this.isObject = filter.isObject || false;\r\n\r\n this.pageNumber.setValue(filter.pageNumber);\r\n this.pageSize.setValue(filter.pageSize);\r\n this.uid.setValue(filter.uid || null);\r\n this.isClass.setValue(filter.isClass || null);\r\n this.tag.setValue(filter.tag || null);\r\n this.label.setValue(filter.label || null);\r\n this.sourceType.setValue(filter.sourceType || null);\r\n this.sid.setValue(filter.sid || null);\r\n this.isSidPrefix.setValue(filter.isSidPrefix || false);\r\n\r\n // load the referenced class nodes so we can show them by label\r\n if (filter.classIds?.length) {\r\n this._graphService\r\n .getNodeSet(filter.classIds)\r\n .pipe(take(1))\r\n .subscribe((nodes) => {\r\n this.classes.setValue(nodes.filter((n) => n) as UriNode[]);\r\n this.form.markAsPristine();\r\n });\r\n } else {\r\n this.classes.setValue([]);\r\n this.form.markAsPristine();\r\n }\r\n }\r\n\r\n private getFilter(): PagedLinkedNodeFilter {\r\n return {\r\n pageNumber: +this.pageNumber.value,\r\n pageSize: +this.pageSize.value,\r\n uid: this.uid.value || undefined,\r\n isClass: this.isClass.value || undefined,\r\n tag: this.tag.value || undefined,\r\n label: this.label.value || undefined,\r\n sourceType: this.sourceType.value || undefined,\r\n sid: this.sid.value || undefined,\r\n isSidPrefix: this.isSidPrefix.value ? true : undefined,\r\n classIds: this.classes.value.length\r\n ? this.classes.value.map((n) => n.id)\r\n : undefined,\r\n otherNodeId: this.otherNodeId,\r\n predicateId: this.predicateId,\r\n isObject: this.isObject,\r\n };\r\n }\r\n\r\n public onPageChange(page: PageEvent): void {\r\n this.pageNumber.setValue(page.pageIndex + 1);\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public onClassAdd(node: unknown): void {\r\n if (!node) {\r\n return;\r\n }\r\n const nodes = [...this.classes.value];\r\n nodes.push(node as UriNode);\r\n this.classes.setValue(nodes);\r\n this.classes.updateValueAndValidity();\r\n this.classes.markAsDirty();\r\n }\r\n\r\n public onClassRemove(node: UriNode): void {\r\n const nodes = [...this.classes.value];\r\n const i = nodes.indexOf(node);\r\n if (i > -1) {\r\n nodes.splice(i, 1);\r\n this.classes.setValue(nodes);\r\n this.classes.updateValueAndValidity();\r\n this.classes.markAsDirty();\r\n }\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public apply(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.filter.set(this.getFilter());\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" [attr.disabled]=\"disabled()\">\r\n <!-- paginator -->\r\n @if (hasPager()) {\r\n <mat-paginator\r\n [length]=\"total\"\r\n [pageSize]=\"pageSize.value || 10\"\r\n [pageSizeOptions]=\"[5, 10, 20]\"\r\n (page)=\"onPageChange($event)\"\r\n aria-label=\"Select page\"\r\n />\r\n }\r\n\r\n <!-- label -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"label\" placeholder=\"label\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- uid -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"uid\" placeholder=\"UID\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- isClass -->\r\n <div>\r\n <mat-form-field>\r\n <mat-select [formControl]=\"isClass\" placeholder=\"class\">\r\n <mat-option [value]=\"0\">(any)</mat-option>\r\n <mat-option [value]=\"1\">not-class</mat-option>\r\n <mat-option [value]=\"2\">class</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <!-- tag -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"tag\" placeholder=\"tag\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- sourceType -->\r\n <div>\r\n <mat-form-field>\r\n <mat-select [formControl]=\"sourceType\" placeholder=\"source type\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n <mat-option [value]=\"0\">user</mat-option>\r\n <mat-option [value]=\"1\">item</mat-option>\r\n <mat-option [value]=\"2\">part</mat-option>\r\n <mat-option [value]=\"3\">thesaurus</mat-option>\r\n <mat-option [value]=\"4\">implicit</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- sid -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"sid\" placeholder=\"SID\" />\r\n </mat-form-field>\r\n\r\n <!-- isSidPrefix -->\r\n <mat-checkbox [formControl]=\"isSidPrefix\">prefix</mat-checkbox>\r\n </div>\r\n </div>\r\n <!-- classes -->\r\n <div>\r\n <fieldset>\r\n <legend>classes</legend>\r\n <cadmus-ref-lookup\r\n label=\"class\"\r\n [service]=\"lookupService\"\r\n [baseFilter]=\"{ isClass: true }\"\r\n (itemChange)=\"onClassAdd($event)\"\r\n />\r\n\r\n @if (classes.value.length) {\r\n <mat-chip-listbox>\r\n @for (node of classes.value; track node.id) {\r\n <mat-chip-option\r\n [removable]=\"true\"\r\n (removed)=\"onClassRemove(node)\"\r\n matTooltip=\"{{ node.uri }}\"\r\n >{{ node.label }}\r\n <button type=\"button\" matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-option>\r\n }\r\n </mat-chip-listbox>\r\n }\r\n </fieldset>\r\n </div>\r\n\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"toolbar\"\r\n style=\"margin-bottom: 10px\"\r\n >\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n [disabled]=\"disabled()\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, model } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { forkJoin, from } from 'rxjs';\r\n\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { PageEvent, MatPaginator } from '@angular/material/paginator';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { MatIcon } from '@angular/material/icon';\r\n\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { GraphNodeLookupService } from '@myrmidon/cadmus-graph-ui';\r\nimport { GraphService, UriNode } from '@myrmidon/cadmus-api';\r\n\r\nimport { PagedLinkedLiteralFilter } from '../../graph-walker';\r\n\r\n/**\r\n * Linked literal filter.\r\n */\r\n@Component({\r\n selector: 'cadmus-walker-linked-literal-filter',\r\n templateUrl: './linked-literal-filter.component.html',\r\n styleUrls: ['./linked-literal-filter.component.css'],\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatPaginator,\r\n RefLookupComponent,\r\n MatFormField,\r\n MatInput,\r\n MatIconButton,\r\n MatTooltip,\r\n MatIcon,\r\n ],\r\n})\r\nexport class LinkedLiteralFilterComponent {\r\n /**\r\n * True if this component is disabled.\r\n */\r\n public readonly disabled = input<boolean>();\r\n\r\n /**\r\n * True if this component should show a pager.\r\n */\r\n public readonly hasPager = input<boolean>();\r\n\r\n /**\r\n * The total number of triples returned from the last\r\n * page fetch operation. Used when hasPager is true.\r\n */\r\n public readonly total = input<number>(0);\r\n\r\n /**\r\n * The filter.\r\n */\r\n public readonly filter = model<PagedLinkedLiteralFilter>({\r\n pageNumber: 1,\r\n pageSize: 10,\r\n });\r\n\r\n public pageNumber: FormControl<number>;\r\n public pageSize: FormControl<number>;\r\n public litPattern: FormControl<string | null>;\r\n public litType: FormControl<string | null>;\r\n public litLanguage: FormControl<string | null>;\r\n public minLitNumber: FormControl<number | null>;\r\n public maxLitNumber: FormControl<number | null>;\r\n\r\n public subj: FormControl<UriNode | null>;\r\n public pred: FormControl<UriNode | null>;\r\n\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n public lookupService: GraphNodeLookupService,\r\n private _graphService: GraphService\r\n ) {\r\n this.pageNumber = formBuilder.control(1, { nonNullable: true });\r\n this.pageSize = formBuilder.control(10, { nonNullable: true });\r\n this.litPattern = formBuilder.control(null);\r\n this.litType = formBuilder.control(null);\r\n this.litLanguage = formBuilder.control(null);\r\n this.minLitNumber = formBuilder.control(null);\r\n this.maxLitNumber = formBuilder.control(null);\r\n\r\n this.subj = formBuilder.control(null);\r\n this.pred = formBuilder.control(null);\r\n\r\n this.form = formBuilder.group({\r\n pageNumber: this.pageNumber,\r\n pageSize: this.pageSize,\r\n litPattern: this.litPattern,\r\n litType: this.litType,\r\n litLanguage: this.litLanguage,\r\n minLitNumber: this.minLitNumber,\r\n maxLitNumber: this.maxLitNumber,\r\n subj: this.subj,\r\n pred: this.pred,\r\n });\r\n\r\n effect(() => {\r\n this.updateForm(this.filter());\r\n });\r\n }\r\n\r\n private updateForm(filter: PagedLinkedLiteralFilter): void {\r\n this.pageNumber.setValue(filter.pageNumber);\r\n this.pageSize.setValue(filter.pageSize);\r\n this.litPattern.setValue(filter.literalPattern || null);\r\n this.litType.setValue(filter.literalType || null);\r\n this.litLanguage.setValue(filter.literalLanguage || null);\r\n this.minLitNumber.setValue(filter.minLiteralNumber || null);\r\n this.maxLitNumber.setValue(filter.maxLiteralNumber || null);\r\n\r\n // load the referenced triples so we can show them by label\r\n forkJoin({\r\n s: filter.subjectId\r\n ? this._graphService.getNode(filter.subjectId)\r\n : from([null]),\r\n p: filter.predicateId\r\n ? this._graphService.getNode(filter.predicateId)\r\n : from([]),\r\n }).subscribe((result) => {\r\n this.subj.setValue(result.s);\r\n this.pred.setValue(result.p);\r\n this.form.markAsPristine();\r\n });\r\n }\r\n\r\n private getFilter(): PagedLinkedLiteralFilter {\r\n return {\r\n pageNumber: +this.pageNumber.value,\r\n pageSize: +this.pageSize.value,\r\n literalPattern: this.litPattern.value || undefined,\r\n literalType: this.litType.value || undefined,\r\n literalLanguage: this.litLanguage.value || undefined,\r\n minLiteralNumber: this.minLitNumber.value || undefined,\r\n maxLiteralNumber: this.maxLitNumber.value || undefined,\r\n\r\n subjectId: this.subj.value?.id,\r\n predicateId: this.pred.value?.id,\r\n };\r\n }\r\n\r\n public onSubjectNodeChange(node: unknown): void {\r\n this.subj.setValue(node as UriNode);\r\n }\r\n\r\n public onPredicateNodeChange(node: unknown): void {\r\n this.pred.setValue(node as UriNode);\r\n }\r\n\r\n public onPageChange(page: PageEvent): void {\r\n this.pageNumber.setValue(page.pageIndex + 1);\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public apply(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.filter.set(this.getFilter());\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" [attr.disabled]=\"disabled()\">\r\n <!-- paginator -->\r\n @if (hasPager()) {\r\n <mat-paginator\r\n [length]=\"total()\"\r\n [pageSize]=\"pageSize.value || 10\"\r\n [pageSizeOptions]=\"[5, 10, 20]\"\r\n (page)=\"onPageChange($event)\"\r\n aria-label=\"Select page\"\r\n />\r\n }\r\n\r\n <!-- subject ID -->\r\n <div>\r\n <cadmus-ref-lookup\r\n label=\"subject\"\r\n [service]=\"lookupService\"\r\n (itemChange)=\"onSubjectNodeChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- predicate ID -->\r\n <div>\r\n <cadmus-ref-lookup\r\n label=\"predicate\"\r\n [service]=\"lookupService\"\r\n [baseFilter]=\"{ tag: 'property' }\"\r\n (itemChange)=\"onPredicateNodeChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- LITERAL -->\r\n <!-- litPattern -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litPattern\" placeholder=\"pattern\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litType -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litType\" placeholder=\"type\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litLanguage-->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litLanguage\" placeholder=\"language\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- minLitNumber, maxLitNumber -->\r\n <div>\r\n <mat-form-field style=\"width: 5em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"minLitNumber\"\r\n placeholder=\"min.\"\r\n />\r\n </mat-form-field>\r\n -\r\n <mat-form-field style=\"width: 5em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"maxLitNumber\"\r\n placeholder=\"max.\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"toolbar\"\r\n style=\"margin-bottom: 10px\"\r\n >\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n [disabled]=\"disabled\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { Node as GraphNode } from '@swimlane/ngx-graph';\r\n\r\n/**\r\n * Get the extended label for the specified graph node. This returns the label\r\n * for N nodes, and the uri + \"=\" + the label for P nodes. That's because P\r\n * nodes label is just the count of the triples group, so the predicate ID is\r\n * got from the property node's data uri.\r\n */\r\n@Pipe({ name: 'graphNodeLabel' })\r\nexport class GraphNodeLabelPipe implements PipeTransform {\r\n transform(value: unknown, ...args: unknown[]): unknown {\r\n const node = value as GraphNode;\r\n if (!node?.id || !node?.label) {\r\n return value;\r\n }\r\n if (node.id.startsWith('P') && node.data.uri) {\r\n return `${node.data.uri}=${node.label}`;\r\n }\r\n return node.label;\r\n }\r\n}\r\n","import { BehaviorSubject, forkJoin, Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { Edge, Node as GraphNode } from '@swimlane/ngx-graph';\r\n\r\nimport {\r\n GraphService,\r\n LinkedLiteralFilter,\r\n LinkedNodeFilter,\r\n NodeSourceType,\r\n TripleFilter,\r\n TripleGroup,\r\n UriNode,\r\n UriTriple,\r\n} from '@myrmidon/cadmus-api';\r\n\r\nexport interface PagedTripleFilter extends TripleFilter {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface PagedLinkedLiteralFilter extends LinkedLiteralFilter {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface PagedLinkedNodeFilter extends LinkedNodeFilter {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\n// #region Shapes\r\n// All these shapes will be the data property of a Node/Edge in ngx-graph.\r\n\r\n/**\r\n * Essential graph walker data.\r\n */\r\nexport interface WalkerData {\r\n originId: string;\r\n // https://github.com/swimlane/ngx-graph/issues/312\r\n customColor?: string;\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Graph walker widget data, i.e. a node or a property group.\r\n */\r\nexport interface WalkerWidgetData extends WalkerData {\r\n selected?: boolean;\r\n expanded?: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Graph walker node data.\r\n * ID: \"N\" + nodeid (e.g. \"N3\").\r\n */\r\nexport interface WalkerNodeData extends WalkerWidgetData {\r\n uri: string;\r\n sourceType: NodeSourceType;\r\n isClass?: boolean;\r\n sid?: string;\r\n tag?: string;\r\n outFilter: PagedTripleFilter;\r\n inFilter: PagedTripleFilter;\r\n outTotal?: number;\r\n inTotal?: number;\r\n}\r\n\r\n/**\r\n * Graph walker property group data.\r\n * ID: \"P\" + propertyid + \"N\" + source nodeid (\"P2N3\").\r\n */\r\nexport interface WalkerPropData extends WalkerWidgetData {\r\n uri: string;\r\n outFilter: PagedLinkedNodeFilter;\r\n inFilter: PagedLinkedNodeFilter;\r\n litFilter: PagedLinkedLiteralFilter;\r\n outTotal?: number;\r\n inTotal?: number;\r\n litTotal?: number;\r\n}\r\n\r\n/**\r\n * Graph walker literal node data.\r\n * ID: \"L\" + tripleid (e.g. \"L5\").\r\n */\r\nexport interface WalkerLitData extends WalkerWidgetData {\r\n value: string;\r\n type?: string;\r\n language?: string;\r\n number?: number;\r\n}\r\n\r\n/**\r\n * The total counts of items fetched by each children graph nodes filter.\r\n */\r\nexport interface NodeChildTotals {\r\n pOut: number;\r\n pIn: number;\r\n pLit: number;\r\n nOut: number;\r\n nIn: number;\r\n}\r\n//#endregion\r\n\r\n/**\r\n * Graph walker.\r\n * This class encapsulates data used for interactively exploring a graph\r\n * starting from a designated origin node.\r\n */\r\nexport class GraphWalker {\r\n private readonly _nodes$: BehaviorSubject<GraphNode[]>;\r\n private readonly _edges$: BehaviorSubject<Edge[]>;\r\n // TODO: add clusters\r\n private readonly _loading$: BehaviorSubject<boolean>;\r\n private readonly _error$: BehaviorSubject<string | null>;\r\n private _rootNode?: GraphNode;\r\n\r\n private readonly _selectedNode$: BehaviorSubject<GraphNode | null>;\r\n private readonly _pOutFilter$: BehaviorSubject<PagedLinkedNodeFilter | null>;\r\n private readonly _pInFilter$: BehaviorSubject<PagedLinkedNodeFilter | null>;\r\n private readonly _pLitFilter$: BehaviorSubject<PagedLinkedLiteralFilter | null>;\r\n private readonly _nOutFilter$: BehaviorSubject<PagedTripleFilter | null>;\r\n private readonly _nInFilter$: BehaviorSubject<PagedTripleFilter | null>;\r\n private readonly _childTotals$: BehaviorSubject<NodeChildTotals>;\r\n\r\n /**\r\n * The page size. Default is 10.\r\n */\r\n public pageSize: number;\r\n\r\n /**\r\n * Max length of literal value to show. Default is 30.\r\n */\r\n public maxLiteralLen: number;\r\n\r\n /**\r\n * The nodes of the walker graph, which can represent nodes, literals,\r\n * or property groups. You can easily determine the type of each node\r\n * by looking at the first character of its id (N=node, L=literal,\r\n * P=property).\r\n */\r\n public get nodes$(): Observable<GraphNode[]> {\r\n return this._nodes$.asObservable();\r\n }\r\n\r\n /**\r\n * The edges connecting nodes.\r\n */\r\n public get edges$(): Observable<Edge[]> {\r\n return this._edges$.asObservable();\r\n }\r\n\r\n /**\r\n * True if the walker is loading data.\r\n */\r\n public get loading$(): Observable<boolean> {\r\n return this._loading$.asObservable();\r\n }\r\n\r\n /**\r\n * The last error occurred in communicating with the server, if any.\r\n */\r\n public get error$(): Observable<string | null> {\r\n return this._error$.asObservable();\r\n }\r\n\r\n /**\r\n * The selected node. Only one node at a time can be selected.\r\n */\r\n public get selectedNode$(): Observable<GraphNode | null> {\r\n return this._selectedNode$.asObservable();\r\n }\r\n /**\r\n * The outbound linked nodes filter for the selected P node.\r\n */\r\n public get pOutFilter$(): Observable<PagedLinkedNodeFilter | null> {\r\n return this._pOutFilter$.asObservable();\r\n }\r\n /**\r\n * The inbound linked nodes filter for the selected P node.\r\n */\r\n public get pInFilter$(): Observable<PagedLinkedNodeFilter | null> {\r\n return this._pInFilter$.asObservable();\r\n }\r\n /**\r\n * The literal linked nodes filter for the selected P node.\r\n */\r\n public get pLitFilter$(): Observable<PagedLinkedLiteralFilter | null> {\r\n return this._pLitFilter$.asObservable();\r\n }\r\n /**\r\n * The outbound triples filter for the selected N node.\r\n */\r\n public get nOutFilter$(): Observable<PagedTripleFilter | null> {\r\n return this._nOutFilter$.asObservable();\r\n }\r\n /**\r\n * The inbound triples filter for the selected N node.\r\n */\r\n public get nInFilter$(): Observable<PagedTripleFilter | null> {\r\n return this._nInFilter$.asObservable();\r\n }\r\n /**\r\n * The total items fetched for each filter of the selected node.\r\n */\r\n public get childTotals$(): Observable<NodeChildTotals> {\r\n return this._childTotals$.asObservable();\r\n }\r\n\r\n constructor(private _graphService: GraphService) {\r\n this._nodes$ = new BehaviorSubject<GraphNode[]>([]);\r\n this._edges$ = new BehaviorSubject<Edge[]>([]);\r\n this._loading$ = new BehaviorSubject<boolean>(false);\r\n this._error$ = new BehaviorSubject<string | null>(null);\r\n this._selectedNode$ = new BehaviorSubject<GraphNode | null>(null);\r\n this._pOutFilter$ = new BehaviorSubject<PagedLinkedNodeFilter | null>(null);\r\n this._pInFilter$ = new BehaviorSubject<PagedLinkedNodeFilter | null>(null);\r\n this._pLitFilter$ = new BehaviorSubject<PagedLinkedLiteralFilter | null>(\r\n null\r\n );\r\n this._nOutFilter$ = new BehaviorSubject<PagedTripleFilter | null>(null);\r\n this._nInFilter$ = new BehaviorSubject<PagedTripleFilter | null>(null);\r\n this._childTotals$ = new BehaviorSubject<NodeChildTotals>({\r\n nOut: 0,\r\n nIn: 0,\r\n pOut: 0,\r\n pIn: 0,\r\n pLit: 0,\r\n });\r\n // defaults\r\n this.pageSize = 10;\r\n this.maxLiteralLen = 30;\r\n }\r\n\r\n public getSelectedNode(): GraphNode | null {\r\n return this._selectedNode$.value;\r\n }\r\n\r\n private toggleLoading(on: boolean): void {\r\n if (on) {\r\n this._error$.next(null);\r\n this._loading$.next(true);\r\n } else {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n private setError(error: any): void {\r\n if (error) {\r\n if (typeof error === 'string') {\r\n this._error$.next(error);\r\n console.error(error);\r\n } else {\r\n this._error$.next('Walker error');\r\n console.error('Walker error', error);\r\n }\r\n } else {\r\n this._error$.next('Walker error');\r\n }\r\n }\r\n\r\n private buildNodeId(id: number): string {\r\n return `N${id}`;\r\n }\r\n\r\n /**\r\n * Get the numeric ID of the data node being the source of the graph node\r\n * with the specified ID.\r\n *\r\n * @param id The graph node ID (...N + its data node numeric ID)\r\n * @returns The data node numeric ID.\r\n */\r\n private getNodeNumericId(id: string): number {\r\n const i = id.indexOf('N');\r\n return i === -1 ? 0 : +id.substring(i + 1);\r\n }\r\n\r\n private getPredicateNumericId(id: string): number {\r\n const i = id.indexOf('P');\r\n const j = id.indexOf('N');\r\n return i === -1 ? 0 : +id.substring(i + 1, j);\r\n }\r\n\r\n private buildEdgeId(source: string, target: string): string {\r\n return `E${source}_${target}`;\r\n }\r\n\r\n private buildPropertyId(predicateId: number, nodeId: number): string {\r\n return `P${predicateId}N${nodeId}`;\r\n }\r\n\r\n private buildLiteralId(tripleId: number): string {\r\n return `L${tripleId}`;\r\n }\r\n\r\n private scale(\r\n n: number,\r\n domainMin: number,\r\n domainMax: number,\r\n rangeMin: number,\r\n rangeMax: number\r\n ): number {\r\n // https://stackoverflow.com/questions/5294955/how-to-scale-down-a-range-of-numbers-with-a-known-min-and-max-value\r\n return (\r\n ((domainMax - domainMin) * (n - rangeMin)) / (rangeMax - rangeMin) +\r\n domainMin\r\n );\r\n }\r\n\r\n private addEdgeIfAbsent(edge: Edge, edges: Edge[]): void {\r\n const id = edge.id!;\r\n if (edges.some((e) => e.id === id)) {\r\n return;\r\n }\r\n const i = id.indexOf('_');\r\n if (i > -1) {\r\n const invId = 'E' + id.substring(i + 1) + '_' + id.substring(1, i);\r\n if (edges.some((e) => e.id === invId)) {\r\n return;\r\n }\r\n }\r\n edges.push(edge);\r\n }\r\n\r\n private resetFilters(): void {\r\n this._nOutFilter$.next(null);\r\n this._nInFilter$.next(null);\r\n this._pOutFilter$.next(null);\r\n this._pInFilter$.next(null);\r\n this._pLitFilter$.next(null);\r\n this._childTotals$.next({\r\n nOut: 0,\r\n nIn: 0,\r\n pOut: 0,\r\n pIn: 0,\r\n pLit: 0,\r\n });\r\n }\r\n\r\n /**\r\n * Select the specified node. This also implies updating all the current\r\n * filters, which depend on the selected node.\r\n *\r\n * @param id The node ID or null to deselect the selected node.\r\n */\r\n public selectNode(id: string | null): void {\r\n const node = id ? this._nodes$.value.find((n) => n.id === id) : null;\r\n if (!node) {\r\n this._selectedNode$.next(null);\r\n this.resetFilters();\r\n return;\r\n }\r\n // deselect\r\n const old = this._nodes$.value.find((n) => n.data?.selected);\r\n if (old) {\r\n old.data.selected = undefined;\r\n }\r\n // select\r\n node.data.selected = true;\r\n this._selectedNode$.next(node);\r\n\r\n switch (node.id.charAt(0)) {\r\n case 'N': // non-literal node\r\n const nd = node.data as WalkerNodeData;\r\n this._nOutFilter$.next(nd.outFilter);\r\n this._nInFilter$.next(nd.inFilter);\r\n this._pOutFilter$.next(null);\r\n this._pInFilter$.next(null);\r\n this._pLitFilter$.next(null);\r\n this._childTotals$.next({\r\n nOut: nd.outTotal || 0,\r\n nIn: nd.inTotal || 0,\r\n pOut: 0,\r\n pIn: 0,\r\n pLit: 0,\r\n });\r\n break;\r\n case 'P': // props group\r\n const pd = node.data as WalkerPropData;\r\n this._nOutFilter$.next(null);\r\n this._nInFilter$.next(null);\r\n this._pOutFilter$.next(pd.outFilter);\r\n this._pInFilter$.next(pd.inFilter);\r\n this._pLitFilter$.next(pd.litFilter);\r\n this._childTotals$.next({\r\n nOut: 0,\r\n nIn: 0,\r\n pOut: pd.outTotal || 0,\r\n pIn: pd.inTotal || 0,\r\n pLit: pd.litTotal || 0,\r\n });\r\n break;\r\n case 'L': // literal node\r\n this.resetFilters();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the graph setting its origin to the specified node.\r\n *\r\n * @param id The ID of the origin node to start from (\"root origin\").\r\n */\r\n public reset(id: number): void {\r\n this.toggleLoading(true);\r\n this._graphService\r\n .getNode(id)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: (node) => {\r\n const nodes: GraphNode[] = [];\r\n const data: WalkerNodeData = {\r\n uri: node.uri,\r\n sourceType: node.sourceType,\r\n originId: '', // root origin\r\n customColor: '#F89427',\r\n outFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n },\r\n inFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n },\r\n sid: node.sid,\r\n };\r\n const n: GraphNode = {\r\n id: this.buildNodeId(node.id),\r\n label: node.label || node.uri,\r\n data: data,\r\n };\r\n nodes.push(n);\r\n this._rootNode = n;\r\n\r\n this._edges$.next([]);\r\n this._nodes$.next(nodes);\r\n this.expandNode(n);\r\n },\r\n error: (error) => {\r\n this.setError(error);\r\n },\r\n complete: () => {\r\n this.toggleLoading(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get the source and target graph nodes IDs from the specified edge ID.\r\n *\r\n * @param edgeId The ID of the edge graph node.\r\n * @returns IDs of the source and target graph nodes.\r\n */\r\n private getEdgeEndIds(edgeId: string): string[] | null {\r\n const m = new RegExp('^E([^_]+)_(.+)$').exec(edgeId);\r\n return m ? [m[1], m[2]] : null;\r\n }\r\n\r\n /**\r\n * Remove all the nodes with the specified origin node ID.\r\n *\r\n * @param originId The ID of the origin graph node.\r\n * @param nodes The nodes array to remove nodes from.\r\n * @param removedIds The IDs of all the removed nodes.\r\n */\r\n private removeDescendantNodes(\r\n originId: string,\r\n nodes: GraphNode[],\r\n removedIds: Set<string>\r\n ) {\r\n const ids = new Set<string>();\r\n for (let i = nodes.length - 1; i > -1; i--) {\r\n if (nodes[i].data.originId === originId) {\r\n ids.add(nodes[i].id);\r\n nodes.splice(i, 1);\r\n }\r\n }\r\n\r\n // recurse for each removed node\r\n // (edges never derive from other edges directly)\r\n ids.forEach((id) => {\r\n this.removeDescendantNodes(id, nodes, removedIds);\r\n });\r\n\r\n // update the received IDs set\r\n ids.forEach((id) => {\r\n removedIds.add(id);\r\n });\r\n }\r\n\r\n /**\r\n * Remove all the children graph nodes of the specified origin graph node.\r\n *\r\n * @param originId The ID of the origin graph node.\r\n * @param nodes The nodes array to remove nodes from.\r\n * @param edges The edges array to remove edges from.\r\n */\r\n private removeChildren(\r\n originId: string,\r\n nodes: GraphNode[],\r\n edges: Edge[]\r\n ): void {\r\n const selectedId = this._selectedNode$.value?.id;\r\n\r\n // remove all the nodes whose origin ID matches,\r\n // collecting their IDs\r\n const removedIds: Set<string> = new Set<string>();\r\n this.removeDescendantNodes(originId, nodes, removedIds);\r\n\r\n // remove all the affected edges\r\n for (let i = edges.length - 1; i > -1; i--) {\r\n const endIds = this.getEdgeEndIds(edges[i].id!);\r\n if (\r\n endIds?.length &&\r\n (removedIds.has(endIds[0]) || removedIds.has(endIds[1]))\r\n ) {\r\n edges.splice(i, 1);\r\n }\r\n }\r\n\r\n // if the removed node was the selected one, select the root origin\r\n if (selectedId && removedIds.has(selectedId)) {\r\n this.selectNode(this._rootNode!.id);\r\n }\r\n }\r\n\r\n /**\r\n * Build a new graph node representing a property.\r\n *\r\n * @param sourceId The source node ID.\r\n * @param group The triple group emitting this node.\r\n * @returns A new graph node.\r\n */\r\n private buildPropertyNode(sourceId: string, group: TripleGroup): GraphNode {\r\n const nid = this.getNodeNumericId(sourceId);\r\n const data: WalkerPropData = {\r\n originId: sourceId,\r\n uri: group.predicateUri,\r\n customColor: '#FF5619',\r\n outFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n otherNodeId: nid,\r\n predicateId: group.predicateId,\r\n },\r\n inFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n otherNodeId: nid,\r\n predicateId: group.predicateId,\r\n },\r\n litFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n predicateId: group.predicateId,\r\n },\r\n };\r\n\r\n return {\r\n id: this.buildPropertyId(group.predicateId, nid),\r\n label: group.count.toString(),\r\n data: data,\r\n };\r\n }\r\n\r\n /**\r\n * Expand the specified node, by loading its property groups.\r\n *\r\n * @param node The node to expand.\r\n * @param outFilter The properties to update for the output filter.\r\n * @param inFilter The properties to update for the input filter.\r\n */\r\n public expandNode(\r\n node: GraphNode,\r\n outFilter?: Partial<PagedTripleFilter> | null,\r\n inFilter?: Partial<PagedTripleFilter> | null\r\n ): void {\r\n // prepare filters\r\n const nid = this.getNodeNumericId(node.id);\r\n // outbound: node=S\r\n const outf: PagedTripleFilter = outFilter\r\n ? Object.assign(node.data.outFilter, outFilter, {\r\n subjectId: nid,\r\n })\r\n : {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n subjectId: nid,\r\n };\r\n // inbound: node=O\r\n const inf: PagedTripleFilter = inFilter\r\n ? Object.assign(node.data.inFilter, inFilter, {\r\n objectId: nid,\r\n })\r\n : {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n objectId: nid,\r\n };\r\n\r\n // load\r\n this.toggleLoading(true);\r\n const nodes = [...this._nodes$.value];\r\n const edges = [...this._edges$.value];\r\n\r\n forkJoin({\r\n outs: this._graphService.getTripleGroups(\r\n outf.pageNumber,\r\n outf.pageSize,\r\n outf\r\n ),\r\n ins: this._graphService.getTripleGroups(\r\n inf.pageNumber,\r\n inf.pageSize,\r\n inf\r\n ),\r\n }).subscribe({\r\n next: (result) => {\r\n node.data.expanded = true;\r\n\r\n // update origin's filters\r\n node.data.outFilter = outf;\r\n node.data.inFilter = inf;\r\n\r\n // remove previous children\r\n this.removeChildren(node.id, nodes, edges);\r\n\r\n // add outbound children\r\n node.data.outTotal = result.outs.total;\r\n for (let i = 0; i < result.outs.items.length; i++) {\r\n const group = result.outs.items[i];\r\n const prop = this.buildPropertyNode(node.id, group);\r\n // when expanding a node (e.g. N17) into props, the prop's ID is\r\n // P + predicate ID + N + origin node ID (e.g. P30N17).\r\n // This prop node can then be expanded, too, thus producing\r\n // a node with ID = N + node ID. When this in turn gets expanded,\r\n // it will produce also the prop node it comes from, which\r\n // must not be re-inserted in the graph. This node in the new\r\n // expansion context will get ID from the source node, which\r\n // is different from the node at the other end of the prop node:\r\n // this was e.g. N17, while the new node is e.g. N18. So, the\r\n // prop previously identified as P30N17 would now be identified\r\n // as P30N18, thus producing a duplicate. To avoid this, we\r\n // calculate an alias ID from the origin's origin: for N18,\r\n // its origin being P30N17, this will be N17. This produces an\r\n // alias P30N17, which being already present will avoid duplicates.\r\n // const aliasId = `P${group.predicateId}N${this.getNodeNumericId(\r\n // node.data.originId\r\n // )}`;\r\n // if (!nodes.some((n) => n.id === prop.id || n.id === aliasId)) {\r\n if (!nodes.some((n) => n.id === prop.id)) {\r\n nodes.push(prop);\r\n\r\n // edge from origin node to object property\r\n const edge = {\r\n id: this.buildEdgeId(node.id, prop.id),\r\n label: group.predicateUri,\r\n source: node.id,\r\n target: prop.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n }\r\n\r\n // add inbound children\r\n node.data.inTotal = result.ins.total;\r\n for (let i = 0; i < result.ins.items.length; i++) {\r\n const g = result.ins.items[i];\r\n // subject property\r\n const p = this.buildPropertyNode(node.id, g);\r\n // edge from object property to origin node\r\n const edge = {\r\n id: this.buildEdgeId(p.id, node.id),\r\n label: g.predicateUri,\r\n source: p.id,\r\n target: node.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n\r\n // do not add an edge having the same source P and target N,\r\n // whatever the P's source node\r\n const r = new RegExp(\r\n '^EP' + g.predicateId + 'N[0-9]+_' + node.id + '$'\r\n );\r\n if (!edges.some((e) => r.test(e.id!))) {\r\n if (!nodes.some((n) => n.id === p.id)) {\r\n nodes.push(p);\r\n }\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n }\r\n\r\n // update\r\n this._nodes$.next(nodes);\r\n this._edges$.next(edges);\r\n },\r\n error: (error) => {\r\n node.data.error = 'Error loading properties';\r\n this._nodes$.next(nodes);\r\n this.setError(error);\r\n },\r\n complete: () => {\r\n this.toggleLoading(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Expand the selected node, by loading its property groups.\r\n *\r\n * @param outFilter The properties to update for the output filter.\r\n * @param inFilter The properties to update for the input filter.\r\n */\r\n public expandSelectedNode(\r\n outFilter?: Partial<PagedTripleFilter> | null,\r\n inFilter?: Partial<PagedTripleFilter> | null\r\n ): void {\r\n if (\r\n !this._selectedNode$.value ||\r\n !this._selectedNode$.value.id.startsWith('N')\r\n ) {\r\n return;\r\n }\r\n const node = this._selectedNode$.value;\r\n this.expandNode(node, outFilter, inFilter);\r\n }\r\n\r\n private buildLiteralLabel(triple: UriTriple): string {\r\n let value = triple.objectLiteral || '';\r\n if (this.maxLiteralLen && value.length > this.maxLiteralLen) {\r\n value = value.substring(0, this.maxLiteralLen) + '\\u2026';\r\n }\r\n return value;\r\n }\r\n\r\n private buildNonLiteralNode(sourceId: string, node: UriNode): GraphNode {\r\n const nid = this.getNodeNumericId(sourceId);\r\n const data: WalkerNodeData = {\r\n originId: sourceId,\r\n customColor: '#80ff95',\r\n uri: node.uri,\r\n sourceType: node.sourceType,\r\n isClass: node.isClass,\r\n sid: node.sid,\r\n tag: node.tag,\r\n outFilter: {\r\n pageNumber: 0,\r\n pageSize: this.pageSize,\r\n subjectId: nid,\r\n },\r\n inFilter: {\r\n pageNumber: 0,\r\n pageSize: this.pageSize,\r\n objectId: nid,\r\n },\r\n };\r\n return {\r\n id: this.buildNodeId(node.id),\r\n label: node.label,\r\n data: data,\r\n };\r\n }\r\n\r\n private buildLiteralNode(sourceId: string, triple: UriTriple): GraphNode {\r\n const data: WalkerLitData = {\r\n originId: sourceId,\r\n customColor: '#ebe2e0',\r\n value: triple.objectLiteral || '',\r\n type: triple.literalType,\r\n language: triple.literalLanguage,\r\n number: triple.literalNumber,\r\n };\r\n return {\r\n id: this.buildLiteralId(triple.id),\r\n label: this.buildLiteralLabel(triple),\r\n data: data,\r\n };\r\n }\r\n\r\n /**\r\n * Expand the currently selected properties group node, by loading its\r\n * outbound nodes, inbound nodes, and literal nodes.\r\n *\r\n * @param node The property group node to expand.\r\n * @param outFilter The properties to update for the outbound nodes filter.\r\n * @param inFilter The properties to update for the inbound nodes filter.\r\n * @param litFilter The properties to update for the literal nodes filter.\r\n */\r\n public expandProperty(\r\n node: GraphNode,\r\n outFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n inFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n litFilter?: Partial<PagedLinkedLiteralFilter> | null\r\n ): void {\r\n // prepare filters\r\n const nid = this.getNodeNumericId(node.id);\r\n const data: WalkerPropData = node.data;\r\n const outf: PagedLinkedNodeFilter = Object.assign(\r\n data.outFilter,\r\n outFilter || {},\r\n { isObject: true }\r\n );\r\n const inf: PagedLinkedNodeFilter = Object.assign(\r\n data.inFilter,\r\n inFilter || {},\r\n {\r\n isObject: false,\r\n }\r\n );\r\n const litf: PagedLinkedLiteralFilter = Object.assign(\r\n data.litFilter,\r\n litFilter || {},\r\n { subjectId: nid, predicateId: this.getPredicateNumericId(node.id) }\r\n );\r\n\r\n // load\r\n this.toggleLoading(true);\r\n const nodes = [...this._nodes$.value];\r\n const edges = [...this._edges$.value];\r\n\r\n forkJoin({\r\n outs: this._graphService.getLinkedNodes(\r\n outf.pageNumber,\r\n outf.pageSize,\r\n outf\r\n ),\r\n ins: this._graphService.getLinkedNodes(inf.pageNumber, inf.pageSize, inf),\r\n lits: this._graphService.getLinkedLiterals(\r\n litf.pageNumber,\r\n litf.pageSize,\r\n litf\r\n ),\r\n }).subscribe({\r\n next: (result) => {\r\n node.data.expanded = true;\r\n\r\n // update origin's filters\r\n node.data.outFilter = outf;\r\n node.data.inFilter = inf;\r\n node.data.litFilter = litf;\r\n\r\n // remove previous children\r\n this.removeChildren(node.id, nodes, edges);\r\n\r\n // add outbound children\r\n node.data.outTotal = result.outs.total;\r\n for (let i = 0; i < result.outs.items.length; i++) {\r\n const child = result.outs.items[i];\r\n const obj = this.buildNonLiteralNode(node.id, child);\r\n if (!nodes.some((n) => n.id === obj.id)) {\r\n nodes.push(obj);\r\n }\r\n // edge from property to non literal object node\r\n const edge = {\r\n id: this.buildEdgeId(node.id, obj.id),\r\n label: '',\r\n source: node.id,\r\n target: obj.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n\r\n // add inbound children\r\n node.data.inTotal = result.ins.total;\r\n for (let i = 0; i < result.ins.items.length; i++) {\r\n const child = result.ins.items[i];\r\n const subj = this.buildNonLiteralNode(node.id, child);\r\n if (!nodes.some((n) => n.id === subj.id)) {\r\n nodes.push(subj);\r\n }\r\n // edge from subject node to property\r\n const edge = {\r\n id: this.buildEdgeId(subj.id, node.id),\r\n label: '',\r\n source: subj.id,\r\n target: node.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n\r\n // add literal children\r\n node.data.litTotal = result.lits.total;\r\n for (let i = 0; i < result.lits.items.length; i++) {\r\n const triple = result.lits.items[i];\r\n const lit = this.buildLiteralNode(node.id, triple);\r\n if (!nodes.some((n) => n.id === lit.id)) {\r\n nodes.push(lit);\r\n }\r\n\r\n // edge from property to literal\r\n const edge = {\r\n id: this.buildEdgeId(node.id, lit.id),\r\n label: lit.data.literalType || '',\r\n source: node.id,\r\n target: lit.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n\r\n // update\r\n this._nodes$.next(nodes);\r\n this._edges$.next(edges);\r\n },\r\n error: (error) => {\r\n node.data.error = 'Error loading nodes';\r\n this._nodes$.next(nodes);\r\n this.setError(error);\r\n },\r\n complete: () => {\r\n this.toggleLoading(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Expand the currently selected properties group node, by loading its\r\n * outbound nodes, inbound nodes, and literal nodes. If there is no\r\n * selection, or the selected node is not a properties group node, nothing\r\n * is done.\r\n *\r\n * @param outFilter The properties to update for the outbound nodes filter.\r\n * @param inFilter The properties to update for the inbound nodes filter.\r\n * @param litFilter The properties to update for the literal nodes filter.\r\n */\r\n public expandSelectedProperty(\r\n outFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n inFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n litFilter?: Partial<PagedLinkedLiteralFilter> | null\r\n ): void {\r\n if (\r\n !this._selectedNode$.value ||\r\n !this._selectedNode$.value.id.startsWith('P')\r\n ) {\r\n return;\r\n }\r\n const node = this._selectedNode$.value;\r\n this.expandProperty(node, outFilter, inFilter, litFilter);\r\n }\r\n\r\n /**\r\n * Toggle the specified node by expanding or collapsing it.\r\n *\r\n * @param node The node to toggle.\r\n */\r\n public toggleNode(node: GraphNode): void {\r\n if (node.data.expanded) {\r\n const nodes = [...this._nodes$.value];\r\n const edges = [...this._edges$.value];\r\n this.removeChildren(node.id, nodes, edges);\r\n node.data.expanded = undefined;\r\n this._nodes$.next(nodes);\r\n this._edges$.next(edges);\r\n } else {\r\n if (node.id.startsWith('N')) {\r\n this.expandNode(node);\r\n } else if (node.id.startsWith('P')) {\r\n this.expandProperty(node);\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport { AsyncPipe } from '@angular/common';\r\nimport { Observable, Subject, Subscription, take } from 'rxjs';\r\n\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatProgressBar } from '@angular/material/progress-bar';\r\nimport { MatTabGroup, MatTab, MatTabLabel } from '@angular/material/tabs';\r\n\r\nimport {\r\n Edge,\r\n Node as GraphNode,\r\n NgxGraphZoomOptions,\r\n GraphModule,\r\n} from '@swimlane/ngx-graph';\r\n\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { GraphService } from '@myrmidon/cadmus-api';\r\n\r\nimport { TripleFilterComponent } from '../triple-filter/triple-filter.component';\r\nimport { LinkedNodeFilterComponent } from '../linked-node-filter/linked-node-filter.component';\r\nimport { LinkedLiteralFilterComponent } from '../linked-literal-filter/linked-literal-filter.component';\r\nimport { GraphNodeLabelPipe } from '../../pipes/graph-node-label.pipe';\r\nimport {\r\n GraphWalker,\r\n NodeChildTotals,\r\n PagedLinkedLiteralFilter,\r\n PagedLinkedNodeFilter,\r\n PagedTripleFilter,\r\n} from '../../graph-walker';\r\n\r\n/**\r\n * Graph walker component. This starts from a given node, and let users\r\n * walk along edges to discover new nodes.\r\n */\r\n@Component({\r\n selector: 'cadmus-graph-walker',\r\n templateUrl: './graph-walker.component.html',\r\n styleUrls: ['./graph-walker.component.css'],\r\n imports: [\r\n GraphModule,\r\n MatIconButton,\r\n MatTooltip,\r\n MatIcon,\r\n MatProgressBar,\r\n MatTabGroup,\r\n MatTab,\r\n MatTabLabel,\r\n TripleFilterComponent,\r\n LinkedNodeFilterComponent,\r\n LinkedLiteralFilterComponent,\r\n AsyncPipe,\r\n GraphNodeLabelPipe,\r\n ],\r\n})\r\nexport class GraphWalkerComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private readonly _walker: GraphWalker;\r\n\r\n /**\r\n * The root origin node ID.\r\n */\r\n public readonly nodeId = input<number>(0);\r\n\r\n /**\r\n * True if user can pick a node from the graph.\r\n */\r\n public readonly canPick = input<boolean>();\r\n\r\n /**\r\n * True if user can move to the source of a picked node when\r\n * shift-clicking it.\r\n */\r\n public readonly canMoveToSource = input<boolean>();\r\n\r\n /**\r\n * Emitted when a graph node is picked by user.\r\n */\r\n public readonly nodePick = output<GraphNode>();\r\n\r\n /**\r\n * Emitted when the user requests to move to the source of a picked node.\r\n */\r\n public readonly moveToSource = output<GraphNode>();\r\n\r\n // graph\r\n public nodes$: Observable<GraphNode[]>;\r\n public edges$: Observable<Edge[]>;\r\n public loading$: Observable<boolean>;\r\n public error$: Observable<string | null>;\r\n // selected node\r\n public selectedNode$: Observable<GraphNode | null>;\r\n public pOutFilter$: Observable<PagedLinkedNodeFilter | null>;\r\n public pInFilter$: Observable<PagedLinkedNodeFilter | null>;\r\n public pLitFilter$: Observable<PagedLinkedLiteralFilter | null>;\r\n public nOutFilter$: Observable<PagedTripleFilter | null>;\r\n public nInFilter$: Observable<PagedTripleFilter | null>;\r\n public childTotals$: Observable<NodeChildTotals>;\r\n\r\n // ngx-graph actions\r\n public update$: Subject<boolean> = new Subject();\r\n public center$: Subject<boolean> = new Subject();\r\n public zoomToFit$: Subject<NgxGraphZoomOptions> = new Subject();\r\n\r\n constructor(graphService: GraphService, private _dialog: DialogService) {\r\n this._walker = new GraphWalker(graphService);\r\n\r\n this.nodes$ = this._walker.nodes$;\r\n this.edges$ = this._walker.edges$;\r\n this.loading$ = this._walker.loading$;\r\n this.error$ = this._walker.error$;\r\n\r\n this.selectedNode$ = this._walker.selectedNode$;\r\n this.pOutFilter$ = this._walker.pOutFilter$;\r\n this.pInFilter$ = this._walker.pInFilter$;\r\n this.pLitFilter$ = this._walker.pLitFilter$;\r\n this.nOutFilter$ = this._walker.nOutFilter$;\r\n this.nInFilter$ = this._walker.nInFilter$;\r\n this.childTotals$ = this._walker.childTotals$;\r\n\r\n effect(() => {\r\n const id = this.nodeId();\r\n if (id) {\r\n this.reset(id);\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._sub = this.update$.subscribe((_) => {\r\n this.onReset();\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public onNodeSelect(node: GraphNode): void {\r\n this._walker.selectNode(node.id);\r\n }\r\n\r\n private reset(id: number): void {\r\n this._walker.reset(id);\r\n }\r\n\r\n public onReset(): void {\r\n if (!this.nodeId()) {\r\n return;\r\n }\r\n this._dialog\r\n .confirm('Reset', 'Reset the whole graph?')\r\n .pipe(take(1))\r\n .subscribe((yes) => {\r\n if (yes) {\r\n this.reset(this.nodeId());\r\n }\r\n });\r\n }\r\n\r\n public onNodeDblClick(node: GraphNode): void {\r\n this._walker.toggleNode(node);\r\n }\r\n\r\n public onPOutFilterChange(filter: PagedLinkedNodeFilter): void {\r\n this._walker.expandSelectedProperty(filter);\r\n }\r\n\r\n public onPInFilterChange(filter: PagedLinkedNodeFilter): void {\r\n this._walker.expandSelectedProperty(null, filter);\r\n }\r\n\r\n public onPLitFilterChange(filter: PagedLinkedLiteralFilter): void {\r\n this._walker.expandSelectedProperty(null, null, filter);\r\n }\r\n\r\n public onNOutFilterChange(filter: PagedTripleFilter): void {\r\n this._walker.expandSelectedNode(filter);\r\n }\r\n\r\n public onNInFilterChange(filter: PagedTripleFilter): void {\r\n this._walker.expandSelectedNode(null, filter);\r\n }\r\n\r\n public pickSelectedNode(event: MouseEvent): void {\r\n const node = this._walker.getSelectedNode();\r\n if (!node) {\r\n return;\r\n }\r\n if (this.canMoveToSource() && event.shiftKey) {\r\n if (node.data.sid) {\r\n this.moveToSource.emit(node);\r\n }\r\n } else {\r\n this.nodePick.emit(node);\r\n }\r\n }\r\n}\r\n","<div id=\"container\">\r\n <!-- graph -->\r\n <div id=\"graph\">\r\n <ngx-graph\r\n class=\"chart-container\"\r\n [showMiniMap]=\"true\"\r\n [links]=\"(edges$ | async) || []\"\r\n [nodes]=\"(nodes$ | async) || []\"\r\n [update$]=\"update$\"\r\n [center$]=\"center$\"\r\n [zoomToFit$]=\"zoomToFit$\"\r\n layout=\"colaForceDirected\"\r\n (select)=\"onNodeSelect($event)\"\r\n >\r\n <ng-template #defsTemplate>\r\n <svg:marker\r\n id=\"arrow\"\r\n viewBox=\"0 -5 10 10\"\r\n refX=\"8\"\r\n refY=\"0\"\r\n markerWidth=\"4\"\r\n markerHeight=\"4\"\r\n orient=\"auto\"\r\n >\r\n <svg:path d=\"M0,-5L10,0L0,5\" class=\"arrow-head\" />\r\n </svg:marker>\r\n </ng-template>\r\n\r\n <!-- cluster template -->\r\n <ng-template #clusterTemplate let-cluster>\r\n <svg:g class=\"node cluster\">\r\n <svg:rect\r\n rx=\"5\"\r\n ry=\"5\"\r\n [attr.width]=\"cluster.dimension.width\"\r\n [attr.height]=\"cluster.dimension.height\"\r\n [attr.fill]=\"cluster.data.color\"\r\n />\r\n </svg:g>\r\n </ng-template>\r\n\r\n <!-- node template -->\r\n <ng-template #nodeTemplate let-node>\r\n <svg:g class=\"node\" (dblclick)=\"onNodeDblClick(node)\">\r\n <svg:rect\r\n [class.selected]=\"node.data?.selected\"\r\n [attr.width]=\"node.dimension.width\"\r\n [attr.height]=\"node.dimension.height\"\r\n [attr.fill]=\"node.data.customColor || node.data.color\"\r\n />\r\n <svg:text\r\n alignment-baseline=\"central\"\r\n [attr.x]=\"10\"\r\n [attr.y]=\"node.dimension.height / 2\"\r\n >\r\n {{ node.label }}\r\n </svg:text>\r\n </svg:g>\r\n </ng-template>\r\n\r\n <!-- link template -->\r\n <ng-template #linkTemplate let-link>\r\n <svg:g class=\"edge\">\r\n <svg:path\r\n class=\"line\"\r\n stroke-width=\"2\"\r\n marker-end=\"url(#arrow)\"\r\n ></svg:path>\r\n <svg:text class=\"edge-label\" text-anchor=\"middle\">\r\n <textPath\r\n class=\"text-path\"\r\n [attr.href]=\"'#' + link.id\"\r\n [style.dominant-baseline]=\"link.dominantBaseline\"\r\n startOffset=\"50%\"\r\n >\r\n {{ link.label }}\r\n </textPath>\r\n </svg:text>\r\n </svg:g>\r\n </ng-template>\r\n </ngx-graph>\r\n </div>\r\n\r\n <!-- tools -->\r\n <div id=\"tools\">\r\n <div id=\"bar\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Center\"\r\n (click)=\"center$.next(true)\"\r\n >\r\n <mat-icon>filter_center_focus</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Zoom to fit\"\r\n (click)=\"zoomToFit$.next({ force: true })\"\r\n >\r\n <mat-icon>fit_screen</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Reset\"\r\n (click)=\"update$.next(true)\"\r\n >\r\n <mat-icon class=\"mat-warn\">restart_alt</mat-icon>\r\n </button>\r\n @if (nodes$ | async; as nodes) {\r\n <span class=\"muted\"\r\n >N:{{ nodes.length }} E:{{ (edges$ | async)?.length }}</span\r\n >\r\n } @if (selectedNode$ | async; as selectedNode) {\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Toggle the selected node\"\r\n [disabled]=\"!selectedNode\"\r\n (click)=\"onNodeDblClick(selectedNode)\"\r\n >\r\n <mat-icon class=\"mat-primary\">unfold_more</mat-icon>\r\n </button>\r\n } @if (canPick()) {\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [matTooltip]=\"\r\n canMoveToSource()\r\n ? 'Pick selected node or (shift) its source'\r\n : 'Pick the selected node'\r\n \"\r\n [disabled]=\"!(selectedNode$ | async)\"\r\n (click)=\"pickSelectedNode($event)\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n <!-- progress -->\r\n <div id=\"progress\">\r\n @if (loading$ | async) {\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div id=\"filters\">\r\n @if (selectedNode$ | async; as node) {\r\n <div id=\"filter-head\">\r\n <span [style.color]=\"node.data.color || 'black'\">⬤</span>\r\n <span style=\"margin-left: 6px\" matTooltip=\"{{ node.data.uri }}\">{{\r\n node | graphNodeLabel\r\n }}</span>\r\n <span class=\"muted\" style=\"margin-left: 8px; font-size: 90%\">{{\r\n node.id\r\n }}</span>\r\n </div>\r\n }\r\n <mat-tab-group>\r\n <!-- N-outs -->\r\n @if (nOutFilter$ | async; as nOutFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n N<mat-icon>logout</mat-icon>\r\n </ng-template>\r\n <cadmus-walker-triple-filter\r\n [filter]=\"nOutFilter\"\r\n (filterChange)=\"onNOutFilterChange($event)\"\r\n ></cadmus-walker-triple-filter>\r\n </mat-tab>\r\n }\r\n <!-- N-ins -->\r\n @if (nInFilter$ | async; as nInFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label> N<mat-icon>login</mat-icon> </ng-template>\r\n <cadmus-walker-triple-filter\r\n [filter]=\"nInFilter\"\r\n (filterChange)=\"onNInFilterChange($event)\"\r\n ></cadmus-walker-triple-filter>\r\n </mat-tab>\r\n }\r\n <!-- P-outs -->\r\n @if (pOutFilter$ | async; as pOutFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n P<mat-icon>logout</mat-icon>\r\n </ng-template>\r\n <cadmus-walker-linked-node-filter\r\n [filter]=\"pOutFilter\"\r\n (filterChange)=\"onPOutFilterChange($event)\"\r\n />\r\n </mat-tab>\r\n }\r\n <!-- P-ins -->\r\n @if (pInFilter$ | async; as pInFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label> P<mat-icon>login</mat-icon> </ng-template>\r\n <cadmus-walker-linked-node-filter\r\n [filter]=\"pInFilter\"\r\n (filterChange)=\"onPInFilterChange($event)\"\r\n />\r\n </mat-tab>\r\n }\r\n <!-- P-lit -->\r\n @if (pLitFilter$ | async; as pLitFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n P<mat-icon>exit_to_app</mat-icon>\r\n </ng-template>\r\n <cadmus-walker-linked-literal-filter\r\n [filter]=\"pLitFilter\"\r\n (filterChange)=\"onPLitFilterChange($event)\"\r\n />\r\n </mat-tab>\r\n }\r\n </mat-tab-group>\r\n </div>\r\n </div>\r\n</div>\r\n","/*\r\n * Public API Surface of cadmus-graph-ui-ex\r\n */\r\n\r\nexport * from './lib/components/graph-walker/graph-walker.component';\r\nexport * from './lib/components/linked-literal-filter/linked-literal-filter.component';\r\nexport * from './lib/components/linked-node-filter/linked-node-filter.component';\r\nexport * from './lib/components/triple-filter/triple-filter.component';\r\n\r\nexport * from './lib/pipes/graph-node-label.pipe';\r\n\r\nexport * from './lib/graph-walker';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["take","i1","i2","i3"],"mappings":"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"}