From 40ed3bb1181bf554a24cf954859b694a19d69665 Mon Sep 17 00:00:00 2001 From: lucille Date: Fri, 11 Oct 2024 11:08:13 +0300 Subject: [PATCH 1/2] update -edit tab definition --- .../edit-tab-definition-modal.tsx | 46 +++ .../interactive-builder.component.tsx | 377 ++++++++---------- src/types.ts | 1 + 3 files changed, 212 insertions(+), 212 deletions(-) create mode 100644 src/components/interactive-builder/edit-tab-definition-modal.tsx diff --git a/src/components/interactive-builder/edit-tab-definition-modal.tsx b/src/components/interactive-builder/edit-tab-definition-modal.tsx new file mode 100644 index 0000000..4554175 --- /dev/null +++ b/src/components/interactive-builder/edit-tab-definition-modal.tsx @@ -0,0 +1,46 @@ +import React, { useState } from 'react'; +import { Modal, TextInput } from '@carbon/react'; +import { useTranslation } from 'react-i18next'; + +const EditTabDefinitionModal = ({ tabDefinition, onSave, onCancel }) => { + const { t } = useTranslation(); + const [tabName, setTabName] = useState(tabDefinition?.tabName ?? ''); + const [headerTitle, setHeaderTitle] = useState(tabDefinition?.headerTitle ?? ''); + + const handleSave = () => { + const updatedTabDefinition = { + ...tabDefinition, + tabName, + headerTitle, + }; + onSave(updatedTabDefinition); + }; + + return ( + +
+ setTabName(e.target.value)} + /> + setHeaderTitle(e.target.value)} + /> + +
+ ); +}; + +export default EditTabDefinitionModal; diff --git a/src/components/interactive-builder/interactive-builder.component.tsx b/src/components/interactive-builder/interactive-builder.component.tsx index f9c2801..e5b6e75 100644 --- a/src/components/interactive-builder/interactive-builder.component.tsx +++ b/src/components/interactive-builder/interactive-builder.component.tsx @@ -1,11 +1,12 @@ -import React, { useState, useCallback } from 'react'; +import React, { useCallback, useState } from 'react'; import { showModal, AddIcon, EditIcon, TrashCanIcon, showSnackbar } from '@openmrs/esm-framework'; import { useTranslation } from 'react-i18next'; import { v4 as uuidv4 } from 'uuid'; -import { Button, Accordion, AccordionItem, Tile, TextInput } from '@carbon/react'; -import { DefinitionTypes, WidgetTypes, type DynamicExtensionSlot, type Schema } from '../../types'; +import { Button, Accordion, AccordionItem, Tile } from '@carbon/react'; +import { DefinitionTypes, type DynamicExtensionSlot, type Schema } from '../../types'; import styles from './interactive-builder.scss'; import { getSubMenuSlotDetails } from '../../helpers'; +import EditTabDefinitionModal from './edit-tab-definition-modal'; interface InteractiveBuilderProps { schema: Schema; @@ -15,9 +16,36 @@ interface InteractiveBuilderProps { const InteractiveBuilder = ({ schema, onSchemaChange }: InteractiveBuilderProps) => { const { t } = useTranslation(); const [editingTab, setEditingTab] = useState(null); - const [editedTabName, setEditedTabName] = useState(''); - const [editedHeaderTitle, setEditedHeaderTitle] = useState(''); - const [isEditing, setIsEditing] = useState(false); + + const handleEditTabDefinitionModal = (submenuDetails, tabDefinition, configurationKey) => { + setEditingTab({ tabDefinition, submenuDetails, configurationKey }); + }; + + const handleSaveTabDefinition = (updatedTabDefinition) => { + const updatedSchema = { ...schema }; + const { submenuDetails, configurationKey } = editingTab; + + const submenuConfig = + updatedSchema['@openmrs/esm-patient-chart-app'].extensionSlots[submenuDetails.slot].configure[configurationKey]; + + submenuConfig.tabDefinitions = submenuConfig.tabDefinitions.map((tab) => + tab.id === updatedTabDefinition.id ? updatedTabDefinition : tab, + ); + + onSchemaChange(updatedSchema); + setEditingTab(null); + + showSnackbar({ + title: t('success', 'Success!'), + kind: 'success', + isLowContrast: true, + subtitle: t('tabEditedSuccessfully', 'Tab edited successfully!'), + }); + }; + + const handleCancelEdit = () => { + setEditingTab(null); + }; const initializeSchema = useCallback(() => { const dummySchema: Schema = { @@ -57,56 +85,6 @@ const InteractiveBuilder = ({ schema, onSchemaChange }: InteractiveBuilderProps) }); }, [schema, onSchemaChange]); - const handleEditTab = (tabDefinition) => { - setEditingTab(tabDefinition); - setEditedTabName(tabDefinition.tabName); - setEditedHeaderTitle(tabDefinition.headerTitle); - setIsEditing(true); - }; - - const handleSaveTab = (submenuKey, tabIndex) => { - const updatedSchema = JSON.parse(JSON.stringify(schema)); - - // Get the dynamic key for the extension slots - const extensionSlots = updatedSchema['@openmrs/esm-patient-chart-app'].extensionSlots; - const extensionSlotKey = Object.keys(extensionSlots)[0]; // Assuming there is only one key, or get it based on your logic - - let configureEntry = extensionSlots[extensionSlotKey].configure[submenuKey]; - - if (!configureEntry) { - configureEntry = { tabDefinitions: [] }; - updatedSchema['@openmrs/esm-patient-chart-app'].extensionSlots[extensionSlotKey].configure[submenuKey] = - configureEntry; - } - - const updatedTabDefinition = { - ...editingTab, - tabName: editedTabName, - headerTitle: editedHeaderTitle, - }; - - configureEntry.tabDefinitions[tabIndex] = updatedTabDefinition; - - onSchemaChange(updatedSchema); - - showSnackbar({ - title: t('success', 'Success!'), - kind: 'success', - isLowContrast: true, - subtitle: t('tabEditedSuccessfully', 'Tab edited successfully!'), - }); - - setEditingTab(updatedTabDefinition); - setIsEditing(false); - }; - - const handleCancelEdit = () => { - setEditingTab(null); - setEditedTabName(''); - setEditedHeaderTitle(''); - setIsEditing(false); - }; - const handleConfigureDashboardModal = useCallback( (slotName) => { const dispose = showModal('configure-dashboard-modal', { @@ -198,8 +176,17 @@ const InteractiveBuilder = ({ schema, onSchemaChange }: InteractiveBuilderProps) {schema && (
+ {editingTab && ( + + )} +
{navGroupTitle}
{t('clinicalViewMenus', 'Clinical View Submenus')}
+ {submenuConfig ? ( submenuConfig.add?.map((submenuKey) => { const submenuDetails = submenuConfig?.configure[submenuKey]; @@ -219,163 +206,129 @@ const InteractiveBuilder = ({ schema, onSchemaChange }: InteractiveBuilderProps) 'Now configure dashboards to show on the patient chart when this submenu is clicked.', )}

- {subMenuSlotDetails?.configure?.[configurationKey]?.tabDefinitions?.map((tabDefinition, index) => ( - - {editingTab === tabDefinition ? ( - <> - setEditedTabName(e.target.value)} - /> - setEditedHeaderTitle(e.target.value)} - /> - - - - ) : ( - <> - {editingTab && ( - <> -

{t('tabName', 'Tab name')}

-

{editingTab.tabName}

-

{t('headerTitle', 'Header title')}

-

{editingTab.headerTitle}

- - )} -
-
-

{t('tabName', 'Tab name')}

-

{tabDefinition?.tabName}

-

{t('headerTitle', 'Header title')}

-

{tabDefinition?.headerTitle}

-

{t('columns', 'Columns')}

- {tabDefinition?.columns.map((column) => ( -
-

- {t('title', 'Title')} : {column.title ?? '--'} -

-

- {t('concept', 'Concept')} : {column.concept ?? '--'} -

-

- {column.isDate && ( - <> - {t('date', 'Date')} : {column.isDate.toString() ?? '--'} - - )} -

-

- {column.isLink && ( - <> - {t('link', 'Link')} : {column.isLink.toString() ?? '--'} - - )} -

-
- ))} - - {subMenuSlotDetails?.configure[configurationKey]?.tilesDefinitions?.map( - (tileDefinition) => ( - -
-
-

{t('headerTitle', 'Header title')}

-

{tileDefinition?.tilesHeader}

-

{t('columns', 'Columns')}

- {tileDefinition?.columns.map((column) => ( -
-

- {t('title', 'Title')} : {column.title ?? '--'} -

-

- {t('concept', 'Concept')} : {column.concept ?? '--'} -

-
- ))} - -
- ), - )} - - )} + {subMenuSlotDetails?.configure?.[configurationKey]?.tabDefinitions?.map((tabDefinition) => ( + +
+
+

{t('tabName', 'Tab name')}

+

{tabDefinition?.tabName}

+

{t('headerTitle', 'Header title')}

+

{tabDefinition?.headerTitle}

+

{t('columns', 'Columns')}

+ {tabDefinition?.columns.map((column) => ( +
+

+ {t('title', 'Title')} : {column.title ?? '--'} +

+

+ {t('concept', 'Concept')} : {column.concept ?? '--'} +

+

+ {column.isDate && ( + <> + {t('date', 'Date')} : {column.isDate.toString() ?? '--'} + + )} +

+

+ {column.isLink && ( + <> + {t('link', 'Link')} : {column.isLink.toString() ?? '--'} + + )} +

+
+ ))} + +
+ ))} + + {subMenuSlotDetails?.configure[configurationKey]?.tilesDefinitions?.map((tileDefinition) => ( + +
+
+

{t('headerTitle', 'Header title')}

+

{tileDefinition?.tilesHeader}

+

{t('columns', 'Columns')}

+ {tileDefinition?.columns.map((column) => ( +
+

+ {t('title', 'Title')} : {column.title ?? '--'} +

+

+ {t('concept', 'Concept')} : {column.concept ?? '--'} +

+
+ ))} +
))}