diff --git a/snprc_ehr/resources/data/id_type.tsv b/snprc_ehr/resources/data/id_type.tsv index 12cd91ae0..366eae67e 100644 --- a/snprc_ehr/resources/data/id_type.tsv +++ b/snprc_ehr/resources/data/id_type.tsv @@ -37,4 +37,10 @@ value description sort_order objectid modified 35 Shave marker 0 3378404D-8210-4C2B-9FEF-C89FB3EBB52F 2017-09-25 10:30:13.153 36 UID Chip # 2 8C102167-10BF-4C0A-963D-D9A9DE3D6AFD 2018-02-01 11:05:01.503 37 Envigo 37 3395F06B-D1A7-40D2-8B14-B83A2DCE18AA 2019-08-21 08:37:13.650 -38 Wake Forest 38 F6D430CE-9949-490B-97B9-54CADD78A4AE 2020-02-19 08:57:39.367 \ No newline at end of file +38 Wake Forest 38 F6D430CE-9949-490B-97B9-54CADD78A4AE 2020-02-19 08:57:39.367 +40 TNPRC Id 40 A1ECF635-6E6F-4A2A-BF45-6134D5F57B24 2021-02-18 17:05:41.190 +41 FDA CBER tattoo 41 18B78AFF-F732-479B-8664-CF9CF6CD6BB9 2021-07-19 09:04:28.713 +42 Tri-Service Research 42 C1EFE5E5-7DAB-4999-B6F4-72E310654D4F 2021-11-17 14:41:02.723 +43 WaNPRC Id 43 A95A5509-F649-4D5E-A9B1-B7B8B3B61FC3 2022-11-29 14:53:10.313 +44 NIRC ID 44 96059563-146F-4AE1-AE00-4B01D792BC44 2022-12-02 11:17:26.057 +45 Bioculture tattoo 45 DD21023B-B74A-4737-816E-38E4B3E76DD8 2023-04-26 09:13:45.140 \ No newline at end of file diff --git a/snprc_scheduler/package-lock.json b/snprc_scheduler/package-lock.json index c48950c64..f7b5020a5 100644 --- a/snprc_scheduler/package-lock.json +++ b/snprc_scheduler/package-lock.json @@ -2952,9 +2952,9 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, "node_modules/@types/cors": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", - "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", + "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", "dependencies": { "@types/node": "*" } @@ -4314,9 +4314,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/browser-sync-ui/node_modules/engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -11336,6 +11336,11 @@ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" }, + "node_modules/react-data-grid-addons/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/react-data-grid-addons/node_modules/react-dnd": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-2.6.0.tgz", @@ -12691,9 +12696,9 @@ } }, "node_modules/socket.io/node_modules/engine.io": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", - "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -13448,9 +13453,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz", - "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==", + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", "funding": [ { "type": "opencollective", diff --git a/snprc_scheduler/resources/schemas/dbscripts/sqlserver/snprc_scheduler-18.30-23.00.sql b/snprc_scheduler/resources/schemas/dbscripts/sqlserver/snprc_scheduler-18.30-23.00.sql new file mode 100644 index 000000000..46f6655c8 --- /dev/null +++ b/snprc_scheduler/resources/schemas/dbscripts/sqlserver/snprc_scheduler-18.30-23.00.sql @@ -0,0 +1,3 @@ +ALTER TABLE snprc_scheduler.StudyDayNotes + DROP COLUMN QcState +GO \ No newline at end of file diff --git a/snprc_scheduler/resources/schemas/snprc_scheduler.xml b/snprc_scheduler/resources/schemas/snprc_scheduler.xml index 834c971bf..e45857f10 100644 --- a/snprc_scheduler/resources/schemas/snprc_scheduler.xml +++ b/snprc_scheduler/resources/schemas/snprc_scheduler.xml @@ -22,7 +22,14 @@ - + + + core + DataStates + RowId + Label + + @@ -124,7 +131,6 @@ false - diff --git a/snprc_scheduler/src/client/components/ProjectList.jsx b/snprc_scheduler/src/client/components/ProjectList.jsx index a2e62e051..b68fd121c 100644 --- a/snprc_scheduler/src/client/components/ProjectList.jsx +++ b/snprc_scheduler/src/client/components/ProjectList.jsx @@ -10,15 +10,13 @@ */ import React from 'react'; import PropTypes from 'prop-types' -import ReactDataGrid from 'react-data-grid'; import Glyphicon from 'react-bootstrap/lib/Glyphicon' import { selectProject, filterProjects, - sortProjects, - createAction, - PROJECT_SELECTED, - selectTimeline, TAB_TIMELINES, TAB_PROJECTS, setForceRerender + selectTimeline, + TAB_PROJECTS, + setForceRerender } from '../actions/dataActions'; import connect from "react-redux/es/connect/connect"; import {BootstrapTable, TableHeaderColumn} from "react-bootstrap-table"; diff --git a/snprc_scheduler/src/client/components/TimelineDetails.jsx b/snprc_scheduler/src/client/components/TimelineDetails.jsx index 3e875b71a..1ce58c79c 100644 --- a/snprc_scheduler/src/client/components/TimelineDetails.jsx +++ b/snprc_scheduler/src/client/components/TimelineDetails.jsx @@ -24,7 +24,7 @@ class TimelineDetails extends React.Component { handleDraftCheck = (e) => { this.props.onUpdateSelectedTimeline({ - [e.target.id]: e.target.checked === true ? 4 : 1, + [e.target.id]: e.target.checked === true ? "In Progress" : "Completed", IsDirty: true }, true) }; @@ -133,8 +133,8 @@ class TimelineDetails extends React.Component {
Draft
-
diff --git a/snprc_scheduler/src/client/components/TimelineGrid.jsx b/snprc_scheduler/src/client/components/TimelineGrid.jsx index 03d0b639e..d576b289f 100644 --- a/snprc_scheduler/src/client/components/TimelineGrid.jsx +++ b/snprc_scheduler/src/client/components/TimelineGrid.jsx @@ -1,7 +1,7 @@ import React from "react"; import ReactDataGrid from "react-data-grid"; -import {Button, Modal, OverlayTrigger, Tooltip} from "react-bootstrap"; -// import DraggableContainer from "./dnd/DraggableContainer"; +import { Button, Modal, OverlayTrigger, Tooltip } from "react-bootstrap"; +import { DraggableContainer } from "./dnd/DraggableContainer"; import Moment from 'react-moment'; import { addTimelineItem, @@ -89,10 +89,15 @@ class TimelineGrid extends React.Component { procNote: "", rowId: undefined, revisionNum: undefined, - day0: "" + day0: "", + key: 0 } } + getGridKey = () => { + return Math.random(); + }; + CheckBoxFormatter = (colKey) => { return ((props) => { @@ -277,7 +282,8 @@ class TimelineGrid extends React.Component { }) this.setState(Object.assign({}, this.state, { - rows: newRows + rows: newRows, + key: this.getGridKey() })); this.props.selectedTimeline.forceReload = false; @@ -412,6 +418,7 @@ class TimelineGrid extends React.Component { allRows = newState.rows; newState.columns = sortedCols; + newState.key = this.getGridKey(); this.setState(Object.assign({}, this.state, newState)); } @@ -488,6 +495,7 @@ class TimelineGrid extends React.Component { stateCopy.showProcNote = false; stateCopy.procNoteName = ""; stateCopy.rows = newRows; + stateCopy.key = this.getGridKey(); this.setState(stateCopy); @@ -524,6 +532,7 @@ class TimelineGrid extends React.Component { this.setState(state => { state.rows = filteredRows; + state.key = this.getGridKey(); return state; }); @@ -563,8 +572,9 @@ class TimelineGrid extends React.Component { } state.rows = newRows; + state.key = this.getGridKey(); return state; - }) + }); this.props.onAssignTimelineProcedure({ Value: rowCopy[column.key], @@ -590,7 +600,7 @@ class TimelineGrid extends React.Component { this.props.onUpdateTimelineDayZero(selectedTimeline.StudyDay0, true, true); } - const stateCopy = {rows: [...rows]}; + const stateCopy = {rows: [...rows], key: this.getGridKey()}; this.setState(stateCopy); }; @@ -614,6 +624,7 @@ class TimelineGrid extends React.Component { this.props.onAddTimelineItem(newRow); stateCopy.rows.push(newRow); + stateCopy.key = this.getGridKey(); this.setState(stateCopy); @@ -645,7 +656,8 @@ class TimelineGrid extends React.Component { this.setState(emptyColumns); const reorderedColumns = Object.assign({}, this.state, { - columns: stateCopy.columns + columns: stateCopy.columns, + key: this.getGridKey() }); this.setState(reorderedColumns); @@ -668,7 +680,7 @@ class TimelineGrid extends React.Component { }; setSort = (sortColumn, sortDirection) => { - this.sortRows(this.state.rows, sortColumn, sortDirection, true); + this.sortRows(this.state.rows, sortColumn, undefined, sortDirection, true); }; sortRows = (initialRows, sortColumn, sortMinorColumn, sortDirection, setState) => { @@ -724,7 +736,8 @@ class TimelineGrid extends React.Component { this.setState(Object.assign({}, this.state, { rows: sortedRows, sortDirection: sortDirection, - sortColumn: sortColumn + sortColumn: sortColumn, + key: this.getGridKey() })); } @@ -778,7 +791,7 @@ class TimelineGrid extends React.Component {
- {/**/} + rows[i]} @@ -791,7 +804,7 @@ class TimelineGrid extends React.Component { onRowClick={this.onRowClick} emptyRowsView={this.EmptyRowsView} /> - {/**/} +
); diff --git a/snprc_scheduler/src/client/components/TimelineList.jsx b/snprc_scheduler/src/client/components/TimelineList.jsx index e79cd9c2c..7400927fa 100644 --- a/snprc_scheduler/src/client/components/TimelineList.jsx +++ b/snprc_scheduler/src/client/components/TimelineList.jsx @@ -243,7 +243,7 @@ class TimelineList extends React.Component { } }) } - else if (selectedTimeline.QcState !== 4) { + else if (selectedTimeline.QcStateLabel !== "In Progress") { showAlert({ title: 'Delete Error', msg: 'Cannot delete ' + selectedTimeline.Description + ', ' + selectedTimeline.RevisionNum + ', it is not in draft state. ' + @@ -477,7 +477,7 @@ class TimelineList extends React.Component { // Add keys for any rows not selected for (const row of revTable.state.data) { - if (selections.length < 1 || selections[0] !== row.RevisionNum || me.props.selectedTimeline.QcState !== 4) { + if (selections.length < 1 || selections[0] !== row.RevisionNum || me.props.selectedTimeline.QcStateLabel !== "In Progress") { nonEdit.push(row.RevisionNum) } } diff --git a/snprc_scheduler/src/client/components/dnd/DraggableContainer.jsx b/snprc_scheduler/src/client/components/dnd/DraggableContainer.jsx index d830b02ce..a6af928ce 100644 --- a/snprc_scheduler/src/client/components/dnd/DraggableContainer.jsx +++ b/snprc_scheduler/src/client/components/dnd/DraggableContainer.jsx @@ -1,21 +1,25 @@ import React from 'react'; import PropTypes from 'prop-types'; -import html5DragDropContext from './html5DragDropContext'; +import { html5DragDropContext } from './html5DragDropContext'; import DraggableHeaderCell from './DraggableHeaderCell'; -class DraggableContainer extends React.Component { +class DraggableContainerImpl extends React.Component { + + child = React.Children.only(this.props.children); + render() { - return React.cloneElement( - React.Children.only(this.props.children), { - ...this.props, - draggableHeaderCell: DraggableHeaderCell - } - ); + return ( + <> + {React.cloneElement(this.child, {...this.props, draggableHeaderCell: DraggableHeaderCell})} + + ) } } -DraggableContainer.propTypes = { +DraggableContainerImpl.propTypes = { children: PropTypes.element.isRequired }; -export default html5DragDropContext(DraggableContainer); \ No newline at end of file +export const DraggableContainer = (props) => { + return html5DragDropContext(); +} \ No newline at end of file diff --git a/snprc_scheduler/src/client/components/dnd/html5DragDropContext.js b/snprc_scheduler/src/client/components/dnd/html5DragDropContext.js deleted file mode 100644 index c56ce6daf..000000000 --- a/snprc_scheduler/src/client/components/dnd/html5DragDropContext.js +++ /dev/null @@ -1,4 +0,0 @@ -import { DragDropContext } from 'react-dnd'; -import { HTML5Backend } from 'react-dnd-html5-backend'; - -export default DragDropContext(HTML5Backend); \ No newline at end of file diff --git a/snprc_scheduler/src/client/components/dnd/html5DragDropContext.jsx b/snprc_scheduler/src/client/components/dnd/html5DragDropContext.jsx new file mode 100644 index 000000000..c236c2a8b --- /dev/null +++ b/snprc_scheduler/src/client/components/dnd/html5DragDropContext.jsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { DndProvider } from 'react-dnd'; +import { HTML5Backend } from 'react-dnd-html5-backend'; + +export const html5DragDropContext = (Component) => { + return ( + + {Component} + + ); +} \ No newline at end of file diff --git a/snprc_scheduler/src/client/reducers/timelineReducer.js b/snprc_scheduler/src/client/reducers/timelineReducer.js index 84b1b47a4..042694553 100644 --- a/snprc_scheduler/src/client/reducers/timelineReducer.js +++ b/snprc_scheduler/src/client/reducers/timelineReducer.js @@ -36,7 +36,7 @@ const cloneTimeline = (source, revision) => { RowId: revision ? source.RowId : 0, RevisionNum: revision, Description: source.Description + (revision ? '': ' Clone'), - QcState: 4, + QcStateLabel: "In Progress", IsDirty: true, ObjectId: undefined, CreatedByName: undefined, @@ -101,7 +101,7 @@ export default (state = { }, action) => { // Add rowid, timelineitems, timelineprojectitems and timelineanimalitems for UI for (const tl of nextState.timelines) { tl.RowId = tl.TimelineId; - tl.savedDraft = (tl.QcState === 4); + tl.savedDraft = (tl.QcStateLabel === "In Progress"); if (!tl.TimelineItems) { @@ -139,7 +139,7 @@ export default (state = { }, action) => { Description: "New Timeline", IsDeleted: false, IsDirty: true, - QcState: 4, + QcStateLabel: "In Progress", TimelineAnimalItems: [], StudyDayNotes: [], TimelineItems: [{RowIdx: 1, StudyDay: 0, ScheduleDate: null, IsDirty: true, IsDeleted: false}] @@ -218,7 +218,7 @@ export default (state = { }, action) => { // Set rowid for UI display action.payload.RowId = action.payload.TimelineId; action.payload.IsDirty = false; - action.payload.savedDraft = (action.payload.QcState === 4); + action.payload.savedDraft = (action.payload.QcStateLabel === "In Progress"); // Update list of timelines let timelines = nextState.timelines.map((timeline) => { diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerManager.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerManager.java index 3daff6d5a..82e9ae5d1 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerManager.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerManager.java @@ -457,7 +457,7 @@ public void updateTimeline(Container c, User u, Timeline timeline, BatchValidati timeline.setRevisionNum(getNextRevisionNum(timeline.getTimelineId())); timeline.setObjectId(new GUID().toString()); // add default QcState - if (timeline.getQcState() == null) timeline.setQcState(QCStateEnum.IN_PROGRESS.getValue()); + if (timeline.getQcState() == null) timeline.setQcState(QCStateEnum.getQCStateEnumId(c,u, QCStateEnum.IN_PROGRESS)); timelineRows.add(timeline.toMap(c, u)); diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerModule.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerModule.java index c1c8e1b9f..3ffa2f74f 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerModule.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/SNPRC_schedulerModule.java @@ -44,7 +44,7 @@ public String getName() @Override public @Nullable Double getSchemaVersion() { - return 18.30; + return 23.00; } @Override diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/StudyDayNotes.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/StudyDayNotes.java index 74d676288..fb86d62a2 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/StudyDayNotes.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/StudyDayNotes.java @@ -37,12 +37,12 @@ public StudyDayNotes(JSONObject json) throws RuntimeException { try { - this.setTimelineObjectId(json.has(STUDYDAY_TIMELINE_OBJECT_ID) && !json.isNull(STUDYDAY_TIMELINE_OBJECT_ID) ? json.getString(STUDYDAY_TIMELINE_OBJECT_ID) : null); - this.setStudyDay(json.has(STUDYDAY_STUDY_DAY) && !json.isNull(STUDYDAY_STUDY_DAY) ? json.getInt(STUDYDAY_STUDY_DAY) : null); - this.setStudyDayNote(json.has(STUDYDAY_STUDY_DAY_NOTE) && !json.isNull(STUDYDAY_STUDY_DAY_NOTE) ? json.getString(STUDYDAY_STUDY_DAY_NOTE) : null); - this.setObjectId(json.has(STUDYDAY_OBJECT_ID) && !json.isNull(STUDYDAY_OBJECT_ID) ? json.getString(STUDYDAY_OBJECT_ID) : null); - this.setDeleted(json.has(STUDYDAY_IS_DELETED) && !json.isNull(STUDYDAY_IS_DELETED) && json.getBoolean(STUDYDAY_IS_DELETED)); - this.setDirty(json.has(STUDYDAY_IS_DIRTY) && !json.isNull(STUDYDAY_IS_DIRTY) && json.getBoolean(STUDYDAY_IS_DIRTY)); + this.setTimelineObjectId(json.optString(STUDYDAY_TIMELINE_OBJECT_ID, null)); + this.setStudyDay(json.isNull(STUDYDAY_STUDY_DAY) ? null : json.getInt(STUDYDAY_STUDY_DAY)); + this.setStudyDayNote(json.optString(STUDYDAY_STUDY_DAY_NOTE, null)); + this.setObjectId(json.optString(STUDYDAY_OBJECT_ID, null)); + this.setDeleted(!json.isNull(STUDYDAY_IS_DELETED) && json.getBoolean(STUDYDAY_IS_DELETED)); + this.setDirty(!json.isNull(STUDYDAY_IS_DIRTY) && json.getBoolean(STUDYDAY_IS_DIRTY)); } catch (Exception e) { diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/Timeline.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/Timeline.java index a0998d5e8..0478bd711 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/Timeline.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/Timeline.java @@ -9,6 +9,7 @@ import org.labkey.api.security.User; import org.labkey.api.util.DateUtil; import org.labkey.snprc_scheduler.SNPRC_schedulerManager; +import org.labkey.snprc_scheduler.security.QCStateEnum; import java.text.ParseException; import java.util.ArrayList; @@ -76,6 +77,7 @@ public class Timeline //extends Entity public static final String TIMELINE_CREATED_BY_NAME = "CreatedByName"; public static final String TIMELINE_MODIFIED_BY_NAME = "ModifiedByName"; public static final String TIMELINE_QCSTATE = "QcState"; + public static final String TIMELINE_QCSTATE_LABEL = "QcStateLabel"; public static final String TIMELINE_TIMELINE_ITEMS = "TimelineItems"; public static final String TIMELINE_TIMELINE_PROJECT_ITEMS = "TimelineProjectItems"; public static final String TIMELINE_PROJECT_OBJECT_ID = "ProjectObjectId"; @@ -107,34 +109,35 @@ public Timeline(Container c, User u, JSONObject json) throws RuntimeException { try { - this.setTimelineId(json.has(TIMELINE_ID) && !json.isNull(TIMELINE_ID) ? json.getInt(TIMELINE_ID) : null); - this.setRevisionNum(json.has(TIMELINE_REVISION_NUM) && !json.isNull(TIMELINE_REVISION_NUM) ? json.getInt(TIMELINE_REVISION_NUM) : null); - this.setLeadTech(json.has(TIMELINE_LEAD_TECHS) && !json.isNull(TIMELINE_LEAD_TECHS) ? json.getString(TIMELINE_LEAD_TECHS) : null); - this.setNotes(json.has(TIMELINE_NOTES) && !json.isNull(TIMELINE_NOTES) ? json.getString(TIMELINE_NOTES) : null); - this.setSchedulerNotes(json.has(TIMELINE_SCHEDULER_NOTES) && !json.isNull(TIMELINE_SCHEDULER_NOTES) ? json.getString(TIMELINE_SCHEDULER_NOTES) : null); - this.setObjectId(json.has(TIMELINE_OBJECTID) && !json.isNull(TIMELINE_OBJECTID) ? json.getString(TIMELINE_OBJECTID) : null); - this.setCreatedBy(c, u, json.has(TIMELINE_CREATED_BY) && !json.isNull(TIMELINE_CREATED_BY) ? json.getInt(TIMELINE_CREATED_BY): null); - this.setModifiedBy(c, u, json.has(TIMELINE_MODIFIED_BY) && !json.isNull(TIMELINE_MODIFIED_BY) ? json.getInt(TIMELINE_MODIFIED_BY): null); - this.setCreatedByName(json.has(TIMELINE_CREATED_BY_NAME) && !json.isNull(TIMELINE_CREATED_BY_NAME) ? json.getString(TIMELINE_CREATED_BY_NAME): null); - this.setModifiedByName(json.has(TIMELINE_MODIFIED_BY_NAME) && !json.isNull(TIMELINE_MODIFIED_BY_NAME) ? json.getString(TIMELINE_MODIFIED_BY_NAME): null); - this.setDescription(json.has(TIMELINE_DESCRIPTION) && !json.isNull(TIMELINE_DESCRIPTION) ? json.getString(TIMELINE_DESCRIPTION) : null); - this.setQcState(json.has(TIMELINE_QCSTATE) && !json.isNull(TIMELINE_QCSTATE) ? json.getInt(TIMELINE_QCSTATE) : null); - this.setProjectObjectId(json.has(TIMELINE_PROJECT_OBJECT_ID) && !json.isNull(TIMELINE_PROJECT_OBJECT_ID) ? json.getString(TIMELINE_PROJECT_OBJECT_ID) : null); - this.setProjectId(json.has(TIMELINE_PROJECT_ID) && !json.isNull(TIMELINE_PROJECT_ID) ? json.getInt(TIMELINE_PROJECT_ID) : null); - this.setProjectRevisionNum(json.has(TIMELINE_PROJECT_REVISION_NUM) && !json.isNull(TIMELINE_PROJECT_REVISION_NUM) ? json.getInt(TIMELINE_PROJECT_REVISION_NUM) : null); - this.setDeleted(json.has(TIMELINE_IS_DELETED) && !json.isNull(TIMELINE_IS_DELETED) && json.getBoolean(TIMELINE_IS_DELETED)); - this.setDirty(json.has(TIMELINE_IS_DIRTY) && !json.isNull(TIMELINE_IS_DIRTY) && json.getBoolean(TIMELINE_IS_DIRTY)); - this.setInUse(json.has(TIMELINE_IS_IN_USE) && !json.isNull(TIMELINE_IS_IN_USE) && json.getBoolean(TIMELINE_IS_IN_USE)); - this.setRc(json.has(TIMELINE_RC) && !json.isNull(TIMELINE_RC) ? json.getString(TIMELINE_RC) : null); - this.setSpecies(json.has(TIMELINE_SPECIES) && !json.isNull(TIMELINE_SPECIES) ? json.getString(TIMELINE_SPECIES) : null); - this.setProtocol(json.has(TIMELINE_PROTOCOL) && !json.isNull(TIMELINE_PROTOCOL) ? json.getString(TIMELINE_PROTOCOL) : null); - this.setChargeId(json.has(TIMELINE_CHARGE_ID) && !json.isNull(TIMELINE_CHARGE_ID) ? json.getInt(TIMELINE_CHARGE_ID) : null); - this.setAnimalAccount(json.has(TIMELINE_ANIMAL_ACCOUNT) && !json.isNull(TIMELINE_ANIMAL_ACCOUNT) ? json.getString(TIMELINE_ANIMAL_ACCOUNT) : null); - - String startDateString = json.has(TIMELINE_STARTDATE) && !json.isNull(TIMELINE_STARTDATE) ? json.getString(TIMELINE_STARTDATE) : null; - String endDateString = json.has(TIMELINE_ENDDATE) && !json.isNull(TIMELINE_ENDDATE) ? json.getString(TIMELINE_ENDDATE) : null; - String createdDateString = json.has(TIMELINE_DATE_CREATED) && !json.isNull(TIMELINE_DATE_CREATED) ? json.getString(TIMELINE_DATE_CREATED) : null; - String modifiedDateString = json.has(TIMELINE_DATE_MODIFIED) && !json.isNull(TIMELINE_DATE_MODIFIED) ? json.getString(TIMELINE_DATE_MODIFIED) : null; + this.setTimelineId(json.isNull(TIMELINE_ID) ? null : json.getInt(TIMELINE_ID)); + this.setRevisionNum(json.isNull(TIMELINE_REVISION_NUM) ? null : json.getInt(TIMELINE_REVISION_NUM)); + this.setLeadTech(json.optString(TIMELINE_LEAD_TECHS, null)); + this.setNotes(json.optString(TIMELINE_NOTES, null)); + this.setSchedulerNotes(json.optString(TIMELINE_SCHEDULER_NOTES, null)); + this.setObjectId(json.optString(TIMELINE_OBJECTID, null)); + this.setCreatedBy(c, u, json.isNull(TIMELINE_CREATED_BY) ? null : json.getInt(TIMELINE_CREATED_BY)); + this.setModifiedBy(c, u, json.isNull(TIMELINE_MODIFIED_BY) ? null : json.getInt(TIMELINE_MODIFIED_BY)); + this.setCreatedByName(json.optString(TIMELINE_CREATED_BY_NAME, null)); + this.setModifiedByName(json.optString(TIMELINE_MODIFIED_BY_NAME, null)); + this.setDescription(json.optString(TIMELINE_DESCRIPTION, null)); + // update QCState from the QCStateLabel field + this.setQcState(json.isNull(TIMELINE_QCSTATE_LABEL) ? null : QCStateEnum.getQCStateEnumId(c, u, QCStateEnum.getQCStateEnumByName(json.optString(TIMELINE_QCSTATE_LABEL)))); + this.setProjectObjectId(json.optString(TIMELINE_PROJECT_OBJECT_ID, null)); + this.setProjectId(json.isNull(TIMELINE_PROJECT_ID) ? null : json.getInt(TIMELINE_PROJECT_ID)); + this.setProjectRevisionNum(json.isNull(TIMELINE_PROJECT_REVISION_NUM) ? null : json.getInt(TIMELINE_PROJECT_REVISION_NUM)); + this.setDeleted(!json.isNull(TIMELINE_IS_DELETED) && json.getBoolean(TIMELINE_IS_DELETED)); + this.setDirty(!json.isNull(TIMELINE_IS_DIRTY) && json.getBoolean(TIMELINE_IS_DIRTY)); + this.setInUse(!json.isNull(TIMELINE_IS_IN_USE) && json.getBoolean(TIMELINE_IS_IN_USE)); + this.setRc(json.optString(TIMELINE_RC, null)); + this.setSpecies(json.optString(TIMELINE_SPECIES, null)); + this.setProtocol(json.optString(TIMELINE_PROTOCOL, null)); + this.setChargeId(json.isNull(TIMELINE_CHARGE_ID) ? null : json.getInt(TIMELINE_CHARGE_ID)); + this.setAnimalAccount(json.optString(TIMELINE_ANIMAL_ACCOUNT, null)); + + String startDateString = json.optString(TIMELINE_STARTDATE, null); + String endDateString = json.optString(TIMELINE_ENDDATE, null); + String createdDateString = json.optString(TIMELINE_DATE_CREATED, null); + String modifiedDateString = json.optString(TIMELINE_DATE_MODIFIED, null); try { @@ -540,6 +543,7 @@ public Map toMap(Container c, User u) values.put(TIMELINE_MODIFIED_BY, getModifiedBy()); values.put(TIMELINE_CREATED_BY_NAME, getCreatedByName()); values.put(TIMELINE_MODIFIED_BY_NAME, getModifiedByName()); + values.put(TIMELINE_QCSTATE_LABEL, QCStateEnum.getQCStateEnumById(c, u, getQcState()).getName()); values.put(TIMELINE_QCSTATE, getQcState()); values.put(TIMELINE_PROJECT_OBJECT_ID, getProjectObjectId()); values.put(TIMELINE_IS_DELETED, getDeleted()); @@ -620,6 +624,7 @@ public JSONObject toJSON(Container c, User u) json.put(TIMELINE_MODIFIED_BY, getModifiedBy()); json.put(TIMELINE_CREATED_BY_NAME, getCreatedByName()); json.put(TIMELINE_MODIFIED_BY_NAME, getModifiedByName()); + json.put(TIMELINE_QCSTATE_LABEL, QCStateEnum.getQCStateEnumById(c, u, getQcState()).getName()); //getQcState()); json.put(TIMELINE_QCSTATE, getQcState()); json.put(TIMELINE_PROJECT_OBJECT_ID, getProjectObjectId()); json.put(TIMELINE_IS_DELETED, getDeleted()); diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineAnimalJunction.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineAnimalJunction.java index cd0d27e1e..b74e49d5b 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineAnimalJunction.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineAnimalJunction.java @@ -57,20 +57,20 @@ public TimelineAnimalJunction(JSONObject json) throws RuntimeException try { // TODO: Update or remove commented out lines once we get to animal assignment - this.setRowId(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ROW_ID) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_ROW_ID) ? json.getInt(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ROW_ID) : null); - this.setTimelineObjectId(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_TIMELINE_OBJECT_ID) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_TIMELINE_OBJECT_ID) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_TIMELINE_OBJECT_ID) : null); - this.setAnimalId(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ANIMAL_ID) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_ANIMAL_ID) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ANIMAL_ID) : null); - this.setAssignmentStatus(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ASSIGNMENT_STATUS) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_ASSIGNMENT_STATUS) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ASSIGNMENT_STATUS) : null); - this.setGender(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_GENDER) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_GENDER) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_GENDER) : null); - this.setAge(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_AGE) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_AGE) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_AGE) : null); - this.setLocation(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_LOCATION) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_LOCATION) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_LOCATION) : null); - this.setCage(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_CAGE) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_CAGE) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_CAGE) : null); - this.setWeight(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_WEIGHT) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_WEIGHT) ? json.getDouble(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_WEIGHT) : null); - this.setObjectId(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_OBJECT_ID) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_OBJECT_ID) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_OBJECT_ID) : null); - this.setDeleted(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_IS_DELETED) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_IS_DELETED) && json.getBoolean(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_IS_DELETED)); - this.setDirty(json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_IS_DIRTY) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_IS_DIRTY) && json.getBoolean(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_IS_DIRTY)); - - String endDateString = json.has(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_END_DATE) && !json.isNull(TIMELINE_ANIMAL_JUNCTION_END_DATE) ? json.getString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_END_DATE) : null; + this.setRowId(json.isNull(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ROW_ID) ? null : json.getInt(TIMELINE_ANIMAL_JUNCTION_ROW_ID)); + this.setTimelineObjectId(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_TIMELINE_OBJECT_ID, null)); + this.setAnimalId(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ANIMAL_ID, null)); + this.setAssignmentStatus(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_ASSIGNMENT_STATUS, null)); + this.setGender(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_GENDER, null)); + this.setAge(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_AGE, null)); + this.setLocation(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_LOCATION, null)); + this.setCage(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_CAGE, null)); + this.setWeight(json.isNull(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_WEIGHT) ? null : json.getDouble(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_WEIGHT)); + this.setObjectId(json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_OBJECT_ID, null)); + this.setDeleted(!json.isNull(TIMELINE_ANIMAL_JUNCTION_IS_DELETED) && json.getBoolean(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_IS_DELETED)); + this.setDirty(!json.isNull(TIMELINE_ANIMAL_JUNCTION_IS_DIRTY) && json.getBoolean(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_IS_DIRTY)); + + String endDateString = json.optString(TimelineAnimalJunction.TIMELINE_ANIMAL_JUNCTION_END_DATE, null); try { this.setEndDate(endDateString == null ? null : DateUtil.parseDateTime(endDateString, Timeline.TIMELINE_DATE_FORMAT)); diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineItem.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineItem.java index c01286bd4..d3828dd6a 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineItem.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineItem.java @@ -53,17 +53,16 @@ public TimelineItem(JSONObject json) throws RuntimeException try { - this.setTimelineItemId(json.has(TIMELINEITEM_TIMELINE_ITEM_ID) && !json.isNull(TIMELINEITEM_TIMELINE_ITEM_ID) ? json.getInt(TIMELINEITEM_TIMELINE_ITEM_ID) : null); - this.setTimelineObjectId(json.has(TIMELINEITEM_TIMELINE_OBJECT_ID) && !json.isNull(TIMELINEITEM_TIMELINE_OBJECT_ID)? json.getString(TIMELINEITEM_TIMELINE_OBJECT_ID) : null); - this.setStudyDay(json.has(TIMELINEITEM_STUDY_DAY) && !json.isNull(TIMELINEITEM_STUDY_DAY) ? json.getInt(TIMELINEITEM_STUDY_DAY) : null); - this.setProjectItemId(json.has(TIMELINEITEM_PROJECT_ITEM_ID) && !json.isNull(TIMELINEITEM_PROJECT_ITEM_ID) - ? json.getInt(TIMELINEITEM_PROJECT_ITEM_ID) : null); - this.setObjectId(json.has(TIMELINEITEM_OBJECT_ID) && !json.isNull(TIMELINEITEM_OBJECT_ID) ? json.getString(TIMELINEITEM_OBJECT_ID) : null); - this.setDeleted(json.has(TIMELINEITEM_IS_DELETED) && !json.isNull(TIMELINEITEM_IS_DELETED) && json.getBoolean(TIMELINEITEM_IS_DELETED)); - this.setDirty(json.has(TIMELINEITEM_IS_DIRTY) && !json.isNull(TIMELINEITEM_IS_DIRTY) && json.getBoolean(TIMELINEITEM_IS_DIRTY)); - this.setPkgId(json.has(TIMELINEITEM_PKG_ID) && !json.isNull(TIMELINEITEM_PKG_ID) ? json.getInt(TIMELINEITEM_PKG_ID) : null); - - String scheduleDateString = json.has(TIMELINEITEM_SCHEDULE_DATE) && !json.isNull(TIMELINEITEM_SCHEDULE_DATE) ? json.getString(TIMELINEITEM_SCHEDULE_DATE) : null; + this.setTimelineItemId(json.isNull(TIMELINEITEM_TIMELINE_ITEM_ID) ? null : json.getInt(TIMELINEITEM_TIMELINE_ITEM_ID)); + this.setTimelineObjectId(json.optString(TIMELINEITEM_TIMELINE_OBJECT_ID, null)); + this.setStudyDay(json.isNull(TIMELINEITEM_STUDY_DAY) ? null : json.getInt(TIMELINEITEM_STUDY_DAY)); + this.setProjectItemId(json.isNull(TIMELINEITEM_PROJECT_ITEM_ID) ? null : json.getInt(TIMELINEITEM_PROJECT_ITEM_ID)); + this.setObjectId(json.optString(TIMELINEITEM_OBJECT_ID, null)); + this.setDeleted(!json.isNull(TIMELINEITEM_IS_DELETED) && json.getBoolean(TIMELINEITEM_IS_DELETED)); + this.setDirty(!json.isNull(TIMELINEITEM_IS_DIRTY) && json.getBoolean(TIMELINEITEM_IS_DIRTY)); + this.setPkgId(json.isNull(TIMELINEITEM_PKG_ID) ? null : json.getInt(TIMELINEITEM_PKG_ID)); + + String scheduleDateString = json.optString(TIMELINEITEM_SCHEDULE_DATE, null); try { @@ -91,7 +90,7 @@ public static boolean isValidTimelineItem(JSONObject json) // Find studyDay and projectItemId and parse as ints // Allow null value for projectItemId json.getInt(TIMELINEITEM_STUDY_DAY); - if (json.has(TIMELINEITEM_PROJECT_ITEM_ID) && !json.isNull(TIMELINEITEM_PROJECT_ITEM_ID)) + if (!json.isNull(TIMELINEITEM_PROJECT_ITEM_ID)) json.getInt(TIMELINEITEM_PROJECT_ITEM_ID); } catch (Exception e) diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineProjectItem.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineProjectItem.java index 60637d86e..689522c5f 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineProjectItem.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/domains/TimelineProjectItem.java @@ -45,14 +45,14 @@ public TimelineProjectItem(JSONObject json) throws RuntimeException { try { - this.setProjectItemId(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_PROJECT_ITEM_ID) ? json.getInt(TimelineProjectItem.TIMELINE_PROJECT_ITEM_PROJECT_ITEM_ID) : null); - this.setTimelineObjectId(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_TIMELINE_OBJECT_ID) ? json.getString(TimelineProjectItem.TIMELINE_PROJECT_ITEM_TIMELINE_OBJECT_ID) : null); - this.setSortOrder(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_SORT_ORDER) ? json.getInt(TimelineProjectItem.TIMELINE_PROJECT_ITEM_SORT_ORDER) : null); - this.setObjectId(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_OBJECTID) ? json.getString(TimelineProjectItem.TIMELINE_PROJECT_ITEM_OBJECTID) : null); - this.setTimelineFootNotes(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_TIMELINE_FOOT_NOTES) ? json.getString(TimelineProjectItem.TIMELINE_PROJECT_ITEM_TIMELINE_FOOT_NOTES) : null); - this.setDeleted(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DELETED) && json.getBoolean(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DELETED) ); - this.setDirty(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DIRTY) && json.getBoolean(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DIRTY) ); - this.setActive(json.has(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_ACTIVE) && json.getBoolean(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_ACTIVE) ); + this.setProjectItemId(json.isNull(TimelineProjectItem.TIMELINE_PROJECT_ITEM_PROJECT_ITEM_ID) ? null : json.getInt(TimelineProjectItem.TIMELINE_PROJECT_ITEM_PROJECT_ITEM_ID)); + this.setTimelineObjectId(json.optString(TimelineProjectItem.TIMELINE_PROJECT_ITEM_TIMELINE_OBJECT_ID, null)); + this.setSortOrder(json.isNull(TimelineProjectItem.TIMELINE_PROJECT_ITEM_SORT_ORDER) ? null : json.getInt(TimelineProjectItem.TIMELINE_PROJECT_ITEM_SORT_ORDER)); + this.setObjectId(json.optString(TimelineProjectItem.TIMELINE_PROJECT_ITEM_OBJECTID, null)); + this.setTimelineFootNotes(json.optString(TimelineProjectItem.TIMELINE_PROJECT_ITEM_TIMELINE_FOOT_NOTES, null)); + this.setDeleted(!json.isNull(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DELETED) && json.getBoolean(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DELETED) ); + this.setDirty(!json.isNull(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DIRTY) && json.getBoolean(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_DIRTY) ); + this.setActive(!json.isNull(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_ACTIVE) && json.getBoolean(TimelineProjectItem.TIMELINE_PROJECT_ITEM_IS_ACTIVE) ); } catch (Exception e) diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/security/QCStateEnum.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/security/QCStateEnum.java index cac5d5fd2..51a306f7c 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/security/QCStateEnum.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/security/QCStateEnum.java @@ -1,6 +1,17 @@ package org.labkey.snprc_scheduler.security; import org.jetbrains.annotations.Nullable; +import org.labkey.api.data.CompareType; +import org.labkey.api.data.Container; +import org.labkey.api.data.CoreSchema; +import org.labkey.api.data.SimpleFilter; +import org.labkey.api.data.TableInfo; +import org.labkey.api.data.TableSelector; +import org.labkey.api.query.FieldKey; +import org.labkey.api.security.User; + +import java.util.Collections; +import java.util.Set; /** * Created by thawkins on 11/2/2018. @@ -10,19 +21,17 @@ public enum QCStateEnum { // modeled after SND QCStates - COMPLETED(1, "Completed", "Record has been completed and is public", true), - REJECTED(2, "Rejected", "Record has been reviewed and rejected", false), - REVIEW_REQUIRED(3, "Review Required", "Review is required prior to public release", false), - IN_PROGRESS(4, "In Progress", "Draft Record, not public", false); + COMPLETED("Completed", "Record has been completed and is public", true), + REJECTED("Rejected", "Record has been reviewed and rejected", false), + REVIEW_REQUIRED("Review Required", "Review is required prior to public release", false), + IN_PROGRESS("In Progress", "Draft Record, not public", false); - private int _value; private String _name; private String _description; private boolean _publicData; - QCStateEnum(int value, String name, String description, boolean publicData) + QCStateEnum(String name, String description, boolean publicData) { - _value = value; _name = name; _description = description; _publicData = publicData; @@ -58,41 +67,35 @@ public void setPublicData(boolean publicData) _publicData = publicData; } - public int getValue() + public static Integer getQCStateEnumId(Container c, User u, QCStateEnum qcStateEnum) { - return _value; + if (qcStateEnum == null) { return null; } + TableInfo qcStateTable = CoreSchema.getInstance().getTableInfoDataStates(); + SimpleFilter qcFilter = SimpleFilter.createContainerFilter(c).addCondition(FieldKey.fromParts("Label"), qcStateEnum.getName(), CompareType.EQUAL); + Set cols = Collections.singleton("RowId"); + TableSelector qcStateTs = new TableSelector(qcStateTable, cols, qcFilter, null); + return qcStateTs.getObject(Integer.class); } - - public void setValue(int value) + public static QCStateEnum getQCStateEnumById(Container c, User u, int qcStateId) { - _value = value; - } - - - public static Integer getValueByName (String name) - { - for (QCStateEnum qcStateEnum : QCStateEnum.values()) - { - if (qcStateEnum.getName().toLowerCase().equals(name.toLowerCase())) - { - return qcStateEnum.getValue(); - } - } - - return null; + TableInfo qcStateTable = CoreSchema.getInstance().getTableInfoDataStates(); + SimpleFilter qcFilter = SimpleFilter.createContainerFilter(c).addCondition(FieldKey.fromParts("RowId"), qcStateId, CompareType.EQUAL); + Set cols = Collections.singleton("Label"); + TableSelector qcStateTs = new TableSelector(qcStateTable, cols, qcFilter, null); + String qcStateName = qcStateTs.getObject(String.class); + return QCStateEnum.getQCStateEnumByName(qcStateName); } @Nullable - public static QCStateEnum getByName(String name) + public static QCStateEnum getQCStateEnumByName(String name) { for (QCStateEnum qcStateEnum : QCStateEnum.values()) { - if (qcStateEnum.getName().toLowerCase().equals(name.toLowerCase())) + if (qcStateEnum.getName().equalsIgnoreCase(name)) { return qcStateEnum; } } - return null; } diff --git a/snprc_scheduler/src/org/labkey/snprc_scheduler/services/SNPRC_schedulerServiceValidator.java b/snprc_scheduler/src/org/labkey/snprc_scheduler/services/SNPRC_schedulerServiceValidator.java index d6ca3e9c4..b96538f68 100644 --- a/snprc_scheduler/src/org/labkey/snprc_scheduler/services/SNPRC_schedulerServiceValidator.java +++ b/snprc_scheduler/src/org/labkey/snprc_scheduler/services/SNPRC_schedulerServiceValidator.java @@ -113,7 +113,7 @@ public static void validateNewTimeline(Timeline timeline, Container c, User u, B { // All New Timeline, check json draft state (and other such checks here) // - if (timeline.getQcState() != null && !timeline.getQcState().equals(QCStateEnum.IN_PROGRESS.getValue())) + if (timeline.getQcState() != null && !timeline.getQcState().equals(QCStateEnum.getQCStateEnumId(c,u, QCStateEnum.IN_PROGRESS))) { errors.addRowError(new ValidationException("Timeline must be created in editable Draft state")); //tested throw errors; @@ -191,7 +191,7 @@ public static void validateNewTimeline(Timeline timeline, Container c, User u, B throw errors; } - else if (!timelineRow.get(Timeline.TIMELINE_QCSTATE ).equals(QCStateEnum.IN_PROGRESS.getValue())) + else if (!timelineRow.get(Timeline.TIMELINE_QCSTATE ).equals(QCStateEnum.getQCStateEnumId(c,u, QCStateEnum.IN_PROGRESS))) { // only admins and reviewers can change QCState if (!c.hasPermission(u, SNPRC_schedulerReviewersPermission.class) && !c.hasPermission(u, SNPRC_schedulerAdminPermission.class)) diff --git a/snprc_scheduler/test/src/org/labkey/test/tests/snprc_scheduler/TimelineScripts.java b/snprc_scheduler/test/src/org/labkey/test/tests/snprc_scheduler/TimelineScripts.java index 3d8334e2e..6b859c60a 100644 --- a/snprc_scheduler/test/src/org/labkey/test/tests/snprc_scheduler/TimelineScripts.java +++ b/snprc_scheduler/test/src/org/labkey/test/tests/snprc_scheduler/TimelineScripts.java @@ -70,7 +70,7 @@ public String saveTimelineScript(String testTimelineObjectId, String testProject " 'RC' : 'Mouse, Mikey',\n" + " 'Notes' : 'Dont take any wooden nickels.',\n" + " 'AnimalAccount' : '4815162342',\n" + - " 'QcState' : 4,\n" + // In-Progress + " 'QcStateLabel' : 'In Progress',\n" + /* Add TimelineItems */