BerniWittmann/cape-frontend

View on GitHub
src/utils/helpers.js

Summary

Maintainability
A
30 mins
Test Coverage
import { CONTEXT_SITUATION_RULES_CONNECTORS, CONTEXT_SITUATION_RULES_PART_TYPES } from '@/utils/constants'
const contextSituationRuleStringRegex = /^!?([a-z]|[0-9]){24}.([a-z]|[A-Z]|[0-9]|_)+( ((&&)|(\|\|)) !?([a-z]|[0-9]){24}.([a-z]|[A-Z]|[0-9]|_)+)*$/

export function convertHexToRgba(color, opacity = 1) {
  const c = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color)
  return `rgba(${parseInt(c[1], 16)}, ${parseInt(c[2], 16)}, ${parseInt(c[3], 16)}, ${opacity})`
}

export function getCookie(name) {
  const value = '; ' + document.cookie
  const parts = value.split('; ' + name + '=')
  if (parts.length === 2) return parts.pop().split(';').shift()
}

export function hasProcessModelerRulesEnabled() {
  const cookie = getCookie('enableProcessValidation')
  return cookie ? cookie === 'true' : true
}

export function removeByID(arr, id) {
  return arr.filter(o => o.id !== id)
}

export function updateAndSetActive(store, data, Model, moduleName) {
  data = new Model(data)
  store.dispatch(`${moduleName}/update`, data).then(() => {
    store.dispatch(`${moduleName}/setActive`, data)
  })
}

export function getDeep(obj, path) {
  if (!path || !obj) return undefined
  const paths = path.split('.')
  let current = obj
  for (let i = 0; i < paths.length; i++) {
    current = current[paths[i]]
    if (current === undefined) return undefined
  }
  return current
}

export function scrollToTop() {
  try {
    const el = document.getElementById('app')
    el.scrollTo({
      top: 0,
      left: 0,
      behavior: 'smooth'
    })
  } catch (e) {}
}

export function hasCommonElement(arr1, arr2) {
  let result = false
  for (let i = 0; i < arr1.length; i++) {
    if (arr2.includes(arr1[i])) {
      result = true
      break
    }
  }
  return result
}

// Transforms a Context Situation Rule String to an Array that can be edited
export function decodeContextSituationRuleString(str) {
  if (!str || !str.match(contextSituationRuleStringRegex)) return []
  return str.split(' ').map((obj) => {
    if (obj === '&&') {
      return {
        type: CONTEXT_SITUATION_RULES_PART_TYPES.CON,
        data: CONTEXT_SITUATION_RULES_CONNECTORS.AND
      }
    }
    if (obj === '||') {
      return {
        type: CONTEXT_SITUATION_RULES_PART_TYPES.CON,
        data: CONTEXT_SITUATION_RULES_CONNECTORS.OR
      }
    }
    let isNegated = false
    if (obj.indexOf('!') === 0) {
      isNegated = true
      obj = obj.slice(1)
    }
    return {
      type: CONTEXT_SITUATION_RULES_PART_TYPES.ARG,
      data: [...obj.split('.'), isNegated]
    }
  })
}

// Transforms a Context Situation Rule Array to a logical String
export function encodeContextSituationRuleString(parts) {
  if (!parts || !Array.isArray(parts) || parts.length === 0) return ''
  return parts.map((obj) => {
    if (obj.type === CONTEXT_SITUATION_RULES_PART_TYPES.ARG && obj.data && obj.data.length > 0) {
      return (obj.data[2] ? '!' : '') + obj.data[0] + '.' + obj.data[1]
    } else if (obj.type === CONTEXT_SITUATION_RULES_PART_TYPES.CON && obj.data) {
      if (obj.data === CONTEXT_SITUATION_RULES_CONNECTORS.AND) return '&&'
      if (obj.data === CONTEXT_SITUATION_RULES_CONNECTORS.OR) return '||'
      return '##Invalid##'
    } else {
      return '##Invalid##'
    }
  }).filter((s) => s !== '##Invalid##').join(' ')
}