All files / atom/tag/src/Actionable index.js

100% Statements 6/6
75% Branches 9/12
100% Functions 1/1
100% Lines 6/6

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                        1x                                             4x 4x 4x                                                                           1x   1x                                        
import {forwardRef} from 'react'
 
import PropTypes from 'prop-types'
 
import PrimitiveInjector from '@s-ui/react-primitive-injector'
 
import {LINK_TYPES} from '../constants.js'
import AtomTagActionableIcon from './AtomTagActionableIcon.js'
import ActionableTagContainer from './Container.js'
import {getClassNames, ICON_PLACEMENTS} from './settings.js'
import TagLink from './TagLink.js'
 
const ActionableTag = forwardRef(
  (
    {
      icon,
      href,
      iconPlacement,
      label,
      onClick,
      target,
      rel,
      linkFactory = TagLink,
      className,
      readOnly,
      disabled,
      title,
      as: As,
      value = null,
      pressed,
      defaultPressed,
      ...props
    },
    forwardedRef
  ) => {
    const isActionableTagContainer = As === undefined
    const Component = isActionableTagContainer ? ActionableTagContainer : As
    return (
      <PrimitiveInjector
        className={getClassNames({className})}
        href={href}
        target={target}
        rel={rel}
        pressed={pressed}
        defaultPressed={defaultPressed}
      >
        <Component
          link={linkFactory}
          ref={forwardedRef}
          onClick={onClick}
          readOnly={readOnly}
          disabled={disabled}
          value={value}
          label={label}
          {...props}
        >
          <AtomTagActionableIcon
            {...(iconPlacement === ICON_PLACEMENTS.LEFT && {icon})}
            iconPlacement={ICON_PLACEMENTS.LEFT}
          />
          {label ? (
            <span className="sui-AtomTag-label" title={title || label}>
              {label}
            </span>
          ) : null}
          <AtomTagActionableIcon
            {...(iconPlacement === ICON_PLACEMENTS.RIGHT && {icon})}
            iconPlacement={ICON_PLACEMENTS.RIGHT}
          />
        </Component>
      </PrimitiveInjector>
    )
  }
)
 
ActionableTag.displayName = 'ActionableTag'
 
ActionableTag.propTypes = {
  className: PropTypes.string,
  disabled: PropTypes.bool,
  readOnly: PropTypes.bool,
  label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,
  icon: PropTypes.node,
  href: PropTypes.string,
  iconPlacement: PropTypes.oneOf(Object.values(ICON_PLACEMENTS)),
  onClick: PropTypes.func,
  target: PropTypes.oneOf(['_self', '_blank', '_parent', '_top']),
  rel: PropTypes.arrayOf(PropTypes.oneOf(Object.values(LINK_TYPES))),
  linkFactory: PropTypes.elementType,
  title: PropTypes.string,
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
  as: PropTypes.elementType,
  pressed: PropTypes.bool,
  defaultPressed: PropTypes.bool
}
 
export default ActionableTag