Skip to main content

Overview

The Venzia Datalinks library provides two dialog components for managing datalinks:
  • DatalinkDialogComponent: Main dialog for viewing and managing all datalinks on a node
  • AddDatalinkDialogComponent: Dialog for searching and selecting datalink entries to add

DatalinkDialogComponent

Main dialog component that displays all datalinks associated with an Alfresco node.

Import

import { DatalinkDialogComponent } from 'venzia-datalink';

Selector

host: { class: 'aqua-datalink-dialog' }

Opening the Dialog

import { Component } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { DatalinkDialogComponent } from 'venzia-datalink';

@Component({
  selector: 'app-my-component',
  template: `
    <button (click)="openDatalinkDialog()">Manage Datalinks</button>
  `
})
export class MyComponent {
  nodeId = 'workspace://SpacesStore/abc-123';

  constructor(private dialog: MatDialog) {}

  openDatalinkDialog() {
    this.dialog.open(DatalinkDialogComponent, {
      data: { nodeId: this.nodeId },
      panelClass: 'aca-permissions-dialog-panel',
      width: '800px'
    });
  }
}

Dialog Data

nodeId
string
required
The ID of the Alfresco node to display datalinks for

Properties

nodeId
string
ID of the node being managed
currentSelection
any[]
Currently selected datalink rows
Reference to the child datalink list component

Methods

ngAfterViewInit

Lifecycle hook that subscribes to reload events from the datalink list.
ngAfterViewInit(): void

onSelect

Handles selection changes in the datalink list.
onSelect(selectionList: any[]): void
selectionList
any[]
Array of selected datalink row objects

onError

Handles errors from the datalink list.
onError(errorMessage: string): void
errorMessage
string
Error message to display

openAddDataLinkDialog

Opens the add datalink dialog.
openAddDataLinkDialog(event: Event): void

onRemoveSelectionRows

Removes selected rows from the datalink.
onRemoveSelectionRows(event: Event): void

reload

Reloads the dialog with fresh data.
reload(): void

Example Usage

import { Component } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { DatalinkDialogComponent } from 'venzia-datalink';
import { Store } from '@ngrx/store';
import { AppStore } from '@alfresco/aca-shared/store';

@Component({
  selector: 'app-document-actions',
  template: `
    <button 
      mat-button 
      [disabled]="!selectedNode"
      (click)="manageDatalinks()">
      <mat-icon>link</mat-icon>
      Manage Datalinks
    </button>
  `
})
export class DocumentActionsComponent {
  selectedNode: any;

  constructor(
    private dialog: MatDialog,
    private store: Store<AppStore>
  ) {}

  manageDatalinks() {
    if (!this.selectedNode) return;

    const dialogRef = this.dialog.open(DatalinkDialogComponent, {
      data: { nodeId: this.selectedNode.id },
      panelClass: 'aca-permissions-dialog-panel',
      width: '800px',
      height: '600px',
      disableClose: false
    });

    dialogRef.afterClosed().subscribe(result => {
      console.log('Dialog closed with result:', result);
      // Refresh your view if needed
    });
  }
}

AddDatalinkDialogComponent

Dialog component for searching and selecting external data to add as datalinks.

Import

import { AddDatalinkDialogComponent } from 'venzia-datalink';

Selector

'aqua-datalink-add-dialog'

Opening the Dialog

This dialog is typically opened via the VenziaDatalinkSearchDialogService, but can also be opened directly:
import { Component } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { AddDatalinkDialogComponent } from 'venzia-datalink';
import { Subject } from 'rxjs';

@Component({
  selector: 'app-my-component',
  template: `<button (click)="openAddDialog()">Add Data</button>`
})
export class MyComponent {
  constructor(private dialog: MatDialog) {}

  openAddDialog() {
    const confirm = new Subject();
    
    confirm.subscribe({
      next: (selections) => {
        console.log('User selected:', selections);
      },
      complete: () => {
        console.log('Dialog closed');
      }
    });

    this.dialog.open(AddDatalinkDialogComponent, {
      data: {
        nodeId: 'workspace://SpacesStore/abc-123',
        dataLink: this.datalinkConfig,
        title: 'Add Customer Data',
        confirm: confirm
      },
      panelClass: 'adf-add-permission-dialog',
      width: '630px'
    });
  }
}

Dialog Data Interface

export interface AddDatalinkDialogData {
  title?: string;
  nodeId: string;
  dataLink: any;
  confirm: Subject<NodeEntry[]>;
}
title
string
Optional dialog title
nodeId
string
required
ID of the target Alfresco node
Datalink configuration object
confirm
Subject<NodeEntry[]>
required
RxJS Subject that emits selected items when user confirms

Properties

currentSelection
any[]
Array of currently selected items
data
AddDatalinkDialogData
Dialog data injected from parent

Methods

onSelect

Handles selection changes in the search results.
onSelect(items: any[]): void
items
any[]
Array of selected item objects

onAddClicked

Handles the add button click, emitting selections and closing dialog.
onAddClicked(): void

Example Usage

import { Component } from '@angular/core';
import { VenziaDatalinkSearchDialogService } from 'venzia-datalink';
import { Node } from '@alfresco/js-api';

@Component({
  selector: 'app-node-actions',
  template: `
    <button (click)="addDatalinks()">Add Customer Data</button>
  `
})
export class NodeActionsComponent {
  node: Node;
  datalinkConfig: any;

  constructor(
    private datalinkDialogService: VenziaDatalinkSearchDialogService
  ) {}

  addDatalinks() {
    this.datalinkDialogService
      .openAddDatalinkDialog(this.node, this.datalinkConfig, 'Select Customers')
      .subscribe(
        (selections) => {
          console.log('Added', selections.length, 'datalinks');
        },
        (error) => {
          console.error('Error adding datalinks:', error);
        }
      );
  }
}

Implementation Details

import { Component, Inject, ViewEncapsulation, ViewChild, AfterViewInit } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
import { DatalinkListComponent } from '../../components/datalink-list/datalink-list.component';
import { AppStore, SnackbarErrorAction } from '@alfresco/aca-shared/store';
import { Store } from '@ngrx/store';

@Component({
  host: { class: 'aqua-datalink-dialog' },
  encapsulation: ViewEncapsulation.None,
  styleUrls: ['./datalink-dialog.component.scss'],
  templateUrl: './datalink-dialog.component.html'
})
export class DatalinkDialogComponent implements AfterViewInit {
  @ViewChild('datalinkList')
  datalinkList: DatalinkListComponent;

  nodeId: string;
  currentSelection: any[] = [];

  constructor(
    @Inject(MAT_DIALOG_DATA) data: any,
    private dialog: MatDialog,
    private store: Store<AppStore>
  ) {
    this.nodeId = data.nodeId;
  }

  ngAfterViewInit() {
    this.datalinkList.reloadDialog.subscribe(() => {
      this.reload();
    });
  }

  onSelect(selectionList: any[]) {
    this.currentSelection = selectionList;
  }

  onError(errorMessage: string) {
    this.store.dispatch(new SnackbarErrorAction(errorMessage));
  }

  openAddDataLinkDialog(event: Event) {
    this.datalinkList.openAddDatalinkDialog(event);
  }

  onRemoveSelectionRows(event: Event) {
    this.datalinkList.deleteSelectRows(event);
  }

  reload() {
    this.dialog.open(DatalinkDialogComponent, {
      data: { nodeId: this.nodeId },
      panelClass: 'aca-permissions-dialog-panel',
      width: '800px'
    });
  }
}

Styling

Both components support custom styling through:
  • ViewEncapsulation.None for global styling
  • Panel classes for Material dialog customization
  • Host class bindings

Dependencies

  • @angular/core: Angular framework
  • @angular/material/dialog: Material dialogs
  • @alfresco/aca-shared/store: State management
  • @ngrx/store: Redux store

See Also

Build docs developers (and LLMs) love