All files / src/flow/nodes wait_for_digits.ts

94.23% Statements 98/104
46.66% Branches 7/15
66.66% Functions 2/3
94.23% Lines 98/104

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 10598x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 1x 1x 1x 1x 1x 98x 8x 8x 8x 8x 8x 8x 8x 8x   8x 8x 8x 8x 98x           98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x 98x  
import { SPLIT_GROUPS, FormData, NodeConfig, FlowTypes } from '../types';
import { Node } from '../../store/flow-definition';
import { createRulesRouter } from '../../utils';
import {
  getDigitOperators,
  operatorsToSelectOptions,
  getOperatorConfig
} from '../operators';
import {
  resultNameField,
  localizeRulesField,
  localizeCategoriesField,
  nodeOptionsAccordion
} from './shared';
import {
  createRulesArrayConfig,
  extractUserRules,
  casesToFormRules
} from './shared-rules';
 
export const wait_for_digits: NodeConfig = {
  type: 'wait_for_digits',
  name: 'Wait for Digits',
  group: SPLIT_GROUPS.wait,
  flowTypes: [FlowTypes.VOICE],
  dialogSize: 'large',
  form: {
    rules: createRulesArrayConfig(
      operatorsToSelectOptions(getDigitOperators()),
      ''
    ),
    result_name: resultNameField,
    localizeRules: localizeRulesField,
    localizeCategories: localizeCategoriesField
  },
  layout: [
    {
      type: 'text',
      text: 'Rules match against all digits pressed by the caller followed by the # sign.'
    },
    'rules',
    nodeOptionsAccordion
  ],
  validate: (_formData: FormData) => {
    return {
      valid: true,
      errors: {}
    };
  },
  toFormData: (node: Node, nodeUI?: any) => {
    const rules = casesToFormRules(node);
    return {
      uuid: node.uuid,
      rules,
      result_name: node.router?.result_name || '',
      localizeRules: nodeUI?.config?.localizeRules || false,
      localizeCategories: nodeUI?.config?.localizeCategories || false
    };
  },
  toUIConfig: (formData: FormData) => {
    const config: Record<string, any> = {};
    config.localizeRules = !!formData.localizeRules;
    config.localizeCategories = formData.result_name
      ? !!formData.localizeCategories
      : false;
    return config;
  },
  fromFormData: (formData: FormData, originalNode: Node): Node => {
    const userRules = extractUserRules(formData);
    const existingCategories = originalNode.router?.categories || [];
    const existingExits = originalNode.exits || [];
    const existingCases = originalNode.router?.cases || [];
 
    const { router, exits } = createRulesRouter(
      '@input.text',
      userRules,
      getOperatorConfig,
      existingCategories,
      existingExits,
      existingCases
    );
 
    const finalRouter: any = {
      ...router,
      wait: {
        type: 'msg',
        hint: {
          type: 'digits'
        }
      }
    };
 
    if (formData.result_name && formData.result_name.trim() !== '') {
      finalRouter.result_name = formData.result_name.trim();
    }
 
    return {
      ...originalNode,
      router: finalRouter,
      exits
    };
  },
  localizable: 'categories'
};