@iapps/ng-dhis2-ui 1.1.28 → 1.1.37

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.
@@ -2043,7 +2043,7 @@ const FixedPeriodFilter = ({ allowedPeriodTypes, excludedPeriodTypes, currentPer
2043
2043
  React__default.createElement("div", { className: "leftSection" },
2044
2044
  React__default.createElement(SingleSelectField, { label: i18n.t('Period type'), onChange: ({ selected }) => onSelectPeriodType(selected), dense: true, selected: currentPeriodType, disabled: onlyAllowedTypeIsSelected, className: "filterElement", dataTest: `${dataTest}-period-type` }, (allowedPeriodTypes
2045
2045
  ? getFixedPeriodsOptions().filter((option) => allowedPeriodTypes.some((type) => type === option.id))
2046
- : filterPeriodTypesById(getFixedPeriodsOptions(), excludedPeriodTypes)).map((option) => (React__default.createElement(SingleSelectOption, { key: option.id, value: option.id, label: option.name, dataTest: `${dataTest}-period-type-option-${option.id}` }))))),
2046
+ : filterPeriodTypesById(getFixedPeriodsOptions(), excludedPeriodTypes)).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.id, value: option.id, label: option.name, dataTest: `${dataTest}-period-type-option-${option.id}` }))))),
2047
2047
  React__default.createElement("div", { className: "rightSection" },
2048
2048
  React__default.createElement(InputField$1, { label: i18n.t('Year'), className: "filterElement", type: "number", placeholder: i18n.t('Select year'), value: currentYear, onChange: ({ value }) => onSelectYear(value), dense: true, dataTest: `${dataTest}-year` })),
2049
2049
  React__default.createElement("style", { jsx: true }, `
@@ -2074,7 +2074,7 @@ FixedPeriodFilter.propTypes = {
2074
2074
  };
2075
2075
 
2076
2076
  const RelativePeriodFilter = ({ currentFilter, onSelectFilter, dataTest, excludedPeriodTypes, }) => (React__default.createElement("div", { className: "leftSection" },
2077
- React__default.createElement(SingleSelectField, { label: i18n.t('Period type'), onChange: ({ selected }) => onSelectFilter(selected), dense: true, selected: currentFilter, className: "filterElement", dataTest: dataTest }, filterPeriodTypesById(getRelativePeriodsOptions(), excludedPeriodTypes).map((option) => (React__default.createElement(SingleSelectOption, { key: option.id, value: option.id, label: option.name, dataTest: `${dataTest}-option-${option.id}` })))),
2077
+ React__default.createElement(SingleSelectField, { label: i18n.t('Period type'), onChange: ({ selected }) => onSelectFilter(selected), dense: true, selected: currentFilter, className: "filterElement", dataTest: dataTest }, filterPeriodTypesById(getRelativePeriodsOptions(), excludedPeriodTypes).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.id, value: option.id, label: option.name, dataTest: `${dataTest}-option-${option.id}` })))),
2078
2078
  React__default.createElement("style", { jsx: true }, `
2079
2079
  .leftSection {
2080
2080
  flex-grow: 1;
@@ -3217,13 +3217,20 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
3217
3217
  let teis = response.data
3218
3218
  .trackedEntityInstances;
3219
3219
  let programMetaData = response.metadata.programTrackedEntityAttributes;
3220
+ //let progrmaMetaDataAttributesMap = programMetaData.reduce
3221
+ const mappedProgramMetadataAttributes = programMetaData.map((attr) => ({
3222
+ displayInList: attr.displayInList,
3223
+ searchable: attr.searchable,
3224
+ id: attr.trackedEntityAttribute.id,
3225
+ }));
3226
+ console.log('the mapped attributes', mappedProgramMetadataAttributes);
3220
3227
  const programAttributesMap = programMetaData.reduce((acc, attribute) => {
3221
3228
  if (attribute.displayInList) {
3222
3229
  acc[attribute.id] = attribute.displayName;
3223
3230
  }
3224
3231
  return acc;
3225
3232
  }, {});
3226
- console.log('metadata', programAttributesMap);
3233
+ console.log('metadat attributes', programMetaData);
3227
3234
  if (filters) {
3228
3235
  teis = getFilteredTrackedEntityInstances(teis, filters);
3229
3236
  }
@@ -3258,6 +3265,18 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
3258
3265
  // Check if the column label is part of any value in programAttributesMap
3259
3266
  return Object.values(programAttributesMap).some((value) => value.includes(column.label));
3260
3267
  });
3268
+ const searchableAttributes = mappedProgramMetadataAttributes
3269
+ .filter((attr) => attr.searchable && attr.displayInList)
3270
+ .map((attr) => ({
3271
+ // label: attr.trackedEntityAttribute.displayName,
3272
+ key: attr.id,
3273
+ }));
3274
+ // Extract keys from searchableAttributes for quick lookup
3275
+ const searchableKeys = new Set(searchableAttributes.map((attr) => attr.key));
3276
+ // Filter entityColumns to keep only those whose key exists in searchableAttributes
3277
+ const filteredEntityColumns = entityColumns.filter((column) => searchableKeys.has(column.key));
3278
+ console.log('show the filtered values', filteredEntityColumns);
3279
+ console.log('the answer is ', searchableAttributes);
3261
3280
  const attributesData = teis.map((tei, idx) => {
3262
3281
  let row = {
3263
3282
  trackedEntityInstance: tei.trackedEntityInstance,
@@ -3271,7 +3290,8 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
3271
3290
  attributesToUse.forEach((attr) => (row[attr.attribute] = attr.value));
3272
3291
  return row;
3273
3292
  });
3274
- return { columns: entityColumns, data: attributesData };
3293
+ console.log('attributes to use', entityColumns);
3294
+ return { columns: entityColumns, data: attributesData, filteredEntityColumns: filteredEntityColumns };
3275
3295
  };
3276
3296
  const getEventData = (response, pager) => {
3277
3297
  const events = response.data.events;
@@ -3335,6 +3355,8 @@ class LineListTableComponent extends ReactWrapperModule {
3335
3355
  const [endDateState, setEndDateState] = useState(this.endDate);
3336
3356
  const [loading, setLoading] = useState(false);
3337
3357
  const [isButtonLoading, setIsButtonLoading] = useState(this.isButtonLoading);
3358
+ const [filteredColumns, setFilteredColumns] = useState();
3359
+ const [inputValues, setInputValues] = useState({});
3338
3360
  // Store updaters in refs for Angular to access
3339
3361
  const updateRefs = useRef({
3340
3362
  setProgramIdState,
@@ -3364,11 +3386,14 @@ class LineListTableComponent extends ReactWrapperModule {
3364
3386
  useEffect(() => {
3365
3387
  setLoading(true);
3366
3388
  this.lineListService
3367
- .getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize, this.attributeFilters, this.startDate, this.endDate, this.ouMode)
3389
+ .getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize, attributeFiltersState,
3390
+ // this.attributeFilters,
3391
+ this.startDate, this.endDate, this.ouMode)
3368
3392
  .subscribe((response) => {
3369
3393
  let entityColumns = [];
3370
3394
  let responsePager;
3371
3395
  let entityData = [];
3396
+ let filteredDataColumns = [];
3372
3397
  if (this.programStageId) {
3373
3398
  responsePager = response.data.pager;
3374
3399
  const { columns, data } = getProgramStageData(response, this.programStageId, pager);
@@ -3378,9 +3403,14 @@ class LineListTableComponent extends ReactWrapperModule {
3378
3403
  else if ('trackedEntityInstances' in response.data) {
3379
3404
  responsePager = response.data
3380
3405
  .pager;
3381
- const { columns, data } = getTrackedEntityData(response, this.programId, pager, this.filters);
3406
+ const { columns, data, filteredEntityColumns } = getTrackedEntityData(response, this.programId, pager, this.filters);
3382
3407
  entityColumns = columns;
3383
3408
  entityData = data;
3409
+ // setFilteredColumns(filteredEntityColumns);
3410
+ // Ensure filter inputs do not disappear when no data is returned
3411
+ // If filteredEntityColumns is empty, keep the previous columns instead of clearing them
3412
+ setFilteredColumns((prev) => filteredEntityColumns.length > 0 ? filteredEntityColumns : prev);
3413
+ filteredDataColumns = filteredEntityColumns;
3384
3414
  }
3385
3415
  else {
3386
3416
  responsePager = response.data.pager;
@@ -3390,12 +3420,12 @@ class LineListTableComponent extends ReactWrapperModule {
3390
3420
  }
3391
3421
  const finalColumns = addActionsColumn([{ label: '#', key: 'index' }, ...entityColumns], this.actionOptions);
3392
3422
  setLoading(false);
3393
- console.log('hey');
3423
+ // console.log('hey');
3394
3424
  setColumns(...[finalColumns]);
3395
3425
  setData(...[entityData]);
3396
3426
  setPager(...[responsePager]);
3397
- console.log('columns', columns);
3398
- console.log('data', data);
3427
+ // console.log('columns', columns);
3428
+ // console.log('data', data);
3399
3429
  });
3400
3430
  }, [
3401
3431
  programIdState,
@@ -3417,6 +3447,7 @@ class LineListTableComponent extends ReactWrapperModule {
3417
3447
  }));
3418
3448
  };
3419
3449
  const handleApprovalClick = () => {
3450
+ setIsButtonLoading(true);
3420
3451
  this.lineListService
3421
3452
  .getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, 1000, this.attributeFilters, this.startDate, this.endDate, this.ouMode)
3422
3453
  .subscribe((response) => {
@@ -3436,16 +3467,74 @@ class LineListTableComponent extends ReactWrapperModule {
3436
3467
  : null;
3437
3468
  })
3438
3469
  .filter((item) => item !== null); // Remove null entries (no matching enrollment)
3439
- console.log('TEI and Enrollment IDs emitted:', teiEnrollmentList);
3470
+ // console.log('TEI and Enrollment IDs emitted:', teiEnrollmentList);
3440
3471
  this.approvalSelected.emit(teiEnrollmentList);
3441
3472
  }
3442
3473
  else {
3443
- console.log('No tracked entity instances found in the response');
3474
+ // console.log('No tracked entity instances found in the response');
3444
3475
  this.approvalSelected.emit([]); // Emit empty array if no TEIs
3445
3476
  }
3446
3477
  });
3447
3478
  };
3479
+ // const handleInputChange = (key: string, value: string) => {
3480
+ // setInputValues((prevValues) => ({
3481
+ // ...prevValues,
3482
+ // [key]: value ?? '', // Ensure no undefined values
3483
+ // }));
3484
+ // };
3485
+ // if (!filteredColumns || filteredColumns.length === 0) {
3486
+ // return <div>No fields available</div>;
3487
+ // }
3488
+ const handleInputChange = (key, value) => {
3489
+ setInputValues((prevValues) => ({
3490
+ ...prevValues,
3491
+ [key]: value ?? '',
3492
+ }));
3493
+ setAttributeFiltersState((prevFilters = []) => {
3494
+ // Remove old filter for this key
3495
+ const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
3496
+ // Only add new filter if value is not empty
3497
+ const updatedFilters = value.trim()
3498
+ ? [...filteredFilters, { attribute: key, operator: 'like', value }]
3499
+ : filteredFilters;
3500
+ // console.log(`Updated Filters:`, updatedFilters); // Debugging
3501
+ return updatedFilters;
3502
+ });
3503
+ // setAttributeFiltersState((prevFilters = []) => {
3504
+ // // Check if attribute already exists
3505
+ // const existingFilterIndex = prevFilters.findIndex(
3506
+ // (f) => f.attribute === key
3507
+ // );
3508
+ // // Create a new filter object
3509
+ // const newFilter = { attribute: key, operator: 'like', value };
3510
+ // if (existingFilterIndex !== -1) {
3511
+ // // If attribute exists, update its value
3512
+ // const updatedFilters = [...prevFilters];
3513
+ // updatedFilters[existingFilterIndex] = newFilter;
3514
+ // console.log(`Updated Filters:`, updatedFilters); // Log updated filter list
3515
+ // return updatedFilters;
3516
+ // } else {
3517
+ // // If attribute doesn't exist, add a new object
3518
+ // return [...prevFilters, newFilter];
3519
+ // }
3520
+ // });
3521
+ };
3522
+ // console.log(
3523
+ // 'these are the filtered columns which have the attributes neede',
3524
+ // filteredColumns
3525
+ // );
3448
3526
  return (React__default.createElement("div", null,
3527
+ React__default.createElement("div", { style: { display: 'flex', gap: '10px', flexWrap: 'wrap' } }, (filteredColumns ?? []).map(({ label, key }) => (React__default.createElement(InputField$1, { key: key, label: label, value: inputValues[key] || '', onChange: (e) => {
3528
+ // console.log(`Event for key "${key}":`, e);
3529
+ // Check if it's a standard event with target.value
3530
+ if ('target' in e && e.target) {
3531
+ handleInputChange(key, e.target.value);
3532
+ }
3533
+ // Check if it's a DHIS2 UI event with direct value
3534
+ else if ('value' in e) {
3535
+ handleInputChange(key, e.value ?? '');
3536
+ }
3537
+ } })))),
3449
3538
  this.showApprovalButton && (React__default.createElement("div", { style: {
3450
3539
  width: '100%',
3451
3540
  display: 'flex',
@@ -3467,7 +3556,14 @@ class LineListTableComponent extends ReactWrapperModule {
3467
3556
  } }, "Loading"))) : (React__default.createElement(DataTable, null,
3468
3557
  React__default.createElement(TableHead, null,
3469
3558
  React__default.createElement(DataTableRow, null, columns.map((col) => (React__default.createElement(DataTableColumnHeader, { key: col.key }, col.label))))),
3470
- React__default.createElement(TableBody, null, data.map((row) => (React__default.createElement(DataTableRow, { key: row.index }, columns.map((col) => (React__default.createElement(DataTableCell, { key: col.key }, col.key === 'actions' ? (React__default.createElement(DropdownMenu$1, { dropdownOptions: getDropdownOptions(row), onClick: (option) => option.onClick?.() })) : (row[col.key])))))))),
3559
+ React__default.createElement(TableBody, null, data.length > 0 ? (data.map((row) => (React__default.createElement(DataTableRow, { key: row.index }, columns.map((col) => (React__default.createElement(DataTableCell, { key: col.key }, col.key === 'actions' ? (React__default.createElement(DropdownMenu$1, { dropdownOptions: getDropdownOptions(row), onClick: (option) => option.onClick?.() })) : (row[col.key] || '--' // Display '--' if value is undefined or null
3560
+ )))))))) : (React__default.createElement(DataTableRow, null,
3561
+ React__default.createElement(DataTableCell, { colSpan: columns.length, style: {
3562
+ textAlign: 'center',
3563
+ fontWeight: 'bold',
3564
+ color: 'grey',
3565
+ padding: '20px',
3566
+ } }, "No data found")))),
3471
3567
  React__default.createElement(TableFoot, null,
3472
3568
  React__default.createElement(DataTableRow, null,
3473
3569
  React__default.createElement(DataTableCell, { colSpan: columns.length.toString() },
@@ -4816,7 +4912,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4816
4912
  });
4817
4913
  setValue(event.selected);
4818
4914
  setTouched(true);
4819
- } }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: option.key, label: option.label, value: option.value })))));
4915
+ } }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.key, label: option.label, value: option.value })))));
4820
4916
  case 'multi-dropdown':
4821
4917
  return (React__default.createElement(MultiSelectField, { clearText: "Clear", clearable: true, empty: "No data found", filterable: (this.field().options || []).length > 5, filterPlaceholder: "Type to filter options", error: hasError, validationText: validationError, inputWidth: this.fieldConfig()?.inputWidth, label: this.label(), name: this.field().id, required: this.field().required, loadingText: "Loading options", noMatchText: "No options found", onChange: (event) => {
4822
4918
  const selectedValue = (event.selected || []).join(',');
@@ -5540,6 +5636,8 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5540
5636
  const [touched, setTouched] = useState(false);
5541
5637
  const [showOrgUnit, setShowOrgUnit] = useState(false);
5542
5638
  const [value, setValue] = useState(null);
5639
+ const [showMoreFilters, setShowMoreFilters] = useState(false);
5640
+ const toggleMoreFilters = () => setShowMoreFilters((prev) => !prev);
5543
5641
  useEffect(() => {
5544
5642
  setFilters({
5545
5643
  programAttributesFilters: this.programAttributesFilters,
@@ -5581,7 +5679,9 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5581
5679
  const handleSearch = () => {
5582
5680
  this.actionSelected.emit({
5583
5681
  ...filters,
5584
- organisationUnit: selectedOrganisationUnit || this.organisationUnit || filters.organisationUnit,
5682
+ organisationUnit: selectedOrganisationUnit ||
5683
+ this.organisationUnit ||
5684
+ filters.organisationUnit,
5585
5685
  startDate: filters.startDate,
5586
5686
  endDate: filters.endDate,
5587
5687
  program: this.program || filters.program,
@@ -5656,17 +5756,14 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5656
5756
  } },
5657
5757
  React__default.createElement("div", { style: {
5658
5758
  display: 'grid',
5659
- gridTemplateColumns: 'repeat(3, 1fr)',
5759
+ gridTemplateColumns: '1fr 1fr 1fr auto', // Ensure proper button sizing
5660
5760
  gap: '16px',
5761
+ alignItems: 'center', // Align inputs and button on the same row
5661
5762
  marginBottom: '16px',
5662
5763
  } },
5663
- React__default.createElement(React__default.Fragment, null,
5664
- React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => {
5665
- setShowOrgUnit(true);
5666
- }, onBlur: () => {
5667
- this.ngZone.run(() => {
5668
- console.log('THIS IS IT::: ');
5669
- });
5764
+ React__default.createElement("div", { style: { width: '100%' } },
5765
+ React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => setShowOrgUnit(true), onBlur: () => {
5766
+ this.ngZone.run(() => console.log('THIS IS IT::: '));
5670
5767
  setTouched(true);
5671
5768
  } }),
5672
5769
  showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { onCancelOrgUnit: () => {
@@ -5681,30 +5778,36 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5681
5778
  setValue(selectedOrgUnit.id);
5682
5779
  setShowOrgUnit(false);
5683
5780
  setTouched(true);
5684
- // this.ngZone.run(() => {
5685
- // setDisplayValue(selectedOrgUnit.name);
5686
- // setSelected(selectedOrgUnit.id)
5687
- // setSelectedOrganisationUnit(selectedOrgUnit.id)
5688
- // setValue(selectedOrgUnit.id);
5689
- // setShowOrgUnit(false);
5690
- // setTouched(true);
5691
- // });
5692
5781
  }
5693
5782
  } }))),
5694
- React__default.createElement(InputField$1, { className: "input-field", label: "Start Date", type: "DATE", value: filters.startDate, onChange: (event) => setFilters({ ...filters, startDate: event.value }) }),
5695
- React__default.createElement(InputField$1, { className: "input-field", label: "End Date", type: "DATE", value: filters.endDate, onChange: (event) => setFilters({ ...filters, endDate: event.value }) })),
5696
- React__default.createElement("div", { style: {
5697
- display: 'grid',
5698
- gridTemplateColumns: 'repeat(4, 1fr)',
5699
- gap: '16px',
5700
- } }, filters.programAttributesFilters.map((filter, index) => (React__default.createElement("div", { key: index, style: { gridColumn: getAttributeColumnSpan(index) } }, filter.hasOptions && filter.options.length > 0 ? (React__default.createElement(SingleSelectField, { className: "single-select", label: filter.name || 'Select Option', type: filter.valueType, selected: filter.value, onChange: (event) => handleAttributeChange(index, event.selected) }, filter.options.map((option, i) => (React__default.createElement(SingleSelectOption, { key: i, label: option.name, value: option.code }))))) : (React__default.createElement(InputField$1, { className: "input-field", label: filter.name || 'Program name', type: filter.valueType, value: filter.value, onChange: (event) => handleAttributeChange(index, event.value) })))))),
5701
- React__default.createElement("div", { style: {
5702
- display: 'grid',
5703
- gridTemplateColumns: 'repeat(4, 1fr)',
5704
- gap: '16px',
5705
- } }, filters.programStageDataElementFilters.map((filter, index) => (React__default.createElement("div", { key: index, style: { gridColumn: getDataElementColumnSpan(index) } }, filter.hasOptions && filter.options.length > 0 ? (React__default.createElement(SingleSelectField, { className: "single-select", label: filter.name || 'Aggregation type', type: filter.valueType, selected: filter.value, onChange: (event) => handleDataElementChange(index, event.selected) }, filter.options.map((option, i) => (React__default.createElement(SingleSelectOption, { key: i, label: option.name, value: option.code }))))) : (React__default.createElement(InputField$1, { className: "input-field", type: filter.valueType, label: filter.name || 'Program name', value: filter.value, onChange: (event) => handleDataElementChange(index, event.value) })))))),
5706
- React__default.createElement("div", { style: { textAlign: 'right', marginTop: '16px' } },
5707
- React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))));
5783
+ React__default.createElement(InputField$1, { className: "input-field", label: "Start Date", type: "DATE", value: filters.startDate, onChange: (event) => setFilters({ ...filters, startDate: event.value }), style: { width: '100%', height: '100%' } }),
5784
+ React__default.createElement(InputField$1, { className: "input-field", label: "End Date", type: "DATE", value: filters.endDate, onChange: (event) => setFilters({ ...filters, endDate: event.value }), style: { width: '100%', height: '100%' } }),
5785
+ React__default.createElement("div", { style: {
5786
+ display: 'flex',
5787
+ flexDirection: 'column',
5788
+ alignItems: 'center',
5789
+ justifyContent: 'center',
5790
+ height: '100%',
5791
+ } },
5792
+ React__default.createElement("label", { style: {
5793
+ color: 'transparent', // Hides label text but keeps spacing
5794
+ fontSize: '14px',
5795
+ marginBottom: '4px',
5796
+ } }, "Toggle"),
5797
+ React__default.createElement(Button$1, { style: { height: '40px' }, onClick: () => setShowMoreFilters(!showMoreFilters) }, showMoreFilters ? 'Hide Filters' : 'More Filters'))),
5798
+ showMoreFilters && (React__default.createElement(React__default.Fragment, null,
5799
+ React__default.createElement("div", { style: {
5800
+ display: 'grid',
5801
+ gridTemplateColumns: 'repeat(4, 1fr)',
5802
+ gap: '16px',
5803
+ } }, filters.programAttributesFilters.map((filter, index) => (React__default.createElement("div", { key: index, style: { gridColumn: getAttributeColumnSpan(index) } }, filter.hasOptions && filter.options.length > 0 ? (React__default.createElement(SingleSelectField, { className: "single-select", label: filter.name || 'Select Option', type: filter.valueType, selected: filter.value, onChange: (event) => handleAttributeChange(index, event.selected) }, filter.options.map((option, i) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || i, label: option.name, value: option.code }))))) : (React__default.createElement(InputField$1, { className: "input-field", label: filter.name || 'Program name', type: filter.valueType, value: filter.value, onChange: (event) => handleAttributeChange(index, event.value) })))))),
5804
+ React__default.createElement("div", { style: {
5805
+ display: 'grid',
5806
+ gridTemplateColumns: 'repeat(4, 1fr)',
5807
+ gap: '16px',
5808
+ } }, filters.programStageDataElementFilters.map((filter, index) => (React__default.createElement("div", { key: index, style: { gridColumn: getDataElementColumnSpan(index) } }, filter.hasOptions && filter.options.length > 0 ? (React__default.createElement(SingleSelectField, { className: "single-select", label: filter.name || 'Aggregation type', type: filter.valueType, selected: filter.value, onChange: (event) => handleDataElementChange(index, event.selected) }, filter.options.map((option, i) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || i, label: option.name, value: option.code }))))) : (React__default.createElement(InputField$1, { className: "input-field", type: filter.valueType, label: filter.name || 'Program name', value: filter.value, onChange: (event) => handleDataElementChange(index, event.value) })))))),
5809
+ React__default.createElement("div", { style: { textAlign: 'right', marginTop: '16px' } },
5810
+ React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))))));
5708
5811
  };
5709
5812
  }
5710
5813
  getAppConfig() {