@openmrs/esm-report-builder 0.1.1-pre.101
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/.eslintignore +5 -0
- package/.eslintrc.js +19 -0
- package/.prettierrc +8 -0
- package/.tx/config +12 -0
- package/LICENSE +401 -0
- package/README.md +336 -0
- package/__mocks__/react-i18next.js +12 -0
- package/dist/128.css +1 -0
- package/dist/128.css.map +1 -0
- package/dist/128.js +338 -0
- package/dist/128.js.map +1 -0
- package/dist/1480.js +1 -0
- package/dist/1480.js.map +1 -0
- package/dist/1646.js +1 -0
- package/dist/1646.js.map +1 -0
- package/dist/1869.js +1 -0
- package/dist/1869.js.map +1 -0
- package/dist/1877.js +1 -0
- package/dist/1877.js.map +1 -0
- package/dist/2131.js +1 -0
- package/dist/2131.js.map +1 -0
- package/dist/2317.js +1 -0
- package/dist/2317.js.map +1 -0
- package/dist/2408.js +1 -0
- package/dist/2408.js.map +1 -0
- package/dist/2416.js +1 -0
- package/dist/2416.js.map +1 -0
- package/dist/282.js +1 -0
- package/dist/282.js.map +1 -0
- package/dist/2881.js +1 -0
- package/dist/2881.js.map +1 -0
- package/dist/2997.js +1 -0
- package/dist/2997.js.map +1 -0
- package/dist/3378.js +1 -0
- package/dist/3378.js.map +1 -0
- package/dist/3963.js +1 -0
- package/dist/3963.js.map +1 -0
- package/dist/4106.js +1 -0
- package/dist/4106.js.map +1 -0
- package/dist/4111.js +1 -0
- package/dist/4111.js.map +1 -0
- package/dist/4171.css +1 -0
- package/dist/4171.css.map +1 -0
- package/dist/4171.js +43 -0
- package/dist/4171.js.map +1 -0
- package/dist/434.js +1 -0
- package/dist/434.js.map +1 -0
- package/dist/4348.js +1 -0
- package/dist/4348.js.map +1 -0
- package/dist/4383.js +1 -0
- package/dist/4383.js.map +1 -0
- package/dist/4658.js +1 -0
- package/dist/4658.js.map +1 -0
- package/dist/4668.js +1 -0
- package/dist/4668.js.map +1 -0
- package/dist/4928.js +1 -0
- package/dist/4928.js.map +1 -0
- package/dist/5098.js +1 -0
- package/dist/5098.js.map +1 -0
- package/dist/5117.js +1 -0
- package/dist/5117.js.map +1 -0
- package/dist/5132.js +1 -0
- package/dist/5132.js.map +1 -0
- package/dist/5145.js +1 -0
- package/dist/5145.js.map +1 -0
- package/dist/550.js +1 -0
- package/dist/550.js.map +1 -0
- package/dist/5503.js +1 -0
- package/dist/5503.js.map +1 -0
- package/dist/556.js +1 -0
- package/dist/556.js.map +1 -0
- package/dist/5644.js +1 -0
- package/dist/5644.js.map +1 -0
- package/dist/5940.js +1 -0
- package/dist/5940.js.map +1 -0
- package/dist/6047.js +1 -0
- package/dist/6047.js.map +1 -0
- package/dist/6237.js +1 -0
- package/dist/6237.js.map +1 -0
- package/dist/6371.js +1 -0
- package/dist/6371.js.map +1 -0
- package/dist/6377.js +1 -0
- package/dist/6377.js.map +1 -0
- package/dist/6444.js +1 -0
- package/dist/6444.js.map +1 -0
- package/dist/6508.js +1 -0
- package/dist/6508.js.map +1 -0
- package/dist/6652.js +1 -0
- package/dist/6652.js.map +1 -0
- package/dist/6686.js +1 -0
- package/dist/6686.js.map +1 -0
- package/dist/6724.js +1 -0
- package/dist/6724.js.map +1 -0
- package/dist/6867.js +19 -0
- package/dist/6867.js.map +1 -0
- package/dist/6904.js +1 -0
- package/dist/6904.js.map +1 -0
- package/dist/7045.js +1 -0
- package/dist/7045.js.map +1 -0
- package/dist/7175.js +1 -0
- package/dist/7175.js.map +1 -0
- package/dist/7182.js +1 -0
- package/dist/7182.js.map +1 -0
- package/dist/7475.js +1 -0
- package/dist/7475.js.map +1 -0
- package/dist/7742.js +1 -0
- package/dist/7742.js.map +1 -0
- package/dist/7912.js +1 -0
- package/dist/7912.js.map +1 -0
- package/dist/8251.js +1 -0
- package/dist/8251.js.map +1 -0
- package/dist/8358.js +1 -0
- package/dist/8358.js.map +1 -0
- package/dist/8359.js +1 -0
- package/dist/8359.js.map +1 -0
- package/dist/8695.js +1 -0
- package/dist/8695.js.map +1 -0
- package/dist/903.js +1 -0
- package/dist/903.js.map +1 -0
- package/dist/9072.js +1 -0
- package/dist/9072.js.map +1 -0
- package/dist/9806.js +1 -0
- package/dist/9806.js.map +1 -0
- package/dist/997.js +1 -0
- package/dist/997.js.map +1 -0
- package/dist/openmrs-esm-report-builder.js +3 -0
- package/dist/openmrs-esm-report-builder.js.buildmanifest.json +1433 -0
- package/dist/openmrs-esm-report-builder.js.map +1 -0
- package/dist/routes.json +1 -0
- package/e2e/core/env.ts +5 -0
- package/e2e/core/global-setup.ts +34 -0
- package/e2e/core/test.ts +21 -0
- package/e2e/pages/app-shell.page.ts +35 -0
- package/e2e/pages/etl-sources.page.ts +36 -0
- package/e2e/pages/report-sections.page.ts +21 -0
- package/e2e/pages/section-preview.modal.ts +29 -0
- package/e2e/specs/etl-sources.spec.ts +51 -0
- package/e2e/specs/navigation.spec.ts +13 -0
- package/e2e/specs/section-preview-validation.spec.ts +38 -0
- package/e2e/specs/section-preview.spec.ts +94 -0
- package/e2e/support/github/Dockerfile +32 -0
- package/e2e/support/github/Dockerfile.dockerignore +13 -0
- package/e2e/support/github/docker-compose.yml +31 -0
- package/e2e/support/github/run-e2e-docker-env.sh +131 -0
- package/e2e/support/github/spa-assemble-config.json +6 -0
- package/e2e/tsconfig.json +11 -0
- package/example.env +5 -0
- package/linelist_report_builder_design_spec.md +816 -0
- package/package.json +98 -0
- package/playwright.config.ts +28 -0
- package/rspack.config.js +2 -0
- package/src/__debug__/all-designs.test.tsx +33 -0
- package/src/admin-card-link.extension.module.scss +55 -0
- package/src/admin-card-link.extension.tsx +24 -0
- package/src/components/admin/admin-page.component.tsx +75 -0
- package/src/components/admin/age-categories-page.component.tsx +109 -0
- package/src/components/admin/age-groups-page.component.tsx +146 -0
- package/src/components/admin/etl-browser/columns-tab.component.tsx +80 -0
- package/src/components/admin/etl-browser/etl-browser-page.component.tsx +309 -0
- package/src/components/admin/etl-browser/etl-browser.component.scss +424 -0
- package/src/components/admin/etl-browser/metadata-tab.component.tsx +65 -0
- package/src/components/admin/etl-browser/preview-grid.component.tsx +189 -0
- package/src/components/admin/etl-browser/relationships-tab.component.tsx +21 -0
- package/src/components/admin/etl-browser/sources-tree.component.tsx +118 -0
- package/src/components/admin/etl-browser/table-detail.component.tsx +124 -0
- package/src/components/admin/etl-browser/table-info-strip.component.tsx +51 -0
- package/src/components/admin/etl-browser/table-list.component.tsx +136 -0
- package/src/components/admin/etl-browser/use-table-preview.ts +47 -0
- package/src/components/admin/etl-sources-page.component.tsx +355 -0
- package/src/components/admin/etl-tasks-page.component.scss +370 -0
- package/src/components/admin/etl-tasks-page.component.tsx +768 -0
- package/src/components/admin/report-categories-page.component.tsx +267 -0
- package/src/components/admin/report-library-page.component.tsx +551 -0
- package/src/components/ai-support/ai-assist-button.component.tsx +30 -0
- package/src/components/ai-support/ai-assist-modal.component.tsx +81 -0
- package/src/components/ai-support/ai.service.ts +21 -0
- package/src/components/ai-support/ai.types.ts +12 -0
- package/src/components/app-shell/report-builder-shell.component.tsx +242 -0
- package/src/components/app-shell/report-builder-shell.scss +18 -0
- package/src/components/dashboards/dashboard-config.schema.ts +97 -0
- package/src/components/dashboards/dashboard-form-modal.component.tsx +150 -0
- package/src/components/dashboards/dashboards-admin.scss +62 -0
- package/src/components/dashboards/dashboards-page.component.tsx +153 -0
- package/src/components/dashboards/dashboards-table.component.tsx +130 -0
- package/src/components/dashboards/sections/dashboard-autoinclude.section.tsx +75 -0
- package/src/components/dashboards/sections/dashboard-basics.section.tsx +80 -0
- package/src/components/dashboards/sections/dashboard-json.section.tsx +79 -0
- package/src/components/dashboards/sections/dashboard-sections-editor.section.tsx +130 -0
- package/src/components/dashboards/sections/dashboard-widgets-editor.section.tsx +184 -0
- package/src/components/data-themes/data-theme-form.component.tsx +59 -0
- package/src/components/data-themes/data-theme-modal.component.tsx +349 -0
- package/src/components/data-themes/data-themes-page.component.tsx +139 -0
- package/src/components/data-themes/data-themes-table.component.tsx +98 -0
- package/src/components/data-themes/icon-registry.ts +35 -0
- package/src/components/data-themes/sections/data-theme-basics.section.tsx +63 -0
- package/src/components/data-themes/sections/data-theme-condition-columns.section.tsx +397 -0
- package/src/components/data-themes/sections/data-theme-fields-editor.section.tsx +125 -0
- package/src/components/data-themes/sections/data-theme-metadata.section.tsx +245 -0
- package/src/components/data-themes/sections/data-theme-preview.section.tsx +115 -0
- package/src/components/data-themes/sections/data-theme-source.section.tsx +184 -0
- package/src/components/data-visualizer/components/cqi-components/cqi-data-table.component.tsx +214 -0
- package/src/components/data-visualizer/components/cqi-components/cqi-elements.ts +203 -0
- package/src/components/data-visualizer/components/cqi-components/detail.component.tsx +110 -0
- package/src/components/data-visualizer/components/cqi-components/detail.scss +22 -0
- package/src/components/data-visualizer/components/data-table/data-table.component.tsx +208 -0
- package/src/components/data-visualizer/components/data-table/data-tables.scss +206 -0
- package/src/components/data-visualizer/components/empty-state/empty-state-illustration.component.tsx +53 -0
- package/src/components/data-visualizer/components/header/header.component.tsx +43 -0
- package/src/components/data-visualizer/components/header/header.scss +71 -0
- package/src/components/data-visualizer/components/model/confirm.component.tsx +40 -0
- package/src/components/data-visualizer/components/panel/panel.component.tsx +20 -0
- package/src/components/data-visualizer/components/panel/panel.scss +25 -0
- package/src/components/data-visualizer/components/popover/modifier-panel.tsx +53 -0
- package/src/components/data-visualizer/constants.ts +445 -0
- package/src/components/data-visualizer/data-visualizer-illustration.component.tsx +31 -0
- package/src/components/data-visualizer/data-visualizer.component.tsx +1935 -0
- package/src/components/data-visualizer/data-visualizer.resource.ts +462 -0
- package/src/components/data-visualizer/data-visualizer.scss +448 -0
- package/src/components/data-visualizer/declarations.d.ts +131 -0
- package/src/components/data-visualizer/parameter-inputs/boolean-parameter-input.component.tsx +34 -0
- package/src/components/data-visualizer/parameter-inputs/concept-parameter-input.component.tsx +81 -0
- package/src/components/data-visualizer/parameter-inputs/date-parameter-input.component.tsx +110 -0
- package/src/components/data-visualizer/parameter-inputs/date-range-input.component.scss +47 -0
- package/src/components/data-visualizer/parameter-inputs/date-range-input.component.tsx +228 -0
- package/src/components/data-visualizer/parameter-inputs/identifier-type-parameter-input.component.tsx +69 -0
- package/src/components/data-visualizer/parameter-inputs/list-parameter-input.component.tsx +73 -0
- package/src/components/data-visualizer/parameter-inputs/location-parameter-input.component.tsx +81 -0
- package/src/components/data-visualizer/parameter-inputs/number-parameter-input.component.tsx +40 -0
- package/src/components/data-visualizer/parameter-inputs/person-attribute-parameter-input.component.tsx +71 -0
- package/src/components/data-visualizer/parameter-inputs/text-parameter-input.component.tsx +52 -0
- package/src/components/data-visualizer/report-parameter-modal.component.tsx +383 -0
- package/src/components/data-visualizer/types.ts +206 -0
- package/src/components/etl-monitor/builder/builder-state-machine.ts +381 -0
- package/src/components/etl-monitor/builder/design-registry.tsx +139 -0
- package/src/components/etl-monitor/builder/etl-monitor-builder-context.tsx +702 -0
- package/src/components/etl-monitor/builder/etl-monitor-builder-modal.component.tsx +461 -0
- package/src/components/etl-monitor/builder/etl-monitor-builder-modal.scss +256 -0
- package/src/components/etl-monitor/builder/etl-monitor-builder-page.component.tsx +387 -0
- package/src/components/etl-monitor/builder/etl-monitor-builder-page.scss +976 -0
- package/src/components/etl-monitor/builder/generated-config-panel.component.tsx +168 -0
- package/src/components/etl-monitor/builder/generated-config-panel.scss +198 -0
- package/src/components/etl-monitor/builder/index.ts +5 -0
- package/src/components/etl-monitor/builder/monitor-preview.tsx +124 -0
- package/src/components/etl-monitor/builder/steps/data-source-step.component.tsx +667 -0
- package/src/components/etl-monitor/builder/steps/data-source-step.scss +284 -0
- package/src/components/etl-monitor/builder/steps/design-samples.ts +278 -0
- package/src/components/etl-monitor/builder/steps/design-step.component.tsx +299 -0
- package/src/components/etl-monitor/builder/steps/design-step.scss +479 -0
- package/src/components/etl-monitor/builder/steps/fields-step.component.tsx +859 -0
- package/src/components/etl-monitor/builder/steps/fields-step.scss +459 -0
- package/src/components/etl-monitor/builder/steps/general-step.component.tsx +288 -0
- package/src/components/etl-monitor/builder/steps/general-step.scss +103 -0
- package/src/components/etl-monitor/builder/steps/index.ts +5 -0
- package/src/components/etl-monitor/builder/steps/preview-step.component.tsx +245 -0
- package/src/components/etl-monitor/builder/steps/preview-step.scss +236 -0
- package/src/components/etl-monitor/etl-monitor-card-shell.component.tsx +154 -0
- package/src/components/etl-monitor/etl-monitor-card-shell.scss +103 -0
- package/src/components/etl-monitor/etl-monitor-dashboard.component.tsx +227 -0
- package/src/components/etl-monitor/etl-monitor-dashboard.scss +148 -0
- package/src/components/etl-monitor/etl-monitor-status-card.component.tsx +192 -0
- package/src/components/etl-monitor/etl-monitors-page.component.tsx +621 -0
- package/src/components/etl-monitor/renderers/DetailsRenderer.tsx +2 -0
- package/src/components/etl-monitor/renderers/ErrorLogRenderer.tsx +2 -0
- package/src/components/etl-monitor/renderers/EtlMonitorWidget.tsx +97 -0
- package/src/components/etl-monitor/renderers/MetricsGridRenderer.tsx +2 -0
- package/src/components/etl-monitor/renderers/MonitorRenderer.tsx +175 -0
- package/src/components/etl-monitor/renderers/ProgressRenderer.tsx +2 -0
- package/src/components/etl-monitor/renderers/StatusCardRenderer.tsx +2 -0
- package/src/components/etl-monitor/renderers/SummaryCardRenderer.tsx +2 -0
- package/src/components/etl-monitor/renderers/TableRenderer.tsx +2 -0
- package/src/components/etl-monitor/renderers/component-icons.tsx +33 -0
- package/src/components/etl-monitor/renderers/components/details-renderer.tsx +195 -0
- package/src/components/etl-monitor/renderers/components/error-log-renderer.tsx +104 -0
- package/src/components/etl-monitor/renderers/components/index.ts +6 -0
- package/src/components/etl-monitor/renderers/components/log-renderer.tsx +86 -0
- package/src/components/etl-monitor/renderers/components/metrics-grid-renderer.tsx +133 -0
- package/src/components/etl-monitor/renderers/components/progress-renderer.tsx +188 -0
- package/src/components/etl-monitor/renderers/components/status-card-renderer.tsx +247 -0
- package/src/components/etl-monitor/renderers/components/summary-card-renderer.tsx +160 -0
- package/src/components/etl-monitor/renderers/components/table-renderer.tsx +175 -0
- package/src/components/etl-monitor/renderers/components/time-series-renderer.tsx +310 -0
- package/src/components/etl-monitor/renderers/data-transformer.ts +361 -0
- package/src/components/etl-monitor/renderers/index.ts +11 -0
- package/src/components/etl-monitor/renderers/legacy-monitor-renderer.tsx +69 -0
- package/src/components/etl-monitor/renderers/monitor-renderer.tsx +6 -0
- package/src/components/etl-monitor/renderers/monitor-renderers.scss +1621 -0
- package/src/components/etl-monitor/renderers/monitor-widget-card.component.tsx +54 -0
- package/src/components/etl-monitor/renderers/monitor-widget-card.scss +16 -0
- package/src/components/etl-monitor/renderers/v2-monitor-renderer.tsx +227 -0
- package/src/components/import-export/artifact-groups.ts +153 -0
- package/src/components/import-export/export-report-modal.component.tsx +265 -0
- package/src/components/import-export/import-export-page.component.tsx +610 -0
- package/src/components/import-export/import-export.styles.scss +825 -0
- package/src/components/import-export/import-package-modal.component.tsx +401 -0
- package/src/components/import-export/index.ts +3 -0
- package/src/components/indicators/README.md +24 -0
- package/src/components/indicators/base-indicator-basic-fields.component.tsx +18 -0
- package/src/components/indicators/base-indicator-basics.section.tsx +54 -0
- package/src/components/indicators/base-indicator-countby.section.tsx +25 -0
- package/src/components/indicators/base-indicator-criteria.section.tsx +83 -0
- package/src/components/indicators/base-indicator-details-form.component.tsx +80 -0
- package/src/components/indicators/base-indicator-theme-unit-fields.component.tsx +39 -0
- package/src/components/indicators/create-base-indicator-modal.component.tsx +623 -0
- package/src/components/indicators/create-composite-base-indicator-modal.component.tsx +295 -0
- package/src/components/indicators/create-custom-indicator-modal.component.tsx +548 -0
- package/src/components/indicators/create-final-indicator-modal.component.tsx +285 -0
- package/src/components/indicators/custom-condition-input.component.tsx +310 -0
- package/src/components/indicators/diagnosis-filters-form.component.tsx +101 -0
- package/src/components/indicators/disaggregation-panel.component.tsx +93 -0
- package/src/components/indicators/handler/concept-search-multiselect.component.tsx +153 -0
- package/src/components/indicators/handler/question-answer-concept-search.component.tsx +336 -0
- package/src/components/indicators/indicator-run-preview-modal.component.tsx +391 -0
- package/src/components/indicators/indicator-search-select.component.tsx +297 -0
- package/src/components/indicators/indicator-status-tag.component.tsx +9 -0
- package/src/components/indicators/indicators-page.component.tsx +673 -0
- package/src/components/indicators/indicators-page.scss +121 -0
- package/src/components/indicators/indicators-table.component.tsx +188 -0
- package/src/components/indicators/preview-table.component.tsx +31 -0
- package/src/components/indicators/sections/composite-indicator-basics.section.tsx +36 -0
- package/src/components/indicators/sections/composite-indicator-picker.section.tsx +116 -0
- package/src/components/indicators/sections/composite-indicator-sql-preview.section.tsx +31 -0
- package/src/components/indicators/sections/custom-indicator-basics.section.tsx +65 -0
- package/src/components/indicators/sections/custom-indicator-disaggregation.section.tsx +93 -0
- package/src/components/indicators/sections/custom-indicator-filters.section.tsx +203 -0
- package/src/components/indicators/sections/custom-indicator-population.section.tsx +107 -0
- package/src/components/indicators/sections/custom-indicator-sql-preview.section.tsx +108 -0
- package/src/components/indicators/sections/final-indicator-basics.section.tsx +46 -0
- package/src/components/indicators/sections/final-indicator-disaggregation.section.tsx +47 -0
- package/src/components/indicators/sections/final-indicator-picker.section.tsx +60 -0
- package/src/components/indicators/sections/final-indicator-preview.section.tsx +20 -0
- package/src/components/indicators/sections/final-indicator-results-preview.section.tsx +65 -0
- package/src/components/indicators/sections/indicator-basics.section.tsx +40 -0
- package/src/components/indicators/sections/indicator-conditions.section.tsx +279 -0
- package/src/components/indicators/sections/indicator-sql-preview.section.tsx +63 -0
- package/src/components/indicators/sections/indicator-theme.section.tsx +48 -0
- package/src/components/indicators/sql-preview.component.tsx +19 -0
- package/src/components/indicators/tag-input.component.tsx +177 -0
- package/src/components/indicators/types/base-indicator-form.types.ts +17 -0
- package/src/components/indicators/types/base-indicator-theme.constants.ts +8 -0
- package/src/components/indicators/types/composite-indicator.types.ts +27 -0
- package/src/components/indicators/types/condition-ui.types.ts +11 -0
- package/src/components/indicators/types/custom-indicator.types.ts +161 -0
- package/src/components/indicators/types/data-theme-config.types.ts +88 -0
- package/src/components/indicators/types/indicator-types.ts +57 -0
- package/src/components/indicators/types/sql-builders.ts +43 -0
- package/src/components/indicators/utils/composite-indicator-sql.utils.test.ts +143 -0
- package/src/components/indicators/utils/composite-indicator-sql.utils.ts +426 -0
- package/src/components/indicators/utils/concept-preload.utils.ts +21 -0
- package/src/components/indicators/utils/custom-indicator-interpreter.test.ts +493 -0
- package/src/components/indicators/utils/custom-indicator-interpreter.ts +702 -0
- package/src/components/indicators/utils/final-indicator-sql.utils.ts +190 -0
- package/src/components/indicators/utils/indicator-conditions-hydration.utils.ts +254 -0
- package/src/components/indicators/utils/indicator-sql-resolution.utils.ts +204 -0
- package/src/components/indicators/utils/indicator-sql.utils.ts +721 -0
- package/src/components/indicators/utils/population-sql.compiler.test.ts +985 -0
- package/src/components/indicators/utils/population-sql.compiler.ts +858 -0
- package/src/components/landing/landing-action-item.component.tsx +50 -0
- package/src/components/landing/landing-action-list.component.tsx +12 -0
- package/src/components/landing/landing-activity-list.component.tsx +47 -0
- package/src/components/landing/landing-footer-grid.component.tsx +45 -0
- package/src/components/landing/landing-hero.component.tsx +18 -0
- package/src/components/landing/landing-section-card.component.tsx +33 -0
- package/src/components/landing/report-builder-landing-page.component.tsx +186 -0
- package/src/components/landing/report-builder-landing-page.scss +131 -0
- package/src/components/legacy-reports/legacy-report-detail-page.component.tsx +300 -0
- package/src/components/legacy-reports/legacy-report-editor-page.component.tsx +324 -0
- package/src/components/legacy-reports/legacy-report-upload-modal.component.tsx +307 -0
- package/src/components/legacy-reports/legacy-reports-page.component.tsx +206 -0
- package/src/components/legacy-reports/legacy-reports-table.component.tsx +154 -0
- package/src/components/legacy-reports/tabs/legacy-report-datasets-tab.component.tsx +344 -0
- package/src/components/legacy-reports/tabs/legacy-report-dimensions-tab.component.tsx +590 -0
- package/src/components/legacy-reports/tabs/legacy-report-indicators-tab.component.tsx +490 -0
- package/src/components/legacy-reports/tabs/legacy-report-json-preview-tab.component.tsx +272 -0
- package/src/components/legacy-reports/tabs/legacy-report-overview-tab.component.tsx +218 -0
- package/src/components/legacy-reports/tabs/legacy-report-parameters-tab.component.tsx +279 -0
- package/src/components/linelist/definition/indicator-to-sql.utils.ts +281 -0
- package/src/components/linelist/definition/linelist-definition-editor.component.tsx +1676 -0
- package/src/components/linelist/definition/linelist-definition-editor.scss +461 -0
- package/src/components/linelist/definition/linelist-definition.types.ts +108 -0
- package/src/components/linelist/definition/panels/column-properties-panel.component.tsx +328 -0
- package/src/components/linelist/definition/panels/column-selector-panel.component.tsx +1082 -0
- package/src/components/linelist/definition/panels/column-selector-panel.scss +100 -0
- package/src/components/linelist/definition/panels/custom-sql-column-modal.component.tsx +248 -0
- package/src/components/linelist/definition/panels/encounter-diagnosis-column-modal.component.tsx +300 -0
- package/src/components/linelist/definition/panels/encounter-diagnosis-column-modal.scss +21 -0
- package/src/components/linelist/definition/panels/multi-datasource-selector.component.tsx +332 -0
- package/src/components/linelist/definition/panels/multi-datasource-selector.scss +161 -0
- package/src/components/linelist/definition/panels/observation-column-modal.component.tsx +450 -0
- package/src/components/linelist/definition/panels/observation-column-modal.scss +29 -0
- package/src/components/linelist/definition/panels/parameter-panel.component.tsx +659 -0
- package/src/components/linelist/definition/panels/parameter-panel.scss +64 -0
- package/src/components/linelist/definition/panels/population-source-selector.component.tsx +407 -0
- package/src/components/linelist/definition/panels/population-source-selector.scss +187 -0
- package/src/components/linelist/design/panels/column-category-selector.component.tsx +433 -0
- package/src/components/linelist/design/panels/column-category-selector.scss +324 -0
- package/src/components/linelist/design/panels/column-debug-panel.component.tsx +197 -0
- package/src/components/linelist/design/panels/column-debug-panel.scss +141 -0
- package/src/components/linelist/design/panels/data-catalogue.component.tsx +1062 -0
- package/src/components/linelist/design/panels/data-catalogue.scss +263 -0
- package/src/components/linelist/design/panels/display-settings-panel.component.tsx +405 -0
- package/src/components/linelist/design/panels/display-settings-panel.scss +78 -0
- package/src/components/linelist/design/panels/filtermap-editor.component.tsx +434 -0
- package/src/components/linelist/design/panels/filtermap-editor.scss +176 -0
- package/src/components/linelist/design/panels/json-preview.component.tsx +114 -0
- package/src/components/linelist/design/panels/json-preview.scss +85 -0
- package/src/components/linelist/design/panels/query-config-panel.component.tsx +1137 -0
- package/src/components/linelist/design/panels/query-config-panel.scss +341 -0
- package/src/components/linelist/design/panels/sort-config-panel.component.tsx +330 -0
- package/src/components/linelist/design/panels/sort-config-panel.scss +77 -0
- package/src/components/linelist/design/panels/sql-builder-panel.component.tsx +475 -0
- package/src/components/linelist/design/panels/sql-builder-panel.scss +226 -0
- package/src/components/linelist/design/panels/transformation-panel.component.tsx +687 -0
- package/src/components/linelist/design/panels/transformation-panel.scss +81 -0
- package/src/components/linelist/design/panels/visual-filter-panel.component.tsx +595 -0
- package/src/components/linelist/design/panels/visual-filter-panel.scss +76 -0
- package/src/components/linelist/linelist-dashboard.page.component.tsx +756 -0
- package/src/components/linelist/linelist-dashboard.page.scss +240 -0
- package/src/components/linelist/linelist-editor.page.component.tsx +134 -0
- package/src/components/linelist/linelist-editor.page.scss +28 -0
- package/src/components/linelist/linelist-run-report.page.component.tsx +715 -0
- package/src/components/linelist/linelist-run-report.page.scss +136 -0
- package/src/components/linelist/modals/linelist-report-builder-modal.component.tsx +1454 -0
- package/src/components/linelist/modals/linelist-report-builder-modal.scss +164 -0
- package/src/components/linelist/modals/preview-parameter-modal.component.tsx +361 -0
- package/src/components/report/dashboard/reports-table.component.tsx +186 -0
- package/src/components/report/definition/panels/properties-panel.component.tsx +38 -0
- package/src/components/report/definition/panels/report-structure-panel.component.tsx +61 -0
- package/src/components/report/definition/panels/selection-panel.component.tsx +58 -0
- package/src/components/report/definition/report-definition-editor.component.tsx +99 -0
- package/src/components/report/definition/report-definition.types.ts +66 -0
- package/src/components/report/design/panels/IndicatorPropertiesPanel.scss +33 -0
- package/src/components/report/design/panels/IndicatorPropertiesPanel.tsx +389 -0
- package/src/components/report/design/panels/JsonPreviewPanel.scss +32 -0
- package/src/components/report/design/panels/JsonPreviewPanel.tsx +104 -0
- package/src/components/report/design/panels/mapping-preview-panel.component.tsx +82 -0
- package/src/components/report/design/panels/mapping-preview-panel.scss +55 -0
- package/src/components/report/design/panels/template-structure-panel.component.tsx +296 -0
- package/src/components/report/design/panels/template-structure-panel.scss +81 -0
- package/src/components/report/design/report-design-editor.component.tsx +1170 -0
- package/src/components/report/design/report-design.types.ts +48 -0
- package/src/components/report/design/report-design.utils.ts +86 -0
- package/src/components/report/panels/report-detail.component.tsx +71 -0
- package/src/components/report/panels/report-panel-shell.component.tsx +60 -0
- package/src/components/report/report-dashboard.page.component.tsx +554 -0
- package/src/components/report/report-editor.page.component.tsx +590 -0
- package/src/components/report/report.routes.tsx +32 -0
- package/src/components/report-sections/create-report-section-modal.component.tsx +388 -0
- package/src/components/report-sections/hooks/useAgeCategories.ts +25 -0
- package/src/components/report-sections/hooks/useSectionEditorState.ts +449 -0
- package/src/components/report-sections/panels/Dhis2MappingPanel.tsx +157 -0
- package/src/components/report-sections/panels/DisaggregationPanel.tsx +97 -0
- package/src/components/report-sections/panels/IndicatorPickerPanel.tsx +201 -0
- package/src/components/report-sections/panels/SectionBasicsPanel.tsx +27 -0
- package/src/components/report-sections/report-section-preview-modal.component.tsx +548 -0
- package/src/components/report-sections/report-sections-page.component.tsx +325 -0
- package/src/components/report-sections/section-disaggregation.utils.ts +637 -0
- package/src/components/report-sections/section-types.ts +55 -0
- package/src/components/report-sections/section-utils.ts +50 -0
- package/src/components/report-sections/sections-page.scss +79 -0
- package/src/components/run-reports/run-reports-page.component.tsx +8 -0
- package/src/components/security/access-denied-page.component.tsx +64 -0
- package/src/components/security/access-denied-page.scss +39 -0
- package/src/components/security/privilege-route.component.test.tsx +76 -0
- package/src/components/security/privilege-route.component.tsx +39 -0
- package/src/components/shared/compile-setup-modal.component.tsx +182 -0
- package/src/components/shared/concept-selector.component.tsx +245 -0
- package/src/components/shared/concept-selector.scss +121 -0
- package/src/components/shared/header/builder-header-actions.component.tsx +38 -0
- package/src/components/shared/header/header.component.tsx +85 -0
- package/src/components/shared/header/header.scss +151 -0
- package/src/components/shared/header/illustration.component.tsx +34 -0
- package/src/components/shared/indicator-properties-panel/IndicatorPropertiesPanel.scss +33 -0
- package/src/components/shared/indicator-properties-panel/IndicatorPropertiesPanel.tsx +389 -0
- package/src/components/shared/json-preview-panel/JsonPreviewPanel.scss +32 -0
- package/src/components/shared/json-preview-panel/JsonPreviewPanel.tsx +104 -0
- package/src/components/shared/mapping-preview-panel/mapping-preview-panel.component.tsx +82 -0
- package/src/components/shared/mapping-preview-panel/mapping-preview-panel.scss +55 -0
- package/src/components/shared/preview/query-results-preview.component.tsx +204 -0
- package/src/components/shared/template-structure-panel/template-structure-panel.component.tsx +296 -0
- package/src/components/shared/template-structure-panel/template-structure-panel.scss +81 -0
- package/src/config-schema.ts +43 -0
- package/src/constants/privileges.test.ts +54 -0
- package/src/constants/privileges.ts +118 -0
- package/src/features/dashboards/DashboardRendererPage.tsx +174 -0
- package/src/features/dashboards/DashboardsPage.tsx +164 -0
- package/src/features/dashboards/EtlDashboardPage.tsx +32 -0
- package/src/features/dashboards/components/DashboardEmptyState.tsx +41 -0
- package/src/features/dashboards/components/DashboardGrid.tsx +48 -0
- package/src/features/dashboards/components/DashboardHeader.tsx +58 -0
- package/src/features/dashboards/components/DashboardSection.tsx +46 -0
- package/src/features/dashboards/components/ReportLaunchCard.tsx +51 -0
- package/src/features/dashboards/components/WidgetSlotDispatcher.tsx +61 -0
- package/src/features/dashboards/components/WidgetUnavailableCard.tsx +36 -0
- package/src/features/dashboards/dashboards.scss +196 -0
- package/src/features/dashboards/hooks/useDashboard.ts +61 -0
- package/src/features/dashboards/hooks/useDashboardWidgets.ts +74 -0
- package/src/features/dashboards/hooks/useDashboards.ts +56 -0
- package/src/features/dashboards/hooks/useMonitorDataMap.ts +84 -0
- package/src/features/dashboards/index.ts +11 -0
- package/src/features/dashboards/utils/dashboard-config.util.test.ts +286 -0
- package/src/features/dashboards/utils/dashboard-config.util.ts +382 -0
- package/src/features/report-visualizer/ReportVisualizerPage.tsx +448 -0
- package/src/features/report-visualizer/components/Export/ExportMenu.tsx +141 -0
- package/src/features/report-visualizer/components/Export/index.ts +2 -0
- package/src/features/report-visualizer/components/ReportExplorer/QuickFilters.tsx +152 -0
- package/src/features/report-visualizer/components/ReportExplorer/ReportCategoryFilter.tsx +54 -0
- package/src/features/report-visualizer/components/ReportExplorer/ReportExplorerPanel.tsx +201 -0
- package/src/features/report-visualizer/components/ReportExplorer/ReportExplorerRail.tsx +202 -0
- package/src/features/report-visualizer/components/ReportExplorer/ReportList.tsx +287 -0
- package/src/features/report-visualizer/components/ReportExplorer/ReportSearch.tsx +151 -0
- package/src/features/report-visualizer/components/ReportExplorer/ReportTagFilter.tsx +100 -0
- package/src/features/report-visualizer/components/ReportExplorer/RunReportButton.tsx +42 -0
- package/src/features/report-visualizer/components/ReportExplorer/RuntimeParameterForm.tsx +259 -0
- package/src/features/report-visualizer/components/ReportExplorer/index.ts +8 -0
- package/src/features/report-visualizer/components/ReportWorkspace/ReportLayer.tsx +33 -0
- package/src/features/report-visualizer/components/ReportWorkspace/ReportSummary.tsx +88 -0
- package/src/features/report-visualizer/components/ReportWorkspace/ReportViewTabs.tsx +72 -0
- package/src/features/report-visualizer/components/ReportWorkspace/ReportWorkspaceHeader.tsx +92 -0
- package/src/features/report-visualizer/components/ReportWorkspace/ReportWorkspacePanel.tsx +242 -0
- package/src/features/report-visualizer/components/ReportWorkspace/index.ts +5 -0
- package/src/features/report-visualizer/components/TableView/ColumnVisibilityMenu.tsx +206 -0
- package/src/features/report-visualizer/components/TableView/ReportTable.tsx +253 -0
- package/src/features/report-visualizer/components/TableView/index.ts +2 -0
- package/src/features/report-visualizer/hooks/index.ts +4 -0
- package/src/features/report-visualizer/hooks/useExplorerPreferences.ts +103 -0
- package/src/features/report-visualizer/hooks/useReportCapabilities.ts +112 -0
- package/src/features/report-visualizer/hooks/useReportParameters.ts +152 -0
- package/src/features/report-visualizer/hooks/useReports.ts +135 -0
- package/src/features/report-visualizer/index.ts +6 -0
- package/src/features/report-visualizer/report-visualizer.scss +593 -0
- package/src/features/report-visualizer/types/index.ts +1 -0
- package/src/features/report-visualizer/types/report-visualizer.types.ts +104 -0
- package/src/features/report-visualizer/utils/status-colors.ts +117 -0
- package/src/globals.d.ts +9 -0
- package/src/hooks/address-template.ts +86 -0
- package/src/hooks/concept.ts +112 -0
- package/src/hooks/indicator/index.ts +1 -0
- package/src/hooks/indicator/useIndicatorsByTheme.ts +41 -0
- package/src/hooks/openmrs-reference-data.ts +432 -0
- package/src/hooks/theme/index.ts +4 -0
- package/src/hooks/theme/useDataTheme.ts +61 -0
- package/src/hooks/theme/useDataThemes.ts +28 -0
- package/src/hooks/theme/useMambaTableMeta.ts +34 -0
- package/src/hooks/theme/useMambaTables.ts +95 -0
- package/src/hooks/use-report-builder-privileges.test.tsx +92 -0
- package/src/hooks/use-report-builder-privileges.ts +58 -0
- package/src/index.ts +29 -0
- package/src/resources/address-template/address-template.api.ts +180 -0
- package/src/resources/agegroup/agegroups.api.ts +58 -0
- package/src/resources/concept/concept.api.ts +116 -0
- package/src/resources/concepts/concept-mapper.ts +21 -0
- package/src/resources/concepts/concept-types.ts +31 -0
- package/src/resources/concepts/concepts.resource.ts +44 -0
- package/src/resources/concepts/useConceptSearch.ts +41 -0
- package/src/resources/dashboard/dashboard.api.ts +107 -0
- package/src/resources/etl-monitor/etl-monitor-test.api.ts +409 -0
- package/src/resources/etl-monitor/etl-monitor.api.ts +381 -0
- package/src/resources/etl-source/etl-source.api.ts +65 -0
- package/src/resources/etl-task/etl-task.api.ts +96 -0
- package/src/resources/etl-task/etl-task.types.ts +31 -0
- package/src/resources/indicator/indicators.api.ts +125 -0
- package/src/resources/legacy-reports/legacy-reports.api.ts +144 -0
- package/src/resources/linelist/linelist-reports.api.ts +616 -0
- package/src/resources/location/location.api.ts +135 -0
- package/src/resources/openmrs-api.ts +40 -0
- package/src/resources/patient-identifier-type/patient-identifier-type.api.ts +65 -0
- package/src/resources/person-attribute-type/person-attribute-type.api.ts +71 -0
- package/src/resources/preview/sql-preview.api.ts +54 -0
- package/src/resources/report/reports.api.ts +140 -0
- package/src/resources/report-category/report-category.api.ts +41 -0
- package/src/resources/report-import-export/import-export-api.ts +164 -0
- package/src/resources/report-library/report-library.api.ts +63 -0
- package/src/resources/report-section/report-sections.api.ts +73 -0
- package/src/resources/report-section/section-preview.api.ts +25 -0
- package/src/resources/theme/data-theme.api.ts +88 -0
- package/src/resources/theme/etl-schema.api.ts +101 -0
- package/src/resources/theme/etl-table-meta.api.ts +45 -0
- package/src/root.component.tsx +20 -0
- package/src/routes/report-builder.routes.tsx +160 -0
- package/src/routes/report-builder.scss +56 -0
- package/src/routes.json +31 -0
- package/src/sample-template.ts +121 -0
- package/src/template-utils.ts +110 -0
- package/src/types/carbon-react-inert.d.ts +13 -0
- package/src/types/condition-operators.ts +63 -0
- package/src/types/dashboard/dashboard.types.ts +137 -0
- package/src/types/dashboard/index.ts +4 -0
- package/src/types/etl/etl-types.ts +238 -0
- package/src/types/etl-monitor/etl-monitor-builder.types.ts +555 -0
- package/src/types/etl-monitor/etl-monitor-v2.types.ts +397 -0
- package/src/types/etl-monitor/etl-monitor.types.ts +188 -0
- package/src/types/etl-monitor/index.ts +6 -0
- package/src/types/linelist/compile-config.ts +455 -0
- package/src/types/linelist-types.ts +2059 -0
- package/src/types/theme/data-theme.types.ts +88 -0
- package/src/utils/api-error.utils.test.ts +147 -0
- package/src/utils/api-error.utils.ts +131 -0
- package/src/utils/config-enhancer.ts +62 -0
- package/src/utils/etl-browser/etl-browser.util.test.ts +151 -0
- package/src/utils/etl-browser/export-csv.util.ts +43 -0
- package/src/utils/etl-browser/group-tables.util.ts +84 -0
- package/src/utils/etl-browser/index.ts +4 -0
- package/src/utils/etl-browser/summarize-columns.util.ts +27 -0
- package/src/utils/etl-browser/table-sql.util.ts +20 -0
- package/src/utils/etl-monitor/config-v2-adapter.util.ts +460 -0
- package/src/utils/etl-monitor/endpoint-config-normalizer.util.ts +383 -0
- package/src/utils/etl-monitor/index.ts +10 -0
- package/src/utils/etl-monitor/jsonpath-resolver.util.ts +118 -0
- package/src/utils/etl-monitor/normalization-examples.ts +0 -0
- package/src/utils/etl-monitor/schema-inspector.util.ts +76 -0
- package/src/utils/etl-monitor/semantic-type-detector.util.ts +76 -0
- package/src/utils/etl-monitor/status-mapper.util.ts +105 -0
- package/src/utils/etl-monitor/value-formatters.util.ts +167 -0
- package/src/utils/etl-task/etl-task-card.util.test.ts +240 -0
- package/src/utils/etl-task/etl-task-card.util.ts +276 -0
- package/src/utils/etl-task/index.ts +1 -0
- package/src/utils/html-entities.utils.ts +34 -0
- package/src/utils/parameter-resolution.ts +218 -0
- package/src/views/etl-monitor-builder/add-monitor-modal.component.scss +0 -0
- package/src/views/etl-monitor-builder/add-monitor-modal.component.tsx +210 -0
- package/src/views/etl-monitor-builder/etl-monitor-builder.component.scss +157 -0
- package/src/views/etl-monitor-builder/etl-monitor-builder.component.tsx +252 -0
- package/src/views/etl-monitor-builder/etl-monitor-builder.store.ts +126 -0
- package/tools/i18next-parser.config.js +0 -0
- package/tools/setup-tests.ts +1 -0
- package/tools/update-openmrs-deps.mjs +42 -0
- package/translations/am.json +65 -0
- package/translations/ar.json +65 -0
- package/translations/ar_SY.json +65 -0
- package/translations/bn.json +65 -0
- package/translations/cs.json +65 -0
- package/translations/de.json +65 -0
- package/translations/en.json +65 -0
- package/translations/en_US.json +65 -0
- package/translations/es.json +65 -0
- package/translations/es_MX.json +65 -0
- package/translations/fr.json +65 -0
- package/translations/he.json +65 -0
- package/translations/hi.json +65 -0
- package/translations/hi_IN.json +65 -0
- package/translations/id.json +65 -0
- package/translations/it.json +65 -0
- package/translations/ka.json +65 -0
- package/translations/km.json +65 -0
- package/translations/ku.json +65 -0
- package/translations/ky.json +65 -0
- package/translations/lg.json +65 -0
- package/translations/ne.json +65 -0
- package/translations/pl.json +65 -0
- package/translations/pt.json +65 -0
- package/translations/pt_BR.json +65 -0
- package/translations/qu.json +65 -0
- package/translations/ro_RO.json +65 -0
- package/translations/ru_RU.json +65 -0
- package/translations/si.json +65 -0
- package/translations/sq.json +65 -0
- package/translations/sw.json +65 -0
- package/translations/sw_KE.json +65 -0
- package/translations/tr.json +65 -0
- package/translations/tr_TR.json +65 -0
- package/translations/uk.json +65 -0
- package/translations/uz.json +65 -0
- package/translations/uz@Latn.json +65 -0
- package/translations/uz_UZ.json +65 -0
- package/translations/vi.json +65 -0
- package/translations/zh.json +65 -0
- package/translations/zh_CN.json +65 -0
- package/translations/zh_TW.json +65 -0
- package/tsconfig.json +24 -0
- package/vitest.config.mts +42 -0
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linelist Reports API
|
|
3
|
+
*
|
|
4
|
+
* API client for linelist report definitions.
|
|
5
|
+
* Linelists are standalone reports (not sections) that return patient lists.
|
|
6
|
+
*
|
|
7
|
+
* Uses the existing /reportbuilder/reportdefinition endpoint with reportType: 'LINE_LIST'
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { omrsGet, omrsPost } from '../openmrs-api';
|
|
11
|
+
import { decodeHtmlEntities } from '../../utils/html-entities.utils';
|
|
12
|
+
import type {
|
|
13
|
+
LinelistReportDto,
|
|
14
|
+
LinelistReportDefinitionConfig,
|
|
15
|
+
LinelistParameter,
|
|
16
|
+
} from '../../types/linelist-types';
|
|
17
|
+
import { compileToBackendConfig } from '../../types/linelist/compile-config';
|
|
18
|
+
|
|
19
|
+
const RESOURCE = '/reportbuilder/report';
|
|
20
|
+
|
|
21
|
+
type RestList<T> = { results?: T[] } & Record<string, any>;
|
|
22
|
+
|
|
23
|
+
function unwrapRestList<T>(data: RestList<T> | T[] | undefined): T[] {
|
|
24
|
+
if (!data) return [];
|
|
25
|
+
if (Array.isArray(data)) return data;
|
|
26
|
+
return Array.isArray(data.results) ? data.results : [];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type RestRep = 'default' | 'full';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Extended report DTO with linelist-specific fields
|
|
33
|
+
*/
|
|
34
|
+
export type LinelistReportDefinitionDto = LinelistReportDto & {
|
|
35
|
+
configJson?: string; // LinelistReportDefinitionConfig as JSON string
|
|
36
|
+
baseCohortDefinition?: any;
|
|
37
|
+
dataSetDefinitions?: any[];
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* List linelist reports
|
|
42
|
+
*/
|
|
43
|
+
export type ListLinelistReportsParams = {
|
|
44
|
+
q?: string;
|
|
45
|
+
includeRetired?: boolean;
|
|
46
|
+
v?: RestRep;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Save linelist report payload
|
|
51
|
+
*/
|
|
52
|
+
export type SaveLinelistReportPayload = {
|
|
53
|
+
name: string;
|
|
54
|
+
description?: string;
|
|
55
|
+
code?: string;
|
|
56
|
+
reportType: 'LINE_LIST';
|
|
57
|
+
configJson: string;
|
|
58
|
+
metaJson?: string;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Normalize report DTO by decoding HTML entities in JSON fields
|
|
63
|
+
*/
|
|
64
|
+
function normalizeLinelistReportDto(
|
|
65
|
+
report: LinelistReportDefinitionDto
|
|
66
|
+
): LinelistReportDefinitionDto {
|
|
67
|
+
return {
|
|
68
|
+
...report,
|
|
69
|
+
configJson: report.configJson
|
|
70
|
+
? decodeHtmlEntities(report.configJson)
|
|
71
|
+
: report.configJson,
|
|
72
|
+
metaJson: report.metaJson
|
|
73
|
+
? decodeHtmlEntities(report.metaJson)
|
|
74
|
+
: report.metaJson,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Parse configJson into LinelistReportDefinitionConfig
|
|
80
|
+
*/
|
|
81
|
+
export function parseLinelistConfig(
|
|
82
|
+
report: LinelistReportDefinitionDto
|
|
83
|
+
): LinelistReportDefinitionConfig | null {
|
|
84
|
+
if (!report.configJson) return null;
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(report.configJson);
|
|
88
|
+
if (parsed && typeof parsed === 'object' && parsed.type === 'LINE_LIST') {
|
|
89
|
+
return parsed as LinelistReportDefinitionConfig;
|
|
90
|
+
}
|
|
91
|
+
} catch (e) {
|
|
92
|
+
console.error('Failed to parse linelist config:', e);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Parse parameters from metaJson (with fallback to configJson)
|
|
100
|
+
* This is used for reports from the report library which may only have metaJson
|
|
101
|
+
* and need dynamic parameter options (e.g., LIST parameter options)
|
|
102
|
+
*/
|
|
103
|
+
export function parseLinelistParameters(
|
|
104
|
+
report: LinelistReportDefinitionDto
|
|
105
|
+
): LinelistParameter[] {
|
|
106
|
+
// First try to get parameters from metaJson (may have dynamic options)
|
|
107
|
+
if (report.metaJson) {
|
|
108
|
+
try {
|
|
109
|
+
const meta = JSON.parse(report.metaJson);
|
|
110
|
+
if (meta?.parameters && Array.isArray(meta.parameters) && meta.parameters.length > 0) {
|
|
111
|
+
return meta.parameters as LinelistParameter[];
|
|
112
|
+
}
|
|
113
|
+
} catch (e) {
|
|
114
|
+
console.warn('Failed to parse metaJson parameters:', e);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Fallback to configJson parameters
|
|
119
|
+
const config = parseLinelistConfig(report);
|
|
120
|
+
return config?.parameters || [];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* List all linelist reports
|
|
125
|
+
*
|
|
126
|
+
* @param params - Query parameters
|
|
127
|
+
* @param signal - AbortSignal for cancellation
|
|
128
|
+
* @returns Array of linelist report definitions
|
|
129
|
+
*/
|
|
130
|
+
export async function listLinelistReports(
|
|
131
|
+
params?: ListLinelistReportsParams,
|
|
132
|
+
signal?: AbortSignal
|
|
133
|
+
): Promise<LinelistReportDefinitionDto[]> {
|
|
134
|
+
const q = params?.q?.trim();
|
|
135
|
+
const includeRetired = params?.includeRetired === true;
|
|
136
|
+
const v = params?.v ?? 'default';
|
|
137
|
+
|
|
138
|
+
const qs = new URLSearchParams();
|
|
139
|
+
qs.set('v', v);
|
|
140
|
+
|
|
141
|
+
// Filter for LINE_LIST report type
|
|
142
|
+
// Note: Backend may not support reportType filter yet, so we'll filter client-side
|
|
143
|
+
if (q) qs.set('q', q);
|
|
144
|
+
if (includeRetired) qs.set('includeRetired', 'true');
|
|
145
|
+
|
|
146
|
+
const data = await omrsGet<
|
|
147
|
+
RestList<LinelistReportDefinitionDto> | LinelistReportDefinitionDto[] | undefined
|
|
148
|
+
>(`${RESOURCE}?${qs.toString()}`, signal);
|
|
149
|
+
|
|
150
|
+
const allReports = unwrapRestList(data)
|
|
151
|
+
.filter((x) => Boolean(x?.uuid))
|
|
152
|
+
.map(normalizeLinelistReportDto);
|
|
153
|
+
|
|
154
|
+
// Filter for LINE_LIST reports client-side if backend doesn't support the filter
|
|
155
|
+
return allReports.filter(
|
|
156
|
+
(report) => report.reportType === 'LINE_LIST' || parseLinelistConfig(report)?.type === 'LINE_LIST'
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Get a single linelist report by UUID
|
|
162
|
+
*
|
|
163
|
+
* @param uuid - Report UUID
|
|
164
|
+
* @param signal - AbortSignal for cancellation
|
|
165
|
+
* @param v - Representation version
|
|
166
|
+
* @returns Linelist report definition
|
|
167
|
+
*/
|
|
168
|
+
export async function getLinelistReport(
|
|
169
|
+
uuid: string,
|
|
170
|
+
signal?: AbortSignal,
|
|
171
|
+
v: RestRep = 'full'
|
|
172
|
+
): Promise<LinelistReportDefinitionDto> {
|
|
173
|
+
const report = await omrsGet<LinelistReportDefinitionDto>(
|
|
174
|
+
`${RESOURCE}/${encodeURIComponent(uuid)}?v=${v}`,
|
|
175
|
+
signal
|
|
176
|
+
);
|
|
177
|
+
return normalizeLinelistReportDto(report);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Create a new linelist report
|
|
182
|
+
*
|
|
183
|
+
* @param payload - Report definition payload
|
|
184
|
+
* @param signal - AbortSignal for cancellation
|
|
185
|
+
* @returns Created report definition
|
|
186
|
+
*/
|
|
187
|
+
export async function createLinelistReport(
|
|
188
|
+
payload: SaveLinelistReportPayload,
|
|
189
|
+
signal?: AbortSignal
|
|
190
|
+
): Promise<LinelistReportDefinitionDto> {
|
|
191
|
+
const report = await omrsPost<LinelistReportDefinitionDto>(RESOURCE, payload, signal);
|
|
192
|
+
return normalizeLinelistReportDto(report);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Update an existing linelist report
|
|
197
|
+
*
|
|
198
|
+
* @param uuid - Report UUID to update
|
|
199
|
+
* @param payload - Updated report definition payload
|
|
200
|
+
* @param signal - AbortSignal for cancellation
|
|
201
|
+
* @returns Updated report definition
|
|
202
|
+
*/
|
|
203
|
+
export async function updateLinelistReport(
|
|
204
|
+
uuid: string,
|
|
205
|
+
payload: SaveLinelistReportPayload,
|
|
206
|
+
signal?: AbortSignal
|
|
207
|
+
): Promise<LinelistReportDefinitionDto> {
|
|
208
|
+
const report = await omrsPost<LinelistReportDefinitionDto>(
|
|
209
|
+
`${RESOURCE}/${encodeURIComponent(uuid)}`,
|
|
210
|
+
payload,
|
|
211
|
+
signal
|
|
212
|
+
);
|
|
213
|
+
return normalizeLinelistReportDto(report);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Delete/retire a linelist report
|
|
218
|
+
*
|
|
219
|
+
* @param uuid - Report UUID to delete
|
|
220
|
+
* @param reason - Reason for deletion
|
|
221
|
+
* @param signal - AbortSignal for cancellation
|
|
222
|
+
*/
|
|
223
|
+
export async function deleteLinelistReport(
|
|
224
|
+
uuid: string,
|
|
225
|
+
reason = 'Retired from Report Builder',
|
|
226
|
+
signal?: AbortSignal
|
|
227
|
+
): Promise<void> {
|
|
228
|
+
const qs = new URLSearchParams();
|
|
229
|
+
qs.set('reason', reason);
|
|
230
|
+
return omrsDelete(`${RESOURCE}/${encodeURIComponent(uuid)}?${qs.toString()}`, signal);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Import omrsDelete function
|
|
235
|
+
* This may need to be added to openmrs-api.ts
|
|
236
|
+
*/
|
|
237
|
+
async function omrsDelete(url: string, signal?: AbortSignal): Promise<void> {
|
|
238
|
+
const response = await fetch(url, {
|
|
239
|
+
method: 'DELETE',
|
|
240
|
+
signal,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
if (!response.ok) {
|
|
244
|
+
const error = await response.text();
|
|
245
|
+
throw new Error(error || 'Failed to delete resource');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Evaluate a linelist report
|
|
251
|
+
*
|
|
252
|
+
* Uses the existing /reportingDefinition endpoint with renderType=list
|
|
253
|
+
*
|
|
254
|
+
* @param params - Evaluation parameters
|
|
255
|
+
* @param signal - AbortSignal for cancellation
|
|
256
|
+
* @returns Evaluation result with patient rows
|
|
257
|
+
*/
|
|
258
|
+
export type LinelistEvaluationParams = {
|
|
259
|
+
reportDefinitionUuid?: string; // The compiled report definition UUID (from compile result)
|
|
260
|
+
reportLibraryUuid?: string; // Alternative: use report library UUID to resolve the report definition
|
|
261
|
+
parameters?: Record<string, any>; // Dynamic parameters from report config
|
|
262
|
+
startDate?: string; // Deprecated: Use parameters instead
|
|
263
|
+
endDate?: string; // Deprecated: Use parameters instead
|
|
264
|
+
maxRows?: number;
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
export type LinelistEvaluationResult = {
|
|
268
|
+
success: boolean;
|
|
269
|
+
data?: Record<string, any[]>; // Dataset name -> array of patient rows
|
|
270
|
+
error?: string;
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Compile linelist report payload
|
|
275
|
+
*/
|
|
276
|
+
export type CompileLinelistReportPayload = {
|
|
277
|
+
reportUuid: string;
|
|
278
|
+
category?: string; // Optional category UUID/name to add report to library
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Compile linelist report result
|
|
283
|
+
*/
|
|
284
|
+
export type CompileLinelistReportResult = {
|
|
285
|
+
reportUuid: string;
|
|
286
|
+
reportDefinitionUuid?: string;
|
|
287
|
+
reportDefinitionName?: string;
|
|
288
|
+
reportDesignPath?: string;
|
|
289
|
+
compiled?: boolean;
|
|
290
|
+
addedToLibrary?: boolean;
|
|
291
|
+
reportLibraryUuid?: string;
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
export async function evaluateLinelistReport(
|
|
295
|
+
params: LinelistEvaluationParams,
|
|
296
|
+
signal?: AbortSignal
|
|
297
|
+
): Promise<LinelistEvaluationResult> {
|
|
298
|
+
// Use reportDefinitionUuid (from compile result) or reportLibraryUuid
|
|
299
|
+
const uuid = params.reportDefinitionUuid || params.reportLibraryUuid;
|
|
300
|
+
if (!uuid) {
|
|
301
|
+
return {
|
|
302
|
+
success: false,
|
|
303
|
+
error: 'Either reportDefinitionUuid or reportLibraryUuid is required',
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const qs = new URLSearchParams();
|
|
308
|
+
qs.set('uuid', uuid);
|
|
309
|
+
qs.set('renderType', 'list'); // Get patient list data
|
|
310
|
+
|
|
311
|
+
// Support both new parameters format and legacy startDate/endDate
|
|
312
|
+
if (params.parameters) {
|
|
313
|
+
// Add all parameters from the report config
|
|
314
|
+
Object.entries(params.parameters).forEach(([key, value]) => {
|
|
315
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
316
|
+
qs.set(key, String(value));
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
} else {
|
|
320
|
+
// Legacy support for hardcoded startDate/endDate
|
|
321
|
+
if (params.startDate) {
|
|
322
|
+
qs.set('startDate', params.startDate);
|
|
323
|
+
}
|
|
324
|
+
if (params.endDate) {
|
|
325
|
+
qs.set('endDate', params.endDate);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
if (params.maxRows) {
|
|
330
|
+
qs.set('maxRows', String(params.maxRows));
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const response = await fetch(
|
|
334
|
+
`/openmrs/ws/rest/v1/reportbuilder/reportingDefinition?${qs.toString()}`,
|
|
335
|
+
{
|
|
336
|
+
method: 'GET',
|
|
337
|
+
signal,
|
|
338
|
+
headers: {
|
|
339
|
+
'Content-Type': 'application/json',
|
|
340
|
+
},
|
|
341
|
+
}
|
|
342
|
+
);
|
|
343
|
+
|
|
344
|
+
if (!response.ok) {
|
|
345
|
+
const error = await response.text();
|
|
346
|
+
return {
|
|
347
|
+
success: false,
|
|
348
|
+
error: error || 'Failed to evaluate linelist report',
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const data = await response.json();
|
|
353
|
+
|
|
354
|
+
return {
|
|
355
|
+
success: true,
|
|
356
|
+
data,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Compile a linelist report
|
|
362
|
+
*
|
|
363
|
+
* Uses the same /reportbuilder/reportcompile endpoint as aggregate reports.
|
|
364
|
+
* This generates the runtime report definition from the saved linelist report.
|
|
365
|
+
*
|
|
366
|
+
* @param reportUuid - The UUID of the saved linelist report to compile
|
|
367
|
+
* @param category - Optional category UUID/name to add the compiled report to library
|
|
368
|
+
* @param signal - AbortSignal for cancellation
|
|
369
|
+
* @returns Compile result with report definition UUID and status
|
|
370
|
+
*/
|
|
371
|
+
export async function compileLinelistReport(
|
|
372
|
+
reportUuid: string,
|
|
373
|
+
category?: string,
|
|
374
|
+
signal?: AbortSignal
|
|
375
|
+
): Promise<CompileLinelistReportResult> {
|
|
376
|
+
const payload: CompileLinelistReportPayload = { reportUuid, category };
|
|
377
|
+
console.log('compileLinelistReport sending:', payload);
|
|
378
|
+
return omrsPost<CompileLinelistReportResult>('/reportbuilder/reportcompile', payload, signal);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Builder-specific metadata stored in metaJson so the editor can reconstruct
|
|
383
|
+
* the full draft (indicators selected, build method, display settings, etc.)
|
|
384
|
+
* when re-opening a report for editing.
|
|
385
|
+
*/
|
|
386
|
+
export type LinelistBuilderMeta = {
|
|
387
|
+
buildMethod?: 'SQL_BUILDER' | 'VISUAL_FILTER' | 'INDICATOR_BASED';
|
|
388
|
+
/** Population sources used for SQL_BUILDER and HYBRID modes */
|
|
389
|
+
populationSources?: Array<{
|
|
390
|
+
uuid: string;
|
|
391
|
+
name: string;
|
|
392
|
+
type: 'ETL' | 'CORE' | 'REFERENCE' | 'SQL' | 'INDICATOR';
|
|
393
|
+
joinType: 'JOIN' | 'LEFT_JOIN' | 'INTERSECT' | 'UNION' | 'EXCEPT';
|
|
394
|
+
enabled: boolean;
|
|
395
|
+
order: number;
|
|
396
|
+
}>;
|
|
397
|
+
/** Indicator rules used to build the population (for INDICATOR_BASED mode) */
|
|
398
|
+
indicatorRules?: Array<{
|
|
399
|
+
id: string;
|
|
400
|
+
indicatorUuid: string;
|
|
401
|
+
name: string;
|
|
402
|
+
conditions?: Array<{ key: string; operator?: string; value: any }>;
|
|
403
|
+
logicalOperator?: 'AND' | 'OR';
|
|
404
|
+
negate?: boolean;
|
|
405
|
+
}>;
|
|
406
|
+
/** Visual filter state for reconstructing the filter UI */
|
|
407
|
+
visualFilter?: {
|
|
408
|
+
rootGroup: {
|
|
409
|
+
id: string;
|
|
410
|
+
logicalOperator: 'AND' | 'OR';
|
|
411
|
+
conditions: Array<{
|
|
412
|
+
id: string;
|
|
413
|
+
field: string;
|
|
414
|
+
fieldLabel: string;
|
|
415
|
+
fieldType: string;
|
|
416
|
+
operator: string;
|
|
417
|
+
value?: string | string[];
|
|
418
|
+
value2?: string;
|
|
419
|
+
negate?: boolean;
|
|
420
|
+
}>;
|
|
421
|
+
nestedGroups?: any[];
|
|
422
|
+
};
|
|
423
|
+
useVisualBuilder: boolean;
|
|
424
|
+
};
|
|
425
|
+
/** Filter map for parameter-to-column mapping */
|
|
426
|
+
filterMap?: {
|
|
427
|
+
[parameterName: string]: string;
|
|
428
|
+
};
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Convert LinelistReportDefinitionConfig to SaveLinelistReportPayload
|
|
433
|
+
*
|
|
434
|
+
* Compiles the builder's intermediate config into the backend's expected format.
|
|
435
|
+
* The builder state needed for editing (indicators, build method, data sources)
|
|
436
|
+
* is preserved inside the configJson under a `_builder` key and also in metaJson.
|
|
437
|
+
*
|
|
438
|
+
* @param config - The builder's intermediate configuration
|
|
439
|
+
* @param meta - Report name/description/code
|
|
440
|
+
* @param builderMeta - Builder state (indicators, build method) for edit reconstruction
|
|
441
|
+
*/
|
|
442
|
+
export function configToSavePayload(
|
|
443
|
+
config: LinelistReportDefinitionConfig,
|
|
444
|
+
meta: { name: string; description?: string; code?: string; categoryUuid?: string },
|
|
445
|
+
builderMeta?: LinelistBuilderMeta
|
|
446
|
+
): SaveLinelistReportPayload {
|
|
447
|
+
// Compile to the backend's final format
|
|
448
|
+
const compiled = compileToBackendConfig(config, meta);
|
|
449
|
+
|
|
450
|
+
// Preserve builder state inside configJson (under _builder) so the editor
|
|
451
|
+
// can reconstruct the draft on re-open. The backend ignores this key.
|
|
452
|
+
const configWithBuilder = {
|
|
453
|
+
...compiled,
|
|
454
|
+
_builder: {
|
|
455
|
+
dataSources: config.dataSources,
|
|
456
|
+
populationSources: builderMeta?.populationSources,
|
|
457
|
+
rowGrain: config.rowGrain,
|
|
458
|
+
templateId: config.templateId,
|
|
459
|
+
buildMethod: builderMeta?.buildMethod || config.buildMethod,
|
|
460
|
+
indicatorRules: builderMeta?.indicatorRules || config.indicatorRules,
|
|
461
|
+
categoryUuid: config.categoryUuid,
|
|
462
|
+
visualFilter: builderMeta?.visualFilter,
|
|
463
|
+
filterMap: builderMeta?.filterMap,
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
return {
|
|
468
|
+
name: meta.name,
|
|
469
|
+
description: meta.description,
|
|
470
|
+
code: meta.code,
|
|
471
|
+
reportType: 'LINE_LIST',
|
|
472
|
+
configJson: JSON.stringify(configWithBuilder),
|
|
473
|
+
metaJson: builderMeta ? JSON.stringify(builderMeta) : undefined,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Preview a linelist report before saving
|
|
479
|
+
*
|
|
480
|
+
* This function creates a temporary draft report, compiles it, evaluates it,
|
|
481
|
+
* and then deletes the temporary report. The user gets to see preview data
|
|
482
|
+
* without cluttering their report list.
|
|
483
|
+
*
|
|
484
|
+
* If a cachedReportDefinitionUuid is provided, the compilation step is skipped
|
|
485
|
+
* to avoid unnecessary recompilation.
|
|
486
|
+
*
|
|
487
|
+
* @param params - Preview parameters including config and optional parameters
|
|
488
|
+
* @param signal - AbortSignal for cancellation
|
|
489
|
+
* @returns Preview result with data or error
|
|
490
|
+
*/
|
|
491
|
+
export type PreviewLinelistParams = {
|
|
492
|
+
reportUuid: string; // UUID of the draft report to preview
|
|
493
|
+
config: LinelistReportDefinitionConfig;
|
|
494
|
+
parameters?: Record<string, any>;
|
|
495
|
+
maxRows?: number;
|
|
496
|
+
cachedReportDefinitionUuid?: string; // Cached compiled report UUID to skip recompilation
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
export type PreviewLinelistResult = {
|
|
500
|
+
success: boolean;
|
|
501
|
+
data?: {
|
|
502
|
+
columns: string[];
|
|
503
|
+
rows: Record<string, any>[];
|
|
504
|
+
rowCount: number;
|
|
505
|
+
html?: string; // HTML rendering from backend (for linelist reports)
|
|
506
|
+
};
|
|
507
|
+
error?: string;
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
export async function previewLinelistReport(
|
|
511
|
+
params: PreviewLinelistParams,
|
|
512
|
+
signal?: AbortSignal
|
|
513
|
+
): Promise<PreviewLinelistResult> {
|
|
514
|
+
const { reportUuid, config, parameters = {}, maxRows = 100, cachedReportDefinitionUuid } = params;
|
|
515
|
+
|
|
516
|
+
try {
|
|
517
|
+
// Step 1: Compile the report to get the reportDefinitionUuid
|
|
518
|
+
// Skip if cached UUID is provided
|
|
519
|
+
let reportDefinitionUuid = cachedReportDefinitionUuid;
|
|
520
|
+
|
|
521
|
+
if (!reportDefinitionUuid) {
|
|
522
|
+
const compileResult = await compileLinelistReport(reportUuid, config.categoryUuid, signal);
|
|
523
|
+
|
|
524
|
+
if (!compileResult.compiled || !compileResult.reportDefinitionUuid) {
|
|
525
|
+
return {
|
|
526
|
+
success: false,
|
|
527
|
+
error: 'Failed to compile report for preview',
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
reportDefinitionUuid = compileResult.reportDefinitionUuid;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// Step 2: Build parameter values from config defaults and overrides
|
|
534
|
+
const configParameters = config.parameters || [];
|
|
535
|
+
const paramValues: Record<string, any> = {};
|
|
536
|
+
|
|
537
|
+
for (const param of configParameters) {
|
|
538
|
+
if (param.defaultValue) {
|
|
539
|
+
paramValues[param.name] = param.defaultValue;
|
|
540
|
+
}
|
|
541
|
+
// Override with explicitly provided parameters
|
|
542
|
+
if (parameters && parameters[param.name] !== undefined) {
|
|
543
|
+
paramValues[param.name] = parameters[param.name];
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Default date range if no parameters provided at all
|
|
548
|
+
if (configParameters.length === 0) {
|
|
549
|
+
paramValues.startDate = parameters.startDate || getDefaultStartDate();
|
|
550
|
+
paramValues.endDate = parameters.endDate || new Date().toISOString().split('T')[0];
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// Step 3: Evaluate the compiled report with parameters
|
|
554
|
+
const evalParams: LinelistEvaluationParams = {
|
|
555
|
+
reportDefinitionUuid: reportDefinitionUuid,
|
|
556
|
+
parameters: paramValues,
|
|
557
|
+
maxRows,
|
|
558
|
+
};
|
|
559
|
+
|
|
560
|
+
const evalResult = await evaluateLinelistReport(evalParams, signal);
|
|
561
|
+
|
|
562
|
+
if (!evalResult.success) {
|
|
563
|
+
return {
|
|
564
|
+
success: false,
|
|
565
|
+
error: evalResult.error || 'Failed to evaluate report for preview',
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// Step 5: Transform the result into a preview format
|
|
570
|
+
// The evaluation returns data as Record<string, any[]> where the key is the dataset name
|
|
571
|
+
const datasets = evalResult.data;
|
|
572
|
+
const firstDataset = datasets ? Object.values(datasets)[0] : null;
|
|
573
|
+
|
|
574
|
+
// Extract HTML if available (for linelist reports)
|
|
575
|
+
const htmlData = datasets?._html ? datasets._html[0]?.html : null;
|
|
576
|
+
|
|
577
|
+
if (!firstDataset || !Array.isArray(firstDataset) || firstDataset.length === 0) {
|
|
578
|
+
return {
|
|
579
|
+
success: true,
|
|
580
|
+
data: {
|
|
581
|
+
columns: [],
|
|
582
|
+
rows: [],
|
|
583
|
+
rowCount: 0,
|
|
584
|
+
html: htmlData, // Include HTML even if no data
|
|
585
|
+
},
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
// Extract column names from the first row
|
|
590
|
+
const columns = Object.keys(firstDataset[0]);
|
|
591
|
+
|
|
592
|
+
return {
|
|
593
|
+
success: true,
|
|
594
|
+
data: {
|
|
595
|
+
columns,
|
|
596
|
+
rows: firstDataset,
|
|
597
|
+
rowCount: firstDataset.length,
|
|
598
|
+
html: htmlData, // Include HTML rendering
|
|
599
|
+
},
|
|
600
|
+
};
|
|
601
|
+
} catch (err) {
|
|
602
|
+
return {
|
|
603
|
+
success: false,
|
|
604
|
+
error: err instanceof Error ? err.message : 'Preview failed',
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* Get a default start date (30 days ago) for preview
|
|
611
|
+
*/
|
|
612
|
+
function getDefaultStartDate(): string {
|
|
613
|
+
const date = new Date();
|
|
614
|
+
date.setDate(date.getDate() - 30);
|
|
615
|
+
return date.toISOString().split('T')[0];
|
|
616
|
+
}
|