@masterteam/components 0.0.19 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assets/common.css
CHANGED
|
@@ -1,57 +1 @@
|
|
|
1
|
-
@
|
|
2
|
-
@plugin "tailwindcss-primeui";
|
|
3
|
-
|
|
4
|
-
/* @source inline("{dark:,}bg-primary-{50,{100..900..100},950}"); */
|
|
5
|
-
/* @source inline("bg-teal-{50,{100..900..100},550}"); */
|
|
6
|
-
/* @source inline("bg-violet-{50,{100..900..100},550}"); */
|
|
7
|
-
/* @source inline("bg-red-{50,{100..900..100},550}"); */
|
|
8
|
-
/**/
|
|
9
|
-
/* @source inline("border-primary-{50,{100..500..100},550}"); */
|
|
10
|
-
/* @source inline("border-teal-{50,{100..500..100},550}"); */
|
|
11
|
-
/* @source inline("border-violet-{50,{100..500..100},550}"); */
|
|
12
|
-
/* @source inline("border-red-{50,{100..500..100},550}"); */
|
|
13
|
-
/**/
|
|
14
|
-
/* @source inline("ring-primary-{50,{100..500..100},550}"); */
|
|
15
|
-
/* @source inline("ring-teal-{50,{100..500..100},550}"); */
|
|
16
|
-
/* @source inline("ring-violet-{50,{100..500..100},550}"); */
|
|
17
|
-
/* @source inline("ring-red-{50,{100..500..100},550}"); */
|
|
18
|
-
/**/
|
|
19
|
-
/* @source inline("text-primary-{50,{100..500..100},550}"); */
|
|
20
|
-
/* @source inline("text-teal-{50,{100..500..100},550}"); */
|
|
21
|
-
/* @source inline("text-violet-{50,{100..500..100},550}"); */
|
|
22
|
-
/* @source inline("text-red-{50,{100..500..100},550}"); */
|
|
23
|
-
|
|
24
|
-
@custom-variant dark (&:where(.dark, .dark *));
|
|
25
|
-
|
|
26
|
-
:root {
|
|
27
|
-
--app-background: var(--p-surface-100);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
:root[class="dark"] {
|
|
31
|
-
--app-background: var(--p-surface-950);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
body {
|
|
35
|
-
background-color: var(--app-background);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@utility bg-content {
|
|
39
|
-
background-color: var(--p-content-background);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@layer components {
|
|
43
|
-
label.required {
|
|
44
|
-
&:after {
|
|
45
|
-
content: "*";
|
|
46
|
-
color: var(--p-red-500);
|
|
47
|
-
padding-inline-start: 2px;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
.dark {
|
|
51
|
-
label.required {
|
|
52
|
-
&:after {
|
|
53
|
-
color: var(--p-red-600);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
1
|
+
:root{--app-background:var(--p-surface-100)}:root[class=dark]{--app-background:var(--p-surface-950)}body{background-color:var(--app-background)}@utility bg-content{background-color: var(--p-content-background);}@layer components{label.required:after{content:"*";color:var(--p-red-500);padding-inline-start:2px}.dark label.required:after{color:var(--p-red-600)}}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { output, input, model, signal, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { NgTemplateOutlet, DatePipe } from '@angular/common';
|
|
4
|
+
import { ToggleField } from '@masterteam/components/toggle-field';
|
|
5
|
+
import * as i1 from '@angular/forms';
|
|
6
|
+
import { FormsModule } from '@angular/forms';
|
|
7
|
+
import { Button } from '@masterteam/components/button';
|
|
8
|
+
import { TextField } from '@masterteam/components/text-field';
|
|
9
|
+
import { SelectField } from '@masterteam/components/select-field';
|
|
10
|
+
import { Paginator } from '@masterteam/components/paginator';
|
|
11
|
+
import { CheckboxField } from '@masterteam/components/checkbox-field';
|
|
12
|
+
|
|
13
|
+
class Table {
|
|
14
|
+
selectionChange = output();
|
|
15
|
+
data = input.required(...(ngDevMode ? [{ debugName: "data" }] : []));
|
|
16
|
+
columns = input.required(...(ngDevMode ? [{ debugName: "columns" }] : []));
|
|
17
|
+
actions = input([], ...(ngDevMode ? [{ debugName: "actions" }] : []));
|
|
18
|
+
selectableRows = input(false, ...(ngDevMode ? [{ debugName: "selectableRows" }] : []));
|
|
19
|
+
generalSearch = input(false, ...(ngDevMode ? [{ debugName: "generalSearch" }] : []));
|
|
20
|
+
showFilters = input(false, ...(ngDevMode ? [{ debugName: "showFilters" }] : []));
|
|
21
|
+
paginatorPosition = input('end', ...(ngDevMode ? [{ debugName: "paginatorPosition" }] : []));
|
|
22
|
+
pageSize = model(5, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
|
|
23
|
+
currentPage = model(0, ...(ngDevMode ? [{ debugName: "currentPage" }] : []));
|
|
24
|
+
first = model(0, ...(ngDevMode ? [{ debugName: "first" }] : []));
|
|
25
|
+
filterTerm = model('', ...(ngDevMode ? [{ debugName: "filterTerm" }] : []));
|
|
26
|
+
selectedRows = signal(new Set(), ...(ngDevMode ? [{ debugName: "selectedRows" }] : []));
|
|
27
|
+
isFilterPanelOpen = signal(false, ...(ngDevMode ? [{ debugName: "isFilterPanelOpen" }] : []));
|
|
28
|
+
pendingFilters = signal({}, ...(ngDevMode ? [{ debugName: "pendingFilters" }] : []));
|
|
29
|
+
appliedFilters = signal({}, ...(ngDevMode ? [{ debugName: "appliedFilters" }] : []));
|
|
30
|
+
filterableColumns = computed(() => this.columns().filter((col) => !!col.filterConfig), ...(ngDevMode ? [{ debugName: "filterableColumns" }] : []));
|
|
31
|
+
activeFilterCount = computed(() => {
|
|
32
|
+
return Object.values(this.appliedFilters()).filter((value) => value !== null && value !== undefined && value !== '').length;
|
|
33
|
+
}, ...(ngDevMode ? [{ debugName: "activeFilterCount" }] : []));
|
|
34
|
+
filteredData = computed(() => {
|
|
35
|
+
const data = this.data();
|
|
36
|
+
const searchTerm = this.filterTerm().toLowerCase();
|
|
37
|
+
const filters = this.appliedFilters();
|
|
38
|
+
const filterKeys = Object.keys(filters);
|
|
39
|
+
if (searchTerm != '') {
|
|
40
|
+
return data.filter((item) => {
|
|
41
|
+
return Object.values(item).some((value) => {
|
|
42
|
+
if (typeof value === 'string') {
|
|
43
|
+
return value.toLowerCase().includes(searchTerm);
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (filterKeys.length === 0) {
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
return data.filter((item) => {
|
|
53
|
+
return filterKeys.every((key) => {
|
|
54
|
+
const filterValue = filters[key];
|
|
55
|
+
const itemValue = this.getProperty(item, key);
|
|
56
|
+
if (filterValue === null ||
|
|
57
|
+
filterValue === undefined ||
|
|
58
|
+
filterValue === '') {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
if (typeof itemValue === 'string') {
|
|
62
|
+
return itemValue
|
|
63
|
+
.toLowerCase()
|
|
64
|
+
.includes(String(filterValue).toLowerCase());
|
|
65
|
+
}
|
|
66
|
+
return itemValue === filterValue;
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}, ...(ngDevMode ? [{ debugName: "filteredData" }] : []));
|
|
70
|
+
totalRecords = computed(() => this.filteredData().length, ...(ngDevMode ? [{ debugName: "totalRecords" }] : []));
|
|
71
|
+
paginatedData = computed(() => {
|
|
72
|
+
const data = this.filteredData();
|
|
73
|
+
const first = this.first();
|
|
74
|
+
const pageSize = this.pageSize();
|
|
75
|
+
return data.slice(first, first + pageSize);
|
|
76
|
+
}, ...(ngDevMode ? [{ debugName: "paginatedData" }] : []));
|
|
77
|
+
allSelectedOnPage = computed(() => {
|
|
78
|
+
const pageData = this.paginatedData();
|
|
79
|
+
if (pageData.length === 0)
|
|
80
|
+
return false;
|
|
81
|
+
return pageData.every((row) => this.selectedRows().has(row));
|
|
82
|
+
}, ...(ngDevMode ? [{ debugName: "allSelectedOnPage" }] : []));
|
|
83
|
+
toggleFilterPanel() {
|
|
84
|
+
const isOpen = this.isFilterPanelOpen();
|
|
85
|
+
if (!isOpen) {
|
|
86
|
+
this.pendingFilters.set({ ...this.appliedFilters() });
|
|
87
|
+
}
|
|
88
|
+
this.isFilterPanelOpen.set(!isOpen);
|
|
89
|
+
}
|
|
90
|
+
updatePendingFilter(key, value) {
|
|
91
|
+
if (value === 'true')
|
|
92
|
+
value = true;
|
|
93
|
+
if (value === 'false')
|
|
94
|
+
value = false;
|
|
95
|
+
this.pendingFilters.update((current) => ({ ...current, [key]: value }));
|
|
96
|
+
}
|
|
97
|
+
applyFilters() {
|
|
98
|
+
this.appliedFilters.set({ ...this.pendingFilters() });
|
|
99
|
+
this.first.set(0);
|
|
100
|
+
this.currentPage.set(0);
|
|
101
|
+
this.isFilterPanelOpen.set(false);
|
|
102
|
+
}
|
|
103
|
+
resetFilters() {
|
|
104
|
+
this.pendingFilters.set({});
|
|
105
|
+
this.appliedFilters.set({});
|
|
106
|
+
this.first.set(0);
|
|
107
|
+
this.currentPage.set(0);
|
|
108
|
+
this.isFilterPanelOpen.set(false);
|
|
109
|
+
}
|
|
110
|
+
toggleRow(row) {
|
|
111
|
+
const newSet = new Set(this.selectedRows());
|
|
112
|
+
if (newSet.has(row))
|
|
113
|
+
newSet.delete(row);
|
|
114
|
+
else
|
|
115
|
+
newSet.add(row);
|
|
116
|
+
this.selectedRows.set(newSet);
|
|
117
|
+
this.selectionChange.emit(Array.from(this.selectedRows()));
|
|
118
|
+
}
|
|
119
|
+
toggleAllRowsOnPage() {
|
|
120
|
+
const currentSelection = new Set(this.selectedRows());
|
|
121
|
+
const pageData = this.paginatedData();
|
|
122
|
+
const allSelected = this.allSelectedOnPage();
|
|
123
|
+
if (allSelected) {
|
|
124
|
+
pageData.forEach((row) => currentSelection.delete(row));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
pageData.forEach((row) => currentSelection.add(row));
|
|
128
|
+
}
|
|
129
|
+
this.selectedRows.set(currentSelection);
|
|
130
|
+
this.selectionChange.emit(Array.from(this.selectedRows()));
|
|
131
|
+
}
|
|
132
|
+
getProperty(obj, key) {
|
|
133
|
+
return key.split('.').reduce((o, i) => (o ? o[i] : undefined), obj);
|
|
134
|
+
}
|
|
135
|
+
onSearchChange(searchTerm) {
|
|
136
|
+
const value = searchTerm.target.value;
|
|
137
|
+
this.filterTerm.set(value);
|
|
138
|
+
this.currentPage.set(1);
|
|
139
|
+
}
|
|
140
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
141
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.3", type: Table, isStandalone: true, selector: "mt-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, selectableRows: { classPropertyName: "selectableRows", publicName: "selectableRows", isSignal: true, isRequired: false, transformFunction: null }, generalSearch: { classPropertyName: "generalSearch", publicName: "generalSearch", isSignal: true, isRequired: false, transformFunction: null }, showFilters: { classPropertyName: "showFilters", publicName: "showFilters", isSignal: true, isRequired: false, transformFunction: null }, paginatorPosition: { classPropertyName: "paginatorPosition", publicName: "paginatorPosition", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: false, transformFunction: null }, first: { classPropertyName: "first", publicName: "first", isSignal: true, isRequired: false, transformFunction: null }, filterTerm: { classPropertyName: "filterTerm", publicName: "filterTerm", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange", pageSize: "pageSizeChange", currentPage: "currentPageChange", first: "firstChange", filterTerm: "filterTermChange" }, providers: [], ngImport: i0, template: "<div class=\"space-y-4\">\n <div\n class=\"flex relative\"\n [class]=\"!generalSearch() ? 'justify-end' : 'justify-between'\"\n >\n @if (generalSearch()) {\n <mt-text-field\n [(ngModel)]=\"filterTerm\"\n (change)=\"onSearchChange($event)\"\n placeholder=\"Search...\"\n ></mt-text-field>\n }\n @if (showFilters()) {\n <mt-button\n variant=\"outline\"\n (click)=\"toggleFilterPanel()\"\n label=\"Filter\"\n [badge]=\"activeFilterCount()\"\n icon=\"general.filter-funnel-01\"\n >\n </mt-button>\n @if (isFilterPanelOpen()) {\n <div\n class=\"absolute top-full right-0 z-10 mt-2 w-72 origin-top-right rounded-md bg-content shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none\"\n role=\"menu\"\n >\n <div class=\"p-4\">\n <h3 class=\"text-base font-semibold\">Filter Options</h3>\n </div>\n <div\n class=\"border-t border-surface-300 dark:border-surface-500 p-4 space-y-4\"\n >\n @for (col of filterableColumns(); track col.key) {\n <div class=\"space-y-1\">\n <label class=\"block text-sm font-medium\">\n {{ col.filterConfig?.label }}\n </label>\n @switch (col.filterConfig?.type) {\n @case (\"text\") {\n <mt-text-field\n [(ngModel)]=\"pendingFilters()[col.key]\"\n (ngModelChange)=\"updatePendingFilter(col.key, $event)\"\n ></mt-text-field>\n }\n @case (\"select\") {\n <mt-select-field\n [(ngModel)]=\"pendingFilters()[col.key]\"\n (ngModelChange)=\"updatePendingFilter(col.key, $event)\"\n [options]=\"col.filterConfig?.options\"\n [hasPlaceholderPrefix]=\"false\"\n [placeholder]=\"'Select ' + col.filterConfig?.label\"\n showClear\n ></mt-select-field>\n }\n }\n </div>\n }\n </div>\n <div\n class=\"flex items-center justify-end space-x-2 border-t border-surface-300 dark:border-surface-500 bg-surface-50 dark:bg-surface-950 p-4 rounded-b-md\"\n >\n <mt-button\n variant=\"outlined\"\n (click)=\"resetFilters()\"\n label=\"Reset\"\n />\n <mt-button (click)=\"applyFilters()\" label=\"Apply\" />\n </div>\n </div>\n }\n }\n </div>\n\n <div\n class=\"overflow-x-auto bg-content rounded-lg border border-surface-300 dark:border-surface-500\"\n >\n <table class=\"min-w-full text-sm align-middle table-fixed\">\n <thead\n class=\"bg-surface-50 dark:bg-surface-950 border-b border-surface-300 dark:border-surface-500\"\n >\n <tr>\n @if (selectableRows()) {\n <th class=\"p-4 w-12 text-start\">\n <mt-checkbox-field\n [ngModel]=\"allSelectedOnPage()\"\n (ngModelChange)=\"toggleAllRowsOnPage()\"\n ></mt-checkbox-field>\n </th>\n }\n\n @for (col of columns(); track col.key) {\n <th\n class=\"p-4 text-start font-semibold text-gray-600 dark:text-gray-50 uppercase tracking-wider\"\n >\n {{ col.label }}\n </th>\n }\n\n @if (actions().length > 0) {\n <th\n class=\"p-4 text-end font-semibold text-gray-600 dark:text-gray-50 uppercase tracking-wider\"\n >\n Actions\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-gray-200\">\n @for (row of paginatedData(); track row.id) {\n <tr\n class=\"hover:bg-gray-50 dark:hover:bg-surface-950 border-surface-300 dark:border-surface-500\"\n >\n @if (selectableRows()) {\n <td class=\"p-4 w-12\">\n <mt-checkbox-field\n [ngModel]=\"selectedRows().has(row)\"\n (ngModelChange)=\"toggleRow(row)\"\n ></mt-checkbox-field>\n </td>\n }\n\n @for (col of columns(); track col.key) {\n <td class=\"p-4 text-gray-700 dark:text-gray-100\">\n @switch (col.type) {\n @case (\"boolean\") {\n <mt-toggle-field\n [(ngModel)]=\"row[col.key]\"\n ></mt-toggle-field>\n }\n @case (\"date\") {\n {{ getProperty(row, col.key) | date: \"mediumDate\" }}\n }\n @case (\"custom\") {\n <ng-container\n *ngTemplateOutlet=\"\n col.customCellTpl;\n context: { $implicit: row }\n \"\n >\n </ng-container>\n }\n @default {\n {{ getProperty(row, col.key) }}\n }\n }\n </td>\n }\n\n @if (actions().length > 0) {\n <td class=\"p-4 text-right\">\n <div class=\"flex items-center justify-end space-x-2\">\n @for (action of actions(); track action.label) {\n <mt-button\n [icon]=\"action.icon\"\n [severity]=\"action.color\"\n [variant]=\"action.variant\"\n (click)=\"action.action(row)\"\n [tooltip]=\"action.label\"\n ></mt-button>\n }\n </div>\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td\n [colSpan]=\"columns().length + (actions().length > 0 ? 2 : 1)\"\n class=\"text-center p-8 text-gray-500 dark:text-gray-200\"\n >\n No data available.\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"flex flex-col gap-3\" [class]=\"'items-' + paginatorPosition()\">\n <mt-paginator\n [(rows)]=\"pageSize\"\n [(first)]=\"first\"\n [(page)]=\"currentPage\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"[5, 10, 20, 50]\"\n ></mt-paginator>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required"], outputs: ["onChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "pKeyFilter", "required"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required"], outputs: ["onChange"] }, { kind: "component", type: Paginator, selector: "mt-paginator", inputs: ["rows", "totalRecords", "first", "page", "rowsPerPageOptions", "showFirstLastIcon", "showCurrentPageReport", "fluid", "pageLinkSize", "alwaysShow"], outputs: ["rowsChange", "firstChange", "pageChange", "onPageChange"] }, { kind: "component", type: CheckboxField, selector: "mt-checkbox-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required"], outputs: ["onChange"] }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
142
|
+
}
|
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: Table, decorators: [{
|
|
144
|
+
type: Component,
|
|
145
|
+
args: [{ selector: 'mt-table', standalone: true, imports: [
|
|
146
|
+
NgTemplateOutlet,
|
|
147
|
+
DatePipe,
|
|
148
|
+
ToggleField,
|
|
149
|
+
FormsModule,
|
|
150
|
+
Button,
|
|
151
|
+
TextField,
|
|
152
|
+
SelectField,
|
|
153
|
+
Paginator,
|
|
154
|
+
CheckboxField,
|
|
155
|
+
], providers: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"space-y-4\">\n <div\n class=\"flex relative\"\n [class]=\"!generalSearch() ? 'justify-end' : 'justify-between'\"\n >\n @if (generalSearch()) {\n <mt-text-field\n [(ngModel)]=\"filterTerm\"\n (change)=\"onSearchChange($event)\"\n placeholder=\"Search...\"\n ></mt-text-field>\n }\n @if (showFilters()) {\n <mt-button\n variant=\"outline\"\n (click)=\"toggleFilterPanel()\"\n label=\"Filter\"\n [badge]=\"activeFilterCount()\"\n icon=\"general.filter-funnel-01\"\n >\n </mt-button>\n @if (isFilterPanelOpen()) {\n <div\n class=\"absolute top-full right-0 z-10 mt-2 w-72 origin-top-right rounded-md bg-content shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none\"\n role=\"menu\"\n >\n <div class=\"p-4\">\n <h3 class=\"text-base font-semibold\">Filter Options</h3>\n </div>\n <div\n class=\"border-t border-surface-300 dark:border-surface-500 p-4 space-y-4\"\n >\n @for (col of filterableColumns(); track col.key) {\n <div class=\"space-y-1\">\n <label class=\"block text-sm font-medium\">\n {{ col.filterConfig?.label }}\n </label>\n @switch (col.filterConfig?.type) {\n @case (\"text\") {\n <mt-text-field\n [(ngModel)]=\"pendingFilters()[col.key]\"\n (ngModelChange)=\"updatePendingFilter(col.key, $event)\"\n ></mt-text-field>\n }\n @case (\"select\") {\n <mt-select-field\n [(ngModel)]=\"pendingFilters()[col.key]\"\n (ngModelChange)=\"updatePendingFilter(col.key, $event)\"\n [options]=\"col.filterConfig?.options\"\n [hasPlaceholderPrefix]=\"false\"\n [placeholder]=\"'Select ' + col.filterConfig?.label\"\n showClear\n ></mt-select-field>\n }\n }\n </div>\n }\n </div>\n <div\n class=\"flex items-center justify-end space-x-2 border-t border-surface-300 dark:border-surface-500 bg-surface-50 dark:bg-surface-950 p-4 rounded-b-md\"\n >\n <mt-button\n variant=\"outlined\"\n (click)=\"resetFilters()\"\n label=\"Reset\"\n />\n <mt-button (click)=\"applyFilters()\" label=\"Apply\" />\n </div>\n </div>\n }\n }\n </div>\n\n <div\n class=\"overflow-x-auto bg-content rounded-lg border border-surface-300 dark:border-surface-500\"\n >\n <table class=\"min-w-full text-sm align-middle table-fixed\">\n <thead\n class=\"bg-surface-50 dark:bg-surface-950 border-b border-surface-300 dark:border-surface-500\"\n >\n <tr>\n @if (selectableRows()) {\n <th class=\"p-4 w-12 text-start\">\n <mt-checkbox-field\n [ngModel]=\"allSelectedOnPage()\"\n (ngModelChange)=\"toggleAllRowsOnPage()\"\n ></mt-checkbox-field>\n </th>\n }\n\n @for (col of columns(); track col.key) {\n <th\n class=\"p-4 text-start font-semibold text-gray-600 dark:text-gray-50 uppercase tracking-wider\"\n >\n {{ col.label }}\n </th>\n }\n\n @if (actions().length > 0) {\n <th\n class=\"p-4 text-end font-semibold text-gray-600 dark:text-gray-50 uppercase tracking-wider\"\n >\n Actions\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-gray-200\">\n @for (row of paginatedData(); track row.id) {\n <tr\n class=\"hover:bg-gray-50 dark:hover:bg-surface-950 border-surface-300 dark:border-surface-500\"\n >\n @if (selectableRows()) {\n <td class=\"p-4 w-12\">\n <mt-checkbox-field\n [ngModel]=\"selectedRows().has(row)\"\n (ngModelChange)=\"toggleRow(row)\"\n ></mt-checkbox-field>\n </td>\n }\n\n @for (col of columns(); track col.key) {\n <td class=\"p-4 text-gray-700 dark:text-gray-100\">\n @switch (col.type) {\n @case (\"boolean\") {\n <mt-toggle-field\n [(ngModel)]=\"row[col.key]\"\n ></mt-toggle-field>\n }\n @case (\"date\") {\n {{ getProperty(row, col.key) | date: \"mediumDate\" }}\n }\n @case (\"custom\") {\n <ng-container\n *ngTemplateOutlet=\"\n col.customCellTpl;\n context: { $implicit: row }\n \"\n >\n </ng-container>\n }\n @default {\n {{ getProperty(row, col.key) }}\n }\n }\n </td>\n }\n\n @if (actions().length > 0) {\n <td class=\"p-4 text-right\">\n <div class=\"flex items-center justify-end space-x-2\">\n @for (action of actions(); track action.label) {\n <mt-button\n [icon]=\"action.icon\"\n [severity]=\"action.color\"\n [variant]=\"action.variant\"\n (click)=\"action.action(row)\"\n [tooltip]=\"action.label\"\n ></mt-button>\n }\n </div>\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td\n [colSpan]=\"columns().length + (actions().length > 0 ? 2 : 1)\"\n class=\"text-center p-8 text-gray-500 dark:text-gray-200\"\n >\n No data available.\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"flex flex-col gap-3\" [class]=\"'items-' + paginatorPosition()\">\n <mt-paginator\n [(rows)]=\"pageSize\"\n [(first)]=\"first\"\n [(page)]=\"currentPage\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"[5, 10, 20, 50]\"\n ></mt-paginator>\n </div>\n</div>\n" }]
|
|
156
|
+
}] });
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Generated bundle index. Do not edit.
|
|
160
|
+
*/
|
|
161
|
+
|
|
162
|
+
export { Table };
|
|
163
|
+
//# sourceMappingURL=masterteam-components-table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masterteam-components-table.mjs","sources":["../../../../packages/masterteam/components/table/table.ts","../../../../packages/masterteam/components/table/table.html","../../../../packages/masterteam/components/table/masterteam-components-table.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet, DatePipe } from '@angular/common';\nimport { ColumnDef, TableAction } from './table-types';\nimport { ToggleField } from '@masterteam/components/toggle-field';\nimport { FormsModule } from '@angular/forms';\nimport { Button } from '@masterteam/components/button';\nimport { TextField } from '@masterteam/components/text-field';\nimport { SelectField } from '@masterteam/components/select-field';\nimport { Paginator } from '@masterteam/components/paginator';\nimport { CheckboxField } from '@masterteam/components/checkbox-field';\n\n@Component({\n selector: 'mt-table',\n templateUrl: './table.html',\n styleUrls: ['./table.css'],\n standalone: true,\n imports: [\n NgTemplateOutlet,\n DatePipe,\n ToggleField,\n FormsModule,\n Button,\n TextField,\n SelectField,\n Paginator,\n CheckboxField,\n ],\n providers: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Table {\n selectionChange = output<any[]>();\n\n data = input.required<any[]>();\n columns = input.required<ColumnDef[]>();\n actions = input<TableAction[]>([]);\n selectableRows = input<boolean>(false);\n generalSearch = input<boolean>(false);\n showFilters = input<boolean>(false);\n\n paginatorPosition = input<'end' | 'start' | 'center'>('end');\n pageSize = model<number>(5);\n currentPage = model<number>(0);\n first = model<number>(0);\n filterTerm = model<string>('');\n\n protected selectedRows = signal<Set<any>>(new Set());\n protected isFilterPanelOpen = signal<boolean>(false);\n\n protected pendingFilters = signal<Record<string, any>>({});\n protected appliedFilters = signal<Record<string, any>>({});\n\n protected filterableColumns = computed(() =>\n this.columns().filter((col) => !!col.filterConfig),\n );\n\n protected activeFilterCount = computed(() => {\n return Object.values(this.appliedFilters()).filter(\n (value) => value !== null && value !== undefined && value !== '',\n ).length;\n });\n\n protected filteredData = computed(() => {\n const data = this.data();\n const searchTerm = this.filterTerm().toLowerCase();\n\n const filters = this.appliedFilters();\n const filterKeys = Object.keys(filters);\n\n if (searchTerm != '') {\n return data.filter((item) => {\n return Object.values(item).some((value) => {\n if (typeof value === 'string') {\n return value.toLowerCase().includes(searchTerm);\n }\n return false;\n });\n });\n }\n\n if (filterKeys.length === 0) {\n return data;\n }\n\n return data.filter((item) => {\n return filterKeys.every((key) => {\n const filterValue = filters[key];\n const itemValue = this.getProperty(item, key);\n\n if (\n filterValue === null ||\n filterValue === undefined ||\n filterValue === ''\n ) {\n return true;\n }\n\n if (typeof itemValue === 'string') {\n return itemValue\n .toLowerCase()\n .includes(String(filterValue).toLowerCase());\n }\n return itemValue === filterValue;\n });\n });\n });\n\n protected totalRecords = computed(() => this.filteredData().length);\n\n protected paginatedData = computed(() => {\n const data = this.filteredData();\n const first = this.first();\n const pageSize = this.pageSize();\n return data.slice(first, first + pageSize);\n });\n\n protected allSelectedOnPage = computed(() => {\n const pageData = this.paginatedData();\n if (pageData.length === 0) return false;\n return pageData.every((row) => this.selectedRows().has(row));\n });\n\n toggleFilterPanel(): void {\n const isOpen = this.isFilterPanelOpen();\n if (!isOpen) {\n this.pendingFilters.set({ ...this.appliedFilters() });\n }\n this.isFilterPanelOpen.set(!isOpen);\n }\n\n updatePendingFilter(key: string, value: any): void {\n if (value === 'true') value = true;\n if (value === 'false') value = false;\n\n this.pendingFilters.update((current) => ({ ...current, [key]: value }));\n }\n\n applyFilters(): void {\n this.appliedFilters.set({ ...this.pendingFilters() });\n this.first.set(0);\n this.currentPage.set(0);\n this.isFilterPanelOpen.set(false);\n }\n\n resetFilters(): void {\n this.pendingFilters.set({});\n this.appliedFilters.set({});\n this.first.set(0);\n this.currentPage.set(0);\n this.isFilterPanelOpen.set(false);\n }\n\n toggleRow(row: any): void {\n const newSet = new Set(this.selectedRows());\n if (newSet.has(row)) newSet.delete(row);\n else newSet.add(row);\n this.selectedRows.set(newSet);\n this.selectionChange.emit(Array.from(this.selectedRows()));\n }\n\n toggleAllRowsOnPage(): void {\n const currentSelection = new Set(this.selectedRows());\n const pageData = this.paginatedData();\n const allSelected = this.allSelectedOnPage();\n if (allSelected) {\n pageData.forEach((row) => currentSelection.delete(row));\n } else {\n pageData.forEach((row) => currentSelection.add(row));\n }\n this.selectedRows.set(currentSelection);\n this.selectionChange.emit(Array.from(this.selectedRows()));\n }\n\n getProperty(obj: any, key: string): any {\n return key.split('.').reduce((o, i) => (o ? o[i] : undefined), obj);\n }\n\n onSearchChange(searchTerm: Event) {\n const value = (searchTerm.target as HTMLInputElement).value;\n this.filterTerm.set(value);\n this.currentPage.set(1);\n }\n}\n","<div class=\"space-y-4\">\n <div\n class=\"flex relative\"\n [class]=\"!generalSearch() ? 'justify-end' : 'justify-between'\"\n >\n @if (generalSearch()) {\n <mt-text-field\n [(ngModel)]=\"filterTerm\"\n (change)=\"onSearchChange($event)\"\n placeholder=\"Search...\"\n ></mt-text-field>\n }\n @if (showFilters()) {\n <mt-button\n variant=\"outline\"\n (click)=\"toggleFilterPanel()\"\n label=\"Filter\"\n [badge]=\"activeFilterCount()\"\n icon=\"general.filter-funnel-01\"\n >\n </mt-button>\n @if (isFilterPanelOpen()) {\n <div\n class=\"absolute top-full right-0 z-10 mt-2 w-72 origin-top-right rounded-md bg-content shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none\"\n role=\"menu\"\n >\n <div class=\"p-4\">\n <h3 class=\"text-base font-semibold\">Filter Options</h3>\n </div>\n <div\n class=\"border-t border-surface-300 dark:border-surface-500 p-4 space-y-4\"\n >\n @for (col of filterableColumns(); track col.key) {\n <div class=\"space-y-1\">\n <label class=\"block text-sm font-medium\">\n {{ col.filterConfig?.label }}\n </label>\n @switch (col.filterConfig?.type) {\n @case (\"text\") {\n <mt-text-field\n [(ngModel)]=\"pendingFilters()[col.key]\"\n (ngModelChange)=\"updatePendingFilter(col.key, $event)\"\n ></mt-text-field>\n }\n @case (\"select\") {\n <mt-select-field\n [(ngModel)]=\"pendingFilters()[col.key]\"\n (ngModelChange)=\"updatePendingFilter(col.key, $event)\"\n [options]=\"col.filterConfig?.options\"\n [hasPlaceholderPrefix]=\"false\"\n [placeholder]=\"'Select ' + col.filterConfig?.label\"\n showClear\n ></mt-select-field>\n }\n }\n </div>\n }\n </div>\n <div\n class=\"flex items-center justify-end space-x-2 border-t border-surface-300 dark:border-surface-500 bg-surface-50 dark:bg-surface-950 p-4 rounded-b-md\"\n >\n <mt-button\n variant=\"outlined\"\n (click)=\"resetFilters()\"\n label=\"Reset\"\n />\n <mt-button (click)=\"applyFilters()\" label=\"Apply\" />\n </div>\n </div>\n }\n }\n </div>\n\n <div\n class=\"overflow-x-auto bg-content rounded-lg border border-surface-300 dark:border-surface-500\"\n >\n <table class=\"min-w-full text-sm align-middle table-fixed\">\n <thead\n class=\"bg-surface-50 dark:bg-surface-950 border-b border-surface-300 dark:border-surface-500\"\n >\n <tr>\n @if (selectableRows()) {\n <th class=\"p-4 w-12 text-start\">\n <mt-checkbox-field\n [ngModel]=\"allSelectedOnPage()\"\n (ngModelChange)=\"toggleAllRowsOnPage()\"\n ></mt-checkbox-field>\n </th>\n }\n\n @for (col of columns(); track col.key) {\n <th\n class=\"p-4 text-start font-semibold text-gray-600 dark:text-gray-50 uppercase tracking-wider\"\n >\n {{ col.label }}\n </th>\n }\n\n @if (actions().length > 0) {\n <th\n class=\"p-4 text-end font-semibold text-gray-600 dark:text-gray-50 uppercase tracking-wider\"\n >\n Actions\n </th>\n }\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-gray-200\">\n @for (row of paginatedData(); track row.id) {\n <tr\n class=\"hover:bg-gray-50 dark:hover:bg-surface-950 border-surface-300 dark:border-surface-500\"\n >\n @if (selectableRows()) {\n <td class=\"p-4 w-12\">\n <mt-checkbox-field\n [ngModel]=\"selectedRows().has(row)\"\n (ngModelChange)=\"toggleRow(row)\"\n ></mt-checkbox-field>\n </td>\n }\n\n @for (col of columns(); track col.key) {\n <td class=\"p-4 text-gray-700 dark:text-gray-100\">\n @switch (col.type) {\n @case (\"boolean\") {\n <mt-toggle-field\n [(ngModel)]=\"row[col.key]\"\n ></mt-toggle-field>\n }\n @case (\"date\") {\n {{ getProperty(row, col.key) | date: \"mediumDate\" }}\n }\n @case (\"custom\") {\n <ng-container\n *ngTemplateOutlet=\"\n col.customCellTpl;\n context: { $implicit: row }\n \"\n >\n </ng-container>\n }\n @default {\n {{ getProperty(row, col.key) }}\n }\n }\n </td>\n }\n\n @if (actions().length > 0) {\n <td class=\"p-4 text-right\">\n <div class=\"flex items-center justify-end space-x-2\">\n @for (action of actions(); track action.label) {\n <mt-button\n [icon]=\"action.icon\"\n [severity]=\"action.color\"\n [variant]=\"action.variant\"\n (click)=\"action.action(row)\"\n [tooltip]=\"action.label\"\n ></mt-button>\n }\n </div>\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td\n [colSpan]=\"columns().length + (actions().length > 0 ? 2 : 1)\"\n class=\"text-center p-8 text-gray-500 dark:text-gray-200\"\n >\n No data available.\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"flex flex-col gap-3\" [class]=\"'items-' + paginatorPosition()\">\n <mt-paginator\n [(rows)]=\"pageSize\"\n [(first)]=\"first\"\n [(page)]=\"currentPage\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"[5, 10, 20, 50]\"\n ></mt-paginator>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.20",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": ".",
|
|
6
6
|
"linkDirectory": false,
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"types": "./avatar/index.d.ts",
|
|
43
43
|
"default": "./fesm2022/masterteam-components-avatar.mjs"
|
|
44
44
|
},
|
|
45
|
-
"./
|
|
46
|
-
"types": "./
|
|
47
|
-
"default": "./fesm2022/masterteam-components-
|
|
45
|
+
"./breadcrumb": {
|
|
46
|
+
"types": "./breadcrumb/index.d.ts",
|
|
47
|
+
"default": "./fesm2022/masterteam-components-breadcrumb.mjs"
|
|
48
48
|
},
|
|
49
49
|
"./button": {
|
|
50
50
|
"types": "./button/index.d.ts",
|
|
@@ -66,25 +66,25 @@
|
|
|
66
66
|
"types": "./chip/index.d.ts",
|
|
67
67
|
"default": "./fesm2022/masterteam-components-chip.mjs"
|
|
68
68
|
},
|
|
69
|
-
"./
|
|
70
|
-
"types": "./
|
|
71
|
-
"default": "./fesm2022/masterteam-components-
|
|
69
|
+
"./avatar-text": {
|
|
70
|
+
"types": "./avatar-text/index.d.ts",
|
|
71
|
+
"default": "./fesm2022/masterteam-components-avatar-text.mjs"
|
|
72
72
|
},
|
|
73
|
-
"./
|
|
74
|
-
"types": "./
|
|
75
|
-
"default": "./fesm2022/masterteam-components-
|
|
73
|
+
"./editor-field": {
|
|
74
|
+
"types": "./editor-field/index.d.ts",
|
|
75
|
+
"default": "./fesm2022/masterteam-components-editor-field.mjs"
|
|
76
76
|
},
|
|
77
77
|
"./date-field": {
|
|
78
78
|
"types": "./date-field/index.d.ts",
|
|
79
79
|
"default": "./fesm2022/masterteam-components-date-field.mjs"
|
|
80
80
|
},
|
|
81
|
-
"./
|
|
82
|
-
"types": "./
|
|
83
|
-
"default": "./fesm2022/masterteam-components-
|
|
81
|
+
"./field-validation": {
|
|
82
|
+
"types": "./field-validation/index.d.ts",
|
|
83
|
+
"default": "./fesm2022/masterteam-components-field-validation.mjs"
|
|
84
84
|
},
|
|
85
|
-
"./
|
|
86
|
-
"types": "./
|
|
87
|
-
"default": "./fesm2022/masterteam-components-
|
|
85
|
+
"./color-picker-field": {
|
|
86
|
+
"types": "./color-picker-field/index.d.ts",
|
|
87
|
+
"default": "./fesm2022/masterteam-components-color-picker-field.mjs"
|
|
88
88
|
},
|
|
89
89
|
"./icon-field": {
|
|
90
90
|
"types": "./icon-field/index.d.ts",
|
|
@@ -94,9 +94,9 @@
|
|
|
94
94
|
"types": "./formula-builder/index.d.ts",
|
|
95
95
|
"default": "./fesm2022/masterteam-components-formula-builder.mjs"
|
|
96
96
|
},
|
|
97
|
-
"./
|
|
98
|
-
"types": "./
|
|
99
|
-
"default": "./fesm2022/masterteam-components-
|
|
97
|
+
"./list": {
|
|
98
|
+
"types": "./list/index.d.ts",
|
|
99
|
+
"default": "./fesm2022/masterteam-components-list.mjs"
|
|
100
100
|
},
|
|
101
101
|
"./multi-select-field": {
|
|
102
102
|
"types": "./multi-select-field/index.d.ts",
|
|
@@ -106,6 +106,10 @@
|
|
|
106
106
|
"types": "./number-field/index.d.ts",
|
|
107
107
|
"default": "./fesm2022/masterteam-components-number-field.mjs"
|
|
108
108
|
},
|
|
109
|
+
"./radio-button-field": {
|
|
110
|
+
"types": "./radio-button-field/index.d.ts",
|
|
111
|
+
"default": "./fesm2022/masterteam-components-radio-button-field.mjs"
|
|
112
|
+
},
|
|
109
113
|
"./paginator": {
|
|
110
114
|
"types": "./paginator/index.d.ts",
|
|
111
115
|
"default": "./fesm2022/masterteam-components-paginator.mjs"
|
|
@@ -118,14 +122,18 @@
|
|
|
118
122
|
"types": "./radio-cards-field/index.d.ts",
|
|
119
123
|
"default": "./fesm2022/masterteam-components-radio-cards-field.mjs"
|
|
120
124
|
},
|
|
121
|
-
"./radio-button-field": {
|
|
122
|
-
"types": "./radio-button-field/index.d.ts",
|
|
123
|
-
"default": "./fesm2022/masterteam-components-radio-button-field.mjs"
|
|
124
|
-
},
|
|
125
125
|
"./select-field": {
|
|
126
126
|
"types": "./select-field/index.d.ts",
|
|
127
127
|
"default": "./fesm2022/masterteam-components-select-field.mjs"
|
|
128
128
|
},
|
|
129
|
+
"./slider-field": {
|
|
130
|
+
"types": "./slider-field/index.d.ts",
|
|
131
|
+
"default": "./fesm2022/masterteam-components-slider-field.mjs"
|
|
132
|
+
},
|
|
133
|
+
"./table": {
|
|
134
|
+
"types": "./table/index.d.ts",
|
|
135
|
+
"default": "./fesm2022/masterteam-components-table.mjs"
|
|
136
|
+
},
|
|
129
137
|
"./tabs": {
|
|
130
138
|
"types": "./tabs/index.d.ts",
|
|
131
139
|
"default": "./fesm2022/masterteam-components-tabs.mjs"
|
|
@@ -134,10 +142,6 @@
|
|
|
134
142
|
"types": "./text-field/index.d.ts",
|
|
135
143
|
"default": "./fesm2022/masterteam-components-text-field.mjs"
|
|
136
144
|
},
|
|
137
|
-
"./slider-field": {
|
|
138
|
-
"types": "./slider-field/index.d.ts",
|
|
139
|
-
"default": "./fesm2022/masterteam-components-slider-field.mjs"
|
|
140
|
-
},
|
|
141
145
|
"./textarea-field": {
|
|
142
146
|
"types": "./textarea-field/index.d.ts",
|
|
143
147
|
"default": "./fesm2022/masterteam-components-textarea-field.mjs"
|
package/table/index.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { TemplateRef } from '@angular/core';
|
|
3
|
+
import { MTIcon } from '@masterteam/icons';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Defines the options for a select filter.
|
|
7
|
+
*/
|
|
8
|
+
interface FilterOption {
|
|
9
|
+
label: string;
|
|
10
|
+
value: any;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for filtering on a specific column.
|
|
14
|
+
*/
|
|
15
|
+
interface FilterConfig {
|
|
16
|
+
type: 'text' | 'select';
|
|
17
|
+
label: string;
|
|
18
|
+
options?: FilterOption[];
|
|
19
|
+
}
|
|
20
|
+
interface ColumnDef {
|
|
21
|
+
key: string;
|
|
22
|
+
label: string;
|
|
23
|
+
type?: 'text' | 'boolean' | 'date' | 'custom';
|
|
24
|
+
customCellTpl?: TemplateRef<any>;
|
|
25
|
+
filterConfig?: FilterConfig;
|
|
26
|
+
}
|
|
27
|
+
interface TableAction {
|
|
28
|
+
icon: MTIcon | undefined;
|
|
29
|
+
color?: 'info' | 'success' | 'warn' | 'danger' | 'secondary' | 'contrast' | 'help' | 'primary';
|
|
30
|
+
variant?: 'text' | 'outlined' | undefined;
|
|
31
|
+
label: string;
|
|
32
|
+
action: (row: any) => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
declare class Table {
|
|
36
|
+
selectionChange: _angular_core.OutputEmitterRef<any[]>;
|
|
37
|
+
data: _angular_core.InputSignal<any[]>;
|
|
38
|
+
columns: _angular_core.InputSignal<ColumnDef[]>;
|
|
39
|
+
actions: _angular_core.InputSignal<TableAction[]>;
|
|
40
|
+
selectableRows: _angular_core.InputSignal<boolean>;
|
|
41
|
+
generalSearch: _angular_core.InputSignal<boolean>;
|
|
42
|
+
showFilters: _angular_core.InputSignal<boolean>;
|
|
43
|
+
paginatorPosition: _angular_core.InputSignal<"end" | "start" | "center">;
|
|
44
|
+
pageSize: _angular_core.ModelSignal<number>;
|
|
45
|
+
currentPage: _angular_core.ModelSignal<number>;
|
|
46
|
+
first: _angular_core.ModelSignal<number>;
|
|
47
|
+
filterTerm: _angular_core.ModelSignal<string>;
|
|
48
|
+
protected selectedRows: _angular_core.WritableSignal<Set<any>>;
|
|
49
|
+
protected isFilterPanelOpen: _angular_core.WritableSignal<boolean>;
|
|
50
|
+
protected pendingFilters: _angular_core.WritableSignal<Record<string, any>>;
|
|
51
|
+
protected appliedFilters: _angular_core.WritableSignal<Record<string, any>>;
|
|
52
|
+
protected filterableColumns: _angular_core.Signal<ColumnDef[]>;
|
|
53
|
+
protected activeFilterCount: _angular_core.Signal<number>;
|
|
54
|
+
protected filteredData: _angular_core.Signal<any[]>;
|
|
55
|
+
protected totalRecords: _angular_core.Signal<number>;
|
|
56
|
+
protected paginatedData: _angular_core.Signal<any[]>;
|
|
57
|
+
protected allSelectedOnPage: _angular_core.Signal<boolean>;
|
|
58
|
+
toggleFilterPanel(): void;
|
|
59
|
+
updatePendingFilter(key: string, value: any): void;
|
|
60
|
+
applyFilters(): void;
|
|
61
|
+
resetFilters(): void;
|
|
62
|
+
toggleRow(row: any): void;
|
|
63
|
+
toggleAllRowsOnPage(): void;
|
|
64
|
+
getProperty(obj: any, key: string): any;
|
|
65
|
+
onSearchChange(searchTerm: Event): void;
|
|
66
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Table, never>;
|
|
67
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<Table, "mt-table", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "selectableRows": { "alias": "selectableRows"; "required": false; "isSignal": true; }; "generalSearch": { "alias": "generalSearch"; "required": false; "isSignal": true; }; "showFilters": { "alias": "showFilters"; "required": false; "isSignal": true; }; "paginatorPosition": { "alias": "paginatorPosition"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "currentPage": { "alias": "currentPage"; "required": false; "isSignal": true; }; "first": { "alias": "first"; "required": false; "isSignal": true; }; "filterTerm": { "alias": "filterTerm"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "pageSize": "pageSizeChange"; "currentPage": "currentPageChange"; "first": "firstChange"; "filterTerm": "filterTermChange"; }, never, never, true, never>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { Table };
|