pinkman 0.9.9.9.0 → 0.9.9.9.1
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 +4 -4
- data/app/assets/javascripts/pinkman_base/controller.coffee +108 -2
- data/app/assets/javascripts/pinkman_base/router.coffee +40 -23
- data/app/assets/javascripts/pinkman_base/state.coffee +2 -2
- data/app/views/pinkman/pinkman/_form_input.html.slim +1 -1
- data/app/views/pinkman/pinkman/_form_select.html.slim +1 -1
- data/lib/pinkman/form_helper/form_helpers.rb +22 -29
- data/lib/pinkman/version.rb +1 -1
- data/lib/pinkman/views_helpers/form_helper.rb +5 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a881ee79d0d66ed3ebc8f82b1b5d596ef5d373a5215a446bcf6e72166f81a8c0
|
|
4
|
+
data.tar.gz: b47389d23b0a46031a0404f12d0dfd94a43cd630d3d2c99af179e25d89d6a66e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 432dd76d2feaf437c60e2c636948442c429a2294d9794d2ce5bfcb89f6b5e614611104319a5ea0e40a87c1c2a64baaf2c98de182dc610834fff96a0fd5ab02ee
|
|
7
|
+
data.tar.gz: c6210ddc7fa530694879c6d9e50ef3eabad31f118393b8e1415d1029fdee8a592d40c6cf35c23ab93acb53e11d953854fc56c9cc901771040c9f3bdab819ceae
|
|
@@ -159,6 +159,112 @@ class window.PinkmanController extends window.PinkmanObject
|
|
|
159
159
|
callback(obj,$j,args...) if callback? and typeof callback == 'function'
|
|
160
160
|
# else
|
|
161
161
|
# console.log 'mesmo valor'
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# === Autocomplete ===
|
|
165
|
+
|
|
166
|
+
# -- Usage: autocomplete(input_name,options)
|
|
167
|
+
|
|
168
|
+
# -- Overview
|
|
169
|
+
# 1: User types something
|
|
170
|
+
# 2: Pinkman searchs through a collection and then renders the result
|
|
171
|
+
# 3: User selects a record
|
|
172
|
+
# 4: Pinkman sends the selected record to callback function
|
|
173
|
+
|
|
174
|
+
# -- Parameters & Options
|
|
175
|
+
# @autocomplete(attribute,options)
|
|
176
|
+
# options:
|
|
177
|
+
# with: [collection]
|
|
178
|
+
# pinkman collection responsible for filtering/searching the results
|
|
179
|
+
|
|
180
|
+
# method: [search|yourCustomMethod]
|
|
181
|
+
# Search is the default. Anythings that filters by a 'query'.
|
|
182
|
+
# You can define a yourCustomMethod inside the collection model like this:
|
|
183
|
+
# yourCustomMethod: (user_query, callback) ->
|
|
184
|
+
# -- perform a selection based on user_query
|
|
185
|
+
# callback(this) if $p.isFunction(callback)
|
|
186
|
+
|
|
187
|
+
# template: [template-id] (optional)
|
|
188
|
+
# Any template that has a 'select-attribute' action
|
|
189
|
+
# If you don't specify a template, Pinkman will try "attribute-autocomplete-template" by default
|
|
190
|
+
|
|
191
|
+
# target: [target-id]
|
|
192
|
+
# Where pinkman should yield results
|
|
193
|
+
# If you don't specify a target, Pinkman will try "attribute-autocomplete" by default
|
|
194
|
+
|
|
195
|
+
# loading: loading function
|
|
196
|
+
# Run something before searching (you can use it for some loading animation)
|
|
197
|
+
|
|
198
|
+
# call: callback function.
|
|
199
|
+
# What to do when user selects something?
|
|
200
|
+
autocomplete: (attr_name, options) ->
|
|
201
|
+
# error handling / verifing args
|
|
202
|
+
throw 'Pinkman Autocomplete: Missing options object' unless $p.isObject(options)
|
|
203
|
+
throw 'Pinkman Autocomplete: Missing "with" collection' unless options.with?
|
|
204
|
+
throw 'Pinkman Autocomplete: Missing "call" callback function' unless $p.isFunction(options.call)
|
|
205
|
+
|
|
206
|
+
# variables // user options // default options
|
|
207
|
+
collection = options.with
|
|
208
|
+
callback = options.call
|
|
209
|
+
template = if options.template? then options.template else "#{attr_name}-autocomplete"
|
|
210
|
+
target = if options.target? then options.target else "#{attr_name}-autocomplete"
|
|
211
|
+
method = if options.method? then options.method else 'search'
|
|
212
|
+
loading = options.loading if $p.isFunction(options.loading)
|
|
213
|
+
autoHide = if options.autoHide? then options.autoHide else yes
|
|
214
|
+
autoWidth = if options.autoWidth? then options.autoWidth else yes
|
|
215
|
+
wait = if options.wait? then options.wait else 0.75
|
|
216
|
+
waitTimerName = "#{attr_name}AutocompleteTimer"
|
|
217
|
+
|
|
218
|
+
# hide initially
|
|
219
|
+
$("##{target}").hide() if autoHide
|
|
220
|
+
|
|
221
|
+
# resize autocomplete
|
|
222
|
+
if autoWidth
|
|
223
|
+
$(window).resize ->
|
|
224
|
+
$("##{target}").width($("input[name='#{attr_name}']").innerWidth() - ($("##{target}").innerWidth() - $("##{target}").width()))
|
|
225
|
+
|
|
226
|
+
# responding to user typing
|
|
227
|
+
@bind attr_name, (obj,j) ->
|
|
228
|
+
|
|
229
|
+
# loading
|
|
230
|
+
loading(obj,j,attr_name) if loading?
|
|
231
|
+
|
|
232
|
+
# removes autocompleted Class
|
|
233
|
+
j.removeClass('autocompleted')
|
|
234
|
+
|
|
235
|
+
# wait until user finish typing
|
|
236
|
+
clearTimeout(window[waitTimerName]) if window[waitTimerName]?
|
|
237
|
+
window[waitTimerName] = $p.sleep wait, =>
|
|
238
|
+
|
|
239
|
+
# calls the filter method (search)
|
|
240
|
+
collection[method] obj[attr_name], (collection) ->
|
|
241
|
+
|
|
242
|
+
# render results
|
|
243
|
+
collection.render
|
|
244
|
+
template: template
|
|
245
|
+
target: target
|
|
246
|
+
callback: ->
|
|
247
|
+
# Hide or show autocomplete
|
|
248
|
+
if autoHide
|
|
249
|
+
if obj[attr_name]? and obj[attr_name] != ''
|
|
250
|
+
$("##{target}").fadeIn()
|
|
251
|
+
else
|
|
252
|
+
$("##{target}").fadeOut()
|
|
253
|
+
|
|
254
|
+
# Set the autocomplete target width to same as the input
|
|
255
|
+
if autoWidth
|
|
256
|
+
$("##{target}").width($("input[name='#{attr_name}']").innerWidth() - ($("##{target}").innerWidth() - $("##{target}").width()))
|
|
257
|
+
|
|
258
|
+
# user chooses something and click
|
|
259
|
+
@action "select-#{attr_name}", 'click', (args...) =>
|
|
260
|
+
# console.log "#{@selector()} input[action='#{attr_name}']"
|
|
261
|
+
$input = $("#{@selector()} input[data-action='#{attr_name}']")
|
|
262
|
+
$input.addClass('autocompleted')
|
|
263
|
+
obj = Pinkman.get($input.data('pinkey'))
|
|
264
|
+
$("##{target}").fadeOut() if autoHide
|
|
265
|
+
callback(obj,$input,args...)
|
|
266
|
+
|
|
267
|
+
|
|
162
268
|
|
|
163
269
|
bottom: (callback) ->
|
|
164
270
|
if $("##{@id}").length
|
|
@@ -172,7 +278,7 @@ class window.PinkmanController extends window.PinkmanObject
|
|
|
172
278
|
Pinkman._lastEndOfPage = t
|
|
173
279
|
callback()
|
|
174
280
|
, 50
|
|
175
|
-
|
|
281
|
+
|
|
176
282
|
endBottom: () ->
|
|
177
283
|
Pinkman._bottomTriggered = false
|
|
178
284
|
|
|
@@ -190,7 +296,7 @@ class window.PinkmanController extends window.PinkmanObject
|
|
|
190
296
|
|
|
191
297
|
scrolling: (callback) ->
|
|
192
298
|
if $("##{@id}").length
|
|
193
|
-
$(window).scroll ->
|
|
299
|
+
$("window,.pink-yield").scroll ->
|
|
194
300
|
unless Pinkman._stopScroll
|
|
195
301
|
Pinkman._stopScroll = yes
|
|
196
302
|
callback(window.scrollY)
|
|
@@ -33,7 +33,12 @@ class window.PinkmanPath extends Pinkman.object
|
|
|
33
33
|
@set('staticDepth',s)
|
|
34
34
|
@set('dynamicDepth',d)
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
@depth: (url) ->
|
|
37
|
+
a = url.split('/')
|
|
38
|
+
a.shift() if a[0] == ''
|
|
39
|
+
a.pop() if a[a.length-1] == ''
|
|
40
|
+
a.length
|
|
41
|
+
|
|
37
42
|
@isExternal: (url) ->
|
|
38
43
|
urlRegex = new RegExp('^(?:[a-z]+:)?//', 'i')
|
|
39
44
|
hostRegex = new RegExp(window.location.origin,'i')
|
|
@@ -54,13 +59,13 @@ class window.PinkmanPath extends Pinkman.object
|
|
|
54
59
|
match = true
|
|
55
60
|
@static.each (level) ->
|
|
56
61
|
match = false if level.entry != path.level(level.index).entry
|
|
57
|
-
if match
|
|
58
|
-
@dynamic.each (level) ->
|
|
59
|
-
path.params[level.entry.replace(/:/g,"")] = path.level(level.index).entry
|
|
60
62
|
return(match)
|
|
61
63
|
else
|
|
62
64
|
false
|
|
63
|
-
|
|
65
|
+
|
|
66
|
+
matchParams: (path) ->
|
|
67
|
+
@dynamic.each (level) ->
|
|
68
|
+
path.params[level.entry.replace(/:/g,"")] = path.level(level.index).entry
|
|
64
69
|
|
|
65
70
|
deduceControllerName: ->
|
|
66
71
|
@static.extract('entry').join('-').replace(/[\/_]/g,'-').replace(/^-/,'')
|
|
@@ -86,24 +91,35 @@ class window.PinkmanRouteMatcher extends Pinkman.object
|
|
|
86
91
|
$(@yieldIn).html("<div class='pink-yield' id='#{@controller}'></div>") if @yieldIn and @route.blank
|
|
87
92
|
|
|
88
93
|
match: (url) ->
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
candidates = Pinkman.routes.select(depth: path.depth)
|
|
92
|
-
routes = candidates.select (candidate) ->
|
|
93
|
-
candidate.path.match(path)
|
|
94
|
-
route = routes.sortBy('staticDepth','desc').first()
|
|
94
|
+
if url?
|
|
95
|
+
route = @findRouteFor(url)
|
|
95
96
|
if route?
|
|
96
|
-
@
|
|
97
|
-
@set('path',path)
|
|
98
|
-
@set 'route', route
|
|
99
|
-
@set 'controller', @route.controller
|
|
100
|
-
@set('controllers', Pinkman.controllers.select(id: @controller))
|
|
101
|
-
if @controllers.any()
|
|
102
|
-
return(this)
|
|
103
|
-
else
|
|
104
|
-
throw "(Pinkman Route) Controller '#{@route.controller}' not found."
|
|
97
|
+
return(@setup(route,url))
|
|
105
98
|
else
|
|
106
|
-
return(false)
|
|
99
|
+
return(false)
|
|
100
|
+
|
|
101
|
+
findRouteFor: (url) ->
|
|
102
|
+
url = url.replace(window.location.origin,'') if PinkmanPath.isInternal(url)
|
|
103
|
+
return Pinkman.routes
|
|
104
|
+
.select(depth: PinkmanPath.depth(url))
|
|
105
|
+
.select((candidate) -> candidate.path.match(url))
|
|
106
|
+
.sortBy('staticDepth','desc').first()
|
|
107
|
+
|
|
108
|
+
setup: (route,url) ->
|
|
109
|
+
if route? and url?
|
|
110
|
+
urlPath = new PinkmanPath(url)
|
|
111
|
+
route.path.matchParams(urlPath)
|
|
112
|
+
@set('url',url)
|
|
113
|
+
@set('path',urlPath)
|
|
114
|
+
@set 'route', route
|
|
115
|
+
@set 'controller', @route.controller
|
|
116
|
+
@set('controllers', Pinkman.controllers.select(id: @controller))
|
|
117
|
+
if @controllers.any()
|
|
118
|
+
return(this)
|
|
119
|
+
else
|
|
120
|
+
throw "(Pinkman Route) Controller '#{@route.controller}' not found."
|
|
121
|
+
else
|
|
122
|
+
return(false)
|
|
107
123
|
|
|
108
124
|
params: ->
|
|
109
125
|
# console.log @path
|
|
@@ -230,6 +246,7 @@ class window.PinkmanRouter
|
|
|
230
246
|
@activate: (path,callback,options) ->
|
|
231
247
|
r = Pinkman.routes.match(path)
|
|
232
248
|
if r? and r
|
|
249
|
+
# console.log r
|
|
233
250
|
r.options = options
|
|
234
251
|
if @_config.transition? and typeof @_config.transition == 'function'
|
|
235
252
|
@_config.transition =>
|
|
@@ -274,10 +291,10 @@ class window.PinkmanRouter
|
|
|
274
291
|
App.router = this
|
|
275
292
|
window.$r = App.router
|
|
276
293
|
@activate(window.location.pathname)
|
|
277
|
-
$('body').on 'click', 'a:not([data-pinkman="false"])', (ev) =>
|
|
294
|
+
$('body').on 'click', 'a:not([data-pinkman="false"],[target="blank"],[target="_blank"])', (ev) =>
|
|
278
295
|
ev.preventDefault()
|
|
279
296
|
path = ev.currentTarget.href
|
|
280
|
-
(
|
|
297
|
+
@location(path) unless path? and @visit(path)
|
|
281
298
|
|
|
282
299
|
namespace: (namespace, rules) ->
|
|
283
300
|
namespace = namespace.replace(/^\//,'')
|
|
@@ -13,8 +13,8 @@ class window.PinkmanState extends Pinkman.object
|
|
|
13
13
|
|
|
14
14
|
@initialize: ->
|
|
15
15
|
if Pinkman.states.empty() and window? and history? and history.replaceState?
|
|
16
|
-
state = Pinkman.states.forceNew(path: window.location.
|
|
17
|
-
history.replaceState({pinkey: state.pinkey}, "", state.path)
|
|
16
|
+
state = Pinkman.states.forceNew(path: window.location.href.replace(window.location.origin,''))
|
|
17
|
+
# history.replaceState({pinkey: state.pinkey}, "", state.path)
|
|
18
18
|
|
|
19
19
|
@push: (path) ->
|
|
20
20
|
if Pinkman.isString(path)
|
|
@@ -9,55 +9,48 @@ module Pinkman
|
|
|
9
9
|
|
|
10
10
|
include Pinkman::ViewsHelpers::FormHelper
|
|
11
11
|
|
|
12
|
-
define_helper :string do |attr_name,label=nil|
|
|
13
|
-
label
|
|
14
|
-
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name}}
|
|
12
|
+
define_helper :string do |attr_name,label=nil,html_attributes={}|
|
|
13
|
+
p.input_helper attr_name, label, html_attributes.merge(type: 'text')
|
|
15
14
|
end
|
|
16
15
|
|
|
17
|
-
define_helper :text do |attr_name,label=nil|
|
|
16
|
+
define_helper :text do |attr_name,label=nil,html_attributes={}|
|
|
18
17
|
label ||= attr_name.titleize
|
|
19
|
-
render partial: 'pinkman/pinkman/form_textarea', locals: {attr_name: attr_name, label: label, textarea_options: {name: attr_name}}
|
|
18
|
+
render partial: 'pinkman/pinkman/form_textarea', locals: {attr_name: attr_name, label: label, textarea_options: {name: attr_name}.merge(html_attributes) }
|
|
20
19
|
end
|
|
21
20
|
|
|
22
|
-
define_helper :date do |attr_name,label=nil|
|
|
23
|
-
label
|
|
24
|
-
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name, type: 'date'}}
|
|
21
|
+
define_helper :date do |attr_name,label=nil,html_attributes={}|
|
|
22
|
+
p.input_helper attr_name, label, html_attributes.merge(type: 'date')
|
|
25
23
|
end
|
|
26
24
|
|
|
27
|
-
define_helper :datetime do |attr_name,label=nil|
|
|
28
|
-
label
|
|
29
|
-
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name}, type: 'time'}
|
|
25
|
+
define_helper :datetime do |attr_name,label=nil,html_attributes={}|
|
|
26
|
+
p.input_helper attr_name, label, html_attributes.merge(type: 'time')
|
|
30
27
|
end
|
|
31
28
|
|
|
32
|
-
define_helper :color do |attr_name,label=nil|
|
|
33
|
-
label
|
|
34
|
-
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name}}
|
|
29
|
+
define_helper :color do |attr_name,label=nil,html_attributes={}|
|
|
30
|
+
p.input_helper attr_name, label, html_attributes
|
|
35
31
|
end
|
|
36
32
|
|
|
37
|
-
define_helper :select do |attr_name,label,options_hash,
|
|
38
|
-
if
|
|
39
|
-
placeholder =
|
|
40
|
-
obligatory =
|
|
41
|
-
|
|
33
|
+
define_helper :select do |attr_name,label,options_hash,html_attributes={}|
|
|
34
|
+
if html_attributes.has_key?(:placeholder)
|
|
35
|
+
placeholder = html_attributes[:placeholder]
|
|
36
|
+
obligatory = html_attributes[:obligatory]
|
|
37
|
+
html_attributes.delete(:placeholder)
|
|
42
38
|
end
|
|
43
39
|
obligatory = true if obligatory.nil?
|
|
44
40
|
label ||= attr_name.titleize
|
|
45
|
-
render partial: 'pinkman/pinkman/form_select', locals: {attr_name: attr_name, label: label, options_hash: options_hash,
|
|
41
|
+
render partial: 'pinkman/pinkman/form_select', locals: {attr_name: attr_name, label: label, options_hash: options_hash, html_attributes: html_attributes, placeholder: placeholder, obligatory: obligatory}
|
|
46
42
|
end
|
|
47
43
|
|
|
48
|
-
define_helper :password do |attr_name,label=nil|
|
|
49
|
-
label
|
|
50
|
-
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name, type: 'password'}}
|
|
44
|
+
define_helper :password do |attr_name,label=nil,html_attributes={}|
|
|
45
|
+
p.input_helper attr_name, label, html_attributes.merge(type: 'password')
|
|
51
46
|
end
|
|
52
47
|
|
|
53
|
-
define_helper :number do |attr_name,label=nil|
|
|
54
|
-
label
|
|
55
|
-
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name, type: 'number'}}
|
|
48
|
+
define_helper :number do |attr_name,label=nil,html_attributes={}|
|
|
49
|
+
p.input_helper attr_name, label, html_attributes.merge(type: 'number')
|
|
56
50
|
end
|
|
57
51
|
|
|
58
|
-
define_helper :money do |attr_name,label=nil|
|
|
59
|
-
label
|
|
60
|
-
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name, type: 'number', min: 0, step: 0.01}}
|
|
52
|
+
define_helper :money do |attr_name,label=nil,html_attributes={}|
|
|
53
|
+
p.input_helper attr_name, label, html_attributes.merge(type: 'number', min: '0', step: '0.01')
|
|
61
54
|
end
|
|
62
55
|
|
|
63
56
|
end
|
data/lib/pinkman/version.rb
CHANGED
|
@@ -6,6 +6,11 @@ module Pinkman
|
|
|
6
6
|
|
|
7
7
|
extend Pinkman::BaseHelper
|
|
8
8
|
|
|
9
|
+
define_helper :input_helper do |attr_name,label=nil,html_attributes={}|
|
|
10
|
+
label ||= attr_name.titleize
|
|
11
|
+
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, html_attributes: html_attributes.merge(name: attr_name)}
|
|
12
|
+
end
|
|
13
|
+
|
|
9
14
|
define_helper :textfield do |attr_name,label=nil|
|
|
10
15
|
label ||= attr_name.titleize
|
|
11
16
|
render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, input_options: {name: attr_name}}
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pinkman
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.9.9.
|
|
4
|
+
version: 0.9.9.9.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Agilso Oliveira
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-03-
|
|
11
|
+
date: 2018-03-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|