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 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
  #