drg_cms 0.5.52.9 → 0.6.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +402 -63
  3. data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
  4. data/app/assets/javascripts/drg_cms_application.js +2 -1
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +365 -140
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +13 -4
  8. data/app/controllers/cmsedit_controller.rb +415 -242
  9. data/app/controllers/dc_application_controller.rb +193 -29
  10. data/app/controllers/dc_common_controller.rb +77 -70
  11. data/app/{controllers → controls}/browse_models_control.rb +1 -1
  12. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  13. data/app/controls/dc_poll_result_control.rb +88 -0
  14. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  15. data/app/forms/all_options.yml +46 -7
  16. data/app/forms/cms_menu.yml +26 -17
  17. data/app/forms/dc_ad.yml +11 -22
  18. data/app/forms/dc_design.yml +19 -16
  19. data/app/forms/dc_filter.yml +3 -6
  20. data/app/forms/dc_gallery.yml +53 -0
  21. data/app/forms/dc_json_ld.yml +59 -0
  22. data/app/forms/dc_key_value.yml +32 -0
  23. data/app/forms/dc_link.yml +16 -10
  24. data/app/forms/dc_menu_item.yml +6 -0
  25. data/app/forms/dc_page.yml +2 -7
  26. data/app/forms/dc_poll.yml +4 -4
  27. data/app/forms/dc_poll_result.yml +74 -0
  28. data/app/forms/dc_poll_result_export.yml +35 -0
  29. data/app/forms/dc_removed_url.yml +42 -0
  30. data/app/forms/dc_seo.yml +33 -0
  31. data/app/forms/dc_site.yml +5 -5
  32. data/app/forms/json_ld_schema.yml +168 -0
  33. data/app/helpers/cmsedit_edit_helper.rb +471 -0
  34. data/app/helpers/cmsedit_helper.rb +152 -767
  35. data/app/helpers/cmsedit_index_helper.rb +567 -0
  36. data/app/helpers/dc_application_helper.rb +221 -43
  37. data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
  38. data/app/models/concerns/dc_page_concern.rb +31 -6
  39. data/app/models/concerns/dc_seo_concern.rb +66 -0
  40. data/app/models/concerns/dc_site_concern.rb +1 -1
  41. data/app/models/concerns/dc_user_concern.rb +7 -4
  42. data/app/models/dc_design.rb +5 -2
  43. data/app/models/dc_filter.rb +34 -18
  44. data/app/models/dc_gallery.rb +64 -0
  45. data/app/models/dc_json_ld.rb +152 -0
  46. data/app/models/dc_key_value.rb +48 -0
  47. data/app/models/dc_link.rb +1 -0
  48. data/app/models/dc_memory.rb +26 -4
  49. data/app/models/dc_page.rb +1 -2
  50. data/app/models/dc_poll.rb +38 -19
  51. data/app/models/dc_poll_result.rb +44 -0
  52. data/app/models/dc_removed_url.rb +54 -0
  53. data/app/models/dc_temp.rb +137 -0
  54. data/app/models/drgcms_form_fields.rb +0 -1580
  55. data/app/models/drgcms_form_fields/action.rb +61 -0
  56. data/app/models/drgcms_form_fields/check_box.rb +72 -0
  57. data/app/models/drgcms_form_fields/comment.rb +53 -0
  58. data/app/models/drgcms_form_fields/date_picker.rb +103 -0
  59. data/app/models/drgcms_form_fields/date_select.rb +68 -0
  60. data/app/models/drgcms_form_fields/datetime_picker.rb +88 -0
  61. data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
  62. data/app/models/drgcms_form_fields/drgcms_field.rb +273 -0
  63. data/app/models/drgcms_form_fields/embedded.rb +89 -0
  64. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  65. data/app/models/drgcms_form_fields/file_select.rb +70 -0
  66. data/app/models/drgcms_form_fields/hash_field.rb +86 -0
  67. data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
  68. data/app/models/drgcms_form_fields/html_field.rb +70 -0
  69. data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
  70. data/app/models/drgcms_form_fields/link_to.rb +69 -0
  71. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +198 -0
  72. data/app/models/drgcms_form_fields/number_field.rb +92 -0
  73. data/app/models/drgcms_form_fields/password_field.rb +62 -0
  74. data/app/models/drgcms_form_fields/radio.rb +91 -0
  75. data/app/models/drgcms_form_fields/readonly.rb +79 -0
  76. data/app/models/drgcms_form_fields/select.rb +209 -0
  77. data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
  78. data/app/models/drgcms_form_fields/text_area.rb +68 -0
  79. data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
  80. data/app/models/drgcms_form_fields/text_field.rb +56 -0
  81. data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
  82. data/app/models/drgcms_form_fields/tree_select.rb +169 -0
  83. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  84. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +0 -0
  85. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  86. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  87. data/app/renderers/dc_gallery_renderer.rb +94 -0
  88. data/app/{helpers → renderers}/dc_menu_renderer.rb +12 -4
  89. data/app/{helpers → renderers}/dc_page_renderer.rb +20 -3
  90. data/app/{helpers → renderers}/dc_part_renderer.rb +4 -4
  91. data/app/{helpers → renderers}/dc_piece_renderer.rb +0 -0
  92. data/app/{helpers → renderers}/dc_poll_renderer.rb +50 -20
  93. data/app/{helpers → renderers}/dc_renderer.rb +0 -0
  94. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +22 -26
  95. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  96. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  97. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  98. data/app/views/cmsedit/_form.html.erb +4 -3
  99. data/app/views/cmsedit/_result.html.erb +2 -3
  100. data/app/views/cmsedit/edit.html.erb +2 -1
  101. data/app/views/cmsedit/index.html.erb +6 -1
  102. data/app/views/cmsedit/new.html.erb +1 -1
  103. data/config/locales/drgcms_en.yml +12 -1
  104. data/config/locales/drgcms_sl.yml +13 -2
  105. data/config/locales/models_en.yml +94 -17
  106. data/config/locales/models_sl.yml +92 -14
  107. data/drg_cms.gemspec +4 -5
  108. data/lib/drg_cms.rb +6 -2
  109. data/lib/drg_cms/engine.rb +1 -2
  110. data/lib/drg_cms/version.rb +25 -2
  111. data/lib/generators/new_drg_form/new_drg_form_generator.rb +17 -7
  112. data/lib/tasks/browse_models.rake +4 -4
  113. data/lib/tasks/dc_cleanup.rake +1 -1
  114. metadata +76 -33
  115. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  116. data/test/fixtures/drg_cms_test_data.rb +0 -87
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 40fa56fbdb21a8a10e26ebeefc4f9ebf1a0a41d3
4
- data.tar.gz: f3c627f7e59044e1826d120174b91c06d7d0ee25
2
+ SHA256:
3
+ metadata.gz: ce40eeb1428b5e11a14613978b213af29ad3a26c4f68a0addc2987135df60ece
4
+ data.tar.gz: 880a2bca2c8dac8e5e5cb5723e6acca268a9f0f4f439a4befe6a34b7b4a1dbd3
5
5
  SHA512:
6
- metadata.gz: 377369ee96b9fa738a115e607d3e187ab5a1bb951ea767add202be5cc3e3d1ef9f83f39a03ce8411c8c3fc86889c7d250e4f22c2ee51448b90b1ecc0492b0942
7
- data.tar.gz: 2db3772bf7c84abf8a316eb3519f74e86b0d2a2925214f6e8a2a328f2b683ef6fa67df3d56cc4363d2481c7de9e77b030d2481c49ebe720e28a7d43623052f7e
6
+ metadata.gz: 389d89408cd1e628ac26b0ec08de34c55851f84094e4258f9e98b7c036f48c992a84dd5c61385bd9ebb0592cb2df3e8dd0cc2c61808820b9e3c43bbb5dc5f7aa
7
+ data.tar.gz: 5c30cabb9b66750e0a6cc9783510dd15cb3ed866f9fca39d06c1037baa8c2c41db5798121f49b4b0e847163396eae77a68d99e8d8c548db55c57ea08f4d17dfd
@@ -28,6 +28,7 @@
28
28
  *******************************************************************/
29
29
  $.getUrlParam = function(name) {
30
30
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
31
+ if (results == null) return null;
31
32
  return results[1] || 0;
32
33
  };
33
34
 
@@ -42,14 +43,89 @@ dumpAttributes = function(obj) {
42
43
  };
43
44
 
44
45
  /*******************************************************************
45
- * Trying to remove background from iframe element. It is not yet working.
46
+ * Function checks if there are delay loaded embedded elements on
47
+ * selected tab and triggers iframe reload.
46
48
  *******************************************************************/
47
- remove_background_from_iframe = function(obj) {
48
- var head = obj.head;
49
- var css = '<style type="text/css">' +
50
- 'body{background: none; background-picture:none; } ' +
51
- '</style>';
52
- $(head).append(css);
49
+ update_embedded_on_first_display = function(div_name) {
50
+ var iframes = $(div_name).find("iframe");
51
+ $.each(iframes, function(index, iframe) {
52
+ var src_delay = iframe.getAttribute('data-src-delay');
53
+ if (src_delay != null && src_delay != '') {
54
+ iframe.setAttribute('data-src-delay', '');
55
+ iframe.setAttribute('src', src_delay);
56
+ }
57
+ });
58
+ };
59
+
60
+ /*******************************************************************
61
+ * Return false when confirmation is not required
62
+ *******************************************************************/
63
+ confirmation_is_cancled = function(object) {
64
+ var confirmation = object.getAttribute("data-confirm");
65
+ // if confirmation required
66
+ if (confirmation !== null) {
67
+ if (!confirm(confirmation)) {return true;}
68
+ }
69
+ return false;
70
+ };
71
+
72
+ /*******************************************************************
73
+ * Will update select field on the form which select options are dependend
74
+ * on other field value. It calls /dc_common/autocomplete and passes
75
+ * methodname and depend field value to obtain new values for select field.
76
+ *******************************************************************/
77
+ update_select_depend = function(select_name, depend_name, method) {
78
+ var select_field = $('#'+select_name);
79
+ var depend_field = $('#'+depend_name);
80
+
81
+ $.ajax({
82
+ url: "/dc_common/autocomplete",
83
+ type: "POST",
84
+ dataType: "json",
85
+ data: { input: depend_field.val(), search: method},
86
+ success: function(data) {
87
+
88
+ select_field.empty();
89
+ $.each(data, function(index, element) {
90
+ select_field.append( new Option(element['label'], element['id']) );
91
+ });
92
+ }
93
+ });
94
+ };
95
+
96
+ /*******************************************************************
97
+ * Format number input field according to data
98
+ *******************************************************************/
99
+ format_number_field = function(e) {
100
+ var decimals = e.attr("data-decimal") || 2;
101
+ var delimiter = e.attr("data-delimiter") || '.';
102
+ var separator = e.attr("data-separator") || ',';
103
+ var currency = e.attr("data-currency") || '';
104
+ var whole = e.val().split(separator)[0];
105
+ var dec = e.val().split(separator)[1];
106
+ // save value to hidden field which will be used for return
107
+ var field = '#' + e.attr("id").slice(0,-1);
108
+ var value = e.val().replace(delimiter,'.');
109
+
110
+ $(field).val( parseFloat(value).toFixed(decimals) );
111
+
112
+ // decimal part
113
+ if (dec == null) dec = '';
114
+ dec = dec.substring(0, decimals, dec);
115
+ while (dec.length < decimals) dec = dec + '0';
116
+ // whole part
117
+ if (whole == null || whole == '') whole = '0';
118
+ var ar = [];
119
+
120
+ while (whole.length > 0) {
121
+ var pos1 = whole.length - 3
122
+ if (pos1 < 0) pos1 = 0;
123
+ ar.unshift(whole.substr(pos1,3));
124
+ whole = whole.slice(0, -3);
125
+ };
126
+
127
+ if (delimiter !== '') whole = ar.join(delimiter);
128
+ e.val(whole + separator + dec + currency);
53
129
  };
54
130
 
55
131
  /*******************************************************************
@@ -67,10 +143,10 @@ $(function() {
67
143
  *
68
144
  * Protocol consists of operation and value which are returned as json by
69
145
  * called controller. Controller will return an ajax call usually like this:
70
- * render json: {operation: value}.to_json
146
+ * render json: {operation: value}
71
147
  *
72
148
  * Operation is further divided into source and determinator which are divided by underline char.
73
- * render json: {#div_status: 'OK!'}.to_json
149
+ * render json: {#div_status: 'OK!'}
74
150
  * will replace html in div="status" with value 'OK!'. Source is '#div' determinator is 'status'.
75
151
  *
76
152
  * Possible operators are:
@@ -80,6 +156,8 @@ $(function() {
80
156
  * msg_warn: will display warning message.
81
157
  * msg_info: will display informational message.
82
158
  *
159
+ * popup: will display popup message
160
+ *
83
161
  * #div_divname : will replace divname with value
84
162
  * #div+_divname : will append value to divname
85
163
  * #+div_divname : will prepend value to divname
@@ -100,64 +178,107 @@ $(function() {
100
178
  *******************************************************************/
101
179
 
102
180
  process_json_result = function(json) {
103
- var i,operation,what, selector;
104
- $.each(json, function(key, val) {
181
+ var i,w,operation,selector, msg_div, field;
182
+ $.each(json, function(key, value) {
105
183
  i = key.search('_');
106
184
  if (i > 1) {
107
185
  operation = key.substring(0,i);
108
- what = key.substring(i+1,100);
186
+ selector = key.substring(i+1,100);
109
187
  } else {
110
188
  operation = key;
111
- what = '';
189
+ selector = '';
112
190
  }
113
- //
191
+ //
114
192
  switch (operation) {
115
- // update field
193
+
194
+ /**** update fields on form ****/
116
195
  case 'record':
117
- $('#'+key).val(val);
196
+ field = $('#'+key);
197
+ // checkbox field
198
+ if (field.is(':checkbox')) {
199
+ field.prop('checked', value);
200
+ // select field
201
+ } else if (field.is('select')) {
202
+ // options for select field
203
+ if (value && value.isArray) {
204
+ field.empty();
205
+ $.each(value, function(index, v) {
206
+ field.append( new Option(v[0], v[1]) );
207
+ });
208
+ // select field value
209
+ } else {
210
+ field.val(value);
211
+ }
212
+ // other input fields
213
+ } else {
214
+ field.val(value);
215
+ }
118
216
  break;
119
- // display message
217
+
218
+ /**** display message ****/
120
219
  case 'msg':
121
- selector = 'dc-form-' + what;
122
- if ( $('.'+selector).length == 0 ) {
123
- val = '<div class="' + selector + '">' + val + '</div>';
124
- $('.dc-title').after(val);
220
+ msg_div = 'dc-form-' + selector;
221
+ if ( $('.'+msg_div).length == 0 ) {
222
+ value = '<div class="' + msg_div + '">' + value + '</div>';
223
+ $('.dc-title').after(value);
125
224
  } else {
126
- $('.'+selector).html(val);
225
+ $('.'+msg_div).html(value);
127
226
  }
128
227
  break;
129
- // update div
228
+
229
+ /**** display popup message ****/
230
+ case 'popup':
231
+ $('#popup').html(value);
232
+ $('#popup').bPopup({ speed: 650, transition: 'slideDown' });
233
+
234
+ /**** update div ****/
130
235
  case '#div+':
131
- $('#'+what).append(val);
236
+ $('#'+selector).append(value);
132
237
  break;
133
238
  case '#+div':
134
- $('#'+what).prepend(val);
239
+ $('#'+selector).prepend(value);
135
240
  break;
136
241
  case '#div':
137
- $('#'+what).html(val);
242
+ $('#'+selector).html(value);
138
243
  break;
139
244
  case '.div+':
140
- $('.'+what).append(val);
245
+ $('.'+selector).append(value);
141
246
  break;
142
247
  case '.+div':
143
- $('.'+what).prepend(val);
248
+ $('.'+selector).prepend(value);
144
249
  break;
145
250
  case '.div':
146
- $('.'+what).html(val);
251
+ $('.'+selector).html(value);
147
252
  break;
148
- // goto url
253
+
254
+ /**** goto url ****/
149
255
  case 'url':
150
- window.location.href = val;
256
+ window.location.href = value;
151
257
  break;
152
258
  case 'alert':
153
- alert(val);
259
+ alert(value);
154
260
  break;
155
261
  case 'window':
156
- w = window.open(val, what);
262
+ if (value == 'close') { window.close();
263
+ } else if (value == 'reload') { location.reload();
264
+ } else {
265
+ w = window.open(value, selector);
266
+ w.focus();
267
+ }
268
+ break;
269
+ case 'newwindow':
270
+ w = window.open(value, selector,"location=no,scrollbars=yes,resizable=yes");
157
271
  w.focus();
158
272
  break;
273
+ case 'eval':
274
+ eval (value);
275
+ break;
159
276
  case 'reload':
160
- location.reload();
277
+ if (value == 'parent') {
278
+ parent.location.reload();
279
+ } else {
280
+ location.reload();
281
+ }
161
282
  break;
162
283
  default:
163
284
  console.log("DRGCMS: Invalid ajax result operation: " + operation);
@@ -197,6 +318,21 @@ $.fn.dc_scroll_view = function () {
197
318
  });
198
319
  };
199
320
 
321
+ /*******************************************************************
322
+ * Updates single field on parent iframe form of embedded form.
323
+ *******************************************************************/
324
+ process_parent_form_updates = function(element) {
325
+ var field = element.getAttribute("data-field");
326
+ var value = element.getAttribute("data-value");
327
+ if ( window.parent.$('#'+field).length > 0 ) {
328
+ if (field.substring(0,3) === 'td_') { // readonly field
329
+ window.parent.$('#'+field+' > div').html(value);
330
+ } else { // input field
331
+ window.parent.$('#'+field).val(value);
332
+ }
333
+ }
334
+ };
335
+
200
336
  /*******************************************************************
201
337
  *
202
338
  *******************************************************************/
@@ -209,6 +345,27 @@ $(document).ready( function() {
209
345
  // select_first_input_field('.dc-form');
210
346
  }
211
347
  */
348
+ /*******************************************************************
349
+ * It will scroll display to ypos if return_to_ypos parameter is present
350
+ *******************************************************************/
351
+ if (window.location.href.match(/return_to_ypos=/))
352
+ {
353
+ window.scrollTo(0, $.getUrlParam('return_to_ypos'));
354
+ }
355
+
356
+ /*******************************************************************
357
+ * The idea is to update fields on parent iframe form, when embedded document
358
+ * is updated in its iframe. Update fields are listed in .dc-form-updates div
359
+ * and are set by flash[:update] Hash object.
360
+ *
361
+ * eg. flash[:update] = {'td_record_radonly' => 'New value for read_only field',
362
+ * 'record_name' => 'New name'}
363
+ *******************************************************************/
364
+ if ( $('.dc-form-updates').length > 0 ) {
365
+ $('.dc-form-updates').children().each( function( index, element ) {
366
+ process_parent_form_updates(element);
367
+ });
368
+ }
212
369
 
213
370
  /*******************************************************************
214
371
  * Register ad clicks
@@ -218,6 +375,17 @@ $(document).ready( function() {
218
375
  return true;
219
376
  });
220
377
 
378
+ /*****************************************************************
379
+ * Toggle CMS mode. When clicked on left 30 pixels, window will be scrolled approximately
380
+ * to the position wher toggle was clicked. When clicked from pixel 31 and on it will
381
+ * stay on the top of window.
382
+ ******************************************************************/
383
+ $('.cms-toggle').bind('click', function(e) {
384
+ var url = '/dc_common/toggle_edit_mode?return_to=' + window.location.href;
385
+ if (e.pageX < 30) url = url + '&return_to_ypos=' + e.pageY ;
386
+ window.location.href = url;
387
+ });
388
+
221
389
  /*******************************************************************
222
390
  * Popup or close CMS edit menu on icon click
223
391
  *******************************************************************/
@@ -251,11 +419,11 @@ $(document).ready( function() {
251
419
  * Tab clicked on form. Hide old and show selected div.
252
420
  *******************************************************************/
253
421
  $('.dc-form-li').on('click', function(e) {
254
- // find li with dc-form-li-selected class. This is our old tab
422
+ // find li with dc-form-li-selected class. This is our old tab
255
423
  var old_tab_id = null;
256
424
  $(e.target).parents('ul').find('li').each( function() {
257
425
  if ($(this).hasClass('dc-form-li-selected')) {
258
- // when not already selected toggle dc-form-li-selected class and save old tab
426
+ // when not already selected toggle dc-form-li-selected class and save old tab
259
427
  if ($(this) !== $(e.target)) {
260
428
  $(this).toggleClass('dc-form-li-selected');
261
429
  $(e.target).toggleClass('dc-form-li-selected');
@@ -268,11 +436,15 @@ $(document).ready( function() {
268
436
  if (old_tab_id !== null) {
269
437
  $('#data_' + old_tab_id).toggleClass('div-hidden');
270
438
  $('#data_' + e.target.getAttribute("data-div")).toggleClass('div-hidden');
271
- // resize parent iframe to fit selected tab size
272
- var div_height = document.getElementById('data_' + e.target.getAttribute("data-div")).clientHeight + 130;
273
- window.frameElement.style.height = div_height.toString() + 'px';
439
+
440
+ // resize parent iframe to fit selected tab size
441
+ // var div_height = document.getElementById('data_' + e.target.getAttribute("data-div")).clientHeight + 130;
442
+ // var div_height = document.getElementById('cmsform').clientHeight + 50;
443
+ var div_height = document.body.scrollHeight;
444
+ window.frameElement.style.height = div_height.toString() + 'px';
274
445
  // it would be too easy $('#cmsform :input:enabled:visible:first').focus();
275
446
  select_first_input_field('#data_' + e.target.getAttribute("data-div"));
447
+ update_embedded_on_first_display('#data_' + e.target.getAttribute("data-div"));
276
448
  }
277
449
  });
278
450
 
@@ -280,10 +452,9 @@ $(document).ready( function() {
280
452
  * Resize iframe_cms to the size of its contents. Make at least 500 px high
281
453
  * unless on initial display.
282
454
  *******************************************************************/
283
- $('#iframe_cms').load( function() {
284
- // alert('bla 1');
455
+ $('#iframe_cms').on('load', function() {
285
456
  new_height = this.contentWindow.document.body.offsetHeight + 50;
286
- if (new_height < 500 & new_height > 60) new_height = 500;
457
+ if (new_height < 500 && new_height > 60) new_height = 500;
287
458
  this.style.height = new_height + 'px';
288
459
  // scroll to top
289
460
  $('#iframe_cms').dc_scroll_view();
@@ -293,7 +464,7 @@ $(document).ready( function() {
293
464
  * Same goes for editiframe. Resize it + 30px
294
465
  * unless on initial display with no data
295
466
  *******************************************************************/
296
- $('#iframe_edit').load( function() {
467
+ $('#iframe_edit').on('load', function() {
297
468
  // console.log(this.contentWindow.document.body.offsetHeight);
298
469
  if (this.contentWindow.document.body.offsetHeight > 10) {
299
470
  this.style.height = (this.contentWindow.document.body.offsetHeight + 30) + 'px';
@@ -306,37 +477,78 @@ $(document).ready( function() {
306
477
  * Process Ajax call on cmsedit form actions
307
478
  *******************************************************************/
308
479
  $('.dc-link-ajax').on('click', function(e) {
309
- var target = e.target;
310
- var req = target.getAttribute("data-request");
311
- /* Get some values from elements on the page: */
480
+ // confirmation if required
481
+ if (confirmation_is_cancled(this)) {return false;}
482
+
483
+ // check HTML5 validations
484
+ if ($("form")[0] && !$("form")[0].checkValidity() ) {
485
+ $("form")[0].reportValidity();
486
+ return false;
487
+ }
488
+ var req = this.getAttribute("data-request");
489
+ // Get values from elements on the page:
312
490
  if (req == "script") {
313
- eval (target.getAttribute("data-script"));
491
+ eval (this.getAttribute("data-script"));
314
492
  return false;
315
493
  }
316
494
  else if (req == "post") {
317
495
  data = $('form').serialize();
318
- // alert(data);
319
496
  }
320
497
  else {
321
498
  data = {};
322
499
  req = 'get'; // by default
323
500
  }
324
501
 
325
- $('.dc-spinner').toggleClass('div-hidden');
502
+ $('.dc-spinner').show();
326
503
  $.ajax({
327
- url: target.getAttribute("data-url"),
504
+ url: this.getAttribute("data-url"),
328
505
  type: req,
329
506
  dataType: "json",
330
507
  data: data,
331
- // success: function(files,data,xhr) {
332
- // document.getElementById('if_priponkas').contentDocument.location.reload(true);
333
- // }
334
508
  success: function(data) {
335
509
  process_json_result(data);
336
- $('.dc-spinner').toggleClass('div-hidden');
510
+ $('.dc-spinner').hide();
337
511
  }
338
512
 
339
513
  });
514
+ });
515
+
516
+ /*******************************************************************
517
+ * Process action submit button click.
518
+ *******************************************************************/
519
+ $('.dc-action-submit').on('click', function(e) {
520
+ // confirmation if required
521
+ if (confirmation_is_cancled(this)) {return false;}
522
+
523
+ // check HTML5 validations
524
+ var form = $("form")[0];
525
+ if (form && !form.checkValidity() ) {
526
+ form.reportValidity();
527
+ return false;
528
+ }
529
+ var url = this.getAttribute("data-url");
530
+ if (url == null) {return false;}
531
+
532
+ form.setAttribute('action', url);
533
+ form.setAttribute('method', "post");
534
+ form.submit();
535
+ });
536
+
537
+ /*******************************************************************
538
+ will open a new window with URL specified.
539
+ ********************************************************************/
540
+ $('.dc-window-open').on('click', function(e) {
541
+ // confirmation if required
542
+ if (confirmation_is_cancled(this)) {return false;}
543
+
544
+ var url = this.getAttribute("data-url");
545
+ var title = this.getAttribute("title");
546
+ var w = 1000;
547
+ var h = 800;
548
+ var left = (screen.width/2)-(w/2);
549
+ var top = (screen.height/2)-(h/2);
550
+ var win = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
551
+ win.focus();
340
552
  });
341
553
 
342
554
  /*******************************************************************
@@ -388,11 +600,11 @@ $(document).ready( function() {
388
600
  * Display spinner on link with spinner, submit link
389
601
  *******************************************************************/
390
602
  $('.dc-link-spinner').on('click', function(e) {
391
- $('.dc-spinner').toggleClass('div-hidden');
603
+ $('.dc-spinner').show();
392
604
  });
393
605
 
394
606
  $('.dc-link-submit').on('click', function(e) {
395
- $('.dc-spinner').toggleClass('div-hidden');
607
+ $('.dc-spinner').show();
396
608
  });
397
609
 
398
610
  /*******************************************************************
@@ -475,7 +687,7 @@ element = $(this).find(':first').attr('id');
475
687
  /*******************************************************************
476
688
  * Experimental. Force reload of parent page if this div appears.
477
689
  *******************************************************************/
478
- $('#div-reload-parent').load( function() {
690
+ $('#div-reload-parent').on('load', function() {
479
691
  // alert('div-reload-parent 1');
480
692
  parent.location.href = parent.location.href;
481
693
  });
@@ -485,7 +697,7 @@ element = $(this).find(':first').attr('id');
485
697
  *
486
698
  * Just an Idea. Not needed yet.
487
699
  *******************************************************************/
488
- $('#div-reload').load( function() {
700
+ $('#div-reload').on('load', function() {
489
701
  alert('div-reload 1');
490
702
  // location.href = location.href;
491
703
  });
@@ -616,8 +828,9 @@ element = $(this).find(':first').attr('id');
616
828
  });
617
829
 
618
830
  /*******************************************************************
619
- * Resize result table columns
831
+ * Resize result table columns. For now an idea.
620
832
  *******************************************************************/
833
+ /*
621
834
  $( ".dc-result-header .spacer" )
622
835
  .mouseenter(function() {
623
836
  console.log("enter");
@@ -625,8 +838,136 @@ element = $(this).find(':first').attr('id');
625
838
  .mouseleave(function() {
626
839
  console.log("leave");
627
840
  });
841
+ */
842
+ /*******************************************************************
843
+ * number_field type entered
844
+ *******************************************************************/
845
+ $('.dc-number').on('focus', function(e) {
846
+ var separator = $(this).attr("data-separator") || ',';
847
+ var field = '#' + $(this).attr("id").slice(0,-1);
848
+ var value = $(field).val().replace('.',separator);
849
+ $(this).val( value );
850
+ $(this).select();
851
+ });
852
+
853
+ /*******************************************************************
854
+ * number_field type leaved
855
+ *******************************************************************/
856
+ $('.dc-number').on('focusout', function(e) {
857
+ var decimals = $(this).attr("data-decimal") || 2;
858
+ var delimiter = $(this).attr("data-delimiter") || '.';
859
+ var separator = $(this).attr("data-separator") || ',';
860
+ var currency = $(this).attr("data-currency") || '';
861
+ var val = this.value;
862
+ // clear delimiters and replace separator with .
863
+ val = val.replace(delimiter,'');
864
+ val = val.replace(separator,'.');
865
+ val = parseFloat(val).toFixed(decimals);
866
+ var whole, dec, sign;
867
+ // [whole,dec] = val.split('.');
868
+ whole = val.split('.')[0];
869
+ dec = val.split('.')[1];
870
+ // remove negative sign and add at the end
871
+ var sign = whole.substr(0,1);
872
+ if (sign == '-') {
873
+ whole = whole.substr(1,20);
874
+ } else {
875
+ sign = '';
876
+ }
877
+ // save value to hidden field which holds return value
878
+ var field = '#' + $(this).attr("id").slice(0,-1);
879
+ $(field).val(val);
880
+
881
+ // decimal part
882
+ if (decimals == 0) separator = '';
883
+ if (dec == null) dec = '';
884
+ while (dec.length < decimals) dec = dec + '0';
885
+ // whole part
886
+ if (whole == null || whole == '') whole = '0';
887
+ var ar = [];
888
+ while (whole.length > 0) {
889
+ var pos1 = whole.length - 3
890
+ if (pos1 < 0) pos1 = 0;
891
+ ar.unshift(whole.substr(pos1,3));
892
+ whole = whole.slice(0, -3);
893
+ };
894
+
895
+ if (delimiter !== '') whole = ar.join(delimiter);
896
+ $(this).val(sign + whole + separator + dec + currency);
897
+ });
898
+
899
+ /*******************************************************************
900
+ * number_field type keypressed
901
+ *******************************************************************/
902
+ $('.dc-number').on('keydown', function(e) {
903
+ // Minus sign. Put it on first place
904
+ if (e.which == 109) {
905
+ if($(this).val().substr(0,1) == '-') {
906
+ $(this).val( $(this).val().substr(1,20));
907
+ } else {
908
+ $(this).val( '-' + $(this).val());
909
+ }
910
+ e.preventDefault();
911
+ }
912
+ // Enter. Save value before Enter is processed
913
+ if (e.which == 13) {
914
+ var delimiter = $(this).attr("data-delimiter") || '.';
915
+ var decimals = $(this).attr("data-decimal") || 2;
916
+ var value = $(this).val().replace(delimiter,'.');
917
+ var field = '#' + $(this).attr("id").slice(0,-1);
918
+
919
+ $(field).val( parseFloat(value).toFixed(decimals) );
920
+ }
921
+ });
922
+
923
+ /*******************************************************************
924
+ * Result header sort icon is hoverd. Change background icon to filter.
925
+ *******************************************************************/
926
+ $('.dc-result-header .th i').hover( function() {
927
+ old_sort_icon = '';
928
+ // save old sort icon and replace it with filter icon
929
+ $.each( $(this).attr("class").split(/\s+/),
930
+ function(index, item) { if (item.match('sort')) { old_sort_icon = item}; }
931
+ );
932
+ $(this).removeClass(old_sort_icon).addClass('fa-filter');
933
+ // bring back old sort icon
934
+ }, function(){
935
+ $(this).removeClass('fa-filter').addClass(old_sort_icon);
936
+ });
628
937
 
938
+ /*******************************************************************
939
+ * Result header sort icon is clicked. Display filter menu for the field.
940
+ *******************************************************************/
941
+ $('.dc-result-header .th i').click( function(e) {
942
+ e.preventDefault();
943
+ // additional click will close dialog when visible
944
+ if ($('.filter-popup').is(':visible')) {
945
+ $('.filter-popup').hide();
946
+ return;
947
+ }
948
+ // retrieve name of current field and set it in popup
949
+ var header = $(this).closest('.th');
950
+ var field_name = header.attr("data-name");
951
+ $('.filter-popup').attr('data-name', field_name);
952
+ // change popup position and show
953
+ $('.filter-popup').css({'top':e.pageY+5,'left':e.pageX, 'position':'absolute'});
954
+ $('.filter-popup').show();
955
+ });
629
956
 
957
+ /*******************************************************************
958
+ * Filter operation is clicked on filter popup. Retrieve data and call
959
+ * filter on action.
960
+ *******************************************************************/
961
+ $('.filter-popup li').click( function(e) {
962
+ var url = $(this).data('url')
963
+ var operator = $(this).data('operator');
964
+ var parent = $(this).closest('.filter-popup')
965
+ var field_name = parent.data("name");
966
+
967
+ url = url + '&filter_field=' + field_name + '&filter_oper=' + operator;
968
+ window.location.href = url;
969
+ });
970
+
630
971
  });
631
972
 
632
973
  /*******************************************************************
@@ -645,9 +986,7 @@ $(document).keydown( function(e) {
645
986
  });
646
987
 
647
988
  /*******************************************************************
648
- * Catch ctrl+s key pressed and fire save form event. I press ctrl+s
649
- * almost every minute. That was a lesson learned years ago when I lost
650
- * few hours of work on computer lockup ;-(
989
+
651
990
  *******************************************************************
652
991
  $(document).onmousedown( function(e) {
653
992
  mouseDown = true;
@@ -659,4 +998,4 @@ $(document).onmouseup( function(e) {
659
998
  console.log("mouse up");
660
999
  });
661
1000
 
662
- **/
1001
+ **/