pinkman 0.9.4.9 → 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/pinkman.js +3 -1
- data/app/assets/javascripts/pinkman_base/collection.coffee +18 -0
- data/app/assets/javascripts/pinkman_base/controller.coffee +16 -2
- data/app/assets/javascripts/pinkman_base/pinkman.coffee +6 -3
- data/app/assets/javascripts/pinkman_base/router.coffee +224 -0
- data/app/assets/javascripts/pinkman_base/state.coffee +44 -0
- data/lib/pinkman/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 392c59fb9a8c75861fe6db48458e3f3e90602f39
|
4
|
+
data.tar.gz: b3a4795dcb9b432ded4711a2c8cf0721c067d751
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 422b15670036ea2bcc3a1e91caca10f3fc6dad2f81ec5ae3170a70a6d50fdf8a3f94bb6b158e9c4cbc70a7b28cec7c7501ab192ddeb31690321c4dcefb118ae0
|
7
|
+
data.tar.gz: 6e19c387fc2268f263bb66ca946a1ccb3f09e8ffe4245dded1eb7b290b7b4af3d3764d0233e1e1d4dddc5afe9a8a215753d1f4d753a8501badd18f1fcfdd5140
|
@@ -6,5 +6,7 @@
|
|
6
6
|
//= require pinkman_base/collection
|
7
7
|
//= require pinkman_base/render
|
8
8
|
//= require pinkman_base/controller
|
9
|
+
//= require pinkman_base/state
|
10
|
+
//= require pinkman_base/router
|
9
11
|
//= require pinkman_base/css
|
10
|
-
|
12
|
+
//= require pinkman_base/cable
|
@@ -175,6 +175,20 @@ class window.PinkmanCollection extends window.PinkmanCommon
|
|
175
175
|
else
|
176
176
|
false
|
177
177
|
|
178
|
+
|
179
|
+
firstOrInitialize: (args...) ->
|
180
|
+
collection = @select(args...)
|
181
|
+
if collection.any()
|
182
|
+
collection.first()
|
183
|
+
else
|
184
|
+
@forceNew(args...)
|
185
|
+
|
186
|
+
forceNew: (args...)->
|
187
|
+
obj = new (@config.memberClass)
|
188
|
+
obj.initialize(args...)
|
189
|
+
@push(obj)
|
190
|
+
obj
|
191
|
+
|
178
192
|
first: (n=1) ->
|
179
193
|
if n==1
|
180
194
|
return @collection[0]
|
@@ -193,6 +207,10 @@ class window.PinkmanCollection extends window.PinkmanCommon
|
|
193
207
|
@select(criteria).count() > 0
|
194
208
|
else
|
195
209
|
@count() > 0
|
210
|
+
|
211
|
+
# Desc: exact opposite of any. Return trues if not a single members is found.
|
212
|
+
empty: (args...) ->
|
213
|
+
!@any(args...)
|
196
214
|
|
197
215
|
# Desc: return the first object that matches
|
198
216
|
getBy: (attribute, value,callback) ->
|
@@ -24,11 +24,25 @@ class window.PinkmanController extends window.PinkmanObject
|
|
24
24
|
selector: ->
|
25
25
|
'#' + @id
|
26
26
|
|
27
|
+
setParams: (params) ->
|
28
|
+
query = location.search.substring(1);
|
29
|
+
if query? and query!=''
|
30
|
+
@params = JSON.parse('{"' + decodeURI(query).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
|
31
|
+
else
|
32
|
+
@params = new Object
|
33
|
+
|
34
|
+
(@params[k] = v) for k,v of params if params? and typeof params == 'object'
|
35
|
+
@params
|
36
|
+
|
37
|
+
title: (title) ->
|
38
|
+
$('title').html(title) if Pinkman.isString(title)
|
39
|
+
|
27
40
|
# build a controller from user definition
|
28
|
-
|
41
|
+
# main: boolean argument that forces main function be executed
|
42
|
+
build: (main) ->
|
29
43
|
if @builder? and typeof @builder == 'function'
|
30
44
|
@builder(this)
|
31
|
-
@main() if @main? and $("##{@id}").length and typeof @main == 'function'
|
45
|
+
@main() if @main? and (main or ($("##{@id}").length and typeof @main == 'function'))
|
32
46
|
return(true)
|
33
47
|
else
|
34
48
|
return(false)
|
@@ -123,8 +123,11 @@ class window.Pinkman
|
|
123
123
|
AppCollection.scope
|
124
124
|
else if typeof obj == 'object' and obj.pinkmanType == 'object' and AppObject? and AppObject.scope?
|
125
125
|
AppObject.scope
|
126
|
-
|
127
|
-
|
126
|
+
|
127
|
+
# ready: same as jquery document ready
|
128
|
+
@ready: (callback) ->
|
129
|
+
$(document).ready(callback)
|
130
|
+
|
128
131
|
# --- Ajax
|
129
132
|
|
130
133
|
@ajax:
|
@@ -203,7 +206,7 @@ class window.Pinkman
|
|
203
206
|
upload: (options...) ->
|
204
207
|
@file(options...)
|
205
208
|
|
206
|
-
|
209
|
+
Pinkman.ready ->
|
207
210
|
unless Pinkman.pathname?
|
208
211
|
Pinkman.pathname = window.location.pathname
|
209
212
|
Pinkman.pathname = Pinkman.pathname + '/' if Pinkman.pathname.charAt([Pinkman.pathname.length] - 1) != "/"
|
@@ -0,0 +1,224 @@
|
|
1
|
+
class window.PinkmanPath extends Pinkman.object
|
2
|
+
|
3
|
+
constructor: (url) ->
|
4
|
+
@levels = new Pinkman.collection
|
5
|
+
@static = new Pinkman.collection
|
6
|
+
@dynamic = new Pinkman.collection
|
7
|
+
@params = new Object
|
8
|
+
super()
|
9
|
+
if Pinkman.isString(url)
|
10
|
+
url = url.replace(window.location.origin,'') if PinkmanPath.isInternal(url)
|
11
|
+
a = url.split('/')
|
12
|
+
a.shift() if a[0] == ''
|
13
|
+
a.pop() if a[a.length-1] == ''
|
14
|
+
i = 0
|
15
|
+
for l in a
|
16
|
+
i = i + 1
|
17
|
+
obj = new Pinkman.object({entry: l, index: i})
|
18
|
+
if /:/.test(l[0])
|
19
|
+
obj.set('dynamic',yes)
|
20
|
+
obj.set('static',no)
|
21
|
+
@dynamic.push(obj)
|
22
|
+
else
|
23
|
+
obj.set('dynamic',no)
|
24
|
+
obj.set('static',yes)
|
25
|
+
@static.push(obj)
|
26
|
+
@levels.push(obj)
|
27
|
+
|
28
|
+
@set('depth',i)
|
29
|
+
|
30
|
+
|
31
|
+
@isExternal: (url) ->
|
32
|
+
urlRegex = new RegExp('^(?:[a-z]+:)?//', 'i')
|
33
|
+
hostRegex = new RegExp(window.location.origin,'i')
|
34
|
+
urlRegex.test(url) and not hostRegex.test(url)
|
35
|
+
|
36
|
+
@isInternal: (url) ->
|
37
|
+
not @isExternal(url)
|
38
|
+
|
39
|
+
level: (index) ->
|
40
|
+
@levels.getBy('index',index)
|
41
|
+
|
42
|
+
match: (path) ->
|
43
|
+
path = new PinkmanPath(path) if Pinkman.isString(path)
|
44
|
+
if PinkmanPath.isInstance(path) and path.depth == @depth
|
45
|
+
match = true
|
46
|
+
@static.each (level) ->
|
47
|
+
match = false if level.entry != path.level(level.index).entry
|
48
|
+
if match
|
49
|
+
@dynamic.each (level) ->
|
50
|
+
path.params[level.entry.replace(/:/g,"")] = path.level(level.index).entry
|
51
|
+
return(match)
|
52
|
+
else
|
53
|
+
false
|
54
|
+
|
55
|
+
|
56
|
+
# receives a string and matches it through the defined routes
|
57
|
+
class window.PinkmanRouteMatcher extends Pinkman.object
|
58
|
+
|
59
|
+
initialize: ->
|
60
|
+
if @controllers.any()?
|
61
|
+
@controllers.each (c) =>
|
62
|
+
c.setParams(@params())
|
63
|
+
c.build(yes)
|
64
|
+
else
|
65
|
+
false
|
66
|
+
|
67
|
+
match: (url) ->
|
68
|
+
path = new PinkmanPath(url)
|
69
|
+
if path?
|
70
|
+
candidates = Pinkman.routes.select(depth: path.depth)
|
71
|
+
routes = candidates.select (candidate) ->
|
72
|
+
candidate.path.match(path)
|
73
|
+
route = routes.first()
|
74
|
+
|
75
|
+
if route?
|
76
|
+
@set('url',url)
|
77
|
+
@set('path',path)
|
78
|
+
@set 'route', route
|
79
|
+
@set 'controller', @route.controller
|
80
|
+
@set('controllers', Pinkman.controllers.select(id: @controller))
|
81
|
+
if @controllers.any()
|
82
|
+
return(this)
|
83
|
+
else
|
84
|
+
throw "(Pinkman Route) Controller '#{@route.controller}' not found."
|
85
|
+
else
|
86
|
+
return(false)
|
87
|
+
|
88
|
+
params: ->
|
89
|
+
# console.log @path
|
90
|
+
# console.log @path.params
|
91
|
+
@path.params if @path and @path.params?
|
92
|
+
|
93
|
+
|
94
|
+
# every route defined turn into a object of this class: PinkmanRoute
|
95
|
+
class window.PinkmanRoute extends Pinkman.object
|
96
|
+
yieldIn: ->
|
97
|
+
@yield || @container
|
98
|
+
|
99
|
+
|
100
|
+
# Routes collection. Have the capability to search a string through routes and storage all defined routes. Used once in Pinkman.routes
|
101
|
+
class window.PinkmanRoutes extends Pinkman.collection
|
102
|
+
config:
|
103
|
+
className: 'PinkmanRoutes'
|
104
|
+
memberClass: ->
|
105
|
+
return (new PinkmanRoute)
|
106
|
+
|
107
|
+
match: (url) ->
|
108
|
+
matcher = new PinkmanRouteMatcher
|
109
|
+
return(matcher.match(url))
|
110
|
+
# global variable to store routes
|
111
|
+
Pinkman.routes = new PinkmanRoutes
|
112
|
+
|
113
|
+
# Main class: define routes throughout the application
|
114
|
+
class window.PinkmanRouter
|
115
|
+
|
116
|
+
# Sets the global container of the application.
|
117
|
+
# Everything will be yield inside this container. This container is just simple valid(present) selector that will serve as a wrapper for things to be dynamically rendered in.
|
118
|
+
@config: (value) ->
|
119
|
+
$(document).ready =>
|
120
|
+
if value? and typeof value == 'object' and value.yield?
|
121
|
+
@_config = value
|
122
|
+
throw 'PinkmanRouter Config: yield must be a valid(present) selector' if $(@_config.yield).length == 0
|
123
|
+
else
|
124
|
+
throw '(Pinkman Router) Config argument must be a object and must have yield attribute.'
|
125
|
+
|
126
|
+
# This function is responsible for defining our app routes
|
127
|
+
# It is manipulated by the final user
|
128
|
+
@define: (routes) ->
|
129
|
+
router = new PinkmanRouter
|
130
|
+
routes(router) if typeof routes == 'function'
|
131
|
+
return(router)
|
132
|
+
|
133
|
+
|
134
|
+
# Search path throughout routes. On match, activate respective controllers: clears template and execute main(s) function(s)
|
135
|
+
@activate: (path,callback) ->
|
136
|
+
r = Pinkman.routes.match(path)
|
137
|
+
if r? and r
|
138
|
+
Pinkman.state.initialize()
|
139
|
+
yieldIn = r.route.yieldIn() || @_config.yield
|
140
|
+
$(yieldIn).html("<div class='pink-yield' id='#{r.controller}'></div>") if r.route.blank
|
141
|
+
r.initialize()
|
142
|
+
callback() if typeof callback == 'function'
|
143
|
+
true
|
144
|
+
else
|
145
|
+
false
|
146
|
+
|
147
|
+
# Goes to a path
|
148
|
+
@visit: (path) ->
|
149
|
+
@activate path, ->
|
150
|
+
Pinkman.state.push(path)
|
151
|
+
|
152
|
+
@force: (path) ->
|
153
|
+
(window.location=path) unless @visit(path)
|
154
|
+
|
155
|
+
@restore: (path) ->
|
156
|
+
(window.location=path) unless @activate(path)
|
157
|
+
|
158
|
+
@redirect: (args...) ->
|
159
|
+
@force(args...)
|
160
|
+
|
161
|
+
@redirectTo: (args...) ->
|
162
|
+
@force(args...)
|
163
|
+
|
164
|
+
@go: (args...) ->
|
165
|
+
@force(args...)
|
166
|
+
|
167
|
+
@start: ->
|
168
|
+
Pinkman.ready =>
|
169
|
+
Pinkman.router = this
|
170
|
+
@activate(window.location.pathname)
|
171
|
+
$('body').on 'click', 'a', (ev) =>
|
172
|
+
ev.preventDefault()
|
173
|
+
path = ev.currentTarget.href
|
174
|
+
(window.location = path) unless path? and @visit(path)
|
175
|
+
|
176
|
+
# namespace: (path, rules) ->
|
177
|
+
|
178
|
+
get: (path, object) ->
|
179
|
+
if Pinkman.isString(path)
|
180
|
+
p = new PinkmanPath(path)
|
181
|
+
route = new PinkmanRoute
|
182
|
+
route.set('id',path)
|
183
|
+
route.set('url',path)
|
184
|
+
route.set('path',p).set('depth',p.depth)
|
185
|
+
route.set('blank',yes)
|
186
|
+
route.set('controller', if object? and object.controller? then object.controller else p.level(1).entry)
|
187
|
+
if object? and typeof object == 'object'
|
188
|
+
route.set('blank',no) if (object.keep? and object.keep) or (object.blank? and not object.blank)
|
189
|
+
route.set('yield',object.container|| object.yield )
|
190
|
+
Pinkman.routes.push(route)
|
191
|
+
return(route)
|
192
|
+
|
193
|
+
root: (controller) ->
|
194
|
+
@get('/',controller: controller)
|
195
|
+
|
196
|
+
# motivation
|
197
|
+
# class window.AppRouter extends PinkmanRouter
|
198
|
+
#
|
199
|
+
# AppRouter.config yield: 'body'
|
200
|
+
#
|
201
|
+
# AppRouter.define (r) ->
|
202
|
+
#
|
203
|
+
# # @namespace 'lol', =>
|
204
|
+
# # @get 'test'
|
205
|
+
# # # define /lol/test
|
206
|
+
# #
|
207
|
+
# #
|
208
|
+
# # @get 'produto/:id',
|
209
|
+
# # controller: 'produto'
|
210
|
+
# # #define /produto/qualquer-coisa
|
211
|
+
# # # controler.param.id = 'qualquer-coisa'
|
212
|
+
# #
|
213
|
+
#
|
214
|
+
#
|
215
|
+
# @get 'test',
|
216
|
+
# controller: 'test'
|
217
|
+
#
|
218
|
+
# ->
|
219
|
+
# header
|
220
|
+
# title Lol
|
221
|
+
# body#test
|
222
|
+
# execute 'controller.test.main'
|
223
|
+
#
|
224
|
+
# AppRouter.visit 'test'
|
@@ -0,0 +1,44 @@
|
|
1
|
+
class window.PinkmanStates extends Pinkman.collection
|
2
|
+
config:
|
3
|
+
className: 'PinkmanStates'
|
4
|
+
memberClass: ->
|
5
|
+
return (new PinkmanState)
|
6
|
+
|
7
|
+
Pinkman.states = new PinkmanStates
|
8
|
+
|
9
|
+
class window.PinkmanState extends Pinkman.object
|
10
|
+
config:
|
11
|
+
className: 'PinkmanState'
|
12
|
+
|
13
|
+
|
14
|
+
@initialize: ->
|
15
|
+
if Pinkman.states.empty() and window? and history? and history.replaceState?
|
16
|
+
state = Pinkman.states.forceNew(path: window.location.pathname)
|
17
|
+
history.replaceState({pinkey: state.pinkey}, "", state.path)
|
18
|
+
|
19
|
+
@push: (path) ->
|
20
|
+
if Pinkman.isString(path)
|
21
|
+
path = @normalizePath(path)
|
22
|
+
state = Pinkman.states.forceNew(path: path)
|
23
|
+
history.pushState({ pinkey: state.pinkey }, "", path) if window? and history? and history.pushState?
|
24
|
+
|
25
|
+
@normalizePath: (path) ->
|
26
|
+
path = path.replace(window.location.origin, '')
|
27
|
+
if path[0] == '/' then (window.location.origin + path) else (window.location.origin + '/' + path)
|
28
|
+
|
29
|
+
@restore: (event) ->
|
30
|
+
if typeof event == 'object' and event.state? and event.state.pinkey?
|
31
|
+
state = Pinkman.states.firstOrInitialize(pinkey: event.state.pinkey)
|
32
|
+
unless state.path?
|
33
|
+
state.set('path',window.location.pathname)
|
34
|
+
state.restore()
|
35
|
+
|
36
|
+
restore: ->
|
37
|
+
Pinkman.router.restore(@path)
|
38
|
+
|
39
|
+
Pinkman.state = PinkmanState
|
40
|
+
#
|
41
|
+
$(document).ready ->
|
42
|
+
if window? and history?
|
43
|
+
window.onpopstate = (event) ->
|
44
|
+
Pinkman.state.restore(event)
|
data/lib/pinkman/version.rb
CHANGED
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.
|
4
|
+
version: 0.9.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Agilso Oliveira
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -192,6 +192,8 @@ files:
|
|
192
192
|
- app/assets/javascripts/pinkman_base/object.js.coffee.erb
|
193
193
|
- app/assets/javascripts/pinkman_base/pinkman.coffee
|
194
194
|
- app/assets/javascripts/pinkman_base/render.coffee.erb
|
195
|
+
- app/assets/javascripts/pinkman_base/router.coffee
|
196
|
+
- app/assets/javascripts/pinkman_base/state.coffee
|
195
197
|
- app/assets/javascripts/pinkman_base/tools.coffee
|
196
198
|
- app/assets/javascripts/pinkman_with_handlebars.js
|
197
199
|
- app/assets/javascripts/pinkman_with_hogan.js
|