@iapps/ng-dhis2-ui 1.2.97 → 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.
- package/fesm2022/iapps-ng-dhis2-ui.mjs +570 -261
- package/fesm2022/iapps-ng-dhis2-ui.mjs.map +1 -1
- package/lib/modules/line-list/components/table/filterToolbar.d.ts +1 -1
- package/lib/modules/line-list/components/table/lineListTable.d.ts +1 -1
- package/lib/modules/line-list/components/table/tableBody.d.ts +1 -1
- package/lib/modules/line-list/containers/line-list.component.d.ts +2 -1
- package/lib/modules/line-list/utils/tei-table-data-utils.d.ts +1 -1
- package/package.json +1 -1
|
@@ -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,
|
|
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,
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
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(
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3323
|
-
|
|
3324
|
-
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3336
|
-
|
|
3337
|
-
|
|
3338
|
-
|
|
3339
|
-
|
|
3340
|
-
|
|
3341
|
-
|
|
3342
|
-
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
|
|
3346
|
-
|
|
3347
|
-
|
|
3348
|
-
|
|
3349
|
-
|
|
3350
|
-
|
|
3351
|
-
|
|
3352
|
-
|
|
3353
|
-
|
|
3354
|
-
|
|
3355
|
-
|
|
3356
|
-
|
|
3357
|
-
|
|
3358
|
-
|
|
3359
|
-
|
|
3360
|
-
|
|
3361
|
-
|
|
3362
|
-
}
|
|
3363
|
-
|
|
3364
|
-
|
|
3365
|
-
|
|
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
|
-
|
|
3369
|
-
|
|
3370
|
-
|
|
3371
|
-
|
|
3372
|
-
|
|
3373
|
-
|
|
3374
|
-
|
|
3375
|
-
|
|
3376
|
-
|
|
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,
|
|
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
|
-
|
|
3762
|
-
|
|
3763
|
-
|
|
3764
|
-
|
|
3765
|
-
|
|
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,27 +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,
|
|
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);
|
|
4232
|
+
const [error, setError] = useState(null);
|
|
4233
|
+
const [prevInputValues, setPrevInputValues] = useState({});
|
|
4014
4234
|
const d2 = window.d2Web;
|
|
4015
4235
|
// Stores updaters in refs for Angular to access
|
|
4016
4236
|
const updateRefs = useRef({
|
|
@@ -4027,24 +4247,30 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4027
4247
|
});
|
|
4028
4248
|
useEffect(() => {
|
|
4029
4249
|
this.setReactStateUpdaters?.(updateRefs.current);
|
|
4030
|
-
}, []);
|
|
4031
|
-
useEffect(() => {
|
|
4032
|
-
setLoading(true);
|
|
4033
4250
|
const fetchmetaData = async () => {
|
|
4251
|
+
setLoading(true);
|
|
4252
|
+
if (!this.programId) {
|
|
4253
|
+
setMetaData(null);
|
|
4254
|
+
setLoading(false);
|
|
4255
|
+
return;
|
|
4256
|
+
}
|
|
4257
|
+
setError(null);
|
|
4034
4258
|
try {
|
|
4035
4259
|
const trackerResponse = (await d2.trackerModule.trackedEntity
|
|
4036
4260
|
.setProgram(this.programId)
|
|
4037
4261
|
.getMetaData({ skipProgramRules: true }));
|
|
4262
|
+
if (!trackerResponse || !trackerResponse.programType) {
|
|
4263
|
+
throw new Error('failed to load data.');
|
|
4264
|
+
}
|
|
4038
4265
|
const data = trackerResponse;
|
|
4039
4266
|
setMetaData(data);
|
|
4040
4267
|
}
|
|
4041
4268
|
catch (error) {
|
|
4042
|
-
|
|
4269
|
+
setError(error);
|
|
4270
|
+
setLoading(false);
|
|
4043
4271
|
}
|
|
4044
4272
|
};
|
|
4045
|
-
|
|
4046
|
-
fetchmetaData();
|
|
4047
|
-
}
|
|
4273
|
+
fetchmetaData();
|
|
4048
4274
|
}, []);
|
|
4049
4275
|
useEffect(() => {
|
|
4050
4276
|
if (!metaData) {
|
|
@@ -4054,122 +4280,141 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4054
4280
|
const isEvent = metaData.programType === 'WITHOUT_REGISTRATION';
|
|
4055
4281
|
const endDate = endDateState ?? format(addDays(new Date(), 1), 'yyyy-MM-dd');
|
|
4056
4282
|
if (this.programStageId || isEvent) {
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
|
|
4060
|
-
|
|
4061
|
-
|
|
4062
|
-
|
|
4063
|
-
|
|
4064
|
-
|
|
4065
|
-
|
|
4066
|
-
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
|
|
4077
|
-
|
|
4078
|
-
|
|
4079
|
-
|
|
4080
|
-
|
|
4081
|
-
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
4087
|
-
|
|
4088
|
-
|
|
4089
|
-
|
|
4090
|
-
|
|
4091
|
-
|
|
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 || {}));
|
|
4092
4333
|
}
|
|
4093
|
-
|
|
4094
|
-
|
|
4334
|
+
catch {
|
|
4335
|
+
console.error('Failed to fetch event data:', error);
|
|
4336
|
+
setError('Could not load records. Please reload.');
|
|
4095
4337
|
}
|
|
4096
|
-
|
|
4097
|
-
|
|
4098
|
-
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
setPager(new Pager(pagerResponse || {}));
|
|
4102
|
-
});
|
|
4338
|
+
finally {
|
|
4339
|
+
setLoading(false);
|
|
4340
|
+
}
|
|
4341
|
+
};
|
|
4342
|
+
fetchEventData();
|
|
4103
4343
|
}
|
|
4104
4344
|
else if (isTracker) {
|
|
4105
|
-
|
|
4106
|
-
|
|
4107
|
-
|
|
4108
|
-
|
|
4109
|
-
|
|
4110
|
-
|
|
4111
|
-
|
|
4112
|
-
|
|
4113
|
-
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
|
|
4117
|
-
|
|
4118
|
-
|
|
4119
|
-
|
|
4120
|
-
|
|
4121
|
-
|
|
4122
|
-
|
|
4123
|
-
|
|
4124
|
-
|
|
4125
|
-
|
|
4126
|
-
|
|
4127
|
-
|
|
4128
|
-
|
|
4129
|
-
|
|
4130
|
-
|
|
4131
|
-
|
|
4132
|
-
|
|
4133
|
-
|
|
4134
|
-
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
|
|
4157
|
-
|
|
4158
|
-
|
|
4159
|
-
|
|
4160
|
-
|
|
4161
|
-
|
|
4162
|
-
|
|
4163
|
-
|
|
4164
|
-
|
|
4165
|
-
|
|
4166
|
-
}
|
|
4167
|
-
|
|
4168
|
-
|
|
4169
|
-
|
|
4170
|
-
|
|
4171
|
-
|
|
4172
|
-
|
|
4345
|
+
const fetchTrackerData = async () => {
|
|
4346
|
+
try {
|
|
4347
|
+
setError(null);
|
|
4348
|
+
setLoading(true);
|
|
4349
|
+
const response = await d2.trackerModule.trackedEntity
|
|
4350
|
+
.setEndDate(endDate)
|
|
4351
|
+
.setStartDate(startDateState)
|
|
4352
|
+
.setProgram(this.programId)
|
|
4353
|
+
.setProgramStage(this.programStageId)
|
|
4354
|
+
.setOrgUnit(orgUnitState)
|
|
4355
|
+
.setOuMode(this.ouMode)
|
|
4356
|
+
.setStatus(this.enrollmentStatus)
|
|
4357
|
+
.setEventStatus(this.eventStatus?.status, this.eventStatus?.programStage)
|
|
4358
|
+
.setFilters(dataQueryFiltersState)
|
|
4359
|
+
.setPagination(new Pager({
|
|
4360
|
+
pageSize: pager.pageSize,
|
|
4361
|
+
page: pager.page,
|
|
4362
|
+
}))
|
|
4363
|
+
.setOrderCriterias([
|
|
4364
|
+
new DataOrderCriteria().setField('createdAt').setOrder('desc'),
|
|
4365
|
+
])
|
|
4366
|
+
.get();
|
|
4367
|
+
if (response.responseStatus.status !== 200) {
|
|
4368
|
+
throw new Error('failed to load data.');
|
|
4369
|
+
}
|
|
4370
|
+
const trackedEntityInstances = Array.isArray(response.data)
|
|
4371
|
+
? response.data
|
|
4372
|
+
: [response.data];
|
|
4373
|
+
const orgUnitIdsFromEnrollments = new Set(trackedEntityInstances.map((tei) => tei.latestEnrollment.orgUnit));
|
|
4374
|
+
const orgUnitsFromAttributes = new Set(trackedEntityInstances.flatMap((tei) => tei.attributes
|
|
4375
|
+
?.filter((attr) => attr.valueType === 'ORGANISATION_UNIT')
|
|
4376
|
+
.map((attr) => attr.value) || []));
|
|
4377
|
+
const uniqueOrgUnitIds = [
|
|
4378
|
+
...orgUnitIdsFromEnrollments,
|
|
4379
|
+
...orgUnitsFromAttributes,
|
|
4380
|
+
];
|
|
4381
|
+
const fetchedOrgUnits = await firstValueFrom(this.lineListService.fetchOrgUnits(uniqueOrgUnitIds));
|
|
4382
|
+
const trackedEntityResponse = {
|
|
4383
|
+
trackedEntityInstances: response.data,
|
|
4384
|
+
pager: pager,
|
|
4385
|
+
orgUnitsMap: fetchedOrgUnits,
|
|
4386
|
+
};
|
|
4387
|
+
const { columns, data, filteredEntityColumns, orgUnitLabel } = getTrackedEntityTableData({ data: trackedEntityResponse }, this.programId, pager, metaData, this.searcheableDataElements);
|
|
4388
|
+
setFilteredColumns((prev) => filteredEntityColumns.length > 0 ? filteredEntityColumns : prev);
|
|
4389
|
+
let updatedFilterableColumnIds;
|
|
4390
|
+
if (Array.isArray(this.filterableColumnIds) &&
|
|
4391
|
+
this.filterableColumnIds.length > 0) {
|
|
4392
|
+
const filterableColumnIdsSet = new Set(this.filterableColumnIds);
|
|
4393
|
+
updatedFilterableColumnIds = columns.filter((column) => filterableColumnIdsSet.has(column.key));
|
|
4394
|
+
}
|
|
4395
|
+
else {
|
|
4396
|
+
updatedFilterableColumnIds = columns;
|
|
4397
|
+
}
|
|
4398
|
+
const finalColumns = addActionsColumn([{ label: '#', key: 'index' }, ...updatedFilterableColumnIds], this.actionOptions);
|
|
4399
|
+
// const finalColumns: ColumnDefinition[] = addActionsColumn(
|
|
4400
|
+
// [{ label: '#', key: 'index' }, ...columns],
|
|
4401
|
+
// this.actionOptions
|
|
4402
|
+
// );
|
|
4403
|
+
const pagerResponse = response.pagination;
|
|
4404
|
+
setColumns(finalColumns);
|
|
4405
|
+
setData(data);
|
|
4406
|
+
setPager(new Pager(pagerResponse || {}));
|
|
4407
|
+
setOrgUnitLabel(orgUnitLabel);
|
|
4408
|
+
}
|
|
4409
|
+
catch (error) {
|
|
4410
|
+
console.error('Failed to fetch tracker data:', error);
|
|
4411
|
+
setError('Could not load records. Please reload.');
|
|
4412
|
+
}
|
|
4413
|
+
finally {
|
|
4414
|
+
setLoading(false);
|
|
4415
|
+
}
|
|
4416
|
+
};
|
|
4417
|
+
fetchTrackerData();
|
|
4173
4418
|
}
|
|
4174
4419
|
}, [
|
|
4175
4420
|
metaData,
|
|
@@ -4198,7 +4443,6 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4198
4443
|
: cell;
|
|
4199
4444
|
}));
|
|
4200
4445
|
const worksheetData = [header, ...rows];
|
|
4201
|
-
// Creates worksheet and workbook, then writes to file
|
|
4202
4446
|
const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);
|
|
4203
4447
|
const workbook = XLSX.utils.book_new();
|
|
4204
4448
|
XLSX.utils.book_append_sheet(workbook, worksheet, 'LineListData');
|
|
@@ -4220,7 +4464,6 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4220
4464
|
const header = filteredColumns.map((col) => `"${col.label}"`).join(',');
|
|
4221
4465
|
const csvData = data.map((row) => filteredColumns.map((col) => `"${safeValue(row[col.key])}"`).join(','));
|
|
4222
4466
|
const csvContent = [header, ...csvData].join('\n');
|
|
4223
|
-
// Creates a Blob and triggers the download
|
|
4224
4467
|
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
|
|
4225
4468
|
const url = URL.createObjectURL(blob);
|
|
4226
4469
|
const link = document.createElement('a');
|
|
@@ -4230,7 +4473,7 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4230
4473
|
link.click();
|
|
4231
4474
|
document.body.removeChild(link);
|
|
4232
4475
|
};
|
|
4233
|
-
const handleInputChange = (key, value) => {
|
|
4476
|
+
const handleInputChange = (key, value, type) => {
|
|
4234
4477
|
setInputValues((prevValues) => ({
|
|
4235
4478
|
...prevValues,
|
|
4236
4479
|
[key]: value ?? '',
|
|
@@ -4239,20 +4482,36 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4239
4482
|
// Removes old filter for this key
|
|
4240
4483
|
const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
|
|
4241
4484
|
// adds new filter only if value is not empty
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
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
|
+
}
|
|
4251
4510
|
return updatedFilters;
|
|
4252
4511
|
});
|
|
4253
4512
|
};
|
|
4254
4513
|
//TODO: MERGE THIS WITH HANDLE INPUT CHANGE PUT A CHECK FOR IF ITS A SELECT FIELD TO USE EQ
|
|
4255
|
-
const handleInputChangeForSelectField = (key, value) => {
|
|
4514
|
+
const handleInputChangeForSelectField = (key, value, type) => {
|
|
4256
4515
|
setInputValues((prevValues) => ({
|
|
4257
4516
|
...prevValues,
|
|
4258
4517
|
[key]: value ?? '',
|
|
@@ -4261,19 +4520,35 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4261
4520
|
// Removes existing filter for the same key (attribute)
|
|
4262
4521
|
const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
|
|
4263
4522
|
// adds new filter only if value is not empty
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
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
|
+
}
|
|
4273
4548
|
return updatedFilters;
|
|
4274
4549
|
});
|
|
4275
4550
|
};
|
|
4276
|
-
const handleDateSelect = (key, selectedDate) => {
|
|
4551
|
+
const handleDateSelect = (key, selectedDate, type) => {
|
|
4277
4552
|
const selectedDateString = selectedDate?.calendarDateString ?? '';
|
|
4278
4553
|
// Updates dateStates
|
|
4279
4554
|
setDateStates((prevDateStates) => ({
|
|
@@ -4283,30 +4558,51 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4283
4558
|
// Updates dataQueryFilters
|
|
4284
4559
|
setTempDataQueryFiltersState((prevFilters) => {
|
|
4285
4560
|
const filteredFilters = (prevFilters || []).filter((f) => f.attribute !== key);
|
|
4286
|
-
const updatedFilters = selectedDateString.trim()
|
|
4287
|
-
|
|
4288
|
-
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
|
|
4293
|
-
|
|
4294
|
-
|
|
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
|
+
}
|
|
4295
4594
|
return updatedFilters;
|
|
4296
4595
|
});
|
|
4297
4596
|
};
|
|
4298
|
-
const
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
|
|
4597
|
+
const handleAdditionalFilters = () => setDataQueryFiltersState(tempDataQueryFiltersState);
|
|
4598
|
+
const handleStartDateFilter = () => setStartDateState(tempStartDateState);
|
|
4599
|
+
const handleEndDateFilter = () => setEndDateState(tempEndDateState);
|
|
4600
|
+
const handleOrgUnitFilter = () => setOrgUnitState(tempOrgUnitState);
|
|
4302
4601
|
function getTextColorFromBackGround(hex) {
|
|
4303
|
-
// Removes the hash if present
|
|
4304
4602
|
hex = hex.replace('#', '');
|
|
4305
|
-
// Converts to RGB
|
|
4306
4603
|
const r = parseInt(hex.substr(0, 2), 16);
|
|
4307
4604
|
const g = parseInt(hex.substr(2, 2), 16);
|
|
4308
4605
|
const b = parseInt(hex.substr(4, 2), 16);
|
|
4309
|
-
// YIQ formula to calculate brightness
|
|
4310
4606
|
const yiq = (r * 299 + g * 587 + b * 114) / 1000;
|
|
4311
4607
|
// Returns black for light backgrounds, white for dark backgrounds
|
|
4312
4608
|
return yiq >= 128 ? colors$1.grey700 : '#FFFFFF';
|
|
@@ -4331,8 +4627,8 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4331
4627
|
React__default.createElement(MenuItem$1, { label: "Download Csv", onClick: handleCsvDownload }),
|
|
4332
4628
|
React__default.createElement(MenuItem$1, { label: "Download Excel", onClick: handleExcelDownload })), value: "Download" }, "Download"))),
|
|
4333
4629
|
orgUnitModalVisible && (React__default.createElement(OrgUnitSelector, { hide: hide, setHide: setHide, selectedOrgUnit: selectedOrgUnit, setSelectedOrgUnit: setSelectedOrgUnit, setOrgUnitState: setOrgUnitState, setTempOrgUnitState: setTempOrgUnitState, tempOrgUnitState: tempOrgUnitState })),
|
|
4334
|
-
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,
|
|
4335
|
-
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 })))));
|
|
4336
4632
|
};
|
|
4337
4633
|
}
|
|
4338
4634
|
ngOnChanges(changes) {
|
|
@@ -4381,7 +4677,7 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
4381
4677
|
this.render();
|
|
4382
4678
|
}
|
|
4383
4679
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4384
|
-
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"] }); }
|
|
4385
4681
|
}
|
|
4386
4682
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
|
|
4387
4683
|
type: Component,
|
|
@@ -4440,6 +4736,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
|
|
|
4440
4736
|
type: Input
|
|
4441
4737
|
}], showDownloadButton: [{
|
|
4442
4738
|
type: Input
|
|
4739
|
+
}], searcheableDataElements: [{
|
|
4740
|
+
type: Input
|
|
4443
4741
|
}] } });
|
|
4444
4742
|
|
|
4445
4743
|
class LineListModule {
|
|
@@ -6202,7 +6500,11 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
6202
6500
|
setTouched(true);
|
|
6203
6501
|
};
|
|
6204
6502
|
const checkValueUniqueness = async () => {
|
|
6205
|
-
if (this.field().unique ||
|
|
6503
|
+
if (this.field().unique ||
|
|
6504
|
+
((this.field().extension?.isDataElementUnique ?? false) &&
|
|
6505
|
+
value &&
|
|
6506
|
+
value.length > 0 &&
|
|
6507
|
+
touched)) {
|
|
6206
6508
|
// if (this.field().unique && value && value.length > 0 && touched) {
|
|
6207
6509
|
setCheckingUniqueness(true);
|
|
6208
6510
|
setRecordExistError(undefined);
|
|
@@ -6266,6 +6568,13 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
6266
6568
|
}, onBlur: () => {
|
|
6267
6569
|
checkValueUniqueness();
|
|
6268
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
|
+
} }));
|
|
6269
6578
|
case 'file':
|
|
6270
6579
|
return (React__default.createElement(React__default.Fragment, null,
|
|
6271
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) => {
|