@iapps/ng-dhis2-ui 1.2.98 → 1.2.100

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';
@@ -2891,6 +2891,7 @@ class OrganisationUnitSelectionConfig {
2891
2891
  this.allowSingleSelection = params?.allowSingleSelection || false;
2892
2892
  this.batchSize = params?.batchSize;
2893
2893
  this.additionalQueryFields = params?.additionalQueryFields;
2894
+ this.allowCaching = params?.allowCaching;
2894
2895
  }
2895
2896
  }
2896
2897
 
@@ -2899,10 +2900,10 @@ class OrganisationUnitSelectionConfig {
2899
2900
  // license that can be found in the LICENSE file.
2900
2901
 
2901
2902
  class OrganisationUnitSelectorComponent extends ReactWrapperModule {
2902
- constructor(elementRef, httpClient, ngZone) {
2903
+ constructor(elementRef, ngZone) {
2903
2904
  super(elementRef);
2904
- this.httpClient = httpClient;
2905
2905
  this.ngZone = ngZone;
2906
+ this.d2 = window.d2Web;
2906
2907
  this.selectedOrgUnits = [];
2907
2908
  this.orgUnitSelectionConfig = new OrganisationUnitSelectionConfig();
2908
2909
  this.selectOrgUnits = new EventEmitter();
@@ -2918,18 +2919,23 @@ class OrganisationUnitSelectorComponent extends ReactWrapperModule {
2918
2919
  this.reactDomRoot = ReactDOM.createRoot(this.elementRef.nativeElement);
2919
2920
  const rootOrgUnits = await this.getRootOrgUnits();
2920
2921
  const config = await this.getAppConfig();
2921
- this.component = () => (React__default.createElement(Provider, { config: config, plugin: false, parentAlertsAdd: undefined, showAlertsInPlugin: false }, React__default.createElement(OrgUnitDimension, { selected: this.selectedOrgUnits, hideGroupSelect: this.orgUnitSelectionConfig.hideGroupSelect, hideLevelSelect: this.orgUnitSelectionConfig.hideLevelSelect, hideUserOrgUnits: this.orgUnitSelectionConfig.hideUserOrgUnits, onSelect: (selectionEvent) => this.ngZone.run(() => {
2922
- this.onSelectItems(selectionEvent);
2923
- }), orgUnitGroupPromise: this.getOrgUnitGroups(), orgUnitLevelPromise: this.getOrgUnitLevels(), roots: rootOrgUnits })));
2924
- this.render();
2922
+ if (config) {
2923
+ this.component = () => (React__default.createElement(Provider, { config: config, plugin: false, parentAlertsAdd: undefined, showAlertsInPlugin: false }, React__default.createElement(OrgUnitDimension, { selected: this.selectedOrgUnits, hideGroupSelect: this.orgUnitSelectionConfig.hideGroupSelect, hideLevelSelect: this.orgUnitSelectionConfig.hideLevelSelect, hideUserOrgUnits: this.orgUnitSelectionConfig.hideUserOrgUnits, onSelect: (selectionEvent) => this.ngZone.run(() => {
2924
+ this.onSelectItems(selectionEvent);
2925
+ }), orgUnitGroupPromise: this.getOrgUnitGroups(), orgUnitLevelPromise: this.getOrgUnitLevels(), roots: rootOrgUnits })));
2926
+ this.render();
2927
+ }
2925
2928
  }
2926
2929
  async getAppConfig() {
2927
- const systemInfo = (await firstValueFrom(this.httpClient.systemInfo()));
2930
+ const systemInfo = this.d2.systemInfo;
2931
+ if (!systemInfo) {
2932
+ return systemInfo;
2933
+ }
2928
2934
  return {
2929
- baseUrl: (document?.location?.host?.includes('localhost')
2935
+ baseUrl: document?.location?.host?.includes('localhost')
2930
2936
  ? `${document.location.protocol}//${document.location.host}`
2931
- : systemInfo['contextPath']),
2932
- apiVersion: Number(((systemInfo['version'] || '')?.split('.') || [])[1]),
2937
+ : systemInfo.contextPath,
2938
+ apiVersion: systemInfo.apiVersion,
2933
2939
  };
2934
2940
  }
2935
2941
  getOrgUnitAttributeByUsage(usageType) {
@@ -2942,26 +2948,27 @@ class OrganisationUnitSelectorComponent extends ReactWrapperModule {
2942
2948
  return 'organisationUnits';
2943
2949
  }
2944
2950
  }
2945
- getRootOrgUnits() {
2951
+ async getRootOrgUnits() {
2946
2952
  const orgUnitAttribute = this.getOrgUnitAttributeByUsage(this.orgUnitSelectionConfig.usageType);
2947
- return firstValueFrom(this.httpClient
2948
- .me()
2949
- .pipe(map((user) => (user ? user[orgUnitAttribute] : []).map((orgUnit) => orgUnit.id))));
2953
+ const currentUser = this.d2?.currentUser;
2954
+ return (currentUser ? currentUser[orgUnitAttribute] : []).map((orgUnit) => orgUnit.id);
2950
2955
  }
2951
- getOrgUnitGroups() {
2952
- return firstValueFrom(this.httpClient
2953
- .get('organisationUnitGroups.json?fields=id,displayName,name&paging=false')
2954
- .pipe(map((res) => res?.['organisationUnitGroups'])));
2956
+ async getOrgUnitGroups() {
2957
+ const orgUnitGroupResponse = await this.d2?.httpInstance?.get('organisationUnitGroups.json?fields=id,displayName,name&paging=false', {
2958
+ useIndexDb: this.orgUnitSelectionConfig?.allowCaching,
2959
+ });
2960
+ return orgUnitGroupResponse?.data?.['organisationUnitGroups'] ?? [];
2955
2961
  }
2956
- getOrgUnitLevels() {
2957
- return firstValueFrom(this.httpClient
2958
- .get('organisationUnitLevels.json?fields=id,level,displayName,name&paging=false')
2959
- .pipe(map((res) => res?.['organisationUnitLevels'])));
2962
+ async getOrgUnitLevels() {
2963
+ const orgUnitLevelResponse = await this.d2?.httpInstance?.get('organisationUnitLevels.json?fields=id,level,displayName,name&paging=false', {
2964
+ useIndexDb: this.orgUnitSelectionConfig?.allowCaching,
2965
+ });
2966
+ return orgUnitLevelResponse?.data?.['organisationUnitLevels'] ?? [];
2960
2967
  }
2961
2968
  onSelectItems(selectionEvent) {
2962
2969
  this.selectOrgUnits.emit(selectionEvent.items);
2963
2970
  }
2964
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: OrganisationUnitSelectorComponent, deps: [{ token: i0.ElementRef }, { token: i1.NgxDhis2HttpClientService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
2971
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: OrganisationUnitSelectorComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
2965
2972
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: OrganisationUnitSelectorComponent, isStandalone: false, selector: "ng-dhis2-ui-org-unit-selector", inputs: { selectedOrgUnits: "selectedOrgUnits", orgUnitSelectionConfig: "orgUnitSelectionConfig" }, outputs: { selectOrgUnits: "selectOrgUnits" }, usesInheritance: true, ngImport: i0, template: '<ng-container><ng-container>', isInline: true }); }
2966
2973
  }
2967
2974
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: OrganisationUnitSelectorComponent, decorators: [{
@@ -2971,7 +2978,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
2971
2978
  template: '<ng-container><ng-container>',
2972
2979
  standalone: false,
2973
2980
  }]
2974
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgxDhis2HttpClientService }, { type: i0.NgZone }], propDecorators: { selectedOrgUnits: [{
2981
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { selectedOrgUnits: [{
2975
2982
  type: Input
2976
2983
  }], orgUnitSelectionConfig: [{
2977
2984
  type: Input
@@ -3303,96 +3310,299 @@ const OrgUnitSelector = ({ hide, setHide, selectedOrgUnit, setSelectedOrgUnit, s
3303
3310
  React__default.createElement(ButtonStrip$1, { end: true },
3304
3311
  React__default.createElement(Button$1, { onClick: () => setHide(true), secondary: true }, "Close")))));
3305
3312
 
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
- } },
3313
+ 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, }) => {
3314
+ const [isOpen, setIsOpen] = useState(false);
3315
+ const [isOpenOrgUnitDropdown, setIsOpenOrgUnitDropdown] = useState(false);
3316
+ const [openDropdownKey, setOpenDropdownKey] = useState(null);
3317
+ //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
3318
+ const ClearIcon = ({ className, ...props }) => (React__default.createElement("svg", { className: className, ...props, viewBox: "0 0 24 24", width: 16, height: 16 },
3319
+ 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" })));
3320
+ return (React__default.createElement(DataTableToolbar, { className: "table-top-toolbar" },
3313
3321
  React__default.createElement("div", { style: {
3314
3322
  display: 'flex',
3315
- alignItems: 'center',
3316
3323
  gap: '10px',
3317
3324
  flexWrap: 'wrap',
3318
3325
  } },
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 === '') {
3326
+ React__default.createElement("div", { style: {
3327
+ display: 'flex',
3328
+ alignItems: 'center',
3329
+ gap: '10px',
3330
+ flexWrap: 'wrap',
3331
+ } },
3332
+ React__default.createElement(DropdownButton, { name: "customDropdown", open: isOpenOrgUnitDropdown, onClick: () => setIsOpenOrgUnitDropdown(!isOpenOrgUnitDropdown), component: React__default.createElement("div", null,
3333
+ React__default.createElement(FlyoutMenu, null,
3334
+ React__default.createElement("div", { style: { padding: '16px' } },
3335
+ React__default.createElement(InputField$1, { key: "location", placeholder: orgUnitLabel ? orgUnitLabel : 'registering unit', value: selectedOrgUnit, onFocus: () => {
3336
+ SetOrgUnitModalVisible(true);
3337
+ setHide(false);
3338
+ } }),
3339
+ React__default.createElement("div", { style: {
3340
+ paddingTop: '8px',
3341
+ display: 'flex',
3342
+ justifyContent: 'flex-end',
3343
+ } },
3344
+ React__default.createElement(ButtonStrip$1, null,
3345
+ React__default.createElement(Button$1, { primary: true, disabled: !selectedOrgUnit, onClick: () => {
3346
+ setPrevSelectedOrgUnit(selectedOrgUnit);
3347
+ handleOrgUnitFilter();
3348
+ setIsOpenOrgUnitDropdown(false);
3349
+ } }, "update"),
3350
+ React__default.createElement(Button$1, { disabled: !selectedOrgUnit, onClick: () => {
3351
+ setSelectedOrgUnit('');
3352
+ setPrevSelectedOrgUnit('');
3353
+ setOrgUnitState(defaultOrgUnit);
3354
+ setTempOrgUnitState(defaultOrgUnit);
3355
+ setIsOpenOrgUnitDropdown(false);
3356
+ } }, "reset filter")))))) },
3357
+ orgUnitLabel ? orgUnitLabel : 'registering unit',
3358
+ ' ',
3359
+ prevSelectedOrgUnit && ':',
3360
+ " ",
3361
+ prevSelectedOrgUnit,
3362
+ prevSelectedOrgUnit && (React__default.createElement("span", { onClick: (event) => {
3363
+ event.stopPropagation();
3364
+ setSelectedOrgUnit('');
3365
+ setPrevSelectedOrgUnit('');
3366
+ setOrgUnitState(defaultOrgUnit);
3367
+ setTempOrgUnitState(defaultOrgUnit);
3368
+ setIsOpenOrgUnitDropdown(false);
3369
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3370
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))),
3371
+ showEnrollmentDates && (React__default.createElement(React__default.Fragment, null,
3372
+ React__default.createElement(DropdownButton, { name: "customDropdown", open: isOpen, onClick: () => setIsOpen(!isOpen), component: React__default.createElement("div", null,
3373
+ React__default.createElement(FlyoutMenu, null,
3374
+ React__default.createElement("div", { style: { padding: '16px' } },
3375
+ React__default.createElement("div", { style: {
3376
+ display: 'flex',
3377
+ alignItems: 'flex-end',
3378
+ gap: '16px',
3379
+ } },
3380
+ React__default.createElement(CalendarInput, { calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", date: formatDateForDisplay(tempStartDateState), onDateSelect: (selectedDate) => {
3381
+ setTempStartDateState(selectedDate.calendarDateString);
3382
+ } }),
3383
+ React__default.createElement("span", { style: { paddingBottom: '8px' } }, "to"),
3384
+ React__default.createElement(CalendarInput, { calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", date: formatDateForDisplay(tempEndDateState), onDateSelect: (selectedDate) => {
3385
+ setTempEndDateState(selectedDate.calendarDateString);
3386
+ } })),
3387
+ React__default.createElement("div", { style: {
3388
+ paddingTop: '8px',
3389
+ display: 'flex',
3390
+ justifyContent: 'flex-end',
3391
+ } },
3392
+ React__default.createElement(ButtonStrip$1, null,
3393
+ React__default.createElement(Button$1, { primary: true, onClick: () => {
3394
+ handleStartDateFilter();
3395
+ handleEndDateFilter();
3396
+ setIsOpen(false);
3397
+ } }, "update"),
3398
+ React__default.createElement(Button$1, { onClick: () => {
3399
+ setStartDateState(null);
3400
+ setTempEndDateState(null);
3401
+ setTempStartDateState(null);
3402
+ setEndDateState(null);
3403
+ setIsOpen(false);
3404
+ } }, "reset")))))) },
3405
+ "registration dates ",
3406
+ (startDateState || endDateState) && ':',
3407
+ ' ',
3408
+ startDateState,
3409
+ endDateState && ` - ${endDateState}`,
3410
+ (startDateState || endDateState) && (React__default.createElement("span", { onClick: (event) => {
3411
+ event.stopPropagation();
3412
+ setStartDateState(null);
3413
+ setTempEndDateState(null);
3414
+ setTempStartDateState(null);
3415
+ setEndDateState(null);
3416
+ setIsOpen(false);
3417
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3418
+ React__default.createElement(ClearIcon, { className: "my-icon-class" }))))))),
3419
+ (visibleFilters ?? []).map(({ label, key, valueType, options, type }) => {
3420
+ if (valueType === 'DATE') {
3421
+ return (React__default.createElement(DropdownButton, { name: "customDropdown", open: openDropdownKey === key, onClick: () => {
3422
+ setOpenDropdownKey(openDropdownKey === key ? null : key);
3423
+ }, component: React__default.createElement("div", null,
3424
+ React__default.createElement(FlyoutMenu, null,
3425
+ React__default.createElement("div", { style: { padding: '16px' } },
3426
+ React__default.createElement(CalendarInput, { key: key, calendar: "gregory", locale: "en-GB", timeZone: "Africa/Dar_es_Salaam", date: dateStates[key], onDateSelect: (selectedDate) => {
3427
+ handleDateSelect(key, selectedDate, type);
3428
+ } }),
3429
+ React__default.createElement("div", { style: {
3430
+ paddingTop: '8px',
3431
+ display: 'flex',
3432
+ justifyContent: 'flex-end',
3433
+ } },
3434
+ React__default.createElement(ButtonStrip$1, null,
3435
+ React__default.createElement(Button$1, { primary: true, onClick: () => {
3436
+ setPrevDateStates((prev) => ({
3437
+ ...prev,
3438
+ [key]: dateStates[key],
3439
+ }));
3440
+ handleAdditionalFilters();
3441
+ setOpenDropdownKey(null);
3442
+ } }, "update"),
3443
+ React__default.createElement(Button$1, { onClick: () => {
3444
+ setIsOpen(false);
3445
+ } }, "reset")))))) },
3446
+ label,
3447
+ " ",
3448
+ prevDateStates[key] && ':',
3449
+ " ",
3450
+ prevDateStates[key],
3451
+ prevDateStates[key] && (React__default.createElement("span", { onClick: (event) => {
3452
+ event.stopPropagation();
3453
+ setDateStates((prev) => ({
3454
+ ...prev,
3455
+ [key]: '',
3456
+ }));
3457
+ setPrevDateStates((prev) => ({
3458
+ ...prev,
3459
+ [key]: '',
3460
+ }));
3461
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3462
+ setDataQueryFiltersState(filteredFilters);
3463
+ setTempDataQueryFiltersState(filteredFilters);
3464
+ setOpenDropdownKey(null);
3465
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3466
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))));
3467
+ }
3468
+ if (options && options.options.length > 0) {
3469
+ return (React__default.createElement(DropdownButton, { name: "customDropdown", open: openDropdownKey === key, onClick: () => {
3470
+ setOpenDropdownKey(openDropdownKey === key ? null : key);
3471
+ }, component: React__default.createElement("div", null,
3472
+ React__default.createElement(FlyoutMenu, null,
3473
+ React__default.createElement("div", { style: { padding: '16px' } },
3474
+ React__default.createElement(SingleSelectField, { key: key, placeholder: `${label}`, selected: inputValues[key] || '', onChange: ({ selected }) => {
3475
+ setInputValues((prevValues) => ({
3476
+ ...prevValues,
3477
+ [key]: selected ?? '',
3478
+ }));
3479
+ handleInputChangeForSelectField(key, selected ?? '', type);
3480
+ } }, (options.options ?? []).map((opt) => (React__default.createElement(SingleSelectOption, { key: opt.id, label: opt.name, value: opt.code })))),
3481
+ React__default.createElement("div", { style: {
3482
+ paddingTop: '8px',
3483
+ display: 'flex',
3484
+ justifyContent: 'flex-end',
3485
+ } },
3486
+ React__default.createElement(ButtonStrip$1, null,
3487
+ React__default.createElement(Button$1, { primary: true, disabled: !inputValues[key] ||
3488
+ inputValues[key] === prevInputValues[key], onClick: () => {
3489
+ setPrevInputValues((prev) => ({
3490
+ ...prev,
3491
+ [key]: inputValues[key],
3492
+ }));
3493
+ handleAdditionalFilters();
3494
+ setOpenDropdownKey(null);
3495
+ } }, "update"),
3496
+ React__default.createElement(Button$1, { disabled: !inputValues[key], onClick: () => {
3497
+ setInputValues((prevValues) => ({
3498
+ ...prevValues,
3499
+ [key]: '',
3500
+ }));
3501
+ setPrevInputValues((prevValues) => ({
3502
+ ...prevValues,
3503
+ [key]: '',
3504
+ }));
3505
+ handleInputChangeForSelectField(key, '', type);
3506
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3507
+ setDataQueryFiltersState(filteredFilters);
3508
+ setTempDataQueryFiltersState(filteredFilters);
3509
+ setOpenDropdownKey(null);
3510
+ } }, "reset")))))) },
3511
+ label,
3512
+ " ",
3513
+ prevInputValues[key] && ':',
3514
+ " ",
3515
+ prevInputValues[key],
3516
+ prevInputValues[key] && (React__default.createElement("span", { onClick: (event) => {
3517
+ event.stopPropagation();
3518
+ setInputValues((prevValues) => ({
3519
+ ...prevValues,
3520
+ [key]: '',
3521
+ }));
3522
+ setPrevInputValues((prevValues) => ({
3523
+ ...prevValues,
3524
+ [key]: '',
3525
+ }));
3526
+ handleInputChangeForSelectField(key, '', type);
3527
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3528
+ setDataQueryFiltersState(filteredFilters);
3529
+ setTempDataQueryFiltersState(filteredFilters);
3530
+ setOpenDropdownKey(null);
3531
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3532
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))));
3533
+ }
3534
+ return (React__default.createElement(DropdownButton, { name: "customDropdown", open: openDropdownKey === key, onClick: () => {
3535
+ setOpenDropdownKey(openDropdownKey === key ? null : key);
3536
+ }, component: React__default.createElement("div", null,
3537
+ React__default.createElement(FlyoutMenu, null,
3538
+ React__default.createElement("div", { style: { padding: '16px' } },
3539
+ React__default.createElement(InputField$1, { key: key, placeholder: `${label}`, value: inputValues[key] || '', onChange: (e) => {
3540
+ const currentValue = 'target' in e ? e.target.value : e.value ?? '';
3541
+ setInputValues((prevValues) => ({
3542
+ ...prevValues,
3543
+ [key]: currentValue,
3544
+ }));
3545
+ handleInputChange(key, currentValue, type);
3546
+ } }),
3547
+ React__default.createElement("div", { style: {
3548
+ paddingTop: '8px',
3549
+ display: 'flex',
3550
+ justifyContent: 'flex-end',
3551
+ } },
3552
+ React__default.createElement(ButtonStrip$1, null,
3553
+ React__default.createElement(Button$1, { primary: true, disabled: !inputValues[key] ||
3554
+ inputValues[key] === prevInputValues[key], onClick: () => {
3555
+ setPrevInputValues((prev) => ({
3556
+ ...prev,
3557
+ [key]: inputValues[key],
3558
+ }));
3559
+ handleAdditionalFilters();
3560
+ setOpenDropdownKey(null);
3561
+ } }, "update"),
3562
+ React__default.createElement(Button$1, { disabled: !inputValues[key], onClick: () => {
3563
+ setInputValues((prevValues) => ({
3564
+ ...prevValues,
3565
+ [key]: '',
3566
+ }));
3567
+ setPrevInputValues((prevValues) => ({
3568
+ ...prevValues,
3569
+ [key]: '',
3570
+ }));
3571
+ // Remove the filter for this key
3572
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3573
+ setDataQueryFiltersState(filteredFilters);
3574
+ setTempDataQueryFiltersState(filteredFilters);
3575
+ setOpenDropdownKey(null);
3576
+ } }, "reset")))))) },
3577
+ label,
3578
+ " ",
3579
+ prevInputValues[key] && ':',
3580
+ " ",
3581
+ prevInputValues[key],
3582
+ prevInputValues[key] && (React__default.createElement("span", { onClick: (event) => {
3583
+ event.stopPropagation();
3584
+ // Clear the input value for this key
3585
+ setInputValues((prevValues) => ({
3586
+ ...prevValues,
3587
+ [key]: '',
3588
+ }));
3589
+ setPrevInputValues((prevValues) => ({
3590
+ ...prevValues,
3591
+ [key]: '',
3592
+ }));
3593
+ // Remove the filter for this key
3594
+ const filteredFilters = dataQueryFiltersState.filter((f) => f.attribute !== key);
3366
3595
  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')))));
3596
+ setTempDataQueryFiltersState(filteredFilters);
3597
+ }, style: { display: 'inline-flex', alignItems: 'center' } },
3598
+ React__default.createElement(ClearIcon, { className: "my-icon-class" })))));
3599
+ }),
3600
+ React__default.createElement("div", { style: {
3601
+ display: 'flex',
3602
+ gap: '10px',
3603
+ } },
3604
+ React__default.createElement(Button$1, { onClick: () => setShowAllFilters(!showAllFilters) }, showAllFilters ? 'Less Filters' : 'More Filters')))));
3605
+ };
3396
3606
  function formatDateForDisplay(dateString) {
3397
3607
  if (!dateString || dateString === 'dd-mm-yyyy')
3398
3608
  return 'dd-mm-yyyy';
@@ -3639,7 +3849,13 @@ const TableRow = ({ row, columns, getTextColorFromBackGround, actionOptions, act
3639
3849
  // )}
3640
3850
  // </DHISTableBody>
3641
3851
  // );
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,
3852
+ 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,
3853
+ React__default.createElement(DataTableCell, { colSpan: columns.length.toString(), style: {
3854
+ textAlign: 'center',
3855
+ fontWeight: 'bold',
3856
+ color: 'red',
3857
+ padding: '20px',
3858
+ } }, 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
3859
  React__default.createElement(DataTableCell, { colSpan: columns.length.toString(), style: {
3644
3860
  textAlign: 'center',
3645
3861
  fontWeight: 'bold',
@@ -3696,7 +3912,7 @@ const TableFooter = ({ pager, setPager, columns }) => {
3696
3912
  // </DataTable>
3697
3913
  // );
3698
3914
  // };
3699
- const LineListTable = ({ columns, data, pager, setPager, getTextColorFromBackGround, actionOptions, actionOptionOrientation, actionSelected, selectable, rowsSelected, showActionButtons }) => {
3915
+ const LineListTable = ({ columns, data, pager, setPager, getTextColorFromBackGround, actionOptions, actionOptionOrientation, actionSelected, selectable, rowsSelected, showActionButtons, error }) => {
3700
3916
  const [selectedRows, setSelectedRows] = useState([]);
3701
3917
  const handleRowToggle = (row) => {
3702
3918
  const exists = selectedRows.find((r) => r.index?.value === row.index?.value);
@@ -3713,7 +3929,7 @@ const LineListTable = ({ columns, data, pager, setPager, getTextColorFromBackGro
3713
3929
  };
3714
3930
  return (React__default.createElement(DataTable, null,
3715
3931
  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 }),
3932
+ 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
3933
  React__default.createElement(TableFooter, { columns: columns, pager: pager, setPager: setPager })));
3718
3934
  };
3719
3935
 
@@ -3743,7 +3959,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
3743
3959
  type: Injectable
3744
3960
  }], ctorParameters: () => [{ type: i1.NgxDhis2HttpClientService }] });
3745
3961
 
3746
- const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3962
+ const getTrackedEntityTableData = (response, programId, pager, metaData, searcheableDataElements) => {
3747
3963
  const teisRaw = response.data
3748
3964
  .trackedEntityInstances;
3749
3965
  const teis = Array.isArray(teisRaw)
@@ -3758,12 +3974,19 @@ const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3758
3974
  label: trackedEntityAttribute.formName ?? trackedEntityAttribute.name,
3759
3975
  key: trackedEntityAttribute.id,
3760
3976
  }));
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
- // }));
3977
+ const tableSearcheableDataElements = metaData
3978
+ .programStages.sort((a, b) => a.sortOrder - b.sortOrder)
3979
+ .flatMap((stage) => stage
3980
+ .programStageDataElements.filter((psde) => psde.displayInReports)
3981
+ .sort((a, b) => a.sortOrder - b.sortOrder)
3982
+ .map((psde) => ({
3983
+ label: psde.dataElement.formName || psde.dataElement.name,
3984
+ key: psde.dataElement.id,
3985
+ valueType: psde.dataElement.valueType,
3986
+ options: psde.dataElement.optionSet,
3987
+ type: 'dataElement',
3988
+ }))
3989
+ .filter((col) => searcheableDataElements.includes(col.key)));
3767
3990
  const dataElementColumns = metaData
3768
3991
  .programStages.sort((a, b) => a.sortOrder - b.sortOrder) // Sorts stages by sortOrder
3769
3992
  .flatMap((stage) => stage
@@ -3795,6 +4018,7 @@ const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3795
4018
  key: attr.id,
3796
4019
  valueType: attr.valueType,
3797
4020
  options: attr.optionSet ?? undefined,
4021
+ type: 'attribute',
3798
4022
  }));
3799
4023
  const tableData = teis.map((tei, idx) => {
3800
4024
  const row = {
@@ -3881,7 +4105,7 @@ const getTrackedEntityTableData = (response, programId, pager, metaData) => {
3881
4105
  return {
3882
4106
  columns: tableColumns,
3883
4107
  data: tableData,
3884
- filteredEntityColumns: tableFilters,
4108
+ filteredEntityColumns: [...tableFilters, ...tableSearcheableDataElements],
3885
4109
  orgUnitLabel: orgUnitLabel,
3886
4110
  };
3887
4111
  };
@@ -3962,6 +4186,7 @@ class LineListTableComponent extends ReactWrapperModule {
3962
4186
  this.showActionButtons = true;
3963
4187
  this.showEnrollmentDates = true;
3964
4188
  this.showDownloadButton = false;
4189
+ this.searcheableDataElements = [];
3965
4190
  this.reactStateUpdaters = null;
3966
4191
  this.setReactStateUpdaters = (updaters) => {
3967
4192
  this.reactStateUpdaters = updaters;
@@ -3990,28 +4215,29 @@ class LineListTableComponent extends ReactWrapperModule {
3990
4215
  const [endDateState, setEndDateState] = useState(this.endDate);
3991
4216
  const [tempEndDateState, setTempEndDateState] = useState(this.endDate);
3992
4217
  const [loading, setLoading] = useState(false);
3993
- const [metaDataLoadng, setMetaDataLoading] = useState(false);
3994
4218
  const [filteredColumns, setFilteredColumns] = useState();
3995
4219
  const [inputValues, setInputValues] = useState({});
3996
4220
  const [orgUnitLabel, setOrgUnitLabel] = useState('');
3997
4221
  const [selectedOrgUnit, setSelectedOrgUnit] = useState('');
4222
+ const [prevSelectedOrgUnit, setPrevSelectedOrgUnit] = useState('');
3998
4223
  const [hide, setHide] = useState(true);
3999
4224
  const [showAllFilters, setShowAllFilters] = useState(false);
4000
4225
  const visibleFilters = showAllFilters
4001
4226
  ? filteredColumns ?? []
4002
- : (filteredColumns ?? []).slice(0, 0);
4227
+ : (filteredColumns ?? []).slice(0, 5);
4003
4228
  // const visibleFilters = showAllFilters
4004
4229
  // ? filteredColumns ?? []
4005
4230
  // : filteredColumns ?? []).slice(0, 2);
4006
4231
  const defaultOrgUnit = this.orgUnit;
4007
- const [prevValue, setPrevValue] = useState();
4008
4232
  const [dateStates, setDateStates] = useState({});
4233
+ const [prevDateStates, setPrevDateStates] = useState({});
4009
4234
  const [metaData, setMetaData] = useState(null);
4010
4235
  const [selectable, setSelectable] = useState(this.allowRowsSelection);
4011
4236
  const [triggerRefetch, setTriggerRefetch] = useState(this.triggerRefetch);
4012
4237
  const [showActionButtons, setShowActionButtons] = useState(this.showActionButtons);
4013
4238
  const [orgUnitModalVisible, setOrgUnitModalVisible] = useState(false);
4014
4239
  const [error, setError] = useState(null);
4240
+ const [prevInputValues, setPrevInputValues] = useState({});
4015
4241
  const d2 = window.d2Web;
4016
4242
  // Stores updaters in refs for Angular to access
4017
4243
  const updateRefs = useRef({
@@ -4026,9 +4252,6 @@ class LineListTableComponent extends ReactWrapperModule {
4026
4252
  setTriggerRefetch,
4027
4253
  setTriggerTokenState,
4028
4254
  });
4029
- // useEffect(() => {
4030
- // this.setReactStateUpdaters?.(updateRefs.current);
4031
- // }, []);
4032
4255
  useEffect(() => {
4033
4256
  this.setReactStateUpdaters?.(updateRefs.current);
4034
4257
  const fetchmetaData = async () => {
@@ -4064,57 +4287,71 @@ class LineListTableComponent extends ReactWrapperModule {
4064
4287
  const isEvent = metaData.programType === 'WITHOUT_REGISTRATION';
4065
4288
  const endDate = endDateState ?? format(addDays(new Date(), 1), 'yyyy-MM-dd');
4066
4289
  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));
4290
+ const fetchEventData = async () => {
4291
+ try {
4292
+ setError(null);
4293
+ setLoading(true);
4294
+ const response = await d2.eventModule.event
4295
+ .setEndDate(endDate)
4296
+ .setStartDate(startDateState)
4297
+ .setProgram(this.programId)
4298
+ .setProgramStage(this.programStageId)
4299
+ .setOrgUnit(orgUnitState)
4300
+ .setOuMode(this.ouMode)
4301
+ .setPagination(new Pager({
4302
+ pageSize: pager.pageSize,
4303
+ page: pager.page,
4304
+ }))
4305
+ .get();
4306
+ if (response.responseStatus.status !== 200) {
4307
+ throw new Error('failed to load data.');
4308
+ }
4309
+ const eventsResponse = {
4310
+ events: response.data,
4311
+ pager: pager,
4312
+ // orgUnitsMap: fetchedOrgUnits,
4313
+ };
4314
+ const { columns, data } = getEvents({ data: eventsResponse }, this.programStageId, pager, metaData);
4315
+ // const filterableColumnIdsSet = new Set(
4316
+ // this.filterableColumnIds
4317
+ // );
4318
+ // const updatedFilterableColumnIds: ColumnDefinition[] =
4319
+ // columns.filter((column) =>
4320
+ // filterableColumnIdsSet.has(column.key)
4321
+ // );
4322
+ // const finalColumns: ColumnDefinition[] = addActionsColumn(
4323
+ // [{ label: '#', key: 'index' }, ...updatedFilterableColumnIds],
4324
+ // this.actionOptions
4325
+ // );
4326
+ let updatedFilterableColumnIds;
4327
+ if (Array.isArray(this.filterableColumnIds) &&
4328
+ this.filterableColumnIds.length > 0) {
4329
+ const filterableColumnIdsSet = new Set(this.filterableColumnIds);
4330
+ updatedFilterableColumnIds = columns.filter((column) => filterableColumnIdsSet.has(column.key));
4331
+ }
4332
+ else {
4333
+ updatedFilterableColumnIds = columns;
4334
+ }
4335
+ const finalColumns = addActionsColumn([{ label: '#', key: 'index' }, ...updatedFilterableColumnIds], this.actionOptions);
4336
+ const pagerResponse = response.pagination;
4337
+ setColumns(finalColumns);
4338
+ setData(data);
4339
+ setPager(new Pager(pagerResponse || {}));
4103
4340
  }
4104
- else {
4105
- updatedFilterableColumnIds = columns;
4341
+ catch {
4342
+ console.error('Failed to fetch event data:', error);
4343
+ setError('Could not load records. Please reload.');
4106
4344
  }
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
- });
4345
+ finally {
4346
+ setLoading(false);
4347
+ }
4348
+ };
4349
+ fetchEventData();
4114
4350
  }
4115
4351
  else if (isTracker) {
4116
4352
  const fetchTrackerData = async () => {
4117
4353
  try {
4354
+ setError(null);
4118
4355
  setLoading(true);
4119
4356
  const response = await d2.trackerModule.trackedEntity
4120
4357
  .setEndDate(endDate)
@@ -4134,6 +4371,9 @@ class LineListTableComponent extends ReactWrapperModule {
4134
4371
  new DataOrderCriteria().setField('createdAt').setOrder('desc'),
4135
4372
  ])
4136
4373
  .get();
4374
+ if (response.responseStatus.status !== 200) {
4375
+ throw new Error('failed to load data.');
4376
+ }
4137
4377
  const trackedEntityInstances = Array.isArray(response.data)
4138
4378
  ? response.data
4139
4379
  : [response.data];
@@ -4151,7 +4391,7 @@ class LineListTableComponent extends ReactWrapperModule {
4151
4391
  pager: pager,
4152
4392
  orgUnitsMap: fetchedOrgUnits,
4153
4393
  };
4154
- const { columns, data, filteredEntityColumns, orgUnitLabel } = getTrackedEntityTableData({ data: trackedEntityResponse }, this.programId, pager, metaData);
4394
+ const { columns, data, filteredEntityColumns, orgUnitLabel } = getTrackedEntityTableData({ data: trackedEntityResponse }, this.programId, pager, metaData, this.searcheableDataElements);
4155
4395
  setFilteredColumns((prev) => filteredEntityColumns.length > 0 ? filteredEntityColumns : prev);
4156
4396
  let updatedFilterableColumnIds;
4157
4397
  if (Array.isArray(this.filterableColumnIds) &&
@@ -4168,7 +4408,6 @@ class LineListTableComponent extends ReactWrapperModule {
4168
4408
  // this.actionOptions
4169
4409
  // );
4170
4410
  const pagerResponse = response.pagination;
4171
- // setLoading(false);
4172
4411
  setColumns(finalColumns);
4173
4412
  setData(data);
4174
4413
  setPager(new Pager(pagerResponse || {}));
@@ -4211,7 +4450,6 @@ class LineListTableComponent extends ReactWrapperModule {
4211
4450
  : cell;
4212
4451
  }));
4213
4452
  const worksheetData = [header, ...rows];
4214
- // Creates worksheet and workbook, then writes to file
4215
4453
  const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);
4216
4454
  const workbook = XLSX.utils.book_new();
4217
4455
  XLSX.utils.book_append_sheet(workbook, worksheet, 'LineListData');
@@ -4233,7 +4471,6 @@ class LineListTableComponent extends ReactWrapperModule {
4233
4471
  const header = filteredColumns.map((col) => `"${col.label}"`).join(',');
4234
4472
  const csvData = data.map((row) => filteredColumns.map((col) => `"${safeValue(row[col.key])}"`).join(','));
4235
4473
  const csvContent = [header, ...csvData].join('\n');
4236
- // Creates a Blob and triggers the download
4237
4474
  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
4238
4475
  const url = URL.createObjectURL(blob);
4239
4476
  const link = document.createElement('a');
@@ -4243,7 +4480,7 @@ class LineListTableComponent extends ReactWrapperModule {
4243
4480
  link.click();
4244
4481
  document.body.removeChild(link);
4245
4482
  };
4246
- const handleInputChange = (key, value) => {
4483
+ const handleInputChange = (key, value, type) => {
4247
4484
  setInputValues((prevValues) => ({
4248
4485
  ...prevValues,
4249
4486
  [key]: value ?? '',
@@ -4252,20 +4489,36 @@ class LineListTableComponent extends ReactWrapperModule {
4252
4489
  // Removes old filter for this key
4253
4490
  const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
4254
4491
  // 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;
4492
+ let updatedFilters;
4493
+ if (type === 'dataElement') {
4494
+ updatedFilters =
4495
+ value && value.length
4496
+ ? [
4497
+ ...filteredFilters,
4498
+ new DataQueryFilter()
4499
+ .setAttribute(key)
4500
+ .setCondition(DataFilterCondition.Like)
4501
+ .setValue(value)
4502
+ .setType('DATA_ELEMENT'),
4503
+ ]
4504
+ : filteredFilters;
4505
+ }
4506
+ else {
4507
+ updatedFilters = value.trim()
4508
+ ? [
4509
+ ...filteredFilters,
4510
+ new DataQueryFilter()
4511
+ .setAttribute(key)
4512
+ .setCondition(DataFilterCondition.Like)
4513
+ .setValue(value),
4514
+ ]
4515
+ : filteredFilters;
4516
+ }
4264
4517
  return updatedFilters;
4265
4518
  });
4266
4519
  };
4267
4520
  //TODO: MERGE THIS WITH HANDLE INPUT CHANGE PUT A CHECK FOR IF ITS A SELECT FIELD TO USE EQ
4268
- const handleInputChangeForSelectField = (key, value) => {
4521
+ const handleInputChangeForSelectField = (key, value, type) => {
4269
4522
  setInputValues((prevValues) => ({
4270
4523
  ...prevValues,
4271
4524
  [key]: value ?? '',
@@ -4274,19 +4527,35 @@ class LineListTableComponent extends ReactWrapperModule {
4274
4527
  // Removes existing filter for the same key (attribute)
4275
4528
  const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
4276
4529
  // 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;
4530
+ let updatedFilters;
4531
+ if (type === 'dataElement') {
4532
+ updatedFilters =
4533
+ value && value.length
4534
+ ? [
4535
+ ...filteredFilters,
4536
+ new DataQueryFilter()
4537
+ .setAttribute(key)
4538
+ .setCondition(DataFilterCondition.Equal)
4539
+ .setValue(value)
4540
+ .setType('DATA_ELEMENT'),
4541
+ ]
4542
+ : filteredFilters;
4543
+ }
4544
+ else {
4545
+ updatedFilters = value.trim()
4546
+ ? [
4547
+ ...filteredFilters,
4548
+ new DataQueryFilter()
4549
+ .setAttribute(key)
4550
+ .setCondition(DataFilterCondition.Equal)
4551
+ .setValue(value),
4552
+ ]
4553
+ : filteredFilters;
4554
+ }
4286
4555
  return updatedFilters;
4287
4556
  });
4288
4557
  };
4289
- const handleDateSelect = (key, selectedDate) => {
4558
+ const handleDateSelect = (key, selectedDate, type) => {
4290
4559
  const selectedDateString = selectedDate?.calendarDateString ?? '';
4291
4560
  // Updates dateStates
4292
4561
  setDateStates((prevDateStates) => ({
@@ -4296,30 +4565,51 @@ class LineListTableComponent extends ReactWrapperModule {
4296
4565
  // Updates dataQueryFilters
4297
4566
  setTempDataQueryFiltersState((prevFilters) => {
4298
4567
  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;
4568
+ // const updatedFilters = selectedDateString.trim()
4569
+ // ? [
4570
+ // ...filteredFilters,
4571
+ // new DataQueryFilter()
4572
+ // .setAttribute(key)
4573
+ // .setCondition(DataFilterCondition.Equal)
4574
+ // .setValue(selectedDateString),
4575
+ // ]
4576
+ // : filteredFilters;
4577
+ let updatedFilters;
4578
+ if (type === 'dataElement') {
4579
+ updatedFilters = selectedDateString.trim()
4580
+ ? [
4581
+ ...filteredFilters,
4582
+ new DataQueryFilter()
4583
+ .setAttribute(key)
4584
+ .setCondition(DataFilterCondition.Equal)
4585
+ .setValue(selectedDateString)
4586
+ .setType('DATA_ELEMENT'),
4587
+ ]
4588
+ : filteredFilters;
4589
+ }
4590
+ else {
4591
+ updatedFilters = selectedDateString.trim()
4592
+ ? [
4593
+ ...filteredFilters,
4594
+ new DataQueryFilter()
4595
+ .setAttribute(key)
4596
+ .setCondition(DataFilterCondition.Equal)
4597
+ .setValue(selectedDateString),
4598
+ ]
4599
+ : filteredFilters;
4600
+ }
4308
4601
  return updatedFilters;
4309
4602
  });
4310
4603
  };
4311
- const handleSearch = () => (setDataQueryFiltersState(tempDataQueryFiltersState),
4312
- setStartDateState(tempStartDateState),
4313
- setEndDateState(tempEndDateState),
4314
- setOrgUnitState(tempOrgUnitState));
4604
+ const handleAdditionalFilters = () => setDataQueryFiltersState(tempDataQueryFiltersState);
4605
+ const handleStartDateFilter = () => setStartDateState(tempStartDateState);
4606
+ const handleEndDateFilter = () => setEndDateState(tempEndDateState);
4607
+ const handleOrgUnitFilter = () => setOrgUnitState(tempOrgUnitState);
4315
4608
  function getTextColorFromBackGround(hex) {
4316
- // Removes the hash if present
4317
4609
  hex = hex.replace('#', '');
4318
- // Converts to RGB
4319
4610
  const r = parseInt(hex.substr(0, 2), 16);
4320
4611
  const g = parseInt(hex.substr(2, 2), 16);
4321
4612
  const b = parseInt(hex.substr(4, 2), 16);
4322
- // YIQ formula to calculate brightness
4323
4613
  const yiq = (r * 299 + g * 587 + b * 114) / 1000;
4324
4614
  // Returns black for light backgrounds, white for dark backgrounds
4325
4615
  return yiq >= 128 ? colors$1.grey700 : '#FFFFFF';
@@ -4344,8 +4634,8 @@ class LineListTableComponent extends ReactWrapperModule {
4344
4634
  React__default.createElement(MenuItem$1, { label: "Download Csv", onClick: handleCsvDownload }),
4345
4635
  React__default.createElement(MenuItem$1, { label: "Download Excel", onClick: handleExcelDownload })), value: "Download" }, "Download"))),
4346
4636
  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 })))));
4637
+ 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 })),
4638
+ 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
4639
  };
4350
4640
  }
4351
4641
  ngOnChanges(changes) {
@@ -4394,7 +4684,7 @@ class LineListTableComponent extends ReactWrapperModule {
4394
4684
  this.render();
4395
4685
  }
4396
4686
  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"] }); }
4687
+ 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
4688
  }
4399
4689
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
4400
4690
  type: Component,
@@ -4453,6 +4743,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
4453
4743
  type: Input
4454
4744
  }], showDownloadButton: [{
4455
4745
  type: Input
4746
+ }], searcheableDataElements: [{
4747
+ type: Input
4456
4748
  }] } });
4457
4749
 
4458
4750
  class LineListModule {
@@ -6215,7 +6507,11 @@ class BaseFormFieldComponent extends ReactWrapperModule {
6215
6507
  setTouched(true);
6216
6508
  };
6217
6509
  const checkValueUniqueness = async () => {
6218
- if (this.field().unique || (this.field().extension?.isDataElementUnique ?? false) && value && value.length > 0 && touched) {
6510
+ if (this.field().unique ||
6511
+ ((this.field().extension?.isDataElementUnique ?? false) &&
6512
+ value &&
6513
+ value.length > 0 &&
6514
+ touched)) {
6219
6515
  // if (this.field().unique && value && value.length > 0 && touched) {
6220
6516
  setCheckingUniqueness(true);
6221
6517
  setRecordExistError(undefined);
@@ -6279,6 +6575,13 @@ class BaseFormFieldComponent extends ReactWrapperModule {
6279
6575
  }, onBlur: () => {
6280
6576
  checkValueUniqueness();
6281
6577
  }, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: option.key, label: option.label, value: option.value })))));
6578
+ case 'date':
6579
+ case 'date-time':
6580
+ 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) => {
6581
+ onValueChange(event.value);
6582
+ }, onBlur: () => {
6583
+ checkValueUniqueness();
6584
+ } }));
6282
6585
  case 'file':
6283
6586
  return (React__default.createElement(React__default.Fragment, null,
6284
6587
  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) => {