@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.
@@ -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 i2$1 from '@angular/cdk/clipboard';
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 = !this.hasClick && this.column.onCopy ? this.column.onCopy(this.item) : undefined;
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: i2$1.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
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 = this.ngxTable.columns.some((_, index) => index != this.titleIndex && index !== this.subTitleIndex);
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,