Skip to content

Commit cebc38a

Browse files
Bootstrap (#604)
* Bootstrap widget kickoff (#537) * bootstrap widget - initial configs and structure * Implementing button for bootstrap widget * removing unnecessary code * minor fix to bootstrap index.js * removing use confirm from bootstrap widget * removing use confirm from index.js * moving bootstrap and fontawesome dependencies to peer dependencies and dev dependencies * adding reactstrap button group, correcting size of button and removing rangeslider from bootstrap feature * Applying Reactstrap input select (#570) * applying reactstrap input select * minor adjustment to multiselect * Bootstrap - Implementing conjs and boolean (#585) * implementing conjs and boolean * adapting the other components with reactstrap Input * implementing dropdown to obtain options with bootstrap styles * stretching dropdown options - bootstrap * adding bootstrap style to multiselect and its options * implementing bootstrap field select * adding margin to group items * minor adjustment to item group spacing and adding key to fix warning * fixing indentation and warning (#606) * improve * cool vs * readme * lint fix * 4.10.0 Co-authored-by: Pedro Coelho <pedrocoelhoprojetos@gmail.com>
1 parent e586a01 commit cebc38a

28 files changed

+909
-13
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Changelog
2-
2+
- 4.10.0
3+
- Support Bootstrap (via `reactstrap`) (PR #604)
34
- 4.9.0
45
- Added `is_null` and `is_not_null` operators (issue #494) (PR #522)
56
- ! Breaking change for operators `is_empty` and `is_not_empty`. Left for text type only, for other types will be auto converted to `is_null`/`is_not_null`. Changed meaning of `is_empty` - now it's just strict comparing with empty string. Before change meaning was similar to `is_null` (and export to SQL was wrong because of non-existent operator `IS EMPTY`). (issue #494) (PR #573)

CONFIG.adoc

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ TIP: Example: https://github.com/ukrbublik/react-awesome-query-builder/tree/mast
4242
- Use `BasicConfig` for simple vanilla UI
4343
- Use `AntdConfig` for more advanced UI with https://ant.design/[AntDesign] widgets
4444
- Use `MaterialConfig` for https://material-ui.com/[Material-UI] widgets
45+
- Use `BootstrapConfig` for https://reactstrap.github.io/[Bootstrap] widgets
4546
[source,javascript]
4647
----
4748
import {BasicConfig} from 'react-awesome-query-builder';
4849
import AntdConfig from 'react-awesome-query-builder/lib/config/antd';
4950
import MaterialConfig from 'react-awesome-query-builder/lib/config/material';
50-
const InitialConfig = BasicConfig; // or AntdConfig or MaterialConfig
51+
import BootstrapConfig from "react-awesome-query-builder/lib/config/bootstrap";
52+
const InitialConfig = BasicConfig; // or AntdConfig or BootstrapConfig or MaterialConfig
5153
5254
const myConfig = {
5355
...InitialConfig, // reuse basic config
@@ -100,11 +102,11 @@ const {
100102
textarea,
101103
number,
102104
slider,
103-
rangeslider, // missing in `BasicConfig`
105+
rangeslider, // missing in `BasicConfig`, `BootstrapConfig`
104106
select,
105107
multiselect,
106-
treeselect, // missing in `BasicConfig` and in `MaterialConfig`
107-
treemultiselect, // missing in `BasicConfig` and in `MaterialConfig`
108+
treeselect, // missing in `BasicConfig`, `MaterialConfig`, `BootstrapConfig`
109+
treemultiselect, // missing in `BasicConfig`, `MaterialConfig`, `BootstrapConfig`
108110
date,
109111
time,
110112
datetime,
@@ -527,6 +529,7 @@ See https://github.com/ukrbublik/react-awesome-query-builder/tree/master/example
527529
import {Widgets} from 'react-awesome-query-builder';
528530
import AntdWidgets from 'react-awesome-query-builder/lib/components/widgets/antd';
529531
import MaterialWidgets from 'react-awesome-query-builder/lib/components/widgets/material';
532+
import BootstrapWidgets from 'react-awesome-query-builder/lib/components/widgets/bootstrap';
530533
const {
531534
TextWidget,
532535
NumberWidget,
@@ -542,6 +545,11 @@ const {
542545
MaterialNumberWidget,
543546
...
544547
} = MaterialWidgets;
548+
const {
549+
BootstrapTextWidget,
550+
BootstrapNumberWidget,
551+
...
552+
} = BootstrapWidgets;
545553
----
546554

547555
[source,javascript]

README.md

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
[![travis](https://travis-ci.org/ukrbublik/react-awesome-query-builder.svg?branch=master)](https://travis-ci.com/github/ukrbublik/react-awesome-query-builder)
1313
[![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)
1414
[![antd](https://img.shields.io/badge/skin-Ant%20Design-blue?logo=Ant%20Design)](https://ant.design)
15-
[![mui](https://img.shields.io/badge/skin-Material%20UI-blue?logo=Material%20UI)](https://material-ui.com)
15+
[![mui](https://img.shields.io/badge/skin-Material%20UI-blue?logo=MUI)](https://material-ui.com)
16+
[![bootstrap](https://img.shields.io/badge/skin-Bootstrap-blue?logo=Bootstrap)](https://reactstrap.github.io/)
1617
[![demo](https://img.shields.io/badge/demo-blue)](https://ukrbublik.github.io/react-awesome-query-builder/)
1718
[![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)
1819
[![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)
@@ -61,8 +62,11 @@ See [live demo](https://ukrbublik.github.io/react-awesome-query-builder)
6162
- another fields (of same type)
6263
- function (arguments also can be values/fields/funcs)
6364
- Reordering (drag-n-drop) support for rules and groups of rules
64-
- Using awesome [Ant Design](https://ant.design/) as UI framework with rich features.
65-
Now [Material-UI](https://material-ui.com/) is also supported!
65+
- Themes:
66+
- [Ant Design](https://ant.design/)
67+
- [Material-UI](https://material-ui.com/)
68+
- [Bootstrap](https://reactstrap.github.io/)
69+
- vanilla
6670
(Using another UI framework and custom widgets is possible, see below)
6771
- Export to MongoDb, SQL, [JsonLogic](http://jsonlogic.com), ElasticSearch or your custom format
6872
- Import from [JsonLogic](http://jsonlogic.com)
@@ -85,6 +89,11 @@ For Material-UI widgets only:
8589
npm i @material-ui/core @material-ui/lab @material-ui/icons @material-ui/pickers material-ui-confirm --save
8690
```
8791

92+
For Bootstrap widgets only:
93+
```
94+
npm i bootstrap reactstrap @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/react-fontawesome --save
95+
```
96+
8897
See [basic usage](#usage) for minimum code example.
8998

9099
See [API](#api) and [config](#config-format) for documentation.
@@ -108,12 +117,14 @@ import AntdConfig from 'react-awesome-query-builder/lib/config/antd';
108117
import 'antd/dist/antd.css'; // or import "react-awesome-query-builder/css/antd.less";
109118
// For Material-UI widgets only:
110119
import MaterialConfig from 'react-awesome-query-builder/lib/config/material';
120+
// For Bootstrap widgets only:
121+
import BootstrapConfig from "react-awesome-query-builder/lib/config/bootstrap";
111122

112123
import 'react-awesome-query-builder/lib/css/styles.css';
113124
import 'react-awesome-query-builder/lib/css/compact_styles.css'; //optional, for more compact styles
114125

115126
// Choose your skin (ant/material/vanilla):
116-
const InitialConfig = AntdConfig; // or MaterialConfig or BasicConfig
127+
const InitialConfig = AntdConfig; // or MaterialConfig or BootstrapConfig or BasicConfig
117128

118129
// You need to provide your own config. See below 'Config format'
119130
const config = {
@@ -227,12 +238,14 @@ import AntdConfig from "react-awesome-query-builder/lib/config/antd";
227238
import "antd/dist/antd.css"; // or import "react-awesome-query-builder/css/antd.less";
228239
// For Material-UI widgets only:
229240
//import MaterialConfig from "react-awesome-query-builder/lib/config/material";
241+
// For Bootstrap widgets only:
242+
//import BootstrapConfig from "react-awesome-query-builder/lib/config/bootstrap";
230243

231244
import "react-awesome-query-builder/lib/css/styles.css";
232245
import "react-awesome-query-builder/lib/css/compact_styles.css"; //optional, for more compact styles
233246

234247
// Choose your skin (ant/material/vanilla):
235-
const InitialConfig = AntdConfig; // or MaterialConfig or BasicConfig
248+
const InitialConfig = AntdConfig; // or MaterialConfig or BootstrapConfig or BasicConfig
236249

237250
// You need to provide your own config. See below 'Config format'
238251
const config: Config = {

css/styles.scss

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,3 +644,11 @@ $rule_actions: ".widget--valuesrc", ".rule--drag-handler", ".rule--header";
644644
}
645645
}
646646
}
647+
648+
/******************************************************************************/
649+
/** Bootstrap ***********************************************************/
650+
/******************************************************************************/
651+
652+
.svg-inline--fa {
653+
pointer-events: none;
654+
}

examples/demo/config.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { ruRU } from "@material-ui/core/locale";
1313
import AntdConfig from "react-awesome-query-builder/config/antd";
1414
import AntdWidgets from "react-awesome-query-builder/components/widgets/antd";
1515
import MaterialConfig from "react-awesome-query-builder/config/material";
16+
import BootstrapConfig from "react-awesome-query-builder/config/bootstrap";
1617
const {
1718
FieldSelect,
1819
FieldDropdown,
@@ -25,6 +26,7 @@ const skinToConfig: Record<string, Config> = {
2526
vanilla: BasicConfig,
2627
antd: AntdConfig,
2728
material: MaterialConfig,
29+
bootstrap: BootstrapConfig
2830
};
2931

3032
export default (skin: string) => {

examples/demo/demo.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export default class DemoQueryBuilder extends Component<{}, DemoQueryBuilderStat
7979
<option key="vanilla">vanilla</option>
8080
<option key="antd">antd</option>
8181
<option key="material">material</option>
82+
<option key="bootstrap">bootstrap</option>
8283
</select>
8384
<button onClick={this.resetValue}>reset</button>
8485
<button onClick={this.clearValue}>clear</button>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React from "react";
2+
import { Button } from "reactstrap";
3+
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4+
import { faPlus, faTrashAlt } from "@fortawesome/free-solid-svg-icons";
5+
6+
export default ({ type, label, onClick, config }) => {
7+
const typeToOnlyIcon = {
8+
delGroup: faTrashAlt,
9+
delRuleGroup: faTrashAlt,
10+
delRule: faTrashAlt,
11+
addRuleGroup: faPlus,
12+
addRuleGroupExt: faPlus,
13+
};
14+
const typeToIcon = {
15+
addRule: faPlus,
16+
addGroup: faPlus,
17+
};
18+
const typeToColor = {
19+
addRule: "primary",
20+
addGroup: "primary",
21+
delGroup: "danger",
22+
delRuleGroup: "danger",
23+
delRule: "danger",
24+
};
25+
26+
let isOnlyIcon = typeToOnlyIcon[type];
27+
28+
return (
29+
<Button size="sm" color={typeToColor[type]} onClick={onClick}>
30+
<FontAwesomeIcon icon={isOnlyIcon ? typeToOnlyIcon[type] : typeToIcon[type]} /> {!isOnlyIcon && label}
31+
</Button>
32+
);
33+
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import React from "react";
2+
import { ButtonGroup } from "reactstrap";
3+
4+
export default ({children, config}) => {
5+
return <ButtonGroup>{children}</ButtonGroup>;
6+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default ({onOk, okText, cancelText, title}) => {
2+
if (confirm(title)) {
3+
onOk();
4+
}
5+
};
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React from "react";
2+
import { Button, ButtonGroup } from "reactstrap";
3+
4+
export default ({
5+
id,
6+
not,
7+
setNot,
8+
conjunctionOptions,
9+
setConjunction,
10+
disabled,
11+
readonly,
12+
config,
13+
showNot,
14+
notLabel,
15+
}) => {
16+
17+
const conjsCount = Object.keys(conjunctionOptions).length;
18+
const lessThenTwo = disabled;
19+
const { forceShowConj } = config.settings;
20+
const showConj = forceShowConj || (conjsCount > 1 && !lessThenTwo);
21+
22+
const renderOptions = () =>
23+
Object.keys(conjunctionOptions).map((key) => {
24+
const { id, name, label, checked } = conjunctionOptions[key];
25+
let postfix = setConjunction.isDummyFn ? "__dummy" : "";
26+
if ((readonly || disabled) && !checked) return null;
27+
return (
28+
<Button
29+
key={id + postfix}
30+
id={id + postfix}
31+
size="sm"
32+
color={checked ? "primary" : "secondary"}
33+
value={key}
34+
onClick={onClick.bind(null, key)}
35+
disabled={readonly || disabled}
36+
>
37+
{label}
38+
</Button>
39+
);
40+
});
41+
42+
const renderNot = () => {
43+
if (readonly && !not) return null;
44+
return (
45+
<Button
46+
key={id}
47+
id={id + "__not"}
48+
size="sm"
49+
color={not ? "danger" : "secondary"}
50+
onClick={onNotClick.bind(null, !not)}
51+
disabled={readonly}
52+
>
53+
{notLabel || "NOT"}
54+
</Button>
55+
);
56+
};
57+
58+
const onClick = (value) => setConjunction(value);
59+
const onNotClick = (checked) => setNot(checked);
60+
61+
return (
62+
<ButtonGroup size="sm" disabled={readonly}>
63+
{showNot && renderNot()}
64+
{showConj && renderOptions()}
65+
</ButtonGroup>
66+
);
67+
};

0 commit comments

Comments
 (0)