drg_cms 0.6.0.1 → 0.6.1.1.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.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +454 -145
  3. data/app/assets/javascripts/drg_cms_application.js +1 -1
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +635 -244
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
  6. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  7. data/app/controllers/cmsedit_controller.rb +515 -335
  8. data/app/controllers/dc_application_controller.rb +378 -111
  9. data/app/controllers/dc_common_controller.rb +105 -14
  10. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  11. data/app/controls/dc_help_control.rb +126 -0
  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/controls/dc_report.rb +223 -0
  15. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  16. data/app/forms/all_options.yml +44 -9
  17. data/app/forms/cms_menu.yml +28 -18
  18. data/app/forms/dc_ad.yml +11 -22
  19. data/app/forms/dc_big_table.yml +1 -0
  20. data/app/forms/dc_big_table_value.yml +1 -0
  21. data/app/forms/dc_category.yml +2 -1
  22. data/app/forms/dc_design.yml +20 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_help_1.yml +109 -0
  25. data/app/forms/dc_journal.yml +3 -1
  26. data/app/forms/dc_json_ld.yml +59 -0
  27. data/app/forms/dc_key_value.yml +32 -0
  28. data/app/forms/dc_link.yml +1 -1
  29. data/app/forms/dc_menu.yml +2 -0
  30. data/app/forms/dc_menu_item.yml +2 -0
  31. data/app/forms/dc_page.yml +3 -5
  32. data/app/forms/dc_part.yml +1 -0
  33. data/app/forms/dc_piece.yml +1 -0
  34. data/app/forms/dc_poll.yml +15 -5
  35. data/app/forms/dc_poll_item.yml +2 -1
  36. data/app/forms/dc_poll_result.yml +83 -0
  37. data/app/forms/dc_poll_result_export.yml +35 -0
  38. data/app/forms/dc_seo.yml +33 -0
  39. data/app/forms/dc_simple_menu.yml +2 -0
  40. data/app/forms/dc_site.yml +4 -12
  41. data/app/forms/dc_user.yml +27 -11
  42. data/app/forms/dc_user_role.yml +3 -0
  43. data/app/forms/json_ld_schema.yml +168 -0
  44. data/app/helpers/cms_common_helper.rb +375 -0
  45. data/app/helpers/cms_edit_helper.rb +506 -0
  46. data/app/helpers/cms_helper.rb +268 -0
  47. data/app/helpers/cms_index_helper.rb +580 -0
  48. data/app/helpers/dc_application_helper.rb +218 -306
  49. data/app/models/concerns/dc_page_concern.rb +40 -6
  50. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  51. data/app/models/concerns/dc_seo_concern.rb +66 -0
  52. data/app/models/concerns/dc_site_concern.rb +67 -44
  53. data/app/models/concerns/dc_user_concern.rb +57 -18
  54. data/app/models/dc_design.rb +30 -18
  55. data/app/models/dc_filter.rb +22 -13
  56. data/app/models/dc_json_ld.rb +152 -0
  57. data/app/models/dc_key_value.rb +48 -0
  58. data/app/models/dc_key_value_store.rb +1 -0
  59. data/app/models/dc_memory.rb +8 -1
  60. data/app/models/dc_page.rb +0 -1
  61. data/app/models/dc_permission.rb +49 -9
  62. data/app/models/dc_policy.rb +25 -14
  63. data/app/models/dc_policy_role.rb +22 -11
  64. data/app/models/dc_poll.rb +39 -19
  65. data/app/models/dc_poll_result.rb +46 -0
  66. data/app/models/dc_temp.rb +140 -0
  67. data/app/models/dc_user_role.rb +2 -2
  68. data/app/models/drgcms_form_fields.rb +12 -1
  69. data/app/models/drgcms_form_fields/action.rb +61 -0
  70. data/app/models/drgcms_form_fields/comment.rb +8 -4
  71. data/app/models/drgcms_form_fields/date_picker.rb +11 -9
  72. data/app/models/drgcms_form_fields/date_select.rb +1 -1
  73. data/app/models/drgcms_form_fields/datetime_picker.rb +12 -10
  74. data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
  75. data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
  76. data/app/models/drgcms_form_fields/embedded.rb +26 -16
  77. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  78. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  79. data/app/models/drgcms_form_fields/hash_field.rb +90 -0
  80. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  81. data/app/models/drgcms_form_fields/html_field.rb +1 -1
  82. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  83. data/app/models/drgcms_form_fields/method.rb +66 -0
  84. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
  85. data/app/models/drgcms_form_fields/number_field.rb +15 -6
  86. data/app/models/drgcms_form_fields/radio.rb +96 -0
  87. data/app/models/drgcms_form_fields/readonly.rb +2 -2
  88. data/app/models/drgcms_form_fields/select.rb +92 -29
  89. data/app/models/drgcms_form_fields/text_area.rb +1 -1
  90. data/app/models/drgcms_form_fields/text_autocomplete.rb +31 -17
  91. data/app/models/drgcms_form_fields/text_field.rb +1 -1
  92. data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
  93. data/app/models/drgcms_form_fields/tree_select.rb +15 -4
  94. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  95. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  96. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  97. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  98. data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
  99. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  100. data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
  101. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  102. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  103. data/app/{helpers → renderers}/dc_poll_renderer.rb +91 -64
  104. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  105. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  106. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  107. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  108. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  109. data/app/views/cmsedit/_form.html.erb +4 -3
  110. data/app/views/cmsedit/_result.html.erb +2 -3
  111. data/app/views/cmsedit/edit.html.erb +4 -1
  112. data/app/views/cmsedit/index.html.erb +7 -1
  113. data/app/views/cmsedit/new.html.erb +3 -1
  114. data/app/views/dc_common/_help.html.erb +17 -0
  115. data/app/views/layouts/models.html.erb +2 -1
  116. data/config/locales/drgcms_en.yml +27 -3
  117. data/config/locales/drgcms_sl.yml +32 -5
  118. data/config/locales/models_en.yml +65 -17
  119. data/config/locales/models_sl.yml +69 -18
  120. data/drg_cms.gemspec +1 -1
  121. data/lib/drg_cms.rb +61 -1
  122. data/lib/drg_cms/version.rb +1 -1
  123. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  124. data/lib/tasks/database.rake +6 -56
  125. metadata +73 -54
  126. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  127. data/app/helpers/application_helper.rb +0 -2
  128. data/app/helpers/cmsedit_helper.rb +0 -888
  129. data/app/models/dc_dummy.rb +0 -102
  130. data/test/fixtures/drg_cms_test_data.rb +0 -87
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de756db4ff8ac1e6dbe88ef41e0d6dd213dbf20c91c7e2ec20b9cacdc5f80a1b
4
- data.tar.gz: 64f7ac1107e10c095e6aa6a60308ae27622b10909c5e5ca529fd74e541e591d3
3
+ metadata.gz: a424c5a9f1d427b775dfb3a6a7bfa8ea0624c47fb2f4381c0fd19120a2c8c678
4
+ data.tar.gz: 6f0918c0365fbed1ff81e31bcd55be432ae8c02520f3811b18087941913957f5
5
5
  SHA512:
6
- metadata.gz: 7fbfc08b2186e653b4a4cd09b21b9ff2435a5e14622559a4ae2301b41a59189fba6fb455cf67a93feff1676ed016f21dc8b47691e36337ae0ff9968bedc229d4
7
- data.tar.gz: 2a7f6bcc224965503f491b50b598d4e45bc60e7cdb6524b29ed85c3f51ad3d3b096f1d62f50d9fa945995f64717db09365c5c36788be4cd51aa613e9dd1d7644
6
+ metadata.gz: 149a134733c8190f6b29003493f664e16fa2efad6608fb04a8bb607b9e00cd11a1752ec3b860d57af76789868667de12597b2023391879ad683ace066f71c1ec
7
+ data.tar.gz: 104ba8f48a7ad665da2f8ea99d833e04c94db4dc89a6d6ccecfe313ee5a082d7800691a31b805fb5cd35450e7350750ed68c073ef3e2bbafc971cfc8ff1180f2
@@ -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,16 +43,65 @@ 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_tab_select = function(div_name) {
50
+ let iframes = $(div_name).find("iframe");
51
+ $.each(iframes, function(index, iframe) {
52
+ // delayed load
53
+ let src_delay = iframe.getAttribute('data-src-delay');
54
+ if (src_delay != null && src_delay != '') {
55
+ iframe.setAttribute('data-src-delay', '');
56
+ iframe.setAttribute('src', src_delay);
57
+ }
58
+ // always load on tab select
59
+ let src_always = iframe.getAttribute('data-src-always');
60
+ if (src_always != null) {
61
+ iframe.setAttribute('src', src_always);
62
+ }
63
+ });
64
+ };
65
+
66
+ /*******************************************************************
67
+ * Return false when confirmation is not required
68
+ *******************************************************************/
69
+ confirmation_is_cancled = function(object) {
70
+ var confirmation = object.getAttribute("data-confirm");
71
+ // if confirmation required
72
+ if (confirmation !== null) {
73
+ if (!confirm(confirmation)) {return true;}
74
+ }
75
+ return false;
76
+ };
77
+
78
+ /*******************************************************************
79
+ * Will update select field on the form which select options are dependend
80
+ * on other field value. It calls /dc_common/autocomplete and passes
81
+ * methodname and depend field value to obtain new values for select field.
82
+ *******************************************************************/
83
+ update_select_depend = function(select_name, depend_name, method) {
84
+ var select_field = $('#'+select_name);
85
+ var depend_field = $('#'+depend_name);
86
+
87
+ $.ajax({
88
+ url: "/dc_common/autocomplete",
89
+ type: "POST",
90
+ dataType: "json",
91
+ data: { input: depend_field.val(), search: method},
92
+ success: function(data) {
93
+
94
+ select_field.empty();
95
+ $.each(data, function(index, element) {
96
+ select_field.append( new Option(element['label'], element['id']) );
97
+ });
98
+ }
99
+ });
53
100
  };
54
101
 
102
+ /*******************************************************************
103
+ * Format number input field according to data
104
+ *******************************************************************/
55
105
  format_number_field = function(e) {
56
106
  var decimals = e.attr("data-decimal") || 2;
57
107
  var delimiter = e.attr("data-delimiter") || '.';
@@ -99,10 +149,10 @@ $(function() {
99
149
  *
100
150
  * Protocol consists of operation and value which are returned as json by
101
151
  * called controller. Controller will return an ajax call usually like this:
102
- * render json: {operation: value}.to_json
152
+ * render json: {operation: value}
103
153
  *
104
154
  * Operation is further divided into source and determinator which are divided by underline char.
105
- * render json: {#div_status: 'OK!'}.to_json
155
+ * render json: {#div_status: 'OK!'}
106
156
  * will replace html in div="status" with value 'OK!'. Source is '#div' determinator is 'status'.
107
157
  *
108
158
  * Possible operators are:
@@ -125,78 +175,133 @@ $(function() {
125
175
  * window_: Will force loading of url supplied in value into new window
126
176
  * reload_: Will reload current window
127
177
  *
128
- * Operations can be chained and are executed sequentialy.
129
- * render json: {'window_' => "/dokument.pdf", 'reload_' => 1}.to_json
130
- * will open /dokument.pdf in new window and reload current window.
178
+ * Operations can be chained and are executed sequential.
179
+ * render json: {'window_' => "/document.pdf", 'reload_' => 1}.to_json
180
+ * will open /document.pdf in new window and reload current window.
131
181
  *
132
182
  * render json: {'record_name' => "Damjan", 'record_surname' => 'Rems'}.to_json
133
183
  * will replace values of two fields on the form.
134
184
  *******************************************************************/
135
185
 
136
186
  process_json_result = function(json) {
137
- var i,operation,what, selector;
138
- $.each(json, function(key, val) {
187
+ var i, w, operation, selector, msg_div, field;
188
+ $.each(json, function(key, value) {
139
189
  i = key.search('_');
140
190
  if (i > 1) {
141
191
  operation = key.substring(0,i);
142
- what = key.substring(i+1,100);
192
+ selector = key.substring(i+1,100);
143
193
  } else {
144
194
  operation = key;
145
- what = '';
195
+ selector = '';
146
196
  }
147
- //
197
+
148
198
  switch (operation) {
149
- // update field
199
+
200
+ /**** update fields on form ****/
150
201
  case 'record':
151
- $('#'+key).val(val);
202
+ let name = key.replace('record_','record[') + ']';
203
+ field = $('[name="' + name + '"]');
204
+ // checkbox field
205
+ if (field.is(':checkbox')) {
206
+ field.prop('checked', value);
207
+ // select field
208
+ } else if (field.is('select')) {
209
+ // options for select field
210
+ if (value && value.isArray) {
211
+ field.empty();
212
+ $.each(value, function(index, v) {
213
+ field.append( new Option(v[0], v[1]) );
214
+ });
215
+ // select field value
216
+ } else {
217
+ field.val(value).change();
218
+ }
219
+ // radio field
220
+ } else if (field.attr('type') == 'radio') {
221
+ field.val([value])
222
+
223
+ // other input fields
224
+ } else {
225
+ field.val(value);
226
+ }
152
227
  break;
153
- // display message
228
+
229
+ /**** display message ****/
154
230
  case 'msg':
155
- selector = 'dc-form-' + what;
156
- if ( $('.'+selector).length == 0 ) {
157
- val = '<div class="' + selector + '">' + val + '</div>';
158
- $('.dc-title').after(val);
231
+ let msg_div = 'dc-form-' + selector;
232
+ if ( $('.' + msg_div).length == 0 ) {
233
+ value = '<div class="' + msg_div + '">' + value + '</div>';
234
+ $('.dc-title').after(value);
159
235
  } else {
160
- $('.'+selector).html(val);
236
+ $('.' + msg_div).html(value);
237
+ $('.' + msg_div).show();
161
238
  }
162
239
  break;
163
- // display popup message
164
- case 'popup':
165
- $('#popup').html(val);
166
- $('#popup').bPopup({ speed: 650, transition: 'slideDown' });
240
+
241
+ /**** display popup message ****/
242
+ case 'popup':
243
+ $('#popup').html(value);
244
+ $('#popup').bPopup({ speed: 650, transition: 'slideUp'});
245
+ break;
167
246
 
168
- // update div
247
+ /**** update div ****/
169
248
  case '#div+':
170
- $('#'+what).append(val);
249
+ $('#'+selector).append(value);
171
250
  break;
172
251
  case '#+div':
173
- $('#'+what).prepend(val);
252
+ $('#'+selector).prepend(value);
174
253
  break;
175
254
  case '#div':
176
- $('#'+what).html(val);
255
+ $('#'+selector).html(value);
177
256
  break;
178
257
  case '.div+':
179
- $('.'+what).append(val);
258
+ $('.'+selector).append(value);
180
259
  break;
181
260
  case '.+div':
182
- $('.'+what).prepend(val);
261
+ $('.'+selector).prepend(value);
183
262
  break;
184
263
  case '.div':
185
- $('.'+what).html(val);
264
+ $('.'+selector).html(value);
186
265
  break;
187
- // goto url
266
+
267
+ /**** goto url ****/
188
268
  case 'url':
189
- window.location.href = val;
269
+ window.location.href = value;
190
270
  break;
191
271
  case 'alert':
192
- alert(val);
272
+ alert(value);
193
273
  break;
194
274
  case 'window':
195
- w = window.open(val, what);
275
+ if (value == 'close') { window.close();
276
+ } else if (value == 'reload') {
277
+ location.reload();
278
+ } else {
279
+ w = window.open(value, selector);
280
+ w.focus();
281
+ }
282
+ break;
283
+ case 'newwindow':
284
+ w = window.open(value, selector,"location=no,scrollbars=yes,resizable=yes");
196
285
  w.focus();
197
286
  break;
287
+ case 'eval':
288
+ console.log('from process_json_result: Eval option will be deprecated. Use script instead.')
289
+ eval (value);
290
+ break;
291
+ case 'script':
292
+ eval (value);
293
+ break;
198
294
  case 'reload':
199
- location.reload();
295
+ value = value.toString();
296
+ if (value == 'parent') {
297
+ parent.location.reload();
298
+ /*** this would be current window (reload: true) ****/
299
+ } else if (value.length < 5) {
300
+ location.reload();
301
+ /*** reload iframe ****/
302
+ } else {
303
+ $( '#' + value ).attr('src', $( '#' + value ).attr('src'));
304
+ }
200
305
  break;
201
306
  default:
202
307
  console.log("DRGCMS: Invalid ajax result operation: " + operation);
@@ -236,6 +341,42 @@ $.fn.dc_scroll_view = function () {
236
341
  });
237
342
  };
238
343
 
344
+ /*******************************************************************
345
+ * Updates single field on parent iframe form of embedded form.
346
+ *******************************************************************/
347
+ process_parent_form_updates = function(element) {
348
+ let field = element.getAttribute("data-field");
349
+ let value = element.getAttribute("data-value");
350
+ let selector = '#' + field;
351
+
352
+ // update record
353
+ if (field.match(/record/)) {
354
+ if (window.parent.$(selector).length > 0) {
355
+ if (field.substring(0, 3) === 'td_') { // readonly field
356
+ window.parent.$(selector + ' > div').html(value);
357
+ } else { // input field
358
+ window.parent.$(selector).val(value);
359
+ }
360
+ }
361
+ // any div
362
+ } else {
363
+ if (window.parent.$(selector).length > 0) {
364
+ window.parent.$(selector).html(value);
365
+ }
366
+ }
367
+ };
368
+
369
+ /*****************************************************************
370
+ * Toggle show and hide div
371
+ ******************************************************************/
372
+ dc_toggle_div = function(div) {
373
+ if ($(div).is(":visible")) {
374
+ $(div).slideUp();
375
+ } else {
376
+ $(div).slideDown();
377
+ }
378
+ };
379
+
239
380
  /*******************************************************************
240
381
  *
241
382
  *******************************************************************/
@@ -248,6 +389,27 @@ $(document).ready( function() {
248
389
  // select_first_input_field('.dc-form');
249
390
  }
250
391
  */
392
+ /*******************************************************************
393
+ * It will scroll display to ypos if return_to_ypos parameter is present
394
+ *******************************************************************/
395
+ if (window.location.href.match(/return_to_ypos=/))
396
+ {
397
+ window.scrollTo(0, $.getUrlParam('return_to_ypos'));
398
+ }
399
+
400
+ /*******************************************************************
401
+ * The idea is to update fields on parent iframe form, when embedded document
402
+ * is updated in its iframe. Update fields are listed in .dc-form-updates div
403
+ * and are set by flash[:update] Hash object.
404
+ *
405
+ * eg. flash[:update] = {'td_record_radonly' => 'New value for read_only field',
406
+ * 'record_name' => 'New name'}
407
+ *******************************************************************/
408
+ if ( $('.dc-form-updates').length > 0 ) {
409
+ $('.dc-form-updates').children().each( function( index, element ) {
410
+ process_parent_form_updates(element);
411
+ });
412
+ }
251
413
 
252
414
  /*******************************************************************
253
415
  * Register ad clicks
@@ -257,6 +419,17 @@ $(document).ready( function() {
257
419
  return true;
258
420
  });
259
421
 
422
+ /*****************************************************************
423
+ * Toggle CMS mode. When clicked on left 30 pixels, window will be scrolled approximately
424
+ * to the position wher toggle was clicked. When clicked from pixel 31 and on it will
425
+ * stay on the top of window.
426
+ ******************************************************************/
427
+ $('.cms-toggle').bind('click', function(e) {
428
+ var url = '/dc_common/toggle_edit_mode?return_to=' + window.location.href;
429
+ if (e.pageX < 30) url = url + '&return_to_ypos=' + e.pageY ;
430
+ window.location.href = url;
431
+ });
432
+
260
433
  /*******************************************************************
261
434
  * Popup or close CMS edit menu on icon click
262
435
  *******************************************************************/
@@ -280,21 +453,22 @@ $(document).ready( function() {
280
453
  * Sort action clicked on cmsedit
281
454
  *******************************************************************/
282
455
  $('.drgcms_sort').change( function(e) {
283
- table = e.target.getAttribute("data-table");
284
- sort = e.target.value;
456
+ var table = e.target.getAttribute("data-table");
457
+ var form = e.target.getAttribute("data-form");
458
+ var sort = e.target.value;
285
459
  e.target.value = null;
286
- window.location.href = "/cmsedit?sort=" + sort + "&table=" + table;
460
+ window.location.href = "/cmsedit?sort=" + sort + "&table=" + table + "&form_name=" + form;
287
461
  });
288
462
 
289
463
  /*******************************************************************
290
464
  * Tab clicked on form. Hide old and show selected div.
291
465
  *******************************************************************/
292
466
  $('.dc-form-li').on('click', function(e) {
293
- // find li with dc-form-li-selected class. This is our old tab
294
- var old_tab_id = null;
467
+ // find li with dc-form-li-selected class. This is our old tab
468
+ let old_tab_id = null;
295
469
  $(e.target).parents('ul').find('li').each( function() {
296
470
  if ($(this).hasClass('dc-form-li-selected')) {
297
- // when not already selected toggle dc-form-li-selected class and save old tab
471
+ // when not already selected toggle dc-form-li-selected class and save old tab
298
472
  if ($(this) !== $(e.target)) {
299
473
  $(this).toggleClass('dc-form-li-selected');
300
474
  $(e.target).toggleClass('dc-form-li-selected');
@@ -307,11 +481,15 @@ $(document).ready( function() {
307
481
  if (old_tab_id !== null) {
308
482
  $('#data_' + old_tab_id).toggleClass('div-hidden');
309
483
  $('#data_' + e.target.getAttribute("data-div")).toggleClass('div-hidden');
310
- // resize parent iframe to fit selected tab size
311
- var div_height = document.getElementById('data_' + e.target.getAttribute("data-div")).clientHeight + 130;
312
- window.frameElement.style.height = div_height.toString() + 'px';
313
- // it would be too easy $('#cmsform :input:enabled:visible:first').focus();
484
+
485
+ // resize parent iframe to fit selected tab size
486
+ let div_height = document.body.scrollHeight;
487
+ let frame = window.frameElement
488
+ if (frame === null) frame = document.body;
489
+ frame.style.height = div_height.toString() + 'px';
490
+
314
491
  select_first_input_field('#data_' + e.target.getAttribute("data-div"));
492
+ update_embedded_on_tab_select('#data_' + e.target.getAttribute("data-div"));
315
493
  }
316
494
  });
317
495
 
@@ -319,12 +497,11 @@ $(document).ready( function() {
319
497
  * Resize iframe_cms to the size of its contents. Make at least 500 px high
320
498
  * unless on initial display.
321
499
  *******************************************************************/
322
- $('#iframe_cms').load( function() {
323
- // alert('bla 1');
324
- new_height = this.contentWindow.document.body.offsetHeight + 50;
500
+ $('#iframe_cms').on('load', function() {
501
+ let new_height = this.contentWindow.document.body.offsetHeight + 50;
325
502
  if (new_height < 500 && new_height > 60) new_height = 500;
326
503
  this.style.height = new_height + 'px';
327
- // scroll to top
504
+ // scroll to top
328
505
  $('#iframe_cms').dc_scroll_view();
329
506
  });
330
507
 
@@ -332,61 +509,99 @@ $(document).ready( function() {
332
509
  * Same goes for editiframe. Resize it + 30px
333
510
  * unless on initial display with no data
334
511
  *******************************************************************/
335
- $('#iframe_edit').load( function() {
336
- // console.log(this.contentWindow.document.body.offsetHeight);
512
+ $('#iframe_edit').on('load', function() {
337
513
  if (this.contentWindow.document.body.offsetHeight > 10) {
338
514
  this.style.height = (this.contentWindow.document.body.offsetHeight + 30) + 'px';
339
- // scroll to top
515
+
340
516
  $('#iframe_edit').dc_scroll_view();
341
517
  }
342
518
  });
343
-
519
+
520
+ /*******************************************************************
521
+ * Same goes for iframe_embedded. Resize it + 30px
522
+ *******************************************************************/
523
+ $('.iframe_embedded').on('load', function() {
524
+ let embedded_height = this.contentWindow.document.body.offsetHeight;
525
+ // workaround. It gets tricky when embedded field is on tab
526
+ if (embedded_height == 0) embedded_height = 500;
527
+ this.style.height = (embedded_height + 30) + 'px';
528
+ // resize parent iframe window too
529
+ let parentWindow = this.contentWindow.parent;
530
+ let parent_height = (parentWindow.document.body.offsetHeight + 30) + 'px';
531
+ //parentWindow.frameElement.setAttribute('style', 'height:' + parent_height);
532
+ parentWindow.frameElement.style.height = parent_height;
533
+ });
534
+
344
535
  /*******************************************************************
345
536
  * Process Ajax call on cmsedit form actions
346
537
  *******************************************************************/
347
538
  $('.dc-link-ajax').on('click', function(e) {
348
- // check HTML5 validations
539
+ // confirmation if required
540
+ if (confirmation_is_cancled(this)) {return false;}
541
+
542
+ // check HTML5 validations
349
543
  if ($("form")[0] && !$("form")[0].checkValidity() ) {
350
544
  $("form")[0].reportValidity();
351
545
  return false;
352
546
  }
353
- var target = e.target;
354
- var req = target.getAttribute("data-request");
355
- // Get values from elements on the page:
547
+ let req = this.getAttribute("data-request");
548
+ // Get values from elements on the page:
356
549
  if (req == "script") {
357
- eval (target.getAttribute("data-script"));
550
+ eval (this.getAttribute("data-script"));
358
551
  return false;
359
552
  }
360
553
  else if (req == "post") {
361
554
  data = $('form').serialize();
362
- // alert(data);
363
555
  }
364
556
  else {
365
557
  data = {};
366
558
  req = 'get'; // by default
367
559
  }
368
-
369
- $('.dc-spinner').toggleClass('div-hidden');
560
+
561
+ let url = this.getAttribute("data-url");
562
+ if (url.length < 5) return false;
563
+
564
+ $('.dc-spinner').show();
370
565
  $.ajax({
371
- url: target.getAttribute("data-url"),
566
+ url: url,
372
567
  type: req,
373
568
  dataType: "json",
374
569
  data: data,
375
- // success: function(files,data,xhr) {
376
- // document.getElementById('if_priponkas').contentDocument.location.reload(true);
377
- // }
378
570
  success: function(data) {
379
571
  process_json_result(data);
380
- $('.dc-spinner').toggleClass('div-hidden');
572
+ $('.dc-spinner').hide();
381
573
  }
382
-
383
- });
384
- });
574
+ });
575
+ });
576
+
577
+ /*******************************************************************
578
+ * Process action submit button click.
579
+ *******************************************************************/
580
+ $('.dc-action-submit').on('click', function(e) {
581
+ // confirmation if required
582
+ if (confirmation_is_cancled(this)) {return false;}
583
+
584
+ // check HTML5 validations
585
+ var form = $("form")[0];
586
+ if (form && !form.checkValidity() ) {
587
+ form.reportValidity();
588
+ return false;
589
+ }
590
+ var url = this.getAttribute("data-url");
591
+ if (url == null) {return false;}
592
+
593
+ form.setAttribute('action', url);
594
+ form.setAttribute('method', "post");
595
+ form.submit();
596
+ });
385
597
 
386
598
  /*******************************************************************
387
599
  will open a new window with URL specified.
388
600
  ********************************************************************/
389
601
  $('.dc-window-open').on('click', function(e) {
602
+ // confirmation if required
603
+ if (confirmation_is_cancled(this)) {return false;}
604
+
390
605
  var url = this.getAttribute("data-url");
391
606
  var title = this.getAttribute("title");
392
607
  var w = 1000;
@@ -395,7 +610,6 @@ $(document).ready( function() {
395
610
  var top = (screen.height/2)-(h/2);
396
611
  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);
397
612
  win.focus();
398
- // $('#bpopup').bPopup({ loadUrl: url, speed: 650, transition: 'slideDown' });
399
613
  });
400
614
 
401
615
  /*******************************************************************
@@ -447,11 +661,11 @@ $(document).ready( function() {
447
661
  * Display spinner on link with spinner, submit link
448
662
  *******************************************************************/
449
663
  $('.dc-link-spinner').on('click', function(e) {
450
- $('.dc-spinner').toggleClass('div-hidden');
664
+ $('.dc-spinner').show();
451
665
  });
452
666
 
453
667
  $('.dc-link-submit').on('click', function(e) {
454
- $('.dc-spinner').toggleClass('div-hidden');
668
+ $('.dc-spinner').show();
455
669
  });
456
670
 
457
671
  /*******************************************************************
@@ -460,8 +674,8 @@ $(document).ready( function() {
460
674
  * data from with text_autocomplete and data doesn't exist in belongs_to table.
461
675
  *******************************************************************/
462
676
  $('.in-edit-add').on('click', function(e) {
463
- url = '/cmsedit/new?table=' + this.getAttribute("data-table");
464
- /* I know. It doesn't work as expected. But it will do for now. */
677
+ let url = '/cmsedit/new?table=' + this.getAttribute("data-table");
678
+ // I know. It doesn't work as expected. But it will do for now.
465
679
  w = window.open(url, '', 'chrome=yes,width=800,height=600,resizable,scrollbars=yes,status=1,centerscreen=yes,modal=yes');
466
680
  w.focus();
467
681
  });
@@ -472,13 +686,9 @@ $(document).ready( function() {
472
686
  **********************************************************************/
473
687
  $('#filter_field').on('change', function() {
474
688
  if (this.value.length > 0) {
475
- name = 'filter_' + this.value;
689
+ let name = 'filter_' + this.value;
476
690
  $(this).parents('form').find('span').each( function() {
477
- /*
478
- element = $(this).find(':first').attr('id');
479
- sometimes it is the second element
480
- if (element == nil) { element = $(this).find(':first').next().attr('id');}
481
- */
691
+
482
692
  if ($(this).attr('id') == name) {
483
693
  if ( $(this).hasClass('div-hidden') ) { $(this).toggleClass('div-hidden'); }
484
694
  } else {
@@ -534,7 +744,7 @@ element = $(this).find(':first').attr('id');
534
744
  /*******************************************************************
535
745
  * Experimental. Force reload of parent page if this div appears.
536
746
  *******************************************************************/
537
- $('#div-reload-parent').load( function() {
747
+ $('#div-reload-parent').on('load', function() {
538
748
  // alert('div-reload-parent 1');
539
749
  parent.location.href = parent.location.href;
540
750
  });
@@ -544,7 +754,7 @@ element = $(this).find(':first').attr('id');
544
754
  *
545
755
  * Just an Idea. Not needed yet.
546
756
  *******************************************************************/
547
- $('#div-reload').load( function() {
757
+ $('#div-reload').on('load', function() {
548
758
  alert('div-reload 1');
549
759
  // location.href = location.href;
550
760
  });
@@ -560,8 +770,8 @@ element = $(this).find(':first').attr('id');
560
770
  * Fire action (by default show document) when doubleclicked on result row
561
771
  *******************************************************************/
562
772
  $('.dc-result tr').on('dblclick', function(e) {
563
- url = String( this.getAttribute("data-dblclick") );
564
- // prevent when data-dblclick not set
773
+ let url = String( this.getAttribute("data-dblclick") );
774
+ // prevent when data-dblclick not set
565
775
  if (url.length > 5) {
566
776
  e.preventDefault();
567
777
  location.href = url;
@@ -572,8 +782,8 @@ element = $(this).find(':first').attr('id');
572
782
  * Fire action (by default show document) when doubleclicked on result row
573
783
  *******************************************************************/
574
784
  $('.dc-result-data').on('dblclick', function(e) {
575
- url = String( this.getAttribute("data-dblclick") );
576
- // prevent when data-dblclick not set
785
+ let url = String( this.getAttribute("data-dblclick") );
786
+ // prevent when data-dblclick not set
577
787
  if (url.length > 5) {
578
788
  e.preventDefault();
579
789
  location.href = url;
@@ -605,12 +815,12 @@ element = $(this).find(':first').attr('id');
605
815
  });
606
816
 
607
817
  /*******************************************************************
608
- * This will fire cmsedit index action and pass value enterred into
818
+ * This will fire cmsedit index action and pass value entered into
609
819
  * filter field and thus refresh browsed result set.
610
820
  *******************************************************************/
611
821
  $('#_record__filter_field').keydown( function(e) {
612
822
  if (e.which == '13' || e.which == '9') {
613
- url = $(this).parents('span').attr("data-url");
823
+ var url = $(this).parents('span').attr("data-url");
614
824
  url = url + "&filter_value=" + this.value;
615
825
  location.href = url;
616
826
  return false;
@@ -622,9 +832,16 @@ element = $(this).find(':first').attr('id');
622
832
  * work on all field types.
623
833
  *******************************************************************/
624
834
  $('.record_filter_field_icon').on('click', function(e) {
625
- field = $('#_record__filter_field');
626
- url = $(this).parents('span').attr("data-url");
627
- url = url + "&filter_value=" + field.val();
835
+ let field = $('#_record__filter_field');
836
+ let url = $(this).parents('span').attr("data-url");
837
+ let value = null;
838
+
839
+ if (field.is(':checkbox')) {
840
+ value = field.is(':checked'); }
841
+ else {
842
+ value = field.val();
843
+ }
844
+ url = url + "&filter_value=" + value;
628
845
  location.href = url;
629
846
  });
630
847
 
@@ -675,8 +892,9 @@ element = $(this).find(':first').attr('id');
675
892
  });
676
893
 
677
894
  /*******************************************************************
678
- * Resize result table columns
895
+ * Resize result table columns. For now an idea.
679
896
  *******************************************************************/
897
+ /*
680
898
  $( ".dc-result-header .spacer" )
681
899
  .mouseenter(function() {
682
900
  console.log("enter");
@@ -684,7 +902,7 @@ element = $(this).find(':first').attr('id');
684
902
  .mouseleave(function() {
685
903
  console.log("leave");
686
904
  });
687
-
905
+ */
688
906
  /*******************************************************************
689
907
  * number_field type entered
690
908
  *******************************************************************/
@@ -699,51 +917,57 @@ element = $(this).find(':first').attr('id');
699
917
  /*******************************************************************
700
918
  * number_field type leaved
701
919
  *******************************************************************/
702
- $('.dc-number').on('focusout', function(e) {
703
- // format_number_field($(this));
704
-
705
- var decimals = $(this).attr("data-decimal") || 2;
706
- var delimiter = $(this).attr("data-delimiter") || '.';
707
- var separator = $(this).attr("data-separator") || ',';
708
- var currency = $(this).attr("data-currency") || '';
709
- var whole = this.value.split(separator)[0];
710
- var dec = this.value.split(separator)[1];
711
- // save value to hidden field which will be used for return
712
- var field = '#' + $(this).attr("id").slice(0,-1);
713
- var value = this.value.replace(separator,'.');
920
+ $('.dc-number').on('focusout', function(e) {
921
+ var decimals = $(this).attr("data-decimal") || 2;
922
+ var delimiter = $(this).attr("data-delimiter") || '.';
923
+ var separator = $(this).attr("data-separator") || ',';
924
+ var currency = $(this).attr("data-currency") || '';
925
+ var val = this.value;
926
+ // clear delimiters and replace separator with .
927
+ val = val.replace(delimiter,'');
928
+ val = val.replace(separator,'.');
929
+ val = parseFloat(val).toFixed(decimals);
930
+ var whole, dec, sign;
931
+ // [whole,dec] = val.split('.');
932
+ whole = val.split('.')[0];
933
+ dec = val.split('.')[1];
714
934
  // remove negative sign and add at the end
715
- var sign = whole.substr(0,1);
716
- if (sign == '-') {
717
- whole = whole.substr(1,20);
718
- } else {
719
- sign = '';
720
- }
935
+ var sign = whole.substr(0,1);
936
+ if (sign == '-') {
937
+ whole = whole.substr(1,20);
938
+ } else {
939
+ sign = '';
940
+ }
941
+ // save value to hidden field which holds return value
942
+ var field = '#' + $(this).attr("id").slice(0,-1);
943
+ $(field).val(val);
721
944
 
722
- $(field).val( parseFloat(value).toFixed(decimals) );
723
-
724
945
  // decimal part
725
- if (dec == null) dec = '';
726
- dec = dec.substring(0, decimals, dec);
727
- while (dec.length < decimals) dec = dec + '0';
946
+ if (decimals == 0) separator = '';
947
+ if (dec == null) dec = '';
948
+ while (dec.length < decimals) dec = dec + '0';
728
949
  // whole part
729
- if (whole == null || whole == '') whole = '0';
730
- var ar = [];
731
- while (whole.length > 0) {
732
- var pos1 = whole.length - 3
733
- if (pos1 < 0) pos1 = 0;
734
- ar.unshift(whole.substr(pos1,3));
735
- whole = whole.slice(0, -3);
950
+ if (whole == null || whole == '') whole = '0';
951
+ var ar = [];
952
+ while (whole.length > 0) {
953
+ var pos1 = whole.length - 3
954
+ if (pos1 < 0) pos1 = 0;
955
+ ar.unshift(whole.substr(pos1,3));
956
+ whole = whole.slice(0, -3);
736
957
  };
737
958
 
738
- if (delimiter !== '') whole = ar.join(delimiter);
739
- $(this).val(sign + whole + separator + dec + currency);
959
+ if (delimiter !== '') whole = ar.join(delimiter);
960
+ $(this).val(sign + whole + separator + dec + currency);
740
961
  });
741
962
 
742
963
  /*******************************************************************
743
- * number_field type keypressed
964
+ * Key pressed in number_field.
965
+ * - put minus sign in front of input field
966
+ * - replace dot and comma separators when required. Not all numeric pads are created equal.
967
+ * - when enter is pressed, save value to field before form is proccessed
744
968
  *******************************************************************/
745
969
  $('.dc-number').on('keydown', function(e) {
746
- // Minus sign. Put it on first place
970
+ // Minus sign. Put it on first place
747
971
  if (e.which == 109) {
748
972
  if($(this).val().substr(0,1) == '-') {
749
973
  $(this).val( $(this).val().substr(1,20));
@@ -752,16 +976,103 @@ element = $(this).find(':first').attr('id');
752
976
  }
753
977
  e.preventDefault();
754
978
  }
755
- // Enter. Save value before Enter is processed
756
- if (e.which == 13) {
757
- var delimiter = $(this).attr("data-delimiter") || '.';
758
- var decimals = $(this).attr("data-decimal") || 2;
759
- var value = $(this).val().replace(delimiter,'.');
760
- var field = '#' + $(this).attr("id").slice(0,-1);
979
+ // replace , with . if . is separator.
980
+ var separator = $(this).attr("data-separator") || '.';
981
+ var inp = this;
982
+ if (e.which == 188) {
983
+ if (separator == '.') {
984
+ setTimeout(function() {
985
+ inp.value = inp.value.replace(/,/g, '.');
986
+ }, 0);
987
+ }
988
+ }
989
+ // replace . with , if , is separator
990
+ if (e.which == 190) {
991
+ if (separator == ',') {
992
+ setTimeout(function() {
993
+ inp.value = inp.value.replace(/\./g, ',');
994
+ }, 0);
995
+ }
996
+ }
997
+
998
+ // Enter means process form. Save the value before form is processed
999
+ if (e.which == 13) {
1000
+ var decimals = $(this).attr("data-decimal") || 2;
1001
+ var value = $(this).val().replace(separator,'.');
1002
+ var field = '#' + $(this).attr("id").slice(0,-1);
761
1003
 
762
- $(field).val( parseFloat(value).toFixed(decimals) );
763
- }
1004
+ $(field).val( parseFloat(value).toFixed(decimals) );
1005
+ }
764
1006
  });
1007
+
1008
+ /*******************************************************************
1009
+ * Slovenian keyboard has comma key instead of dot in numeric pad.
1010
+ * This will catch if comma has been pressed and will replace it with dot.
1011
+ *******************************************************************/
1012
+ $('.date-picker').keypress( function(e) {
1013
+ if (e.keyCode !== 44) return;
1014
+ var inp = this;
1015
+ setTimeout(function() {
1016
+ inp.value = inp.value.replace(/,/g, '.');
1017
+ }, 0);
1018
+ });
1019
+
1020
+ /*******************************************************************
1021
+ * Result header sort icon is hoverd. Change background icon to filter.
1022
+ *******************************************************************/
1023
+ $('.dc-result-header .th i').hover( function() {
1024
+ old_sort_icon = '';
1025
+ // save old sort icon and replace it with filter icon
1026
+ $.each( $(this).attr("class").split(/\s+/),
1027
+ function(index, item) { if (item.match('sort')) { old_sort_icon = item}; }
1028
+ );
1029
+ $(this).removeClass(old_sort_icon).addClass('fa-filter');
1030
+ // bring back old sort icon
1031
+ }, function(){
1032
+ $(this).removeClass('fa-filter').addClass(old_sort_icon);
1033
+ });
1034
+
1035
+ /*******************************************************************
1036
+ * Result header sort icon is clicked. Display filter menu for the field.
1037
+ *******************************************************************/
1038
+ $('.dc-result-header .th i').click( function(e) {
1039
+ e.preventDefault();
1040
+ // additional click will close dialog when visible
1041
+ if ($('.filter-popup').is(':visible')) {
1042
+ $('.filter-popup').hide();
1043
+ return;
1044
+ }
1045
+ // retrieve name of current field and set it in popup
1046
+ let header = $(this).closest('.th');
1047
+ let field_name = header.attr("data-name");
1048
+ $('.filter-popup').attr('data-name', field_name);
1049
+ // change popup position and show
1050
+ $('.filter-popup').css({'top':e.pageY+5,'left':e.pageX, 'position':'absolute'});
1051
+ $('.filter-popup').show();
1052
+ });
1053
+
1054
+ /*******************************************************************
1055
+ * Filter operation is clicked on filter popup. Retrieve data and call
1056
+ * filter on action.
1057
+ *******************************************************************/
1058
+ $('.filter-popup li').click( function(e) {
1059
+ let url = $(this).data('url');
1060
+ let operator = $(this).data('operator');
1061
+ let parent = $(this).closest('.filter-popup');
1062
+ let field_name = parent.data("name");
1063
+
1064
+ url = url + '&filter_field=' + field_name + '&filter_oper=' + operator;
1065
+ window.location.href = url;
1066
+ });
1067
+
1068
+ /*****************************************************************
1069
+ * Toggle div
1070
+ ******************************************************************/
1071
+ $(".dc-handle").click(function() {
1072
+ let div = this.getAttribute("data-div");
1073
+ dc_toggle_div(div);
1074
+ });
1075
+
765
1076
  });
766
1077
 
767
1078
  /*******************************************************************
@@ -780,9 +1091,7 @@ $(document).keydown( function(e) {
780
1091
  });
781
1092
 
782
1093
  /*******************************************************************
783
- * Catch ctrl+s key pressed and fire save form event. I press ctrl+s
784
- * almost every minute. That was a lesson learned years ago when I lost
785
- * few hours of work on computer lockup ;-(
1094
+
786
1095
  *******************************************************************
787
1096
  $(document).onmousedown( function(e) {
788
1097
  mouseDown = true;
@@ -794,4 +1103,4 @@ $(document).onmouseup( function(e) {
794
1103
  console.log("mouse up");
795
1104
  });
796
1105
 
797
- **/
1106
+ **/