@iapps/ng-dhis2-ui 1.1.27 → 1.1.29

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.
@@ -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: crypto.randomUUID() || option.id, value: crypto.randomUUID() || option.id, label: option.name, dataTest: `${dataTest}-period-type-option-${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}` }))))),
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: crypto.randomUUID() || 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: 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;
@@ -3141,11 +3141,9 @@ class LineListService {
3141
3141
  const filterParams = buildFilters(filters);
3142
3142
  const dateFilter = startDate && endDate ? `&programStartDate=${startDate}&programEndDate=${endDate}` : '';
3143
3143
  const ouModeIdentifier = ouMode ? `&ouMode=${ouMode}` : ``;
3144
- return this.httpClient.get(`trackedEntityInstances.json?program=${programId}&ou=${orgUnit}${ouModeIdentifier}&page=${page}&pageSize=${pageSize}&fields=trackedEntityInstance,attributes[*,displayInList],enrollments[*]&totalPages=true&${filterParams}${dateFilter}`).pipe(map$1((response) => {
3145
- response.trackedEntityInstances.forEach((tei) => {
3146
- // Filter attributes to only include those with displayInList=true
3147
- tei.attributes = tei.attributes.filter((attr) => attr.displayInList);
3148
- });
3144
+ return this.httpClient.get(`trackedEntityInstances.json?program=${programId}&ou=${orgUnit}${ouModeIdentifier}&page=${page}&pageSize=${pageSize}&fields=trackedEntityInstance,attributes[*,displayInList],enrollments[*]&totalPages=true&${filterParams}${dateFilter}&order=created:desc`).pipe(map$1((response) => {
3145
+ //TODO: use the api to to order by desc
3146
+ // response.trackedEntityInstances.reverse();
3149
3147
  return response;
3150
3148
  }));
3151
3149
  }
@@ -3313,6 +3311,8 @@ class LineListTableComponent extends ReactWrapperModule {
3313
3311
  this.actionSelected = new EventEmitter();
3314
3312
  this.reactStateUpdaters = null;
3315
3313
  this.approvalSelected = new EventEmitter();
3314
+ this.isButtonLoading = false;
3315
+ this.buttonLabel = '';
3316
3316
  this.setReactStateUpdaters = (updaters) => {
3317
3317
  this.reactStateUpdaters = updaters;
3318
3318
  };
@@ -3334,6 +3334,7 @@ class LineListTableComponent extends ReactWrapperModule {
3334
3334
  const [startDateState, setStartDateState] = useState(this.startDate);
3335
3335
  const [endDateState, setEndDateState] = useState(this.endDate);
3336
3336
  const [loading, setLoading] = useState(false);
3337
+ const [isButtonLoading, setIsButtonLoading] = useState(this.isButtonLoading);
3337
3338
  // Store updaters in refs for Angular to access
3338
3339
  const updateRefs = useRef({
3339
3340
  setProgramIdState,
@@ -3342,6 +3343,7 @@ class LineListTableComponent extends ReactWrapperModule {
3342
3343
  setAttributeFiltersState,
3343
3344
  setStartDateState,
3344
3345
  setEndDateState,
3346
+ setIsButtonLoading,
3345
3347
  });
3346
3348
  useEffect(() => {
3347
3349
  this.setReactStateUpdaters?.(updateRefs.current);
@@ -3415,8 +3417,9 @@ class LineListTableComponent extends ReactWrapperModule {
3415
3417
  }));
3416
3418
  };
3417
3419
  const handleApprovalClick = () => {
3420
+ setIsButtonLoading(true);
3418
3421
  this.lineListService
3419
- .getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, pager.pageSize, this.attributeFilters, this.startDate, this.endDate, this.ouMode)
3422
+ .getLineListData(this.programId, this.orgUnit, this.programStageId, pager.page, 1000, this.attributeFilters, this.startDate, this.endDate, this.ouMode)
3420
3423
  .subscribe((response) => {
3421
3424
  if ('trackedEntityInstances' in response.data) {
3422
3425
  const trackedEntityInstances = response.data.trackedEntityInstances;
@@ -3452,8 +3455,7 @@ class LineListTableComponent extends ReactWrapperModule {
3452
3455
  gap: 8,
3453
3456
  padding: 8,
3454
3457
  marginBottom: 16,
3455
- } },
3456
- React__default.createElement(Button$1, { className: "bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600", onClick: handleApprovalClick, primary: true }, "Approval"))),
3458
+ } }, isButtonLoading ? (React__default.createElement(CircularLoader$1, { small: true })) : (React__default.createElement(Button$1, { className: "bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600", onClick: handleApprovalClick, primary: true }, this.buttonLabel)))),
3457
3459
  loading ? (React__default.createElement("div", { style: {
3458
3460
  display: 'flex',
3459
3461
  alignItems: 'center',
@@ -3501,6 +3503,9 @@ class LineListTableComponent extends ReactWrapperModule {
3501
3503
  if (changes['endDate']) {
3502
3504
  this.reactStateUpdaters.setEndDateState(this.endDate);
3503
3505
  }
3506
+ if (changes['isButtonLoading']) {
3507
+ this.reactStateUpdaters.setIsButtonLoading(this.isButtonLoading);
3508
+ }
3504
3509
  }
3505
3510
  }
3506
3511
  async ngAfterViewInit() {
@@ -3511,7 +3516,7 @@ class LineListTableComponent extends ReactWrapperModule {
3511
3516
  this.render();
3512
3517
  }
3513
3518
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3514
- 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", showApprovalButton: "showApprovalButton" }, 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"] }); }
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", showApprovalButton: "showApprovalButton", 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"] }); }
3515
3520
  }
3516
3521
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: LineListTableComponent, decorators: [{
3517
3522
  type: Component,
@@ -3540,6 +3545,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
3540
3545
  type: Output
3541
3546
  }], approvalSelected: [{
3542
3547
  type: Output
3548
+ }], isButtonLoading: [{
3549
+ type: Input
3550
+ }], buttonLabel: [{
3551
+ type: Input
3543
3552
  }] } });
3544
3553
 
3545
3554
  class LineListModule {
@@ -4667,7 +4676,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4667
4676
  if (!(changes['field'] || {})?.firstChange) {
4668
4677
  this.InputField = this.#getInputField();
4669
4678
  this.component = this.#getInputField();
4670
- // this.render();
4679
+ this.render();
4671
4680
  }
4672
4681
  }
4673
4682
  #getInputField() {
@@ -4808,7 +4817,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4808
4817
  });
4809
4818
  setValue(event.selected);
4810
4819
  setTouched(true);
4811
- } }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: crypto.randomUUID() || option.key, label: option.label, value: option.value })))));
4820
+ } }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: option.key, label: option.label, value: option.value })))));
4812
4821
  case 'multi-dropdown':
4813
4822
  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) => {
4814
4823
  const selectedValue = (event.selected || []).join(',');
@@ -4822,7 +4831,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
4822
4831
  });
4823
4832
  setValue(selectedValue);
4824
4833
  setTouched(true);
4825
- }, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: crypto.randomUUID() || option.key, label: option.label, value: option.value })))));
4834
+ }, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: option.key, label: option.label, value: option.value })))));
4826
4835
  case 'file':
4827
4836
  return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: this.label(), name: this.field().id, files: this.uploadedFiles, onChange: (event) => {
4828
4837
  this.uploadedFiles.push((event?.files || [])[0]);
@@ -5689,12 +5698,12 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5689
5698
  display: 'grid',
5690
5699
  gridTemplateColumns: 'repeat(4, 1fr)',
5691
5700
  gap: '16px',
5692
- } }, 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) })))))),
5701
+ } }, 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: 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) })))))),
5693
5702
  React__default.createElement("div", { style: {
5694
5703
  display: 'grid',
5695
5704
  gridTemplateColumns: 'repeat(4, 1fr)',
5696
5705
  gap: '16px',
5697
- } }, 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) })))))),
5706
+ } }, 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: 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) })))))),
5698
5707
  React__default.createElement("div", { style: { textAlign: 'right', marginTop: '16px' } },
5699
5708
  React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))));
5700
5709
  };