basesite-shared-grid-lib 21.0.1-beta.1 → 21.0.1-beta.3

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.
@@ -313,10 +313,15 @@ class OdataProvider {
313
313
  return me.odataOperator[col.type](colName, `${me.toDateTime(col.dateFrom)}`, `${me.toDateTime(col.dateTo)}`);
314
314
  }
315
315
  break;
316
- case 'set':
317
- return col.values.length > 0
318
- ? me.odataOperator.inStr(colName, col.values, isCaseSensitiveStringFilter)
319
- : '';
316
+ case 'set': {
317
+ if (!col.values || col.values.length === 0) {
318
+ return '';
319
+ }
320
+ const containsClauses = col.values.map((v) => me.odataOperator.contains(colName, `'${me.encode(v)}'`, isCaseSensitiveStringFilter));
321
+ return containsClauses.length === 1
322
+ ? containsClauses[0]
323
+ : `(${containsClauses.join(' or ')})`;
324
+ }
320
325
  default:
321
326
  break;
322
327
  }
@@ -2357,6 +2362,7 @@ class GridLibraryComponent {
2357
2362
  };
2358
2363
  }
2359
2364
  else if (res.columnType === 'fill') {
2365
+ const valueLabelMap = this._buildFillValueLabelMap(res);
2360
2366
  return {
2361
2367
  width: 120,
2362
2368
  pinned: res.pinPosition,
@@ -2373,25 +2379,21 @@ class GridLibraryComponent {
2373
2379
  field: res.field,
2374
2380
  },
2375
2381
  filterable: res.filterable,
2376
- filter: 'agTextColumnFilter',
2382
+ filter: 'agSetColumnFilter',
2377
2383
  filterParams: {
2378
- comparator: (filterLocalDateAtMidnight, cellValue) => {
2379
- const dateAsString = cellValue;
2380
- if (dateAsString == null) {
2381
- return 0;
2382
- }
2383
- if (res.columnType == 'date') {
2384
- const cellDate = new Date(dateAsString);
2385
- if (cellDate < filterLocalDateAtMidnight) {
2386
- return -1;
2387
- }
2388
- else if (cellDate > filterLocalDateAtMidnight) {
2389
- return 1;
2390
- }
2391
- }
2392
- return 0;
2393
- },
2384
+ // Provide the raw values from the backend config; OData provider
2385
+ // handles case-insensitive matching server-side via tolower().
2386
+ values: (params) => this._getFillFilterValues(res, params),
2387
+ refreshValuesOnOpen: true,
2394
2388
  buttons: ['reset'],
2389
+ // Pretty label for each checkbox; falls back to the value itself
2390
+ valueFormatter: (p) => {
2391
+ if (p?.value == null || p.value === '')
2392
+ return p?.value;
2393
+ return valueLabelMap?.get(String(p.value)) ?? p.value;
2394
+ },
2395
+ // Case-insensitive search within the dropdown's filter box
2396
+ textFormatter: (v) => v == null ? '' : String(v).trim().toLowerCase(),
2395
2397
  },
2396
2398
  };
2397
2399
  }
@@ -2493,6 +2495,71 @@ class GridLibraryComponent {
2493
2495
  }
2494
2496
  });
2495
2497
  }
2498
+ _getFillFilterValues(res, params) {
2499
+ const configured = res?.filterValues;
2500
+ if (Array.isArray(configured) && configured.length > 0) {
2501
+ const values = configured
2502
+ .map((v) => (v && typeof v === 'object' ? (v.value ?? v.name ?? v.label) : v))
2503
+ .filter((v) => v !== null && v !== undefined && v !== '');
2504
+ params.success(values);
2505
+ return;
2506
+ }
2507
+ // Backend may provide allowed values as a comma-separated string in `fieldValue`
2508
+ const fieldValue = res?.fieldValue;
2509
+ if (typeof fieldValue === 'string' && fieldValue.trim() !== '') {
2510
+ const values = fieldValue
2511
+ .split(',')
2512
+ .map((v) => v.trim())
2513
+ .filter((v) => v !== '');
2514
+ if (values.length > 0) {
2515
+ params.success(values);
2516
+ return;
2517
+ }
2518
+ }
2519
+ if (Array.isArray(fieldValue) && fieldValue.length > 0) {
2520
+ const values = fieldValue
2521
+ .map((v) => (v && typeof v === 'object' ? (v.value ?? v.name ?? v.label) : v))
2522
+ .filter((v) => v !== null && v !== undefined && v !== '');
2523
+ if (values.length > 0) {
2524
+ params.success(values);
2525
+ return;
2526
+ }
2527
+ }
2528
+ const field = res?.field;
2529
+ if (this.enableServerSidePaging && this.odataProvider) {
2530
+ this.odataProvider.getFilterValuesParams(field, (data) => params.success((data || []).filter(v => v !== null && v !== undefined && v !== '')), undefined);
2531
+ return;
2532
+ }
2533
+ const source = Array.isArray(this.rowData) ? this.rowData : [];
2534
+ const unique = Array.from(new Set(source
2535
+ .map(row => row?.[field])
2536
+ .filter(v => v !== null && v !== undefined && v !== '')));
2537
+ params.success(unique);
2538
+ }
2539
+ _buildFillValueLabelMap(res) {
2540
+ const map = new Map();
2541
+ const source = res?.filterValues ?? res?.fieldValue;
2542
+ const addObject = (obj) => {
2543
+ const value = obj?.value ?? obj?.key ?? obj?.id ?? obj?.name ?? obj?.label;
2544
+ const label = obj?.label ?? obj?.name ?? value;
2545
+ if (value !== null && value !== undefined && value !== '') {
2546
+ map.set(String(value), String(label));
2547
+ }
2548
+ };
2549
+ if (Array.isArray(source)) {
2550
+ source.forEach((entry) => {
2551
+ if (entry && typeof entry === 'object')
2552
+ addObject(entry);
2553
+ else if (entry !== null && entry !== undefined && entry !== '') {
2554
+ map.set(String(entry), String(entry));
2555
+ }
2556
+ });
2557
+ }
2558
+ else if (typeof source === 'string' && source.trim() !== '') {
2559
+ source.split(',').map(s => s.trim()).filter(Boolean).forEach(v => map.set(v, v));
2560
+ }
2561
+ return map;
2562
+ }
2496
2563
  canCreateDac(roles, field) {
2497
2564
  if (roles?.length > 0 && field === 'createDac') {
2498
2565
  const isAEGroup = this.userRoles.some((role) => role?.toLowerCase().includes('ae'));
@@ -2552,7 +2619,7 @@ class GridLibraryComponent {
2552
2619
  // Add timeout to prevent infinite loading
2553
2620
  const API_TIMEOUT = 800000; //80 seconds
2554
2621
  let hasRetried = false;
2555
- params.api.setServerSideDatasource(new OdataServerSideProvider({
2622
+ this.odataProvider = new OdataServerSideProvider({
2556
2623
  isCaseSensitiveStringFilter: false,
2557
2624
  callApi: (options) => {
2558
2625
  const url = this.setExternalFilters(options);
@@ -2617,7 +2684,8 @@ class GridLibraryComponent {
2617
2684
  this.gridAPI.hideOverlay();
2618
2685
  this.gridAPI.showNoRowsOverlay();
2619
2686
  }
2620
- }));
2687
+ });
2688
+ params.api.setServerSideDatasource(this.odataProvider);
2621
2689
  this.gridReady.emit(params);
2622
2690
  }
2623
2691
  // Apply initial filter highlighting with retry mechanism