All files / modules/75-ce/components/PerspectiveBuilderPreview/GroupByView GroupByViewSubMenu.tsx

100% Statements 7/7
100% Branches 0/0
100% Functions 0/0
100% Lines 7/7

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              5x 5x 5x 5x 5x               5x                                                                                                                                                                                 5x  
/*
 * Copyright 2022 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 from 'react'
import { Container, TextInput } from '@wings-software/uicore'
import { MenuItem } from '@blueprintjs/core'
import { useStrings } from 'framework/strings'
import {
  QlceViewFieldInputInput,
  ViewFieldIdentifier,
  Maybe,
  QlceViewFieldIdentifierData,
  QlceViewField
} from 'services/ce/services'
 
import css from '../PerspectiveBuilderPreview.module.scss'
 
interface GroupByViewSubMenuProps {
  labelData: Maybe<Maybe<string>[]>
  field: QlceViewFieldIdentifierData
  setGroupBy: (groupBy: QlceViewFieldInputInput) => void
}
 
/* istanbul ignore next */
const GroupByViewSubMenu: (props: GroupByViewSubMenuProps) => JSX.Element | null = ({
  field,
  labelData,
  setGroupBy
}) => {
  const { getString } = useStrings()
  const [searchText, setSearchText] = React.useState('')
 
  const filteredLabelData = (labelData || []).filter(label => {
    if (!label) {
      return false
    }
    return label.toLocaleLowerCase().indexOf(searchText.toLocaleLowerCase()) < 0 ? false : true
  })
 
  const renderLabels: (value: QlceViewField) => void = value => {
    return (
      <MenuItem className={css.menuItem} key={value.fieldId} text={value.fieldName}>
        <div className={css.groupByLabel}>
          <TextInput
            value={searchText}
            onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
              setSearchText(e.target.value)
            }}
            placeholder={getString('ce.perspectives.createPerspective.filters.searchText')}
          />
          <Container className={css.labelValueContainer}>
            {filteredLabelData.map(label => (
              <MenuItem
                className={css.menuItem}
                key={label}
                text={label}
                onClick={() =>
                  setGroupBy({
                    identifier: ViewFieldIdentifier.Label,
                    fieldId: 'labels.value',
                    fieldName: label || '',
                    identifierName: 'Label'
                  })
                }
              />
            ))}
          </Container>
        </div>
      </MenuItem>
    )
  }
 
  if (field.values.length) {
    return (
      <>
        {field.values.map(value => {
          if (value) {
            if (value.fieldId === 'label') {
              return renderLabels(value)
            }
            return (
              <MenuItem
                className={css.menuItem}
                key={value.fieldId}
                text={value.fieldName}
                onClick={() =>
                  setGroupBy({
                    fieldId: value.fieldId,
                    fieldName: value.fieldName,
                    identifier: field.identifier,
                    identifierName: field.identifierName
                  })
                }
              />
            )
          }
          return null
        })}
      </>
    )
  }
  return null
}
 
export default GroupByViewSubMenu