@iapps/ng-dhis2-ui 1.1.5 → 1.1.7
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 +67 -27
- 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/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]);
|