import { DevLayout, useDevApp } from '@rqb-devapp';
import * as React from 'react';
import { useMemo, useState } from 'react';
import { createRoot } from 'react-dom/client';
import type { Field, RuleGroupType } from 'react-querybuilder';
import { formatQuery, QueryBuilder } from 'react-querybuilder';
import {
expressionRuleProcessorJsonLogic,
expressionRuleProcessorParameterized,
expressionRuleProcessorSQL,
} from '../src';
import { QueryBuilderExpressions } from '../src/ui';
import './styles.scss';
const fields: Field[] = [
{ name: 'price', label: 'Price', valueSources: ['value', 'expression'] },
{ name: 'quantity', label: 'Quantity' },
{ name: 'discount', label: 'Discount' },
];
const initialQuery: RuleGroupType = {
combinator: 'and',
rules: [
{
field: 'discount',
operator: '>',
value: 5,
lhs: { kind: 'func', fn: 'abs', args: [{ kind: 'field', field: 'discount' }] },
},
{
field: 'price',
operator: '=',
valueSource: 'expression',
value: {
kind: 'func',
fn: 'multiply',
args: [
{ kind: 'field', field: 'quantity' },
{ kind: 'value', value: 2 },
],
},
},
],
};
const extraOptions: Record<string, boolean> = {
allowFunctionsOnLHS: true,
};
const App = () => {
const [query, setQuery] = useState(initialQuery);
const exportFormats = useMemo(
() => ({
sql: formatQuery(query, { format: 'sql', ruleProcessor: expressionRuleProcessorSQL }),
parameterized: JSON.stringify(
formatQuery(query, {
format: 'parameterized',
ruleProcessor: expressionRuleProcessorParameterized,
}),
null,
2
),
jsonlogic: JSON.stringify(
formatQuery(query, {
format: 'jsonlogic',
ruleProcessor: expressionRuleProcessorJsonLogic,
}),
null,
2
),
}),
[query]
);
const devApp = useDevApp(extraOptions, exportFormats);
const queryBuilderProps = useMemo(
() => ({ ...devApp.commonRQBProps, fields }),
[devApp.commonRQBProps]
);
return (
<DevLayout {...devApp}>
<QueryBuilderExpressions allowFunctionsOnLHS={devApp.optVals.allowFunctionsOnLHS}>
<QueryBuilder {...queryBuilderProps} query={query} onQueryChange={setQuery} />
</QueryBuilderExpressions>
</DevLayout>
);
};
createRoot(document.querySelector('#app')!).render(
<React.StrictMode>
<App />
</React.StrictMode>
);