diff --git a/CageUI/src/client/components/layoutEditor/Editor.tsx b/CageUI/src/client/components/layoutEditor/Editor.tsx index dff6a8e93..5168db6d7 100644 --- a/CageUI/src/client/components/layoutEditor/Editor.tsx +++ b/CageUI/src/client/components/layoutEditor/Editor.tsx @@ -107,6 +107,7 @@ const Editor: FC = ({roomSize}) => { const [showRoomSelectorTemplateLoad, setShowRoomSelectorTemplateLoad] = useState(false); const [showSaveResult, setShowSaveResult] = useState(null); const [templateOptions, setTemplateOptions] = useState(false); + const [templateRename, setTemplateRename] = useState(null); // number of cells in grid width/height, based off scale const gridWidth = Math.ceil(SVG_WIDTH / roomSize.scale / CELL_SIZE); @@ -762,7 +763,8 @@ const Editor: FC = ({roomSize}) => { } const handleSave = async () => { - const result = await saveRoom(); + + const result = await saveRoom(templateRename); setShowSaveResult(result); } @@ -937,6 +939,7 @@ const Editor: FC = ({roomSize}) => { {setShowRoomSelector(false);setShowSaveConfirm(true);}} onCancel={() => {setTemplateOptions(false);setShowRoomSelector(false);}} /> diff --git a/CageUI/src/client/components/layoutEditor/RoomSelectorPopup.tsx b/CageUI/src/client/components/layoutEditor/RoomSelectorPopup.tsx index d1cbc3a06..53558d12b 100644 --- a/CageUI/src/client/components/layoutEditor/RoomSelectorPopup.tsx +++ b/CageUI/src/client/components/layoutEditor/RoomSelectorPopup.tsx @@ -32,11 +32,12 @@ interface RoomSelectorPopup { setRoom: React.Dispatch>; template: boolean; templateLoad?: boolean; + templateRename?: React.Dispatch>; } // For saving and loading in the layout editor, this is a room selector component export const RoomSelectorPopup: FC = (props) => { - const { onConfirm, onCancel, setRoom, template,templateLoad } = props; + const { onConfirm, onCancel, setRoom, template,templateLoad, templateRename } = props; const [selectedRoom, setSelectedRoom] = useState(null); const [options, setOptions] = useState[]>(null); const [templateName, setTemplateName] = useState(''); @@ -76,11 +77,12 @@ export const RoomSelectorPopup: FC = (props) => { onCancel(); return; } - // if template, save old name and new name together to parse later in submission + // if template, save old template name for later setRoom(prevState => ({ ...prevState, name: templateName })); + templateRename(selectedRoom); }else{ setRoom(prevState => ({ ...prevState, diff --git a/CageUI/src/client/context/LayoutEditorContextManager.tsx b/CageUI/src/client/context/LayoutEditorContextManager.tsx index 3e069c80e..9113ec69d 100644 --- a/CageUI/src/client/context/LayoutEditorContextManager.tsx +++ b/CageUI/src/client/context/LayoutEditorContextManager.tsx @@ -1117,12 +1117,14 @@ export const LayoutEditorContextProvider: FC = ({children, p setNextAvailGroup('rack-group-1'); } - const saveRoom = async (): Promise => { + const saveRoom = async (oldTemplateName?: string): Promise => { const commands: Command[] = []; const dataToSave: LayoutHistoryData[] = []; + // if template parse room name, 1 is the new name, 0 is the old name + const roomName = localRoom.name; - const oldRoomName: string = ActionURL.getParameter('room'); + const oldRoomName: string = oldTemplateName ? oldTemplateName : ActionURL.getParameter('room'); const savingTemplate: boolean = roomName.toLowerCase().includes("template"); const newEndDate = new Date(); const newStartDate = new Date(); diff --git a/CageUI/src/client/types/layoutEditorContextTypes.ts b/CageUI/src/client/types/layoutEditorContextTypes.ts index 525afb432..d0ad58736 100644 --- a/CageUI/src/client/types/layoutEditorContextTypes.ts +++ b/CageUI/src/client/types/layoutEditorContextTypes.ts @@ -47,7 +47,7 @@ export interface LayoutContextProps { export interface LayoutContextType { room: Room; setRoom: React.Dispatch>; - saveRoom: () => Promise; + saveRoom: (oldTemplateName?: string) => Promise; layoutSvg: d3.Selection; setLayoutSvg: React.Dispatch>>; unitLocs: UnitLocations; diff --git a/WNPRC_EHR/resources/data/cageui_item_types.tsv b/WNPRC_EHR/resources/data/cageui_item_types.tsv new file mode 100644 index 000000000..0adb98982 --- /dev/null +++ b/WNPRC_EHR/resources/data/cageui_item_types.tsv @@ -0,0 +1,13 @@ +Value Title Category Description Sort Order Date Disabled +0 Default Cage Caging 4 +1 Default Pen Caging 8 +2 Default Temp Cage Caging 4 +3 Default Play Cage Caging 8 +4 Cage Caging 4 +5 Pen Caging 8 +6 Temp Cage Caging 4 +7 Play Cage Caging 8 +100 Room Divider Room Object +101 Drain Room Object +102 Door Room Object +103 Gate Room Object diff --git a/WNPRC_EHR/resources/data/cageui_rack_manufacturers.tsv b/WNPRC_EHR/resources/data/cageui_rack_manufacturers.tsv new file mode 100644 index 000000000..2631b7eed --- /dev/null +++ b/WNPRC_EHR/resources/data/cageui_rack_manufacturers.tsv @@ -0,0 +1,6 @@ +Value Title Category Description Sort Order Date Disabled +at Allentown +sb Suburban +lk Lenderking +wnprc WNPRC +uk Unknown \ No newline at end of file diff --git a/WNPRC_EHR/resources/data/lookup_sets.tsv b/WNPRC_EHR/resources/data/lookup_sets.tsv index f733a010f..207704850 100644 --- a/WNPRC_EHR/resources/data/lookup_sets.tsv +++ b/WNPRC_EHR/resources/data/lookup_sets.tsv @@ -11,9 +11,9 @@ biopsy_type Biopsy Type Field Values value birth_condition Birth Condition Field Values value value birth_type Birth Type Field Values value title blood_billed_by Blood Billed By Field Values value title -blood_code_prefixes Blood Code Prefix Field Values value -cageui_item_types Room Item Type Field Values value title -cageui_rack_manufacturers Rack Manufacturer Field Values value title +blood_code_prefixes Blood Code Prefix Field Values value +cageui_item_types Room Item Type Field Values value +cageui_rack_manufacturers Rack Manufacturer Field Values value chemistry_method Chemistry Method Field Values value chow_types Chow Types Field Values value clinpath_collection_method Clinpath Collection Method Field Values value diff --git a/WNPRC_EHR/resources/views/populateInitialData.html b/WNPRC_EHR/resources/views/populateInitialData.html index ca97102b0..db850fad9 100644 --- a/WNPRC_EHR/resources/views/populateInitialData.html +++ b/WNPRC_EHR/resources/views/populateInitialData.html @@ -269,6 +269,20 @@ queryName: 'husbandry_assigned', module: 'wnprc_ehr', pk: 'rowid' + },{ + label: 'Room Item Type Field Values', + populateFn: 'populateFromFile', + schemaName: 'ehr_lookups', + queryName: 'cageui_item_types', + module: 'wnprc_ehr', + pk: 'value' + },{ + label: 'Rack Manufacturer Field Values', + populateFn: 'populateFromFile', + schemaName: 'ehr_lookups', + queryName: 'cageui_rack_manufacturers', + module: 'wnprc_ehr', + pk: 'value' }]; tables.sort(function(a, b) { diff --git a/WNPRC_EHR/test/src/org/labkey/test/tests/wnprc_ehr/WNPRC_EHRTest.java b/WNPRC_EHR/test/src/org/labkey/test/tests/wnprc_ehr/WNPRC_EHRTest.java index cf5540b81..4aafb5c90 100644 --- a/WNPRC_EHR/test/src/org/labkey/test/tests/wnprc_ehr/WNPRC_EHRTest.java +++ b/WNPRC_EHR/test/src/org/labkey/test/tests/wnprc_ehr/WNPRC_EHRTest.java @@ -4699,7 +4699,7 @@ private void importRacks() throws IOException, CommandException Map responseMap = new HashMap<>(); List> tsv = loadTsv(TestFileUtils.getSampleData("wnprc_ehr/cageui/racks.tsv")); - insertTsvData(connection, "cageUI", "racks", tsv, EHR_FOLDER_PATH) + insertTsvData(connection, "cageui", "racks", tsv, EHR_FOLDER_PATH) .forEach(row -> responseMap.put(row.get("rowid").toString(),row)); } // Imports rack types data for cage ui testing @@ -4709,7 +4709,7 @@ private void importRackTypes() throws IOException, CommandException Map responseMap = new HashMap<>(); List> tsv = loadTsv(TestFileUtils.getSampleData("wnprc_ehr/cageui/rackTypes.tsv")); - insertTsvData(connection, "cageUI", "rack_types", tsv, EHR_FOLDER_PATH) + insertTsvData(connection, "cageui", "rack_types", tsv, EHR_FOLDER_PATH) .forEach(row -> responseMap.put(row.get("rowid").toString(),row)); } diff --git a/WNPRC_Virology/src/org/labkey/wnprc_virology/ViralLoadRSEHRRunner.java b/WNPRC_Virology/src/org/labkey/wnprc_virology/ViralLoadRSEHRRunner.java index 9be270a7e..b24c25413 100644 --- a/WNPRC_Virology/src/org/labkey/wnprc_virology/ViralLoadRSEHRRunner.java +++ b/WNPRC_Virology/src/org/labkey/wnprc_virology/ViralLoadRSEHRRunner.java @@ -44,7 +44,7 @@ import static org.quartz.TriggerKey.triggerKey; public class ViralLoadRSEHRRunner implements Job { - private static Logger _log = LogManager.getLogger(ViralLoadRSEHRRunner.class); + private static final Logger _log = LogManager.getLogger(ViralLoadRSEHRRunner.class); public static String GROUP_ID = "wnprc_virology"; public static String JOB_ID = "vl_rsehr_job"; @@ -95,27 +95,10 @@ public void execute(JobExecutionContext jobExecutionContext) _log.warn("Viral Load RSEHR Job did not complete successfully"); } } - catch (QueryUpdateServiceException e) + catch (QueryUpdateServiceException | BatchValidationException | DuplicateKeyException | InvalidKeyException | SQLException e) { - e.printStackTrace(); + _log.error("Viral Load RSEHR Job did not complete successfully", e); } - catch (SQLException e) - { - e.printStackTrace(); - } - catch (BatchValidationException e) - { - e.printStackTrace(); - } - catch (DuplicateKeyException e) - { - e.printStackTrace(); - } - catch (InvalidKeyException e) - { - e.printStackTrace(); - } - } @@ -148,16 +131,15 @@ public boolean populateFolderPermissionsTable() throws QueryUpdateServiceExcepti SimpleQueryUpdater qu = new SimpleQueryUpdater(user, viralLoadContainer, "wnprc_virology", "folder_paths_with_readers"); SimpleQueryFactory sf = new SimpleQueryFactory(user,viralLoadContainer); JSONArray rowsToDelete = sf.selectRows("wnprc_virology", "folder_paths_with_readers"); - if (rowsToDelete.length() > 0) + if (!rowsToDelete.isEmpty()) qu.delete(JsonUtil.toMapList(rowsToDelete)); - if (rowsToInsert.size() > 0) + if (!rowsToInsert.isEmpty()) qu.insert(rowsToInsert); } catch (Exception e) { - _log.error("Viral Load RSEHR Job ERROR"); - e.printStackTrace(); + _log.error("Viral Load RSEHR Job ERROR", e); return false; } return true;