drg_cms 0.6.0.6 → 0.6.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -10
  3. data/app/assets/javascripts/drg_cms/drg_cms.js +281 -106
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +417 -152
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +9 -12
  6. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  7. data/app/controllers/cmsedit_controller.rb +247 -175
  8. data/app/controllers/dc_application_controller.rb +251 -173
  9. data/app/controllers/dc_common_controller.rb +81 -48
  10. data/app/controls/dc_help_control.rb +126 -0
  11. data/app/controls/dc_report.rb +223 -0
  12. data/app/forms/all_options.yml +38 -10
  13. data/app/forms/cms_menu.yml +7 -1
  14. data/app/forms/dc_big_table.yml +1 -0
  15. data/app/forms/dc_big_table_value.yml +1 -0
  16. data/app/forms/dc_category.yml +2 -1
  17. data/app/forms/dc_design.yml +1 -0
  18. data/app/forms/dc_help_1.yml +109 -0
  19. data/app/forms/dc_journal.yml +3 -1
  20. data/app/forms/dc_link.yml +1 -1
  21. data/app/forms/dc_menu.yml +2 -0
  22. data/app/forms/dc_menu_item.yml +1 -0
  23. data/app/forms/dc_page.yml +6 -0
  24. data/app/forms/dc_part.yml +1 -0
  25. data/app/forms/dc_piece.yml +1 -0
  26. data/app/forms/dc_poll.yml +15 -5
  27. data/app/forms/dc_poll_item.yml +2 -1
  28. data/app/forms/dc_poll_result.yml +9 -0
  29. data/app/forms/dc_simple_menu.yml +2 -0
  30. data/app/forms/dc_site.yml +4 -12
  31. data/app/forms/dc_user.yml +27 -11
  32. data/app/forms/dc_user_role.yml +3 -0
  33. data/app/helpers/cms_common_helper.rb +375 -0
  34. data/app/helpers/{cmsedit_edit_helper.rb → cms_edit_helper.rb} +109 -65
  35. data/app/helpers/{cmsedit_helper.rb → cms_helper.rb} +93 -48
  36. data/app/helpers/{cmsedit_index_helper.rb → cms_index_helper.rb} +240 -206
  37. data/app/helpers/dc_application_helper.rb +108 -327
  38. data/app/models/concerns/dc_page_concern.rb +14 -4
  39. data/app/models/concerns/dc_piece_concern.rb +1 -1
  40. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  41. data/app/models/concerns/dc_site_concern.rb +67 -44
  42. data/app/models/concerns/dc_user_concern.rb +58 -19
  43. data/app/models/dc_design.rb +29 -19
  44. data/app/models/dc_filter.rb +26 -18
  45. data/app/models/dc_key_value_store.rb +1 -0
  46. data/app/models/dc_permission.rb +49 -9
  47. data/app/models/dc_policy.rb +25 -14
  48. data/app/models/dc_policy_role.rb +22 -11
  49. data/app/models/dc_poll.rb +1 -0
  50. data/app/models/dc_poll_result.rb +4 -2
  51. data/app/models/dc_temp.rb +6 -3
  52. data/app/models/dc_user_role.rb +2 -2
  53. data/app/models/drgcms_form_fields/date_picker.rb +6 -3
  54. data/app/models/drgcms_form_fields/datetime_picker.rb +4 -3
  55. data/app/models/drgcms_form_fields/drgcms_field.rb +20 -5
  56. data/app/models/drgcms_form_fields/embedded.rb +23 -16
  57. data/app/models/drgcms_form_fields/file_field.rb +2 -2
  58. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  59. data/app/models/drgcms_form_fields/hash_field.rb +11 -7
  60. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  61. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  62. data/app/models/drgcms_form_fields/method.rb +66 -0
  63. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +18 -12
  64. data/app/models/drgcms_form_fields/number_field.rb +4 -3
  65. data/app/models/drgcms_form_fields/radio.rb +10 -5
  66. data/app/models/drgcms_form_fields/readonly.rb +13 -17
  67. data/app/models/drgcms_form_fields/select.rb +58 -41
  68. data/app/models/drgcms_form_fields/text_autocomplete.rb +41 -33
  69. data/app/models/drgcms_form_fields.rb +12 -1
  70. data/app/renderers/dc_big_menu_renderer.rb +1 -0
  71. data/app/renderers/dc_gallery_renderer.rb +1 -0
  72. data/app/renderers/dc_menu_renderer.rb +1 -0
  73. data/app/renderers/dc_page_renderer.rb +8 -6
  74. data/app/renderers/dc_part_renderer.rb +1 -0
  75. data/app/renderers/dc_piece_renderer.rb +1 -1
  76. data/app/renderers/dc_poll_renderer.rb +56 -55
  77. data/app/renderers/dc_renderer.rb +1 -0
  78. data/app/renderers/dc_simple_menu_renderer.rb +1 -0
  79. data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
  80. data/app/views/cmsedit/edit.html.erb +4 -1
  81. data/app/views/cmsedit/index.html.erb +3 -2
  82. data/app/views/cmsedit/new.html.erb +5 -2
  83. data/app/views/dc_common/_help.html.erb +17 -0
  84. data/app/views/layouts/models.html.erb +2 -1
  85. data/config/locales/drgcms_en.yml +17 -2
  86. data/config/locales/drgcms_sl.yml +22 -4
  87. data/config/locales/models_en.yml +16 -7
  88. data/config/locales/models_sl.yml +21 -12
  89. data/drg_cms.gemspec +16 -16
  90. data/lib/drg_cms/version.rb +1 -1
  91. data/lib/drg_cms.rb +98 -0
  92. data/lib/generators/new_drg_form/new_drg_form_generator.rb +5 -3
  93. data/lib/tasks/database.rake +6 -56
  94. metadata +39 -35
  95. data/app/helpers/application_helper.rb +0 -2
  96. data/app/models/__dc_dummy.rb +0 -102
@@ -46,14 +46,20 @@ dumpAttributes = function(obj) {
46
46
  * Function checks if there are delay loaded embedded elements on
47
47
  * selected tab and triggers iframe reload.
48
48
  *******************************************************************/
49
- update_embedded_on_first_display = function(div_name) {
50
- var iframes = $(div_name).find("iframe");
49
+ update_embedded_on_tab_select = function(div_name) {
50
+ let iframes = $(div_name).find("iframe");
51
51
  $.each(iframes, function(index, iframe) {
52
- var src_delay = iframe.getAttribute('data-src-delay');
52
+ // delayed load
53
+ let src_delay = iframe.getAttribute('data-src-delay');
53
54
  if (src_delay != null && src_delay != '') {
54
55
  iframe.setAttribute('data-src-delay', '');
55
56
  iframe.setAttribute('src', src_delay);
56
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
+ }
57
63
  });
58
64
  };
59
65
 
@@ -169,67 +175,79 @@ $(function() {
169
175
  * window_: Will force loading of url supplied in value into new window
170
176
  * reload_: Will reload current window
171
177
  *
172
- * Operations can be chained and are executed sequentialy.
173
- * render json: {'window_' => "/dokument.pdf", 'reload_' => 1}.to_json
174
- * 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.
175
181
  *
176
182
  * render json: {'record_name' => "Damjan", 'record_surname' => 'Rems'}.to_json
177
183
  * will replace values of two fields on the form.
178
184
  *******************************************************************/
179
185
 
180
186
  process_json_result = function(json) {
181
- var i,w,operation,selector, msg_div, field;
187
+ let i, w, operation, selector, msg_div, field;
182
188
  $.each(json, function(key, value) {
183
189
  i = key.search('_');
184
190
  if (i > 1) {
185
- operation = key.substring(0,i);
186
- selector = key.substring(i+1,100);
191
+ operation = key.substring(0, i);
192
+ selector = key.substring(i+1, 100);
187
193
  } else {
188
194
  operation = key;
189
195
  selector = '';
190
196
  }
191
- //
197
+
192
198
  switch (operation) {
193
199
 
194
200
  /**** update fields on form ****/
195
201
  case 'record':
196
- field = $('#'+key);
202
+ let name = key.replace('record_','record[') + ']';
203
+ field = $('[name="' + name + '"]');
197
204
  // checkbox field
198
- if (field.is(':checkbox')) {
205
+ if (field.is(':checkbox')) {
199
206
  field.prop('checked', value);
200
207
  // select field
201
208
  } 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
- }
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
+
212
223
  // other input fields
213
224
  } else {
214
225
  field.val(value);
215
226
  }
216
227
  break;
217
228
 
229
+ /**** transfer focus to field ****/
230
+ case 'focus':
231
+ $('#' + value).focus();
232
+ break;
233
+
218
234
  /**** display message ****/
219
235
  case 'msg':
220
- msg_div = 'dc-form-' + selector;
221
- if ( $('.'+msg_div).length == 0 ) {
236
+ let msg_div = 'dc-form-' + selector;
237
+ if ( $('.' + msg_div).length == 0 ) {
222
238
  value = '<div class="' + msg_div + '">' + value + '</div>';
223
239
  $('.dc-title').after(value);
224
240
  } else {
225
- $('.'+msg_div).html(value);
241
+ $('.' + msg_div).html(value);
242
+ $('.' + msg_div).show();
226
243
  }
227
244
  break;
228
245
 
229
246
  /**** display popup message ****/
230
- case 'popup':
247
+ case 'popup':
231
248
  $('#popup').html(value);
232
- $('#popup').bPopup({ speed: 650, transition: 'slideDown' });
249
+ $('#popup').bPopup({ speed: 650, transition: 'slideUp'});
250
+ break;
233
251
 
234
252
  /**** update div ****/
235
253
  case '#div+':
@@ -260,7 +278,8 @@ process_json_result = function(json) {
260
278
  break;
261
279
  case 'window':
262
280
  if (value == 'close') { window.close();
263
- } else if (value == 'reload') { location.reload();
281
+ } else if (value == 'reload') {
282
+ window.location.href = window.location.href;
264
283
  } else {
265
284
  w = window.open(value, selector);
266
285
  w.focus();
@@ -271,13 +290,24 @@ process_json_result = function(json) {
271
290
  w.focus();
272
291
  break;
273
292
  case 'eval':
293
+ console.log('from process_json_result: Eval option will be deprecated. Use script instead.')
274
294
  eval (value);
275
295
  break;
296
+ case 'script':
297
+ eval (value);
298
+ break;
276
299
  case 'reload':
300
+ value = value.toString();
277
301
  if (value == 'parent') {
278
- parent.location.reload();
302
+ //parent.location.reload();
303
+ parent.location.href = parent.location.href;
304
+
305
+ /*** this would be current window (reload: true) ****/
306
+ } else if (value.length < 5) {
307
+ window.location.href = window.location.href;
308
+ /*** reload iframe ****/
279
309
  } else {
280
- location.reload();
310
+ $( '#' + value ).attr('src', $( '#' + value ).attr('src'));
281
311
  }
282
312
  break;
283
313
  default:
@@ -293,6 +323,15 @@ function dc_reload_window() {
293
323
  location.reload();
294
324
  }
295
325
 
326
+ /*******************************************************************
327
+ * Will open popup window
328
+ *******************************************************************/
329
+ function popup_window(url, window_name, win, w, h) {
330
+ let y = win.top.outerHeight / 2 + win.top.screenY - ( h / 2);
331
+ let x = win.top.outerWidth / 2 + win.top.screenX - ( w / 2);
332
+ return win.open(url, window_name, `toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${w}, height=${h}, top=${y}, left=${x}`);
333
+ }
334
+
296
335
  /*******************************************************************
297
336
  * Will select first editable input field on form. Works only when tab
298
337
  * is selected. Still have to find out, what to do on initial display.
@@ -322,14 +361,35 @@ $.fn.dc_scroll_view = function () {
322
361
  * Updates single field on parent iframe form of embedded form.
323
362
  *******************************************************************/
324
363
  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);
364
+ let field = element.getAttribute("data-field");
365
+ let value = element.getAttribute("data-value");
366
+ let selector = '#' + field;
367
+
368
+ // update record
369
+ if (field.match(/record/)) {
370
+ if (window.parent.$(selector).length > 0) {
371
+ if (field.substring(0, 3) === 'td_') { // readonly field
372
+ window.parent.$(selector + ' > div').html(value);
373
+ } else { // input field
374
+ window.parent.$(selector).val(value);
375
+ }
332
376
  }
377
+ // any div
378
+ } else {
379
+ if (window.parent.$(selector).length > 0) {
380
+ window.parent.$(selector).html(value);
381
+ }
382
+ }
383
+ };
384
+
385
+ /*****************************************************************
386
+ * Toggle show and hide div
387
+ ******************************************************************/
388
+ dc_toggle_div = function(div) {
389
+ if ($(div).is(":visible")) {
390
+ $(div).slideUp();
391
+ } else {
392
+ $(div).slideDown();
333
393
  }
334
394
  };
335
395
 
@@ -409,18 +469,54 @@ $(document).ready( function() {
409
469
  * Sort action clicked on cmsedit
410
470
  *******************************************************************/
411
471
  $('.drgcms_sort').change( function(e) {
412
- table = e.target.getAttribute("data-table");
413
- sort = e.target.value;
472
+ let table = e.target.getAttribute("data-table");
473
+ let form = e.target.getAttribute("data-form");
474
+ if (form === null) form = table;
475
+ let sort = e.target.value;
414
476
  e.target.value = null;
415
- window.location.href = "/cmsedit?sort=" + sort + "&table=" + table;
477
+ window.location.href = "/cmsedit?sort=" + sort + "&table=" + table + "&form_name=" + form;
416
478
  });
417
-
479
+
480
+ /*******************************************************************
481
+ * Click on dc-check-all icon. Check or uncheck all checkboxes
482
+ *******************************************************************/
483
+ $('.dc-check-all').on('click',function(e) {
484
+ let checkboxes = $('.dc-check');
485
+ if ($(this).hasClass('fa-check-square-o')) {
486
+ // check all checkboxes
487
+ checkboxes.each( function() {
488
+ $(this).prop('checked', true);
489
+ $(this).parent().closest('div').addClass('dc-checked');
490
+ });
491
+ $(this).removeClass('fa-check-square-o').addClass('fa-square-o');
492
+ } else {
493
+ // uncheck all checkboxes
494
+ checkboxes.each( function() {
495
+ $(this).prop('checked', false);
496
+ $(this).parent().closest('div').removeClass('dc-checked');
497
+ });
498
+ $(this).removeClass('fa-square-o').addClass('fa-check-square-o');
499
+ }
500
+ });
501
+
502
+ /*******************************************************************
503
+ * Click on dc-check icon. Change color of background of element
504
+ *******************************************************************/
505
+ $('.dc-check').on('click',function(e) {
506
+ let parent = $(this).parent().closest('div');
507
+ if ($(this).prop('checked')) {
508
+ parent.addClass('dc-checked');
509
+ } else {
510
+ parent.removeClass('dc-checked');
511
+ }
512
+ });
513
+
418
514
  /*******************************************************************
419
515
  * Tab clicked on form. Hide old and show selected div.
420
516
  *******************************************************************/
421
517
  $('.dc-form-li').on('click', function(e) {
422
518
  // find li with dc-form-li-selected class. This is our old tab
423
- var old_tab_id = null;
519
+ let old_tab_id = null;
424
520
  $(e.target).parents('ul').find('li').each( function() {
425
521
  if ($(this).hasClass('dc-form-li-selected')) {
426
522
  // when not already selected toggle dc-form-li-selected class and save old tab
@@ -438,13 +534,13 @@ $(document).ready( function() {
438
534
  $('#data_' + e.target.getAttribute("data-div")).toggleClass('div-hidden');
439
535
 
440
536
  // 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';
445
- // it would be too easy $('#cmsform :input:enabled:visible:first').focus();
537
+ let div_height = document.body.scrollHeight;
538
+ let frame = window.frameElement
539
+ if (frame === null) frame = document.body;
540
+ frame.style.height = div_height.toString() + 'px';
541
+
446
542
  select_first_input_field('#data_' + e.target.getAttribute("data-div"));
447
- update_embedded_on_first_display('#data_' + e.target.getAttribute("data-div"));
543
+ update_embedded_on_tab_select('#data_' + e.target.getAttribute("data-div"));
448
544
  }
449
545
  });
450
546
 
@@ -453,10 +549,10 @@ $(document).ready( function() {
453
549
  * unless on initial display.
454
550
  *******************************************************************/
455
551
  $('#iframe_cms').on('load', function() {
456
- new_height = this.contentWindow.document.body.offsetHeight + 50;
552
+ let new_height = this.contentWindow.document.body.offsetHeight + 50;
457
553
  if (new_height < 500 && new_height > 60) new_height = 500;
458
554
  this.style.height = new_height + 'px';
459
- // scroll to top
555
+ // scroll to top
460
556
  $('#iframe_cms').dc_scroll_view();
461
557
  });
462
558
 
@@ -465,52 +561,81 @@ $(document).ready( function() {
465
561
  * unless on initial display with no data
466
562
  *******************************************************************/
467
563
  $('#iframe_edit').on('load', function() {
468
- // console.log(this.contentWindow.document.body.offsetHeight);
469
564
  if (this.contentWindow.document.body.offsetHeight > 10) {
470
565
  this.style.height = (this.contentWindow.document.body.offsetHeight + 30) + 'px';
471
- // scroll to top
566
+
472
567
  $('#iframe_edit').dc_scroll_view();
473
568
  }
474
569
  });
475
-
570
+
571
+ /*******************************************************************
572
+ * Same goes for iframe_embedded. Resize it + 30px
573
+ *******************************************************************/
574
+ $('.iframe_embedded').on('load', function() {
575
+ let embedded_height = this.contentWindow.document.body.offsetHeight;
576
+ // workaround. It gets tricky when embedded field is on tab
577
+ if (embedded_height == 0) embedded_height = 500;
578
+ this.style.height = (embedded_height + 30) + 'px';
579
+ // resize parent iframe window too
580
+ let parentWindow = this.contentWindow.parent;
581
+ let parent_height = (parentWindow.document.body.offsetHeight + 30) + 'px';
582
+ //parentWindow.frameElement.setAttribute('style', 'height:' + parent_height);
583
+ parentWindow.frameElement.style.height = parent_height;
584
+ });
585
+
476
586
  /*******************************************************************
477
587
  * Process Ajax call on cmsedit form actions
478
588
  *******************************************************************/
479
589
  $('.dc-link-ajax').on('click', function(e) {
480
590
  // confirmation if required
481
591
  if (confirmation_is_cancled(this)) {return false;}
482
-
592
+
593
+ // url must be specified in data-url
594
+ let url = this.getAttribute("data-url");
595
+ if (url.length < 5) return false;
596
+
483
597
  // check HTML5 validations
484
598
  if ($("form")[0] && !$("form")[0].checkValidity() ) {
485
599
  $("form")[0].reportValidity();
486
600
  return false;
487
601
  }
488
- var req = this.getAttribute("data-request");
489
- // Get values from elements on the page:
490
- if (req == "script") {
491
- eval (this.getAttribute("data-script"));
492
- return false;
493
- }
494
- else if (req == "post") {
495
- data = $('form').serialize();
602
+
603
+ let data = {};
604
+ let request = this.getAttribute("data-request");
605
+ switch (request) {
606
+ case 'script':
607
+ eval(this.getAttribute("data-script"));
608
+ return false;
609
+
610
+ case 'post':
611
+ data = $('form').serialize();
612
+ break;
613
+
614
+ default:
615
+ request = 'get'; // by default
496
616
  }
497
- else {
498
- data = {};
499
- req = 'get'; // by default
617
+
618
+ // add checkbox id-s to data if checkboxes present
619
+ let checkboxes = $('.dc-check');
620
+ if (checkboxes.length > 0) {
621
+ let checked = [];
622
+ checkboxes.each( function() {
623
+ if ($(this).prop('checked')) checked.push($(this).attr("id"));
624
+ })
625
+ data['checked'] = checked;
500
626
  }
501
-
502
- $('.dc-spinner').show();
627
+
628
+ $('.dc-spinner').show();
503
629
  $.ajax({
504
- url: this.getAttribute("data-url"),
505
- type: req,
630
+ url: url,
631
+ type: request,
506
632
  dataType: "json",
507
633
  data: data,
508
634
  success: function(data) {
509
635
  process_json_result(data);
510
636
  $('.dc-spinner').hide();
511
637
  }
512
-
513
- });
638
+ });
514
639
  });
515
640
 
516
641
  /*******************************************************************
@@ -613,9 +738,8 @@ $(document).ready( function() {
613
738
  * data from with text_autocomplete and data doesn't exist in belongs_to table.
614
739
  *******************************************************************/
615
740
  $('.in-edit-add').on('click', function(e) {
616
- url = '/cmsedit/new?table=' + this.getAttribute("data-table");
617
- /* I know. It doesn't work as expected. But it will do for now. */
618
- w = window.open(url, '', 'chrome=yes,width=800,height=600,resizable,scrollbars=yes,status=1,centerscreen=yes,modal=yes');
741
+ let url = '/cmsedit/new?window_close=0&table=' + this.getAttribute("data-table");
742
+ let w = popup_window(url, '', window, 1000, 800);
619
743
  w.focus();
620
744
  });
621
745
 
@@ -625,13 +749,9 @@ $(document).ready( function() {
625
749
  **********************************************************************/
626
750
  $('#filter_field').on('change', function() {
627
751
  if (this.value.length > 0) {
628
- name = 'filter_' + this.value;
752
+ let name = 'filter_' + this.value;
629
753
  $(this).parents('form').find('span').each( function() {
630
- /*
631
- element = $(this).find(':first').attr('id');
632
- sometimes it is the second element
633
- if (element == nil) { element = $(this).find(':first').next().attr('id');}
634
- */
754
+
635
755
  if ($(this).attr('id') == name) {
636
756
  if ( $(this).hasClass('div-hidden') ) { $(this).toggleClass('div-hidden'); }
637
757
  } else {
@@ -713,8 +833,8 @@ element = $(this).find(':first').attr('id');
713
833
  * Fire action (by default show document) when doubleclicked on result row
714
834
  *******************************************************************/
715
835
  $('.dc-result tr').on('dblclick', function(e) {
716
- url = String( this.getAttribute("data-dblclick") );
717
- // prevent when data-dblclick not set
836
+ let url = String( this.getAttribute("data-dblclick") );
837
+ // prevent when data-dblclick not set
718
838
  if (url.length > 5) {
719
839
  e.preventDefault();
720
840
  location.href = url;
@@ -725,8 +845,8 @@ element = $(this).find(':first').attr('id');
725
845
  * Fire action (by default show document) when doubleclicked on result row
726
846
  *******************************************************************/
727
847
  $('.dc-result-data').on('dblclick', function(e) {
728
- url = String( this.getAttribute("data-dblclick") );
729
- // prevent when data-dblclick not set
848
+ let url = String( this.getAttribute("data-dblclick") );
849
+ // prevent when data-dblclick not set
730
850
  if (url.length > 5) {
731
851
  e.preventDefault();
732
852
  location.href = url;
@@ -758,12 +878,12 @@ element = $(this).find(':first').attr('id');
758
878
  });
759
879
 
760
880
  /*******************************************************************
761
- * This will fire cmsedit index action and pass value enterred into
881
+ * This will fire cmsedit index action and pass value entered into
762
882
  * filter field and thus refresh browsed result set.
763
883
  *******************************************************************/
764
884
  $('#_record__filter_field').keydown( function(e) {
765
885
  if (e.which == '13' || e.which == '9') {
766
- url = $(this).parents('span').attr("data-url");
886
+ var url = $(this).parents('span').attr("data-url");
767
887
  url = url + "&filter_value=" + this.value;
768
888
  location.href = url;
769
889
  return false;
@@ -775,9 +895,16 @@ element = $(this).find(':first').attr('id');
775
895
  * work on all field types.
776
896
  *******************************************************************/
777
897
  $('.record_filter_field_icon').on('click', function(e) {
778
- field = $('#_record__filter_field');
779
- url = $(this).parents('span').attr("data-url");
780
- url = url + "&filter_value=" + field.val();
898
+ let field = $('#_record__filter_field');
899
+ let url = $(this).parents('span').attr("data-url");
900
+ let value = null;
901
+
902
+ if (field.is(':checkbox')) {
903
+ value = field.is(':checked'); }
904
+ else {
905
+ value = field.val();
906
+ }
907
+ url = url + "&filter_value=" + value;
781
908
  location.href = url;
782
909
  });
783
910
 
@@ -897,10 +1024,13 @@ element = $(this).find(':first').attr('id');
897
1024
  });
898
1025
 
899
1026
  /*******************************************************************
900
- * number_field type keypressed
1027
+ * Key pressed in number_field.
1028
+ * - put minus sign in front of input field
1029
+ * - replace dot and comma separators when required. Not all numeric pads are created equal.
1030
+ * - when enter is pressed, save value to field before form is proccessed
901
1031
  *******************************************************************/
902
1032
  $('.dc-number').on('keydown', function(e) {
903
- // Minus sign. Put it on first place
1033
+ // Minus sign. Put it on first place
904
1034
  if (e.which == 109) {
905
1035
  if($(this).val().substr(0,1) == '-') {
906
1036
  $(this).val( $(this).val().substr(1,20));
@@ -909,17 +1039,47 @@ element = $(this).find(':first').attr('id');
909
1039
  }
910
1040
  e.preventDefault();
911
1041
  }
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);
1042
+ // replace , with . if . is separator.
1043
+ var separator = $(this).attr("data-separator") || '.';
1044
+ var inp = this;
1045
+ if (e.which == 188) {
1046
+ if (separator == '.') {
1047
+ setTimeout(function() {
1048
+ inp.value = inp.value.replace(/,/g, '.');
1049
+ }, 0);
1050
+ }
1051
+ }
1052
+ // replace . with , if , is separator
1053
+ if (e.which == 190) {
1054
+ if (separator == ',') {
1055
+ setTimeout(function() {
1056
+ inp.value = inp.value.replace(/\./g, ',');
1057
+ }, 0);
1058
+ }
1059
+ }
1060
+
1061
+ // Enter means process form. Save the value before form is processed
1062
+ if (e.which == 13) {
1063
+ var decimals = $(this).attr("data-decimal") || 2;
1064
+ var value = $(this).val().replace(separator,'.');
1065
+ var field = '#' + $(this).attr("id").slice(0,-1);
918
1066
 
919
- $(field).val( parseFloat(value).toFixed(decimals) );
920
- }
1067
+ $(field).val( parseFloat(value).toFixed(decimals) );
1068
+ }
921
1069
  });
922
-
1070
+
1071
+ /*******************************************************************
1072
+ * Slovenian keyboard has comma key instead of dot in numeric pad.
1073
+ * This will catch if comma has been pressed and will replace it with dot.
1074
+ *******************************************************************/
1075
+ $('.date-picker').keypress( function(e) {
1076
+ if (e.keyCode !== 44) return;
1077
+ var inp = this;
1078
+ setTimeout(function() {
1079
+ inp.value = inp.value.replace(/,/g, '.');
1080
+ }, 0);
1081
+ });
1082
+
923
1083
  /*******************************************************************
924
1084
  * Result header sort icon is hoverd. Change background icon to filter.
925
1085
  *******************************************************************/
@@ -946,8 +1106,8 @@ element = $(this).find(':first').attr('id');
946
1106
  return;
947
1107
  }
948
1108
  // retrieve name of current field and set it in popup
949
- var header = $(this).closest('.th');
950
- var field_name = header.attr("data-name");
1109
+ let header = $(this).closest('.th');
1110
+ let field_name = header.attr("data-name");
951
1111
  $('.filter-popup').attr('data-name', field_name);
952
1112
  // change popup position and show
953
1113
  $('.filter-popup').css({'top':e.pageY+5,'left':e.pageX, 'position':'absolute'});
@@ -959,15 +1119,30 @@ element = $(this).find(':first').attr('id');
959
1119
  * filter on action.
960
1120
  *******************************************************************/
961
1121
  $('.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");
1122
+ let url = $(this).data('url');
1123
+ let operator = $(this).data('operator');
1124
+ let parent = $(this).closest('.filter-popup');
1125
+ let field_name = parent.data("name");
966
1126
 
967
1127
  url = url + '&filter_field=' + field_name + '&filter_oper=' + operator;
968
1128
  window.location.href = url;
969
1129
  });
970
1130
 
1131
+ /*****************************************************************
1132
+ * Toggle div
1133
+ ******************************************************************/
1134
+ $(".dc-handle").click(function() {
1135
+ let div = this.getAttribute("data-div");
1136
+ dc_toggle_div(div);
1137
+ });
1138
+
1139
+ /*******************************************************************
1140
+ * Show-Hide CMS menu on hamburger click
1141
+ *******************************************************************/
1142
+ $('#menu-hamburger').on('click', function(e) {
1143
+ $('.cmsedit-container #menu').toggleClass('visible');
1144
+ });
1145
+
971
1146
  });
972
1147
 
973
1148
  /*******************************************************************