@adaptabletools/adaptable 22.0.0-canary.2 → 22.0.0-canary.4

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 (131) hide show
  1. package/index.css +64 -26
  2. package/index.css.map +1 -1
  3. package/package.json +1 -1
  4. package/src/AdaptableInterfaces/IAdaptable.d.ts +2 -2
  5. package/src/AdaptableOptions/ActionColumnOptions.d.ts +2 -2
  6. package/src/AdaptableOptions/CustomSortOptions.d.ts +5 -0
  7. package/src/AdaptableOptions/DashboardOptions.d.ts +1 -2
  8. package/src/AdaptableOptions/ToolPanelOptions.d.ts +1 -2
  9. package/src/AdaptableState/AlertState.d.ts +2 -2
  10. package/src/AdaptableState/ChartingState.d.ts +3 -3
  11. package/src/AdaptableState/Common/AdaptableAlert.d.ts +2 -2
  12. package/src/AdaptableState/Common/AdaptableButton.d.ts +2 -2
  13. package/src/AdaptableState/Common/AdaptableFlashingCell.d.ts +2 -2
  14. package/src/AdaptableState/Common/AdaptableObject.d.ts +25 -2
  15. package/src/AdaptableState/Common/AdaptableStyle.d.ts +8 -0
  16. package/src/AdaptableState/Common/RowSummary.d.ts +1 -1
  17. package/src/AdaptableState/Common/Schedule.d.ts +3 -4
  18. package/src/AdaptableState/Common/SystemStatusMessageInfo.d.ts +2 -2
  19. package/src/AdaptableState/CustomSortState.d.ts +2 -2
  20. package/src/AdaptableState/DashboardState.d.ts +2 -2
  21. package/src/AdaptableState/ExportState.d.ts +2 -2
  22. package/src/AdaptableState/FlashingCellState.d.ts +2 -2
  23. package/src/AdaptableState/FormatColumnState.d.ts +2 -10
  24. package/src/AdaptableState/LayoutState.d.ts +8 -3
  25. package/src/AdaptableState/NamedQueryState.d.ts +2 -2
  26. package/src/AdaptableState/PlusMinusState.d.ts +2 -2
  27. package/src/AdaptableState/ShortcutState.d.ts +2 -2
  28. package/src/AdaptableState/StyledColumnState.d.ts +1 -1
  29. package/src/AdaptableState/ThemeState.d.ts +2 -2
  30. package/src/Api/CustomSortApi.d.ts +6 -3
  31. package/src/Api/DataSetApi.d.ts +1 -1
  32. package/src/Api/GridApi.d.ts +3 -3
  33. package/src/Api/Implementation/CustomSortApiImpl.d.ts +5 -1
  34. package/src/Api/Implementation/CustomSortApiImpl.js +2 -2
  35. package/src/Api/Implementation/GridApiImpl.d.ts +9 -9
  36. package/src/Api/Implementation/GridApiImpl.js +16 -16
  37. package/src/Api/Implementation/LayoutHelpers.js +7 -0
  38. package/src/Api/Implementation/ScheduleApiImpl.js +1 -0
  39. package/src/Api/Internal/ColumnInternalApi.js +1 -1
  40. package/src/Api/Internal/FormatColumnInternalApi.d.ts +0 -10
  41. package/src/Api/Internal/FormatColumnInternalApi.js +1 -19
  42. package/src/Redux/ActionsReducers/LayoutRedux.d.ts +1 -1
  43. package/src/Redux/ActionsReducers/NoteRedux.js +1 -1
  44. package/src/Strategy/AlertModule.js +4 -0
  45. package/src/Strategy/CustomSortModule.js +4 -0
  46. package/src/Strategy/FlashingCellModule.js +5 -0
  47. package/src/Strategy/FormatColumnModule.js +4 -0
  48. package/src/Strategy/LayoutModule.js +4 -4
  49. package/src/Strategy/PlusMinusModule.js +4 -0
  50. package/src/Strategy/ScheduleModule.js +4 -0
  51. package/src/Strategy/ShortcutModule.js +4 -0
  52. package/src/Strategy/Utilities/FormatColumn/getFormatColumnSettingsViewItems.js +0 -3
  53. package/src/Utilities/Constants/DocumentationLinkConstants.d.ts +2 -2
  54. package/src/Utilities/Constants/DocumentationLinkConstants.js +2 -2
  55. package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +3 -3
  56. package/src/Utilities/Extensions/StringExtensions.d.ts +2 -0
  57. package/src/Utilities/Extensions/StringExtensions.js +16 -0
  58. package/src/Utilities/Helpers/FormatHelper.js +9 -2
  59. package/src/Utilities/Helpers/StyleHelper.js +14 -0
  60. package/src/Utilities/ObjectFactory.js +16 -3
  61. package/src/Utilities/Services/AnnotationsService.js +1 -1
  62. package/src/Utilities/Services/ModuleService.js +3 -3
  63. package/src/View/AdaptablePopover/index.d.ts +1 -0
  64. package/src/View/AdaptablePopover/index.js +1 -1
  65. package/src/View/Alert/ActiveAlertsPanel.js +8 -0
  66. package/src/View/Alert/AlertViewPanel.js +13 -9
  67. package/src/View/Alert/Utilities/getAlertButtonStyle.d.ts +1 -0
  68. package/src/View/Alert/Utilities/getAlertButtonStyle.js +8 -0
  69. package/src/View/Alert/Utilities/getDefaultAlertDefinition.d.ts +2 -1
  70. package/src/View/Alert/Wizard/AlertTypeWizardSection.d.ts +5 -2
  71. package/src/View/Alert/Wizard/AlertTypeWizardSection.js +47 -12
  72. package/src/View/Alert/Wizard/AlertWizard.js +14 -10
  73. package/src/View/BulkUpdate/BulkUpdateViewPanel.js +23 -11
  74. package/src/View/CalculatedColumn/Wizard/CalculatedColumnExpressionWizardSection.js +2 -2
  75. package/src/View/CellSummary/CellSummaryViewPanel.js +15 -17
  76. package/src/View/Components/AdaptableDateInput/index.js +1 -1
  77. package/src/View/Components/Buttons/ButtonApply.js +1 -1
  78. package/src/View/Components/Buttons/ButtonClear.d.ts +1 -0
  79. package/src/View/Components/Buttons/EntityListActionButtons.d.ts +1 -2
  80. package/src/View/Components/Buttons/SuspendToggleButton/SuspendToggleButton.d.ts +1 -2
  81. package/src/View/Components/Selectors/BulkUpdateValueSelector.js +19 -18
  82. package/src/View/Components/StyleComponent.js +20 -1
  83. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.d.ts +2 -1
  84. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +40 -14
  85. package/src/View/CustomSort/Wizard/CustomSortWizard.js +4 -4
  86. package/src/View/Dashboard/DashboardPopup.js +4 -5
  87. package/src/View/DataChangeHistory/DataChangeHistoryGrid.js +1 -0
  88. package/src/View/Export/ExportDestinationPicker.js +1 -1
  89. package/src/View/Export/ExportStatusBar.js +4 -2
  90. package/src/View/Export/ExportViewPanel.js +25 -18
  91. package/src/View/FlashingCell/Wizard/FlashingCellSettingsWizardSection.d.ts +2 -1
  92. package/src/View/FlashingCell/Wizard/FlashingCellSettingsWizardSection.js +34 -14
  93. package/src/View/FlashingCell/Wizard/FlashingCellWizard.js +14 -10
  94. package/src/View/FormatColumn/Wizard/FormatColumnSettingsWizardSection.js +46 -51
  95. package/src/View/FormatColumn/Wizard/FormatColumnStyleWizardSection.js +2 -2
  96. package/src/View/FormatColumn/Wizard/FormatColumnWizard.js +20 -9
  97. package/src/View/GridInfo/GridInfoPopup/GridInfoPopup.js +57 -65
  98. package/src/View/Layout/Wizard/sections/PivotColumnsSection.js +8 -0
  99. package/src/View/PlusMinus/Wizard/PlusMinusSettingsWizardSection.js +32 -9
  100. package/src/View/PlusMinus/Wizard/PlusMinusWizard.js +20 -15
  101. package/src/View/QuickSearch/QuickSearchPopup.js +4 -1
  102. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsIPushPull.js +12 -1
  103. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsOpenFin.js +12 -1
  104. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsReminder.js +14 -4
  105. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsReport.js +12 -1
  106. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.d.ts +2 -1
  107. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.js +10 -1
  108. package/src/View/Shortcut/Wizard/ShortcutSettingsWizard.d.ts +2 -1
  109. package/src/View/Shortcut/Wizard/ShortcutSettingsWizard.js +25 -4
  110. package/src/View/Shortcut/Wizard/ShortcutWizard.js +18 -14
  111. package/src/View/UIHelper.d.ts +2 -0
  112. package/src/View/UIHelper.js +15 -0
  113. package/src/agGrid/AdaptableAgGrid.d.ts +2 -2
  114. package/src/agGrid/AdaptableAgGrid.js +5 -5
  115. package/src/agGrid/AgGridColumnAdapter.js +3 -18
  116. package/src/components/Dashboard/DashboardToolbar.js +1 -1
  117. package/src/components/ExpressionEditor/EditorInput.js +19 -3
  118. package/src/components/Tree/TreeDropdown/index.js +1 -1
  119. package/src/env.js +2 -2
  120. package/src/layout-manager/src/LayoutManagerModel.d.ts +1 -0
  121. package/src/layout-manager/src/index.js +25 -7
  122. package/src/layout-manager/src/normalizeLayoutModel.js +3 -0
  123. package/src/metamodel/adaptable.metamodel.d.ts +39 -7
  124. package/src/metamodel/adaptable.metamodel.js +1 -1
  125. package/src/migration/AdaptableUpgradeHelper.js +3 -1
  126. package/src/migration/VersionUpgrade22.d.ts +21 -0
  127. package/src/migration/VersionUpgrade22.js +187 -0
  128. package/src/types.d.ts +2 -3
  129. package/tsconfig.esm.tsbuildinfo +1 -1
  130. package/src/AdaptableState/Common/SuspendableObject.d.ts +0 -10
  131. package/src/AdaptableState/Common/SuspendableObject.js +0 -1
@@ -41,15 +41,6 @@ export class FormatColumnInternalApi extends ApiBase {
41
41
  .getFormatColumns(config)
42
42
  .filter((fc) => fc.Style);
43
43
  }
44
- /**
45
- * Retrieves all Format Columns in Adaptable State with the `Style` or the `CellAlignment` property set
46
- * @returns format columns
47
- */
48
- getAllFormatColumnWithStyleAndCellAlignment(config) {
49
- return this.getFormatColumnApi()
50
- .getFormatColumns(config)
51
- .filter((fc) => fc.Style || fc.CellAlignment);
52
- }
53
44
  /**
54
45
  * Retrieves all Format Columns in Adaptable State with `DisplayFormat` property set
55
46
  * @returns format columns
@@ -59,15 +50,6 @@ export class FormatColumnInternalApi extends ApiBase {
59
50
  .getFormatColumns(config)
60
51
  .filter((fc) => fc.DisplayFormat);
61
52
  }
62
- /**
63
- * Retrieves all Format Columns in Adaptable State with `CellAlignment` property set
64
- * @returns format columns
65
- */
66
- getAllFormatColumnWithCellAlignment(config) {
67
- return this.getFormatColumnApi()
68
- .getFormatColumns(config)
69
- .filter((fc) => fc.CellAlignment);
70
- }
71
53
  /**
72
54
  * Get all FormatColumns which are defined for this column and have a custom AdaptableStyle
73
55
  * @param column
@@ -75,7 +57,7 @@ export class FormatColumnInternalApi extends ApiBase {
75
57
  * @returns list of FormatColumn
76
58
  */
77
59
  getFormatColumnsWithStyleForColumn(column, config) {
78
- const formatColumns = this.getAllFormatColumnWithStyleAndCellAlignment()
60
+ const formatColumns = this.getAllFormatColumnWithStyle()
79
61
  .filter((formatColumn) => {
80
62
  // FormatColumn default target is 'cell', so if no target is specified, we assume 'cell'
81
63
  const fcTarget = formatColumn.Target ?? 'cell';
@@ -168,11 +168,11 @@ export declare const getColumnFilterSelector: (state: AdaptableState, columnId:
168
168
  Predicates: import("../../types").ColumnFilterPredicate[];
169
169
  PredicatesOperator?: import("../../types").PredicatesOperator;
170
170
  IsSuspended?: boolean;
171
- Uuid?: import("../../AdaptableState/Uuid").TypeUuid;
172
171
  Source?: "InitialState" | "User";
173
172
  AdaptableVersion?: import("../../types").AdaptableVersion;
174
173
  IsReadOnly?: boolean;
175
174
  Tags?: import("../../types").AdaptableObjectTag[];
176
175
  Metadata?: any;
176
+ Uuid?: import("../../AdaptableState/Uuid").TypeUuid;
177
177
  };
178
178
  export declare const LayoutReducer: Redux.Reducer<LayoutState>;
@@ -42,7 +42,7 @@ export const GetNoteSelector = (state, address) => {
42
42
  // happy check
43
43
  return true;
44
44
  }
45
- // Primary keys retreived from the grid dom are always strings, so we must also consider them strings
45
+ // Primary keys retrieved from the grid dom are always strings, so we must also consider them strings
46
46
  if ((typeof address.PrimaryKeyValue === 'number' && typeof note.PrimaryKeyValue === 'string') ||
47
47
  (typeof address.PrimaryKeyValue === 'string' && typeof note.PrimaryKeyValue === 'number')) {
48
48
  return (note.PrimaryKeyValue.toString() === address.PrimaryKeyValue.toString() &&
@@ -183,6 +183,10 @@ export class AlertModule extends AdaptableModuleBase {
183
183
  const alertType = getAlertType(alert);
184
184
  return {
185
185
  items: [
186
+ {
187
+ name: 'Name',
188
+ values: [alert.Name],
189
+ },
186
190
  getAlertTypeViewItems(alert),
187
191
  alertType === 'DataChange' && {
188
192
  ...getScopeViewItems(alert.Scope, this.api),
@@ -47,6 +47,10 @@ export class CustomSortModule extends AdaptableModuleBase {
47
47
  toView(customSort) {
48
48
  return {
49
49
  items: [
50
+ {
51
+ name: 'Name',
52
+ values: [customSort.Name],
53
+ },
50
54
  getCustomSortColumnViewItems(customSort, this.api),
51
55
  getCustomSortSortOrderViewItems(customSort),
52
56
  getObjectTagsViewItems(customSort, this.api),
@@ -182,6 +182,7 @@ export class FlashingCellModule extends AdaptableModuleBase {
182
182
  }
183
183
  return [
184
184
  this.createMenuItemReduxAction('flashing-cell-add', 'Add Flashing Cell', this.moduleInfo.Glyph, FlashingCellRedux.FlashingCellDefinitionAdd({
185
+ Name: `Any Change [${column.columnId}]`,
185
186
  Scope: {
186
187
  ColumnIds: [column.columnId],
187
188
  },
@@ -247,6 +248,10 @@ export class FlashingCellModule extends AdaptableModuleBase {
247
248
  toView(flashingCell) {
248
249
  return {
249
250
  items: [
251
+ {
252
+ name: 'Name',
253
+ values: [flashingCell.Name],
254
+ },
250
255
  { ...getScopeViewItems(flashingCell.Scope, this.api), label: 'Trigger' },
251
256
  {
252
257
  ...getRuleViewItems(flashingCell.Rule, this.api),
@@ -82,6 +82,10 @@ export class FormatColumnModule extends AdaptableModuleBase {
82
82
  return {
83
83
  abObject: formatColumn,
84
84
  items: [
85
+ {
86
+ name: 'Name',
87
+ values: [formatColumn.Name],
88
+ },
85
89
  getScopeViewItems(formatColumn.Scope, this.api),
86
90
  getFormatColumnSettingsTargetItems(formatColumn),
87
91
  formatColumn.Rule && getRuleViewItems(formatColumn.Rule, this.api),
@@ -299,14 +299,14 @@ export class LayoutModule extends AdaptableModuleBase {
299
299
  }
300
300
  return {
301
301
  items: [
302
- {
303
- name: 'Grid Type',
304
- values: [isPivotLayout(layout) ? 'Pivot' : 'Table'],
305
- },
306
302
  {
307
303
  name: 'Name',
308
304
  values: [layout.Name],
309
305
  },
306
+ {
307
+ name: 'Grid Type',
308
+ values: [isPivotLayout(layout) ? 'Pivot' : 'Table'],
309
+ },
310
310
  /**
311
311
  * Hide pivot columns.
312
312
  *
@@ -200,6 +200,10 @@ export class PlusMinusModule extends AdaptableModuleBase {
200
200
  return {
201
201
  abObject: plusMinus,
202
202
  items: [
203
+ {
204
+ name: 'Name',
205
+ values: [plusMinus.Name],
206
+ },
203
207
  {
204
208
  name: 'Target',
205
209
  ...getScopeViewItems(plusMinus.Scope, this.api),
@@ -132,6 +132,10 @@ export class ScheduleModule extends AdaptableModuleBase {
132
132
  return {
133
133
  abObject: schedule,
134
134
  items: [
135
+ {
136
+ name: 'Name',
137
+ values: [schedule.Name],
138
+ },
135
139
  {
136
140
  name: 'Settings',
137
141
  values: getScheduleSettingsValues(schedule).map((description) => `${description.label}: ${description.value}`),
@@ -82,6 +82,10 @@ export class ShortcutModule extends AdaptableModuleBase {
82
82
  return {
83
83
  abObject: shortcut,
84
84
  items: [
85
+ {
86
+ name: 'Name',
87
+ values: [shortcut.Name],
88
+ },
85
89
  getScopeViewItems(shortcut.Scope, this.api),
86
90
  getShortcutSettingsViewItems(shortcut),
87
91
  getObjectTagsViewItems(shortcut, this.api),
@@ -1,8 +1,5 @@
1
1
  export const getFormatColumnSettingsViewItems = (formatColumn) => {
2
2
  let values = [];
3
- if (formatColumn.CellAlignment) {
4
- values.push(`Cell Alignment: ${formatColumn.CellAlignment}`);
5
- }
6
3
  if (formatColumn.RowScope) {
7
4
  if (formatColumn.RowScope.ExcludeDataRows) {
8
5
  values.push('Exclude Data Rows');
@@ -12,7 +12,7 @@ export declare const PredicateDocsLink = "https://www.adaptabletools.com/docs/ad
12
12
  export declare const PrimaryKeyDocsLink = "https://www.adaptabletools.com/docs/getting-started-primary-key";
13
13
  export declare const LicenseDocsLink = "https://www.adaptabletools.com/buy/buying-adaptable-licensing";
14
14
  export declare const AdaptableOptionsDocsLink = "https://www.adaptabletools.com/docs/technical-reference-adaptable-options";
15
- export declare const AgGridModulesDocsLink = "https://www.adaptabletools.com/docs/dev-guide-aggrid-modules-overview";
15
+ export declare const AgGridModulesDocsLink = "https://www.adaptabletools.com/docs/getting-started-aggrid-modules";
16
16
  export declare const AlertMessageDocsLink = "https://www.adaptabletools.com/docs/handbook-alerting-message";
17
17
  export declare const FormatColumnPlaceholderDocsLink = "https://www.adaptabletools.com/docs/handbook-column-formatting-display-format-placeholder";
18
- export declare const AgGridRequiredModulesDocsLink = "https://www.adaptabletools.com/docs/dev-guide-aggrid-modules-overview#mandatory-modules";
18
+ export declare const AgGridRequiredModulesDocsLink = "https://www.adaptabletools.com/docs/getting-started-aggrid-modules#mandatory-modules";
@@ -13,7 +13,7 @@ export const PredicateDocsLink = `${HOST_URL_DOCS}/adaptable-predicate`;
13
13
  export const PrimaryKeyDocsLink = `${HOST_URL_DOCS}/getting-started-primary-key`;
14
14
  export const LicenseDocsLink = `${HOST_URL_ROOT}/buy/buying-adaptable-licensing`;
15
15
  export const AdaptableOptionsDocsLink = `${HOST_URL_DOCS}/technical-reference-adaptable-options`;
16
- export const AgGridModulesDocsLink = `${HOST_URL_DOCS}/dev-guide-aggrid-modules-overview`;
16
+ export const AgGridModulesDocsLink = `${HOST_URL_DOCS}/getting-started-aggrid-modules`;
17
17
  export const AlertMessageDocsLink = `${HOST_URL_DOCS}/handbook-alerting-message`;
18
18
  export const FormatColumnPlaceholderDocsLink = `${HOST_URL_DOCS}/handbook-column-formatting-display-format-placeholder`;
19
- export const AgGridRequiredModulesDocsLink = `${HOST_URL_DOCS}/dev-guide-aggrid-modules-overview#mandatory-modules`;
19
+ export const AgGridRequiredModulesDocsLink = `${HOST_URL_DOCS}/getting-started-aggrid-modules#mandatory-modules`;
@@ -639,7 +639,7 @@ export const scalarExpressionFunctions = {
639
639
  }
640
640
  return result;
641
641
  },
642
- description: "Returns the percentage difference between a cell's current value and its previous value.",
642
+ description: "Returns percentage difference between a cell's current value and previous value",
643
643
  signatures: [
644
644
  'PERCENT_CHANGE( [colName], <INCREASE|DECREASE> )',
645
645
  'PERCENT_CHANGE( COL(name: string), <INCREASE|DECREASE> )',
@@ -684,7 +684,7 @@ export const scalarExpressionFunctions = {
684
684
  }
685
685
  return result;
686
686
  },
687
- description: "Returns the absolute difference between a cell's current value and its previous value.",
687
+ description: "Returns absolute difference between a cell's current value and previous value",
688
688
  signatures: [
689
689
  'ABSOLUTE_CHANGE( [colName] )',
690
690
  'ABSOLUTE_CHANGE( COL(name: string) )',
@@ -716,7 +716,7 @@ export const scalarExpressionFunctions = {
716
716
  const previousValue = context.dataChangedEvent.oldValue;
717
717
  return currentColumnValue !== previousValue;
718
718
  },
719
- description: "Returns true if a cell's current value is different from its previous value, otherwise false. If no column is provided, it checks if any value has changed.",
719
+ description: "Returns true if cell's current value is different from previous value, otherwise false; if no column is provided, it checks if any value has changed",
720
720
  signatures: ['ANY_CHANGE( [colName] )', 'ANY_CHANGE()'],
721
721
  examples: ['ANY_CHANGE([col1])', 'ANY_CHANGE()'],
722
722
  category: 'changes',
@@ -17,6 +17,7 @@ export declare function Humanize(str: string): string;
17
17
  export declare function ReplaceEmptySpacesWithUnderscore(str?: string): string;
18
18
  export declare function IsNumeric(str: string): boolean;
19
19
  export declare function UnescapeHtmlEntities(str: string): string;
20
+ export declare function ReplaceAllOccurencesExceptLastOne(str: string, searchTerm: string, replacement: string): string;
20
21
  export declare const StringExtensions: {
21
22
  IsNull: typeof IsNull;
22
23
  IsNotNull: typeof IsNotNull;
@@ -37,5 +38,6 @@ export declare const StringExtensions: {
37
38
  ReplaceEmptySpacesWithUnderscore: typeof ReplaceEmptySpacesWithUnderscore;
38
39
  IsNumeric: typeof IsNumeric;
39
40
  UnescapeHtmlEntities: typeof UnescapeHtmlEntities;
41
+ ReplaceAllOccurencesExceptLastOne: typeof ReplaceAllOccurencesExceptLastOne;
40
42
  };
41
43
  export default StringExtensions;
@@ -92,6 +92,21 @@ export function UnescapeHtmlEntities(str) {
92
92
  }
93
93
  return preparedStr;
94
94
  }
95
+ export function ReplaceAllOccurencesExceptLastOne(str, searchTerm, replacement) {
96
+ // Find the index of the last occurrence of the search string
97
+ const lastIndex = str.lastIndexOf(searchTerm);
98
+ // If the string is not found, return the original string
99
+ if (lastIndex === -1) {
100
+ return str;
101
+ }
102
+ // Slice the string into two parts: before and after the last occurrence
103
+ const partBeforeLast = str.slice(0, lastIndex);
104
+ const partAfterLast = str.slice(lastIndex);
105
+ // Replace all occurrences in the first part
106
+ const replacedPart = partBeforeLast.replaceAll(searchTerm, replacement);
107
+ // Recombine the modified first part with the untouched second part
108
+ return replacedPart + partAfterLast;
109
+ }
95
110
  export const StringExtensions = {
96
111
  IsNull,
97
112
  IsNotNull,
@@ -112,5 +127,6 @@ export const StringExtensions = {
112
127
  ReplaceEmptySpacesWithUnderscore,
113
128
  IsNumeric,
114
129
  UnescapeHtmlEntities,
130
+ ReplaceAllOccurencesExceptLastOne,
115
131
  };
116
132
  export default StringExtensions;
@@ -28,7 +28,6 @@ export function NumberFormatter(input, options = {}, rowNode, column, api) {
28
28
  if (isNaN(n)) {
29
29
  return preparedInput.toString();
30
30
  }
31
- const fractionsSepatator = options.FractionSeparator ? options.FractionSeparator : '.';
32
31
  let multiplier = options.Multiplier ? options.Multiplier : 1;
33
32
  if (options.Multiplier !== undefined) {
34
33
  n *= multiplier;
@@ -65,6 +64,7 @@ export function NumberFormatter(input, options = {}, rowNode, column, api) {
65
64
  }
66
65
  let s;
67
66
  let digitsToUse;
67
+ const fractionsSepatator = options.FractionSeparator ?? '.';
68
68
  if (options.Truncate || options.Ceiling || options.Round || options.Floor) {
69
69
  digitsToUse = 0;
70
70
  }
@@ -84,7 +84,14 @@ export function NumberFormatter(input, options = {}, rowNode, column, api) {
84
84
  s = s.replace(/\./g, options.FractionSeparator);
85
85
  }
86
86
  if (options.IntegerSeparator !== undefined) {
87
- s = s.replace(/\,/g, options.IntegerSeparator);
87
+ // if fraction separator is not a comma then simply replace all instances
88
+ if (options.FractionSeparator !== ',') {
89
+ s = s.replace(/\,/g, options.IntegerSeparator);
90
+ }
91
+ else {
92
+ // otherwise don't replace the last instance
93
+ s = StringExtensions.ReplaceAllOccurencesExceptLastOne(s, ',', options.IntegerSeparator);
94
+ }
88
95
  }
89
96
  s = (options.Prefix || '') + s + (options.Suffix || '');
90
97
  if (options.Parentheses === true && preparedInput < 0) {
@@ -80,6 +80,20 @@ export const convertAdaptableStyleToCSS = (style) => {
80
80
  break;
81
81
  }
82
82
  }
83
+ if (style.Alignment) {
84
+ switch (style.Alignment) {
85
+ case 'Default':
86
+ case 'Left':
87
+ result.textAlign = 'left';
88
+ break;
89
+ case 'Right':
90
+ result.textAlign = 'right';
91
+ break;
92
+ case 'Center':
93
+ result.textAlign = 'center';
94
+ break;
95
+ }
96
+ }
83
97
  // assertion added to comply with the ag-Grid types
84
98
  return result;
85
99
  };
@@ -6,7 +6,7 @@ import { Bounce, Flip, Slide, Zoom } from '../components/Toastify';
6
6
  import { BLACK, getHexForName, LIGHT_GRAY } from '../View/UIHelper';
7
7
  import { isPivotLayout } from '../Api/Implementation/LayoutHelpers';
8
8
  export function CreateEmptyCustomSort() {
9
- return { Uuid: createUuid(), ColumnId: EMPTY_STRING, SortedValues: [] };
9
+ return { Uuid: createUuid(), Name: EMPTY_STRING, ColumnId: EMPTY_STRING, SortedValues: [] };
10
10
  }
11
11
  export function CreateAdaptableComment(text, api) {
12
12
  const comment = {
@@ -44,6 +44,7 @@ export function CreateEmptyNamedQuery(expression) {
44
44
  export function CreateEmptyPlusMinusNudge() {
45
45
  return {
46
46
  Uuid: createUuid(),
47
+ Name: EMPTY_STRING,
47
48
  Scope: undefined,
48
49
  Rule: undefined,
49
50
  NudgeValue: PLUS_MINUS_DEFAULT_NUDGE_VALUE,
@@ -81,6 +82,7 @@ export function CreateRowChangedAlert(alertHeader, alertMessage, alertDefinition
81
82
  export function CreateEmptyAlertDefinition() {
82
83
  return {
83
84
  Uuid: createUuid(),
85
+ Name: EMPTY_STRING,
84
86
  Scope: { All: true },
85
87
  Rule: {
86
88
  Predicates: [],
@@ -92,6 +94,7 @@ export function CreateEmptyAlertDefinition() {
92
94
  export function CreateEmptyFlashingCellDefinition() {
93
95
  return {
94
96
  Uuid: createUuid(),
97
+ Name: EMPTY_STRING,
95
98
  Scope: { ColumnIds: [] },
96
99
  Rule: {
97
100
  Predicates: [
@@ -108,6 +111,7 @@ export function CreateInternalAlertDefinitionForMessages(messageType, alertPrope
108
111
  };
109
112
  return {
110
113
  Uuid: createUuid(),
114
+ Name: EMPTY_STRING,
111
115
  Scope: undefined,
112
116
  Rule: {
113
117
  Predicates: [],
@@ -129,6 +133,7 @@ export function CreateEmptyReport() {
129
133
  export function CreateEmptyBaseSchedule(scheduleType) {
130
134
  return {
131
135
  Uuid: createUuid(),
136
+ Name: EMPTY_STRING,
132
137
  ScheduleType: scheduleType,
133
138
  Schedule: CreateEmptySchedule(),
134
139
  };
@@ -136,6 +141,7 @@ export function CreateEmptyBaseSchedule(scheduleType) {
136
141
  export function CreateEmptyReminderSchedule() {
137
142
  return {
138
143
  Uuid: createUuid(),
144
+ Name: EMPTY_STRING,
139
145
  ScheduleType: ScheduleType.Reminder,
140
146
  Schedule: CreateEmptySchedule(),
141
147
  Header: EMPTY_STRING,
@@ -148,6 +154,7 @@ export function CreateEmptyReminderSchedule() {
148
154
  export function CreateEmptyReportSchedule() {
149
155
  return {
150
156
  Uuid: createUuid(),
157
+ Name: EMPTY_STRING,
151
158
  ScheduleType: ScheduleType.Report,
152
159
  Schedule: CreateEmptySchedule(),
153
160
  ReportName: EMPTY_STRING,
@@ -172,6 +179,7 @@ export function CreateEmptyOpenFinReport() {
172
179
  export function CreateEmptyIPushPullSchedule() {
173
180
  return {
174
181
  Uuid: createUuid(),
182
+ Name: EMPTY_STRING,
175
183
  ScheduleType: ScheduleType.ipushpull,
176
184
  Schedule: CreateEmptySchedule(),
177
185
  IPushPullReport: CreateEmptyIPushPullReport(),
@@ -181,6 +189,7 @@ export function CreateEmptyIPushPullSchedule() {
181
189
  export function CreateEmptyOpenFinSchedule() {
182
190
  return {
183
191
  Uuid: createUuid(),
192
+ Name: EMPTY_STRING,
184
193
  ScheduleType: ScheduleType.OpenFin,
185
194
  Schedule: CreateEmptySchedule(),
186
195
  OpenFinReport: CreateEmptyOpenFinReport(),
@@ -190,6 +199,7 @@ export function CreateEmptyOpenFinSchedule() {
190
199
  export function CreateIPushPullSchedule(iPushPullReport) {
191
200
  return {
192
201
  Uuid: createUuid(),
202
+ Name: EMPTY_STRING,
193
203
  ScheduleType: ScheduleType.ipushpull,
194
204
  Schedule: CreateEmptySchedule(),
195
205
  IPushPullReport: iPushPullReport,
@@ -199,6 +209,7 @@ export function CreateIPushPullSchedule(iPushPullReport) {
199
209
  export function CreateReportSchedule(reportName, reportFormat) {
200
210
  return {
201
211
  Uuid: createUuid(),
212
+ Name: EMPTY_STRING,
202
213
  ScheduleType: ScheduleType.Report,
203
214
  Schedule: CreateEmptySchedule(),
204
215
  ReportName: reportName,
@@ -207,7 +218,6 @@ export function CreateReportSchedule(reportName, reportFormat) {
207
218
  }
208
219
  export function CreateEmptySchedule() {
209
220
  return {
210
- Uuid: createUuid(),
211
221
  OneOffDate: undefined,
212
222
  DaysOfWeek: [],
213
223
  Hour: 0,
@@ -217,6 +227,7 @@ export function CreateEmptySchedule() {
217
227
  export function CreateEmptyShortcut() {
218
228
  return {
219
229
  Uuid: createUuid(),
230
+ Name: EMPTY_STRING,
220
231
  Scope: undefined,
221
232
  ShortcutKey: EMPTY_STRING,
222
233
  ShortcutValue: undefined,
@@ -225,10 +236,11 @@ export function CreateEmptyShortcut() {
225
236
  }
226
237
  export function CreateEmptyFormatColumn() {
227
238
  return {
239
+ Uuid: createUuid(),
240
+ Name: EMPTY_STRING,
228
241
  Scope: undefined,
229
242
  Style: CreateEmptyStyle(),
230
243
  DisplayFormat: undefined,
231
- CellAlignment: undefined,
232
244
  RowScope: undefined,
233
245
  Target: 'cell',
234
246
  };
@@ -292,6 +304,7 @@ export function CreateEmptyStyle() {
292
304
  FontStyle: undefined,
293
305
  FontSize: undefined,
294
306
  ClassName: undefined,
307
+ Alignment: undefined,
295
308
  };
296
309
  }
297
310
  export function CreateSystemStatusMessageInfo(message, type, furtherInfo) {
@@ -28,7 +28,7 @@ export class AnnotationsService {
28
28
  if (a?.ColumnId === b?.ColumnId && a?.PrimaryKeyValue === b?.PrimaryKeyValue) {
29
29
  return true;
30
30
  }
31
- // Primary keys retreived from the grid dom are always strings, so we must also consider them strings
31
+ // Primary keys retrieved from the grid dom are always strings, so we must also consider them strings
32
32
  if ((typeof a.PrimaryKeyValue === 'number' && typeof b.PrimaryKeyValue === 'string') ||
33
33
  (typeof b.PrimaryKeyValue === 'string' && typeof a.PrimaryKeyValue === 'number')) {
34
34
  return (a.PrimaryKeyValue.toString() === b.PrimaryKeyValue.toString() && a.ColumnId === b.ColumnId);
@@ -114,13 +114,13 @@ export class ModuleService {
114
114
  case 'CalculatedColumn':
115
115
  return url + 'handbook-calculated-column';
116
116
  case 'CellSummary':
117
- return url + 'handbook-summarising';
117
+ return url + 'handbook-summarising-cells';
118
118
  case 'Charting':
119
119
  return url + 'handbook-charts';
120
120
  case 'ColumnFilter':
121
121
  return url + 'handbook-column-filter';
122
122
  case 'ColumnInfo':
123
- return url + 'dev-guide-column-grid-column-info';
123
+ return url + 'dev-guide-columns-column-info';
124
124
  case 'Comment':
125
125
  return url + 'handbook-comments';
126
126
  case 'CustomSort':
@@ -146,7 +146,7 @@ export class ModuleService {
146
146
  case 'GridFilter':
147
147
  return url + 'handbook-grid-filter';
148
148
  case 'GridInfo':
149
- return url + 'dev-guide-column-grid-column-info';
149
+ return url + 'dev-guide-support-monitoring';
150
150
  case 'Layout':
151
151
  return url + 'handbook-layouts';
152
152
  case 'NamedQuery':
@@ -17,6 +17,7 @@ export interface AdaptablePopoverProps extends React.ClassAttributes<React.Props
17
17
  popupPadding?: 0 | 2;
18
18
  alignPosition?: OverlayShowParams['alignPosition'];
19
19
  visible?: boolean;
20
+ disabled?: boolean;
20
21
  }
21
22
  export declare class AdaptablePopover extends React.Component<React.PropsWithChildren<AdaptablePopoverProps>, {}> {
22
23
  render(): React.JSX.Element;
@@ -35,7 +35,7 @@ export class AdaptablePopover extends React.Component {
35
35
  // showTriangle
36
36
  visible: this.props.visible, render: () => popoverClickRootClose, showEvent: (this.props.showEvent || 'mouseenter'), hideEvent: (this.props.hideEvent || 'mouseleave'), style: {
37
37
  overflow: 'visible',
38
- }, alignPosition: this.props.alignPosition }, useButton ? (React.createElement(ButtonInfo, { style: iconStyle, variant: "text", onClick: () => null, icon: showIcon && icon, tooltip: this.props.tooltipText }, this.props.children)) : (React.createElement("div", { title: this.props.tooltipText, tabIndex: 0, style: { cursor: 'pointer', display: 'inline-block' } },
38
+ }, alignPosition: this.props.alignPosition }, useButton ? (React.createElement(ButtonInfo, { style: iconStyle, variant: "text", onClick: () => null, icon: showIcon && icon, tooltip: this.props.tooltipText, disabled: this.props.disabled }, this.props.children)) : (React.createElement("div", { title: this.props.tooltipText, tabIndex: 0, style: { cursor: 'pointer', display: 'inline-block' } },
39
39
  this.props.children,
40
40
  showIcon && React.createElement(Icon, { name: icon, style: iconStyle }))))));
41
41
  }
@@ -7,5 +7,13 @@ export const ActiveAlertsPanel = () => {
7
7
  const adaptable = useAdaptable();
8
8
  const filterModule = adaptable.ModuleService.getModuleById(ModuleConstants.AlertModuleId);
9
9
  const alerts = useSelector((state) => state.Internal.AdaptableAlerts);
10
+ // map the suspended property from the underlying AlertDefinitions
11
+ alerts.forEach((alert) => {
12
+ const liveAlertDef = adaptable.api.alertApi.getAlertDefinitionById(alert.alertDefinition.Uuid);
13
+ if (liveAlertDef) {
14
+ // @ts-ignore theoretically AdaptableAlert is not Suspendable; practically <AdaptableObjectCompactList> expects it
15
+ alert.IsSuspended = liveAlertDef.IsSuspended;
16
+ }
17
+ });
10
18
  return React.createElement(AdaptableObjectCompactList, { abObjects: alerts, module: filterModule });
11
19
  };
@@ -2,10 +2,11 @@ import * as React from 'react';
2
2
  import { connect } from 'react-redux';
3
3
  import * as InternalRedux from '../../Redux/ActionsReducers/InternalRedux';
4
4
  import { AdaptablePopover } from '../AdaptablePopover';
5
- import UIHelper from '../UIHelper';
6
5
  import { getAlertButtonStyle } from './Utilities/getAlertButtonStyle';
7
6
  import { ActiveAlertsPanel } from './ActiveAlertsPanel';
8
7
  import { Flex } from '../../components/Flex';
8
+ import { ButtonClear } from '../Components/Buttons/ButtonClear';
9
+ import clsx from 'clsx';
9
10
  class AlertViewPanelComponent extends React.Component {
10
11
  constructor(props) {
11
12
  super(props);
@@ -20,7 +21,6 @@ class AlertViewPanelComponent extends React.Component {
20
21
  }
21
22
  }
22
23
  render() {
23
- const messageType = UIHelper.getMessageTypeFromAdaptableAlerts(this.props.AdaptableAlerts);
24
24
  const { color: buttonTextColor, background: buttonBackground } = getAlertButtonStyle(this.props.AdaptableAlerts);
25
25
  const collapsedText = this.props.AdaptableAlerts.length == 0
26
26
  ? '0 Alerts'
@@ -28,13 +28,17 @@ class AlertViewPanelComponent extends React.Component {
28
28
  ? '1 Alert'
29
29
  : this.props.AdaptableAlerts.length + ' Alerts';
30
30
  const alertsPanel = React.createElement(ActiveAlertsPanel, null);
31
- const elementType = this.props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
32
- return (React.createElement(Flex, { alignItems: "stretch", className: `ab-${elementType}__Alert__wrap` },
33
- React.createElement(Flex, { className: `ab-${elementType}__Alert__text twa:rounded-standard twa:mr-2 twa:p-2 text-2`, style: { color: buttonTextColor, backgroundColor: buttonBackground }, alignItems: "center" }, collapsedText),
34
- this.props.AdaptableAlerts.length > 0 && (React.createElement(Flex, { alignItems: "center" },
35
- React.createElement(AdaptablePopover, { className: `ab-${elementType}__Alert__info`, headerText: "",
36
- // tooltipText="Alerts"
37
- bodyText: [alertsPanel], MessageType: messageType, useButton: true, showEvent: 'focus', hideEvent: "blur", popoverMinWidth: 400 })))));
31
+ const isToolbar = this.props.viewType === 'Toolbar';
32
+ const elementType = isToolbar ? 'DashboardToolbar' : 'ToolPanel';
33
+ return (React.createElement(Flex, { alignItems: "stretch", className: clsx(`ab-${elementType}__Alert__wrap twa:gap-1`, {
34
+ 'twa:min-w-[140px] twa:w-[140px]': isToolbar,
35
+ [`twa:flex-1`]: !isToolbar,
36
+ }) },
37
+ React.createElement(Flex, { key: `${buttonTextColor}_${buttonBackground}_${collapsedText}`, className: `ab-${elementType}__Alert__text twa:flex-1 twa:rounded-standard twa:p-2 text-2 twa:items-center twa:justify-center twa:min-h-input`, style: { color: buttonTextColor, backgroundColor: buttonBackground } }, collapsedText),
38
+ this.props.AdaptableAlerts.length > 0 && (React.createElement(Flex, { className: 'twa:gap-1' },
39
+ React.createElement(Flex, { className: "twa:flex twa:box-border" },
40
+ React.createElement(ButtonClear, { "aria-label": 'Clear All Alerts', variant: 'outlined', className: `ab-${elementType}__Alert__clear`, onClick: () => this.props.onDeleteAllAlert(this.state.Alerts), tooltip: "Clear All Alerts", showText: this.props.viewType === 'ToolPanel' }, 'Clear Alerts')),
41
+ React.createElement(AdaptablePopover, { className: `ab-${elementType}__Alert__info`, headerText: "Alerts Details", bodyText: [alertsPanel], MessageType: 'Info', useButton: true, showEvent: 'focus', hideEvent: "blur", popoverMinWidth: 400 })))));
38
42
  }
39
43
  }
40
44
  function mapStateToProps(state, ownProps) {
@@ -2,4 +2,5 @@ import { AdaptableAlert } from '../../../../types';
2
2
  export declare const getAlertButtonStyle: (alerts: AdaptableAlert[]) => {
3
3
  color: string;
4
4
  background: string;
5
+ cssClasses: string;
5
6
  };
@@ -4,8 +4,16 @@ export const getAlertButtonStyle = (alerts) => {
4
4
  const messageTypeColor = UIHelper.getColorByMessageType(messageType);
5
5
  const buttonBackground = UIHelper.getButtonColourForAdaptableAlerts(alerts, messageTypeColor);
6
6
  const buttonTextColor = UIHelper.getButtonTextColourForArrayandMessageType(alerts, messageType);
7
+ let cssClasses = '';
8
+ if (alerts?.length) {
9
+ const cssMessageType = UIHelper.getCSSColorByMessageType(messageType);
10
+ cssClasses = cssMessageType
11
+ ? `twa:bg-${cssMessageType} twa:text-text-on-${cssMessageType}`
12
+ : '';
13
+ }
7
14
  return {
8
15
  color: buttonTextColor,
9
16
  background: buttonBackground,
17
+ cssClasses,
10
18
  };
11
19
  };
@@ -13,10 +13,11 @@ export declare const getDefaultAlertDefinition: (alertDefinition: AlertDefinitio
13
13
  MessageText?: string;
14
14
  AlertProperties?: import("../../../types").AlertProperties;
15
15
  AlertForm?: string | import("../../../types").AlertButtonForm;
16
- IsSuspended?: boolean;
16
+ Name: string;
17
17
  Source?: "InitialState" | "User";
18
18
  AdaptableVersion?: import("../../../types").AdaptableVersion;
19
19
  IsReadOnly?: boolean;
20
20
  Tags?: import("../../../types").AdaptableObjectTag[];
21
21
  Metadata?: any;
22
+ IsSuspended?: boolean;
22
23
  };
@@ -1,9 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { AlertType } from '../Utilities/getAlertType';
3
+ import { AdaptableApi, AlertDefinition } from '../../../types';
4
+ export declare const isSettingsValid: (data: AlertDefinition, api: AdaptableApi) => true | "Name is required" | "An Alert already exists with that name";
3
5
  export declare const renderAlertTypeSummary: (alertType: AlertType) => React.JSX.Element;
4
- type AlertBehaviourWizardSectionProps = {
6
+ type AlertTypeWizardSectionProps = {
5
7
  onAlertTypeChange: (alertType: AlertType) => void;
6
8
  alertType: AlertType | null;
9
+ onChange: (data: AlertDefinition) => void;
7
10
  };
8
- export declare const AlertTypeWizardSection: (props: AlertBehaviourWizardSectionProps) => React.JSX.Element;
11
+ export declare const AlertTypeWizardSection: (props: AlertTypeWizardSectionProps) => React.JSX.Element;
9
12
  export {};