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
*/