Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

135
Views
component input with variable tags and text

I need an input component where I can insert text and when I enter a special character, a window appears with a choice of variables and it will be inserted as a tag, and this variable tag can be inserted anywhere in the text. As far as I understand, this should be done with contentEditable.

all I could do is such an input, where I put the $ symbol only at the end, and not a tag is added, but text: enter image description here

I found many examples where there is just adding tags (https://bootstrap-tagsinput.github.io/bootstrap-tagsinput/examples/), but I didn’t find such a component where tags are mixed with text, can anyone see this?

import { useState } from 'react'

import classNames from 'classnames'
import ContentEditable from 'react-contenteditable'

import { useAppSelector } from '../../app/hooks'
import { selectVariables } from '../../redux/reducers/variables'

import styles from '../../stylesheets/components/common/InputVariable.module.scss'

export const InputVariable = ({ className, label, onChange, value }: any) => {
  const { variables } = useAppSelector(selectVariables)
  const [symbol, symbolSet] = useState(false)

  const handleChange = (e: any) => {
    const str = e.target.value

    onChange(str)

    if (str.charAt(str.length - 1) === '$') {
      symbolSet(true)
    } else {
      symbolSet(false)
    }
  }

  const handleClickVariable = (variable: any) => {
    const newStr = `${value.substring(0, value.length - 1)}{{${variable.id}}}`

    onChange(newStr)
    symbolSet(false)
  }

  const onPaste = (e: any) => {
    e.preventDefault()
    const text = e.clipboardData.getData('text/plain')

    console.log(text)
  }

  return (
    <div className={classNames(styles.inputVariable, className)}>
      <span className={styles.label}>{label}</span>
      <ContentEditable
        className={styles.root}
        html={value}
        disabled={false}
        onChange={handleChange}
        onPaste={onPaste}
      />
      {symbol && (
        <div className={styles.variables}>
          {variables &&
            variables.map((variable: any) => (
              <div key={variable.id} onClick={() => handleClickVariable(variable)} className={styles.variable}>
                {variable.name}
              </div>
            ))}
        </div>
      )}
    </div>
  )
}

export default InputVariable
about 4 years ago · Juan Pablo Isaza
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!