From a54c934d571863a2e68def65ed57d1ec28abf7cc Mon Sep 17 00:00:00 2001 From: Muthukrishnanmatriot <76949556+muthukrishnanmatriot@users.noreply.github.com> Date: Tue, 31 Aug 2021 17:43:55 +0530 Subject: [PATCH] Update review comments --- .../src/components/DynamicScheduler.js | 16 +- .../tmss_webapp/src/routes/Timeline/view.js | 565 +++++++++--------- .../src/routes/Timeline/week.view.js | 387 ++++++------ 3 files changed, 482 insertions(+), 486 deletions(-) diff --git a/SAS/TMSS/frontend/tmss_webapp/src/components/DynamicScheduler.js b/SAS/TMSS/frontend/tmss_webapp/src/components/DynamicScheduler.js index a03a4f9ec46..cdf2739b385 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/components/DynamicScheduler.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/components/DynamicScheduler.js @@ -2,7 +2,8 @@ import React, { Component } from 'react'; import UtilService from '../services/util.service'; import { CustomDialog } from '../layout/components/CustomDialog'; import { Growl } from 'primereact/components/growl/Growl'; -import { ToggleButton } from 'primereact/togglebutton'; +import {InputSwitch} from 'primereact/inputswitch'; +import AuthStore from '../authenticate/auth.store'; export default class DynamicScheduler extends Component { constructor(props) { @@ -11,6 +12,7 @@ export default class DynamicScheduler extends Component { this.state= { dsStatus: false, // Dynamic Scheduler Status showDialog: false, + userrole: AuthStore.getState(), } this.currentStatus = null; this.updateDSStatus = this.updateDSStatus.bind(this); @@ -59,19 +61,23 @@ export default class DynamicScheduler extends Component { } render() { + const {dynamicScheduler} = this.state.userrole.userRolePermission; + const tooltip = dynamicScheduler.setting?`Turn ${this.state.dsStatus? "'Off'" : "'On'"} Dynamic Scheduling`: "Don't have permission to Trun On/Off Dynamic Scheduling" return ( <> <Growl ref={(el) => this.growl = el} /> <div className="p-field p-grid"> - <label htmlFor="autodeletion" style={{marginRight: '10px', marginLeft: '50px'}}>Dynamic Scheduling : </label> - <ToggleButton onLabel="On" offLabel="Off" onIcon="pi pi-check" offIcon="pi pi-times" style={{top: '-4px'}} + <label htmlFor="autodeletion" style={{marginRight: '10px', marginLeft: '1em'}}>Dynamic Scheduling :</label> + <label htmlFor="onLabel" style={{ marginRight: '0.25em', color: 'black'}}>OFF</label> + <InputSwitch disabled={dynamicScheduler.setting?!dynamicScheduler.setting:true} checked={this.state.dsStatus} onChange={(e) => this.showConfirmDialog(e)} - tooltip={`Click to ${this.state.dsStatus? "'Switch Off'" : "'Switch On'"} the Dynamic Scheduling`} + tooltip={tooltip} tooltipOptions={this.tooltipOptions}/> + <label htmlFor="onLabel" style={{marginLeft: '0.25em', color: 'black'}}>ON</label> </div> <CustomDialog type="confirmation" visible={this.state.showDialog} width={'35vw'} - header={'Confirmation'} message={`Are you sure want to switch ${this.currentStatus === true ? 'On' : 'Off'} the Dynamic Scheduling?` } + header={'Confirmation'} message={`Do you want to turn ${this.currentStatus === true ? 'On' : 'Off'} Dynamic Scheduling?` } content={''} showIcon={true} onClose={this.closeDialog} onCancel={this.closeDialog} onSubmit={this.updateDSStatus} /> diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js index 2dd9e702b34..6eea35d5314 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/view.js @@ -1144,307 +1144,302 @@ export class TimelineView extends Component { let mouseOverItem = this.state.mouseOverItem; return ( <React.Fragment> - {dynamicScheduler && - <> - <TieredMenu className="app-header-menu" model={this.state.menuOptions} popup ref={el => this.optionsMenu = el} /> - <PageHeader location={this.props.location} title={'Scheduling Units - Timeline View'} - actions={[ - { icon: 'fa-cog', title: dynamicScheduler.setting? 'Switch On/Off the Dynamic Scheduling': `Don't have permission to Switch On/Off the Dynamic Scheduling`, - type: 'button', actOn: 'click', props: { callback: this.showDymanicSchedulerPopup }, - disabled: dynamicScheduler.setting?!dynamicScheduler.setting:true, }, - { icon: 'fa-bars', title: '', - type: 'button', actOn: 'mouseOver', props: { callback: this.showOptionMenu }, }, - { icon: 'fa-calendar-alt', title: 'Week View', props: { pathname: `/su/timelineview/week` } } - ]} - /> - { this.state.isLoading ? <AppLoader /> : - <div className="p-grid"> - {/* SU List Panel */} - <div className={isSUListVisible && (isSUDetsVisible || isReservDetsVisible || isTaskDetsVisible || - (canExtendSUList && !canShrinkSUList) ? "col-lg-4 col-md-4 col-sm-12" : - ((canExtendSUList && canShrinkSUList) ? "col-lg-5 col-md-5 col-sm-12" : "col-lg-6 col-md-6 col-sm-12"))} - style={isSUListVisible ? { position: "inherit", borderRight: "3px solid #efefef", paddingTop: "10px" } : { display: 'none' }}> - <TimelineListTabs suBlueprintList={this.state.suBlueprintList} - suListFilterCallback={this.suListFilterCallback} - reservationList={this.getReservationList()} - suStatusList={this.state.suStatusList} - taskStatusList={this.state.taskStatusList} - ></TimelineListTabs> + <TieredMenu className="app-header-menu" model={this.state.menuOptions} popup ref={el => this.optionsMenu = el} /> + <PageHeader location={this.props.location} title={'Scheduling Units - Timeline View'} + actions={[ + { icon: 'fa-cog', title: 'Dynamic Scheduling Settings', + type: 'button', actOn: 'click', props: { callback: this.showDymanicSchedulerPopup }, }, + { icon: 'fa-bars', title: '', + type: 'button', actOn: 'mouseOver', props: { callback: this.showOptionMenu }, }, + { icon: 'fa-calendar-alt', title: 'Week View', props: { pathname: `/su/timelineview/week` } } + ]} + /> + { this.state.isLoading ? <AppLoader /> : + <div className="p-grid"> + {/* SU List Panel */} + <div className={isSUListVisible && (isSUDetsVisible || isReservDetsVisible || isTaskDetsVisible || + (canExtendSUList && !canShrinkSUList) ? "col-lg-4 col-md-4 col-sm-12" : + ((canExtendSUList && canShrinkSUList) ? "col-lg-5 col-md-5 col-sm-12" : "col-lg-6 col-md-6 col-sm-12"))} + style={isSUListVisible ? { position: "inherit", borderRight: "3px solid #efefef", paddingTop: "10px" } : { display: 'none' }}> + <TimelineListTabs suBlueprintList={this.state.suBlueprintList} + suListFilterCallback={this.suListFilterCallback} + reservationList={this.getReservationList()} + suStatusList={this.state.suStatusList} + taskStatusList={this.state.taskStatusList} + ></TimelineListTabs> + </div> + {/* Timeline Panel */} + <div className={isSUListVisible ? ((isSUDetsVisible || isReservDetsVisible) ? "col-lg-5 col-md-5 col-sm-12" : + (!canExtendSUList && canShrinkSUList) ? "col-lg-6 col-md-6 col-sm-12" : + ((canExtendSUList && canShrinkSUList) ? "col-lg-7 col-md-7 col-sm-12" : "col-lg-8 col-md-8 col-sm-12")) : + ((isSUDetsVisible || isReservDetsVisible || isTaskDetsVisible) ? "col-lg-9 col-md-9 col-sm-12" : "col-lg-12 col-md-12 col-sm-12")} + // style={{borderLeft: "3px solid #efefef"}} + > + {/* Panel Resize buttons */} + {isSUListVisible && + <div className="resize-div"> + <button className="p-link resize-btn" disabled={!this.state.canShrinkSUList} + title="Shrink List/Expand Timeline" + onClick={(e) => { this.resizeSUList(-1) }}> + <i className="pi pi-step-backward"></i> + </button> + <button className="p-link resize-btn" disabled={!this.state.canExtendSUList} + title="Expand List/Shrink Timeline" + onClick={(e) => { this.resizeSUList(1) }}> + <i className="pi pi-step-forward"></i> + </button> </div> - {/* Timeline Panel */} - <div className={isSUListVisible ? ((isSUDetsVisible || isReservDetsVisible) ? "col-lg-5 col-md-5 col-sm-12" : - (!canExtendSUList && canShrinkSUList) ? "col-lg-6 col-md-6 col-sm-12" : - ((canExtendSUList && canShrinkSUList) ? "col-lg-7 col-md-7 col-sm-12" : "col-lg-8 col-md-8 col-sm-12")) : - ((isSUDetsVisible || isReservDetsVisible || isTaskDetsVisible) ? "col-lg-9 col-md-9 col-sm-12" : "col-lg-12 col-md-12 col-sm-12")} - // style={{borderLeft: "3px solid #efefef"}} - > - {/* Panel Resize buttons */} - {isSUListVisible && - <div className="resize-div"> - <button className="p-link resize-btn" disabled={!this.state.canShrinkSUList} - title="Shrink List/Expand Timeline" - onClick={(e) => { this.resizeSUList(-1) }}> - <i className="pi pi-step-backward"></i> - </button> - <button className="p-link resize-btn" disabled={!this.state.canExtendSUList} - title="Expand List/Shrink Timeline" - onClick={(e) => { this.resizeSUList(1) }}> - <i className="pi pi-step-forward"></i> - </button> + } + <div className={isSUListVisible ? "resize-div su-visible" : "resize-div su-hidden"}> + {isSUListVisible && + <button className="p-link resize-btn" + title="Hide List" + onClick={(e) => { this.showListPanel(false) }}> + <i className="pi pi-eye-slash"></i> + </button> + } + {!isSUListVisible && + <button className="p-link resize-btn" + title="Show List" + onClick={(e) => { this.showListPanel(true) }}> + <i className="pi pi-eye"> Show List</i> + </button> + } + </div> + <div className={`timeline-view-toolbar p-grid ${this.state.stationView && 'alignTimeLineHeader'}`}> + <div className="sub-header col-lg-2"> + <label >Station View</label> + <InputSwitch checked={this.state.stationView} onChange={(e) => { this.setStationView(e) }} /> + </div> + {this.state.stationView && + <> + <div className="sub-header col-lg-2"> + <label>Show</label> + <Button className="p-button-rounded toggle-btn" + tooltip={this.state.isStationTasksVisible?"Show Scheduling Units":"Show Tasks"} + style={{minWidth: "50px"}} + label={this.state.isStationTasksVisible?"SUs":"Tasks"} + onClick={e => this.changeViewBlocks()} /> + </div> + <div className="sub-header col-lg-4"> + <label style={{ marginLeft: '20px' }}>Stations Group</label> + <MultiSelect data-testid="stations" id="stations" optionLabel="value" optionValue="value" + style={{ top: '2px', width: '175px' }} + tooltip="Select Stations" + value={this.state.selectedStationGroup} + options={this.mainStationGroupOptions} + placeholder="Select Group" + onChange={(e) => this.setSelectedStationGroup(e.value)} + /> + </div> + </> + } + {!this.state.stationView && + <> + <div className="sub-header col-lg-5"> + <div className={`sub-header-content ${isSUListVisible?"col-lg-12":"col-lg-8"}`} style={{padding: '0px !important'}}> + <fieldset> + <label style={{ marginLeft: '0px' }}>Show :</label> + <input type="radio" value="su" name="Only SUs" className="timeline-toolbar-radio" inputId="suOnly" onClick={(e) => this.showTimelineItems(e.target.value)} checked={this.state.showSUs && !this.state.showTasks} /> + <label htmlFor="suOnly">Only SU</label> + <input type="radio" value="task" name="Only Tasks" className="timeline-toolbar-radio" inputId="taskOnly" onChange={(e) => this.showTimelineItems(e.target.value)} checked={!this.state.showSUs && this.state.showTasks} /> + <label htmlFor="suOnly">Only Task</label> + <input type="radio" value="suTask" name="Both" className="timeline-toolbar-radio" inputId="bothSuTask" onChange={(e) => this.showTimelineItems(e.target.value)} checked={this.state.showSUs && this.state.showTasks} /> + <label htmlFor="suOnly">Both</label> + </fieldset> </div> - } - <div className={isSUListVisible ? "resize-div su-visible" : "resize-div su-hidden"}> - {isSUListVisible && - <button className="p-link resize-btn" - title="Hide List" - onClick={(e) => { this.showListPanel(false) }}> - <i className="pi pi-eye-slash"></i> - </button> - } - {!isSUListVisible && - <button className="p-link resize-btn" - title="Show List" - onClick={(e) => { this.showListPanel(true) }}> - <i className="pi pi-eye"> Show List</i> - </button> + {this.state.showTasks && + <div className={`sub-header-content ${isSUListVisible?"col-lg-12":"col-lg-3"}`} style={{padding: '0px !important', marginLeft: `${isSUListVisible?"50px":"0px"}`}}> + <MultiSelect data-testid="tasks" id="tasks" optionLabel="value" optionValue="value" + style={{ width: '120px', height: '25px', marginRight: '10px' }} + tooltip={this.state.selectedTaskTypes.length>0? + `Showing tasks of task type(s) ${this.state.selectedTaskTypes.join(', ')}`: + "Select task type(s) to show in the timeline"} + maxSelectedLabels="1" + selectedItemsLabel="{0} Task Types" + value={this.state.selectedTaskTypes} + options={this.state.taskTypes} + placeholder="Task Type" + onChange={(e) => {this.setSelectedTaskTypes(e.value)}} + /> + </div> } </div> - <div className={`timeline-view-toolbar p-grid ${this.state.stationView && 'alignTimeLineHeader'}`}> - <div className="sub-header col-lg-2"> - <label >Station View</label> - <InputSwitch checked={this.state.stationView} onChange={(e) => { this.setStationView(e) }} /> - </div> - {this.state.stationView && + <div className="sub-header col-lg-2" style={{paddingTop: "15px !important"}}> + {this.state.groupByProject && + <Button className="p-button-rounded toggle-btn" label="Group By SU" onClick={e => this.setGroupByProject(false)} />} + {!this.state.groupByProject && + <Button className="p-button-rounded toggle-btn" label="Group By Project" onClick={e => this.setGroupByProject(true)} />} + </div> + </> + } + <div className="sub-header col-lg-3"> + {!this.state.stationView && + <Button className="p-button-rounded toggle-btn" + tooltip={this.state.showReservation?"Hide Reservations":"Show Reservations"} + style={{minWidth: "50px"}} + label={this.state.showReservation?"Hide Reservation":"Show Reservation"} + onClick={e => this.showReservationBlocks()} /> + } + { this.state.stationView && + <label style={{ marginLeft: '20px' }}>Reservation</label> + } + { (this.state.stationView || this.state.showReservation) && <> - <div className="sub-header col-lg-2"> - <label>Show</label> - <Button className="p-button-rounded toggle-btn" - tooltip={this.state.isStationTasksVisible?"Show Scheduling Units":"Show Tasks"} - style={{minWidth: "50px"}} - label={this.state.isStationTasksVisible?"SUs":"Tasks"} - onClick={e => this.changeViewBlocks()} /> - </div> - <div className="sub-header col-lg-4"> - <label style={{ marginLeft: '20px' }}>Stations Group</label> - <MultiSelect data-testid="stations" id="stations" optionLabel="value" optionValue="value" - style={{ top: '2px', width: '175px' }} - tooltip="Select Stations" - value={this.state.selectedStationGroup} - options={this.mainStationGroupOptions} - placeholder="Select Group" - onChange={(e) => this.setSelectedStationGroup(e.value)} - /> - </div> + <MultiSelect data-testid="reserv-reasons" id="reserv-reasons" + optionLabel="name" optionValue="name" + style={{ top: '2px', marginLeft:'5px', minWidth: '100px' }} + panelStyle={{right: '0px'}} + tooltip="Select Reservation Reason(s)" + value={this.state.reservationFilter} + options={this.reservationReasons} + maxSelectedLabels="1" + filter showClear={true} filterBy="name" + placeholder="Reason" + onChange={(e) => this.setReservationFilter(e.value)} + /> </> - } - {!this.state.stationView && - <> - <div className="sub-header col-lg-5"> - <div className={`sub-header-content ${isSUListVisible?"col-lg-12":"col-lg-8"}`} style={{padding: '0px !important'}}> - <fieldset> - <label style={{ marginLeft: '0px' }}>Show :</label> - <input type="radio" value="su" name="Only SUs" className="timeline-toolbar-radio" inputId="suOnly" onClick={(e) => this.showTimelineItems(e.target.value)} checked={this.state.showSUs && !this.state.showTasks} /> - <label htmlFor="suOnly">Only SU</label> - <input type="radio" value="task" name="Only Tasks" className="timeline-toolbar-radio" inputId="taskOnly" onChange={(e) => this.showTimelineItems(e.target.value)} checked={!this.state.showSUs && this.state.showTasks} /> - <label htmlFor="suOnly">Only Task</label> - <input type="radio" value="suTask" name="Both" className="timeline-toolbar-radio" inputId="bothSuTask" onChange={(e) => this.showTimelineItems(e.target.value)} checked={this.state.showSUs && this.state.showTasks} /> - <label htmlFor="suOnly">Both</label> - </fieldset> - </div> - {this.state.showTasks && - <div className={`sub-header-content ${isSUListVisible?"col-lg-12":"col-lg-3"}`} style={{padding: '0px !important', marginLeft: `${isSUListVisible?"50px":"0px"}`}}> - <MultiSelect data-testid="tasks" id="tasks" optionLabel="value" optionValue="value" - style={{ width: '120px', height: '25px', marginRight: '10px' }} - tooltip={this.state.selectedTaskTypes.length>0? - `Showing tasks of task type(s) ${this.state.selectedTaskTypes.join(', ')}`: - "Select task type(s) to show in the timeline"} - maxSelectedLabels="1" - selectedItemsLabel="{0} Task Types" - value={this.state.selectedTaskTypes} - options={this.state.taskTypes} - placeholder="Task Type" - onChange={(e) => {this.setSelectedTaskTypes(e.value)}} - /> - </div> - } - </div> - <div className="sub-header col-lg-2" style={{paddingTop: "15px !important"}}> - {this.state.groupByProject && - <Button className="p-button-rounded toggle-btn" label="Group By SU" onClick={e => this.setGroupByProject(false)} />} - {!this.state.groupByProject && - <Button className="p-button-rounded toggle-btn" label="Group By Project" onClick={e => this.setGroupByProject(true)} />} - </div> - </> - } - <div className="sub-header col-lg-3"> - {!this.state.stationView && - <Button className="p-button-rounded toggle-btn" - tooltip={this.state.showReservation?"Hide Reservations":"Show Reservations"} - style={{minWidth: "50px"}} - label={this.state.showReservation?"Hide Reservation":"Show Reservation"} - onClick={e => this.showReservationBlocks()} /> - } - { this.state.stationView && - <label style={{ marginLeft: '20px' }}>Reservation</label> - } - { (this.state.stationView || this.state.showReservation) && - <> - <MultiSelect data-testid="reserv-reasons" id="reserv-reasons" - optionLabel="name" optionValue="name" - style={{ top: '2px', marginLeft:'5px', minWidth: '100px' }} - panelStyle={{right: '0px'}} - tooltip="Select Reservation Reason(s)" - value={this.state.reservationFilter} - options={this.reservationReasons} - maxSelectedLabels="1" - filter showClear={true} filterBy="name" - placeholder="Reason" - onChange={(e) => this.setReservationFilter(e.value)} - /> - </> - } - </div> + } + </div> - </div> + </div> - <Timeline ref={(tl) => { this.timeline = tl }} - defaultStartTime={this.state.currentStartTime} - defaultEndTime={this.state.currentEndTime} - group={this.state.group} - items={this.state.items} - currentUTC={this.state.currentUTC} - rowHeight={this.state.stationView ? 50 : 50} - sidebarWidth={!this.state.showSUs ? 250 : 200} - itemClickCallback={this.onItemClick} - itemMouseOverCallback={this.onItemMouseOver} - itemMouseOutCallback={this.onItemMouseOut} - dateRangeCallback={this.dateRangeCallback} - showSunTimings={!this.state.stationView} - timelineCommonUtils={this.timelineCommonUtils} - timelineUIAttributes={this.timelineUIAttributes} - // stackItems ={this.state.stationView} - stackItems - className="timeline-toolbar-margin-top-0"></Timeline> - </div> - {/* Details Panel */} - {this.state.isSUDetsVisible && - <div className="col-lg-3 col-md-3 col-sm-12" - style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> - {this.state.isSummaryLoading ? <AppLoader /> : - <SchedulingUnitSummary schedulingUnit={suBlueprint} suTaskList={this.state.suTaskList} - viewInNewWindow - constraintsTemplate={this.state.suConstraintTemplate} - stationGroup={this.state.stationGroup} - closeCallback={this.closeSUDets}></SchedulingUnitSummary> - } - </div> + <Timeline ref={(tl) => { this.timeline = tl }} + defaultStartTime={this.state.currentStartTime} + defaultEndTime={this.state.currentEndTime} + group={this.state.group} + items={this.state.items} + currentUTC={this.state.currentUTC} + rowHeight={this.state.stationView ? 50 : 50} + sidebarWidth={!this.state.showSUs ? 250 : 200} + itemClickCallback={this.onItemClick} + itemMouseOverCallback={this.onItemMouseOver} + itemMouseOutCallback={this.onItemMouseOut} + dateRangeCallback={this.dateRangeCallback} + showSunTimings={!this.state.stationView} + timelineCommonUtils={this.timelineCommonUtils} + timelineUIAttributes={this.timelineUIAttributes} + // stackItems ={this.state.stationView} + stackItems + className="timeline-toolbar-margin-top-0"></Timeline> + </div> + {/* Details Panel */} + {this.state.isSUDetsVisible && + <div className="col-lg-3 col-md-3 col-sm-12" + style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> + {this.state.isSummaryLoading ? <AppLoader /> : + <SchedulingUnitSummary schedulingUnit={suBlueprint} suTaskList={this.state.suTaskList} + viewInNewWindow + constraintsTemplate={this.state.suConstraintTemplate} + stationGroup={this.state.stationGroup} + closeCallback={this.closeSUDets}></SchedulingUnitSummary> } - {this.state.isTaskDetsVisible && - <div className="col-lg-3 col-md-3 col-sm-12" - style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> - {this.state.isSummaryLoading ? <AppLoader /> : - <div>Yet to be developed <i className="fa fa-times" onClick={this.closeSUDets}></i></div> - } - </div> + </div> + } + {this.state.isTaskDetsVisible && + <div className="col-lg-3 col-md-3 col-sm-12" + style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> + {this.state.isSummaryLoading ? <AppLoader /> : + <div>Yet to be developed <i className="fa fa-times" onClick={this.closeSUDets}></i></div> } - {this.state.isReservDetsVisible && - <div className="col-lg-3 col-md-3 col-sm-12" - style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> - {this.state.isSummaryLoading ? <AppLoader /> : - <ReservationSummary reservation={reservation} viewInNewWindow={true} - closeCallback={this.closeSUDets}></ReservationSummary> - } - </div> + </div> + } + {this.state.isReservDetsVisible && + <div className="col-lg-3 col-md-3 col-sm-12" + style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> + {this.state.isSummaryLoading ? <AppLoader /> : + <ReservationSummary reservation={reservation} viewInNewWindow={true} + closeCallback={this.closeSUDets}></ReservationSummary> } </div> - } - {/* SU Item Tooltip popover with SU status color */} - <OverlayPanel className="timeline-popover" ref={(el) => this.popOver = el} dismissable> - {(mouseOverItem && (["SCHEDULE", "TASK", "STATION_TASK"].indexOf(mouseOverItem.type) >= 0)) && - <div className={`p-grid su-${mouseOverItem.status}`} style={{ width: '350px' }}> - <h3 className={`col-12 su-${mouseOverItem.status}-icon`}>{mouseOverItem.type === 'SCHEDULE' ? 'Scheduling Unit ' : 'Task '}Overview</h3> - <hr></hr> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Project:</label> - <div className="col-7">{mouseOverItem.project}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduling Unit:</label> - <div className="col-7">{mouseOverItem.suName}</div> - {mouseOverItem.type === 'SCHEDULE' && - <> + </div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduler:</label> - <div className="col-7">{mouseOverItem.scheduleMethod}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Friends:</label> - <div className="col-7">{mouseOverItem.friends ? mouseOverItem.friends : "-"}</div> - </>} - { (mouseOverItem.type === 'TASK' || mouseOverItem.type === 'STATION_TASK') && - <> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Task Name:</label> - <div className="col-7">{mouseOverItem.name}</div> - </>} - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Start Time:</label> - <div className="col-7">{mouseOverItem.start_time.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>End Time:</label> - <div className="col-7">{mouseOverItem.end_time.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> - {mouseOverItem.type === 'SCHEDULE' && - <> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Antenna Set:</label> - <div className="col-7">{mouseOverItem.antennaSet}</div> - </>} - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Stations:</label> - <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Status:</label> - <div className="col-7">{mouseOverItem.status}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Duration:</label> - <div className="col-7">{mouseOverItem.duration}</div> - </div> - } - {(mouseOverItem && mouseOverItem.type === "RESERVATION") && - <div className={`p-grid`} style={{ width: '350px', backgroundColor: mouseOverItem.bgColor, color: mouseOverItem.color }}> - <h3 className={`col-12`}>Reservation Overview</h3> - <hr></hr> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Name:</label> + } + {/* SU Item Tooltip popover with SU status color */} + <OverlayPanel className="timeline-popover" ref={(el) => this.popOver = el} dismissable> + {(mouseOverItem && (["SCHEDULE", "TASK", "STATION_TASK"].indexOf(mouseOverItem.type) >= 0)) && + <div className={`p-grid su-${mouseOverItem.status}`} style={{ width: '350px' }}> + <h3 className={`col-12 su-${mouseOverItem.status}-icon`}>{mouseOverItem.type === 'SCHEDULE' ? 'Scheduling Unit ' : 'Task '}Overview</h3> + <hr></hr> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Project:</label> + <div className="col-7">{mouseOverItem.project}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduling Unit:</label> + <div className="col-7">{mouseOverItem.suName}</div> + {mouseOverItem.type === 'SCHEDULE' && + <> + + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduler:</label> + <div className="col-7">{mouseOverItem.scheduleMethod}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Friends:</label> + <div className="col-7">{mouseOverItem.friends ? mouseOverItem.friends : "-"}</div> + </>} + { (mouseOverItem.type === 'TASK' || mouseOverItem.type === 'STATION_TASK') && + <> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Task Name:</label> <div className="col-7">{mouseOverItem.name}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Description:</label> - <div className="col-7">{mouseOverItem.desc}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Type:</label> - <div className="col-7">{mouseOverItem.activity_type}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Stations:</label> - {/* <div className="col-7"><ListBox options={mouseOverItem.stations} /></div> */} - <div className="col-7 station-list"> - {mouseOverItem.stations.map((station, index) => ( - <div key={`stn-${index}`}>{station}</div> - ))} - </div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Project:</label> - <div className="col-7">{mouseOverItem.project ? mouseOverItem.project : "-"}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Start Time:</label> - <div className="col-7">{mouseOverItem.start_time.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>End Time:</label> - <div className="col-7">{mouseOverItem.duration!=="Unknown"?mouseOverItem.end_time.format(UIConstants.CALENDAR_DATETIME_FORMAT):"Unknown"}</div> - {/* <label className={`col-5`} style={{color: mouseOverItem.color}}>Stations:</label> - <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> */} - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Duration:</label> - <div className="col-7">{mouseOverItem.duration}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Planned:</label> - <div className="col-7">{mouseOverItem.planned ? 'Yes' : 'No'}</div> - </div> - } - </OverlayPanel> - {!this.state.isLoading && - <Websocket url={process.env.REACT_APP_WEBSOCKET_URL} onOpen={this.onConnect} onMessage={this.handleData} onClose={this.onDisconnect} />} - {this.state.showDialog && - <div className="p-grid" data-testid="confirm_dialog"> - <CustomDialog type="success" visible={this.state.showDialog} width="30vw" showIcon={false} - header="Dynamic Scheduling Settings" message={<DynamicScheduler />} - content={''} - actions={ [ - {id:"no", title: 'Close', callback: this.close} ]} - onClose={this.close} - /> + </>} + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Start Time:</label> + <div className="col-7">{mouseOverItem.start_time.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>End Time:</label> + <div className="col-7">{mouseOverItem.end_time.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> + {mouseOverItem.type === 'SCHEDULE' && + <> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Antenna Set:</label> + <div className="col-7">{mouseOverItem.antennaSet}</div> + </>} + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Stations:</label> + <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Status:</label> + <div className="col-7">{mouseOverItem.status}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Duration:</label> + <div className="col-7">{mouseOverItem.duration}</div> + </div> + } + {(mouseOverItem && mouseOverItem.type === "RESERVATION") && + <div className={`p-grid`} style={{ width: '350px', backgroundColor: mouseOverItem.bgColor, color: mouseOverItem.color }}> + <h3 className={`col-12`}>Reservation Overview</h3> + <hr></hr> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Name:</label> + <div className="col-7">{mouseOverItem.name}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Description:</label> + <div className="col-7">{mouseOverItem.desc}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Type:</label> + <div className="col-7">{mouseOverItem.activity_type}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Stations:</label> + {/* <div className="col-7"><ListBox options={mouseOverItem.stations} /></div> */} + <div className="col-7 station-list"> + {mouseOverItem.stations.map((station, index) => ( + <div key={`stn-${index}`}>{station}</div> + ))} </div> - } - </> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Project:</label> + <div className="col-7">{mouseOverItem.project ? mouseOverItem.project : "-"}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Start Time:</label> + <div className="col-7">{mouseOverItem.start_time.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>End Time:</label> + <div className="col-7">{mouseOverItem.duration!=="Unknown"?mouseOverItem.end_time.format(UIConstants.CALENDAR_DATETIME_FORMAT):"Unknown"}</div> + {/* <label className={`col-5`} style={{color: mouseOverItem.color}}>Stations:</label> + <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> */} + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Duration:</label> + <div className="col-7">{mouseOverItem.duration}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Planned:</label> + <div className="col-7">{mouseOverItem.planned ? 'Yes' : 'No'}</div> + </div> + } + </OverlayPanel> + {!this.state.isLoading && + <Websocket url={process.env.REACT_APP_WEBSOCKET_URL} onOpen={this.onConnect} onMessage={this.handleData} onClose={this.onDisconnect} />} + {this.state.showDialog && + <div className="p-grid" data-testid="confirm_dialog"> + <CustomDialog type="success" visible={this.state.showDialog} width="30vw" showIcon={false} + header="Dynamic Scheduling Settings" message={<DynamicScheduler />} + content={''} + actions={ [ + {id:"no", title: 'Close', callback: this.close} ]} + onClose={this.close} + /> + </div> } </React.Fragment> diff --git a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js index 8c353d98805..a7f44266cf2 100644 --- a/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js +++ b/SAS/TMSS/frontend/tmss_webapp/src/routes/Timeline/week.view.js @@ -869,215 +869,210 @@ export class WeekTimelineView extends Component { const mouseOverItem = this.state.mouseOverItem; return ( <React.Fragment> - {dynamicScheduler && + <TieredMenu className="app-header-menu" model={this.state.menuOptions} popup ref={el => this.optionsMenu = el} /> + <PageHeader location={this.props.location} title={'Scheduling Units - Week View'} + actions={[ + { icon: 'fa-cog', title: 'Dynamic Scheduling Settings', + type: 'button', actOn: 'click', props: { callback: this.showDymanicSchedulerPopup }, }, + { icon: 'fa-bars', title: '', type: 'button', actOn: 'mouseOver', props: { callback: this.showOptionMenu }, }, + { icon: 'fa-clock', title: 'View Timeline', props: { pathname: `/su/timelineview` } }]} /> + { this.state.isLoading ? <AppLoader /> : <> - <TieredMenu className="app-header-menu" model={this.state.menuOptions} popup ref={el => this.optionsMenu = el} /> - <PageHeader location={this.props.location} title={'Scheduling Units - Week View'} - actions={[ - { icon: 'fa-cog', title: dynamicScheduler.setting? 'Switch On/Off the Dynamic Scheduling': `Don't have permission to Switch On/Off the Dynamic Scheduling`, - type: 'button', actOn: 'click', props: { callback: this.showDymanicSchedulerPopup }, - disabled: dynamicScheduler.setting?!dynamicScheduler.setting:true, }, - { icon: 'fa-bars', title: '', type: 'button', actOn: 'mouseOver', props: { callback: this.showOptionMenu }, }, - { icon: 'fa-clock', title: 'View Timeline', props: { pathname: `/su/timelineview` } }]} /> - { this.state.isLoading ? <AppLoader /> : - <> - {/* <div className="p-field p-grid"> - <div className="col-lg-6 col-md-6 col-sm-12" data-testid="project" > - <Dropdown inputId="project" optionLabel="name" optionValue="name" - value={this.state.selectedProject} options={this.state.projects} - onChange={(e) => {this.filterByProject(e.value)}} - placeholder="Filter by Project" /> - </div> - </div> */} - <div className="p-grid"> - {/* SU List Panel */} - <div className={isSUListVisible && (isSUDetsVisible || isReservDetsVisible || - (canExtendSUList && !canShrinkSUList) ? "col-lg-4 col-md-4 col-sm-12" : - ((canExtendSUList && canShrinkSUList) ? "col-lg-5 col-md-5 col-sm-12" : "col-lg-6 col-md-6 col-sm-12"))} - style={isSUListVisible ? { position: "inherit", borderRight: "5px solid #efefef", paddingTop: "10px" } : { display: "none" }}> - <TimelineListTabs suBlueprintList={this.state.suBlueprintList} - suListFilterCallback={this.suListFilterCallback} - reservationList={this.getReservationList()} - suStatusList={this.state.suStatusList} - taskStatusList={this.state.taskStatusList} - ></TimelineListTabs> - </div> - {/* Timeline Panel */} - <div className={isSUListVisible ? ((isSUDetsVisible || isReservDetsVisible) ? "col-lg-5 col-md-5 col-sm-12" : - (!canExtendSUList && canShrinkSUList) ? "col-lg-6 col-md-6 col-sm-12" : - ((canExtendSUList && canShrinkSUList) ? "col-lg-7 col-md-7 col-sm-12" : "col-lg-8 col-md-8 col-sm-12")) : - ((isSUDetsVisible || isReservDetsVisible) ? "col-lg-9 col-md-9 col-sm-12" : "col-lg-12 col-md-12 col-sm-12")} - // style={{borderLeft: "3px solid #efefef"}} - > - {/* Panel Resize buttons */} + {/* <div className="p-field p-grid"> + <div className="col-lg-6 col-md-6 col-sm-12" data-testid="project" > + <Dropdown inputId="project" optionLabel="name" optionValue="name" + value={this.state.selectedProject} options={this.state.projects} + onChange={(e) => {this.filterByProject(e.value)}} + placeholder="Filter by Project" /> + </div> + </div> */} + <div className="p-grid"> + {/* SU List Panel */} + <div className={isSUListVisible && (isSUDetsVisible || isReservDetsVisible || + (canExtendSUList && !canShrinkSUList) ? "col-lg-4 col-md-4 col-sm-12" : + ((canExtendSUList && canShrinkSUList) ? "col-lg-5 col-md-5 col-sm-12" : "col-lg-6 col-md-6 col-sm-12"))} + style={isSUListVisible ? { position: "inherit", borderRight: "5px solid #efefef", paddingTop: "10px" } : { display: "none" }}> + <TimelineListTabs suBlueprintList={this.state.suBlueprintList} + suListFilterCallback={this.suListFilterCallback} + reservationList={this.getReservationList()} + suStatusList={this.state.suStatusList} + taskStatusList={this.state.taskStatusList} + ></TimelineListTabs> + </div> + {/* Timeline Panel */} + <div className={isSUListVisible ? ((isSUDetsVisible || isReservDetsVisible) ? "col-lg-5 col-md-5 col-sm-12" : + (!canExtendSUList && canShrinkSUList) ? "col-lg-6 col-md-6 col-sm-12" : + ((canExtendSUList && canShrinkSUList) ? "col-lg-7 col-md-7 col-sm-12" : "col-lg-8 col-md-8 col-sm-12")) : + ((isSUDetsVisible || isReservDetsVisible) ? "col-lg-9 col-md-9 col-sm-12" : "col-lg-12 col-md-12 col-sm-12")} + // style={{borderLeft: "3px solid #efefef"}} + > + {/* Panel Resize buttons */} + {isSUListVisible && + <div className="resize-div"> + <button className="p-link resize-btn" disabled={!this.state.canShrinkSUList} + title="Shrink List/Expand Timeline" + onClick={(e) => { this.resizeSUList(-1) }}> + <i className="pi pi-step-backward"></i> + </button> + <button className="p-link resize-btn" disabled={!this.state.canExtendSUList} + title="Expandd List/Shrink Timeline" + onClick={(e) => { this.resizeSUList(1) }}> + <i className="pi pi-step-forward"></i> + </button> + </div> + } + <div className={isSUListVisible ? "resize-div su-visible" : "resize-div su-hidden"}> {isSUListVisible && - <div className="resize-div"> - <button className="p-link resize-btn" disabled={!this.state.canShrinkSUList} - title="Shrink List/Expand Timeline" - onClick={(e) => { this.resizeSUList(-1) }}> - <i className="pi pi-step-backward"></i> - </button> - <button className="p-link resize-btn" disabled={!this.state.canExtendSUList} - title="Expandd List/Shrink Timeline" - onClick={(e) => { this.resizeSUList(1) }}> - <i className="pi pi-step-forward"></i> - </button> - </div> + <button className="p-link resize-btn" + title="Hide List" + onClick={(e) => { this.setState({ isSUListVisible: false }) }}> + <i className="pi pi-eye-slash"></i> + </button> } - <div className={isSUListVisible ? "resize-div su-visible" : "resize-div su-hidden"}> - {isSUListVisible && - <button className="p-link resize-btn" - title="Hide List" - onClick={(e) => { this.setState({ isSUListVisible: false }) }}> - <i className="pi pi-eye-slash"></i> - </button> - } - {!isSUListVisible && - <button className="p-link resize-btn" - title="Show List" - onClick={(e) => { this.setState({ isSUListVisible: true }) }}> - <i className="pi pi-eye"> Show List</i> - </button> - } + {!isSUListVisible && + <button className="p-link resize-btn" + title="Show List" + onClick={(e) => { this.setState({ isSUListVisible: true }) }}> + <i className="pi pi-eye"> Show List</i> + </button> + } + </div> + <div className={`timeline-view-toolbar ${this.state.reservationEnabled && 'alignTimeLineHeader'}`}> + <div className="sub-header"> + <label >Show Reservations</label> + <InputSwitch checked={this.state.reservationEnabled} onChange={(e) => { this.showReservations(e) }} /> + </div> - <div className={`timeline-view-toolbar ${this.state.reservationEnabled && 'alignTimeLineHeader'}`}> + + {this.state.reservationEnabled && <div className="sub-header"> - <label >Show Reservations</label> - <InputSwitch checked={this.state.reservationEnabled} onChange={(e) => { this.showReservations(e) }} /> + <label style={{ marginLeft: '20px' }}>Reservation</label> + <Dropdown optionLabel="name" optionValue="name" + style={{ top: '2px' }} + value={this.state.reservationFilter} + options={this.reservationReasons} + filter showClear={true} filterBy="name" + onChange={(e) => { this.setReservationFilter(e.value) }} + placeholder="Reason" /> </div> - - {this.state.reservationEnabled && - <div className="sub-header"> - <label style={{ marginLeft: '20px' }}>Reservation</label> - <Dropdown optionLabel="name" optionValue="name" - style={{ top: '2px' }} - value={this.state.reservationFilter} - options={this.reservationReasons} - filter showClear={true} filterBy="name" - onChange={(e) => { this.setReservationFilter(e.value) }} - placeholder="Reason" /> - - </div> - } - </div> - - <Timeline ref={(tl) => { this.timeline = tl }} - group={this.state.group} - items={this.state.items} - currentUTC={this.state.currentUTC} - rowHeight={50} - itemClickCallback={this.onItemClick} - itemMouseOverCallback={this.onItemMouseOver} - itemMouseOutCallback={this.onItemMouseOut} - sidebarWidth={150} - stackItems={true} - startTime={moment.utc(this.state.currentUTC).hour(0).minutes(0).seconds(0)} - endTime={moment.utc(this.state.currentUTC).hour(23).minutes(59).seconds(59)} - zoomLevel="1 Day" - showLive={false} showDateRange={false} viewType={UIConstants.timeline.types.WEEKVIEW} - dateRangeCallback={this.dateRangeCallback} - ></Timeline> + } </div> - {/* Details Panel */} - {this.state.isSUDetsVisible && - <div className="col-lg-3 col-md-3 col-sm-12" - style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> - {this.state.isSummaryLoading ? <AppLoader /> : - <SchedulingUnitSummary schedulingUnit={suBlueprint} suTaskList={this.state.suTaskList} - viewInNewWindow - constraintsTemplate={this.state.suConstraintTemplate} - closeCallback={this.closeSUDets} - stationGroup={this.state.stationGroup} - location={this.props.location}></SchedulingUnitSummary> - } - </div> - } - {this.state.isReservDetsVisible && - <div className="col-lg-3 col-md-3 col-sm-12" - style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> - {this.state.isSummaryLoading ? <AppLoader /> : - <ReservationSummary reservation={reservation} location={this.props.location} closeCallback={this.closeSUDets}></ReservationSummary> - } - </div> - } - </div> - </> - } - {/* SU Item Tooltip popover with SU status color */} - <OverlayPanel className="timeline-popover" ref={(el) => this.popOver = el} dismissable> - {mouseOverItem && mouseOverItem.type === "SCHEDULE" && - <div className={`p-grid su-${mouseOverItem.status}`} style={{ width: '350px' }}> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Project:</label> - <div className="col-7">{mouseOverItem.project}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduling Unit:</label> - <div className="col-7">{mouseOverItem.name}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduler:</label> - <div className="col-7">{mouseOverItem.scheduleMethod}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Friends:</label> - <div className="col-7">{mouseOverItem.friends ? mouseOverItem.friends : "-"}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Start Time:</label> - <div className="col-7">{mouseOverItem.suStartTime.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>End Time:</label> - <div className="col-7">{mouseOverItem.suStopTime.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Antenna Set:</label> - <div className="col-7">{mouseOverItem.antennaSet}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Stations:</label> - <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Status:</label> - <div className="col-7">{mouseOverItem.status}</div> - <label className={`col-5 su-${mouseOverItem.status}-icon`}>Duration:</label> - <div className="col-7">{mouseOverItem.duration}</div> + + <Timeline ref={(tl) => { this.timeline = tl }} + group={this.state.group} + items={this.state.items} + currentUTC={this.state.currentUTC} + rowHeight={50} + itemClickCallback={this.onItemClick} + itemMouseOverCallback={this.onItemMouseOver} + itemMouseOutCallback={this.onItemMouseOut} + sidebarWidth={150} + stackItems={true} + startTime={moment.utc(this.state.currentUTC).hour(0).minutes(0).seconds(0)} + endTime={moment.utc(this.state.currentUTC).hour(23).minutes(59).seconds(59)} + zoomLevel="1 Day" + showLive={false} showDateRange={false} viewType={UIConstants.timeline.types.WEEKVIEW} + dateRangeCallback={this.dateRangeCallback} + ></Timeline> </div> - } - {(mouseOverItem && mouseOverItem.type === "RESERVATION") && - <div className={`p-grid`} style={{ width: '350px', backgroundColor: mouseOverItem.bgColor, color: mouseOverItem.color }}> - <h3 className={`col-12`}>Reservation Overview</h3> - <hr></hr> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Name:</label> - <div className="col-7">{mouseOverItem.name}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Description:</label> - <div className="col-7">{mouseOverItem.desc}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Type:</label> - <div className="col-7">{mouseOverItem.activity_type}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Stations:</label> - {/* <div className="col-7"><ListBox options={mouseOverItem.stations} /></div> */} - <div className="col-7 station-list"> - {mouseOverItem.stations.map((station, index) => ( - <div key={`stn-${index}`}>{station}</div> - ))} + {/* Details Panel */} + {this.state.isSUDetsVisible && + <div className="col-lg-3 col-md-3 col-sm-12" + style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> + {this.state.isSummaryLoading ? <AppLoader /> : + <SchedulingUnitSummary schedulingUnit={suBlueprint} suTaskList={this.state.suTaskList} + viewInNewWindow + constraintsTemplate={this.state.suConstraintTemplate} + closeCallback={this.closeSUDets} + stationGroup={this.state.stationGroup} + location={this.props.location}></SchedulingUnitSummary> + } + </div> + } + {this.state.isReservDetsVisible && + <div className="col-lg-3 col-md-3 col-sm-12" + style={{ borderLeft: "1px solid #efefef", marginTop: "0px", backgroundColor: "#f2f2f2" }}> + {this.state.isSummaryLoading ? <AppLoader /> : + <ReservationSummary reservation={reservation} location={this.props.location} closeCallback={this.closeSUDets}></ReservationSummary> + } </div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Project:</label> - <div className="col-7">{mouseOverItem.project ? mouseOverItem.project : "-"}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Start Time:</label> - <div className="col-7">{mouseOverItem.displayStartTime.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>End Time:</label> - <div className="col-7">{mouseOverItem.displayEndTime ? mouseOverItem.displayEndTime.format(UIConstants.CALENDAR_DATETIME_FORMAT) : 'Unknown'}</div> - {/* <label className={`col-5`} style={{color: mouseOverItem.color}}>Stations:</label> - <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> */} - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Duration:</label> - <div className="col-7">{mouseOverItem.duration}</div> - <label className={`col-5`} style={{ color: mouseOverItem.color }}>Planned:</label> - <div className="col-7">{mouseOverItem.planned ? 'Yes' : 'No'}</div> + } + </div> + </> + } + {/* SU Item Tooltip popover with SU status color */} + <OverlayPanel className="timeline-popover" ref={(el) => this.popOver = el} dismissable> + {mouseOverItem && mouseOverItem.type === "SCHEDULE" && + <div className={`p-grid su-${mouseOverItem.status}`} style={{ width: '350px' }}> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Project:</label> + <div className="col-7">{mouseOverItem.project}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduling Unit:</label> + <div className="col-7">{mouseOverItem.name}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Scheduler:</label> + <div className="col-7">{mouseOverItem.scheduleMethod}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Friends:</label> + <div className="col-7">{mouseOverItem.friends ? mouseOverItem.friends : "-"}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Start Time:</label> + <div className="col-7">{mouseOverItem.suStartTime.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>End Time:</label> + <div className="col-7">{mouseOverItem.suStopTime.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Antenna Set:</label> + <div className="col-7">{mouseOverItem.antennaSet}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Stations:</label> + <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Status:</label> + <div className="col-7">{mouseOverItem.status}</div> + <label className={`col-5 su-${mouseOverItem.status}-icon`}>Duration:</label> + <div className="col-7">{mouseOverItem.duration}</div> + </div> + } + {(mouseOverItem && mouseOverItem.type === "RESERVATION") && + <div className={`p-grid`} style={{ width: '350px', backgroundColor: mouseOverItem.bgColor, color: mouseOverItem.color }}> + <h3 className={`col-12`}>Reservation Overview</h3> + <hr></hr> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Name:</label> + <div className="col-7">{mouseOverItem.name}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Description:</label> + <div className="col-7">{mouseOverItem.desc}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Type:</label> + <div className="col-7">{mouseOverItem.activity_type}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Stations:</label> + {/* <div className="col-7"><ListBox options={mouseOverItem.stations} /></div> */} + <div className="col-7 station-list"> + {mouseOverItem.stations.map((station, index) => ( + <div key={`stn-${index}`}>{station}</div> + ))} </div> - } - </OverlayPanel> - {/* Open Websocket after loading all initial data */} - {!this.state.isLoading && - <Websocket url={process.env.REACT_APP_WEBSOCKET_URL} onOpen={this.onConnect} onMessage={this.handleData} onClose={this.onDisconnect} />} - {this.state.showDialog && - <div className="p-grid" data-testid="confirm_dialog"> - <CustomDialog type="success" visible={this.state.showDialog} width="30vw" showIcon={false} - header="Dynamic Scheduling Settings" message={<DynamicScheduler />} - content={''} - actions={ [ - {id:"no", title: 'Close', callback: this.close} ]} - onClose={this.close} - /> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Project:</label> + <div className="col-7">{mouseOverItem.project ? mouseOverItem.project : "-"}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Start Time:</label> + <div className="col-7">{mouseOverItem.displayStartTime.format(UIConstants.CALENDAR_DATETIME_FORMAT)}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>End Time:</label> + <div className="col-7">{mouseOverItem.displayEndTime ? mouseOverItem.displayEndTime.format(UIConstants.CALENDAR_DATETIME_FORMAT) : 'Unknown'}</div> + {/* <label className={`col-5`} style={{color: mouseOverItem.color}}>Stations:</label> + <div className="col-7">{mouseOverItem.stations.groups}:{mouseOverItem.stations.counts}</div> */} + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Duration:</label> + <div className="col-7">{mouseOverItem.duration}</div> + <label className={`col-5`} style={{ color: mouseOverItem.color }}>Planned:</label> + <div className="col-7">{mouseOverItem.planned ? 'Yes' : 'No'}</div> </div> } - </> - } + </OverlayPanel> + {/* Open Websocket after loading all initial data */} + {!this.state.isLoading && + <Websocket url={process.env.REACT_APP_WEBSOCKET_URL} onOpen={this.onConnect} onMessage={this.handleData} onClose={this.onDisconnect} />} + {this.state.showDialog && + <div className="p-grid" data-testid="confirm_dialog"> + <CustomDialog type="success" visible={this.state.showDialog} width="30vw" showIcon={false} + header="Dynamic Scheduling Settings" message={<DynamicScheduler />} + content={''} + actions={ [ + {id:"no", title: 'Close', callback: this.close} ]} + onClose={this.close} + /> + </div> + } </React.Fragment> ); } -- GitLab