udp-stencil-component-library 26.2.0-beta.0 → 26.2.0-beta.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 (53) hide show
  1. package/dist/cjs/{SearchBuilder-BsB_257b.js → SearchBuilder-aqpLQz8E.js} +4 -0
  2. package/dist/cjs/ag-grid-base_63.cjs.entry.js +40 -13
  3. package/dist/cjs/api-method-instance-grid.cjs.entry.js +7 -2
  4. package/dist/cjs/{apiMethodInstance-B_zfUIFl.js → apiMethodInstance-DymTfku4.js} +1 -1
  5. package/dist/cjs/{configureUdpColumnMods-MGNO-bXn.js → configureUdpColumnMods-DtsJ11YI.js} +17 -2
  6. package/dist/cjs/index.cjs.js +4 -3
  7. package/dist/cjs/lookupHelper-fokGJbeb.js +86 -0
  8. package/dist/cjs/resource-timeline-calendar.cjs.entry.js +14 -2
  9. package/dist/cjs/resource-timeline-primary-bar.cjs.entry.js +5 -1
  10. package/dist/cjs/search-method-grid.cjs.entry.js +2 -69
  11. package/dist/cjs/udp-forms-renderer.cjs.entry.js +1 -1
  12. package/dist/collection/components/grid/new-grid/gridFunctions/savedViews.js +33 -6
  13. package/dist/collection/components/grid/new-grid/helperFunctions/configureUdpColumnMods.js +16 -2
  14. package/dist/collection/components/grid/new-grid/helperFunctions/lookupHelper.js +54 -47
  15. package/dist/collection/components/grid/resource-timeline-calendar/resource-timeline-calendar.js +14 -2
  16. package/dist/collection/components/grid/resource-timeline-calendar/resource-timeline-primary-bar.js +5 -1
  17. package/dist/collection/udp-utilities/search/SearchBuilder.js +4 -0
  18. package/dist/components/SearchBuilder.js +1 -1
  19. package/dist/components/ag-grid-base2.js +1 -1
  20. package/dist/components/configureUdpColumnMods.js +1 -1
  21. package/dist/components/resource-timeline-calendar.js +1 -1
  22. package/dist/components/resource-timeline-primary-bar2.js +1 -1
  23. package/dist/components/search-method-grid2.js +1 -1
  24. package/dist/docs.json +8 -1
  25. package/dist/esm/{SearchBuilder-CiCHnrfs.js → SearchBuilder-DlL9u8ku.js} +4 -0
  26. package/dist/esm/ag-grid-base_63.entry.js +35 -8
  27. package/dist/esm/api-method-instance-grid.entry.js +7 -2
  28. package/dist/esm/{apiMethodInstance-WU8uISWJ.js → apiMethodInstance-BVrO2muA.js} +1 -1
  29. package/dist/esm/{configureUdpColumnMods-UsX5iItH.js → configureUdpColumnMods-CKOL0XD9.js} +17 -2
  30. package/dist/esm/index.js +4 -3
  31. package/dist/esm/lookupHelper-C0n7Ube1.js +81 -0
  32. package/dist/esm/resource-timeline-calendar.entry.js +14 -2
  33. package/dist/esm/resource-timeline-primary-bar.entry.js +5 -1
  34. package/dist/esm/search-method-grid.entry.js +2 -69
  35. package/dist/esm/udp-forms-renderer.entry.js +1 -1
  36. package/dist/stencil-library/{SearchBuilder-CiCHnrfs.js → SearchBuilder-DlL9u8ku.js} +1 -1
  37. package/dist/stencil-library/ag-grid-base_63.entry.js +1 -1
  38. package/dist/stencil-library/api-method-instance-grid.entry.js +1 -1
  39. package/dist/stencil-library/{apiMethodInstance-WU8uISWJ.js → apiMethodInstance-BVrO2muA.js} +1 -1
  40. package/dist/stencil-library/configureUdpColumnMods-CKOL0XD9.js +1 -0
  41. package/dist/stencil-library/index.esm.js +1 -1
  42. package/dist/stencil-library/lookupHelper-C0n7Ube1.js +1 -0
  43. package/dist/stencil-library/resource-timeline-calendar.entry.js +1 -1
  44. package/dist/stencil-library/resource-timeline-primary-bar.entry.js +1 -1
  45. package/dist/stencil-library/search-method-grid.entry.js +1 -1
  46. package/dist/stencil-library/udp-forms-renderer.entry.js +1 -1
  47. package/dist/types/components/grid/new-grid/gridFunctions/savedViews.d.ts +2 -0
  48. package/dist/types/components/grid/new-grid/helperFunctions/lookupHelper.d.ts +7 -0
  49. package/package.json +1 -1
  50. package/dist/cjs/getCurrentApiCatalogId-D7xHCEzs.js +0 -7
  51. package/dist/esm/getCurrentApiCatalogId-DeurXd9l.js +0 -5
  52. package/dist/stencil-library/configureUdpColumnMods-UsX5iItH.js +0 -1
  53. package/dist/stencil-library/getCurrentApiCatalogId-DeurXd9l.js +0 -1
@@ -309,6 +309,10 @@ class SearchUtilities {
309
309
  if (!validation.isValid) {
310
310
  throw new Error(`Invalid search: ${validation.errors.join(', ')}`);
311
311
  }
312
+ // Wait for ConfigService to be initialized — callers may invoke this from
313
+ // top-level effects that mount before the app sets PRODUCT_API_DOMAIN,
314
+ // which would otherwise produce a relative URL and fail the request.
315
+ await configService.ConfigService.waitForConfig();
312
316
  // Build the API URL
313
317
  const url = `${configService.ConfigService.productV1ApiUrl}/${tableName}/search`;
314
318
  // Execute the search
@@ -3,10 +3,10 @@
3
3
  var index = require('./index-G1ccGqOs.js');
4
4
  var agGridEnterpriseV33 = require('ag-grid-enterprise-v33');
5
5
  var apiUtils = require('./apiUtils-ELzOoTQ0.js');
6
- var getCurrentApiCatalogId = require('./getCurrentApiCatalogId-D7xHCEzs.js');
6
+ var lookupHelper = require('./lookupHelper-fokGJbeb.js');
7
7
  var tenantUtils = require('./tenantUtils-BCKSE0vq.js');
8
8
  var statusRenderer = require('./status-renderer-9CQ-hhq8.js');
9
- var configureUdpColumnMods = require('./configureUdpColumnMods-MGNO-bXn.js');
9
+ var configureUdpColumnMods = require('./configureUdpColumnMods-DtsJ11YI.js');
10
10
  var lodashEs = require('lodash-es');
11
11
  var makeApiCall = require('./makeApiCall-CFfg9gI0.js');
12
12
  var configService = require('./configService-BqiLnW8G.js');
@@ -291,10 +291,15 @@ class SavedViews {
291
291
  var _a;
292
292
  if (!this.baseColumnState)
293
293
  return;
294
- const currentColIds = ((_a = this.api.getColumnState()) !== null && _a !== void 0 ? _a : []).map(c => c.colId).join(',');
295
- const baseColIds = JSON.parse(this.baseColumnState)
294
+ // Compare only primary (user-defined) colIds pivot result columns regenerate
295
+ // from filtered data and shouldn't be treated as external column-def updates.
296
+ const primaryColIds = this.getPrimaryColIds();
297
+ const collectColIds = (state) => state
298
+ .filter(c => primaryColIds.has(c.colId))
296
299
  .map(c => c.colId)
297
300
  .join(',');
301
+ const currentColIds = collectColIds((_a = this.api.getColumnState()) !== null && _a !== void 0 ? _a : []);
302
+ const baseColIds = collectColIds(JSON.parse(this.baseColumnState));
298
303
  if (currentColIds !== baseColIds) {
299
304
  this.baseColumnState = JSON.stringify(this.api.getColumnState());
300
305
  if (this.isDirty) {
@@ -350,8 +355,26 @@ class SavedViews {
350
355
  this.saveCurrentStateToLocalStorage();
351
356
  });
352
357
  };
358
+ // Returns the set of colIds for primary (user-defined) columns. Pivot result
359
+ // columns are secondary and excluded — they regenerate from filtered data and
360
+ // would cause spurious dirty diffs.
361
+ this.getPrimaryColIds = () => {
362
+ var _a;
363
+ return new Set(((_a = this.api.getColumns()) !== null && _a !== void 0 ? _a : [])
364
+ .filter(c => c.isPrimary())
365
+ .map(c => c.getColId()));
366
+ };
367
+ // Serializes column state to a JSON string filtered to primary columns only.
368
+ // Using a positive include filter (vs. excluding pivot result ids) keeps the
369
+ // comparison symmetric across snapshots — stale pivot ids in older baselines
370
+ // get dropped automatically because they aren't in the current primary set.
371
+ this.serializeUserColumnState = (state) => {
372
+ const primaryColIds = this.getPrimaryColIds();
373
+ return JSON.stringify(state.filter(c => primaryColIds.has(c.colId)));
374
+ };
353
375
  // Compare current grid state against snapshot (view active) or default empty state (no view)
354
376
  this.checkIfDirty = () => {
377
+ var _a, _b;
355
378
  // Skip during initial setup — baseline will be recaptured after parent
356
379
  // gridReady handlers (e.g. search-method-grid) finish applying state.
357
380
  if (this.baselineRecaptureId !== null)
@@ -359,18 +382,22 @@ class SavedViews {
359
382
  let dirty;
360
383
  if (this.activeViewId && this.activeViewState) {
361
384
  // Named view active: compare against the snapshot taken when the view was applied
362
- const currentColumnState = JSON.stringify(this.api.getColumnState());
385
+ const currentColumnState = this.serializeUserColumnState((_a = this.api.getColumnState()) !== null && _a !== void 0 ? _a : []);
386
+ const baseColumnState = this.serializeUserColumnState(JSON.parse(this.activeViewState.columnState));
363
387
  const currentFilterModel = JSON.stringify(this.api.getFilterModel());
364
388
  dirty =
365
- currentColumnState !== this.activeViewState.columnState ||
389
+ currentColumnState !== baseColumnState ||
366
390
  currentFilterModel !== this.activeViewState.filterModel;
367
391
  }
368
392
  else {
369
393
  // No view: dirty if there are any active filters or column state changes vs baseline
370
394
  const filterModel = this.api.getFilterModel();
371
395
  const hasFilters = Object.keys(filterModel !== null && filterModel !== void 0 ? filterModel : {}).length > 0;
372
- const columnState = this.api.getColumnState();
373
- const hasColumnChanges = this.baseColumnState !== null && JSON.stringify(columnState) !== this.baseColumnState;
396
+ const currentColumnState = this.serializeUserColumnState((_b = this.api.getColumnState()) !== null && _b !== void 0 ? _b : []);
397
+ const baseColumnState = this.baseColumnState !== null
398
+ ? this.serializeUserColumnState(JSON.parse(this.baseColumnState))
399
+ : null;
400
+ const hasColumnChanges = baseColumnState !== null && currentColumnState !== baseColumnState;
374
401
  dirty = hasFilters || hasColumnChanges;
375
402
  }
376
403
  if (dirty !== this.isDirty) {
@@ -624,7 +651,7 @@ class SavedViews {
624
651
  },
625
652
  ];
626
653
  try {
627
- await apiUtils.updateViewAndConfigurations(view.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, getCurrentApiCatalogId.getCurrentApiCatalogId(), view.name, saveState, view.isDefault ? 1 : 0, context === null || context === void 0 ? void 0 : context.entityName, (_a = view.gridViewVisibilityTypeId) !== null && _a !== void 0 ? _a : 1, () => null);
654
+ await apiUtils.updateViewAndConfigurations(view.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, lookupHelper.getCurrentApiCatalogId(), view.name, saveState, view.isDefault ? 1 : 0, context === null || context === void 0 ? void 0 : context.entityName, (_a = view.gridViewVisibilityTypeId) !== null && _a !== void 0 ? _a : 1, () => null);
628
655
  await this.fetchViews();
629
656
  const updated = this.filteredViews.find(v => v.gridViewId === view.gridViewId);
630
657
  if (updated)
@@ -786,7 +813,7 @@ class SavedViews {
786
813
  },
787
814
  ];
788
815
  try {
789
- await apiUtils.saveView(getUserId(), context === null || context === void 0 ? void 0 : context.gridId, getCurrentApiCatalogId.getCurrentApiCatalogId(), name, context === null || context === void 0 ? void 0 : context.entityName, saveState, visibilityTypeId, 0, // not set as default
816
+ await apiUtils.saveView(getUserId(), context === null || context === void 0 ? void 0 : context.gridId, lookupHelper.getCurrentApiCatalogId(), name, context === null || context === void 0 ? void 0 : context.entityName, saveState, visibilityTypeId, 0, // not set as default
790
817
  () => null);
791
818
  await this.fetchViews();
792
819
  const newView = this.filteredViews.find(v => v.name === name);
@@ -806,7 +833,7 @@ class SavedViews {
806
833
  this.refresh();
807
834
  const context = this.api.getGridOption('context');
808
835
  try {
809
- await apiUtils.updateView(view.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, getCurrentApiCatalogId.getCurrentApiCatalogId(), name, view.isDefault ? 1 : 0, context === null || context === void 0 ? void 0 : context.entityName, visibilityTypeId, () => null);
836
+ await apiUtils.updateView(view.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, lookupHelper.getCurrentApiCatalogId(), name, view.isDefault ? 1 : 0, context === null || context === void 0 ? void 0 : context.entityName, visibilityTypeId, () => null);
810
837
  await this.fetchViews();
811
838
  }
812
839
  catch (err) {
@@ -824,12 +851,12 @@ class SavedViews {
824
851
  const context = this.api.getGridOption('context');
825
852
  const isCurrentlyDefault = view.isDefault;
826
853
  try {
827
- await apiUtils.updateView(view.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, getCurrentApiCatalogId.getCurrentApiCatalogId(), view.name, isCurrentlyDefault ? 0 : 1, context === null || context === void 0 ? void 0 : context.entityName, (_a = view.gridViewVisibilityTypeId) !== null && _a !== void 0 ? _a : 1, () => null);
854
+ await apiUtils.updateView(view.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, lookupHelper.getCurrentApiCatalogId(), view.name, isCurrentlyDefault ? 0 : 1, context === null || context === void 0 ? void 0 : context.entityName, (_a = view.gridViewVisibilityTypeId) !== null && _a !== void 0 ? _a : 1, () => null);
828
855
  if (!isCurrentlyDefault) {
829
856
  // Unset the previous default if there was one
830
857
  const currentDefault = this.filteredViews.find(v => v.isDefault);
831
858
  if (currentDefault) {
832
- await apiUtils.updateView(currentDefault.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, getCurrentApiCatalogId.getCurrentApiCatalogId(), currentDefault.name, 0, context === null || context === void 0 ? void 0 : context.entityName, (_b = currentDefault.gridViewVisibilityTypeId) !== null && _b !== void 0 ? _b : 1, () => null).catch(err => console.log(err));
859
+ await apiUtils.updateView(currentDefault.gridViewId, getUserId(), context === null || context === void 0 ? void 0 : context.gridId, lookupHelper.getCurrentApiCatalogId(), currentDefault.name, 0, context === null || context === void 0 ? void 0 : context.entityName, (_b = currentDefault.gridViewVisibilityTypeId) !== null && _b !== void 0 ? _b : 1, () => null).catch(err => console.log(err));
833
860
  }
834
861
  }
835
862
  await this.fetchViews();
@@ -4,10 +4,15 @@ var index = require('./index-G1ccGqOs.js');
4
4
  var makeApiCall = require('./makeApiCall-CFfg9gI0.js');
5
5
  var searchObject = require('./searchObject-DeDFFGcx.js');
6
6
  var lodashEs = require('lodash-es');
7
- var apiMethodInstance = require('./apiMethodInstance-B_zfUIFl.js');
7
+ var apiMethodInstance = require('./apiMethodInstance-DymTfku4.js');
8
8
  var configService = require('./configService-BqiLnW8G.js');
9
9
  require('axios');
10
- require('./configureUdpColumnMods-MGNO-bXn.js');
10
+ require('./configureUdpColumnMods-DtsJ11YI.js');
11
+ require('./lookupHelper-fokGJbeb.js');
12
+ require('./apiUtils-ELzOoTQ0.js');
13
+ require('deep-equal');
14
+ require('@stencil/store');
15
+ require('./tenantUtils-BCKSE0vq.js');
11
16
 
12
17
  function mergeSearchObjects(baseSearchObject, searchObjectOverrides) {
13
18
  var _a, _b, _c, _d, _e, _f, _g;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var configureUdpColumnMods = require('./configureUdpColumnMods-MGNO-bXn.js');
3
+ var configureUdpColumnMods = require('./configureUdpColumnMods-DtsJ11YI.js');
4
4
 
5
5
  function mapDotNetTypeToAgGridType(type) {
6
6
  const normalized = type.replace(/\?$/, '').trim().toLowerCase();
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ var lookupHelper = require('./lookupHelper-fokGJbeb.js');
4
+
3
5
  /**
4
6
  * Finds an existing 'actions' column in an array of ColDefs and applies
5
7
  * a dynamic fixed width and right pinning.
@@ -28,9 +30,22 @@ function configureUdpColumnMods(columnDefs, disableColumnFiltering = false) {
28
30
  // Return a new object with the original properties plus our overrides
29
31
  return Object.assign(Object.assign({}, colDef), { pinned: 'right', width: calculatedWidth, minWidth: calculatedWidth, maxWidth: calculatedWidth, sortable: false, filter: false, suppressHeaderMenuButton: true, suppressMovable: true });
30
32
  }
31
- // If a column contains a lookup id, set a valuegetter on the column def and disable filtering and sorting
33
+ // Lookup columns: display the resolved label, but filter against the underlying key.
34
+ // The set filter values + dropdown labels come from the cached lookup table, so the
35
+ // filter model holds keys (server-side IN clause works unchanged). Sort is left off
36
+ // because the backend can only order by the stored key, not the resolved label.
32
37
  if ((_e = colDef === null || colDef === void 0 ? void 0 : colDef.context) === null || _e === void 0 ? void 0 : _e.lookupId) {
33
- return Object.assign(Object.assign({}, colDef), { valueGetter: (params) => params.data[(colDef === null || colDef === void 0 ? void 0 : colDef.field) + 'LookupValue'], filter: false, sortable: false });
38
+ const lookupId = colDef.context.lookupId;
39
+ const field = colDef.field;
40
+ return Object.assign(Object.assign({}, colDef), { valueGetter: (params) => params.data[field + 'LookupValue'], filterValueGetter: (params) => { var _a; return (_a = params.data) === null || _a === void 0 ? void 0 : _a[field]; }, filter: 'agSetColumnFilter', filterParams: Object.assign({ values: (params) => {
41
+ lookupHelper.getLookupTable(lookupId).then(table => {
42
+ params.success(Array.from(table.valueMap.keys()));
43
+ });
44
+ }, valueFormatter: (params) => {
45
+ var _a, _b;
46
+ const key = params.value == null ? '' : String(params.value);
47
+ return (_b = (_a = lookupHelper.getLookupTableSync(lookupId)) === null || _a === void 0 ? void 0 : _a.valueMap.get(key)) !== null && _b !== void 0 ? _b : key;
48
+ } }, colDef.filterParams), sortable: false });
34
49
  }
35
50
  if (disableColumnFiltering) {
36
51
  return Object.assign(Object.assign({}, colDef), { filter: false });
@@ -4,11 +4,11 @@ var formRegistry = require('./form-registry-Cme6U-bl.js');
4
4
  var axios = require('axios');
5
5
  var transformSearchData = require('./transformSearchData-B4bk4Aik.js');
6
6
  var catalogStore = require('./catalog-store-COlrLo9B.js');
7
- var SearchBuilder = require('./SearchBuilder-BsB_257b.js');
7
+ var SearchBuilder = require('./SearchBuilder-aqpLQz8E.js');
8
8
  var searchObject = require('./searchObject-DeDFFGcx.js');
9
9
  var catalogTree = require('./catalogTree-CnzW15ah.js');
10
10
  var configService = require('./configService-BqiLnW8G.js');
11
- var apiMethodInstance = require('./apiMethodInstance-B_zfUIFl.js');
11
+ var apiMethodInstance = require('./apiMethodInstance-DymTfku4.js');
12
12
  var webComponents = require('@fluentui/web-components');
13
13
  var tokens = require('@fluentui/tokens');
14
14
  var agGridEnterpriseV33 = require('ag-grid-enterprise-v33');
@@ -17,7 +17,8 @@ require('./apiUtils-ELzOoTQ0.js');
17
17
  require('deep-equal');
18
18
  require('./makeApiCall-CFfg9gI0.js');
19
19
  require('./tenantUtils-BCKSE0vq.js');
20
- require('./configureUdpColumnMods-MGNO-bXn.js');
20
+ require('./configureUdpColumnMods-DtsJ11YI.js');
21
+ require('./lookupHelper-fokGJbeb.js');
21
22
 
22
23
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
23
24
 
@@ -0,0 +1,86 @@
1
+ 'use strict';
2
+
3
+ var apiUtils = require('./apiUtils-ELzOoTQ0.js');
4
+
5
+ function getCurrentApiCatalogId() {
6
+ return sessionStorage.getItem('current-api-catalog-id');
7
+ }
8
+
9
+ const resolvedLookups = new Map();
10
+ const pendingLookups = new Map();
11
+ async function getLookupTable(lookupId) {
12
+ const cached = resolvedLookups.get(lookupId);
13
+ if (cached)
14
+ return cached;
15
+ const inFlight = pendingLookups.get(lookupId);
16
+ if (inFlight)
17
+ return inFlight;
18
+ const promise = (async () => {
19
+ var _a, _b;
20
+ const lookupApiMethodId = (_b = (_a = (await apiUtils.getPromotedLookupMethod(getCurrentApiCatalogId()))) === null || _a === void 0 ? void 0 : _a.unityBaseGetDataMethod) === null || _b === void 0 ? void 0 : _b.apiMethodId;
21
+ const empty = { keyName: '', valueName: '', valueMap: new Map() };
22
+ if (!lookupApiMethodId)
23
+ return empty;
24
+ try {
25
+ const response = await apiUtils.executeQueryWithParameters({ data: { id: lookupId } }, lookupApiMethodId);
26
+ const { keyName, valueName, data } = response !== null && response !== void 0 ? response : {};
27
+ if (!data || !keyName || !valueName)
28
+ return empty;
29
+ const valueMap = new Map(data.map((item) => [String(item[keyName]), item[valueName]]));
30
+ const table = { keyName, valueName, valueMap };
31
+ resolvedLookups.set(lookupId, table);
32
+ return table;
33
+ }
34
+ catch (_c) {
35
+ return empty;
36
+ }
37
+ finally {
38
+ pendingLookups.delete(lookupId);
39
+ }
40
+ })();
41
+ pendingLookups.set(lookupId, promise);
42
+ return promise;
43
+ }
44
+ function getLookupTableSync(lookupId) {
45
+ return resolvedLookups.get(lookupId);
46
+ }
47
+ async function processLookupsInData(rowData, columnDefs) {
48
+ if (!(rowData === null || rowData === void 0 ? void 0 : rowData.length)) {
49
+ return rowData;
50
+ }
51
+ const lookupsByField = new Map();
52
+ const uniqueLookupIds = new Set();
53
+ columnDefs.forEach(col => {
54
+ var _a;
55
+ const lookupId = (_a = col === null || col === void 0 ? void 0 : col.context) === null || _a === void 0 ? void 0 : _a.lookupId;
56
+ if (lookupId && typeof lookupId === 'string' && col.field) {
57
+ lookupsByField.set(col.field, lookupId);
58
+ uniqueLookupIds.add(lookupId);
59
+ }
60
+ });
61
+ if (uniqueLookupIds.size === 0) {
62
+ return rowData;
63
+ }
64
+ await Promise.all(Array.from(uniqueLookupIds).map(id => getLookupTable(id)));
65
+ return rowData.map(row => {
66
+ var _a;
67
+ const newRow = Object.assign({}, row);
68
+ for (const [field, lookupId] of lookupsByField.entries()) {
69
+ if (newRow[field] === null || newRow[field] === undefined)
70
+ continue;
71
+ const valueMap = (_a = resolvedLookups.get(lookupId)) === null || _a === void 0 ? void 0 : _a.valueMap;
72
+ if (!valueMap)
73
+ continue;
74
+ const key = String(newRow[field]);
75
+ if (valueMap.has(key)) {
76
+ newRow[field + 'LookupValue'] = valueMap.get(key);
77
+ }
78
+ }
79
+ return newRow;
80
+ });
81
+ }
82
+
83
+ exports.getCurrentApiCatalogId = getCurrentApiCatalogId;
84
+ exports.getLookupTable = getLookupTable;
85
+ exports.getLookupTableSync = getLookupTableSync;
86
+ exports.processLookupsInData = processLookupsInData;
@@ -106,6 +106,7 @@ const ResourceTimelineCalendar = class {
106
106
  field: this.dateKey,
107
107
  pivot: true,
108
108
  pivotComparator: this.dateCompare,
109
+ suppressFiltersToolPanel: true,
109
110
  valueGetter: params => {
110
111
  let dateString = '';
111
112
  if (this.convertDatesFromUTC) {
@@ -153,7 +154,7 @@ const ResourceTimelineCalendar = class {
153
154
  }
154
155
  render() {
155
156
  const todayString = new Date().toLocaleDateString('en-US');
156
- return (index.h("div", { key: '59969c807543a3d784c33d9daebfc13b595b1c57', class: "resource-timeline-calendar" }, index.h("resource-timeline-primary-bar", { key: '9291d971dab58ceda1831aa8bac8f5b3b7702609', gridBarTitle: this.gridBarTitle, subTitle: this.subTitle, primaryAction: this.primaryAction, secondaryAction: this.secondaryAction, clickBackward: this.handleClickBackward, clickForward: this.handleClickForward, clickToday: this.handleClickToday, subtitleStatus: this.subtitleStatus, subtitleStatusMappingClasses: this.subtitleStatusMappingClasses, disableHeaderActions: this.disableHeaderActions, showLockedIcon: this.showLockedIcon }, index.h("slot", { key: '8bbed2a4ebe80ca56f603f79d605aabc5f2ea7df', name: "inline", slot: "inline" })), index.h("client-side-grid", { key: 'ca2e71b84be0014e36eca1d5531e7346fcebfa72', rowData: this.filledRowData, columnDefs: this.formattedColumnDefs, gridFunctions: this.getGridFunctions(), gridId: this.gridId, gridOptions: Object.assign(Object.assign({}, this.additionalGridOptions), { components: {
157
+ return (index.h("div", { key: '92e721dafa80975ead78ed3e8fba36a65636a8d0', class: "resource-timeline-calendar" }, index.h("resource-timeline-primary-bar", { key: 'e17ff97f7069c5a057caad6168534738dbc79c53', gridBarTitle: this.gridBarTitle, subTitle: this.subTitle, primaryAction: this.primaryAction, secondaryAction: this.secondaryAction, clickBackward: this.handleClickBackward, clickForward: this.handleClickForward, clickToday: this.handleClickToday, subtitleStatus: this.subtitleStatus, subtitleStatusMappingClasses: this.subtitleStatusMappingClasses, disableHeaderActions: this.disableHeaderActions, showLockedIcon: this.showLockedIcon }, index.h("slot", { key: '4eb8edb054f962695c7b018508ea718d5bafec16', name: "inline", slot: "inline" })), index.h("client-side-grid", { key: '32bfe633f571dd7a47d773cff67042be5b6b19f0', rowData: this.filledRowData, columnDefs: this.formattedColumnDefs, gridFunctions: this.getGridFunctions(), gridId: this.gridId, gridOptions: Object.assign(Object.assign({}, this.additionalGridOptions), { components: {
157
158
  resourceTimelineCalendarHeader: ResourceTimelineColumnHeader,
158
159
  }, processPivotResultColDef: colDef => {
159
160
  colDef.suppressHeaderContextMenu = true;
@@ -196,7 +197,11 @@ const ResourceTimelineCalendar = class {
196
197
  return params.node.group &&
197
198
  ((_c = (_b = (_a = params.node.allLeafChildren) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.isDateRangePlaceholder) === true;
198
199
  },
199
- }, pivotMode: true, quickFilterMatcher: () => true, isExternalFilterPresent: () => this.externalFilterText.length > 0, doesExternalFilterPass: (node) => {
200
+ }, pivotMode: true,
201
+ // Placeholder rows anchor pivot date columns so all days remain visible
202
+ // regardless of filters. alwaysPassFilter exempts them from every filter
203
+ // type (column, quick, external, advanced) without per-filter wiring.
204
+ alwaysPassFilter: (node) => { var _a; return ((_a = node.data) === null || _a === void 0 ? void 0 : _a.isDateRangePlaceholder) === true; }, quickFilterMatcher: () => true, isExternalFilterPresent: () => this.externalFilterText.length > 0, doesExternalFilterPass: (node) => {
200
205
  var _a, _b;
201
206
  if ((_a = node.data) === null || _a === void 0 ? void 0 : _a.isDateRangePlaceholder)
202
207
  return true;
@@ -213,6 +218,13 @@ const ResourceTimelineCalendar = class {
213
218
  });
214
219
  }, removePivotHeaderRowWhenSingleValueColumn: true, suppressAggFuncInHeader: true, pivotRowTotals: 'after', suppressMovableColumns: true, enableStrictPivotColumnOrder: true, rowGroupPanelShow: this.rowGroupPanelShow, sideBar: {
215
220
  toolPanels: [
221
+ {
222
+ id: 'filters',
223
+ labelDefault: 'Filters',
224
+ labelKey: 'filters',
225
+ iconKey: 'filter',
226
+ toolPanel: 'agFiltersToolPanel',
227
+ },
216
228
  {
217
229
  id: 'columns',
218
230
  labelDefault: 'Columns',
@@ -28,7 +28,11 @@ const ResourceTimelinePrimaryBar = class {
28
28
  Object.assign(Object.assign({}, this.secondaryAction), { label: (_d = this.secondaryAction.label) !== null && _d !== void 0 ? _d : '', disabled: this.secondaryAction.disabled || this.disableHeaderActions }),
29
29
  ]
30
30
  : [];
31
- return (index.h("udp-primary-action-header", { key: 'f5edf0459f7e0f6136ed8e3056db4b788369164e', primaryAction: primaryAction, secondaryActions: secondaryActions }, index.h("span", { key: '4b539edaaa740cff41c3c4e1a8b6086d4f4c54df', slot: "title" }, this.gridBarTitle != null ? this.gridBarTitle : index.h("udp-skeleton-loading", { width: "200px" })), index.h("span", { key: '27488b2c8536a873ff3d764c7fa614be67234584', slot: "subtitle" }, this.subTitle != null ? this.subTitle : index.h("udp-skeleton-loading", { width: "200px" })), index.h("span", { key: '91c08beb6f4c0005deac47a4b3121a87d9f5bb42', slot: "inline", class: "inline-status" }, index.h("slot", { key: '742bfdeec6b4d4614d0b5a8fa69fd2153455a474', name: "inline" }), this.subtitleStatus && (index.h("udp-fluent-badge", { key: '8c756a76ef26680649e25ad83608dce20585d46d', appearance: "outline", color: chipToBadgeColor[this.subtitleStatusMappingClasses[this.subtitleStatus]] }, this.subtitleStatus)), this.showLockedIcon && (index.h("udp-fluent-icon-button", { key: 'b7f09706bea4222a3e256525c5fdea60a44fec2b', iconName: "lock", appearance: "outline", size: "small", disabled: true, ariaLabel: "Locked" }))), this.clickBackward && (index.h("div", { key: '16d0bdf33a99aa39fd468709f67cbf1425f80692', slot: "actions", class: "date-navigation" }, index.h("udp-fluent-icon-button", { key: 'd66bffe5781150e550640ef10ee286751b718a36', ariaLabel: "Previous period", iconName: "chevron-left", appearance: "subtle", shape: "rounded", disabled: this.disableHeaderActions, onClick: this.clickBackward }), this.clickToday && (index.h("udp-fluent-button", { key: 'a989e2beba6465be81c42adf2eb774b96160f774', appearance: "subtle", disabled: this.disableHeaderActions, onClick: this.clickToday }, "Today")), index.h("udp-fluent-icon-button", { key: '04fe9c2c84b7d1e976ec6c6aeee11939ddc14f8d', ariaLabel: "Next period", iconName: "chevron-right", appearance: "subtle", shape: "rounded", disabled: this.disableHeaderActions, onClick: this.clickForward })))));
31
+ return (index.h("udp-primary-action-header", { key: 'f5edf0459f7e0f6136ed8e3056db4b788369164e', primaryAction: primaryAction, secondaryActions: secondaryActions }, index.h("span", { key: '4b539edaaa740cff41c3c4e1a8b6086d4f4c54df', slot: "title" }, this.gridBarTitle != null
32
+ ? index.h("udp-text", { variant: "subtitle1", block: false }, this.gridBarTitle)
33
+ : index.h("udp-skeleton-loading", { width: "200px" })), index.h("span", { key: 'b3a30a27bc09da0ce1de25e667496120f937101c', slot: "subtitle" }, this.subTitle != null
34
+ ? index.h("udp-text", { variant: "caption1" }, this.subTitle)
35
+ : index.h("udp-skeleton-loading", { width: "200px" })), index.h("span", { key: '59002f25369250081912604674992da9bc1e3624', slot: "inline", class: "inline-status" }, index.h("slot", { key: '5c0e77c384f8c62a74072624666e968f0d3658bc', name: "inline" }), this.subtitleStatus && (index.h("udp-fluent-badge", { key: '9627a6c43500ee36edac9d577661559e82bf7370', appearance: "outline", color: chipToBadgeColor[this.subtitleStatusMappingClasses[this.subtitleStatus]] }, this.subtitleStatus)), this.showLockedIcon && (index.h("udp-fluent-icon-button", { key: '515c9aa4087d17d8c8152b9773b8cf9b54ad4ff3', iconName: "lock", appearance: "outline", size: "small", disabled: true, ariaLabel: "Locked" }))), this.clickBackward && (index.h("div", { key: '0a999382c0ce9c3f2bb865d0dba3f43af5e1f44e', slot: "actions", class: "date-navigation" }, index.h("udp-fluent-icon-button", { key: 'd20fd23cbc27ff99a2de9d106a05efcda45d9398', ariaLabel: "Previous period", iconName: "chevron-left", appearance: "subtle", shape: "rounded", disabled: this.disableHeaderActions, onClick: this.clickBackward }), this.clickToday && (index.h("udp-fluent-button", { key: 'a6b7cac7b5a97d4d137085d4ccfd5613242ed18d', appearance: "subtle", disabled: this.disableHeaderActions, onClick: this.clickToday }, "Today")), index.h("udp-fluent-icon-button", { key: 'a67cf5dd57057065f0a437cda062d6df24b0d953', ariaLabel: "Next period", iconName: "chevron-right", appearance: "subtle", shape: "rounded", disabled: this.disableHeaderActions, onClick: this.clickForward })))));
32
36
  }
33
37
  };
34
38
  ResourceTimelinePrimaryBar.style = resourceTimelinePrimaryBarCss();
@@ -3,7 +3,7 @@
3
3
  var index = require('./index-G1ccGqOs.js');
4
4
  var apiUtils = require('./apiUtils-ELzOoTQ0.js');
5
5
  var searchObject = require('./searchObject-DeDFFGcx.js');
6
- var getCurrentApiCatalogId = require('./getCurrentApiCatalogId-D7xHCEzs.js');
6
+ var lookupHelper = require('./lookupHelper-fokGJbeb.js');
7
7
  var makeApiCall = require('./makeApiCall-CFfg9gI0.js');
8
8
  var configService = require('./configService-BqiLnW8G.js');
9
9
  var isEqual = require('lodash-es/isEqual');
@@ -16,73 +16,6 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
17
17
  var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
18
18
 
19
- async function processLookupsInData(rowData, columnDefs) {
20
- var _a, _b;
21
- if (!(rowData === null || rowData === void 0 ? void 0 : rowData.length)) {
22
- return rowData;
23
- }
24
- // Step 1: Build a map of lookups needed (simpler now)
25
- const lookupsToFetch = new Map();
26
- columnDefs.forEach(col => {
27
- var _a;
28
- const lookupId = (_a = col === null || col === void 0 ? void 0 : col.context) === null || _a === void 0 ? void 0 : _a.lookupId;
29
- if (lookupId && typeof lookupId === 'string' && col.field) {
30
- const existing = lookupsToFetch.get(lookupId);
31
- if (existing) {
32
- // If this lookupId is already tracked, add the new field to its list
33
- existing.columnFields.push(col.field);
34
- }
35
- else {
36
- // Otherwise, create a new entry for this lookupId
37
- lookupsToFetch.set(lookupId, { columnFields: [col.field] });
38
- }
39
- }
40
- });
41
- if (lookupsToFetch.size === 0) {
42
- return rowData;
43
- }
44
- // Step 2: Fetch the method ID and then the lookup data
45
- const lookupApiMethodId = (_b = (_a = (await apiUtils.getPromotedLookupMethod(getCurrentApiCatalogId.getCurrentApiCatalogId()))) === null || _a === void 0 ? void 0 : _a.unityBaseGetDataMethod) === null || _b === void 0 ? void 0 : _b.apiMethodId;
46
- if (!lookupApiMethodId) {
47
- return rowData;
48
- }
49
- const lookupPromises = Array.from(lookupsToFetch.keys()).map(lookupId => {
50
- // 2. If not in cache, make the API call.
51
- return apiUtils.executeQueryWithParameters({ data: { id: lookupId } }, lookupApiMethodId)
52
- .then(response => {
53
- return Object.assign({ lookupId }, response);
54
- })
55
- .catch(() => ({ lookupId, data: [] }));
56
- });
57
- const lookupResults = await Promise.all(lookupPromises);
58
- // Step 3: Create a fast-access map using the keyName and valueName from the response
59
- const lookupsMap = new Map();
60
- lookupResults.forEach(result => {
61
- const config = lookupsToFetch.get(result.lookupId);
62
- const keyName = result.keyName;
63
- const valueName = result.valueName;
64
- if (result.data && keyName && valueName) {
65
- const valueMap = new Map(result.data.map(item => [String(item[keyName]), item[valueName]]));
66
- for (const field of config.columnFields) {
67
- lookupsMap.set(field, valueMap);
68
- }
69
- }
70
- });
71
- // Step 4: Map the original rowData (unchanged)
72
- return rowData.map(row => {
73
- const newRow = Object.assign({}, row);
74
- for (const [field, valueMap] of lookupsMap.entries()) {
75
- if (newRow[field] !== null && newRow[field] !== undefined) {
76
- const key = String(newRow[field]);
77
- if (valueMap.has(key)) {
78
- newRow[field + 'LookupValue'] = valueMap.get(key);
79
- }
80
- }
81
- }
82
- return newRow;
83
- });
84
- }
85
-
86
19
  const FilterOperators = {
87
20
  equals: searchObject.SearchOperators.EQUALS,
88
21
  contains: searchObject.SearchOperators.LIKE,
@@ -321,7 +254,7 @@ const createSearchMethodDataSource = (options) => {
321
254
  }
322
255
  else {
323
256
  const columnDefs = params.api.getColumnDefs();
324
- finalRowData = await processLookupsInData(response.pageList, columnDefs);
257
+ finalRowData = await lookupHelper.processLookupsInData(response.pageList, columnDefs);
325
258
  }
326
259
  params.success({
327
260
  rowData: finalRowData,
@@ -6,7 +6,7 @@ var udpFormApiUtils = require('./udp-form-api-utils-BcsAFM5r.js');
6
6
  var enums = require('./enums-7rWe0ofM.js');
7
7
  var utils = require('./utils-Bp02BX38.js');
8
8
  var makeApiCall = require('./makeApiCall-CFfg9gI0.js');
9
- var SearchBuilder = require('./SearchBuilder-BsB_257b.js');
9
+ var SearchBuilder = require('./SearchBuilder-aqpLQz8E.js');
10
10
  var searchObject = require('./searchObject-DeDFFGcx.js');
11
11
  var configService = require('./configService-BqiLnW8G.js');
12
12
  var uuid = require('uuid');
@@ -79,10 +79,15 @@ export class SavedViews {
79
79
  var _a;
80
80
  if (!this.baseColumnState)
81
81
  return;
82
- const currentColIds = ((_a = this.api.getColumnState()) !== null && _a !== void 0 ? _a : []).map(c => c.colId).join(',');
83
- const baseColIds = JSON.parse(this.baseColumnState)
82
+ // Compare only primary (user-defined) colIds pivot result columns regenerate
83
+ // from filtered data and shouldn't be treated as external column-def updates.
84
+ const primaryColIds = this.getPrimaryColIds();
85
+ const collectColIds = (state) => state
86
+ .filter(c => primaryColIds.has(c.colId))
84
87
  .map(c => c.colId)
85
88
  .join(',');
89
+ const currentColIds = collectColIds((_a = this.api.getColumnState()) !== null && _a !== void 0 ? _a : []);
90
+ const baseColIds = collectColIds(JSON.parse(this.baseColumnState));
86
91
  if (currentColIds !== baseColIds) {
87
92
  this.baseColumnState = JSON.stringify(this.api.getColumnState());
88
93
  if (this.isDirty) {
@@ -138,8 +143,26 @@ export class SavedViews {
138
143
  this.saveCurrentStateToLocalStorage();
139
144
  });
140
145
  };
146
+ // Returns the set of colIds for primary (user-defined) columns. Pivot result
147
+ // columns are secondary and excluded — they regenerate from filtered data and
148
+ // would cause spurious dirty diffs.
149
+ this.getPrimaryColIds = () => {
150
+ var _a;
151
+ return new Set(((_a = this.api.getColumns()) !== null && _a !== void 0 ? _a : [])
152
+ .filter(c => c.isPrimary())
153
+ .map(c => c.getColId()));
154
+ };
155
+ // Serializes column state to a JSON string filtered to primary columns only.
156
+ // Using a positive include filter (vs. excluding pivot result ids) keeps the
157
+ // comparison symmetric across snapshots — stale pivot ids in older baselines
158
+ // get dropped automatically because they aren't in the current primary set.
159
+ this.serializeUserColumnState = (state) => {
160
+ const primaryColIds = this.getPrimaryColIds();
161
+ return JSON.stringify(state.filter(c => primaryColIds.has(c.colId)));
162
+ };
141
163
  // Compare current grid state against snapshot (view active) or default empty state (no view)
142
164
  this.checkIfDirty = () => {
165
+ var _a, _b;
143
166
  // Skip during initial setup — baseline will be recaptured after parent
144
167
  // gridReady handlers (e.g. search-method-grid) finish applying state.
145
168
  if (this.baselineRecaptureId !== null)
@@ -147,18 +170,22 @@ export class SavedViews {
147
170
  let dirty;
148
171
  if (this.activeViewId && this.activeViewState) {
149
172
  // Named view active: compare against the snapshot taken when the view was applied
150
- const currentColumnState = JSON.stringify(this.api.getColumnState());
173
+ const currentColumnState = this.serializeUserColumnState((_a = this.api.getColumnState()) !== null && _a !== void 0 ? _a : []);
174
+ const baseColumnState = this.serializeUserColumnState(JSON.parse(this.activeViewState.columnState));
151
175
  const currentFilterModel = JSON.stringify(this.api.getFilterModel());
152
176
  dirty =
153
- currentColumnState !== this.activeViewState.columnState ||
177
+ currentColumnState !== baseColumnState ||
154
178
  currentFilterModel !== this.activeViewState.filterModel;
155
179
  }
156
180
  else {
157
181
  // No view: dirty if there are any active filters or column state changes vs baseline
158
182
  const filterModel = this.api.getFilterModel();
159
183
  const hasFilters = Object.keys(filterModel !== null && filterModel !== void 0 ? filterModel : {}).length > 0;
160
- const columnState = this.api.getColumnState();
161
- const hasColumnChanges = this.baseColumnState !== null && JSON.stringify(columnState) !== this.baseColumnState;
184
+ const currentColumnState = this.serializeUserColumnState((_b = this.api.getColumnState()) !== null && _b !== void 0 ? _b : []);
185
+ const baseColumnState = this.baseColumnState !== null
186
+ ? this.serializeUserColumnState(JSON.parse(this.baseColumnState))
187
+ : null;
188
+ const hasColumnChanges = baseColumnState !== null && currentColumnState !== baseColumnState;
162
189
  dirty = hasFilters || hasColumnChanges;
163
190
  }
164
191
  if (dirty !== this.isDirty) {
@@ -1,3 +1,4 @@
1
+ import { getLookupTable, getLookupTableSync } from "./lookupHelper";
1
2
  /**
2
3
  * Finds an existing 'actions' column in an array of ColDefs and applies
3
4
  * a dynamic fixed width and right pinning.
@@ -26,9 +27,22 @@ export function configureUdpColumnMods(columnDefs, disableColumnFiltering = fals
26
27
  // Return a new object with the original properties plus our overrides
27
28
  return Object.assign(Object.assign({}, colDef), { pinned: 'right', width: calculatedWidth, minWidth: calculatedWidth, maxWidth: calculatedWidth, sortable: false, filter: false, suppressHeaderMenuButton: true, suppressMovable: true });
28
29
  }
29
- // If a column contains a lookup id, set a valuegetter on the column def and disable filtering and sorting
30
+ // Lookup columns: display the resolved label, but filter against the underlying key.
31
+ // The set filter values + dropdown labels come from the cached lookup table, so the
32
+ // filter model holds keys (server-side IN clause works unchanged). Sort is left off
33
+ // because the backend can only order by the stored key, not the resolved label.
30
34
  if ((_e = colDef === null || colDef === void 0 ? void 0 : colDef.context) === null || _e === void 0 ? void 0 : _e.lookupId) {
31
- return Object.assign(Object.assign({}, colDef), { valueGetter: (params) => params.data[(colDef === null || colDef === void 0 ? void 0 : colDef.field) + 'LookupValue'], filter: false, sortable: false });
35
+ const lookupId = colDef.context.lookupId;
36
+ const field = colDef.field;
37
+ return Object.assign(Object.assign({}, colDef), { valueGetter: (params) => params.data[field + 'LookupValue'], filterValueGetter: (params) => { var _a; return (_a = params.data) === null || _a === void 0 ? void 0 : _a[field]; }, filter: 'agSetColumnFilter', filterParams: Object.assign({ values: (params) => {
38
+ getLookupTable(lookupId).then(table => {
39
+ params.success(Array.from(table.valueMap.keys()));
40
+ });
41
+ }, valueFormatter: (params) => {
42
+ var _a, _b;
43
+ const key = params.value == null ? '' : String(params.value);
44
+ return (_b = (_a = getLookupTableSync(lookupId)) === null || _a === void 0 ? void 0 : _a.valueMap.get(key)) !== null && _b !== void 0 ? _b : key;
45
+ } }, colDef.filterParams), sortable: false });
32
46
  }
33
47
  if (disableColumnFiltering) {
34
48
  return Object.assign(Object.assign({}, colDef), { filter: false });