From dae2471e26630215156977e0491a88e3d27dfc81 Mon Sep 17 00:00:00 2001 From: Spamhurts Date: Wed, 15 Jul 2020 09:50:28 -0500 Subject: [PATCH 1/2] new dev - NewAnimalWizard 1. Darkened disabled color 2. ignore sub-species change - added error reporting to UI 3. refactored fetchlocations query to use LABKEY.Query.executeSql (needed to include NULL species locations) 4. added LABKEY.Query.executeSQL to api 5. don't clear acquisition type on species change (state.selectedOption and state.newAnimalData.selectedOption) 6. lint fixes 7. updated snapshot --- .../client/NewAnimalPage/NewAnimalPage.jsx | 19 +++- .../NewAnimalPage/api/fetchLocations.js | 32 +++++-- .../NewAnimalPage/components/SpeciesPanel.jsx | 1 - .../__snapshots__/SpeciesPanel.test.jsx.snap | 1 - .../src/client/Shared/api/__mocks__/api.js | 93 ++++++++++--------- snprc_ehr/src/client/Shared/api/api.js | 19 ++++ .../src/client/Shared/styles/settings.scss | 2 +- 7 files changed, 109 insertions(+), 58 deletions(-) diff --git a/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx b/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx index 49cdcd324..b862bb00c 100644 --- a/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx +++ b/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx @@ -96,6 +96,12 @@ export default class NewAnimalPage extends React.Component { )) }).catch(error => { console.log(`Error in loadLists: ${error}`) + this.setState(prevState => ( + { + ...prevState, + errorMessage: error.message + } + )) }) } @@ -125,6 +131,12 @@ export default class NewAnimalPage extends React.Component { )) }).catch(error => { console.log(`Error in handleSpeciesChange: ${error}`) + this.setState(prevState => ( + { + ...prevState, + errorMessage: error.message + } + )) }) } @@ -155,7 +167,8 @@ export default class NewAnimalPage extends React.Component { } handleSpeciesChange = selectedSpecies => { - if (this.state.newAnimalData.species !== undefined) { + // ignore sub-species change + if (this.state.newAnimalData.species !== undefined && this.state.newAnimalData.species.arcSpeciesCode !== selectedSpecies.arcSpeciesCode) { this.selectedSpecies = selectedSpecies this.setState(prevState => ( { @@ -369,6 +382,7 @@ export default class NewAnimalPage extends React.Component { { ...initialState, isLoading: false, + selectedOption: prevState.selectedOption, speciesList: [ ...prevState.speciesList ], @@ -389,7 +403,8 @@ export default class NewAnimalPage extends React.Component { ], newAnimalData: { ...initialState.newAnimalData, - species: this.selectedSpecies + species: this.selectedSpecies, + selectedOption: prevState.newAnimalData.selectedOption } } ), this.loadListsForSpecies(this.selectedSpecies)) diff --git a/snprc_ehr/src/client/NewAnimalPage/api/fetchLocations.js b/snprc_ehr/src/client/NewAnimalPage/api/fetchLocations.js index 9f9e749b6..65a70aca4 100644 --- a/snprc_ehr/src/client/NewAnimalPage/api/fetchLocations.js +++ b/snprc_ehr/src/client/NewAnimalPage/api/fetchLocations.js @@ -1,5 +1,4 @@ -import { Filter } from '@labkey/api' -import { request } from '../../Shared/api/api' +import { executeSql } from '../../Shared/api/api' const parse = rows => { return rows.map(({ data }, key) => { @@ -8,16 +7,29 @@ const parse = rows => { } const fetchLocations = species => { + const sql = `SELECT h.species AS species, + r.room AS room, + r.maxCages AS maxCages, + r.rowId AS rowId + FROM ehr_lookups.rooms r + LEFT OUTER JOIN ( + SELECT DISTINCT d.species.arc_species_code as species, d2.room AS room + FROM study.housing AS d2 + INNER join study.demographics d on d2.id = d.id + WHERE d2.enddate IS NULL + AND d2.qcstate.publicdata = true + ) AS h ON r.room = h.room + WHERE r.dateDisabled is NULL + AND CAST(r.room as FLOAT) BETWEEN 1.00 AND 799.99 + AND (h.species = '${species}' OR h.species is NULL)` + return new Promise((resolve, reject) => { - request({ + if (!species || species.length !== 2) reject(new Error('Invalid species format detected')) + + executeSql({ schemaName: 'snprc_ehr', - queryName: 'ActiveLocationsAll', - columns: ['species', 'room', 'maxCages', 'rowId'], - sort: '-species, room', - filterArray: [ - // Filter.create('species', species, Filter.Types.EQUAL) - Filter.create('species', `${species}; null`, Filter.Types.IN) - ] + sql, + sort: '-species, room' }).then(({ rows }) => { resolve(parse(rows)) }).catch(error => { diff --git a/snprc_ehr/src/client/NewAnimalPage/components/SpeciesPanel.jsx b/snprc_ehr/src/client/NewAnimalPage/components/SpeciesPanel.jsx index f341b6a48..a9495e7f5 100644 --- a/snprc_ehr/src/client/NewAnimalPage/components/SpeciesPanel.jsx +++ b/snprc_ehr/src/client/NewAnimalPage/components/SpeciesPanel.jsx @@ -50,7 +50,6 @@ export default class SpeciesPanel extends React.Component { className="shared-dropdown shared-dropdown__species_width" classNamePrefix="shared-select" id="species-select" - isClearable isDisabled={ this.props.disabled } isLoading={ !this.props.speciesList } onChange={ this.handleSpeciesChange } diff --git a/snprc_ehr/src/client/NewAnimalPage/tests/components/__snapshots__/SpeciesPanel.test.jsx.snap b/snprc_ehr/src/client/NewAnimalPage/tests/components/__snapshots__/SpeciesPanel.test.jsx.snap index 4c003bc5d..302e2fe2b 100644 --- a/snprc_ehr/src/client/NewAnimalPage/tests/components/__snapshots__/SpeciesPanel.test.jsx.snap +++ b/snprc_ehr/src/client/NewAnimalPage/tests/components/__snapshots__/SpeciesPanel.test.jsx.snap @@ -63,7 +63,6 @@ exports[`Should render the SpeciesPanel 1`] = ` defaultMenuIsOpen={false} defaultValue={null} id="species-select" - isClearable={true} isDisabled={false} isLoading={false} onChange={[Function]} diff --git a/snprc_ehr/src/client/Shared/api/__mocks__/api.js b/snprc_ehr/src/client/Shared/api/__mocks__/api.js index bca9c007c..7920c35f6 100644 --- a/snprc_ehr/src/client/Shared/api/__mocks__/api.js +++ b/snprc_ehr/src/client/Shared/api/__mocks__/api.js @@ -1,55 +1,62 @@ /* eslint-disable no-unused-vars, camelcase */ import { NewAnimalData } from '../../../BirthRecordReport/tests/fixtures/apiTestData' -import { CurrentSpeciesLookup, AccountLookup, validInstitutions, ValidDiet, AcquisitionTypesLookup, +import { + CurrentSpeciesLookup, AccountLookup, validInstitutions, ValidDiet, AcquisitionTypesLookup, valid_bd_status, PotentialDams, PotentialSires, ActiveLocationsAll, colonyGroups, - ProtocolLookup, pedigreeGroups } from '../../../NewAnimalPage/tests/fixtures/apiTestData' + ProtocolLookup, pedigreeGroups +} from '../../../NewAnimalPage/tests/fixtures/apiTestData' export const request = ({ schemaName, queryName, viewName = '', sort = '', columns = [], filterArray = [] }) => { // console.log(`loading list: ${queryName}`); return new Promise(resolve => { switch (queryName) { - case 'CurrentSpeciesLookup': - resolve(CurrentSpeciesLookup) - break - case 'AccountLookup': - resolve(AccountLookup) - break - case 'validInstitutions': - resolve(validInstitutions) - break - case 'ValidDiet': - resolve(ValidDiet) - break - case 'AcquisitionTypesLookup': - resolve(AcquisitionTypesLookup) - break - case 'PotentialDams': - resolve(PotentialDams) - break - case 'PotentialSires': - resolve(PotentialSires) - break - case 'ActiveLocationsAll': - resolve(ActiveLocationsAll) - break - case 'colonyGroups': - resolve(colonyGroups) - break - case 'ProtocolLookup': - resolve(ProtocolLookup) - break - case 'pedigreeGroups': - resolve(pedigreeGroups) - break - case 'valid_bd_status': - resolve(valid_bd_status) - break - case 'NewAnimalData': - resolve(NewAnimalData) - break - default: - break + case 'CurrentSpeciesLookup': + resolve(CurrentSpeciesLookup) + break + case 'AccountLookup': + resolve(AccountLookup) + break + case 'validInstitutions': + resolve(validInstitutions) + break + case 'ValidDiet': + resolve(ValidDiet) + break + case 'AcquisitionTypesLookup': + resolve(AcquisitionTypesLookup) + break + case 'PotentialDams': + resolve(PotentialDams) + break + case 'PotentialSires': + resolve(PotentialSires) + break + case 'colonyGroups': + resolve(colonyGroups) + break + case 'ProtocolLookup': + resolve(ProtocolLookup) + break + case 'pedigreeGroups': + resolve(pedigreeGroups) + break + case 'valid_bd_status': + resolve(valid_bd_status) + break + case 'NewAnimalData': + resolve(NewAnimalData) + break + default: + break + } + }) +} + +export const executeSql = ({ schemaName, sql, sort = '' }) => { + return new Promise(resolve => { + if (sql.indexOf('FROM ehr_lookups.rooms') > 0) { + resolve(ActiveLocationsAll) } }) } diff --git a/snprc_ehr/src/client/Shared/api/api.js b/snprc_ehr/src/client/Shared/api/api.js index bb6afa4d6..cac39c5fe 100644 --- a/snprc_ehr/src/client/Shared/api/api.js +++ b/snprc_ehr/src/client/Shared/api/api.js @@ -21,3 +21,22 @@ export const request = ({ schemaName, queryName, viewName = '', sort = '', colum }) }) } + +export const executeSql = ({ schemaName, sql, sort = '' }) => { + return new Promise((resolve, reject) => { + const success = response => { + resolve(response) + } + const failure = error => { + reject(error) + } + Query.executeSql({ + requiredVersion: 19.2, + schemaName, + sql, + sort, + success, + failure + }) + }) +} diff --git a/snprc_ehr/src/client/Shared/styles/settings.scss b/snprc_ehr/src/client/Shared/styles/settings.scss index e02bce58b..830512976 100644 --- a/snprc_ehr/src/client/Shared/styles/settings.scss +++ b/snprc_ehr/src/client/Shared/styles/settings.scss @@ -2,7 +2,7 @@ $dark-gray: #333333; $light-gray: #999; $gray: #666; -$disabled-gray: #f5f5f5; //eeee; +$disabled-gray: #eeee; //#f5f5f5; $button-blue: #282aa5; $dark-blue: #364051; $off-white: #f7f7f7; From 05d9e06bdab501be40c3633f9e15779ac6d33f43 Mon Sep 17 00:00:00 2001 From: Spamhurts Date: Wed, 15 Jul 2020 11:49:29 -0500 Subject: [PATCH 2/2] new Dev - NewAnimalWizard/BirthRecordReport 1. tweaked page formatting (css) 2. Open BirthRecordReport from NewAnimalWizard in new window --- .../styles/birthRecordReport.scss | 9 +++++++++ .../src/client/NewAnimalPage/NewAnimalPage.jsx | 5 +++-- .../NewAnimalPage/styles/newAnimalPage.scss | 17 +++++++++++++++-- .../styles/components/_summaryGridPanel.scss | 5 ++--- .../Shared/styles/formatting/_panels.scss | 3 --- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/snprc_ehr/src/client/BirthRecordReport/styles/birthRecordReport.scss b/snprc_ehr/src/client/BirthRecordReport/styles/birthRecordReport.scss index a3e1f9060..2380102ad 100644 --- a/snprc_ehr/src/client/BirthRecordReport/styles/birthRecordReport.scss +++ b/snprc_ehr/src/client/BirthRecordReport/styles/birthRecordReport.scss @@ -4,3 +4,12 @@ @import "../../shared/styles/formatting/panels"; @import "../../Shared/styles/components/infoPanel"; @import "../../Shared/styles/components/summaryGridPanel"; + + +.right-panel { + flex: 1; + padding-left: 1rem; + flex-direction: column; + height: $m-panel; + max-width: $m-panel-width; +} \ No newline at end of file diff --git a/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx b/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx index b862bb00c..91f39cc04 100644 --- a/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx +++ b/snprc_ehr/src/client/NewAnimalPage/NewAnimalPage.jsx @@ -423,11 +423,12 @@ export default class NewAnimalPage extends React.Component { } print = id => { - // const newAnimalData = this.state.summaryData.find(o => o.id === id) const reportPath = getReportPath('BirthRecord') const fullPath = `${reportPath}&rc:Parameters=Collapsed&TargetID=${id}` // &rs:Format=PDF // uncomment to print to PDF - window.open(fullPath) + const left = window.screenX + 20 + + window.open(fullPath, '_blank', `location=yes,height=850,width=768,status=yes, left=${left}`) } render() { diff --git a/snprc_ehr/src/client/NewAnimalPage/styles/newAnimalPage.scss b/snprc_ehr/src/client/NewAnimalPage/styles/newAnimalPage.scss index 8ac945232..ef68d647a 100644 --- a/snprc_ehr/src/client/NewAnimalPage/styles/newAnimalPage.scss +++ b/snprc_ehr/src/client/NewAnimalPage/styles/newAnimalPage.scss @@ -1,6 +1,6 @@ @import "../../Shared/styles/style"; -@import "../../shared/styles/formatting/wizard"; -@import "../../shared/styles/formatting/panels"; +@import "../../Shared/styles/formatting/wizard"; +@import "../../Shared/styles/formatting/panels"; @import "../../Shared/styles/components/wrappedDatePicker"; @import "../../Shared/styles//components/modal"; @import "../../Shared/styles/components/shared"; @@ -10,3 +10,16 @@ @import "./components/locationPanel"; @import "./components/dietPanel"; @import "./components/summaryPanel"; + +.right-panel { + flex: 1; + padding-left: 1rem; + flex-direction: column; + min-height: $l-panel; +} + +.table-scroll { + overflow-y: auto; + height:$l-panel; + padding: 0, .1rem !important; +} \ No newline at end of file diff --git a/snprc_ehr/src/client/Shared/styles/components/_summaryGridPanel.scss b/snprc_ehr/src/client/Shared/styles/components/_summaryGridPanel.scss index f56d79ed3..2f7bced88 100644 --- a/snprc_ehr/src/client/Shared/styles/components/_summaryGridPanel.scss +++ b/snprc_ehr/src/client/Shared/styles/components/_summaryGridPanel.scss @@ -1,8 +1,7 @@ .table-scroll { overflow-y: auto; - height:$m-panel; - padding: 0, .1rem !important; - + min-height:$m-panel; + padding: 0, 0.1rem !important; } .table-bordered > thead > tr > th { diff --git a/snprc_ehr/src/client/Shared/styles/formatting/_panels.scss b/snprc_ehr/src/client/Shared/styles/formatting/_panels.scss index 6ec6a0faf..f59b4faee 100644 --- a/snprc_ehr/src/client/Shared/styles/formatting/_panels.scss +++ b/snprc_ehr/src/client/Shared/styles/formatting/_panels.scss @@ -6,9 +6,6 @@ .right-panel { flex: 1; padding-left: 1rem; - flex-direction: column; - height: $m-panel; - max-width: $m-panel-width; } .parent-panel { display: flex;