abstracted 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -3
- data/Gemfile.lock +12 -10
- data/app/assets/javascripts/abstract_resources.js +0 -1
- data/app/assets/javascripts/abstracted/app.fab_delete.coffee +3 -26
- data/app/assets/javascripts/abstracted/app.materialize.coffee +15 -1
- data/app/assets/javascripts/abstracted/app.page_scrolling.coffee +143 -0
- data/app/assets/javascripts/abstracted/app.resource_form.coffee +0 -7
- data/app/assets/javascripts/abstracted/app.resources_list.coffee +7 -4
- data/app/assets/javascripts/abstracted/app.shared.coffee +3 -0
- data/app/assets/javascripts/init.js.coffee +58 -18
- data/app/assets/javascripts/triggers.coffee +9 -21
- data/app/assets/stylesheets/abstract_resources.css +1 -0
- data/app/assets/stylesheets/balloon.min.css +1 -0
- data/app/controllers/abstract_resources_controller.rb +22 -20
- data/app/helpers/abstract_resources_helper.rb +2 -2
- data/app/models/abstract_resource.rb +29 -28
- data/app/views/abstract_resources/index.html.haml +32 -14
- data/app/views/abstract_resources/show.html.haml +3 -2
- data/lib/abstracted/version.rb +1 -1
- data/lib/exceptions.rb +2 -0
- data/spec/controllers/abstract_resources_controller_spec.rb +316 -176
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +8801 -0
- data/spec/policies/abstract_resources_policy.rb +83 -0
- data/spec/rails_helper.rb +92 -1
- data/spec/spec_helper.rb +2 -0
- metadata +6 -3
- data/app/assets/javascripts/pagescrolling.js.coffee +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bb946be423371961e8d08aeb8322b863a94b07f
|
4
|
+
data.tar.gz: 225bbee0f0f7cc8703670d17f6de1ba02d8692e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7c3791294abecbea359ef6a9286d2b1cd98798979aa05c5d4c005de178757ca57f39e1208afbf3a60891f69fb5c74b98f11027c4aa60bb359f969e8c60466c3
|
7
|
+
data.tar.gz: ba5b34ee89bc44fc856cea2f961cf5aac00afff73bd647a2479a891672c52a48ff1faddcc44a5b300f43d5d236c6eec14567c616a4d0cf266aefebc09ca20d9d
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
abstracted (0.
|
4
|
+
abstracted (0.3.3)
|
5
5
|
kaminari
|
6
6
|
pundit
|
7
7
|
rails (~> 4.1)
|
@@ -60,6 +60,7 @@ GEM
|
|
60
60
|
activesupport (>= 3.0.0)
|
61
61
|
railties (>= 3.0.0)
|
62
62
|
thor (>= 0.14.6)
|
63
|
+
concurrent-ruby (1.0.0)
|
63
64
|
database_cleaner (1.4.1)
|
64
65
|
diff-lcs (1.2.5)
|
65
66
|
erubis (2.7.0)
|
@@ -120,7 +121,7 @@ GEM
|
|
120
121
|
pry-remote (0.1.8)
|
121
122
|
pry (~> 0.9)
|
122
123
|
slop (~> 3.0)
|
123
|
-
pundit (1.0
|
124
|
+
pundit (1.1.0)
|
124
125
|
activesupport (>= 3.0.0)
|
125
126
|
rack (1.6.0)
|
126
127
|
rack-test (0.6.3)
|
@@ -153,8 +154,8 @@ GEM
|
|
153
154
|
rb-fsevent (0.9.4)
|
154
155
|
rb-inotify (0.9.5)
|
155
156
|
ffi (>= 0.5.0)
|
156
|
-
responders (2.1.
|
157
|
-
railties (>= 4.2.0, < 5)
|
157
|
+
responders (2.1.1)
|
158
|
+
railties (>= 4.2.0, < 5.1)
|
158
159
|
rspec (3.2.0)
|
159
160
|
rspec-core (~> 3.2.0)
|
160
161
|
rspec-expectations (~> 3.2.0)
|
@@ -181,12 +182,13 @@ GEM
|
|
181
182
|
rspec-support (3.2.2)
|
182
183
|
shellany (0.0.1)
|
183
184
|
slop (3.6.0)
|
184
|
-
sprockets (3.2
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
185
|
+
sprockets (3.5.2)
|
186
|
+
concurrent-ruby (~> 1.0)
|
187
|
+
rack (> 1, < 3)
|
188
|
+
sprockets-rails (3.0.0)
|
189
|
+
actionpack (>= 4.0)
|
190
|
+
activesupport (>= 4.0)
|
191
|
+
sprockets (>= 3.0.0)
|
190
192
|
sqlite3 (1.3.10)
|
191
193
|
terminal-notifier (1.6.2)
|
192
194
|
thor (0.19.1)
|
@@ -2,7 +2,7 @@ class App.fabDelete
|
|
2
2
|
|
3
3
|
constructor: (@el) ->
|
4
4
|
# initialize some stuff
|
5
|
-
|
5
|
+
|
6
6
|
#
|
7
7
|
# deletePost handles deleting records
|
8
8
|
#
|
@@ -29,30 +29,6 @@ class App.fabDelete
|
|
29
29
|
|
30
30
|
catch error
|
31
31
|
swal "Hmmm", "Most unexpected! \n#{error}", "error"
|
32
|
-
#
|
33
|
-
# statusCode:
|
34
|
-
#
|
35
|
-
# 200: (response,textStatus,jqXHR) ->
|
36
|
-
# closeSweetAlert()
|
37
|
-
# tellResponse response.responseText
|
38
|
-
#
|
39
|
-
#
|
40
|
-
# 301: () ->
|
41
|
-
# $elem.show()
|
42
|
-
# closeSweetAlert()
|
43
|
-
# swal "Ikke slettet!", "Posten blev ikke slettet - årsagen ikke kendt", "warning"
|
44
|
-
#
|
45
|
-
# 401: (response) ->
|
46
|
-
# tellResponse response.responseText
|
47
|
-
# closeSweetAlert()
|
48
|
-
#
|
49
|
-
# 409: (response) ->
|
50
|
-
# tellResponse response.responseText
|
51
|
-
# closeSweetAlert()
|
52
|
-
#
|
53
|
-
# 412: () ->
|
54
|
-
# closeSweetAlert()
|
55
|
-
# swal "Øv!", "Et eller andet gik galt!", "error"
|
56
32
|
|
57
33
|
|
58
34
|
|
@@ -63,6 +39,7 @@ class App.fabDelete
|
|
63
39
|
handleFABLinks: (e) =>
|
64
40
|
e.preventDefault()
|
65
41
|
e.stopPropagation()
|
42
|
+
|
66
43
|
elem = $(e.currentTarget)
|
67
44
|
if elem.data('browser')=='new'
|
68
45
|
window.open elem.data('url')
|
@@ -121,7 +98,7 @@ class App.fabDelete
|
|
121
98
|
confirmButtonColor: "#ec6c62",
|
122
99
|
(confirmed) =>
|
123
100
|
if !confirmed
|
124
|
-
|
101
|
+
App.shared.closeSweetAlert($elem)
|
125
102
|
else
|
126
103
|
@deletePost($elem)
|
127
104
|
return false
|
@@ -2,7 +2,7 @@ class App.Materialize
|
|
2
2
|
constructor: (@el) ->
|
3
3
|
# initialize some stuff
|
4
4
|
|
5
|
-
prepare:
|
5
|
+
prepare: =>
|
6
6
|
|
7
7
|
try
|
8
8
|
#
|
@@ -21,12 +21,26 @@ class App.Materialize
|
|
21
21
|
#
|
22
22
|
$(".dropdown-button").dropdown()
|
23
23
|
|
24
|
+
#
|
25
|
+
# watch out for tooltipped
|
26
|
+
|
27
|
+
#
|
28
|
+
$('.tooltipped').tooltip({delay: 50})
|
29
|
+
|
24
30
|
#
|
25
31
|
# prepare for tabbed display of tabbed UL's
|
26
32
|
#
|
27
33
|
$('ul.tabs').tabs()
|
28
34
|
$('.materialboxed').materialbox()
|
29
35
|
|
36
|
+
#
|
37
|
+
# Initialize SELECT's
|
38
|
+
#
|
39
|
+
$('select').each () ->
|
40
|
+
# remove span.caret's from previous 'runs' - however that happens
|
41
|
+
$(this).parent().parent().find('span.caret').remove()
|
42
|
+
$(this).material_select()
|
43
|
+
|
30
44
|
catch error
|
31
45
|
alert 'App.Materialize did not prepare!'
|
32
46
|
console.log error
|
@@ -0,0 +1,143 @@
|
|
1
|
+
class App.PageScrolling
|
2
|
+
|
3
|
+
constructor: () ->
|
4
|
+
# initialize some stuff
|
5
|
+
@table=null
|
6
|
+
@loadingPage = false
|
7
|
+
# currentPage = 0
|
8
|
+
# totalPages = 0
|
9
|
+
@navPaginator = ''
|
10
|
+
@lastPage = 0
|
11
|
+
@nextPage = 0
|
12
|
+
@pageUrl = ''
|
13
|
+
@contxt = null
|
14
|
+
@scrollTimeout = false
|
15
|
+
@_me = 0
|
16
|
+
|
17
|
+
spinWhileLoading: () =>
|
18
|
+
if @loadingPage
|
19
|
+
App.shared.releaseLoader()
|
20
|
+
@loadingPage=false
|
21
|
+
else
|
22
|
+
loader = '<div class="preloader-wrapper small active"> <div class="spinner-layer spinner-blue-only"> <div class="circle-clipper left"> <div class="circle"></div> </div><div class="gap-patch"> <div class="circle"></div> </div><div class="circle-clipper right"> <div class="circle"></div> </div> </div> </div>'
|
23
|
+
loaded_element = $('.fixed-action-btn')
|
24
|
+
App.shared.setLoader( loaded_element,loader )
|
25
|
+
@loadingPage=true
|
26
|
+
|
27
|
+
evalPageNumber: (elem) =>
|
28
|
+
if elem
|
29
|
+
try
|
30
|
+
pn = elem[0].href
|
31
|
+
.split('?')[1]
|
32
|
+
.split('&')
|
33
|
+
.filter (el,i,array) ->
|
34
|
+
if el.match /^page/
|
35
|
+
return el
|
36
|
+
.join('')
|
37
|
+
.split('=')[1]
|
38
|
+
parseInt(pn)
|
39
|
+
catch error
|
40
|
+
pn = 0
|
41
|
+
|
42
|
+
#
|
43
|
+
# setVariables prepares for a great scrolling experience
|
44
|
+
#
|
45
|
+
setVariables: (elem) =>
|
46
|
+
return if $('nav.pagination').size() < 1
|
47
|
+
@navPaginator = $('nav.pagination')
|
48
|
+
try
|
49
|
+
@pageUrl = @navPaginator.find('a[rel=next]')[0].href.replace( '?', '.js?scrolling=true&')
|
50
|
+
@lastPage = @evalPageNumber @navPaginator.find('span.last a')
|
51
|
+
@nextPage = @evalPageNumber @navPaginator.find('a[rel=next]')
|
52
|
+
@contxt = $(elem)
|
53
|
+
if @nextPage > 1
|
54
|
+
@nextPage = 1
|
55
|
+
true
|
56
|
+
|
57
|
+
catch error
|
58
|
+
console.log error
|
59
|
+
return false
|
60
|
+
|
61
|
+
#
|
62
|
+
# setPaginationHandler prepares to handle all clicks on
|
63
|
+
# the nav.pagination links
|
64
|
+
#
|
65
|
+
# setPaginationHandler: () =>
|
66
|
+
# $(document.body).on 'click.pagination', '.first > a, .previous > a, .page > a, .next > a, .last > a', (e) =>
|
67
|
+
# @paginate(e)
|
68
|
+
#
|
69
|
+
# paginate: (e) =>
|
70
|
+
# e.preventDefault()
|
71
|
+
# e.stopPropagation()
|
72
|
+
# @nextPage = e.currentTarget.href.match(/page=(\d*)&/)[1]
|
73
|
+
# wurl = window.location.href.replace /#!$/, ''
|
74
|
+
# if !@pageUrl.split("?")[0].split(".js")[0].match wurl.split("?")[0]
|
75
|
+
# clearTimeout( @scrollTimeout )
|
76
|
+
# return false
|
77
|
+
# clearTimeout( @scrollTimeout )
|
78
|
+
# @loadNextPage @pageUrl.replace( /page=\d*&/, 'page=' + @nextPage + '&'), true
|
79
|
+
|
80
|
+
|
81
|
+
#
|
82
|
+
# closeToBottom checks to see if you're close to the bottom of the screen
|
83
|
+
#
|
84
|
+
closeToBottom: () =>
|
85
|
+
return false if @navPaginator.size() == 0
|
86
|
+
return ($(window).scrollTop() - parseInt($(document).height()) + parseInt($(window).height())) > -200
|
87
|
+
|
88
|
+
findNextPageToLoad: () =>
|
89
|
+
@nextPage += 1
|
90
|
+
if @nextPage > @lastPage
|
91
|
+
clearTimeout( @scrollTimeout )
|
92
|
+
return false
|
93
|
+
wurl = window.location.href.replace /#!$/, ''
|
94
|
+
if !@pageUrl.split("?")[0].split(".js")[0].match wurl.split("?")[0]
|
95
|
+
clearTimeout( @scrollTimeout )
|
96
|
+
return false
|
97
|
+
@pageUrl
|
98
|
+
.replace /page=\d*&/, 'page=' + @nextPage + '&'
|
99
|
+
|
100
|
+
|
101
|
+
loadNextPage: (url,replace=false) =>
|
102
|
+
if !@loadingPage
|
103
|
+
# url = @findNextPageToLoad()
|
104
|
+
if url
|
105
|
+
@spinWhileLoading()
|
106
|
+
jqxhr = $.ajax
|
107
|
+
url: url
|
108
|
+
type: 'GET'
|
109
|
+
dataType: 'html'
|
110
|
+
.done (data) =>
|
111
|
+
if replace
|
112
|
+
@contxt.find('tbody').html(data)
|
113
|
+
else
|
114
|
+
@contxt.find('tbody').append(data)
|
115
|
+
App.trigger('app:pageload')
|
116
|
+
@spinWhileLoading()
|
117
|
+
.fail (data) =>
|
118
|
+
@loadingPage = false
|
119
|
+
console.log 'err'
|
120
|
+
#
|
121
|
+
# scroll a list - behind the scenes calling in extra pages of content
|
122
|
+
#
|
123
|
+
scrollTable: (elem) =>
|
124
|
+
return if $(elem)[0] == undefined || App.currentPage == $(elem)[0].id
|
125
|
+
App.currentPage = $(elem)[0].id
|
126
|
+
return unless @setVariables(elem)
|
127
|
+
if @lastPage > @nextPage && @nextPage < 3
|
128
|
+
App.shared.callToast 'Der er mere end én side resultater - scroll ned for at se flere!'
|
129
|
+
|
130
|
+
# pagination is hidden as of 8/3/2016
|
131
|
+
# @setPaginationHandler()
|
132
|
+
@table=elem
|
133
|
+
if @nextPage > 0
|
134
|
+
scrollHandler = () =>
|
135
|
+
clearTimeout( @scrollTimeout )
|
136
|
+
if @closeToBottom()
|
137
|
+
$.when @loadNextPage(@findNextPageToLoad())
|
138
|
+
.then @scrollTimeout = setTimeout( scrollHandler, 250)
|
139
|
+
.then @navPaginator.hide()
|
140
|
+
else
|
141
|
+
setTimeout( scrollHandler, 250)
|
142
|
+
|
143
|
+
@scrollTimeout = setTimeout( scrollHandler, 250)
|
@@ -20,13 +20,6 @@ class App.ResourceForm
|
|
20
20
|
|
21
21
|
try
|
22
22
|
|
23
|
-
#
|
24
|
-
# Initialize SELECT's
|
25
|
-
#
|
26
|
-
$('select').each () ->
|
27
|
-
# remove span.caret's from previous 'runs' - however that happens
|
28
|
-
$(this).parent().parent().find('span.caret').remove()
|
29
|
-
$(this).material_select()
|
30
23
|
|
31
24
|
#
|
32
25
|
# make labels on fields with content move out of the way
|
@@ -247,11 +247,12 @@ class App.ResourcesList
|
|
247
247
|
|
248
248
|
prepare: =>
|
249
249
|
|
250
|
+
@searchForm = $('#list-search-form')[0]
|
251
|
+
|
250
252
|
try
|
251
253
|
$(document.body).unbind('click.print')
|
252
|
-
$(document.body).unbind('
|
253
|
-
$(document.body).unbind('click.
|
254
|
-
$(document.body).unbind('click.prefer')
|
254
|
+
$(document.body).unbind('keydown.search')
|
255
|
+
$(document.body).unbind('click.search')
|
255
256
|
|
256
257
|
$(document.body).on 'click.print', 'a.print_post_link, a.print_item', @handlePrintLinks
|
257
258
|
$(document.body).on 'keydown.search', 'input.search-list', @searchKey
|
@@ -261,10 +262,12 @@ class App.ResourcesList
|
|
261
262
|
# If this page has a resources_list
|
262
263
|
#
|
263
264
|
$('table.resources_table').map (k,t) =>
|
265
|
+
$(document.body).unbind('click.attach')
|
266
|
+
$(document.body).unbind('click.activate')
|
267
|
+
$(document.body).unbind('click.prefer')
|
264
268
|
$(document.body).on 'click.attach', 'a.attached, a.detached', @handleAttachLinks
|
265
269
|
$(document.body).on 'click.activate', 'a.activated, a.deactivated', @handleActivateLinks
|
266
270
|
$(document.body).on 'click.prefer', 'a.preferred, a.deferred', @handlePreferredLinks
|
267
|
-
scrollTable(t)
|
268
271
|
|
269
272
|
catch error
|
270
273
|
alert 'App.ResourcesList did not prepare!'
|
@@ -3,10 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# reacts to 'app.something' events
|
5
5
|
#
|
6
|
-
window.App ||= { name: 'App', shared: null, cf: null }
|
7
|
-
|
8
|
-
App.shared = ->
|
9
|
-
@shared
|
6
|
+
window.App ||= { name: 'App', shared: null, cf: null, ps: null, _me: 0, page: null, sweet: null, resourceslist: null, resourceform: null, fab: null, currentPage: null }
|
10
7
|
|
11
8
|
App.currentForm = (val) ->
|
12
9
|
@shared.setCurrentForm(val)
|
@@ -21,19 +18,43 @@ App.trigger = (event) ->
|
|
21
18
|
# signal App
|
22
19
|
App.init = ->
|
23
20
|
|
24
|
-
@
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
@_me += 1
|
22
|
+
|
23
|
+
if @_me < 2
|
24
|
+
|
25
|
+
unless App.sweet
|
26
|
+
App.sweet = new App.SweetAlert()
|
27
|
+
|
28
|
+
unless App.resourceslist
|
29
|
+
App.resourceslist = new App.ResourcesList($('form'))
|
30
|
+
|
31
|
+
unless App.resourceform
|
32
|
+
App.resourceform = new App.ResourceForm()
|
33
|
+
|
34
|
+
unless App.fab
|
35
|
+
App.fab = new App.fabDelete()
|
36
|
+
|
37
|
+
unless @page
|
38
|
+
@page = new App.Materialize()
|
39
|
+
|
40
|
+
unless @shared
|
41
|
+
@shared = new App.Shared()
|
42
|
+
|
43
|
+
unless @ps
|
44
|
+
@ps = new App.PageScrolling()
|
31
45
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
46
|
+
#
|
47
|
+
App.trigger('app:init')
|
48
|
+
#
|
49
|
+
# Try to keep users from double-clicking submit's
|
50
|
+
#
|
51
|
+
# document.addEventListener('DOMContentLoaded', disableMultipleSubmits, false);
|
52
|
+
|
53
|
+
#
|
54
|
+
# Prepare close-notice's for acting on clicks to remove div
|
55
|
+
#
|
56
|
+
$(document.body).unbind('click.close_notice')
|
57
|
+
$(document.body).on 'click.close_notice', 'a.close-notice', App.closeNotice
|
37
58
|
|
38
59
|
|
39
60
|
#
|
@@ -41,10 +62,29 @@ App.init = ->
|
|
41
62
|
App.pageload = ->
|
42
63
|
App.trigger('app:pageload')
|
43
64
|
|
65
|
+
App.pageunload = ->
|
66
|
+
App.trigger('app:pageunload')
|
44
67
|
|
45
68
|
#
|
46
69
|
# closeNotice
|
47
70
|
# will close the notice DIV
|
48
71
|
App.closeNotice = (e) ->
|
49
|
-
shared
|
50
|
-
|
72
|
+
App.shared.fadeItOut $(e.currentTarget).closest('.alert') #.remove()
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
#
|
77
|
+
# PageOnChange really just calls a pageload - as of now 19-06-15
|
78
|
+
# fixed elements like SELECT's, Materialized's elements, et al.
|
79
|
+
#
|
80
|
+
# @pageOnChange = () ->
|
81
|
+
# console.log 'page changed '
|
82
|
+
# pageOnLoad()
|
83
|
+
#
|
84
|
+
# call the App.pageload
|
85
|
+
$(document).on 'page:change', ->
|
86
|
+
App.pageload()
|
87
|
+
#
|
88
|
+
# $(window).on 'page:unload', ->
|
89
|
+
# alert 'fisk'
|
90
|
+
# App.pageunload()
|