diff --git a/docs/extending.md b/docs/extending.md index fd4340716..c9aa1ea61 100644 --- a/docs/extending.md +++ b/docs/extending.md @@ -1711,6 +1711,159 @@ node: 10 You have successfully created a new menu button that invokes your custom action and redirects you to the extra application route. +### 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](https://material.angular.io/components/dialog/overview) +

+ +#### Create a dialog + +```sh +ng g component dialogs/my-extension-dialog --module=app +``` + +According to Angular rules, the component needs to also be registered within the `entryComponents` section of the module. + +Update the `src/app/app.module.ts` file according to the example below: + +```ts +@NgModule({ + imports: [...], + declarations: [ + ..., + MyExtensionDialogComponent + ], + entryComponents: [ + ..., + MyExtensionDialogComponent + ] +}) +``` + +Update `my-extension-dialog.component.ts`: + +```ts +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material'; + +@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) {} +} +``` + +Update `my-extension-dialog.component.html`: + +```html +

Delete all

+Are you sure? + + + + + +``` + +#### Create an action + +Append the following code to the `src/app/store/actions/app.actions.ts`: + +```ts +export const SHOW_MY_DIALOG = 'SHOW_MY_DIALOG'; + +export class ShowMydDialogAction implements Action { + readonly type = SHOW_MY_DIALOG; +} +``` + +See also: + +- [Comprehensive Introduction to @ngrx/store](https://gist.github.com/btroncone/a6e4347326749f938510) + +#### Create an effect + +Update `src/app/store/effects/app.effects.ts`: + +```ts +import { ShowMydDialogAction, SHOW_MY_DIALOG } from '../actions/app.actions'; + +@Injectable() +export class AppEffects { + constructor(...) {} + + @Effect({ dispatch: false }) + showMyDialog$ = this.actions$.pipe( + ofType(SHOW_MY_DIALOG), + map(() => {}) + ); + + // ... +} +``` + +See also: + +- [Comprehensive Introduction to @ngrx/store](https://gist.github.com/btroncone/a6e4347326749f938510) + +Update to raise a dialog + +```ts +import { MatDialog } from '@angular/material'; +import { MyExtensionDialogComponent } from '../../dialogs/my-extension-dialog/my-extension-dialog.component'; + +@Injectable() +export class AppEffects { + constructor( + ..., + private dialog: MatDialog + ) {} + + @Effect({ dispatch: false }) + showMyDialog$ = this.actions$.pipe( + ofType(SHOW_MY_DIALOG), + map(() => { + this.dialog.open(MyExtensionDialogComponent) + }) + ); + + ... + +} +``` + +#### Register a toolbar action + +Update the `src/assets/app.extensions.json` file, and insert a new entry to the `features.toolbar` section: + +```json +{ + ..., + + "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. + ## Redistributable libraries Extension libraries are based on the standard Angular libraries and definition files in the JSON format.