@iapps/ng-dhis2-ui 1.1.51 → 1.1.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/iapps-ng-dhis2-ui.mjs +198 -65
- package/fesm2022/iapps-ng-dhis2-ui.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/lib/modules/breadcrumb/breadcrumb.module.d.ts +8 -0
- package/lib/modules/breadcrumb/components/breadcrumb-item.component.d.ts +6 -0
- package/lib/modules/breadcrumb/containers/breadcrumb.component.d.ts +12 -0
- package/lib/modules/breadcrumb/index.d.ts +3 -0
- package/lib/modules/breadcrumb/models/breadcrumb-item.model.d.ts +6 -0
- package/lib/modules/breadcrumb/models/index.d.ts +1 -0
- package/lib/modules/form/utils/field-type.util.d.ts +1 -1
- package/lib/modules/form/utils/field.util.d.ts +1 -1
- package/lib/modules/line-list/containers/line-list.component.d.ts +2 -1
- package/lib/modules/line-list/services/line-list.service.d.ts +1 -1
- package/lib/shared/hooks/dynamic-styles.hook.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i1$1 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { NgModule, Directive, Input, ContentChild, Component, EventEmitter, Output,
|
|
4
|
+
import { NgModule, Directive, Input, ContentChild, Component, EventEmitter, Output, inject, NgZone, input, ChangeDetectionStrategy, Injectable, model, signal, computed, ViewChildren } from '@angular/core';
|
|
5
5
|
import { useDataQuery, useConfig, useAlert, clearSensitiveCaches, DataProvider, useDataEngine, Provider } from '@dhis2/app-runtime';
|
|
6
6
|
import * as i1 from '@iapps/ngx-dhis2-http-client';
|
|
7
7
|
import { NgxDhis2HttpClientService } from '@iapps/ngx-dhis2-http-client';
|
|
@@ -25,10 +25,10 @@ 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, IconFilter16, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, Chip, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
|
|
29
|
-
import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
|
|
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, Layer as Layer$1, Popper, FlyoutMenu, MenuItem as MenuItem$1, IconMore24, CircularLoader as CircularLoader$1, IconFilter16, DataTable, TableHead, DataTableRow, DataTableColumnHeader, TableBody, DataTableCell, TableFoot, Pagination, Chip, FileInputField, FileListItem, MultiSelectField, TextAreaField } from '@dhis2/ui';
|
|
30
29
|
import { isObject, isString, sortBy, isArray, find, camelCase, flatten, debounce, isUndefined, head, isEmpty } from 'lodash';
|
|
31
30
|
import cx from 'classnames';
|
|
31
|
+
import { getNowInCalendar, generateFixedPeriods } from '@dhis2/multi-calendar-dates';
|
|
32
32
|
import { map as map$1, switchMap } from 'rxjs/operators';
|
|
33
33
|
import * as i2 from '@angular/forms';
|
|
34
34
|
import { Validators, UntypedFormControl, UntypedFormGroup, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
@@ -1183,6 +1183,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
|
|
|
1183
1183
|
// Use of this source code is governed by a BSD-style
|
|
1184
1184
|
// license that can be found in the LICENSE file.
|
|
1185
1185
|
|
|
1186
|
+
// Copyright 2025 UDSM DHIS2 Lab. All rights reserved.
|
|
1187
|
+
// Use of this source code is governed by a BSD-style
|
|
1188
|
+
// license that can be found in the LICENSE file.
|
|
1189
|
+
|
|
1190
|
+
const TRANSFER_OPTIONS_WIDTH = '420px';
|
|
1191
|
+
const TRANSFER_SELECTED_WIDTH = '298px';
|
|
1192
|
+
const TRANSFER_HEIGHT = '512px';
|
|
1193
|
+
|
|
1186
1194
|
const AssignedCategoriesIcon = () => {
|
|
1187
1195
|
return (React__default.createElement("svg", { height: "16", viewBox: "0 0 16 16", width: "16" },
|
|
1188
1196
|
React__default.createElement("g", { fill: "#212934", fillRule: "evenodd" },
|
|
@@ -1238,10 +1246,6 @@ const filterOutPredefinedDimensions = (dimensionIds) => dimensionIds.filter((dim
|
|
|
1238
1246
|
const getPredefinedDimensionProp = (dimensionId, propName) => (getPredefinedDimensions()[dimensionId] || {})[propName];
|
|
1239
1247
|
const getDimensionById = (dimensionId) => getPredefinedDimensions()[dimensionId];
|
|
1240
1248
|
|
|
1241
|
-
const TRANSFER_OPTIONS_WIDTH = '420px';
|
|
1242
|
-
const TRANSFER_SELECTED_WIDTH = '298px';
|
|
1243
|
-
const TRANSFER_HEIGHT = '512px';
|
|
1244
|
-
|
|
1245
1249
|
const formatList = (items) => {
|
|
1246
1250
|
// Wrap Intl.ListFormat in try/catch as DHIS2 locales are not always ISO 639 compliant
|
|
1247
1251
|
try {
|
|
@@ -1392,7 +1396,7 @@ const dimensionGetItems = (dimension) => dimensionIsValid(dimension, { requireIt
|
|
|
1392
1396
|
// Use of this source code is governed by a BSD-style
|
|
1393
1397
|
// license that can be found in the LICENSE file.
|
|
1394
1398
|
|
|
1395
|
-
var styles$
|
|
1399
|
+
var styles$2 = `
|
|
1396
1400
|
.filterContainer {
|
|
1397
1401
|
display: flex;
|
|
1398
1402
|
margin-bottom: ${spacers$1.dp12};
|
|
@@ -1564,55 +1568,55 @@ TransferOption.propTypes = {
|
|
|
1564
1568
|
// Use of this source code is governed by a BSD-style
|
|
1565
1569
|
// license that can be found in the LICENSE file.
|
|
1566
1570
|
|
|
1567
|
-
// Helper function to generate a unique class name
|
|
1568
1571
|
const generateClassName$2 = (base) => `${base}-${Math.random().toString(36).substr(2, 9)}`;
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
let
|
|
1572
|
+
const convertStylesToCSS$2 = (className, styles, parentSelector = '') => {
|
|
1573
|
+
let cssString = '';
|
|
1574
|
+
let mainBlock = parentSelector ? `${parentSelector} {` : `.${className} {`;
|
|
1572
1575
|
for (const key in styles) {
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1576
|
+
const value = styles[key];
|
|
1577
|
+
if (typeof value === 'object') {
|
|
1578
|
+
if (key.startsWith('@media')) {
|
|
1579
|
+
// Handle media queries
|
|
1580
|
+
cssString += `${key} { ${convertStylesToCSS$2(className, value, `.${className}`)} }`;
|
|
1581
|
+
}
|
|
1582
|
+
else if (key.startsWith('&')) {
|
|
1583
|
+
// Handle pseudo-classes and nested selectors
|
|
1584
|
+
const selector = key.replace('&', `.${className}`);
|
|
1585
|
+
cssString += convertStylesToCSS$2(className, value, selector);
|
|
1586
|
+
}
|
|
1587
|
+
else {
|
|
1588
|
+
// Handle nested elements (e.g., '& > div')
|
|
1589
|
+
cssString += convertStylesToCSS$2(className, value, `.${className} ${key}`);
|
|
1590
|
+
}
|
|
1580
1591
|
}
|
|
1581
1592
|
else {
|
|
1593
|
+
// Convert camelCase to kebab-case
|
|
1582
1594
|
const cssKey = key.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
|
|
1583
|
-
|
|
1595
|
+
mainBlock += `${cssKey}: ${value}; `;
|
|
1584
1596
|
}
|
|
1585
1597
|
}
|
|
1586
|
-
|
|
1587
|
-
return cssString;
|
|
1598
|
+
mainBlock += '}';
|
|
1599
|
+
return mainBlock + ' ' + cssString;
|
|
1588
1600
|
};
|
|
1589
|
-
// Custom hook for dynamic styles
|
|
1601
|
+
// Custom hook for dynamic styles
|
|
1590
1602
|
const useDynamicStyles$2 = (stylesObj) => {
|
|
1591
1603
|
const [classNames, setClassNames] = useState({});
|
|
1592
1604
|
useEffect(() => {
|
|
1593
|
-
const
|
|
1605
|
+
const styleElements = [];
|
|
1606
|
+
const generatedClassNames = Object.keys(stylesObj).reduce((acc, key) => {
|
|
1594
1607
|
const className = generateClassName$2(key);
|
|
1595
1608
|
const styleElement = document.createElement('style');
|
|
1596
1609
|
styleElement.innerHTML = convertStylesToCSS$2(className, stylesObj[key]);
|
|
1597
1610
|
document.head.appendChild(styleElement);
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
});
|
|
1604
|
-
setClassNames(convertedStyles.reduce((classNameEntity, convertedStyle) => {
|
|
1605
|
-
return {
|
|
1606
|
-
...classNameEntity,
|
|
1607
|
-
[convertedStyle.key]: convertedStyle.className,
|
|
1608
|
-
};
|
|
1609
|
-
}, {}));
|
|
1611
|
+
styleElements.push(styleElement);
|
|
1612
|
+
acc[key] = className;
|
|
1613
|
+
return acc;
|
|
1614
|
+
}, {});
|
|
1615
|
+
setClassNames(generatedClassNames);
|
|
1610
1616
|
return () => {
|
|
1611
|
-
|
|
1612
|
-
document.head.removeChild(convertedStyle.styleElement);
|
|
1613
|
-
});
|
|
1617
|
+
styleElements.forEach((el) => document.head.removeChild(el));
|
|
1614
1618
|
};
|
|
1615
|
-
}, []);
|
|
1619
|
+
}, [stylesObj]);
|
|
1616
1620
|
return classNames;
|
|
1617
1621
|
};
|
|
1618
1622
|
|
|
@@ -1624,6 +1628,104 @@ const useDynamicStyles$2 = (stylesObj) => {
|
|
|
1624
1628
|
// Use of this source code is governed by a BSD-style
|
|
1625
1629
|
// license that can be found in the LICENSE file.
|
|
1626
1630
|
|
|
1631
|
+
// Copyright 2025 UDSM DHIS2 Lab. All rights reserved.
|
|
1632
|
+
// Use of this source code is governed by a BSD-style
|
|
1633
|
+
// license that can be found in the LICENSE file.
|
|
1634
|
+
const styles$1 = {
|
|
1635
|
+
button: {
|
|
1636
|
+
// Reset button styles
|
|
1637
|
+
background: 'none',
|
|
1638
|
+
border: 'none',
|
|
1639
|
+
cursor: 'pointer',
|
|
1640
|
+
font: 'inherit',
|
|
1641
|
+
// Custom button styles
|
|
1642
|
+
fontSize: '14px',
|
|
1643
|
+
padding: '6px 4px',
|
|
1644
|
+
color: colors$1.grey800,
|
|
1645
|
+
borderRadius: '3px',
|
|
1646
|
+
'&:hover': {
|
|
1647
|
+
textDecoration: 'underline',
|
|
1648
|
+
color: 'black',
|
|
1649
|
+
},
|
|
1650
|
+
'&.selected': {
|
|
1651
|
+
color: 'black',
|
|
1652
|
+
},
|
|
1653
|
+
},
|
|
1654
|
+
};
|
|
1655
|
+
const BreadcrumbItemComponent = (props) => {
|
|
1656
|
+
const { breadcrumb, onClick } = props;
|
|
1657
|
+
const classes = useDynamicStyles$2(styles$1);
|
|
1658
|
+
return (React__default.createElement("button", { type: "button", title: breadcrumb.label, className: [
|
|
1659
|
+
classes.button,
|
|
1660
|
+
breadcrumb.selected ? classes.button + '.selected' : null,
|
|
1661
|
+
]
|
|
1662
|
+
.filter((cssClass) => cssClass !== null)
|
|
1663
|
+
.join(' '), onClick: onClick }, breadcrumb.label));
|
|
1664
|
+
};
|
|
1665
|
+
|
|
1666
|
+
class BreadcrumbComponent extends ReactWrapperModule {
|
|
1667
|
+
constructor() {
|
|
1668
|
+
super(...arguments);
|
|
1669
|
+
this.#ngZone = inject(NgZone);
|
|
1670
|
+
this.breadcrumbs = input.required();
|
|
1671
|
+
this.selectBreadcrumb = new EventEmitter();
|
|
1672
|
+
}
|
|
1673
|
+
#ngZone;
|
|
1674
|
+
async ngAfterViewInit() {
|
|
1675
|
+
if (!this.elementRef)
|
|
1676
|
+
throw new Error('No element ref');
|
|
1677
|
+
this.reactDomRoot = ReactDOM.createRoot(this.elementRef.nativeElement);
|
|
1678
|
+
const breadcrumbStyles = {
|
|
1679
|
+
container: {
|
|
1680
|
+
display: 'flex',
|
|
1681
|
+
alignItems: 'center',
|
|
1682
|
+
},
|
|
1683
|
+
};
|
|
1684
|
+
this.component = () => {
|
|
1685
|
+
const classes = useDynamicStyles$2(breadcrumbStyles);
|
|
1686
|
+
return (React__default.createElement("div", { className: classes.container }, this.breadcrumbs().map((breadcrumb, index) => (React__default.createElement(React__default.Fragment, { key: index },
|
|
1687
|
+
React__default.createElement(BreadcrumbItemComponent, { key: index, breadcrumb: breadcrumb, onClick: () => {
|
|
1688
|
+
this.#ngZone.run(() => {
|
|
1689
|
+
this.selectBreadcrumb.emit(breadcrumb);
|
|
1690
|
+
});
|
|
1691
|
+
} }),
|
|
1692
|
+
index < this.breadcrumbs().length - 1 && (React__default.createElement(IconChevronRight16, { color: colors$1.grey800 })))))));
|
|
1693
|
+
};
|
|
1694
|
+
this.render();
|
|
1695
|
+
}
|
|
1696
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: BreadcrumbComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
1697
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.8", type: BreadcrumbComponent, isStandalone: false, selector: "ng-dhis2-ui-breadcrumb", inputs: { breadcrumbs: { classPropertyName: "breadcrumbs", publicName: "breadcrumbs", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectBreadcrumb: "selectBreadcrumb" }, usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1698
|
+
}
|
|
1699
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: BreadcrumbComponent, decorators: [{
|
|
1700
|
+
type: Component,
|
|
1701
|
+
args: [{
|
|
1702
|
+
selector: 'ng-dhis2-ui-breadcrumb',
|
|
1703
|
+
template: '<ng-content></ng-content>',
|
|
1704
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1705
|
+
standalone: false,
|
|
1706
|
+
}]
|
|
1707
|
+
}], propDecorators: { selectBreadcrumb: [{
|
|
1708
|
+
type: Output
|
|
1709
|
+
}] } });
|
|
1710
|
+
|
|
1711
|
+
class BreadcrumbModule {
|
|
1712
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: BreadcrumbModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1713
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.8", ngImport: i0, type: BreadcrumbModule, declarations: [BreadcrumbComponent], imports: [CommonModule], exports: [BreadcrumbComponent] }); }
|
|
1714
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: BreadcrumbModule, imports: [CommonModule] }); }
|
|
1715
|
+
}
|
|
1716
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: BreadcrumbModule, decorators: [{
|
|
1717
|
+
type: NgModule,
|
|
1718
|
+
args: [{
|
|
1719
|
+
declarations: [BreadcrumbComponent],
|
|
1720
|
+
imports: [CommonModule],
|
|
1721
|
+
exports: [BreadcrumbComponent],
|
|
1722
|
+
}]
|
|
1723
|
+
}] });
|
|
1724
|
+
|
|
1725
|
+
// Copyright 2025 UDSM DHIS2 Lab. All rights reserved.
|
|
1726
|
+
// Use of this source code is governed by a BSD-style
|
|
1727
|
+
// license that can be found in the LICENSE file.
|
|
1728
|
+
|
|
1627
1729
|
// Copyright 2023 UDSM DHIS2 Lab. All rights reserved.
|
|
1628
1730
|
// Use of this source code is governed by a BSD-style
|
|
1629
1731
|
// license that can be found in the LICENSE file.
|
|
@@ -2206,17 +2308,17 @@ const PeriodTransfer = ({ onSelect, dataTest, initialSelectedPeriods, rightFoote
|
|
|
2206
2308
|
year,
|
|
2207
2309
|
});
|
|
2208
2310
|
}, dataTest: `${dataTest}-fixed-period-filter`, excludedPeriodTypes: excludedPeriodTypes }))),
|
|
2209
|
-
React__default.createElement("style", { jsx: true }, styles$
|
|
2311
|
+
React__default.createElement("style", { jsx: true }, styles$2)));
|
|
2210
2312
|
const renderRightHeader = () => (React__default.createElement(React__default.Fragment, null,
|
|
2211
2313
|
React__default.createElement("p", { className: "rightHeader" }, i18n.t('Selected Periods')),
|
|
2212
|
-
React__default.createElement("style", { jsx: true }, styles$
|
|
2314
|
+
React__default.createElement("style", { jsx: true }, styles$2)));
|
|
2213
2315
|
const onSelectFixedPeriods = (filter) => {
|
|
2214
2316
|
setFixedFilter(filter);
|
|
2215
2317
|
setAllPeriods((getFixedPeriodsOptionsById(filter.periodType, periodsSettings)?.getPeriods(fixedPeriodConfig(Number(filter.year))) || []));
|
|
2216
2318
|
};
|
|
2217
2319
|
const renderEmptySelection = () => (React__default.createElement(React__default.Fragment, null,
|
|
2218
2320
|
React__default.createElement("p", { className: "emptyList" }, i18n.t('No periods selected')),
|
|
2219
|
-
React__default.createElement("style", { jsx: true }, styles$
|
|
2321
|
+
React__default.createElement("style", { jsx: true }, styles$2)));
|
|
2220
2322
|
return (React__default.createElement(Transfer, { onChange: ({ selected }) => {
|
|
2221
2323
|
const formattedItems = selected.map((id) => ({
|
|
2222
2324
|
id,
|
|
@@ -3193,15 +3295,24 @@ class LineListService {
|
|
|
3193
3295
|
getProgramMetadata(programId) {
|
|
3194
3296
|
return this.httpClient.get(`programs/${programId}.json?fields=programType,programStages[id,name,programStageDataElements[dataElement[id,name]]],organisationUnits[id,name],*`);
|
|
3195
3297
|
}
|
|
3196
|
-
getTrackedEntityInstances(programId, orgUnit, page, pageSize, filters = [], startDate, endDate, ouMode) {
|
|
3298
|
+
getTrackedEntityInstances(programId, orgUnit, page, pageSize, filters = [], startDate, endDate, ouMode, filterRootOrgUnit) {
|
|
3197
3299
|
const filterParams = buildFilters(filters);
|
|
3198
3300
|
const dateFilter = startDate && endDate ? `&programStartDate=${startDate}&programEndDate=${endDate}` : '';
|
|
3199
3301
|
const ouModeIdentifier = ouMode ? `&ouMode=${ouMode}` : ``;
|
|
3200
3302
|
return this.httpClient.get(`trackedEntityInstances.json?program=${programId}&ou=${orgUnit}${ouModeIdentifier}&page=${page}&pageSize=${pageSize}&fields=trackedEntityInstance,orgUnit,attributes[*,displayInList],enrollments[*]&totalPages=true&${filterParams}${dateFilter}&order=created:desc`).pipe(map$1((response) => {
|
|
3201
|
-
|
|
3202
|
-
|
|
3303
|
+
if (filterRootOrgUnit) {
|
|
3304
|
+
response.trackedEntityInstances = response.trackedEntityInstances.filter((tei) => tei.orgUnit !== orgUnit // Exclude TEIs with the root orgUnit
|
|
3305
|
+
);
|
|
3306
|
+
}
|
|
3203
3307
|
return response;
|
|
3204
3308
|
}));
|
|
3309
|
+
// pipe(
|
|
3310
|
+
// map((response: any) => {
|
|
3311
|
+
// //TODO: use the api to to order by desc
|
|
3312
|
+
// // response.trackedEntityInstances.reverse();
|
|
3313
|
+
// return response;
|
|
3314
|
+
// })
|
|
3315
|
+
// );
|
|
3205
3316
|
}
|
|
3206
3317
|
getEvents(programId, orgUnit, page, pageSize, filters = [], startDate, endDate, ouMode) {
|
|
3207
3318
|
const filterParams = buildFilters(filters);
|
|
@@ -3215,7 +3326,7 @@ class LineListService {
|
|
|
3215
3326
|
const ouModeIdentifier = ouMode ? `&ouMode=${ouMode}` : ``;
|
|
3216
3327
|
return this.httpClient.get(`events.json?programStage=${programStageId}&orgUnit=${orgUnit}${ouModeIdentifier}&page=${page}&pageSize=${pageSize}&fields=*&totalPages=true&${filterParams}${dateFilter}`);
|
|
3217
3328
|
}
|
|
3218
|
-
getLineListData(programId, orgUnit = '', programStageId, page = 1, pageSize = 10, filters = [], startDate, endDate, ouMode) {
|
|
3329
|
+
getLineListData(programId, orgUnit = '', programStageId, page = 1, pageSize = 10, filters = [], startDate, endDate, ouMode, filterRootOrgUnit) {
|
|
3219
3330
|
return this.getProgramMetadata(programId).pipe(switchMap((programMetadata) => {
|
|
3220
3331
|
if (programStageId) {
|
|
3221
3332
|
return this.getEventsByProgramStage(programStageId, orgUnit, page, pageSize, filters, startDate, endDate, ouMode).pipe(map$1((events) => ({
|
|
@@ -3224,7 +3335,7 @@ class LineListService {
|
|
|
3224
3335
|
})));
|
|
3225
3336
|
}
|
|
3226
3337
|
if (programMetadata.programType === 'WITH_REGISTRATION') {
|
|
3227
|
-
return this.getTrackedEntityInstances(programId, orgUnit, page, pageSize, filters, startDate, endDate, ouMode).pipe(map$1((teis) => ({
|
|
3338
|
+
return this.getTrackedEntityInstances(programId, orgUnit, page, pageSize, filters, startDate, endDate, ouMode, filterRootOrgUnit).pipe(map$1((teis) => ({
|
|
3228
3339
|
metadata: programMetadata,
|
|
3229
3340
|
data: teis,
|
|
3230
3341
|
})));
|
|
@@ -3276,7 +3387,10 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
|
|
|
3276
3387
|
//organisation units from metadata
|
|
3277
3388
|
let orgUnitsFromMetaData = response.metadata.organisationUnits;
|
|
3278
3389
|
//a Map to efficiently look up orgUnit names by ID
|
|
3279
|
-
const orgUnitMap = new Map(orgUnitsFromMetaData.map((ou) => [
|
|
3390
|
+
const orgUnitMap = new Map(orgUnitsFromMetaData.map((ou) => [
|
|
3391
|
+
ou.id,
|
|
3392
|
+
ou.name,
|
|
3393
|
+
]));
|
|
3280
3394
|
const mappedProgramMetadataAttributes = programMetaData.map((attr) => ({
|
|
3281
3395
|
displayInList: attr.displayInList,
|
|
3282
3396
|
searchable: attr.searchable,
|
|
@@ -3347,11 +3461,17 @@ const getTrackedEntityData = (response, programId, pager, filters) => {
|
|
|
3347
3461
|
? matchingEnrollment.attributes
|
|
3348
3462
|
: tei.attributes;
|
|
3349
3463
|
attributesToUse.forEach((attr) => (row[attr.attribute] = attr.value));
|
|
3464
|
+
//include orgUnit in the row for id access
|
|
3465
|
+
row['orgUnitId'] = tei.orgUnit;
|
|
3350
3466
|
// Access the name of the orgUnit using the Map
|
|
3351
3467
|
row['orgUnit'] = orgUnitMap.get(tei.orgUnit) || tei.orgUnit || 'N/A';
|
|
3352
3468
|
return row;
|
|
3353
3469
|
});
|
|
3354
|
-
return {
|
|
3470
|
+
return {
|
|
3471
|
+
columns: entityColumns,
|
|
3472
|
+
data: attributesData,
|
|
3473
|
+
filteredEntityColumns: filteredEntityColumns,
|
|
3474
|
+
};
|
|
3355
3475
|
};
|
|
3356
3476
|
const getEventData = (response, pager) => {
|
|
3357
3477
|
const events = response.data.events;
|
|
@@ -3395,6 +3515,7 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3395
3515
|
this.isButtonLoading = false;
|
|
3396
3516
|
this.buttonLabel = '';
|
|
3397
3517
|
this.firstValue = new EventEmitter();
|
|
3518
|
+
this.filterRootOrgUnit = false;
|
|
3398
3519
|
this.setReactStateUpdaters = (updaters) => {
|
|
3399
3520
|
this.reactStateUpdaters = updaters;
|
|
3400
3521
|
};
|
|
@@ -3454,7 +3575,7 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3454
3575
|
this.lineListService
|
|
3455
3576
|
.getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize, attributeFiltersState,
|
|
3456
3577
|
// this.attributeFilters,
|
|
3457
|
-
this.startDate, this.endDate, this.ouMode)
|
|
3578
|
+
this.startDate, this.endDate, this.ouMode, this.filterRootOrgUnit)
|
|
3458
3579
|
.subscribe((response) => {
|
|
3459
3580
|
let entityColumns = [];
|
|
3460
3581
|
let responsePager;
|
|
@@ -3680,7 +3801,7 @@ class LineListTableComponent extends ReactWrapperModule {
|
|
|
3680
3801
|
this.render();
|
|
3681
3802
|
}
|
|
3682
3803
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
3683
|
-
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", buttonFilter: "buttonFilter" }, outputs: { actionSelected: "actionSelected", approvalSelected: "approvalSelected", firstValue: "firstValue" }, 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"] }); }
|
|
3804
|
+
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", buttonFilter: "buttonFilter", filterRootOrgUnit: "filterRootOrgUnit" }, outputs: { actionSelected: "actionSelected", approvalSelected: "approvalSelected", firstValue: "firstValue" }, 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"] }); }
|
|
3684
3805
|
}
|
|
3685
3806
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
|
|
3686
3807
|
type: Component,
|
|
@@ -3719,6 +3840,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
|
|
|
3719
3840
|
type: Output
|
|
3720
3841
|
}], buttonFilter: [{
|
|
3721
3842
|
type: Input
|
|
3843
|
+
}], filterRootOrgUnit: [{
|
|
3844
|
+
type: Input
|
|
3722
3845
|
}] } });
|
|
3723
3846
|
|
|
3724
3847
|
class LineListModule {
|
|
@@ -4988,14 +5111,14 @@ const OrgUnitFormField = (props) => {
|
|
|
4988
5111
|
const [loading, setLoading] = useState(true);
|
|
4989
5112
|
const [searchLoading, setSearchLoading] = useState();
|
|
4990
5113
|
const [searchData, setSearchData] = useState();
|
|
4991
|
-
const [selectedOrgUnit, setSelectedOrgUnit] =
|
|
4992
|
-
const [expanded, setExpanded] =
|
|
5114
|
+
const [selectedOrgUnit, setSelectedOrgUnit] = useState();
|
|
5115
|
+
const [expanded, setExpanded] = useState(initiallyExpanded);
|
|
4993
5116
|
const [showOrgUnitTree, setShowOrgUnitTree] = useState(!selected);
|
|
4994
5117
|
useEffect(() => {
|
|
4995
5118
|
setLoading(true);
|
|
4996
5119
|
if (selected) {
|
|
4997
5120
|
d2.httpInstance
|
|
4998
|
-
.get(`organisationUnits/${selected}.json?fields=id,
|
|
5121
|
+
.get(`organisationUnits/${selected}.json?fields=id,displayName,path,code,ancestors[id,displayName]`)
|
|
4999
5122
|
.then((response) => {
|
|
5000
5123
|
if (response.data) {
|
|
5001
5124
|
setSelectedOrgUnit(response.data);
|
|
@@ -5005,9 +5128,10 @@ const OrgUnitFormField = (props) => {
|
|
|
5005
5128
|
});
|
|
5006
5129
|
}
|
|
5007
5130
|
else {
|
|
5131
|
+
setShowOrgUnitTree(true);
|
|
5008
5132
|
setLoading(false);
|
|
5009
5133
|
}
|
|
5010
|
-
}, [
|
|
5134
|
+
}, []);
|
|
5011
5135
|
const highlighted = useMemo(() => {
|
|
5012
5136
|
if (selectedOrgUnit) {
|
|
5013
5137
|
return [selectedOrgUnit['path']];
|
|
@@ -5020,7 +5144,7 @@ const OrgUnitFormField = (props) => {
|
|
|
5020
5144
|
...(selectedOrgUnit['ancestors'] || []),
|
|
5021
5145
|
selectedOrgUnit,
|
|
5022
5146
|
]
|
|
5023
|
-
.map((orgUnit) => orgUnit['
|
|
5147
|
+
.map((orgUnit) => orgUnit['displayName'])
|
|
5024
5148
|
.join(' / ');
|
|
5025
5149
|
}
|
|
5026
5150
|
return '';
|
|
@@ -5068,11 +5192,13 @@ const OrgUnitFormField = (props) => {
|
|
|
5068
5192
|
}
|
|
5069
5193
|
return (ready && (React__default.createElement(OrganisationUnitTree, { key: `${key}-search`, roots: searchData?.map((orgUnit) => orgUnit.id) || [], singleSelection: true, expanded: expanded, handleExpand: handleExpand, handleCollapse: handleCollapse, selected: highlighted, onChange: (event) => {
|
|
5070
5194
|
setSelectedOrgUnit(event);
|
|
5195
|
+
setShowOrgUnitTree(false);
|
|
5071
5196
|
onSelectOrgUnit(event.id);
|
|
5072
5197
|
} })));
|
|
5073
5198
|
}
|
|
5074
5199
|
return (React__default.createElement(OrganisationUnitTree, { key: key, roots: rootOrgUnits?.map((orgUnit) => orgUnit.id) || [], singleSelection: true, expanded: expanded, handleExpand: handleExpand, handleCollapse: handleCollapse, selected: highlighted, onChange: (event) => {
|
|
5075
5200
|
setSelectedOrgUnit(event);
|
|
5201
|
+
setShowOrgUnitTree(false);
|
|
5076
5202
|
onSelectOrgUnit(event.id);
|
|
5077
5203
|
} }));
|
|
5078
5204
|
};
|
|
@@ -5084,10 +5210,11 @@ const OrgUnitFormField = (props) => {
|
|
|
5084
5210
|
label && (React__default.createElement("div", { className: classes.orgUnitFieldLabel },
|
|
5085
5211
|
React__default.createElement("span", null, label),
|
|
5086
5212
|
required ? (React__default.createElement("span", { className: classes.orgUnitFieldRequiredLabel }, "*")) : (React__default.createElement(React__default.Fragment, null)))),
|
|
5087
|
-
|
|
5088
|
-
React__default.createElement(
|
|
5089
|
-
|
|
5090
|
-
|
|
5213
|
+
!showOrgUnitTree ? (selectedOrgUnit ? (React__default.createElement(React__default.Fragment, null,
|
|
5214
|
+
React__default.createElement(Tooltip, { content: selectedOrgUnitLabel },
|
|
5215
|
+
React__default.createElement(Chip, { onRemove: () => {
|
|
5216
|
+
setShowOrgUnitTree(true);
|
|
5217
|
+
} }, selectedOrgUnit.displayName)))) : (React__default.createElement("div", { className: classes.orgUnitTreeLoader },
|
|
5091
5218
|
React__default.createElement(CircularLoader$1, { small: true })))) : (React__default.createElement("div", { className: classes.container },
|
|
5092
5219
|
React__default.createElement("div", { className: classes.debounceFieldContainer },
|
|
5093
5220
|
React__default.createElement(InputField$1, { placeholder: "Search", value: searchText, disabled: disabled, onChange: handleFilterChange })),
|
|
@@ -5128,7 +5255,7 @@ const FileUploadField = (props) => {
|
|
|
5128
5255
|
}
|
|
5129
5256
|
}
|
|
5130
5257
|
};
|
|
5131
|
-
return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: label, name: id,
|
|
5258
|
+
return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: label, name: id, required: required, validationText: validationText, onChange: (event) => {
|
|
5132
5259
|
const fileItem = (event?.files || [])[0];
|
|
5133
5260
|
setFile(fileItem);
|
|
5134
5261
|
if (performUpload) {
|
|
@@ -5269,10 +5396,16 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
5269
5396
|
} }));
|
|
5270
5397
|
case 'org-unit':
|
|
5271
5398
|
return (React__default.createElement(OrgUnitFormField, { label: this.label(), key: this.field().id, required: this.field().required, onSelectOrgUnit: (selectedOrgUnit) => {
|
|
5272
|
-
setValue(selectedOrgUnit);
|
|
5273
5399
|
this.ngZone.run(() => {
|
|
5274
|
-
this.
|
|
5400
|
+
(this.form().get(this.field().id) ||
|
|
5401
|
+
this.form().get(this.field().key))?.setValue(selectedOrgUnit);
|
|
5402
|
+
this.update.emit({
|
|
5403
|
+
form: this.form(),
|
|
5404
|
+
value: selectedOrgUnit,
|
|
5405
|
+
});
|
|
5275
5406
|
});
|
|
5407
|
+
setValue(selectedOrgUnit);
|
|
5408
|
+
setTouched(true);
|
|
5276
5409
|
}, selected: value }));
|
|
5277
5410
|
case 'transfer':
|
|
5278
5411
|
return (React__default.createElement(Transfer, { filterable: true, filterPlaceholder: "Search", selected: selected, leftHeader: React__default.createElement("div", { style: {
|
|
@@ -6364,5 +6497,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
|
|
|
6364
6497
|
* Generated bundle index. Do not edit.
|
|
6365
6498
|
*/
|
|
6366
6499
|
|
|
6367
|
-
export { Boolean$1 as Boolean, ButtonComponent, ButtonModule, CheckBox, D2FormModule, DataTableUIComponent, DataTableUIModule, DateField, DateRangeValue, Dropdown, FieldConfig, FieldControlTypeUtil, FieldDropdown, FieldType, FieldUtil, FormComponent, FormConfig, FormField, FormFieldComponent, FormFieldGroup, FormFieldTypeUtil, FormMetaData, FormMetadataSection, FormUtil, FormValue, FormValueUtil, HeaderBarComponent, HeaderBarModule, LineListModule, LineListTableComponent, MetadataRule, MetadataRuleAction, OrganisationUnitSelectionConfig, OrganisationUnitSelectorComponent, OrganisationUnitSelectorModalComponent, OrganisationUnitSelectorModule, PeriodSelectorComponent, PeriodSelectorModalComponent, PeriodSelectorModule, ReactWrapperModule, RepeatableFormComponent, SectionFormComponent, SelectionFiltersComponent, SelectionFiltersUiModule, TrackerFormComponent, TrackerFormModule, TranslationUtil };
|
|
6500
|
+
export { Boolean$1 as Boolean, BreadcrumbComponent, BreadcrumbModule, ButtonComponent, ButtonModule, CheckBox, D2FormModule, DataTableUIComponent, DataTableUIModule, DateField, DateRangeValue, Dropdown, FieldConfig, FieldControlTypeUtil, FieldDropdown, FieldType, FieldUtil, FormComponent, FormConfig, FormField, FormFieldComponent, FormFieldGroup, FormFieldTypeUtil, FormMetaData, FormMetadataSection, FormUtil, FormValue, FormValueUtil, HeaderBarComponent, HeaderBarModule, LineListModule, LineListTableComponent, MetadataRule, MetadataRuleAction, OrganisationUnitSelectionConfig, OrganisationUnitSelectorComponent, OrganisationUnitSelectorModalComponent, OrganisationUnitSelectorModule, PeriodSelectorComponent, PeriodSelectorModalComponent, PeriodSelectorModule, ReactWrapperModule, RepeatableFormComponent, SectionFormComponent, SelectionFiltersComponent, SelectionFiltersUiModule, TrackerFormComponent, TrackerFormModule, TranslationUtil };
|
|
6368
6501
|
//# sourceMappingURL=iapps-ng-dhis2-ui.mjs.map
|