Skip to content

Commit bf4eaa4

Browse files
Material UI (#299)
* . * .. * ... * material-ui boolean widget * material-ui date widget * realized these extra funcs are unecessary, can be handled by date-io or customProps * fix material-ui date widget, add material-ui dateTime widget and material-ui time widget * delete commented out code * date/time - added useKeyboard time - show/hide seconds according to timeFormat boolean - use grid for 2 labels select - use renderValue intead of empty value multiselect - new all - don't show placeholer in r/o mode all - use customProps lint fix * number * partial material-ui slider widget (#308) * partial material-ui slider widget * finish working on material-ui slider widget * use Number() instead of parse* * customSliderProps * slider * range * fix uncontrolled Co-authored-by: Denis Oblogin <ukrbublik@gmail.com> * remove isSpecialRange for date/time * confirm * moved MuiPickersUtilsProvider * fixed uncontrolled * some docs * . * restore config * added MUI packages to sandbox * lint-fix * enable mui in tests * to/from labels and materialValueSources (#311) * use inline-flex and alignment to fix the vertical alignment of to/from labels * fix css formatting * fix formatting * start on materialValueSources using popover and radio btns * nit * lint Co-authored-by: Denis Oblogin <ukrbublik@gmail.com> * conjs improvemnt * better alignment styling for mui widget sep and widget value src (#314) * better alignment styling for mui widget sep and widget value src * ... Co-authored-by: Denis Oblogin <ukrbublik@gmail.com> * `value` is default source * ts * readme * . * refactor MaterialFieldSelect with renderValue (#316) * refactor MaterialFieldSelect with renderValue * . * init skin is antd Co-authored-by: Megan Taylor <mtaylor@megantaylor.org>
1 parent 976d212 commit bf4eaa4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1318
-104
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# Changelog
2+
- 3.0.0
3+
- Added [Material-UI](https://material-ui.com) widgets
24
- 2.2.2
35
- Fix issue #306: Wrong import from JsonLogic and export to MongoDb for negated single-item group
46
- 2.2.1

CONFIG.adoc

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,15 @@ TIP: Example: https://github.com/ukrbublik/react-awesome-query-builder/tree/mast
3939

4040
== Basic config
4141

42-
Use `BasicConfig` for simple vanilla UI or `AntdConfig` for more advanced UI with AntDesign widgets.
42+
- Use `BasicConfig` for simple vanilla UI
43+
- Use `AntdConfig` for more advanced UI with https://ant.design/[AntDesign] widgets
44+
- Use `MaterialConfig` for https://material-ui.com/[Material-UI] widgets
4345
[source,javascript]
4446
----
4547
import {BasicConfig} from 'react-awesome-query-builder';
4648
import AntdConfig from 'react-awesome-query-builder/lib/config/antd';
47-
const InitialConfig = BasicConfig; // or AntdConfig
49+
import MaterialConfig from 'react-awesome-query-builder/lib/config/material';
50+
const InitialConfig = BasicConfig; // or AntdConfig or MaterialConfig
4851
4952
const myConfig = {
5053
...InitialConfig, // reuse basic config
@@ -97,8 +100,8 @@ const {
97100
rangeslider, // missing in `BasicConfig`
98101
select,
99102
multiselect,
100-
treeselect, // missing in `BasicConfig`
101-
treemultiselect, // missing in `BasicConfig`
103+
treeselect, // missing in `BasicConfig` and in `MaterialConfig`
104+
treemultiselect, // missing in `BasicConfig` and in `MaterialConfig`
102105
date,
103106
time,
104107
datetime,
@@ -180,7 +183,7 @@ Example:
180183
|tooltip | | |Optional tooltip to be displayed in field list by hovering on item
181184
|fieldSettings | | |Settings for widgets, will be passed as props. Example: `{min: 1, max: 10}` +
182185
Available settings for Number and Slider widgets: `min`, `max`, `step`. Slider also supports `marks` (example: `{ 0: "0%", 100: "100%" }`). +
183-
Available settings for date/time widgets: `timeFormat`, `dateFormat`, `valueFormat`, `use12Hours`.
186+
Available settings for date/time widgets: `timeFormat`, `dateFormat`, `valueFormat`, `use12Hours`, `useKeyboard`.
184187
|fieldSettings.listValues |+ for (multi)select, tree (multi)select | |List of values for (multi)select widget. +
185188
Example for select/multiselect: `[{value: 'yellow', title: 'Yellow'}, {value: 'green', title: 'Green'}]`
186189
(or alternatively `{ yellow: 'Yellow', green: 'Green' }`) +
@@ -213,10 +216,10 @@ Example:
213216
Example:
214217
[source,javascript]
215218
----
216-
import en_US from 'antd/lib/locale-provider/en_US';
219+
import ru_RU from 'antd/lib/locale-provider/ru_RU';
220+
import { ruRU } from '@material-ui/core/locale';
217221
import AntdWidgets from 'react-awesome-query-builder/lib/components/widgets/antd';
218222
import {Widgets} from 'react-awesome-query-builder';
219-
const { VanillaFieldSelect } = Widgets;
220223
const { FieldCascader, FieldDropdown, FieldTreeSelect } = AntdWidgets;
221224
----
222225

@@ -237,9 +240,9 @@ const { FieldCascader, FieldDropdown, FieldTreeSelect } = AntdWidgets;
237240
}
238241
},
239242
locale: {
240-
short: 'ru',
241-
full: 'ru-RU',
243+
moment: 'ru',
242244
antd: ru_RU,
245+
material: ruRU,
243246
},
244247
renderField: (props) => <FieldCascader {...props} />,
245248
renderOperator: (props) => <FieldDropdown {...props} />,
@@ -289,19 +292,31 @@ Behaviour settings:
289292
|useGroupsAsArrays |true |See https://github.com/ukrbublik/react-awesome-query-builder/issues/246[issue]
290293
|===
291294

295+
TIP: For fully read-only mode use these settings:
296+
[source,javascript]
297+
----
298+
immutableGroupsMode: true,
299+
immutableFieldsMode: true,
300+
immutableOpsMode: true,
301+
immutableValuesMode: true,
302+
canReorder: false,
303+
canRegroup: false,
304+
----
305+
306+
292307
Render settings:
293308

294309
[cols="1m,1,3a",options="header",]
295310
|===
296311
|key |default |meaning
297312
|renderSize |`small` |Size of AntDesign components - `small` or `large`
298313
|renderField |`(props) => <FieldSelect {...props} />` |Render fields list +
299-
Available widgets: `FieldSelect`, `FieldDropdown`, `FieldCascader`, `FieldTreeSelect`, `VanillaFieldSelect` (see `AntdWidgets` and `Widgets` above)
314+
Available widgets for AntDesign: `FieldSelect`, `FieldDropdown`, `FieldCascader`, `FieldTreeSelect`
300315
|renderOperator |`(props) => <FieldSelect {...props} />` |Render operators list +
301-
Available widgets: `FieldSelect`, `FieldDropdown`, `VanillaFieldSelect`
316+
Available widgets for AntDesign: `FieldSelect`, `FieldDropdown`
302317
|renderFunc |`(props) => <FieldSelect {...props} />` |Render functions list +
303-
Available widgets: `FieldSelect`, `FieldDropdown`, `VanillaFieldSelect`
304-
|renderConjs, renderButton, renderButtonGroup, renderProvider, renderValueSources, renderConfirm, renderRuleError | |Other internal render functions you can override if using another UI framework (https://github.com/ukrbublik/react-awesome-query-builder/blob/master/modules/config/antd.js#L47[example])
318+
Available widgets for AntDesign: `FieldSelect`, `FieldDropdown`
319+
|renderConjs, renderButton, renderButtonGroup, renderProvider, renderValueSources, renderConfirm, useConfirm, renderRuleError | |Other internal render functions you can override if using another UI framework (https://github.com/ukrbublik/react-awesome-query-builder/blob/master/modules/config/antd.js#L47[example])
305320
|showLabels |false |Show labels above all fields?
306321
|hideConjForOne |true |Don't show conjunctions switcher for only 1 rule?
307322
|maxLabelsLength |100 |To shorten long labels of fields/values (by length, i.e. number of chars)
@@ -320,7 +335,10 @@ Other settings:
320335
[cols="1m,1,3a",options="header",]
321336
|===
322337
|key |default |meaning
323-
|locale |en |Locale used for AntDesign widgets
338+
|locale.moment |"en" |Locale (string or array of strings) used for https://momentjs.com/docs/#/i18n/[moment]
339+
|locale.antd |`en_US` |Locale object used for https://ant.design/docs/react/i18n[AntDesign] widgets
340+
|locale.material |`enUS` |Locale object used for https://material-ui.com/ru/guides/localization/[MaterialUI] widgets
341+
|theme.material |{} |Options for https://material-ui.com/ru/customization/theming/[createMuiTheme]
324342
|formatReverse | |Function for formatting query string, used to format rule with reverse operator which haven't `formatOp`. +
325343
`(string q, string operator, string reversedOp, Object operatorDefinition, Object revOperatorDefinition, bool isForDisplay) => string` +
326344
`q` - already formatted rule for opposite operator (which have `formatOp`) +
@@ -472,6 +490,7 @@ See https://github.com/ukrbublik/react-awesome-query-builder/tree/master/example
472490
----
473491
import {Widgets} from 'react-awesome-query-builder';
474492
import AntdWidgets from 'react-awesome-query-builder/lib/components/widgets/antd';
493+
import MaterialWidgets from 'react-awesome-query-builder/lib/components/widgets/material';
475494
const {
476495
TextWidget,
477496
NumberWidget,
@@ -482,6 +501,11 @@ const {
482501
VanillaNumberWidget,
483502
...
484503
} = Widgets;
504+
const {
505+
MaterialTextWidget,
506+
MaterialNumberWidget,
507+
...
508+
} = MaterialWidgets;
485509
----
486510

487511
[source,javascript]
@@ -522,6 +546,7 @@ const {
522546
|valuePlaceholder | |`config.settings.valuePlaceholder` |Common option, placeholder text to be shown in widget for empty value
523547
|timeFormat | |`HH:mm:ss` |Option for `<TimeWidget>`, `<DateTimeWidget>` to display time in widget. Example: `'HH:mm'`
524548
|use12Hours | |`false` |Option for `<TimeWidget>`
549+
|useKeyboard | |`true` |Option for Material-UI date/time pickers, `false` disables input with keyboard, only picker use is allowed
525550
|dateFormat | |`YYYY-MM-DD` |Option for `<DateWidget>`, `<DateTimeWidget>` to display date in widget. Example: `YYYY-MM-DD`
526551
|valueFormat | | |Option for `<TimeWidget>`, `<DateWidget>`, `<DateTimeWidget>` to prepare string representation of value to be stored. Example: `YYYY-MM-DD HH:mm`
527552
|labelYes, labelNo | | |Option for `<BooleanWidget>`

README.md

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# react-awesome-query-builder
2-
[![npm](https://img.shields.io/npm/v/react-awesome-query-builder.svg)](https://www.npmjs.com/package/react-awesome-query-builder) [![travis](https://travis-ci.org/ukrbublik/react-awesome-query-builder.svg?branch=master)](https://travis-ci.com/github/ukrbublik/react-awesome-query-builder) [![codecov](https://codecov.io/gh/ukrbublik/react-awesome-query-builder/branch/master/graph/badge.svg?date=20201002)](https://codecov.io/gh/ukrbublik/react-awesome-query-builder) [![Financial Contributors on Open Collective](https://opencollective.com/react-awesome-query-builder/all/badge.svg?label=financial+contributors)](https://opencollective.com/react-awesome-query-builder)
2+
[![npm](https://img.shields.io/npm/v/react-awesome-query-builder.svg)](https://www.npmjs.com/package/react-awesome-query-builder) [![travis](https://travis-ci.org/ukrbublik/react-awesome-query-builder.svg?branch=master)](https://travis-ci.com/github/ukrbublik/react-awesome-query-builder) [![codecov](https://codecov.io/gh/ukrbublik/react-awesome-query-builder/branch/master/graph/badge.svg?date=20201002)](https://codecov.io/gh/ukrbublik/react-awesome-query-builder) [![antd](https://img.shields.io/badge/skin-Ant%20Design-blue?logo=Ant%20Design)](https://ant.design) [![mui](https://img.shields.io/badge/skin-Material%20UI-blue?logo=Material%20UI)](https://material-ui.com) [![Financial Contributors on Open Collective](https://opencollective.com/react-awesome-query-builder/all/badge.svg?label=financial+contributors)](https://opencollective.com/react-awesome-query-builder)
33
[![demo](https://img.shields.io/badge/demo-blue)](https://ukrbublik.github.io/react-awesome-query-builder/) [![sandbox TS](https://img.shields.io/badge/sandbox-TS-blue)](https://codesandbox.io/s/github/ukrbublik/react-awesome-query-builder/tree/master/sandbox?file=/src/demo/config_simple.tsx) [![sandbox JS](https://img.shields.io/badge/sandbox-JS-blue)](https://codesandbox.io/s/github/ukrbublik/react-awesome-query-builder/tree/master/sandbox_simple?file=/src/demo/config_simple.js)
44

55

@@ -11,6 +11,8 @@ Inspired by [jQuery QueryBuilder](http://querybuilder.js.org/)
1111

1212
Using awesome [Ant Design](https://ant.design/) v4 for widgets
1313

14+
Now [Material-UI](https://material-ui.com/) is also supported!
15+
1416
[Demo page](https://ukrbublik.github.io/react-awesome-query-builder)
1517

1618

@@ -32,14 +34,31 @@ Using awesome [Ant Design](https://ant.design/) v4 for widgets
3234
- function (arguments also can be values/fields/funcs)
3335
- Reordering (drag-n-drop) support for rules and groups of rules
3436
- Using awesome [Ant Design](https://ant.design/) as UI framework with rich features.
35-
(But using custom widgets of another framework is possible, see below)
37+
Now [Material-UI](https://material-ui.com/) is also supported!
38+
(Using another UI framework and custom widgets is possible, see below)
3639
- Export to MongoDb, SQL, [JsonLogic](http://jsonlogic.com) or your custom format
3740
- Import from [JsonLogic](http://jsonlogic.com)
3841
- TypeScript support (see [types](https://github.com/ukrbublik/react-awesome-query-builder/tree/master/modules/index.d.ts) and [demo in TS](https://github.com/ukrbublik/react-awesome-query-builder/tree/master/examples))
3942

4043

4144
## Getting started
42-
Install: `npm i react-awesome-query-builder` (packages `antd`, `typescript` are optional)
45+
Install:
46+
```
47+
npm i react-awesome-query-builder
48+
```
49+
50+
For AntDesign widgets only:
51+
```
52+
npm i antd
53+
```
54+
55+
For Material-UI widgets only:
56+
```
57+
npm i @material-ui/core
58+
npm i @material-ui/icons
59+
npm i @material-ui/pickers
60+
npm i material-ui-confirm
61+
```
4362

4463
See [basic usage](#usage) and [API](#api) below.
4564

@@ -53,18 +72,24 @@ Demo apps:
5372
From v2.0 of this lib AntDesign is now optional (peer) dependency, so you need to explicitly include `antd` (4.x) in `package.json` of your project if you want to use AntDesign UI.
5473
Please import `AntdConfig` from `react-awesome-query-builder/lib/config/antd` and use it as base for your config (see below in [usage](#usage)).
5574
Alternatively you can use `BasicConfig` for simple vanilla UI, which is by default.
56-
Support of other UI frameworks (like Bootstrap, Material UI) are planned for future, see [Other UI frameworks](#other-ui-frameworks).
75+
Support of other UI frameworks (like Bootstrap) are planned for future, see [Other UI frameworks](#other-ui-frameworks).
5776

5877

5978
## Usage
6079
```javascript
6180
import React, {Component} from 'react';
6281
import {Query, Builder, BasicConfig, Utils as QbUtils} from 'react-awesome-query-builder';
82+
83+
// For AntDesign widgets only:
6384
import AntdConfig from 'react-awesome-query-builder/lib/config/antd';
6485
import 'react-awesome-query-builder/css/antd.less'; // or import "antd/dist/antd.css";
86+
// For Material-UI widgets only:
87+
import MaterialConfig from 'react-awesome-query-builder/lib/config/material';
88+
// Choose your skin (ant/material/vanilla):
89+
const InitialConfig = AntdConfig; // or MaterialConfig or BasicConfig
90+
6591
import 'react-awesome-query-builder/lib/css/styles.css';
6692
import 'react-awesome-query-builder/lib/css/compact_styles.css'; //optional, for more compact styles
67-
const InitialConfig = AntdConfig; // or BasicConfig
6893

6994
// You need to provide your own config. See below 'Config format'
7095
const config = {
@@ -230,14 +255,15 @@ See [`CHANGELOG`](https://github.com/ukrbublik/react-awesome-query-builder/tree/
230255

231256

232257
## Other UI frameworks
233-
Currently there are 2 collections of widgets:
258+
Currently there are 3 collections of widgets:
234259
- [antdesign widgets](https://github.com/ukrbublik/react-awesome-query-builder/tree/master/modules/components/widgets/antd)
260+
- [material widgets](https://github.com/ukrbublik/react-awesome-query-builder/tree/master/modules/components/widgets/material)
235261
- [vanilla widgets](https://github.com/ukrbublik/react-awesome-query-builder/tree/master/modules/components/widgets/vanilla)
236262

237263
Let's say you want to create new collection of Bootstrap widgets to be used in this lib (and submit PR which is always welcomed!).
238264
You can use vanilla widgets as skeleton.
239265
Then to enable new widgets you need to create config overrides like this:
240-
[antdesign config](https://github.com/ukrbublik/react-awesome-query-builder/blob/master/modules/config/antd/index.js)
266+
[material config](https://github.com/ukrbublik/react-awesome-query-builder/blob/master/modules/config/material/index.js)
241267

242268

243269
## Development

css/styles.scss

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ body.qb-dragging {
5151
}
5252

5353
.query-builder {
54+
@extend %noselect;
5455
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
5556
font-size: 14px;
5657
line-height: 1.25;
@@ -346,11 +347,30 @@ ul.ant-select-selection__rendered {
346347
margin-right: 8px;
347348
}
348349

349-
.rule--field, .group--field, .rule--operator, .rule--value, .rule--operator-options, .rule--widget,
350-
.widget--widget, .widget--valuesrc, .widget--sep, .operator--options--sep,
351-
.rule--before-widget, .rule--after-widget {
350+
$rule_items: ".rule--field", ".group--field", ".rule--operator", ".rule--value", ".rule--operator-options", ".rule--widget",
351+
".widget--widget", ".widget--valuesrc", ".widget--sep", ".operator--options--sep",
352+
".rule--before-widget", ".rule--after-widget";
353+
354+
$seps: ".widget--sep", ".operator--options--sep", ".rule--func--bracket-before", ".rule--func--bracket-after", ".rule--func--arg-sep";
355+
356+
#{$rule_items} {
352357
display: inline-block;
353358
}
359+
360+
.mui {
361+
#{$seps} {
362+
vertical-align: bottom;
363+
align-self: flex-end;
364+
margin-bottom: 8px;
365+
}
366+
.rule--operator-options {
367+
vertical-align: bottom;
368+
}
369+
.widget--valuesrc {
370+
vertical-align: bottom;
371+
}
372+
}
373+
354374
.rule--operator, .widget--widget, .widget--valuesrc, .widget--sep {
355375
margin-left: 10px;
356376
}
@@ -435,11 +455,14 @@ div.tooltip-inner {
435455
/** FUNC **********************************************************************/
436456
/******************************************************************************/
437457

438-
.rule--func--wrapper, .rule--func, .rule--func--args, .rule--func--arg, .rule--func--arg-value,
439-
.rule--func--bracket-before, .rule--func--bracket-after, .rule--func--arg-sep,
440-
.rule--func--arg-label, .rule--func--arg-label-sep {
458+
$rule_func_items: ".rule--func--wrapper", ".rule--func", ".rule--func--args", ".rule--func--arg", ".rule--func--arg-value",
459+
".rule--func--bracket-before", ".rule--func--bracket-after", ".rule--func--arg-sep",
460+
".rule--func--arg-label", ".rule--func--arg-label-sep";
461+
462+
#{$rule_func_items} {
441463
display: inline-block;
442464
}
465+
443466
.rule--func--bracket-before, .rule--func--bracket-after {
444467
margin-left: 3px;
445468
margin-right: 3px;

examples/demo/config.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
DateTimeFieldSettings,
88
} from "react-awesome-query-builder";
99
import moment from "moment";
10-
//import en_US from 'antd/lib/locale-provider/en_US';
11-
//import ru_RU from 'antd/lib/locale-provider/ru_RU';
10+
import ru_RU from "antd/lib/locale-provider/ru_RU";
11+
import { ruRU } from "@material-ui/core/locale";
1212

1313
// @ts-ignore
1414
import AntdConfig from "react-awesome-query-builder/config/antd";
@@ -20,9 +20,17 @@ const {
2020
FieldCascader,
2121
FieldTreeSelect,
2222
} = AntdWidgets;
23+
// @ts-ignore
24+
import MaterialConfig from "react-awesome-query-builder/config/material";
25+
26+
const skinToConfig = {
27+
vanilla: BasicConfig,
28+
antd: AntdConfig,
29+
material: MaterialConfig,
30+
};
2331

2432
export default (skin) => {
25-
const InitialConfig = skin == "vanilla" ? BasicConfig : AntdConfig;
33+
const InitialConfig = skinToConfig[skin];
2634

2735
const conjunctions: Conjunctions = {
2836
...InitialConfig.conjunctions,
@@ -145,9 +153,9 @@ export default (skin) => {
145153

146154
const localeSettings: LocaleSettings = {
147155
locale: {
148-
short: "ru",
149-
full: "ru-RU",
150-
//antd: ru_RU,
156+
moment: "ru",
157+
antd: ru_RU,
158+
material: ruRU,
151159
},
152160
valueLabel: "Value",
153161
valuePlaceholder: "Value",

examples/demo/demo.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export default class DemoQueryBuilder extends Component<{}, DemoQueryBuilderStat
6767
<select value={this.state.skin} onChange={this.changeSkin}>
6868
<option key="vanilla">vanilla</option>
6969
<option key="antd">antd</option>
70+
<option key="material">material</option>
7071
</select>
7172
<button onClick={this.resetValue}>reset</button>
7273
<button onClick={this.clearValue}>clear</button>

examples/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-awesome-query-builder-demo-local",
3-
"version": "0.3.3",
3+
"version": "0.4.0",
44
"description": "Local hot-reloadable demo for react-awesome-query-builder",
55
"main": "index.tsx",
66
"scripts": {
@@ -9,6 +9,10 @@
99
},
1010
"author": "Denis Oblogin <ukrbublik@gmail.com> (https://github.com/ukrbublik)",
1111
"dependencies": {
12+
"@material-ui/core": "^4.11.0",
13+
"@material-ui/icons": "^4.9.1",
14+
"@material-ui/pickers": "^3.2.10",
15+
"material-ui-confirm": "^2.1.1",
1216
"antd": ">=4.0.0 <4.5.0",
1317
"react-awesome-query-builder": "file:..",
1418
"webpack": "^4.44.2",

modules/components/FuncWidget.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export default class FuncWidget extends PureComponent {
6969
};
7070
const {showLabels, funcLabel} = config.settings;
7171
const widgetLabel = showLabels
72-
? <label>{funcLabel}</label>
72+
? <label className="rule--label">{funcLabel}</label>
7373
: null;
7474

7575
return (

0 commit comments

Comments
 (0)