formagic 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/CONTRIBUTING.md +24 -0
- data/Gemfile +3 -0
- data/LICENSE.md +21 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/app/assets/images/datedropper/done.png +0 -0
- data/app/assets/images/datedropper/done.svg +1 -0
- data/app/assets/images/datedropper/next.png +0 -0
- data/app/assets/images/datedropper/next.svg +1 -0
- data/app/assets/images/datedropper/prev.png +0 -0
- data/app/assets/images/datedropper/prev.svg +1 -0
- data/app/assets/javascripts/formagic/form.coffee +229 -0
- data/app/assets/javascripts/formagic/group.coffee +28 -0
- data/app/assets/javascripts/formagic/inputs/checkbox.coffee +83 -0
- data/app/assets/javascripts/formagic/inputs/color.coffee +55 -0
- data/app/assets/javascripts/formagic/inputs/date.coffee +69 -0
- data/app/assets/javascripts/formagic/inputs/datetime.coffee +130 -0
- data/app/assets/javascripts/formagic/inputs/document.coffee +0 -0
- data/app/assets/javascripts/formagic/inputs/documents.coffee +173 -0
- data/app/assets/javascripts/formagic/inputs/documents_reorder.coffee +67 -0
- data/app/assets/javascripts/formagic/inputs/file.coffee +114 -0
- data/app/assets/javascripts/formagic/inputs/hidden.coffee +57 -0
- data/app/assets/javascripts/formagic/inputs/html.coffee +81 -0
- data/app/assets/javascripts/formagic/inputs/image.coffee +28 -0
- data/app/assets/javascripts/formagic/inputs/list.coffee +154 -0
- data/app/assets/javascripts/formagic/inputs/list_reorder.coffee +39 -0
- data/app/assets/javascripts/formagic/inputs/list_typeahead.coffee +55 -0
- data/app/assets/javascripts/formagic/inputs/markdown.coffee +93 -0
- data/app/assets/javascripts/formagic/inputs/password.coffee +32 -0
- data/app/assets/javascripts/formagic/inputs/redactor.coffee +53 -0
- data/app/assets/javascripts/formagic/inputs/redactor_character.coffee +75 -0
- data/app/assets/javascripts/formagic/inputs/redactor_images.coffee +166 -0
- data/app/assets/javascripts/formagic/inputs/select.coffee +84 -0
- data/app/assets/javascripts/formagic/inputs/select2.coffee +33 -0
- data/app/assets/javascripts/formagic/inputs/string.coffee +160 -0
- data/app/assets/javascripts/formagic/inputs/text.coffee +43 -0
- data/app/assets/javascripts/formagic/inputs/time.coffee +0 -0
- data/app/assets/javascripts/formagic.coffee +22 -0
- data/app/assets/javascripts/vendor/ace.js +18280 -0
- data/app/assets/javascripts/vendor/datedropper.js +1005 -0
- data/app/assets/javascripts/vendor/jquery.scrollparent.js +14 -0
- data/app/assets/javascripts/vendor/jquery.textarea_autosize.js +55 -0
- data/app/assets/javascripts/vendor/jquery.typeahead.js +1782 -0
- data/app/assets/javascripts/vendor/marked.js +1272 -0
- data/app/assets/javascripts/vendor/mode-html.js +2436 -0
- data/app/assets/javascripts/vendor/mode-markdown.js +2820 -0
- data/app/assets/javascripts/vendor/moment.js +3083 -0
- data/app/assets/javascripts/vendor/redactor.fixedtoolbar.js +107 -0
- data/app/assets/javascripts/vendor/select2.js +5274 -0
- data/app/assets/stylesheets/formagic/checkbox.scss +8 -0
- data/app/assets/stylesheets/formagic/color.scss +12 -0
- data/app/assets/stylesheets/formagic/date.scss +37 -0
- data/app/assets/stylesheets/formagic/file.scss +29 -0
- data/app/assets/stylesheets/formagic/form.scss +36 -0
- data/app/assets/stylesheets/formagic/group.scss +22 -0
- data/app/assets/stylesheets/formagic/image.scss +19 -0
- data/app/assets/stylesheets/formagic/list.scss +39 -0
- data/app/assets/stylesheets/formagic/nested-form.scss +23 -0
- data/app/assets/stylesheets/formagic/redactor.scss +41 -0
- data/app/assets/stylesheets/formagic/select.scss +5 -0
- data/app/assets/stylesheets/formagic/select2.scss +95 -0
- data/app/assets/stylesheets/formagic/string.scss +14 -0
- data/app/assets/stylesheets/formagic/switch.scss +86 -0
- data/app/assets/stylesheets/formagic/text.scss +9 -0
- data/app/assets/stylesheets/formagic.scss +15 -0
- data/app/assets/stylesheets/vendor/datedropper.scss +523 -0
- data/app/assets/stylesheets/vendor/select2.scss +258 -0
- data/formagic.gemspec +30 -0
- data/lib/formagic/engine.rb +5 -0
- data/lib/formagic/version.rb +3 -0
- data/lib/formagic.rb +5 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eaeeb3489a798aafed4d51440ab9fb4d933f9f27
|
4
|
+
data.tar.gz: c0717929f3661809eeab159d8419b940d38eb5a4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e41c4ae09383eed7c534784e4b8896e7938a3171c11dad5adbf282783cdec2089c798b8b1ca2816ec73ede8aade18c1973a055fbaf4790297538badf695ada8f
|
7
|
+
data.tar.gz: 0d8465bdc12df5d3d1e9d0e39cf57c10881552519899e0a8589cbf9bc1fb75b90dc8c1f2cbba7915b699e79350695f5dd750d48a784718db6aadf182db338f9d
|
data/.gitignore
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
We love pull requests. Here’s a quick guide:
|
2
|
+
|
3
|
+
1. Fork the repository.
|
4
|
+
2. Make your changes in a topic branch.
|
5
|
+
3. Squash your commits into a single one (more on that [here](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)).
|
6
|
+
4. Rebase against `origin/master`, push to your fork and submit a pull request.
|
7
|
+
5. If you are writing a new feature please add documentation for it by making another pull request to the `gh-pages` branch.
|
8
|
+
|
9
|
+
At this point you’re waiting on us. We like to at least comment on, if not
|
10
|
+
accept, pull requests within three business days (and, typically, one business
|
11
|
+
day). We may suggest some changes or improvements or alternatives.
|
12
|
+
|
13
|
+
Some things that will increase the chance that your pull request is accepted:
|
14
|
+
|
15
|
+
* Fix a bug, refactor code or expand an existing feature.
|
16
|
+
* Use the right syntax and naming conventions.
|
17
|
+
* Update parts of the documentation that are affected by your contribution.
|
18
|
+
|
19
|
+
**Git Commit Messages**
|
20
|
+
|
21
|
+
* Capitalize your commit messages.
|
22
|
+
* Start your message with a verb.
|
23
|
+
* Use present tense.
|
24
|
+
* Refer to the issue/PR number in your squashed commit message.
|
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright © 2015 [Slate Studio, LLC](http://slatestudio.com)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the “Software”), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Formagic
|
2
|
+
|
3
|
+
*Easy to use javascript forms builder*
|
4
|
+
|
5
|
+
This library is heavily used by Character project and provides a very easy and convinient way to build and customize forms with javascript. This supposed to be working with Rails on the first place.
|
6
|
+
|
7
|
+
|
8
|
+
## Formagic Family:
|
9
|
+
|
10
|
+
- [Character](https://github.com/slate-studio/chr): Powerful responsive javascript CMS for apps
|
11
|
+
- [Mongosteen](https://github.com/slate-studio/mongosteen): An easy way to add RESTful actions for Mongoid models
|
12
|
+
- [Inverter](https://github.com/slate-studio/inverter): An easy way to connect Rails templates content to Character CMS
|
13
|
+
- [Loft](https://github.com/slate-studio/loft): Media assets manager for Character CMS
|
14
|
+
|
15
|
+
|
16
|
+
## License
|
17
|
+
|
18
|
+
Copyright © 2015 [Slate Studio, LLC](http://slatestudio.com). Formagic is free software, and may be redistributed under the terms specified in the [license](LICENSE.md).
|
19
|
+
|
20
|
+
|
21
|
+
## About Slate Studio
|
22
|
+
|
23
|
+
[![Slate Studio](https://slate-git-images.s3-us-west-1.amazonaws.com/slate.png)](http://slatestudio.com)
|
24
|
+
|
25
|
+
Formagic is maintained and funded by [Slate Studio, LLC](http://slatestudio.com). Tweet your questions or suggestions to [@slatestudio](https://twitter.com/slatestudio) and while you’re at it follow us too.
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 32 32" height="32px" id="Layer_1" version="1.1" viewBox="0 0 32 32" width="32px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M30.171,6.131l-0.858-0.858c-0.944-0.945-2.489-0.945-3.433,0L11.294,19.859l-5.175-5.174 c-0.943-0.944-2.489-0.944-3.432,0.001l-0.858,0.857c-0.943,0.944-0.943,2.489,0,3.433l7.744,7.75c0.944,0.945,2.489,0.945,3.433,0 L30.171,9.564C31.112,8.62,31.112,7.075,30.171,6.131z" fill="#f8f8f8"/></svg>
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 32 32" height="32px" id="Layer_1" version="1.1" viewBox="0 0 32 32" width="32px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M24.291,14.276L14.705,4.69c-0.878-0.878-2.317-0.878-3.195,0l-0.8,0.8c-0.878,0.877-0.878,2.316,0,3.194 L18.024,16l-7.315,7.315c-0.878,0.878-0.878,2.317,0,3.194l0.8,0.8c0.878,0.879,2.317,0.879,3.195,0l9.586-9.587 c0.472-0.471,0.682-1.103,0.647-1.723C24.973,15.38,24.763,14.748,24.291,14.276z" fill="#dddddd"/></svg>
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 32 32" height="32px" id="Layer_1" version="1.1" viewBox="0 0 32 32" width="32px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M7.701,14.276l9.586-9.585c0.879-0.878,2.317-0.878,3.195,0l0.801,0.8c0.878,0.877,0.878,2.316,0,3.194 L13.968,16l7.315,7.315c0.878,0.878,0.878,2.317,0,3.194l-0.801,0.8c-0.878,0.879-2.316,0.879-3.195,0l-9.586-9.587 C7.229,17.252,7.02,16.62,7.054,16C7.02,15.38,7.229,14.748,7.701,14.276z" fill="#dddddd"/></svg>
|
@@ -0,0 +1,229 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
# Author: Alexander Kravets <alex@slatestudio.com>,
|
3
|
+
# Slate Studio (http://www.slatestudio.com)
|
4
|
+
#
|
5
|
+
# Coding Guide:
|
6
|
+
# https://github.com/thoughtbot/guides/tree/master/style/coffeescript
|
7
|
+
# -----------------------------------------------------------------------------
|
8
|
+
|
9
|
+
# -----------------------------------------------------------------------------
|
10
|
+
# FORM
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
#
|
13
|
+
# Generates form based on provided configuration schema. If schema is not
|
14
|
+
# provided generates default form based on object keys. This uses Rails
|
15
|
+
# conventions for managing names for attributes, arrays, hashs and nested
|
16
|
+
# objects.
|
17
|
+
#
|
18
|
+
# -----------------------------------------------------------------------------
|
19
|
+
|
20
|
+
class @Form
|
21
|
+
constructor: (@object, @config) ->
|
22
|
+
@groups = []
|
23
|
+
@inputs = {}
|
24
|
+
@$el = $(@config.rootEl || "<form class='form'>")
|
25
|
+
@schema = @_get_schema()
|
26
|
+
@isRemoved = false
|
27
|
+
|
28
|
+
@_build_schema(@schema, @$el)
|
29
|
+
@_add_nested_form_remove_button()
|
30
|
+
|
31
|
+
|
32
|
+
# PRIVATE ===============================================
|
33
|
+
|
34
|
+
_get_schema: ->
|
35
|
+
schema = @config.formSchema
|
36
|
+
if @object
|
37
|
+
schema ?= @_generate_default_schema()
|
38
|
+
return schema
|
39
|
+
|
40
|
+
|
41
|
+
_generate_default_schema: ->
|
42
|
+
schema = {}
|
43
|
+
for key, value of @object
|
44
|
+
schema[key] = @_generate_default_input_config(key, value)
|
45
|
+
return schema
|
46
|
+
|
47
|
+
|
48
|
+
_generate_default_input_config: (fieldName, value) ->
|
49
|
+
config = {}
|
50
|
+
|
51
|
+
if fieldName[0] == '_'
|
52
|
+
config.type = 'hidden'
|
53
|
+
|
54
|
+
else if value in [ true, false ]
|
55
|
+
config.type = 'checkbox'
|
56
|
+
|
57
|
+
else if value
|
58
|
+
|
59
|
+
if value.hasOwnProperty('url')
|
60
|
+
config.type = 'file'
|
61
|
+
|
62
|
+
else if value.length > 60
|
63
|
+
config.type = 'text'
|
64
|
+
|
65
|
+
return config
|
66
|
+
|
67
|
+
|
68
|
+
# INPUTS ================================================
|
69
|
+
|
70
|
+
_build_schema: (schema, $el) ->
|
71
|
+
for fieldName, config of schema
|
72
|
+
config.fieldName = fieldName
|
73
|
+
|
74
|
+
if config.type == 'group'
|
75
|
+
group = @_generate_inputs_group(fieldName, config)
|
76
|
+
$el.append group.$el
|
77
|
+
|
78
|
+
else
|
79
|
+
input = @_generate_input(fieldName, config)
|
80
|
+
$el.append input.$el
|
81
|
+
|
82
|
+
|
83
|
+
_generate_inputs_group: (klassName, groupConfig) ->
|
84
|
+
$group =$ """<div class='group #{ klassName }' />"""
|
85
|
+
|
86
|
+
if groupConfig.inputs
|
87
|
+
@_build_schema(groupConfig.inputs, $group)
|
88
|
+
|
89
|
+
group = { $el: $group, klassName: klassName, onInitialize: groupConfig.onInitialize }
|
90
|
+
@groups.push group
|
91
|
+
|
92
|
+
return group
|
93
|
+
|
94
|
+
|
95
|
+
_generate_input: (fieldName, inputConfig) ->
|
96
|
+
if @object
|
97
|
+
value = @object[fieldName]
|
98
|
+
|
99
|
+
else
|
100
|
+
value = inputConfig.default
|
101
|
+
|
102
|
+
value ?= ''
|
103
|
+
|
104
|
+
inputName = inputConfig.name || fieldName
|
105
|
+
input = @_render_input(inputName, inputConfig, value)
|
106
|
+
@inputs[fieldName] = input
|
107
|
+
|
108
|
+
return input
|
109
|
+
|
110
|
+
|
111
|
+
_render_input: (name, config, value) ->
|
112
|
+
inputConfig = $.extend {}, config
|
113
|
+
|
114
|
+
inputConfig.label ?= name.titleize()
|
115
|
+
inputConfig.type ?= 'string'
|
116
|
+
inputConfig.klass ?= 'stacked'
|
117
|
+
inputConfig.klassName = name
|
118
|
+
|
119
|
+
inputClass = chr.formInputs[inputConfig.type]
|
120
|
+
inputClass ?= chr.formInputs['string']
|
121
|
+
|
122
|
+
inputName = if @config.namePrefix then "#{ @config.namePrefix }[#{ name }]" else "[#{ name }]"
|
123
|
+
|
124
|
+
# add prefix for nested form inputs
|
125
|
+
if inputConfig.type == 'form' || inputConfig.type == 'documents'
|
126
|
+
inputConfig.namePrefix = inputName.replace("[#{ name }]", "[#{ name }_attributes]")
|
127
|
+
|
128
|
+
else
|
129
|
+
inputConfig.namePrefix = @config.namePrefix
|
130
|
+
|
131
|
+
return new inputClass(inputName, value, inputConfig, @object)
|
132
|
+
|
133
|
+
|
134
|
+
# NESTED ================================================
|
135
|
+
|
136
|
+
_add_nested_form_remove_button: ->
|
137
|
+
if @config.removeButton
|
138
|
+
# add hidden input to the form
|
139
|
+
fieldName = '_destroy'
|
140
|
+
input = @_render_input(fieldName, { type: 'hidden' }, false)
|
141
|
+
@inputs[fieldName] = input
|
142
|
+
@$el.append input.$el
|
143
|
+
# remove button
|
144
|
+
@$removeButton =$ """<a href='#' class='nested-form-delete'>Delete</a>"""
|
145
|
+
@$el.append @$removeButton
|
146
|
+
@$removeButton.on 'click', (e) =>
|
147
|
+
e.preventDefault()
|
148
|
+
if confirm('Are you sure?')
|
149
|
+
input.updateValue('true')
|
150
|
+
@$el.hide()
|
151
|
+
@isRemoved = true
|
152
|
+
@config.onRemove?(this)
|
153
|
+
|
154
|
+
|
155
|
+
_forms: ->
|
156
|
+
forms = [ @ ]
|
157
|
+
addNestedForms = (form) ->
|
158
|
+
for name, input of form.inputs
|
159
|
+
if input.config.type == 'form' || input.config.type == 'documents'
|
160
|
+
forms = forms.concat(input.forms)
|
161
|
+
addNestedForms(form) for form in input.forms
|
162
|
+
addNestedForms(@)
|
163
|
+
|
164
|
+
return forms
|
165
|
+
|
166
|
+
|
167
|
+
# PUBLIC ================================================
|
168
|
+
|
169
|
+
destroy: ->
|
170
|
+
group.destroy?() for group in @groups
|
171
|
+
input.destroy?() for name, input of @inputs
|
172
|
+
@$el.remove()
|
173
|
+
|
174
|
+
|
175
|
+
serialize: (obj={}) ->
|
176
|
+
# serialize everything except file inputs
|
177
|
+
obj[input.name] = input.value for input in @$el.serializeArray()
|
178
|
+
|
179
|
+
for form in @_forms()
|
180
|
+
# serialize file inputs for all forms (including nested)
|
181
|
+
for name, input of form.inputs
|
182
|
+
if input.config.type == 'file' or input.config.type == 'image'
|
183
|
+
file = input.$input.get()[0].files[0]
|
184
|
+
obj["__FILE__#{ input.name }"] = file
|
185
|
+
if input.isEmpty() then obj[input.removeName()] = 'true'
|
186
|
+
|
187
|
+
# remove fields with ignoreOnSubmission
|
188
|
+
for name, input of form.inputs
|
189
|
+
if input.config.ignoreOnSubmission
|
190
|
+
delete obj[name]
|
191
|
+
|
192
|
+
return obj
|
193
|
+
|
194
|
+
|
195
|
+
hash: (hash={}) ->
|
196
|
+
for name, input of @inputs
|
197
|
+
input.hash(hash)
|
198
|
+
return hash
|
199
|
+
|
200
|
+
|
201
|
+
initializePlugins: ->
|
202
|
+
for group in @groups
|
203
|
+
group.onInitialize?(@, group)
|
204
|
+
|
205
|
+
for name, input of @inputs
|
206
|
+
input.initialize()
|
207
|
+
|
208
|
+
|
209
|
+
showValidationErrors: (errors) ->
|
210
|
+
@hideValidationErrors()
|
211
|
+
for inputName, messages of errors
|
212
|
+
input = @inputs[inputName]
|
213
|
+
firstMessage = messages[0]
|
214
|
+
input.showErrorMessage(firstMessage)
|
215
|
+
|
216
|
+
|
217
|
+
hideValidationErrors: ->
|
218
|
+
for inputName, input of @inputs
|
219
|
+
input.hideErrorMessage()
|
220
|
+
|
221
|
+
|
222
|
+
updateValues: (object) ->
|
223
|
+
for name, value of object
|
224
|
+
if @inputs[name]
|
225
|
+
@inputs[name].updateValue(value, object)
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
# Author: Alexander Kravets <alex@slatestudio.com>,
|
3
|
+
# Slate Studio (http://www.slatestudio.com)
|
4
|
+
#
|
5
|
+
# Coding Guide:
|
6
|
+
# https://github.com/thoughtbot/guides/tree/master/style/coffeescript
|
7
|
+
# -----------------------------------------------------------------------------
|
8
|
+
|
9
|
+
# -----------------------------------------------------------------------------
|
10
|
+
# EXPANDABLE GROUP
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
#
|
13
|
+
# Usage: onInitialize: (form, group) -> new ExpandableGroup(form, group, 'Details')
|
14
|
+
#
|
15
|
+
# -----------------------------------------------------------------------------
|
16
|
+
|
17
|
+
class @ExpandableGroup
|
18
|
+
constructor: (@form, @group, name) ->
|
19
|
+
@$expander =$ """<a href='#' class='group-edit hidden'>#{ name }</a>"""
|
20
|
+
@group.$el.before @$expander
|
21
|
+
|
22
|
+
@$expander.on 'click', (e) =>
|
23
|
+
@$expander.toggleClass('hidden')
|
24
|
+
e.preventDefault()
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
# Author: Alexander Kravets <alex@slatestudio.com>,
|
3
|
+
# Slate Studio (http://www.slatestudio.com)
|
4
|
+
#
|
5
|
+
# Coding Guide:
|
6
|
+
# https://github.com/thoughtbot/guides/tree/master/style/coffeescript
|
7
|
+
# -----------------------------------------------------------------------------
|
8
|
+
|
9
|
+
# -----------------------------------------------------------------------------
|
10
|
+
# INPUT CHECKBOX
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
class @InputCheckbox extends InputString
|
13
|
+
constructor: (@name, @value, @config, @object) ->
|
14
|
+
@_create_el()
|
15
|
+
@_add_input()
|
16
|
+
@_add_label()
|
17
|
+
|
18
|
+
return this
|
19
|
+
|
20
|
+
|
21
|
+
# PRIVATE ===============================================
|
22
|
+
|
23
|
+
_create_el: ->
|
24
|
+
@$el =$ "<label for='#{ @name }' class='input-#{ @config.type } input-#{ @config.klass } input-#{ @config.klassName }'>"
|
25
|
+
|
26
|
+
|
27
|
+
_safe_value: ->
|
28
|
+
if not @value or @value == 'false' or @value == 0 or @value == '0'
|
29
|
+
return false
|
30
|
+
else
|
31
|
+
return true
|
32
|
+
|
33
|
+
|
34
|
+
_add_input: ->
|
35
|
+
# for boolean checkbox to be serialized correctly we need a hidden false
|
36
|
+
# value which is used by default and overriden by checked value
|
37
|
+
@$false_hidden_input =$ "<input type='hidden' name='#{ @name }' value='false' />"
|
38
|
+
@$el.append @$false_hidden_input
|
39
|
+
|
40
|
+
@$input =$ "<input type='checkbox' id='#{ @name }' name='#{ @name }' value='true' #{ if @_safe_value() then 'checked' else '' } />"
|
41
|
+
@$el.append @$input
|
42
|
+
|
43
|
+
|
44
|
+
# PUBLIC ================================================
|
45
|
+
|
46
|
+
updateValue: (@value) ->
|
47
|
+
@$input.prop('checked', @_safe_value())
|
48
|
+
|
49
|
+
|
50
|
+
hash: (hash={}) ->
|
51
|
+
hash[@config.klassName] = @$input.prop('checked')
|
52
|
+
return hash
|
53
|
+
|
54
|
+
|
55
|
+
chr.formInputs['checkbox'] = InputCheckbox
|
56
|
+
|
57
|
+
|
58
|
+
# -----------------------------------------------------------------------------
|
59
|
+
# INPUT CHECKBOX SWITCH
|
60
|
+
# -----------------------------------------------------------------------------
|
61
|
+
class @InputCheckboxSwitch extends InputCheckbox
|
62
|
+
|
63
|
+
# PRIVATE ===============================================
|
64
|
+
|
65
|
+
_add_input: ->
|
66
|
+
@$switch =$ "<div class='switch'>"
|
67
|
+
@$el.append @$switch
|
68
|
+
|
69
|
+
@$false_hidden_input =$ "<input type='hidden' name='#{ @name }' value='false' />"
|
70
|
+
@$switch.append @$false_hidden_input
|
71
|
+
|
72
|
+
@$input =$ "<input type='checkbox' id='#{ @name }' name='#{ @name }' value='true' #{ if @_safe_value() then 'checked' else '' } />"
|
73
|
+
@$switch.append @$input
|
74
|
+
|
75
|
+
@$checkbox =$ "<div class='checkbox'>"
|
76
|
+
@$switch.append @$checkbox
|
77
|
+
|
78
|
+
|
79
|
+
chr.formInputs['switch'] = InputCheckboxSwitch
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
# Author: Alexander Kravets <alex@slatestudio.com>,
|
3
|
+
# Slate Studio (http://www.slatestudio.com)
|
4
|
+
#
|
5
|
+
# Coding Guide:
|
6
|
+
# https://github.com/thoughtbot/guides/tree/master/style/coffeescript
|
7
|
+
# -----------------------------------------------------------------------------
|
8
|
+
|
9
|
+
# -----------------------------------------------------------------------------
|
10
|
+
# INPUT COLOR
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
class @InputColor extends InputString
|
13
|
+
|
14
|
+
# PRIVATE ===============================================
|
15
|
+
|
16
|
+
_add_color_preview: ->
|
17
|
+
@$colorPreview =$ "<div class='preview'>"
|
18
|
+
@$el.append @$colorPreview
|
19
|
+
|
20
|
+
|
21
|
+
_update_color_preview: ->
|
22
|
+
@$colorPreview.css { 'background-color': "##{ @$input.val() }" }
|
23
|
+
|
24
|
+
|
25
|
+
_validate_input_value: ->
|
26
|
+
if (/^(?:[0-9a-f]{3}){1,2}$/i).test(@$input.val())
|
27
|
+
@hideErrorMessage()
|
28
|
+
else
|
29
|
+
@showErrorMessage('Invalid hex value')
|
30
|
+
|
31
|
+
|
32
|
+
# PUBLIC ================================================
|
33
|
+
|
34
|
+
initialize: ->
|
35
|
+
@config.beforeInitialize?(this)
|
36
|
+
|
37
|
+
@$input.attr('placeholder', @config.placeholder || 'e.g. #eee')
|
38
|
+
|
39
|
+
@_add_color_preview()
|
40
|
+
@_update_color_preview()
|
41
|
+
|
42
|
+
@$input.on 'change keyup', (e) =>
|
43
|
+
@hideErrorMessage()
|
44
|
+
@_validate_input_value()
|
45
|
+
@_update_color_preview()
|
46
|
+
|
47
|
+
@config.onInitialize?(this)
|
48
|
+
|
49
|
+
|
50
|
+
chr.formInputs['color'] = InputColor
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
# Author: Alexander Kravets <alex@slatestudio.com>,
|
3
|
+
# Slate Studio (http://www.slatestudio.com)
|
4
|
+
#
|
5
|
+
# Coding Guide:
|
6
|
+
# https://github.com/thoughtbot/guides/tree/master/style/coffeescript
|
7
|
+
# -----------------------------------------------------------------------------
|
8
|
+
|
9
|
+
# -----------------------------------------------------------------------------
|
10
|
+
# INPUT DATE
|
11
|
+
# -----------------------------------------------------------------------------
|
12
|
+
#
|
13
|
+
# Dependencies:
|
14
|
+
#= require vendor/datedropper
|
15
|
+
#= require vendor/moment
|
16
|
+
#
|
17
|
+
# -----------------------------------------------------------------------------
|
18
|
+
class @InputDate extends InputString
|
19
|
+
|
20
|
+
# PRIVATE ===============================================
|
21
|
+
|
22
|
+
_update_date_label: ->
|
23
|
+
date = @$input.val()
|
24
|
+
date_formatted = moment(date).format("dddd, MMMM Do, YYYY")
|
25
|
+
@$dateLabel.html(date_formatted)
|
26
|
+
|
27
|
+
|
28
|
+
_add_input: ->
|
29
|
+
@$input =$ "<input type='text' name='#{ @name }' value='#{ @_safe_value() }' class='input-datetime-date' />"
|
30
|
+
@$el.append @$input
|
31
|
+
@$input.on 'change', (e) => @_update_date_label()
|
32
|
+
|
33
|
+
@$dateLabel =$ "<div class='input-date-label'>"
|
34
|
+
@$el.append @$dateLabel
|
35
|
+
@$dateLabel.on 'click', (e) => @$input.trigger 'click'
|
36
|
+
|
37
|
+
@_update_date_label()
|
38
|
+
|
39
|
+
|
40
|
+
# PUBLIC ================================================
|
41
|
+
|
42
|
+
initialize: ->
|
43
|
+
@config.beforeInitialize?(this)
|
44
|
+
|
45
|
+
# http://felicegattuso.com/projects/datedropper/
|
46
|
+
@config.pluginConfig ?= {}
|
47
|
+
|
48
|
+
config =
|
49
|
+
animation: 'fadein'
|
50
|
+
format: 'Y-m-d'
|
51
|
+
|
52
|
+
$.extend(config, @config.pluginConfig)
|
53
|
+
|
54
|
+
@$input.dateDropper(config)
|
55
|
+
|
56
|
+
@config.onInitialize?(this)
|
57
|
+
|
58
|
+
|
59
|
+
updateValue: (@value) ->
|
60
|
+
@$input.val(@value)
|
61
|
+
# @TODO: check if required, cause change event might be triggered
|
62
|
+
#@_update_date_label()
|
63
|
+
|
64
|
+
|
65
|
+
chr.formInputs['date'] = InputDate
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
|