diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/Scheduled.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/Scheduled.js index 6200062f31c1cadf30cfb922393fbb3f44838da3..410034172517e2fa2561ebc805ceca1f3348c4ec 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/Scheduled.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/Scheduled.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import { Button } from 'primereact/button'; import { Link } from 'react-router-dom'; import moment from 'moment'; @@ -36,7 +36,7 @@ class Scheduled extends Component { <div className="col-lg-1 col-md-1 col-sm-12"></div> <label htmlFor="suStatus" className="col-lg-2 col-md-2 col-sm-12">Timeline</label> <div className="col-lg-3 col-md-3 col-sm-12 block-list"> - <Link to={{ pathname: '/su/timelineview/week' }}>Week Overview <span class="fas fa-calendar-alt"></span></Link> + <Link to={{ pathname: '/su/timelineview/week' }}>Week Overview <span className="fas fa-calendar-alt"></span></Link> </div> <div className="col-lg-1 col-md-1 col-sm-12"></div> <label htmlFor="suStatus" className="col-lg-2 col-md-2 col-sm-12">Scheduling Method</label> @@ -55,7 +55,7 @@ class Scheduled extends Component { </div> </> ) - }; + } } export default Scheduled; \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js index f935d8db4fc764eaf3a96f67040573484722918d..f99a73f380830aed6b01505bffe46f9f71e62c2a 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/decide.acceptance.js @@ -1,5 +1,5 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import { Button } from 'primereact/button'; import SunEditor from 'suneditor-react'; import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File @@ -38,15 +38,22 @@ class DecideAcceptance extends Component { processPermission = await this.props.processPermission(); } const qaReportingResponse = await WorkflowService.getQAReportingTo(this.props.process.qa_reporting_to); - const qaSOSResponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos); - const piVerificationResponse = await WorkflowService.getQAPIverification(this.props.process.pi_verification); + let qaSOSResponse + if (this.props.process.qa_reporting_sos!==null) { + qaSOSResponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos); + } + let piVerificationResponse + if (this.props.process.pi_verification!==null) { + piVerificationResponse = await WorkflowService.getQAPIverification(this.props.process.pi_verification); + } + this.setState({ - content: qaSOSResponse.sos_report, - comment: piVerificationResponse.pi_report, - pi_accept: piVerificationResponse.pi_accept, + content: qaSOSResponse?.sos_report, + comment: piVerificationResponse?.pi_report, + pi_accept: piVerificationResponse?.pi_accept, operator_accept: qaReportingResponse.operator_accept, - quality_within_policy: qaSOSResponse.quality_within_policy, - sos_accept_show_pi: qaSOSResponse.sos_accept_show_pi, + quality_within_policy: qaSOSResponse?.quality_within_policy, + sos_accept_show_pi: qaSOSResponse?.sos_accept_show_pi, sos_accept_after_pi: piVerificationResponse.pi_accept, assignTo: this.props.readOnly?this.props.workflowTask.owner:(currentWorkflowTask?currentWorkflowTask.owner_id:null), currentWorkflowTask: currentWorkflowTask, @@ -128,10 +135,10 @@ class DecideAcceptance extends Component { {!this.props.readOnly && !this.state.reassign && <> {this.state.currentWorkflowTask.editPermissions - ? <Link onClick={e => this.setState({reassign: true})} style={{marginLeft: '10px'}}> + ? <Link onClick={this.setState({reassign: true})} style={{marginLeft: '10px'}}> <i className="pi pi-pencil"></i> </Link> - : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px'}} onClick={e => this.setState({reassign: true})}> + : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px'}} onClick={this.setState({reassign: true})}> <i className="pi pi-pencil"></i> </Link> } @@ -201,7 +208,7 @@ class DecideAcceptance extends Component { </div> <div className="btn-bar"> <Button label="Cancel" className="p-button-danger" icon="pi pi-times" style={{ width : '90px' }} - onClick={(e) => { this.props.onCancel()}} /> + onClick={ this.props.onCancel()} /> </div> </div>} {!this.props.readOnly && @@ -212,6 +219,6 @@ class DecideAcceptance extends Component { } </> ) - }; + } } export default DecideAcceptance; \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js index c66f88a9c10fed5061f9126fb88ca4abb9479964..a88d7259a6fddb644519693b76babd5d43145444 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/pi.verification.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import { Button } from 'primereact/button'; import SunEditor from 'suneditor-react'; import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File @@ -40,12 +40,23 @@ class PIverification extends Component { processPermission = await this.props.processPermission(); } const operatorResponse = await WorkflowService.getQAReportingTo(this.props.process.qa_reporting_to); - const sosResponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos); + + + let quality_within_policy = null; + let sos_accept_show_pi =null; + let report = null; + if (this.props.process.qa_reporting_sos) { // only call this service when we do haven an actual report + const sosResponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos); + quality_within_policy = sosResponse.quality_within_policy; + sos_accept_show_pi = sosResponse.sos_accept_show_pi; + report = sosResponse.sos_report; + } + this.setState({ operator_accept: operatorResponse.operator_accept, - content: sosResponse.sos_report, - quality_within_policy: sosResponse.quality_within_policy, - sos_accept_show_pi: sosResponse.sos_accept_show_pi, + content:report , + quality_within_policy: quality_within_policy, + sos_accept_show_pi: sos_accept_show_pi, assignTo: this.props.readOnly?this.props.workflowTask.owner:(currentWorkflowTask?currentWorkflowTask.owner_id:null), currentWorkflowTask: currentWorkflowTask, processPermission: processPermission, @@ -132,10 +143,10 @@ class PIverification extends Component { {!this.props.readOnly && !this.state.reassign && <> {this.state.currentWorkflowTask.editPermissions - ? <Link onClick={e => this.setState({reassign: true})} style={{marginLeft: '10px'}}> + ? <Link onClick={this.setState({reassign: true})} style={{marginLeft: '10px'}}> <i className="pi pi-pencil"></i> </Link> - : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px'}} onClick={e => this.setState({reassign: true})}> + : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px'}} onClick={ this.setState({reassign: true})}> <i className="pi pi-pencil"></i> </Link> } @@ -205,7 +216,7 @@ class PIverification extends Component { </div> <div className="btn-bar"> <Button label="Cancel" className="p-button-danger" icon="pi pi-times" style={{ width : '90px' }} - onClick={(e) => { this.props.onCancel()}} /> + onClick={ this.props.onCancel()} /> </div> </div>} {!this.props.readOnly && @@ -224,6 +235,6 @@ class PIverification extends Component { </div> </> ) - }; + } } export default PIverification; diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/processing.done.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/processing.done.js index c855bfa6914678da1a9be3b8396be3fa682652c7..cf6188b83ef2c608139c85d0f44d35416adb2ea8 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/processing.done.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/processing.done.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import { Button } from 'primereact/button'; import { Link } from 'react-router-dom'; import moment from 'moment'; @@ -46,7 +46,7 @@ class ProcessingDone extends Component { </div>} </> ) - }; + } } diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js index 90791048481835e9b9b1d7f0aed56b0d9170e61d..950cb32acbdd64c20d82782105948122e1297f2c 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/qa.sos.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import { Component } from 'react'; import { Button } from 'primereact/button'; import SunEditor from 'suneditor-react'; import 'suneditor/dist/css/suneditor.min.css'; // Import Sun Editor's CSS File @@ -42,12 +42,20 @@ class QAreportingSDCO extends Component { } async getQASOSDetails() { - const QASOSresponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos,this.props.process.operator_report); + + + let QASOSresponse; + if (this.props.process.qa_reporting_sos !== null && this.props.process.operator_report !== null) { + QASOSresponse = await WorkflowService.getQAReportingSOS(this.props.process.qa_reporting_sos, this.props.process.operator_report); + } + + + this.setState({ assignTo: this.props.workflowTask?this.props.workflowTask?.owner:null, - content: QASOSresponse.sos_report, - quality_within_policy: QASOSresponse.quality_within_policy, - sos_accept_show_pi: QASOSresponse.sos_accept_show_pi + content: QASOSresponse?.sos_report, + quality_within_policy: QASOSresponse?.quality_within_policy, + sos_accept_show_pi: QASOSresponse?.sos_accept_show_pi }); } @@ -113,10 +121,10 @@ class QAreportingSDCO extends Component { {!this.props.readOnly && !this.state.reassign && <> {this.state.currentWorkflowTask.editPermissions - ? <Link onClick={e => this.setState({reassign: true})} style={{marginLeft: '10px'}}> + ? <Link onClick={this.setState({reassign: true})} style={{marginLeft: '10px'}}> <i className="pi pi-pencil"></i> </Link> - : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px'}} onClick={e => this.setState({reassign: true})}> + : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px'}} onClick={this.setState({reassign: true})}> <i className="pi pi-pencil"></i> </Link> } @@ -176,7 +184,7 @@ class QAreportingSDCO extends Component { </div> <div className="btn-bar"> <Button label="Cancel" disabled={this.props.readOnly} className="p-button-danger" icon="pi pi-times" style={{ width : '90px' }} - onClick={(e) => { this.props.onCancel()}} /> + onClick={this.props.onCancel()} /> </div> </div>} {!this.props.readOnly && @@ -189,6 +197,6 @@ class QAreportingSDCO extends Component { </div> </> ) - }; + } } export default QAreportingSDCO; \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js index 5031251cae0f23270225135c4e2f750c668e1fda..693d8fed3d8f5fecebda184149703eff4707baf7 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/unpin.data.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { Button } from 'primereact/button'; import { Dialog } from 'primereact/dialog'; import ViewTable from './../../components/ViewTable'; @@ -7,43 +7,43 @@ import WorkflowService from '../../services/workflow.service'; import TaskAssigner from './task.assigner'; import IngestProgress from '../Scheduling/ingest.progress'; -export default ({ tasks, schedulingUnit, onCancel, ...props }) => { + +const UnPinData = ({ tasks, schedulingUnit, onCancel, ...props }) => { const [showConfirmDialog, setShowConfirmDialog] = useState(false); - // const [QASUProcess, setQASUProcess] = useState(); const [currentWorkflowTask, setCurrentWorkflowTask] = useState(); const [processPermission, setProcessPermission] = useState() const [assignTo, setAssignTo] = useState(); const [reassign, setReassign] = useState(false); - const defaultcolumns = [ { + const defaultcolumns = [{ name: "Name", - totalDataSize:"Total Data Size(TB)", - dataSizeNotDeleted :"Data Size on Disk(TB)" + totalDataSize: "Total Data Size(TB)", + dataSizeNotDeleted: "Data Size on Disk(TB)" }]; const optionalcolumns = [{ - actionpath:"actionpath", + actionpath: "actionpath", }]; - const defaultSortColumn = [{name: "Name", desc: true}]; + const defaultSortColumn = [{ name: "Name", desc: true }]; const columnclassname = [{ - "Name" : "filter-input-150", "Total Data Size(TB)" : "filter-input-100", "Data Size Not Deleted(TB)": "filter-input-100" + "Name": "filter-input-150", "Total Data Size(TB)": "filter-input-100", "Data Size Not Deleted(TB)": "filter-input-100" }]; const toggleDialog = () => { setShowConfirmDialog(!showConfirmDialog) }; const user = JSON.parse(localStorage.getItem("user")); - /** - * Method will trigger on click next buton - * here onNext props coming from parent, where will handle redirection to other page - */ + /** + * Method will trigger on click next buton + * here onNext props coming from parent, where will handle redirection to other page + */ const Next = async () => { - const currentWorkflowTask = await props.getCurrentTaskDetails(); + await props.getCurrentTaskDetails(); const promise = []; promise.push(WorkflowService.updateQA_Perform(props.id, {})); Promise.all(promise).then((responses) => { - if (responses.indexOf(null)<0) { + if (responses.indexOf(null) < 0) { props.onNext(); - } else { + } else { props.onError('error', 'Unable to proceed', 'Please clear your browser cookies and try again'); - } + } }); setShowConfirmDialog(false) } @@ -51,15 +51,18 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => { useEffect(() => { if (!props.readOnly && !currentWorkflowTask) { props.getCurrentTaskDetails() - .then(currentWorkflowTask => { - setCurrentWorkflowTask(currentWorkflowTask); - }); + .then(currentWorkflowTask => { + if (!currentWorkflowTask===undefined) { + setCurrentWorkflowTask(currentWorkflowTask); + } + + }); props.processPermission() - .then(permission => { - setProcessPermission(permission) - }) + .then(permission => { + setProcessPermission(permission) + }) } - if (props.readOnly && !assignTo) { + if (props.readOnly && !assignTo &&props.workflowTask!==undefined) { setAssignTo(props.workflowTask.owner); } }, []); @@ -67,9 +70,9 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => { /** * Callback function passed to the Task Assigner and is called after assigning or reassigning task owner. */ - const assignTaskCB = async() => { + const assignTaskCB = async () => { let currentWorkflowTask = await props.getCurrentTaskDetails(); - setCurrentWorkflowTask(currentWorkflowTask); + setCurrentWorkflowTask(currentWorkflowTask); setAssignTo(currentWorkflowTask.owner_id); setReassign(false); } @@ -78,68 +81,68 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => { <div className="p-field p-grid workflow-wrap" style={{ paddingLeft: '-10px' }}> <label htmlFor="assignTo" className="col-lg-2 col-md-2 col-sm-12">Assign To</label> <div className="col-lg-3 col-md-3 col-sm-12" data-testid="assignTo" > - {/* Display the assigned owner of the task */} - {assignTo && - <>{!props.readOnly ? currentWorkflowTask.owner_username: props.workflowTask.owner_username } - {/* Allow to edit the owner if the task is not yet completed */} - {!props.readOnly && !reassign && - <> - {currentWorkflowTask && currentWorkflowTask.editPermissions - ? <Link onClick={e => setReassign(true)} style={{marginLeft: '10px'}}> - <i className="pi pi-pencil"></i> - </Link> - : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px'}} onClick={e => this.setState({reassign: true})}> - <i className="pi pi-pencil"></i> - </Link> - - } + {/* Display the assigned owner of the task */} + {assignTo && + <>{!props.readOnly ? currentWorkflowTask.owner_username : props.workflowTask.owner_username} + {/* Allow to edit the owner if the task is not yet completed */} + {!props.readOnly && !reassign && + <> + {currentWorkflowTask && currentWorkflowTask.editPermissions + ? <Link onClick={ setReassign(true)} style={{ marginLeft: '10px' }}> + <i className="pi pi-pencil"></i> + </Link> + : <Link style={{ cursor: 'default', pointerEvents: "none", color: 'grey', marginLeft: '10px' }} onClick={this.setState({ reassign: true })}> + <i className="pi pi-pencil"></i> + </Link> + + } </>} - </> - } - {/* Display the task assigner if owner is not assigned or to reassign to other user */} - {(!assignTo || reassign) && currentWorkflowTask && - <TaskAssigner currentWorkflowTask={currentWorkflowTask} disableAssignToMe = {currentWorkflowTask && currentWorkflowTask.owner_username === user.name? true: false} + </> + } + {/* Display the task assigner if owner is not assigned or to reassign to other user */} + {(!assignTo || reassign) && currentWorkflowTask && + <TaskAssigner currentWorkflowTask={currentWorkflowTask} disableAssignToMe={currentWorkflowTask && currentWorkflowTask.owner_username === user.name ? true : false} projectRoles={props.projectRoles} callback={assignTaskCB} /> - } + } </div> {props.showIngestProgress && - <><label className="col-lg-2 col-md-2 col-sm-12" >Ingest Completeness</label> - <span className="col-lg-4 col-md-4 col-sm-12"> - <IngestProgress schedulingUnitId={schedulingUnit.id} /> - </span></>} + <><label className="col-lg-2 col-md-2 col-sm-12" >Ingest Completeness</label> + <span className="col-lg-4 col-md-4 col-sm-12"> + <IngestProgress schedulingUnitId={schedulingUnit.id} /> + </span></>} </div> - <label><h6>Details of data products of Tasks</h6></label> - <div style={{marginTop: "-50px"}}> - <ViewTable - data={tasks.filter(task => (task.totalDataSize!==undefined || task.dataSizeNotDeleted!==undefined))} - optionalcolumns={optionalcolumns} - defaultcolumns={defaultcolumns} - defaultSortColumn={defaultSortColumn} - columnclassname={columnclassname} - showColumnFilter={false} - showGlobalFilter={false} - showTopTotal={false} - allowColumnSelection={false} - showaction="true" - keyaccessor="id" - defaultpagesize={tasks.length} - /> - </div> - <div className="p-grid p-justify-start mt-2"> - {!props.readOnly && <div className="btn-bar"> - <Button - disabled={processPermission && currentWorkflowTask && currentWorkflowTask.editPermissions && currentWorkflowTask.owner_username === user.name? false: true } - label="Delete" className="p-button-primary" icon="pi pi-trash" onClick={toggleDialog} /> + <label><h6>Details of data products of Tasks</h6></label> + <div style={{ marginTop: "-50px" }}> + <ViewTable + data={tasks.filter(task => (task.totalDataSize !== undefined || task.dataSizeNotDeleted !== undefined))} + optionalcolumns={optionalcolumns} + defaultcolumns={defaultcolumns} + defaultSortColumn={defaultSortColumn} + columnclassname={columnclassname} + showColumnFilter={false} + showGlobalFilter={false} + showTopTotal={false} + allowColumnSelection={false} + showaction="true" + keyaccessor="id" + defaultpagesize={tasks.length} + /> + </div> + <div className="p-grid p-justify-start mt-2"> + {!props.readOnly && <div className="btn-bar"> + <Button + disabled={processPermission && currentWorkflowTask && currentWorkflowTask.editPermissions && currentWorkflowTask.owner_username === user.name ? false : true} + label="Delete" className="p-button-primary" icon="pi pi-trash" onClick={toggleDialog} /> </div>} {!props.readOnly && <div className="btn-bar"> <Button label="Cancel" className="p-button-danger" icon="pi pi-times" style={{ width: '90px' }} - onClick={(e) => { onCancel()}} /> + onClick={ onCancel() } /> </div>} </div> - {!props.readOnly && + {!props.readOnly && <> - {currentWorkflowTask && currentWorkflowTask.editPermissions && currentWorkflowTask.owner_username === user.name? - <span></span>: <span style={{color: 'red'}}>* You can only delete if you are assigned to this workflow step</span>} + {currentWorkflowTask && currentWorkflowTask.editPermissions && currentWorkflowTask.owner_username === user.name ? + <span></span> : <span style={{ color: 'red' }}>* You can only delete if you are assigned to this workflow step</span>} </> } <div className="p-grid" data-testid="confirm_dialog"> @@ -155,7 +158,7 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => { <i className="pi pi-large pi-question-circle pi-warning"></i> </div> <div className="col-lg-10 col-md-10 col-sm-10"> - Are you sure you want to delete dataproducts for scheduling unit {schedulingUnit.id} - {schedulingUnit.name} - {schedulingUnit.description} with status {schedulingUnit.status} + Are you sure you want to delete dataproducts for scheduling unit {schedulingUnit.id} - {schedulingUnit.name} - {schedulingUnit.description} with status {schedulingUnit.status} </div> </div> </Dialog> @@ -163,3 +166,4 @@ export default ({ tasks, schedulingUnit, onCancel, ...props }) => { </div> ) } +export default UnPinData; \ No newline at end of file diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js index fcf3c19caba5066bf410d99ff85ac9fa39e5ff4d..8e1758966c2c4f5e406b0bd8c3a06d91abea5e95 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Workflow/workflow.list.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { Component } from 'react'; import _ from 'lodash'; import moment from 'moment'; import {TriStateCheckbox} from 'primereact/tristatecheckbox'; @@ -381,7 +381,7 @@ class WorkflowList extends Component{ if(ftAssigned && activestage) { workflowList.push(workflow); } - }; + } this.setState({filteredWorkflowProcessList: workflowList}); } @@ -588,6 +588,6 @@ class WorkflowList extends Component{ </>: <AccessDenied/> } </React.Fragment> ); - }; + } } export default WorkflowList; \ No newline at end of file