thin_man 0.8.0 → 0.8.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: fcc6605c7fab41092beac436b3ee4c4595fa40db
4
- data.tar.gz: bb07644b4bb11668febef635cee86204feeeb3e2
3
+ metadata.gz: 18d3ad1b7b7d906597566cf1b1d8f2bc529f82be
4
+ data.tar.gz: 81c67a1a5e66e4a4403d68bc4ec27adaacd6dfc3
5
5
  SHA512:
6
- metadata.gz: 31685b33f766f759ba028b594a047e2ca48c7172674adf339cb7e4d1a1c61390f718641dd819fdf13af68b4bde5b3260570d5c344651adf6481c4b4a3cd12d89
7
- data.tar.gz: af2305b57b2068fc1193001ad6a8f90e8b2575f9f7cc0a1793dad69d92b77e4b16be3c5544ce244d8a0264bfba23fbcf5a44c086e639953295a0dc28e605a0e9
6
+ metadata.gz: b99ae5b6516c58f94e85077e1534a0d4b2db6dbbee324610adb647c6cc841b3658f4226bc741438050b1b224dddcd4ec5fb9b432cb223cf52872c512aa6b294d
7
+ data.tar.gz: 52ed6c0bf877bc1773fd8e8937369de0bb7adea7381824247af62bf69977cf277720cdf5bc26ca24eebc09ee02a5218e07fc6b9652b17d613690c0706a2675db
@@ -1,499 +1,479 @@
1
- //ThinMan javascript
2
- function getSubClass(sub_class_name,parent_class){
3
- if((typeof(sub_class_name) == 'string') && (sub_class_name != '') && (sub_class_name != 'true')){
4
- var this_class = sub_class_name;
5
- } else {
6
- var this_class = parent_class;
7
- }
8
- return this_class;
9
- };
10
-
11
- // This is a utility to convert a javascript object to a query string and append it to a url.
12
- function toUrlParams(params){
13
- var params_array = [];
14
- $.each(params, function(key,value){
15
- params_array.push([key,value].join('='));
16
- });
17
- return params_array.join('&');
18
- };
19
-
20
- function addUrlParams(url,params){
21
- if(url.match(/\?/)){
22
- url = url + '&' + toUrlParams(params);
23
- } else {
24
- url = url + '?' + toUrlParams(params);
25
- }
26
- return url;
27
- };
28
-
29
- var AjaxSubmission = Class.extend({
30
- init: function(jq_obj,params){
31
- this.jq_obj = jq_obj;
32
- this.params = params;
33
- if(!this.params){ this.params = {}}
34
- this.getTrigger();
35
- this.getTarget();
36
- this.getErrorTarget();
37
- this.insert_method = this.getInsertMethod();
38
- var ajax_submission = this;
39
- this.ajax_options = {
40
- url: ajax_submission.getAjaxUrl(),
41
- type: ajax_submission.getAjaxType(),
42
- datatype: ajax_submission.getAjaxDataType(),
43
- data: ajax_submission.getData(),
44
- beforeSend: function(jqXHr) { return ajax_submission.ajaxBefore(jqXHr) },
45
- success: function(data,textStatus,jqXHR) { ajax_submission.ajaxSuccess(data,textStatus,jqXHR) },
46
- error: function(jqXHr) { ajax_submission.ajaxError(jqXHr) },
47
- complete: function(jqXHr) { ajax_submission.ajaxComplete(jqXHr) }
48
- };
49
- $.ajax(ajax_submission.ajax_options);
50
- },
51
- getTarget: function(){
52
- var target_selector = this.jq_obj.data('ajax-target');
53
- if(target_selector){
54
- this.target = $(target_selector);
55
- }
56
- },
57
- getErrorTarget: function(){
58
- if($(this.jq_obj.data('error-target')).length > 0){
59
- this.error_target = $(this.jq_obj.data('error-target'));
60
- }else{
61
- this.error_target = $(this.jq_obj.data('ajax-target'));
62
- }
63
- },
64
- getAjaxDataType: function(){
65
- return this.jq_obj.data('return-type') || 'html';
66
- },
67
- getInsertMethod: function(){
68
- return this.jq_obj.data('insert-method') || 'html';
69
- },
70
- getData: function() {
71
- return null;
72
- },
73
- insertHtml: function(data) {
74
- if(this.target){
75
- this.target[this.insert_method](data);
76
- this.target.find('input,select,textarea').filter(':visible:enabled:first').each(function(){
77
- if(!$(this).data('date-picker')){
78
- $(this).focus();
79
- }
80
- });
81
- }
82
- },
83
- ajaxSuccess: function(data,textStatus,jqXHR){
84
- if(typeof data === 'string'){
85
- this.insertHtml(data);
86
- } else if(typeof data === 'object') {
87
- if(typeof data.html != 'undefined'){
88
- this.insertHtml(data.html)
1
+ var initThinMan = function(){
2
+ thin_man = {
3
+ getSubClass: function(sub_class_name,parent_class){
4
+ if((typeof(sub_class_name) == 'string') && (sub_class_name != '') && (sub_class_name != 'true')){
5
+ var this_class = sub_class_name;
6
+ } else {
7
+ var this_class = parent_class;
89
8
  }
90
- if(typeof data.class_triggers != 'undefined'){
91
- $.each(data.class_triggers, function(class_name, params){
92
- try{
93
- klass = eval(class_name);
94
- new klass(params);
95
- } catch(err) {
96
- console.log("Error trying to instantiate class " + class_name + " from ajax response:")
97
- console.log(err)
9
+ return this_class;
10
+ },
11
+ AjaxSubmission: Class.extend({
12
+ init: function(jq_obj,params){
13
+ this.jq_obj = jq_obj;
14
+ this.params = params;
15
+ if(!this.params){ this.params = {}}
16
+ this.getTrigger();
17
+ this.getTarget();
18
+ this.getErrorTarget();
19
+ this.insert_method = this.getInsertMethod();
20
+ var ajax_submission = this;
21
+ this.ajax_options = {
22
+ url: ajax_submission.getAjaxUrl(),
23
+ type: ajax_submission.getAjaxType(),
24
+ datatype: ajax_submission.getAjaxDataType(),
25
+ data: ajax_submission.getData(),
26
+ beforeSend: function(jqXHr) { return ajax_submission.ajaxBefore(jqXHr) },
27
+ success: function(data,textStatus,jqXHR) { ajax_submission.ajaxSuccess(data,textStatus,jqXHR) },
28
+ error: function(jqXHr) { ajax_submission.ajaxError(jqXHr) },
29
+ complete: function(jqXHr) { ajax_submission.ajaxComplete(jqXHr) }
30
+ };
31
+ $.ajax(ajax_submission.ajax_options);
32
+ },
33
+ getTarget: function(){
34
+ var target_selector = this.jq_obj.data('ajax-target');
35
+ if(target_selector){
36
+ this.target = $(target_selector);
37
+ }
38
+ },
39
+ getErrorTarget: function(){
40
+ if($(this.jq_obj.data('error-target')).length > 0){
41
+ this.error_target = $(this.jq_obj.data('error-target'));
42
+ }else{
43
+ this.error_target = $(this.jq_obj.data('ajax-target'));
44
+ }
45
+ },
46
+ getAjaxDataType: function(){
47
+ return this.jq_obj.data('return-type') || 'html';
48
+ },
49
+ getInsertMethod: function(){
50
+ return this.jq_obj.data('insert-method') || 'html';
51
+ },
52
+ getData: function() {
53
+ return null;
54
+ },
55
+ insertHtml: function(data) {
56
+ if(this.target){
57
+ this.target[this.insert_method](data);
58
+ this.target.find('input,select,textarea').filter(':visible:enabled:first').each(function(){
59
+ if(!$(this).data('date-picker')){
60
+ $(this).focus();
61
+ }
62
+ });
63
+ }
64
+ },
65
+ ajaxSuccess: function(data,textStatus,jqXHR){
66
+ if(typeof data === 'string'){
67
+ this.insertHtml(data);
68
+ } else if(typeof data === 'object') {
69
+ if(typeof data.html != 'undefined'){
70
+ this.insertHtml(data.html)
98
71
  }
99
- })
100
- }
101
- if(typeof data.function_calls != 'undefined'){
102
- $.each(data.function_calls, function(func_name, params){
103
- try{
104
- func = eval(func_name);
105
- func(params);
106
- } catch(err) {
107
- console.log("Error trying to instantiate function " + func_name + " from ajax response:")
108
- console.log(err)
72
+ if(typeof data.class_triggers != 'undefined'){
73
+ $.each(data.class_triggers, function(class_name, params){
74
+ try{
75
+ klass = eval(class_name);
76
+ new klass(params);
77
+ } catch(err) {
78
+ console.log("Error trying to instantiate class " + class_name + " from ajax response:")
79
+ console.log(err)
80
+ }
81
+ })
109
82
  }
110
- })
111
- }
112
- }
113
- if(this.target){
114
- var ajax_flash = this.target.children().last().data('ajax-flash');
115
- if((jqXHR.status == 200) && ajax_flash){
116
- new AjaxFlash('success', ajax_flash.notice,this.target);
83
+ if(typeof data.function_calls != 'undefined'){
84
+ $.each(data.function_calls, function(func_name, params){
85
+ try{
86
+ func = eval(func_name);
87
+ func(params);
88
+ } catch(err) {
89
+ console.log("Error trying to instantiate function " + func_name + " from ajax response:")
90
+ console.log(err)
91
+ }
92
+ })
93
+ }
94
+ }
95
+ if(this.target){
96
+ var ajax_flash = this.target.children().last().data('ajax-flash');
97
+ if((jqXHR.status == 200) && ajax_flash){
98
+ new thin_man.AjaxFlash('success', ajax_flash.notice,this.target);
99
+ }
100
+ }
101
+ if ((jqXHR.status == 200) && !(typeof step === 'undefined')) {
102
+ $(form_map[step]).ScrollTo();
103
+ }
104
+ if(this.removeOnSuccess()){
105
+ if($(this.removeOnSuccess())){
106
+ $(this.removeOnSuccess()).remove();
107
+ }
108
+ }
109
+ if(this.emptyOnSuccess()){
110
+ if($(this.emptyOnSuccess())){
111
+ $(this.emptyOnSuccess()).empty();
112
+ }
113
+ }
114
+ },
115
+ ajaxComplete: function(jqXHR) {
116
+ this.showTrigger();
117
+ if(this.progress_indicator){
118
+ this.progress_indicator.stop();
119
+ }
120
+ try{
121
+ response_data = JSON.parse(jqXHR.responseText)
122
+ } catch(err) {
123
+ response_data = {}
124
+ // hmmm, the response is not JSON, so there's no flash.
125
+ }
126
+ if(typeof response_data.flash_message != 'undefined'){
127
+ var flash_style = this.httpResponseToFlashStyle(jqXHR.status);
128
+ var flash_duration = null;
129
+ if(typeof response_data.flash_persist != 'undefined'){
130
+ if(response_data.flash_persist){
131
+ flash_duration = 'persist'
132
+ } else {
133
+ flash_duration = 'fade'
134
+ }
135
+ }
136
+ if(this.target){
137
+ new thin_man.AjaxFlash(flash_style, response_data.flash_message,this.target, flash_duration);
138
+ }else{
139
+ new thin_man.AjaxFlash(flash_style, response_data.flash_message,this.jq_obj, flash_duration);
140
+ }
141
+ }
142
+ if('function' == typeof this.params.on_complete){
143
+ this.params.on_complete()
144
+ }
145
+ },
146
+ ajaxBefore: function(jqXHr) {
147
+ this.toggleLoading();
148
+ this.progress_indicator = new thin_man.AjaxProgress(this.trigger);
149
+ },
150
+ ajaxError: function(jqXHR) {
151
+ if(jqXHR.status == 409){
152
+ this.error_target.html(jqXHR.responseText);
153
+ }else if(jqXHR.status == 500){
154
+ alert('There was an error communicating with the server.')
155
+ }
156
+ },
157
+ getTrigger: function(){},
158
+ hideTrigger: function(){},
159
+ showTrigger: function(){},
160
+ toggleLoading: function() {
161
+ if(this.target){
162
+ if (this.target.find('[data-loading-visible="false"]').length > 0) {
163
+ this.target.find('[data-loading-visible="false"]').addClass('hidden');
164
+ }
165
+ if (this.target.find('[data-loading-visible="true"]').length > 0) {
166
+ this.target.find('[data-loading-visible="true"]').removeClass('hidden');
167
+ }
168
+ }
169
+ },
170
+ removeOnSuccess: function(){
171
+ return this.jq_obj.data('remove-on-success')
172
+ },
173
+ emptyOnSuccess: function(){
174
+ return this.jq_obj.data('empty-on-success')
175
+ },
176
+ httpResponseToFlashStyle: function(response_code){
177
+ if([403,409,500].indexOf(response_code) > -1){
178
+ return 'error'
179
+ }
180
+ if([200,202].indexOf(response_code) > -1){
181
+ return 'success'
182
+ }
183
+ return 'error'
117
184
  }
118
- }
119
- if ((jqXHR.status == 200) && !(typeof step === 'undefined')) {
120
- $(form_map[step]).ScrollTo();
121
- }
122
- if(this.removeOnSuccess()){
123
- if($(this.removeOnSuccess())){
124
- $(this.removeOnSuccess()).remove();
185
+ }),
186
+ AjaxBrowserPushConnector: Class.extend({
187
+ init: function($connector){
188
+ this.trigger = $connector.find('button, input[type="submit"]');
189
+ if(this.trigger.length < 1){
190
+ this.trigger = $connector;
191
+ }
192
+ this.browser_push_progress_indicator = new thin_man.AjaxProgress(this.trigger);
193
+ $connector.data('browser-push-progress-indicator-object', this.browser_push_progress_indicator);
125
194
  }
126
- }
127
- if(this.emptyOnSuccess()){
128
- if($(this.emptyOnSuccess())){
129
- $(this.emptyOnSuccess()).empty();
195
+ }),
196
+ AjaxBrowserPushFlash: Class.extend({
197
+ init: function($flash){
198
+ this.message = $flash.data('ajax-browser-push-flash')
199
+ this.$target = $($flash.data('ajax-browser-push-flash-target'));
200
+ this.$target.data('ajax-browser-push-flash',this.message);
130
201
  }
131
- }
132
- },
133
- ajaxComplete: function(jqXHR) {
134
- this.showTrigger();
135
- if(this.progress_indicator){
136
- this.progress_indicator.stop();
137
- }
138
- try{
139
- response_data = JSON.parse(jqXHR.responseText)
140
- } catch(err) {
141
- response_data = {}
142
- // hmmm, the response is not JSON, so there's no flash.
143
- }
144
- if(typeof response_data.flash_message != 'undefined'){
145
- var flash_style = this.httpResponseToFlashStyle(jqXHR.status);
146
- var flash_duration = null;
147
- if(typeof response_data.flash_persist != 'undefined'){
148
- if(response_data.flash_persist){
149
- flash_duration = 'persist'
202
+ }),
203
+ AjaxProgress: Class.extend({
204
+ init: function(target){
205
+ if(target.not(':visible')){
206
+ var targetOffset = target.parent().offset();
150
207
  } else {
151
- flash_duration = 'fade'
208
+ var targetOffset = target.offset();
209
+ }
210
+ if(targetOffset){
211
+ var targetLeft = targetOffset.left;
212
+ var targetTop = targetOffset.top;
213
+ this.progress_container = $('#ajax_progress_container').clone();
214
+ uuid = new UUID;
215
+ this.progress_container.prop('id', uuid.value);
216
+ $('body').append(this.progress_container);
217
+ this.progress_container.css({position:'absolute',left: targetLeft, top: targetTop});
218
+ this.progress_container.show();
219
+ }
220
+ },
221
+ stop: function(){
222
+ if(this.progress_container){
223
+ this.progress_container.remove();
224
+ // This is a hack to force finding the element. For some ridiculous reason in certain cases
225
+ // the progress_container is present, can be logged in console, yet cannot be removed.
226
+ // Finding it again by its unique id allows us to remove it. baffled me, but it works now in all known cases.
227
+ $actual_progress_container = $('#' + this.progress_container.attr('id'))
228
+ $actual_progress_container.remove();
152
229
  }
153
230
  }
154
- if(this.target){
155
- new AjaxFlash(flash_style, response_data.flash_message,this.target, flash_duration);
156
- }else{
157
- new AjaxFlash(flash_style, response_data.flash_message,this.jq_obj, flash_duration);
158
- }
159
- }
160
- if('function' == typeof this.params.on_complete){
161
- this.params.on_complete()
162
- }
163
- },
164
- ajaxBefore: function(jqXHr) {
165
- this.toggleLoading();
166
- this.progress_indicator = new AjaxProgress(this.trigger);
167
- },
168
- ajaxError: function(jqXHR) {
169
- if(jqXHR.status == 409){
170
- this.error_target.html(jqXHR.responseText);
171
- }else if(jqXHR.status == 500){
172
- alert('There was an error communicating with the server.')
173
- }
174
- },
175
- getTrigger: function(){},
176
- hideTrigger: function(){},
177
- showTrigger: function(){},
178
- toggleLoading: function() {
179
- if(this.target){
180
- if (this.target.find('[data-loading-visible="false"]').length > 0) {
181
- this.target.find('[data-loading-visible="false"]').addClass('hidden');
231
+ }),
232
+ AjaxFlash: Class.extend({
233
+ init: function(type,message,elem,duration){
234
+ this.flash_container = $('#thin-man-flash-container').clone();
235
+ $('body').append(this.flash_container);
236
+ this.flash_container.css({position:'absolute',visibility: 'hidden'});
237
+ this.alert_type = type;
238
+ this.elem = elem;
239
+ var alert_class = 'alert-' + type;
240
+ this.flash_container.addClass(alert_class);
241
+ $('#thin-man-flash-content', this.flash_container).html(message);
242
+ this.flash_container.show();
243
+ this.setFadeBehavior(duration);
244
+ this.reposition(elem);
245
+ },
246
+ setFadeBehavior: function(duration){
247
+ if(duration){
248
+ if('persist' == duration){
249
+ this.fade = false
250
+ } else {
251
+ this.fade = true
252
+ }
253
+ }else{ //default behavior if persist duration is not sent back with message
254
+ if('error' == this.alert_type || 'warning' == this.alert_type || 'info' == this.alert_type){
255
+ this.fade = false;
256
+ } else {
257
+ this.fade = true;
258
+ }
259
+ }
260
+ },
261
+ reposition: function(elem){
262
+ var this_window = {
263
+ top: $(window).scrollTop(),
264
+ left: $(window).scrollLeft(),
265
+ height: $(window).outerHeight(),
266
+ width: $(window).outerWidth()
267
+ };
268
+ var this_flash = {
269
+ height: this.flash_container.outerHeight(),
270
+ width: this.flash_container.outerWidth()
271
+ }
272
+ this_window.vert_middle = (this_window.top + (this_window.height / 2));
273
+ this_window.horiz_middle = (this_window.left + (this_window.width / 2));
274
+ this_flash.half_height = (this_flash.height / 2);
275
+ this_flash.half_width = (this_flash.width / 2);
276
+ var new_top = this_window.vert_middle - this_flash.half_height;
277
+ var new_left = this_window.horiz_middle - this_flash.half_width;
278
+ this.flash_container.css({left: new_left, top: new_top, visibility: 'visible'});
279
+ var ajax_flash = this;
280
+ if (this.fade) {
281
+ setTimeout(function(){ajax_flash.fadeOut()},1618);
282
+ }
283
+ },
284
+ fadeOut: function(){
285
+ this.flash_container.fadeOut('slow');
182
286
  }
183
- if (this.target.find('[data-loading-visible="true"]').length > 0) {
184
- this.target.find('[data-loading-visible="true"]').removeClass('hidden');
287
+ }),
288
+ AjaxSorter: Class.extend({
289
+ init: function(jq_obj){
290
+ var sort_container = jq_obj;
291
+ var base_url = sort_container.data('url');
292
+ sort_container.sortable({
293
+ helper: "clone",
294
+ tolerance: 'pointer',
295
+ stop: function( event, ui) {
296
+ new thin_man.AjaxSortSubmission(sort_container);
297
+ }
298
+ });
299
+ jq_obj.disableSelection();
185
300
  }
301
+ })
302
+ };
303
+ thin_man.AjaxFormSubmission = thin_man.AjaxSubmission.extend({
304
+ getAjaxUrl: function(){
305
+ return this.jq_obj.attr('action');
306
+ },
307
+ getAjaxType: function(){
308
+ return this.jq_obj.attr('method') || 'POST'
309
+ },
310
+ getData: function(){
311
+ var data_array = this.jq_obj.serializeArray();
312
+ return data_array;
313
+ },
314
+ getTrigger: function(){
315
+ this.trigger = this.jq_obj.find('button, input[type="submit"]');
316
+ },
317
+ hideTrigger: function(){
318
+ this.trigger.css('visibility','hidden');
319
+ },
320
+ showTrigger: function(){
321
+ this.trigger.css('visibility','visible');
186
322
  }
187
- },
188
- removeOnSuccess: function(){
189
- return this.jq_obj.data('remove-on-success')
190
- },
191
- emptyOnSuccess: function(){
192
- return this.jq_obj.data('empty-on-success')
193
- },
194
- httpResponseToFlashStyle: function(response_code){
195
- if([403,409,500].indexOf(response_code) > -1){
196
- return 'error'
323
+ }),
324
+ thin_man.AjaxLinkSubmission = thin_man.AjaxSubmission.extend({
325
+ getAjaxUrl: function(){
326
+ return this.jq_obj.attr('href');
327
+ },
328
+ getData: function(){
329
+ var this_data = {authenticity_token: $('[name="csrf-token"]').attr('content')};
330
+ if(this.jq_obj.data('form-data')){
331
+ $.extend(this_data,this.jq_obj.data('form-data'))
332
+ }
333
+ return this_data
334
+ },
335
+ getAjaxType: function(){
336
+ return this.jq_obj.data('ajax-method') || 'GET'
337
+ },
338
+ getTrigger: function(){
339
+ this.trigger = this.jq_obj;
340
+ },
341
+ hideTrigger: function(){
342
+ this.trigger.css('visibility','hidden');
343
+ },
344
+ showTrigger: function(){
345
+ this.trigger.css('visibility','visible');
197
346
  }
198
- if([200,202].indexOf(response_code) > -1){
199
- return 'success'
347
+ }),
348
+ thin_man.AjaxModalOpener = thin_man.AjaxLinkSubmission.extend({
349
+ ajaxSuccess: function(data,textStatus,jqXHR) {
350
+ this._super(data,textStatus,jqXHR);
351
+ $(this.jq_obj.data('ajax-modal')).modal();
200
352
  }
201
- return 'error'
202
- }
203
- });
204
-
205
- var AjaxBrowserPushConnector = Class.extend({
206
- init: function($connector){
207
- this.trigger = $connector.find('button, input[type="submit"]');
208
- if(this.trigger.length < 1){
209
- this.trigger = $connector;
353
+ }),
354
+ thin_man.AddALineForm = thin_man.AjaxFormSubmission.extend({
355
+ ajaxSuccess: function(data,textStatus,jqXHR) {
356
+ this._super(data,textStatus,jqXHR);
357
+ $(this.jq_obj.data('container')).empty();
358
+ },
359
+ ajaxError: function(jqXHR){
360
+ this.insert_method = 'html';
361
+ this._super(jqXHR);
210
362
  }
211
- this.browser_push_progress_indicator = new AjaxProgress(this.trigger);
212
- $connector.data('browser-push-progress-indicator-object', this.browser_push_progress_indicator);
213
- }
214
- });
215
- var AjaxBrowserPushFlash = Class.extend({
216
- init: function($flash){
217
- this.message = $flash.data('ajax-browser-push-flash')
218
- this.$target = $($flash.data('ajax-browser-push-flash-target'));
219
- this.$target.data('ajax-browser-push-flash',this.message);
220
- }
221
- });
222
- var AjaxProgress = Class.extend({
223
- init: function(target){
224
- if(target.not(':visible')){
225
- var targetOffset = target.parent().offset();
226
- } else {
227
- var targetOffset = target.offset();
363
+ }),
364
+ thin_man.EmptyForm = thin_man.AjaxFormSubmission.extend({
365
+ ajaxSuccess: function(data,textStatus,jqXHR) {
366
+ var clicked_button = $("input[type=submit][clicked=true]")[0];
367
+ this._super(data,textStatus,jqXHR);
368
+ if ($(clicked_button).data('clone') != true) {
369
+ $(this.jq_obj)[0].reset();
370
+ };
371
+ $(this.jq_obj).find('input[type=text],textarea,select').filter(':visible:first').focus();
372
+ $("[data-autocomplete]").trigger("chosen:updated");
373
+ },
374
+ ajaxError: function(jqXHR){
375
+ this.insert_method = 'html';
376
+ this._super(jqXHR);
228
377
  }
229
- if(targetOffset){
230
- var targetLeft = targetOffset.left;
231
- var targetTop = targetOffset.top;
232
- this.progress_container = $('#ajax_progress_container').clone();
233
- uuid = new UUID;
234
- this.progress_container.prop('id', uuid.value);
235
- $('body').append(this.progress_container);
236
- this.progress_container.css({position:'absolute',left: targetLeft, top: targetTop});
237
- this.progress_container.show();
378
+ }),
379
+ thin_man.ModalCloserForm = thin_man.AjaxFormSubmission.extend({
380
+ ajaxSuccess: function(data,textStatus,jqXHR) {
381
+ this._super(data,textStatus,jqXHR);
382
+ $modal = $(this.jq_obj.data('modal-container'));
383
+ $modal.modal('hide');
384
+ $modal.remove();
385
+ },
386
+ ajaxError: function(jqXHR){
387
+ this._super(jqXHR);
388
+ $modal = $(this.jq_obj.data('modal-container'));
389
+ $modal.modal();
238
390
  }
239
- },
240
- stop: function(){
241
- if(this.progress_container){
242
- this.progress_container.remove();
243
- // This is a hack to force finding the element. For some ridiculous reason in certain cases
244
- // the progress_container is present, can be logged in console, yet cannot be removed.
245
- // Finding it again by its unique id allows us to remove it. baffled me, but it works now in all known cases.
246
- $actual_progress_container = $('#' + this.progress_container.attr('id'))
247
- $actual_progress_container.remove();
391
+ }),
392
+ thin_man.ResetOnSubmitForm = thin_man.AjaxFormSubmission.extend({
393
+ ajaxSuccess: function(data, textStatus, jqXHR) {
394
+ this._super(data, textStatus, jqXHR);
395
+ $(this.jq_obj).each(function() {
396
+ this.reset();
397
+ });
248
398
  }
249
- }
250
- });
251
- var AjaxFlash = Class.extend({
252
- init: function(type,message,elem,duration){
253
- this.flash_container = $('#thin-man-flash-container').clone();
254
- $('body').append(this.flash_container);
255
- this.flash_container.css({position:'absolute',visibility: 'hidden'});
256
- this.alert_type = type;
257
- this.elem = elem;
258
- var alert_class = 'alert-' + type;
259
- this.flash_container.addClass(alert_class);
260
- $('#thin-man-flash-content', this.flash_container).html(message);
261
- this.flash_container.show();
262
- this.setFadeBehavior(duration);
263
- this.reposition(elem);
264
- },
265
- setFadeBehavior: function(duration){
266
- if(duration){
267
- if('persist' == duration){
268
- this.fade = false
269
- } else {
270
- this.fade = true
271
- }
272
- }else{ //default behavior if persist duration is not sent back with message
273
- if('error' == this.alert_type || 'warning' == this.alert_type || 'info' == this.alert_type){
274
- this.fade = false;
275
- } else {
276
- this.fade = true;
399
+ }),
400
+ thin_man.DeleteLink = thin_man.AjaxSubmission.extend({
401
+ ajaxSuccess: function(data,textStatus,jqXHR){
402
+ this._super(data,textStatus,jqXHR);
403
+ if(this.target){
404
+ this.target.remove();
277
405
  }
406
+ },
407
+ getAjaxType: function(){
408
+ return 'DELETE';
409
+ },
410
+ getAjaxUrl: function(){
411
+ return this.jq_obj.attr('href');
412
+ },
413
+ getData: function(){
414
+ return {authenticity_token: $('[name="csrf-token"]').attr('content')};
415
+ },
416
+ ajaxBefore: function(jqXHR){
417
+ return confirm("Are you sure you want to delete this?");
278
418
  }
279
- },
280
- reposition: function(elem){
281
- var this_window = {
282
- top: $(window).scrollTop(),
283
- left: $(window).scrollLeft(),
284
- height: $(window).outerHeight(),
285
- width: $(window).outerWidth()
286
- };
287
- var this_flash = {
288
- height: this.flash_container.outerHeight(),
289
- width: this.flash_container.outerWidth()
290
- }
291
- this_window.vert_middle = (this_window.top + (this_window.height / 2));
292
- this_window.horiz_middle = (this_window.left + (this_window.width / 2));
293
- this_flash.half_height = (this_flash.height / 2);
294
- this_flash.half_width = (this_flash.width / 2);
295
- var new_top = this_window.vert_middle - this_flash.half_height;
296
- var new_left = this_window.horiz_middle - this_flash.half_width;
297
- this.flash_container.css({left: new_left, top: new_top, visibility: 'visible'});
298
- var ajax_flash = this;
299
- if (this.fade) {
300
- setTimeout(function(){ajax_flash.fadeOut()},1618);
419
+ }),
420
+ thin_man.ReplaceDelete = thin_man.DeleteLink.extend({
421
+ ajaxSuccess: function(data,textStatus,jqXHR){
422
+ this.target[this.insert_method](data);
423
+ },
424
+ ajaxBefore: function(jqXHR){
425
+ //noop
301
426
  }
302
- },
303
- fadeOut: function(){
304
- this.flash_container.fadeOut('slow');
305
- }
306
- });
307
-
308
- var AjaxFormSubmission = AjaxSubmission.extend({
309
- getAjaxUrl: function(){
310
- return this.jq_obj.attr('action');
311
- },
312
- getAjaxType: function(){
313
- return this.jq_obj.attr('method') || 'POST'
314
- },
315
- getData: function(){
316
- var data_array = this.jq_obj.serializeArray();
317
- return data_array;
318
- },
319
- getTrigger: function(){
320
- this.trigger = this.jq_obj.find('button, input[type="submit"]');
321
- },
322
- hideTrigger: function(){
323
- this.trigger.css('visibility','hidden');
324
- },
325
- showTrigger: function(){
326
- this.trigger.css('visibility','visible');
327
- }
328
- });
427
+ }),
428
+ thin_man.AjaxSortSubmission = thin_man.AjaxLinkSubmission.extend({
429
+ getAjaxUrl: function(){
430
+ return this._super() + '?' + this.jq_obj.sortable("serialize");
431
+ },
432
+ getAjaxType: function(){
433
+ return 'PUT';
434
+ },
435
+ ajaxSuccess: function(){
329
436
 
330
- var AjaxLinkSubmission = AjaxSubmission.extend({
331
- getAjaxUrl: function(){
332
- return this.jq_obj.attr('href');
333
- },
334
- getData: function(){
335
- var this_data = {authenticity_token: $('[name="csrf-token"]').attr('content')};
336
- if(this.jq_obj.data('form-data')){
337
- $.extend(this_data,this.jq_obj.data('form-data'))
338
437
  }
339
- return this_data
340
- },
341
- getAjaxType: function(){
342
- return this.jq_obj.data('ajax-method') || 'GET'
343
- },
344
- getTrigger: function(){
345
- this.trigger = this.jq_obj;
346
- },
347
- hideTrigger: function(){
348
- this.trigger.css('visibility','hidden');
349
- },
350
- showTrigger: function(){
351
- this.trigger.css('visibility','visible');
352
- }
353
- });
354
-
355
- var AjaxModalOpener = AjaxLinkSubmission.extend({
356
- ajaxSuccess: function(data,textStatus,jqXHR) {
357
- this._super(data,textStatus,jqXHR);
358
- $(this.jq_obj.data('ajax-modal')).modal();
359
- }
360
- });
361
-
362
- var AddALineForm = AjaxFormSubmission.extend({
363
- ajaxSuccess: function(data,textStatus,jqXHR) {
364
- this._super(data,textStatus,jqXHR);
365
- $(this.jq_obj.data('container')).empty();
366
- },
367
- ajaxError: function(jqXHR){
368
- this.insert_method = 'html';
369
- this._super(jqXHR);
370
- }
371
- });
372
-
373
- var EmptyForm = AjaxFormSubmission.extend({
374
- ajaxSuccess: function(data,textStatus,jqXHR) {
375
- var clicked_button = $("input[type=submit][clicked=true]")[0];
376
- this._super(data,textStatus,jqXHR);
377
- if ($(clicked_button).data('clone') != true) {
378
- $(this.jq_obj)[0].reset();
379
- };
380
- $(this.jq_obj).find('input[type=text],textarea,select').filter(':visible:first').focus();
381
- $("[data-autocomplete]").trigger("chosen:updated");
382
- },
383
- ajaxError: function(jqXHR){
384
- this.insert_method = 'html';
385
- this._super(jqXHR);
386
- }
387
- });
388
-
389
- var ModalCloserForm = AjaxFormSubmission.extend({
390
- ajaxSuccess: function(data,textStatus,jqXHR) {
391
- this._super(data,textStatus,jqXHR);
392
- $modal = $(this.jq_obj.data('modal-container'));
393
- $modal.modal('hide');
394
- $modal.remove();
395
- },
396
- ajaxError: function(jqXHR){
397
- this._super(jqXHR);
398
- $modal = $(this.jq_obj.data('modal-container'));
399
- $modal.modal();
400
- }
401
- });
402
-
403
- var ResetOnSubmitForm = AjaxFormSubmission.extend({
404
- ajaxSuccess: function(data, textStatus, jqXHR) {
405
- this._super(data, textStatus, jqXHR);
406
- $(this.jq_obj).each(function() {
407
- this.reset();
438
+ })
439
+ $(document).ready(function(){
440
+ $(document).on('click','[data-ajax-link]',function(e){
441
+ e.preventDefault();
442
+ var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'),'AjaxLinkSubmission'));
443
+ var submission = new this_class($(this));
444
+ return false;
408
445
  });
409
- }
410
- });
411
-
412
- var DeleteLink = AjaxSubmission.extend({
413
- ajaxSuccess: function(data,textStatus,jqXHR){
414
- this._super(data,textStatus,jqXHR);
415
- if(this.target){
416
- this.target.remove();
417
- }
418
- },
419
- getAjaxType: function(){
420
- return 'DELETE';
421
- },
422
- getAjaxUrl: function(){
423
- return this.jq_obj.attr('href');
424
- },
425
- getData: function(){
426
- return {authenticity_token: $('[name="csrf-token"]').attr('content')};
427
- },
428
- ajaxBefore: function(jqXHR){
429
- return confirm("Are you sure you want to delete this?");
430
- }
431
- });
432
-
433
- var AjaxSortSubmission = AjaxLinkSubmission.extend({
434
- getAjaxUrl: function(){
435
- return this._super() + '?' + this.jq_obj.sortable("serialize");
436
- },
437
- getAjaxType: function(){
438
- return 'PUT';
439
- },
440
- ajaxSuccess: function(){
441
446
 
442
- }
443
- });
444
-
445
- var AjaxSorter = Class.extend({
446
- init: function(jq_obj){
447
- var sort_container = jq_obj;
448
- var base_url = sort_container.data('url');
449
- sort_container.sortable({
450
- helper: "clone",
451
- tolerance: 'pointer',
452
- stop: function( event, ui) {
453
- new AjaxSortSubmission(sort_container);
454
- }
447
+ $(document).on('submit','[data-ajax-form]',function(e){
448
+ e.preventDefault();
449
+ var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'),'AjaxFormSubmission'));
450
+ var submission = new this_class($(this));
451
+ return false;
455
452
  });
456
- jq_obj.disableSelection();
457
- }
458
- });
459
-
460
453
 
461
- var AjaxPushState = Class.extend({
462
- init: function(obj) {
463
- if (obj.data('push-state') != null && obj.data('push-state') != "" && !obj.data('tab-trigger')) {
464
- history.pushState(null, null, obj.data('push-state'));
465
- }
466
- }
467
- });
454
+ $(document).on('click','[data-ajax-delete]',function(e){
455
+ e.preventDefault();
456
+ var this_class = eval('thin_man.' + thin_man.getSubClass($(this).data('sub-type'),'DeleteLink'));
457
+ var deletion = new this_class($(this));
458
+ });
468
459
 
469
- $(document).ready(function(){
470
- $(document).on('click','[data-ajax-link]',function(e){
471
- e.preventDefault();
472
- var this_class = eval(getSubClass($(this).data('sub-type'),'AjaxLinkSubmission'));
473
- var submission = new this_class($(this));
474
- return false;
475
- });
460
+ $(document).on('click', '[data-change-url]',function(e){
461
+ e.preventDefault();
462
+ new thin_man.AjaxPushState($(this))
463
+ })
476
464
 
477
- $(document).on('submit','[data-ajax-form]',function(e){
478
- e.preventDefault();
479
- var this_class = eval(getSubClass($(this).data('sub-type'),'AjaxFormSubmission'));
480
- var submission = new this_class($(this));
481
- return false;
482
- });
465
+ $('[data-sortable]').each(function(){
466
+ new thin_man.AjaxSorter($(this));
467
+ });
483
468
 
484
- $(document).on('click','[data-ajax-delete]',function(e){
485
- e.preventDefault();
486
- var this_class = eval(getSubClass($(this).data('sub-type'),'DeleteLink'));
487
- var deletion = new this_class($(this));
488
469
  });
489
470
 
490
- $(document).on('click', '[data-change-url]',function(e){
491
- e.preventDefault();
492
- new AjaxPushState($(this))
493
- })
471
+ };
494
472
 
495
- $('[data-sortable]').each(function(){
496
- new AjaxSorter($(this));
473
+ if(typeof Class === "undefined"){
474
+ $.getScript('https://rawgit.com/edraut/js_inheritance/a6c1e40986ecb276335b0a0b1792abd01f05ff6c/inheritance.js', function(){
475
+ initThinMan();
497
476
  });
498
-
499
- });
477
+ }else{
478
+ initThinMan();
479
+ }
@@ -1,3 +1,3 @@
1
1
  module ThinMan
2
- VERSION = "0.8.0"
2
+ VERSION = "0.8.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thin_man
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Draut, Adam Bialek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-30 00:00:00.000000000 Z
11
+ date: 2015-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails