@iapps/ng-dhis2-ui 1.1.6 → 1.1.8
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 +238 -58
- package/fesm2022/iapps-ng-dhis2-ui.mjs.map +1 -1
- package/lib/modules/form/components/base-form-field.component.d.ts +1 -1
- package/lib/modules/form/interfaces/field-control-type.interface.d.ts +1 -1
- package/lib/modules/form/interfaces/field-type.interface.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/selection-filters-ui/containers/selection-filters-ui/selection-filters-ui.component.d.ts +22 -2
- package/lib/modules/selection-filters-ui/models/selection-filters-ui.models.d.ts +10 -0
- package/lib/modules/selection-filters-ui/selection-filters-ui.module.d.ts +2 -1
- package/package.json +1 -1
|
@@ -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, 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, 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';
|
|
@@ -2661,7 +2661,7 @@ const OrgUnitDimension = ({ roots, selected, onSelect, hideGroupSelect, hideLeve
|
|
|
2661
2661
|
React__default.createElement("div", { className: cx('orgUnitTreeWrapper', {
|
|
2662
2662
|
disabled: selectedItems.some((item) => DYNAMIC_ORG_UNITS.includes(item.id)),
|
|
2663
2663
|
}) },
|
|
2664
|
-
React__default.createElement(OrganisationUnitTree, { roots: roots, initiallyExpanded: [
|
|
2664
|
+
React__default.createElement(OrganisationUnitTree, { roots: roots, singleSelection: allowSingleSelection, initiallyExpanded: [
|
|
2665
2665
|
...(roots.length === 1 ? [`/${roots[0]}`] : []),
|
|
2666
2666
|
...selectedItems
|
|
2667
2667
|
.filter((item) => !DYNAMIC_ORG_UNITS.includes(item.id) &&
|
|
@@ -3778,6 +3778,7 @@ class DateRangeValue {
|
|
|
3778
3778
|
var FieldType;
|
|
3779
3779
|
(function (FieldType) {
|
|
3780
3780
|
FieldType["TEXT"] = "TEXT";
|
|
3781
|
+
FieldType["MULTI_TEXT"] = "MULTI_TEXT";
|
|
3781
3782
|
FieldType["TRUE_ONLY"] = "TRUE_ONLY";
|
|
3782
3783
|
FieldType["LONG_TEXT"] = "LONG_TEXT";
|
|
3783
3784
|
FieldType["BOOLEAN"] = "BOOLEAN";
|
|
@@ -3937,11 +3938,16 @@ class FieldUtil {
|
|
|
3937
3938
|
class FieldControlTypeUtil {
|
|
3938
3939
|
static getFieldControlType(valueType, hasOptions) {
|
|
3939
3940
|
if (hasOptions) {
|
|
3941
|
+
if (valueType === FieldType.MULTI_TEXT) {
|
|
3942
|
+
return 'multi-dropdown';
|
|
3943
|
+
}
|
|
3940
3944
|
return 'dropdown';
|
|
3941
3945
|
}
|
|
3942
3946
|
switch (valueType) {
|
|
3943
3947
|
case FieldType.TEXT:
|
|
3944
3948
|
return 'textbox';
|
|
3949
|
+
case FieldType.MULTI_TEXT:
|
|
3950
|
+
return 'multi-dropdown';
|
|
3945
3951
|
case FieldType.BOOLEAN:
|
|
3946
3952
|
return 'dropdown';
|
|
3947
3953
|
case FieldType.LONG_TEXT:
|
|
@@ -4169,7 +4175,9 @@ class FormFieldGroup {
|
|
|
4169
4175
|
type: FieldUtil.getFieldType(fieldMetaData['valueType']),
|
|
4170
4176
|
dependentField,
|
|
4171
4177
|
options,
|
|
4172
|
-
disabled: field.disabled ??
|
|
4178
|
+
disabled: field.disabled ??
|
|
4179
|
+
fieldMetaData['disabled'] ??
|
|
4180
|
+
fieldMetaData['generated'],
|
|
4173
4181
|
min: field.min ?? fieldMetaData['min'],
|
|
4174
4182
|
max: field.max ?? fieldMetaData['max'],
|
|
4175
4183
|
order: field.order ??
|
|
@@ -4331,7 +4339,8 @@ class FormMetaData {
|
|
|
4331
4339
|
#getSectionFromPrograms(programs) {
|
|
4332
4340
|
const sections = flatten(programs.map((program) => {
|
|
4333
4341
|
return [
|
|
4334
|
-
this.#
|
|
4342
|
+
this.#getRegisteringUnitSection(program),
|
|
4343
|
+
this.#getReportingDateSection(program),
|
|
4335
4344
|
new FormMetadataSection({
|
|
4336
4345
|
section: {
|
|
4337
4346
|
id: 'registration',
|
|
@@ -4406,25 +4415,44 @@ class FormMetaData {
|
|
|
4406
4415
|
}
|
|
4407
4416
|
return sections;
|
|
4408
4417
|
}
|
|
4409
|
-
#
|
|
4418
|
+
#getRegisteringUnitSection(program) {
|
|
4410
4419
|
return new FormMetadataSection({
|
|
4411
4420
|
section: {
|
|
4412
|
-
id: '
|
|
4413
|
-
name: '
|
|
4421
|
+
id: 'registering_unit_details',
|
|
4422
|
+
name: 'Registering unit details',
|
|
4414
4423
|
fieldGroups: [
|
|
4415
4424
|
{
|
|
4416
|
-
id: '
|
|
4425
|
+
id: 'registering_unit_details',
|
|
4417
4426
|
sortOrder: 1,
|
|
4418
|
-
isFormHorizontal:
|
|
4427
|
+
isFormHorizontal: false,
|
|
4419
4428
|
fields: [
|
|
4420
4429
|
new FormField({
|
|
4421
4430
|
id: 'orgUnit',
|
|
4422
4431
|
key: 'orgUnit',
|
|
4423
|
-
label: '
|
|
4432
|
+
label: program.orgUnitLabel || 'Registering unit',
|
|
4424
4433
|
code: 'orgUnit',
|
|
4425
4434
|
required: true,
|
|
4426
4435
|
controlType: 'org-unit',
|
|
4427
4436
|
}),
|
|
4437
|
+
],
|
|
4438
|
+
},
|
|
4439
|
+
],
|
|
4440
|
+
},
|
|
4441
|
+
program,
|
|
4442
|
+
locale: this.params.locale,
|
|
4443
|
+
}).toJson();
|
|
4444
|
+
}
|
|
4445
|
+
#getReportingDateSection(program) {
|
|
4446
|
+
return new FormMetadataSection({
|
|
4447
|
+
section: {
|
|
4448
|
+
id: 'reporting_dates',
|
|
4449
|
+
name: 'Reporting dates',
|
|
4450
|
+
fieldGroups: [
|
|
4451
|
+
{
|
|
4452
|
+
id: 'reporting_dates',
|
|
4453
|
+
sortOrder: 1,
|
|
4454
|
+
isFormHorizontal: false,
|
|
4455
|
+
fields: [
|
|
4428
4456
|
new DateField({
|
|
4429
4457
|
id: 'enrollmentDate',
|
|
4430
4458
|
label: program.enrollmentDateLabel || 'Enrollment date',
|
|
@@ -4512,8 +4540,8 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
4512
4540
|
this.value = model();
|
|
4513
4541
|
this.value$ = toObservable(this.value);
|
|
4514
4542
|
this.FieldOrgUnitSelector = (props) => {
|
|
4515
|
-
const { onSelectOrgUnit,
|
|
4516
|
-
const [selected, setSelected] = useState(
|
|
4543
|
+
const { onSelectOrgUnit, selectedOrgUnits } = props;
|
|
4544
|
+
const [selected, setSelected] = useState(selectedOrgUnits);
|
|
4517
4545
|
const [rootOrgUnits, setRootOrgUnits] = useState();
|
|
4518
4546
|
const [config, setConfig] = useState();
|
|
4519
4547
|
useEffect(() => {
|
|
@@ -4526,19 +4554,14 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
4526
4554
|
});
|
|
4527
4555
|
}, []);
|
|
4528
4556
|
return config ? (React__default.createElement(Provider, { config: config, plugin: false, parentAlertsAdd: undefined, showAlertsInPlugin: false }, React__default.createElement(Modal$1, { position: "middle", large: true },
|
|
4529
|
-
React__default.createElement(ModalTitle$1, null,
|
|
4557
|
+
React__default.createElement(ModalTitle$1, null,
|
|
4558
|
+
"Select ",
|
|
4559
|
+
this.field().label),
|
|
4530
4560
|
React__default.createElement(ModalContent$1, null,
|
|
4531
|
-
React__default.createElement(OrgUnitDimension, { selected: selected, hideGroupSelect: this.orgUnitSelectionConfig.hideGroupSelect, hideLevelSelect: this.orgUnitSelectionConfig.hideLevelSelect, hideUserOrgUnits: this.orgUnitSelectionConfig.hideUserOrgUnits, onSelect: (selectionEvent) => {
|
|
4561
|
+
React__default.createElement(OrgUnitDimension, { selected: selected, allowSingleSelection: true, hideGroupSelect: this.orgUnitSelectionConfig.hideGroupSelect, hideLevelSelect: this.orgUnitSelectionConfig.hideLevelSelect, hideUserOrgUnits: this.orgUnitSelectionConfig.hideUserOrgUnits, onSelect: (selectionEvent) => {
|
|
4532
4562
|
setSelected(selectionEvent.items);
|
|
4533
|
-
|
|
4534
|
-
|
|
4535
|
-
React__default.createElement(ButtonStrip$1, { end: true },
|
|
4536
|
-
React__default.createElement(Button$1, { onClick: () => {
|
|
4537
|
-
onCancelOrgUnit();
|
|
4538
|
-
} }, "Cancel"),
|
|
4539
|
-
React__default.createElement(Button$1, { primary: true, disabled: selected.length === 0, onClick: () => {
|
|
4540
|
-
onSelectOrgUnit(selected);
|
|
4541
|
-
} }, "Confirm")))))) : (React__default.createElement(CircularLoader$1, { small: true }));
|
|
4563
|
+
onSelectOrgUnit(selectionEvent.items);
|
|
4564
|
+
}, orgUnitGroupPromise: this.getOrgUnitGroups(), orgUnitLevelPromise: this.getOrgUnitLevels(), roots: rootOrgUnits }))))) : (React__default.createElement(CircularLoader$1, { small: true }));
|
|
4542
4565
|
};
|
|
4543
4566
|
this.showOrgUnitTree = signal(false);
|
|
4544
4567
|
this.orgUnitSelectionConfig = {
|
|
@@ -4583,6 +4606,12 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
4583
4606
|
const [touched, setTouched] = useState(false);
|
|
4584
4607
|
const [showOrgUnit, setShowOrgUnit] = useState(false);
|
|
4585
4608
|
const onChange = (payload) => setSelected(payload.selected);
|
|
4609
|
+
const arrayValue = useMemo(() => {
|
|
4610
|
+
if (value && value.length > 0) {
|
|
4611
|
+
return value.split(',');
|
|
4612
|
+
}
|
|
4613
|
+
return [];
|
|
4614
|
+
}, [value]);
|
|
4586
4615
|
const hasError = useMemo(() => {
|
|
4587
4616
|
return (touched &&
|
|
4588
4617
|
(this.form().get(this.field().id) ||
|
|
@@ -4647,10 +4676,7 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
4647
4676
|
});
|
|
4648
4677
|
setTouched(true);
|
|
4649
4678
|
} }),
|
|
4650
|
-
showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, {
|
|
4651
|
-
setShowOrgUnit(false);
|
|
4652
|
-
setTouched(true);
|
|
4653
|
-
}, onSelectOrgUnit: (selectedOrgUnits) => {
|
|
4679
|
+
showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { selectedOrgUnits: [], onSelectOrgUnit: (selectedOrgUnits) => {
|
|
4654
4680
|
if ((selectedOrgUnits || [])[0]) {
|
|
4655
4681
|
const selectedOrgUnit = selectedOrgUnits[0];
|
|
4656
4682
|
setDisplayValue(selectedOrgUnit.name);
|
|
@@ -4710,6 +4736,20 @@ class BaseFormFieldComponent extends ReactWrapperModule {
|
|
|
4710
4736
|
setValue(event.selected);
|
|
4711
4737
|
setTouched(true);
|
|
4712
4738
|
} }, (this.field().options || []).map((option) => (React__default.createElement(SingleSelectOption, { key: option.key, label: option.label, value: option.value })))));
|
|
4739
|
+
case 'multi-dropdown':
|
|
4740
|
+
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) => {
|
|
4741
|
+
const selectedValue = (event.selected || []).join(',');
|
|
4742
|
+
this.ngZone.run(() => {
|
|
4743
|
+
(this.form().get(this.field().id) ||
|
|
4744
|
+
this.form().get(this.field().key))?.setValue(selectedValue);
|
|
4745
|
+
this.update.emit({
|
|
4746
|
+
form: this.form(),
|
|
4747
|
+
value: selectedValue,
|
|
4748
|
+
});
|
|
4749
|
+
});
|
|
4750
|
+
setValue(selectedValue);
|
|
4751
|
+
setTouched(true);
|
|
4752
|
+
}, selected: arrayValue }, (this.field().options || []).map((option) => (React__default.createElement(MultiSelectOption, { key: option.key, label: option.label, value: option.value })))));
|
|
4713
4753
|
case 'file':
|
|
4714
4754
|
return (React__default.createElement(FileInputField, { accept: "*", buttonLabel: "Upload a file", label: this.label(), name: this.field().id, files: this.uploadedFiles, onChange: (event) => {
|
|
4715
4755
|
this.uploadedFiles.push((event?.files || [])[0]);
|
|
@@ -5363,105 +5403,163 @@ class SelectionFiltersComponent extends ReactWrapperModule {
|
|
|
5363
5403
|
this.attributeFilters = [];
|
|
5364
5404
|
this.dataElementFilters = [];
|
|
5365
5405
|
this.actionSelected = new EventEmitter();
|
|
5406
|
+
this.httpClient = inject(NgxDhis2HttpClientService);
|
|
5407
|
+
this.ngZone = inject(NgZone);
|
|
5408
|
+
this.FieldOrgUnitSelector = (props) => {
|
|
5409
|
+
const { onSelectOrgUnit, onCancelOrgUnit } = props;
|
|
5410
|
+
const [selected, setSelected] = useState([]);
|
|
5411
|
+
const [rootOrgUnits, setRootOrgUnits] = useState();
|
|
5412
|
+
const [config, setConfig] = useState();
|
|
5413
|
+
useEffect(() => {
|
|
5414
|
+
zip(this.getAppConfig(), this.getRootOrgUnits()).subscribe({
|
|
5415
|
+
next: ([appConfig, rootOrgUnits]) => {
|
|
5416
|
+
setConfig(appConfig);
|
|
5417
|
+
setRootOrgUnits(rootOrgUnits);
|
|
5418
|
+
},
|
|
5419
|
+
error: (error) => console.error(error),
|
|
5420
|
+
});
|
|
5421
|
+
}, []);
|
|
5422
|
+
return config ? (React__default.createElement(Provider, { config: config, plugin: false, parentAlertsAdd: undefined, showAlertsInPlugin: false }, React__default.createElement(Modal$1, { position: "middle", large: true },
|
|
5423
|
+
React__default.createElement(ModalTitle$1, null, "Organisation unit"),
|
|
5424
|
+
React__default.createElement(ModalContent$1, null,
|
|
5425
|
+
React__default.createElement(OrgUnitDimension, { selected: selected, hideGroupSelect: this.orgUnitSelectionConfig.hideGroupSelect, hideLevelSelect: this.orgUnitSelectionConfig.hideLevelSelect, hideUserOrgUnits: this.orgUnitSelectionConfig.hideUserOrgUnits, onSelect: (selectionEvent) => {
|
|
5426
|
+
setSelected(selectionEvent.items);
|
|
5427
|
+
}, orgUnitGroupPromise: this.getOrgUnitGroups(), orgUnitLevelPromise: this.getOrgUnitLevels(), roots: rootOrgUnits })),
|
|
5428
|
+
React__default.createElement(ModalActions$1, null,
|
|
5429
|
+
React__default.createElement(ButtonStrip$1, { end: true },
|
|
5430
|
+
React__default.createElement(Button$1, { onClick: () => {
|
|
5431
|
+
onCancelOrgUnit();
|
|
5432
|
+
} }, "Cancel"),
|
|
5433
|
+
React__default.createElement(Button$1, { primary: true, disabled: selected.length === 0, onClick: () => {
|
|
5434
|
+
onSelectOrgUnit(selected);
|
|
5435
|
+
} }, "Confirm")))))) : (React__default.createElement(CircularLoader$1, { small: true }));
|
|
5436
|
+
};
|
|
5437
|
+
this.showOrgUnitTree = signal(false);
|
|
5438
|
+
this.orgUnitSelectionConfig = {
|
|
5439
|
+
hideGroupSelect: true,
|
|
5440
|
+
hideLevelSelect: true,
|
|
5441
|
+
hideUserOrgUnits: true,
|
|
5442
|
+
allowSingleSelection: true,
|
|
5443
|
+
usageType: 'DATA_ENTRY',
|
|
5444
|
+
};
|
|
5445
|
+
this.selectedOrgUnit = signal(null);
|
|
5446
|
+
this.selectedOrgUnit$ = toObservable(this.selectedOrgUnit);
|
|
5366
5447
|
this.SelectionFiltersUI = () => {
|
|
5367
5448
|
const [filters, setFilters] = useState({
|
|
5368
5449
|
attributeFilters: this.attributeFilters || [],
|
|
5369
5450
|
dataElementFilters: this.dataElementFilters || [],
|
|
5451
|
+
organizationUnitId: '',
|
|
5452
|
+
startDate: this.startDate || '',
|
|
5453
|
+
endDate: this.endDate || '',
|
|
5370
5454
|
});
|
|
5455
|
+
const [displayValue, setDisplayValue] = useState(null);
|
|
5456
|
+
const [selected, setSelected] = useState();
|
|
5457
|
+
const [selectedOrganisationUnit, setSelectedOrganisationUnit] = useState();
|
|
5458
|
+
const [touched, setTouched] = useState(false);
|
|
5459
|
+
const [showOrgUnit, setShowOrgUnit] = useState(false);
|
|
5460
|
+
const [value, setValue] = useState(null);
|
|
5371
5461
|
useEffect(() => {
|
|
5372
5462
|
setFilters({
|
|
5373
5463
|
attributeFilters: this.attributeFilters,
|
|
5374
5464
|
dataElementFilters: this.dataElementFilters,
|
|
5465
|
+
organizationUnitId: '',
|
|
5466
|
+
startDate: this.startDate || '',
|
|
5467
|
+
endDate: this.endDate || '',
|
|
5375
5468
|
});
|
|
5376
|
-
}, [
|
|
5469
|
+
}, [
|
|
5470
|
+
this.attributeFilters,
|
|
5471
|
+
this.dataElementFilters,
|
|
5472
|
+
this.startDate,
|
|
5473
|
+
this.endDate,
|
|
5474
|
+
]);
|
|
5377
5475
|
const handleAttributeChange = (index, selectedValue) => {
|
|
5378
5476
|
setFilters((prevFilters) => {
|
|
5379
5477
|
const updatedFilters = [...prevFilters.attributeFilters];
|
|
5380
|
-
updatedFilters[index] = {
|
|
5478
|
+
updatedFilters[index] = {
|
|
5479
|
+
...updatedFilters[index],
|
|
5480
|
+
value: selectedValue,
|
|
5481
|
+
};
|
|
5381
5482
|
return { ...prevFilters, attributeFilters: updatedFilters };
|
|
5382
5483
|
});
|
|
5383
5484
|
};
|
|
5384
5485
|
const handleDataElementChange = (index, selectedValue) => {
|
|
5385
5486
|
setFilters((prevFilters) => {
|
|
5386
5487
|
const updatedFilters = [...prevFilters.dataElementFilters];
|
|
5387
|
-
updatedFilters[index] = {
|
|
5488
|
+
updatedFilters[index] = {
|
|
5489
|
+
...updatedFilters[index],
|
|
5490
|
+
value: selectedValue,
|
|
5491
|
+
};
|
|
5388
5492
|
return { ...prevFilters, dataElementFilters: updatedFilters };
|
|
5389
5493
|
});
|
|
5390
5494
|
};
|
|
5391
5495
|
const handleSearch = () => {
|
|
5392
|
-
this.actionSelected.emit(
|
|
5496
|
+
this.actionSelected.emit({
|
|
5497
|
+
...filters,
|
|
5498
|
+
organizationUnit: selectedOrganisationUnit,
|
|
5499
|
+
organizationUnitId: selectedOrganisationUnit,
|
|
5500
|
+
startDate: filters.startDate,
|
|
5501
|
+
endDate: filters.endDate,
|
|
5502
|
+
});
|
|
5393
5503
|
};
|
|
5394
|
-
// Grid Column Span Logic for Attribute Filters
|
|
5395
5504
|
const getAttributeColumnSpan = (index) => {
|
|
5396
5505
|
const totalItems = filters.attributeFilters.length;
|
|
5397
5506
|
if (totalItems <= 4) {
|
|
5398
|
-
// If 1 to 4 items, place them in a single row (span all columns if there's only one item)
|
|
5399
5507
|
if (totalItems === 1) {
|
|
5400
|
-
return 'span 4';
|
|
5508
|
+
return 'span 4';
|
|
5401
5509
|
}
|
|
5402
5510
|
if (totalItems === 2) {
|
|
5403
|
-
return 'span 2';
|
|
5511
|
+
return 'span 2';
|
|
5404
5512
|
}
|
|
5405
5513
|
if (totalItems === 3) {
|
|
5406
|
-
return 'span 1';
|
|
5514
|
+
return 'span 1';
|
|
5407
5515
|
}
|
|
5408
5516
|
if (totalItems === 4) {
|
|
5409
|
-
return 'span 1';
|
|
5517
|
+
return 'span 1';
|
|
5410
5518
|
}
|
|
5411
5519
|
}
|
|
5412
5520
|
else {
|
|
5413
|
-
|
|
5414
|
-
const rowIndex = Math.floor(index / 2); // Calculate row by pairs
|
|
5521
|
+
const rowIndex = Math.floor(index / 2);
|
|
5415
5522
|
if (index % 2 === 0) {
|
|
5416
|
-
// For first item in each row, span 2 columns
|
|
5417
5523
|
return 'span 2';
|
|
5418
5524
|
}
|
|
5419
5525
|
else if (index === totalItems - 1) {
|
|
5420
|
-
// Last item, spans the full row (4 columns)
|
|
5421
5526
|
return 'span 4';
|
|
5422
5527
|
}
|
|
5423
5528
|
else {
|
|
5424
|
-
// For other items, span 2 columns
|
|
5425
5529
|
return 'span 2';
|
|
5426
5530
|
}
|
|
5427
5531
|
}
|
|
5428
|
-
return 'span 1';
|
|
5532
|
+
return 'span 1';
|
|
5429
5533
|
};
|
|
5430
|
-
// Grid Column Span Logic for Data Element Filters
|
|
5431
5534
|
const getDataElementColumnSpan = (index) => {
|
|
5432
5535
|
const totalItems = filters.dataElementFilters.length;
|
|
5433
5536
|
if (totalItems <= 4) {
|
|
5434
|
-
// If 1 to 4 items, place them in a single row (span all columns if there's only one item)
|
|
5435
5537
|
if (totalItems === 1) {
|
|
5436
|
-
return 'span 4';
|
|
5538
|
+
return 'span 4';
|
|
5437
5539
|
}
|
|
5438
5540
|
if (totalItems === 2) {
|
|
5439
|
-
return 'span 2';
|
|
5541
|
+
return 'span 2';
|
|
5440
5542
|
}
|
|
5441
5543
|
if (totalItems === 3) {
|
|
5442
|
-
return 'span 1';
|
|
5544
|
+
return 'span 1';
|
|
5443
5545
|
}
|
|
5444
5546
|
if (totalItems === 4) {
|
|
5445
|
-
return 'span 1';
|
|
5547
|
+
return 'span 1';
|
|
5446
5548
|
}
|
|
5447
5549
|
}
|
|
5448
5550
|
else {
|
|
5449
|
-
|
|
5450
|
-
const rowIndex = Math.floor(index / 2); // Calculate row by pairs
|
|
5551
|
+
const rowIndex = Math.floor(index / 2);
|
|
5451
5552
|
if (index % 2 === 0) {
|
|
5452
|
-
// For first item in each row, span 2 columns
|
|
5453
5553
|
return 'span 2';
|
|
5454
5554
|
}
|
|
5455
5555
|
else if (index === totalItems - 1) {
|
|
5456
|
-
// Last item, spans the full row (4 columns)
|
|
5457
5556
|
return 'span 4';
|
|
5458
5557
|
}
|
|
5459
5558
|
else {
|
|
5460
|
-
// For other items, span 2 columns
|
|
5461
5559
|
return 'span 2';
|
|
5462
5560
|
}
|
|
5463
5561
|
}
|
|
5464
|
-
return 'span 1';
|
|
5562
|
+
return 'span 1';
|
|
5465
5563
|
};
|
|
5466
5564
|
return (React__default.createElement("div", { style: {
|
|
5467
5565
|
fontFamily: 'Arial, sans-serif',
|
|
@@ -5470,6 +5568,45 @@ class SelectionFiltersComponent extends ReactWrapperModule {
|
|
|
5470
5568
|
borderRadius: '8px',
|
|
5471
5569
|
boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',
|
|
5472
5570
|
} },
|
|
5571
|
+
React__default.createElement("div", { style: {
|
|
5572
|
+
display: 'grid',
|
|
5573
|
+
gridTemplateColumns: 'repeat(3, 1fr)',
|
|
5574
|
+
gap: '16px',
|
|
5575
|
+
marginBottom: '16px',
|
|
5576
|
+
} },
|
|
5577
|
+
React__default.createElement(React__default.Fragment, null,
|
|
5578
|
+
React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => {
|
|
5579
|
+
setShowOrgUnit(true);
|
|
5580
|
+
}, onBlur: () => {
|
|
5581
|
+
this.ngZone.run(() => {
|
|
5582
|
+
console.log('THIS IS IT::: ');
|
|
5583
|
+
});
|
|
5584
|
+
setTouched(true);
|
|
5585
|
+
} }),
|
|
5586
|
+
showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { onCancelOrgUnit: () => {
|
|
5587
|
+
setShowOrgUnit(false);
|
|
5588
|
+
setTouched(true);
|
|
5589
|
+
}, onSelectOrgUnit: (selectedOrgUnits) => {
|
|
5590
|
+
if ((selectedOrgUnits || [])[0]) {
|
|
5591
|
+
const selectedOrgUnit = selectedOrgUnits[0];
|
|
5592
|
+
setDisplayValue(selectedOrgUnit.name);
|
|
5593
|
+
setSelected(selectedOrgUnit.id);
|
|
5594
|
+
setSelectedOrganisationUnit(selectedOrgUnit.id);
|
|
5595
|
+
setValue(selectedOrgUnit.id);
|
|
5596
|
+
setShowOrgUnit(false);
|
|
5597
|
+
setTouched(true);
|
|
5598
|
+
// this.ngZone.run(() => {
|
|
5599
|
+
// setDisplayValue(selectedOrgUnit.name);
|
|
5600
|
+
// setSelected(selectedOrgUnit.id)
|
|
5601
|
+
// setSelectedOrganisationUnit(selectedOrgUnit.id)
|
|
5602
|
+
// setValue(selectedOrgUnit.id);
|
|
5603
|
+
// setShowOrgUnit(false);
|
|
5604
|
+
// setTouched(true);
|
|
5605
|
+
// });
|
|
5606
|
+
}
|
|
5607
|
+
} }))),
|
|
5608
|
+
React__default.createElement(InputField$1, { className: "input-field", label: "Start Date", type: "date", value: filters.startDate, onChange: (event) => setFilters({ ...filters, startDate: event.value }) }),
|
|
5609
|
+
React__default.createElement(InputField$1, { className: "input-field", label: "End Date", type: "date", value: filters.endDate, onChange: (event) => setFilters({ ...filters, endDate: event.value }) })),
|
|
5473
5610
|
React__default.createElement("div", { style: {
|
|
5474
5611
|
display: 'grid',
|
|
5475
5612
|
gridTemplateColumns: 'repeat(4, 1fr)',
|
|
@@ -5484,6 +5621,49 @@ class SelectionFiltersComponent extends ReactWrapperModule {
|
|
|
5484
5621
|
React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))));
|
|
5485
5622
|
};
|
|
5486
5623
|
}
|
|
5624
|
+
getAppConfig() {
|
|
5625
|
+
return this.httpClient.systemInfo().pipe(map((response) => {
|
|
5626
|
+
const systemInfo = response;
|
|
5627
|
+
return {
|
|
5628
|
+
baseUrl: (document?.location?.host?.includes('localhost')
|
|
5629
|
+
? `${document.location.protocol}//${document.location.host}`
|
|
5630
|
+
: systemInfo['contextPath']),
|
|
5631
|
+
apiVersion: Number(((systemInfo['version'] || '')?.split('.') || [])[1]),
|
|
5632
|
+
};
|
|
5633
|
+
}));
|
|
5634
|
+
}
|
|
5635
|
+
getRootOrgUnits() {
|
|
5636
|
+
const orgUnitAttribute = this.getOrgUnitAttributeByUsage(this.orgUnitSelectionConfig.usageType);
|
|
5637
|
+
return this.httpClient
|
|
5638
|
+
.me()
|
|
5639
|
+
.pipe(map((user) => (user ? user[orgUnitAttribute] : []).map((orgUnit) => orgUnit.id)));
|
|
5640
|
+
}
|
|
5641
|
+
getOrgUnitLevels() {
|
|
5642
|
+
return firstValueFrom(this.httpClient
|
|
5643
|
+
.get('organisationUnitLevels.json?fields=id,level,displayName,name&paging=false')
|
|
5644
|
+
.pipe(map((res) => res?.['organisationUnitLevels'])));
|
|
5645
|
+
}
|
|
5646
|
+
onSelectOrgUnit(selectedOrgUnits) {
|
|
5647
|
+
this.showOrgUnitTree.set(false);
|
|
5648
|
+
if ((selectedOrgUnits || [])[0]) {
|
|
5649
|
+
this.selectedOrgUnit.set(selectedOrgUnits[0]);
|
|
5650
|
+
}
|
|
5651
|
+
}
|
|
5652
|
+
getOrgUnitGroups() {
|
|
5653
|
+
return firstValueFrom(this.httpClient
|
|
5654
|
+
.get('organisationUnitGroups.json?fields=id,displayName,name&paging=false')
|
|
5655
|
+
.pipe(map((res) => res?.['organisationUnitGroups'])));
|
|
5656
|
+
}
|
|
5657
|
+
getOrgUnitAttributeByUsage(usageType) {
|
|
5658
|
+
switch (usageType) {
|
|
5659
|
+
case 'DATA_ENTRY':
|
|
5660
|
+
return 'organisationUnits';
|
|
5661
|
+
case 'DATA_VIEW':
|
|
5662
|
+
return 'dataViewOrganisationUnits';
|
|
5663
|
+
default:
|
|
5664
|
+
return 'organisationUnits';
|
|
5665
|
+
}
|
|
5666
|
+
}
|
|
5487
5667
|
async ngAfterViewInit() {
|
|
5488
5668
|
if (!this.elementRef)
|
|
5489
5669
|
throw new Error('No element ref');
|
|
@@ -5513,14 +5693,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
|
|
|
5513
5693
|
|
|
5514
5694
|
class SelectionFiltersUiModule {
|
|
5515
5695
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
5516
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, declarations: [SelectionFiltersComponent], imports: [CommonModule, SharedDhis2UiModule, ReactWrapperModule], exports: [SelectionFiltersComponent] }); }
|
|
5517
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, imports: [CommonModule, SharedDhis2UiModule] }); }
|
|
5696
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, declarations: [SelectionFiltersComponent], imports: [CommonModule, SharedDhis2UiModule, ReactWrapperModule, OrganisationUnitSelectorModule], exports: [SelectionFiltersComponent] }); }
|
|
5697
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, imports: [CommonModule, SharedDhis2UiModule, OrganisationUnitSelectorModule] }); }
|
|
5518
5698
|
}
|
|
5519
5699
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, decorators: [{
|
|
5520
5700
|
type: NgModule,
|
|
5521
5701
|
args: [{
|
|
5522
5702
|
declarations: [SelectionFiltersComponent],
|
|
5523
|
-
imports: [CommonModule, SharedDhis2UiModule, ReactWrapperModule],
|
|
5703
|
+
imports: [CommonModule, SharedDhis2UiModule, ReactWrapperModule, OrganisationUnitSelectorModule],
|
|
5524
5704
|
exports: [SelectionFiltersComponent],
|
|
5525
5705
|
}]
|
|
5526
5706
|
}] });
|