├── .babelrc
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── app.js
├── css
├── application.css.scss
├── bootstrap.min.css
├── font-awesome.min.css
├── form-builder-form.css.scss
├── form-builder.css.scss
├── react-date-picker.css.scss
├── react-draft.css.scss
├── react-native-slider.css.scss
├── react-select.css.scss
├── react-star-rating.css.scss
└── variables.css.scss
├── demobar.js
├── fonts
├── FontAwesome.otf
├── fontawesome-webfont.eot
├── fontawesome-webfont.svg
├── fontawesome-webfont.ttf
├── fontawesome-webfont.woff
└── fontawesome-webfont.woff2
├── index.html
├── lib
└── app.js
├── package.json
├── screenshot.png
├── screenshot2.png
├── screenshot3.png
├── src
├── UUID.js
├── actions
│ └── ElementActions.js
├── dynamic-option-list.jsx
├── form-element.jsx
├── form-elements-edit.jsx
├── form-elements.jsx
├── form-validator.jsx
├── form.jsx
├── header-bar.jsx
├── index.jsx
├── preview.jsx
├── star-rating.jsx
├── stores
│ └── ElementStore.js
├── toolbar-item.jsx
└── toolbar.jsx
├── style.css
├── test
├── dom-mock.js
├── dynamic-option-list-test.js
├── form-elements-edit.js
├── form-test.js
├── slider-test.js
├── star-rating-test.js
└── toolbar-test.js
├── variables.js
├── webpack.config.js
└── webpack.production.config.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "es2015",
4 | "react"
5 | ]
6 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | components
3 | example/bundle.js
4 | example/.git
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: false
2 | language: node_js
3 | node_js:
4 | - "4.2.3"
5 | env:
6 | - CXX=g++-4.8
7 | addons:
8 | apt:
9 | sources:
10 | - ubuntu-toolchain-r-test
11 | packages:
12 | - g++-4.8
13 | - libcairo2-dev
14 | - libjpeg8-dev
15 | - libpango1.0-dev
16 | - libgif-dev
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://www.npmjs.com/package/react-forms-builder)
2 | [](https://travis-ci.org/blackjk3/react-form-builder)
3 | # React Form Builder
4 | A complete react form builder that interfaces with a json endpoint to load and save generated forms. The toolbox contains 16 items for gathering data. Everything from star ratings to signature boxes!
5 |
6 | 
7 |
8 | ### Editing Items
9 | 
10 |
11 | # Basic Usage
12 |
13 | ```javascript
14 | var React = require('react');
15 | var FormBuilder = require('react-forms-builder');
16 |
17 | React.render(
18 | ,
19 | document.body
20 | )
21 | ```
22 |
23 | # Props
24 |
25 | ```javascript
26 | var items = [{
27 | key: 'Header',
28 | name: 'Header Text',
29 | icon: 'fa fa-header',
30 | static: true,
31 | content: 'Placeholder Text...'
32 | },
33 | {
34 | key: 'Paragraph',
35 | name: 'Paragraph',
36 | static: true,
37 | icon: 'fa fa-paragraph',
38 | content: 'Placeholder Text...'
39 | }];
40 |
41 |
45 | ```
46 |
47 | # React Form Generator
48 | Now that a form is built and saved, let's generate it from the saved json.
49 |
50 | ```javascript
51 | var React = require('react');
52 | var FormBuilder = require('react-forms-builder');
53 |
54 | React.render(
55 | ,
63 | document.body
64 | )
65 | ```
66 |
67 | ### Form Params
68 |
69 | Name | Type | Required? | Description
70 | --- | --- | --- | ---
71 | form_action | string | Required | URL path to submit the form
72 | form_method | string | Required | Verb used in the form submission.
73 | action_name | string | Optional | Defines form submit button text. Defaults to "Submit"
74 | data | array | Required | Question data retrieved from the database
75 | back_action | string | Optional | URL path to go back if needed.
76 | back_name | string | Optional | Button text for back action. Defaults to "Cancel".
77 | task_id | integer | Optional | User to submit a hidden variable with id to the form on the backend database.
78 | answer_data | array | Optional | Answer data, only used if loading a pre-existing form with values.
79 | authenticity_token | string | Optional | If using Rails and need an auth token to submit form.
80 | hide_actions | boolean | Optional | If you would like to hide the submit / cancel buttons set to true.
81 | display_short | boolean | Optional | Display an optional "shorter page/form" which is common for legal documents or situations where the user will just have to sign or fill out a shorter form with only the critical elements.
82 | read_only | boolean | Optional | Shows a read only version which has fields disabled and removes "required" labels.
83 | variables | object | Optional | Key/value object that can be used for Signature variable replacement.
84 |
85 | ### Read only Signatures
86 |
87 | Read only signatures allow you to use a saved/canned signature to be placed into the form. The signature will be passed in through the `variables` property to `ReactFormGenerator` and `ReactFormBuilder`.
88 |
89 | To use a read only signature, choose the "Read only" option and enter the key value of the variable that will be used to pass in the signature.
90 |
91 | 
92 |
93 | The signature data should be in base 64 format.
94 |
95 | There is a `variables.js` file that contains a sample base 64 signature. This variable is passed into the demo builder and generator for testing. Use the variable key "JOHN" to test the variable replacement.
96 |
97 | # Vendor Dependencies
98 | In order to make the form builder look pretty, there are a few dependencies other than React. See the example code in index.html for more details.
99 |
100 | - Bootstrap
101 | - FontAwesome
102 | - jQuery
103 |
104 |
105 | # SASS
106 | All relevant styles are located in css/application.css.scss.
107 |
108 | # DEMO
109 | ```bash
110 | $ npm install
111 | $ npm start
112 | ```
113 | Then navigate to http://localhost:8080/ in your browser and you should be able to see the form builder in action.
114 |
115 | # Tests
116 | ```bash
117 | $ npm test
118 | ```
119 | In order to run tests you will need to install Cairo which is needed for node-canvas. Go to https://www.npmjs.com/package/canvas for more details.
120 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import DemoBar from './demobar';
4 | import FormBuilder from "./src/index";
5 | import * as variables from './variables'
6 |
7 | // Add our stylesheets for the demo.
8 | require('./css/application.css.scss');
9 |
10 | ReactDOM.render(
11 | ,
12 | document.getElementById('form-builder')
13 | )
14 |
15 | ReactDOM.render(
16 | ,
17 | document.getElementById('demo-bar')
18 | )
19 |
--------------------------------------------------------------------------------
/css/application.css.scss:
--------------------------------------------------------------------------------
1 | // Variables
2 | @import "variables";
3 |
4 | // Component syles
5 | @import "react-star-rating";
6 | @import "react-select";
7 | @import "react-native-slider";
8 | @import "react-date-picker";
9 |
10 | @import "react-draft";
11 |
12 | // Form builder styles
13 | @import "form-builder";
14 | @import "form-builder-form";
--------------------------------------------------------------------------------
/css/font-awesome.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
5 |
--------------------------------------------------------------------------------
/css/form-builder-form.css.scss:
--------------------------------------------------------------------------------
1 | input[type="date"]:before {
2 | content: attr(placeholder);
3 | color: #aaa;
4 | margin-right: 0.5em;
5 | }
6 |
7 | input[type="date"] {
8 | width: 200px;
9 | }
10 | .validation-error {
11 | position: fixed;
12 | width: 100%;
13 | top: 0;
14 | left: 0;
15 | margin: 0;
16 | z-index: 99999999;
17 | ul {
18 | width: auto;
19 | }
20 | .dismiss-modal-button {
21 | margin-top: 10px;
22 | }
23 | }
24 | .react-form-builder-form {
25 | position: relative;
26 |
27 | .rfb-item.alwaysbreak { page-break-before: always; }
28 | .rfb-item.nobreak:before { clear:both; }
29 | .rfb-item.nobreak { page-break-inside: avoid; }
30 |
31 | .rfb-item {
32 | padding: 10px 0;
33 | position: relative;
34 |
35 | label {
36 | font-weight: normal;
37 | }
38 |
39 | .bold {
40 | font-weight: bold;
41 | }
42 | .italic {
43 | font-style: italic;
44 | }
45 | .form-label {
46 | display: block !important;
47 | }
48 |
49 | .form-group {
50 | .option-inline {
51 | display: inline-block !important;
52 | margin-right: 10px;
53 | }
54 |
55 | a {
56 | cursor: pointer;
57 | }
58 | input[type='date'] {
59 | height: 42px;
60 | }
61 | .m-signature-pad {
62 | position: relative;
63 | width: auto;
64 | }
65 | .react-star-rating {
66 | display: block;
67 | }
68 | .checkbox-label, .radio-label {
69 | font-weight: normal;
70 | display: block;
71 | }
72 | .label-required {
73 | margin-left: 5px;
74 | }
75 | }
76 | }
77 | }
--------------------------------------------------------------------------------
/css/form-builder.css.scss:
--------------------------------------------------------------------------------
1 | .react-form-builder {
2 | .react-form-builder-preview {
3 | position: relative;
4 | width: 70%;
5 | border: 1px solid #ddd;
6 | background: #fafafa;
7 | padding: 10px;
8 | box-shadow: 0 0 2px 1px rgba(0,0,0,0.1);
9 | min-height: 750px;
10 |
11 | .preview-page-break {
12 | padding: 5px 0;
13 | border-top: 2px dotted #ccc;
14 | border-bottom: 2px dotted #ccc;
15 | background: #eee;
16 | text-align: center;
17 | width: 100%;
18 | font-weight: bold;
19 | margin: 5px 0;
20 | background: repeating-linear-gradient(
21 | 45deg,
22 | #fff,
23 | #fff 10px,
24 | #eee 10px,
25 | #eee 20px
26 | );
27 | }
28 |
29 | label {
30 | font-weight: normal;
31 | }
32 |
33 | .bold {
34 | font-weight: bold;
35 | }
36 | .italic {
37 | font-style: italic;
38 | }
39 |
40 | .no-image {
41 | background: #eee;
42 | width: 100px;
43 | height: 100px;
44 | border: 1px solid #ddd;
45 | text-align: center;
46 | padding-top: 35px;
47 | }
48 |
49 | .option-inline {
50 | display: inline-block !important;
51 | margin-right: 10px !important;
52 | }
53 | .form-label {
54 | display: block !important;
55 | }
56 |
57 | .edit-form {
58 | position: fixed;
59 | background: #fafafa;
60 | padding: 30px;
61 | border-left: 0;
62 | box-shadow: none;
63 | top: 0;
64 | left: -1000px;
65 | height: 100%;
66 | // width: 0;
67 | width: 715px;
68 | transition: .5s;
69 | overflow-y: auto;
70 |
71 | h4, .dismiss-edit {
72 | margin-bottom: 30px;
73 | }
74 | .dismiss-edit {
75 | cursor: pointer;
76 | margin-top: 10px;
77 | font-size: 125%;
78 | }
79 | textarea {
80 | width: 100%;
81 | }
82 | .form-group {
83 | .form-group-range {
84 | label {
85 | display: block;
86 | }
87 | input {
88 | display: inline-block;
89 | width: 21%;
90 | margin-left: 0;
91 | &:last-of-type {
92 | width: 78%;
93 | margin-left: 1%;
94 | }
95 | &:first-of-type {
96 | width: 21%;
97 | margin-left: 0;
98 | }
99 | }
100 | }
101 | }
102 | .dynamic-option-list {
103 | margin-bottom: 15px;
104 | ul {
105 | list-style-type: none;
106 | margin: 0;
107 | padding: 0;
108 | li {
109 | margin-top: 10px;
110 | input {
111 | &.form-control {
112 | width: 84.26%;
113 | float: left;
114 | &[type="checkbox"] {
115 | border: none;
116 | box-shadow: none;
117 | margin-top: 0;
118 | }
119 | }
120 | margin-right: 10px;
121 | }
122 | button {
123 | float: left;
124 | margin-right: 5px;
125 | }
126 | .dynamic-options-actions-buttons {
127 | margin-left: 20px;
128 | }
129 | }
130 | }
131 | }
132 | }
133 | .Sortable {
134 | transition: opacity .25s ease-in;
135 | position: relative;
136 | cursor: move;
137 | -webkit-touch-callout: none;
138 | -webkit-user-select: none;
139 | -khtml-user-select: none;
140 | -moz-user-select: none;
141 | -ms-user-select: none;
142 | user-select: none;
143 | .rfb-item {
144 | padding: 10px 20px;
145 | &.SortableItem {
146 | position: relative;
147 | .form-group {
148 | pointer-events: none;
149 | label, select, input, a {
150 | cursor: move;
151 | }
152 | input[type='date'] {
153 | height: 42px;
154 | }
155 | .react-star-rating {
156 | display: block;
157 | }
158 | .checkbox-label, .radio-label {
159 | font-weight: normal;
160 | display: block;
161 | }
162 | .label-required {
163 | margin-left: 5px;
164 | }
165 | }
166 | &.is-dragging {
167 | position: absolute;
168 | z-index: 1688;
169 | border: 2px #ccc dashed;
170 | background: #fff;
171 | cursor: move;
172 | padding: 10px 20px;
173 | }
174 | }
175 | &.is-placeholder {
176 | display: block;
177 | z-index: auto;
178 | opacity: .4;
179 | border: 2px #ccc dashed;
180 | }
181 | .toolbar-header {
182 | opacity: 0;
183 | z-index: 100;
184 | position: relative;
185 | .label {
186 | position: absolute;
187 | left: 20px;
188 | }
189 | .toolbar-header-buttons {
190 | position: absolute;
191 | right: 20px;
192 | }
193 | }
194 | &:hover {
195 | box-shadow: inset 0 0 5px #ddd;
196 | background: #fff;
197 | select, input {
198 | cursor: move;
199 | pointer-events: none;
200 | }
201 | .toolbar-header {
202 | opacity: 1;
203 | }
204 | }
205 | }
206 | }
207 | &.is-editing {
208 | // .Sortable {
209 | // opacity: .5;
210 | // transition: opacity .25s ease-in;
211 | // }
212 | .edit-form {
213 | z-index: 2000;
214 | border-right: 1px solid #ddd;
215 | box-shadow: 0 0 2px 1px rgba(0,0,0,0.1);
216 | // width: 80%;
217 | left: 0;
218 | transition: .5s;
219 | }
220 | }
221 | }
222 |
223 | .react-form-builder-toolbar {
224 | width: 250px;
225 | background: #fff;
226 | margin-top: -30px;
227 |
228 | h4 {
229 | margin-top: 0;
230 | text-align: center;
231 | }
232 | .form-group {
233 | padding: 10px;
234 | border: 1px dashed #ddd;
235 | }
236 | ul {
237 | padding: 0;
238 | li {
239 | cursor: pointer;
240 | list-style: none;
241 | margin: 5px;
242 | padding: 10px;
243 | border: 1px dashed #ddd;
244 | i {
245 | margin: 0 15px 0 10px;
246 | }
247 | }
248 | }
249 | }
250 | }
251 |
252 | .image-upload-container {
253 | position: relative;
254 | .image-upload {
255 | position: relative;
256 | opacity: 0;
257 | z-index: 2;
258 | height: 50px;
259 | }
260 |
261 | .image-upload-control {
262 | position: absolute;
263 | top: 0px;
264 | left: 0px;
265 | z-index: 1;
266 | }
267 | }
268 |
269 | .image-upload-preview {
270 | border: 4px solid #fff;
271 | box-shadow: 0 0 2px 2px rgba(0,0,0,0.1);
272 | }
273 |
274 | .btn-image-clear {
275 | margin: 15px 0;
276 | padding: 15px;
277 | }
278 |
279 | @media ( max-width: $screen-sm-min ) {
280 | .react-form-builder {
281 | position: relative;
282 |
283 | .react-form-builder-preview {
284 | width: 100%;
285 |
286 | .edit-form {
287 | width: 100%;
288 | overflow: scroll;
289 |
290 | .btn {
291 | margin-top: 10px;
292 | }
293 |
294 | .dynamic-option-list ul li input.form-control {
295 | width: 100%;
296 | }
297 | }
298 |
299 | .Sortable .rfb-item .toolbar-header .toolbar-header-buttons {
300 | right: -15px;
301 | .btn {
302 | margin-right: 5px;
303 | border-radius: 50%;
304 | padding: 7px 0px 0 3px;
305 | width: 35px;
306 | height: 35px;
307 | }
308 | }
309 | }
310 |
311 | .react-form-builder-toolbar {
312 |
313 | h4 {
314 | padding: 10px;
315 | background: #7a0019;
316 | color: #fff;
317 | }
318 |
319 | width: 100%;
320 | position: fixed;
321 | z-index: 900;
322 | bottom: -320px;
323 |
324 | -webkit-transition: transform 0.5s;
325 | transition: transform 0.5s;
326 |
327 | -webkit-transform: translate(0,0);
328 | transform: translate(0,0);
329 |
330 | right: 0;
331 | border-top: 2px solid #ccc;
332 |
333 | ul {
334 | height: 300px;
335 | overflow-x: scroll;
336 | }
337 | }
338 |
339 | .active-toolbar {
340 | -webkit-transform: translate(0,-300px);
341 | transform: translate(0,-300px);
342 | }
343 | }
344 |
345 | .m-signature-pad {
346 | top: 0;
347 | left: 0;
348 | right: 0;
349 | bottom: 0;
350 | width: auto;
351 | height: auto;
352 | min-width: 250px;
353 | min-height: 140px;
354 | margin: 0;
355 | }
356 | }
357 |
358 | .visible_marks {
359 | display: block;
360 | width: 100%;
361 | padding: 0 4px;
362 | label {
363 | text-align: center;
364 | display: inline-block;
365 | padding: 0;
366 | margin: 0;
367 | font-weight: normal;
368 | &:first-of-type {
369 | text-align: left;
370 | }
371 | &:last-of-type {
372 | text-align: right;
373 | }
374 | }
375 | }
376 |
377 | .m-signature-pad {
378 | font-size: 10px;
379 | width: auto;
380 |
381 | .m-signature-pad--body {
382 | width: auto;
383 | height: 200px;
384 | border: 1px solid #e8e8e8;
385 | background-color: #fff;
386 | height: 200px;
387 | border-radius: 4px;
388 |
389 | canvas {
390 | position: absolute;
391 | left: 0;
392 | top: 0;
393 | width: 100%;
394 | height: 100%;
395 | border-radius: 4px;
396 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.02) inset;
397 | }
398 | }
399 |
400 | .m-signature-pad--footer {
401 | position: relative;
402 | margin-top: 10px;
403 | }
404 | }
405 |
--------------------------------------------------------------------------------
/css/react-date-picker.css.scss:
--------------------------------------------------------------------------------
1 | .react-datepicker__tether-element-attached-top .react-datepicker__triangle, .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle, .react-datepicker__year-read-view--down-arrow {
2 | margin-left: -8px;
3 | position: absolute; }
4 | .react-datepicker__tether-element-attached-top .react-datepicker__triangle, .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle, .react-datepicker__year-read-view--down-arrow, .react-datepicker__tether-element-attached-top .react-datepicker__triangle::before, .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle::before, .react-datepicker__year-read-view--down-arrow::before {
5 | box-sizing: content-box;
6 | position: absolute;
7 | border: 8px solid transparent;
8 | height: 0;
9 | width: 1px; }
10 | .react-datepicker__tether-element-attached-top .react-datepicker__triangle::before, .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle::before, .react-datepicker__year-read-view--down-arrow::before {
11 | content: "";
12 | z-index: -1;
13 | border-width: 8px;
14 | left: -8px;
15 | border-bottom-color: #aeaeae; }
16 |
17 | .react-datepicker__tether-element-attached-top .react-datepicker__triangle {
18 | top: 0;
19 | margin-top: -8px; }
20 | .react-datepicker__tether-element-attached-top .react-datepicker__triangle, .react-datepicker__tether-element-attached-top .react-datepicker__triangle::before {
21 | border-top: none;
22 | border-bottom-color: #f0f0f0; }
23 | .react-datepicker__tether-element-attached-top .react-datepicker__triangle::before {
24 | top: -1px;
25 | border-bottom-color: #aeaeae; }
26 |
27 | .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle, .react-datepicker__year-read-view--down-arrow {
28 | bottom: 0;
29 | margin-bottom: -8px; }
30 | .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle, .react-datepicker__year-read-view--down-arrow, .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle::before, .react-datepicker__year-read-view--down-arrow::before {
31 | border-bottom: none;
32 | border-top-color: #fff; }
33 | .react-datepicker__tether-element-attached-bottom .react-datepicker__triangle::before, .react-datepicker__year-read-view--down-arrow::before {
34 | bottom: -1px;
35 | border-top-color: #aeaeae; }
36 |
37 | .react-datepicker {
38 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
39 | font-size: 11px;
40 | background-color: #fff;
41 | color: #000;
42 | border: 1px solid #aeaeae;
43 | border-radius: 4px;
44 | display: inline-block;
45 | position: relative; }
46 |
47 | .react-datepicker__triangle {
48 | position: absolute;
49 | left: 50px; }
50 |
51 | .react-datepicker__tether-element-attached-bottom.react-datepicker__tether-element {
52 | margin-top: -20px; }
53 |
54 | .react-datepicker__header {
55 | text-align: center;
56 | background-color: #f0f0f0;
57 | border-bottom: 1px solid #aeaeae;
58 | border-top-left-radius: 4px;
59 | border-top-right-radius: 4px;
60 | padding-top: 8px;
61 | position: relative; }
62 |
63 | .react-datepicker__current-month {
64 | margin-top: 0;
65 | color: #000;
66 | font-weight: bold;
67 | font-size: 13px; }
68 | .react-datepicker__current-month--hasYearDropdown {
69 | margin-bottom: 16px; }
70 |
71 | .react-datepicker__navigation {
72 | line-height: 24px;
73 | text-align: center;
74 | cursor: pointer;
75 | position: absolute;
76 | top: 10px;
77 | width: 0;
78 | border: 6px solid transparent; }
79 | .react-datepicker__navigation--previous {
80 | left: 10px;
81 | border-right-color: #ccc; }
82 | .react-datepicker__navigation--previous:hover {
83 | border-right-color: #b3b3b3; }
84 | .react-datepicker__navigation--next {
85 | right: 10px;
86 | border-left-color: #ccc; }
87 | .react-datepicker__navigation--next:hover {
88 | border-left-color: #b3b3b3; }
89 | .react-datepicker__navigation--years {
90 | position: relative;
91 | top: 0;
92 | display: block;
93 | margin-left: auto;
94 | margin-right: auto; }
95 | .react-datepicker__navigation--years-previous {
96 | top: 4px;
97 | border-top-color: #ccc; }
98 | .react-datepicker__navigation--years-previous:hover {
99 | border-top-color: #b3b3b3; }
100 | .react-datepicker__navigation--years-upcoming {
101 | top: -4px;
102 | border-bottom-color: #ccc; }
103 | .react-datepicker__navigation--years-upcoming:hover {
104 | border-bottom-color: #b3b3b3; }
105 |
106 | .react-datepicker__month {
107 | margin: 5px;
108 | text-align: center; }
109 |
110 | .react-datepicker__day-name,
111 | .react-datepicker__day {
112 | color: #000;
113 | display: inline-block;
114 | width: 24px;
115 | line-height: 24px;
116 | text-align: center;
117 | margin: 2px; }
118 |
119 | .react-datepicker__day {
120 | cursor: pointer; }
121 | .react-datepicker__day:hover {
122 | border-radius: 4px;
123 | background-color: #f0f0f0; }
124 | .react-datepicker__day--today {
125 | font-weight: bold; }
126 | .react-datepicker__day--selected, .react-datepicker__day--in-range {
127 | border-radius: 4px;
128 | background-color: #216ba5;
129 | color: #fff; }
130 | .react-datepicker__day--selected:hover, .react-datepicker__day--in-range:hover {
131 | background-color: #1d5d90; }
132 | .react-datepicker__day--disabled {
133 | cursor: default;
134 | color: #ccc; }
135 | .react-datepicker__day--disabled:hover {
136 | background-color: transparent; }
137 |
138 | .react-datepicker__input-container {
139 | position: relative;
140 | display: inline-block; }
141 |
142 | .react-datepicker__year-read-view {
143 | width: 50%;
144 | left: 25%;
145 | position: absolute;
146 | bottom: 25px;
147 | border: 1px solid transparent;
148 | border-radius: 4px; }
149 | .react-datepicker__year-read-view:hover {
150 | cursor: pointer; }
151 | .react-datepicker__year-read-view:hover .react-datepicker__year-read-view--down-arrow {
152 | border-top-color: #b3b3b3; }
153 | .react-datepicker__year-read-view--down-arrow {
154 | border-top-color: #ccc;
155 | margin-bottom: 3px;
156 | left: 5px;
157 | top: 9px;
158 | position: relative;
159 | border-width: 6px; }
160 | .react-datepicker__year-read-view--selected-year {
161 | right: 6px;
162 | position: relative; }
163 |
164 | .react-datepicker__year-dropdown {
165 | background-color: #f0f0f0;
166 | position: absolute;
167 | width: 50%;
168 | left: 25%;
169 | top: 30px;
170 | text-align: center;
171 | border-radius: 4px;
172 | border: 1px solid #aeaeae; }
173 | .react-datepicker__year-dropdown:hover {
174 | cursor: pointer; }
175 |
176 | .react-datepicker__year-option {
177 | line-height: 20px;
178 | width: 100%;
179 | display: block;
180 | margin-left: auto;
181 | margin-right: auto; }
182 | .react-datepicker__year-option:first-of-type {
183 | border-top-left-radius: 4px;
184 | border-top-right-radius: 4px; }
185 | .react-datepicker__year-option:last-of-type {
186 | -webkit-user-select: none;
187 | -moz-user-select: none;
188 | -ms-user-select: none;
189 | user-select: none;
190 | border-bottom-left-radius: 4px;
191 | border-bottom-right-radius: 4px; }
192 | .react-datepicker__year-option:hover {
193 | background-color: #ccc; }
194 | .react-datepicker__year-option:hover .react-datepicker__navigation--years-upcoming {
195 | border-bottom-color: #b3b3b3; }
196 | .react-datepicker__year-option:hover .react-datepicker__navigation--years-previous {
197 | border-top-color: #b3b3b3; }
198 | .react-datepicker__year-option--selected {
199 | position: absolute;
200 | left: 30px; }
201 |
202 | .react-datepicker__close-icon {
203 | background-color: transparent;
204 | border: 0;
205 | cursor: pointer;
206 | display: inline-block;
207 | height: 0;
208 | outline: 0;
209 | padding: 0;
210 | vertical-align: middle; }
211 | .react-datepicker__close-icon::after {
212 | background-color: #216ba5;
213 | border-radius: 50%;
214 | bottom: 0;
215 | box-sizing: border-box;
216 | color: #fff;
217 | content: "\D7";
218 | cursor: pointer;
219 | font-size: 12px;
220 | height: 16px;
221 | width: 16px;
222 | line-height: 1;
223 | margin: -8px auto 0;
224 | padding: 2px;
225 | position: absolute;
226 | right: 7px;
227 | text-align: center;
228 | top: 50%; }
229 |
230 | .react-datepicker__today-button {
231 | background: #f0f0f0;
232 | border-top: 1px solid #aeaeae;
233 | cursor: pointer;
234 | text-align: center;
235 | font-weight: bold;
236 | padding: 5px 0; }
237 |
238 | .react-datepicker__tether-element {
239 | z-index: 2147483647; }
--------------------------------------------------------------------------------
/css/react-draft.css.scss:
--------------------------------------------------------------------------------
1 | .rdw-option-wrapper {
2 | border: 1px solid #F1F1F1;
3 | padding: 5px;
4 | min-width: 25px;
5 | height: 20px;
6 | border-radius: 2px;
7 | margin: 0 4px;
8 | display: -webkit-box;
9 | display: -ms-flexbox;
10 | display: flex;
11 | -webkit-box-pack: center;
12 | -ms-flex-pack: center;
13 | justify-content: center;
14 | -webkit-box-align: center;
15 | -ms-flex-align: center;
16 | align-items: center;
17 | cursor: pointer;
18 | background: white;
19 | text-transform: capitalize;
20 | }
21 | .rdw-option-wrapper:hover {
22 | box-shadow: 1px 1px 0px #BFBDBD;
23 | }
24 | .rdw-option-wrapper:active {
25 | box-shadow: 1px 1px 0px #BFBDBD inset;
26 | }
27 | .rdw-option-active {
28 | box-shadow: 1px 1px 0px #BFBDBD inset;
29 | }
30 | .rdw-option-wrapper img {
31 | width: 13px;
32 | }
33 | .rdw-option-disabled {
34 | opacity: 0.3;
35 | cursor: default;
36 | }
37 | .rdw-dropdown-wrapper {
38 | height: 30px;
39 | background: white;
40 | cursor: pointer;
41 | border: 1px solid #F1F1F1;
42 | border-radius: 2px;
43 | margin: 0 3px;
44 | text-transform: capitalize;
45 | background: white;
46 | }
47 | .rdw-dropdown-wrapper:focus {
48 | outline: none;
49 | }
50 | .rdw-dropdown-wrapper:hover {
51 | box-shadow: 1px 1px 0px #BFBDBD;
52 | background-color: #FFFFFF;
53 | }
54 | .rdw-dropdown-wrapper:active {
55 | box-shadow: 1px 1px 0px #BFBDBD inset;
56 | }
57 | .rdw-dropdown-carettoopen {
58 | height: 0px;
59 | width: 0px;
60 | position: absolute;
61 | top: 35%;
62 | right: 10%;
63 | border-top: 6px solid black;
64 | border-left: 5px solid transparent;
65 | border-right: 5px solid transparent;
66 | }
67 | .rdw-dropdown-carettoclose {
68 | height: 0px;
69 | width: 0px;
70 | position: absolute;
71 | top: 35%;
72 | right: 10%;
73 | border-bottom: 6px solid black;
74 | border-left: 5px solid transparent;
75 | border-right: 5px solid transparent;
76 | }
77 | .rdw-dropdown-selectedtext {
78 | display: -webkit-box;
79 | display: -ms-flexbox;
80 | display: flex;
81 | position: relative;
82 | height: 100%;
83 | -webkit-box-align: center;
84 | -ms-flex-align: center;
85 | align-items: center;
86 | padding: 0 5px;
87 | }
88 | .rdw-dropdown-optionwrapper {
89 | z-index: 100;
90 | position: relative;
91 | border: 1px solid #F1F1F1;
92 | width: 98%;
93 | background: white;
94 | border-radius: 2px;
95 | margin: 0;
96 | padding: 0;
97 | }
98 | .rdw-dropdown-optionwrapper:hover {
99 | box-shadow: 1px 1px 0px #BFBDBD;
100 | background-color: #FFFFFF;
101 | }
102 | .rdw-dropdownoption-default {
103 | min-height: 25px;
104 | display: -webkit-box;
105 | display: -ms-flexbox;
106 | display: flex;
107 | -webkit-box-align: center;
108 | -ms-flex-align: center;
109 | align-items: center;
110 | padding: 0 5px;
111 | }
112 | .rdw-dropdownoption-highlighted {
113 | background: #F1F1F1;
114 | }
115 | .rdw-dropdownoption-active {
116 | background: #f5f5f5;
117 | }
118 | .rdw-dropdownoption-disabled {
119 | opacity: 0.3;
120 | cursor: default;
121 | }
122 | .rdw-inline-wrapper {
123 | display: -webkit-box;
124 | display: -ms-flexbox;
125 | display: flex;
126 | margin-bottom: 6px;
127 | }
128 | .rdw-inline-dropdown {
129 | width: 50px;
130 | }
131 | .rdw-inline-dropdownoption {
132 | height: 40px;
133 | display: -webkit-box;
134 | display: -ms-flexbox;
135 | display: flex;
136 | -webkit-box-pack: center;
137 | -ms-flex-pack: center;
138 | justify-content: center;
139 | }
140 | .rdw-block-wrapper {
141 | display: -webkit-box;
142 | display: -ms-flexbox;
143 | display: flex;
144 | -webkit-box-align: center;
145 | -ms-flex-align: center;
146 | align-items: center;
147 | margin-bottom: 6px;
148 | }
149 | .rdw-block-dropdown {
150 | width: 110px;
151 | }
152 | .rdw-fontsize-wrapper {
153 | display: -webkit-box;
154 | display: -ms-flexbox;
155 | display: flex;
156 | -webkit-box-align: center;
157 | -ms-flex-align: center;
158 | align-items: center;
159 | margin-bottom: 6px;
160 | }
161 | .rdw-fontsize-dropdown {
162 | min-width: 40px;
163 | }
164 | .rdw-fontsize-option {
165 | display: -webkit-box;
166 | display: -ms-flexbox;
167 | display: flex;
168 | -webkit-box-pack: center;
169 | -ms-flex-pack: center;
170 | justify-content: center;
171 | }
172 | .rdw-fontfamily-wrapper {
173 | display: -webkit-box;
174 | display: -ms-flexbox;
175 | display: flex;
176 | -webkit-box-align: center;
177 | -ms-flex-align: center;
178 | align-items: center;
179 | margin-bottom: 6px;
180 | }
181 | .rdw-fontfamily-dropdown {
182 | width: 115px;
183 | }
184 | .rdw-fontfamily-placeholder {
185 | white-space: nowrap;
186 | max-width: 90px;
187 | overflow: hidden;
188 | text-overflow: ellipsis;
189 | }
190 | .rdw-fontfamily-optionwrapper {
191 | width: 140px;
192 | }
193 | .rdw-list-wrapper {
194 | display: -webkit-box;
195 | display: -ms-flexbox;
196 | display: flex;
197 | -webkit-box-align: center;
198 | -ms-flex-align: center;
199 | align-items: center;
200 | margin-bottom: 6px;
201 | }
202 | .rdw-list-dropdown {
203 | width: 50px;
204 | z-index: 90;
205 | }
206 | .rdw-list-dropdownOption {
207 | height: 40px;
208 | display: -webkit-box;
209 | display: -ms-flexbox;
210 | display: flex;
211 | -webkit-box-pack: center;
212 | -ms-flex-pack: center;
213 | justify-content: center;
214 | }
215 | .rdw-text-align-wrapper {
216 | display: -webkit-box;
217 | display: -ms-flexbox;
218 | display: flex;
219 | -webkit-box-align: center;
220 | -ms-flex-align: center;
221 | align-items: center;
222 | margin-bottom: 6px;
223 | }
224 | .rdw-text-align-dropdown {
225 | width: 50px;
226 | z-index: 90;
227 | }
228 | .rdw-text-align-dropdownOption {
229 | height: 40px;
230 | display: -webkit-box;
231 | display: -ms-flexbox;
232 | display: flex;
233 | -webkit-box-pack: center;
234 | -ms-flex-pack: center;
235 | justify-content: center;
236 | }
237 | .rdw-right-aligned-block {
238 | display: -webkit-box;
239 | display: -ms-flexbox;
240 | display: flex;
241 | -webkit-box-orient: horizontal;
242 | -webkit-box-direction: normal;
243 | -ms-flex-direction: row;
244 | flex-direction: row;
245 | -webkit-box-pack: end;
246 | -ms-flex-pack: end;
247 | justify-content: flex-end;
248 | }
249 | .rdw-left-aligned-block {
250 | display: -webkit-box;
251 | display: -ms-flexbox;
252 | display: flex;
253 | -webkit-box-orient: horizontal;
254 | -webkit-box-direction: normal;
255 | -ms-flex-direction: row;
256 | flex-direction: row;
257 | -webkit-box-pack: start;
258 | -ms-flex-pack: start;
259 | justify-content: flex-start;
260 | }
261 | .rdw-center-aligned-block {
262 | display: -webkit-box;
263 | display: -ms-flexbox;
264 | display: flex;
265 | -webkit-box-orient: horizontal;
266 | -webkit-box-direction: normal;
267 | -ms-flex-direction: row;
268 | flex-direction: row;
269 | -webkit-box-pack: center;
270 | -ms-flex-pack: center;
271 | justify-content: center;
272 | }
273 | .rdw-justify-aligned-block {
274 | display: -webkit-box;
275 | display: -ms-flexbox;
276 | display: flex;
277 | -webkit-box-orient: horizontal;
278 | -webkit-box-direction: normal;
279 | -ms-flex-direction: row;
280 | flex-direction: row;
281 | }
282 | .rdw-colorpicker-wrapper {
283 | display: -webkit-box;
284 | display: -ms-flexbox;
285 | display: flex;
286 | -webkit-box-align: center;
287 | -ms-flex-align: center;
288 | align-items: center;
289 | margin-bottom: 6px;
290 | position: relative;
291 | }
292 | .rdw-colorpicker-modal {
293 | position: absolute;
294 | top: 35px;
295 | right: 5px;
296 | display: -webkit-box;
297 | display: -ms-flexbox;
298 | display: flex;
299 | -webkit-box-orient: vertical;
300 | -webkit-box-direction: normal;
301 | -ms-flex-direction: column;
302 | flex-direction: column;
303 | width: 200px;
304 | height: 200px;
305 | border: 1px solid #F1F1F1;
306 | padding: 15px;
307 | border-radius: 2px;
308 | z-index: 100;
309 | background: white;
310 | box-shadow: 3px 3px 5px #BFBDBD;
311 | }
312 | .rdw-colorpicker-modal-header {
313 | display: -webkit-box;
314 | display: -ms-flexbox;
315 | display: flex;
316 | padding-bottom: 5px;
317 | }
318 | .rdw-colorpicker-modal-style-label {
319 | font-size: 15px;
320 | width: 50%;
321 | text-align: center;
322 | cursor: pointer;
323 | padding: 0 10px 5px;
324 | }
325 | .rdw-colorpicker-modal-style-label-active {
326 | border-bottom: 2px solid #0a66b7;
327 | }
328 | .rdw-colorpicker-modal-options {
329 | margin: 5px auto;
330 | display: -webkit-box;
331 | display: -ms-flexbox;
332 | display: flex;
333 | width: 170px;
334 | -ms-flex-wrap: wrap;
335 | flex-wrap: wrap;
336 | }
337 | .rdw-colorpicker-cube {
338 | width: 22px;
339 | height: 22px;
340 | border: 1px solid #F1F1F1;
341 | }
342 | .rdw-colorpicker-option {
343 | margin: 3px;
344 | padding: 0;
345 | min-height: 20px;
346 | border: none;
347 | width: 22px;
348 | height: 22px;
349 | min-width: 22px;
350 | box-shadow: 1px 2px 1px #BFBDBD inset;
351 | }
352 | .rdw-colorpicker-option:hover {
353 | box-shadow: 1px 2px 1px #BFBDBD;
354 | }
355 | .rdw-colorpicker-option:active {
356 | box-shadow: -1px -2px 1px #BFBDBD;
357 | }
358 | .rdw-colorpicker-option-active {
359 | box-shadow: 0px 0px 2px 2px #BFBDBD;
360 | }
361 | .rdw-link-wrapper {
362 | display: -webkit-box;
363 | display: -ms-flexbox;
364 | display: flex;
365 | -webkit-box-align: center;
366 | -ms-flex-align: center;
367 | align-items: center;
368 | margin-bottom: 6px;
369 | position: relative;
370 | }
371 | .rdw-link-dropdown {
372 | width: 50px;
373 | }
374 | .rdw-link-dropdownOption {
375 | height: 40px;
376 | display: -webkit-box;
377 | display: -ms-flexbox;
378 | display: flex;
379 | -webkit-box-pack: center;
380 | -ms-flex-pack: center;
381 | justify-content: center;
382 | }
383 | .rdw-link-dropdownPlaceholder {
384 | margin-left: 8px;
385 | }
386 | .rdw-link-modal {
387 | position: absolute;
388 | top: 35px;
389 | left: 5px;
390 | display: -webkit-box;
391 | display: -ms-flexbox;
392 | display: flex;
393 | -webkit-box-orient: vertical;
394 | -webkit-box-direction: normal;
395 | -ms-flex-direction: column;
396 | flex-direction: column;
397 | width: 235px;
398 | height: 180px;
399 | border: 1px solid #F1F1F1;
400 | padding: 15px;
401 | border-radius: 2px;
402 | z-index: 100;
403 | background: white;
404 | box-shadow: 3px 3px 5px #BFBDBD;
405 | }
406 | .rdw-link-modal-label {
407 | font-size: 15px;
408 | }
409 | .rdw-link-modal-input {
410 | margin-top: 5px;
411 | border-radius: 2px;
412 | border: 1px solid #F1F1F1;
413 | height: 25px;
414 | margin-bottom: 15px;
415 | padding: 0 5px;
416 | }
417 | .rdw-link-modal-input:focus {
418 | outline: none;
419 | }
420 | .rdw-link-modal-buttonsection {
421 | margin: 0 auto;
422 | }
423 | .rdw-link-modal-btn {
424 | margin-left: 10px;
425 | width: 75px;
426 | height: 30px;
427 | border: 1px solid #F1F1F1;
428 | border-radius: 2px;
429 | cursor: pointer;
430 | background: white;
431 | text-transform: capitalize;
432 | }
433 | .rdw-link-modal-btn:hover {
434 | box-shadow: 1px 1px 0px #BFBDBD;
435 | }
436 | .rdw-link-modal-btn:active {
437 | box-shadow: 1px 1px 0px #BFBDBD inset;
438 | }
439 | .rdw-link-modal-btn:focus {
440 | outline: none !important;
441 | }
442 | .rdw-link-modal-btn:disabled {
443 | background: #ece9e9;
444 | }
445 | .rdw-link-dropdownoption {
446 | height: 40px;
447 | display: -webkit-box;
448 | display: -ms-flexbox;
449 | display: flex;
450 | -webkit-box-pack: center;
451 | -ms-flex-pack: center;
452 | justify-content: center;
453 | }
454 | .rdw-history-dropdown {
455 | width: 50px;
456 | }
457 | .rdw-embedded-wrapper {
458 | display: -webkit-box;
459 | display: -ms-flexbox;
460 | display: flex;
461 | -webkit-box-align: center;
462 | -ms-flex-align: center;
463 | align-items: center;
464 | margin-bottom: 6px;
465 | position: relative;
466 | }
467 | .rdw-embedded-modal {
468 | position: absolute;
469 | top: 35px;
470 | left: 5px;
471 | display: -webkit-box;
472 | display: -ms-flexbox;
473 | display: flex;
474 | -webkit-box-orient: vertical;
475 | -webkit-box-direction: normal;
476 | -ms-flex-direction: column;
477 | flex-direction: column;
478 | width: 235px;
479 | height: 180px;
480 | border: 1px solid #F1F1F1;
481 | padding: 15px;
482 | border-radius: 2px;
483 | z-index: 100;
484 | background: white;
485 | -webkit-box-pack: justify;
486 | -ms-flex-pack: justify;
487 | justify-content: space-between;
488 | box-shadow: 3px 3px 5px #BFBDBD;
489 | }
490 | .rdw-embedded-modal-header {
491 | font-size: 15px;
492 | display: -webkit-box;
493 | display: -ms-flexbox;
494 | display: flex;
495 | }
496 | .rdw-embedded-modal-header-option {
497 | width: 50%;
498 | cursor: pointer;
499 | display: -webkit-box;
500 | display: -ms-flexbox;
501 | display: flex;
502 | -webkit-box-pack: center;
503 | -ms-flex-pack: center;
504 | justify-content: center;
505 | -webkit-box-align: center;
506 | -ms-flex-align: center;
507 | align-items: center;
508 | -webkit-box-orient: vertical;
509 | -webkit-box-direction: normal;
510 | -ms-flex-direction: column;
511 | flex-direction: column;
512 | }
513 | .rdw-embedded-modal-header-label {
514 | width: 95px;
515 | border: 1px solid #f1f1f1;
516 | margin-top: 5px;
517 | background: #6EB8D4;
518 | border-bottom: 2px solid #0a66b7;
519 | }
520 | .rdw-embedded-modal-link-section {
521 | display: -webkit-box;
522 | display: -ms-flexbox;
523 | display: flex;
524 | -webkit-box-orient: vertical;
525 | -webkit-box-direction: normal;
526 | -ms-flex-direction: column;
527 | flex-direction: column;
528 | }
529 | .rdw-embedded-modal-link-input {
530 | width: 95%;
531 | height: 35px;
532 | margin: 10px 0;
533 | border: 1px solid #F1F1F1;
534 | border-radius: 2px;
535 | font-size: 15px;
536 | padding: 0 5px;
537 | }
538 | .rdw-embedded-modal-link-input:focus {
539 | outline: none;
540 | }
541 | .rdw-embedded-modal-btn-section {
542 | display: -webkit-box;
543 | display: -ms-flexbox;
544 | display: flex;
545 | -webkit-box-pack: center;
546 | -ms-flex-pack: center;
547 | justify-content: center;
548 | }
549 | .rdw-embedded-modal-btn {
550 | margin: 0 3px;
551 | width: 75px;
552 | height: 30px;
553 | border: 1px solid #F1F1F1;
554 | border-radius: 2px;
555 | cursor: pointer;
556 | background: white;
557 | text-transform: capitalize;
558 | }
559 | .rdw-embedded-modal-btn:hover {
560 | box-shadow: 1px 1px 0px #BFBDBD;
561 | }
562 | .rdw-embedded-modal-btn:active {
563 | box-shadow: 1px 1px 0px #BFBDBD inset;
564 | }
565 | .rdw-embedded-modal-btn:focus {
566 | outline: none !important;
567 | }
568 | .rdw-embedded-modal-btn:disabled {
569 | background: #ece9e9;
570 | }
571 | .rdw-embedded-modal-size {
572 | display: -webkit-box;
573 | display: -ms-flexbox;
574 | display: flex;
575 | margin: 5px 0 10px;
576 | -webkit-box-pack: justify;
577 | -ms-flex-pack: justify;
578 | justify-content: space-between;
579 | }
580 | .rdw-embedded-modal-size-input {
581 | width: 45%;
582 | height: 20px;
583 | border: 1px solid #F1F1F1;
584 | border-radius: 2px;
585 | font-size: 12px;
586 | }
587 | .rdw-embedded-modal-size-input:focus {
588 | outline: none;
589 | }
590 | .rdw-emoji-wrapper {
591 | display: -webkit-box;
592 | display: -ms-flexbox;
593 | display: flex;
594 | -webkit-box-align: center;
595 | -ms-flex-align: center;
596 | align-items: center;
597 | margin-bottom: 6px;
598 | position: relative;
599 | }
600 | .rdw-emoji-modal {
601 | overflow: auto;
602 | position: absolute;
603 | top: 35px;
604 | left: 5px;
605 | display: -webkit-box;
606 | display: -ms-flexbox;
607 | display: flex;
608 | -ms-flex-wrap: wrap;
609 | flex-wrap: wrap;
610 | width: 235px;
611 | height: 180px;
612 | border: 1px solid #F1F1F1;
613 | padding: 15px;
614 | border-radius: 2px;
615 | z-index: 100;
616 | background: white;
617 | box-shadow: 3px 3px 5px #BFBDBD;
618 | }
619 | .rdw-emoji-icon {
620 | margin: 2.5px;
621 | height: 24px;
622 | width: 24px;
623 | cursor: pointer;
624 | font-size: 22px;
625 | display: -webkit-box;
626 | display: -ms-flexbox;
627 | display: flex;
628 | -webkit-box-pack: center;
629 | -ms-flex-pack: center;
630 | justify-content: center;
631 | -webkit-box-align: center;
632 | -ms-flex-align: center;
633 | align-items: center;
634 | }
635 | .rdw-spinner {
636 | display: -webkit-box;
637 | display: -ms-flexbox;
638 | display: flex;
639 | -webkit-box-align: center;
640 | -ms-flex-align: center;
641 | align-items: center;
642 | -webkit-box-pack: center;
643 | -ms-flex-pack: center;
644 | justify-content: center;
645 | height: 100%;
646 | width: 100%;
647 | }
648 | .rdw-spinner > div {
649 | width: 12px;
650 | height: 12px;
651 | background-color: #333;
652 |
653 | border-radius: 100%;
654 | display: inline-block;
655 | -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
656 | animation: sk-bouncedelay 1.4s infinite ease-in-out both;
657 | }
658 | .rdw-spinner .rdw-bounce1 {
659 | -webkit-animation-delay: -0.32s;
660 | animation-delay: -0.32s;
661 | }
662 | .rdw-spinner .rdw-bounce2 {
663 | -webkit-animation-delay: -0.16s;
664 | animation-delay: -0.16s;
665 | }
666 | @-webkit-keyframes sk-bouncedelay {
667 | 0%, 80%, 100% { -webkit-transform: scale(0) }
668 | 40% { -webkit-transform: scale(1.0) }
669 | }
670 | @keyframes sk-bouncedelay {
671 | 0%, 80%, 100% {
672 | -webkit-transform: scale(0);
673 | transform: scale(0);
674 | } 40% {
675 | -webkit-transform: scale(1.0);
676 | transform: scale(1.0);
677 | }
678 | }
679 | .rdw-image-wrapper {
680 | display: -webkit-box;
681 | display: -ms-flexbox;
682 | display: flex;
683 | -webkit-box-align: center;
684 | -ms-flex-align: center;
685 | align-items: center;
686 | margin-bottom: 6px;
687 | position: relative;
688 | }
689 | .rdw-image-modal {
690 | position: absolute;
691 | top: 35px;
692 | left: 5px;
693 | display: -webkit-box;
694 | display: -ms-flexbox;
695 | display: flex;
696 | -webkit-box-orient: vertical;
697 | -webkit-box-direction: normal;
698 | -ms-flex-direction: column;
699 | flex-direction: column;
700 | width: 235px;
701 | height: 200px;
702 | border: 1px solid #F1F1F1;
703 | padding: 15px;
704 | border-radius: 2px;
705 | z-index: 100;
706 | background: white;
707 | box-shadow: 3px 3px 5px #BFBDBD;
708 | }
709 | .rdw-image-modal-header {
710 | font-size: 15px;
711 | margin: 10px 0;
712 | display: -webkit-box;
713 | display: -ms-flexbox;
714 | display: flex;
715 | }
716 | .rdw-image-modal-header-option {
717 | width: 50%;
718 | cursor: pointer;
719 | display: -webkit-box;
720 | display: -ms-flexbox;
721 | display: flex;
722 | -webkit-box-pack: center;
723 | -ms-flex-pack: center;
724 | justify-content: center;
725 | -webkit-box-align: center;
726 | -ms-flex-align: center;
727 | align-items: center;
728 | -webkit-box-orient: vertical;
729 | -webkit-box-direction: normal;
730 | -ms-flex-direction: column;
731 | flex-direction: column;
732 | }
733 | .rdw-image-modal-header-label {
734 | width: 80px;
735 | background: #f1f1f1;
736 | border: 1px solid #f1f1f1;
737 | margin-top: 5px;
738 | }
739 | .rdw-image-modal-header-label-highlighted {
740 | background: #6EB8D4;
741 | border-bottom: 2px solid #0a66b7;
742 | }
743 | .rdw-image-modal-upload-option {
744 | height: 65px;
745 | width: 100%;
746 | color: gray;
747 | cursor: pointer;
748 | display: -webkit-box;
749 | display: -ms-flexbox;
750 | display: flex;
751 | border: none;
752 | font-size: 15px;
753 | -webkit-box-align: center;
754 | -ms-flex-align: center;
755 | align-items: center;
756 | -webkit-box-pack: center;
757 | -ms-flex-pack: center;
758 | justify-content: center;
759 | background-color: #f1f1f1;
760 | outline: 2px dashed gray;
761 | outline-offset: -10px;
762 | margin: 10px 0;
763 | }
764 | .rdw-image-modal-upload-option-highlighted {
765 | outline: 2px dashed #0a66b7;
766 | }
767 | .rdw-image-modal-upload-option-label {
768 | cursor: pointer;
769 | height: 100%;
770 | width: 100%;
771 | display: -webkit-box;
772 | display: -ms-flexbox;
773 | display: flex;
774 | -webkit-box-pack: center;
775 | -ms-flex-pack: center;
776 | justify-content: center;
777 | -webkit-box-align: center;
778 | -ms-flex-align: center;
779 | align-items: center;
780 | }
781 | .rdw-image-modal-upload-option-input {
782 | width: 0.1px;
783 | height: 0.1px;
784 | opacity: 0;
785 | overflow: hidden;
786 | position: absolute;
787 | z-index: -1;
788 | }
789 | .rdw-image-modal-url-section {
790 | display: -webkit-box;
791 | display: -ms-flexbox;
792 | display: flex;
793 | }
794 | .rdw-image-modal-url-input {
795 | width: 95%;
796 | height: 35px;
797 | margin: 25px 0 5px;
798 | border: 1px solid #F1F1F1;
799 | border-radius: 2px;
800 | font-size: 15px;
801 | padding: 0 5px;
802 | }
803 | .rdw-image-modal-btn-section {
804 | margin: 10px auto 0;
805 | }
806 | .rdw-image-modal-url-input:focus {
807 | outline: none;
808 | }
809 | .rdw-image-modal-btn {
810 | margin: 0 5px;
811 | width: 75px;
812 | height: 30px;
813 | border: 1px solid #F1F1F1;
814 | border-radius: 2px;
815 | cursor: pointer;
816 | background: white;
817 | text-transform: capitalize;
818 | }
819 | .rdw-image-modal-btn:hover {
820 | box-shadow: 1px 1px 0px #BFBDBD;
821 | }
822 | .rdw-image-modal-btn:active {
823 | box-shadow: 1px 1px 0px #BFBDBD inset;
824 | }
825 | .rdw-image-modal-btn:focus {
826 | outline: none !important;
827 | }
828 | .rdw-image-modal-btn:disabled {
829 | background: #ece9e9;
830 | }
831 | .rdw-image-modal-spinner {
832 | position: absolute;
833 | top: -3px;
834 | left: 0;
835 | width: 100%;
836 | height: 100%;
837 | opacity: 0.5;
838 | }
839 | .rdw-remove-wrapper {
840 | display: -webkit-box;
841 | display: -ms-flexbox;
842 | display: flex;
843 | -webkit-box-align: center;
844 | -ms-flex-align: center;
845 | align-items: center;
846 | margin-bottom: 6px;
847 | position: relative;
848 | }
849 | .rdw-history-wrapper {
850 | display: -webkit-box;
851 | display: -ms-flexbox;
852 | display: flex;
853 | -webkit-box-align: center;
854 | -ms-flex-align: center;
855 | align-items: center;
856 | margin-bottom: 6px;
857 | }
858 | .rdw-history-dropdownoption {
859 | height: 40px;
860 | display: -webkit-box;
861 | display: -ms-flexbox;
862 | display: flex;
863 | -webkit-box-pack: center;
864 | -ms-flex-pack: center;
865 | justify-content: center;
866 | }
867 | .rdw-history-dropdown {
868 | width: 50px;
869 | }
870 | .rdw-link-decorator-wrapper {
871 | position: relative;
872 | }
873 | .rdw-link-decorator-icon {
874 | position: absolute;
875 | left: 40%;
876 | top: 0;
877 | cursor: pointer;
878 | background-color: white;
879 | }
880 | .rdw-mention {
881 | color: #1236ff;
882 | background-color: #f0fbff;
883 | padding: 1px 2px;
884 | border-radius: 2px;
885 | }
886 | .rdw-mention-link {
887 | text-decoration: none;
888 | }
889 | .rdw-suggestion-wrapper {
890 | position: relative;
891 | }
892 | .rdw-suggestion-dropdown {
893 | position: absolute;
894 | display: -webkit-box;
895 | display: -ms-flexbox;
896 | display: flex;
897 | -webkit-box-orient: vertical;
898 | -webkit-box-direction: normal;
899 | -ms-flex-direction: column;
900 | flex-direction: column;
901 | border: 1px solid #F1F1F1;
902 | min-width: 100px;
903 | max-height: 150px;
904 | overflow: auto;
905 | background: white;
906 | z-index: 100;
907 | }
908 | .rdw-suggestion-option {
909 | padding: 7px 5px;
910 | border-bottom: 1px solid #f1f1f1;
911 | }
912 | .rdw-suggestion-option-active {
913 | background-color: #F1F1F1;
914 | }
915 | .rdw-image-alignment-options-popup {
916 | position: absolute;;
917 | background: white;
918 | display: -webkit-box;
919 | display: -ms-flexbox;
920 | display: flex;
921 | padding: 5px 2px;
922 | border-radius: 2px;
923 | border: 1px solid #F1F1F1;
924 | width: 105px;
925 | cursor: pointer;
926 | z-index: 100;
927 | }
928 | .rdw-alignment-option-left {
929 | -webkit-box-pack: start;
930 | -ms-flex-pack: start;
931 | justify-content: flex-start;
932 | }
933 | .rdw-image-alignment-option {
934 | height: 15px;
935 | width: 15px;
936 | min-width: 15px;
937 | }
938 | .rdw-image-alignment {
939 | position: relative;
940 | }
941 | .rdw-image-imagewrapper {
942 | position: relative;
943 | }
944 | .rdw-image-center {
945 | float: none;
946 | display: -webkit-box;
947 | display: -ms-flexbox;
948 | display: flex;
949 | -webkit-box-pack: center;
950 | -ms-flex-pack: center;
951 | justify-content: center;
952 | }
953 | .rdw-image-left {
954 | float: left;
955 | }
956 | .rdw-image-right {
957 | float: right;
958 | }
959 | .rdw-editor-main {
960 | height: 150px;
961 | width: 100%;
962 | overflow: auto;
963 | box-sizing: content-box;
964 | background: #fff;
965 | }
966 | .rdw-editor-toolbar {
967 | padding: 6px 5px 0;
968 | border-radius: 2px;
969 | border: 1px solid #F1F1F1;
970 | display: -webkit-box;
971 | display: -ms-flexbox;
972 | display: flex;
973 | -webkit-box-pack: start;
974 | -ms-flex-pack: start;
975 | justify-content: flex-start;
976 | width: 100%;
977 | background: white;
978 | -ms-flex-wrap: wrap;
979 | flex-wrap: wrap;
980 | font-size: 15px;
981 | -webkit-user-select: none;
982 | -moz-user-select: none;
983 | -ms-user-select: none;
984 | user-select: none;
985 | }
986 | .public-DraftStyleDefault-block {
987 | margin: 1em 0;
988 | }
989 | .rdw-editor-wrapper:focus {
990 | outline: none;
991 | }
992 |
993 | .DraftEditor-root {
994 | padding: 0 10px;
995 | }
996 | /**
997 | * Draft v0.9.1
998 | *
999 | * Copyright (c) 2013-present, Facebook, Inc.
1000 | * All rights reserved.
1001 | *
1002 | * This source code is licensed under the BSD-style license found in the
1003 | * LICENSE file in the root directory of this source tree. An additional grant
1004 | * of patent rights can be found in the PATENTS file in the same directory.
1005 | */
1006 | .DraftEditor-editorContainer, .DraftEditor-root, .public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:rgba(255,255,255,0);border-left:.1px solid transparent;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;z-index:0}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol, .public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}
--------------------------------------------------------------------------------
/css/react-native-slider.css.scss:
--------------------------------------------------------------------------------
1 | /*! =========================================================
2 | * bootstrap-slider.js
3 | *
4 | * Maintainers:
5 | * Kyle Kemp
6 | * - Twitter: @seiyria
7 | * - Github: seiyria
8 | * Rohit Kalkur
9 | * - Twitter: @Rovolutionary
10 | * - Github: rovolution
11 | *
12 | * =========================================================
13 | *
14 | * Licensed under the Apache License, Version 2.0 (the "License");
15 | * you may not use this file except in compliance with the License.
16 | * You may obtain a copy of the License at
17 | *
18 | * http://www.apache.org/licenses/LICENSE-2.0
19 | *
20 | * Unless required by applicable law or agreed to in writing, software
21 | * distributed under the License is distributed on an "AS IS" BASIS,
22 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 | * See the License for the specific language governing permissions and
24 | * limitations under the License.
25 | * ========================================================= */
26 | .slider {
27 | display: inline-block;
28 | vertical-align: middle;
29 | position: relative;
30 | }
31 | .slider.slider-horizontal {
32 | width: 100%;
33 | height: 20px;
34 | }
35 | .slider.slider-horizontal .slider-track {
36 | height: 4px;
37 | width: 100%;
38 | margin-top: -1px;
39 | top: 50%;
40 | left: 0;
41 | }
42 | .slider.slider-horizontal .slider-selection,
43 | .slider.slider-horizontal .slider-track-left,
44 | .slider.slider-horizontal .slider-track-right {
45 | height: 100%;
46 | top: 0;
47 | bottom: 0;
48 | }
49 | .slider.slider-horizontal .slider-tick,
50 | .slider.slider-horizontal .slider-handle {
51 | margin-left: -10px;
52 | margin-top: -8px;
53 | }
54 | .slider.slider-horizontal .slider-tick.triangle,
55 | .slider.slider-horizontal .slider-handle.triangle {
56 | border-width: 0 10px 10px 10px;
57 | width: 0;
58 | height: 0;
59 | border-bottom-color: #0480be;
60 | margin-top: 0;
61 | }
62 | .slider.slider-horizontal .slider-tick-label-container {
63 | white-space: nowrap;
64 | }
65 | .slider.slider-horizontal .slider-tick-label-container .slider-tick-label {
66 | margin-top: 24px;
67 | display: inline-block;
68 | text-align: center;
69 | }
70 | .slider.slider-vertical {
71 | height: 210px;
72 | width: 20px;
73 | }
74 | .slider.slider-vertical .slider-track {
75 | width: 10px;
76 | height: 100%;
77 | margin-left: -5px;
78 | left: 50%;
79 | top: 0;
80 | }
81 | .slider.slider-vertical .slider-selection {
82 | width: 100%;
83 | left: 0;
84 | top: 0;
85 | bottom: 0;
86 | }
87 | .slider.slider-vertical .slider-track-left,
88 | .slider.slider-vertical .slider-track-right {
89 | width: 100%;
90 | left: 0;
91 | right: 0;
92 | }
93 | .slider.slider-vertical .slider-tick,
94 | .slider.slider-vertical .slider-handle {
95 | margin-left: -5px;
96 | margin-top: -10px;
97 | }
98 | .slider.slider-vertical .slider-tick.triangle,
99 | .slider.slider-vertical .slider-handle.triangle {
100 | border-width: 10px 0 10px 10px;
101 | width: 1px;
102 | height: 1px;
103 | border-left-color: #0480be;
104 | margin-left: 0;
105 | }
106 | .slider.slider-disabled .slider-handle {
107 | background-color: #b2ebf2;
108 | }
109 | .slider.slider-disabled .slider-track {
110 | background-image: -webkit-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%);
111 | background-image: -o-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%);
112 | background-image: linear-gradient(to bottom, #e5e5e5 0%, #e9e9e9 100%);
113 | background-repeat: repeat-x;
114 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe5e5e5', endColorstr='#ffe9e9e9', GradientType=0);
115 | cursor: not-allowed;
116 | }
117 | .slider input {
118 | display: none;
119 | }
120 | .slider .tooltip.top {
121 | margin-top: -36px;
122 | }
123 | .slider .tooltip-inner {
124 | white-space: nowrap;
125 | }
126 | .slider .hide {
127 | display: none;
128 | }
129 | .slider-track {
130 | position: absolute;
131 | cursor: pointer;
132 | background-color: #ccc;
133 | border-radius: 4px;
134 | }
135 | .slider-selection {
136 | position: absolute;
137 | background-color: #ccc;
138 | -webkit-box-sizing: border-box;
139 | -moz-box-sizing: border-box;
140 | box-sizing: border-box;
141 | border-radius: 4px;
142 | }
143 | .slider-selection.tick-slider-selection {
144 | background-image: -webkit-linear-gradient(top, #89cdef 0%, #81bfde 100%);
145 | background-image: -o-linear-gradient(top, #89cdef 0%, #81bfde 100%);
146 | background-image: linear-gradient(to bottom, #89cdef 0%, #81bfde 100%);
147 | background-repeat: repeat-x;
148 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff89cdef', endColorstr='#ff81bfde', GradientType=0);
149 | }
150 | .slider-track-left,
151 | .slider-track-right {
152 | position: absolute;
153 | background: transparent;
154 | -webkit-box-sizing: border-box;
155 | -moz-box-sizing: border-box;
156 | box-sizing: border-box;
157 | border-radius: 4px;
158 | }
159 | .slider-handle {
160 | position: absolute;
161 | width: 20px;
162 | height: 20px;
163 | background-color: #7a0019;
164 | }
165 | .slider-handle.round {
166 | border-radius: 50%;
167 | }
168 | .slider-handle.triangle {
169 | background: transparent none;
170 | }
171 | .slider-handle.custom {
172 | background: transparent none;
173 | }
174 | .slider-handle.custom::before {
175 | line-height: 20px;
176 | font-size: 20px;
177 | content: '\2605';
178 | color: #726204;
179 | }
180 | .slider-tick {
181 | position: absolute;
182 | width: 20px;
183 | height: 20px;
184 | background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%);
185 | background-image: -o-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%);
186 | background-image: linear-gradient(to bottom, #f9f9f9 0%, #f5f5f5 100%);
187 | background-repeat: repeat-x;
188 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0);
189 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
190 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
191 | -webkit-box-sizing: border-box;
192 | -moz-box-sizing: border-box;
193 | box-sizing: border-box;
194 | filter: none;
195 | opacity: 0.8;
196 | border: 0px solid transparent;
197 | }
198 | .slider-tick.round {
199 | border-radius: 50%;
200 | }
201 | .slider-tick.triangle {
202 | background: transparent none;
203 | }
204 | .slider-tick.custom {
205 | background: transparent none;
206 | }
207 | .slider-tick.custom::before {
208 | line-height: 20px;
209 | font-size: 20px;
210 | content: '\2605';
211 | color: #726204;
212 | }
213 | .slider-tick.in-selection {
214 | background-image: -webkit-linear-gradient(top, #89cdef 0%, #81bfde 100%);
215 | background-image: -o-linear-gradient(top, #89cdef 0%, #81bfde 100%);
216 | background-image: linear-gradient(to bottom, #89cdef 0%, #81bfde 100%);
217 | background-repeat: repeat-x;
218 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff89cdef', endColorstr='#ff81bfde', GradientType=0);
219 | opacity: 1;
220 | }
--------------------------------------------------------------------------------
/css/react-select.css.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * React Select
3 | * ============
4 | * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/
5 | * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs
6 | * MIT License: https://github.com/keystonejs/react-select
7 | */
8 | .Select {
9 | position: relative;
10 | }
11 | .Select-control {
12 | position: relative;
13 | overflow: hidden;
14 | background-color: #ffffff;
15 | border: 1px solid #cccccc;
16 | border-color: #d9d9d9 #cccccc #b3b3b3;
17 | border-radius: 4px;
18 | box-sizing: border-box;
19 | color: #333333;
20 | cursor: default;
21 | outline: none;
22 | padding: 8px 52px 8px 10px;
23 | transition: all 200ms ease;
24 | }
25 | .Select-control:hover {
26 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);
27 | }
28 | .is-searchable.is-open > .Select-control {
29 | cursor: text;
30 | }
31 | .is-open > .Select-control {
32 | border-bottom-right-radius: 0;
33 | border-bottom-left-radius: 0;
34 | background: #ffffff;
35 | border-color: #b3b3b3 #cccccc #d9d9d9;
36 | }
37 | .is-open > .Select-control > .Select-arrow {
38 | border-color: transparent transparent #999999;
39 | border-width: 0 5px 5px;
40 | }
41 | .is-searchable.is-focused:not(.is-open) > .Select-control {
42 | cursor: text;
43 | }
44 | .is-focused:not(.is-open) > .Select-control {
45 | border-color: #0088cc #0099e6 #0099e6;
46 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 0 5px -1px rgba(0, 136, 204, 0.5);
47 | }
48 | .Select-placeholder {
49 | color: #aaaaaa;
50 | padding: 8px 52px 8px 10px;
51 | position: absolute;
52 | top: 0;
53 | left: 0;
54 | right: -15px;
55 | max-width: 100%;
56 | overflow: hidden;
57 | text-overflow: ellipsis;
58 | white-space: nowrap;
59 | }
60 | .has-value > .Select-control > .Select-placeholder {
61 | color: #333333;
62 | }
63 | .Select-input > input {
64 | cursor: default;
65 | background: none transparent;
66 | box-shadow: none;
67 | height: auto;
68 | border: 0 none;
69 | font-family: inherit;
70 | font-size: inherit;
71 | margin: 0;
72 | padding: 0;
73 | outline: none;
74 | display: inline-block;
75 | -webkit-appearance: none;
76 | }
77 | .is-focused .Select-input > input {
78 | cursor: text;
79 | }
80 | .Select-control:not(.is-searchable) > .Select-input {
81 | outline: none;
82 | }
83 | .Select-loading {
84 | -webkit-animation: Select-animation-spin 400ms infinite linear;
85 | -o-animation: Select-animation-spin 400ms infinite linear;
86 | animation: Select-animation-spin 400ms infinite linear;
87 | width: 16px;
88 | height: 16px;
89 | box-sizing: border-box;
90 | border-radius: 50%;
91 | border: 2px solid #cccccc;
92 | border-right-color: #333333;
93 | display: inline-block;
94 | position: relative;
95 | margin-top: -8px;
96 | position: absolute;
97 | right: 30px;
98 | top: 50%;
99 | }
100 | .has-value > .Select-control > .Select-loading {
101 | right: 46px;
102 | }
103 | .Select-clear {
104 | color: #999999;
105 | cursor: pointer;
106 | display: inline-block;
107 | font-size: 16px;
108 | padding: 6px 10px;
109 | position: absolute;
110 | right: 17px;
111 | top: 0;
112 | }
113 | .Select-clear:hover {
114 | color: #c0392b;
115 | }
116 | .Select-clear > span {
117 | font-size: 1.1em;
118 | }
119 | .Select-arrow-zone {
120 | content: " ";
121 | display: block;
122 | position: absolute;
123 | right: 0;
124 | top: 0;
125 | bottom: 0;
126 | width: 30px;
127 | cursor: pointer;
128 | }
129 | .Select-arrow {
130 | border-color: #999999 transparent transparent;
131 | border-style: solid;
132 | border-width: 5px 5px 0;
133 | content: " ";
134 | display: block;
135 | height: 0;
136 | margin-top: -ceil(2.5px);
137 | position: absolute;
138 | right: 10px;
139 | top: 14px;
140 | width: 0;
141 | cursor: pointer;
142 | }
143 | .Select-menu-outer {
144 | border-bottom-right-radius: 4px;
145 | border-bottom-left-radius: 4px;
146 | background-color: #ffffff;
147 | border: 1px solid #cccccc;
148 | border-top-color: #e6e6e6;
149 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);
150 | box-sizing: border-box;
151 | margin-top: -1px;
152 | max-height: 200px;
153 | position: absolute;
154 | top: 100%;
155 | width: 100%;
156 | z-index: 1000;
157 | -webkit-overflow-scrolling: touch;
158 | }
159 | .Select-menu {
160 | max-height: 198px;
161 | overflow-y: auto;
162 | }
163 | .Select-option {
164 | box-sizing: border-box;
165 | color: #666666;
166 | cursor: pointer;
167 | display: block;
168 | padding: 8px 10px;
169 | }
170 | .Select-option:last-child {
171 | border-bottom-right-radius: 4px;
172 | border-bottom-left-radius: 4px;
173 | }
174 | .Select-option.is-focused {
175 | background-color: #f2f9fc;
176 | color: #333333;
177 | }
178 | .Select-option.is-disabled {
179 | color: #cccccc;
180 | cursor: not-allowed;
181 | }
182 | .Select-noresults {
183 | box-sizing: border-box;
184 | color: #999999;
185 | cursor: default;
186 | display: block;
187 | padding: 8px 10px;
188 | }
189 | .Select.is-multi .Select-control {
190 | padding: 2px 52px 2px 3px;
191 | }
192 | .Select.is-multi .Select-input {
193 | vertical-align: middle;
194 | border: 1px solid transparent;
195 | margin: 2px;
196 | padding: 3px 0;
197 | }
198 | .Select-item {
199 | background-color: #f2f9fc;
200 | border-radius: 2px;
201 | border: 1px solid #c9e6f2;
202 | color: #0088cc;
203 | display: inline-block;
204 | font-size: 1em;
205 | margin: 2px;
206 | }
207 | .Select-item-icon,
208 | .Select-item-label {
209 | display: inline-block;
210 | vertical-align: middle;
211 | }
212 | .Select-item-label {
213 | cursor: default;
214 | border-bottom-right-radius: 2px;
215 | border-top-right-radius: 2px;
216 | padding: 3px 5px;
217 | }
218 | .Select-item-label .Select-item-label__a {
219 | color: #0088cc;
220 | cursor: pointer;
221 | }
222 | .Select-item-icon {
223 | cursor: pointer;
224 | border-bottom-left-radius: 2px;
225 | border-top-left-radius: 2px;
226 | border-right: 1px solid #c9e6f2;
227 | padding: 2px 5px 4px;
228 | }
229 | .Select-item-icon:hover,
230 | .Select-item-icon:focus {
231 | background-color: #ddeff7;
232 | color: #0077b3;
233 | }
234 | .Select-item-icon:active {
235 | background-color: #c9e6f2;
236 | }
237 | .Select.is-multi.is-disabled .Select-item {
238 | background-color: #f2f2f2;
239 | border: 1px solid #d9d9d9;
240 | color: #888888;
241 | }
242 | .Select.is-multi.is-disabled .Select-item-icon {
243 | cursor: not-allowed;
244 | border-right: 1px solid #d9d9d9;
245 | }
246 | .Select.is-multi.is-disabled .Select-item-icon:hover,
247 | .Select.is-multi.is-disabled .Select-item-icon:focus,
248 | .Select.is-multi.is-disabled .Select-item-icon:active {
249 | background-color: #f2f2f2;
250 | }
251 | @keyframes Select-animation-spin {
252 | to {
253 | transform: rotate(1turn);
254 | }
255 | }
256 | @-webkit-keyframes Select-animation-spin {
257 | to {
258 | -webkit-transform: rotate(1turn);
259 | }
260 | }
--------------------------------------------------------------------------------
/css/react-star-rating.css.scss:
--------------------------------------------------------------------------------
1 | .rating-container, .react-star-rating__root{
2 | vertical-align:middle;display:inline-block
3 | }
4 | .rating-container .rating-stars:before,.rating-container:before{content:attr(data-content)}.react-star-rating__star{width:25px}.react-star-rating__star #star-flat{fill:#C6C6C6}.react-star-rating__star #star-flat:hover{fill:#FFA91B}.react-star-rating__root{font-size:2em}.react-star-rating__root.rating-editing:hover{cursor:pointer}.rating-container{position:relative;color:#e3e3e3;overflow:hidden}.rating-container .rating-stars{position:absolute;left:0;top:0;white-space:nowrap;overflow:hidden;color:#F5A71B;-webkit-transition:all .01s;-moz-transition:all .01s;transition:all .01s;-webkit-mask-image:-webkit-gradient(linear,left top,left bottom,from(#FDBD47),to(#F5A71B))}.react-rating-caption{font-size:1.25em;vertical-align:middle;margin-right:.5em}.rating-disabled .rating-container:hover{cursor:not-allowed}.react-star-rating__size--sm{font-size:1em}.react-star-rating__size--md{font-size:2em}.react-star-rating__size--lg{font-size:2.5em}
--------------------------------------------------------------------------------
/css/variables.css.scss:
--------------------------------------------------------------------------------
1 | $screen-sm-min: 768px;
2 | $screen-md-min: 992px;
3 | $screen-lg-min: 1200px;
--------------------------------------------------------------------------------
/demobar.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ElementStore from './src/stores/ElementStore';
3 | import ReactFormGenerator from './src/form';
4 |
5 | export default class Demobar extends React.Component {
6 |
7 | constructor(props) {
8 | super(props);
9 | this.state = {
10 | data: [],
11 | previewVisible: false,
12 | shortPreviewVisible: false,
13 | roPreviewVisible: false
14 | }
15 |
16 | ElementStore.listen(this._onChange.bind(this));
17 | }
18 |
19 | showPreview() {
20 | this.setState({
21 | previewVisible: true
22 | })
23 | }
24 |
25 | showShortPreview() {
26 | this.setState({
27 | shortPreviewVisible: true
28 | })
29 | }
30 |
31 | showRoPreview() {
32 | this.setState({
33 | roPreviewVisible: true
34 | })
35 | }
36 |
37 | closePreview() {
38 | this.setState({
39 | previewVisible: false,
40 | shortPreviewVisible: false,
41 | roPreviewVisible: false
42 | })
43 | }
44 |
45 | _onChange(data) {
46 | this.setState({
47 | data: data
48 | });
49 | }
50 |
51 | render() {
52 | var modalClass = 'modal';
53 | if(this.state.previewVisible) {
54 | modalClass += ' show';
55 | }
56 |
57 | var shortModalClass = 'modal short-modal';
58 | if(this.state.shortPreviewVisible) {
59 | shortModalClass += ' show';
60 | }
61 |
62 | var roModalClass = 'modal ro-modal';
63 | if(this.state.roPreviewVisible) {
64 | roModalClass += ' show';
65 | }
66 |
67 | return(
68 |
69 |
Preview
70 |
71 |
72 |
73 |
74 |
75 | { this.state.previewVisible &&
76 |
77 |
78 |
79 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | }
97 |
98 | { this.state.roPreviewVisible &&
99 |
100 |
101 |
102 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 | }
121 |
122 |
123 | { this.state.shortPreviewVisible &&
124 |
125 |
126 |
127 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 | }
145 |
146 | );
147 | }
148 |
149 | }
150 |
--------------------------------------------------------------------------------
/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | React Form Builder Example
4 |
5 |
6 |
17 |
18 |
19 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-forms-builder",
3 | "version": "0.0.3",
4 | "description": "A complete form builder for react.",
5 | "main": "lib/app.js",
6 | "scripts": {
7 | "test": "mocha --compilers js:babel-core/register --recursive",
8 | "start": "webpack-dev-server --hot --inline",
9 | "dist": "webpack -p --config webpack.production.config.js"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "git+https://github.com/blackjk3/react-form-builder.git"
14 | },
15 | "keywords": [
16 | "react",
17 | "react-component",
18 | "form",
19 | "builder",
20 | "ui",
21 | "drag",
22 | "drop"
23 | ],
24 | "author": "Jason Kadrmas",
25 | "license": "MIT",
26 | "dependencies": {
27 | "classnames": "^2.1.3",
28 | "fbemitter": "^2.0.0",
29 | "jquery": "^3.2.1",
30 | "moment": "^2.13.0",
31 | "react-anything-sortable": "^0.2.2",
32 | "react-bootstrap-native-slider": "2.0.1",
33 | "react-datepicker": "^0.27.0",
34 | "react-select": "^0.5.5",
35 | "react-signature-pad": "0.0.6",
36 | "react-sortable-items": "0.0.7",
37 | "react-star-rating": "git+https://github.com/blackjk3/react-star-rating.git",
38 | "react-textarea-autosize": "^2.3.1",
39 | "reflux": "^0.2.8",
40 | "xss": "^0.2.13"
41 | },
42 | "peerDependencies": {
43 | "react": "^0.14.0 || ^15.0.0"
44 | },
45 | "devDependencies": {
46 | "babel": "6.23.0",
47 | "babel-core": "6.24.1",
48 | "babel-loader": "6.4.1",
49 | "babel-preset-es2015": "6.24.1",
50 | "babel-preset-react": "6.24.1",
51 | "babel-register": "6.24.1",
52 | "canvas": "1.6.5",
53 | "css-loader": "^0.16.0",
54 | "draft-js": "^0.10.0",
55 | "draftjs-to-html": "^0.6.1",
56 | "immutable": "^3.8.1",
57 | "jsdom": "3.1.2",
58 | "mocha": "^3.3.0",
59 | "mocha-jsdom": "^1.1.0",
60 | "node-libs-browser": "^1.0.0",
61 | "node-sass": "^3.8.0",
62 | "react": "^0.14.7",
63 | "react-dom": "^0.14.7",
64 | "react-draft-wysiwyg": "1.7.0",
65 | "react-hot-loader": "^1.2.7",
66 | "react-tools": "0.13.3",
67 | "sass-loader": "^2.0.1",
68 | "source-map": "^0.5.6",
69 | "style-loader": "^0.12.3",
70 | "webpack": "^1.10.1",
71 | "webpack-dev-server": "^1.10.1"
72 | },
73 | "bugs": {
74 | "url": "https://github.com/blackjk3/react-form-builder/issues"
75 | },
76 | "homepage": "https://github.com/blackjk3/react-form-builder#readme"
77 | }
78 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/screenshot.png
--------------------------------------------------------------------------------
/screenshot2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/screenshot2.png
--------------------------------------------------------------------------------
/screenshot3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/blackjk3/react-form-builder/b358db44aec0356f7aededc1fb7cda17a181ce4c/screenshot3.png
--------------------------------------------------------------------------------
/src/UUID.js:
--------------------------------------------------------------------------------
1 | // Private array of chars to use
2 | var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
3 | var ID = {};
4 | ID.uuid = function (len, radix) {
5 | var chars = CHARS, uuid = [], i;
6 | radix = radix || chars.length;
7 |
8 | if (len) {
9 | // Compact form
10 | for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
11 | } else {
12 | // rfc4122, version 4 form
13 | var r;
14 |
15 | // rfc4122 requires these characters
16 | uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
17 | uuid[14] = '4';
18 |
19 | // Fill in random data. At i==19 set the high bits of clock sequence as
20 | // per rfc4122, sec. 4.1.5
21 | for (i = 0; i < 36; i++) {
22 | if (!uuid[i]) {
23 | r = 0 | Math.random()*16;
24 | uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
25 | }
26 | }
27 | }
28 |
29 | return uuid.join('');
30 | };
31 |
32 | // A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance
33 | // by minimizing calls to random()
34 | ID.uuidFast = function() {
35 | var chars = CHARS, uuid = new Array(36), rnd=0, r;
36 | for (var i = 0; i < 36; i++) {
37 | if (i==8 || i==13 || i==18 || i==23) {
38 | uuid[i] = '-';
39 | } else if (i==14) {
40 | uuid[i] = '4';
41 | } else {
42 | if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
43 | r = rnd & 0xf;
44 | rnd = rnd >> 4;
45 | uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
46 | }
47 | }
48 | return uuid.join('');
49 | };
50 |
51 | // A more compact, but less performant, RFC4122v4 solution:
52 | ID.uuidCompact = function() {
53 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
54 | var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
55 | return v.toString(16);
56 | });
57 | };
58 | module.exports = ID;
--------------------------------------------------------------------------------
/src/actions/ElementActions.js:
--------------------------------------------------------------------------------
1 | var Reflux = require('reflux');
2 |
3 | var ElementActions = Reflux.createActions([
4 | 'createElement',
5 | 'editElement',
6 | 'deleteElement',
7 | 'saveData',
8 | 'save'
9 | ]);
10 |
11 | module.exports = ElementActions;
--------------------------------------------------------------------------------
/src/dynamic-option-list.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 | import ID from './UUID';
7 |
8 | export default class DynamicOptionList extends React.Component {
9 | constructor(props) {
10 | super(props);
11 | this.state = {
12 | element: this.props.element,
13 | data: this.props.data,
14 | dirty: false
15 | }
16 | }
17 | _setValue(text) {
18 | return text.replace(/[^A-Z0-9]+/ig, "_").toLowerCase();
19 | }
20 | editOption(option_index, e) {
21 | let this_element = this.state.element;
22 | let val = (this_element.options[option_index].value !== this._setValue(this_element.options[option_index].text)) ? this_element.options[option_index].value : this._setValue(e.target.value)
23 |
24 | this_element.options[option_index].text = e.target.value;
25 | this_element.options[option_index].value = val;
26 | this.setState({
27 | element: this_element,
28 | dirty: true
29 | });
30 | }
31 | editValue(option_index, e) {
32 | let this_element = this.state.element;
33 | let val = (e.target.value === '') ? this._setValue(this_element.options[option_index].text) : e.target.value;
34 | this_element.options[option_index].value = val;
35 | this.setState({
36 | element: this_element,
37 | dirty: true
38 | });
39 | }
40 | editOptionCorrect(option_index, e) {
41 | let this_element = this.state.element;
42 | if (this_element.options[option_index].hasOwnProperty("correct")) {
43 | delete(this_element.options[option_index]["correct"]);
44 | } else {
45 | this_element.options[option_index].correct = true;
46 | }
47 | this.setState({element: this_element});
48 | this.props.updateElement.call(this.props.preview, this_element);
49 | }
50 | updateOption() {
51 | let this_element = this.state.element;
52 | // to prevent ajax calls with no change
53 | if (this.state.dirty) {
54 | this.props.updateElement.call(this.props.preview, this_element);
55 | this.setState({dirty: false});
56 | }
57 | }
58 | addOption(index) {
59 | let this_element = this.state.element;
60 | this_element.options.splice(index+1,0,{value: '', text: '', key: ID.uuid()});
61 | this.props.updateElement.call(this.props.preview, this_element);
62 | }
63 | removeOption(index) {
64 | let this_element = this.state.element;
65 | this_element.options.splice(index,1);
66 | this.props.updateElement.call(this.props.preview, this_element);
67 | }
68 | render() {
69 | return (
70 |
71 |
72 | -
73 |
74 |
Options
75 |
Value
76 |
Correct
77 |
78 |
79 | {
80 | this.props.element.options.map( (option, index) => {
81 | let this_key = 'edit_' + option.key;
82 | let val = (option.value !== this._setValue(option.text)) ? option.value : ''
83 | return (
84 | -
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 | { index > 0 &&
99 |
100 | }
101 |
102 |
103 |
104 |
105 | )
106 | })
107 | }
108 |
109 |
110 | );
111 | }
112 | }
--------------------------------------------------------------------------------
/src/form-element.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import HeaderBar from './header-bar';
3 | import TextAreaAutosize from 'react-textarea-autosize';
4 | var SortableItemMixin = require('react-sortable-items/SortableItemMixin')
5 |
6 | export default React.createClass({
7 | mixins: [SortableItemMixin],
8 | getDefaultProps () {
9 | return {
10 | className: 'rfb-item'
11 | };
12 | },
13 |
14 | getInitialState (){
15 | return {
16 | changedValue: this.props.data.value,
17 | data: this.props.data
18 | };
19 | },
20 |
21 | render() {
22 | var headerClasses = 'dynamic-input ' + this.props.data.element + '-input';
23 |
24 | return this.renderWithSortable(
25 |
26 |
27 | {this.props.children}
28 |
29 | )
30 |
31 | }
32 |
33 | })
--------------------------------------------------------------------------------
/src/form-elements-edit.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import DynamicOptionList from './dynamic-option-list';
3 | import TextAreaAutosize from 'react-textarea-autosize';
4 |
5 | import { ContentState, EditorState, convertFromHTML, convertToRaw } from 'draft-js';
6 | import draftToHtml from 'draftjs-to-html';
7 | import { Editor } from 'react-draft-wysiwyg';
8 |
9 | let toolbar = {
10 | options: ['inline', 'list', 'textAlign', 'fontSize', 'link', 'history'],
11 | inline: {
12 | inDropdown: false,
13 | className: undefined,
14 | options: ['bold', 'italic', 'underline', 'superscript', 'subscript'],
15 | },
16 | };
17 |
18 | export default class FormElementsEdit extends React.Component {
19 | constructor(props) {
20 | super(props);
21 | this.state = {
22 | element: this.props.element,
23 | data: this.props.data,
24 | dirty: false
25 | }
26 | }
27 | toggleRequired() {
28 | let this_element = this.state.element;
29 | }
30 | editElementProp(elemProperty, targProperty, e) {
31 | // elemProperty could be content or label
32 | // targProperty could be value or checked
33 | let this_element = this.state.element;
34 | this_element[elemProperty] = e.target[targProperty];
35 |
36 | this.setState({
37 | element: this_element,
38 | dirty: true
39 | }, () => {
40 | if (targProperty === 'checked') {this.updateElement();};
41 | });
42 | }
43 |
44 | onEditorStateChange(index, property, editorContent) {
45 |
46 | let html = draftToHtml(convertToRaw(editorContent.getCurrentContent())).replace(//g, '
').replace(/<\/p>/g, '
');
47 | let this_element = this.state.element;
48 | this_element[property] = html;
49 |
50 | this.setState({
51 | element: this_element,
52 | dirty: true
53 | });
54 | }
55 |
56 | updateElement() {
57 | let this_element = this.state.element;
58 | // to prevent ajax calls with no change
59 | if (this.state.dirty) {
60 | this.props.updateElement.call(this.props.preview, this_element);
61 | this.setState({dirty: false});
62 | }
63 | }
64 | render() {
65 | let this_checked = this.props.element.hasOwnProperty('required') ? this.props.element.required : false;
66 | let this_read_only = this.props.element.hasOwnProperty('readOnly') ? this.props.element.readOnly : false;
67 | let this_default_today = this.props.element.hasOwnProperty('defaultToday') ? this.props.element.defaultToday : false;
68 | let this_checked_inline = this.props.element.hasOwnProperty('inline') ? this.props.element.inline : false;
69 | let this_checked_bold = this.props.element.hasOwnProperty('bold') ? this.props.element.bold : false;
70 | let this_checked_italic = this.props.element.hasOwnProperty('italic') ? this.props.element.italic : false;
71 | let this_checked_center = this.props.element.hasOwnProperty('center') ? this.props.element.center : false;
72 | let this_checked_page_break = this.props.element.hasOwnProperty('pageBreakBefore') ? this.props.element.pageBreakBefore : false;
73 | let this_checked_alternate_form = this.props.element.hasOwnProperty('alternateForm') ? this.props.element.alternateForm : false;
74 |
75 | let this_files = this.props.files.length ? this.props.files : [];
76 | if (this_files.length < 1 || this_files.length > 0 && this_files[0].id !== "")
77 | this_files.unshift({id: '', file_name: ''});
78 |
79 | if(this.props.element.hasOwnProperty('content')) {
80 | var contentState = ContentState.createFromBlockArray(convertFromHTML(this.props.element.content));
81 | var editorState = EditorState.createWithContent(contentState);
82 | }
83 | if(this.props.element.hasOwnProperty('label')) {
84 | var contentState = ContentState.createFromBlockArray(convertFromHTML(this.props.element.label));
85 | var editorState = EditorState.createWithContent(contentState);
86 | }
87 |
88 | return (
89 |
90 |
91 |
{this.props.element.text}
92 |
93 |
94 | { this.props.element.hasOwnProperty('content') &&
95 |
96 |
97 |
98 |
103 |
104 | }
105 | { this.props.element.hasOwnProperty('file_path') &&
106 |
107 |
108 |
114 |
115 | }
116 | { this.props.element.hasOwnProperty('href') &&
117 |
118 |
119 |
120 | }
121 | { this.props.element.hasOwnProperty('src') &&
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
133 |
134 |
135 |
145 |
146 | }
147 | { this.props.element.hasOwnProperty('label') &&
148 |
149 |
150 |
155 |
156 |
157 |
158 |
162 |
163 | { this.props.element.hasOwnProperty('readOnly') &&
164 |
165 |
169 |
170 | }
171 | { this.props.element.hasOwnProperty('defaultToday') &&
172 |
173 |
177 |
178 | }
179 | { (this.state.element.element === 'RadioButtons' || this.state.element.element === 'Checkboxes') &&
180 |
181 |
185 |
186 | }
187 |
188 | }
189 |
190 | {this.state.element.element === 'Signature' && this.props.element.readOnly
191 | ? (
192 |
193 |
194 |
195 |
This will give the element a key that can be used to replace the content with a runtime value.
196 |
197 | )
198 | : (
)
199 | }
200 |
201 |
202 |
203 |
204 |
205 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
219 |
220 |
221 |
222 | { this.props.element.hasOwnProperty('step') &&
223 |
224 |
225 |
226 |
227 |
228 |
229 | }
230 | { this.props.element.hasOwnProperty('min_value') &&
231 |
238 | }
239 | { this.props.element.hasOwnProperty('max_value') &&
240 |
247 | }
248 | { this.props.element.hasOwnProperty('default_value') &&
249 |
250 |
251 |
252 |
253 |
254 |
255 | }
256 | { this.props.element.hasOwnProperty('static') && this.props.element.static &&
257 |
258 |
259 |
260 |
264 |
265 |
266 |
270 |
271 |
272 | }
273 |
274 | { this.props.showCorrectColumn && this.props.element.canHaveAnswer && !this.props.element.hasOwnProperty('options') &&
275 |
276 |
277 |
278 |
279 | }
280 | { this.props.element.hasOwnProperty('options') &&
281 |
282 | }
283 |
284 | );
285 | }
286 | }
287 | FormElementsEdit.defaultProps = {className: 'edit-element-fields'}
288 |
--------------------------------------------------------------------------------
/src/form-validator.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 | import xss from 'xss';
7 |
8 | let myxss = new xss.FilterXSS({
9 | whiteList: {
10 | u: [],
11 | br: [],
12 | b: [],
13 | i: [],
14 | ol:['style'],
15 | ul: ['style'],
16 | li: [],
17 | p: ['style'],
18 | sub: [],
19 | sup: [],
20 | div: ['style'],
21 | em: [],
22 | strong: [],
23 | span: ['style']
24 | }
25 | });
26 |
27 | export default class FormValidator extends React.Component {
28 |
29 | constructor(props) {
30 | super(props);
31 | this.state = {
32 | errors: []
33 | }
34 | }
35 |
36 | componentWillMount() {
37 | this.subscription = this.props.emitter.addListener('formValidation', errors => {
38 | this.setState({errors: errors});
39 | });
40 | }
41 |
42 | componentWillUnmount() {
43 | this.subscription.remove();
44 | }
45 |
46 | dismissModal(e) {
47 | e.preventDefault();
48 | this.setState({errors: []});
49 | }
50 |
51 | render() {
52 | let errors = this.state.errors.map((error,index) => {
53 | return
54 | })
55 |
56 | return (
57 |
58 | { this.state.errors.length > 0 &&
59 |
70 | }
71 |
72 | )
73 | }
74 | }
--------------------------------------------------------------------------------
/src/form.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 | import ReactDOM from 'react-dom';
7 | import {EventEmitter} from 'fbemitter';
8 | import FormValidator from './form-validator';
9 | import {Header,Paragraph,Label,LineBreak,TextInput,NumberInput,TextArea,Dropdown,Image,Checkboxes,DatePicker,RadioButtons,Rating,Tags,Signature,HyperLink,Download,Camera,Range} from './form-elements';
10 | import moment from 'moment';
11 |
12 | export default class ReactForm extends React.Component {
13 |
14 | constructor(props) {
15 | super(props);
16 | this.emitter = new EventEmitter();
17 | }
18 |
19 | _checkboxesDefaultValue(item) {
20 | let defaultChecked = [];
21 | item.options.forEach(option => {
22 | defaultChecked.push(this.props.answer_data[`option_${option.key}`])
23 | })
24 | return defaultChecked;
25 | }
26 |
27 | _isIncorrect(item) {
28 | let incorrect = false;
29 | if (item.canHaveAnswer) {
30 | if (item.element === 'Checkboxes' || item.element === 'RadioButtons') {
31 | item.options.forEach(option => {
32 | let $option = ReactDOM.findDOMNode(this.refs[item.field_name].refs[`child_ref_${option.key}`]);
33 | if ((option.hasOwnProperty('correct') && !$option.checked) || (!option.hasOwnProperty('correct') && $option.checked)) {
34 | incorrect = true;
35 | }
36 | })
37 | } else {
38 | let $item = null
39 | if (item.element === 'Rating') {
40 | $item = {};
41 | $item.value = this.refs[item.field_name].refs[`child_ref_${item.field_name}`].state.rating;
42 | if ($item.value.toString() !== item.correct) {
43 | incorrect = true;
44 | }
45 | } else {
46 | if (item.element === 'Tags') {
47 | $item = {};
48 | $item.value = this.refs[item.field_name].refs[`child_ref_${item.field_name}`].state.value
49 | } else if(item.element === 'DatePicker') {
50 | $item = {};
51 | $item.value = this.refs[item.field_name].state.value
52 | } else {
53 | $item = ReactDOM.findDOMNode(this.refs[item.field_name].refs[`child_ref_${item.field_name}`]);
54 | $item.value = $item.value.trim();
55 | }
56 |
57 | if ($item.value.toLowerCase() !== item.correct.trim().toLowerCase()) {
58 | incorrect = true;
59 | }
60 | }
61 | }
62 | }
63 | return incorrect;
64 | }
65 |
66 | _isInvalid(item) {
67 | let invalid = false;
68 | if (item.required === true) {
69 | if (item.element === 'Checkboxes' || item.element === 'RadioButtons') {
70 | let checked_options = 0;
71 | item.options.forEach(option => {
72 | let $option = ReactDOM.findDOMNode(this.refs[item.field_name].refs[`child_ref_${option.key}`]);
73 | if ($option.checked) {
74 | checked_options += 1;
75 | }
76 | })
77 | if (checked_options < 1) {
78 | // errors.push(item.label + ' is required!');
79 | invalid = true;
80 | }
81 | } else {
82 | let $item = null
83 | if (item.element === 'Rating') {
84 | $item = {};
85 | $item.value = this.refs[item.field_name].refs[`child_ref_${item.field_name}`].state.rating;
86 | if ($item.value === 0) {
87 | invalid = true;
88 | }
89 | } else {
90 | if (item.element === 'Tags') {
91 | $item = {};
92 | $item.value = this.refs[item.field_name].refs[`child_ref_${item.field_name}`].state.value
93 | } else if(item.element === 'DatePicker') {
94 | $item = {};
95 | $item.value = this.refs[item.field_name].state.value
96 | } else {
97 | $item = ReactDOM.findDOMNode(this.refs[item.field_name].refs[`child_ref_${item.field_name}`]);
98 | $item.value = $item.value.trim();
99 | }
100 |
101 | if ($item.value === undefined || $item.value.length < 1) {
102 | invalid = true;
103 | }
104 | }
105 | }
106 | }
107 | return invalid;
108 | }
109 |
110 | _getSignatureImg(item) {
111 | let $canvas_sig = this.refs[item.field_name].refs[`canvas_${item.field_name}`]
112 | let base64 = $canvas_sig.toDataURL().replace('data:image/png;base64,', '');
113 | let isEmpty = $canvas_sig.isEmpty();
114 | let $input_sig = ReactDOM.findDOMNode(this.refs[item.field_name].refs[`child_ref_${item.field_name}`]);
115 | if (isEmpty) {
116 | $input_sig.value = '';
117 | } else {
118 | $input_sig.value = base64;
119 | }
120 | return true;
121 | }
122 |
123 | handleSubmit(e) {
124 | e.preventDefault();
125 |
126 | let $form = ReactDOM.findDOMNode(this.refs.form);
127 | let errors = this.validateForm();
128 |
129 | // Publish errors, if any.
130 | this.emitter.emit('formValidation', errors);
131 |
132 | // Only submit if there are no errors.
133 | if (errors.length < 1) {
134 | $form.submit();
135 | }
136 | }
137 |
138 | validateForm() {
139 | let errors = [];
140 | let data_items = this.props.data;
141 |
142 | if(this.props.display_short) {
143 | data_items = this.props.data.filter((i) => i.alternateForm === true);
144 | }
145 |
146 | data_items.forEach(item => {
147 | if (item.element === 'Signature') {
148 | this._getSignatureImg(item);
149 | }
150 |
151 | if (this._isInvalid(item)) {
152 | errors.push(`${item.label} is required!`);
153 | }
154 |
155 | if (this.props.validateForCorrectness && this._isIncorrect(item)) {
156 | errors.push(`${item.label} was answered incorrectly!`);
157 | }
158 | });
159 |
160 | return errors;
161 | }
162 |
163 | render() {
164 | let data_items = this.props.data;
165 |
166 | if (this.props.display_short) {
167 | data_items = this.props.data.filter((i) => i.alternateForm === true);
168 | }
169 |
170 | data_items.forEach((item) => {
171 | if (item.readOnly && item.variableKey && this.props.variables[item.variableKey]) {
172 | this.props.answer_data[item.field_name] = this.props.variables[item.variableKey];
173 | }
174 | });
175 |
176 | let items = data_items.map( item => {
177 | switch (item.element) {
178 | case 'Header':
179 | return
180 | case 'Paragraph':
181 | return
182 | case 'Label':
183 | return
184 | case 'LineBreak':
185 | return
186 | case 'TextInput':
187 | return
192 | case 'NumberInput':
193 | return
194 | case 'TextArea':
195 | return
196 | case 'Dropdown':
197 | return
198 | case 'Checkboxes':
199 | return
200 | case 'DatePicker':
201 | return
202 | case 'RadioButtons':
203 | return
204 | case 'Rating':
205 | return
206 | case 'Image':
207 | return
208 | case 'Tags':
209 | return
210 | case 'Signature':
211 | return
218 | case 'HyperLink':
219 | return
220 | case 'Download':
221 | return
222 | case 'Camera':
223 | return
224 | case 'Range':
225 | return
226 | }
227 | })
228 |
229 | let formTokenStyle = {
230 | display: 'none'
231 | }
232 |
233 | let actionName = (this.props.action_name) ? this.props.action_name : 'Submit';
234 | let backName = (this.props.back_name) ? this.props.back_name : 'Cancel';
235 |
236 | return (
237 |
260 | )
261 | }
262 | }
263 |
264 | ReactForm.defaultProps = { validateForCorrectness: false };
265 |
--------------------------------------------------------------------------------
/src/header-bar.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 |
7 | export default class HeaderBar extends React.Component {
8 | render() {
9 | return (
10 |
11 |
{this.props.data.text}
12 |
13 | { this.props.data.element !== "LineBreak" &&
14 |
15 | }
16 |
17 |
18 |
19 | );
20 | }
21 | }
--------------------------------------------------------------------------------
/src/index.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 | import Preview from './preview'
7 | import Toolbar from './toolbar'
8 | import ElementActions from './actions/ElementActions';
9 | import ReactFormGenerator from './form';
10 |
11 | let FormBuilders = {};
12 |
13 | class ReactFormBuilder extends React.Component {
14 |
15 | constructor(props) {
16 | super(props);
17 |
18 | this.state = {
19 | editMode: false,
20 | editElement: null
21 | }
22 | document.addEventListener("click", this.editModeOff.bind(this));
23 | }
24 |
25 | editModeOn(data, e) {
26 | e.stopPropagation()
27 | if (this.state.editMode) {
28 | this.setState({editMode: !this.state.editMode, editElement: null});
29 | } else {
30 | this.setState({editMode: !this.state.editMode, editElement: data});
31 | }
32 | }
33 |
34 | manualEditModeOff() {
35 | if (this.state.editMode) {
36 | this.setState({
37 | editMode: false,
38 | editElement: null
39 | });
40 | }
41 | }
42 |
43 | editModeOff(e) {
44 | const $menu = $(".edit-form");
45 | let click_is_outside_menu = (!$menu.is(e.target) && $menu.has(e.target).length === 0);
46 |
47 | if (this.state.editMode && click_is_outside_menu) {
48 | this.setState({
49 | editMode: false,
50 | editElement: null
51 | });
52 | }
53 | }
54 |
55 | render() {
56 | let toolbarProps = {};
57 | if (this.props.toolbarItems)
58 | toolbarProps.items = this.props.toolbarItems;
59 | return (
60 |
76 | );
77 | }
78 |
79 | }
80 |
81 | FormBuilders.ReactFormBuilder = ReactFormBuilder;
82 | FormBuilders.ReactFormGenerator = ReactFormGenerator;
83 |
84 | module.exports = FormBuilders;
85 |
--------------------------------------------------------------------------------
/src/preview.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 | import Sortable from 'react-sortable-items';
7 | import ElementStore from './stores/ElementStore';
8 | import ElementActions from './actions/ElementActions';
9 | import {Header,Paragraph,Label,LineBreak,TextInput,NumberInput,TextArea,Dropdown,Checkboxes,DatePicker,RadioButtons,Image,Rating,Tags,Signature,HyperLink,Download,Camera,Range} from './form-elements';
10 | import FormElementsEdit from './form-elements-edit';
11 |
12 | export default class Preview extends React.Component {
13 |
14 | constructor(props) {
15 | super(props);
16 | this.state = {
17 | data: [],
18 | answer_data: {}
19 | }
20 |
21 | var loadData = (this.props.url) ? this.props.url : (this.props.data) ? this.props.data : [];
22 | var saveUrl = (this.props.saveUrl) ? this.props.saveUrl : '';
23 |
24 | ElementStore.load(loadData, saveUrl);
25 | ElementStore.listen(this._onChange.bind(this));
26 | }
27 |
28 | _setValue(text) {
29 | return text.replace(/[^A-Z0-9]+/ig, "_").toLowerCase();
30 | }
31 |
32 | updateElement(element) {
33 | let data = this.state.data;
34 | let found = false;
35 |
36 | for(var i=0, len=data.length; i < len; i++) {
37 | if (element.id === data[i].id) {
38 | data[i] = element;
39 | found = true;
40 | break;
41 | }
42 | }
43 |
44 | if (found) {
45 | ElementActions.saveData(data);
46 | }
47 | }
48 |
49 | _onChange(data) {
50 |
51 | let answer_data = {};
52 |
53 | data.forEach((item) => {
54 | if (item.readOnly && this.props.variables[item.variableKey]) {
55 | answer_data[item.field_name] = this.props.variables[item.variableKey];
56 | }
57 | });
58 |
59 | this.setState({
60 | data,
61 | answer_data
62 | });
63 | }
64 |
65 | _onDestroy(item) {
66 | ElementActions.deleteElement(item);
67 | }
68 |
69 | handleSort(orderedIds) {
70 | let sortedArray = [];
71 | let data = this.state.data;
72 | let index = 0;
73 |
74 | for(var i=0, len=data.length; i < len; i++) {
75 | index = orderedIds.indexOf(data[i].id);
76 | sortedArray[index] = data[i];
77 | }
78 |
79 | ElementActions.saveData(sortedArray);
80 | this.state.data = sortedArray;
81 | }
82 |
83 | render() {
84 | let classes = this.props.className;
85 | if (this.props.editMode) { classes += ' is-editing'; }
86 | let items = this.state.data.map( item => {
87 | switch (item.element) {
88 | case "Header":
89 | return
90 | case "Paragraph":
91 | return
92 | case "Label":
93 | return
94 | case "LineBreak":
95 | return
96 | case "TextInput":
97 | return
98 | case "NumberInput":
99 | return
100 | case "TextArea":
101 | return
102 | case "Dropdown":
103 | return
104 | case "Checkboxes":
105 | return
106 | case "DatePicker":
107 | return
108 | case "RadioButtons":
109 | return
110 | case "Rating":
111 | return
112 | case "Image":
113 | return
114 | case "Tags":
115 | return
116 | case "Signature":
117 | return
128 | case "HyperLink":
129 | return
130 | case "Download":
131 | return
132 | case "Camera":
133 | return
134 | case "Range":
135 | return
136 | }
137 | })
138 | return (
139 |
140 |
141 | { this.props.editElement !== null &&
142 |
143 | }
144 |
145 |
146 | {items}
147 |
148 |
149 | )
150 | }
151 | }
152 | Preview.defaultProps = { showCorrectColumn: false, files: [], editMode: false, editElement: null, className: 'react-form-builder-preview pull-left'}
153 |
--------------------------------------------------------------------------------
/src/star-rating.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import cx from 'classnames';
4 |
5 | /**
6 | * @fileoverview react-star-rating
7 | * @author @cameronjroe
8 | *
18 | */
19 |
20 | export default class StarRating extends React.Component {
21 |
22 | constructor(props) {
23 | super(props);
24 |
25 | this.state = {
26 | ratingCache: {
27 | pos: 0,
28 | rating: 0
29 | },
30 | editing: props.editing || true,
31 | stars: 5,
32 | rating: 0,
33 | pos: 0,
34 | glyph: this.getStars()
35 | };
36 | }
37 |
38 | /**
39 | * Gets the stars based on ratingAmount
40 | * @return {string} stars
41 | */
42 | getStars() {
43 | var stars = '';
44 | var numRating = this.props.ratingAmount;
45 | for(var i = 0; i < numRating; i++) {
46 | stars += '\u2605';
47 | }
48 | return stars;
49 | }
50 |
51 | componentWillMount() {
52 | this.min = 0;
53 | this.max = this.props.ratingAmount || 5;
54 | if (this.props.rating) {
55 |
56 | this.state.editing = this.props.editing || false;
57 | var ratingVal = this.props.rating;
58 | this.state.ratingCache.pos = this.getStarRatingPosition(ratingVal);
59 | this.state.ratingCache.rating = ratingVal;
60 |
61 | this.setState({
62 | ratingCache: this.state.ratingCache,
63 | rating: ratingVal,
64 | pos: this.getStarRatingPosition(ratingVal)
65 | });
66 | }
67 | }
68 |
69 | componentDidMount() {
70 | this.root = ReactDOM.findDOMNode(this.refs.root);
71 | this.ratingContainer = ReactDOM.findDOMNode(this.refs.ratingContainer);
72 | }
73 |
74 | componentWillUnmount() {
75 | delete this.root;
76 | delete this.ratingContainer;
77 | }
78 |
79 | getPosition(e) {
80 | return e.pageX - this.root.getBoundingClientRect().left;
81 | }
82 |
83 | applyPrecision(val, precision) {
84 | return parseFloat(val.toFixed(precision));
85 | }
86 |
87 | getDecimalPlaces(num) {
88 | var match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
89 | return !match ? 0 : Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0));
90 | }
91 |
92 | getWidthFromValue(val) {
93 | var min = this.min,
94 | max = this.max;
95 | if (val <= min || min === max) {
96 | return 0;
97 | }
98 | if (val >= max) {
99 | return 100;
100 | }
101 | return ( val / (max - min) ) * 100;
102 | }
103 |
104 | getValueFromPosition(pos) {
105 | var precision = this.getDecimalPlaces(this.props.step);
106 | var maxWidth = this.ratingContainer.offsetWidth;
107 | var diff = this.max - this.min;
108 | var factor = (diff * pos) / (maxWidth * this.props.step);
109 | factor = Math.ceil(factor);
110 | var val = this.applyPrecision(parseFloat(this.min + factor * this.props.step), precision);
111 | val = Math.max(Math.min(val, this.max), this.min);
112 | return val;
113 | }
114 |
115 | calculate(pos) {
116 | var val = this.getValueFromPosition(pos),
117 | width = this.getWidthFromValue(val);
118 |
119 | width += '%';
120 | return {width, val};
121 | }
122 |
123 | getStarRatingPosition(val) {
124 | var width = this.getWidthFromValue(val) + '%';
125 | return width;
126 | }
127 |
128 | getRatingEvent(e) {
129 | var pos = this.getPosition(e);
130 | return this.calculate(pos);
131 | }
132 |
133 | getSvg() {
134 | return (
135 |
140 | );
141 | }
142 |
143 | handleMouseLeave() {
144 | this.setState({
145 | pos: this.state.ratingCache.pos,
146 | rating: this.state.ratingCache.rating
147 | });
148 | }
149 |
150 | handleMouseMove(e) {
151 | // get hover position
152 | var ratingEvent = this.getRatingEvent(e);
153 | this.updateRating(
154 | ratingEvent.width,
155 | ratingEvent.val
156 | );
157 | }
158 |
159 | updateRating(width, val) {
160 | this.setState({
161 | pos: width,
162 | rating: val
163 | });
164 | }
165 |
166 | shouldComponentUpdate(nextProps, nextState) {
167 | if (nextProps !== this.props) {
168 | this.updateRating(
169 | this.getStarRatingPosition(nextProps.rating),
170 | nextProps.rating
171 | );
172 | return true;
173 | } else {
174 | return nextState.ratingCache.rating !== this.state.ratingCache.rating || nextState.rating !== this.state.rating;
175 | }
176 | }
177 |
178 | handleClick(e) {
179 |
180 | // is it disabled?
181 | if (this.props.disabled) {
182 | e.stopPropagation();
183 | e.preventDefault();
184 | return false;
185 | }
186 |
187 | var ratingCache = {
188 | pos: this.state.pos,
189 | rating: this.state.rating,
190 | caption: this.props.caption,
191 | name: this.props.name
192 | };
193 |
194 | this.setState({
195 | ratingCache: ratingCache
196 | });
197 |
198 | this.props.onRatingClick(e, ratingCache);
199 | }
200 |
201 | treatName(title) {
202 | if (typeof title === 'string') {
203 | return title.toLowerCase().split(' ').join('_');
204 | }
205 | }
206 |
207 | render() {
208 |
209 | var caption = null;
210 | var classes = cx({
211 | 'react-star-rating__root': true,
212 | 'rating-disabled': this.props.disabled,
213 | ['react-star-rating__size--' + this.props.size]: this.props.size,
214 | 'rating-editing': this.state.editing
215 | });
216 |
217 | // is there a caption?
218 | if (this.props.caption) {
219 | caption = ({this.props.caption});
220 | }
221 |
222 | // are we editing this rating?
223 | var starRating;
224 | if (this.state.editing) {
225 | starRating = (
226 |
235 | );
236 | } else {
237 | starRating = (
238 |
242 | );
243 | }
244 |
245 | return (
246 |
247 |
248 | {starRating}
249 |
250 |
251 | );
252 | }
253 | }
254 |
255 | StarRating.propTypes = {
256 | name: React.PropTypes.string.isRequired,
257 | caption: React.PropTypes.string,
258 | ratingAmount: React.PropTypes.number.isRequired,
259 | rating: React.PropTypes.number,
260 | onRatingClick: React.PropTypes.func,
261 | disabled: React.PropTypes.bool,
262 | editing: React.PropTypes.bool,
263 | size: React.PropTypes.string
264 | };
265 |
266 | StarRating.defaultProps = {
267 | step: 0.5,
268 | ratingAmount: 5,
269 | onRatingClick() {},
270 | disabled: false
271 | };
272 |
--------------------------------------------------------------------------------
/src/stores/ElementStore.js:
--------------------------------------------------------------------------------
1 | var Reflux = require('reflux');
2 | var ElementActions = require('../actions/ElementActions');
3 |
4 | var _data;
5 | var _saveUrl;
6 |
7 | var ElementStore = Reflux.createStore({
8 | init: function() {
9 | this.listenTo(ElementActions.createElement, this._create);
10 | this.listenTo(ElementActions.deleteElement, this._delete);
11 | this.listenTo(ElementActions.save, this.save);
12 | this.listenTo(ElementActions.saveData, this._updateOrder)
13 | },
14 |
15 | load: function(urlOrData, saveUrl) {
16 |
17 | var self = this;
18 | _saveUrl = saveUrl;
19 |
20 | if(typeof urlOrData == 'string' || urlOrData instanceof String) {
21 | $.ajax({
22 | url: urlOrData,
23 | success: function(data) {
24 | _data = data;
25 | self.trigger(_data);
26 | }
27 | })
28 | } else {
29 | _data = urlOrData;
30 | self.trigger(_data);
31 | }
32 | },
33 |
34 | _create: function(element) {
35 | _data.push(element);
36 | this.trigger(_data);
37 | this.save();
38 | },
39 |
40 | _delete: function(element) {
41 | var index = _data.indexOf(element);
42 | _data.splice(index, 1);
43 | this.trigger(_data);
44 | this.save();
45 | },
46 |
47 | _updateOrder: function(elements) {
48 | _data = elements;
49 | this.trigger(_data);
50 | this.save();
51 | },
52 |
53 | save: function() {
54 | if(_saveUrl) {
55 | $.ajax({
56 | type: 'POST',
57 | url: _saveUrl,
58 | data: {
59 | task_data: JSON.stringify(_data)
60 | },
61 | dataType: 'json',
62 | success: function(data) {
63 | console.log('Saved... ', arguments);
64 | }
65 | })
66 | }
67 | }
68 |
69 | });
70 |
71 | module.exports = ElementStore;
--------------------------------------------------------------------------------
/src/toolbar-item.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 |
7 | export default class Toolbar extends React.Component {
8 | render() {
9 | return(
10 | {this.props.data.name}
11 | )
12 | }
13 | }
--------------------------------------------------------------------------------
/src/toolbar.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 |
5 | import React from 'react';
6 | import ToolbarItem from './toolbar-item';
7 | import ID from './UUID';
8 | import ElementActions from './actions/ElementActions';
9 |
10 | export default class Toolbar extends React.Component {
11 |
12 | constructor(props) {
13 | super(props);
14 |
15 | var items = (this.props.items) ? this.props.items : this._defaultItems();
16 |
17 | this.state = {
18 | items: items
19 | };
20 | }
21 |
22 | _defaultItemOptions(element) {
23 | switch(element) {
24 | case "Dropdown":
25 | return [
26 | {value: '', text: '', key: 'dropdown_option_' + ID.uuid()},
27 | {value: '', text: '', key: 'dropdown_option_' + ID.uuid()},
28 | {value: '', text: '', key: 'dropdown_option_' + ID.uuid()}
29 | ];
30 | case "Tags":
31 | return [
32 | {value: 'place_holder_tag_1', text: 'Place holder tag 1', key: 'tags_option_' + ID.uuid()},
33 | {value: 'place_holder_tag_2', text: 'Place holder tag 2', key: 'tags_option_' + ID.uuid()},
34 | {value: 'place_holder_tag_3', text: 'Place holder tag 3', key: 'tags_option_' + ID.uuid()}
35 | ];
36 | case "Checkboxes":
37 | return [
38 | {value: 'place_holder_option_1', text: 'Place holder option 1', key: 'checkboxes_option_' + ID.uuid()},
39 | {value: 'place_holder_option_2', text: 'Place holder option 2', key: 'checkboxes_option_' + ID.uuid()},
40 | {value: 'place_holder_option_3', text: 'Place holder option 3', key: 'checkboxes_option_' + ID.uuid()}
41 | ];
42 | case "RadioButtons":
43 | return [
44 | {value: 'place_holder_option_1', text: 'Place holder option 1', key: 'radiobuttons_option_' + ID.uuid()},
45 | {value: 'place_holder_option_2', text: 'Place holder option 2', key: 'radiobuttons_option_' + ID.uuid()},
46 | {value: 'place_holder_option_3', text: 'Place holder option 3', key: 'radiobuttons_option_' + ID.uuid()}
47 | ];
48 | default:
49 | return [];
50 | }
51 | }
52 |
53 | _defaultItems() {
54 | return [
55 | {
56 | key: 'Header',
57 | name: 'Header Text',
58 | icon: 'fa fa-header',
59 | static: true,
60 | content: 'Placeholder Text...'
61 | },
62 | {
63 | key: 'Label',
64 | name: 'Label',
65 | static: true,
66 | icon: 'fa fa-font',
67 | content: 'Placeholder Text...'
68 | },
69 | {
70 | key: 'Paragraph',
71 | name: 'Paragraph',
72 | static: true,
73 | icon: 'fa fa-paragraph',
74 | content: 'Placeholder Text...'
75 | },
76 | {
77 | key: 'LineBreak',
78 | name: 'Line Break',
79 | static: true,
80 | icon: 'fa fa-arrows-h'
81 | },
82 | {
83 | key: 'Dropdown',
84 | canHaveAnswer: true,
85 | name: 'Dropdown',
86 | icon: 'fa fa-caret-square-o-down',
87 | label: 'Placeholder Label',
88 | field_name: 'dropdown_',
89 | options: []
90 | },
91 | {
92 | key: 'Tags',
93 | canHaveAnswer: true,
94 | name: 'Tags',
95 | icon: 'fa fa-tags',
96 | label: 'Placeholder Label',
97 | field_name: 'tags_',
98 | options: []
99 | },
100 | {
101 | key: 'Checkboxes',
102 | canHaveAnswer: true,
103 | name: 'Checkboxes',
104 | icon: 'fa fa-check-square-o',
105 | label: 'Placeholder Label',
106 | field_name: 'checkboxes_',
107 | options: []
108 | },
109 | {
110 | key: 'RadioButtons',
111 | canHaveAnswer: true,
112 | name: 'Multiple Choice',
113 | icon: 'fa fa-dot-circle-o',
114 | label: 'Placeholder Label',
115 | field_name: 'radio_buttons_',
116 | options: []
117 | },
118 | {
119 | key: 'TextInput',
120 | canHaveAnswer: true,
121 | name: 'Text Input',
122 | label: 'Placeholder Label',
123 | icon: 'fa fa-font',
124 | field_name: 'text_input_'
125 | },
126 | {
127 | key: 'NumberInput',
128 | canHaveAnswer: true,
129 | name: 'Number Input',
130 | label: 'Placeholder Label',
131 | icon: 'fa fa-plus',
132 | field_name: 'number_input_'
133 | },
134 | {
135 | key: 'TextArea',
136 | canHaveAnswer: true,
137 | name: 'Multi-line Input',
138 | label: 'Placeholder Label',
139 | icon: 'fa fa-text-height',
140 | field_name: 'text_area_'
141 | },
142 | {
143 | key: 'Image',
144 | name: 'Image',
145 | label: '',
146 | icon: 'fa fa-photo',
147 | field_name: 'image_',
148 | src: ''
149 | },
150 | {
151 | key: 'Rating',
152 | canHaveAnswer: true,
153 | name: 'Rating',
154 | label: 'Placeholder Label',
155 | icon: 'fa fa-star',
156 | field_name: 'rating_'
157 | },
158 | {
159 | key: 'DatePicker',
160 | canDefaultToday: true,
161 | canReadOnly: true,
162 | name: 'Date',
163 | icon: 'fa fa-calendar',
164 | label: 'Placeholder Label',
165 | field_name: 'date_picker_'
166 | },
167 | {
168 | key: 'Signature',
169 | canReadOnly: true,
170 | name: 'Signature',
171 | icon: 'fa fa-pencil-square-o',
172 | label: 'Signature',
173 | field_name: 'signature_'
174 | },
175 | {
176 | key: 'HyperLink',
177 | name: 'Web site',
178 | icon: 'fa fa-link',
179 | static: true,
180 | content: 'Placeholder Web site link ...',
181 | href: 'http://www.example.com'
182 | },
183 | {
184 | key: 'Download',
185 | name: 'File Attachment',
186 | icon: 'fa fa-file',
187 | static: true,
188 | content: 'Placeholder file name ...',
189 | field_name: 'download_',
190 | file_path: '',
191 | _href: ''
192 | },
193 | {
194 | key: 'Range',
195 | name: 'Range',
196 | icon: 'fa fa-sliders',
197 | label: 'Placeholder Label',
198 | field_name: 'range_',
199 | step: 1,
200 | default_value: 3,
201 | min_value: 1,
202 | max_value: 5,
203 | min_label: 'Easy',
204 | max_label: 'Difficult'
205 | },
206 | {
207 | key: 'Camera',
208 | name: 'Camera',
209 | icon: 'fa fa-camera',
210 | label: 'Placeholder Label',
211 | field_name: 'camera_'
212 | }
213 | ]
214 | }
215 |
216 | _onClick(item) {
217 |
218 | var elementOptions = {
219 | id: ID.uuid(),
220 | element: item.key,
221 | text: item.name,
222 | static: item.static,
223 | required: false
224 | };
225 |
226 | if(item.static) {
227 | elementOptions['bold'] = false;
228 | elementOptions['italic'] = false;
229 | }
230 |
231 | if (item.canHaveAnswer)
232 | elementOptions['canHaveAnswer'] = item.canHaveAnswer;
233 |
234 | if (item.canReadOnly)
235 | elementOptions['readOnly'] = false;
236 |
237 | if (item.canDefaultToday)
238 | elementOptions['defaultToday'] = false;
239 |
240 | if (item.content)
241 | elementOptions['content'] = item.content;
242 |
243 | if (item.href)
244 | elementOptions['href'] = item.href;
245 |
246 | if (item.key === "Image") {
247 | elementOptions['src'] = item.src;
248 | }
249 |
250 | if (item.key === "Download") {
251 | elementOptions['_href'] = item._href;
252 | elementOptions['file_path'] = item.file_path;
253 | }
254 |
255 | if (item.key === "Range") {
256 | elementOptions['step'] = item.step;
257 | elementOptions['default_value'] = item.default_value;
258 | elementOptions['min_value'] = item.min_value;
259 | elementOptions['max_value'] = item.max_value;
260 | elementOptions['min_label'] = item.min_label;
261 | elementOptions['max_label'] = item.max_label;
262 | }
263 |
264 | if (item.defaultValue)
265 | elementOptions['defaultValue'] = item.defaultValue;
266 |
267 | if (item.field_name)
268 | elementOptions['field_name'] = item.field_name + ID.uuid();
269 |
270 | if (item.label)
271 | elementOptions['label'] = item.label;
272 |
273 | if (item.options) {
274 | elementOptions['options'] = this._defaultItemOptions(elementOptions['element']);
275 | }
276 |
277 | ElementActions.createElement(elementOptions);
278 | }
279 |
280 | render() {
281 | return (
282 |
283 |
Toolbox
284 |
285 | {
286 | this.state.items.map(item => {
287 | return ;
288 | })
289 | }
290 |
291 |
292 | )
293 | }
294 | }
295 |
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Helvetica, Sans-Serif;
3 | }
--------------------------------------------------------------------------------
/test/dom-mock.js:
--------------------------------------------------------------------------------
1 | module.exports = function(markup) {
2 | if (typeof document !== 'undefined') return;
3 |
4 | var jsdom = require('jsdom').jsdom;
5 |
6 | global.document = jsdom(markup || '');
7 | global.window = document.parentWindow;
8 |
9 | global.$ = global.jQuery = require('jquery')(global.window);
10 | global.navigator = {
11 | userAgent: 'node.js'
12 | };
13 | };
--------------------------------------------------------------------------------
/test/dynamic-option-list-test.js:
--------------------------------------------------------------------------------
1 | require('./dom-mock')('');
2 |
3 | var jsdom = require('mocha-jsdom');
4 | var assert = require('assert');
5 | var React = require('react/addons');
6 | var ReactDOM = require('react-dom');
7 | var DynamicOptionList = require('../src/dynamic-option-list.jsx').default;
8 | var TestUtils = React.addons.TestUtils;
9 |
10 | var state = {
11 | "id":"3C22A938-FD3C-40FB-AA51-26E5A8A62EE0",
12 | "element":"RadioButtons",
13 | "text":"Multiple Choice",
14 | "required":false,
15 | "canHaveAnswer":true,
16 | "field_name":"radio_buttons_06F55E45-E6FB-47A7-B87F-403809980313",
17 | "label":"Placeholder Label",
18 | "options":[
19 | {"value":"place_holder_option_1","text":"Place holder option 1","key":"radiobuttons_option_94F7A605-B64A-4493-8C6C-9BD564CD688A"},
20 | {"value":"place_holder_option_2","text":"Place holder option 2","key":"radiobuttons_option_24A3BBEC-2899-4851-996C-D70E0B43AE62"},
21 | {"value":"place_holder_option_3","text":"Place holder option 3","key":"radiobuttons_option_CCE27C69-C13B-49F3-8CE1-6BD51B106F26"}
22 | ]
23 | };
24 | var previewData = [state];
25 |
26 | var newState = state;
27 |
28 | function updateElement(element) {
29 | newState = element;
30 | }
31 |
32 | describe('', function() {
33 |
34 | before('render and locate element', function() {
35 | this.dynamicOptionComponent = TestUtils.renderIntoDocument(
36 |
43 | );
44 |
45 | this.dynamicOptionElement = ReactDOM.findDOMNode(this.dynamicOptionComponent);
46 | });
47 |
48 | it('should render default options', function() {
49 | assert.equal(this.dynamicOptionComponent.state.element.options.length, 3);
50 | });
51 |
52 | it('should be able to update options', function() {
53 | var optionBox = this.dynamicOptionElement.querySelector('input[type=text]');
54 | optionBox.value = 'Place holder changed';
55 |
56 | TestUtils.Simulate.change(optionBox);
57 | assert.equal(newState.options[0].text, optionBox.value);
58 | assert.equal(newState.options[0].value, 'place_holder_changed');
59 | });
60 |
61 | it('should be able to update values', function() {
62 | var optionBoxes = this.dynamicOptionElement.querySelectorAll('input[type=text]');
63 | var labelBox = optionBoxes[0];
64 | var valueBox = optionBoxes[1];
65 |
66 | valueBox.value = 'specialsetvalue';
67 |
68 | TestUtils.Simulate.change(valueBox);
69 | assert.equal(newState.options[0].value, 'specialsetvalue');
70 |
71 | labelBox.value = 'New value again';
72 | TestUtils.Simulate.change(labelBox);
73 | assert.equal(newState.options[0].text, labelBox.value);
74 | assert.equal(newState.options[0].value, 'specialsetvalue');
75 | });
76 |
77 | });
--------------------------------------------------------------------------------
/test/form-elements-edit.js:
--------------------------------------------------------------------------------
1 | require('./dom-mock')('');
2 |
3 | var jsdom = require('mocha-jsdom');
4 | var assert = require('assert');
5 | var React = require('react/addons');
6 | var ReactDOM = require('react-dom');
7 | var FormElementsEdit = require('../src/form-elements-edit.jsx').default;
8 | var TestUtils = React.addons.TestUtils;
9 |
10 | var staticState = {
11 | editMode: true,
12 | editElement: {
13 | "id":"694AB27E-8F79-4D28-A8E5-51143EC8BD54",
14 | "element":"Header",
15 | "text":"Header Text",
16 | "static":true,
17 | "required":false,
18 | "bold":false,
19 | "italic":false,
20 | "content":"Placeholder Text..."
21 | },
22 | files: []
23 | };
24 |
25 | var inputState = {
26 | editMode: true,
27 | editElement: {
28 | "id":"7D84346E-4AB1-4F89-B66D-ABD4210B9DEB",
29 | "element":"TextInput",
30 | "text":"Text Input",
31 | "required":false,
32 | "canHaveAnswer":true,
33 | "field_name":"text_input_69723146-39D3-460C-9416-DD6F73B80404",
34 | "label":"Placeholder Label"
35 | },
36 | files: []
37 | };
38 |
39 | var updatedStaticElement = staticState.editElement;
40 | var updatedInputElement = inputState.editElement;
41 |
42 | function updateStaticElement(element) {
43 | updatedStaticElement = element;
44 | }
45 |
46 | function updateInputElement(element) {
47 | updatedInputElement = element;
48 | }
49 |
50 | describe(' Testing static element edit', function() {
51 | var formElementEdit;
52 |
53 | jsdom({ skipWindowCheck: true });
54 |
55 | beforeEach(function(done) {
56 |
57 | formElementEdit = React.render(
58 | ,
65 | document.body, function () {
66 | setTimeout(done);
67 | }
68 | );
69 |
70 | });
71 |
72 | afterEach(function(done) {
73 | React.unmountComponentAtNode(document.body);
74 | setTimeout(done);
75 | });
76 |
77 | it('should set the state of the element that is being edited', function() {
78 | assert.equal(formElementEdit.state.element.id, staticState.editElement.id);
79 | });
80 |
81 | it('should update the state when element content is changed', function() {
82 | var editElement = ReactDOM.findDOMNode(formElementEdit);
83 | var contentBox = editElement.getElementsByClassName('public-DraftEditor-content')[0];
84 |
85 | TestUtils.Simulate.beforeInput(contentBox, {data: 'a'});
86 | assert.equal(formElementEdit.state.dirty, true);
87 | assert.equal(updatedStaticElement.content, 'aPlaceholder Text...
\n');
88 | });
89 |
90 | });
91 |
92 | describe(' Testing text input element edit', function() {
93 | var formElementEdit;
94 |
95 | jsdom({ skipWindowCheck: true });
96 |
97 | beforeEach(function(done) {
98 |
99 | formElementEdit = React.render(
100 | ,
107 | document.body, function () {
108 | setTimeout(done);
109 | }
110 | );
111 |
112 | });
113 |
114 | afterEach(function(done) {
115 | React.unmountComponentAtNode(document.body);
116 | setTimeout(done);
117 | });
118 |
119 | it('should set the state of the element that is being edited', function() {
120 |
121 | assert.equal(formElementEdit.state.element.id, inputState.editElement.id);
122 | });
123 |
124 | it('should update the state when element label is changed', function() {
125 |
126 | var editElement = ReactDOM.findDOMNode(formElementEdit);
127 | var requiredCheckbox = editElement.querySelector('input[type=checkbox]');
128 |
129 | var label = editElement.getElementsByClassName('public-DraftEditor-content')[0];
130 | TestUtils.Simulate.beforeInput(label, {data: 'a'});
131 | assert.equal(updatedInputElement.label, 'aPlaceholder Label
\n');
132 |
133 | TestUtils.Simulate.change(requiredCheckbox, {"target": {"checked": true}});
134 | assert.equal(updatedInputElement.required, true);
135 |
136 | });
137 | });
138 |
--------------------------------------------------------------------------------
/test/form-test.js:
--------------------------------------------------------------------------------
1 | require('./dom-mock')('');
2 |
3 | var jsdom = require('mocha-jsdom');
4 | var assert = require('assert');
5 | var React = require('react/addons');
6 | var ReactDOM = require('react-dom');
7 | var GeneratedForm = require('../src/form.jsx').default;
8 | var TestUtils = React.addons.TestUtils;
9 |
10 | var state = {
11 | "download_path":"",
12 | "back_action":"",
13 | "answer_data":{},
14 | "form_action":"/",
15 | "form_method":"POST",
16 | "data":[
17 | {"id":"16E46F3D-873C-47A1-9FF0-A53C747B61F4","element":"Header","text":"Header Text","static":true,"required":false,"bold":false,"italic":false,"content":"Placeholder Text..."},
18 | {"id":"7989B581-8A26-4BC9-A897-AFF9C1E2DDAB","element":"Paragraph","text":"Paragraph","static":true,"required":false,"bold":false,"italic":true,"content":"Sample paragraph"},
19 | {
20 | "id":"877A58CE-A1B1-4A2E-8255-17881955C320",
21 | "element":"DatePicker",
22 | "text":"Date",
23 | "required":true,
24 | "defaultToday": true,
25 | "readOnly": true,
26 | "field_name":"date_picker_3D034712-A2F2-4DE3-A243-E8D2740336FA",
27 | "label":"Today's Date"
28 | },
29 | {"id":"81CA6686-F485-4733-A1FE-BE99051AD436","element":"Signature","text":"Signature","required":true,"field_name":"signature_D38E87E8-0C0B-483F-BEA7-72317FA2F90A","label":"Signature"},
30 | {"id":"8872F14D-D160-4E3F-A366-7D6A68E870F3","element":"Signature","text":"Signature","required":false,"field_name":"signature_43A170ED-C84B-4BB5-B0CD-C54602708ED4","label":"Signature"},
31 | {"id":"CFD4277D-BF8B-45C5-9984-DEC7D6D581FD","element":"RadioButtons","text":"Multiple Choice","required":false,"canHaveAnswer":true,"field_name":"radio_buttons_72E98436-5CDE-4F79-B393-BB45BF7D67AB","label":"Radio Buttons",
32 | "options":[
33 | {"value":"1","text":"Place holder option 1","key":"radiobuttons_option_6DB7F7FC-1D53-4076-B17E-77DABFFD40CA","correct":true},
34 | {"value":"2","text":"Place holder option 2","key":"radiobuttons_option_B7D7E0C0-8E19-453B-A279-EC37E5371E01"},
35 | {"value":"place_holder_option_3","text":"Place holder option 3","key":"radiobuttons_option_FB164020-5B75-4AEF-BB66-637F5BEB3603"}
36 | ]
37 | },
38 | {"id":"716C0647-4698-4BAC-92E7-5CDA2CA3AA0F","element":"Checkboxes","text":"Checkboxes","required":true,"canHaveAnswer":true,"field_name":"checkboxes_39C9C42D-FF8C-4629-AF1F-CF77C69825B7","label":"Checkboxes",
39 | "options":[
40 | {"value":"i_agree","text":"I agree","key":"checkboxes_option_4B65FC50-FCB5-4FEF-9BC2-FCE96AD722F6","correct":true},
41 | {"value":"i_agree","text":"I do not agree","key":"checkboxes_option_4B65FC50-FCB5-4FEF-9BC2-FCE96AD722F8","correct":false}
42 | ]
43 | }
44 | ],
45 | "validateForCorrectness":true
46 | };
47 |
48 |
49 | describe('', function() {
50 |
51 | jsdom({ skipWindowCheck: true });
52 |
53 | before('render and locate element', function() {
54 | this.generatedForm = TestUtils.renderIntoDocument(
55 |
56 | );
57 |
58 | this.formElement = ReactDOM.findDOMNode(this.generatedForm);
59 | });
60 |
61 | it('should render correctly', function() {
62 | assert.equal(this.formElement.querySelector('h3').innerHTML, state.data[0].content);
63 | assert.equal(this.formElement.querySelector('p').innerHTML, state.data[1].content);
64 | assert.equal(this.formElement.querySelectorAll('canvas').length, 2);
65 |
66 | var radioButtons = this.formElement.querySelectorAll('input[type=radio]');
67 | assert.equal(radioButtons[0].value, state.data[5].options[0].value);
68 | assert.equal(radioButtons[1].value, state.data[5].options[1].value);
69 | assert.equal(radioButtons[2].value, state.data[5].options[2].value);
70 |
71 | assert.equal(this.formElement.querySelector('input[type=checkbox]').value, state.data[6].options[0].value);
72 |
73 |
74 | });
75 |
76 | it('should validate required fields correctly', function() {
77 | assert.equal(this.generatedForm.validateForm().length, 2);
78 |
79 | var checkbox = this.formElement.querySelector('input[type=checkbox]');
80 | checkbox.checked = true;
81 |
82 | // Checking checkbox which is required.
83 | TestUtils.Simulate.change(checkbox, {"target": {"checked": true}});
84 | assert.equal(this.generatedForm.validateForm().length, 1);
85 |
86 | });
87 |
88 | });
--------------------------------------------------------------------------------
/test/slider-test.js:
--------------------------------------------------------------------------------
1 | // require('./dom-mock')('');
2 |
3 | // var jsdom = require('mocha-jsdom');
4 | // var assert = require('assert');
5 | // var React = require('react/addons');
6 | // var TestUtils = React.addons.TestUtils;
7 |
8 | // import SliderNativeBootstrap from 'react-bootstrap-native-slider';
9 |
10 | // describe('Testing ', function() {
11 |
12 | // //jsdom({ skipWindowCheck: true });
13 |
14 | // it('should be able to set the default value', function() {
15 | // var slider = TestUtils.renderIntoDocument(
16 | //
22 | // );
23 | // // var element = React.findDOMNode(slider);
24 | // console.log('hi');
25 | // //var starDiv = element.querySelector('.rating-stars');
26 |
27 | // //assert.equal(starDiv.style.width, '50%');
28 | // });
29 | // });
--------------------------------------------------------------------------------
/test/star-rating-test.js:
--------------------------------------------------------------------------------
1 | // require('./dom-mock')('');
2 |
3 | // var jsdom = require('mocha-jsdom');
4 | // var assert = require('assert');
5 | // var React = require('react/addons');
6 | // var TestUtils = React.addons.TestUtils;
7 |
8 | // import StarRating from 'react-star-rating';
9 |
10 | // describe('Testing StarRating', function() {
11 |
12 | // jsdom({ skipWindowCheck: true });
13 |
14 | // it('should be able to set the amount of stars based on a rating', function() {
15 | // var starRating = TestUtils.renderIntoDocument(
16 | //
17 | // );
18 | // var element = React.findDOMNode(starRating);
19 | // var starDiv = element.querySelector('.rating-stars');
20 | // var input = element.querySelector('input');
21 |
22 | // assert.equal(starDiv.style.width, '50%');
23 | // assert.equal(input.value, '2.5');
24 | // });
25 |
26 | // it('should be able to set default amount of stars to 0', function() {
27 | // var starRating = TestUtils.renderIntoDocument(
28 | //
29 | // );
30 | // var element = React.findDOMNode(starRating);
31 | // var starDiv = element.querySelector('.rating-stars');
32 |
33 | // assert.equal(starDiv.style.width, '0px');
34 | // });
35 | // });
--------------------------------------------------------------------------------
/test/toolbar-test.js:
--------------------------------------------------------------------------------
1 | require('./dom-mock')('');
2 |
3 | var jsdom = require('mocha-jsdom');
4 | var assert = require('assert');
5 | var React = require('react/addons');
6 | var Toolbar = require('../src/toolbar.jsx').default;
7 | var TestUtils = React.addons.TestUtils;
8 |
9 | describe('', function() {
10 |
11 | jsdom({ skipWindowCheck: true });
12 |
13 | before('render and locate element', function() {
14 | this.toolBar = TestUtils.renderIntoDocument(
15 |
16 | );
17 |
18 | this.inputElement = React.findDOMNode(this.toolBar);
19 | });
20 |
21 | it('should contain header', function() {
22 | var divText = TestUtils.findRenderedDOMComponentWithTag(this.toolBar, 'h4');
23 | assert.equal(divText.textContent, 'Toolbox');
24 | });
25 |
26 | it('should display default options when none are passed in', function() {
27 | assert.equal(this.inputElement.querySelector('ul').children.length, this.toolBar.state.items.length);
28 | });
29 |
30 | it('should display certain toolbar items that are passed in', function() {
31 | var items = [{
32 | key: 'Header',
33 | name: 'Header Text',
34 | icon: 'fa fa-header',
35 | static: true,
36 | content: 'Placeholder Text...'
37 | },
38 | {
39 | key: 'Paragraph',
40 | name: 'Paragraph',
41 | static: true,
42 | icon: 'fa fa-paragraph',
43 | content: 'Placeholder Text...'
44 | }];
45 |
46 | this.toolBar = TestUtils.renderIntoDocument(
47 |
48 | );
49 |
50 | this.inputElement = React.findDOMNode(this.toolBar);
51 |
52 | assert.equal(this.inputElement.querySelector('ul').children.length, items.length);
53 | })
54 | });
--------------------------------------------------------------------------------
/variables.js:
--------------------------------------------------------------------------------
1 | export const JOHN = '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'
2 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | entry: ["webpack/hot/dev-server", "./app.js"],
3 |
4 | output: {
5 | filename: "app.js",
6 | path: __dirname + "/build",
7 | },
8 |
9 | module: {
10 | loaders: [
11 | {
12 | test: /.jsx?$/,
13 | loader: 'babel-loader',
14 | exclude: /node_modules/,
15 | query: {
16 | presets: ['es2015', 'react']
17 | }
18 | },
19 | {
20 | test: /\.scss$/,
21 | loader: "style-loader!css-loader!sass-loader"
22 | }
23 | ]
24 | },
25 | resolve: {
26 | extensions: ['', '.js', '.json', '.jsx', '.css', '.scss']
27 | }
28 | }
--------------------------------------------------------------------------------
/webpack.production.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | entry: {
3 | app: ["./src/index.jsx"]
4 | },
5 |
6 | output: {
7 | path: __dirname + "/lib",
8 | filename: "app.js",
9 | library: 'ReactFormBuilder',
10 | libraryTarget: 'umd',
11 | },
12 |
13 | externals: {
14 | //don't bundle the 'react' npm package with our bundle.js
15 | //but get it from a global 'React' variable
16 | 'react': 'react',
17 | 'react-dom': 'react-dom',
18 | 'react-datepicker': 'react-datepicker',
19 | 'react/addons': 'react/addons',
20 | 'classnames': 'classnames',
21 | 'jquery': 'jquery',
22 | 'bootstrap': 'bootstrap'
23 | },
24 |
25 | module: {
26 | loaders: [
27 | {
28 | test: /.jsx?$/,
29 | loader: 'babel-loader',
30 | exclude: /node_modules/,
31 | query: {
32 | presets: ['es2015', 'react']
33 | }
34 | },
35 | {
36 | test: /\.scss$/,
37 | loader: "style-loader!css-loader!sass-loader"
38 | }
39 | ]
40 | },
41 | resolve: {
42 | extensions: ['', '.js', '.json', '.jsx', '.css', '.scss']
43 | }
44 | }
--------------------------------------------------------------------------------