@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.
@@ -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, Injectable, inject, NgZone, input, model, signal, computed, ViewChildren } from '@angular/core';
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$1 = `
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
- // Helper function to convert camelCased properties to hyphenated CSS properties
1570
- const convertStylesToCSS$2 = (className, styles) => {
1571
- let cssString = `.${className} {`;
1572
+ const convertStylesToCSS$2 = (className, styles, parentSelector = '') => {
1573
+ let cssString = '';
1574
+ let mainBlock = parentSelector ? `${parentSelector} {` : `.${className} {`;
1572
1575
  for (const key in styles) {
1573
- if (typeof styles[key] === 'object' && key.startsWith('@media')) {
1574
- const mediaStyles = convertStylesToCSS$2(className, styles[key]);
1575
- cssString += `${key} { ${mediaStyles} }`;
1576
- }
1577
- else if (key.startsWith('&:')) {
1578
- const pseudoClass = key.replace('&', '');
1579
- cssString += `${pseudoClass} { ${convertStylesToCSS$2('', styles[key])} }`;
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
- cssString += `${cssKey}: ${styles[key]}; `;
1595
+ mainBlock += `${cssKey}: ${value}; `;
1584
1596
  }
1585
1597
  }
1586
- cssString += '}';
1587
- return cssString;
1598
+ mainBlock += '}';
1599
+ return mainBlock + ' ' + cssString;
1588
1600
  };
1589
- // Custom hook for dynamic styles with generics
1601
+ // Custom hook for dynamic styles
1590
1602
  const useDynamicStyles$2 = (stylesObj) => {
1591
1603
  const [classNames, setClassNames] = useState({});
1592
1604
  useEffect(() => {
1593
- const convertedStyles = Object.keys(stylesObj).map((key) => {
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
- return {
1599
- key,
1600
- className,
1601
- styleElement,
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
- convertedStyles.forEach((convertedStyle) => {
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$1)));
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$1)));
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$1)));
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
- //TODO: use the api to to order by desc
3202
- // response.trackedEntityInstances.reverse();
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) => [ou.id, ou.name]));
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 { columns: entityColumns, data: attributesData, filteredEntityColumns: filteredEntityColumns };
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] = React__default.useState();
4992
- const [expanded, setExpanded] = React__default.useState(initiallyExpanded);
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,name,path,code,ancestors[id,name]`)
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
- }, [selected]);
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['name'])
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
- selected && !showOrgUnitTree ? (selectedOrgUnit ? (React__default.createElement(Tooltip, { content: selectedOrgUnitLabel },
5088
- React__default.createElement(Chip, { onRemove: () => {
5089
- setShowOrgUnitTree(true);
5090
- } }, selectedOrgUnit.name))) : (React__default.createElement("div", { className: classes.orgUnitTreeLoader },
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, valid: valid, required: required, validationText: validationText, onChange: (event) => {
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.update.emit({ form: this.form(), value });
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