@rxap/material-table-system
Version:
This package provides a set of Angular directives, components, and services to enhance and customize Angular Material tables. It includes features such as row selection, column filtering, expandable rows, table actions, and more. The goal is to simplify c
1,224 lines (1,049 loc) • 49.9 kB
HTML
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>angular-material-table-system</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="../images/favicon.ico">
<link rel="stylesheet" href="../styles/style.css">
<link rel="stylesheet" href="../styles/dark.css">
</head>
<body>
<script>
// Blocking script to avoid flickering dark mode
// Dark mode toggle button
var useDark = window.matchMedia('(prefers-color-scheme: dark)');
var darkModeState = useDark.matches;
var $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input');
var $darkModeToggles = document.querySelectorAll('.dark-mode-switch');
var darkModeStateLocal = localStorage.getItem('compodoc_darkmode-state');
function checkToggle(check) {
for (var i = 0; i < $darkModeToggleSwitchers.length; i++) {
$darkModeToggleSwitchers[i].checked = check;
}
}
function toggleDarkMode(state) {
if (window.localStorage) {
localStorage.setItem('compodoc_darkmode-state', state);
}
checkToggle(state);
const hasClass = document.body.classList.contains('dark');
if (state) {
for (var i = 0; i < $darkModeToggles.length; i++) {
$darkModeToggles[i].classList.add('dark');
}
if (!hasClass) {
document.body.classList.add('dark');
}
} else {
for (var i = 0; i < $darkModeToggles.length; i++) {
$darkModeToggles[i].classList.remove('dark');
}
if (hasClass) {
document.body.classList.remove('dark');
}
}
}
useDark.addEventListener('change', function (evt) {
toggleDarkMode(evt.matches);
});
if (darkModeStateLocal) {
darkModeState = darkModeStateLocal === 'true';
}
toggleDarkMode(darkModeState);
</script>
<div class="navbar navbar-default navbar-fixed-top d-md-none p-0">
<div class="d-flex">
<a href="../" class="navbar-brand">angular-material-table-system</a>
<button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button>
</div>
</div>
<div class="xs-menu menu" id="mobile-menu">
<div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div> <compodoc-menu></compodoc-menu>
</div>
<div class="container-fluid main">
<div class="row main">
<div class="d-none d-md-block menu">
<compodoc-menu mode="normal"></compodoc-menu>
</div>
<!-- START CONTENT -->
<div class="content injectable">
<div class="content-data">
<ol class="breadcrumb">
<li class="breadcrumb-item">Injectables</li>
<li class="breadcrumb-item" >AbstractTableRowAction</li>
</ol>
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a href="#info"
class="nav-link"
class="nav-link active"
role="tab" id="info-tab" data-bs-toggle="tab" data-link="info">Info</a>
</li>
<li class="nav-item">
<a href="#source"
class="nav-link"
role="tab" id="source-tab" data-bs-toggle="tab" data-link="source">Source</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade active in" id="info">
<p class="comment">
<h3>File</h3>
</p>
<p class="comment">
<code>src/lib/table-row-actions/abstract-table-row-action.ts</code>
</p>
<p class="comment">
<h3>Extends</h3>
</p>
<p class="comment">
<code>ConfirmDirective</code>
</p>
<section data-compodoc="block-index">
<h3 id="index">Index</h3>
<table class="table table-sm table-bordered index-table">
<tbody>
<tr>
<td class="col-md-4">
<h6><b>Properties</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Public</span>
<span class="modifier">Readonly</span>
<a href="#isHeader" >isHeader</a>
</li>
<li>
<span class="modifier">Protected</span>
<a href="#options" >options</a>
</li>
<li>
<span class="modifier">Public</span>
<span class="modifier">Abstract</span>
<a href="#type" >type</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Methods</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<span class="modifier">Public</span>
<span class="modifier">Async</span>
<a href="#execute" >execute</a>
</li>
<li>
<span class="modifier">Protected</span>
<span class="modifier">Abstract</span>
<a href="#getElementList" >getElementList</a>
</li>
<li>
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier"></span>
<a href="#onClick" >onClick</a>
</li>
<li>
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier"></span>
<a href="#onConfirmed" >onConfirmed</a>
</li>
<li>
<span class="modifier">Protected</span>
<a href="#setButtonDisabled" >setButtonDisabled</a>
</li>
<li>
<span class="modifier">Protected</span>
<a href="#setButtonEnabled" >setButtonEnabled</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Accessors</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#hasConfirmDirective" >hasConfirmDirective</a>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-constructor">
<h3 id="constructor">Constructor</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(renderer: Renderer2, overlay: Overlay, elementRef: ElementRef, actionMethodList: <a href="../undefineds/TableRowActionMethod.html" target="_self">Array<TableRowActionMethod<Data>> | TableRowActionMethod<Data></a>, cdr: ChangeDetectorRef, vcr: ViewContainerRef, tableDataSourceDirective: <a href="../directives/TableDataSourceDirective.html" target="_self">TableDataSourceDirective</a>, snackBar: MatSnackBar, matButton: MatIconButton | null, matTooltip: MatTooltip | null, injector: Injector)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="68" class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:68</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div>
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>renderer</td>
<td>
<code>Renderer2</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>overlay</td>
<td>
<code>Overlay</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>elementRef</td>
<td>
<code>ElementRef</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>actionMethodList</td>
<td>
<code><a href="../miscellaneous/typealiases.html#TableRowActionMethod" target="_self" >Array<TableRowActionMethod<Data>> | TableRowActionMethod<Data></a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>cdr</td>
<td>
<code>ChangeDetectorRef</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>vcr</td>
<td>
<code>ViewContainerRef</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>tableDataSourceDirective</td>
<td>
<code><a href="../directives/TableDataSourceDirective.html" target="_self" >TableDataSourceDirective</a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>snackBar</td>
<td>
<code>MatSnackBar</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>matButton</td>
<td>
<code>MatIconButton | null</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>matTooltip</td>
<td>
<code>MatTooltip | null</code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>injector</td>
<td>
<code>Injector</code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-methods">
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="execute"></a>
<span class="name">
<span class="modifier">Public</span>
<span class="modifier">Async</span>
<span ><b>execute</b></span>
<a href="#execute"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>execute()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="155"
class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:155</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise<void></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getElementList"></a>
<span class="name">
<span class="modifier">Protected</span>
<span class="modifier">Abstract</span>
<span ><b>getElementList</b></span>
<a href="#getElementList"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getElementList()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="188"
class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:188</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Data[]</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="onClick"></a>
<span class="name">
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier"></span>
<span ><b>onClick</b></span>
<a href="#onClick"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>onClick($event: Event)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>@HostListener('click', ['$event'])<br /></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="141"
class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:141</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>$event</td>
<td>
<code>Event</code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="onConfirmed"></a>
<span class="name">
<span class="modifier"></span>
<span class="modifier">Public</span>
<span class="modifier"></span>
<span ><b>onConfirmed</b></span>
<a href="#onConfirmed"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>onConfirmed()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<b>Decorators : </b>
<br />
<code>@HostListener('confirmed')<br /></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="136"
class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:136</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise<void></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="setButtonDisabled"></a>
<span class="name">
<span class="modifier">Protected</span>
<span ><b>setButtonDisabled</b></span>
<a href="#setButtonDisabled"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>setButtonDisabled()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="197"
class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:197</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description"><p>Disables the action. If the button is pressed the action is NOT executed</p>
<p>Hint: the button is set to disabled = true to prevent any conflict with
extern button enable features linke : rxapHasEnablePermission</p>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="setButtonEnabled"></a>
<span class="name">
<span class="modifier">Protected</span>
<span ><b>setButtonEnabled</b></span>
<a href="#setButtonEnabled"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>setButtonEnabled()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="209"
class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:209</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description"><p>Enables the action. If the button is pressed the action is executed</p>
<p>TODO : find a way to communicate the disabled state between the features
Hint: the button is set to disabled = false to prevent any conflict with
extern button enable features linke : rxapHasEnablePermission</p>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-properties">
<h3 id="inputs">
Properties
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="isHeader"></a>
<span class="name">
<span class="modifier">Public</span>
<span class="modifier">Readonly</span>
<span ><b>isHeader</b></span>
<a href="#isHeader"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank" >boolean</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>false</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="61" class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:61</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="options"></a>
<span class="name">
<span class="modifier">Protected</span>
<span ><b>options</b></span>
<a href="#options"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../interfaces/TableActionMethodOptions.html" target="_self" >TableActionMethodOptions | null</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>null</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="63" class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:63</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="type"></a>
<span class="name">
<span class="modifier">Public</span>
<span class="modifier">Abstract</span>
<span ><b>type</b></span>
<a href="#type"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/string" target="_blank" >string</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="47" class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:47</a></div>
</td>
</tr>
</tbody>
</table>
</section>
<section data-compodoc="block-accessors">
<h3 id="accessors">
Accessors
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="hasConfirmDirective"></a>
<span class="name"><b>hasConfirmDirective</b><a href="#hasConfirmDirective"><span class="icon ion-ios-link"></span></a></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="accessor"><b>set</b><code>hasConfirmDirective(value: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>)</code></span>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="106" class="link-to-prism">src/lib/table-row-actions/abstract-table-row-action.ts:106</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>value</td>
<td>
<code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
</section>
</div>
<div class="tab-pane fade tab-source-code" id="source">
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Overlay } from '@angular/cdk/overlay';
import {
ChangeDetectorRef,
ContentChild,
ElementRef,
HostListener,
Inject,
Injectable,
INJECTOR,
Injector,
Input,
isDevMode,
OnInit,
Optional,
Renderer2,
ViewContainerRef,
} from '@angular/core';
import { MatIconButton } from '@angular/material/button';
import { ThemePalette } from '@angular/material/core';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatTooltip } from '@angular/material/tooltip';
import { ConfirmDirective } from '@rxap/components';
import {
coerceArray,
coerceBoolean,
dasherize,
} from '@rxap/utilities';
import { TableDataSourceDirective } from '../table-data-source.directive';
import { TableActionMethodOptions } from './decorators';
import { TableRowActionExecutingDirective } from './table-row-action-executing.directive';
import { TableRowActionStatus } from './table-row-action-status';
import {
GetTableRowActionMetadata,
IsTableRowActionTypeMethod,
IsTableRowActionTypeSwitchMethod,
} from './table-row-action.method';
import { RXAP_TABLE_ROW_ACTION_METHOD } from './tokens';
import {
TableRowActionMethod,
TableRowActionTypeMethod,
TableRowActionTypeSwitchMethod,
} from './types';
@Injectable()
export abstract class AbstractTableRowAction<Data extends Record<string, any>> extends ConfirmDirective
implements OnInit {
public abstract type: string;
@Input()
public errorMessage?: string;
@Input()
public successMessage?: string;
/**
* true - after the action is executed the table datasource is refreshed
*/
@Input()
public refresh?: boolean;
@Input()
public color?: ThemePalette;
public readonly isHeader: boolean = false;
protected options: TableActionMethodOptions | null = null;
@ContentChild(TableRowActionExecutingDirective)
private readonly executingDirective?: TableRowActionExecutingDirective;
private _currentStatus: TableRowActionStatus = TableRowActionStatus.DONE;
private readonly actionMethodList: Array<TableRowActionMethod<Data>>;
private _actionDisabled = false;
constructor(
@Inject(Renderer2)
protected readonly renderer: Renderer2,
@Inject(Overlay)
overlay: Overlay,
@Inject(ElementRef)
elementRef: ElementRef,
@Inject(RXAP_TABLE_ROW_ACTION_METHOD)
actionMethodList:
| Array<TableRowActionMethod<Data>>
| TableRowActionMethod<Data>,
@Inject(ChangeDetectorRef)
protected readonly cdr: ChangeDetectorRef,
@Inject(ViewContainerRef)
protected readonly vcr: ViewContainerRef,
@Inject(TableDataSourceDirective)
protected readonly tableDataSourceDirective: TableDataSourceDirective,
@Inject(MatSnackBar)
protected readonly snackBar: MatSnackBar,
@Optional()
@Inject(MatIconButton)
protected matButton: MatIconButton | null,
@Optional()
@Inject(MatTooltip)
protected matTooltip: MatTooltip | null,
@Inject(INJECTOR)
protected readonly injector: Injector,
) {
super(overlay, elementRef);
this.actionMethodList = coerceArray(actionMethodList);
}
private _hasConfirmDirective = false;
// eslint-disable-next-line @angular-eslint/no-input-rename
@Input('rxapConfirm')
public set hasConfirmDirective(value: any) {
this._hasConfirmDirective = coerceBoolean(value);
}
// eslint-disable-next-line @angular-eslint/contextual-lifecycle
ngOnInit() {
this.options = this.getTableActionOptions();
if (this.options) {
this.refresh ??= this.options.refresh ?? false;
this.errorMessage ??= this.options.errorMessage ?? undefined;
this.successMessage ??= this.options.successMessage ?? undefined;
if (this.matTooltip && this.options.tooltip) {
this.matTooltip.message = this.options.tooltip;
}
this.color ??= this.options.color ?? undefined;
}
if (this.matButton) {
if (this.color) {
this.matButton.color = this.color;
}
}
if (this.isHeader) {
this.renderer.addClass(this.elementRef.nativeElement, 'rxap-table-row-header-action');
} else {
this.renderer.addClass(this.elementRef.nativeElement, 'rxap-table-row-action');
}
this.renderer.addClass(this.elementRef.nativeElement, `rxap-action-${ dasherize(this.type) }`);
}
@HostListener('confirmed')
public override onConfirmed() {
return this.execute();
}
@HostListener('click', [ '$event' ])
public override onClick($event: Event) {
$event.stopPropagation();
if (!this._hasConfirmDirective && !this.options?.confirm) {
return this.execute();
} else if (this.options?.confirm) {
this.openConfirmOverly();
} else {
if (isDevMode()) {
console.debug('skip remote method call. Wait for confirmation.');
}
}
return Promise.resolve();
}
public async execute(): Promise<void> {
if (this._actionDisabled) {
return Promise.resolve();
}
this.setStatus(TableRowActionStatus.EXECUTING);
try {
await Promise.all(
this.getElementList().map((element) => {
return Promise.all([
Promise.all(
this.findUntypedActionMethod().map((am) => {
return am.call({
element,
type: this.type,
});
},
),
),
Promise.all(
this.findTypedActionMethod().map((am) => {
return am.call(element);
}),
),
]);
}),
);
this.setStatus(TableRowActionStatus.SUCCESS);
} catch (e: any) {
console.error(`Failed to execute row action: ${ e.message }`);
this.setStatus(TableRowActionStatus.ERROR);
}
}
protected abstract getElementList(): Data[];
/**
* Disables the action. If the button is pressed the action is NOT executed
*
* Hint: the button is set to disabled = true to prevent any conflict with
* extern button enable features linke : rxapHasEnablePermission
* @protected
*/
protected setButtonDisabled() {
this._actionDisabled = true;
}
/**
* Enables the action. If the button is pressed the action is executed
*
* TODO : find a way to communicate the disabled state between the features
* Hint: the button is set to disabled = false to prevent any conflict with
* extern button enable features linke : rxapHasEnablePermission
* @protected
*/
protected setButtonEnabled() {
this._actionDisabled = false;
}
/**
* find all method instance in the actionMethodList member that
* do not have a @TableActionMethod decorators
* @private
*/
private findUntypedActionMethod(): Array<TableRowActionTypeSwitchMethod<Data>> {
return this.actionMethodList.filter(IsTableRowActionTypeSwitchMethod);
}
/**
* find all method instance in the actionMethodList member that
* do have a @TableActionMethod decorators with the current type
* @private
*/
private findTypedActionMethod(): Array<TableRowActionTypeMethod<Data>> {
return this.actionMethodList.filter(IsTableRowActionTypeMethod(this.type));
}
private setStatus(status: TableRowActionStatus) {
if (this._currentStatus === status) {
return;
}
this._currentStatus = status;
switch (status) {
case TableRowActionStatus.EXECUTING:
this.setButtonDisabled();
this.executingDirective?.show();
break;
case TableRowActionStatus.SUCCESS:
if (this.refresh) {
this.tableDataSourceDirective.refresh();
}
if (this.successMessage) {
this.snackBar.open(this.successMessage, 'ok', { duration: 2560 });
}
this.setStatus(TableRowActionStatus.DONE);
break;
case TableRowActionStatus.ERROR:
this.setStatus(TableRowActionStatus.DONE);
if (this.errorMessage) {
this.snackBar.open(this.errorMessage, 'ok', { duration: 5120 });
}
break;
case TableRowActionStatus.DONE:
this.setButtonEnabled();
this.executingDirective?.hide();
break;
}
this.cdr.detectChanges();
}
private getTableActionOptions(): TableActionMethodOptions | null {
const metadataList = this.actionMethodList.map(actionMethod => GetTableRowActionMetadata(actionMethod));
if (metadataList.length === 0) {
return null;
}
// TODO : handle multiple metadata or not exist metadata
return metadataList.filter(metadata => metadata.type === this.type)
.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0))[0];
}
}
</code></pre>
</div>
</div>
</div><div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
<!-- END CONTENT -->
</div>
</div>
<label class="dark-mode-switch">
<input type="checkbox">
<span class="slider">
<svg class="slider-icon" viewBox="0 0 24 24" fill="none" height="20" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" width="20" xmlns="http://www.w3.org/2000/svg">
<path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"></path>
</svg>
</span>
</label>
<script>
var COMPODOC_CURRENT_PAGE_DEPTH = 1;
var COMPODOC_CURRENT_PAGE_CONTEXT = 'injectable';
var COMPODOC_CURRENT_PAGE_URL = 'AbstractTableRowAction.html';
var MAX_SEARCH_RESULTS = 15;
</script>
<script>
$darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input');
checkToggle(darkModeState);
if ($darkModeToggleSwitchers.length > 0) {
for (var i = 0; i < $darkModeToggleSwitchers.length; i++) {
$darkModeToggleSwitchers[i].addEventListener('change', function (event) {
darkModeState = !darkModeState;
toggleDarkMode(darkModeState);
});
}
}
</script>
<script src="../js/libs/custom-elements.min.js"></script>
<script src="../js/libs/lit-html.js"></script>
<script src="../js/menu-wc.js" defer></script>
<script nomodule src="../js/menu-wc_es5.js" defer></script>
<script src="../js/libs/bootstrap-native.js"></script>
<script src="../js/libs/es6-shim.min.js"></script>
<script src="../js/libs/EventDispatcher.js"></script>
<script src="../js/libs/promise.min.js"></script>
<script src="../js/libs/zepto.min.js"></script>
<script src="../js/compodoc.js"></script>
<script src="../js/tabs.js"></script>
<script src="../js/menu.js"></script>
<script src="../js/libs/clipboard.min.js"></script>
<script src="../js/libs/prism.js"></script>
<script src="../js/sourceCode.js"></script>
<script src="../js/search/search.js"></script>
<script src="../js/search/lunr.min.js"></script>
<script src="../js/search/search-lunr.js"></script>
<script src="../js/search/search_index.js"></script>
<script src="../js/lazy-load-graphs.js"></script>
</body>
</html>