diff --git a/package.json b/package.json index 0aad246d1..dad752d7d 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@hookform/resolvers": "^3.1.1", "ace-builds": "^1.36.5", "classnames": "^2.3.2", + "file-loader": "^6.2.0", "fuzzy": "^0.1.3", "react-ace": "^13.0.0", "react-hook-form": "^7.45.1", diff --git a/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions-viewer.component.tsx b/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions-viewer.component.tsx index 35e125e0a..8244ad4dc 100644 --- a/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions-viewer.component.tsx +++ b/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions-viewer.component.tsx @@ -16,7 +16,7 @@ import { } from '@carbon/react'; import SchemaEditor from '../billable-exemptions/schema-editor/schema-editor.component'; import SchemaViewer from '../billable-exemptions/schema-editor/schema-viewer-component'; -import { useSystemBillableSetting } from '../../hooks/useSystemBillableSetting'; +import { useSystemBillableSetting } from '../../hooks/useExemptionSchema'; import ActionButtons from '../billable-exemptions/action-buttons/action-buttons.component'; import { EmptyState } from '@openmrs/esm-patient-common-lib'; import type { Schema } from '../../types'; @@ -115,11 +115,7 @@ export const BillableExemptionsViewer = () => {
- {isLoading ? ( - - ) : ( -

{t('exemptionSchema', 'Exemption Schema')}

- )} + {isLoading ? : ''}
{t('schemaEditor', 'Exemptions Schema Editor')} diff --git a/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions.scss b/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions.scss index 2160716c4..88fcbded5 100644 --- a/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions.scss +++ b/packages/esm-billing-app/src/billable-services/billable-exemptions/billable-exemptions.scss @@ -16,7 +16,7 @@ max-width: 100%; :global(.cds--tabs__nav-item--selected) { - border-bottom: 2px solid var(--cds-border-interactive, colors.$teal-70); + border-bottom: layout.$spacing-01 solid var(--cds-border-interactive, colors.$teal-70); outline: none !important; } } @@ -57,16 +57,16 @@ .heading { display: flex; - margin-right: 1rem; + margin-right: layout.$spacing-05; align-items: center; } .tabHeading { display: flex; align-items: center; @include type.type-style('heading-compact-01'); - min-height: 2.5rem; + min-height: layout.$spacing-05; width: 100%; - padding: 0.75rem; + padding: layout.$spacing-04; } .topBtns { diff --git a/packages/esm-billing-app/src/billable-services/billable-exemptions/modals/save-schema.modal.tsx b/packages/esm-billing-app/src/billable-services/billable-exemptions/modals/save-schema.modal.tsx index b6d32436b..bf0ab6618 100644 --- a/packages/esm-billing-app/src/billable-services/billable-exemptions/modals/save-schema.modal.tsx +++ b/packages/esm-billing-app/src/billable-services/billable-exemptions/modals/save-schema.modal.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, ComposedModal, Form, InlineLoading, ModalBody, ModalFooter, ModalHeader } from '@carbon/react'; import { showSnackbar } from '@openmrs/esm-framework'; -import { saveExemptionSchema, useSystemBillableSetting } from '../../../hooks/useSystemBillableSetting'; +import { saveExemptionSchema, useSystemBillableSetting } from '../../../hooks/useExemptionSchema'; import type { Schema } from '../../../types'; import styles from './save-schema-modal.scss'; diff --git a/packages/esm-billing-app/src/billable-services/billable-exemptions/schema-editor/schema-editor.component.tsx b/packages/esm-billing-app/src/billable-services/billable-exemptions/schema-editor/schema-editor.component.tsx index 09d72b50b..f59b086d4 100644 --- a/packages/esm-billing-app/src/billable-services/billable-exemptions/schema-editor/schema-editor.component.tsx +++ b/packages/esm-billing-app/src/billable-services/billable-exemptions/schema-editor/schema-editor.component.tsx @@ -1,12 +1,13 @@ import React, { useState } from 'react'; import AceEditor, { type IMarker } from 'react-ace'; +import 'ace-builds/webpack-resolver'; import debounce from 'lodash-es/debounce'; import Ajv from 'ajv'; import { useTranslation } from 'react-i18next'; import { ActionableNotification, Link } from '@carbon/react'; import { ChevronRight, ChevronLeft } from '@carbon/react/icons'; import styles from './schema-editor.scss'; -import { useStandardSchema } from '../../../hooks/useStandardSchema'; +import { useStandardSchema } from '../../../hooks/useExemptionSchema'; interface MarkerProps extends IMarker { text: string; @@ -149,7 +150,9 @@ const SchemaEditor: React.FC = ({
{errors.length && validationOn ? : null} ; } -const transformDataToTree = (data: Record, parentKey = 'root'): TreeNode[] => { +const transformDataToTree = (data: Record, parentKey = 'root'): Array => { return Object.entries(data).map(([key, value]) => { const nodeId = `${parentKey}-${key}`; const isObject = typeof value === 'object' && !Array.isArray(value); @@ -22,17 +21,10 @@ const transformDataToTree = (data: Record, parentKey = 'root'): Tre return { id: nodeId, label: isObject || Array.isArray(value) ? key : `${key}: ${value}`, - icon: - isObject || Array.isArray(value) ? ( - - ) : ( - - ), children: Array.isArray(value) ? value.map((item, index) => ({ id: `${nodeId}-${index}`, label: `${item.description} (${item.concept})`, - icon: , })) : isObject ? transformDataToTree(value, nodeId) @@ -53,7 +45,7 @@ const SchemaViewer: React.FC = ({ data }) => { } }, [data]); - const handleSelect = useCallback((selectedNodeIds: string[]) => { + const handleSelect = useCallback((selectedNodeIds: Array) => { setSelectedNodes(selectedNodeIds); }, []); @@ -69,7 +61,7 @@ const SchemaViewer: React.FC = ({ data }) => { }); }, []); - const renderTreeNodes = (nodes: TreeNode[]) => + const renderTreeNodes = (nodes: Array) => nodes.map((node) => { const isExpanded = expandedNodes.has(node.id); return ( @@ -77,7 +69,6 @@ const SchemaViewer: React.FC = ({ data }) => { key={node.id} id={node.id} label={node.label} - renderIcon={() => node.icon} isExpanded={isExpanded} onToggle={() => handleToggle(node.id)} multiselect={true} diff --git a/packages/esm-billing-app/src/hooks/useSystemBillableSetting.tsx b/packages/esm-billing-app/src/hooks/useExemptionSchema.tsx similarity index 74% rename from packages/esm-billing-app/src/hooks/useSystemBillableSetting.tsx rename to packages/esm-billing-app/src/hooks/useExemptionSchema.tsx index 6fc296508..0c879c4b5 100644 --- a/packages/esm-billing-app/src/hooks/useSystemBillableSetting.tsx +++ b/packages/esm-billing-app/src/hooks/useExemptionSchema.tsx @@ -33,3 +33,17 @@ export async function saveExemptionSchema(schema: Schema, key: string): Promise< body, }); } + +export function useStandardSchema(key: string) { + const { data, error, isLoading } = useSWRImmutable<{ data }, Error>( + `/ws/rest/v1/systemsetting?q=${key}&v=full`, + openmrsFetch, + ); + + return { + schema: data?.data, + schemaProperties: data?.data?.results?.find((resource) => resource.property === 'kenyaemr.billing.exemptions'), + error, + isLoading, + }; +} diff --git a/packages/esm-billing-app/src/hooks/useStandardSchema.ts b/packages/esm-billing-app/src/hooks/useStandardSchema.ts deleted file mode 100644 index bc8358bc0..000000000 --- a/packages/esm-billing-app/src/hooks/useStandardSchema.ts +++ /dev/null @@ -1,16 +0,0 @@ -import useSWRImmutable from 'swr/immutable'; -import { openmrsFetch } from '@openmrs/esm-framework'; - -export function useStandardSchema(key: string) { - const { data, error, isLoading } = useSWRImmutable<{ data }, Error>( - `/ws/rest/v1/systemsetting?q=${key}&v=full`, - openmrsFetch, - ); - - return { - schema: data?.data, - schemaProperties: data?.data?.results?.find((resource) => resource.property === 'kenyaemr.billing.exemptions'), - error, - isLoading, - }; -} diff --git a/packages/esm-billing-app/src/types/index.ts b/packages/esm-billing-app/src/types/index.ts index 82ae3661f..ef9046354 100644 --- a/packages/esm-billing-app/src/types/index.ts +++ b/packages/esm-billing-app/src/types/index.ts @@ -551,21 +551,10 @@ export type FacilityClaim = { export type BillingPromptType = 'patient-chart' | 'billing-orders'; export interface Schema { - services: { - all: Service[]; - 'program:HIV'?: Service[]; - 'program:TB'?: Service[]; - 'age<5'?: Service[]; - 'visitAttribute:prisoner'?: Service[]; - }; + services: Record; commodities: Record; } -export interface Service { - concept: string; - description: string; -} - export type ServiceType = { uuid: string; display: string; id: number }; export type ServiceTypesResponse = { diff --git a/yarn.lock b/yarn.lock index 6cb373572..c6451de09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2927,6 +2927,7 @@ __metadata: eslint-config-prettier: "npm:^8.2.0" eslint-config-ts-react-important-stuff: "npm:^3.0.0" eslint-plugin-prettier: "npm:^3.3.1" + file-loader: "npm:^6.2.0" fuzzy: "npm:^0.1.3" husky: "npm:^8.0.3" i18next: "npm:^19.7.0" @@ -11212,6 +11213,18 @@ __metadata: languageName: node linkType: hard +"file-loader@npm:^6.2.0": + version: 6.2.0 + resolution: "file-loader@npm:6.2.0" + dependencies: + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10/3a854be3a7501bdb0fd8a1c0d45c156c0dc8f0afced07cbdac0b13a79c2f2a03f7770d68cb555ff30b5ea7c20719df34e1b2bd896c93e3138ee31f0bdc560310 + languageName: node + linkType: hard + "file-type@npm:^16.5.4": version: 16.5.4 resolution: "file-type@npm:16.5.4"