@mediusinc/mng-commons 0.12.2 → 0.13.0

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.
Files changed (56) hide show
  1. package/esm2020/lib/components/action/action.component.mjs +8 -8
  2. package/esm2020/lib/components/action/editor/action-editor.component.mjs +5 -5
  3. package/esm2020/lib/components/button/button.component.mjs +46 -0
  4. package/esm2020/lib/components/button/index.mjs +2 -0
  5. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +8 -3
  6. package/esm2020/lib/components/form/editor/form-editor.component.mjs +3 -2
  7. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +10 -13
  8. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +27 -11
  9. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +5 -3
  10. package/esm2020/lib/data-providers/index.mjs +2 -1
  11. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +24 -0
  12. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +106 -0
  13. package/esm2020/lib/descriptors/action.descriptor.mjs +53 -154
  14. package/esm2020/lib/descriptors/button.descriptor.mjs +111 -0
  15. package/esm2020/lib/descriptors/column.descriptor.mjs +17 -1
  16. package/esm2020/lib/descriptors/field.descriptor.mjs +1 -1
  17. package/esm2020/lib/descriptors/index.mjs +3 -1
  18. package/esm2020/lib/mng-commons.module.mjs +24 -9
  19. package/esm2020/lib/pipes/getter.pipe.mjs +20 -0
  20. package/esm2020/lib/pipes/index.mjs +4 -2
  21. package/esm2020/lib/pipes/json-path.pipe.mjs +1 -2
  22. package/esm2020/lib/pipes/parametrize.pipe.mjs +85 -0
  23. package/esm2020/lib/pipes/template.pipe.mjs +24 -0
  24. package/esm2020/lib/services/action-executor.service.mjs +34 -23
  25. package/esm2020/lib/styles/button-style.builder.mjs +59 -8
  26. package/esm2020/lib/styles/styles.util.mjs +2 -2
  27. package/esm2020/lib/utils/string.util.mjs +4 -1
  28. package/esm2020/public-api.mjs +2 -1
  29. package/fesm2015/mediusinc-mng-commons.mjs +627 -266
  30. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  31. package/fesm2020/mediusinc-mng-commons.mjs +628 -262
  32. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  33. package/lib/components/button/button.component.d.ts +16 -0
  34. package/lib/components/button/index.d.ts +1 -0
  35. package/lib/components/form/dropdown/dropdown.component.d.ts +2 -0
  36. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +1 -0
  37. package/lib/data-providers/index.d.ts +1 -0
  38. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -0
  39. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +48 -0
  40. package/lib/descriptors/action.descriptor.d.ts +26 -83
  41. package/lib/descriptors/button.descriptor.d.ts +40 -0
  42. package/lib/descriptors/column.descriptor.d.ts +6 -0
  43. package/lib/descriptors/field.descriptor.d.ts +9 -9
  44. package/lib/descriptors/index.d.ts +2 -0
  45. package/lib/mng-commons.module.d.ts +74 -71
  46. package/lib/pipes/getter.pipe.d.ts +7 -0
  47. package/lib/pipes/index.d.ts +3 -1
  48. package/lib/pipes/parametrize.pipe.d.ts +13 -0
  49. package/lib/pipes/template.pipe.d.ts +10 -0
  50. package/lib/services/action-executor.service.d.ts +3 -3
  51. package/lib/styles/button-style.builder.d.ts +43 -2
  52. package/package.json +3 -3
  53. package/public-api.d.ts +1 -0
  54. package/version-info.json +5 -5
  55. package/esm2020/lib/pipes/link-formatter.pipe.mjs +0 -39
  56. package/lib/pipes/link-formatter.pipe.d.ts +0 -11
@@ -547,6 +547,26 @@ class TableviewDataProvider extends EditorDataProvider {
547
547
  }
548
548
  }
549
549
 
550
+ class TableviewCrudDataProvider extends TableviewDataProvider {
551
+ constructor(modelType, serviceType, idPropertyName, useGetAllForFetch = false) {
552
+ super(modelType, serviceType);
553
+ this.withGetAll((queryParam, service) => service.getAllPost(queryParam));
554
+ if (useGetAllForFetch) {
555
+ const selectedIdPropertyName = idPropertyName ?? ModelUtil.findIdAttribute(modelType) ?? 'id';
556
+ this.withFetch((id, service) => {
557
+ const qp = MediusQueryParamBuilder.create(10, 0).withFilter(selectedIdPropertyName, id, id, MediusFilterMatchType.Equals, true).build();
558
+ return service.getAllPost(qp).pipe(map(res => res.pageData[0]));
559
+ });
560
+ }
561
+ else {
562
+ this.withFetch((id, service) => service.getByIdGet(id));
563
+ }
564
+ this.withCreate((item, service) => service.createPost(item));
565
+ this.withUpdate((id, item, service) => service.updatePut(id, item));
566
+ this.withDelete((id, item, service) => service.removeDelete(id, item));
567
+ }
568
+ }
569
+
550
570
  var AuthorizationTypeEnum;
551
571
  (function (AuthorizationTypeEnum) {
552
572
  AuthorizationTypeEnum["All"] = "ALL";
@@ -839,7 +859,7 @@ class StylesUtil {
839
859
  }
840
860
  }
841
861
  static getActionButtonRoundedWidth(action) {
842
- switch (action.size) {
862
+ switch (action.buttonDescriptor.styleClass.size) {
843
863
  case ActionSizeEnum.ExtraSmall:
844
864
  return StylesUtil.BUTTON_ROUNDED_WIDTH_XS;
845
865
  case ActionSizeEnum.Small:
@@ -863,17 +883,18 @@ StylesUtil.TABLE_CELL_PADDING_X_SM = 4;
863
883
  StylesUtil.TABLE_CELL_PADDING_X_LG = 12;
864
884
 
865
885
  class ButtonStyleBuilder {
866
- constructor(level, customClass) {
886
+ constructor(level = ActionLevelEnum.Default, customClass) {
867
887
  this._size = ActionSizeEnum.Normal;
868
888
  this._textButton = false;
869
889
  this._outlineButton = false;
870
890
  this._raisedButton = false;
891
+ this._roundedStyle = ButtonStyleRoundedEnum.DEFAULT;
871
892
  this._actionLevel = level;
872
893
  this._customClass = customClass;
873
894
  }
874
895
  getButtonClass(hasNoTitle = false) {
875
896
  const styles = [this.convertActionLevelToStyleClass(), this.convertSizeToStyleClass(), this._customClass];
876
- if (hasNoTitle) {
897
+ if (hasNoTitle && this._roundedStyle === ButtonStyleRoundedEnum.DEFAULT) {
877
898
  styles.push(`p-button-rounded mng-action-button-icon`);
878
899
  }
879
900
  if (this._textButton) {
@@ -885,37 +906,78 @@ class ButtonStyleBuilder {
885
906
  if (this._raisedButton) {
886
907
  styles.push(`p-button-raised`);
887
908
  }
909
+ if (this._roundedStyle === ButtonStyleRoundedEnum.ROUNDED) {
910
+ styles.push('p-button-rounded');
911
+ }
888
912
  return styles.join(' ');
889
913
  }
890
- create(actionLevel, size, textButton, outlineButton, raisedButton, customClass) {
914
+ /**
915
+ * creates instance of style builder with custom properties
916
+ * @param actionLevel ActionLevelEnum
917
+ * @param size ActionSizeEnum
918
+ * @param textButton if true, text button will be applied
919
+ * @param outlineButton if true, outlined button will be applied
920
+ * @param raisedButton if true, raised button will be applied
921
+ * @param customClass additional custom classes (will be added at generating)
922
+ */
923
+ create(actionLevel, size, textButton, outlineButton, raisedButton, roundedButton, customClass) {
891
924
  this._actionLevel = actionLevel ?? this._actionLevel;
892
925
  this._size = size ?? this._size;
893
926
  this._textButton = textButton ?? this._textButton;
894
927
  this._outlineButton = outlineButton ?? this._outlineButton;
895
928
  this._raisedButton = raisedButton ?? this._raisedButton;
929
+ this._roundedStyle = roundedButton ?? this._roundedStyle;
896
930
  this._customClass = customClass;
897
931
  return this;
898
932
  }
933
+ /**
934
+ * sets custom action level and returns this object
935
+ * @param actionLevel
936
+ */
899
937
  withActionLevel(actionLevel) {
900
938
  this._actionLevel = actionLevel;
901
939
  return this;
902
940
  }
941
+ /**
942
+ * sets custom size and return this object
943
+ * @param size
944
+ */
903
945
  withSize(size) {
904
946
  this._size = size;
905
947
  return this;
906
948
  }
949
+ /**
950
+ * sets text button property
951
+ * @param withText default true
952
+ */
907
953
  withTextButton(withText = true) {
908
954
  this._textButton = withText;
909
955
  return this;
910
956
  }
957
+ /**
958
+ * sets outline button property
959
+ * @param withOutline default true
960
+ */
911
961
  withOutlineButton(withOutline = true) {
912
962
  this._outlineButton = withOutline;
913
963
  return this;
914
964
  }
965
+ /**
966
+ * sets raised button property
967
+ * @param withRaised default true
968
+ */
915
969
  withRaisedButton(withRaised = true) {
916
970
  this._raisedButton = withRaised;
917
971
  return this;
918
972
  }
973
+ withRoundedButton(roundedStyle = ButtonStyleRoundedEnum.ROUNDED) {
974
+ this._roundedStyle = roundedStyle;
975
+ return this;
976
+ }
977
+ /**
978
+ * sets custom style class
979
+ * @param customClass
980
+ */
919
981
  withCustomClass(customClass) {
920
982
  this._customClass = customClass;
921
983
  return this;
@@ -942,15 +1004,15 @@ class ButtonStyleBuilder {
942
1004
  convertSizeToStyleClass() {
943
1005
  switch (this._size) {
944
1006
  case ActionSizeEnum.ExtraSmall:
945
- return 'mng-button-xs';
1007
+ return 'p-button-sm mng-button-xs';
946
1008
  case ActionSizeEnum.Small:
947
- return 'mng-button-sm';
1009
+ return 'p-button-sm mng-button-sm';
948
1010
  case ActionSizeEnum.Normal:
949
1011
  return '';
950
1012
  case ActionSizeEnum.Large:
951
- return 'mng-button-lg';
1013
+ return 'p-button-lg mng-button-lg';
952
1014
  case ActionSizeEnum.ExtraLarge:
953
- return 'mng-button-xl';
1015
+ return 'p-button-lg mng-button-xl';
954
1016
  }
955
1017
  }
956
1018
  get actionLevel() {
@@ -968,10 +1030,123 @@ class ButtonStyleBuilder {
968
1030
  get raisedButton() {
969
1031
  return this._raisedButton;
970
1032
  }
1033
+ get roundedStyle() {
1034
+ return this._roundedStyle;
1035
+ }
971
1036
  get customClass() {
972
1037
  return this._customClass;
973
1038
  }
974
1039
  }
1040
+ var ButtonStyleRoundedEnum;
1041
+ (function (ButtonStyleRoundedEnum) {
1042
+ ButtonStyleRoundedEnum[ButtonStyleRoundedEnum["DEFAULT"] = 0] = "DEFAULT";
1043
+ ButtonStyleRoundedEnum[ButtonStyleRoundedEnum["ROUNDED"] = 1] = "ROUNDED";
1044
+ ButtonStyleRoundedEnum[ButtonStyleRoundedEnum["SQUARE"] = 2] = "SQUARE";
1045
+ })(ButtonStyleRoundedEnum || (ButtonStyleRoundedEnum = {}));
1046
+
1047
+ class ActionConfirmationDialogDescriptor {
1048
+ constructor() {
1049
+ this._closeOnEscape = true; // Defines if dialog closes when esc key is pressed.
1050
+ this._closable = true; // Defines if dialog is closable.
1051
+ this._acceptButtonStyle = new ButtonStyleBuilder(ActionLevelEnum.Default);
1052
+ this._rejectButtonStyle = new ButtonStyleBuilder(ActionLevelEnum.Default).withTextButton();
1053
+ this._icon = 'pi pi-exclamation-triangle';
1054
+ this._acceptIcon = 'pi pi-check';
1055
+ this._rejectIcon = 'pi pi-times';
1056
+ }
1057
+ withIcon(icon) {
1058
+ this._icon = icon;
1059
+ return this;
1060
+ }
1061
+ withTitle(title) {
1062
+ this._title = title;
1063
+ return this;
1064
+ }
1065
+ withMessage(message) {
1066
+ this._message = message;
1067
+ return this;
1068
+ }
1069
+ withAcceptLabel(acceptLabel) {
1070
+ this._acceptLabel = acceptLabel;
1071
+ return this;
1072
+ }
1073
+ withAcceptIcon(acceptIcon) {
1074
+ this._acceptIcon = acceptIcon;
1075
+ return this;
1076
+ }
1077
+ withAcceptButtonStyle(buttonStyle) {
1078
+ this._acceptButtonStyle = buttonStyle;
1079
+ return this;
1080
+ }
1081
+ withRejectLabel(rejectLabel) {
1082
+ this._rejectLabel = rejectLabel;
1083
+ return this;
1084
+ }
1085
+ withRejectIcon(rejectIcon) {
1086
+ this._rejectIcon = rejectIcon;
1087
+ return this;
1088
+ }
1089
+ withRejectButtonStyle(buttonStyle) {
1090
+ this._rejectButtonStyle = buttonStyle;
1091
+ return this;
1092
+ }
1093
+ /**
1094
+ * set if dialog can be closed on escaped pressed
1095
+ * if true, then closable is also set to true
1096
+ * @param closeOnEscape
1097
+ */
1098
+ withCloseOnEscape(closeOnEscape) {
1099
+ if (closeOnEscape) {
1100
+ this._closable = true;
1101
+ }
1102
+ this._closeOnEscape = closeOnEscape;
1103
+ return this;
1104
+ }
1105
+ withClosable(closable) {
1106
+ this._closable = closable;
1107
+ return this;
1108
+ }
1109
+ withRunConfirmationConfigMapFn(runConfirmationConfigMapFn) {
1110
+ this._runConfirmationConfigMapFn = runConfirmationConfigMapFn;
1111
+ return this;
1112
+ }
1113
+ get icon() {
1114
+ return this._icon;
1115
+ }
1116
+ get title() {
1117
+ return this._title;
1118
+ }
1119
+ get message() {
1120
+ return this._message;
1121
+ }
1122
+ get acceptLabel() {
1123
+ return this._acceptLabel;
1124
+ }
1125
+ get acceptIcon() {
1126
+ return this._acceptIcon;
1127
+ }
1128
+ get acceptButtonStyle() {
1129
+ return this._acceptButtonStyle;
1130
+ }
1131
+ get rejectLabel() {
1132
+ return this._rejectLabel;
1133
+ }
1134
+ get rejectIcon() {
1135
+ return this._rejectIcon;
1136
+ }
1137
+ get rejectButtonStyle() {
1138
+ return this._rejectButtonStyle;
1139
+ }
1140
+ get closeOnEscape() {
1141
+ return this._closeOnEscape;
1142
+ }
1143
+ get closable() {
1144
+ return this._closable;
1145
+ }
1146
+ get runConfirmationConfigMapFn() {
1147
+ return this._runConfirmationConfigMapFn;
1148
+ }
1149
+ }
975
1150
 
976
1151
  class ActionDescriptor {
977
1152
  constructor(model, actionName, parentType, parentProperty) {
@@ -980,10 +1155,10 @@ class ActionDescriptor {
980
1155
  this._position = ActionPositionEnum.ToolbarRight;
981
1156
  this._level = ActionLevelEnum.Default;
982
1157
  this._routeUrl = null;
983
- this._buttonStyle = new ButtonStyleBuilder(this._level);
984
- this._hasRunConfirmation = false;
985
1158
  this._hasRunNotificationSuccess = true;
986
1159
  this._hasRunNotificationError = true;
1160
+ //button
1161
+ this._buttonDescriptor = new ButtonDescriptor();
987
1162
  this._model = model;
988
1163
  this._actionName = actionName;
989
1164
  if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
@@ -1032,15 +1207,6 @@ class ActionDescriptor {
1032
1207
  get routeUrl() {
1033
1208
  return this._routeUrl;
1034
1209
  }
1035
- get title() {
1036
- return this._title;
1037
- }
1038
- get icon() {
1039
- return this._icon;
1040
- }
1041
- get tooltip() {
1042
- return this._tooltip;
1043
- }
1044
1210
  get dataProvider() {
1045
1211
  return this._dataProvider;
1046
1212
  }
@@ -1065,83 +1231,14 @@ class ActionDescriptor {
1065
1231
  get actionNameLong() {
1066
1232
  return this._actionNameLong;
1067
1233
  }
1068
- get buttonStyle() {
1069
- return this._buttonStyle;
1070
- }
1071
- /**
1072
- * @deprecated use _buttonStyle instead
1073
- */
1074
1234
  get className() {
1075
- return this._buttonStyle.customClass;
1076
- }
1077
- /**
1078
- * @deprecated use _buttonStyle instead
1079
- */
1080
- get isStyleText() {
1081
- return this._buttonStyle.textButton;
1082
- }
1083
- /**
1084
- * @deprecated use _buttonStyle instead
1085
- */
1086
- get isStyleOutlined() {
1087
- return this._buttonStyle.outlineButton;
1235
+ return this.buttonDescriptor.styleClass.customClass;
1088
1236
  }
1089
- /**
1090
- * @deprecated use _buttonStyle instead
1091
- */
1092
- get isStyleRaised() {
1093
- return this._buttonStyle.raisedButton;
1094
- }
1095
- /**
1096
- * @deprecated use _buttonStyle instead
1097
- */
1098
- get size() {
1099
- return this._buttonStyle.size;
1100
- }
1101
- /**
1102
- * @deprecated use _buttonStyle instead
1103
- */
1104
- get isSizeExtraSmall() {
1105
- return this._buttonStyle.size === ActionSizeEnum.ExtraSmall;
1106
- }
1107
- /**
1108
- * @deprecated use _buttonStyle instead
1109
- */
1110
- get isSizeSmall() {
1111
- return this._buttonStyle.size === ActionSizeEnum.Small;
1112
- }
1113
- /**
1114
- * @deprecated use _buttonStyle instead
1115
- */
1116
- get isSizeLarge() {
1117
- return this._buttonStyle.size === ActionSizeEnum.Large;
1118
- }
1119
- /**
1120
- * @deprecated use _buttonStyle instead
1121
- */
1122
- get isSizeExtraLarge() {
1123
- return this._buttonStyle.size === ActionSizeEnum.ExtraLarge;
1237
+ get runConfirmationDialogDescriptor() {
1238
+ return this._runConfirmationDialogDescriptor;
1124
1239
  }
1125
1240
  get hasRunConfirmation() {
1126
- return this._hasRunConfirmation;
1127
- }
1128
- get runConfirmationIcon() {
1129
- return this._runConfirmationIcon;
1130
- }
1131
- get runConfirmationTitle() {
1132
- return this._runConfirmationTitle;
1133
- }
1134
- get runConfirmationMessage() {
1135
- return this._runConfirmationMessage;
1136
- }
1137
- get runConfirmationAcceptTitle() {
1138
- return this._runConfirmationAcceptTitle;
1139
- }
1140
- get runConfirmationRejectTitle() {
1141
- return this._runConfirmationRejectTitle;
1142
- }
1143
- get runConfirmationConfigMapFn() {
1144
- return this._runConfirmationConfigMapFn;
1241
+ return this._runConfirmationDialogDescriptor !== null && this._runConfirmationDialogDescriptor !== undefined;
1145
1242
  }
1146
1243
  get hasRunNotificationSuccess() {
1147
1244
  return this._hasRunNotificationSuccess;
@@ -1173,6 +1270,9 @@ class ActionDescriptor {
1173
1270
  get permissionsRouteType() {
1174
1271
  return this._permissionsRouteType;
1175
1272
  }
1273
+ get buttonDescriptor() {
1274
+ return this._buttonDescriptor;
1275
+ }
1176
1276
  withDataProvider(dataProvider) {
1177
1277
  this._dataProvider = dataProvider;
1178
1278
  return this;
@@ -1201,70 +1301,25 @@ class ActionDescriptor {
1201
1301
  this._routeUrl = routeUrl;
1202
1302
  return this;
1203
1303
  }
1204
- withLevel(level) {
1205
- this._level = level;
1206
- this._buttonStyle = this._buttonStyle.withActionLevel(level);
1207
- return this;
1208
- }
1209
- /**
1210
- * Overrides default title key with model action key (${model.typeName}.actions.${actionName}). Not relevant if parentType name is provided.
1211
- */
1212
- withModelTitle() {
1213
- this._title = `${this._i18nModelActionBaseKey}.title`;
1304
+ withPosition(position) {
1305
+ this._position = position;
1214
1306
  return this;
1215
1307
  }
1216
1308
  /**
1217
- * Overrides default title key (${actionName}.title). If null, no title will be shown.
1218
- * @param title Title i18n key or title.
1309
+ * creates confirmation action with default style based on action descriptor
1219
1310
  */
1220
- withTitle(title) {
1221
- this._title = title;
1222
- return this;
1223
- }
1224
- withIcon(icon) {
1225
- this._icon = icon;
1226
- return this;
1227
- }
1228
- withTooltip(tooltip) {
1229
- this._tooltip = tooltip;
1230
- return this;
1231
- }
1232
- withClassName(className) {
1233
- this._buttonStyle = this._buttonStyle.withCustomClass(className);
1234
- return this;
1235
- }
1236
- withSize(size = ActionSizeEnum.Normal) {
1237
- this._buttonStyle = this._buttonStyle.withSize(size);
1238
- return this;
1239
- }
1240
- withStyle(styleText = false, styleOutlined = false, styleRaised = false) {
1241
- this._buttonStyle = this._buttonStyle.withOutlineButton(styleOutlined);
1242
- this._buttonStyle = this._buttonStyle.withRaisedButton(styleRaised);
1243
- this._buttonStyle = this._buttonStyle.withTextButton(styleText);
1244
- return this;
1245
- }
1246
- withPosition(position) {
1247
- this._position = position;
1248
- return this;
1311
+ withRunConfirmation() {
1312
+ this._runConfirmationDialogDescriptor = new ActionConfirmationDialogDescriptor();
1313
+ this._runConfirmationDialogDescriptor.acceptButtonStyle.withActionLevel(this._level);
1314
+ this._runConfirmationDialogDescriptor.rejectButtonStyle.withActionLevel(this._level);
1315
+ return this._runConfirmationDialogDescriptor;
1249
1316
  }
1250
1317
  /**
1251
- * Add a confirmation dialogue to the action
1252
- * @param icon the icon to display on the confirmation dialogue
1253
- * @param title the title of the confirmation dialogue
1254
- * @param message the message on the confirmation dialogue
1255
- * @param acceptTitle the title of the accepting button
1256
- * @param rejectTitle the title of the rejecting button
1257
- * @param runConfirmationConfigMapFn function used to generate the confirmation dialogue. **WARNING** changing the *accept* and *reject* methods of the *confirmConfig* parameter
1258
- * may lead to unexpected behaviour
1318
+ * Add a configuration dialogue to action using ActionConfigurationDescriptor
1319
+ * @param confirmationDescriptor descriptor with customizable information for dialog
1259
1320
  */
1260
- withRunConfirmation(icon = 'pi pi-exclamation-triangle', title, message, acceptTitle, rejectTitle, runConfirmationConfigMapFn) {
1261
- this._hasRunConfirmation = true;
1262
- this._runConfirmationIcon = icon;
1263
- this._runConfirmationTitle = title;
1264
- this._runConfirmationMessage = message;
1265
- this._runConfirmationAcceptTitle = acceptTitle;
1266
- this._runConfirmationRejectTitle = rejectTitle;
1267
- this._runConfirmationConfigMapFn = runConfirmationConfigMapFn;
1321
+ withRunConfirmationDescriptor(runConfirmationDialogDescriptor) {
1322
+ this._runConfirmationDialogDescriptor = runConfirmationDialogDescriptor;
1268
1323
  return this;
1269
1324
  }
1270
1325
  withRunNotificationSuccess(title, message, hasNotification = true) {
@@ -1298,6 +1353,10 @@ class ActionDescriptor {
1298
1353
  this._permissionsRouteType = permissionsRouteType;
1299
1354
  return this;
1300
1355
  }
1356
+ withButtonDescriptor(buttonDescriptor) {
1357
+ this._buttonDescriptor = buttonDescriptor;
1358
+ return this;
1359
+ }
1301
1360
  }
1302
1361
  class ActionSimpleDescriptor extends ActionDescriptor {
1303
1362
  constructor(actionName, modelType, idProperty, titleProperty) {
@@ -1314,7 +1373,7 @@ class ActionEditorDescriptor extends ActionDescriptor {
1314
1373
  this._dialogSize = ActionEditorDialogSizeEnum.Normal;
1315
1374
  this._type = ActionTypeEnum.Editor;
1316
1375
  this._editorDescriptor = editorDescriptor;
1317
- this._editorActions.push(new ActionEditorSubmitDescriptor(this), new ActionEditorSubmitDescriptor(this, ActionEditorSubmitTypeEnum.Cancel));
1376
+ this._editorActions.push(ActionEditorSubmitDescriptor.forPrimary(this), ActionEditorSubmitDescriptor.forSecondary(this));
1318
1377
  }
1319
1378
  get editorTitle() {
1320
1379
  return this._editorTitle;
@@ -1420,7 +1479,23 @@ class ActionEditorSubmitDescriptor extends ActionDescriptor {
1420
1479
  this._editorAction = editorAction;
1421
1480
  this._submitType = submitType;
1422
1481
  this._position = ActionPositionEnum.FooterRight;
1423
- this._buttonStyle = this._buttonStyle.withActionLevel(editorAction.level).withTextButton();
1482
+ this.buttonDescriptor.styleClass.withActionLevel(editorAction.level).withTextButton();
1483
+ }
1484
+ /**
1485
+ * creates primary action with primary button style
1486
+ * @param editorAction
1487
+ * @param submitType
1488
+ */
1489
+ static forPrimary(editorAction, submitType = ActionEditorSubmitTypeEnum.Submit) {
1490
+ return new ActionEditorSubmitDescriptor(editorAction, submitType).withButtonDescriptor(new ButtonDescriptor().withStyleClass(new ButtonStyleBuilder()));
1491
+ }
1492
+ /**
1493
+ * creates secondary button with text button style
1494
+ * @param editorAction
1495
+ * @param submitType
1496
+ */
1497
+ static forSecondary(editorAction, submitType = ActionEditorSubmitTypeEnum.Cancel) {
1498
+ return new ActionEditorSubmitDescriptor(editorAction, submitType).withButtonDescriptor(new ButtonDescriptor().withStyleClass(new ButtonStyleBuilder().withTextButton()));
1424
1499
  }
1425
1500
  get submitType() {
1426
1501
  return this._submitType;
@@ -1454,8 +1529,8 @@ class ActionEditorAddDescriptor extends ActionEditorDescriptor {
1454
1529
  this.withPosition(ActionPositionEnum.ToolbarLeft);
1455
1530
  this.withRouteTrigger('add');
1456
1531
  this.withSubmitFunction(ActionDataProviderUtil.runCreateOrFail);
1457
- this.withLevel(ActionLevelEnum.Success);
1458
- this.withIcon('pi pi-plus');
1532
+ this.buttonDescriptor.styleClass.withActionLevel(ActionLevelEnum.Success);
1533
+ this.buttonDescriptor.withIcon('pi pi-plus');
1459
1534
  this.withPermissionsRouteType(Permissions.ActionTypes.ADD);
1460
1535
  }
1461
1536
  withServiceType(serviceType) {
@@ -1478,12 +1553,11 @@ class ActionEditorEditDescriptor extends ActionEditorDescriptor {
1478
1553
  constructor(editorDescriptor) {
1479
1554
  super(editorDescriptor, ActionEditorEditDescriptor.ACTION_NAME);
1480
1555
  this.withPosition(ActionPositionEnum.RowInline);
1481
- this.withTitle(null);
1482
1556
  this.withRouteTrigger(':itemId/edit');
1483
1557
  this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
1484
1558
  this.withSubmitFunction(ActionDataProviderUtil.runUpdateOrFail);
1485
- this.withIcon('pi pi-pencil');
1486
1559
  this.withPermissionsRouteType(Permissions.ActionTypes.EDIT);
1560
+ this.buttonDescriptor.withLabel(null).withIcon('pi pi-pencil');
1487
1561
  }
1488
1562
  withServiceType(serviceType) {
1489
1563
  return this.withServiceSubmitFunction(serviceType);
@@ -1505,12 +1579,11 @@ class ActionDeleteDescriptor extends ActionDescriptor {
1505
1579
  constructor(model) {
1506
1580
  super(model, ActionDeleteDescriptor.ACTION_NAME);
1507
1581
  this.withPosition(ActionPositionEnum.RowInline);
1508
- this.withTitle(null);
1509
1582
  this.withRunFunction(ActionDataProviderUtil.runDeleteOrFail);
1510
- this.withLevel(ActionLevelEnum.Danger);
1511
- this.withIcon('pi pi-trash');
1512
- this.withRunConfirmation(undefined);
1583
+ this.buttonDescriptor.styleClass.withActionLevel(ActionLevelEnum.Danger);
1584
+ this.withRunConfirmation();
1513
1585
  this.withPermissionsRouteType(Permissions.ActionTypes.DELETE);
1586
+ this.buttonDescriptor.withLabel(null).withIcon('pi pi-trash');
1514
1587
  }
1515
1588
  withServiceType(serviceType) {
1516
1589
  return this.withServiceDeleteFunction(serviceType);
@@ -1968,6 +2041,12 @@ class ColumnDescriptor {
1968
2041
  get hasCopyToClipboard() {
1969
2042
  return this._hasCopyToClipboard;
1970
2043
  }
2044
+ get template() {
2045
+ return this._template;
2046
+ }
2047
+ get getter() {
2048
+ return this._getter;
2049
+ }
1971
2050
  asType(type = ColumnTypeEnum.String) {
1972
2051
  this._columnType = type;
1973
2052
  return this;
@@ -2101,6 +2180,14 @@ class ColumnDescriptor {
2101
2180
  this._hasCopyToClipboard = hasCopyToCliboard;
2102
2181
  return this;
2103
2182
  }
2183
+ withTemplate(template) {
2184
+ this._template = template;
2185
+ return this;
2186
+ }
2187
+ withGetter(getter) {
2188
+ this._getter = getter;
2189
+ return this;
2190
+ }
2104
2191
  copy() {
2105
2192
  const descriptor = new ColumnDescriptor(this._table, this._property);
2106
2193
  descriptor._jsonPath = this._jsonPath;
@@ -2127,6 +2214,8 @@ class ColumnDescriptor {
2127
2214
  descriptor._minWidth = this._minWidth;
2128
2215
  descriptor._maxWidth = this._maxWidth;
2129
2216
  descriptor._hasCopyToClipboard = this._hasCopyToClipboard;
2217
+ descriptor._template = this._template;
2218
+ descriptor._getter = this._getter;
2130
2219
  return descriptor;
2131
2220
  }
2132
2221
  }
@@ -3503,6 +3592,116 @@ class TableviewDescriptor {
3503
3592
  }
3504
3593
  }
3505
3594
 
3595
+ class ButtonDescriptor {
3596
+ constructor() {
3597
+ this._disabled = false;
3598
+ this._iconPosition = 'left';
3599
+ this._styleClass = new ButtonStyleBuilder();
3600
+ this._loading = false;
3601
+ this._loadingIcon = 'pi pi-spinner pi-spin';
3602
+ }
3603
+ withLabel(label) {
3604
+ this._label = label;
3605
+ return this;
3606
+ }
3607
+ withDisabled(disabled = true) {
3608
+ this._disabled = disabled;
3609
+ return this;
3610
+ }
3611
+ withIcon(icon) {
3612
+ this._icon = icon;
3613
+ return this;
3614
+ }
3615
+ withIconPosition(iconPosition) {
3616
+ this._iconPosition = iconPosition;
3617
+ return this;
3618
+ }
3619
+ withStyleClass(style) {
3620
+ this._styleClass = style;
3621
+ return this;
3622
+ }
3623
+ withOnClick(onClick) {
3624
+ this._onClick = onClick;
3625
+ return this;
3626
+ }
3627
+ withOnFocus(onFocus) {
3628
+ this._onFocus = onFocus;
3629
+ return this;
3630
+ }
3631
+ withOnBlur(onBlur) {
3632
+ this._onBlur = onBlur;
3633
+ return this;
3634
+ }
3635
+ withLoading(loading = true) {
3636
+ this._loading = loading;
3637
+ return this;
3638
+ }
3639
+ withLoadingIcon(loadingIcon) {
3640
+ this._loadingIcon = loadingIcon;
3641
+ return this;
3642
+ }
3643
+ withBadge(badge) {
3644
+ this._badge = badge;
3645
+ return this;
3646
+ }
3647
+ withTooltip(tooltip) {
3648
+ this._tooltip = tooltip;
3649
+ return this;
3650
+ }
3651
+ get label() {
3652
+ return this._label;
3653
+ }
3654
+ get disabled() {
3655
+ return this._disabled;
3656
+ }
3657
+ get icon() {
3658
+ return this._icon;
3659
+ }
3660
+ get iconPosition() {
3661
+ return this._iconPosition;
3662
+ }
3663
+ get styleClass() {
3664
+ return this._styleClass;
3665
+ }
3666
+ get onClick() {
3667
+ return this._onClick;
3668
+ }
3669
+ get onFocus() {
3670
+ return this._onFocus;
3671
+ }
3672
+ get onBlur() {
3673
+ return this._onBlur;
3674
+ }
3675
+ get loading() {
3676
+ return this._loading;
3677
+ }
3678
+ get loadingIcon() {
3679
+ return this._loadingIcon;
3680
+ }
3681
+ get badge() {
3682
+ return this._badge;
3683
+ }
3684
+ get tooltip() {
3685
+ return this._tooltip;
3686
+ }
3687
+ copy() {
3688
+ const descriptor = new ButtonDescriptor();
3689
+ descriptor._label = this._label;
3690
+ descriptor._disabled = this._disabled;
3691
+ descriptor._icon = this._icon;
3692
+ descriptor._iconPosition = this._iconPosition;
3693
+ descriptor._styleClass = this._styleClass;
3694
+ descriptor._onClick = this._onClick;
3695
+ descriptor._onFocus = this._onFocus;
3696
+ descriptor._onBlur = this._onBlur;
3697
+ descriptor._loading = this._loading;
3698
+ descriptor._loadingIcon = this._loadingIcon;
3699
+ descriptor._badge = this._badge;
3700
+ descriptor._tooltip = this._tooltip;
3701
+ return descriptor;
3702
+ }
3703
+ }
3704
+
3506
3705
  class EditorFormlyUtil {
3507
3706
  static createFormlyConfigFromDescriptor(descriptor) {
3508
3707
  const fields = [];
@@ -4272,6 +4471,9 @@ class StringUtil {
4272
4471
  else if (typeof value[key] === 'object') {
4273
4472
  escapedValue[key] = StringUtil.escapeHtmlAny(value[key]);
4274
4473
  }
4474
+ else {
4475
+ escapedValue[key] = value[key];
4476
+ }
4275
4477
  }
4276
4478
  return escapedValue;
4277
4479
  }
@@ -5168,43 +5370,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
5168
5370
  }]
5169
5371
  }] });
5170
5372
 
5171
- class MngLinkFormatterPipe {
5172
- parseUrl(s, itemId, itemAny, model, actionData) {
5173
- if (s === ':itemId') {
5174
- return itemId;
5175
- }
5176
- else if (model && s.startsWith(`:${model.typeName}.`)) {
5177
- return itemAny[s.substring(model.typeName.length + 2)] ?? '';
5178
- }
5179
- else if (s.startsWith(':')) {
5180
- return actionData?.[s.substring(1)] ?? '';
5181
- }
5182
- else {
5183
- return s;
5184
- }
5185
- }
5186
- transform(value, itemId, item, model, actionData) {
5187
- const itemAny = (item ?? {});
5188
- if (typeof value === 'string') {
5189
- return value.split('/').map(s => this.parseUrl(s, itemId, itemAny, model, actionData));
5190
- }
5191
- else {
5192
- const transformedItems = [];
5193
- value.forEach(val => transformedItems.push(...val.split('/').map(s => this.parseUrl(s, itemId, itemAny, model, actionData))));
5194
- return transformedItems;
5195
- }
5196
- }
5197
- }
5198
- MngLinkFormatterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngLinkFormatterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
5199
- MngLinkFormatterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.1.0", ngImport: i0, type: MngLinkFormatterPipe, name: "linkFormatter" });
5200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngLinkFormatterPipe, decorators: [{
5201
- type: Pipe,
5202
- args: [{
5203
- name: 'linkFormatter',
5204
- pure: true
5205
- }]
5206
- }] });
5207
-
5208
5373
  /**
5209
5374
  * Imitation of JSONPath Syntax. Supports:
5210
5375
  * - Root object notation with '$'
@@ -5242,7 +5407,6 @@ class JsonPathPipe {
5242
5407
  const arrayPath = p.substring(0, leftBracketIdx);
5243
5408
  const arrayIdx = +p.substring(leftBracketIdx + 1, p.length - 1);
5244
5409
  const array = currValue[arrayPath];
5245
- console.log(arrayPath, arrayIdx, array);
5246
5410
  if (Array.isArray(array)) {
5247
5411
  if (arrayIdx >= 0 && arrayIdx < array.length) {
5248
5412
  // valid index, continue on the path
@@ -5283,8 +5447,128 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
5283
5447
  }]
5284
5448
  }] });
5285
5449
 
5450
+ class MngParametrizePipe {
5451
+ constructor() {
5452
+ this.jsonPath = new JsonPathPipe();
5453
+ }
5454
+ transform(value, itemId, item, actionData) {
5455
+ let params = {};
5456
+ if (actionData) {
5457
+ params = {
5458
+ ...params,
5459
+ ...actionData
5460
+ };
5461
+ }
5462
+ if (item) {
5463
+ params = {
5464
+ ...params,
5465
+ item: StringUtil.escapeHtmlAny(item)
5466
+ };
5467
+ }
5468
+ if (itemId) {
5469
+ params = {
5470
+ ...params,
5471
+ itemId: itemId
5472
+ };
5473
+ }
5474
+ if (typeof value === 'string') {
5475
+ return this.transformString(value, params);
5476
+ }
5477
+ else if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'string') {
5478
+ return value.map((s) => this.transformString(s, params));
5479
+ }
5480
+ else if (typeof value === 'object') {
5481
+ // process only first level citizens
5482
+ const obj = { ...value };
5483
+ for (const key in obj) {
5484
+ const objProp = obj[key];
5485
+ if (typeof objProp === 'string') {
5486
+ obj[key] = this.transformString(objProp, params);
5487
+ }
5488
+ }
5489
+ return obj;
5490
+ }
5491
+ else {
5492
+ return value;
5493
+ }
5494
+ }
5495
+ transformString(s, params) {
5496
+ if ((s.indexOf('/') >= 0 && s.indexOf(':') >= 0) || s.startsWith(':')) {
5497
+ // this is url
5498
+ return s
5499
+ .split('/')
5500
+ .map(s => this.parametrizeStringAsUrl(s, params))
5501
+ .join('/');
5502
+ }
5503
+ else {
5504
+ // parametrize normally
5505
+ return this.parametrizeString(s, params);
5506
+ }
5507
+ }
5508
+ parametrizeStringAsUrl(s, params) {
5509
+ if (s.startsWith(':')) {
5510
+ const itemProperty = s.substring(1);
5511
+ return this.jsonPath.transform(params, itemProperty) ?? '';
5512
+ }
5513
+ else {
5514
+ return s;
5515
+ }
5516
+ }
5517
+ parametrizeString(s, params) {
5518
+ return s.replace(/{{\s?([^{}\s]*)\s?}}/g, (subs, key) => this.jsonPath.transform(params, key) ?? subs);
5519
+ }
5520
+ }
5521
+ MngParametrizePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngParametrizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
5522
+ MngParametrizePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.1.0", ngImport: i0, type: MngParametrizePipe, name: "parametrize" });
5523
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngParametrizePipe, decorators: [{
5524
+ type: Pipe,
5525
+ args: [{
5526
+ name: 'parametrize',
5527
+ pure: true
5528
+ }]
5529
+ }] });
5530
+
5531
+ class MngGetterPipe {
5532
+ transform(value, getterFunction) {
5533
+ if (typeof getterFunction === 'function') {
5534
+ return getterFunction(value);
5535
+ }
5536
+ return value;
5537
+ }
5538
+ }
5539
+ MngGetterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngGetterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
5540
+ MngGetterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.1.0", ngImport: i0, type: MngGetterPipe, name: "getter" });
5541
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngGetterPipe, decorators: [{
5542
+ type: Pipe,
5543
+ args: [{
5544
+ name: 'getter',
5545
+ pure: true
5546
+ }]
5547
+ }] });
5548
+
5549
+ class MngTemplatePipe {
5550
+ constructor(parametrizePipe) {
5551
+ this.parametrizePipe = parametrizePipe;
5552
+ }
5553
+ transform(value, template) {
5554
+ if (typeof template === 'string') {
5555
+ return this.parametrizePipe.transform(template, undefined, value);
5556
+ }
5557
+ return value;
5558
+ }
5559
+ }
5560
+ MngTemplatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngTemplatePipe, deps: [{ token: MngParametrizePipe }], target: i0.ɵɵFactoryTarget.Pipe });
5561
+ MngTemplatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.1.0", ngImport: i0, type: MngTemplatePipe, name: "template" });
5562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngTemplatePipe, decorators: [{
5563
+ type: Pipe,
5564
+ args: [{
5565
+ name: 'template',
5566
+ pure: true
5567
+ }]
5568
+ }], ctorParameters: function () { return [{ type: MngParametrizePipe }]; } });
5569
+
5286
5570
  class MngActionExecutorService {
5287
- constructor(injector, router, dialogService, confirmationService, translate, configurationService, navigationService, errorMapper, linkFormatter, defaultEditorDialogComponent) {
5571
+ constructor(injector, router, dialogService, confirmationService, translate, configurationService, navigationService, errorMapper, parametrize, defaultEditorDialogComponent) {
5288
5572
  this.injector = injector;
5289
5573
  this.router = router;
5290
5574
  this.dialogService = dialogService;
@@ -5293,7 +5577,7 @@ class MngActionExecutorService {
5293
5577
  this.configurationService = configurationService;
5294
5578
  this.navigationService = navigationService;
5295
5579
  this.errorMapper = errorMapper;
5296
- this.linkFormatter = linkFormatter;
5580
+ this.parametrize = parametrize;
5297
5581
  this.defaultEditorDialogComponent = defaultEditorDialogComponent;
5298
5582
  this.debug = false;
5299
5583
  // this.debug = true;
@@ -5540,34 +5824,45 @@ class MngActionExecutorService {
5540
5824
  const context = this.prepareActionContext(instance, parameters, dataProvider, previousActionInstance);
5541
5825
  if (action.hasRunConfirmation) {
5542
5826
  const sourceComponent = parameters?.sourceComponent;
5827
+ const confirmationDescriptor = action.runConfirmationDialogDescriptor;
5543
5828
  if (typeof sourceComponent?.getConfirmationService !== 'function' || typeof sourceComponent?.getConfirmationServiceInstanceKey !== 'function') {
5544
5829
  throw new Error(`Source component ${sourceComponent} should be implementing IConfirmationService interface to be able to provide confirmation functionality.`);
5545
5830
  }
5831
+ const item = parameters.item;
5546
5832
  const srcConfirmComponent = sourceComponent;
5547
5833
  let confirmParams = {
5548
5834
  key: srcConfirmComponent.getConfirmationServiceInstanceKey(action),
5549
- acceptVisible: false,
5550
- rejectVisible: false
5835
+ icon: confirmationDescriptor.icon,
5836
+ acceptVisible: true,
5837
+ acceptIcon: confirmationDescriptor.acceptIcon ?? undefined,
5838
+ acceptButtonStyleClass: confirmationDescriptor.acceptButtonStyle.getButtonClass(),
5839
+ rejectVisible: true,
5840
+ rejectIcon: confirmationDescriptor.rejectIcon ?? undefined,
5841
+ rejectButtonStyleClass: confirmationDescriptor.rejectButtonStyle.getButtonClass(),
5842
+ closeOnEscape: confirmationDescriptor.closeOnEscape
5551
5843
  };
5552
- const item = parameters.item;
5553
- if (action.runConfirmationTitle !== null) {
5554
- confirmParams.header = I18nUtils.Action.get(this.translate, action, 'confirm.title', action.runConfirmationTitle, item, 'general.confirmation') ?? undefined;
5844
+ if (confirmationDescriptor.title !== null) {
5845
+ confirmParams.header = I18nUtils.Action.get(this.translate, action, 'confirm.title', confirmationDescriptor.title, item, 'general.confirmation') ?? undefined;
5555
5846
  }
5556
- if (action.runConfirmationMessage !== null) {
5847
+ if (confirmationDescriptor.message !== null) {
5557
5848
  confirmParams.message =
5558
- I18nUtils.Action.get(this.translate, action, 'confirm.message', action.runConfirmationMessage, StringUtil.escapeHtmlAny(item), 'general.confirmation') ??
5849
+ I18nUtils.Action.get(this.translate, action, 'confirm.message', confirmationDescriptor.message, StringUtil.escapeHtmlAny(item), 'general.confirmation') ??
5559
5850
  undefined;
5560
5851
  }
5561
- if (action.runConfirmationIcon !== null) {
5562
- confirmParams.icon = action.runConfirmationIcon === undefined ? 'pi pi-exclamation-triangle' : action.runConfirmationIcon;
5852
+ if (confirmationDescriptor.acceptLabel !== null) {
5853
+ confirmParams.acceptLabel = I18nUtils.Action.get(this.translate, action, 'confirm.accept', confirmationDescriptor.acceptLabel, item, 'general.yes') ?? undefined;
5563
5854
  }
5564
- if (action.runConfirmationAcceptTitle !== null) {
5565
- confirmParams.acceptLabel = I18nUtils.Action.get(this.translate, action, 'confirm.accept', action.runConfirmationAcceptTitle, item, 'general.yes') ?? undefined;
5566
- confirmParams.acceptVisible = true;
5855
+ if (confirmationDescriptor.acceptIcon !== null) {
5856
+ confirmParams.acceptIcon = confirmationDescriptor.acceptIcon;
5567
5857
  }
5568
- if (action.runConfirmationRejectTitle !== null) {
5569
- confirmParams.rejectLabel = I18nUtils.Action.get(this.translate, action, 'confirm.reject', action.runConfirmationRejectTitle, item, 'general.no') ?? undefined;
5570
- confirmParams.rejectVisible = true;
5858
+ if (confirmationDescriptor.rejectIcon !== null) {
5859
+ confirmParams.rejectIcon = confirmationDescriptor.rejectIcon;
5860
+ }
5861
+ if (confirmationDescriptor.rejectLabel !== null) {
5862
+ confirmParams.rejectLabel = I18nUtils.Action.get(this.translate, action, 'confirm.reject', confirmationDescriptor.rejectLabel, item, 'general.no') ?? undefined;
5863
+ }
5864
+ if (confirmationDescriptor.rejectLabel === null && confirmationDescriptor.rejectIcon === null) {
5865
+ confirmParams.rejectVisible = false;
5571
5866
  }
5572
5867
  confirmParams.accept = () => {
5573
5868
  instance.state = ActionInstanceStateEnum.RunConfirmationEndAccept;
@@ -5577,8 +5872,8 @@ class MngActionExecutorService {
5577
5872
  instance.state = ActionInstanceStateEnum.RunConfirmationEndReject;
5578
5873
  this.deactivateAction(instance);
5579
5874
  };
5580
- if (action.runConfirmationConfigMapFn) {
5581
- confirmParams = action.runConfirmationConfigMapFn(context, confirmParams);
5875
+ if (confirmationDescriptor.runConfirmationConfigMapFn) {
5876
+ confirmParams = confirmationDescriptor.runConfirmationConfigMapFn(context, confirmParams);
5582
5877
  }
5583
5878
  context.confirmation = confirmParams;
5584
5879
  instance.state = ActionInstanceStateEnum.RunConfirmationStart;
@@ -5732,7 +6027,7 @@ class MngActionExecutorService {
5732
6027
  if (actionUrl.startsWith('/')) {
5733
6028
  actionUrl = actionUrl.substring(1);
5734
6029
  }
5735
- const actionUrlSegments = this.linkFormatter.transform(actionUrl, parameters.itemId, parameters.item, action.model, parameters.actionData);
6030
+ const actionUrlSegments = this.parametrize.transform(actionUrl, parameters.itemId, parameters.item, parameters.actionData).split('/');
5736
6031
  instance.triggerRouteNavigation = from(this.router.navigate([baseUrl, ...actionUrlSegments], { relativeTo: parameters.route, queryParams: parsedUrl.queryParams }));
5737
6032
  return instance;
5738
6033
  }
@@ -5794,11 +6089,11 @@ class MngActionExecutorService {
5794
6089
  return this.errorMapper.toMngError(error, actionError);
5795
6090
  }
5796
6091
  }
5797
- MngActionExecutorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionExecutorService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i3.DialogService }, { token: i2.ConfirmationService }, { token: i1$2.TranslateService }, { token: MngConfigurationService }, { token: MngNavigationService }, { token: MngErrorMapperService }, { token: MngLinkFormatterPipe }, { token: ACTION_EDITOR_DIALOG_COMPONENT_SETTING }], target: i0.ɵɵFactoryTarget.Injectable });
6092
+ MngActionExecutorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionExecutorService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i3.DialogService }, { token: i2.ConfirmationService }, { token: i1$2.TranslateService }, { token: MngConfigurationService }, { token: MngNavigationService }, { token: MngErrorMapperService }, { token: MngParametrizePipe }, { token: ACTION_EDITOR_DIALOG_COMPONENT_SETTING }], target: i0.ɵɵFactoryTarget.Injectable });
5798
6093
  MngActionExecutorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionExecutorService });
5799
6094
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionExecutorService, decorators: [{
5800
6095
  type: Injectable
5801
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i3.DialogService }, { type: i2.ConfirmationService }, { type: i1$2.TranslateService }, { type: MngConfigurationService }, { type: MngNavigationService }, { type: MngErrorMapperService }, { type: MngLinkFormatterPipe }, { type: i0.Type, decorators: [{
6096
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i3.DialogService }, { type: i2.ConfirmationService }, { type: i1$2.TranslateService }, { type: MngConfigurationService }, { type: MngNavigationService }, { type: MngErrorMapperService }, { type: MngParametrizePipe }, { type: i0.Type, decorators: [{
5802
6097
  type: Inject,
5803
6098
  args: [ACTION_EDITOR_DIALOG_COMPONENT_SETTING]
5804
6099
  }] }]; } });
@@ -6259,7 +6554,7 @@ class MngActionComponent {
6259
6554
  }
6260
6555
  ngOnInit() {
6261
6556
  this.viewContainer = this.viewContainerInit ?? this.viewContainerService ?? undefined;
6262
- this.hasNoTitle = this.action.title === null;
6557
+ this.hasNoTitle = this.action.buttonDescriptor.label === null;
6263
6558
  this.isEnabledSubject.next(true);
6264
6559
  this.isVisibleSubject.next(true);
6265
6560
  this.isPermittedSubject.next(true);
@@ -6282,7 +6577,7 @@ class MngActionComponent {
6282
6577
  this.isHostHidden = !isVisible || !isPermitted;
6283
6578
  });
6284
6579
  this.subscriptions.push(hostVisibilitySubscription);
6285
- this.buttonClass = this.action.buttonStyle.getButtonClass(this.hasNoTitle);
6580
+ this.buttonClass = this.action.buttonDescriptor.styleClass.getButtonClass(this.hasNoTitle);
6286
6581
  }
6287
6582
  ngOnChanges(changes) {
6288
6583
  if (!(changes['item']?.firstChange ?? true) || !(changes['itemId']?.firstChange ?? true) || !(changes['actionData']?.firstChange ?? true)) {
@@ -6359,21 +6654,21 @@ class MngActionComponent {
6359
6654
  }
6360
6655
  if (!this.hasNoTitle) {
6361
6656
  this.labelSubscription?.unsubscribe();
6362
- this.labelSubscription = I18nUtils.Action.getAsync(this.translate, this.action, 'title', this.action?.title ?? undefined, this.item).subscribe({
6657
+ this.labelSubscription = I18nUtils.Action.getAsync(this.translate, this.action, 'title', this.action.buttonDescriptor.label ?? undefined, this.item).subscribe({
6363
6658
  next: i18n => this.labelSubject.next(i18n)
6364
6659
  });
6365
6660
  }
6366
6661
  this.tooltipSubscription?.unsubscribe();
6367
- this.tooltipSubscription = I18nUtils.Action.getAsync(this.translate, this.action, 'tooltip', this.action?.tooltip ?? undefined, this.item).subscribe({
6662
+ this.tooltipSubscription = I18nUtils.Action.getAsync(this.translate, this.action, 'tooltip', this.action.buttonDescriptor.tooltip, this.item).subscribe({
6368
6663
  next: i18n => this.tooltipSubject.next(i18n)
6369
6664
  });
6370
6665
  }
6371
6666
  }
6372
6667
  MngActionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1$2.TranslateService }, { token: MngAuthorizationService }, { token: MngActionExecutorService }, { token: i2.ConfirmationService }, { token: MngViewContainerComponentService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
6373
- MngActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngActionComponent, selector: "mng-action", inputs: { action: "action", item: "item", itemId: "itemId", actionData: "actionData", queryParam: "queryParam", dataProvider: "dataProvider", inputDisabled: ["disabled", "inputDisabled"], inputLoading: ["loading", "inputLoading"], viewContainerInit: ["viewContainer", "viewContainerInit"] }, outputs: { finishEventEmitter: "finish" }, host: { properties: { "class": "this.hostClass", "class.m-0": "this.isHostHidden" } }, providers: [ConfirmationService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"($isVisible | async) && ($isPermitted | async)\">\n <a\n *ngIf=\"actionLink && actionLink.url !== ''; else routerLink\"\n pButton\n pRipple\n [icon]=\"$any(action.icon)\"\n [href]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : actionLink.url\"\n [target]=\"actionLink.target\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n <ng-template #routerLink>\n <a\n *ngIf=\"actionLink; else button\"\n pButton\n pRipple\n [icon]=\"$any(action.icon)\"\n [target]=\"actionLink.target\"\n [replaceUrl]=\"actionLink.replaceUrl\"\n [routerLink]=\"\n ($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : (actionLink.pathSegments | linkFormatter: itemId:item:action.model:actionData)\n \"\n [queryParams]=\"actionLink.queryParams\"\n [queryParamsHandling]=\"actionLink.queryParamsHandling\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n </ng-template>\n <ng-template #button>\n <button\n type=\"button\"\n pButton\n pRipple\n [icon]=\"$any(action.icon)\"\n [label]=\"($label | async) ?? ''\"\n [pTooltip]=\"$any($tooltip | async)\"\n [loading]=\"(($loading | async) ?? false) || ((inputLoading | async) ?? false)\"\n [disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n (click)=\"triggerAction($event)\"\n [class]=\"buttonClass\"></button>\n </ng-template>\n <p-confirmDialog *ngIf=\"action.hasRunConfirmation\" [key]=\"action.actionName + '_' + cmpId\" [baseZIndex]=\"50\" appendTo=\"body\"></p-confirmDialog>\n</ng-container>\n", styles: [":host{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i4$1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i9.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: MngLinkFormatterPipe, name: "linkFormatter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6668
+ MngActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngActionComponent, selector: "mng-action", inputs: { action: "action", item: "item", itemId: "itemId", actionData: "actionData", queryParam: "queryParam", dataProvider: "dataProvider", inputDisabled: ["disabled", "inputDisabled"], inputLoading: ["loading", "inputLoading"], viewContainerInit: ["viewContainer", "viewContainerInit"] }, outputs: { finishEventEmitter: "finish" }, host: { properties: { "class": "this.hostClass", "class.m-0": "this.isHostHidden" } }, providers: [ConfirmationService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"($isVisible | async) && ($isPermitted | async)\">\n <a\n *ngIf=\"actionLink && actionLink.url !== ''; else routerLink\"\n pButton\n pRipple\n [icon]=\"$any(action.buttonDescriptor.icon)\"\n [href]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : (actionLink.url | parametrize: itemId:item:actionData)\"\n [target]=\"actionLink.target\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n <ng-template #routerLink>\n <a\n *ngIf=\"actionLink; else button\"\n pButton\n pRipple\n [icon]=\"$any(action.buttonDescriptor.icon)\"\n [target]=\"actionLink.target\"\n [replaceUrl]=\"actionLink.replaceUrl\"\n [routerLink]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : (actionLink.pathSegments | parametrize: itemId:item:actionData)\"\n [queryParams]=\"actionLink.queryParams | parametrize: itemId:item:actionData\"\n [queryParamsHandling]=\"actionLink.queryParamsHandling\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n </ng-template>\n <ng-template #button>\n <button\n type=\"button\"\n pButton\n pRipple\n [icon]=\"$any(action.buttonDescriptor.icon)\"\n [label]=\"($label | async) ?? ''\"\n [pTooltip]=\"$any($tooltip | async)\"\n [loading]=\"(($loading | async) ?? false) || ((inputLoading | async) ?? false)\"\n [disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n (click)=\"triggerAction($event)\"\n [class]=\"buttonClass\"></button>\n </ng-template>\n <p-confirmDialog\n *ngIf=\"action.runConfirmationDialogDescriptor\"\n [key]=\"action.actionName + '_' + cmpId\"\n [baseZIndex]=\"50\"\n appendTo=\"body\"\n [closable]=\"action.runConfirmationDialogDescriptor.closable\"></p-confirmDialog>\n</ng-container>\n", styles: [":host{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i4$1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i9.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: MngParametrizePipe, name: "parametrize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6374
6669
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngActionComponent, decorators: [{
6375
6670
  type: Component,
6376
- args: [{ selector: 'mng-action', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ConfirmationService], template: "<ng-container *ngIf=\"($isVisible | async) && ($isPermitted | async)\">\n <a\n *ngIf=\"actionLink && actionLink.url !== ''; else routerLink\"\n pButton\n pRipple\n [icon]=\"$any(action.icon)\"\n [href]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : actionLink.url\"\n [target]=\"actionLink.target\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n <ng-template #routerLink>\n <a\n *ngIf=\"actionLink; else button\"\n pButton\n pRipple\n [icon]=\"$any(action.icon)\"\n [target]=\"actionLink.target\"\n [replaceUrl]=\"actionLink.replaceUrl\"\n [routerLink]=\"\n ($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : (actionLink.pathSegments | linkFormatter: itemId:item:action.model:actionData)\n \"\n [queryParams]=\"actionLink.queryParams\"\n [queryParamsHandling]=\"actionLink.queryParamsHandling\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n </ng-template>\n <ng-template #button>\n <button\n type=\"button\"\n pButton\n pRipple\n [icon]=\"$any(action.icon)\"\n [label]=\"($label | async) ?? ''\"\n [pTooltip]=\"$any($tooltip | async)\"\n [loading]=\"(($loading | async) ?? false) || ((inputLoading | async) ?? false)\"\n [disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n (click)=\"triggerAction($event)\"\n [class]=\"buttonClass\"></button>\n </ng-template>\n <p-confirmDialog *ngIf=\"action.hasRunConfirmation\" [key]=\"action.actionName + '_' + cmpId\" [baseZIndex]=\"50\" appendTo=\"body\"></p-confirmDialog>\n</ng-container>\n", styles: [":host{display:inline-block}\n"] }]
6671
+ args: [{ selector: 'mng-action', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ConfirmationService], template: "<ng-container *ngIf=\"($isVisible | async) && ($isPermitted | async)\">\n <a\n *ngIf=\"actionLink && actionLink.url !== ''; else routerLink\"\n pButton\n pRipple\n [icon]=\"$any(action.buttonDescriptor.icon)\"\n [href]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : (actionLink.url | parametrize: itemId:item:actionData)\"\n [target]=\"actionLink.target\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n <ng-template #routerLink>\n <a\n *ngIf=\"actionLink; else button\"\n pButton\n pRipple\n [icon]=\"$any(action.buttonDescriptor.icon)\"\n [target]=\"actionLink.target\"\n [replaceUrl]=\"actionLink.replaceUrl\"\n [routerLink]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false) ? null : (actionLink.pathSegments | parametrize: itemId:item:actionData)\"\n [queryParams]=\"actionLink.queryParams | parametrize: itemId:item:actionData\"\n [queryParamsHandling]=\"actionLink.queryParamsHandling\"\n [class.disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n [class]=\"buttonClass\"\n >{{ ($label | async) ?? '' }}</a\n >\n </ng-template>\n <ng-template #button>\n <button\n type=\"button\"\n pButton\n pRipple\n [icon]=\"$any(action.buttonDescriptor.icon)\"\n [label]=\"($label | async) ?? ''\"\n [pTooltip]=\"$any($tooltip | async)\"\n [loading]=\"(($loading | async) ?? false) || ((inputLoading | async) ?? false)\"\n [disabled]=\"($isEnabled | async) === false || ((inputDisabled | async) ?? false)\"\n (click)=\"triggerAction($event)\"\n [class]=\"buttonClass\"></button>\n </ng-template>\n <p-confirmDialog\n *ngIf=\"action.runConfirmationDialogDescriptor\"\n [key]=\"action.actionName + '_' + cmpId\"\n [baseZIndex]=\"50\"\n appendTo=\"body\"\n [closable]=\"action.runConfirmationDialogDescriptor.closable\"></p-confirmDialog>\n</ng-container>\n", styles: [":host{display:inline-block}\n"] }]
6377
6672
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1$2.TranslateService }, { type: MngAuthorizationService }, { type: MngActionExecutorService }, { type: i2.ConfirmationService }, { type: MngViewContainerComponentService, decorators: [{
6378
6673
  type: Optional
6379
6674
  }] }]; }, propDecorators: { hostClass: [{
@@ -6654,13 +6949,14 @@ class MngFormEditorComponent {
6654
6949
  if (field && field.setter) {
6655
6950
  const splitPath = field.property.split('.');
6656
6951
  let fieldValue = formValue;
6657
- for (let i = 0; i < splitPath.length; i++) {
6952
+ for (let i = 0; i < splitPath.length - 1; i++) {
6658
6953
  const currentSubPath = splitPath[i];
6659
6954
  if (typeof fieldValue[currentSubPath] !== 'object') {
6660
6955
  fieldValue[currentSubPath] = {};
6661
6956
  }
6662
6957
  fieldValue = fieldValue[currentSubPath];
6663
6958
  }
6959
+ fieldValue = fieldValue[splitPath[splitPath.length - 1]];
6664
6960
  field.setter(formValue, fieldValue);
6665
6961
  }
6666
6962
  });
@@ -7096,6 +7392,8 @@ class MngDropdownComponent {
7096
7392
  this.className = null;
7097
7393
  this.dropdownClassName = null;
7098
7394
  this.changeValueOnBlur = false;
7395
+ this.loadingSubject = new ReplaySubject(1);
7396
+ this.$loading = this.loadingSubject.asObservable();
7099
7397
  this.valueChangeEventEmitter = new EventEmitter();
7100
7398
  this.itemsSubject = new ReplaySubject(1);
7101
7399
  this.dataProviderService = null;
@@ -7105,6 +7403,7 @@ class MngDropdownComponent {
7105
7403
  this.onTouchedFn = () => { };
7106
7404
  this.dropdownFormControl = new FormControl();
7107
7405
  this.items$ = this.itemsSubject.asObservable();
7406
+ this.loadingSubject.next(false);
7108
7407
  }
7109
7408
  ngOnInit() {
7110
7409
  this.itemsLabelProperty = this.itemsLabelPropertyInit;
@@ -7115,6 +7414,7 @@ class MngDropdownComponent {
7115
7414
  }
7116
7415
  });
7117
7416
  if (this.dataProvider) {
7417
+ this.loadingSubject.next(true);
7118
7418
  this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
7119
7419
  const queryParamBuilder = MediusQueryParamBuilder.create();
7120
7420
  if (this.itemsLabelTranslate) {
@@ -7162,6 +7462,7 @@ class MngDropdownComponent {
7162
7462
  }))
7163
7463
  .subscribe(res => {
7164
7464
  this.itemsSubject.next(res);
7465
+ this.loadingSubject.next(false);
7165
7466
  });
7166
7467
  if (this.selectFirstItem && !this.dropdownFormControl?.value) {
7167
7468
  this.items$.pipe(first()).subscribe(res => {
@@ -7213,10 +7514,10 @@ class MngDropdownComponent {
7213
7514
  }
7214
7515
  }
7215
7516
  MngDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngDropdownComponent, deps: [{ token: i0.Injector }, { token: i1$2.TranslateService }, { token: MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
7216
- MngDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngDropdownComponent, selector: "mng-dropdown", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsDisabledProperty: "itemsDisabledProperty", multiselect: "multiselect", placeholder: "placeholder", showClear: "showClear", selectFirstItem: "selectFirstItem", className: "className", dropdownClassName: "dropdownClassName", changeValueOnBlur: "changeValueOnBlur" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true }], ngImport: i0, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onDropdownBlur($event)\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5$1.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "itemSize", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i6$1.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7517
+ MngDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngDropdownComponent, selector: "mng-dropdown", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsDisabledProperty: "itemsDisabledProperty", multiselect: "multiselect", placeholder: "placeholder", showClear: "showClear", selectFirstItem: "selectFirstItem", className: "className", dropdownClassName: "dropdownClassName", changeValueOnBlur: "changeValueOnBlur" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_DROPDOWN_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeDropdown", first: true, predicate: Dropdown, descendants: true }], ngImport: i0, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onDropdownBlur($event)\"\n [dropdownIcon]=\"($loading | async) ?? false ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5$1.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "itemSize", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i6$1.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7217
7518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngDropdownComponent, decorators: [{
7218
7519
  type: Component,
7219
- args: [{ selector: 'mng-dropdown', providers: [MNG_DROPDOWN_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onDropdownBlur($event)\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n" }]
7520
+ args: [{ selector: 'mng-dropdown', providers: [MNG_DROPDOWN_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dropdown\n *ngIf=\"!multiselect; else pMultiselect\"\n [formControl]=\"dropdownFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"$any(items$ | async)\"\n [showClear]=\"showClear\"\n [autoDisplayFirst]=\"false\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n (onBlur)=\"onDropdownBlur($event)\"\n [dropdownIcon]=\"($loading | async) ?? false ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'\"\n appendTo=\"body\">\n</p-dropdown>\n<ng-template #pMultiselect>\n <p-multiSelect\n [maxSelectedLabels]=\"1\"\n [selectedItemsLabel]=\"'mngDropdown.multiselectOverMaxDisplayLimit' | translate\"\n [formControl]=\"dropdownFormControl\"\n [defaultLabel]=\"$any(placeholder)\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [optionLabel]=\"$any(itemsLabelProperty)\"\n [optionValue]=\"$any(itemsValueProperty)\"\n [optionDisabled]=\"$any(itemsDisabledProperty)\"\n [options]=\"(items$ | async) ?? []\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [filter]=\"true\"\n [showToggleAll]=\"false\"\n (onPanelHide)=\"onPanelHide($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n</ng-template>\n" }]
7220
7521
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1$2.TranslateService }, { type: MngFormlyFieldWrapperComponent, decorators: [{
7221
7522
  type: Optional
7222
7523
  }] }]; }, propDecorators: { dataProvider: [{
@@ -7313,11 +7614,11 @@ class MngActionEditorComponent {
7313
7614
  this.setTitle();
7314
7615
  for (const action of this.action.editorActions) {
7315
7616
  if (action instanceof ActionEditorSubmitDescriptor) {
7316
- if (typeof action.icon === 'undefined') {
7317
- action.withIcon(action.submitType === ActionEditorSubmitTypeEnum.Submit ? 'pi pi-check' : 'pi pi-times');
7617
+ if (typeof action.buttonDescriptor.icon === 'undefined') {
7618
+ action.buttonDescriptor.withIcon(action.submitType === ActionEditorSubmitTypeEnum.Submit ? 'pi pi-check' : 'pi pi-times');
7318
7619
  }
7319
- if (typeof action.title === 'undefined') {
7320
- action.withTitle(action.submitType === ActionEditorSubmitTypeEnum.Submit ? 'general.save' : this.isDialog ? 'general.close' : 'general.cancel');
7620
+ if (typeof action.buttonDescriptor.label === 'undefined') {
7621
+ action.buttonDescriptor.withLabel(action.submitType === ActionEditorSubmitTypeEnum.Submit ? 'general.save' : this.isDialog ? 'general.close' : 'general.cancel');
7321
7622
  }
7322
7623
  // assign run operations
7323
7624
  action.withRunNotificationSuccess(undefined, undefined, false);
@@ -7484,6 +7785,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
7484
7785
  args: [MngFormEditorComponent]
7485
7786
  }] } });
7486
7787
 
7788
+ class MngButtonComponent {
7789
+ constructor() {
7790
+ this.clickEmitter = new EventEmitter();
7791
+ this.focusEmitter = new EventEmitter();
7792
+ this.blurEmitter = new EventEmitter();
7793
+ this.buttonClass = 'p-button';
7794
+ }
7795
+ ngOnInit() {
7796
+ this.buttonClass = `${this.descriptor.styleClass.getButtonClass(this.descriptor.label == null)}`;
7797
+ }
7798
+ onClick(event) {
7799
+ this.clickEmitter.next(event);
7800
+ this.descriptor.onClick?.(event);
7801
+ }
7802
+ onFocus(event) {
7803
+ this.focusEmitter.next(event);
7804
+ this.descriptor.onFocus?.(event);
7805
+ }
7806
+ onBlur(event) {
7807
+ this.blurEmitter.next(event);
7808
+ this.descriptor.onBlur?.(event);
7809
+ }
7810
+ }
7811
+ MngButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7812
+ MngButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngButtonComponent, selector: "mng-button", inputs: { descriptor: "descriptor" }, outputs: { clickEmitter: "buttonClick", focusEmitter: "buttonFocus", blurEmitter: "buttonBlur" }, ngImport: i0, template: "<p-button\n #button\n type=\"button\"\n [label]=\"$any(descriptor.label) | translate\"\n [icon]=\"$any(descriptor.icon)\"\n [iconPos]=\"$any(descriptor.iconPosition)\"\n [loading]=\"$any(descriptor.loading)\"\n [loadingIcon]=\"$any(descriptor.loadingIcon)\"\n [disabled]=\"$any(descriptor.disabled)\"\n [styleClass]=\"buttonClass\"\n [pTooltip]=\"$any(descriptor.tooltip) | translate\"\n [badge]=\"$any(descriptor.badge)\"\n (onClick)=\"onClick($event)\"\n (onBlur)=\"onBlur($event)\"\n (onFocus)=\"onFocus($event)\"></p-button>\n", dependencies: [{ kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7813
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngButtonComponent, decorators: [{
7814
+ type: Component,
7815
+ args: [{ selector: 'mng-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-button\n #button\n type=\"button\"\n [label]=\"$any(descriptor.label) | translate\"\n [icon]=\"$any(descriptor.icon)\"\n [iconPos]=\"$any(descriptor.iconPosition)\"\n [loading]=\"$any(descriptor.loading)\"\n [loadingIcon]=\"$any(descriptor.loadingIcon)\"\n [disabled]=\"$any(descriptor.disabled)\"\n [styleClass]=\"buttonClass\"\n [pTooltip]=\"$any(descriptor.tooltip) | translate\"\n [badge]=\"$any(descriptor.badge)\"\n (onClick)=\"onClick($event)\"\n (onBlur)=\"onBlur($event)\"\n (onFocus)=\"onFocus($event)\"></p-button>\n" }]
7816
+ }], propDecorators: { descriptor: [{
7817
+ type: Input
7818
+ }], clickEmitter: [{
7819
+ type: Output,
7820
+ args: ['buttonClick']
7821
+ }], focusEmitter: [{
7822
+ type: Output,
7823
+ args: ['buttonFocus']
7824
+ }], blurEmitter: [{
7825
+ type: Output,
7826
+ args: ['buttonBlur']
7827
+ }] } });
7828
+
7487
7829
  class MngFormlyFieldAutocompleteComponent extends FieldType {
7488
7830
  constructor() {
7489
7831
  super(...arguments);
@@ -7721,10 +8063,10 @@ class MngTableColumnValueComponent {
7721
8063
  }
7722
8064
  }
7723
8065
  MngTableColumnValueComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngTableColumnValueComponent, deps: [{ token: i0.ElementRef }, { token: i2.MessageService }, { token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
7724
- MngTableColumnValueComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: { descriptor: "descriptor", item: "item" }, host: { properties: { "style.max-width.px": "this.styleMaxWidth", "class": "this.className" } }, ngImport: i0, template: "<ng-container [ngSwitch]=\"descriptor.columnType\">\n <ng-container *ngSwitchCase=\"columnTypeString\">\n {{ item | jsonPath: jsonPath }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeNumber\">\n {{ item | jsonPath: jsonPath | number: descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCurrency\">\n {{ item | jsonPath: jsonPath | currency: currency:descriptor.currencyDisplay:descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeDate\">\n {{ item | jsonPath: jsonPath | date: descriptor.displayFormat }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeBoolean\">\n <ng-container *ngIf=\"descriptor.booleanAsIcon; else booleanText\"></ng-container>\n <i [class]=\"item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo:true\"></i>\n <ng-template #booleanText>\n {{ item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo | translate }}\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeEnum\">\n {{ item | jsonPath: jsonPath | enum: descriptor.enumType:descriptor.enumTitlePath:descriptor.enumNameAsValue | translate }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCustom\">\n <ng-container\n [mngComponent]=\"descriptor.customComponentType!\"\n [inputs]=\"{\n value: item | jsonPath: jsonPath,\n item: item,\n descriptor: descriptor\n }\"></ng-container>\n </ng-container>\n</ng-container>\n<div class=\"help-buttons\" *ngIf=\"descriptor.hasCopyToClipboard\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-copy\" class=\"p-button-rounded p-button-info p-button-sm\" (click)=\"copyToClipboard($event)\"></button>\n</div>\n", styles: [":host{display:inline-block;overflow:hidden}:host.nowrap{white-space:nowrap;text-overflow:ellipsis}:host:hover .help-buttons{display:block}.help-buttons{display:none;position:absolute;right:0;top:50%;transform:translateY(-50%)}.help-buttons .p-button{height:1.9rem;width:1.9rem;padding:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4$1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "directive", type: MngComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "inputs"], outputs: ["instanceCreated"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1$1.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: JsonPathPipe, name: "jsonPath" }, { kind: "pipe", type: MngEnumPipe, name: "enum" }, { kind: "pipe", type: MngBooleanPipe, name: "boolean" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8066
+ MngTableColumnValueComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: { descriptor: "descriptor", item: "item" }, host: { properties: { "style.max-width.px": "this.styleMaxWidth", "class": "this.className" } }, ngImport: i0, template: "<ng-container [ngSwitch]=\"descriptor.columnType\">\n <ng-container *ngSwitchCase=\"columnTypeString\">\n {{ item | jsonPath: jsonPath | getter: descriptor.getter | template: descriptor.template }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeNumber\">\n {{ item | jsonPath: jsonPath | number: descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCurrency\">\n {{ item | jsonPath: jsonPath | currency: currency:descriptor.currencyDisplay:descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeDate\">\n {{ item | jsonPath: jsonPath | date: descriptor.displayFormat }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeBoolean\">\n <ng-container *ngIf=\"descriptor.booleanAsIcon; else booleanText\"></ng-container>\n <i [class]=\"item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo:true\"></i>\n <ng-template #booleanText>\n {{ item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo | translate }}\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeEnum\">\n {{ item | jsonPath: jsonPath | enum: descriptor.enumType:descriptor.enumTitlePath:descriptor.enumNameAsValue | translate }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCustom\">\n <ng-container\n [mngComponent]=\"descriptor.customComponentType!\"\n [inputs]=\"{\n value: item | jsonPath: jsonPath,\n item: item,\n descriptor: descriptor\n }\"></ng-container>\n </ng-container>\n</ng-container>\n<div class=\"help-buttons\" *ngIf=\"descriptor.hasCopyToClipboard\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-copy\" class=\"p-button-rounded p-button-info p-button-sm\" (click)=\"copyToClipboard($event)\"></button>\n</div>\n", styles: [":host{display:inline-block;overflow:hidden}:host.nowrap{white-space:nowrap;text-overflow:ellipsis}:host:hover .help-buttons{display:block}.help-buttons{display:none;position:absolute;right:0;top:50%;transform:translateY(-50%)}.help-buttons .p-button{height:1.9rem;width:1.9rem;padding:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4$1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "directive", type: MngComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "inputs"], outputs: ["instanceCreated"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1$1.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: JsonPathPipe, name: "jsonPath" }, { kind: "pipe", type: MngEnumPipe, name: "enum" }, { kind: "pipe", type: MngBooleanPipe, name: "boolean" }, { kind: "pipe", type: MngGetterPipe, name: "getter" }, { kind: "pipe", type: MngTemplatePipe, name: "template" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7725
8067
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngTableColumnValueComponent, decorators: [{
7726
8068
  type: Component,
7727
- args: [{ selector: 'mng-table-column-value', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container [ngSwitch]=\"descriptor.columnType\">\n <ng-container *ngSwitchCase=\"columnTypeString\">\n {{ item | jsonPath: jsonPath }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeNumber\">\n {{ item | jsonPath: jsonPath | number: descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCurrency\">\n {{ item | jsonPath: jsonPath | currency: currency:descriptor.currencyDisplay:descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeDate\">\n {{ item | jsonPath: jsonPath | date: descriptor.displayFormat }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeBoolean\">\n <ng-container *ngIf=\"descriptor.booleanAsIcon; else booleanText\"></ng-container>\n <i [class]=\"item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo:true\"></i>\n <ng-template #booleanText>\n {{ item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo | translate }}\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeEnum\">\n {{ item | jsonPath: jsonPath | enum: descriptor.enumType:descriptor.enumTitlePath:descriptor.enumNameAsValue | translate }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCustom\">\n <ng-container\n [mngComponent]=\"descriptor.customComponentType!\"\n [inputs]=\"{\n value: item | jsonPath: jsonPath,\n item: item,\n descriptor: descriptor\n }\"></ng-container>\n </ng-container>\n</ng-container>\n<div class=\"help-buttons\" *ngIf=\"descriptor.hasCopyToClipboard\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-copy\" class=\"p-button-rounded p-button-info p-button-sm\" (click)=\"copyToClipboard($event)\"></button>\n</div>\n", styles: [":host{display:inline-block;overflow:hidden}:host.nowrap{white-space:nowrap;text-overflow:ellipsis}:host:hover .help-buttons{display:block}.help-buttons{display:none;position:absolute;right:0;top:50%;transform:translateY(-50%)}.help-buttons .p-button{height:1.9rem;width:1.9rem;padding:0}\n"] }]
8069
+ args: [{ selector: 'mng-table-column-value', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container [ngSwitch]=\"descriptor.columnType\">\n <ng-container *ngSwitchCase=\"columnTypeString\">\n {{ item | jsonPath: jsonPath | getter: descriptor.getter | template: descriptor.template }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeNumber\">\n {{ item | jsonPath: jsonPath | number: descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCurrency\">\n {{ item | jsonPath: jsonPath | currency: currency:descriptor.currencyDisplay:descriptor.displayFormat:descriptor.locale }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeDate\">\n {{ item | jsonPath: jsonPath | date: descriptor.displayFormat }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeBoolean\">\n <ng-container *ngIf=\"descriptor.booleanAsIcon; else booleanText\"></ng-container>\n <i [class]=\"item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo:true\"></i>\n <ng-template #booleanText>\n {{ item | jsonPath: jsonPath | boolean: descriptor.booleanYes:descriptor.booleanNo | translate }}\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeEnum\">\n {{ item | jsonPath: jsonPath | enum: descriptor.enumType:descriptor.enumTitlePath:descriptor.enumNameAsValue | translate }}\n </ng-container>\n <ng-container *ngSwitchCase=\"columnTypeCustom\">\n <ng-container\n [mngComponent]=\"descriptor.customComponentType!\"\n [inputs]=\"{\n value: item | jsonPath: jsonPath,\n item: item,\n descriptor: descriptor\n }\"></ng-container>\n </ng-container>\n</ng-container>\n<div class=\"help-buttons\" *ngIf=\"descriptor.hasCopyToClipboard\">\n <button pButton pRipple type=\"button\" icon=\"pi pi-copy\" class=\"p-button-rounded p-button-info p-button-sm\" (click)=\"copyToClipboard($event)\"></button>\n</div>\n", styles: [":host{display:inline-block;overflow:hidden}:host.nowrap{white-space:nowrap;text-overflow:ellipsis}:host:hover .help-buttons{display:block}.help-buttons{display:none;position:absolute;right:0;top:50%;transform:translateY(-50%)}.help-buttons .p-button{height:1.9rem;width:1.9rem;padding:0}\n"] }]
7728
8070
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i2.MessageService }, { type: i1$2.TranslateService }]; }, propDecorators: { descriptor: [{
7729
8071
  type: Input
7730
8072
  }], item: [{
@@ -8396,13 +8738,14 @@ class AMngTableviewRouteComponent {
8396
8738
  this.actions = this.createActionDescriptors();
8397
8739
  }
8398
8740
  createActionDescriptors() {
8399
- const actions = [];
8400
- actions.push(this.createActionDescriptorForDetails());
8401
- actions.push(this.createActionDescriptorForAdd());
8402
- actions.push(this.createActionDescriptorForEdit());
8403
- actions.push(this.createActionDescriptorForDelete());
8404
- actions.push(this.createActionDescriptorForExport());
8405
- return actions;
8741
+ return [
8742
+ this.createActionDescriptorForDetails(),
8743
+ this.createActionDescriptorForAdd(),
8744
+ this.createActionDescriptorForEdit(),
8745
+ this.createActionDescriptorForDelete(),
8746
+ this.createActionDescriptorForRefresh(),
8747
+ this.createActionDescriptorForExport()
8748
+ ];
8406
8749
  }
8407
8750
  createActionDescriptorForDetails(descriptor = this.descriptor.viewEditor) {
8408
8751
  return new ActionEditorDetailsDescriptor(descriptor);
@@ -8417,7 +8760,7 @@ class AMngTableviewRouteComponent {
8417
8760
  return new ActionDeleteDescriptor(descriptor);
8418
8761
  }
8419
8762
  createActionDescriptorForExport(descriptor = this.descriptor.model) {
8420
- return new ActionDescriptor(descriptor, 'export')
8763
+ const action = new ActionDescriptor(descriptor, 'export')
8421
8764
  .withRunFunction(ctx => {
8422
8765
  const queryParamBuilder = ctx.parameters.queryParam ? MediusQueryParamBuilder.createFromExisting(ctx.parameters.queryParam) : MediusQueryParamBuilder.create();
8423
8766
  queryParamBuilder.withItemsOffset(0).withItemsPerPage(1000);
@@ -8429,8 +8772,21 @@ class AMngTableviewRouteComponent {
8429
8772
  return undefined;
8430
8773
  }));
8431
8774
  })
8775
+ .withPosition(ActionPositionEnum.ToolbarRight);
8776
+ action.buttonDescriptor.withIcon('pi pi-upload');
8777
+ return action;
8778
+ }
8779
+ createActionDescriptorForRefresh(descriptor = this.descriptor.model) {
8780
+ const action = new ActionDescriptor(descriptor, 'refresh')
8432
8781
  .withPosition(ActionPositionEnum.ToolbarRight)
8433
- .withIcon('pi pi-upload');
8782
+ .withPermissionsRouteType(Permissions.ActionTypes.READ)
8783
+ .withRunNotificationSuccess(undefined, undefined, false)
8784
+ .withRunFunction(ctx => {
8785
+ ctx.parameters.viewContainer.triggerTableReload({});
8786
+ return of(null);
8787
+ });
8788
+ action.buttonDescriptor.withIcon('pi pi-refresh').styleClass.withActionLevel(ActionLevelEnum.Secondary);
8789
+ return action;
8434
8790
  }
8435
8791
  }
8436
8792
  AMngTableviewRouteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AMngTableviewRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -8675,20 +9031,18 @@ class MngFormlyFieldTableDialogFormComponent extends FieldType {
8675
9031
  if (hasViewAction) {
8676
9032
  const viewAction = new ActionEditorDescriptor(this.descriptor.tableviewDescriptor.viewEditor, 'details', this.descriptor.editor.model.type, this.descriptor.property)
8677
9033
  .withPosition(ActionPositionEnum.RowClick)
8678
- .withTitle(null)
8679
9034
  .withDialogClassName('mng-field-dialog mng-action-editor-dialog')
8680
9035
  .withDialogSize(ActionEditorDialogSizeEnum.Small);
8681
9036
  viewAction.withEditorActions([new ActionEditorSubmitDescriptor(viewAction, ActionEditorSubmitTypeEnum.Cancel)]);
9037
+ viewAction.buttonDescriptor.withLabel(null);
8682
9038
  this.actions.push(viewAction);
8683
9039
  }
8684
9040
  if (hasAddAction) {
8685
9041
  const addAction = new ActionEditorDescriptor(this.descriptor.tableviewDescriptor.addEditor, 'add', this.descriptor.editor.model.type, this.descriptor.property)
8686
9042
  .withPosition(ActionPositionEnum.ToolbarRight)
8687
- .withTitle(null)
8688
- .withIcon('pi pi-plus')
8689
9043
  .withDialogClassName('mng-field-dialog mng-action-editor-dialog')
8690
9044
  .withDialogSize(ActionEditorDialogSizeEnum.Small)
8691
- .withSize(ActionSizeEnum.ExtraSmall)
9045
+ .withButtonDescriptor(new ButtonDescriptor().withStyleClass(new ButtonStyleBuilder().withSize(ActionSizeEnum.ExtraSmall)))
8692
9046
  .withSubmitFunction(ctx => {
8693
9047
  if (!ctx.parameters.item) {
8694
9048
  return throwError(() => new Error(`No item was provided in context, edit cannot be done.`));
@@ -8701,16 +9055,15 @@ class MngFormlyFieldTableDialogFormComponent extends FieldType {
8701
9055
  })
8702
9056
  .withIsVisibleFunction(() => of(!this.options?.formState.disabled))
8703
9057
  .withIsEnabledFunction(() => this.isEnabled$);
9058
+ addAction.buttonDescriptor.withLabel(null).withIcon('pi pi-plus');
8704
9059
  this.actions.push(addAction);
8705
9060
  }
8706
9061
  if (hasEditAction) {
8707
9062
  const editAction = new ActionEditorDescriptor(this.descriptor.tableviewDescriptor.editEditor, 'edit', this.descriptor.editor.model.type, this.descriptor.property)
8708
9063
  .withPosition(ActionPositionEnum.RowInline)
8709
- .withTitle(null)
8710
- .withIcon('pi pi-pencil')
8711
9064
  .withDialogClassName('mng-field-dialog mng-action-editor-dialog')
8712
9065
  .withDialogSize(ActionEditorDialogSizeEnum.Small)
8713
- .withSize(ActionSizeEnum.ExtraSmall)
9066
+ .withButtonDescriptor(new ButtonDescriptor().withStyleClass(new ButtonStyleBuilder().withSize(ActionSizeEnum.ExtraSmall)))
8714
9067
  .withSubmitFunction(ctx => {
8715
9068
  if (!ctx.parameters.item) {
8716
9069
  return throwError(() => new Error(`No item was provided in context, edit cannot be done.`));
@@ -8723,15 +9076,13 @@ class MngFormlyFieldTableDialogFormComponent extends FieldType {
8723
9076
  })
8724
9077
  .withIsVisibleFunction(() => of(!this.formControl?.disabled))
8725
9078
  .withIsEnabledFunction(() => this.isEnabled$);
9079
+ editAction.buttonDescriptor.withLabel(null).withIcon('pi pi-pencil');
8726
9080
  this.actions.push(editAction);
8727
9081
  }
8728
9082
  if (hasDeleteAction) {
8729
9083
  const deleteAction = new ActionDescriptor(this.descriptor.tableviewDescriptor.model, 'delete', this.descriptor.editor.model.type, this.descriptor.property)
8730
9084
  .withPosition(ActionPositionEnum.RowInline)
8731
- .withLevel(ActionLevelEnum.Danger)
8732
- .withTitle(null)
8733
- .withIcon('pi pi-trash')
8734
- .withSize(ActionSizeEnum.ExtraSmall)
9085
+ .withButtonDescriptor(new ButtonDescriptor().withStyleClass(new ButtonStyleBuilder(ActionLevelEnum.Danger).withSize(ActionSizeEnum.ExtraSmall)))
8735
9086
  .withRunFunction(ctx => {
8736
9087
  if (!ctx.parameters.item) {
8737
9088
  return throwError(() => new Error(`No item was provided in context, delete cannot be done.`));
@@ -8756,6 +9107,7 @@ class MngFormlyFieldTableDialogFormComponent extends FieldType {
8756
9107
  })
8757
9108
  .withIsVisibleFunction(() => of(!this.options?.formState.disabled))
8758
9109
  .withIsEnabledFunction(() => this.isEnabled$);
9110
+ deleteAction.buttonDescriptor.withLabel(null).withIcon('pi pi-trash');
8759
9111
  this.actions.push(deleteAction);
8760
9112
  }
8761
9113
  this.actions.push(...this.descriptor.actions);
@@ -9918,7 +10270,9 @@ const declarations = [
9918
10270
  MngEnumPipe,
9919
10271
  MngBooleanPipe,
9920
10272
  MngI18nPropertyPipe,
9921
- MngLinkFormatterPipe,
10273
+ MngParametrizePipe,
10274
+ MngGetterPipe,
10275
+ MngTemplatePipe,
9922
10276
  // layout components
9923
10277
  MngBreadcrumbComponent,
9924
10278
  MngFooterComponent,
@@ -9953,7 +10307,9 @@ const declarations = [
9953
10307
  MngFormEditorComponent,
9954
10308
  MngActionComponent,
9955
10309
  MngActionEditorComponent,
9956
- MngActionRouteComponent
10310
+ MngActionRouteComponent,
10311
+ //button
10312
+ MngButtonComponent
9957
10313
  ];
9958
10314
  class MngCommonsModule {
9959
10315
  static forRoot(config) {
@@ -9978,7 +10334,9 @@ class MngCommonsModule {
9978
10334
  MngEnumPipe,
9979
10335
  MngBooleanPipe,
9980
10336
  MngI18nPropertyPipe,
9981
- MngLinkFormatterPipe,
10337
+ MngParametrizePipe,
10338
+ MngGetterPipe,
10339
+ MngTemplatePipe,
9982
10340
  // component service
9983
10341
  MngMainLayoutComponentService,
9984
10342
  MngViewContainerComponentService,
@@ -10035,7 +10393,9 @@ MngCommonsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versio
10035
10393
  MngEnumPipe,
10036
10394
  MngBooleanPipe,
10037
10395
  MngI18nPropertyPipe,
10038
- MngLinkFormatterPipe,
10396
+ MngParametrizePipe,
10397
+ MngGetterPipe,
10398
+ MngTemplatePipe,
10039
10399
  // layout components
10040
10400
  MngBreadcrumbComponent,
10041
10401
  MngFooterComponent,
@@ -10070,7 +10430,9 @@ MngCommonsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versio
10070
10430
  MngFormEditorComponent,
10071
10431
  MngActionComponent,
10072
10432
  MngActionEditorComponent,
10073
- MngActionRouteComponent], imports: [
10433
+ MngActionRouteComponent,
10434
+ //button
10435
+ MngButtonComponent], imports: [
10074
10436
  // angular modules
10075
10437
  CommonModule,
10076
10438
  RouterModule,
@@ -10150,7 +10512,9 @@ MngCommonsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versio
10150
10512
  MngEnumPipe,
10151
10513
  MngBooleanPipe,
10152
10514
  MngI18nPropertyPipe,
10153
- MngLinkFormatterPipe,
10515
+ MngParametrizePipe,
10516
+ MngGetterPipe,
10517
+ MngTemplatePipe,
10154
10518
  // layout components
10155
10519
  MngBreadcrumbComponent,
10156
10520
  MngFooterComponent,
@@ -10185,7 +10549,9 @@ MngCommonsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versio
10185
10549
  MngFormEditorComponent,
10186
10550
  MngActionComponent,
10187
10551
  MngActionEditorComponent,
10188
- MngActionRouteComponent] });
10552
+ MngActionRouteComponent,
10553
+ //button
10554
+ MngButtonComponent] });
10189
10555
  MngCommonsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngCommonsModule, imports: [
10190
10556
  // angular modules
10191
10557
  CommonModule,
@@ -11001,5 +11367,5 @@ class TableviewRouteBuilder {
11001
11367
  * Generated bundle index. Do not edit.
11002
11368
  */
11003
11369
 
11004
- export { ACTION_EDITOR_DIALOG_COMPONENT_SETTING, AFieldDescriptor, AFieldGroupDescriptor, AGenericFieldDescriptor, AMngApiService, AMngBaseApiService, AMngCrudApiService, AMngGetAllApiService, AMngTableviewRouteComponent, APermissions, ActionActivationTriggerEnum, ActionContext, ActionContextValidation, ActionDataProviderUtil, ActionDeleteDescriptor, ActionDescriptor, ActionEditorAddDescriptor, ActionEditorDescriptor, ActionEditorDetailsDescriptor, ActionEditorDialogSizeEnum, ActionEditorEditDescriptor, ActionEditorSubmitDescriptor, ActionEditorSubmitTypeEnum, ActionError, ActionInstance, ActionInstanceStateEnum, ActionLevelEnum, ActionLinkDescriptor, ActionParameters, ActionPositionEnum, ActionSimpleDescriptor, ActionSizeEnum, ActionTypeEnum, AuthorizationTypeEnum, AuthorizationUtil, ButtonStyleBuilder, ColumnDescriptor, ColumnTypeEnum, DataProvider, DefaultMngErrorMapperService, EditorDataProvider, EditorDescriptor, EditorFormlyUtil, EnumName, EnumUtil, FieldGroupDescriptor, FieldGroupTypeEnum, FieldInputDescriptor, FieldInputTypeEnum, FieldLookupDescriptor, FieldLookupEnumDescriptor, FieldLookupTypeEnum, FieldManyEditorActionEnum, FieldManyEditorDescriptor, FieldManyEditorTypeEnum, FieldManyToManyEditorActionEnum, FieldManyToManyEditorDescriptor, FieldManyToManyEditorTypeEnum, FieldSizeEnum, FieldTabGroupDescriptor, FieldValidationDescriptor, FilterDescriptor, FilterLookupDescriptor, FilterLookupEnumDescriptor, FilterLookupTypeEnum, FilterMatchModeEnum, FilterTypeEnum, I18nUtils, JsonPathPipe, LookupDataProvider, MNG_AUTOCOMPLETE_VALUE_ACCESSOR, MNG_BROWSER_STORAGE_IT, MNG_COMMONS_INITIALIZER_IT, MNG_DROPDOWN_VALUE_ACCESSOR, MNG_MODULE_CONFIG_IT, MediusFilterMatchType, MediusFilterParam, MediusQueryMode, MediusQueryParam, MediusQueryParamBuilder, MediusQueryResult, MediusRestUtil, MngActionComponent, MngActionEditorComponent, MngActionExecutorService, MngActionRouteComponent, MngAuthorizationGuard, MngAuthorizationService, MngAutocompleteComponent, MngBooleanPipe, MngBreadcrumbComponent, MngCommonsModule, MngCommonsService, MngComponentDirective, MngConfigurationService, MngDropdownComponent, MngEnumPipe, MngErrorMapperService, MngFooterComponent, MngFormEditorComponent, MngFormEditorSubmitEvent, MngFormFieldEvent, MngFormFieldEventComponentSubtype, MngFormFieldEventDialogSubtype, MngFormFieldEventTypeEnum, MngFormlyFieldAutocompleteComponent, MngFormlyFieldDropdownComponent, MngFormlyFieldFieldsetComponent, MngFormlyFieldInputComponent, MngFormlyFieldLabelComponent, MngFormlyFieldLookupDialogComponent, MngFormlyFieldTableDialogFormComponent, MngFormlyFieldTableDialogMultiselectComponent, MngFormlyFieldTabsComponent, MngFormlyFieldWrapperComponent, MngFormlyTableWrapperComponent, MngI18nPropertyPipe, MngLinkFormatterPipe, MngMainLayoutComponent, MngMainLayoutComponentService, MngMenuComponent, MngMenuItemComponent, MngNavigationService, MngTableCellClickEvent, MngTableColumnFilterComponent, MngTableColumnValueComponent, MngTableComponent, MngTableLoadEvent, MngTableReloadEvent, MngTableviewComponent, MngTableviewRouteComponent, MngTemplateDirective, MngTopbarComponent, MngVersionComponent, MngViewContainerComponentService, ModelDescriptor, ModelUtil, NotificationUtil, ObjectSerializer, Permissions, RouteBuilder, RoutesBuilder, StringUtil, StylesUtil, TableDataProvider, TableDescriptor, TableFilterDisplayEnum, TablePaginationModeEnum, TableSizeEnum, TableviewDataProvider, TableviewDescriptor, TableviewRouteBuilder, TableviewTypeEnum, TypeName, TypeUtil, enumNameDecoratorPropertyName, enumsMapBase, formlyTypesConfig, formlyWrappersConfig, getEmailValidationMessage, getFormlyValidationMessages, getMaxLengthValidationMessage, getMinLengthValidationMessage, getRequiredValidationMessage, getTextPatternValidationMessage, mngConfigJsonAppInitializerProvider, mngConfigurationServiceProvider, mngFormlyConfigProvider, primeNgModules, typeMapBase, typeNameDecoratorPropertyName };
11370
+ export { ACTION_EDITOR_DIALOG_COMPONENT_SETTING, AFieldDescriptor, AFieldGroupDescriptor, AGenericFieldDescriptor, AMngApiService, AMngBaseApiService, AMngCrudApiService, AMngGetAllApiService, AMngTableviewRouteComponent, APermissions, ActionActivationTriggerEnum, ActionConfirmationDialogDescriptor, ActionContext, ActionContextValidation, ActionDataProviderUtil, ActionDeleteDescriptor, ActionDescriptor, ActionEditorAddDescriptor, ActionEditorDescriptor, ActionEditorDetailsDescriptor, ActionEditorDialogSizeEnum, ActionEditorEditDescriptor, ActionEditorSubmitDescriptor, ActionEditorSubmitTypeEnum, ActionError, ActionInstance, ActionInstanceStateEnum, ActionLevelEnum, ActionLinkDescriptor, ActionParameters, ActionPositionEnum, ActionSimpleDescriptor, ActionSizeEnum, ActionTypeEnum, AuthorizationTypeEnum, AuthorizationUtil, ButtonDescriptor, ButtonStyleBuilder, ButtonStyleRoundedEnum, ColumnDescriptor, ColumnTypeEnum, DataProvider, DefaultMngErrorMapperService, EditorDataProvider, EditorDescriptor, EditorFormlyUtil, EnumName, EnumUtil, FieldGroupDescriptor, FieldGroupTypeEnum, FieldInputDescriptor, FieldInputTypeEnum, FieldLookupDescriptor, FieldLookupEnumDescriptor, FieldLookupTypeEnum, FieldManyEditorActionEnum, FieldManyEditorDescriptor, FieldManyEditorTypeEnum, FieldManyToManyEditorActionEnum, FieldManyToManyEditorDescriptor, FieldManyToManyEditorTypeEnum, FieldSizeEnum, FieldTabGroupDescriptor, FieldValidationDescriptor, FilterDescriptor, FilterLookupDescriptor, FilterLookupEnumDescriptor, FilterLookupTypeEnum, FilterMatchModeEnum, FilterTypeEnum, I18nUtils, JsonPathPipe, LookupDataProvider, MNG_AUTOCOMPLETE_VALUE_ACCESSOR, MNG_BROWSER_STORAGE_IT, MNG_COMMONS_INITIALIZER_IT, MNG_DROPDOWN_VALUE_ACCESSOR, MNG_MODULE_CONFIG_IT, MediusFilterMatchType, MediusFilterParam, MediusQueryMode, MediusQueryParam, MediusQueryParamBuilder, MediusQueryResult, MediusRestUtil, MngActionComponent, MngActionEditorComponent, MngActionExecutorService, MngActionRouteComponent, MngAuthorizationGuard, MngAuthorizationService, MngAutocompleteComponent, MngBooleanPipe, MngBreadcrumbComponent, MngButtonComponent, MngCommonsModule, MngCommonsService, MngComponentDirective, MngConfigurationService, MngDropdownComponent, MngEnumPipe, MngErrorMapperService, MngFooterComponent, MngFormEditorComponent, MngFormEditorSubmitEvent, MngFormFieldEvent, MngFormFieldEventComponentSubtype, MngFormFieldEventDialogSubtype, MngFormFieldEventTypeEnum, MngFormlyFieldAutocompleteComponent, MngFormlyFieldDropdownComponent, MngFormlyFieldFieldsetComponent, MngFormlyFieldInputComponent, MngFormlyFieldLabelComponent, MngFormlyFieldLookupDialogComponent, MngFormlyFieldTableDialogFormComponent, MngFormlyFieldTableDialogMultiselectComponent, MngFormlyFieldTabsComponent, MngFormlyFieldWrapperComponent, MngFormlyTableWrapperComponent, MngGetterPipe, MngI18nPropertyPipe, MngMainLayoutComponent, MngMainLayoutComponentService, MngMenuComponent, MngMenuItemComponent, MngNavigationService, MngParametrizePipe, MngTableCellClickEvent, MngTableColumnFilterComponent, MngTableColumnValueComponent, MngTableComponent, MngTableLoadEvent, MngTableReloadEvent, MngTableviewComponent, MngTableviewRouteComponent, MngTemplateDirective, MngTemplatePipe, MngTopbarComponent, MngVersionComponent, MngViewContainerComponentService, ModelDescriptor, ModelUtil, NotificationUtil, ObjectSerializer, Permissions, RouteBuilder, RoutesBuilder, StringUtil, StylesUtil, TableDataProvider, TableDescriptor, TableFilterDisplayEnum, TablePaginationModeEnum, TableSizeEnum, TableviewCrudDataProvider, TableviewDataProvider, TableviewDescriptor, TableviewRouteBuilder, TableviewTypeEnum, TypeName, TypeUtil, enumNameDecoratorPropertyName, enumsMapBase, formlyTypesConfig, formlyWrappersConfig, getEmailValidationMessage, getFormlyValidationMessages, getMaxLengthValidationMessage, getMinLengthValidationMessage, getRequiredValidationMessage, getTextPatternValidationMessage, mngConfigJsonAppInitializerProvider, mngConfigurationServiceProvider, mngFormlyConfigProvider, primeNgModules, typeMapBase, typeNameDecoratorPropertyName };
11005
11371
  //# sourceMappingURL=mediusinc-mng-commons.mjs.map