@iapps/ng-dhis2-ui 1.1.7 → 1.1.9

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.
@@ -5400,108 +5400,169 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5400
5400
  constructor() {
5401
5401
  super(...arguments);
5402
5402
  this.actionOptions = [];
5403
- this.attributeFilters = [];
5404
- this.dataElementFilters = [];
5403
+ this.programAttributesFilters = [];
5404
+ this.programStageDataElementFilters = [];
5405
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);
5406
5447
  this.SelectionFiltersUI = () => {
5407
5448
  const [filters, setFilters] = useState({
5408
- attributeFilters: this.attributeFilters || [],
5409
- dataElementFilters: this.dataElementFilters || [],
5449
+ programAttributesFilters: this.programAttributesFilters || [],
5450
+ programStageDataElementFilters: this.programStageDataElementFilters || [],
5451
+ organizationUnitId: '',
5452
+ startDate: this.startDate || '',
5453
+ endDate: this.endDate || '',
5410
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);
5411
5461
  useEffect(() => {
5412
5462
  setFilters({
5413
- attributeFilters: this.attributeFilters,
5414
- dataElementFilters: this.dataElementFilters,
5463
+ programAttributesFilters: this.programAttributesFilters,
5464
+ programStageDataElementFilters: this.programStageDataElementFilters,
5465
+ organizationUnitId: '',
5466
+ startDate: this.startDate || '',
5467
+ endDate: this.endDate || '',
5415
5468
  });
5416
- }, [this.attributeFilters, this.dataElementFilters]);
5469
+ }, [
5470
+ this.programAttributesFilters,
5471
+ this.programStageDataElementFilters,
5472
+ this.startDate,
5473
+ this.endDate,
5474
+ ]);
5417
5475
  const handleAttributeChange = (index, selectedValue) => {
5418
5476
  setFilters((prevFilters) => {
5419
- const updatedFilters = [...prevFilters.attributeFilters];
5420
- updatedFilters[index] = { ...updatedFilters[index], value: selectedValue };
5421
- return { ...prevFilters, attributeFilters: updatedFilters };
5477
+ const updatedFilters = [...prevFilters.programAttributesFilters];
5478
+ updatedFilters[index] = {
5479
+ ...updatedFilters[index],
5480
+ value: selectedValue,
5481
+ };
5482
+ return { ...prevFilters, programAttributesFilters: updatedFilters };
5422
5483
  });
5423
5484
  };
5424
5485
  const handleDataElementChange = (index, selectedValue) => {
5425
5486
  setFilters((prevFilters) => {
5426
- const updatedFilters = [...prevFilters.dataElementFilters];
5427
- updatedFilters[index] = { ...updatedFilters[index], value: selectedValue };
5428
- return { ...prevFilters, dataElementFilters: updatedFilters };
5487
+ const updatedFilters = [...prevFilters.programStageDataElementFilters];
5488
+ updatedFilters[index] = {
5489
+ ...updatedFilters[index],
5490
+ value: selectedValue,
5491
+ };
5492
+ return {
5493
+ ...prevFilters,
5494
+ programStageDataElementFilters: updatedFilters,
5495
+ };
5429
5496
  });
5430
5497
  };
5431
5498
  const handleSearch = () => {
5432
- this.actionSelected.emit(filters);
5499
+ this.actionSelected.emit({
5500
+ ...filters,
5501
+ organizationUnit: selectedOrganisationUnit,
5502
+ organizationUnitId: selectedOrganisationUnit,
5503
+ startDate: filters.startDate,
5504
+ endDate: filters.endDate,
5505
+ });
5433
5506
  };
5434
- // Grid Column Span Logic for Attribute Filters
5435
5507
  const getAttributeColumnSpan = (index) => {
5436
- const totalItems = filters.attributeFilters.length;
5508
+ const totalItems = filters.programAttributesFilters.length;
5437
5509
  if (totalItems <= 4) {
5438
- // If 1 to 4 items, place them in a single row (span all columns if there's only one item)
5439
5510
  if (totalItems === 1) {
5440
- return 'span 4'; // One item spans all four columns
5511
+ return 'span 4';
5441
5512
  }
5442
5513
  if (totalItems === 2) {
5443
- return 'span 2'; // Two items, each spans 2 columns
5514
+ return 'span 2';
5444
5515
  }
5445
5516
  if (totalItems === 3) {
5446
- return 'span 1'; // Three items, each spans one column
5517
+ return 'span 1';
5447
5518
  }
5448
5519
  if (totalItems === 4) {
5449
- return 'span 1'; // Four items, each spans one column
5520
+ return 'span 1';
5450
5521
  }
5451
5522
  }
5452
5523
  else {
5453
- // More than 4 items, recursively adjust the placement
5454
- const rowIndex = Math.floor(index / 2); // Calculate row by pairs
5524
+ const rowIndex = Math.floor(index / 2);
5455
5525
  if (index % 2 === 0) {
5456
- // For first item in each row, span 2 columns
5457
5526
  return 'span 2';
5458
5527
  }
5459
5528
  else if (index === totalItems - 1) {
5460
- // Last item, spans the full row (4 columns)
5461
5529
  return 'span 4';
5462
5530
  }
5463
5531
  else {
5464
- // For other items, span 2 columns
5465
5532
  return 'span 2';
5466
5533
  }
5467
5534
  }
5468
- return 'span 1'; // Default behavior
5535
+ return 'span 1';
5469
5536
  };
5470
- // Grid Column Span Logic for Data Element Filters
5471
5537
  const getDataElementColumnSpan = (index) => {
5472
- const totalItems = filters.dataElementFilters.length;
5538
+ const totalItems = filters.programStageDataElementFilters.length;
5473
5539
  if (totalItems <= 4) {
5474
- // If 1 to 4 items, place them in a single row (span all columns if there's only one item)
5475
5540
  if (totalItems === 1) {
5476
- return 'span 4'; // One item spans all four columns
5541
+ return 'span 4';
5477
5542
  }
5478
5543
  if (totalItems === 2) {
5479
- return 'span 2'; // Two items, each spans 2 columns
5544
+ return 'span 2';
5480
5545
  }
5481
5546
  if (totalItems === 3) {
5482
- return 'span 1'; // Three items, each spans one column
5547
+ return 'span 1';
5483
5548
  }
5484
5549
  if (totalItems === 4) {
5485
- return 'span 1'; // Four items, each spans one column
5550
+ return 'span 1';
5486
5551
  }
5487
5552
  }
5488
5553
  else {
5489
- // More than 4 items, recursively adjust the placement
5490
- const rowIndex = Math.floor(index / 2); // Calculate row by pairs
5554
+ const rowIndex = Math.floor(index / 2);
5491
5555
  if (index % 2 === 0) {
5492
- // For first item in each row, span 2 columns
5493
5556
  return 'span 2';
5494
5557
  }
5495
5558
  else if (index === totalItems - 1) {
5496
- // Last item, spans the full row (4 columns)
5497
5559
  return 'span 4';
5498
5560
  }
5499
5561
  else {
5500
- // For other items, span 2 columns
5501
5562
  return 'span 2';
5502
5563
  }
5503
5564
  }
5504
- return 'span 1'; // Default behavior
5565
+ return 'span 1';
5505
5566
  };
5506
5567
  return (React__default.createElement("div", { style: {
5507
5568
  fontFamily: 'Arial, sans-serif',
@@ -5510,20 +5571,102 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5510
5571
  borderRadius: '8px',
5511
5572
  boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',
5512
5573
  } },
5574
+ React__default.createElement("div", { style: {
5575
+ display: 'grid',
5576
+ gridTemplateColumns: 'repeat(3, 1fr)',
5577
+ gap: '16px',
5578
+ marginBottom: '16px',
5579
+ } },
5580
+ React__default.createElement(React__default.Fragment, null,
5581
+ React__default.createElement(InputField$1, { value: displayValue, label: "Organization Unit", readOnly: false, onFocus: () => {
5582
+ setShowOrgUnit(true);
5583
+ }, onBlur: () => {
5584
+ this.ngZone.run(() => {
5585
+ console.log('THIS IS IT::: ');
5586
+ });
5587
+ setTouched(true);
5588
+ } }),
5589
+ showOrgUnit && (React__default.createElement(this.FieldOrgUnitSelector, { onCancelOrgUnit: () => {
5590
+ setShowOrgUnit(false);
5591
+ setTouched(true);
5592
+ }, onSelectOrgUnit: (selectedOrgUnits) => {
5593
+ if ((selectedOrgUnits || [])[0]) {
5594
+ const selectedOrgUnit = selectedOrgUnits[0];
5595
+ setDisplayValue(selectedOrgUnit.name);
5596
+ setSelected(selectedOrgUnit.id);
5597
+ setSelectedOrganisationUnit(selectedOrgUnit.id);
5598
+ setValue(selectedOrgUnit.id);
5599
+ setShowOrgUnit(false);
5600
+ setTouched(true);
5601
+ // this.ngZone.run(() => {
5602
+ // setDisplayValue(selectedOrgUnit.name);
5603
+ // setSelected(selectedOrgUnit.id)
5604
+ // setSelectedOrganisationUnit(selectedOrgUnit.id)
5605
+ // setValue(selectedOrgUnit.id);
5606
+ // setShowOrgUnit(false);
5607
+ // setTouched(true);
5608
+ // });
5609
+ }
5610
+ } }))),
5611
+ React__default.createElement(InputField$1, { className: "input-field", label: "Start Date", type: "date", value: filters.startDate, onChange: (event) => setFilters({ ...filters, startDate: event.value }) }),
5612
+ React__default.createElement(InputField$1, { className: "input-field", label: "End Date", type: "date", value: filters.endDate, onChange: (event) => setFilters({ ...filters, endDate: event.value }) })),
5513
5613
  React__default.createElement("div", { style: {
5514
5614
  display: 'grid',
5515
5615
  gridTemplateColumns: 'repeat(4, 1fr)',
5516
5616
  gap: '16px',
5517
- } }, filters.attributeFilters.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', 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.id }))))) : (React__default.createElement(InputField$1, { className: "input-field", label: filter.name || 'Program name', value: filter.value, onChange: (event) => handleAttributeChange(index, event.value) })))))),
5617
+ } }, 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', 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.id }))))) : (React__default.createElement(InputField$1, { className: "input-field", label: filter.name || 'Program name', value: filter.value, onChange: (event) => handleAttributeChange(index, event.value) })))))),
5518
5618
  React__default.createElement("div", { style: {
5519
5619
  display: 'grid',
5520
5620
  gridTemplateColumns: 'repeat(4, 1fr)',
5521
5621
  gap: '16px',
5522
- } }, filters.dataElementFilters.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', 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.id }))))) : (React__default.createElement(InputField$1, { className: "input-field", label: filter.name || 'Program name', value: filter.value, onChange: (event) => handleDataElementChange(index, event.value) })))))),
5622
+ } }, 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', 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.id }))))) : (React__default.createElement(InputField$1, { className: "input-field", label: filter.name || 'Program name', value: filter.value, onChange: (event) => handleDataElementChange(index, event.value) })))))),
5523
5623
  React__default.createElement("div", { style: { textAlign: 'right', marginTop: '16px' } },
5524
5624
  React__default.createElement(Button$1, { onClick: handleSearch }, "Search"))));
5525
5625
  };
5526
5626
  }
5627
+ getAppConfig() {
5628
+ return this.httpClient.systemInfo().pipe(map((response) => {
5629
+ const systemInfo = response;
5630
+ return {
5631
+ baseUrl: (document?.location?.host?.includes('localhost')
5632
+ ? `${document.location.protocol}//${document.location.host}`
5633
+ : systemInfo['contextPath']),
5634
+ apiVersion: Number(((systemInfo['version'] || '')?.split('.') || [])[1]),
5635
+ };
5636
+ }));
5637
+ }
5638
+ getRootOrgUnits() {
5639
+ const orgUnitAttribute = this.getOrgUnitAttributeByUsage(this.orgUnitSelectionConfig.usageType);
5640
+ return this.httpClient
5641
+ .me()
5642
+ .pipe(map((user) => (user ? user[orgUnitAttribute] : []).map((orgUnit) => orgUnit.id)));
5643
+ }
5644
+ getOrgUnitLevels() {
5645
+ return firstValueFrom(this.httpClient
5646
+ .get('organisationUnitLevels.json?fields=id,level,displayName,name&paging=false')
5647
+ .pipe(map((res) => res?.['organisationUnitLevels'])));
5648
+ }
5649
+ onSelectOrgUnit(selectedOrgUnits) {
5650
+ this.showOrgUnitTree.set(false);
5651
+ if ((selectedOrgUnits || [])[0]) {
5652
+ this.selectedOrgUnit.set(selectedOrgUnits[0]);
5653
+ }
5654
+ }
5655
+ getOrgUnitGroups() {
5656
+ return firstValueFrom(this.httpClient
5657
+ .get('organisationUnitGroups.json?fields=id,displayName,name&paging=false')
5658
+ .pipe(map((res) => res?.['organisationUnitGroups'])));
5659
+ }
5660
+ getOrgUnitAttributeByUsage(usageType) {
5661
+ switch (usageType) {
5662
+ case 'DATA_ENTRY':
5663
+ return 'organisationUnits';
5664
+ case 'DATA_VIEW':
5665
+ return 'dataViewOrganisationUnits';
5666
+ default:
5667
+ return 'organisationUnits';
5668
+ }
5669
+ }
5527
5670
  async ngAfterViewInit() {
5528
5671
  if (!this.elementRef)
5529
5672
  throw new Error('No element ref');
@@ -5532,16 +5675,16 @@ class SelectionFiltersComponent extends ReactWrapperModule {
5532
5675
  this.render();
5533
5676
  }
5534
5677
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5535
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: SelectionFiltersComponent, isStandalone: false, selector: "app-selection-filters-ui", inputs: { actionOptions: "actionOptions", attributeFilters: "attributeFilters", dataElementFilters: "dataElementFilters", startDate: "startDate", endDate: "endDate" }, outputs: { actionSelected: "actionSelected" }, usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".react-filters-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-bottom:20px}.input-field,.single-select{width:100%}\n"] }); }
5678
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.8", type: SelectionFiltersComponent, isStandalone: false, selector: "app-selection-filters-ui", inputs: { actionOptions: "actionOptions", programAttributesFilters: "programAttributesFilters", programStageDataElementFilters: "programStageDataElementFilters", startDate: "startDate", endDate: "endDate" }, outputs: { actionSelected: "actionSelected" }, usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".react-filters-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-bottom:20px}.input-field,.single-select{width:100%}\n"] }); }
5536
5679
  }
5537
5680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersComponent, decorators: [{
5538
5681
  type: Component,
5539
5682
  args: [{ selector: 'app-selection-filters-ui', template: '<ng-content></ng-content>', standalone: false, styles: [".react-filters-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-bottom:20px}.input-field,.single-select{width:100%}\n"] }]
5540
5683
  }], propDecorators: { actionOptions: [{
5541
5684
  type: Input
5542
- }], attributeFilters: [{
5685
+ }], programAttributesFilters: [{
5543
5686
  type: Input
5544
- }], dataElementFilters: [{
5687
+ }], programStageDataElementFilters: [{
5545
5688
  type: Input
5546
5689
  }], startDate: [{
5547
5690
  type: Input
@@ -5553,14 +5696,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImpor
5553
5696
 
5554
5697
  class SelectionFiltersUiModule {
5555
5698
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
5556
- 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] }); }
5557
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, imports: [CommonModule, SharedDhis2UiModule] }); }
5699
+ 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] }); }
5700
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, imports: [CommonModule, SharedDhis2UiModule, OrganisationUnitSelectorModule] }); }
5558
5701
  }
5559
5702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.8", ngImport: i0, type: SelectionFiltersUiModule, decorators: [{
5560
5703
  type: NgModule,
5561
5704
  args: [{
5562
5705
  declarations: [SelectionFiltersComponent],
5563
- imports: [CommonModule, SharedDhis2UiModule, ReactWrapperModule],
5706
+ imports: [CommonModule, SharedDhis2UiModule, ReactWrapperModule, OrganisationUnitSelectorModule],
5564
5707
  exports: [SelectionFiltersComponent],
5565
5708
  }]
5566
5709
  }] });