All files / modules/75-cf/components/PipelineSteps/FlagConfigurationStep FlagConfigurationStep.tsx

70% Statements 21/30
19.7% Branches 13/66
57.14% Functions 4/7
70% Lines 21/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129              2x 2x     2x 2x   2x 2x     2x 2x         2x   2x 4x 4x 4x 4x 4x     3x     1x           2x                 1x                                                             2x                                                           4x                              
/*
 * Copyright 2021 Harness Inc. All rights reserved.
 * Use of this source code is governed by the PolyForm Shield 1.0.0 license
 * that can be found in the licenses directory at the root of this repository, also available at
 * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt.
 */
 
import React, { ReactElement } from 'react'
import { IconName, RUNTIME_INPUT_VALUE } from '@wings-software/uicore'
 
import type { FormikErrors } from 'formik'
import { isEmpty, set } from 'lodash-es'
import { StepProps, StepViewType, ValidateInputSetProps } from '@pipeline/components/AbstractSteps/Step'
 
import { StepType } from '@pipeline/components/PipelineSteps/PipelineStepInterface'
import { PipelineStep } from '@pipeline/components/PipelineSteps/PipelineStep'
import type { StepElementConfig } from 'services/cd-ng'
import type { StringsMap } from 'stringTypes'
import FlagConfigurationInputSetStep from './FlagConfigurationInputSetStep'
import {
  FlagConfigurationStepVariablesView,
  FlagConfigurationStepVariablesViewProps
} from './FlagConfigurationStepVariablesView'
import type { FlagConfigurationStepData } from './types'
import FlagConfigurationStepWidget, { FlagConfigurationStepWidgetProps } from './FlagConfigurationStepWidget'
 
export class FlagConfigurationStep extends PipelineStep<FlagConfigurationStepData> {
  protected type = StepType.FlagConfiguration
  protected stepName = 'Flag Configuration'
  protected stepIcon: IconName = 'flag'
  protected stepDescription: keyof StringsMap = 'pipeline.stepDescription.FlagConfiguration'
  protected isHarnessSpecific = true
 
  renderStep(props: StepProps<FlagConfigurationStepData>): ReactElement {
    switch (props.stepViewType) {
      case StepViewType.DeploymentForm:
      case StepViewType.InputSet:
        return FlagConfigurationStep.renderInputSetView(props)
 
      case StepViewType.InputVariable:
        return FlagConfigurationStep.renderVariablesView(props)
 
      default:
        return FlagConfigurationStep.renderWidgetView(props)
    }
  }
 
  private static renderInputSetView({
    inputSetData,
    stepViewType,
    readonly
  }: StepProps<FlagConfigurationStepData>): ReactElement {
    return (
      <FlagConfigurationInputSetStep
        existingValues={inputSetData?.allValues}
        stepViewType={stepViewType}
        readonly={readonly}
        template={inputSetData?.template}
        pathPrefix={inputSetData?.path || ''}
      />
    )
  }
 
  private static renderVariablesView({
    customStepProps,
    initialValues
  }: StepProps<FlagConfigurationStepData>): ReactElement {
    return (
      <FlagConfigurationStepVariablesView
        {...(customStepProps as FlagConfigurationStepVariablesViewProps)}
        originalData={initialValues}
      />
    )
  }
 
  private static renderWidgetView({
    initialValues,
    onUpdate,
    stepViewType,
    isNewStep,
    readonly,
    formikRef
  }: StepProps<FlagConfigurationStepData>): ReactElement {
    return (
      <FlagConfigurationStepWidget
        initialValues={initialValues}
        onUpdate={onUpdate as FlagConfigurationStepWidgetProps['onUpdate']}
        stepViewType={stepViewType}
        isNewStep={isNewStep}
        readonly={readonly}
        ref={formikRef}
      />
    )
  }
 
  validateInputSet({
    data,
    template,
    getString
  }: ValidateInputSetProps<FlagConfigurationStepData>): FormikErrors<FlagConfigurationStepData> {
    const errors: FormikErrors<FlagConfigurationStepData> = {}
 
    if (template?.spec?.feature === RUNTIME_INPUT_VALUE && isEmpty(data?.spec?.feature)) {
      set(errors, 'spec.feature', getString?.('fieldRequired', { field: 'feature' }))
    }
 
    if (template?.spec?.instructions === RUNTIME_INPUT_VALUE && isEmpty(data?.spec?.instructions)) {
      set(errors, 'spec.instructions', getString?.('fieldRequired', { field: 'instructions' }))
    }
 
    return errors
  }
 
  protected defaultValues: FlagConfigurationStepData = {
    identifier: '',
    name: '',
    type: '',
    timeout: '10m',
    spec: {
      feature: '',
      environment: ''
    }
  }
 
  processFormData(data: StepElementConfig): FlagConfigurationStepData {
    return data as FlagConfigurationStepData
  }
}