{"version":3,"file":"c8y-ngx-components-operations-bulk-operation-scheduler.mjs","sources":["../../operations/bulk-operation-scheduler/operation-scheduler.component.ts","../../operations/bulk-operation-scheduler/operation-scheduler.component.html","../../operations/bulk-operation-scheduler/bulk-operation-scheduler.module.ts","../../operations/bulk-operation-scheduler/c8y-ngx-components-operations-bulk-operation-scheduler.ts"],"sourcesContent":["import { Component, forwardRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport {\n  ControlValueAccessor,\n  FormBuilder,\n  FormControl,\n  FormGroup,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator,\n  Validators,\n  FormsModule,\n  ReactiveFormsModule\n} from '@angular/forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  DateFormatService,\n  OptionsService,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  MessagesComponent,\n  MessageDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\nimport { Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\nimport { OperationSchedule } from './operation-schedule.interface';\nimport { BsDatepickerInputDirective, BsDatepickerDirective } from 'ngx-bootstrap/datepicker';\nimport { TimepickerComponent } from 'ngx-bootstrap/timepicker';\n\n@Component({\n  selector: 'c8y-operation-scheduler',\n  templateUrl: 'operation-scheduler.component.html',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => OperationSchedulerComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => OperationSchedulerComponent)\n    }\n  ],\n  imports: [\n    FormsModule,\n    ReactiveFormsModule,\n    C8yTranslateDirective,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    BsDatepickerInputDirective,\n    BsDatepickerDirective,\n    MessagesComponent,\n    MessageDirective,\n    TimepickerComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class OperationSchedulerComponent\n  implements ControlValueAccessor, Validator, OnInit, OnDestroy\n{\n  @Input('minutesAhead') set _minutesAhead(minutes: number) {\n    if (minutes && minutes > this.MINUTES_AHEAD_DEFAULT) {\n      this.minutesAhead = minutes;\n    }\n  }\n\n  placeholder: string = gettext('Start date');\n  fgOperationScheduler: FormGroup;\n  minDate: Date;\n  minDelay: number;\n  maxDelay: number;\n  delayErrors: ValidationErrors = null;\n  pickerErrors: ValidationErrors = null;\n  dateInputFormat: string;\n\n  private readonly DELAY_SECONDS_DEFAULT: number = 1;\n  private readonly MIN_DELAY_SECONDS_DEFAULT: number = 0.001;\n  private readonly MAX_DELAY_SECONDS_DEFAULT: number = 3600;\n  private readonly MINUTES_AHEAD_DEFAULT: number = 5;\n  private isDelayInSeconds = true;\n  private minutesAhead: number = this.MINUTES_AHEAD_DEFAULT;\n  private readonly DELAY_KEY_CATEGORY = 'device-control';\n  private readonly MAX_DELAY_KEY_NAME = 'bulkoperation.maxcreationramp';\n  private readonly MIN_DELAY_KEY_NAME = 'bulkoperation.creationramp';\n  private currentUnit = 'seconds';\n  private delayInSeconds: number;\n  private initialDate: Date;\n  private subscription: Subscription;\n\n  private onChange: (name) => void;\n  private onTouched: () => void;\n  private onValidatorChanged: () => void;\n\n  constructor(\n    private formBuilder: FormBuilder,\n    private options: OptionsService,\n    private dateFormatService: DateFormatService\n  ) {}\n\n  ngOnInit() {\n    this.minDate = new Date();\n    this.initialDate = new Date(\n      this.minDate.setMinutes(this.minDate.getMinutes() + this.minutesAhead)\n    );\n\n    this.fgOperationScheduler = this.formBuilder.group({\n      picker: ['', [Validators.required, this.dateValidation]],\n      time: ['', [Validators.required, this.timeValidation]],\n      delay: ['', [Validators.required]],\n      unit: ['seconds']\n    });\n\n    this.fgOperationScheduler.patchValue({\n      picker: this.initialDate,\n      time: this.initialDate,\n      delay: this.DELAY_SECONDS_DEFAULT\n    });\n\n    // Due to the validation of picker and time it could be possible that value changes\n    // are emitted more than once. Therefore we throttle the emits.\n    const valueChanges$ = this.fgOperationScheduler.valueChanges.pipe(throttleTime(100));\n    this.subscription = valueChanges$.subscribe(data => {\n      this.delayErrors = this.fgOperationScheduler.controls.delay.errors;\n      this.pickerErrors = this.fgOperationScheduler.controls.picker.errors;\n      this.convertDelayHandler(data.unit);\n      this.emitData(data);\n    });\n\n    this.updateDelayValidation();\n    this.dateInputFormat = this.dateFormatService.getDateFormat();\n  }\n\n  ngOnDestroy() {\n    if (this.subscription && !this.subscription.closed) {\n      this.subscription.unsubscribe();\n    }\n  }\n\n  writeValue(value: OperationSchedule): void {\n    if (value) {\n      this.fgOperationScheduler.patchValue({\n        picker: value.scheduledDate,\n        time: value.scheduledDate,\n        delay: value.delayInSeconds > 1 ? value.delayInSeconds : value.delayInSeconds * 1000,\n        unit: value.delayInSeconds > 1 ? 'seconds' : 'milliseconds'\n      });\n    }\n  }\n\n  registerOnChange(fn: any): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState?(isDisabled: boolean): void {\n    if (this.fgOperationScheduler?.disabled === isDisabled) {\n      return;\n    }\n    isDisabled ? this.fgOperationScheduler.disable() : this.fgOperationScheduler.enable();\n  }\n\n  validate(): ValidationErrors {\n    if (this.fgOperationScheduler.invalid) {\n      return {\n        ...this.fgOperationScheduler.controls.picker.errors,\n        ...this.fgOperationScheduler.controls.time.errors,\n        ...this.fgOperationScheduler.controls.delay.errors\n      };\n    }\n  }\n\n  registerOnValidatorChange(fn: any) {\n    this.onValidatorChanged = fn;\n  }\n\n  markAsTouched(): void {\n    if (this.onTouched) {\n      this.onTouched();\n    }\n  }\n\n  convertDelayHandler(unit: string) {\n    if (this.currentUnit === unit) {\n      return;\n    }\n\n    this.currentUnit = unit;\n\n    this.convertDelay(this.currentUnit);\n\n    // update validator on delay control to make sure that\n    // switching from minutes to seconds or vice versa does not harm validation.\n    this.fgOperationScheduler.controls.delay.setValidators([\n      Validators.required,\n      Validators.min(this.minDelay),\n      Validators.max(this.maxDelay)\n    ]);\n    this.fgOperationScheduler.controls.delay.updateValueAndValidity();\n  }\n\n  emitData(data: { delayInSeconds: number; picker: Date; time?: Date; delay?: number }) {\n    if (this.onValidatorChanged) {\n      this.onValidatorChanged();\n    }\n\n    if (data.picker && data.time) {\n      data.picker = this.combineDateAndTime(data.picker, data.time);\n    }\n\n    this.convertDelay(this.currentUnit);\n    data.delayInSeconds = this.delayInSeconds;\n\n    if (this.onChange) {\n      this.onChange({\n        delayInSeconds: data.delayInSeconds,\n        scheduledDate: data.picker\n      });\n    }\n  }\n\n  private async updateDelayValidation() {\n    const minSystem = await this.options.getSystemOption(\n      this.DELAY_KEY_CATEGORY,\n      this.MIN_DELAY_KEY_NAME\n    );\n    const maxSystem = await this.options.getSystemOption(\n      this.DELAY_KEY_CATEGORY,\n      this.MAX_DELAY_KEY_NAME\n    );\n\n    this.maxDelay = maxSystem ? Number(maxSystem) : this.MAX_DELAY_SECONDS_DEFAULT;\n    this.minDelay = minSystem ? Number(minSystem) : this.MIN_DELAY_SECONDS_DEFAULT;\n\n    this.fgOperationScheduler\n      .get('delay')\n      .setValidators([\n        Validators.required,\n        Validators.min(this.minDelay),\n        Validators.max(this.maxDelay)\n      ]);\n    this.fgOperationScheduler.updateValueAndValidity();\n  }\n\n  private convertDelay(unit: string) {\n    this.delayInSeconds = this.fgOperationScheduler.controls.delay.value;\n\n    if (unit === 'seconds' && !this.isDelayInSeconds) {\n      this.maxDelay = this.maxDelay / 1000;\n      this.minDelay = this.minDelay / 1000;\n      this.isDelayInSeconds = true;\n    }\n\n    if (unit === 'milliseconds') {\n      this.delayInSeconds = this.fgOperationScheduler.controls.delay.value / 1000;\n      if (this.isDelayInSeconds) {\n        this.maxDelay = this.maxDelay * 1000;\n        this.minDelay = this.minDelay * 1000;\n        this.isDelayInSeconds = false;\n      }\n    }\n  }\n\n  private combineDateAndTime(date: Date, time: Date) {\n    return new Date(\n      date.getFullYear(),\n      date.getMonth(),\n      date.getDate(),\n      time.getHours(),\n      time.getMinutes()\n    );\n  }\n\n  private dateValidation(fControl: FormControl) {\n    if (fControl.value) {\n      const date = fControl.value as Date;\n      fControl.parent.get('time').setValue(date);\n      return date >= new Date()\n        ? null\n        : {\n            dateValidation: true\n          };\n    }\n    return { dateValidation: true };\n  }\n\n  private timeValidation(fControl: FormControl) {\n    if (fControl.value) {\n      const date = fControl.value as Date;\n      const result =\n        date >= new Date()\n          ? null\n          : {\n              dateValidation: true\n            };\n\n      const picker = fControl.parent.get('picker');\n\n      if (result) {\n        picker.setErrors(result);\n        picker.markAsTouched();\n        return result;\n      }\n\n      if (picker && picker.errors && picker.errors.dateValidation) {\n        delete picker.errors.dateValidation;\n\n        if (isEmpty(picker.errors)) {\n          picker.setErrors(null);\n          return result;\n        }\n\n        picker.setErrors(picker.errors);\n      }\n      return result;\n    }\n    return { dateValidation: true };\n  }\n}\n","<div [formGroup]=\"fgOperationScheduler\">\n  <div class=\"form-group\">\n    <label translate>Start date</label>\n    <div class=\"datetime-picker\">\n      <c8y-form-group class=\"datepicker\">\n        <input\n          class=\"form-control\"\n          placeholder=\"{{ placeholder | translate }}\"\n          required\n          formControlName=\"picker\"\n          [bsConfig]=\"{ customTodayClass: 'today', dateInputFormat: dateInputFormat }\"\n          [minDate]=\"minDate\"\n          bsDatepicker\n          (blur)=\"markAsTouched()\"\n        />\n        <c8y-messages>\n          <c8y-message\n            [name]=\"'dateValidation'\"\n            [text]=\"'Select time in the future.' | translate\"\n          ></c8y-message>\n        </c8y-messages>\n      </c8y-form-group>\n      <timepicker\n        class=\"form-group\"\n        [showSpinners]=\"false\"\n        [showMeridian]=\"false\"\n        formControlName=\"time\"\n        (blur)=\"markAsTouched()\"\n      ></timepicker>\n    </div>\n  </div>\n  <div class=\"form-group\">\n    <c8y-form-group [hasError]=\"delayErrors\">\n      <label translate>Delay</label>\n      <div class=\"input-group\">\n        <input\n          class=\"form-control\"\n          placeholder=\"{{ 'e.g.' | translate }} 15\"\n          type=\"number\"\n          required\n          formControlName=\"delay\"\n          (blur)=\"markAsTouched()\"\n        />\n        <div class=\"input-group-btn\">\n          <div class=\"c8y-select-wrapper\">\n            <select\n              class=\"form-control m-r-sm-32 m-r-xs-56\"\n              [attr.aria-label]=\"'Delay units' | translate\"\n              formControlName=\"unit\"\n              (blur)=\"markAsTouched()\"\n            >\n              <option\n                value=\"seconds\"\n                translate\n              >\n                Seconds\n              </option>\n              <option\n                value=\"milliseconds\"\n                translate\n              >\n                Milliseconds\n              </option>\n            </select>\n            <span></span>\n          </div>\n        </div>\n      </div>\n    </c8y-form-group>\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { TimepickerModule } from 'ngx-bootstrap/timepicker';\nimport { OperationSchedulerComponent } from './operation-scheduler.component';\n\n/**\n * This module provides components for scheduling bulk operations.\n */\n@NgModule({\n  imports: [\n    CoreModule,\n    ReactiveFormsModule,\n    BsDatepickerModule.forRoot(),\n    TimepickerModule.forRoot(),\n    OperationSchedulerComponent\n  ],\n  providers: [],\n  exports: [OperationSchedulerComponent]\n})\nexport class BulkOperationSchedulerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}