@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.
Files changed (113) hide show
  1. package/dist/components/Grid/cells/cell/Cell.js +2 -6
  2. package/dist/components/Grid/cells/cell/Cell.js.map +1 -1
  3. package/dist/components/Grid/column-headers/column-header/ColumnHeader.js +1 -1
  4. package/dist/components/Grid/column-headers/column-header/ColumnHeader.js.map +1 -1
  5. package/dist/components/Grid/grid/ag-grid/AgGridModel.js +1 -1
  6. package/dist/components/Grid/grid/ag-grid/AgGridModel.js.map +1 -1
  7. package/dist/components/Lookup/components/TargetSelector.js +1 -1
  8. package/dist/components/Lookup/components/TargetSelector.js.map +1 -1
  9. package/dist/components/Lookup/hooks/useLookup.d.ts +4 -0
  10. package/dist/components/Lookup/translations.d.ts +4 -0
  11. package/dist/components/Lookup/translations.js +4 -0
  12. package/dist/components/Lookup/translations.js.map +1 -1
  13. package/dist/components/TaskGrid/TaskGrid.js +2 -2
  14. package/dist/components/TaskGrid/TaskGrid.js.map +1 -1
  15. package/dist/components/TaskGrid/TaskGridDatasetControl.d.ts +2 -0
  16. package/dist/components/TaskGrid/TaskGridDatasetControl.js +42 -28
  17. package/dist/components/TaskGrid/TaskGridDatasetControl.js.map +1 -1
  18. package/dist/components/TaskGrid/TaskGridDatasetControlFactory.js +3 -0
  19. package/dist/components/TaskGrid/TaskGridDatasetControlFactory.js.map +1 -1
  20. package/dist/components/TaskGrid/components/grid/cell-renderers/lookup-many/LookupManyCellRenderer.js +6 -3
  21. package/dist/components/TaskGrid/components/grid/cell-renderers/lookup-many/LookupManyCellRenderer.js.map +1 -1
  22. package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/PercentComplete.js +2 -4
  23. package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/PercentComplete.js.map +1 -1
  24. package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/styles.d.ts +0 -6
  25. package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/styles.js +0 -6
  26. package/dist/components/TaskGrid/components/grid/cell-renderers/percent-complete/styles.js.map +1 -1
  27. package/dist/components/TaskGrid/components/grid/grid-customizer/GridCustomizer.js +10 -5
  28. package/dist/components/TaskGrid/components/grid/grid-customizer/GridCustomizer.js.map +1 -1
  29. package/dist/components/TaskGrid/components/grid/group-cell/styles.d.ts +3 -0
  30. package/dist/components/TaskGrid/components/grid/group-cell/styles.js +3 -0
  31. package/dist/components/TaskGrid/components/grid/group-cell/styles.js.map +1 -1
  32. package/dist/components/TaskGrid/components/grid/lookup-many/LookupMany.d.ts +1 -1
  33. package/dist/components/TaskGrid/components/grid/lookup-many/LookupMany.js +3 -1
  34. package/dist/components/TaskGrid/components/grid/lookup-many/LookupMany.js.map +1 -1
  35. package/dist/components/TaskGrid/components/grid/lookup-many/colorful-lookup-many/components/index.d.ts +1 -1
  36. package/dist/components/TaskGrid/components/grid/lookup-many/colorful-lookup-many/components/index.js +1 -1
  37. package/dist/components/TaskGrid/components/grid/lookup-many/colorful-lookup-many/components/index.js.map +1 -1
  38. package/dist/components/TaskGrid/components/grid/lookup-many/components/components.d.ts +11 -0
  39. package/dist/components/TaskGrid/components/grid/lookup-many/components/components.js +17 -0
  40. package/dist/components/TaskGrid/components/grid/lookup-many/components/components.js.map +1 -0
  41. package/dist/components/TaskGrid/components/grid/lookup-many/components/index.d.ts +1 -10
  42. package/dist/components/TaskGrid/components/grid/lookup-many/components/index.js +1 -14
  43. package/dist/components/TaskGrid/components/grid/lookup-many/components/index.js.map +1 -1
  44. package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/Menu.d.ts +3 -0
  45. package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/Menu.js +10 -0
  46. package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/Menu.js.map +1 -0
  47. package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/index.d.ts +1 -0
  48. package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/index.js +2 -0
  49. package/dist/components/TaskGrid/components/grid/lookup-many/components/menu/index.js.map +1 -0
  50. package/dist/components/TaskGrid/components/grid/lookup-many/components/multi-value-container/MultiValueContainer.d.ts +5 -1
  51. package/dist/components/TaskGrid/components/grid/lookup-many/components/multi-value-container/MultiValueContainer.js +3 -2
  52. package/dist/components/TaskGrid/components/grid/lookup-many/components/multi-value-container/MultiValueContainer.js.map +1 -1
  53. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/PeopleLookupMany.js +1 -1
  54. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/PeopleLookupMany.js.map +1 -1
  55. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/components.d.ts +2 -0
  56. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/components.js +15 -0
  57. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/components.js.map +1 -0
  58. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/index.d.ts +1 -2
  59. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/index.js +1 -12
  60. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/index.js.map +1 -1
  61. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/MultiValueContainer.d.ts +3 -0
  62. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/MultiValueContainer.js +12 -0
  63. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/MultiValueContainer.js.map +1 -0
  64. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/index.d.ts +1 -0
  65. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/index.js +2 -0
  66. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/index.js.map +1 -0
  67. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/styles.d.ts +9 -0
  68. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/styles.js +18 -0
  69. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-container/styles.js.map +1 -0
  70. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-label/MultiValueLabel.js +1 -1
  71. package/dist/components/TaskGrid/components/grid/lookup-many/people-lookup-many/components/multi-value-label/MultiValueLabel.js.map +1 -1
  72. package/dist/components/TaskGrid/components/grid/multi-record-selector/components/multi-value-label/MultiValueLabel.d.ts +1 -1
  73. package/dist/components/TaskGrid/components/grid/multi-record-selector/components/multi-value-label/MultiValueLabel.js +3 -2
  74. package/dist/components/TaskGrid/components/grid/multi-record-selector/components/multi-value-label/MultiValueLabel.js.map +1 -1
  75. package/dist/components/TaskGrid/components/header/Header.d.ts +1 -1
  76. package/dist/components/TaskGrid/components/header/Header.js +58 -44
  77. package/dist/components/TaskGrid/components/header/Header.js.map +1 -1
  78. package/dist/components/TaskGrid/extensions/dataverse/DataverseCustomColumnsStrategy.d.ts +12 -6
  79. package/dist/components/TaskGrid/extensions/dataverse/DataverseCustomColumnsStrategy.js +23 -20
  80. package/dist/components/TaskGrid/extensions/dataverse/DataverseCustomColumnsStrategy.js.map +1 -1
  81. package/dist/components/TaskGrid/extensions/dataverse/DataverseGridCustomizerStrategy.d.ts +3 -3
  82. package/dist/components/TaskGrid/extensions/dataverse/DataverseGridCustomizerStrategy.js +4 -5
  83. package/dist/components/TaskGrid/extensions/dataverse/DataverseGridCustomizerStrategy.js.map +1 -1
  84. package/dist/components/TaskGrid/extensions/dataverse/DataverseSavedQueryStrategy.js +15 -15
  85. package/dist/components/TaskGrid/extensions/dataverse/DataverseSavedQueryStrategy.js.map +1 -1
  86. package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskGridDescriptor.d.ts +27 -25
  87. package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskGridDescriptor.js +68 -29
  88. package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskGridDescriptor.js.map +1 -1
  89. package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.d.ts +19 -17
  90. package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.js +119 -74
  91. package/dist/components/TaskGrid/extensions/dataverse/DataverseTaskStrategy.js.map +1 -1
  92. package/dist/components/TaskGrid/extensions/dataverse/index.js +1 -1
  93. package/dist/components/TaskGrid/extensions/dataverse/lookup-many/LookupManyHandler.d.ts +18 -2
  94. package/dist/components/TaskGrid/extensions/dataverse/lookup-many/LookupManyHandler.js +80 -17
  95. package/dist/components/TaskGrid/extensions/dataverse/lookup-many/LookupManyHandler.js.map +1 -1
  96. package/dist/components/TaskGrid/extensions/dataverse/lookup-many/cell-renderer/FetchXmlLookupManyCellRenderer.js +10 -4
  97. package/dist/components/TaskGrid/extensions/dataverse/lookup-many/cell-renderer/FetchXmlLookupManyCellRenderer.js.map +1 -1
  98. package/dist/components/TaskGrid/interfaces.d.ts +36 -22
  99. package/dist/components/TaskGrid/providers/custom-columns/CustomColumnsDataProvider.d.ts +7 -1
  100. package/dist/components/TaskGrid/providers/custom-columns/CustomColumnsDataProvider.js +3 -0
  101. package/dist/components/TaskGrid/providers/custom-columns/CustomColumnsDataProvider.js.map +1 -1
  102. package/dist/components/TaskGrid/providers/saved-query/SavedQueryDataProvider.d.ts +1 -1
  103. package/dist/components/TaskGrid/providers/saved-query/SavedQueryDataProvider.js +9 -26
  104. package/dist/components/TaskGrid/providers/saved-query/SavedQueryDataProvider.js.map +1 -1
  105. package/dist/components/TaskGrid/providers/task/TaskDataProvider.d.ts +13 -20
  106. package/dist/components/TaskGrid/providers/task/TaskDataProvider.js +30 -22
  107. package/dist/components/TaskGrid/providers/task/TaskDataProvider.js.map +1 -1
  108. package/dist/components/TaskGrid/providers/task/record-tree/RecordTree.d.ts +8 -0
  109. package/dist/components/TaskGrid/providers/task/record-tree/RecordTree.js.map +1 -1
  110. package/dist/index.d.ts +68 -42
  111. package/dist/utils/dataset/adapters/VirtualDatasetAdapter.js.map +1 -1
  112. package/package.json +4 -4
  113. 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, LOOKUP_MANY_COLUMN_NAME_SUFFIX } from './lookup-many/LookupManyHandler.js';
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._projectReference = params.projectReference;
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 = params.isInlineCreateEnabled ?? true;
28
- this._isEditingEnabled = params.isEditingEnabled ?? true;
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.formStrategy?.onGetFormParameters ?? ((operation, defaultParameters) => defaultParameters);
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.navigationPropertyName;
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
- const parts = [];
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
- parts.push(`$select=${select}`);
59
+ suffixParts.push(`$select=${select}`);
48
60
  if (expands.length > 0)
49
- parts.push(`$expand=${expands.join(',')}`);
50
- const query = `?$filter=Microsoft.Dynamics.CRM.In(PropertyName='${this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute}', PropertyValues=[${ids.map((id) => `'${id}'`).join(',')}])${parts.length > 0 ? `&${parts.join('&')}` : ''}`;
51
- records = await this._getRawRecordsByIds({ ids, query });
52
- if (this._lookupManyColumns.length > 0) {
53
- await Promise.all(records.map(record => this._harmonizeLookupManyData(record)));
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
- /** Returns the project entity reference resolved during `onInitialize`, or `null` when none was provided. */
58
- getProjectReference() {
59
- return this._projectReference ?? null;
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.navigationPropertyName;
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 metadata = await window.Xrm.Utility.getEntityMetadata(col.metadata?.Targets[0]);
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
- return {
102
+ let data = record;
103
+ if (referencingEntityNavigationPropertyName) {
104
+ data = record[referencingEntityNavigationPropertyName];
105
+ }
106
+ const result = {
75
107
  id: {
76
- guid: record[metadata.PrimaryIdAttribute]
108
+ guid: data[primaryIdAttribute]
77
109
  },
78
- name: record[metadata.PrimaryNameAttribute],
79
- etn: metadata.LogicalName,
80
- rawData: record
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, query } = params;
125
+ const { ids, querySuffix = '' } = params;
88
126
  let currentBatch = [];
89
127
  for (const [i, taskId] of Object.entries(ids)) {
90
- if (currentBatch.length <= maxIdsPerRequest) {
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 enrichedData = await this.onGetRawRecords(this._fetchXmlDataProvider.getSortedRecordIds(), this._fetchXmlDataProvider.getMetadata().PrimaryIdAttribute);
125
- const finalRawData = fetchXmlProviderData.map((record, i) => {
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
- ...enrichedData[i],
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 this._fetchXmlDataProvider.getColumns().filter(col => col.name.endsWith(LOOKUP_MANY_COLUMN_NAME_SUFFIX)).map(col => {
142
- return {
143
- ...col,
144
- navigationPropertyName: col.name.replace(LOOKUP_MANY_COLUMN_NAME_SUFFIX, '')
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.name.endsWith(LOOKUP_MANY_COLUMN_NAME_SUFFIX)) {
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
- projectId: this._projectReference?.id.guid,
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 onEditTasks(taskIds) {
279
- if (taskIds.length === 1) {
280
- const result = await this._editSingleTask(taskIds[0]);
281
- if (!result)
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
- return this._editMultipleTasks(taskIds);
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
- if (dirtyField?.getColumn().name.endsWith(LOOKUP_MANY_COLUMN_NAME_SUFFIX)) {
335
- const handler = this._getLookupManyHandlerForColumn(dirtyField.getColumn().name);
336
- return handler.saveRecord(record, dirtyField.getColumn().name);
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
- /** Opens the task record in a side dialog. When `context.columnName` is a lookup-many column, the dialog is focused on that column. */
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, CUSTOM_COLUMNS_REFERENED_ENTITY_NAVIGATION_NAME, DataverseCustomColumnsStrategy } from './DataverseCustomColumnsStrategy.js';
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
  }