UNPKG

@myrmidon/cadmus-graph-ui-ex

Version:

Cadmus - extensions to semantic graph components.

1 lines 135 kB
{"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        &nbsp;\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'\">&#x2b24;</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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"}