@talxis/base-controls 1.2605.2-alpha → 1.2606.2
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/dist/components/Grid/cells/cell/Cell.js +2 -6
- package/dist/components/Grid/cells/cell/Cell.js.map +1 -1
- package/dist/components/Grid/column-headers/column-header/ColumnHeader.js +1 -1
- package/dist/components/Grid/column-headers/column-header/ColumnHeader.js.map +1 -1
- package/dist/components/Grid/grid/ag-grid/AgGridModel.js +1 -1
- package/dist/components/Grid/grid/ag-grid/AgGridModel.js.map +1 -1
- package/dist/components/Lookup/components/TargetSelector.js +1 -1
- package/dist/components/Lookup/components/TargetSelector.js.map +1 -1
- package/dist/components/Lookup/hooks/useLookup.d.ts +4 -0
- package/dist/components/Lookup/translations.d.ts +4 -0
- package/dist/components/Lookup/translations.js +4 -0
- package/dist/components/Lookup/translations.js.map +1 -1
- package/dist/components/TaskGrid/TaskGrid.js +2 -2
- package/dist/components/TaskGrid/TaskGrid.js.map +1 -1
- package/dist/components/TaskGrid/TaskGridDatasetControl.d.ts +2 -0
- package/dist/components/TaskGrid/TaskGridDatasetControl.js +42 -28
- package/dist/components/TaskGrid/TaskGridDatasetControl.js.map +1 -1
- package/dist/components/TaskGrid/TaskGridDatasetControlFactory.js +3 -0
- package/dist/components/TaskGrid/TaskGridDatasetControlFactory.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/cell-renderers/lookup-many/LookupManyCellRenderer.js +6 -3
- package/dist/components/TaskGrid/components/grid/cell-renderers/lookup-many/LookupManyCellRenderer.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/PercentComplete.js +2 -4
- package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/PercentComplete.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/styles.d.ts +0 -6
- package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/styles.js +0 -6
- package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/styles.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/grid-customizer/GridCustomizer.js +10 -5
- package/dist/components/TaskGrid/components/grid/grid-customizer/GridCustomizer.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/group-cell/styles.d.ts +3 -0
- package/dist/components/TaskGrid/components/grid/group-cell/styles.js +3 -0
- package/dist/components/TaskGrid/components/grid/group-cell/styles.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/LookupMany.d.ts +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/LookupMany.js +3 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/LookupMany.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/colorful-lookup-many/components/index.d.ts +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/colorful-lookup-many/components/index.js +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/colorful-lookup-many/components/index.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/components/components.d.ts +11 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/components.js +17 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/components.js.map +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/index.d.ts +1 -10
- package/dist/components/TaskGrid/components/grid/lookup-many/components/index.js +1 -14
- package/dist/components/TaskGrid/components/grid/lookup-many/components/index.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/Menu.d.ts +3 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/Menu.js +10 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/Menu.js.map +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/index.d.ts +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/index.js +2 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/index.js.map +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/components/multi-value-container/MultiValueContainer.d.ts +5 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/components/multi-value-container/MultiValueContainer.js +3 -2
- package/dist/components/TaskGrid/components/grid/lookup-many/components/multi-value-container/MultiValueContainer.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/PeopleLookupMany.js +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/PeopleLookupMany.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/components.d.ts +2 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/components.js +15 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/components.js.map +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/index.d.ts +1 -2
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/index.js +1 -12
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/index.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/MultiValueContainer.d.ts +3 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/MultiValueContainer.js +12 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/MultiValueContainer.js.map +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/index.d.ts +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/index.js +2 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/index.js.map +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/styles.d.ts +9 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/styles.js +18 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/styles.js.map +1 -0
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-label/MultiValueLabel.js +1 -1
- package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-label/MultiValueLabel.js.map +1 -1
- package/dist/components/TaskGrid/components/grid/multi-record-selector/components/multi-value-label/MultiValueLabel.d.ts +1 -1
- package/dist/components/TaskGrid/components/grid/multi-record-selector/components/multi-value-label/MultiValueLabel.js +3 -2
- package/dist/components/TaskGrid/components/grid/multi-record-selector/components/multi-value-label/MultiValueLabel.js.map +1 -1
- package/dist/components/TaskGrid/components/header/Header.d.ts +1 -1
- package/dist/components/TaskGrid/components/header/Header.js +58 -44
- package/dist/components/TaskGrid/components/header/Header.js.map +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/DataverseCustomColumnsStrategy.d.ts +12 -6
- package/dist/components/TaskGrid/extensions/dataverse/DataverseCustomColumnsStrategy.js +23 -20
- package/dist/components/TaskGrid/extensions/dataverse/DataverseCustomColumnsStrategy.js.map +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/DataverseGridCustomizerStrategy.d.ts +3 -3
- package/dist/components/TaskGrid/extensions/dataverse/DataverseGridCustomizerStrategy.js +4 -5
- package/dist/components/TaskGrid/extensions/dataverse/DataverseGridCustomizerStrategy.js.map +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/DataverseSavedQueryStrategy.js +15 -15
- package/dist/components/TaskGrid/extensions/dataverse/DataverseSavedQueryStrategy.js.map +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskGridDescriptor.d.ts +27 -25
- package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskGridDescriptor.js +68 -29
- package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskGridDescriptor.js.map +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.d.ts +19 -17
- package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.js +119 -74
- package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.js.map +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/index.js +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/lookup-many/LookupManyHandler.d.ts +18 -2
- package/dist/components/TaskGrid/extensions/dataverse/lookup-many/LookupManyHandler.js +80 -17
- package/dist/components/TaskGrid/extensions/dataverse/lookup-many/LookupManyHandler.js.map +1 -1
- package/dist/components/TaskGrid/extensions/dataverse/lookup-many/cell-renderer/FetchXmlLookupManyCellRenderer.js +10 -4
- package/dist/components/TaskGrid/extensions/dataverse/lookup-many/cell-renderer/FetchXmlLookupManyCellRenderer.js.map +1 -1
- package/dist/components/TaskGrid/interfaces.d.ts +36 -22
- package/dist/components/TaskGrid/providers/custom-columns/CustomColumnsDataProvider.d.ts +7 -1
- package/dist/components/TaskGrid/providers/custom-columns/CustomColumnsDataProvider.js +3 -0
- package/dist/components/TaskGrid/providers/custom-columns/CustomColumnsDataProvider.js.map +1 -1
- package/dist/components/TaskGrid/providers/saved-query/SavedQueryDataProvider.d.ts +1 -1
- package/dist/components/TaskGrid/providers/saved-query/SavedQueryDataProvider.js +9 -26
- package/dist/components/TaskGrid/providers/saved-query/SavedQueryDataProvider.js.map +1 -1
- package/dist/components/TaskGrid/providers/task/TaskDataProvider.d.ts +13 -20
- package/dist/components/TaskGrid/providers/task/TaskDataProvider.js +30 -22
- package/dist/components/TaskGrid/providers/task/TaskDataProvider.js.map +1 -1
- package/dist/components/TaskGrid/providers/task/record-tree/RecordTree.d.ts +8 -0
- package/dist/components/TaskGrid/providers/task/record-tree/RecordTree.js.map +1 -1
- package/dist/index.d.ts +68 -42
- package/dist/utils/dataset/adapters/VirtualDatasetAdapter.js.map +1 -1
- package/package.json +4 -4
- package/dist/components/TaskGrid/extensions/LexoRank.d.ts +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { FetchXmlDataProvider, Operators, DataTypes, Sanitizer } from '@talxis/client-libraries';
|
|
1
|
+
import { FetchXmlDataProvider, Operators, DataTypes, Sanitizer, DatasetConstants } from '@talxis/client-libraries';
|
|
2
2
|
import { LexoRank } from 'lexorank';
|
|
3
3
|
import { Liquid } from 'liquidjs';
|
|
4
|
-
import { LookupManyHandler
|
|
4
|
+
import { LookupManyHandler } from './lookup-many/LookupManyHandler.js';
|
|
5
5
|
|
|
6
6
|
const LIQUID = new Liquid();
|
|
7
7
|
/**
|
|
@@ -15,53 +15,77 @@ const LIQUID = new Liquid();
|
|
|
15
15
|
*/
|
|
16
16
|
class DataverseTaskStrategy {
|
|
17
17
|
/** @param params — see {@link IDataverseTaskStrategyParams} for full documentation of each option. */
|
|
18
|
-
constructor(params) {
|
|
18
|
+
constructor(params, deps) {
|
|
19
19
|
this._lookupManyColumns = [];
|
|
20
|
+
this._customColumns = [];
|
|
20
21
|
this._lookupManyHandlers = {};
|
|
21
22
|
this._fetchXml = params.fetchXml;
|
|
22
|
-
this.
|
|
23
|
+
this._customColumnsDataProvider = deps.customColumnsDataProvider;
|
|
24
|
+
this._projectRecord = params.projectRecord;
|
|
25
|
+
this._projectReference = this._projectRecord?.getNamedReference();
|
|
23
26
|
this._editFormId = params.editFormId;
|
|
24
27
|
this._rootTaskId = params.rootTaskId;
|
|
25
28
|
this._createFormId = params.createFormId;
|
|
26
29
|
this._bulkEditFormId = params.bulkEditFormId;
|
|
27
|
-
this._isInlineCreateEnabled =
|
|
28
|
-
this._isEditingEnabled =
|
|
30
|
+
this._isInlineCreateEnabled = deps.enableInlineCreation;
|
|
31
|
+
this._isEditingEnabled = deps.enableTaskEditing;
|
|
29
32
|
this._isDeletingTasksWithChildrenEnabled = params.isDeletingTasksWithChildrenEnabled ?? false;
|
|
30
33
|
this._isCascadeDeleteEnabled = params.isCascadeDeleteEnabled ?? false;
|
|
31
|
-
this._getFormParameters = params.
|
|
34
|
+
this._getFormParameters = params.form?.onGetFormParameters ?? ((operation, defaultParameters) => defaultParameters);
|
|
35
|
+
this._sourceRecord = params.sourceRecord;
|
|
32
36
|
}
|
|
33
37
|
async onGetRawRecords(ids, select) {
|
|
34
38
|
let records = [];
|
|
35
39
|
const expands = await Promise.all(this._lookupManyColumns.map(async (col) => {
|
|
36
|
-
const referencedEntityNavigationPropertyName = col.
|
|
40
|
+
const referencedEntityNavigationPropertyName = col.metadata.LookupMany.ReferencedEntityNavigationPropertyName;
|
|
41
|
+
const customIntersection = col.metadata.LookupMany.CustomIntersection;
|
|
37
42
|
const handler = this._lookupManyHandlers[col.name] ?? new LookupManyHandler({
|
|
38
43
|
entityName: this._entityName,
|
|
39
|
-
navigationPropertyName: referencedEntityNavigationPropertyName
|
|
44
|
+
navigationPropertyName: referencedEntityNavigationPropertyName,
|
|
45
|
+
customIntersection: customIntersection ? {
|
|
46
|
+
referencingEntityNavigationPropertyName: customIntersection.ReferencingEntityNavigationPropertyName
|
|
47
|
+
} : undefined
|
|
40
48
|
});
|
|
41
49
|
this._lookupManyHandlers[col.name] = handler;
|
|
42
50
|
await handler.init();
|
|
43
|
-
return handler.getExpand();
|
|
51
|
+
return handler.getExpand(col.metadata.LookupMany.Select);
|
|
44
52
|
}));
|
|
45
|
-
|
|
53
|
+
if (this._customColumns.length > 0) {
|
|
54
|
+
const strategy = this._customColumnsDataProvider.getStrategy();
|
|
55
|
+
expands.push(strategy.getExpand());
|
|
56
|
+
}
|
|
57
|
+
const suffixParts = [];
|
|
46
58
|
if (select)
|
|
47
|
-
|
|
59
|
+
suffixParts.push(`$select=${select}`);
|
|
48
60
|
if (expands.length > 0)
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
records = await this._getRawRecordsByIds({ ids,
|
|
52
|
-
if (this._lookupManyColumns.length > 0) {
|
|
53
|
-
|
|
61
|
+
suffixParts.push(`$expand=${expands.join(',')}`);
|
|
62
|
+
const querySuffix = suffixParts.length > 0 ? `&${suffixParts.join('&')}` : '';
|
|
63
|
+
records = await this._getRawRecordsByIds({ ids, querySuffix });
|
|
64
|
+
if (this._lookupManyColumns.length > 0 || this._customColumns.length > 0) {
|
|
65
|
+
for (const record of records) {
|
|
66
|
+
await this._harmonizeLookupManyData(record);
|
|
67
|
+
await this._harmonizenizeCustomColumnsData(record);
|
|
68
|
+
}
|
|
54
69
|
}
|
|
55
70
|
return records;
|
|
56
71
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
72
|
+
getProjectRecord() {
|
|
73
|
+
return this._projectRecord ?? null;
|
|
74
|
+
}
|
|
75
|
+
getSourceRecord() {
|
|
76
|
+
return this._sourceRecord ?? null;
|
|
77
|
+
}
|
|
78
|
+
async _harmonizenizeCustomColumnsData(record) {
|
|
79
|
+
for (const col of this._customColumns) {
|
|
80
|
+
const strategy = this._customColumnsDataProvider.getStrategy();
|
|
81
|
+
const value = strategy.getValueFromRawRecord(record[this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute], record, col);
|
|
82
|
+
record[col.name] = value;
|
|
83
|
+
}
|
|
60
84
|
}
|
|
61
85
|
async _harmonizeLookupManyData(record) {
|
|
62
86
|
const nextLinkSuffix = '@odata.nextLink';
|
|
63
87
|
for (const lookupManyCol of this._lookupManyColumns) {
|
|
64
|
-
const referencedEntityNavigationPropertyName = lookupManyCol.
|
|
88
|
+
const referencedEntityNavigationPropertyName = lookupManyCol.metadata.LookupMany.ReferencedEntityNavigationPropertyName;
|
|
65
89
|
record[lookupManyCol.name] = await this._convertLookupManyToEntityReference(record[referencedEntityNavigationPropertyName], lookupManyCol);
|
|
66
90
|
delete record[referencedEntityNavigationPropertyName];
|
|
67
91
|
delete record[`${referencedEntityNavigationPropertyName}${nextLinkSuffix}`];
|
|
@@ -69,25 +93,39 @@ class DataverseTaskStrategy {
|
|
|
69
93
|
return record;
|
|
70
94
|
}
|
|
71
95
|
async _convertLookupManyToEntityReference(data, col) {
|
|
72
|
-
const
|
|
96
|
+
const relatedEntityMetadata = await window.Xrm.Utility.getEntityMetadata(col.metadata?.Targets[0]);
|
|
97
|
+
const primaryIdAttribute = relatedEntityMetadata.PrimaryIdAttribute;
|
|
98
|
+
const primaryNameAttribute = relatedEntityMetadata.PrimaryNameAttribute;
|
|
99
|
+
const referencingEntityNavigationPropertyName = col.metadata?.LookupMany?.CustomIntersection?.ReferencingEntityNavigationPropertyName;
|
|
100
|
+
const lookupManyHandler = this._getLookupManyHandlerForColumn(col.name);
|
|
73
101
|
return data.map(record => {
|
|
74
|
-
|
|
102
|
+
let data = record;
|
|
103
|
+
if (referencingEntityNavigationPropertyName) {
|
|
104
|
+
data = record[referencingEntityNavigationPropertyName];
|
|
105
|
+
}
|
|
106
|
+
const result = {
|
|
75
107
|
id: {
|
|
76
|
-
guid:
|
|
108
|
+
guid: data[primaryIdAttribute]
|
|
77
109
|
},
|
|
78
|
-
name:
|
|
79
|
-
etn:
|
|
80
|
-
rawData:
|
|
110
|
+
name: data[primaryNameAttribute],
|
|
111
|
+
etn: relatedEntityMetadata.LogicalName,
|
|
112
|
+
rawData: data
|
|
81
113
|
};
|
|
114
|
+
if (lookupManyHandler.isCustomIntersection()) {
|
|
115
|
+
if (result.rawData) {
|
|
116
|
+
result.rawData.__intersectionId = record[lookupManyHandler.getCustomIntersectionEntityMetadata().PrimaryIdAttribute];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
82
120
|
});
|
|
83
121
|
}
|
|
84
122
|
async _getRawRecordsByIds(params) {
|
|
85
123
|
const maxIdsPerRequest = 800;
|
|
86
124
|
const batches = [];
|
|
87
|
-
const { ids,
|
|
125
|
+
const { ids, querySuffix = '' } = params;
|
|
88
126
|
let currentBatch = [];
|
|
89
127
|
for (const [i, taskId] of Object.entries(ids)) {
|
|
90
|
-
if (currentBatch.length
|
|
128
|
+
if (currentBatch.length < maxIdsPerRequest) {
|
|
91
129
|
currentBatch.push(taskId);
|
|
92
130
|
}
|
|
93
131
|
else {
|
|
@@ -99,6 +137,7 @@ class DataverseTaskStrategy {
|
|
|
99
137
|
}
|
|
100
138
|
}
|
|
101
139
|
const batchedTasks = await Promise.all(batches.map(async (batchIds) => {
|
|
140
|
+
const query = `?$filter=Microsoft.Dynamics.CRM.In(PropertyName='${this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute}', PropertyValues=[${batchIds.map((id) => `'${id}'`).join(',')}])${querySuffix}`;
|
|
102
141
|
const { entities } = await window.Xrm.WebApi.retrieveMultipleRecords(this._entityName, query);
|
|
103
142
|
return entities;
|
|
104
143
|
}));
|
|
@@ -115,16 +154,20 @@ class DataverseTaskStrategy {
|
|
|
115
154
|
await this._fetchXmlDataProvider.refresh();
|
|
116
155
|
this._entityName = this._fetchXmlDataProvider.getEntityName();
|
|
117
156
|
this._entitySetName = this._fetchXmlDataProvider.getMetadata().EntitySetName;
|
|
118
|
-
this._lookupManyColumns = this._getLookupManyColumns();
|
|
119
157
|
const columns = this._fetchXmlDataProvider.getColumns();
|
|
158
|
+
this._customColumns = this._getCustomColumns(columns);
|
|
159
|
+
this._lookupManyColumns = this._getLookupManyColumns(columns);
|
|
120
160
|
this._restoreVirtualColumnMetadata(virtualColumns, columns);
|
|
121
161
|
this._injectLookupManyFilterOperators(columns);
|
|
122
162
|
const metadata = this._fetchXmlDataProvider.getMetadata();
|
|
123
163
|
const fetchXmlProviderData = this._fetchXmlDataProvider.getRawData();
|
|
124
|
-
const
|
|
125
|
-
const
|
|
164
|
+
const primaryIdAttribute = this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute;
|
|
165
|
+
const enrichedData = await this.onGetRawRecords(this._fetchXmlDataProvider.getSortedRecordIds(), primaryIdAttribute);
|
|
166
|
+
const enrichedDataMap = new Map(enrichedData.map(record => [record[primaryIdAttribute], record]));
|
|
167
|
+
const finalRawData = fetchXmlProviderData.map((record) => {
|
|
168
|
+
const id = record[primaryIdAttribute];
|
|
126
169
|
return {
|
|
127
|
-
...
|
|
170
|
+
...enrichedDataMap.get(id),
|
|
128
171
|
...record,
|
|
129
172
|
};
|
|
130
173
|
});
|
|
@@ -137,13 +180,11 @@ class DataverseTaskStrategy {
|
|
|
137
180
|
metadata
|
|
138
181
|
};
|
|
139
182
|
}
|
|
140
|
-
_getLookupManyColumns() {
|
|
141
|
-
return
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
};
|
|
146
|
-
});
|
|
183
|
+
_getLookupManyColumns(columns) {
|
|
184
|
+
return columns.filter(col => col.metadata?.LookupMany);
|
|
185
|
+
}
|
|
186
|
+
_getCustomColumns(columns) {
|
|
187
|
+
return columns.filter(col => this._customColumnsDataProvider?.isCustomColumn(col.name));
|
|
147
188
|
}
|
|
148
189
|
//fetch xml provider will override virtual column metadata by default, so we need to restore it after initialization.
|
|
149
190
|
_restoreVirtualColumnMetadata(virtualColumns, columns) {
|
|
@@ -156,7 +197,7 @@ class DataverseTaskStrategy {
|
|
|
156
197
|
}
|
|
157
198
|
_injectLookupManyFilterOperators(columns) {
|
|
158
199
|
columns.map(col => {
|
|
159
|
-
if (col.
|
|
200
|
+
if (col.metadata?.LookupMany) {
|
|
160
201
|
col.metadata = {
|
|
161
202
|
...col.metadata,
|
|
162
203
|
SupportedFilterConditionOperators: Operators.GetOperatorsForDataType(DataTypes.MultiSelectOptionSet).map(op => op.Value)
|
|
@@ -169,7 +210,14 @@ class DataverseTaskStrategy {
|
|
|
169
210
|
}
|
|
170
211
|
_getFetchXml() {
|
|
171
212
|
return LIQUID.parseAndRenderSync(this._fetchXml, {
|
|
172
|
-
|
|
213
|
+
project: {
|
|
214
|
+
id: this._projectReference?.id.guid,
|
|
215
|
+
...this._projectRecord?.getRawData()
|
|
216
|
+
},
|
|
217
|
+
currentRecord: {
|
|
218
|
+
id: this._sourceRecord?.getNamedReference().id.guid,
|
|
219
|
+
...this._sourceRecord?.getRawData()
|
|
220
|
+
}
|
|
173
221
|
});
|
|
174
222
|
}
|
|
175
223
|
async onGetAvailableColumns(options) {
|
|
@@ -178,9 +226,6 @@ class DataverseTaskStrategy {
|
|
|
178
226
|
async onGetAvailableRelatedColumns() {
|
|
179
227
|
return this._fetchXmlDataProvider.getAvailableRelatedColumns();
|
|
180
228
|
}
|
|
181
|
-
onGetQuickFindColumns() {
|
|
182
|
-
return [];
|
|
183
|
-
}
|
|
184
229
|
async onCreateTask(parentTaskId) {
|
|
185
230
|
const data = {};
|
|
186
231
|
let pageInput = {
|
|
@@ -275,17 +320,28 @@ class DataverseTaskStrategy {
|
|
|
275
320
|
onCreateTasksFromTemplate(templateId, parentTaskId) {
|
|
276
321
|
throw new Error("Method not implemented.");
|
|
277
322
|
}
|
|
278
|
-
async
|
|
279
|
-
if (
|
|
280
|
-
|
|
281
|
-
|
|
323
|
+
async onOpenDatasetItems(entityReferences, isTaskEntity) {
|
|
324
|
+
if (!isTaskEntity) {
|
|
325
|
+
// Navigate to related entity (lookup target)
|
|
326
|
+
const { pageInput, navigationOptions } = this._getFormParameters('open', {
|
|
327
|
+
pageInput: {
|
|
328
|
+
pageType: 'entityrecord',
|
|
329
|
+
entityName: entityReferences[0].etn,
|
|
330
|
+
entityId: entityReferences[0].id.guid,
|
|
331
|
+
},
|
|
332
|
+
navigationOptions: this._getFormNavigationOptions()
|
|
333
|
+
});
|
|
334
|
+
await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
if (entityReferences.length === 1) {
|
|
338
|
+
const rawRecord = await this._editSingleTask(entityReferences[0].id.guid);
|
|
339
|
+
if (!rawRecord)
|
|
282
340
|
return null;
|
|
283
|
-
return {
|
|
284
|
-
success: true,
|
|
285
|
-
updatedRecords: [result]
|
|
286
|
-
};
|
|
341
|
+
return { success: true, updatedRecords: [rawRecord] };
|
|
287
342
|
}
|
|
288
|
-
|
|
343
|
+
const result = await this._editMultipleTasks(entityReferences.map(ref => ref.id.guid));
|
|
344
|
+
return result;
|
|
289
345
|
}
|
|
290
346
|
async onMoveTask(movingTaskId, movingToTaskId, position) {
|
|
291
347
|
const movingToRecord = this._provider.getRecordsMap()[movingToTaskId];
|
|
@@ -331,9 +387,13 @@ class DataverseTaskStrategy {
|
|
|
331
387
|
*/
|
|
332
388
|
async onRecordSave(record) {
|
|
333
389
|
const dirtyField = record.getFields().find(field => field.isDirty());
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
390
|
+
const column = dirtyField?.getColumn();
|
|
391
|
+
if (column?.metadata?.LookupMany) {
|
|
392
|
+
const handler = this._getLookupManyHandlerForColumn(column.name);
|
|
393
|
+
return handler.saveRecord(record, column.name);
|
|
394
|
+
}
|
|
395
|
+
else if (column?.name.endsWith(DatasetConstants.CUSTOM_COLUMN_NAME_SUFFIX)) {
|
|
396
|
+
return this._customColumnsDataProvider.saveValue(record.getRecordId(), column, dirtyField?.getValue());
|
|
337
397
|
}
|
|
338
398
|
else {
|
|
339
399
|
return this._fetchXmlDataProvider.onRecordSave(record);
|
|
@@ -344,19 +404,7 @@ class DataverseTaskStrategy {
|
|
|
344
404
|
const record = this._provider.getRecordsMap()[recordId];
|
|
345
405
|
return record.getValue(this._provider.getNativeColumns().stateCode) == 0;
|
|
346
406
|
}
|
|
347
|
-
/**
|
|
348
|
-
async onOpenDatasetItem(entityReference, context) {
|
|
349
|
-
const { pageInput, navigationOptions } = this._getFormParameters('open', {
|
|
350
|
-
pageInput: {
|
|
351
|
-
pageType: 'entityrecord',
|
|
352
|
-
entityName: entityReference.etn,
|
|
353
|
-
entityId: entityReference.id.guid,
|
|
354
|
-
},
|
|
355
|
-
navigationOptions: this._getFormNavigationOptions()
|
|
356
|
-
});
|
|
357
|
-
await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);
|
|
358
|
-
}
|
|
359
|
-
/** Returns the root task ID supplied at construction time, used to scope the displayed hierarchy. */
|
|
407
|
+
/** Returns the root task ID used to scope the displayed hierarchy. */
|
|
360
408
|
onGetRootTaskId() {
|
|
361
409
|
return this._rootTaskId;
|
|
362
410
|
}
|
|
@@ -417,10 +465,7 @@ class DataverseTaskStrategy {
|
|
|
417
465
|
});
|
|
418
466
|
await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);
|
|
419
467
|
const rawRecords = await this.onGetRawRecords(recordIds);
|
|
420
|
-
return {
|
|
421
|
-
success: true,
|
|
422
|
-
updatedRecords: rawRecords
|
|
423
|
-
};
|
|
468
|
+
return { success: true, updatedRecords: rawRecords };
|
|
424
469
|
}
|
|
425
470
|
async _updateStackRank(params) {
|
|
426
471
|
const stackRankCol = this._getFieldMapping().stackRank;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataverseTaskStrategy.js","sources":["../../../../../src/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.ts"],"sourcesContent":["import { IRecord, IFetchXmlDataProvider, IRawRecord, FetchXmlDataProvider, FetchXmlBuilder, IAvailableColumnOptions, IAvailableRelatedColumn, IRecordSaveOperationResult, IColumn, Sanitizer, Operators, DataTypes } from \"@talxis/client-libraries\";\nimport { ITaskDataProviderStrategy, ITaskDataProvider, IDeleteTasksResult, IEditTasksResult } from \"../../providers\";\nimport { IRecordTree } from \"../../providers/task/record-tree\";\nimport { LexoRank } from \"lexorank\";\nimport { Liquid } from \"liquidjs\";\nimport { IFieldMapping } from \"./DataverseTaskGridDescriptor\";\nimport { LOOKUP_MANY_COLUMN_NAME_SUFFIX, LookupManyHandler } from \"./lookup-many/LookupManyHandler\";\n\n\ninterface IFormParameters {\n pageInput: Xrm.Navigation.PageInputEntityRecord;\n navigationOptions: Xrm.Navigation.NavigationOptions;\n}\n\n/** Constructor parameters for {@link DataverseTaskStrategy}. */\nexport interface IDataverseTaskStrategyParams {\n /** FetchXML used to load tasks. May contain Liquid template variables (e.g. `{{ projectId }}`). */\n fetchXml: string;\n /** When `true`, new tasks are created inline in the grid row without opening a form dialog. Defaults to `true`. */\n isInlineCreateEnabled?: boolean;\n /** When `false`, the edit form is opened in read-only mode. Defaults to `true`. */\n isEditingEnabled?: boolean;\n /** When `true`, deleting a task will also delete its child tasks. Defaults to `false`. */\n isCascadeDeleteEnabled?: boolean;\n /** When `true`, deleting tasks with children is enabled. Defaults to `false`. */\n isDeletingTasksWithChildrenEnabled?: boolean;\n /** Form ID to open when editing a single existing task. */\n editFormId?: string;\n /** Form ID to open when creating a new task via dialog (non-inline). */\n createFormId?: string;\n /** Form ID to open when bulk-editing multiple selected tasks. */\n bulkEditFormId?: string;\n /** Project record reference. When provided, new tasks are pre-linked to this project. */\n projectReference?: ComponentFramework.EntityReference;\n /** When set, the task hierarchy is rooted at this task ID. */\n rootTaskId?: string;\n /**\n * Optional hook to intercept and override the `Xrm.Navigation.navigateTo` parameters for\n * any form operation (`create`, `edit`, `bulkEdit`, `open`).\n * Return the modified `pageInput` and `navigationOptions` to customize the dialog.\n */\n formStrategy?: {\n onGetFormParameters?: (operation: 'create' | 'edit' | 'bulkEdit' | 'open', defaultParameters: IFormParameters) => IFormParameters;\n }\n}\n\ninterface ILookupManyColumn extends IColumn {\n navigationPropertyName: string\n}\n\n/** Extends {@link ITaskDataProviderStrategy} with a Dataverse-specific accessor for the project reference. */\nexport interface IDataverseTaskStrategy extends ITaskDataProviderStrategy {\n /** Returns the resolved project entity reference, or `null` if no project was provided at construction time. */\n getProjectReference(): ComponentFramework.EntityReference | null;\n}\n\nconst LIQUID = new Liquid();\n\n/**\n * Ready-to-use {@link ITaskDataProviderStrategy} implementation for the Dataverse / Talxis platform.\n *\n * Handles all task CRUD operations, drag-and-drop reordering (via LexoRank), template-based creation,\n * and lookup-many column rendering — all backed by the Xrm WebApi and FetchXML.\n *\n * Normally instantiated automatically by {@link DataverseTaskGridDescriptor}. Construct directly only\n * when you need to pass a custom `formStrategy` or override specific behaviour.\n */\nexport class DataverseTaskStrategy implements IDataverseTaskStrategy {\n private _fetchXml: string;\n private _entitySetName!: string;\n private _entityName!: string;\n private _projectReference?: ComponentFramework.EntityReference;\n private _projectMetadata?: Xrm.Metadata.EntityMetadata;\n private _rootTaskId?: string;\n private _taskTree!: IRecordTree;\n private _provider!: ITaskDataProvider;\n private _editFormId?: string;\n private _createFormId?: string\n private _bulkEditFormId?: string;\n private _fetchXmlDataProvider!: IFetchXmlDataProvider;\n private _isInlineCreateEnabled: boolean;\n private _isEditingEnabled: boolean;\n private _isDeletingTasksWithChildrenEnabled: boolean;\n private _isCascadeDeleteEnabled: boolean;\n private _lookupManyColumns: ILookupManyColumn[] = [];\n private _lookupManyHandlers: { [colName: string]: LookupManyHandler } = {};\n private _getFormParameters: (operation: 'create' | 'edit' | 'bulkEdit' | 'open', defaultParameters: IFormParameters) => IFormParameters;\n\n\n /** @param params — see {@link IDataverseTaskStrategyParams} for full documentation of each option. */\n constructor(params: IDataverseTaskStrategyParams) {\n this._fetchXml = params.fetchXml;\n this._projectReference = params.projectReference;\n this._editFormId = params.editFormId;\n this._rootTaskId = params.rootTaskId;\n this._createFormId = params.createFormId;\n this._bulkEditFormId = params.bulkEditFormId;\n this._isInlineCreateEnabled = params.isInlineCreateEnabled ?? true;\n this._isEditingEnabled = params.isEditingEnabled ?? true;\n this._isDeletingTasksWithChildrenEnabled = params.isDeletingTasksWithChildrenEnabled ?? false;\n this._isCascadeDeleteEnabled = params.isCascadeDeleteEnabled ?? false;\n this._getFormParameters = params.formStrategy?.onGetFormParameters ?? ((operation, defaultParameters) => defaultParameters);\n }\n\n public async onGetRawRecords(ids: string[], select?: string): Promise<IRawRecord[]> {\n let records: IRawRecord[] = [];\n const expands = await Promise.all(this._lookupManyColumns.map(async col => {\n const referencedEntityNavigationPropertyName = col.navigationPropertyName;\n const handler = this._lookupManyHandlers[col.name] ?? new LookupManyHandler({\n entityName: this._entityName,\n navigationPropertyName: referencedEntityNavigationPropertyName\n });\n this._lookupManyHandlers[col.name] = handler;\n await handler.init();\n return handler.getExpand();\n }));\n\n const parts: string[] = [];\n if (select) parts.push(`$select=${select}`);\n if (expands.length > 0) parts.push(`$expand=${expands.join(',')}`);\n\n const query = `?$filter=Microsoft.Dynamics.CRM.In(PropertyName='${this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute}', PropertyValues=[${ids.map((id) => `'${id}'`).join(',')}])${parts.length > 0 ? `&${parts.join('&')}` : ''}`;\n records = await this._getRawRecordsByIds({ ids, query });\n\n if (this._lookupManyColumns.length > 0) {\n await Promise.all(records.map(record => this._harmonizeLookupManyData(record)));\n }\n return records;\n }\n\n /** Returns the project entity reference resolved during `onInitialize`, or `null` when none was provided. */\n public getProjectReference(): ComponentFramework.EntityReference | null {\n return this._projectReference ?? null;\n }\n\n private async _harmonizeLookupManyData(record: IRawRecord): Promise<IRawRecord> {\n const nextLinkSuffix = '@odata.nextLink';\n for (const lookupManyCol of this._lookupManyColumns) {\n const referencedEntityNavigationPropertyName = lookupManyCol.navigationPropertyName;\n record[lookupManyCol.name] = await this._convertLookupManyToEntityReference(record[referencedEntityNavigationPropertyName], lookupManyCol);\n delete record[referencedEntityNavigationPropertyName];\n delete record[`${referencedEntityNavigationPropertyName}${nextLinkSuffix}`];\n }\n return record;\n }\n\n private async _convertLookupManyToEntityReference(data: IRawRecord[], col: IColumn): Promise<ComponentFramework.EntityReference[]> {\n const metadata = await window.Xrm.Utility.getEntityMetadata(col.metadata?.Targets[0]);\n return data.map(record => {\n return {\n id: {\n guid: record[metadata.PrimaryIdAttribute]\n },\n name: record[metadata.PrimaryNameAttribute],\n etn: metadata.LogicalName,\n rawData: record\n }\n });\n }\n\n private async _getRawRecordsByIds(params: { ids: string[], query: string }): Promise<IRawRecord[]> {\n const maxIdsPerRequest = 800;\n const batches: string[][] = [];\n const { ids, query } = params;\n\n let currentBatch: string[] = [];\n for (const [i, taskId] of Object.entries(ids)) {\n if (currentBatch.length <= maxIdsPerRequest) {\n currentBatch.push(taskId);\n } else {\n batches.push(currentBatch);\n currentBatch = [taskId];\n }\n if (+i + 1 === ids.length) {\n batches.push(currentBatch);\n }\n }\n\n const batchedTasks: ComponentFramework.WebApi.Entity[][] = await Promise.all(batches.map(async (batchIds) => {\n const { entities } = await window.Xrm.WebApi.retrieveMultipleRecords(\n this._entityName,\n query\n );\n return entities;\n }));\n return batchedTasks.flat();\n }\n\n public async onInitialize(provider: ITaskDataProvider): Promise<{ columns: IColumn[]; rawData: IRawRecord[]; metadata: any; }> {\n this._provider = provider;\n this._taskTree = provider.getRecordTree();\n this._fetchXml = this._getFetchXml();\n const virtualColumns = structuredClone(provider.getColumns().filter(col => col.isVirtual));\n this._fetchXmlDataProvider = new FetchXmlDataProvider({ fetchXml: this._fetchXml, loadAllRecords: true });\n this._fetchXmlDataProvider.setColumns(provider.getColumns());\n this._fetchXmlDataProvider.setLinking(provider.getLinking());\n await this._fetchXmlDataProvider.refresh();\n this._entityName = this._fetchXmlDataProvider.getEntityName();\n this._entitySetName = this._fetchXmlDataProvider.getMetadata().EntitySetName;\n this._lookupManyColumns = this._getLookupManyColumns();\n const columns = this._fetchXmlDataProvider.getColumns();\n this._restoreVirtualColumnMetadata(virtualColumns, columns);\n this._injectLookupManyFilterOperators(columns);\n const metadata = this._fetchXmlDataProvider.getMetadata();\n const fetchXmlProviderData = this._fetchXmlDataProvider.getRawData();\n const enrichedData = await this.onGetRawRecords(this._fetchXmlDataProvider.getSortedRecordIds(), this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute);\n const finalRawData = fetchXmlProviderData.map((record, i) => {\n return {\n ...enrichedData[i],\n ...record,\n }\n });\n\n if (this._projectReference) {\n this._projectMetadata = await window.Xrm.Utility.getEntityMetadata(this._projectReference.etn!);\n }\n return {\n rawData: finalRawData,\n columns,\n metadata\n }\n }\n\n private _getLookupManyColumns(): ILookupManyColumn[] {\n return this._fetchXmlDataProvider.getColumns().filter(col => col.name.endsWith(LOOKUP_MANY_COLUMN_NAME_SUFFIX)).map(col => {\n return {\n ...col,\n navigationPropertyName: col.name.replace(LOOKUP_MANY_COLUMN_NAME_SUFFIX, '')\n }\n })\n }\n\n //fetch xml provider will override virtual column metadata by default, so we need to restore it after initialization.\n private _restoreVirtualColumnMetadata(virtualColumns: IColumn[], columns: IColumn[]) {\n columns.map((col, i) => {\n const virtualCol = virtualColumns.find(virtualCol => virtualCol.name === col.name);\n if (virtualCol) {\n columns[i] = virtualCol;\n }\n });\n }\n\n private _injectLookupManyFilterOperators(columns: IColumn[]) {\n columns.map(col => {\n if (col.name.endsWith(LOOKUP_MANY_COLUMN_NAME_SUFFIX)) {\n col.metadata = {\n ...col.metadata,\n SupportedFilterConditionOperators: Operators.GetOperatorsForDataType(DataTypes.MultiSelectOptionSet).map(op => op.Value)\n }\n }\n })\n }\n\n private _getFieldMapping(): IFieldMapping {\n return this._provider.getNativeColumns() as IFieldMapping;\n }\n\n private _getFetchXml(): string {\n return LIQUID.parseAndRenderSync(this._fetchXml, {\n projectId: this._projectReference?.id.guid,\n })\n }\n\n public async onGetAvailableColumns(options?: IAvailableColumnOptions): Promise<IColumn[]> {\n return this._fetchXmlDataProvider.getAvailableColumns(options);\n }\n public async onGetAvailableRelatedColumns(): Promise<IAvailableRelatedColumn[]> {\n return this._fetchXmlDataProvider.getAvailableRelatedColumns();\n }\n public onGetQuickFindColumns(): string[] {\n return [];\n }\n public async onCreateTask(parentTaskId?: string): Promise<IRawRecord | null> {\n const data: { [key: string]: any } = {};\n let pageInput: Xrm.Navigation.PageInputEntityRecord = {\n pageType: 'entityrecord',\n entityName: this._entityName,\n data: data,\n formId: this._createFormId\n };\n //prefill project\n if (this._projectReference) {\n const projectIdColumnName = this._getFieldMapping().projectId;\n data[`${projectIdColumnName}`] = this._projectReference.id.guid;\n data[`${projectIdColumnName}name`] = this._projectReference.name;\n data[`${projectIdColumnName}type`] = this._projectReference.etn;\n }\n //prefill parent task\n if (parentTaskId) {\n const parentIdColumnName = this._getFieldMapping().parentId;\n data[`${parentIdColumnName}`] = parentTaskId;\n data[`${parentIdColumnName}name`] = this._provider.getRecordsMap()[parentTaskId].getNamedReference().name;\n data[`${parentIdColumnName}type`] = this._entityName;\n }\n const node = this._taskTree.getNode(parentTaskId ?? null);\n let payload: { [key: string]: any } = {};\n payload[`${this._getFieldMapping().stackRank}`] = await this._updateStackRank({ previousTaskId: undefined, nextTaskId: node.directChildren[0]?.getRecordId(), skipSave: true });\n\n if (this._projectReference) {\n payload[`${await this._getNavigationalPropertyName(this._projectReference.etn!, this._getFieldMapping().projectId!)}@odata.bind`] = `/${this._projectMetadata?.EntitySetName}(${this._projectReference.id.guid})`;\n }\n if (parentTaskId) {\n payload[`${await this._getNavigationalPropertyName(this._entityName, this._getFieldMapping().parentId)}@odata.bind`] = `/${this._entitySetName}(${parentTaskId})`;\n }\n if (this._isInlineCreateEnabled) {\n const result = await window.Xrm.WebApi.createRecord(this._entityName, payload);\n const rawRecord = (await this.onGetRawRecords([result.id]))[0];\n return rawRecord;\n }\n\n const { pageInput: resolvedPageInput, navigationOptions: resolvedNavigationOptions } = this._getFormParameters('create', {\n pageInput,\n navigationOptions: this._getFormNavigationOptions()\n });\n const navigateToResult = await Xrm.Navigation.navigateTo(resolvedPageInput, resolvedNavigationOptions);\n if (navigateToResult.savedEntityReference) {\n const entityReference = Sanitizer.Lookup.getEntityReference(navigateToResult.savedEntityReference[0]);\n await window.Xrm.WebApi.updateRecord(this._entityName, entityReference.id.guid, payload);\n const rawRecord = (await this.onGetRawRecords([entityReference.id.guid]))[0];\n return rawRecord;\n }\n else {\n return null;\n }\n }\n public async onDeleteTasks(taskIds: string[]): Promise<IDeleteTasksResult | null> {\n const allTaskIds: Set<string> = new Set(taskIds);\n let success = true;\n const notDeletableTaskIds: string[] = [];\n if (this._isCascadeDeleteEnabled) {\n for (const taskId of taskIds) {\n const children = this._taskTree.getNode(taskId)?.allChildren.map(c => c.getRecordId()) ?? [];\n children.map(id => allTaskIds.add(id));\n }\n }\n if (!this._isDeletingTasksWithChildrenEnabled) {\n for (const taskId of allTaskIds) {\n if (this._taskTree.hasChildren(taskId)) {\n success = false;\n allTaskIds.delete(taskId);\n notDeletableTaskIds.push(taskId);\n }\n }\n }\n const result = await this._fetchXmlDataProvider.deleteRecords([...allTaskIds]);\n return {\n success: result.success && success,\n deletedTaskIds: [...allTaskIds],\n errors: [...result.results.filter(result => !result.success).map(result => {\n return {\n id: result.recordId,\n error: result.errorMessage\n }\n }), ...notDeletableTaskIds.map(id => {\n return {\n id,\n //TODO: localize\n error: 'Cannot delete task with children.'\n }\n })]\n }\n }\n public onCreateTemplateFromTask(taskId: string): Promise<IRawRecord | null> {\n throw new Error(\"Method not implemented.\");\n }\n public onCreateTasksFromTemplate(templateId: string, parentTaskId?: string): Promise<IRawRecord[] | null> {\n throw new Error(\"Method not implemented.\");\n }\n public async onEditTasks(taskIds: string[]): Promise<IEditTasksResult | null> {\n if (taskIds.length === 1) {\n const result = await this._editSingleTask(taskIds[0]);\n if (!result) return null;\n return {\n success: true,\n updatedRecords: [result]\n }\n }\n return this._editMultipleTasks(taskIds);\n }\n public async onMoveTask(movingTaskId: string, movingToTaskId: string, position: \"above\" | \"below\" | \"child\"): Promise<IRawRecord[] | null> {\n const movingToRecord = this._provider.getRecordsMap()[movingToTaskId];\n let payload: { [key: string]: any } = {};\n if (position === 'child') {\n //change parent\n payload[`${await this._getNavigationalPropertyName(this._entityName, this._getFieldMapping().parentId)}@odata.bind`] = `/${this._entitySetName}(${movingToTaskId})`;\n const firstChild = this._taskTree.getNode(movingToTaskId).directChildren\n .find(c => c.getRecordId() !== movingTaskId);\n if (firstChild) {\n //change stack rank to be before first child\n payload[`${this._getFieldMapping().stackRank}`] = await this._updateStackRank({ recordId: movingTaskId, previousTaskId: undefined, nextTaskId: firstChild.getRecordId(), skipSave: true });\n }\n await window.Xrm.WebApi.updateRecord(this._entityName, movingTaskId, payload);\n const rawRecord = (await this.onGetRawRecords([movingTaskId]))[0];\n return [rawRecord];\n }\n else {\n const movingToRecordParent = this._taskTree.getNodeMap().get(movingToRecord.getRecordId())?.parent;\n payload[`${await this._getNavigationalPropertyName(this._entityName, this._getFieldMapping().parentId)}@odata.bind`] = movingToRecordParent ? `/${this._entitySetName}(${movingToRecordParent.getRecordId()})` : null;\n\n const movingToRecordNode = this._taskTree.getNodeMap().get(movingToRecord.getRecordId())!;\n const siblings = this._taskTree.getNodeMap().get(movingToRecordParent?.getRecordId() ?? null as any)?.directChildren ?? [];\n\n let prevSiblingId: string | undefined;\n let nextSiblingId: string | undefined;\n if (position === 'above') {\n prevSiblingId = siblings[movingToRecordNode.index - 1]?.getRecordId();\n nextSiblingId = movingToRecord.getRecordId();\n } else {\n prevSiblingId = movingToRecord.getRecordId();\n nextSiblingId = siblings[movingToRecordNode.index + 1]?.getRecordId();\n }\n payload[`${this._getFieldMapping().stackRank}`] = await this._updateStackRank({ recordId: movingTaskId, previousTaskId: prevSiblingId, nextTaskId: nextSiblingId, skipSave: true });\n await window.Xrm.WebApi.updateRecord(this._entityName, movingTaskId, payload);\n const rawRecord = (await this.onGetRawRecords([movingTaskId]))[0];\n return [rawRecord];\n }\n }\n\n /**\n * Saves a single dirty field on a task record.\n * Lookup-many fields are persisted through their dedicated {@link LookupManyHandler}; all other fields use the standard FetchXML provider save path.\n * TaskGrid uses auto-save, so exactly one dirty field is expected per call.\n */\n public async onRecordSave(record: IRecord): Promise<IRecordSaveOperationResult> {\n const dirtyField = record.getFields().find(field => field.isDirty());\n if (dirtyField?.getColumn().name.endsWith(LOOKUP_MANY_COLUMN_NAME_SUFFIX)) {\n const handler = this._getLookupManyHandlerForColumn(dirtyField.getColumn().name);\n return handler.saveRecord(record, dirtyField.getColumn().name);\n }\n else {\n return (<FetchXmlDataProvider>this._fetchXmlDataProvider).onRecordSave(record);\n }\n }\n\n /** Returns `true` when the task's `stateCode` attribute equals `0` (active). */\n public onIsRecordActive(recordId: string): boolean {\n const record = this._provider.getRecordsMap()[recordId];\n return record.getValue(this._provider.getNativeColumns().stateCode) == 0;\n }\n\n /** Opens the task record in a side dialog. When `context.columnName` is a lookup-many column, the dialog is focused on that column. */\n public async onOpenDatasetItem(entityReference: ComponentFramework.EntityReference, context?: { columnName?: string }): Promise<void> {\n const { pageInput, navigationOptions } = this._getFormParameters('open', {\n pageInput: {\n pageType: 'entityrecord',\n entityName: entityReference.etn!,\n entityId: entityReference.id.guid,\n },\n navigationOptions: this._getFormNavigationOptions()\n });\n await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);\n }\n /** Returns the root task ID supplied at construction time, used to scope the displayed hierarchy. */\n public onGetRootTaskId?(): string | undefined {\n return this._rootTaskId;\n }\n\n private async _getNavigationalPropertyName(referencedEntityName: string, referencingAttribute: string): Promise<string> {\n const metadata: any = await window.Xrm.Utility.getEntityMetadata(this._entityName);\n const relationship = metadata.ManyToOneRelationships.getAll().find((rel: any) =>\n rel.ReferencedEntity === referencedEntityName &&\n rel.ReferencingAttribute === referencingAttribute\n );\n if (!relationship) {\n throw new Error(`Could not find many-to-one relationship targeting ${referencedEntityName} on ${metadata.LogicalName}`);\n }\n return relationship.ReferencingEntityNavigationPropertyName;\n }\n\n private _getFormNavigationOptions(): Xrm.Navigation.NavigationOptions {\n return {\n target: 2,\n width: { value: 80, unit: '%' },\n position: 1,\n };\n }\n\n private _getLookupManyHandlerForColumn(colName: string): LookupManyHandler {\n const handler = this._lookupManyHandlers[colName];\n if (!handler) {\n throw new Error(`No LookupManyHandler found for column ${colName}`);\n }\n return handler;\n }\n\n private async _editSingleTask(recordId: string): Promise<IRawRecord | null> {\n const { pageInput, navigationOptions } = this._getFormParameters('edit', {\n pageInput: {\n pageType: 'entityrecord',\n entityName: this._entityName,\n entityId: recordId,\n formId: this._editFormId,\n data: {\n isEditingEnabled: this._isEditingEnabled\n }\n },\n navigationOptions: this._getFormNavigationOptions()\n })\n\n await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);\n const result = await this.onGetRawRecords([recordId]);\n return result[0];\n }\n\n private async _editMultipleTasks(recordIds: string[]): Promise<IEditTasksResult | null> {\n const { pageInput, navigationOptions } = this._getFormParameters('bulkEdit', {\n //@ts-ignore - not documented, passing of record id array is possible in Power Apps - https://butenko.pro/2021/10/14/howto-open-bulk-editing-of-records-using-xrm-navigation-navigateto/\n pageInput: {\n //@ts-ignore - typings\n pageType: 'bulkedit',\n entityName: this._entityName,\n entityIds: recordIds,\n formId: this._bulkEditFormId\n },\n navigationOptions: {\n target: 2,\n position: 2,\n }\n });\n await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);\n const rawRecords = await this.onGetRawRecords(recordIds);\n return {\n success: true,\n updatedRecords: rawRecords\n };\n }\n\n private async _updateStackRank(params: { recordId?: string, previousTaskId?: string, nextTaskId?: string; skipSave?: boolean }): Promise<string> {\n const stackRankCol = this._getFieldMapping().stackRank;\n const rawDataMap = this._provider.getRawDataMap();\n\n const prevRankStr = params.previousTaskId ? (rawDataMap[params.previousTaskId]?.[stackRankCol] as string) : undefined;\n const nextRankStr = params.nextTaskId ? (rawDataMap[params.nextTaskId]?.[stackRankCol] as string) : undefined;\n\n let newRank: string;\n if (prevRankStr && nextRankStr) {\n newRank = LexoRank.parse(prevRankStr).between(LexoRank.parse(nextRankStr)).format();\n } else if (nextRankStr) {\n newRank = LexoRank.parse(nextRankStr).genPrev().format();\n } else if (prevRankStr) {\n newRank = LexoRank.parse(prevRankStr).genNext().format();\n } else {\n newRank = LexoRank.middle().format();\n }\n if (!params.skipSave && params.recordId) {\n await window.Xrm.WebApi.updateRecord(this._entityName, params.recordId, {\n [stackRankCol]: newRank\n });\n }\n return newRank;\n }\n\n}"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataverseTaskStrategy.js","sources":["../../../../../src/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.ts"],"sourcesContent":["import { IRecord, IFetchXmlDataProvider, IRawRecord, FetchXmlDataProvider, FetchXmlBuilder, IAvailableColumnOptions, IAvailableRelatedColumn, IRecordSaveOperationResult, IColumn, Sanitizer, Operators, DataTypes, ISingleRecord, DatasetConstants } from \"@talxis/client-libraries\";\nimport { ITaskDataProviderStrategy, ITaskDataProvider, IDeleteTasksResult, IOpenDatasetItemsResult, ICustomColumnsDataProvider } from \"../../providers\";\nimport { IRecordTree } from \"../../providers/task/record-tree\";\nimport { LexoRank } from \"lexorank\";\nimport { Liquid } from \"liquidjs\";\nimport { IFieldMapping } from \"./DataverseTaskGridDescriptor\";\nimport { LookupManyHandler } from \"./lookup-many/LookupManyHandler\";\nimport { ITaskStrategyDeps } from \"../..\";\nimport { IDataverseCustomColumnsStrategy } from \"./DataverseCustomColumnsStrategy\";\n\n\ninterface IFormParameters {\n pageInput: Xrm.Navigation.PageInputEntityRecord;\n navigationOptions: Xrm.Navigation.NavigationOptions;\n}\n\n/** Constructor parameters for {@link DataverseTaskStrategy}. */\nexport interface IDataverseTaskStrategyParams {\n /** FetchXML used to load tasks. May contain Liquid template variables (e.g. `{{ projectId }}`). */\n fetchXml: string;\n /** When `false`, the edit form is opened in read-only mode. Defaults to `true`. */\n isEditingEnabled?: boolean;\n /** When `true`, deleting a task will also delete its child tasks. Defaults to `false`. */\n isCascadeDeleteEnabled?: boolean;\n /** When `true`, deleting tasks with children is enabled. Defaults to `false`. */\n isDeletingTasksWithChildrenEnabled?: boolean;\n /** Form ID to open when editing a single existing task. */\n editFormId?: string;\n /** Form ID to open when creating a new task via dialog (non-inline). */\n createFormId?: string;\n /** Form ID to open when bulk-editing multiple selected tasks. */\n bulkEditFormId?: string;\n /** Project record reference. When provided, new tasks are pre-linked to this project. */\n projectRecord?: ISingleRecord;\n\n sourceRecord?: ISingleRecord;\n /** When set, the task hierarchy is rooted at this task ID. */\n rootTaskId?: string;\n /**\n * Optional hook to intercept and override the `Xrm.Navigation.navigateTo` parameters for\n * any form operation (`create`, `edit`, `bulkEdit`, `open`).\n * Return the modified `pageInput` and `navigationOptions` to customize the dialog.\n */\n form?: {\n onGetFormParameters?: (operation: 'create' | 'edit' | 'bulkEdit' | 'open', defaultParameters: IFormParameters) => IFormParameters;\n }\n}\n\ninterface ILookupManyColumn extends IColumn {\n metadata: ILookupManyColumnMetadata;\n}\n\ninterface ILookupManyColumnMetadata {\n LookupMany: {\n ReferencedEntityNavigationPropertyName: string;\n Select?: string;\n CustomIntersection?: {\n ReferencingEntityNavigationPropertyName: string;\n }\n }\n}\n\n/** Extends {@link ITaskDataProviderStrategy} with a Dataverse-specific accessor for the project reference. */\nexport interface IDataverseTaskStrategy extends ITaskDataProviderStrategy {\n /** Returns the resolved project entity reference, or `null` if no project was provided at construction time. */\n getProjectRecord(): ISingleRecord | null;\n getSourceRecord(): ISingleRecord | null;\n}\n\nconst LIQUID = new Liquid();\n\n/**\n * Ready-to-use {@link ITaskDataProviderStrategy} implementation for the Dataverse / Talxis platform.\n *\n * Handles all task CRUD operations, drag-and-drop reordering (via LexoRank), template-based creation,\n * and lookup-many column rendering — all backed by the Xrm WebApi and FetchXML.\n *\n * Normally instantiated automatically by {@link DataverseTaskGridDescriptor}. Construct directly only\n * when you need to pass a custom `formStrategy` or override specific behaviour.\n */\nexport class DataverseTaskStrategy implements IDataverseTaskStrategy {\n private _fetchXml: string;\n private _entitySetName!: string;\n private _entityName!: string;\n private _projectReference?: ComponentFramework.EntityReference;\n private _projectRecord?: ISingleRecord;\n private _projectMetadata?: Xrm.Metadata.EntityMetadata;\n private _rootTaskId?: string;\n private _taskTree!: IRecordTree;\n private _provider!: ITaskDataProvider;\n private _editFormId?: string;\n private _createFormId?: string;\n private _bulkEditFormId?: string;\n private _fetchXmlDataProvider!: IFetchXmlDataProvider;\n private _isInlineCreateEnabled: boolean;\n private _isEditingEnabled: boolean;\n private _isDeletingTasksWithChildrenEnabled: boolean;\n private _isCascadeDeleteEnabled: boolean;\n private _lookupManyColumns: ILookupManyColumn[] = [];\n private _customColumns: IColumn[] = [];\n private _sourceRecord?: ISingleRecord;\n private _customColumnsDataProvider?: ICustomColumnsDataProvider;\n private _lookupManyHandlers: { [colName: string]: LookupManyHandler } = {};\n private _getFormParameters: (operation: 'create' | 'edit' | 'bulkEdit' | 'open', defaultParameters: IFormParameters) => IFormParameters;\n\n\n /** @param params — see {@link IDataverseTaskStrategyParams} for full documentation of each option. */\n constructor(params: IDataverseTaskStrategyParams, deps: ITaskStrategyDeps) {\n this._fetchXml = params.fetchXml;\n this._customColumnsDataProvider = deps.customColumnsDataProvider;\n this._projectRecord = params.projectRecord;\n this._projectReference = this._projectRecord?.getNamedReference();\n this._editFormId = params.editFormId;\n this._rootTaskId = params.rootTaskId;\n this._createFormId = params.createFormId;\n this._bulkEditFormId = params.bulkEditFormId;\n this._isInlineCreateEnabled = deps.enableInlineCreation;\n this._isEditingEnabled = deps.enableTaskEditing;\n this._isDeletingTasksWithChildrenEnabled = params.isDeletingTasksWithChildrenEnabled ?? false;\n this._isCascadeDeleteEnabled = params.isCascadeDeleteEnabled ?? false;\n this._getFormParameters = params.form?.onGetFormParameters ?? ((operation, defaultParameters) => defaultParameters);\n this._sourceRecord = params.sourceRecord;\n }\n\n public async onGetRawRecords(ids: string[], select?: string): Promise<IRawRecord[]> {\n let records: IRawRecord[] = [];\n const expands = await Promise.all(this._lookupManyColumns.map(async col => {\n const referencedEntityNavigationPropertyName = col.metadata.LookupMany.ReferencedEntityNavigationPropertyName;\n const customIntersection = col.metadata.LookupMany.CustomIntersection;\n const handler = this._lookupManyHandlers[col.name] ?? new LookupManyHandler({\n entityName: this._entityName,\n navigationPropertyName: referencedEntityNavigationPropertyName!,\n customIntersection: customIntersection ? {\n referencingEntityNavigationPropertyName: customIntersection.ReferencingEntityNavigationPropertyName\n } : undefined\n });\n this._lookupManyHandlers[col.name] = handler;\n await handler.init();\n return handler.getExpand(col.metadata.LookupMany.Select);\n }));\n\n if (this._customColumns.length > 0) {\n const strategy: IDataverseCustomColumnsStrategy = this._customColumnsDataProvider!.getStrategy();\n expands.push(strategy.getExpand());\n }\n const suffixParts: string[] = [];\n if (select) suffixParts.push(`$select=${select}`);\n if (expands.length > 0) suffixParts.push(`$expand=${expands.join(',')}`);\n const querySuffix = suffixParts.length > 0 ? `&${suffixParts.join('&')}` : '';\n\n records = await this._getRawRecordsByIds({ ids, querySuffix });\n\n if (this._lookupManyColumns.length > 0 || this._customColumns.length > 0) {\n for (const record of records) {\n await this._harmonizeLookupManyData(record);\n await this._harmonizenizeCustomColumnsData(record);\n }\n }\n return records;\n }\n\n public getProjectRecord(): ISingleRecord | null {\n return this._projectRecord ?? null;\n }\n public getSourceRecord(): ISingleRecord | null {\n return this._sourceRecord ?? null;\n }\n\n private async _harmonizenizeCustomColumnsData(record: IRawRecord): Promise<void> {\n for (const col of this._customColumns) {\n const strategy: IDataverseCustomColumnsStrategy = this._customColumnsDataProvider!.getStrategy();\n const value = strategy.getValueFromRawRecord(record[this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute], record, col);\n record[col.name] = value;\n }\n }\n\n private async _harmonizeLookupManyData(record: IRawRecord): Promise<IRawRecord> {\n const nextLinkSuffix = '@odata.nextLink';\n for (const lookupManyCol of this._lookupManyColumns) {\n const referencedEntityNavigationPropertyName = lookupManyCol.metadata.LookupMany.ReferencedEntityNavigationPropertyName;\n record[lookupManyCol.name] = await this._convertLookupManyToEntityReference(record[referencedEntityNavigationPropertyName], lookupManyCol);\n delete record[referencedEntityNavigationPropertyName];\n delete record[`${referencedEntityNavigationPropertyName}${nextLinkSuffix}`];\n }\n return record;\n }\n\n private async _convertLookupManyToEntityReference(data: IRawRecord[], col: IColumn): Promise<ComponentFramework.EntityReference[]> {\n const relatedEntityMetadata = await window.Xrm.Utility.getEntityMetadata(col.metadata?.Targets[0]);\n const primaryIdAttribute: string = relatedEntityMetadata.PrimaryIdAttribute;\n const primaryNameAttribute: string = relatedEntityMetadata.PrimaryNameAttribute;\n const referencingEntityNavigationPropertyName = col.metadata?.LookupMany?.CustomIntersection?.ReferencingEntityNavigationPropertyName;\n const lookupManyHandler = this._getLookupManyHandlerForColumn(col.name);\n\n return data.map(record => {\n let data = record;\n if (referencingEntityNavigationPropertyName) {\n data = record[referencingEntityNavigationPropertyName];\n }\n const result = {\n id: {\n guid: data[primaryIdAttribute]\n },\n name: data[primaryNameAttribute],\n etn: relatedEntityMetadata.LogicalName,\n rawData: data\n }\n if (lookupManyHandler.isCustomIntersection()) {\n if (result.rawData) {\n result.rawData.__intersectionId = record[lookupManyHandler.getCustomIntersectionEntityMetadata().PrimaryIdAttribute];\n }\n }\n return result;\n });\n }\n\n private async _getRawRecordsByIds(params: { ids: string[], querySuffix?: string }): Promise<IRawRecord[]> {\n const maxIdsPerRequest = 800;\n const batches: string[][] = [];\n const { ids, querySuffix = '' } = params;\n\n let currentBatch: string[] = [];\n for (const [i, taskId] of Object.entries(ids)) {\n if (currentBatch.length < maxIdsPerRequest) {\n currentBatch.push(taskId);\n } else {\n batches.push(currentBatch);\n currentBatch = [taskId];\n }\n if (+i + 1 === ids.length) {\n batches.push(currentBatch);\n }\n }\n\n const batchedTasks: ComponentFramework.WebApi.Entity[][] = await Promise.all(batches.map(async (batchIds) => {\n const query = `?$filter=Microsoft.Dynamics.CRM.In(PropertyName='${this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute}', PropertyValues=[${batchIds.map((id) => `'${id}'`).join(',')}])${querySuffix}`;\n const { entities } = await window.Xrm.WebApi.retrieveMultipleRecords(\n this._entityName,\n query\n );\n return entities;\n }));\n return batchedTasks.flat();\n }\n\n public async onInitialize(provider: ITaskDataProvider): Promise<{ columns: IColumn[]; rawData: IRawRecord[]; metadata: any; }> {\n this._provider = provider;\n this._taskTree = provider.getRecordTree();\n this._fetchXml = this._getFetchXml();\n const virtualColumns = structuredClone(provider.getColumns().filter(col => col.isVirtual));\n this._fetchXmlDataProvider = new FetchXmlDataProvider({ fetchXml: this._fetchXml, loadAllRecords: true });\n this._fetchXmlDataProvider.setColumns(provider.getColumns());\n this._fetchXmlDataProvider.setLinking(provider.getLinking());\n await this._fetchXmlDataProvider.refresh();\n this._entityName = this._fetchXmlDataProvider.getEntityName();\n this._entitySetName = this._fetchXmlDataProvider.getMetadata().EntitySetName;\n const columns = this._fetchXmlDataProvider.getColumns();\n this._customColumns = this._getCustomColumns(columns);\n this._lookupManyColumns = this._getLookupManyColumns(columns);\n this._restoreVirtualColumnMetadata(virtualColumns, columns);\n this._injectLookupManyFilterOperators(columns);\n const metadata = this._fetchXmlDataProvider.getMetadata();\n const fetchXmlProviderData = this._fetchXmlDataProvider.getRawData();\n const primaryIdAttribute = this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute;\n const enrichedData = await this.onGetRawRecords(this._fetchXmlDataProvider.getSortedRecordIds(), primaryIdAttribute);\n const enrichedDataMap = new Map<string, IRawRecord>(\n enrichedData.map(record => [record[primaryIdAttribute] as string, record])\n );\n const finalRawData = fetchXmlProviderData.map((record) => {\n const id = record[primaryIdAttribute] as string;\n return {\n ...enrichedDataMap.get(id),\n ...record,\n }\n });\n\n if (this._projectReference) {\n this._projectMetadata = await window.Xrm.Utility.getEntityMetadata(this._projectReference.etn!);\n }\n return {\n rawData: finalRawData,\n columns,\n metadata\n }\n }\n\n private _getLookupManyColumns(columns: IColumn[]): ILookupManyColumn[] {\n return columns.filter(col => col.metadata?.LookupMany) as any;\n }\n\n private _getCustomColumns(columns: IColumn[]): IColumn[] {\n return columns.filter(col => this._customColumnsDataProvider?.isCustomColumn(col.name));\n }\n\n //fetch xml provider will override virtual column metadata by default, so we need to restore it after initialization.\n private _restoreVirtualColumnMetadata(virtualColumns: IColumn[], columns: IColumn[]) {\n columns.map((col, i) => {\n const virtualCol = virtualColumns.find(virtualCol => virtualCol.name === col.name);\n if (virtualCol) {\n columns[i] = virtualCol;\n }\n });\n }\n\n private _injectLookupManyFilterOperators(columns: IColumn[]) {\n columns.map(col => {\n if (col.metadata?.LookupMany) {\n col.metadata = {\n ...col.metadata,\n SupportedFilterConditionOperators: Operators.GetOperatorsForDataType(DataTypes.MultiSelectOptionSet).map(op => op.Value)\n }\n }\n })\n }\n\n private _getFieldMapping(): IFieldMapping {\n return this._provider.getNativeColumns() as IFieldMapping;\n }\n\n private _getFetchXml(): string {\n return LIQUID.parseAndRenderSync(this._fetchXml, {\n project: {\n id: this._projectReference?.id.guid,\n ...this._projectRecord?.getRawData()\n },\n currentRecord: {\n id: this._sourceRecord?.getNamedReference().id.guid,\n ...this._sourceRecord?.getRawData()\n }\n })\n }\n\n public async onGetAvailableColumns(options?: IAvailableColumnOptions): Promise<IColumn[]> {\n return this._fetchXmlDataProvider.getAvailableColumns(options);\n }\n public async onGetAvailableRelatedColumns(): Promise<IAvailableRelatedColumn[]> {\n return this._fetchXmlDataProvider.getAvailableRelatedColumns();\n }\n\n public async onCreateTask(parentTaskId?: string): Promise<IRawRecord | null> {\n const data: { [key: string]: any } = {};\n let pageInput: Xrm.Navigation.PageInputEntityRecord = {\n pageType: 'entityrecord',\n entityName: this._entityName,\n data: data,\n formId: this._createFormId\n };\n //prefill project\n if (this._projectReference) {\n const projectIdColumnName = this._getFieldMapping().projectId;\n data[`${projectIdColumnName}`] = this._projectReference.id.guid;\n data[`${projectIdColumnName}name`] = this._projectReference.name;\n data[`${projectIdColumnName}type`] = this._projectReference.etn;\n }\n //prefill parent task\n if (parentTaskId) {\n const parentIdColumnName = this._getFieldMapping().parentId;\n data[`${parentIdColumnName}`] = parentTaskId;\n data[`${parentIdColumnName}name`] = this._provider.getRecordsMap()[parentTaskId].getNamedReference().name;\n data[`${parentIdColumnName}type`] = this._entityName;\n }\n const node = this._taskTree.getNode(parentTaskId ?? null);\n let payload: { [key: string]: any } = {};\n payload[`${this._getFieldMapping().stackRank}`] = await this._updateStackRank({ previousTaskId: undefined, nextTaskId: node.directChildren[0]?.getRecordId(), skipSave: true });\n\n if (this._projectReference) {\n payload[`${await this._getNavigationalPropertyName(this._projectReference.etn!, this._getFieldMapping().projectId!)}@odata.bind`] = `/${this._projectMetadata?.EntitySetName}(${this._projectReference.id.guid})`;\n }\n if (parentTaskId) {\n payload[`${await this._getNavigationalPropertyName(this._entityName, this._getFieldMapping().parentId)}@odata.bind`] = `/${this._entitySetName}(${parentTaskId})`;\n }\n if (this._isInlineCreateEnabled) {\n const result = await window.Xrm.WebApi.createRecord(this._entityName, payload);\n const rawRecord = (await this.onGetRawRecords([result.id]))[0];\n return rawRecord;\n }\n\n const { pageInput: resolvedPageInput, navigationOptions: resolvedNavigationOptions } = this._getFormParameters('create', {\n pageInput,\n navigationOptions: this._getFormNavigationOptions()\n });\n const navigateToResult = await Xrm.Navigation.navigateTo(resolvedPageInput, resolvedNavigationOptions);\n if (navigateToResult.savedEntityReference) {\n const entityReference = Sanitizer.Lookup.getEntityReference(navigateToResult.savedEntityReference[0]);\n await window.Xrm.WebApi.updateRecord(this._entityName, entityReference.id.guid, payload);\n const rawRecord = (await this.onGetRawRecords([entityReference.id.guid]))[0];\n return rawRecord;\n }\n else {\n return null;\n }\n }\n\n public async onDeleteTasks(taskIds: string[]): Promise<IDeleteTasksResult | null> {\n const allTaskIds: Set<string> = new Set(taskIds);\n let success = true;\n const notDeletableTaskIds: string[] = [];\n if (this._isCascadeDeleteEnabled) {\n for (const taskId of taskIds) {\n const children = this._taskTree.getNode(taskId)?.allChildren.map(c => c.getRecordId()) ?? [];\n children.map(id => allTaskIds.add(id));\n }\n }\n if (!this._isDeletingTasksWithChildrenEnabled) {\n for (const taskId of allTaskIds) {\n if (this._taskTree.hasChildren(taskId)) {\n success = false;\n allTaskIds.delete(taskId);\n notDeletableTaskIds.push(taskId);\n }\n }\n }\n const result = await this._fetchXmlDataProvider.deleteRecords([...allTaskIds]);\n return {\n success: result.success && success,\n deletedTaskIds: [...allTaskIds],\n errors: [...result.results.filter(result => !result.success).map(result => {\n return {\n id: result.recordId,\n error: result.errorMessage\n }\n }), ...notDeletableTaskIds.map(id => {\n return {\n id,\n //TODO: localize\n error: 'Cannot delete task with children.'\n }\n })]\n }\n }\n public onCreateTemplateFromTask(taskId: string): Promise<IRawRecord | null> {\n throw new Error(\"Method not implemented.\");\n }\n public onCreateTasksFromTemplate(templateId: string, parentTaskId?: string): Promise<IRawRecord[] | null> {\n throw new Error(\"Method not implemented.\");\n }\n public async onOpenDatasetItems(entityReferences: ComponentFramework.EntityReference[], isTaskEntity: boolean): Promise<IOpenDatasetItemsResult | null> {\n if (!isTaskEntity) {\n // Navigate to related entity (lookup target)\n const { pageInput, navigationOptions } = this._getFormParameters('open', {\n pageInput: {\n pageType: 'entityrecord',\n entityName: entityReferences[0].etn!,\n entityId: entityReferences[0].id.guid,\n },\n navigationOptions: this._getFormNavigationOptions()\n });\n await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);\n return null;\n }\n if (entityReferences.length === 1) {\n const rawRecord = await this._editSingleTask(entityReferences[0].id.guid);\n if (!rawRecord) return null;\n return { success: true, updatedRecords: [rawRecord] };\n }\n const result = await this._editMultipleTasks(entityReferences.map(ref => ref.id.guid));\n return result;\n }\n public async onMoveTask(movingTaskId: string, movingToTaskId: string, position: \"above\" | \"below\" | \"child\"): Promise<IRawRecord[] | null> {\n const movingToRecord = this._provider.getRecordsMap()[movingToTaskId];\n let payload: { [key: string]: any } = {};\n if (position === 'child') {\n //change parent\n payload[`${await this._getNavigationalPropertyName(this._entityName, this._getFieldMapping().parentId)}@odata.bind`] = `/${this._entitySetName}(${movingToTaskId})`;\n const firstChild = this._taskTree.getNode(movingToTaskId).directChildren\n .find(c => c.getRecordId() !== movingTaskId);\n if (firstChild) {\n //change stack rank to be before first child\n payload[`${this._getFieldMapping().stackRank}`] = await this._updateStackRank({ recordId: movingTaskId, previousTaskId: undefined, nextTaskId: firstChild.getRecordId(), skipSave: true });\n }\n await window.Xrm.WebApi.updateRecord(this._entityName, movingTaskId, payload);\n const rawRecord = (await this.onGetRawRecords([movingTaskId]))[0];\n return [rawRecord];\n }\n else {\n const movingToRecordParent = this._taskTree.getNodeMap().get(movingToRecord.getRecordId())?.parent;\n payload[`${await this._getNavigationalPropertyName(this._entityName, this._getFieldMapping().parentId)}@odata.bind`] = movingToRecordParent ? `/${this._entitySetName}(${movingToRecordParent.getRecordId()})` : null;\n\n const movingToRecordNode = this._taskTree.getNodeMap().get(movingToRecord.getRecordId())!;\n const siblings = this._taskTree.getNodeMap().get(movingToRecordParent?.getRecordId() ?? null as any)?.directChildren ?? [];\n\n let prevSiblingId: string | undefined;\n let nextSiblingId: string | undefined;\n if (position === 'above') {\n prevSiblingId = siblings[movingToRecordNode.index - 1]?.getRecordId();\n nextSiblingId = movingToRecord.getRecordId();\n } else {\n prevSiblingId = movingToRecord.getRecordId();\n nextSiblingId = siblings[movingToRecordNode.index + 1]?.getRecordId();\n }\n payload[`${this._getFieldMapping().stackRank}`] = await this._updateStackRank({ recordId: movingTaskId, previousTaskId: prevSiblingId, nextTaskId: nextSiblingId, skipSave: true });\n await window.Xrm.WebApi.updateRecord(this._entityName, movingTaskId, payload);\n const rawRecord = (await this.onGetRawRecords([movingTaskId]))[0];\n return [rawRecord];\n }\n }\n\n /**\n * Saves a single dirty field on a task record.\n * Lookup-many fields are persisted through their dedicated {@link LookupManyHandler}; all other fields use the standard FetchXML provider save path.\n * TaskGrid uses auto-save, so exactly one dirty field is expected per call.\n */\n public async onRecordSave(record: IRecord): Promise<IRecordSaveOperationResult> {\n const dirtyField = record.getFields().find(field => field.isDirty());\n const column = dirtyField?.getColumn();\n if (column?.metadata?.LookupMany) {\n const handler = this._getLookupManyHandlerForColumn(column.name);\n return handler.saveRecord(record, column.name);\n }\n else if (column?.name.endsWith(DatasetConstants.CUSTOM_COLUMN_NAME_SUFFIX)) {\n return this._customColumnsDataProvider!.saveValue(record.getRecordId(), column, dirtyField?.getValue());\n }\n else {\n return (<FetchXmlDataProvider>this._fetchXmlDataProvider).onRecordSave(record);\n }\n }\n\n /** Returns `true` when the task's `stateCode` attribute equals `0` (active). */\n public onIsRecordActive(recordId: string): boolean {\n const record = this._provider.getRecordsMap()[recordId];\n return record.getValue(this._provider.getNativeColumns().stateCode) == 0;\n }\n\n\n /** Returns the root task ID used to scope the displayed hierarchy. */\n public onGetRootTaskId?(): string | undefined {\n return this._rootTaskId;\n }\n\n private async _getNavigationalPropertyName(referencedEntityName: string, referencingAttribute: string): Promise<string> {\n const metadata: any = await window.Xrm.Utility.getEntityMetadata(this._entityName);\n const relationship = metadata.ManyToOneRelationships.getAll().find((rel: any) =>\n rel.ReferencedEntity === referencedEntityName &&\n rel.ReferencingAttribute === referencingAttribute\n );\n if (!relationship) {\n throw new Error(`Could not find many-to-one relationship targeting ${referencedEntityName} on ${metadata.LogicalName}`);\n }\n return relationship.ReferencingEntityNavigationPropertyName;\n }\n\n private _getFormNavigationOptions(): Xrm.Navigation.NavigationOptions {\n return {\n target: 2,\n width: { value: 80, unit: '%' },\n position: 1,\n };\n }\n\n private _getLookupManyHandlerForColumn(colName: string): LookupManyHandler {\n const handler = this._lookupManyHandlers[colName];\n if (!handler) {\n throw new Error(`No LookupManyHandler found for column ${colName}`);\n }\n return handler;\n }\n\n private async _editSingleTask(recordId: string): Promise<IRawRecord | null> {\n const { pageInput, navigationOptions } = this._getFormParameters('edit', {\n pageInput: {\n pageType: 'entityrecord',\n entityName: this._entityName,\n entityId: recordId,\n formId: this._editFormId,\n data: {\n isEditingEnabled: this._isEditingEnabled\n }\n },\n navigationOptions: this._getFormNavigationOptions()\n })\n\n await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);\n const result = await this.onGetRawRecords([recordId]);\n return result[0];\n }\n\n private async _editMultipleTasks(recordIds: string[]): Promise<IOpenDatasetItemsResult | null> {\n const { pageInput, navigationOptions } = this._getFormParameters('bulkEdit', {\n //@ts-ignore - not documented, passing of record id array is possible in Power Apps - https://butenko.pro/2021/10/14/howto-open-bulk-editing-of-records-using-xrm-navigation-navigateto/\n pageInput: {\n //@ts-ignore - typings\n pageType: 'bulkedit',\n entityName: this._entityName,\n entityIds: recordIds,\n formId: this._bulkEditFormId\n },\n navigationOptions: {\n target: 2,\n position: 2,\n }\n });\n await window.Xrm.Navigation.navigateTo(pageInput, navigationOptions);\n const rawRecords = await this.onGetRawRecords(recordIds);\n return { success: true, updatedRecords: rawRecords };\n }\n\n private async _updateStackRank(params: { recordId?: string, previousTaskId?: string, nextTaskId?: string; skipSave?: boolean }): Promise<string> {\n const stackRankCol = this._getFieldMapping().stackRank;\n const rawDataMap = this._provider.getRawDataMap();\n\n const prevRankStr = params.previousTaskId ? (rawDataMap[params.previousTaskId]?.[stackRankCol] as string) : undefined;\n const nextRankStr = params.nextTaskId ? (rawDataMap[params.nextTaskId]?.[stackRankCol] as string) : undefined;\n\n let newRank: string;\n if (prevRankStr && nextRankStr) {\n newRank = LexoRank.parse(prevRankStr).between(LexoRank.parse(nextRankStr)).format();\n } else if (nextRankStr) {\n newRank = LexoRank.parse(nextRankStr).genPrev().format();\n } else if (prevRankStr) {\n newRank = LexoRank.parse(prevRankStr).genNext().format();\n } else {\n newRank = LexoRank.middle().format();\n }\n if (!params.skipSave && params.recordId) {\n await window.Xrm.WebApi.updateRecord(this._entityName, params.recordId, {\n [stackRankCol]: newRank\n });\n }\n return newRank;\n }\n\n}"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,5 @@ export { DataverseTaskStrategy } from './DataverseTaskStrategy.js';
|
|
|
2
2
|
export { DataverseTaskGridDescriptor } from './DataverseTaskGridDescriptor.js';
|
|
3
3
|
export { DataverseGridCustomizerStrategy } from './DataverseGridCustomizerStrategy.js';
|
|
4
4
|
export { DataverseSavedQueryStrategy } from './DataverseSavedQueryStrategy.js';
|
|
5
|
-
export { ATTRIBUTE_DEFINITION_ENTITY_NAME, ATTRIBUTE_VALUE_ENTITY_NAME,
|
|
5
|
+
export { ATTRIBUTE_DEFINITION_ENTITY_NAME, ATTRIBUTE_VALUE_ENTITY_NAME, DataverseCustomColumnsStrategy } from './DataverseCustomColumnsStrategy.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
/// <reference types="@types/xrm" />
|
|
1
2
|
import { IRecord, IRecordSaveOperationResult } from "@talxis/client-libraries";
|
|
2
|
-
/** Suffix used for lookup-many task grid stub columns. */
|
|
3
|
-
export declare const LOOKUP_MANY_COLUMN_NAME_SUFFIX = "_stub";
|
|
4
3
|
/** Constructor parameters required to resolve relationship metadata. */
|
|
5
4
|
interface IManyToManyTestParams {
|
|
6
5
|
/** Parent entity navigation property name that identifies the relationship. */
|
|
7
6
|
navigationPropertyName: string;
|
|
8
7
|
/** Logical name of the source entity for association operations. */
|
|
9
8
|
entityName: string;
|
|
9
|
+
/** Optional custom intersection configuration for non-standard many-to-many persistence. */
|
|
10
|
+
customIntersection?: ICustomIntersection;
|
|
11
|
+
}
|
|
12
|
+
/** Custom intersection mapping used for manual association/disassociation. */
|
|
13
|
+
interface ICustomIntersection {
|
|
14
|
+
/** Navigation property name from intersection entity to related entity. */
|
|
15
|
+
referencingEntityNavigationPropertyName: string;
|
|
10
16
|
}
|
|
11
17
|
/** Contract for a lookup-many relationship handler. */
|
|
12
18
|
export interface ILookupManyHandler {
|
|
@@ -14,6 +20,9 @@ export interface ILookupManyHandler {
|
|
|
14
20
|
init(): Promise<void>;
|
|
15
21
|
/** Returns OData expand segment for the configured relationship. */
|
|
16
22
|
getExpand(select?: string): string;
|
|
23
|
+
isCustomIntersection(): boolean;
|
|
24
|
+
/** Returns cached metadata for the custom intersection entity. Throws if custom intersection is not configured or metadata is unavailable. */
|
|
25
|
+
getCustomIntersectionEntityMetadata: () => Xrm.Metadata.EntityMetadata;
|
|
17
26
|
/** Saves lookup-many association changes for a record. */
|
|
18
27
|
saveRecord(record: IRecord, lookupManyColName: string): Promise<IRecordSaveOperationResult>;
|
|
19
28
|
}
|
|
@@ -24,6 +33,8 @@ export interface ILookupManyHandler {
|
|
|
24
33
|
export declare class LookupManyHandler implements ILookupManyHandler {
|
|
25
34
|
private _relationship?;
|
|
26
35
|
private _initialized;
|
|
36
|
+
private _customIntersection?;
|
|
37
|
+
private _customIntersectionEntityMetadata?;
|
|
27
38
|
private _entityName;
|
|
28
39
|
private _navigationPropertyName;
|
|
29
40
|
constructor(params: IManyToManyTestParams);
|
|
@@ -34,6 +45,8 @@ export declare class LookupManyHandler implements ILookupManyHandler {
|
|
|
34
45
|
* @param select Optional comma-separated projection for expanded records.
|
|
35
46
|
*/
|
|
36
47
|
getExpand(select?: string): string;
|
|
48
|
+
isCustomIntersection(): boolean;
|
|
49
|
+
getCustomIntersectionEntityMetadata(): Xrm.Metadata.EntityMetadata;
|
|
37
50
|
/**
|
|
38
51
|
* Persists association changes by comparing current values with original values.
|
|
39
52
|
* @param record Record being saved.
|
|
@@ -43,6 +56,9 @@ export declare class LookupManyHandler implements ILookupManyHandler {
|
|
|
43
56
|
private _getRelationship;
|
|
44
57
|
private _fetchRelationship;
|
|
45
58
|
private _executeAssociation;
|
|
59
|
+
private _createCustomIntersectionRecord;
|
|
60
|
+
private _deleteCustomIntersectionRecord;
|
|
61
|
+
private _getCustomIntersection;
|
|
46
62
|
private _buildBaseRequest;
|
|
47
63
|
private _getRelatedEntityName;
|
|
48
64
|
}
|