@adaptabletools/adaptable 22.0.0-canary.6 → 22.0.0-canary.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.css +0 -3
- package/index.css.map +1 -1
- package/package.json +1 -1
- package/src/AdaptableState/AlertState.d.ts +1 -2
- package/src/AdaptableState/Common/AdaptableObject.d.ts +4 -0
- package/src/AdaptableState/Common/BaseContext.d.ts +2 -0
- package/src/AdaptableState/Common/NamedObject.d.ts +10 -0
- package/src/AdaptableState/Common/NamedObject.js +1 -0
- package/src/AdaptableState/Common/RowSummary.d.ts +1 -1
- package/src/AdaptableState/Common/Schedule.d.ts +2 -2
- package/src/AdaptableState/Common/SuspendableObject.d.ts +10 -0
- package/src/AdaptableState/Common/SuspendableObject.js +1 -0
- package/src/AdaptableState/CustomSortState.d.ts +1 -1
- package/src/AdaptableState/FormatColumnState.d.ts +1 -1
- package/src/AdaptableState/LayoutState.d.ts +1 -1
- package/src/AdaptableState/PlusMinusState.d.ts +1 -1
- package/src/AdaptableState/ShortcutState.d.ts +1 -1
- package/src/AdaptableState/StyledColumnState.d.ts +1 -1
- package/src/Api/AlertApi.d.ts +6 -0
- package/src/Api/CustomSortApi.d.ts +6 -0
- package/src/Api/FlashingCellApi.d.ts +6 -0
- package/src/Api/FormatColumnApi.d.ts +10 -4
- package/src/Api/Implementation/AlertApiImpl.d.ts +1 -0
- package/src/Api/Implementation/AlertApiImpl.js +3 -0
- package/src/Api/Implementation/ChartingApiImpl.js +2 -2
- package/src/Api/Implementation/CustomSortApiImpl.d.ts +1 -0
- package/src/Api/Implementation/CustomSortApiImpl.js +3 -0
- package/src/Api/Implementation/FlashingCellApiImpl.d.ts +1 -0
- package/src/Api/Implementation/FlashingCellApiImpl.js +3 -0
- package/src/Api/Implementation/FormatColumnApiImpl.d.ts +6 -5
- package/src/Api/Implementation/FormatColumnApiImpl.js +6 -5
- package/src/Api/Implementation/LayoutApiImpl.js +1 -1
- package/src/Api/Implementation/NamedQueryApiImpl.js +2 -2
- package/src/Api/Implementation/PlusMinusApiImpl.d.ts +1 -0
- package/src/Api/Implementation/PlusMinusApiImpl.js +3 -0
- package/src/Api/Implementation/ScheduleApiImpl.d.ts +1 -0
- package/src/Api/Implementation/ScheduleApiImpl.js +3 -0
- package/src/Api/Implementation/ShortcutApiImpl.d.ts +1 -0
- package/src/Api/Implementation/ShortcutApiImpl.js +3 -0
- package/src/Api/Implementation/SystemStatusApiImpl.js +4 -4
- package/src/Api/Internal/CalculatedColumnInternalApi.js +2 -2
- package/src/Api/Internal/FreeTextColumnInternalApi.js +2 -2
- package/src/Api/Internal/LayoutInternalApi.js +1 -1
- package/src/Api/Internal/NamedQueryInternalApi.js +4 -4
- package/src/Api/PlusMinusApi.d.ts +6 -0
- package/src/Api/ScheduleApi.d.ts +6 -0
- package/src/Api/ShortcutApi.d.ts +6 -0
- package/src/Redux/ActionsReducers/FormatColumnRedux.d.ts +8 -0
- package/src/Redux/ActionsReducers/FormatColumnRedux.js +15 -0
- package/src/Redux/Store/AdaptableStore.js +18 -16
- package/src/Strategy/BulkUpdateModule.js +8 -8
- package/src/Strategy/PlusMinusModule.js +1 -1
- package/src/Strategy/QuickSearchModule.js +1 -1
- package/src/Strategy/SettingsPanelModule.js +11 -7
- package/src/Strategy/SmartEditModule.js +10 -10
- package/src/Utilities/Services/DataService.js +1 -1
- package/src/Utilities/Services/Fdc3Service.js +4 -4
- package/src/Utilities/Services/ModuleService.js +1 -3
- package/src/Utilities/Services/ThemeService.js +2 -6
- package/src/Utilities/Services/ValidationService.js +1 -1
- package/src/Utilities/logDeprecation.js +3 -4
- package/src/View/Alert/Wizard/isValidAlertRules.js +1 -1
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnDefinitionWizardSection.js +2 -2
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnExpressionWizardSection.js +2 -2
- package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.js +1 -1
- package/src/View/Charting/ChartingWizard/AgChargingWizard/SettingsSection.js +2 -2
- package/src/View/Charting/ChartingWizard/ExternalChartingWizard/SettingsSection.js +2 -2
- package/src/View/Components/CellPopup/index.js +1 -1
- package/src/View/Components/EntityRulesEditor/Utilities.js +5 -5
- package/src/View/Components/NewScopeComponent.js +3 -3
- package/src/View/Components/Popups/AdaptablePopupConfirmation.js +1 -1
- package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +3 -3
- package/src/View/CustomSort/Wizard/CustomSortValuesWizardSection.js +1 -1
- package/src/View/FlashingCell/Wizard/isValidFlashingCellRules.js +1 -1
- package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.d.ts +1 -1
- package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.js +3 -3
- package/src/View/Layout/LayoutViewPanel.js +1 -1
- package/src/View/Layout/Wizard/sections/AggregationsSection.js +1 -1
- package/src/View/Layout/Wizard/sections/FilterSection.js +1 -1
- package/src/View/Layout/Wizard/sections/GridFilterSection.js +1 -1
- package/src/View/Layout/Wizard/sections/PivotAggregationsSection.js +3 -3
- package/src/View/Layout/Wizard/sections/RowSummarySection.js +1 -1
- package/src/View/NamedQuery/Wizard/NamedQueryExpressionWizardSection.js +2 -2
- package/src/View/PlusMinus/Wizard/PlusMinusSettingsWizardSection.js +5 -5
- package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.d.ts +1 -1
- package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.js +11 -11
- package/src/View/StateManagement/handleExportState.js +1 -1
- package/src/View/StyledColumn/Wizard/StyledColumnWizardColumnSection.js +1 -1
- package/src/agGrid/AdaptableAgGrid.js +38 -51
- package/src/agGrid/AgGridAdapter.js +8 -8
- package/src/agGrid/AgGridColumnAdapter.js +1 -1
- package/src/agGrid/AgGridExportAdapter.js +5 -5
- package/src/agGrid/AgGridThemeAdapter.js +2 -2
- package/src/components/OverlayTrigger/index.js +1 -1
- package/src/env.js +2 -2
- package/src/migration/AdaptableUpgradeHelper.js +2 -2
- package/src/migration/VersionUpgrade17.js +4 -4
- package/src/migration/VersionUpgrade20.js +4 -4
- package/tsconfig.esm.tsbuildinfo +1 -1
|
@@ -122,8 +122,8 @@ export class ChartingApiImpl extends ApiBase {
|
|
|
122
122
|
else {
|
|
123
123
|
const alert = {
|
|
124
124
|
alertType: 'generic',
|
|
125
|
-
header: 'Save
|
|
126
|
-
message: '
|
|
125
|
+
header: 'Save Chart',
|
|
126
|
+
message: 'Would you like to save this chart?',
|
|
127
127
|
alertDefinition: {
|
|
128
128
|
...ObjectFactory.CreateEmptyAlertDefinition(),
|
|
129
129
|
MessageType: 'Info',
|
|
@@ -11,6 +11,7 @@ export declare class CustomSortApiImpl extends ApiBase implements CustomSortApi
|
|
|
11
11
|
getCustomSortState(): CustomSortState;
|
|
12
12
|
getCustomSorts(config?: LayoutExtendedConfig): CustomSort[];
|
|
13
13
|
getCustomSortById(id: CustomSort['Uuid'], config?: LayoutExtendedConfig): CustomSort;
|
|
14
|
+
getCustomSortByName(name: string): CustomSort | undefined;
|
|
14
15
|
getLiveCustomSorts(): CustomSort[];
|
|
15
16
|
getLiveCustomSortComparers(): ColumnValuesComparer[];
|
|
16
17
|
getActiveCustomSorts(config?: LayoutExtendedConfig): CustomSort[];
|
|
@@ -17,6 +17,9 @@ export class CustomSortApiImpl extends ApiBase {
|
|
|
17
17
|
getCustomSortById(id, config) {
|
|
18
18
|
return this.getCustomSorts(config).find((customSort) => customSort.Uuid === id);
|
|
19
19
|
}
|
|
20
|
+
getCustomSortByName(name) {
|
|
21
|
+
return this.getCustomSorts().find((customSort) => customSort.Name === name);
|
|
22
|
+
}
|
|
20
23
|
getLiveCustomSorts() {
|
|
21
24
|
let returnVals = [];
|
|
22
25
|
const sortedColIds = this.getGridApi()
|
|
@@ -13,6 +13,7 @@ export declare class FlashingCellApiImpl extends ApiBase implements FlashingCell
|
|
|
13
13
|
getFlashingCellState(): FlashingCellState;
|
|
14
14
|
getFlashingCellDefinitions(config?: LayoutExtendedConfig): FlashingCellDefinition[];
|
|
15
15
|
getFlashingCellDefinitionById(id: FlashingCellDefinition['Uuid'], config?: LayoutExtendedConfig): FlashingCellDefinition;
|
|
16
|
+
getFlashingCellDefinitionByName(name: string): FlashingCellDefinition | undefined;
|
|
16
17
|
getActiveFlashingCellDefinitions(config?: LayoutExtendedConfig): FlashingCellDefinition[];
|
|
17
18
|
getSuspendedFlashingCellDefinitions(config?: LayoutExtendedConfig): FlashingCellDefinition[];
|
|
18
19
|
getFlashingCellFlashTarget(flashingCellDefinition: FlashingCellDefinition): FlashingCellDefinition['FlashTarget'];
|
|
@@ -19,6 +19,9 @@ export class FlashingCellApiImpl extends ApiBase {
|
|
|
19
19
|
getFlashingCellDefinitionById(id, config) {
|
|
20
20
|
return this.getFlashingCellDefinitions(config)?.find((fc) => fc?.Uuid === id);
|
|
21
21
|
}
|
|
22
|
+
getFlashingCellDefinitionByName(name) {
|
|
23
|
+
return this.getFlashingCellDefinitions().find((fc) => fc.Name === name);
|
|
24
|
+
}
|
|
22
25
|
getActiveFlashingCellDefinitions(config) {
|
|
23
26
|
return this.getFlashingCellDefinitions(config).filter((fc) => !fc.IsSuspended);
|
|
24
27
|
}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
+
import { AdaptableObjectLookupCriteria, FormatColumnConfig } from '../../../types';
|
|
2
|
+
import { IAdaptable } from '../../AdaptableInterfaces/IAdaptable';
|
|
3
|
+
import { AdaptableColumn } from '../../AdaptableState/Common/AdaptableColumn';
|
|
1
4
|
import { AdaptableStyle } from '../../AdaptableState/Common/AdaptableStyle';
|
|
2
|
-
import { ApiBase } from './ApiBase';
|
|
3
|
-
import { FormatColumnApi } from '../FormatColumnApi';
|
|
4
5
|
import { FormatColumn, FormatColumnState } from '../../AdaptableState/FormatColumnState';
|
|
5
|
-
import { AdaptableColumn } from '../../AdaptableState/Common/AdaptableColumn';
|
|
6
6
|
import { AdaptableFormat } from '../../types';
|
|
7
|
-
import {
|
|
7
|
+
import { FormatColumnApi } from '../FormatColumnApi';
|
|
8
8
|
import { FormatColumnInternalApi } from '../Internal/FormatColumnInternalApi';
|
|
9
|
-
import {
|
|
9
|
+
import { ApiBase } from './ApiBase';
|
|
10
10
|
export declare class FormatColumnApiImpl extends ApiBase implements FormatColumnApi {
|
|
11
11
|
internalApi: FormatColumnInternalApi;
|
|
12
12
|
constructor(_adaptable: IAdaptable);
|
|
13
13
|
getFormatColumnState(): FormatColumnState;
|
|
14
14
|
getFormatColumns(config?: FormatColumnConfig): FormatColumn[];
|
|
15
15
|
getFormatColumnByUuId(id: FormatColumn['Uuid'], config?: FormatColumnConfig): FormatColumn;
|
|
16
|
+
getFormatColumnByName(name: string): FormatColumn | undefined;
|
|
16
17
|
getActiveFormatColumns(config?: FormatColumnConfig): FormatColumn[];
|
|
17
18
|
getDisplayFormatForColumn(column: AdaptableColumn, config?: FormatColumnConfig): AdaptableFormat | undefined;
|
|
18
19
|
getSuspendedFormatColumns(config?: FormatColumnConfig): FormatColumn[];
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as FormatColumnRedux from '../../Redux/ActionsReducers/FormatColumnRedux';
|
|
2
|
-
import { ApiBase } from './ApiBase';
|
|
3
2
|
import * as ModuleConstants from '../../Utilities/Constants/ModuleConstants';
|
|
4
|
-
import { FormatColumnInternalApi } from '../Internal/FormatColumnInternalApi';
|
|
5
3
|
import ArrayExtensions from '../../Utilities/Extensions/ArrayExtensions';
|
|
4
|
+
import { FormatColumnInternalApi } from '../Internal/FormatColumnInternalApi';
|
|
5
|
+
import { ApiBase } from './ApiBase';
|
|
6
6
|
export class FormatColumnApiImpl extends ApiBase {
|
|
7
7
|
internalApi;
|
|
8
8
|
constructor(_adaptable) {
|
|
@@ -18,6 +18,9 @@ export class FormatColumnApiImpl extends ApiBase {
|
|
|
18
18
|
getFormatColumnByUuId(id, config) {
|
|
19
19
|
return this.getFormatColumns(config).find((formatColumn) => formatColumn.Uuid === id);
|
|
20
20
|
}
|
|
21
|
+
getFormatColumnByName(name) {
|
|
22
|
+
return this.getFormatColumns().find((formatColumn) => formatColumn.Name === name);
|
|
23
|
+
}
|
|
21
24
|
getActiveFormatColumns(config) {
|
|
22
25
|
return this.getFormatColumns(config).filter((formatColumn) => !formatColumn.IsSuspended);
|
|
23
26
|
}
|
|
@@ -38,9 +41,7 @@ export class FormatColumnApiImpl extends ApiBase {
|
|
|
38
41
|
return this.getFormatColumnByUuId(formatColumn.Uuid);
|
|
39
42
|
}
|
|
40
43
|
addFormatColumns(formatColumns) {
|
|
41
|
-
|
|
42
|
-
this.addFormatColumn(fc);
|
|
43
|
-
});
|
|
44
|
+
this.dispatchAction(FormatColumnRedux.FormatColumnsAdd(formatColumns));
|
|
44
45
|
return formatColumns?.map((formatColumn) => this.getFormatColumnByUuId(formatColumn.Uuid));
|
|
45
46
|
}
|
|
46
47
|
editFormatColumn(formatColumn) {
|
|
@@ -403,7 +403,7 @@ export class LayoutApiImpl extends ApiBase {
|
|
|
403
403
|
const currentLayout = this.getCurrentLayout();
|
|
404
404
|
const customHeader = currentLayout.ColumnHeaders?.[column.columnId] ?? column.friendlyName;
|
|
405
405
|
this.dispatchAction(PopupShowPrompt({
|
|
406
|
-
Header: `Change
|
|
406
|
+
Header: `Change Caption for "${column.friendlyName}"`,
|
|
407
407
|
Msg: '',
|
|
408
408
|
DefaultValue: customHeader,
|
|
409
409
|
ConfirmActionCreator: (inputText) => {
|
|
@@ -26,14 +26,14 @@ export class NamedQueryApiImpl extends ApiBase {
|
|
|
26
26
|
}
|
|
27
27
|
isValidNamedQuery(namedQuery) {
|
|
28
28
|
if (IsNullOrEmptyOrWhiteSpace(namedQuery?.Name)) {
|
|
29
|
-
return { valid: false, message: '
|
|
29
|
+
return { valid: false, message: 'A name is required for the Named Query.' };
|
|
30
30
|
}
|
|
31
31
|
// check that there is no other existing named query with the same name
|
|
32
32
|
const duplicate = this.getNamedQueries().find((q) => q.Name === namedQuery.Name && q.Uuid !== namedQuery.Uuid);
|
|
33
33
|
if (duplicate) {
|
|
34
34
|
return {
|
|
35
35
|
valid: false,
|
|
36
|
-
message: 'A Named Query
|
|
36
|
+
message: 'A Named Query with this name already exists.',
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
return { valid: true, message: '' };
|
|
@@ -7,6 +7,7 @@ export declare class PlusMinusApiImpl extends ApiBase implements PlusMinusApi {
|
|
|
7
7
|
getPlusMinusState(): PlusMinusState;
|
|
8
8
|
getAllPlusMinus(config?: LayoutExtendedConfig): PlusMinusNudge[];
|
|
9
9
|
getPlusMinusById(id: PlusMinusNudge['Uuid'], config?: LayoutExtendedConfig): PlusMinusNudge;
|
|
10
|
+
getPlusMinusNudgeByName(name: string): PlusMinusNudge | undefined;
|
|
10
11
|
getAllActivePlusMinus(config?: LayoutExtendedConfig): PlusMinusNudge[];
|
|
11
12
|
getAllSuspendedPlusMinus(config?: LayoutExtendedConfig): PlusMinusNudge[];
|
|
12
13
|
runPlusMinusNudge(plusMinusNudge: PlusMinusNudge, cellsToUpdate: GridCell[], direction: 'up' | 'down'): void;
|
|
@@ -12,6 +12,9 @@ export class PlusMinusApiImpl extends ApiBase {
|
|
|
12
12
|
getPlusMinusById(id, config) {
|
|
13
13
|
return this.getAllPlusMinus(config).find((plusMinus) => plusMinus?.Uuid === id);
|
|
14
14
|
}
|
|
15
|
+
getPlusMinusNudgeByName(name) {
|
|
16
|
+
return this.getAllPlusMinus().find((plusMinus) => plusMinus.Name === name);
|
|
17
|
+
}
|
|
15
18
|
getAllActivePlusMinus(config) {
|
|
16
19
|
return this.getAllPlusMinus(config).filter((plusMinusNudge) => !plusMinusNudge.IsSuspended);
|
|
17
20
|
}
|
|
@@ -11,6 +11,7 @@ export declare class ScheduleApiImpl extends ApiBase implements ScheduleApi {
|
|
|
11
11
|
constructor(_adaptable: IAdaptable);
|
|
12
12
|
getScheduleState(): ScheduleState;
|
|
13
13
|
getSchedules(config?: LayoutExtendedConfig): BaseSchedule[];
|
|
14
|
+
getScheduleByName(name: string): BaseSchedule | undefined;
|
|
14
15
|
getReminderSchedules(config?: LayoutExtendedConfig): ReminderSchedule[];
|
|
15
16
|
getScheduleById(id: BaseSchedule['Uuid'], config?: LayoutExtendedConfig): BaseSchedule;
|
|
16
17
|
getActiveReminderSchedules(config?: LayoutExtendedConfig): ReminderSchedule[];
|
|
@@ -16,6 +16,9 @@ export class ScheduleApiImpl extends ApiBase {
|
|
|
16
16
|
allSchedules.push(...this.getOpenFinSchedules(config));
|
|
17
17
|
return allSchedules;
|
|
18
18
|
}
|
|
19
|
+
getScheduleByName(name) {
|
|
20
|
+
return this.getSchedules().find((schedule) => schedule.Name === name);
|
|
21
|
+
}
|
|
19
22
|
getReminderSchedules(config) {
|
|
20
23
|
return (this.handleLayoutExtensionObjects(this.getScheduleState().Reminders, 'Schedule', config) ?? []);
|
|
21
24
|
}
|
|
@@ -6,6 +6,7 @@ export declare class ShortcutApiImpl extends ApiBase implements ShortcutApi {
|
|
|
6
6
|
getShortcutState(): ShortcutState;
|
|
7
7
|
getShortcuts(config?: LayoutExtendedConfig): Shortcut[];
|
|
8
8
|
getShortcutById(id: Shortcut['Uuid'], config?: LayoutExtendedConfig): Shortcut;
|
|
9
|
+
getShortcutByName(name: string): Shortcut | undefined;
|
|
9
10
|
getActiveShortcuts(config?: LayoutExtendedConfig): Shortcut[];
|
|
10
11
|
getSuspendedShortcuts(config?: LayoutExtendedConfig): Shortcut[];
|
|
11
12
|
addShortcut(shortcut: Shortcut): Shortcut;
|
|
@@ -11,6 +11,9 @@ export class ShortcutApiImpl extends ApiBase {
|
|
|
11
11
|
getShortcutById(id, config) {
|
|
12
12
|
return this.getShortcuts(config).find((shortcut) => shortcut?.Uuid === id);
|
|
13
13
|
}
|
|
14
|
+
getShortcutByName(name) {
|
|
15
|
+
return this.getShortcuts().find((shortcut) => shortcut.Name === name);
|
|
16
|
+
}
|
|
14
17
|
getActiveShortcuts(config) {
|
|
15
18
|
return this.getShortcuts(config).filter((shortcut) => !shortcut.IsSuspended);
|
|
16
19
|
}
|
|
@@ -27,16 +27,16 @@ export class SystemStatusApiImpl extends ApiBase {
|
|
|
27
27
|
}
|
|
28
28
|
switch (messageType) {
|
|
29
29
|
case 'Success':
|
|
30
|
-
alertApi.showAlertSuccess('System Status
|
|
30
|
+
alertApi.showAlertSuccess('System Status', fullMessage);
|
|
31
31
|
return;
|
|
32
32
|
case 'Info':
|
|
33
|
-
alertApi.showAlertInfo('System Status
|
|
33
|
+
alertApi.showAlertInfo('System Status', fullMessage);
|
|
34
34
|
return;
|
|
35
35
|
case 'Warning':
|
|
36
|
-
alertApi.showAlertWarning('System Status
|
|
36
|
+
alertApi.showAlertWarning('System Status', fullMessage);
|
|
37
37
|
return;
|
|
38
38
|
case 'Error':
|
|
39
|
-
alertApi.showAlertError('System Status
|
|
39
|
+
alertApi.showAlertError('System Status', fullMessage);
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -150,8 +150,8 @@ export class CalculatedColumnInternalApi extends ApiBase {
|
|
|
150
150
|
if (calculatedColumnReferences.length) {
|
|
151
151
|
const alert = {
|
|
152
152
|
alertType: 'generic',
|
|
153
|
-
header: '
|
|
154
|
-
message: `It is still referenced
|
|
153
|
+
header: 'Calculated Column',
|
|
154
|
+
message: `This Calculated Column cannot be deleted. It is still referenced by: ${calculatedColumnReferences.join(', ')}.`,
|
|
155
155
|
alertDefinition: CreateInternalAlertDefinitionForMessages('Error'),
|
|
156
156
|
};
|
|
157
157
|
this.getAlertApi().displayAdaptableAlertNotification(alert);
|
|
@@ -95,8 +95,8 @@ export class FreeTextColumnInternalApi extends ApiBase {
|
|
|
95
95
|
if (freeTextColumnReferences.length) {
|
|
96
96
|
const alert = {
|
|
97
97
|
alertType: 'generic',
|
|
98
|
-
header: '
|
|
99
|
-
message: `It is still referenced
|
|
98
|
+
header: 'Free Text Column',
|
|
99
|
+
message: `This Free Text Column cannot be deleted. It is still referenced by: ${freeTextColumnReferences.join(', ')}.`,
|
|
100
100
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
101
101
|
};
|
|
102
102
|
this.getAlertApi().displayAdaptableAlertNotification(alert);
|
|
@@ -92,7 +92,7 @@ export class LayoutInternalApi extends ApiBase {
|
|
|
92
92
|
}
|
|
93
93
|
setupRowSummaries() {
|
|
94
94
|
if (!this._adaptable.agGridModulesAdapter.isAgGridModuleRegistered('PinnedRowModule')) {
|
|
95
|
-
this.getAdaptableApi().consoleError(
|
|
95
|
+
this.getAdaptableApi().consoleError('Layout Row Summaries require the AG Grid "PinnedRowModule". Please register this module.');
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
98
|
const rowSummaries = this.getAdaptableState().Internal?.RowSummary?.rowSummaries ?? [];
|
|
@@ -40,8 +40,8 @@ export class NamedQueryInternalApi extends ApiBase {
|
|
|
40
40
|
if (namedQueryReferences.length) {
|
|
41
41
|
const alert = {
|
|
42
42
|
alertType: 'generic',
|
|
43
|
-
header: 'Named Query
|
|
44
|
-
message: `It is still referenced
|
|
43
|
+
header: 'Named Query',
|
|
44
|
+
message: `This Named Query cannot be deleted. It is still referenced by: ${namedQueryReferences.join(', ')}.`,
|
|
45
45
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
46
46
|
};
|
|
47
47
|
this.getAlertApi().displayAdaptableAlertNotification(alert);
|
|
@@ -56,8 +56,8 @@ export class NamedQueryInternalApi extends ApiBase {
|
|
|
56
56
|
if (namedQueryReferences.length) {
|
|
57
57
|
const alert = {
|
|
58
58
|
alertType: 'generic',
|
|
59
|
-
header: 'Named Query
|
|
60
|
-
message: `It is currently referenced
|
|
59
|
+
header: 'Named Query',
|
|
60
|
+
message: `This Named Query cannot be renamed. It is currently referenced by: ${namedQueryReferences.join(', ')}.`,
|
|
61
61
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
62
62
|
};
|
|
63
63
|
this.getAlertApi().displayAdaptableAlertNotification(alert);
|
|
@@ -20,6 +20,12 @@ export interface PlusMinusApi {
|
|
|
20
20
|
* @returns plus minus rule
|
|
21
21
|
*/
|
|
22
22
|
getPlusMinusById(id: PlusMinusNudge['Uuid'], config?: LayoutExtendedConfig): PlusMinusNudge;
|
|
23
|
+
/**
|
|
24
|
+
* Retrieves a Plus Minus Nudge by its Name
|
|
25
|
+
* @param name Name of the Plus Minus Nudge
|
|
26
|
+
* @returns Plus Minus Nudge or undefined if not found
|
|
27
|
+
*/
|
|
28
|
+
getPlusMinusNudgeByName(name: string): PlusMinusNudge | undefined;
|
|
23
29
|
/**
|
|
24
30
|
* Retrieves all active (not-suspended) Plus Minus Rules in Adaptable State with those with expressions first
|
|
25
31
|
* @returns plus minus rules
|
package/src/Api/ScheduleApi.d.ts
CHANGED
|
@@ -23,6 +23,12 @@ export interface ScheduleApi {
|
|
|
23
23
|
* @returns schedule
|
|
24
24
|
*/
|
|
25
25
|
getScheduleById(id: BaseSchedule['Uuid'], config?: LayoutExtendedConfig): BaseSchedule;
|
|
26
|
+
/**
|
|
27
|
+
* Retrieves a Schedule by its Name
|
|
28
|
+
* @param name Name of the Schedule
|
|
29
|
+
* @returns Schedule or undefined if not found
|
|
30
|
+
*/
|
|
31
|
+
getScheduleByName(name: string): BaseSchedule | undefined;
|
|
26
32
|
/**
|
|
27
33
|
* Retrieves all Reminder-based Schedules from Schedule State
|
|
28
34
|
* @returns reminder schedules
|
package/src/Api/ShortcutApi.d.ts
CHANGED
|
@@ -19,6 +19,12 @@ export interface ShortcutApi {
|
|
|
19
19
|
* @returns shortcut
|
|
20
20
|
*/
|
|
21
21
|
getShortcutById(id: Shortcut['Uuid'], config?: LayoutExtendedConfig): Shortcut;
|
|
22
|
+
/**
|
|
23
|
+
* Retrieves a Shortcut by its Name
|
|
24
|
+
* @param name Name of the Shortcut
|
|
25
|
+
* @returns Shortcut or undefined if not found
|
|
26
|
+
*/
|
|
27
|
+
getShortcutByName(name: string): Shortcut | undefined;
|
|
22
28
|
/**
|
|
23
29
|
* Gets all active (not-suspended) Shortcuts in Adaptable State
|
|
24
30
|
* @returns shortcuts
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { FormatColumnState, FormatColumn } from '../../AdaptableState/FormatColumnState';
|
|
2
2
|
import * as Redux from 'redux';
|
|
3
|
+
/**
|
|
4
|
+
* @ReduxAction Many Format Columns have been added
|
|
5
|
+
*/
|
|
6
|
+
export declare const FORMAT_COLUMN_ADD_BATCH = "FORMAT_COLUMN_ADD_BATCH";
|
|
3
7
|
/**
|
|
4
8
|
* @ReduxAction A Format Column has been added
|
|
5
9
|
*/
|
|
@@ -44,6 +48,9 @@ export declare const FORMAT_COLUMN_UNSUSPEND = "FORMAT_COLUMN_UNSUSPEND";
|
|
|
44
48
|
* @ReduxAction FormatColumn Module is unsuspended, or activated
|
|
45
49
|
*/
|
|
46
50
|
export declare const FORMAT_COLUMN_UNSUSPEND_ALL = "FORMAT_COLUMN_UNSUSPEND_ALL";
|
|
51
|
+
export interface FormatColumnAddBatchAction extends Redux.Action {
|
|
52
|
+
formatColumns: FormatColumn[];
|
|
53
|
+
}
|
|
47
54
|
export interface FormatColumnAction extends Redux.Action {
|
|
48
55
|
formatColumn: FormatColumn;
|
|
49
56
|
}
|
|
@@ -70,6 +77,7 @@ export interface FormatColumnUnSuspendAllAction extends Redux.Action {
|
|
|
70
77
|
export interface FormatColumnReadyAction extends Redux.Action {
|
|
71
78
|
formatColumnState: FormatColumnState;
|
|
72
79
|
}
|
|
80
|
+
export declare const FormatColumnsAdd: (formatColumns: FormatColumn[]) => FormatColumnAddBatchAction;
|
|
73
81
|
export declare const FormatColumnAdd: (formatColumn: FormatColumn) => FormatColumnAddAction;
|
|
74
82
|
export declare const FormatColumnEdit: (formatColumn: FormatColumn) => FormatColumnEditAction;
|
|
75
83
|
export declare const FormatColumnDelete: (formatColumn: FormatColumn) => FormatColumnDeleteAction;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { EMPTY_ARRAY } from '../../Utilities/Constants/GeneralConstants';
|
|
2
2
|
import AdaptableHelper from '../../Utilities/Helpers/AdaptableHelper';
|
|
3
3
|
import { changeIsSuspendInList, suspendAllInList, unsuspendAllInList } from './utils';
|
|
4
|
+
/**
|
|
5
|
+
* @ReduxAction Many Format Columns have been added
|
|
6
|
+
*/
|
|
7
|
+
export const FORMAT_COLUMN_ADD_BATCH = 'FORMAT_COLUMN_ADD_BATCH';
|
|
4
8
|
/**
|
|
5
9
|
* @ReduxAction A Format Column has been added
|
|
6
10
|
*/
|
|
@@ -45,6 +49,10 @@ export const FORMAT_COLUMN_UNSUSPEND = 'FORMAT_COLUMN_UNSUSPEND';
|
|
|
45
49
|
* @ReduxAction FormatColumn Module is unsuspended, or activated
|
|
46
50
|
*/
|
|
47
51
|
export const FORMAT_COLUMN_UNSUSPEND_ALL = 'FORMAT_COLUMN_UNSUSPEND_ALL';
|
|
52
|
+
export const FormatColumnsAdd = (formatColumns) => ({
|
|
53
|
+
type: FORMAT_COLUMN_ADD_BATCH,
|
|
54
|
+
formatColumns,
|
|
55
|
+
});
|
|
48
56
|
export const FormatColumnAdd = (formatColumn) => ({
|
|
49
57
|
type: FORMAT_COLUMN_ADD,
|
|
50
58
|
formatColumn,
|
|
@@ -92,6 +100,13 @@ const initialState = {
|
|
|
92
100
|
export const FormatColumnReducer = (state = initialState, action) => {
|
|
93
101
|
let formatColumns;
|
|
94
102
|
switch (action.type) {
|
|
103
|
+
case FORMAT_COLUMN_ADD_BATCH: {
|
|
104
|
+
const actionFormatColumns = action.formatColumns;
|
|
105
|
+
actionFormatColumns.forEach(AdaptableHelper.addAdaptableObjectPrimitives);
|
|
106
|
+
formatColumns = [].concat(state.FormatColumns);
|
|
107
|
+
formatColumns.push(...actionFormatColumns);
|
|
108
|
+
return { ...state, FormatColumns: formatColumns };
|
|
109
|
+
}
|
|
95
110
|
case FORMAT_COLUMN_ADD: {
|
|
96
111
|
const actionFormatColumn = action.formatColumn;
|
|
97
112
|
AdaptableHelper.addAdaptableObjectPrimitives(actionFormatColumn);
|
|
@@ -254,7 +254,7 @@ export class AdaptableStore {
|
|
|
254
254
|
// END STATE LOAD
|
|
255
255
|
this.loadStorageInProgress = false;
|
|
256
256
|
}, (e) => {
|
|
257
|
-
adaptable.api.consoleError('Failed to load
|
|
257
|
+
adaptable.api.consoleError('Failed to load saved Adaptable state.', e);
|
|
258
258
|
//for now i'm still initializing Adaptable even if loading state has failed....
|
|
259
259
|
//we may revisit that later
|
|
260
260
|
this.TheStore.dispatch(InitState());
|
|
@@ -263,7 +263,7 @@ export class AdaptableStore {
|
|
|
263
263
|
this.TheStore.dispatch(PopupRedux.PopupShowAlert({
|
|
264
264
|
alertType: 'generic',
|
|
265
265
|
header: 'Configuration',
|
|
266
|
-
message: '
|
|
266
|
+
message: 'Failed to load your configuration: ' + e,
|
|
267
267
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
268
268
|
}));
|
|
269
269
|
}));
|
|
@@ -581,6 +581,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
581
581
|
* Action: We set up all columns again
|
|
582
582
|
*/
|
|
583
583
|
case QuickSearchRedux.QUICK_SEARCH_SET_CELL_MATCHING_STYLE:
|
|
584
|
+
case FormatColumnRedux.FORMAT_COLUMN_ADD_BATCH:
|
|
584
585
|
case FormatColumnRedux.FORMAT_COLUMN_ADD:
|
|
585
586
|
case FormatColumnRedux.FORMAT_COLUMN_EDIT:
|
|
586
587
|
case FormatColumnRedux.FORMAT_COLUMN_DELETE:
|
|
@@ -1313,7 +1314,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1313
1314
|
const alert = {
|
|
1314
1315
|
alertType: 'generic',
|
|
1315
1316
|
header: 'Team Sharing',
|
|
1316
|
-
message:
|
|
1317
|
+
message: 'Failed to retrieve shared items: ' + error.message,
|
|
1317
1318
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
1318
1319
|
};
|
|
1319
1320
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1383,7 +1384,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1383
1384
|
const alert = {
|
|
1384
1385
|
alertType: 'generic',
|
|
1385
1386
|
header: 'Team Sharing',
|
|
1386
|
-
message: `
|
|
1387
|
+
message: `Cannot share ${adaptable.ModuleService.getModuleFriendlyName(Module)} — an active share already exists: ${existingActiveSharedEntity.Description}.`,
|
|
1387
1388
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
1388
1389
|
};
|
|
1389
1390
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1407,7 +1408,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1407
1408
|
const alert = {
|
|
1408
1409
|
alertType: 'generic',
|
|
1409
1410
|
header: 'Team Sharing',
|
|
1410
|
-
message: `${adaptable.ModuleService.getModuleFriendlyName(Module)}
|
|
1411
|
+
message: `${adaptable.ModuleService.getModuleFriendlyName(Module)} shared successfully.`,
|
|
1411
1412
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Success'),
|
|
1412
1413
|
};
|
|
1413
1414
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1418,7 +1419,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1418
1419
|
const alert = {
|
|
1419
1420
|
alertType: 'generic',
|
|
1420
1421
|
header: 'Team Sharing',
|
|
1421
|
-
message:
|
|
1422
|
+
message: 'Failed to share item: ' + error.message,
|
|
1422
1423
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
1423
1424
|
};
|
|
1424
1425
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1443,10 +1444,11 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1443
1444
|
if (sharedEntityDependants.length) {
|
|
1444
1445
|
const alert = {
|
|
1445
1446
|
alertType: 'generic',
|
|
1446
|
-
header:
|
|
1447
|
-
message:
|
|
1448
|
-
|
|
1449
|
-
|
|
1447
|
+
header: 'Team Sharing',
|
|
1448
|
+
message: 'Cannot remove this shared item. It is referenced by: ' +
|
|
1449
|
+
sharedEntityDependants
|
|
1450
|
+
.map((sharedEntity) => `${adaptable.ModuleService.getModuleFriendlyName(sharedEntity.Module)} ${sharedEntity.Description}`)
|
|
1451
|
+
.join(', '),
|
|
1450
1452
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Warning'),
|
|
1451
1453
|
};
|
|
1452
1454
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1463,7 +1465,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1463
1465
|
const alert = {
|
|
1464
1466
|
alertType: 'generic',
|
|
1465
1467
|
header: 'Team Sharing',
|
|
1466
|
-
message:
|
|
1468
|
+
message: 'Failed to remove shared item: ' + error.message,
|
|
1467
1469
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
1468
1470
|
};
|
|
1469
1471
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1485,8 +1487,8 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1485
1487
|
!adaptable.api.optionsApi.getTeamSharingOptions().suppressOverrideConfigWarning) {
|
|
1486
1488
|
let confirmation = {
|
|
1487
1489
|
CancelButtonText: 'Cancel Import',
|
|
1488
|
-
Header: '
|
|
1489
|
-
Msg: 'This import will overwrite an existing
|
|
1490
|
+
Header: 'Overwrite Existing Item',
|
|
1491
|
+
Msg: 'This import will overwrite an existing item in your configuration. Do you wish to continue?',
|
|
1490
1492
|
ConfirmButtonText: 'Import',
|
|
1491
1493
|
CancelAction: null,
|
|
1492
1494
|
ConfirmAction: processImportAction,
|
|
@@ -1532,7 +1534,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1532
1534
|
const alert = {
|
|
1533
1535
|
alertType: 'generic',
|
|
1534
1536
|
header: 'Team Sharing',
|
|
1535
|
-
message:
|
|
1537
|
+
message: 'Item imported successfully.',
|
|
1536
1538
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Success'),
|
|
1537
1539
|
};
|
|
1538
1540
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1572,7 +1574,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1572
1574
|
const alert = {
|
|
1573
1575
|
alertType: 'generic',
|
|
1574
1576
|
header: 'Team Sharing',
|
|
1575
|
-
message:
|
|
1577
|
+
message: 'Failed to update shared item: ' + error.message,
|
|
1576
1578
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
1577
1579
|
};
|
|
1578
1580
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -1593,7 +1595,7 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
|
|
|
1593
1595
|
const alert = {
|
|
1594
1596
|
alertType: 'generic',
|
|
1595
1597
|
header: 'Team Sharing',
|
|
1596
|
-
message:
|
|
1598
|
+
message: 'Failed to check for updates: ' + error.message,
|
|
1597
1599
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
1598
1600
|
};
|
|
1599
1601
|
adaptable.api.alertApi.displayAdaptableAlertNotification(alert);
|
|
@@ -39,8 +39,8 @@ export class BulkUpdateModule extends AdaptableModuleBase {
|
|
|
39
39
|
IsValid: false,
|
|
40
40
|
Alert: {
|
|
41
41
|
alertType: 'generic',
|
|
42
|
-
header: 'Bulk Update
|
|
43
|
-
message: '
|
|
42
|
+
header: 'Bulk Update',
|
|
43
|
+
message: 'Editing is not available in Pivot Mode.',
|
|
44
44
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
45
45
|
},
|
|
46
46
|
};
|
|
@@ -50,8 +50,8 @@ export class BulkUpdateModule extends AdaptableModuleBase {
|
|
|
50
50
|
IsValid: false,
|
|
51
51
|
Alert: {
|
|
52
52
|
alertType: 'generic',
|
|
53
|
-
header: 'Bulk Update
|
|
54
|
-
message: 'No cells
|
|
53
|
+
header: 'Bulk Update',
|
|
54
|
+
message: 'No cells selected. Please select one or more cells to continue.',
|
|
55
55
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
56
56
|
},
|
|
57
57
|
};
|
|
@@ -61,8 +61,8 @@ export class BulkUpdateModule extends AdaptableModuleBase {
|
|
|
61
61
|
IsValid: false,
|
|
62
62
|
Alert: {
|
|
63
63
|
alertType: 'generic',
|
|
64
|
-
header: 'Bulk Update
|
|
65
|
-
message: 'Bulk Update
|
|
64
|
+
header: 'Bulk Update',
|
|
65
|
+
message: 'Bulk Update supports editing a single column at a time. Please adjust your selection.',
|
|
66
66
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
67
67
|
},
|
|
68
68
|
};
|
|
@@ -74,8 +74,8 @@ export class BulkUpdateModule extends AdaptableModuleBase {
|
|
|
74
74
|
IsValid: false,
|
|
75
75
|
Alert: {
|
|
76
76
|
alertType: 'generic',
|
|
77
|
-
header: 'Bulk Update
|
|
78
|
-
message: 'Bulk Update is not
|
|
77
|
+
header: 'Bulk Update',
|
|
78
|
+
message: 'Bulk Update is not available for read-only cells. Please adjust your selection.',
|
|
79
79
|
alertDefinition: ObjectFactory.CreateInternalAlertDefinitionForMessages('Error'),
|
|
80
80
|
},
|
|
81
81
|
};
|
|
@@ -186,7 +186,7 @@ export class PlusMinusModule extends AdaptableModuleBase {
|
|
|
186
186
|
failedMessages.push(failedMessage);
|
|
187
187
|
}
|
|
188
188
|
});
|
|
189
|
-
this.api.alertApi.showAlertError('
|
|
189
|
+
this.api.alertApi.showAlertError('Plus/Minus', 'One or more nudge values were rejected by validation rules: ' + failedMessages.toString());
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
getTeamSharingAction() {
|
|
@@ -24,7 +24,7 @@ export class QuickSearchModule extends AdaptableModuleBase {
|
|
|
24
24
|
// Check for AG Grid QuickFilterModule if running Filter After Quick Search
|
|
25
25
|
if (api.optionsApi.getQuickSearchOptions().filterGridAfterQuickSearch) {
|
|
26
26
|
if (!api.internalApi.getAgGridModulesAdapter().isAgGridModuleRegistered('QuickFilterModule')) {
|
|
27
|
-
api.consoleError('
|
|
27
|
+
api.consoleError('Quick Search with filterGridAfterQuickSearch requires the AG Grid "QuickFilterModule". Quick Search will run but grid filters will not be applied.');
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
const isServerSideRowModel = agGridApi.getGridOption('rowModelType') === 'serverSide';
|
|
@@ -7,15 +7,19 @@ export class SettingsPanelModule extends AdaptableModuleBase {
|
|
|
7
7
|
super(ModuleConstants.SettingsPanelModuleId, friendlyName, 'settings', null, 'Manage all Adaptable Settings', api);
|
|
8
8
|
}
|
|
9
9
|
createColumnMenuItems(column) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
if (this.isModuleVisible()) {
|
|
11
|
+
return [
|
|
12
|
+
// To do : get the icon and name from settings in case they have changed?
|
|
13
|
+
this.createMenuItemReduxAction('settings-panel-open', 'Open ' + this.moduleInfo.FriendlyName, this.moduleInfo.Glyph, PopupRedux.PopupShowScreen()),
|
|
14
|
+
];
|
|
15
|
+
}
|
|
14
16
|
}
|
|
15
17
|
createContextMenuItems(menuContext) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
if (this.isModuleVisible()) {
|
|
19
|
+
return [
|
|
20
|
+
this.createMenuItemReduxAction('settings-panel-open', 'Open ' + this.moduleInfo.FriendlyName, this.moduleInfo.Glyph, PopupRedux.PopupShowScreen()),
|
|
21
|
+
];
|
|
22
|
+
}
|
|
19
23
|
}
|
|
20
24
|
createModuleMenuItem(source) {
|
|
21
25
|
if (this.isModuleVisible()) {
|