abstracted 0.3.4 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5bb946be423371961e8d08aeb8322b863a94b07f
4
- data.tar.gz: 225bbee0f0f7cc8703670d17f6de1ba02d8692e0
3
+ metadata.gz: 27795b5e4072282e297becda9681b2485fadc339
4
+ data.tar.gz: a0b78bef1eb0150fa3ed0fcbd7ff1908476a8641
5
5
  SHA512:
6
- metadata.gz: d7c3791294abecbea359ef6a9286d2b1cd98798979aa05c5d4c005de178757ca57f39e1208afbf3a60891f69fb5c74b98f11027c4aa60bb359f969e8c60466c3
7
- data.tar.gz: ba5b34ee89bc44fc856cea2f961cf5aac00afff73bd647a2479a891672c52a48ff1faddcc44a5b300f43d5d236c6eec14567c616a4d0cf266aefebc09ca20d9d
6
+ metadata.gz: 6788211f7da0a881926438a8d5e3049d62697b3b5114b866ca8c43e52e141397e93a96c2b8880f1f926a3dec5d3a0fee96c63d7bd637084746f1f271ca5a7cf3
7
+ data.tar.gz: c46d3691914e586368cb3b329b2af7dbf4b874dcfed79c7efe0ef69b5fecf7d4e8c2ea659ab97bfeca062a360e770998bf047f8dc3e02304d2931de8265655a5
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- abstracted (0.3.3)
4
+ abstracted (0.3.4)
5
5
  kaminari
6
6
  pundit
7
7
  rails (~> 4.1)
@@ -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
- if elem.data('browser')=='new'
45
- window.open elem.data('url')
46
- return
47
-
48
- loader = '<div class="preloader-wrapper medium 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>'
49
- App.shared.setLoader( $(elem).closest('.fixed-action-btn'),loader)
50
- oxremote = elem.data('oxremote')
51
- if (oxremote=='false' or oxremote==false)
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: "Are you sure?",
91
- text: "Are you sure that you want to delete this photo?",
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: "Yes, delete it!",
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).unbind('click.delete')
112
- $(document.body).unbind('click.fab')
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
- 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'
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
- $elem = $(e.currentTarget)
222
- 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>'
223
- loaded_element = $elem.closest('.loader_container')
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).unbind('click.print')
254
- $(document.body).unbind('keydown.search')
255
- $(document.body).unbind('click.search')
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).unbind('click.attach')
266
- $(document.body).unbind('click.activate')
267
- $(document.body).unbind('click.prefer')
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
- html ||= '<div class="progress"><div class="indeterminate"></div></div>'
92
- @loaded_element = $(elem)
93
- @loaded_html = elem.html()
94
- elem.html(html)
95
- return @loaded_html
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
- Materialize.toast( msg, 4500, 'red lighten-3')
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
  #