abstracted 0.3.4 → 0.4.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/Gemfile.lock +1 -1
- data/app/assets/javascripts/abstracted/app.fab_delete.coffee +33 -38
- data/app/assets/javascripts/abstracted/app.page_scrolling.coffee +18 -28
- data/app/assets/javascripts/abstracted/app.resources_list.coffee +30 -111
- data/app/assets/javascripts/abstracted/app.shared.coffee +143 -7
- data/app/assets/javascripts/init.js.coffee +1 -1
- data/app/controllers/abstract_resources_controller.rb +21 -354
- data/app/helpers/abstract_resources_helper.rb +123 -73
- data/app/models/abstract_resource.rb +2 -60
- data/lib/abstracted/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27795b5e4072282e297becda9681b2485fadc339
|
4
|
+
data.tar.gz: a0b78bef1eb0150fa3ed0fcbd7ff1908476a8641
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6788211f7da0a881926438a8d5e3049d62697b3b5114b866ca8c43e52e141397e93a96c2b8880f1f926a3dec5d3a0fee96c63d7bd637084746f1f271ca5a7cf3
|
7
|
+
data.tar.gz: c46d3691914e586368cb3b329b2af7dbf4b874dcfed79c7efe0ef69b5fecf7d4e8c2ea659ab97bfeca062a360e770998bf047f8dc3e02304d2931de8265655a5
|
data/Gemfile.lock
CHANGED
@@ -31,70 +31,65 @@ class App.fabDelete
|
|
31
31
|
swal "Hmmm", "Most unexpected! \n#{error}", "error"
|
32
32
|
|
33
33
|
|
34
|
-
|
35
34
|
#
|
36
35
|
# handleFABLinks
|
37
36
|
# handles click on the fab_button
|
38
37
|
#
|
38
|
+
# buttons will have 5 courses of action
|
39
|
+
#
|
40
|
+
# 1) call a new window
|
41
|
+
# 2) eval string - like "$(selector).openModal()"
|
42
|
+
# 3) make a AJAX call to get some resource to present either in the document.body, a DOMnode, or in a modal
|
43
|
+
# 4) POST the first form on the current document.body
|
44
|
+
# 5) GET the data-url
|
45
|
+
#
|
46
|
+
# hence the button will have a number of attribs
|
47
|
+
#
|
48
|
+
# data-action [ "new" | "ajax" | "submit" | "get" | "string to eval" ]
|
49
|
+
# data-url "/endpoint"
|
50
|
+
# data-selector [ "DOM node to operate on - ie submit, fill, etc" | "download" ]
|
51
|
+
# data-props [ 'true' | '[ 1, "two", { "three": "3" }]' ]
|
52
|
+
#
|
39
53
|
handleFABLinks: (e) =>
|
40
54
|
e.preventDefault()
|
41
55
|
e.stopPropagation()
|
42
56
|
|
43
57
|
elem = $(e.currentTarget)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
switch elem.data('method')
|
53
|
-
when 'post', 'POST'
|
54
|
-
# elem.closest('form').submit()
|
55
|
-
$('form').submit()
|
56
|
-
when 'put', 'PUT'
|
57
|
-
console.log 'how do I put? add code in abstracted/app/assets/javascripts/initializers.js.coffee'
|
58
|
-
when 'get', 'GET'
|
59
|
-
window.location.href = elem.data('url')
|
60
|
-
else
|
61
|
-
jqxhr = $.ajax
|
62
|
-
url: elem.data('url') || elem.attr('href')
|
63
|
-
type: elem.data('method') || 'get'
|
64
|
-
data: App.shared.dataArgumentOn(elem)
|
65
|
-
dataType: elem.data('type') || 'html'
|
66
|
-
.done (data) =>
|
67
|
-
App.shared.releaseLoader()
|
68
|
-
if elem.data('modal')
|
69
|
-
$(elem.data('modal')).html(data).openModal()
|
70
|
-
else
|
71
|
-
$(document.body).append(data)
|
72
|
-
.error (data) =>
|
73
|
-
App.shared.releaseLoader()
|
74
|
-
$(document.body).append(data)
|
75
|
-
return false
|
58
|
+
loaded_element = elem.closest('.fixed-action-btn')
|
59
|
+
|
60
|
+
switch elem.data('action')
|
61
|
+
when 'new' then App.shared.openNewWindow(elem) # data-action="new", data-url="/endpoint", data-selector="#id.modal"
|
62
|
+
when 'submit' then App.shared.submitForm(elem) # data-action="submit", data-selector="form"
|
63
|
+
when 'ajax' then App.shared.callAjax(elem,loaded_element) # data-action="ajax", data-url="/endpoint", data-selector="#id.modal", data-method="get", data-type="html"
|
64
|
+
when 'get' then window.location.href = elem.data('url') # data-action="get", data-url="/endpoint"
|
65
|
+
else eval(elem.data('action')) # data-action="$(document.body).trigger({ type: 'app:modal:state:changed', state: {print_format: 'record' }})"
|
76
66
|
|
77
67
|
|
78
68
|
#
|
79
69
|
# handleDeleteLinks
|
80
70
|
# initializes the tags classed with '.delete_link' to verify deleting an issue
|
81
71
|
#
|
72
|
+
# if the calling elem has a data-what-to-delete attrib - this will be shown
|
73
|
+
#
|
82
74
|
handleDeleteLinks: (e) =>
|
83
75
|
e.preventDefault()
|
84
76
|
e.stopPropagation()
|
85
77
|
$elem = $(e.currentTarget)
|
78
|
+
title = $elem.data('delete-title') || "Are you sure?"
|
79
|
+
prompt = $elem.data('delete-prompt') || "Are you sure that you want to delete this?"
|
80
|
+
confirm = $elem.data('delete-confirm') || "Yes, delete it!"
|
86
81
|
$elem.hide()
|
87
82
|
|
88
83
|
$('.sweet-overlay').show()
|
89
84
|
swal
|
90
|
-
title:
|
91
|
-
text:
|
85
|
+
title: title,
|
86
|
+
text: prompt,
|
92
87
|
type: "warning",
|
93
88
|
animation: "slide-from-bottom",
|
94
89
|
showLoaderOnConfirm: true,
|
95
90
|
showCancelButton: true,
|
96
91
|
closeOnConfirm: false,
|
97
|
-
confirmButtonText:
|
92
|
+
confirmButtonText: confirm,
|
98
93
|
confirmButtonColor: "#ec6c62",
|
99
94
|
(confirmed) =>
|
100
95
|
if !confirmed
|
@@ -108,8 +103,8 @@ class App.fabDelete
|
|
108
103
|
|
109
104
|
try
|
110
105
|
|
111
|
-
$(document.body).
|
112
|
-
$(document.body).
|
106
|
+
$(document.body).off('click.delete')
|
107
|
+
$(document.body).off('click.fab')
|
113
108
|
|
114
109
|
#
|
115
110
|
# Prepare delete_link's for acting on clicks to delete posts
|
@@ -14,16 +14,6 @@ class App.PageScrolling
|
|
14
14
|
@scrollTimeout = false
|
15
15
|
@_me = 0
|
16
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
17
|
evalPageNumber: (elem) =>
|
28
18
|
if elem
|
29
19
|
try
|
@@ -82,6 +72,7 @@ class App.PageScrolling
|
|
82
72
|
# closeToBottom checks to see if you're close to the bottom of the screen
|
83
73
|
#
|
84
74
|
closeToBottom: () =>
|
75
|
+
return false if @loadingPage
|
85
76
|
return false if @navPaginator.size() == 0
|
86
77
|
return ($(window).scrollTop() - parseInt($(document).height()) + parseInt($(window).height())) > -200
|
87
78
|
|
@@ -99,24 +90,23 @@ class App.PageScrolling
|
|
99
90
|
|
100
91
|
|
101
92
|
loadNextPage: (url,replace=false) =>
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
console.log 'err'
|
93
|
+
# url = @findNextPageToLoad()
|
94
|
+
if url
|
95
|
+
return unless App.shared.spinWhileLoading '.fixed-action-btn', '<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>'
|
96
|
+
jqxhr = $.ajax
|
97
|
+
url: url
|
98
|
+
type: 'GET'
|
99
|
+
dataType: 'html'
|
100
|
+
.done (data) =>
|
101
|
+
if replace
|
102
|
+
@contxt.find('tbody').html(data)
|
103
|
+
else
|
104
|
+
@contxt.find('tbody').append(data)
|
105
|
+
App.trigger('app:pageload')
|
106
|
+
App.shared.spinWhileLoading()
|
107
|
+
.fail (data) =>
|
108
|
+
@loadingPage = false
|
109
|
+
console.log 'err'
|
120
110
|
#
|
121
111
|
# scroll a list - behind the scenes calling in extra pages of content
|
122
112
|
#
|
@@ -4,105 +4,6 @@ class App.ResourcesList
|
|
4
4
|
# initialize some stuff
|
5
5
|
@searchForm = @el[0]
|
6
6
|
|
7
|
-
#
|
8
|
-
# printPost handles printing posts either way
|
9
|
-
#
|
10
|
-
# dependencies
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# <a
|
16
|
-
# class="print_post_link"
|
17
|
-
# data-ajax="get"
|
18
|
-
# data-remote="false"
|
19
|
-
# data-method="get"
|
20
|
-
# data-download="true" -- if is is a file which we should send!
|
21
|
-
# data-url="/stock_items/1/print.js"
|
22
|
-
# data-oxremote="true"
|
23
|
-
# data-name="2"
|
24
|
-
# data-id="1"
|
25
|
-
# data-paper="label"
|
26
|
-
# data-message-ok="Udskrivning af Labels bestilt!"
|
27
|
-
# data-message-error="øv"
|
28
|
-
# href="http://localhost:3000/stock_items/1/print">
|
29
|
-
# <i class="material-icons small" title="Udskriv labels">label</i>
|
30
|
-
# </a>
|
31
|
-
#
|
32
|
-
# data-url="", data-id="", data-print-action="", data-message-ok="", data-message-error=""
|
33
|
-
printPost: (elem) =>
|
34
|
-
elem = $(elem)
|
35
|
-
url = elem.data('url') || elem.attr('href')
|
36
|
-
if elem.data('browser')=='new'
|
37
|
-
App.shared.releaseLoader()
|
38
|
-
window.open url + '?' + $.param App.shared.dataArgumentOn(elem)
|
39
|
-
return
|
40
|
-
|
41
|
-
oxremote = elem.data('oxremote')
|
42
|
-
if oxremote=='false'
|
43
|
-
switch elem.data('method')
|
44
|
-
when 'post', 'POST'
|
45
|
-
# elem.closest('form').submit()
|
46
|
-
$('form').submit()
|
47
|
-
when 'put', 'PUT'
|
48
|
-
console.log 'how do I put? add code in abstracted/app/assets/javascripts/initializers.js.coffee'
|
49
|
-
when 'get', 'GET'
|
50
|
-
window.location.href = elem.data('url')
|
51
|
-
else
|
52
|
-
try
|
53
|
-
jqxhr = $.ajax
|
54
|
-
url: elem.data('url') || elem.attr('href')
|
55
|
-
type: elem.data('method') || 'get'
|
56
|
-
data: App.shared.dataArgumentOn(elem)
|
57
|
-
dataType: elem.data('type') || 'html'
|
58
|
-
.done (data) =>
|
59
|
-
App.shared.releaseLoader()
|
60
|
-
if elem.data('download')
|
61
|
-
App.shared.getDownload(jqxhr,data)
|
62
|
-
else
|
63
|
-
$(document.body).append(data)
|
64
|
-
|
65
|
-
.fail (response,status) =>
|
66
|
-
App.shared.releaseLoader()
|
67
|
-
if jqxhr.state=='rejected'
|
68
|
-
App.shared.reportError('Der er ingen forbindelse til serveren - prøv lidt senere!')
|
69
|
-
else
|
70
|
-
$(document.body).append(response.responseText)
|
71
|
-
|
72
|
-
catch e
|
73
|
-
console.log e
|
74
|
-
|
75
|
-
return false
|
76
|
-
|
77
|
-
#
|
78
|
-
# setTimeout () ->
|
79
|
-
# URL.revokeObjectURL(downloadUrl)
|
80
|
-
# , 100
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
# blob=new Blob([data])
|
85
|
-
# link=document.createElement('a')
|
86
|
-
# link.href=window.URL.createObjectURL(blob)
|
87
|
-
# # link.target='_blank';
|
88
|
-
# link.download="oxen_"+new Date()+".pdf"
|
89
|
-
# link.click()
|
90
|
-
|
91
|
-
# @printPost = ($elem) ->
|
92
|
-
# try
|
93
|
-
# url = $elem.data('url') + "/" + $elem.data('id') + '/' + $elem.data('print-action') + ".js"
|
94
|
-
# request = $.ajax
|
95
|
-
# url: url,
|
96
|
-
# type: "post",
|
97
|
-
# data: $elem.data('data'),
|
98
|
-
# dataType: 'html'
|
99
|
-
# .done (data) ->
|
100
|
-
# releaseLoader($elem.closest('.loader_container'))
|
101
|
-
# $(document.body).append(data)
|
102
|
-
# .error (data) ->
|
103
|
-
# releaseLoader($elem.closest('.loader_container'))
|
104
|
-
# $(document.body).append(data)
|
105
|
-
|
106
7
|
#
|
107
8
|
# searchPost handles ordering search on index actions
|
108
9
|
#
|
@@ -112,6 +13,25 @@ class App.ResourcesList
|
|
112
13
|
App.shared.setLoader( loaded_element,loader )
|
113
14
|
window.location.href= url + '?q=' + encodeURIComponent(query)
|
114
15
|
|
16
|
+
#
|
17
|
+
# handleColumnSort will
|
18
|
+
#
|
19
|
+
handleColumnSort: (e) =>
|
20
|
+
dir = $(e.currentTarget).data('direction') || 'asc'
|
21
|
+
fld = $(e.currentTarget).data('field') || 'id'
|
22
|
+
srt = '&s=' + fld + '&d=' + dir
|
23
|
+
window.location.href = App.shared.buildUrl(srt,/q=/)
|
24
|
+
|
25
|
+
# jqxhr = $.ajax
|
26
|
+
# url: url,
|
27
|
+
# type: 'GET',
|
28
|
+
# dataType: 'html'
|
29
|
+
# jqxhr.done (data, textStatus, jqXHR) ->
|
30
|
+
# $('tbody.page.resources_list').html(data)
|
31
|
+
# jqxhr.fail (data, textStatus, errorThrown) ->
|
32
|
+
# $('#message_container').html(data.responseText)
|
33
|
+
|
34
|
+
|
115
35
|
|
116
36
|
#
|
117
37
|
# handleAttachLinks
|
@@ -218,12 +138,9 @@ class App.ResourcesList
|
|
218
138
|
e.preventDefault()
|
219
139
|
e.stopPropagation()
|
220
140
|
|
221
|
-
|
222
|
-
|
223
|
-
loaded_element
|
224
|
-
App.shared.setLoader( loaded_element,loader )
|
225
|
-
@printPost($elem)
|
226
|
-
return false
|
141
|
+
elem = $(e.currentTarget)
|
142
|
+
loaded_element = elem.closest('.loader_container')
|
143
|
+
App.shared.printPost( elem, loaded_element )
|
227
144
|
|
228
145
|
#
|
229
146
|
# starting a search - and making some noise about it!
|
@@ -250,9 +167,9 @@ class App.ResourcesList
|
|
250
167
|
@searchForm = $('#list-search-form')[0]
|
251
168
|
|
252
169
|
try
|
253
|
-
$(document.body).
|
254
|
-
$(document.body).
|
255
|
-
$(document.body).
|
170
|
+
$(document.body).off('click.print')
|
171
|
+
$(document.body).off('keydown.search')
|
172
|
+
$(document.body).off('click.search')
|
256
173
|
|
257
174
|
$(document.body).on 'click.print', 'a.print_post_link, a.print_item', @handlePrintLinks
|
258
175
|
$(document.body).on 'keydown.search', 'input.search-list', @searchKey
|
@@ -262,12 +179,14 @@ class App.ResourcesList
|
|
262
179
|
# If this page has a resources_list
|
263
180
|
#
|
264
181
|
$('table.resources_table').map (k,t) =>
|
265
|
-
$(document.body).
|
266
|
-
$(document.body).
|
267
|
-
$(document.body).
|
182
|
+
$(document.body).off('click.attach')
|
183
|
+
$(document.body).off('click.activate')
|
184
|
+
$(document.body).off('click.prefer')
|
185
|
+
$(document.body).off('click.sort_on_column')
|
268
186
|
$(document.body).on 'click.attach', 'a.attached, a.detached', @handleAttachLinks
|
269
187
|
$(document.body).on 'click.activate', 'a.activated, a.deactivated', @handleActivateLinks
|
270
188
|
$(document.body).on 'click.prefer', 'a.preferred, a.deferred', @handlePreferredLinks
|
189
|
+
$(document.body).on 'click.sort_on_column', 'th[role="sort"]', @handleColumnSort
|
271
190
|
|
272
191
|
catch error
|
273
192
|
alert 'App.ResourcesList did not prepare!'
|
@@ -8,6 +8,8 @@ class App.Shared
|
|
8
8
|
@loaded_html = ""
|
9
9
|
@loaded_element = ""
|
10
10
|
@currentForm = ""
|
11
|
+
@defaultSpinner = '<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>'
|
12
|
+
@loading = false
|
11
13
|
|
12
14
|
setCurrentForm: (f) =>
|
13
15
|
@currentForm = f
|
@@ -18,6 +20,37 @@ class App.Shared
|
|
18
20
|
callToast: (msg,time=3000,style="rounded") =>
|
19
21
|
Materialize.toast(msg, time,style)
|
20
22
|
|
23
|
+
|
24
|
+
#
|
25
|
+
# openNewWindow
|
26
|
+
#
|
27
|
+
#
|
28
|
+
openNewWindow: ($elem) =>
|
29
|
+
props=''
|
30
|
+
if $elem.data('props')
|
31
|
+
try
|
32
|
+
props = JSON.parse $elem.data('props')
|
33
|
+
catch
|
34
|
+
props = window.location.href.split("?")[1]
|
35
|
+
url=$elem.data('url')
|
36
|
+
if url.match /\?/
|
37
|
+
props = "&" + props
|
38
|
+
else
|
39
|
+
props = "?" + props
|
40
|
+
window.open (url + props)
|
41
|
+
|
42
|
+
#
|
43
|
+
# submitForm
|
44
|
+
#
|
45
|
+
#
|
46
|
+
submitForm: ($elem) =>
|
47
|
+
if $elem.data('selector')
|
48
|
+
return $($elem.data('selector')).submit()
|
49
|
+
$(document.body).find('form').first().submit()
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
21
54
|
getDownload: (xhr,data) =>
|
22
55
|
# Check if a filename is existing on the response headers.
|
23
56
|
filename = ""
|
@@ -82,32 +115,117 @@ class App.Shared
|
|
82
115
|
this[i] = source[i]
|
83
116
|
|
84
117
|
|
118
|
+
#
|
119
|
+
# printPost handles printing posts either way
|
120
|
+
#
|
121
|
+
printPost: (elem, loaded_element) =>
|
122
|
+
switch elem.data('action')
|
123
|
+
when 'new' then @openNewWindow(elem) # data-action="new", data-url="/endpoint", data-selector="#id.modal"
|
124
|
+
when 'submit' then @submitForm(elem) # data-action="submit", data-selector="form"
|
125
|
+
when 'ajax' then @callAjax(elem, loaded_element) # data-action="ajax", data-url="/endpoint", data-selector="#id.modal", data-method="get", data-type="html", data-download="true"
|
126
|
+
when 'get' then window.location.href = elem.data('url') # data-action="get", data-url="/endpoint"
|
127
|
+
else eval(elem.data('action')) # data-action="$(document.body).trigger({ type: 'app:modal:state:changed', state: {print_format: 'record' }})"
|
128
|
+
|
129
|
+
|
130
|
+
#
|
131
|
+
# callAjax
|
132
|
+
# data-action="ajax", data-url="/endpoint", data-selector="#id.modal", data-method="get", data-type="html"
|
133
|
+
# data-action="ajax", data-url="/endpoint", data-selector="download", data-method="get", data-type="html"
|
134
|
+
# data: { action: "ajax", url: confinement_stock_items_url(format: 'js'), selector: "#edit_confinement.modal", method: "get", type: "html" }
|
135
|
+
#
|
136
|
+
callAjax: ($elem, loaded_element) =>
|
137
|
+
return unless App.shared.spinWhileLoading( loaded_element )
|
138
|
+
jqxhr = $.ajax
|
139
|
+
url: $elem.data('url') || $elem.attr('href')
|
140
|
+
type: $elem.data('method') || 'get'
|
141
|
+
data: App.shared.dataArgumentOn($elem)
|
142
|
+
dataType: $elem.data('type') || 'html'
|
143
|
+
.done (data) =>
|
144
|
+
console.log 'done'
|
145
|
+
@spinWhileLoading()
|
146
|
+
@setJqxhrData($elem,data)
|
147
|
+
.fail (response,status) =>
|
148
|
+
console.log 'fail'
|
149
|
+
@spinWhileLoading()
|
150
|
+
if jqxhr.state=='rejected'
|
151
|
+
@reportError('Der er ingen forbindelse til serveren - prøv lidt senere!')
|
152
|
+
else
|
153
|
+
@setJqxhrData($elem,response.responseText)
|
154
|
+
|
155
|
+
#
|
156
|
+
# setJqxhrData
|
157
|
+
# will try to massage the server response into it's proper place
|
158
|
+
#
|
159
|
+
setJqxhrData: ($elem,data) =>
|
160
|
+
try
|
161
|
+
if $elem.data('selector')
|
162
|
+
if elem.data('selector').match /^download$/i
|
163
|
+
@getDownload(jqxhr,data)
|
164
|
+
else
|
165
|
+
$( $elem.data('selector') ).html(data)
|
166
|
+
if $elem.data('selector').match /\.modal/
|
167
|
+
$( $elem.data('selector') ).openModal()
|
168
|
+
else
|
169
|
+
$(document.body).append(data)
|
170
|
+
|
171
|
+
catch error
|
172
|
+
@reportError(error)
|
173
|
+
|
174
|
+
|
175
|
+
#
|
176
|
+
# spinWhileLoading
|
177
|
+
# spinner to indicate something is going on
|
178
|
+
#
|
179
|
+
spinWhileLoading: (e=null,loader=null) =>
|
180
|
+
return false if e && @isLoading()
|
181
|
+
return @releaseLoader() if @isLoading()
|
182
|
+
e = e.target if e instanceof Event || e instanceof jQuery.Event
|
183
|
+
@setLoader( e,loader )
|
184
|
+
|
85
185
|
|
86
186
|
#
|
87
187
|
# set a loader - see http://materializecss.com/preloader.html
|
88
188
|
# for examples
|
89
189
|
#
|
90
190
|
setLoader: (elem,html) =>
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
191
|
+
try
|
192
|
+
html ||= @defaultSpinner #'<div class="progress"><div class="indeterminate"></div></div>'
|
193
|
+
@loaded_element = $(elem)
|
194
|
+
@loaded_html = @loaded_element.html()
|
195
|
+
@loading = true
|
196
|
+
return @loaded_element.html(html)
|
197
|
+
catch err
|
198
|
+
console.log err
|
199
|
+
|
200
|
+
#
|
201
|
+
# isLoading
|
202
|
+
# return @loading === true
|
203
|
+
#
|
204
|
+
isLoading: () =>
|
205
|
+
@loading == true
|
96
206
|
|
97
207
|
#
|
98
208
|
# release the loader
|
99
209
|
#
|
100
210
|
releaseLoader: (elem=null) =>
|
211
|
+
@loading=false
|
101
212
|
elem ||= @loaded_element
|
102
213
|
$(elem).html(@loaded_html)
|
103
214
|
|
215
|
+
#
|
216
|
+
# tellResponse will prepend a msg and optionally fade it out
|
217
|
+
#
|
104
218
|
tellResponse: (msg,anchor='.message_container',fade=15000,selector='.alert') =>
|
105
219
|
$(anchor).prepend(msg)
|
106
220
|
if fade>0
|
107
|
-
fadeItOut $(anchor).find(selector), 15000
|
221
|
+
@fadeItOut $(anchor).find(selector), 15000
|
108
222
|
|
223
|
+
#
|
224
|
+
# reportError
|
225
|
+
# will show an error notification
|
226
|
+
#
|
109
227
|
reportError: (msg) =>
|
110
|
-
|
228
|
+
callToast msg, 4500, 'red lighten-3'
|
111
229
|
|
112
230
|
|
113
231
|
#
|
@@ -133,6 +251,24 @@ class App.Shared
|
|
133
251
|
# console.log 'ok - giving up'
|
134
252
|
# console.log 'page loaded!'
|
135
253
|
|
254
|
+
#
|
255
|
+
# buildUrl will return current window.location.href with optional &args
|
256
|
+
# but will keep ?q= part of string
|
257
|
+
# argument: querystring part: &something=whatnot&other=else
|
258
|
+
#
|
259
|
+
buildUrl: (qs,match) =>
|
260
|
+
m = match || /q=/
|
261
|
+
loc = window.document.location
|
262
|
+
searches = loc.search.split("&")
|
263
|
+
search = (s for s in searches when s.match(m)) || ''
|
264
|
+
url = loc.origin + loc.pathname + search.join("&")
|
265
|
+
if url.match(/\?/)
|
266
|
+
url = url + qs
|
267
|
+
else
|
268
|
+
url = url + '?' + qs
|
269
|
+
|
270
|
+
|
271
|
+
|
136
272
|
#
|
137
273
|
# check to see iff this browser supperts the File APIs
|
138
274
|
#
|