Untitled

 avatar
unknown
plain_text
23 days ago
2.5 kB
3
Indexable
import React from 'react';
import { QueryBuilder, RuleGroupType } from 'react-querybuilder';

// Custom Checkbox Component
const CheckboxComponent = ({ field, value, handleOnChange }) => {
  const handleChange = (event) => {
    const { name, checked } = event.target;
    handleOnChange({ ...value, [name]: checked });
  };

  return (
    <div>
      <label>
        <input
          type="checkbox"
          name="option1"
          checked={value?.option1 || false}
          onChange={handleChange}
        />
        Option 1
      </label>
      <label>
        <input
          type="checkbox"
          name="option2"
          checked={value?.option2 || false}
          onChange={handleChange}
        />
        Option 2
      </label>
      <label>
        <input
          type="checkbox"
          name="option3"
          checked={value?.option3 || false}
          onChange={handleChange}
        />
        Option 3
      </label>
    </div>
  );
};

// Fallback for the custom component
const FallbackComponent = ({ value, handleOnChange }) => {
  return (
    <div>
      <p>No custom component available. Fallback behavior activated.</p>
      <select
        value={value || ''}
        onChange={(e) => handleOnChange(e.target.value)}
      >
        <option value="">Select an option</option>
        <option value="fallback1">Fallback 1</option>
        <option value="fallback2">Fallback 2</option>
      </select>
    </div>
  );
};

// Main App Component
const App = () => {
  const [query, setQuery] = React.useState({
    combinator: 'and',
    rules: [],
  });

  const handleQueryChange = (newQuery) => setQuery(newQuery);

  const customComponents = {
    valueEditor: (props) => {
      if (props.field === 'checkboxField') {
        return (
          <CheckboxComponent
            field={props.field}
            value={props.value || {}}
            handleOnChange={props.handleOnChange}
          />
        );
      }
      return <FallbackComponent {...props} />;
    },
  };

  const fields = [
    { name: 'checkboxField', label: 'Checkbox Field' },
    { name: 'textField', label: 'Text Field' },
  ];

  return (
    <div>
      <h1>React Query Builder with Custom Checkbox Component</h1>
      <QueryBuilder
        fields={fields}
        query={query}
        onQueryChange={handleQueryChange}
        controlElements={customComponents}
      />
      <pre>{JSON.stringify(query, null, 2)}</pre>
    </div>
  );
};

export default App;
Leave a Comment