formagic 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](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
|
+
|