ukrbublik/react-awesome-query-builder

FieldCascader issue

Closed this issue · 1 comments

I had started using react awesome query builder antd in a projetct. since v6.1.1. Below shown code was working perfectly fine till recently.

import React, { useState, useEffect, ReactPropTypes } from 'react';
import axios from '../../Config/Axios';
import '@react-awesome-query-builder/ui/css/styles.css';
import { Modal, Button, ModalHeader, Text, ModalBody, ModalFooter, Row, Loader } from 'src/coreComponents';
import {
  AntdConfig,
  AntdWidgets,
  Utils as QbUtils,
  Query,
  Builder,
  BasicConfig,
  JsonTree,
} from '@react-awesome-query-builder/antd';
import './styles.css';
import { EntityFields } from './types';
interface QueryBuilderProps {
  fields: EntityFields;
  onQuery: (query: string) => void;
  jsonTree?: JsonTree;
  saveJsonTree: (jsonTree: JsonTree) => void;
  rebuildBuilder?: boolean;
}
// or import '@react-awesome-query-builder/ui/css/compact_styles.css';
const InitialConfig = AntdConfig;
const queryValue: any = { id: QbUtils.uuid(), type: 'group' };
const config: BasicConfig = {
  ...InitialConfig,
  settings: {
    ...InitialConfig.settings,
    renderField: (props: any) => <AntdWidgets.FieldCascader {...props} />,
    fieldSources: ['field', 'func'],
  },
};
const renderBuilder = (props: any) => (
  <div className='query-builder-container' style={{ padding: '10px' }}>
    <div className='query-builder qb-lite'>
      <Builder {...props} />
    </div>
  </div>
);
const columnTypes: { [key: string]: string } = {
  bigint: 'number',
  bit: 'boolean',
  datetime: 'datetime',
  decimal: 'number',
  nvarchar: 'text',
  'nvarchar(250)': 'text',
  uniqueidentifier: 'text',
};

const QueryBuilder = ({ fields, jsonTree, onQuery, saveJsonTree, rebuildBuilder }: QueryBuilderProps) => {
  const [fieldsData, setFieldsData] = useState({ ...config });

  useEffect(() => {
    const queryFields = Object.entries(fields).reduce(
      (result, [entityTableName, data]) => ({
        ...result,
        [`[${entityTableName}]`]: {
          label: data.entityName,
          type: '!struct',
          subfields: data.fields.reduce(
            (result, field) => ({
              ...result,
              [`[${field.fieldName}]`]: {
                type: columnTypes[field.controlType.toLowerCase()],
                label: field.displayName,
                // fieldSettings: field.fieldSettings || {},
              },
            }),
            {}
          ),
        },
      }),
      {}
    );
    setFieldsData((prev: any) => ({ ...prev, fields: { ...queryFields } }));
  }, [fields]);
  useEffect(() => {
    setFstate({
      tree: QbUtils.checkTree(QbUtils.loadTree(jsonTree || queryValue), fieldsData),
      config: fieldsData,
    });
  }, [fieldsData, rebuildBuilder]);
  const [fstate, setFstate] = useState({
    tree: QbUtils.checkTree(QbUtils.loadTree(jsonTree || queryValue), fieldsData),
    config: fieldsData,
  });
  const onChange = (immutableTree: any, config: any) => {
    // Tip: for better performance you can apply `throttle` - see `examples/demo`
    // setFstate({tree: immutableTree, config: config});

    const str = QbUtils.sqlFormat(immutableTree, config) || '';
    onQuery(str);
    const jsonTree = QbUtils.getTree(immutableTree);
    saveJsonTree(jsonTree);
    console.log(jsonTree);
    // `jsonTree` can be saved to backend, and later loaded to `queryValue`
  };

  return (
    <div className='query-wrapper'>
      {fieldsData.fields && (
        <Query {...fieldsData} value={fstate.tree} onChange={onChange} renderBuilder={renderBuilder} />
      )}
    </div>
  );
};
export default QueryBuilder;

In a nut shell I am assigning fields under each entity in a config. Only ANTD cascader was added in settings on top of basic config and fields.

But now I am seeing below warning in console whenever I select a field in cascader and neither inputs to select operator nor value input shows up.

image

image

I am not sure if some custom setting is to be added as LHS config.

EDIT: Github code block messed up my code snippet. Formatted snipped can be accessed by this link.

Thanks for the bug report.
There is a bug with FieldCascader.
As a workaround, you can use FieldTreeSelect or default FieldSelect

Btw you can use ``` to wrap your code snippet