@iapps/ng-dhis2-ui 1.1.29 → 1.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -25,7 +25,7 @@ import { Layer } from '@dhis2-ui/layer';
|
|
|
25
25
|
import { CircularLoader } from '@dhis2-ui/loader';
|
|
26
26
|
import { MenuItem, MenuDivider } from '@dhis2-ui/menu';
|
|
27
27
|
import parse from 'html-react-parser';
|
|
28
|
-
import { Button as Button$1, IconDimensionData16, IconClock16, IconDimensionOrgUnit16, spacers as spacers$1, colors as colors$1, IconEdit16, theme as theme$1, Tooltip, SingleSelectField, SingleSelectOption, InputField as InputField$1, TabBar, Tab, Transfer, Modal as Modal$1, ModalTitle as ModalTitle$1, ModalContent as ModalContent$1, ModalActions as ModalActions$1, ButtonStrip as ButtonStrip$1, Checkbox, OrganisationUnitTree, MultiSelect, MultiSelectOption, IconWarningFilled16, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, CircularLoader as CircularLoader$1, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
|
|
28
|
+
import { Button as Button$1, IconDimensionData16, IconClock16, IconDimensionOrgUnit16, spacers as spacers$1, colors as colors$1, IconEdit16, theme as theme$1, Tooltip, SingleSelectField, SingleSelectOption, InputField as InputField$1, TabBar, Tab, Transfer, Modal as Modal$1, ModalTitle as ModalTitle$1, ModalContent as ModalContent$1, ModalActions as ModalActions$1, ButtonStrip as ButtonStrip$1, Checkbox, OrganisationUnitTree, MultiSelect, MultiSelectOption, IconWarningFilled16, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, CircularLoader as CircularLoader$1, IconFilter16, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
|
|
29
29
|
import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
|
|
30
30
|
import { isObject, isString, sortBy, isArray, find, camelCase, flatten, head, isEmpty } from 'lodash';
|
|
31
31
|
import cx from 'classnames';
|
|
@@ -2043,7 +2043,7 @@ const FixedPeriodFilter = ({ allowedPeriodTypes, excludedPeriodTypes, currentPer
|
|
|
2043
2043
|
React__default.createElement("div", { className: "leftSection" },
|
|
2044
2044
|
React__default.createElement(SingleSelectField, { label: i18n.t('Period type'), onChange: ({ selected }) => onSelectPeriodType(selected), dense: true, selected: currentPeriodType, disabled: onlyAllowedTypeIsSelected, className: "filterElement", dataTest: `${dataTest}-period-type` }, (allowedPeriodTypes
|
|
2045
2045
|
? getFixedPeriodsOptions().filter((option) => allowedPeriodTypes.some((type) => type === option.id))
|
|
2046
|
-
: filterPeriodTypesById(getFixedPeriodsOptions(), excludedPeriodTypes)).map((option) => (React__default.createElement(SingleSelectOption, { key: option.id, value: option.id, label: option.name, dataTest: `${dataTest}-period-type-option-${option.id}` }))))),
|
|
2046
|
+
: filterPeriodTypesById(getFixedPeriodsOptions(), excludedPeriodTypes)).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.id, value: option.id, label: option.name, dataTest: `${dataTest}-period-type-option-${option.id}` }))))),
|
|
2047
2047
|
React__default.createElement("div", { className: "rightSection" },
|
|
2048
2048
|
React__default.createElement(InputField$1, { label: i18n.t('Year'), className: "filterElement", type: "number", placeholder: i18n.t('Select year'), value: currentYear, onChange: ({ value }) => onSelectYear(value), dense: true, dataTest: `${dataTest}-year` })),
|
|
2049
2049
|
React__default.createElement("style", { jsx: true }, `
|
|
@@ -2074,7 +2074,7 @@ FixedPeriodFilter.propTypes = {
|
|
|
2074
2074
|
};
|
|
2075
2075
|
|
|
2076
2076
|
const RelativePeriodFilter = ({ currentFilter, onSelectFilter, dataTest, excludedPeriodTypes, }) => (React__default.createElement("div", { className: "leftSection" },
|
|
2077
|
-
React__default.createElement(SingleSelectField, { label: i18n.t('Period type'), onChange: ({ selected }) => onSelectFilter(selected), dense: true, selected: currentFilter, className: "filterElement", dataTest: dataTest }, filterPeriodTypesById(getRelativePeriodsOptions(), excludedPeriodTypes).map((option) => (React__default.createElement(SingleSelectOption, { key: option.id, value: option.id, label: option.name, dataTest: `${dataTest}-option-${option.id}` })))),
|
|
2077
|
+
React__default.createElement(SingleSelectField, { label: i18n.t('Period type'), onChange: ({ selected }) => onSelectFilter(selected), dense: true, selected: currentFilter, className: "filterElement", dataTest: dataTest }, filterPeriodTypesById(getRelativePeriodsOptions(), excludedPeriodTypes).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.id, value: option.id, label: option.name, dataTest: `${dataTest}-option-${option.id}` })))),
|
|
2078
2078
|
React__default.createElement("style", { jsx: true }, `
|
|
2079
2079
|
.leftSection {
|
|
2080
2080
|
flex-grow: 1;
|
|
@@ -3217,13 +3217,20 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
|
|
|
3217
3217
|
let teis = response.data
|
|
3218
3218
|
.trackedEntityInstances;
|
|
3219
3219
|
let programMetaData = response.metadata.programTrackedEntityAttributes;
|
|
3220
|
+
//let progrmaMetaDataAttributesMap = programMetaData.reduce
|
|
3221
|
+
const mappedProgramMetadataAttributes = programMetaData.map((attr) => ({
|
|
3222
|
+
displayInList: attr.displayInList,
|
|
3223
|
+
searchable: attr.searchable,
|
|
3224
|
+
id: attr.trackedEntityAttribute.id,
|
|
3225
|
+
}));
|
|
3226
|
+
console.log('the mapped attributes', mappedProgramMetadataAttributes);
|
|
3220
3227
|
const programAttributesMap = programMetaData.reduce((acc, attribute) => {
|
|
3221
3228
|
if (attribute.displayInList) {
|
|
3222
3229
|
acc[attribute.id] = attribute.displayName;
|
|
3223
3230
|
}
|
|
3224
3231
|
return acc;
|
|
3225
3232
|
}, {});
|
|
3226
|
-
console.log('
|
|
3233
|
+
console.log('metadat attributes', programMetaData);
|
|
3227
3234
|
if (filters) {
|
|
3228
3235
|
teis = getFilteredTrackedEntityInstances(teis, filters);
|
|
3229
3236
|
}
|
|
@@ -3258,6 +3265,18 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
|
|
|
3258
3265
|
// Check if the column label is part of any value in programAttributesMap
|
|
3259
3266
|
return Object.values(programAttributesMap).some((value) => value.includes(column.label));
|
|
3260
3267
|
});
|
|
3268
|
+
const searchableAttributes = mappedProgramMetadataAttributes
|
|
3269
|
+
.filter((attr) => attr.searchable && attr.displayInList)
|
|
3270
|
+
.map((attr) => ({
|
|
3271
|
+
// label: attr.trackedEntityAttribute.displayName,
|
|
3272
|
+
key: attr.id,
|
|
3273
|
+
}));
|
|
3274
|
+
// Extract keys from searchableAttributes for quick lookup
|
|
3275
|
+
const searchableKeys = new Set(searchableAttributes.map((attr) => attr.key));
|
|
3276
|
+
// Filter entityColumns to keep only those whose key exists in searchableAttributes
|
|
3277
|
+
const filteredEntityColumns = entityColumns.filter((column) => searchableKeys.has(column.key));
|
|
3278
|
+
console.log('show the filtered values', filteredEntityColumns);
|
|
3279
|
+
console.log('the answer is ', searchableAttributes);
|
|
3261
3280
|
const attributesData = teis.map((tei, idx) => {
|
|
3262
3281
|
let row = {
|
|
3263
3282
|
trackedEntityInstance: tei.trackedEntityInstance,
|
|
@@ -3271,7 +3290,8 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
|
|
|
3271
3290
|
attributesToUse.forEach((attr) => (row[attr.attribute] = attr.value));
|
|
3272
3291
|
return row;
|
|
3273
3292
|
});
|
|
3274
|
-
|
|
3293
|
+
console.log('attributes to use', entityColumns);
|
|
3294
|
+
return { columns: entityColumns, data: attributesData, filteredEntityColumns: filteredEntityColumns };
|
|
3275
3295
|
};
|
|
3276
3296
|
const getEventData = (response, pager) => {
|
|
3277
3297
|
const events = response.data.events;
|
|
@@ -3307,7 +3327,8 @@ const addActionsColumn = (columns, actionOptions) => {
|
|
|
3307
3327
|
class LineListTableComponent extends ReactWrapperModule {
|
|
3308
3328
|
constructor() {
|
|
3309
3329
|
super(...arguments);
|
|
3310
|
-
this.
|
|
3330
|
+
this.dispatchTeis = false;
|
|
3331
|
+
this.showFilterButton = false;
|
|
3311
3332
|
this.actionSelected = new EventEmitter();
|
|
3312
3333
|
this.reactStateUpdaters = null;
|
|
3313
3334
|
this.approvalSelected = new EventEmitter();
|
|
@@ -3335,6 +3356,9 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3335
3356
|
const [endDateState, setEndDateState] = useState(this.endDate);
|
|
3336
3357
|
const [loading, setLoading] = useState(false);
|
|
3337
3358
|
const [isButtonLoading, setIsButtonLoading] = useState(this.isButtonLoading);
|
|
3359
|
+
const [filteredColumns, setFilteredColumns] = useState();
|
|
3360
|
+
const [inputValues, setInputValues] = useState({});
|
|
3361
|
+
const [filters, setFilters] = useState(false);
|
|
3338
3362
|
// Store updaters in refs for Angular to access
|
|
3339
3363
|
const updateRefs = useRef({
|
|
3340
3364
|
setProgramIdState,
|
|
@@ -3364,11 +3388,14 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3364
3388
|
useEffect(() => {
|
|
3365
3389
|
setLoading(true);
|
|
3366
3390
|
this.lineListService
|
|
3367
|
-
.getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize,
|
|
3391
|
+
.getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize, attributeFiltersState,
|
|
3392
|
+
// this.attributeFilters,
|
|
3393
|
+
this.startDate, this.endDate, this.ouMode)
|
|
3368
3394
|
.subscribe((response) => {
|
|
3369
3395
|
let entityColumns = [];
|
|
3370
3396
|
let responsePager;
|
|
3371
3397
|
let entityData = [];
|
|
3398
|
+
let filteredDataColumns = [];
|
|
3372
3399
|
if (this.programStageId) {
|
|
3373
3400
|
responsePager = response.data.pager;
|
|
3374
3401
|
const { columns, data } = getProgramStageData(response, this.programStageId, pager);
|
|
@@ -3378,9 +3405,14 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3378
3405
|
else if ('trackedEntityInstances' in response.data) {
|
|
3379
3406
|
responsePager = response.data
|
|
3380
3407
|
.pager;
|
|
3381
|
-
const { columns, data } = getTrackedEntityData(response, this.programId, pager, this.filters);
|
|
3408
|
+
const { columns, data, filteredEntityColumns } = getTrackedEntityData(response, this.programId, pager, this.filters);
|
|
3382
3409
|
entityColumns = columns;
|
|
3383
3410
|
entityData = data;
|
|
3411
|
+
// setFilteredColumns(filteredEntityColumns);
|
|
3412
|
+
// Ensure filter inputs do not disappear when no data is returned
|
|
3413
|
+
// If filteredEntityColumns is empty, keep the previous columns instead of clearing them
|
|
3414
|
+
setFilteredColumns((prev) => filteredEntityColumns.length > 0 ? filteredEntityColumns : prev);
|
|
3415
|
+
filteredDataColumns = filteredEntityColumns;
|
|
3384
3416
|
}
|
|
3385
3417
|
else {
|
|
3386
3418
|
responsePager = response.data.pager;
|
|
@@ -3390,12 +3422,12 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3390
3422
|
}
|
|
3391
3423
|
const finalColumns = addActionsColumn([{ label: '#', key: 'index' }, ...entityColumns], this.actionOptions);
|
|
3392
3424
|
setLoading(false);
|
|
3393
|
-
console.log('hey');
|
|
3425
|
+
// console.log('hey');
|
|
3394
3426
|
setColumns(...[finalColumns]);
|
|
3395
3427
|
setData(...[entityData]);
|
|
3396
3428
|
setPager(...[responsePager]);
|
|
3397
|
-
console.log('columns', columns);
|
|
3398
|
-
console.log('data', data);
|
|
3429
|
+
// console.log('columns', columns);
|
|
3430
|
+
// console.log('data', data);
|
|
3399
3431
|
});
|
|
3400
3432
|
}, [
|
|
3401
3433
|
programIdState,
|
|
@@ -3437,17 +3469,64 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3437
3469
|
: null;
|
|
3438
3470
|
})
|
|
3439
3471
|
.filter((item) => item !== null); // Remove null entries (no matching enrollment)
|
|
3440
|
-
console.log('TEI and Enrollment IDs emitted:', teiEnrollmentList);
|
|
3472
|
+
// console.log('TEI and Enrollment IDs emitted:', teiEnrollmentList);
|
|
3441
3473
|
this.approvalSelected.emit(teiEnrollmentList);
|
|
3442
3474
|
}
|
|
3443
3475
|
else {
|
|
3444
|
-
console.log('No tracked entity instances found in the response');
|
|
3476
|
+
// console.log('No tracked entity instances found in the response');
|
|
3445
3477
|
this.approvalSelected.emit([]); // Emit empty array if no TEIs
|
|
3446
3478
|
}
|
|
3447
3479
|
});
|
|
3448
3480
|
};
|
|
3481
|
+
// const handleInputChange = (key: string, value: string) => {
|
|
3482
|
+
// setInputValues((prevValues) => ({
|
|
3483
|
+
// ...prevValues,
|
|
3484
|
+
// [key]: value ?? '', // Ensure no undefined values
|
|
3485
|
+
// }));
|
|
3486
|
+
// };
|
|
3487
|
+
// if (!filteredColumns || filteredColumns.length === 0) {
|
|
3488
|
+
// return <div>No fields available</div>;
|
|
3489
|
+
// }
|
|
3490
|
+
const handleInputChange = (key, value) => {
|
|
3491
|
+
setInputValues((prevValues) => ({
|
|
3492
|
+
...prevValues,
|
|
3493
|
+
[key]: value ?? '',
|
|
3494
|
+
}));
|
|
3495
|
+
setAttributeFiltersState((prevFilters = []) => {
|
|
3496
|
+
// Remove old filter for this key
|
|
3497
|
+
const filteredFilters = prevFilters.filter((f) => f.attribute !== key);
|
|
3498
|
+
// Only add new filter if value is not empty
|
|
3499
|
+
const updatedFilters = value.trim()
|
|
3500
|
+
? [...filteredFilters, { attribute: key, operator: 'like', value }]
|
|
3501
|
+
: filteredFilters;
|
|
3502
|
+
// console.log(`Updated Filters:`, updatedFilters); // Debugging
|
|
3503
|
+
return updatedFilters;
|
|
3504
|
+
});
|
|
3505
|
+
// setAttributeFiltersState((prevFilters = []) => {
|
|
3506
|
+
// // Check if attribute already exists
|
|
3507
|
+
// const existingFilterIndex = prevFilters.findIndex(
|
|
3508
|
+
// (f) => f.attribute === key
|
|
3509
|
+
// );
|
|
3510
|
+
// // Create a new filter object
|
|
3511
|
+
// const newFilter = { attribute: key, operator: 'like', value };
|
|
3512
|
+
// if (existingFilterIndex !== -1) {
|
|
3513
|
+
// // If attribute exists, update its value
|
|
3514
|
+
// const updatedFilters = [...prevFilters];
|
|
3515
|
+
// updatedFilters[existingFilterIndex] = newFilter;
|
|
3516
|
+
// console.log(`Updated Filters:`, updatedFilters); // Log updated filter list
|
|
3517
|
+
// return updatedFilters;
|
|
3518
|
+
// } else {
|
|
3519
|
+
// // If attribute doesn't exist, add a new object
|
|
3520
|
+
// return [...prevFilters, newFilter];
|
|
3521
|
+
// }
|
|
3522
|
+
// });
|
|
3523
|
+
};
|
|
3524
|
+
// console.log(
|
|
3525
|
+
// 'these are the filtered columns which have the attributes neede',
|
|
3526
|
+
// filteredColumns
|
|
3527
|
+
// );
|
|
3449
3528
|
return (React__default.createElement("div", null,
|
|
3450
|
-
|
|
3529
|
+
React__default.createElement("div", { style: {
|
|
3451
3530
|
width: '100%',
|
|
3452
3531
|
display: 'flex',
|
|
3453
3532
|
justifyContent: 'flex-end',
|
|
@@ -3455,7 +3534,45 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3455
3534
|
gap: 8,
|
|
3456
3535
|
padding: 8,
|
|
3457
3536
|
marginBottom: 16,
|
|
3458
|
-
} },
|
|
3537
|
+
} },
|
|
3538
|
+
this.dispatchTeis &&
|
|
3539
|
+
(isButtonLoading ? (React__default.createElement(CircularLoader$1, { small: true })) : (React__default.createElement(Button$1, { style: {
|
|
3540
|
+
backgroundColor: '#3b82f6', // Blue color
|
|
3541
|
+
color: 'white',
|
|
3542
|
+
padding: '8px 16px',
|
|
3543
|
+
borderRadius: '4px',
|
|
3544
|
+
cursor: 'pointer',
|
|
3545
|
+
}, onClick: handleApprovalClick, primary: true }, this.buttonLabel))),
|
|
3546
|
+
this.showFilterButton && (React__default.createElement(Button$1, { style: {
|
|
3547
|
+
backgroundColor: '#6b7280', // Gray color
|
|
3548
|
+
color: 'white',
|
|
3549
|
+
padding: '8px 16px',
|
|
3550
|
+
borderRadius: '4px',
|
|
3551
|
+
cursor: 'pointer',
|
|
3552
|
+
display: 'flex',
|
|
3553
|
+
alignItems: 'center',
|
|
3554
|
+
gap: 8,
|
|
3555
|
+
}, onClick: () => {
|
|
3556
|
+
setFilters(!filters);
|
|
3557
|
+
} },
|
|
3558
|
+
React__default.createElement(IconFilter16, null),
|
|
3559
|
+
filters ? 'Hide Filters' : 'Show Filters'))),
|
|
3560
|
+
filters && (React__default.createElement("div", { style: {
|
|
3561
|
+
display: 'flex',
|
|
3562
|
+
gap: '10px',
|
|
3563
|
+
flexWrap: 'wrap',
|
|
3564
|
+
paddingBottom: '16px',
|
|
3565
|
+
} }, (filteredColumns ?? []).map(({ label, key }) => (React__default.createElement(InputField$1, { key: key, label: label, value: inputValues[key] || '', onChange: (e) => {
|
|
3566
|
+
console.log(`Event for key "${key}":`, e);
|
|
3567
|
+
// Check if it's a standard event with target.value
|
|
3568
|
+
if ('target' in e && e.target) {
|
|
3569
|
+
handleInputChange(key, e.target.value);
|
|
3570
|
+
}
|
|
3571
|
+
// Check if it's an event with direct value
|
|
3572
|
+
else if ('value' in e) {
|
|
3573
|
+
handleInputChange(key, e.value ?? '');
|
|
3574
|
+
}
|
|
3575
|
+
} }))))),
|
|
3459
3576
|
loading ? (React__default.createElement("div", { style: {
|
|
3460
3577
|
display: 'flex',
|
|
3461
3578
|
alignItems: 'center',
|
|
@@ -3468,7 +3585,14 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3468
3585
|
} }, "Loading"))) : (React__default.createElement(DataTable, null,
|
|
3469
3586
|
React__default.createElement(TableHead, null,
|
|
3470
3587
|
React__default.createElement(DataTableRow, null, columns.map((col) => (React__default.createElement(DataTableColumnHeader, { key: col.key }, col.label))))),
|
|
3471
|
-
React__default.createElement(TableBody, null, data.map((row) => (React__default.createElement(DataTableRow, { key: row.index }, columns.map((col) => (React__default.createElement(DataTableCell, { key: col.key }, col.key === 'actions' ? (React__default.createElement(DropdownMenu$1, { dropdownOptions: getDropdownOptions(row), onClick: (option) => option.onClick?.() })) : (row[col.key]
|
|
3588
|
+
React__default.createElement(TableBody, null, data.length > 0 ? (data.map((row) => (React__default.createElement(DataTableRow, { key: row.index }, columns.map((col) => (React__default.createElement(DataTableCell, { key: col.key }, col.key === 'actions' ? (React__default.createElement(DropdownMenu$1, { dropdownOptions: getDropdownOptions(row), onClick: (option) => option.onClick?.() })) : (row[col.key] || '--' // Display '--' if value is undefined or null
|
|
3589
|
+
)))))))) : (React__default.createElement(DataTableRow, null,
|
|
3590
|
+
React__default.createElement(DataTableCell, { colSpan: columns.length, style: {
|
|
3591
|
+
textAlign: 'center',
|
|
3592
|
+
fontWeight: 'bold',
|
|
3593
|
+
color: 'grey',
|
|
3594
|
+
padding: '20px',
|
|
3595
|
+
} }, "No data found")))),
|
|
3472
3596
|
React__default.createElement(TableFoot, null,
|
|
3473
3597
|
React__default.createElement(DataTableRow, null,
|
|
3474
3598
|
React__default.createElement(DataTableCell, { colSpan: columns.length.toString() },
|
|
@@ -3516,7 +3640,7 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3516
3640
|
this.render();
|
|
3517
3641
|
}
|
|
3518
3642
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
3519
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "app-line-list", inputs: { programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", attributeFilters: "attributeFilters", startDate: "startDate", endDate: "endDate", filters: "filters", ouMode: "ouMode",
|
|
3643
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: LineListTableComponent, isStandalone: false, selector: "app-line-list", inputs: { programId: "programId", orgUnit: "orgUnit", programStageId: "programStageId", actionOptions: "actionOptions", attributeFilters: "attributeFilters", startDate: "startDate", endDate: "endDate", filters: "filters", ouMode: "ouMode", dispatchTeis: "dispatchTeis", showFilterButton: "showFilterButton", isButtonLoading: "isButtonLoading", buttonLabel: "buttonLabel" }, outputs: { actionSelected: "actionSelected", approvalSelected: "approvalSelected" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["[data-test=dhis2-uiwidgets-pagination]{display:flex!important;flex-direction:row!important;justify-content:space-between!important;align-items:center!important}\n"] }); }
|
|
3520
3644
|
}
|
|
3521
3645
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
|
|
3522
3646
|
type: Component,
|
|
@@ -3539,7 +3663,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
|
|
|
3539
3663
|
type: Input
|
|
3540
3664
|
}], ouMode: [{
|
|
3541
3665
|
type: Input
|
|
3542
|
-
}],
|
|
3666
|
+
}], dispatchTeis: [{
|
|
3667
|
+
type: Input
|
|
3668
|
+
}], showFilterButton: [{
|
|
3543
3669
|
type: Input
|
|
3544
3670
|
}], actionSelected: [{
|
|
3545
3671
|
type: Output
|
|
@@ -4817,7 +4943,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
4817
4943
|
});
|
|
4818
4944
|
setValue(event.selected);
|
|
4819
4945
|
setTouched(true);
|
|
4820
|
-
} }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: option.key, label: option.label, value: option.value })))));
|
|
4946
|
+
} }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.key, label: option.label, value: option.value })))));
|
|
4821
4947
|
case 'multi-dropdown':
|
|
4822
4948
|
return (React__default.createElement(MultiSelectField, { clearText: "Clear", clearable: true, empty: "No data found", filterable: (this.field().options || []).length > 5, filterPlaceholder: "Type to filter options", error: hasError, validationText: validationError, inputWidth: this.fieldConfig()?.inputWidth, label: this.label(), name: this.field().id, required: this.field().required, loadingText: "Loading options", noMatchText: "No options found", onChange: (event) => {
|
|
4823
4949
|
const selectedValue = (event.selected || []).join(',');
|
|
@@ -5541,6 +5667,8 @@ class SelectionFiltersComponent extends ReactWrapperModule {
|
|
|
5541
5667
|
const [touched, setTouched] = useState(false);
|
|
5542
5668
|
const [showOrgUnit, setShowOrgUnit] = useState(false);
|
|
5543
5669
|
const [value, setValue] = useState(null);
|
|
5670
|
+
const [showMoreFilters, setShowMoreFilters] = useState(false);
|
|
5671
|
+
const toggleMoreFilters = () => setShowMoreFilters((prev) => !prev);
|
|
5544
5672
|
useEffect(() => {
|
|
5545
5673
|
setFilters({
|
|
5546
5674
|
programAttributesFilters: this.programAttributesFilters,
|
|
@@ -5582,7 +5710,9 @@ class SelectionFiltersComponent extends ReactWrapperModule {
|
|
|
5582
5710
|
const handleSearch = () => {
|
|
5583
5711
|
this.actionSelected.emit({
|
|
5584
5712
|
...filters,
|
|
5585
|
-
organisationUnit: selectedOrganisationUnit ||
|
|
5713
|
+
organisationUnit: selectedOrganisationUnit ||
|
|
5714
|
+
this.organisationUnit ||
|
|
5715
|
+
filters.organisationUnit,
|
|
5586
5716
|
startDate: filters.startDate,
|
|
5587
5717
|
endDate: filters.endDate,
|
|
5588
5718
|
program: this.program || filters.program,
|
|
@@ -5657,17 +5787,14 @@ class SelectionFiltersComponent extends ReactWrapperModule {
|
|
|
5657
5787
|
} },
|
|
5658
5788
|
React__default.createElement("div", { style: {
|
|
5659
5789
|
display: 'grid',
|
|
5660
|
-
gridTemplateColumns: '
|
|
5790
|
+
gridTemplateColumns: '1fr 1fr 1fr auto', // Ensure proper button sizing
|
|
5661
5791
|
gap: '16px',
|
|
5792
|
+
alignItems: 'center', // Align inputs and button on the same row
|
|
5662
5793
|
marginBottom: '16px',
|
|
5663
5794
|
} },
|
|
5664
|
-
React__default.createElement(
|
|
5665
|
-
React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => {
|
|
5666
|
-
|
|
5667
|
-
}, onBlur: () => {
|
|
5668
|
-
this.ngZone.run(() => {
|
|
5669
|
-
console.log('THIS IS IT::: ');
|
|
5670
|
-
});
|
|
5795
|
+
React__default.createElement("div", { style: { width: '100%' } },
|
|
5796
|
+
React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => setShowOrgUnit(true), onBlur: () => {
|
|
5797
|
+
this.ngZone.run(() => console.log('THIS IS IT::: '));
|
|
5671
5798
|
setTouched(true);
|
|
5672
5799
|
} }),
|
|
5673
5800
|
showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { onCancelOrgUnit: () => {
|
|
@@ -5682,30 +5809,36 @@ class SelectionFiltersComponent extends ReactWrapperModule {
|
|
|
5682
5809
|
setValue(selectedOrgUnit.id);
|
|
5683
5810
|
setShowOrgUnit(false);
|
|
5684
5811
|
setTouched(true);
|
|
5685
|
-
// this.ngZone.run(() => {
|
|
5686
|
-
// setDisplayValue(selectedOrgUnit.name);
|
|
5687
|
-
// setSelected(selectedOrgUnit.id)
|
|
5688
|
-
// setSelectedOrganisationUnit(selectedOrgUnit.id)
|
|
5689
|
-
// setValue(selectedOrgUnit.id);
|
|
5690
|
-
// setShowOrgUnit(false);
|
|
5691
|
-
// setTouched(true);
|
|
5692
|
-
// });
|
|
5693
5812
|
}
|
|
5694
5813
|
} }))),
|
|
5695
|
-
React__default.createElement(InputField$1, { className: "input-field", label: "Start Date", type: "DATE", value: filters.startDate, onChange: (event) => setFilters({ ...filters, startDate: event.value }) }),
|
|
5696
|
-
React__default.createElement(InputField$1, { className: "input-field", label: "End Date", type: "DATE", value: filters.endDate, onChange: (event) => setFilters({ ...filters, endDate: event.value }) })
|
|
5697
|
-
|
|
5698
|
-
|
|
5699
|
-
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
|
|
5703
|
-
|
|
5704
|
-
|
|
5705
|
-
|
|
5706
|
-
|
|
5707
|
-
|
|
5708
|
-
|
|
5814
|
+
React__default.createElement(InputField$1, { className: "input-field", label: "Start Date", type: "DATE", value: filters.startDate, onChange: (event) => setFilters({ ...filters, startDate: event.value }), style: { width: '100%', height: '100%' } }),
|
|
5815
|
+
React__default.createElement(InputField$1, { className: "input-field", label: "End Date", type: "DATE", value: filters.endDate, onChange: (event) => setFilters({ ...filters, endDate: event.value }), style: { width: '100%', height: '100%' } }),
|
|
5816
|
+
React__default.createElement("div", { style: {
|
|
5817
|
+
display: 'flex',
|
|
5818
|
+
flexDirection: 'column',
|
|
5819
|
+
alignItems: 'center',
|
|
5820
|
+
justifyContent: 'center',
|
|
5821
|
+
height: '100%',
|
|
5822
|
+
} },
|
|
5823
|
+
React__default.createElement("label", { style: {
|
|
5824
|
+
color: 'transparent', // Hides label text but keeps spacing
|
|
5825
|
+
fontSize: '14px',
|
|
5826
|
+
marginBottom: '4px',
|
|
5827
|
+
} }, "Toggle"),
|
|
5828
|
+
React__default.createElement(Button$1, { style: { height: '40px' }, onClick: () => setShowMoreFilters(!showMoreFilters) }, showMoreFilters ? 'Hide Filters' : 'More Filters'))),
|
|
5829
|
+
showMoreFilters && (React__default.createElement(React__default.Fragment, null,
|
|
5830
|
+
React__default.createElement("div", { style: {
|
|
5831
|
+
display: 'grid',
|
|
5832
|
+
gridTemplateColumns: 'repeat(4, 1fr)',
|
|
5833
|
+
gap: '16px',
|
|
5834
|
+
} }, filters.programAttributesFilters.map((filter, index) => (React__default.createElement("div", { key: index, style: { gridColumn: getAttributeColumnSpan(index) } }, filter.hasOptions && filter.options.length > 0 ? (React__default.createElement(SingleSelectField, { className: "single-select", label: filter.name || 'Select Option', type: filter.valueType, selected: filter.value, onChange: (event) => handleAttributeChange(index, event.selected) }, filter.options.map((option, i) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || i, label: option.name, value: option.code }))))) : (React__default.createElement(InputField$1, { className: "input-field", label: filter.name || 'Program name', type: filter.valueType, value: filter.value, onChange: (event) => handleAttributeChange(index, event.value) })))))),
|
|
5835
|
+
React__default.createElement("div", { style: {
|
|
5836
|
+
display: 'grid',
|
|
5837
|
+
gridTemplateColumns: 'repeat(4, 1fr)',
|
|
5838
|
+
gap: '16px',
|
|
5839
|
+
} }, filters.programStageDataElementFilters.map((filter, index) => (React__default.createElement("div", { key: index, style: { gridColumn: getDataElementColumnSpan(index) } }, filter.hasOptions && filter.options.length > 0 ? (React__default.createElement(SingleSelectField, { className: "single-select", label: filter.name || 'Aggregation type', type: filter.valueType, selected: filter.value, onChange: (event) => handleDataElementChange(index, event.selected) }, filter.options.map((option, i) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || i, label: option.name, value: option.code }))))) : (React__default.createElement(InputField$1, { className: "input-field", type: filter.valueType, label: filter.name || 'Program name', value: filter.value, onChange: (event) => handleDataElementChange(index, event.value) })))))),
|
|
5840
|
+
React__default.createElement("div", { style: { textAlign: 'right', marginTop: '16px' } },
|
|
5841
|
+
React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))))));
|
|
5709
5842
|
};
|
|
5710
5843
|
}
|
|
5711
5844
|
getAppConfig() {
|