@iapps/ng-dhis2-ui 1.1.29 → 1.1.39

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.
@@ -25,7 +25,7 @@ import { Layer } from '@dhis2-ui/layer';
25
25
  import { CircularLoader } from '@dhis2-ui/loader';
26
26
  import { MenuItem, MenuDivider } from '@dhis2-ui/menu';
27
27
  import parse from 'html-react-parser';
28
- import { Button as Button$1, IconDimensionData16, IconClock16, IconDimensionOrgUnit16, spacers as spacers$1, colors as colors$1, IconEdit16, theme as theme$1, Tooltip, SingleSelectField, SingleSelectOption, InputField as InputField$1, TabBar, Tab, Transfer, Modal as Modal$1, ModalTitle as ModalTitle$1, ModalContent as ModalContent$1, ModalActions as ModalActions$1, ButtonStrip as ButtonStrip$1, Checkbox, OrganisationUnitTree, MultiSelect, MultiSelectOption, IconWarningFilled16, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, CircularLoader as CircularLoader$1, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
28
+ import { Button as Button$1, IconDimensionData16, IconClock16, IconDimensionOrgUnit16, spacers as spacers$1, colors as colors$1, IconEdit16, theme as theme$1, Tooltip, SingleSelectField, SingleSelectOption, InputField as InputField$1, TabBar, Tab, Transfer, Modal as Modal$1, ModalTitle as ModalTitle$1, ModalContent as ModalContent$1, ModalActions as ModalActions$1, ButtonStrip as ButtonStrip$1, Checkbox, OrganisationUnitTree, MultiSelect, MultiSelectOption, IconWarningFilled16, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, CircularLoader as CircularLoader$1, IconFilter16, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
29
29
  import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
30
30
  import { isObject, isString, sortBy, isArray, find, camelCase, flatten, head, isEmpty } from 'lodash';
31
31
  import cx from 'classnames';
@@ -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;
@@ -3307,7 +3327,8 @@ const addActionsColumn = (columns, actionOptions) => {
3307
3327
  class LineListTableComponent extends ReactWrapperModule {
3308
3328
  constructor() {
3309
3329
  super(...arguments);
3310
- this.showApprovalButton = false;
3330
+ this.dispatchTeis = false;
3331
+ this.showFilterButton = false;
3311
3332
  this.actionSelected = new EventEmitter();
3312
3333
  this.reactStateUpdaters = null;
3313
3334
  this.approvalSelected = new EventEmitter();
@@ -3335,6 +3356,9 @@ class LineListTableComponent extends ReactWrapperModule {
3335
3356
  const [endDateState, setEndDateState] = useState(this.endDate);
3336
3357
  const [loading, setLoading] = useState(false);
3337
3358
  const [isButtonLoading, setIsButtonLoading] = useState(this.isButtonLoading);
3359
+ const [filteredColumns, setFilteredColumns] = useState();
3360
+ const [inputValues, setInputValues] = useState({});
3361
+ const [filters, setFilters] = useState(false);
3338
3362
  // Store updaters in refs for Angular to access
3339
3363
  const updateRefs = useRef({
3340
3364
  setProgramIdState,
@@ -3364,11 +3388,14 @@ class LineListTableComponent extends ReactWrapperModule {
3364
3388
  useEffect(() => {
3365
3389
  setLoading(true);
3366
3390
  this.lineListService
3367
- .getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize, this.attributeFilters, this.startDate, this.endDate, this.ouMode)
3391
+ .getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize, attributeFiltersState,
3392
+ // this.attributeFilters,
3393
+ this.startDate, this.endDate, this.ouMode)
3368
3394
  .subscribe((response) => {
3369
3395
  let entityColumns = [];
3370
3396
  let responsePager;
3371
3397
  let entityData = [];
3398
+ let filteredDataColumns = [];
3372
3399
  if (this.programStageId) {
3373
3400
  responsePager = response.data.pager;
3374
3401
  const { columns, data } = getProgramStageData(response, this.programStageId, pager);
@@ -3378,9 +3405,14 @@ class LineListTableComponent extends ReactWrapperModule {
3378
3405
  else if ('trackedEntityInstances' in response.data) {
3379
3406
  responsePager = response.data
3380
3407
  .pager;
3381
- const { columns, data } = getTrackedEntityData(response, this.programId, pager, this.filters);
3408
+ const { columns, data, filteredEntityColumns } = getTrackedEntityData(response, this.programId, pager, this.filters);
3382
3409
  entityColumns = columns;
3383
3410
  entityData = data;
3411
+ // setFilteredColumns(filteredEntityColumns);
3412
+ // Ensure filter inputs do not disappear when no data is returned
3413
+ // If filteredEntityColumns is empty, keep the previous columns instead of clearing them
3414
+ setFilteredColumns((prev) => filteredEntityColumns.length > 0 ? filteredEntityColumns : prev);
3415
+ filteredDataColumns = filteredEntityColumns;
3384
3416
  }
3385
3417
  else {
3386
3418
  responsePager = response.data.pager;
@@ -3390,12 +3422,12 @@ class LineListTableComponent extends ReactWrapperModule {
3390
3422
  }
3391
3423
  const finalColumns = addActionsColumn([{ label: '#', key: 'index' }, ...entityColumns], this.actionOptions);
3392
3424
  setLoading(false);
3393
- console.log('hey');
3425
+ // console.log('hey');
3394
3426
  setColumns(...[finalColumns]);
3395
3427
  setData(...[entityData]);
3396
3428
  setPager(...[responsePager]);
3397
- console.log('columns', columns);
3398
- console.log('data', data);
3429
+ // console.log('columns', columns);
3430
+ // console.log('data', data);
3399
3431
  });
3400
3432
  }, [
3401
3433
  programIdState,
@@ -3437,17 +3469,64 @@ class LineListTableComponent extends ReactWrapperModule {
3437
3469
  : null;
3438
3470
  })
3439
3471
  .filter((item) => item !== null); // Remove null entries (no matching enrollment)
3440
- console.log('TEI and Enrollment IDs emitted:', teiEnrollmentList);
3472
+ // console.log('TEI and Enrollment IDs emitted:', teiEnrollmentList);
3441
3473
  this.approvalSelected.emit(teiEnrollmentList);
3442
3474
  }
3443
3475
  else {
3444
- console.log('No tracked entity instances found in the response');
3476
+ // console.log('No tracked entity instances found in the response');
3445
3477
  this.approvalSelected.emit([]); // Emit empty array if no TEIs
3446
3478
  }
3447
3479
  });
3448
3480
  };
3481
+ // const handleInputChange = (key: string, value: string) => {
3482
+ // setInputValues((prevValues) => ({
3483
+ // ...prevValues,
3484
+ // [key]: value ?? '', // Ensure no undefined values
3485
+ // }));
3486
+ // };
3487
+ // if (!filteredColumns || filteredColumns.length === 0) {
3488
+ // return <div>No fields available</div>;
3489
+ // }
3490
+ const handleInputChange = (key, value) => {
3491
+ setInputValues((prevValues) => ({
3492
+ ...prevValues,
3493
+ [key]: value ?? '',
3494
+ }));
3495
+ setAttributeFiltersState((prevFilters = []) => {
3496
+ // Remove old filter for this key
3497
+ const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
3498
+ // Only add new filter if value is not empty
3499
+ const updatedFilters = value.trim()
3500
+ ? [...filteredFilters, { attribute: key, operator: 'like', value }]
3501
+ : filteredFilters;
3502
+ // console.log(`Updated Filters:`, updatedFilters); // Debugging
3503
+ return updatedFilters;
3504
+ });
3505
+ // setAttributeFiltersState((prevFilters = []) => {
3506
+ // // Check if attribute already exists
3507
+ // const existingFilterIndex = prevFilters.findIndex(
3508
+ // (f) => f.attribute === key
3509
+ // );
3510
+ // // Create a new filter object
3511
+ // const newFilter = { attribute: key, operator: 'like', value };
3512
+ // if (existingFilterIndex !== -1) {
3513
+ // // If attribute exists, update its value
3514
+ // const updatedFilters = [...prevFilters];
3515
+ // updatedFilters[existingFilterIndex] = newFilter;
3516
+ // console.log(`Updated Filters:`, updatedFilters); // Log updated filter list
3517
+ // return updatedFilters;
3518
+ // } else {
3519
+ // // If attribute doesn't exist, add a new object
3520
+ // return [...prevFilters, newFilter];
3521
+ // }
3522
+ // });
3523
+ };
3524
+ // console.log(
3525
+ // 'these are the filtered columns which have the attributes neede',
3526
+ // filteredColumns
3527
+ // );
3449
3528
  return (React__default.createElement("div", null,
3450
- this.showApprovalButton && (React__default.createElement("div", { style: {
3529
+ React__default.createElement("div", { style: {
3451
3530
  width: '100%',
3452
3531
  display: 'flex',
3453
3532
  justifyContent: 'flex-end',
@@ -3455,7 +3534,45 @@ class LineListTableComponent extends ReactWrapperModule {
3455
3534
  gap: 8,
3456
3535
  padding: 8,
3457
3536
  marginBottom: 16,
3458
- } }, isButtonLoading ? (React__default.createElement(CircularLoader$1, { small: true })) : (React__default.createElement(Button$1, { className: "bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600", onClick: handleApprovalClick, primary: true }, this.buttonLabel)))),
3537
+ } },
3538
+ this.dispatchTeis &&
3539
+ (isButtonLoading ? (React__default.createElement(CircularLoader$1, { small: true })) : (React__default.createElement(Button$1, { style: {
3540
+ backgroundColor: '#3b82f6', // Blue color
3541
+ color: 'white',
3542
+ padding: '8px 16px',
3543
+ borderRadius: '4px',
3544
+ cursor: 'pointer',
3545
+ }, onClick: handleApprovalClick, primary: true }, this.buttonLabel))),
3546
+ this.showFilterButton && (React__default.createElement(Button$1, { style: {
3547
+ backgroundColor: '#6b7280', // Gray color
3548
+ color: 'white',
3549
+ padding: '8px 16px',
3550
+ borderRadius: '4px',
3551
+ cursor: 'pointer',
3552
+ display: 'flex',
3553
+ alignItems: 'center',
3554
+ gap: 8,
3555
+ }, onClick: () => {
3556
+ setFilters(!filters);
3557
+ } },
3558
+ React__default.createElement(IconFilter16, null),
3559
+ filters ? 'Hide Filters' : 'Show Filters'))),
3560
+ filters && (React__default.createElement("div", { style: {
3561
+ display: 'flex',
3562
+ gap: '10px',
3563
+ flexWrap: 'wrap',
3564
+ paddingBottom: '16px',
3565
+ } }, (filteredColumns ?? []).map(({ label, key }) => (React__default.createElement(InputField$1, { key: key, label: label, value: inputValues[key] || '', onChange: (e) => {
3566
+ console.log(`Event for key "${key}":`, e);
3567
+ // Check if it's a standard event with target.value
3568
+ if ('target' in e && e.target) {
3569
+ handleInputChange(key, e.target.value);
3570
+ }
3571
+ // Check if it's an event with direct value
3572
+ else if ('value' in e) {
3573
+ handleInputChange(key, e.value ?? '');
3574
+ }
3575
+ } }))))),
3459
3576
  loading ? (React__default.createElement("div", { style: {
3460
3577
  display: 'flex',
3461
3578
  alignItems: 'center',
@@ -3468,7 +3585,14 @@ class LineListTableComponent extends ReactWrapperModule {
3468
3585
  } }, "Loading"))) : (React__default.createElement(DataTable, null,
3469
3586
  React__default.createElement(TableHead, null,
3470
3587
  React__default.createElement(DataTableRow, null, columns.map((col) => (React__default.createElement(DataTableColumnHeader, { key: col.key }, col.label))))),
3471
- 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])))))))),
3588
+ 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
3589
+ )))))))) : (React__default.createElement(DataTableRow, null,
3590
+ React__default.createElement(DataTableCell, { colSpan: columns.length, style: {
3591
+ textAlign: 'center',
3592
+ fontWeight: 'bold',
3593
+ color: 'grey',
3594
+ padding: '20px',
3595
+ } }, "No data found")))),
3472
3596
  React__default.createElement(TableFoot, null,
3473
3597
  React__default.createElement(DataTableRow, null,
3474
3598
  React__default.createElement(DataTableCell, { colSpan: columns.length.toString() },
@@ -3516,7 +3640,7 @@ class LineListTableComponent extends ReactWrapperModule {
3516
3640
  this.render();
3517
3641
  }
3518
3642
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3519
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "app-line-list", inputs: { programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", attributeFilters: "attributeFilters", startDate: "startDate", endDate: "endDate", filters: "filters", ouMode: "ouMode", showApprovalButton: "showApprovalButton", isButtonLoading: "isButtonLoading", buttonLabel: "buttonLabel" }, outputs: { actionSelected: "actionSelected", approvalSelected: "approvalSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["[data-test=dhis2-uiwidgets-pagination]{display:flex!important;flex-direction:row!important;justify-content:space-between!important;align-items:center!important}\n"] }); }
3643
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "app-line-list", inputs: { programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", attributeFilters: "attributeFilters", startDate: "startDate", endDate: "endDate", filters: "filters", ouMode: "ouMode", dispatchTeis: "dispatchTeis", showFilterButton: "showFilterButton", isButtonLoading: "isButtonLoading", buttonLabel: "buttonLabel" }, outputs: { actionSelected: "actionSelected", approvalSelected: "approvalSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["[data-test=dhis2-uiwidgets-pagination]{display:flex!important;flex-direction:row!important;justify-content:space-between!important;align-items:center!important}\n"] }); }
3520
3644
  }
3521
3645
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
3522
3646
  type: Component,
@@ -3539,7 +3663,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
3539
3663
  type: Input
3540
3664
  }], ouMode: [{
3541
3665
  type: Input
3542
- }], showApprovalButton: [{
3666
+ }], dispatchTeis: [{
3667
+ type: Input
3668
+ }], showFilterButton: [{
3543
3669
  type: Input
3544
3670
  }], actionSelected: [{
3545
3671
  type: Output
@@ -4817,7 +4943,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4817
4943
  });
4818
4944
  setValue(event.selected);
4819
4945
  setTouched(true);
4820
- } }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: option.key, label: option.label, value: option.value })))));
4946
+ } }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.key, label: option.label, value: option.value })))));
4821
4947
  case 'multi-dropdown':
4822
4948
  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) => {
4823
4949
  const selectedValue = (event.selected || []).join(',');
@@ -5541,6 +5667,8 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5541
5667
  const [touched, setTouched] = useState(false);
5542
5668
  const [showOrgUnit, setShowOrgUnit] = useState(false);
5543
5669
  const [value, setValue] = useState(null);
5670
+ const [showMoreFilters, setShowMoreFilters] = useState(false);
5671
+ const toggleMoreFilters = () => setShowMoreFilters((prev) => !prev);
5544
5672
  useEffect(() => {
5545
5673
  setFilters({
5546
5674
  programAttributesFilters: this.programAttributesFilters,
@@ -5582,7 +5710,9 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5582
5710
  const handleSearch = () => {
5583
5711
  this.actionSelected.emit({
5584
5712
  ...filters,
5585
- organisationUnit: selectedOrganisationUnit || this.organisationUnit || filters.organisationUnit,
5713
+ organisationUnit: selectedOrganisationUnit ||
5714
+ this.organisationUnit ||
5715
+ filters.organisationUnit,
5586
5716
  startDate: filters.startDate,
5587
5717
  endDate: filters.endDate,
5588
5718
  program: this.program || filters.program,
@@ -5657,17 +5787,14 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5657
5787
  } },
5658
5788
  React__default.createElement("div", { style: {
5659
5789
  display: 'grid',
5660
- gridTemplateColumns: 'repeat(3, 1fr)',
5790
+ gridTemplateColumns: '1fr 1fr 1fr auto', // Ensure proper button sizing
5661
5791
  gap: '16px',
5792
+ alignItems: 'center', // Align inputs and button on the same row
5662
5793
  marginBottom: '16px',
5663
5794
  } },
5664
- React__default.createElement(React__default.Fragment, null,
5665
- React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => {
5666
- setShowOrgUnit(true);
5667
- }, onBlur: () => {
5668
- this.ngZone.run(() => {
5669
- console.log('THIS IS IT::: ');
5670
- });
5795
+ React__default.createElement("div", { style: { width: '100%' } },
5796
+ React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => setShowOrgUnit(true), onBlur: () => {
5797
+ this.ngZone.run(() => console.log('THIS IS IT::: '));
5671
5798
  setTouched(true);
5672
5799
  } }),
5673
5800
  showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { onCancelOrgUnit: () => {
@@ -5682,30 +5809,36 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5682
5809
  setValue(selectedOrgUnit.id);
5683
5810
  setShowOrgUnit(false);
5684
5811
  setTouched(true);
5685
- // this.ngZone.run(() => {
5686
- // setDisplayValue(selectedOrgUnit.name);
5687
- // setSelected(selectedOrgUnit.id)
5688
- // setSelectedOrganisationUnit(selectedOrgUnit.id)
5689
- // setValue(selectedOrgUnit.id);
5690
- // setShowOrgUnit(false);
5691
- // setTouched(true);
5692
- // });
5693
5812
  }
5694
5813
  } }))),
5695
- React__default.createElement(InputField$1, { className: "input-field", label: "Start Date", type: "DATE", value: filters.startDate, onChange: (event) => setFilters({ ...filters, startDate: event.value }) }),
5696
- React__default.createElement(InputField$1, { className: "input-field", label: "End Date", type: "DATE", value: filters.endDate, onChange: (event) => setFilters({ ...filters, endDate: event.value }) })),
5697
- React__default.createElement("div", { style: {
5698
- display: 'grid',
5699
- gridTemplateColumns: 'repeat(4, 1fr)',
5700
- gap: '16px',
5701
- } }, 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) })))))),
5702
- React__default.createElement("div", { style: {
5703
- display: 'grid',
5704
- gridTemplateColumns: 'repeat(4, 1fr)',
5705
- gap: '16px',
5706
- } }, 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) })))))),
5707
- React__default.createElement("div", { style: { textAlign: 'right', marginTop: '16px' } },
5708
- React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))));
5814
+ 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%' } }),
5815
+ 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%' } }),
5816
+ React__default.createElement("div", { style: {
5817
+ display: 'flex',
5818
+ flexDirection: 'column',
5819
+ alignItems: 'center',
5820
+ justifyContent: 'center',
5821
+ height: '100%',
5822
+ } },
5823
+ React__default.createElement("label", { style: {
5824
+ color: 'transparent', // Hides label text but keeps spacing
5825
+ fontSize: '14px',
5826
+ marginBottom: '4px',
5827
+ } }, "Toggle"),
5828
+ React__default.createElement(Button$1, { style: { height: '40px' }, onClick: () => setShowMoreFilters(!showMoreFilters) }, showMoreFilters ? 'Hide Filters' : 'More Filters'))),
5829
+ showMoreFilters && (React__default.createElement(React__default.Fragment, null,
5830
+ React__default.createElement("div", { style: {
5831
+ display: 'grid',
5832
+ gridTemplateColumns: 'repeat(4, 1fr)',
5833
+ gap: '16px',
5834
+ } }, 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) })))))),
5835
+ React__default.createElement("div", { style: {
5836
+ display: 'grid',
5837
+ gridTemplateColumns: 'repeat(4, 1fr)',
5838
+ gap: '16px',
5839
+ } }, 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) })))))),
5840
+ React__default.createElement("div", { style: { textAlign: 'right', marginTop: '16px' } },
5841
+ React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))))));
5709
5842
  };
5710
5843
  }
5711
5844
  getAppConfig() {