alfresco-content-app/docs/tutorials/dialog-actions.md
Denys Vuika 1727554517
[AAE-7145] upgrade to Ngrx 10 (#2479)
* upgrade to ngrx 10

* fix auth proxy

* migrate effects to newer syntax
2022-03-24 11:36:21 +00:00

3.1 KiB

Title
Title
Dialog actions

Dialog actions

In this tutorial, we are going to create an action that invokes a custom material dialog.

Please read more details on Dialog components here: Dialog Overview

Create a dialog

ng g component dialogs/my-extension-dialog --module=app

Update my-extension-dialog.component.ts:

import { Component } from '@angular/core';
import { MatDialogRef } from '@angular/material/dialog';

@Component({
  selector: 'aca-my-extension-dialog',
  templateUrl: './my-extension-dialog.component.html',
  styleUrls: ['./my-extension-dialog.component.scss']
})
export class MyExtensionDialogComponent {
  constructor(public dialogRef: MatDialogRef<MyExtensionDialogComponent>) {}
}

Update my-extension-dialog.component.html:

<h2 mat-dialog-title>Delete all</h2>
<mat-dialog-content>Are you sure?</mat-dialog-content>
<mat-dialog-actions>
  <button mat-button mat-dialog-close>No</button>
  <!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. -->
  <button mat-button [mat-dialog-close]="true">Yes</button>
</mat-dialog-actions>

Create an action

Append the following code to the src/app/store/actions/app.actions.ts:

export const SHOW_MY_DIALOG = 'SHOW_MY_DIALOG';

export class ShowMydDialogAction implements Action {
  readonly type = SHOW_MY_DIALOG;
}

See also:

Create an effect

Update src/app/store/effects/app.effects.ts:

import { createEffect } from '@ngrx/effects';
import { ShowMydDialogAction, SHOW_MY_DIALOG } from '../actions/app.actions';

@Injectable()
export class AppEffects {
  showMyDialog$ = createEffect(
    () => this.actions$.pipe(
      ofType<ShowMydDialogAction>(SHOW_MY_DIALOG),
      map(() => {})
    ), 
    { dispatch: false }
  );
}

See also:

Update to raise a dialog

import { createEffect } from '@ngrx/effects';
import { MatDialog } from '@angular/material/dialog';
import { MyExtensionDialogComponent } from '../../dialogs/my-extension-dialog/my-extension-dialog.component';

@Injectable()
export class AppEffects {
  constructor(private dialog: MatDialog) {}

  showMyDialog$ = createEffect(
    () => this.actions$.pipe(
      ofType<ShowMydDialogAction>(SHOW_MY_DIALOG),
      map(() => {
        this.dialog.open(MyExtensionDialogComponent)
      })
    ), 
    { dispatch: false }
  );
}

Register a toolbar action

Update the src/assets/app.extensions.json file, and insert a new entry to the features.toolbar section:

{
  ...,

  "features": {
    "toolbar": [
      {
        "id": "my.custom.toolbar.button",
        "order": 10,
        "title": "Custom action",
        "icon": "extension",
        "actions": {
          "click": "SHOW_MY_DIALOG"
        }
      }
    ]
  }
}

Now, once you run the application, you should see an extra button that invokes your dialog on every click.