blob: eb815922d48449f245dcdb06b38866c0c7ef6536 [file] [log] [blame]
<!--
~ Licensed to the Apache Software Foundation (ASF) under one
~ or more contributor license agreements. See the NOTICE file
~ distributed with this work for additional information
~ regarding copyright ownership. The ASF licenses this file
~ to you under the Apache License, Version 2.0 (the
~ "License"); you may not use this file except in compliance
~ with the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing,
~ software distributed under the License is distributed on an
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~ KIND, either express or implied. See the License for the
~ specific language governing permissions and limitations
~ under the License.
-->
<div class="scheduler-dialog" id="dialog-box">
<header class="dialog-header">
<h4 class="modal-title">Scheduler
<span *ngIf="destination">for
<b *ngIf="destination.type === 'EXPLORATORY'; else resource">{{ destination.name }}</b>
<ng-template #resource><b>{{ destination.computational_name }}</b></ng-template>
</span>
</h4>
<button type="button" class="close" (click)="dialogRef.close()">&times;</button>
</header>
<div class="dialog-content">
<div *ngIf="destination" class="content-box">
<form [formGroup]="schedulerForm">
<div class="enable-schedule">
<mat-slide-toggle labelPosition="after" [checked]="enableSchedule" (change)="toggleSchedule($event)">
<span *ngIf="toggleSchedule" class="hold-label">Scheduler by time</span>
</mat-slide-toggle>
<div class="idle" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
<mat-slide-toggle labelPosition="before" [checked]="enableIdleTime" (change)="toggleIdleTimes($event)">
<span *ngIf="toggleSchedule" class="hold-label">Scheduler by inactivity</span>
</mat-slide-toggle>
</div>
</div>
<div class="note m-bott-10" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
NOTE: In case of turning on inactivity time-check, your schedule
configuration will be decommissioned.
</div>
<div class="control-group idle-control" [ngClass]="{ show: enableIdleTimeView }">
<label class="label">Scheduler by inactivity, min</label>
<div class="control">
<input type="text" class="form-control" placeholder="Enter time in min" formControlName="inactivityTime"
(keypress)="CheckUtils.isNumberKey($event)" (keydown.arrowup)="inactivityCounter($event, 'increment')"
(keydown.arrowdown)="inactivityCounter($event, 'decrement')" />
<span class="error" *ngIf="!schedulerForm.controls.inactivityTime.valid">
<span>The value should be an integer greater than or equal to {{ inactivityLimits.min }} and
cannot exceed 1 week ({{ inactivityLimits.max }}) in min.</span>
</span>
</div>
</div>
<div class="schedule-by-time" *ngIf="!enableIdleTimeView" [ngClass]="{ hide: enableIdleTimeView, resource: destination.type === 'СOMPUTATIONAL',
des: destination.image === 'docker.datalab-dataengine-service' }">
<div class="row-wrap" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
<div class="col-3">
<mat-form-field>
<input matInput [matDatepicker]="startDate" placeholder="Choose start date"
formControlName="startDate">
<mat-datepicker-toggle
matSuffix [for]="startDate"
[ngClass]="{'not-allowed' : destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule }"></mat-datepicker-toggle>
<mat-datepicker #startDate></mat-datepicker>
</mat-form-field>
</div>
<div class="col-3">
<mat-form-field>
<input matInput [matDatepicker]="finishDate" placeholder="Choose finish date"
formControlName="finishDate">
<mat-datepicker-toggle matSuffix [for]="finishDate" [ngClass]="{'not-allowed' : destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule }"></mat-datepicker-toggle>
<mat-datepicker #finishDate ></mat-datepicker>
</mat-form-field>
</div>
<div class="col-3" *ngIf="destination.type === 'СOMPUTATIONAL'; else timezone">
<mat-form-field>
<input matInput [matDatepicker]="terminateDate" placeholder="Choose terminate date"
formControlName="terminateDate" >
<mat-datepicker-toggle matSuffix [for]="terminateDate"></mat-datepicker-toggle>
<mat-datepicker #terminateDate></mat-datepicker>
</mat-form-field>
</div>
<ng-template #timezone>
<div class="col-3">
<mat-form-field class="timezone-offset">
<mat-select placeholder="Select timezone" [(value)]="tzOffset" panelClass="scrolling timezone-mat-select"
[disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
<mat-option *ngFor="let zone of zones | keys" [value]="zone.key" matTooltip="{{ zone.value }}"
matTooltipShowDelay="1000" matTooltipPosition="above"> GMT {{zone.key}} {{ zone.value }}
</mat-option>
</mat-select>
</mat-form-field>
</div>
</ng-template>
</div>
<div class="row-wrap" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
<div class="control-group col-3 time-range">
<datalab-time-picker [(pickTime)]="startTime" [(milisecTime)]="startTimeMilliseconds"
[label]="'Choose start time'"
[disable]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
{{destination.type}}
</datalab-time-picker>
</div>
<div class="control-group col-3 time-range">
<datalab-time-picker [(pickTime)]="endTime" [(milisecTime)]="endTimeMilliseconds"
[label]="'Choose finish time'"
[disable]="destination.type === 'СOMPUTATIONAL' && inherit ||!enableSchedule">
</datalab-time-picker>
</div>
<div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
<datalab-time-picker [(pickTime)]="terminateTime" [(milisecTime)]="terminateTimeMilliseconds"
[label]="'Choose terminate time'"
[disable]="!enableSchedule"></datalab-time-picker>
</div>
<div *ngIf="timeReqiered" class="error term m-bott-10 mt-5"><span>At least one of time range fields
should be selected</span>
</div>
<div *ngIf="terminateDataReqiered">
<span class="error term m-bott-10 mt-5">Both terminate date and time fields should be selected</span>
</div>
</div>
<div class="row-wrap"
*ngIf="destination.type === 'СOMPUTATIONAL' && destination.image !== 'docker.datalab-dataengine-service'">
<div class="col-3">
<mat-form-field class="timezone-offset">
<mat-select placeholder="Select timezone" [(value)]="tzOffset"
[disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
<mat-option *ngFor="let zone of zones | keys" [value]="zone.key"
matTooltip="{{ zone.value }}"
matTooltipShowDelay="1000" matTooltipPosition="above"> GMT {{zone.key}} {{
zone.value }}
</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
<div class="control-group"
*ngIf="destination && destination.image !== 'docker.datalab-dataengine-service'">
<label class="label repeat" for="options">Repeat on :</label>
<div class="days-block">
<label>Start date:</label>
<mat-button-toggle *ngFor="let day of weekdays; let i = index" value="{{ day }}"
(change)="onDaySelect($event, day, 'start')"
[disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule"
[checked]="selectedStartWeekDays[day.toLowerCase()]">{{ day[0] }}
</mat-button-toggle>
</div>
<div class="days-block">
<label>Stop date:</label>
<mat-button-toggle *ngFor="let day of weekdays; let i = index" value="{{ day }}"
(change)="onDaySelect($event, day, 'stop')"
[disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule"
[checked]="selectedStopWeekDays[day.toLowerCase()]">{{ day[0] }}
</mat-button-toggle>
</div>
</div>
<div class="des-block" *ngIf="destination.image === 'docker.datalab-dataengine-service'">
<div class="row-wrap">
<div class="col-3">
<mat-form-field>
<input matInput [matDatepicker]="terminateDate" placeholder="Choose terminate date"
formControlName="terminateDate">
<mat-datepicker-toggle matSuffix [for]="terminateDate"></mat-datepicker-toggle>
<mat-datepicker #terminateDate></mat-datepicker>
</mat-form-field>
</div>
<div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
<datalab-time-picker [(pickTime)]="terminateTime" [(milisecTime)]="terminateTimeMilliseconds"
[label]="'Choose terminate time'"
[disable]="!enableSchedule"></datalab-time-picker>
</div>
<div class="col-3">
<mat-form-field class="timezone-offset">
<mat-select placeholder="Select timezone" [(value)]="tzOffset"
[disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
<mat-option *ngFor="let zone of zones | keys" [value]="zone.key" matTooltip="{{ zone.value }}"
matTooltipShowDelay="1000" matTooltipPosition="above"> GMT {{zone.key}} {{ zone.value }}
</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
<div *ngIf="terminateDataReqiered">
<small class="error m-bott-10 mt-5 ">Both terminate date and time fields should be selected</small>
</div>
</div>
<div class="options"
*ngIf="destination && allowInheritView && destination.image !== 'docker.datalab-dataengine-service'">
<mat-slide-toggle labelPosition="after" [checked]="inherit" (change)="toggleInherit($event)"
[disabled]="!enableSchedule || (!parentInherit && destination.type === 'СOMPUTATIONAL')">
<span *ngIf="destination.type === 'EXPLORATORY'; else resourcePropagation" class="hold-label">
<span>Start all spark clusters associated with current notebook based on notebook start
schedule</span>
</span>
<ng-template #resourcePropagation>
<span class="hold-label">Inherit notebook schedule settings</span>
</ng-template>
</mat-slide-toggle>
</div>
</div>
<div class="options" *ngIf="destination.type === 'EXPLORATORY'">
<mat-slide-toggle labelPosition="after" [checked]="considerInactivity"
[disabled]="!enableSchedule && !enableIdleTime" (change)="considerInactivity = !considerInactivity">
<span class="hold-label">
<span>In case of running jobs on Spark standalone, notebook stop scheduler will not be triggered</span>
</span>
</mat-slide-toggle>
</div>
</form>
<div class="text-center m-top-30">
<button mat-raised-button type="button" class="butt action" (click)="dialogRef.close()">Cancel</button>
<button mat-raised-button type="button" class="butt butt-success action"
[disabled]="enableIdleTime && !schedulerForm.controls.inactivityTime.valid"
(click)="scheduleInstance_btnClick()">Save</button>
</div>
</div>
</div>
</div>