@iapps/ng-dhis2-ui 1.2.98 → 1.2.99

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, IconChevronRight16, 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, CircularLoader as CircularLoader$1, Chip, DataTableToolbar, CalendarInput, TableHead, DataTableRow, DataTableColumnHeader, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, DataTableCell, TableBody as TableBody$1, Pagination as Pagination$1, TableFoot, DataTable, DropdownButton, 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, IconChevronRight16, 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, CircularLoader as CircularLoader$1, Chip, DataTableToolbar, DropdownButton, FlyoutMenu, CalendarInput, TableHead, DataTableRow, DataTableColumnHeader, Layer as Layer$1, Popper, MenuItem as MenuItem$1, IconMore24, DataTableCell, TableBody as TableBody$1, Pagination as Pagination$1, TableFoot, DataTable, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
29
29
  import { isObject, isString, debounce, sortBy, isArray, find, camelCase, flatten, isUndefined, head, isEmpty } from 'lodash';
30
30
  import cx from 'classnames';
31
31
  import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
@@ -3303,96 +3303,299 @@ const OrgUnitSelector = ({ hide, setHide, selectedOrgUnit, setSelectedOrgUnit, s
3303
3303
  React__default.createElement(ButtonStrip$1, { end: true },
3304
3304
  React__default.createElement(Button$1, { onClick: () => setHide(true), secondary: true }, "Close")))));
3305
3305
 
3306
- const FilterToolbar = ({ orgUnitLabel, selectedOrgUnit, setSelectedOrgUnit, setOrgUnitState, defaultOrgUnit, setHide, startDateState, setStartDateState, endDateState, setEndDateState, visibleFilters, dateStates, inputValues, setInputValues, handleInputChange, handleInputChangeForSelectField, handleDateSelect, prevValue, setPrevValue, showAllFilters, setShowAllFilters, handleSearch, setTempStartDateState, setTempEndDateState, setTempOrgUnitState, tempStartDateState, tempEndDateState, tempOrgUnitState, dataQueryFiltersState, setDataQueryFiltersState, SetOrgUnitModalVisible, showEnrollmentDates, }) => (React__default.createElement(DataTableToolbar, { className: "table-top-toolbar" },
3307
- React__default.createElement("div", { style: {
3308
- display: 'flex',
3309
- // flexDirection: 'column',
3310
- gap: '10px',
3311
- flexWrap: 'wrap',
3312
- } },
3306
+ const FilterToolbar = ({ orgUnitLabel, selectedOrgUnit, setSelectedOrgUnit, setOrgUnitState, defaultOrgUnit, setHide, startDateState, setStartDateState, endDateState, setEndDateState, visibleFilters, dateStates, inputValues, setInputValues, handleInputChange, handleInputChangeForSelectField, handleDateSelect, showAllFilters, setShowAllFilters, setTempStartDateState, setTempEndDateState, setTempOrgUnitState, tempStartDateState, tempEndDateState, tempOrgUnitState, dataQueryFiltersState, setDataQueryFiltersState, SetOrgUnitModalVisible, showEnrollmentDates, handleAdditionalFilters, handleStartDateFilter, handleEndDateFilter, handleOrgUnitFilter, setDateStates, prevInputValues, setPrevInputValues, setTempDataQueryFiltersState, prevDateStates, setPrevDateStates, prevSelectedOrgUnit, setPrevSelectedOrgUnit, }) => {
3307
+ const [isOpen, setIsOpen] = useState(false);
3308
+ const [isOpenOrgUnitDropdown, setIsOpenOrgUnitDropdown] = useState(false);
3309
+ const [openDropdownKey, setOpenDropdownKey] = useState(null);
3310
+ //TODO: I HAVE DUPLICATED DROPDOWN AND CLEAR ICON IN MULTIPLE PLACES REQUIRED TO CREATE A REUSABLE DROPDOWN COMPONENT WITH THE CLEAR ICON TO AVOID DUPLICATION
3311
+ const ClearIcon = ({ className, ...props }) => (React__default.createElement("svg", { className: className, ...props, viewBox: "0 0 24 24", width: 16, height: 16 },
3312
+ React__default.createElement("path", { d: "M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z" })));
3313
+ return (React__default.createElement(DataTableToolbar, { className: "table-top-toolbar" },
3313
3314
  React__default.createElement("div", { style: {
3314
3315
  display: 'flex',
3315
- alignItems: 'center',
3316
3316
  gap: '10px',
3317
3317
  flexWrap: 'wrap',
3318
3318
  } },
3319
- React__default.createElement(InputField$1, { key: "location", label: orgUnitLabel ? orgUnitLabel : 'registering unit:', value: selectedOrgUnit, onFocus: () => {
3320
- SetOrgUnitModalVisible(true);
3321
- setHide(false);
3322
- }, className: "custom-input", clearable: true, onChange: (event) => {
3323
- setSelectedOrgUnit(event.value);
3324
- setOrgUnitState(defaultOrgUnit);
3325
- } }),
3326
- showEnrollmentDates && (React__default.createElement(React__default.Fragment, null,
3327
- React__default.createElement(CalendarInput, { label: "Start date:", calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", className: "custom-input",
3328
- //clearable={!!tempStartDateState}
3329
- //date={tempStartDateState || undefined}
3330
- //date={tempStartDateState || "yyyy-mm-dd"}
3331
- clearable: !!tempStartDateState && tempStartDateState !== 'dd-mm-yyyy',
3332
- // date={tempStartDateState || 'dd-mm-yyyy'}
3333
- date: formatDateForDisplay(tempStartDateState), onDateSelect: (selectedDate) => {
3334
- setTempStartDateState(selectedDate.calendarDateString);
3335
- if (selectedDate.calendarDateString === null) {
3336
- setStartDateState(selectedDate.calendarDateString);
3337
- }
3338
- } }),
3339
- React__default.createElement(CalendarInput, { label: "End date:", calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", className: "custom-input", clearable: !!tempEndDateState && tempEndDateState !== 'dd-mm-yyyy',
3340
- // date={tempEndDateState || 'dd-mm-yyyy'}
3341
- date: formatDateForDisplay(tempEndDateState), onDateSelect: (selectedDate) => {
3342
- setTempEndDateState(selectedDate.calendarDateString);
3343
- if (selectedDate.calendarDateString === null) {
3344
- setEndDateState(selectedDate.calendarDateString);
3345
- }
3346
- } })))),
3347
- (visibleFilters ?? []).map(({ label, key, valueType, options }) => {
3348
- if (valueType === 'DATE') {
3349
- return (React__default.createElement(CalendarInput, { key: key, label: `${label}:`, calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", className: "custom-input", clearable: !!dateStates[key], date: dateStates[key], onDateSelect: (selectedDate) => {
3350
- handleDateSelect(key, selectedDate);
3351
- const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3352
- if (selectedDate.calendarDateString === null) {
3353
- setDataQueryFiltersState(filteredFilters);
3354
- }
3355
- } }));
3356
- }
3357
- if (options && options.options.length > 0) {
3358
- return (React__default.createElement(SingleSelectField, { key: key, label: `${label}:`, selected: inputValues[key] || '', className: "custom-select-input", clearable: true, onChange: ({ selected }) => {
3359
- setInputValues((prevValues) => ({
3360
- ...prevValues,
3361
- [key]: selected ?? '',
3362
- }));
3363
- handleInputChangeForSelectField(key, selected ?? '');
3364
- const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3365
- if (selected === '') {
3319
+ React__default.createElement("div", { style: {
3320
+ display: 'flex',
3321
+ alignItems: 'center',
3322
+ gap: '10px',
3323
+ flexWrap: 'wrap',
3324
+ } },
3325
+ React__default.createElement(DropdownButton, { name: "customDropdown", open: isOpenOrgUnitDropdown, onClick: () => setIsOpenOrgUnitDropdown(!isOpenOrgUnitDropdown), component: React__default.createElement("div", null,
3326
+ React__default.createElement(FlyoutMenu, null,
3327
+ React__default.createElement("div", { style: { padding: '16px' } },
3328
+ React__default.createElement(InputField$1, { key: "location", placeholder: orgUnitLabel ? orgUnitLabel : 'registering unit', value: selectedOrgUnit, onFocus: () => {
3329
+ SetOrgUnitModalVisible(true);
3330
+ setHide(false);
3331
+ } }),
3332
+ React__default.createElement("div", { style: {
3333
+ paddingTop: '8px',
3334
+ display: 'flex',
3335
+ justifyContent: 'flex-end',
3336
+ } },
3337
+ React__default.createElement(ButtonStrip$1, null,
3338
+ React__default.createElement(Button$1, { primary: true, disabled: !selectedOrgUnit, onClick: () => {
3339
+ setPrevSelectedOrgUnit(selectedOrgUnit);
3340
+ handleOrgUnitFilter();
3341
+ setIsOpenOrgUnitDropdown(false);
3342
+ } }, "update"),
3343
+ React__default.createElement(Button$1, { disabled: !selectedOrgUnit, onClick: () => {
3344
+ setSelectedOrgUnit('');
3345
+ setPrevSelectedOrgUnit('');
3346
+ setOrgUnitState(defaultOrgUnit);
3347
+ setTempOrgUnitState(defaultOrgUnit);
3348
+ setIsOpenOrgUnitDropdown(false);
3349
+ } }, "reset filter")))))) },
3350
+ orgUnitLabel ? orgUnitLabel : 'registering unit',
3351
+ ' ',
3352
+ prevSelectedOrgUnit && ':',
3353
+ " ",
3354
+ prevSelectedOrgUnit,
3355
+ prevSelectedOrgUnit && (React__default.createElement("span", { onClick: (event) => {
3356
+ event.stopPropagation();
3357
+ setSelectedOrgUnit('');
3358
+ setPrevSelectedOrgUnit('');
3359
+ setOrgUnitState(defaultOrgUnit);
3360
+ setTempOrgUnitState(defaultOrgUnit);
3361
+ setIsOpenOrgUnitDropdown(false);
3362
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3363
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))),
3364
+ showEnrollmentDates && (React__default.createElement(React__default.Fragment, null,
3365
+ React__default.createElement(DropdownButton, { name: "customDropdown", open: isOpen, onClick: () => setIsOpen(!isOpen), component: React__default.createElement("div", null,
3366
+ React__default.createElement(FlyoutMenu, null,
3367
+ React__default.createElement("div", { style: { padding: '16px' } },
3368
+ React__default.createElement("div", { style: {
3369
+ display: 'flex',
3370
+ alignItems: 'flex-end',
3371
+ gap: '16px',
3372
+ } },
3373
+ React__default.createElement(CalendarInput, { calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", date: formatDateForDisplay(tempStartDateState), onDateSelect: (selectedDate) => {
3374
+ setTempStartDateState(selectedDate.calendarDateString);
3375
+ } }),
3376
+ React__default.createElement("span", { style: { paddingBottom: '8px' } }, "to"),
3377
+ React__default.createElement(CalendarInput, { calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", date: formatDateForDisplay(tempEndDateState), onDateSelect: (selectedDate) => {
3378
+ setTempEndDateState(selectedDate.calendarDateString);
3379
+ } })),
3380
+ React__default.createElement("div", { style: {
3381
+ paddingTop: '8px',
3382
+ display: 'flex',
3383
+ justifyContent: 'flex-end',
3384
+ } },
3385
+ React__default.createElement(ButtonStrip$1, null,
3386
+ React__default.createElement(Button$1, { primary: true, onClick: () => {
3387
+ handleStartDateFilter();
3388
+ handleEndDateFilter();
3389
+ setIsOpen(false);
3390
+ } }, "update"),
3391
+ React__default.createElement(Button$1, { onClick: () => {
3392
+ setStartDateState(null);
3393
+ setTempEndDateState(null);
3394
+ setTempStartDateState(null);
3395
+ setEndDateState(null);
3396
+ setIsOpen(false);
3397
+ } }, "reset")))))) },
3398
+ "registration dates ",
3399
+ (startDateState || endDateState) && ':',
3400
+ ' ',
3401
+ startDateState,
3402
+ endDateState && ` - ${endDateState}`,
3403
+ (startDateState || endDateState) && (React__default.createElement("span", { onClick: (event) => {
3404
+ event.stopPropagation();
3405
+ setStartDateState(null);
3406
+ setTempEndDateState(null);
3407
+ setTempStartDateState(null);
3408
+ setEndDateState(null);
3409
+ setIsOpen(false);
3410
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3411
+ React__default.createElement(ClearIcon, { className: "my-icon-class" }))))))),
3412
+ (visibleFilters ?? []).map(({ label, key, valueType, options, type }) => {
3413
+ if (valueType === 'DATE') {
3414
+ return (React__default.createElement(DropdownButton, { name: "customDropdown", open: openDropdownKey === key, onClick: () => {
3415
+ setOpenDropdownKey(openDropdownKey === key ? null : key);
3416
+ }, component: React__default.createElement("div", null,
3417
+ React__default.createElement(FlyoutMenu, null,
3418
+ React__default.createElement("div", { style: { padding: '16px' } },
3419
+ React__default.createElement(CalendarInput, { key: key, calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", date: dateStates[key], onDateSelect: (selectedDate) => {
3420
+ handleDateSelect(key, selectedDate, type);
3421
+ } }),
3422
+ React__default.createElement("div", { style: {
3423
+ paddingTop: '8px',
3424
+ display: 'flex',
3425
+ justifyContent: 'flex-end',
3426
+ } },
3427
+ React__default.createElement(ButtonStrip$1, null,
3428
+ React__default.createElement(Button$1, { primary: true, onClick: () => {
3429
+ setPrevDateStates((prev) => ({
3430
+ ...prev,
3431
+ [key]: dateStates[key],
3432
+ }));
3433
+ handleAdditionalFilters();
3434
+ setOpenDropdownKey(null);
3435
+ } }, "update"),
3436
+ React__default.createElement(Button$1, { onClick: () => {
3437
+ setIsOpen(false);
3438
+ } }, "reset")))))) },
3439
+ label,
3440
+ " ",
3441
+ prevDateStates[key] && ':',
3442
+ " ",
3443
+ prevDateStates[key],
3444
+ prevDateStates[key] && (React__default.createElement("span", { onClick: (event) => {
3445
+ event.stopPropagation();
3446
+ setDateStates((prev) => ({
3447
+ ...prev,
3448
+ [key]: '',
3449
+ }));
3450
+ setPrevDateStates((prev) => ({
3451
+ ...prev,
3452
+ [key]: '',
3453
+ }));
3454
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3455
+ setDataQueryFiltersState(filteredFilters);
3456
+ setTempDataQueryFiltersState(filteredFilters);
3457
+ setOpenDropdownKey(null);
3458
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3459
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))));
3460
+ }
3461
+ if (options && options.options.length > 0) {
3462
+ return (React__default.createElement(DropdownButton, { name: "customDropdown", open: openDropdownKey === key, onClick: () => {
3463
+ setOpenDropdownKey(openDropdownKey === key ? null : key);
3464
+ }, component: React__default.createElement("div", null,
3465
+ React__default.createElement(FlyoutMenu, null,
3466
+ React__default.createElement("div", { style: { padding: '16px' } },
3467
+ React__default.createElement(SingleSelectField, { key: key, placeholder: `${label}`, selected: inputValues[key] || '', onChange: ({ selected }) => {
3468
+ setInputValues((prevValues) => ({
3469
+ ...prevValues,
3470
+ [key]: selected ?? '',
3471
+ }));
3472
+ handleInputChangeForSelectField(key, selected ?? '', type);
3473
+ } }, (options.options ?? []).map((opt) => (React__default.createElement(SingleSelectOption, { key: opt.id, label: opt.name, value: opt.code })))),
3474
+ React__default.createElement("div", { style: {
3475
+ paddingTop: '8px',
3476
+ display: 'flex',
3477
+ justifyContent: 'flex-end',
3478
+ } },
3479
+ React__default.createElement(ButtonStrip$1, null,
3480
+ React__default.createElement(Button$1, { primary: true, disabled: !inputValues[key] ||
3481
+ inputValues[key] === prevInputValues[key], onClick: () => {
3482
+ setPrevInputValues((prev) => ({
3483
+ ...prev,
3484
+ [key]: inputValues[key],
3485
+ }));
3486
+ handleAdditionalFilters();
3487
+ setOpenDropdownKey(null);
3488
+ } }, "update"),
3489
+ React__default.createElement(Button$1, { disabled: !inputValues[key], onClick: () => {
3490
+ setInputValues((prevValues) => ({
3491
+ ...prevValues,
3492
+ [key]: '',
3493
+ }));
3494
+ setPrevInputValues((prevValues) => ({
3495
+ ...prevValues,
3496
+ [key]: '',
3497
+ }));
3498
+ handleInputChangeForSelectField(key, '', type);
3499
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3500
+ setDataQueryFiltersState(filteredFilters);
3501
+ setTempDataQueryFiltersState(filteredFilters);
3502
+ setOpenDropdownKey(null);
3503
+ } }, "reset")))))) },
3504
+ label,
3505
+ " ",
3506
+ prevInputValues[key] && ':',
3507
+ " ",
3508
+ prevInputValues[key],
3509
+ prevInputValues[key] && (React__default.createElement("span", { onClick: (event) => {
3510
+ event.stopPropagation();
3511
+ setInputValues((prevValues) => ({
3512
+ ...prevValues,
3513
+ [key]: '',
3514
+ }));
3515
+ setPrevInputValues((prevValues) => ({
3516
+ ...prevValues,
3517
+ [key]: '',
3518
+ }));
3519
+ handleInputChangeForSelectField(key, '', type);
3520
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3521
+ setDataQueryFiltersState(filteredFilters);
3522
+ setTempDataQueryFiltersState(filteredFilters);
3523
+ setOpenDropdownKey(null);
3524
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3525
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))));
3526
+ }
3527
+ return (React__default.createElement(DropdownButton, { name: "customDropdown", open: openDropdownKey === key, onClick: () => {
3528
+ setOpenDropdownKey(openDropdownKey === key ? null : key);
3529
+ }, component: React__default.createElement("div", null,
3530
+ React__default.createElement(FlyoutMenu, null,
3531
+ React__default.createElement("div", { style: { padding: '16px' } },
3532
+ React__default.createElement(InputField$1, { key: key, placeholder: `${label}`, value: inputValues[key] || '', onChange: (e) => {
3533
+ const currentValue = 'target' in e ? e.target.value : e.value ?? '';
3534
+ setInputValues((prevValues) => ({
3535
+ ...prevValues,
3536
+ [key]: currentValue,
3537
+ }));
3538
+ handleInputChange(key, currentValue, type);
3539
+ } }),
3540
+ React__default.createElement("div", { style: {
3541
+ paddingTop: '8px',
3542
+ display: 'flex',
3543
+ justifyContent: 'flex-end',
3544
+ } },
3545
+ React__default.createElement(ButtonStrip$1, null,
3546
+ React__default.createElement(Button$1, { primary: true, disabled: !inputValues[key] ||
3547
+ inputValues[key] === prevInputValues[key], onClick: () => {
3548
+ setPrevInputValues((prev) => ({
3549
+ ...prev,
3550
+ [key]: inputValues[key],
3551
+ }));
3552
+ handleAdditionalFilters();
3553
+ setOpenDropdownKey(null);
3554
+ } }, "update"),
3555
+ React__default.createElement(Button$1, { disabled: !inputValues[key], onClick: () => {
3556
+ setInputValues((prevValues) => ({
3557
+ ...prevValues,
3558
+ [key]: '',
3559
+ }));
3560
+ setPrevInputValues((prevValues) => ({
3561
+ ...prevValues,
3562
+ [key]: '',
3563
+ }));
3564
+ // Remove the filter for this key
3565
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3566
+ setDataQueryFiltersState(filteredFilters);
3567
+ setTempDataQueryFiltersState(filteredFilters);
3568
+ setOpenDropdownKey(null);
3569
+ } }, "reset")))))) },
3570
+ label,
3571
+ " ",
3572
+ prevInputValues[key] && ':',
3573
+ " ",
3574
+ prevInputValues[key],
3575
+ prevInputValues[key] && (React__default.createElement("span", { onClick: (event) => {
3576
+ event.stopPropagation();
3577
+ // Clear the input value for this key
3578
+ setInputValues((prevValues) => ({
3579
+ ...prevValues,
3580
+ [key]: '',
3581
+ }));
3582
+ setPrevInputValues((prevValues) => ({
3583
+ ...prevValues,
3584
+ [key]: '',
3585
+ }));
3586
+ // Remove the filter for this key
3587
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3366
3588
  setDataQueryFiltersState(filteredFilters);
3367
- }
3368
- } }, (options.options ?? []).map((opt) => (React__default.createElement(SingleSelectOption, { key: opt.id, label: opt.name, value: opt.code })))));
3369
- }
3370
- return (React__default.createElement(InputField$1, { key: key, label: `${label}:`, className: "custom-input", value: inputValues[key] || '', clearable: true, onChange: (e) => {
3371
- const currentValue = 'target' in e ? e.target.value : e.value ?? '';
3372
- setInputValues((prevValues) => ({
3373
- ...prevValues,
3374
- [key]: currentValue,
3375
- }));
3376
- const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3377
- if (currentValue === '') {
3378
- setDataQueryFiltersState(filteredFilters);
3379
- }
3380
- }, onBlur: (e) => {
3381
- const currentValue = 'target' in e ? e.target.value : e.value ?? '';
3382
- if (currentValue !== '' && currentValue !== prevValue) {
3383
- handleInputChange(key, currentValue);
3384
- setPrevValue(currentValue);
3385
- }
3386
- } }));
3387
- }),
3388
- React__default.createElement("div", { style: {
3389
- display: 'flex',
3390
- // alignItems: 'center',
3391
- gap: '10px',
3392
- // flexWrap: 'wrap',
3393
- } },
3394
- React__default.createElement(Button$1, { onClick: handleSearch }, "Search"),
3395
- React__default.createElement(Button$1, { onClick: () => setShowAllFilters(!showAllFilters) }, showAllFilters ? 'Less Filters' : 'More Filters')))));
3589
+ setTempDataQueryFiltersState(filteredFilters);
3590
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3591
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))));
3592
+ }),
3593
+ React__default.createElement("div", { style: {
3594
+ display: 'flex',
3595
+ gap: '10px',
3596
+ } },
3597
+ React__default.createElement(Button$1, { onClick: () => setShowAllFilters(!showAllFilters) }, showAllFilters ? 'Less Filters' : 'More Filters')))));
3598
+ };
3396
3599
  function formatDateForDisplay(dateString) {
3397
3600
  if (!dateString || dateString === 'dd-mm-yyyy')
3398
3601
  return 'dd-mm-yyyy';
@@ -3639,7 +3842,13 @@ const TableRow = ({ row, columns, getTextColorFromBackGround, actionOptions, act
3639
3842
  // )}
3640
3843
  // </DHISTableBody>
3641
3844
  // );
3642
- const TableBody = ({ data, columns, getTextColorFromBackGround, actionOptions, actionOptionOrientation, actionSelected, selectedRows, onRowToggle, selectable, showActionButtons }) => (React__default.createElement(TableBody$1, null, data.length > 0 ? (data.map((row) => (React__default.createElement(TableRow, { key: row.index.value, row: row, columns: columns, getTextColorFromBackGround: getTextColorFromBackGround, actionOptions: actionOptions, actionOptionOrientation: actionOptionOrientation, actionSelected: actionSelected, isChecked: selectedRows.some((r) => r.index?.value === row.index?.value), onToggle: onRowToggle, selectable: selectable, showActionButtons: showActionButtons })))) : (React__default.createElement(DataTableRow, null,
3845
+ const TableBody = ({ data, columns, getTextColorFromBackGround, actionOptions, actionOptionOrientation, actionSelected, selectedRows, onRowToggle, selectable, showActionButtons, error, }) => (React__default.createElement(TableBody$1, null, error ? (React__default.createElement(DataTableRow, null,
3846
+ React__default.createElement(DataTableCell, { colSpan: columns.length.toString(), style: {
3847
+ textAlign: 'center',
3848
+ fontWeight: 'bold',
3849
+ color: 'red',
3850
+ padding: '20px',
3851
+ } }, error))) : data.length > 0 ? (data.map((row) => (React__default.createElement(TableRow, { key: row.index.value, row: row, columns: columns, getTextColorFromBackGround: getTextColorFromBackGround, actionOptions: actionOptions, actionOptionOrientation: actionOptionOrientation, actionSelected: actionSelected, isChecked: selectedRows.some((r) => r.index?.value === row.index?.value), onToggle: onRowToggle, selectable: selectable, showActionButtons: showActionButtons })))) : (React__default.createElement(DataTableRow, null,
3643
3852
  React__default.createElement(DataTableCell, { colSpan: columns.length.toString(), style: {
3644
3853
  textAlign: 'center',
3645
3854
  fontWeight: 'bold',
@@ -3696,7 +3905,7 @@ const TableFooter = ({ pager, setPager, columns }) => {
3696
3905
  // </DataTable>
3697
3906
  // );
3698
3907
  // };
3699
- const LineListTable = ({ columns, data, pager, setPager, getTextColorFromBackGround, actionOptions, actionOptionOrientation, actionSelected, selectable, rowsSelected, showActionButtons }) => {
3908
+ const LineListTable = ({ columns, data, pager, setPager, getTextColorFromBackGround, actionOptions, actionOptionOrientation, actionSelected, selectable, rowsSelected, showActionButtons, error }) => {
3700
3909
  const [selectedRows, setSelectedRows] = useState([]);
3701
3910
  const handleRowToggle = (row) => {
3702
3911
  const exists = selectedRows.find((r) => r.index?.value === row.index?.value);
@@ -3713,7 +3922,7 @@ const LineListTable = ({ columns, data, pager, setPager, getTextColorFromBackGro
3713
3922
  };
3714
3923
  return (React__default.createElement(DataTable, null,
3715
3924
  React__default.createElement(TableHeader, { columns: columns, allSelected: selectedRows.length === data.length && data.length > 0, onSelectAll: handleSelectAll, selectable: selectable, showActionButtons: showActionButtons }),
3716
- React__default.createElement(TableBody, { data: data, columns: columns, getTextColorFromBackGround: getTextColorFromBackGround, actionOptions: actionOptions, actionOptionOrientation: actionOptionOrientation, actionSelected: actionSelected, selectedRows: selectedRows, onRowToggle: handleRowToggle, selectable: selectable, showActionButtons: showActionButtons }),
3925
+ React__default.createElement(TableBody, { data: data, columns: columns, getTextColorFromBackGround: getTextColorFromBackGround, actionOptions: actionOptions, actionOptionOrientation: actionOptionOrientation, actionSelected: actionSelected, selectedRows: selectedRows, onRowToggle: handleRowToggle, selectable: selectable, showActionButtons: showActionButtons, error: error }),
3717
3926
  React__default.createElement(TableFooter, { columns: columns, pager: pager, setPager: setPager })));
3718
3927
  };
3719
3928
 
@@ -3743,7 +3952,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
3743
3952
  type: Injectable
3744
3953
  }], ctorParameters: () => [{ type: i1.NgxDhis2HttpClientService }] });
3745
3954
 
3746
- const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3955
+ const getTrackedEntityTableData = (response, programId, pager, metaData, searcheableDataElements) => {
3747
3956
  const teisRaw = response.data
3748
3957
  .trackedEntityInstances;
3749
3958
  const teis = Array.isArray(teisRaw)
@@ -3758,12 +3967,19 @@ const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3758
3967
  label: trackedEntityAttribute.formName ?? trackedEntityAttribute.name,
3759
3968
  key: trackedEntityAttribute.id,
3760
3969
  }));
3761
- // const dataElementColumns = metaData.displayInListDataElements
3762
- // .sort((a, b) => a.sortOrder! - b.sortOrder!)
3763
- // .map((dataElement) => ({
3764
- // label: dataElement.formName || dataElement.name,
3765
- // key: dataElement.id,
3766
- // }));
3970
+ const tableSearcheableDataElements = metaData
3971
+ .programStages.sort((a, b) => a.sortOrder - b.sortOrder)
3972
+ .flatMap((stage) => stage
3973
+ .programStageDataElements.filter((psde) => psde.displayInReports)
3974
+ .sort((a, b) => a.sortOrder - b.sortOrder)
3975
+ .map((psde) => ({
3976
+ label: psde.dataElement.formName || psde.dataElement.name,
3977
+ key: psde.dataElement.id,
3978
+ valueType: psde.dataElement.valueType,
3979
+ options: psde.dataElement.optionSet,
3980
+ type: 'dataElement',
3981
+ }))
3982
+ .filter((col) => searcheableDataElements.includes(col.key)));
3767
3983
  const dataElementColumns = metaData
3768
3984
  .programStages.sort((a, b) => a.sortOrder - b.sortOrder) // Sorts stages by sortOrder
3769
3985
  .flatMap((stage) => stage
@@ -3795,6 +4011,7 @@ const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3795
4011
  key: attr.id,
3796
4012
  valueType: attr.valueType,
3797
4013
  options: attr.optionSet ?? undefined,
4014
+ type: 'attribute',
3798
4015
  }));
3799
4016
  const tableData = teis.map((tei, idx) => {
3800
4017
  const row = {
@@ -3881,7 +4098,7 @@ const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3881
4098
  return {
3882
4099
  columns: tableColumns,
3883
4100
  data: tableData,
3884
- filteredEntityColumns: tableFilters,
4101
+ filteredEntityColumns: [...tableFilters, ...tableSearcheableDataElements],
3885
4102
  orgUnitLabel: orgUnitLabel,
3886
4103
  };
3887
4104
  };
@@ -3962,6 +4179,7 @@ class LineListTableComponent extends ReactWrapperModule {
3962
4179
  this.showActionButtons = true;
3963
4180
  this.showEnrollmentDates = true;
3964
4181
  this.showDownloadButton = false;
4182
+ this.searcheableDataElements = [];
3965
4183
  this.reactStateUpdaters = null;
3966
4184
  this.setReactStateUpdaters = (updaters) => {
3967
4185
  this.reactStateUpdaters = updaters;
@@ -3990,28 +4208,29 @@ class LineListTableComponent extends ReactWrapperModule {
3990
4208
  const [endDateState, setEndDateState] = useState(this.endDate);
3991
4209
  const [tempEndDateState, setTempEndDateState] = useState(this.endDate);
3992
4210
  const [loading, setLoading] = useState(false);
3993
- const [metaDataLoadng, setMetaDataLoading] = useState(false);
3994
4211
  const [filteredColumns, setFilteredColumns] = useState();
3995
4212
  const [inputValues, setInputValues] = useState({});
3996
4213
  const [orgUnitLabel, setOrgUnitLabel] = useState('');
3997
4214
  const [selectedOrgUnit, setSelectedOrgUnit] = useState('');
4215
+ const [prevSelectedOrgUnit, setPrevSelectedOrgUnit] = useState('');
3998
4216
  const [hide, setHide] = useState(true);
3999
4217
  const [showAllFilters, setShowAllFilters] = useState(false);
4000
4218
  const visibleFilters = showAllFilters
4001
4219
  ? filteredColumns ?? []
4002
- : (filteredColumns ?? []).slice(0, 0);
4220
+ : (filteredColumns ?? []).slice(0, 5);
4003
4221
  // const visibleFilters = showAllFilters
4004
4222
  // ? filteredColumns ?? []
4005
4223
  // : filteredColumns ?? []).slice(0, 2);
4006
4224
  const defaultOrgUnit = this.orgUnit;
4007
- const [prevValue, setPrevValue] = useState();
4008
4225
  const [dateStates, setDateStates] = useState({});
4226
+ const [prevDateStates, setPrevDateStates] = useState({});
4009
4227
  const [metaData, setMetaData] = useState(null);
4010
4228
  const [selectable, setSelectable] = useState(this.allowRowsSelection);
4011
4229
  const [triggerRefetch, setTriggerRefetch] = useState(this.triggerRefetch);
4012
4230
  const [showActionButtons, setShowActionButtons] = useState(this.showActionButtons);
4013
4231
  const [orgUnitModalVisible, setOrgUnitModalVisible] = useState(false);
4014
4232
  const [error, setError] = useState(null);
4233
+ const [prevInputValues, setPrevInputValues] = useState({});
4015
4234
  const d2 = window.d2Web;
4016
4235
  // Stores updaters in refs for Angular to access
4017
4236
  const updateRefs = useRef({
@@ -4026,9 +4245,6 @@ class LineListTableComponent extends ReactWrapperModule {
4026
4245
  setTriggerRefetch,
4027
4246
  setTriggerTokenState,
4028
4247
  });
4029
- // useEffect(() => {
4030
- // this.setReactStateUpdaters?.(updateRefs.current);
4031
- // }, []);
4032
4248
  useEffect(() => {
4033
4249
  this.setReactStateUpdaters?.(updateRefs.current);
4034
4250
  const fetchmetaData = async () => {
@@ -4064,57 +4280,71 @@ class LineListTableComponent extends ReactWrapperModule {
4064
4280
  const isEvent = metaData.programType === 'WITHOUT_REGISTRATION';
4065
4281
  const endDate = endDateState ?? format(addDays(new Date(), 1), 'yyyy-MM-dd');
4066
4282
  if (this.programStageId || isEvent) {
4067
- setLoading(true);
4068
- d2.eventModule.event
4069
- .setEndDate(endDate)
4070
- .setStartDate(startDateState)
4071
- .setProgram(this.programId)
4072
- .setProgramStage(this.programStageId)
4073
- .setOrgUnit(orgUnitState)
4074
- .setOuMode(this.ouMode)
4075
- .setPagination(new Pager({
4076
- pageSize: pager.pageSize,
4077
- page: pager.page,
4078
- }))
4079
- .get()
4080
- .then((response) => {
4081
- const eventsResponse = {
4082
- events: response.data,
4083
- pager: pager,
4084
- // orgUnitsMap: fetchedOrgUnits,
4085
- };
4086
- const { columns, data } = getEvents({ data: eventsResponse }, this.programStageId, pager, metaData);
4087
- // const filterableColumnIdsSet = new Set(
4088
- // this.filterableColumnIds
4089
- // );
4090
- // const updatedFilterableColumnIds: ColumnDefinition[] =
4091
- // columns.filter((column) =>
4092
- // filterableColumnIdsSet.has(column.key)
4093
- // );
4094
- // const finalColumns: ColumnDefinition[] = addActionsColumn(
4095
- // [{ label: '#', key: 'index' }, ...updatedFilterableColumnIds],
4096
- // this.actionOptions
4097
- // );
4098
- let updatedFilterableColumnIds;
4099
- if (Array.isArray(this.filterableColumnIds) &&
4100
- this.filterableColumnIds.length > 0) {
4101
- const filterableColumnIdsSet = new Set(this.filterableColumnIds);
4102
- updatedFilterableColumnIds = columns.filter((column) => filterableColumnIdsSet.has(column.key));
4283
+ const fetchEventData = async () => {
4284
+ try {
4285
+ setError(null);
4286
+ setLoading(true);
4287
+ const response = await d2.eventModule.event
4288
+ .setEndDate(endDate)
4289
+ .setStartDate(startDateState)
4290
+ .setProgram(this.programId)
4291
+ .setProgramStage(this.programStageId)
4292
+ .setOrgUnit(orgUnitState)
4293
+ .setOuMode(this.ouMode)
4294
+ .setPagination(new Pager({
4295
+ pageSize: pager.pageSize,
4296
+ page: pager.page,
4297
+ }))
4298
+ .get();
4299
+ if (response.responseStatus.status !== 200) {
4300
+ throw new Error('failed to load data.');
4301
+ }
4302
+ const eventsResponse = {
4303
+ events: response.data,
4304
+ pager: pager,
4305
+ // orgUnitsMap: fetchedOrgUnits,
4306
+ };
4307
+ const { columns, data } = getEvents({ data: eventsResponse }, this.programStageId, pager, metaData);
4308
+ // const filterableColumnIdsSet = new Set(
4309
+ // this.filterableColumnIds
4310
+ // );
4311
+ // const updatedFilterableColumnIds: ColumnDefinition[] =
4312
+ // columns.filter((column) =>
4313
+ // filterableColumnIdsSet.has(column.key)
4314
+ // );
4315
+ // const finalColumns: ColumnDefinition[] = addActionsColumn(
4316
+ // [{ label: '#', key: 'index' }, ...updatedFilterableColumnIds],
4317
+ // this.actionOptions
4318
+ // );
4319
+ let updatedFilterableColumnIds;
4320
+ if (Array.isArray(this.filterableColumnIds) &&
4321
+ this.filterableColumnIds.length > 0) {
4322
+ const filterableColumnIdsSet = new Set(this.filterableColumnIds);
4323
+ updatedFilterableColumnIds = columns.filter((column) => filterableColumnIdsSet.has(column.key));
4324
+ }
4325
+ else {
4326
+ updatedFilterableColumnIds = columns;
4327
+ }
4328
+ const finalColumns = addActionsColumn([{ label: '#', key: 'index' }, ...updatedFilterableColumnIds], this.actionOptions);
4329
+ const pagerResponse = response.pagination;
4330
+ setColumns(finalColumns);
4331
+ setData(data);
4332
+ setPager(new Pager(pagerResponse || {}));
4103
4333
  }
4104
- else {
4105
- updatedFilterableColumnIds = columns;
4334
+ catch {
4335
+ console.error('Failed to fetch event data:', error);
4336
+ setError('Could not load records. Please reload.');
4106
4337
  }
4107
- const finalColumns = addActionsColumn([{ label: '#', key: 'index' }, ...updatedFilterableColumnIds], this.actionOptions);
4108
- const pagerResponse = response.pagination;
4109
- setLoading(false);
4110
- setColumns(finalColumns);
4111
- setData(data);
4112
- setPager(new Pager(pagerResponse || {}));
4113
- });
4338
+ finally {
4339
+ setLoading(false);
4340
+ }
4341
+ };
4342
+ fetchEventData();
4114
4343
  }
4115
4344
  else if (isTracker) {
4116
4345
  const fetchTrackerData = async () => {
4117
4346
  try {
4347
+ setError(null);
4118
4348
  setLoading(true);
4119
4349
  const response = await d2.trackerModule.trackedEntity
4120
4350
  .setEndDate(endDate)
@@ -4134,6 +4364,9 @@ class LineListTableComponent extends ReactWrapperModule {
4134
4364
  new DataOrderCriteria().setField('createdAt').setOrder('desc'),
4135
4365
  ])
4136
4366
  .get();
4367
+ if (response.responseStatus.status !== 200) {
4368
+ throw new Error('failed to load data.');
4369
+ }
4137
4370
  const trackedEntityInstances = Array.isArray(response.data)
4138
4371
  ? response.data
4139
4372
  : [response.data];
@@ -4151,7 +4384,7 @@ class LineListTableComponent extends ReactWrapperModule {
4151
4384
  pager: pager,
4152
4385
  orgUnitsMap: fetchedOrgUnits,
4153
4386
  };
4154
- const { columns, data, filteredEntityColumns, orgUnitLabel } = getTrackedEntityTableData({ data: trackedEntityResponse }, this.programId, pager, metaData);
4387
+ const { columns, data, filteredEntityColumns, orgUnitLabel } = getTrackedEntityTableData({ data: trackedEntityResponse }, this.programId, pager, metaData, this.searcheableDataElements);
4155
4388
  setFilteredColumns((prev) => filteredEntityColumns.length > 0 ? filteredEntityColumns : prev);
4156
4389
  let updatedFilterableColumnIds;
4157
4390
  if (Array.isArray(this.filterableColumnIds) &&
@@ -4168,7 +4401,6 @@ class LineListTableComponent extends ReactWrapperModule {
4168
4401
  // this.actionOptions
4169
4402
  // );
4170
4403
  const pagerResponse = response.pagination;
4171
- // setLoading(false);
4172
4404
  setColumns(finalColumns);
4173
4405
  setData(data);
4174
4406
  setPager(new Pager(pagerResponse || {}));
@@ -4211,7 +4443,6 @@ class LineListTableComponent extends ReactWrapperModule {
4211
4443
  : cell;
4212
4444
  }));
4213
4445
  const worksheetData = [header, ...rows];
4214
- // Creates worksheet and workbook, then writes to file
4215
4446
  const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);
4216
4447
  const workbook = XLSX.utils.book_new();
4217
4448
  XLSX.utils.book_append_sheet(workbook, worksheet, 'LineListData');
@@ -4233,7 +4464,6 @@ class LineListTableComponent extends ReactWrapperModule {
4233
4464
  const header = filteredColumns.map((col) => `"${col.label}"`).join(',');
4234
4465
  const csvData = data.map((row) => filteredColumns.map((col) => `"${safeValue(row[col.key])}"`).join(','));
4235
4466
  const csvContent = [header, ...csvData].join('\n');
4236
- // Creates a Blob and triggers the download
4237
4467
  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
4238
4468
  const url = URL.createObjectURL(blob);
4239
4469
  const link = document.createElement('a');
@@ -4243,7 +4473,7 @@ class LineListTableComponent extends ReactWrapperModule {
4243
4473
  link.click();
4244
4474
  document.body.removeChild(link);
4245
4475
  };
4246
- const handleInputChange = (key, value) => {
4476
+ const handleInputChange = (key, value, type) => {
4247
4477
  setInputValues((prevValues) => ({
4248
4478
  ...prevValues,
4249
4479
  [key]: value ?? '',
@@ -4252,20 +4482,36 @@ class LineListTableComponent extends ReactWrapperModule {
4252
4482
  // Removes old filter for this key
4253
4483
  const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
4254
4484
  // adds new filter only if value is not empty
4255
- const updatedFilters = value.trim()
4256
- ? [
4257
- ...filteredFilters,
4258
- new DataQueryFilter()
4259
- .setAttribute(key)
4260
- .setCondition(DataFilterCondition.Like)
4261
- .setValue(value),
4262
- ]
4263
- : filteredFilters;
4485
+ let updatedFilters;
4486
+ if (type === 'dataElement') {
4487
+ updatedFilters =
4488
+ value && value.length
4489
+ ? [
4490
+ ...filteredFilters,
4491
+ new DataQueryFilter()
4492
+ .setAttribute(key)
4493
+ .setCondition(DataFilterCondition.Like)
4494
+ .setValue(value)
4495
+ .setType('DATA_ELEMENT'),
4496
+ ]
4497
+ : filteredFilters;
4498
+ }
4499
+ else {
4500
+ updatedFilters = value.trim()
4501
+ ? [
4502
+ ...filteredFilters,
4503
+ new DataQueryFilter()
4504
+ .setAttribute(key)
4505
+ .setCondition(DataFilterCondition.Like)
4506
+ .setValue(value),
4507
+ ]
4508
+ : filteredFilters;
4509
+ }
4264
4510
  return updatedFilters;
4265
4511
  });
4266
4512
  };
4267
4513
  //TODO: MERGE THIS WITH HANDLE INPUT CHANGE PUT A CHECK FOR IF ITS A SELECT FIELD TO USE EQ
4268
- const handleInputChangeForSelectField = (key, value) => {
4514
+ const handleInputChangeForSelectField = (key, value, type) => {
4269
4515
  setInputValues((prevValues) => ({
4270
4516
  ...prevValues,
4271
4517
  [key]: value ?? '',
@@ -4274,19 +4520,35 @@ class LineListTableComponent extends ReactWrapperModule {
4274
4520
  // Removes existing filter for the same key (attribute)
4275
4521
  const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
4276
4522
  // adds new filter only if value is not empty
4277
- const updatedFilters = value.trim()
4278
- ? [
4279
- ...filteredFilters,
4280
- new DataQueryFilter()
4281
- .setAttribute(key)
4282
- .setCondition(DataFilterCondition.Equal)
4283
- .setValue(value),
4284
- ]
4285
- : filteredFilters;
4523
+ let updatedFilters;
4524
+ if (type === 'dataElement') {
4525
+ updatedFilters =
4526
+ value && value.length
4527
+ ? [
4528
+ ...filteredFilters,
4529
+ new DataQueryFilter()
4530
+ .setAttribute(key)
4531
+ .setCondition(DataFilterCondition.Equal)
4532
+ .setValue(value)
4533
+ .setType('DATA_ELEMENT'),
4534
+ ]
4535
+ : filteredFilters;
4536
+ }
4537
+ else {
4538
+ updatedFilters = value.trim()
4539
+ ? [
4540
+ ...filteredFilters,
4541
+ new DataQueryFilter()
4542
+ .setAttribute(key)
4543
+ .setCondition(DataFilterCondition.Equal)
4544
+ .setValue(value),
4545
+ ]
4546
+ : filteredFilters;
4547
+ }
4286
4548
  return updatedFilters;
4287
4549
  });
4288
4550
  };
4289
- const handleDateSelect = (key, selectedDate) => {
4551
+ const handleDateSelect = (key, selectedDate, type) => {
4290
4552
  const selectedDateString = selectedDate?.calendarDateString ?? '';
4291
4553
  // Updates dateStates
4292
4554
  setDateStates((prevDateStates) => ({
@@ -4296,30 +4558,51 @@ class LineListTableComponent extends ReactWrapperModule {
4296
4558
  // Updates dataQueryFilters
4297
4559
  setTempDataQueryFiltersState((prevFilters) => {
4298
4560
  const filteredFilters = (prevFilters || []).filter((f) => f.attribute !== key);
4299
- const updatedFilters = selectedDateString.trim()
4300
- ? [
4301
- ...filteredFilters,
4302
- new DataQueryFilter()
4303
- .setAttribute(key)
4304
- .setCondition(DataFilterCondition.Equal)
4305
- .setValue(selectedDateString),
4306
- ]
4307
- : filteredFilters;
4561
+ // const updatedFilters = selectedDateString.trim()
4562
+ // ? [
4563
+ // ...filteredFilters,
4564
+ // new DataQueryFilter()
4565
+ // .setAttribute(key)
4566
+ // .setCondition(DataFilterCondition.Equal)
4567
+ // .setValue(selectedDateString),
4568
+ // ]
4569
+ // : filteredFilters;
4570
+ let updatedFilters;
4571
+ if (type === 'dataElement') {
4572
+ updatedFilters = selectedDateString.trim()
4573
+ ? [
4574
+ ...filteredFilters,
4575
+ new DataQueryFilter()
4576
+ .setAttribute(key)
4577
+ .setCondition(DataFilterCondition.Equal)
4578
+ .setValue(selectedDateString)
4579
+ .setType('DATA_ELEMENT'),
4580
+ ]
4581
+ : filteredFilters;
4582
+ }
4583
+ else {
4584
+ updatedFilters = selectedDateString.trim()
4585
+ ? [
4586
+ ...filteredFilters,
4587
+ new DataQueryFilter()
4588
+ .setAttribute(key)
4589
+ .setCondition(DataFilterCondition.Equal)
4590
+ .setValue(selectedDateString),
4591
+ ]
4592
+ : filteredFilters;
4593
+ }
4308
4594
  return updatedFilters;
4309
4595
  });
4310
4596
  };
4311
- const handleSearch = () => (setDataQueryFiltersState(tempDataQueryFiltersState),
4312
- setStartDateState(tempStartDateState),
4313
- setEndDateState(tempEndDateState),
4314
- setOrgUnitState(tempOrgUnitState));
4597
+ const handleAdditionalFilters = () => setDataQueryFiltersState(tempDataQueryFiltersState);
4598
+ const handleStartDateFilter = () => setStartDateState(tempStartDateState);
4599
+ const handleEndDateFilter = () => setEndDateState(tempEndDateState);
4600
+ const handleOrgUnitFilter = () => setOrgUnitState(tempOrgUnitState);
4315
4601
  function getTextColorFromBackGround(hex) {
4316
- // Removes the hash if present
4317
4602
  hex = hex.replace('#', '');
4318
- // Converts to RGB
4319
4603
  const r = parseInt(hex.substr(0, 2), 16);
4320
4604
  const g = parseInt(hex.substr(2, 2), 16);
4321
4605
  const b = parseInt(hex.substr(4, 2), 16);
4322
- // YIQ formula to calculate brightness
4323
4606
  const yiq = (r * 299 + g * 587 + b * 114) / 1000;
4324
4607
  // Returns black for light backgrounds, white for dark backgrounds
4325
4608
  return yiq >= 128 ? colors$1.grey700 : '#FFFFFF';
@@ -4344,8 +4627,8 @@ class LineListTableComponent extends ReactWrapperModule {
4344
4627
  React__default.createElement(MenuItem$1, { label: "Download Csv", onClick: handleCsvDownload }),
4345
4628
  React__default.createElement(MenuItem$1, { label: "Download Excel", onClick: handleExcelDownload })), value: "Download" }, "Download"))),
4346
4629
  orgUnitModalVisible && (React__default.createElement(OrgUnitSelector, { hide: hide, setHide: setHide, selectedOrgUnit: selectedOrgUnit, setSelectedOrgUnit: setSelectedOrgUnit, setOrgUnitState: setOrgUnitState, setTempOrgUnitState: setTempOrgUnitState, tempOrgUnitState: tempOrgUnitState })),
4347
- this.showFilters && (React__default.createElement(FilterToolbar, { orgUnitLabel: orgUnitLabel, selectedOrgUnit: selectedOrgUnit, setSelectedOrgUnit: setSelectedOrgUnit, setOrgUnitState: setOrgUnitState, defaultOrgUnit: defaultOrgUnit, setHide: setHide, startDateState: startDateState, setStartDateState: setStartDateState, endDateState: endDateState, setEndDateState: setEndDateState, visibleFilters: visibleFilters, dateStates: dateStates, inputValues: inputValues, setInputValues: setInputValues, handleInputChange: handleInputChange, handleInputChangeForSelectField: handleInputChangeForSelectField, handleDateSelect: handleDateSelect, prevValue: prevValue, setPrevValue: setPrevValue, showAllFilters: showAllFilters, setShowAllFilters: setShowAllFilters, handleSearch: handleSearch, setTempStartDateState: setTempStartDateState, setTempEndDateState: setTempEndDateState, setTempOrgUnitState: setTempOrgUnitState, tempStartDateState: tempStartDateState, tempEndDateState: tempEndDateState, tempOrgUnitState: tempOrgUnitState, dataQueryFiltersState: dataQueryFiltersState, setDataQueryFiltersState: setDataQueryFiltersState, SetOrgUnitModalVisible: setOrgUnitModalVisible, showEnrollmentDates: this.showEnrollmentDates })),
4348
- React__default.createElement(LineListTable, { columns: columns, data: data, pager: pager, setPager: setPager, getTextColorFromBackGround: getTextColorFromBackGround, actionOptions: this.actionOptions, actionOptionOrientation: this.actionOptionOrientation, actionSelected: this.actionSelected, selectable: selectable, rowsSelected: this.rowsSelected, showActionButtons: showActionButtons })))));
4630
+ this.showFilters && (React__default.createElement(FilterToolbar, { orgUnitLabel: orgUnitLabel, selectedOrgUnit: selectedOrgUnit, setSelectedOrgUnit: setSelectedOrgUnit, setOrgUnitState: setOrgUnitState, defaultOrgUnit: defaultOrgUnit, setHide: setHide, startDateState: startDateState, setStartDateState: setStartDateState, endDateState: endDateState, setEndDateState: setEndDateState, visibleFilters: visibleFilters, dateStates: dateStates, inputValues: inputValues, setInputValues: setInputValues, handleInputChange: handleInputChange, handleInputChangeForSelectField: handleInputChangeForSelectField, handleDateSelect: handleDateSelect, showAllFilters: showAllFilters, setShowAllFilters: setShowAllFilters, setTempStartDateState: setTempStartDateState, setTempEndDateState: setTempEndDateState, setTempOrgUnitState: setTempOrgUnitState, tempStartDateState: tempStartDateState, tempEndDateState: tempEndDateState, tempOrgUnitState: tempOrgUnitState, dataQueryFiltersState: dataQueryFiltersState, setDataQueryFiltersState: setDataQueryFiltersState, SetOrgUnitModalVisible: setOrgUnitModalVisible, showEnrollmentDates: this.showEnrollmentDates, handleAdditionalFilters: handleAdditionalFilters, handleStartDateFilter: handleStartDateFilter, handleEndDateFilter: handleEndDateFilter, handleOrgUnitFilter: handleOrgUnitFilter, setDateStates: setDateStates, prevInputValues: prevInputValues, setPrevInputValues: setPrevInputValues, setTempDataQueryFiltersState: setTempDataQueryFiltersState, prevDateStates: prevDateStates, setPrevDateStates: setPrevDateStates, prevSelectedOrgUnit: prevSelectedOrgUnit, setPrevSelectedOrgUnit: setPrevSelectedOrgUnit })),
4631
+ React__default.createElement(LineListTable, { columns: columns, data: data, pager: pager, setPager: setPager, getTextColorFromBackGround: getTextColorFromBackGround, actionOptions: this.actionOptions, actionOptionOrientation: this.actionOptionOrientation, actionSelected: this.actionSelected, selectable: selectable, rowsSelected: this.rowsSelected, showActionButtons: showActionButtons, error: error })))));
4349
4632
  };
4350
4633
  }
4351
4634
  ngOnChanges(changes) {
@@ -4394,7 +4677,7 @@ class LineListTableComponent extends ReactWrapperModule {
4394
4677
  this.render();
4395
4678
  }
4396
4679
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4397
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "ng-dhis2-ui-line-list", inputs: { triggerToken: "triggerToken", programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", actionOptionOrientation: "actionOptionOrientation", attributeFilters: "attributeFilters", useOuModeWithOlderDHIS2Instance: "useOuModeWithOlderDHIS2Instance", startDate: "startDate", endDate: "endDate", dataQueryFilters: "dataQueryFilters", ouMode: "ouMode", isButtonLoading: "isButtonLoading", buttonFilter: "buttonFilter", filterRootOrgUnit: "filterRootOrgUnit", showFilters: "showFilters", isOptionSetNameVisible: "isOptionSetNameVisible", allowRowsSelection: "allowRowsSelection", enrollmentStatus: "enrollmentStatus", filterableColumnIds: "filterableColumnIds", triggerRefetch: "triggerRefetch", eventStatus: "eventStatus", showActionButtons: "showActionButtons", showEnrollmentDates: "showEnrollmentDates", showDownloadButton: "showDownloadButton" }, outputs: { actionSelected: "actionSelected", rowsSelected: "rowsSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["@charset \"UTF-8\";::ng-deep .custom-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-input div{margin:0!important}::ng-deep .custom-input label{font-size:12px;padding-right:0}::ng-deep .custom-input input{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-input input:focus{border:none!important;box-shadow:none!important}::ng-deep .custom-input [data-test=calendar-clear-button]{background-color:#f2f2f2!important;color:#870808!important;border-radius:6px!important;padding:4px 10px!important;font-size:0!important}::ng-deep .custom-input [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:14px;color:#870808}::ng-deep .custom-input [data-test=calendar-clear-button]:hover{background-color:#ddd}::ng-deep .calendar-input-wrapper{position:relative}::ng-deep .calendar-input-wrapper .custom-input{position:relative;width:100%;display:flex;align-items:center}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]{right:8px;bottom:14px;margin:auto;display:flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:0!important;background-color:#a0adba!important;border-radius:50%;padding:2px;cursor:pointer}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:10px;color:#f0f0f0}::ng-deep .calendar-input-wrapper input{padding-right:40px!important;height:40px;line-height:40px;box-sizing:border-box}::ng-deep .custom-input label{color:gray!important;opacity:1}::ng-deep .table-top-toolbar{background-color:var(--colors-grey100)!important;color:var(--colors-grey900)!important}::ng-deep .custom-select-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-select-input div{margin:0!important}::ng-deep .custom-select-input [data-test=dhis2-uiwidgets-singleselectfield-label]{font-size:12px;color:gray!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]:focus-within{box-shadow:none!important}::ng-deep .custom-select-input input:focus{border:none!important;box-shadow:none!important}\n"] }); }
4680
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "ng-dhis2-ui-line-list", inputs: { triggerToken: "triggerToken", programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", actionOptionOrientation: "actionOptionOrientation", attributeFilters: "attributeFilters", useOuModeWithOlderDHIS2Instance: "useOuModeWithOlderDHIS2Instance", startDate: "startDate", endDate: "endDate", dataQueryFilters: "dataQueryFilters", ouMode: "ouMode", isButtonLoading: "isButtonLoading", buttonFilter: "buttonFilter", filterRootOrgUnit: "filterRootOrgUnit", showFilters: "showFilters", isOptionSetNameVisible: "isOptionSetNameVisible", allowRowsSelection: "allowRowsSelection", enrollmentStatus: "enrollmentStatus", filterableColumnIds: "filterableColumnIds", triggerRefetch: "triggerRefetch", eventStatus: "eventStatus", showActionButtons: "showActionButtons", showEnrollmentDates: "showEnrollmentDates", showDownloadButton: "showDownloadButton", searcheableDataElements: "searcheableDataElements" }, outputs: { actionSelected: "actionSelected", rowsSelected: "rowsSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["@charset \"UTF-8\";::ng-deep .custom-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-input div{margin:0!important}::ng-deep .custom-input label{font-size:12px;padding-right:0}::ng-deep .custom-input input{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-input input:focus{border:none!important;box-shadow:none!important}::ng-deep .custom-input [data-test=calendar-clear-button]{background-color:#f2f2f2!important;color:#870808!important;border-radius:6px!important;padding:4px 10px!important;font-size:0!important}::ng-deep .custom-input [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:14px;color:#870808}::ng-deep .custom-input [data-test=calendar-clear-button]:hover{background-color:#ddd}::ng-deep .calendar-input-wrapper{position:relative}::ng-deep .calendar-input-wrapper .custom-input{position:relative;width:100%;display:flex;align-items:center}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]{right:8px;bottom:14px;margin:auto;display:flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:0!important;background-color:#a0adba!important;border-radius:50%;padding:2px;cursor:pointer}::ng-deep .calendar-input-wrapper [data-test=calendar-clear-button]:before{content:\"\\2715\";font-size:10px;color:#f0f0f0}::ng-deep .calendar-input-wrapper input{padding-right:40px!important;height:40px;line-height:40px;box-sizing:border-box}::ng-deep .custom-input label{color:gray!important;opacity:1}::ng-deep .table-top-toolbar{background-color:var(--colors-grey100)!important;color:var(--colors-grey900)!important}::ng-deep .custom-select-input{display:flex!important;gap:4px!important;align-items:center!important;border:1px solid #9fadba!important;border-radius:4px!important;margin:0;padding:0 0 0 8px;background-color:#fff!important}::ng-deep .custom-select-input div{margin:0!important}::ng-deep .custom-select-input [data-test=dhis2-uiwidgets-singleselectfield-label]{font-size:12px;color:gray!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]{border:none!important;font-size:12px!important;display:flex;align-items:center;padding-left:4px;height:40px;outline:none!important;box-shadow:none!important}::ng-deep .custom-select-input [data-test=dhis2-uicore-select-input]:focus-within{box-shadow:none!important}::ng-deep .custom-select-input input:focus{border:none!important;box-shadow:none!important}\n"] }); }
4398
4681
  }
4399
4682
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
4400
4683
  type: Component,
@@ -4453,6 +4736,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
4453
4736
  type: Input
4454
4737
  }], showDownloadButton: [{
4455
4738
  type: Input
4739
+ }], searcheableDataElements: [{
4740
+ type: Input
4456
4741
  }] } });
4457
4742
 
4458
4743
  class LineListModule {
@@ -6215,7 +6500,11 @@ class BaseFormFieldComponent extends ReactWrapperModule {
6215
6500
  setTouched(true);
6216
6501
  };
6217
6502
  const checkValueUniqueness = async () => {
6218
- if (this.field().unique || (this.field().extension?.isDataElementUnique ?? false) && value && value.length > 0 && touched) {
6503
+ if (this.field().unique ||
6504
+ ((this.field().extension?.isDataElementUnique ?? false) &&
6505
+ value &&
6506
+ value.length > 0 &&
6507
+ touched)) {
6219
6508
  // if (this.field().unique && value && value.length > 0 && touched) {
6220
6509
  setCheckingUniqueness(true);
6221
6510
  setRecordExistError(undefined);
@@ -6279,6 +6568,13 @@ class BaseFormFieldComponent extends ReactWrapperModule {
6279
6568
  }, onBlur: () => {
6280
6569
  checkValueUniqueness();
6281
6570
  }, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: option.key, label: option.label, value: option.value })))));
6571
+ case 'date':
6572
+ case 'date-time':
6573
+ return (React__default.createElement(InputField$1, { error: hasError, validationText: validationError, type: this.field().type, inputWidth: inputWidth, required: this.field().required, name: this.field().id, label: this.label(), min: this.field().min?.toString(), max: this.field().max?.toString(), placeholder: this.placeholder(), value: value, readOnly: disabled, onChange: (event) => {
6574
+ onValueChange(event.value);
6575
+ }, onBlur: () => {
6576
+ checkValueUniqueness();
6577
+ } }));
6282
6578
  case 'file':
6283
6579
  return (React__default.createElement(React__default.Fragment, null,
6284
6580
  React__default.createElement(FileUploadField, { label: this.label(), id: this.field().id, hasError: hasError, required: this.field().required, validationText: validationError, performUpload: true, uploadUrl: 'fileResources', onUploadSuccess: (fileId) => {