@webilix/ngx-table-m3 0.0.24 → 0.0.26
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/fesm2022/webilix-ngx-table-m3.mjs +171 -118
- package/fesm2022/webilix-ngx-table-m3.mjs.map +1 -1
- package/index.d.ts +35 -26
- package/package.json +1 -1
|
@@ -17,7 +17,7 @@ import * as i1$1 from '@angular/router';
|
|
|
17
17
|
import { MatDivider } from '@angular/material/divider';
|
|
18
18
|
import * as i1$2 from '@angular/material/menu';
|
|
19
19
|
import { MatMenuModule } from '@angular/material/menu';
|
|
20
|
-
import * as
|
|
20
|
+
import * as i3 from '@angular/cdk/clipboard';
|
|
21
21
|
import { ClipboardModule } from '@angular/cdk/clipboard';
|
|
22
22
|
import { trigger, transition, style, animate } from '@angular/animations';
|
|
23
23
|
|
|
@@ -729,6 +729,41 @@ class ColumnPeriodMethods extends ColumnMethods {
|
|
|
729
729
|
}
|
|
730
730
|
}
|
|
731
731
|
|
|
732
|
+
class ColumnTagComponent {
|
|
733
|
+
router;
|
|
734
|
+
column = inject(COLUMN_TYPE);
|
|
735
|
+
value = inject(COLUMN_VALUE);
|
|
736
|
+
config = inject(COLUMN_CONFIG);
|
|
737
|
+
constructor(router) {
|
|
738
|
+
this.router = router;
|
|
739
|
+
}
|
|
740
|
+
onTagClick(id) {
|
|
741
|
+
if (!this.column.onTagClick)
|
|
742
|
+
return;
|
|
743
|
+
const action = this.column.onTagClick(id);
|
|
744
|
+
if (action)
|
|
745
|
+
this.router.navigate(action);
|
|
746
|
+
}
|
|
747
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ColumnTagComponent, deps: [{ token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
748
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: ColumnTagComponent, isStandalone: true, selector: "ng-component", host: { attributes: { "selector": "column-tag" } }, ngImport: i0, template: "<div [style.display]=\"'inline-block'\" [class.ngx-table-m3-deactive]=\"config.isDeactive\">\n @for (item of value; track $index) {\n <div class=\"tag\" [class.tag-action]=\"!!column.onTagClick\" (click)=\"onTagClick(item.id)\">\n @if (column.onTagClick) { <mat-icon>open_in_new</mat-icon> }\n <div class=\"title\">{{ item.title }}</div>\n </div>\n }\n</div>\n", styles: [".tag{display:flex;align-items:center}.tag .title{flex:1;font-size:85%}.tag mat-icon{font-size:85%}.tag-action{cursor:pointer}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
749
|
+
}
|
|
750
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ColumnTagComponent, decorators: [{
|
|
751
|
+
type: Component,
|
|
752
|
+
args: [{ host: { selector: 'column-tag' }, imports: [MatIcon], template: "<div [style.display]=\"'inline-block'\" [class.ngx-table-m3-deactive]=\"config.isDeactive\">\n @for (item of value; track $index) {\n <div class=\"tag\" [class.tag-action]=\"!!column.onTagClick\" (click)=\"onTagClick(item.id)\">\n @if (column.onTagClick) { <mat-icon>open_in_new</mat-icon> }\n <div class=\"title\">{{ item.title }}</div>\n </div>\n }\n</div>\n", styles: [".tag{display:flex;align-items:center}.tag .title{flex:1;font-size:85%}.tag mat-icon{font-size:85%}.tag-action{cursor:pointer}\n"] }]
|
|
753
|
+
}], ctorParameters: () => [{ type: i1$1.Router }] });
|
|
754
|
+
|
|
755
|
+
class ColumnTagMethods extends ColumnMethods {
|
|
756
|
+
column(column) {
|
|
757
|
+
return { ...column, title: column.title || 'تگ' };
|
|
758
|
+
}
|
|
759
|
+
value(value, column) {
|
|
760
|
+
const list = (Helper.IS.array(value) ? value : [])
|
|
761
|
+
.filter((item) => !!item.id && !!item.title)
|
|
762
|
+
.sort((i1, i2) => i1.title.localeCompare(i2.title));
|
|
763
|
+
return list.length > 0 ? list : undefined;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
732
767
|
class ColumnTextComponent {
|
|
733
768
|
column = inject(COLUMN_TYPE);
|
|
734
769
|
value = inject(COLUMN_VALUE);
|
|
@@ -778,12 +813,119 @@ const ColumnInfo = {
|
|
|
778
813
|
MOBILE: { methods: new ColumnMobileMethods(), component: ColumnMobileComponent },
|
|
779
814
|
NUMBER: { methods: new ColumnNumberMethods(), component: ColumnNumberComponent },
|
|
780
815
|
PERIOD: { methods: new ColumnPeriodMethods(), component: ColumnPeriodComponent },
|
|
816
|
+
TAG: { methods: new ColumnTagMethods(), component: ColumnTagComponent },
|
|
781
817
|
TEXT: { methods: new ColumnTextMethods(), component: ColumnTextComponent },
|
|
782
818
|
WEIGHT: { methods: new ColumnWeightMethods(), component: ColumnWeightComponent },
|
|
783
819
|
};
|
|
784
820
|
|
|
821
|
+
class ViewService {
|
|
822
|
+
activatedRoute;
|
|
823
|
+
constructor(activatedRoute) {
|
|
824
|
+
this.activatedRoute = activatedRoute;
|
|
825
|
+
}
|
|
826
|
+
getTitleIndex(ngxTable) {
|
|
827
|
+
const index = ngxTable.columns.findIndex((l) => 'mode' in l && l.mode === 'TITLE');
|
|
828
|
+
return index === -1 ? 0 : index;
|
|
829
|
+
}
|
|
830
|
+
getSubTitleIndex(ngxTable) {
|
|
831
|
+
const index = ngxTable.columns.findIndex((l) => 'mode' in l && l.mode === 'SUBTITLE');
|
|
832
|
+
return index === -1 ? undefined : index;
|
|
833
|
+
}
|
|
834
|
+
getValue(column, item) {
|
|
835
|
+
const value = typeof column.value === 'function' ? column.value(item) : item[column.value];
|
|
836
|
+
if (Helper.IS.empty(value))
|
|
837
|
+
return undefined;
|
|
838
|
+
return ColumnInfo[column.type].methods.value(value, column);
|
|
839
|
+
}
|
|
840
|
+
getIcons(ngxTable, data) {
|
|
841
|
+
const iconFn = ngxTable.rows?.icon;
|
|
842
|
+
if (!iconFn)
|
|
843
|
+
return [];
|
|
844
|
+
return data.map((item, index) => {
|
|
845
|
+
const icon = iconFn(item, index);
|
|
846
|
+
return typeof icon === 'string'
|
|
847
|
+
? { icon }
|
|
848
|
+
: 'emoji' in icon
|
|
849
|
+
? { icon: '' }
|
|
850
|
+
: { icon: icon.icon, color: icon.color || undefined };
|
|
851
|
+
});
|
|
852
|
+
}
|
|
853
|
+
getEmojis(ngxTable, data) {
|
|
854
|
+
const iconFn = ngxTable.rows?.icon;
|
|
855
|
+
if (!iconFn)
|
|
856
|
+
return [];
|
|
857
|
+
return data.map((item, index) => {
|
|
858
|
+
const icon = iconFn(item, index);
|
|
859
|
+
return typeof icon === 'string' ? '' : 'emoji' in icon ? icon.emoji : '';
|
|
860
|
+
});
|
|
861
|
+
}
|
|
862
|
+
getColors(ngxTable, data) {
|
|
863
|
+
const colorFn = ngxTable.rows?.color;
|
|
864
|
+
if (!colorFn)
|
|
865
|
+
return [];
|
|
866
|
+
return data.map((item, index) => colorFn(item, index) || '');
|
|
867
|
+
}
|
|
868
|
+
getDescriptions(ngxTable, data) {
|
|
869
|
+
const descriptionFn = ngxTable.rows?.description;
|
|
870
|
+
if (!descriptionFn)
|
|
871
|
+
return [];
|
|
872
|
+
return data.map((item, index) => descriptionFn(item, index) || undefined);
|
|
873
|
+
}
|
|
874
|
+
getDeactives(ngxTable, data) {
|
|
875
|
+
const deactives = [];
|
|
876
|
+
data.forEach((item, index) => {
|
|
877
|
+
if (ngxTable.rows?.isDeactive?.(item, index))
|
|
878
|
+
deactives.push(index);
|
|
879
|
+
});
|
|
880
|
+
return deactives;
|
|
881
|
+
}
|
|
882
|
+
getOrders(ngxTable) {
|
|
883
|
+
let defaultFound = false;
|
|
884
|
+
const orders = {};
|
|
885
|
+
// CHECK COLUMNS
|
|
886
|
+
ngxTable.columns.forEach((column) => {
|
|
887
|
+
if (!column.tools || !('order' in column.tools) || !column.tools.order)
|
|
888
|
+
return;
|
|
889
|
+
const title = column.title || '';
|
|
890
|
+
const key = column.tools.id;
|
|
891
|
+
const type = column.tools.order.type || 'ORDER';
|
|
892
|
+
const initial = type !== 'ORDER' ? type : column.tools.order.initial || 'ASC';
|
|
893
|
+
const isDefault = !defaultFound && !!column.tools.order.isDefault;
|
|
894
|
+
orders[key] = { title, type, initial, current: isDefault ? initial : undefined };
|
|
895
|
+
if (isDefault)
|
|
896
|
+
defaultFound = true;
|
|
897
|
+
});
|
|
898
|
+
if (Object.keys(orders).length === 0)
|
|
899
|
+
return {};
|
|
900
|
+
// CHECK QUERY PARAMS
|
|
901
|
+
const queryParams = { ...this.activatedRoute.snapshot.queryParams };
|
|
902
|
+
if (!!ngxTable.route && queryParams['ngx-table-order']) {
|
|
903
|
+
const param = queryParams['ngx-table-order'];
|
|
904
|
+
const index = param.lastIndexOf(':');
|
|
905
|
+
if (index !== -1) {
|
|
906
|
+
const id = param.substring(0, index);
|
|
907
|
+
const type = param.substring(index + 1);
|
|
908
|
+
if (orders[id] &&
|
|
909
|
+
(type === 'ASC' || type === 'DESC') &&
|
|
910
|
+
(orders[id].type === 'ORDER' || orders[id].type === type)) {
|
|
911
|
+
Object.keys(orders).forEach((key) => {
|
|
912
|
+
orders[key] = { ...orders[key], current: key === id ? type : undefined };
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
return orders;
|
|
918
|
+
}
|
|
919
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewService, deps: [{ token: i1$1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
920
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewService });
|
|
921
|
+
}
|
|
922
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewService, decorators: [{
|
|
923
|
+
type: Injectable
|
|
924
|
+
}], ctorParameters: () => [{ type: i1$1.ActivatedRoute }] });
|
|
925
|
+
|
|
785
926
|
class ViewValueComponent {
|
|
786
927
|
router;
|
|
928
|
+
viewService;
|
|
787
929
|
className = 'ngx-table-m3-value';
|
|
788
930
|
textAlign = 'left';
|
|
789
931
|
column;
|
|
@@ -802,20 +944,22 @@ class ViewValueComponent {
|
|
|
802
944
|
copyText;
|
|
803
945
|
isCopied = false;
|
|
804
946
|
copyTimeout;
|
|
805
|
-
constructor(router) {
|
|
947
|
+
constructor(router, viewService) {
|
|
806
948
|
this.router = router;
|
|
949
|
+
this.viewService = viewService;
|
|
807
950
|
}
|
|
808
951
|
ngOnChanges(changes) {
|
|
809
952
|
this.textAlign = this.isCard ? 'right' : (this.column.textAlign || 'RIGHT').toLocaleLowerCase();
|
|
810
|
-
this.value = this.getValue();
|
|
953
|
+
this.value = this.viewService.getValue(this.column, this.item);
|
|
811
954
|
this.subValue = this.getSubValue();
|
|
812
955
|
this.color = this.column.color
|
|
813
956
|
? typeof this.column.color === 'function'
|
|
814
957
|
? this.column.color(this.item) || undefined
|
|
815
958
|
: this.column.color
|
|
816
959
|
: undefined;
|
|
817
|
-
this.hasClick = !!this.column.onClick;
|
|
818
|
-
this.copyText =
|
|
960
|
+
this.hasClick = 'onClick' in this.column && !!this.column.onClick;
|
|
961
|
+
this.copyText =
|
|
962
|
+
!this.hasClick && 'onCopy' in this.column && this.column.onCopy ? this.column.onCopy(this.item) : undefined;
|
|
819
963
|
const columnConfig = {
|
|
820
964
|
isEN: 'english' in this.column && this.column.english
|
|
821
965
|
? typeof this.column.english === 'function'
|
|
@@ -832,14 +976,8 @@ class ViewValueComponent {
|
|
|
832
976
|
],
|
|
833
977
|
});
|
|
834
978
|
}
|
|
835
|
-
getValue() {
|
|
836
|
-
const value = typeof this.column.value === 'function' ? this.column.value(this.item) : this.item[this.column.value];
|
|
837
|
-
if (Helper.IS.empty(value))
|
|
838
|
-
return undefined;
|
|
839
|
-
return ColumnInfo[this.column.type].methods.value(value, this.column);
|
|
840
|
-
}
|
|
841
979
|
getSubValue() {
|
|
842
|
-
if (!this.column.subValue)
|
|
980
|
+
if (!('subValue' in this.column) || !this.column.subValue)
|
|
843
981
|
return undefined;
|
|
844
982
|
if (typeof this.column.subValue === 'function') {
|
|
845
983
|
const subValue = this.column.subValue(this.item);
|
|
@@ -858,7 +996,7 @@ class ViewValueComponent {
|
|
|
858
996
|
}
|
|
859
997
|
}
|
|
860
998
|
onClick() {
|
|
861
|
-
if (!this.column.onClick)
|
|
999
|
+
if (!('onClick' in this.column) || !this.column.onClick)
|
|
862
1000
|
return;
|
|
863
1001
|
const onClick = this.column.onClick(this.item);
|
|
864
1002
|
if (typeof onClick === 'function')
|
|
@@ -877,13 +1015,13 @@ class ViewValueComponent {
|
|
|
877
1015
|
this.copyTimeout = undefined;
|
|
878
1016
|
}, 2000);
|
|
879
1017
|
}
|
|
880
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewValueComponent, deps: [{ token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
881
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: ViewValueComponent, isStandalone: true, selector: "view-value", inputs: { column: "column", item: "item", viewConfig: "viewConfig", isDeactive: "isDeactive", isCard: "isCard", isCardTitle: "isCardTitle", isCardSubTitle: "isCardSubTitle" }, host: { properties: { "className": "this.className", "style.text-align": "this.textAlign" } }, usesOnChanges: true, ngImport: i0, template: "<!-- EMPTY VALUE -->\n@if (value === undefined) { }\n\n<!-- SHOW VALUE -->\n@else {\n<div class=\"value-container\" [style.color]=\"color\" [class.card-title]=\"isCardTitle\" [class.card-sub-title]=\"isCardSubTitle\">\n <div\n class=\"value\"\n [style.cursor]=\"hasClick || copyText ? 'pointer' : 'default'\"\n (click)=\"hasClick ? onClick() : copyText ? onCopy() : null\"\n [cdkCopyToClipboard]=\"copyText || ''\"\n >\n <ng-container *ngComponentOutlet=\"columnInfo[column.type].component; injector: injector\"></ng-container>\n <!-- CLICK -->\n @if (hasClick) { <mat-icon>open_in_new</mat-icon> }\n <!-- COPY -->\n @if (copyText) { <mat-icon>{{ isCopied ? 'done_all' : 'copy' }}</mat-icon> }\n </div>\n\n <!-- SUB VALUE -->\n @if (subValue) {\n <div class=\"sub-value\" [class.ngx-table-m3-en]=\"subValue.isEN\">{{ subValue.value }}</div>\n }\n</div>\n}\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: ClipboardModule }, { kind: "directive", type:
|
|
1018
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewValueComponent, deps: [{ token: i1$1.Router }, { token: ViewService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1019
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: ViewValueComponent, isStandalone: true, selector: "view-value", inputs: { column: "column", item: "item", viewConfig: "viewConfig", isDeactive: "isDeactive", isCard: "isCard", isCardTitle: "isCardTitle", isCardSubTitle: "isCardSubTitle" }, host: { properties: { "className": "this.className", "style.text-align": "this.textAlign" } }, usesOnChanges: true, ngImport: i0, template: "<!-- EMPTY VALUE -->\n@if (value === undefined) { }\n\n<!-- SHOW VALUE -->\n@else {\n<div class=\"value-container\" [style.color]=\"color\" [class.card-title]=\"isCardTitle\" [class.card-sub-title]=\"isCardSubTitle\">\n <div\n class=\"value\"\n [style.cursor]=\"hasClick || copyText ? 'pointer' : 'default'\"\n (click)=\"hasClick ? onClick() : copyText ? onCopy() : null\"\n [cdkCopyToClipboard]=\"copyText || ''\"\n >\n <ng-container *ngComponentOutlet=\"columnInfo[column.type].component; injector: injector\"></ng-container>\n <!-- CLICK -->\n @if (hasClick) { <mat-icon>open_in_new</mat-icon> }\n <!-- COPY -->\n @if (copyText) { <mat-icon>{{ isCopied ? 'done_all' : 'copy' }}</mat-icon> }\n </div>\n\n <!-- SUB VALUE -->\n @if (subValue) {\n <div class=\"sub-value\" [class.ngx-table-m3-en]=\"subValue.isEN\">{{ subValue.value }}</div>\n }\n</div>\n}\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: ClipboardModule }, { kind: "directive", type: i3.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
882
1020
|
}
|
|
883
1021
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewValueComponent, decorators: [{
|
|
884
1022
|
type: Component,
|
|
885
1023
|
args: [{ selector: 'view-value', imports: [NgComponentOutlet, ClipboardModule, MatIcon], template: "<!-- EMPTY VALUE -->\n@if (value === undefined) { }\n\n<!-- SHOW VALUE -->\n@else {\n<div class=\"value-container\" [style.color]=\"color\" [class.card-title]=\"isCardTitle\" [class.card-sub-title]=\"isCardSubTitle\">\n <div\n class=\"value\"\n [style.cursor]=\"hasClick || copyText ? 'pointer' : 'default'\"\n (click)=\"hasClick ? onClick() : copyText ? onCopy() : null\"\n [cdkCopyToClipboard]=\"copyText || ''\"\n >\n <ng-container *ngComponentOutlet=\"columnInfo[column.type].component; injector: injector\"></ng-container>\n <!-- CLICK -->\n @if (hasClick) { <mat-icon>open_in_new</mat-icon> }\n <!-- COPY -->\n @if (copyText) { <mat-icon>{{ isCopied ? 'done_all' : 'copy' }}</mat-icon> }\n </div>\n\n <!-- SUB VALUE -->\n @if (subValue) {\n <div class=\"sub-value\" [class.ngx-table-m3-en]=\"subValue.isEN\">{{ subValue.value }}</div>\n }\n</div>\n}\n" }]
|
|
886
|
-
}], ctorParameters: () => [{ type: i1$1.Router }], propDecorators: { className: [{
|
|
1024
|
+
}], ctorParameters: () => [{ type: i1$1.Router }, { type: ViewService }], propDecorators: { className: [{
|
|
887
1025
|
type: HostBinding,
|
|
888
1026
|
args: ['className']
|
|
889
1027
|
}], textAlign: [{
|
|
@@ -912,105 +1050,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
912
1050
|
args: [{ required: false }]
|
|
913
1051
|
}] } });
|
|
914
1052
|
|
|
915
|
-
class ViewService {
|
|
916
|
-
activatedRoute;
|
|
917
|
-
constructor(activatedRoute) {
|
|
918
|
-
this.activatedRoute = activatedRoute;
|
|
919
|
-
}
|
|
920
|
-
getTitleIndex(ngxTable) {
|
|
921
|
-
const index = ngxTable.columns.findIndex((l) => l.mode === 'TITLE');
|
|
922
|
-
return index === -1 ? 0 : index;
|
|
923
|
-
}
|
|
924
|
-
getSubTitleIndex(ngxTable) {
|
|
925
|
-
const index = ngxTable.columns.findIndex((l) => l.mode === 'SUBTITLE');
|
|
926
|
-
return index === -1 ? undefined : index;
|
|
927
|
-
}
|
|
928
|
-
getIcons(ngxTable, data) {
|
|
929
|
-
const iconFn = ngxTable.rows?.icon;
|
|
930
|
-
if (!iconFn)
|
|
931
|
-
return [];
|
|
932
|
-
return data.map((item, index) => {
|
|
933
|
-
const icon = iconFn(item, index);
|
|
934
|
-
return typeof icon === 'string'
|
|
935
|
-
? { icon }
|
|
936
|
-
: 'emoji' in icon
|
|
937
|
-
? { icon: '' }
|
|
938
|
-
: { icon: icon.icon, color: icon.color || undefined };
|
|
939
|
-
});
|
|
940
|
-
}
|
|
941
|
-
getEmojis(ngxTable, data) {
|
|
942
|
-
const iconFn = ngxTable.rows?.icon;
|
|
943
|
-
if (!iconFn)
|
|
944
|
-
return [];
|
|
945
|
-
return data.map((item, index) => {
|
|
946
|
-
const icon = iconFn(item, index);
|
|
947
|
-
return typeof icon === 'string' ? '' : 'emoji' in icon ? icon.emoji : '';
|
|
948
|
-
});
|
|
949
|
-
}
|
|
950
|
-
getColors(ngxTable, data) {
|
|
951
|
-
const colorFn = ngxTable.rows?.color;
|
|
952
|
-
if (!colorFn)
|
|
953
|
-
return [];
|
|
954
|
-
return data.map((item, index) => colorFn(item, index) || '');
|
|
955
|
-
}
|
|
956
|
-
getDescriptions(ngxTable, data) {
|
|
957
|
-
const descriptionFn = ngxTable.rows?.description;
|
|
958
|
-
if (!descriptionFn)
|
|
959
|
-
return [];
|
|
960
|
-
return data.map((item, index) => descriptionFn(item, index) || undefined);
|
|
961
|
-
}
|
|
962
|
-
getDeactives(ngxTable, data) {
|
|
963
|
-
const deactives = [];
|
|
964
|
-
data.forEach((item, index) => {
|
|
965
|
-
if (ngxTable.rows?.isDeactive?.(item, index))
|
|
966
|
-
deactives.push(index);
|
|
967
|
-
});
|
|
968
|
-
return deactives;
|
|
969
|
-
}
|
|
970
|
-
getOrders(ngxTable) {
|
|
971
|
-
let defaultFound = false;
|
|
972
|
-
const orders = {};
|
|
973
|
-
// CHECK COLUMNS
|
|
974
|
-
ngxTable.columns.forEach((column) => {
|
|
975
|
-
if (!column.tools || !('order' in column.tools) || !column.tools.order)
|
|
976
|
-
return;
|
|
977
|
-
const title = column.title || '';
|
|
978
|
-
const key = column.tools.id;
|
|
979
|
-
const type = column.tools.order.type || 'ORDER';
|
|
980
|
-
const initial = type !== 'ORDER' ? type : column.tools.order.initial || 'ASC';
|
|
981
|
-
const isDefault = !defaultFound && !!column.tools.order.isDefault;
|
|
982
|
-
orders[key] = { title, type, initial, current: isDefault ? initial : undefined };
|
|
983
|
-
if (isDefault)
|
|
984
|
-
defaultFound = true;
|
|
985
|
-
});
|
|
986
|
-
if (Object.keys(orders).length === 0)
|
|
987
|
-
return {};
|
|
988
|
-
// CHECK QUERY PARAMS
|
|
989
|
-
const queryParams = { ...this.activatedRoute.snapshot.queryParams };
|
|
990
|
-
if (!!ngxTable.route && queryParams['ngx-table-order']) {
|
|
991
|
-
const param = queryParams['ngx-table-order'];
|
|
992
|
-
const index = param.lastIndexOf(':');
|
|
993
|
-
if (index !== -1) {
|
|
994
|
-
const id = param.substring(0, index);
|
|
995
|
-
const type = param.substring(index + 1);
|
|
996
|
-
if (orders[id] &&
|
|
997
|
-
(type === 'ASC' || type === 'DESC') &&
|
|
998
|
-
(orders[id].type === 'ORDER' || orders[id].type === type)) {
|
|
999
|
-
Object.keys(orders).forEach((key) => {
|
|
1000
|
-
orders[key] = { ...orders[key], current: key === id ? type : undefined };
|
|
1001
|
-
});
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
return orders;
|
|
1006
|
-
}
|
|
1007
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewService, deps: [{ token: i1$1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1008
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewService });
|
|
1009
|
-
}
|
|
1010
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewService, decorators: [{
|
|
1011
|
-
type: Injectable
|
|
1012
|
-
}], ctorParameters: () => [{ type: i1$1.ActivatedRoute }] });
|
|
1013
|
-
|
|
1014
1053
|
class ViewCardToolbarComponent {
|
|
1015
1054
|
className = 'ngx-table-m3-card-view-toolbar';
|
|
1016
1055
|
orders;
|
|
@@ -1133,7 +1172,9 @@ class ViewCardComponent {
|
|
|
1133
1172
|
this.hasToolbar = Object.keys(this.orders).length > 0 || Object.keys(this.filters).length > 0;
|
|
1134
1173
|
const top = this.viewConfig.stickyView?.top?.mobileView;
|
|
1135
1174
|
this.top = top ? (this.hasToolbar ? `calc(${top} + var(--ngx-table-m3-toolbar-height) + 1rem + 2px)` : top) : '';
|
|
1136
|
-
this.hasContent =
|
|
1175
|
+
this.hasContent =
|
|
1176
|
+
this.descriptions.some((d) => !!d) ||
|
|
1177
|
+
this.ngxTable.columns.some((_, index) => index != this.titleIndex && index !== this.subTitleIndex);
|
|
1137
1178
|
}
|
|
1138
1179
|
updateFilter(id) {
|
|
1139
1180
|
const filter = this.filters[id];
|
|
@@ -1146,12 +1187,23 @@ class ViewCardComponent {
|
|
|
1146
1187
|
this.filterChanged.next({ id, value: filter.value });
|
|
1147
1188
|
});
|
|
1148
1189
|
}
|
|
1190
|
+
showContent(dataInndex) {
|
|
1191
|
+
if (!this.viewConfig.minimalCardView)
|
|
1192
|
+
return true;
|
|
1193
|
+
const hasColumn = this.ngxTable.columns.some((column, index) => index != this.titleIndex && index !== this.subTitleIndex && this.showItem(column, this.data[dataInndex]));
|
|
1194
|
+
return !!this.descriptions[dataInndex] || hasColumn;
|
|
1195
|
+
}
|
|
1196
|
+
showItem(column, item) {
|
|
1197
|
+
if (!this.viewConfig.minimalCardView)
|
|
1198
|
+
return true;
|
|
1199
|
+
return !!this.viewService.getValue(column, item);
|
|
1200
|
+
}
|
|
1149
1201
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewCardComponent, deps: [{ token: FilterService }, { token: ViewService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1150
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: ViewCardComponent, isStandalone: true, selector: "view-card", inputs: { ngxTable: "ngxTable", data: "data", viewConfig: "viewConfig" }, outputs: { orderChanged: "orderChanged", filterChanged: "filterChanged", filterCleared: "filterCleared" }, host: { properties: { "className": "this.className" } }, providers: [FilterService, ViewService], usesOnChanges: true, ngImport: i0, template: "<!-- TOOLBAR -->\n@if (hasToolbar) {\n<view-card-toolbar\n [orders]=\"orders\"\n [filters]=\"filters\"\n [viewConfig]=\"viewConfig\"\n (orderChanged)=\"orderChanged.next($event)\"\n (updateFilter)=\"updateFilter($event)\"\n (clearFilter)=\"filterCleared.next()\"\n></view-card-toolbar>\n}\n\n<!-- DATA -->\n<div class=\"card-container\">\n @for (item of data; track $index; let dataIndex = $index) {\n <div class=\"card\">\n <div class=\"card-header\" [style.position]=\"viewConfig.stickyView?.top ? 'sticky' : 'static'\" [style.top]=\"top\">\n <!-- ICON -->\n @if (hasIcon) {\n <!-- MATERIAL ICON -->\n @if (icons[$index].icon) {\n <mat-icon class=\"icon\" [style.color]=\"icons[$index].color\" [style.font-size]=\"viewConfig.iconSize\">\n {{ icons[$index].icon }}\n </mat-icon>\n }\n <!-- EMOJI -->\n @else {\n <td class=\"emoji\" [style.font-size]=\"viewConfig.emojiSize\">{{ emojis[$index] || '' }}</td>\n } }\n\n <!-- TITLE -->\n <div class=\"title\" [style.color]=\"colors[dataIndex]\">\n <view-value\n [column]=\"ngxTable.columns[this.titleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isDeactive]=\"deactives.includes(dataIndex)\"\n [isCard]=\"true\"\n [isCardTitle]=\"true\"\n ></view-value>\n <!-- SUB TITLE -->\n @if (subTitleIndex !== undefined) {\n <view-value\n [column]=\"ngxTable.columns[this.subTitleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isCard]=\"true\"\n [isCardSubTitle]=\"true\"\n ></view-value>\n }\n </div>\n\n <!-- ACTION -->\n @if (hasAction) {\n <view-action\n [actions]=\"ngxTable.actions || []\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isMobile]=\"true\"\n ></view-action>\n }\n </div>\n\n <!-- CONTENT -->\n @if (hasContent) {\n <div class=\"card-content\" [style.color]=\"colors[dataIndex]\">\n @for (column of ngxTable.columns; track $index; let columnIndex = $index) {\n <!-- CHECK TITLE AND SUBTITLE -->\n @if (columnIndex !== titleIndex && columnIndex !== subTitleIndex) {\n <div class=\"item\">\n <div class=\"title\">{{ column.title }}{{ !!column.title ? ' :' : '' }}</div>\n <div class=\"value\">\n <view-value [column]=\"column\" [item]=\"item\" [viewConfig]=\"viewConfig\" [isCard]=\"true\"></view-value>\n </div>\n </div>\n } }\n\n <!-- DESCRIPTION -->\n @if (descriptions[dataIndex]) {\n <div class=\"description\" [innerHTML]=\"descriptions[dataIndex] || '' | ngxHelperMultiLine\"></div>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ViewActionComponent, selector: "view-action", inputs: ["actions", "item", "viewConfig", "isMobile"] }, { kind: "component", type: ViewValueComponent, selector: "view-value", inputs: ["column", "item", "viewConfig", "isDeactive", "isCard", "isCardTitle", "isCardSubTitle"] }, { kind: "component", type: ViewCardToolbarComponent, selector: "view-card-toolbar", inputs: ["orders", "filters", "viewConfig"], outputs: ["orderChanged", "updateFilter", "clearFilter"] }, { kind: "pipe", type: NgxHelperMultiLinePipe, name: "ngxHelperMultiLine" }] });
|
|
1202
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: ViewCardComponent, isStandalone: true, selector: "view-card", inputs: { ngxTable: "ngxTable", data: "data", viewConfig: "viewConfig" }, outputs: { orderChanged: "orderChanged", filterChanged: "filterChanged", filterCleared: "filterCleared" }, host: { properties: { "className": "this.className" } }, providers: [FilterService, ViewService], usesOnChanges: true, ngImport: i0, template: "<!-- TOOLBAR -->\n@if (hasToolbar) {\n<view-card-toolbar\n [orders]=\"orders\"\n [filters]=\"filters\"\n [viewConfig]=\"viewConfig\"\n (orderChanged)=\"orderChanged.next($event)\"\n (updateFilter)=\"updateFilter($event)\"\n (clearFilter)=\"filterCleared.next()\"\n></view-card-toolbar>\n}\n\n<!-- DATA -->\n<div class=\"card-container\">\n @for (item of data; track $index; let dataIndex = $index) {\n <div class=\"card\">\n <div class=\"card-header\" [style.position]=\"viewConfig.stickyView?.top ? 'sticky' : 'static'\" [style.top]=\"top\">\n <!-- ICON -->\n @if (hasIcon) {\n <!-- MATERIAL ICON -->\n @if (icons[$index].icon) {\n <mat-icon class=\"icon\" [style.color]=\"icons[$index].color\" [style.font-size]=\"viewConfig.iconSize\">\n {{ icons[$index].icon }}\n </mat-icon>\n }\n <!-- EMOJI -->\n @else {\n <td class=\"emoji\" [style.font-size]=\"viewConfig.emojiSize\">{{ emojis[$index] || '' }}</td>\n } }\n\n <!-- TITLE -->\n <div class=\"title\" [style.color]=\"colors[dataIndex]\">\n <view-value\n [column]=\"ngxTable.columns[this.titleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isDeactive]=\"deactives.includes(dataIndex)\"\n [isCard]=\"true\"\n [isCardTitle]=\"true\"\n ></view-value>\n <!-- SUB TITLE -->\n @if (subTitleIndex !== undefined) {\n <view-value\n [column]=\"ngxTable.columns[this.subTitleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isCard]=\"true\"\n [isCardSubTitle]=\"true\"\n ></view-value>\n }\n </div>\n\n <!-- ACTION -->\n @if (hasAction) {\n <view-action\n [actions]=\"ngxTable.actions || []\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isMobile]=\"true\"\n ></view-action>\n }\n </div>\n\n <!-- CONTENT -->\n @if (hasContent && showContent(dataIndex)) {\n <div class=\"card-content\" [style.color]=\"colors[dataIndex]\">\n @for (column of ngxTable.columns; track $index; let columnIndex = $index) {\n <!-- CHECK TITLE AND SUBTITLE AND VALUE -->\n @if (columnIndex !== titleIndex && columnIndex !== subTitleIndex && showItem(column, item)) {\n <div class=\"item\">\n <div class=\"title\">{{ column.title }}{{ !!column.title ? ' :' : '' }}</div>\n <div class=\"value\">\n <view-value [column]=\"column\" [item]=\"item\" [viewConfig]=\"viewConfig\" [isCard]=\"true\"></view-value>\n </div>\n </div>\n } }\n\n <!-- DESCRIPTION -->\n @if (descriptions[dataIndex]) {\n <div class=\"description\" [innerHTML]=\"descriptions[dataIndex] || '' | ngxHelperMultiLine\"></div>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ViewActionComponent, selector: "view-action", inputs: ["actions", "item", "viewConfig", "isMobile"] }, { kind: "component", type: ViewValueComponent, selector: "view-value", inputs: ["column", "item", "viewConfig", "isDeactive", "isCard", "isCardTitle", "isCardSubTitle"] }, { kind: "component", type: ViewCardToolbarComponent, selector: "view-card-toolbar", inputs: ["orders", "filters", "viewConfig"], outputs: ["orderChanged", "updateFilter", "clearFilter"] }, { kind: "pipe", type: NgxHelperMultiLinePipe, name: "ngxHelperMultiLine" }] });
|
|
1151
1203
|
}
|
|
1152
1204
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ViewCardComponent, decorators: [{
|
|
1153
1205
|
type: Component,
|
|
1154
|
-
args: [{ selector: 'view-card', imports: [MatIcon, NgxHelperMultiLinePipe, ViewActionComponent, ViewValueComponent, ViewCardToolbarComponent], providers: [FilterService, ViewService], template: "<!-- TOOLBAR -->\n@if (hasToolbar) {\n<view-card-toolbar\n [orders]=\"orders\"\n [filters]=\"filters\"\n [viewConfig]=\"viewConfig\"\n (orderChanged)=\"orderChanged.next($event)\"\n (updateFilter)=\"updateFilter($event)\"\n (clearFilter)=\"filterCleared.next()\"\n></view-card-toolbar>\n}\n\n<!-- DATA -->\n<div class=\"card-container\">\n @for (item of data; track $index; let dataIndex = $index) {\n <div class=\"card\">\n <div class=\"card-header\" [style.position]=\"viewConfig.stickyView?.top ? 'sticky' : 'static'\" [style.top]=\"top\">\n <!-- ICON -->\n @if (hasIcon) {\n <!-- MATERIAL ICON -->\n @if (icons[$index].icon) {\n <mat-icon class=\"icon\" [style.color]=\"icons[$index].color\" [style.font-size]=\"viewConfig.iconSize\">\n {{ icons[$index].icon }}\n </mat-icon>\n }\n <!-- EMOJI -->\n @else {\n <td class=\"emoji\" [style.font-size]=\"viewConfig.emojiSize\">{{ emojis[$index] || '' }}</td>\n } }\n\n <!-- TITLE -->\n <div class=\"title\" [style.color]=\"colors[dataIndex]\">\n <view-value\n [column]=\"ngxTable.columns[this.titleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isDeactive]=\"deactives.includes(dataIndex)\"\n [isCard]=\"true\"\n [isCardTitle]=\"true\"\n ></view-value>\n <!-- SUB TITLE -->\n @if (subTitleIndex !== undefined) {\n <view-value\n [column]=\"ngxTable.columns[this.subTitleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isCard]=\"true\"\n [isCardSubTitle]=\"true\"\n ></view-value>\n }\n </div>\n\n <!-- ACTION -->\n @if (hasAction) {\n <view-action\n [actions]=\"ngxTable.actions || []\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isMobile]=\"true\"\n ></view-action>\n }\n </div>\n\n <!-- CONTENT -->\n @if (hasContent) {\n <div class=\"card-content\" [style.color]=\"colors[dataIndex]\">\n @for (column of ngxTable.columns; track $index; let columnIndex = $index) {\n <!-- CHECK TITLE AND SUBTITLE -->\n @if (columnIndex !== titleIndex && columnIndex !== subTitleIndex) {\n <div class=\"item\">\n <div class=\"title\">{{ column.title }}{{ !!column.title ? ' :' : '' }}</div>\n <div class=\"value\">\n <view-value [column]=\"column\" [item]=\"item\" [viewConfig]=\"viewConfig\" [isCard]=\"true\"></view-value>\n </div>\n </div>\n } }\n\n <!-- DESCRIPTION -->\n @if (descriptions[dataIndex]) {\n <div class=\"description\" [innerHTML]=\"descriptions[dataIndex] || '' | ngxHelperMultiLine\"></div>\n }\n </div>\n }\n </div>\n }\n</div>\n" }]
|
|
1206
|
+
args: [{ selector: 'view-card', imports: [MatIcon, NgxHelperMultiLinePipe, ViewActionComponent, ViewValueComponent, ViewCardToolbarComponent], providers: [FilterService, ViewService], template: "<!-- TOOLBAR -->\n@if (hasToolbar) {\n<view-card-toolbar\n [orders]=\"orders\"\n [filters]=\"filters\"\n [viewConfig]=\"viewConfig\"\n (orderChanged)=\"orderChanged.next($event)\"\n (updateFilter)=\"updateFilter($event)\"\n (clearFilter)=\"filterCleared.next()\"\n></view-card-toolbar>\n}\n\n<!-- DATA -->\n<div class=\"card-container\">\n @for (item of data; track $index; let dataIndex = $index) {\n <div class=\"card\">\n <div class=\"card-header\" [style.position]=\"viewConfig.stickyView?.top ? 'sticky' : 'static'\" [style.top]=\"top\">\n <!-- ICON -->\n @if (hasIcon) {\n <!-- MATERIAL ICON -->\n @if (icons[$index].icon) {\n <mat-icon class=\"icon\" [style.color]=\"icons[$index].color\" [style.font-size]=\"viewConfig.iconSize\">\n {{ icons[$index].icon }}\n </mat-icon>\n }\n <!-- EMOJI -->\n @else {\n <td class=\"emoji\" [style.font-size]=\"viewConfig.emojiSize\">{{ emojis[$index] || '' }}</td>\n } }\n\n <!-- TITLE -->\n <div class=\"title\" [style.color]=\"colors[dataIndex]\">\n <view-value\n [column]=\"ngxTable.columns[this.titleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isDeactive]=\"deactives.includes(dataIndex)\"\n [isCard]=\"true\"\n [isCardTitle]=\"true\"\n ></view-value>\n <!-- SUB TITLE -->\n @if (subTitleIndex !== undefined) {\n <view-value\n [column]=\"ngxTable.columns[this.subTitleIndex]\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isCard]=\"true\"\n [isCardSubTitle]=\"true\"\n ></view-value>\n }\n </div>\n\n <!-- ACTION -->\n @if (hasAction) {\n <view-action\n [actions]=\"ngxTable.actions || []\"\n [item]=\"item\"\n [viewConfig]=\"viewConfig\"\n [isMobile]=\"true\"\n ></view-action>\n }\n </div>\n\n <!-- CONTENT -->\n @if (hasContent && showContent(dataIndex)) {\n <div class=\"card-content\" [style.color]=\"colors[dataIndex]\">\n @for (column of ngxTable.columns; track $index; let columnIndex = $index) {\n <!-- CHECK TITLE AND SUBTITLE AND VALUE -->\n @if (columnIndex !== titleIndex && columnIndex !== subTitleIndex && showItem(column, item)) {\n <div class=\"item\">\n <div class=\"title\">{{ column.title }}{{ !!column.title ? ' :' : '' }}</div>\n <div class=\"value\">\n <view-value [column]=\"column\" [item]=\"item\" [viewConfig]=\"viewConfig\" [isCard]=\"true\"></view-value>\n </div>\n </div>\n } }\n\n <!-- DESCRIPTION -->\n @if (descriptions[dataIndex]) {\n <div class=\"description\" [innerHTML]=\"descriptions[dataIndex] || '' | ngxHelperMultiLine\"></div>\n }\n </div>\n }\n </div>\n }\n</div>\n" }]
|
|
1155
1207
|
}], ctorParameters: () => [{ type: FilterService }, { type: ViewService }], propDecorators: { className: [{
|
|
1156
1208
|
type: HostBinding,
|
|
1157
1209
|
args: ['className']
|
|
@@ -1429,6 +1481,7 @@ class NgxTableComponent {
|
|
|
1429
1481
|
iconSize: `${this.config?.iconSize || 24}px`,
|
|
1430
1482
|
emojiSize: `${this.config?.emojiSize || 19}px`,
|
|
1431
1483
|
actionMenuTitle: this.config?.actionMenuTitle || 'امکانات',
|
|
1484
|
+
minimalCardView: !!this.config?.minimalCardView,
|
|
1432
1485
|
stickyView: this.config?.stickyView
|
|
1433
1486
|
? {
|
|
1434
1487
|
top: this.config.stickyView.top ? getStickyView(this.config.stickyView.top) : undefined,
|