drg_cms 0.5.52.12 → 0.6.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
  3. data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
  4. data/app/assets/javascripts/drg_cms_application.js +1 -1
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +476 -215
  6. data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
  7. data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
  8. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  9. data/app/controllers/cmsedit_controller.rb +474 -233
  10. data/app/controllers/dc_application_controller.rb +264 -41
  11. data/app/controllers/dc_common_controller.rb +75 -63
  12. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  13. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  14. data/app/controls/dc_poll_result_control.rb +88 -0
  15. data/app/controls/dc_report.rb +227 -0
  16. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  17. data/app/forms/all_options.yml +70 -12
  18. data/app/forms/cms_menu.yml +26 -17
  19. data/app/forms/dc_ad.yml +11 -22
  20. data/app/forms/dc_big_table.yml +1 -0
  21. data/app/forms/dc_big_table_value.yml +1 -0
  22. data/app/forms/dc_design.yml +19 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_gallery.yml +53 -0
  25. data/app/forms/dc_json_ld.yml +59 -0
  26. data/app/forms/dc_key_value.yml +32 -0
  27. data/app/forms/dc_link.yml +16 -10
  28. data/app/forms/dc_menu_item.yml +6 -0
  29. data/app/forms/dc_page.yml +2 -7
  30. data/app/forms/dc_poll.yml +16 -9
  31. data/app/forms/dc_poll_item.yml +2 -1
  32. data/app/forms/dc_poll_result.yml +83 -0
  33. data/app/forms/dc_poll_result_export.yml +35 -0
  34. data/app/forms/dc_removed_url.yml +42 -0
  35. data/app/forms/dc_seo.yml +33 -0
  36. data/app/forms/dc_site.yml +2 -6
  37. data/app/forms/json_ld_schema.yml +168 -0
  38. data/app/helpers/cms_common_helper.rb +311 -0
  39. data/app/helpers/cms_edit_helper.rb +498 -0
  40. data/app/helpers/cms_helper.rb +230 -0
  41. data/app/helpers/cms_index_helper.rb +564 -0
  42. data/app/helpers/dc_application_helper.rb +195 -268
  43. data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
  44. data/app/models/concerns/dc_page_concern.rb +31 -6
  45. data/app/models/concerns/dc_seo_concern.rb +66 -0
  46. data/app/models/concerns/dc_site_concern.rb +12 -1
  47. data/app/models/concerns/dc_user_concern.rb +5 -3
  48. data/app/models/dc_design.rb +2 -0
  49. data/app/models/dc_filter.rb +37 -20
  50. data/app/models/dc_gallery.rb +64 -0
  51. data/app/models/dc_json_ld.rb +152 -0
  52. data/app/models/dc_key_value.rb +48 -0
  53. data/app/models/dc_link.rb +1 -0
  54. data/app/models/dc_memory.rb +26 -4
  55. data/app/models/dc_page.rb +1 -2
  56. data/app/models/dc_permission.rb +30 -0
  57. data/app/models/dc_poll.rb +39 -19
  58. data/app/models/dc_poll_result.rb +46 -0
  59. data/app/models/dc_removed_url.rb +54 -0
  60. data/app/models/dc_temp.rb +140 -0
  61. data/app/models/drgcms_form_fields.rb +6 -1642
  62. data/app/models/drgcms_form_fields/action.rb +61 -0
  63. data/app/models/drgcms_form_fields/check_box.rb +72 -0
  64. data/app/models/drgcms_form_fields/comment.rb +53 -0
  65. data/app/models/drgcms_form_fields/date_picker.rb +104 -0
  66. data/app/models/drgcms_form_fields/date_select.rb +68 -0
  67. data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
  68. data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
  69. data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
  70. data/app/models/drgcms_form_fields/embedded.rb +97 -0
  71. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  72. data/app/models/drgcms_form_fields/file_select.rb +70 -0
  73. data/app/models/drgcms_form_fields/hash_field.rb +86 -0
  74. data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
  75. data/app/models/drgcms_form_fields/html_field.rb +70 -0
  76. data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
  77. data/app/models/drgcms_form_fields/link_to.rb +69 -0
  78. data/app/models/drgcms_form_fields/method.rb +65 -0
  79. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
  80. data/app/models/drgcms_form_fields/number_field.rb +92 -0
  81. data/app/models/drgcms_form_fields/password_field.rb +62 -0
  82. data/app/models/drgcms_form_fields/radio.rb +96 -0
  83. data/app/models/drgcms_form_fields/readonly.rb +79 -0
  84. data/app/models/drgcms_form_fields/select.rb +226 -0
  85. data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
  86. data/app/models/drgcms_form_fields/text_area.rb +68 -0
  87. data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
  88. data/app/models/drgcms_form_fields/text_field.rb +56 -0
  89. data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
  90. data/app/models/drgcms_form_fields/tree_select.rb +169 -0
  91. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  92. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  93. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  94. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  95. data/app/renderers/dc_gallery_renderer.rb +95 -0
  96. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  97. data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
  98. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  99. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  100. data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
  101. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  102. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  103. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  104. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  105. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  106. data/app/views/cmsedit/_form.html.erb +4 -3
  107. data/app/views/cmsedit/_result.html.erb +2 -3
  108. data/app/views/cmsedit/edit.html.erb +2 -1
  109. data/app/views/cmsedit/index.html.erb +6 -1
  110. data/app/views/cmsedit/new.html.erb +1 -1
  111. data/config/locales/drgcms_en.yml +15 -3
  112. data/config/locales/drgcms_sl.yml +18 -6
  113. data/config/locales/models_en.yml +103 -19
  114. data/config/locales/models_sl.yml +102 -17
  115. data/drg_cms.gemspec +3 -3
  116. data/lib/drg_cms.rb +6 -2
  117. data/lib/drg_cms/version.rb +2 -2
  118. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  119. data/lib/tasks/database.rake +6 -56
  120. data/lib/tasks/dc_cleanup.rake +1 -1
  121. metadata +106 -61
  122. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  123. data/app/helpers/application_helper.rb +0 -2
  124. data/app/helpers/cmsedit_helper.rb +0 -844
  125. data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -1,339 +0,0 @@
1
- /*!
2
- * jQuery UI CSS Framework 1.8.23
3
- *
4
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
5
- * Dual licensed under the MIT or GPL Version 2 licenses.
6
- * http://jquery.org/license
7
- *
8
- * http://docs.jquery.com/UI/Theming/API
9
- */
10
-
11
- /* Layout helpers
12
- ----------------------------------*/
13
- .ui-helper-hidden { display: none; }
14
- .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
15
- .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
16
- .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
17
- .ui-helper-clearfix:after { clear: both; }
18
- .ui-helper-clearfix { zoom: 1; }
19
- .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
20
-
21
-
22
- /* Interaction Cues
23
- ----------------------------------*/
24
- .ui-state-disabled { cursor: default !important; }
25
-
26
-
27
- /* Icons
28
- ----------------------------------*/
29
-
30
- /* states and images */
31
- .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
32
-
33
-
34
- /* Misc visuals
35
- ----------------------------------*/
36
-
37
- /* Overlays */
38
- .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
39
-
40
-
41
- /*!
42
- * jQuery UI CSS Framework 1.8.23
43
- *
44
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
45
- * Dual licensed under the MIT or GPL Version 2 licenses.
46
- * http://jquery.org/license
47
- *
48
- * http://docs.jquery.com/UI/Theming/API
49
- *
50
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
51
- */
52
-
53
-
54
- /* Component containers
55
- ----------------------------------*/
56
- .ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
57
- .ui-widget .ui-widget { font-size: 1em; }
58
- .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
59
- .ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
60
- .ui-widget-content a { color: #333333; }
61
- .ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
62
- .ui-widget-header a { color: #ffffff; }
63
-
64
- /* Interaction states
65
- ----------------------------------*/
66
- .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
67
- .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
68
- .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
69
- .ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
70
- .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
71
- .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
72
- .ui-widget :active { outline: none; }
73
-
74
- /* Interaction Cues
75
- ----------------------------------*/
76
- .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
77
- .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
78
- .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
79
- .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
80
- .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
81
- .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
82
- .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
83
- .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
84
-
85
- /* Icons
86
- ----------------------------------*/
87
-
88
- /* states and images */
89
- .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
90
- .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
91
- .ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
92
- .ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
93
- .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
94
- .ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
95
- .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
96
- .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
97
-
98
- /* positioning */
99
- .ui-icon-carat-1-n { background-position: 0 0; }
100
- .ui-icon-carat-1-ne { background-position: -16px 0; }
101
- .ui-icon-carat-1-e { background-position: -32px 0; }
102
- .ui-icon-carat-1-se { background-position: -48px 0; }
103
- .ui-icon-carat-1-s { background-position: -64px 0; }
104
- .ui-icon-carat-1-sw { background-position: -80px 0; }
105
- .ui-icon-carat-1-w { background-position: -96px 0; }
106
- .ui-icon-carat-1-nw { background-position: -112px 0; }
107
- .ui-icon-carat-2-n-s { background-position: -128px 0; }
108
- .ui-icon-carat-2-e-w { background-position: -144px 0; }
109
- .ui-icon-triangle-1-n { background-position: 0 -16px; }
110
- .ui-icon-triangle-1-ne { background-position: -16px -16px; }
111
- .ui-icon-triangle-1-e { background-position: -32px -16px; }
112
- .ui-icon-triangle-1-se { background-position: -48px -16px; }
113
- .ui-icon-triangle-1-s { background-position: -64px -16px; }
114
- .ui-icon-triangle-1-sw { background-position: -80px -16px; }
115
- .ui-icon-triangle-1-w { background-position: -96px -16px; }
116
- .ui-icon-triangle-1-nw { background-position: -112px -16px; }
117
- .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
118
- .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
119
- .ui-icon-arrow-1-n { background-position: 0 -32px; }
120
- .ui-icon-arrow-1-ne { background-position: -16px -32px; }
121
- .ui-icon-arrow-1-e { background-position: -32px -32px; }
122
- .ui-icon-arrow-1-se { background-position: -48px -32px; }
123
- .ui-icon-arrow-1-s { background-position: -64px -32px; }
124
- .ui-icon-arrow-1-sw { background-position: -80px -32px; }
125
- .ui-icon-arrow-1-w { background-position: -96px -32px; }
126
- .ui-icon-arrow-1-nw { background-position: -112px -32px; }
127
- .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
128
- .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
129
- .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
130
- .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
131
- .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
132
- .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
133
- .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
134
- .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
135
- .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
136
- .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
137
- .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
138
- .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
139
- .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
140
- .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
141
- .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
142
- .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
143
- .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
144
- .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
145
- .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
146
- .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
147
- .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
148
- .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
149
- .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
150
- .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
151
- .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
152
- .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
153
- .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
154
- .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
155
- .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
156
- .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
157
- .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
158
- .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
159
- .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
160
- .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
161
- .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
162
- .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
163
- .ui-icon-arrow-4 { background-position: 0 -80px; }
164
- .ui-icon-arrow-4-diag { background-position: -16px -80px; }
165
- .ui-icon-extlink { background-position: -32px -80px; }
166
- .ui-icon-newwin { background-position: -48px -80px; }
167
- .ui-icon-refresh { background-position: -64px -80px; }
168
- .ui-icon-shuffle { background-position: -80px -80px; }
169
- .ui-icon-transfer-e-w { background-position: -96px -80px; }
170
- .ui-icon-transferthick-e-w { background-position: -112px -80px; }
171
- .ui-icon-folder-collapsed { background-position: 0 -96px; }
172
- .ui-icon-folder-open { background-position: -16px -96px; }
173
- .ui-icon-document { background-position: -32px -96px; }
174
- .ui-icon-document-b { background-position: -48px -96px; }
175
- .ui-icon-note { background-position: -64px -96px; }
176
- .ui-icon-mail-closed { background-position: -80px -96px; }
177
- .ui-icon-mail-open { background-position: -96px -96px; }
178
- .ui-icon-suitcase { background-position: -112px -96px; }
179
- .ui-icon-comment { background-position: -128px -96px; }
180
- .ui-icon-person { background-position: -144px -96px; }
181
- .ui-icon-print { background-position: -160px -96px; }
182
- .ui-icon-trash { background-position: -176px -96px; }
183
- .ui-icon-locked { background-position: -192px -96px; }
184
- .ui-icon-unlocked { background-position: -208px -96px; }
185
- .ui-icon-bookmark { background-position: -224px -96px; }
186
- .ui-icon-tag { background-position: -240px -96px; }
187
- .ui-icon-home { background-position: 0 -112px; }
188
- .ui-icon-flag { background-position: -16px -112px; }
189
- .ui-icon-calendar { background-position: -32px -112px; }
190
- .ui-icon-cart { background-position: -48px -112px; }
191
- .ui-icon-pencil { background-position: -64px -112px; }
192
- .ui-icon-clock { background-position: -80px -112px; }
193
- .ui-icon-disk { background-position: -96px -112px; }
194
- .ui-icon-calculator { background-position: -112px -112px; }
195
- .ui-icon-zoomin { background-position: -128px -112px; }
196
- .ui-icon-zoomout { background-position: -144px -112px; }
197
- .ui-icon-search { background-position: -160px -112px; }
198
- .ui-icon-wrench { background-position: -176px -112px; }
199
- .ui-icon-gear { background-position: -192px -112px; }
200
- .ui-icon-heart { background-position: -208px -112px; }
201
- .ui-icon-star { background-position: -224px -112px; }
202
- .ui-icon-link { background-position: -240px -112px; }
203
- .ui-icon-cancel { background-position: 0 -128px; }
204
- .ui-icon-plus { background-position: -16px -128px; }
205
- .ui-icon-plusthick { background-position: -32px -128px; }
206
- .ui-icon-minus { background-position: -48px -128px; }
207
- .ui-icon-minusthick { background-position: -64px -128px; }
208
- .ui-icon-close { background-position: -80px -128px; }
209
- .ui-icon-closethick { background-position: -96px -128px; }
210
- .ui-icon-key { background-position: -112px -128px; }
211
- .ui-icon-lightbulb { background-position: -128px -128px; }
212
- .ui-icon-scissors { background-position: -144px -128px; }
213
- .ui-icon-clipboard { background-position: -160px -128px; }
214
- .ui-icon-copy { background-position: -176px -128px; }
215
- .ui-icon-contact { background-position: -192px -128px; }
216
- .ui-icon-image { background-position: -208px -128px; }
217
- .ui-icon-video { background-position: -224px -128px; }
218
- .ui-icon-script { background-position: -240px -128px; }
219
- .ui-icon-alert { background-position: 0 -144px; }
220
- .ui-icon-info { background-position: -16px -144px; }
221
- .ui-icon-notice { background-position: -32px -144px; }
222
- .ui-icon-help { background-position: -48px -144px; }
223
- .ui-icon-check { background-position: -64px -144px; }
224
- .ui-icon-bullet { background-position: -80px -144px; }
225
- .ui-icon-radio-off { background-position: -96px -144px; }
226
- .ui-icon-radio-on { background-position: -112px -144px; }
227
- .ui-icon-pin-w { background-position: -128px -144px; }
228
- .ui-icon-pin-s { background-position: -144px -144px; }
229
- .ui-icon-play { background-position: 0 -160px; }
230
- .ui-icon-pause { background-position: -16px -160px; }
231
- .ui-icon-seek-next { background-position: -32px -160px; }
232
- .ui-icon-seek-prev { background-position: -48px -160px; }
233
- .ui-icon-seek-end { background-position: -64px -160px; }
234
- .ui-icon-seek-start { background-position: -80px -160px; }
235
- /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
236
- .ui-icon-seek-first { background-position: -80px -160px; }
237
- .ui-icon-stop { background-position: -96px -160px; }
238
- .ui-icon-eject { background-position: -112px -160px; }
239
- .ui-icon-volume-off { background-position: -128px -160px; }
240
- .ui-icon-volume-on { background-position: -144px -160px; }
241
- .ui-icon-power { background-position: 0 -176px; }
242
- .ui-icon-signal-diag { background-position: -16px -176px; }
243
- .ui-icon-signal { background-position: -32px -176px; }
244
- .ui-icon-battery-0 { background-position: -48px -176px; }
245
- .ui-icon-battery-1 { background-position: -64px -176px; }
246
- .ui-icon-battery-2 { background-position: -80px -176px; }
247
- .ui-icon-battery-3 { background-position: -96px -176px; }
248
- .ui-icon-circle-plus { background-position: 0 -192px; }
249
- .ui-icon-circle-minus { background-position: -16px -192px; }
250
- .ui-icon-circle-close { background-position: -32px -192px; }
251
- .ui-icon-circle-triangle-e { background-position: -48px -192px; }
252
- .ui-icon-circle-triangle-s { background-position: -64px -192px; }
253
- .ui-icon-circle-triangle-w { background-position: -80px -192px; }
254
- .ui-icon-circle-triangle-n { background-position: -96px -192px; }
255
- .ui-icon-circle-arrow-e { background-position: -112px -192px; }
256
- .ui-icon-circle-arrow-s { background-position: -128px -192px; }
257
- .ui-icon-circle-arrow-w { background-position: -144px -192px; }
258
- .ui-icon-circle-arrow-n { background-position: -160px -192px; }
259
- .ui-icon-circle-zoomin { background-position: -176px -192px; }
260
- .ui-icon-circle-zoomout { background-position: -192px -192px; }
261
- .ui-icon-circle-check { background-position: -208px -192px; }
262
- .ui-icon-circlesmall-plus { background-position: 0 -208px; }
263
- .ui-icon-circlesmall-minus { background-position: -16px -208px; }
264
- .ui-icon-circlesmall-close { background-position: -32px -208px; }
265
- .ui-icon-squaresmall-plus { background-position: -48px -208px; }
266
- .ui-icon-squaresmall-minus { background-position: -64px -208px; }
267
- .ui-icon-squaresmall-close { background-position: -80px -208px; }
268
- .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
269
- .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
270
- .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
271
- .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
272
- .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
273
- .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
274
-
275
-
276
- /* Misc visuals
277
- ----------------------------------*/
278
-
279
- /* Corner radius */
280
- .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
281
- .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
282
- .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
283
- .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
284
-
285
- /* Overlays */
286
- .ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
287
- .ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*!
288
- * jQuery UI Autocomplete 1.8.23
289
- *
290
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
291
- * Dual licensed under the MIT or GPL Version 2 licenses.
292
- * http://jquery.org/license
293
- *
294
- * http://docs.jquery.com/UI/Autocomplete#theming
295
- */
296
- .ui-autocomplete { position: absolute; cursor: default; }
297
-
298
- /* workarounds */
299
- * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
300
-
301
- /*
302
- * jQuery UI Menu 1.8.23
303
- *
304
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
305
- * Dual licensed under the MIT or GPL Version 2 licenses.
306
- * http://jquery.org/license
307
- *
308
- * http://docs.jquery.com/UI/Menu#theming
309
- */
310
- .ui-menu {
311
- list-style:none;
312
- padding: 2px;
313
- margin: 0;
314
- display:block;
315
- float: left;
316
- }
317
- .ui-menu .ui-menu {
318
- margin-top: -3px;
319
- }
320
- .ui-menu .ui-menu-item {
321
- margin:0;
322
- padding: 0;
323
- zoom: 1;
324
- float: left;
325
- clear: left;
326
- width: 100%;
327
- }
328
- .ui-menu .ui-menu-item a {
329
- text-decoration:none;
330
- display:block;
331
- padding:.2em .4em;
332
- line-height:1.5;
333
- zoom:1;
334
- }
335
- .ui-menu .ui-menu-item a.ui-state-hover,
336
- .ui-menu .ui-menu-item a.ui-state-active {
337
- font-weight: normal;
338
- margin: -1px;
339
- }
@@ -1,2 +0,0 @@
1
- module ApplicationHelper
2
- end
@@ -1,844 +0,0 @@
1
- #--
2
- # Copyright (c) 2012+ Damjan Rems
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining
5
- # a copy of this software and associated documentation files (the
6
- # "Software"), to deal in the Software without restriction, including
7
- # without limitation the rights to use, copy, modify, merge, publish,
8
- # distribute, sublicense, and/or sell copies of the Software, and to
9
- # permit persons to whom the Software is furnished to do so, subject to
10
- # the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be
13
- # included in all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- #++
23
-
24
- ###########################################################################
25
- #
26
- # CmseditHelper module defines helper methods used by cmsedit actions. Output is controlled by
27
- # data found in 3 major sections of DRG CMS form: index, result_set and form sections.
28
- #
29
- ###########################################################################
30
- module CmseditHelper
31
- # javascript part created by form helpers
32
- attr_reader :js
33
-
34
- ############################################################################
35
- # Get standard actions when actions directive contains single line.
36
- # Subroutine of dc_actions_for_index
37
- #
38
- # Allows for actions: new, filter, standard syntax
39
- ############################################################################
40
- def define_standard_actions(actions_params, standard)
41
- actions = {}
42
- actions_params.split(',').each do |an_action|
43
- an_action.strip!
44
- if an_action == 'standard'
45
- actions.merge!(standard)
46
- else
47
- standard.each do |index, action|
48
- (actions[index] = action; break) if action == an_action
49
- end
50
- end
51
- end
52
- actions
53
- end
54
-
55
- ############################################################################
56
- # Creates action div for cmsedit index action.
57
- ############################################################################
58
- def dc_actions_for_index()
59
- return '' if @form['index'].nil? or @form['readonly']
60
- actions = @form['index']['actions']
61
- return '' if actions.nil? or actions.size == 0
62
- std_actions = {2 => 'new', 3 => 'sort', 4 => 'filter' }
63
- if actions.class == String
64
- actions = define_standard_actions(actions, std_actions)
65
- elsif actions['standard']
66
- actions.merge!(std_actions)
67
- actions['standard'] = nil
68
- end
69
-
70
- # start div with hidden spinner image
71
- html = <<EOT
72
- <div id="dc-action-menu">
73
- <span class="dc-spinner div-hidden">#{fa_icon('spinner lg spin')}</span>
74
- <ul class="dc-action-menu">
75
- EOT
76
- # Remove actions settings and sort
77
- only_actions = []
78
- actions.each { |key, value| only_actions << [key, value] if key.class == Integer }
79
- only_actions.sort_by!(&:first)
80
- only_actions.each do |element|
81
- k,v = element
82
- session[:form_processing] = "index:actions: #{k}=#{v}"
83
- next if v.nil? # must be
84
- url = @parms.clone
85
- yaml = v.class == String ? {'type' => v} : v # if single definition simulate type parameter
86
- action = yaml['type'].to_s.downcase
87
- if action == 'url'
88
- dc_deprecate "action: url will be deprecated. Use action: link in index: actions"
89
- action = 'link'
90
- end
91
- # if return_to is present link directly to URL
92
- if action == 'link' and yaml['url']
93
- url = yaml['url']
94
- else
95
- url['controller'] = yaml['controller'] if yaml['controller']
96
- url['action'] = yaml['action'] || action
97
- url['table'] = yaml['table'] if yaml['table']
98
- url['form_name'] = yaml['form_name'] if yaml['form_name']
99
- end
100
- # html link options
101
- yhtml = yaml['html'] || {}
102
- yhtml['title'] = yaml['title'] if yaml['title']
103
- html << '<li class="dc-animate">'
104
- #
105
- html << case
106
- # sort
107
- when action == 'sort' then
108
- choices = [['id','id']]
109
- if @form['index']['sort']
110
- @form['index']['sort'].split(',').each do |s|
111
- s.strip!
112
- choices << [ t("helpers.label.#{@form['table']}.#{s}"), s ]
113
- end
114
- end
115
- fa_icon('sort-alpha-asc') + ' ' + t('drgcms.sort') + ' ' +
116
- select('sort', 'sort', choices, { include_blank: true },
117
- { class: 'drgcms_sort', 'data-table' => @form['table']} )
118
- # filter
119
- when action == 'filter' then
120
- caption = t('drgcms.filter')
121
- caption << '&nbsp;' + fa_icon('caret-down lg') + DcFilter.menu_filter(self)
122
- # add filter OFF link
123
- s = session[@form['table']]
124
- if s and s[:filter]
125
- caption << '&nbsp;&nbsp;' + dc_link_to(nil,'remove lg', {controller: 'cmsedit',
126
- filter: 'off', table: @form['table']}, { title: DcFilter.title4_filter_off(s[:filter]) })
127
- end
128
- caption
129
- # new
130
- when action == 'new' then
131
- caption = yaml['caption'] || 'drgcms.new'
132
- dc_link_to(caption,'plus', url, yhtml )
133
- # menu
134
- when action == 'menu' then
135
- caption = t(v['caption'], v['caption']) + '&nbsp;' + fa_icon('caret-down lg')
136
- caption + eval(v['eval'])
137
- else
138
- caption = yaml['caption'] || yaml['text']
139
- icon = yaml['icon'] ? yaml['icon'] : action
140
- dc_link_to(caption, icon, url, yhtml)
141
- end
142
- html << '</li>'
143
- end
144
- html << '</ul>'
145
- html << DcFilter.get_filter_field(self)
146
- html << '</div>'
147
- html.html_safe
148
- end
149
-
150
- ############################################################################
151
- # Creates filter div for cmsedit index/filter action.
152
- ############################################################################
153
- def dc_div_filter()
154
- choices = []
155
- filter = (@form['index'] and @form['index']['filter']) ? @form['index']['filter'] + ',' : ''
156
- filter << 'id as text_field' # filter id is added by default
157
- filter.split(',').each do |f|
158
- f.strip!
159
- name = f.match(' as ') ? f.split(' ').first : f
160
- # like another field on the form
161
- if f.match(' like ')
162
- a = f.split(' ')
163
- name = a.first
164
- f = a.last
165
- end
166
- choices << [ t("helpers.label.#{@form['table']}.#{name}", name), f ]
167
- end
168
- choices4_operators = t('drgcms.choices4_filter_operators').chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )}
169
- # currently selected options
170
- if session[@form['table']] and session[@form['table']][:filter]
171
- field_name, operators_value, dummy = session[@form['table']][:filter].split("\t")
172
- else
173
- field_name, operators_value = nil, nil
174
- end
175
- #{ form_tag :table => @form['table'], filter: :on, filter_input: 1, action: :index, method: :post }
176
- url = url_for(:table => @form['table'], filter: :on, filter_input: 1, action: :index, controller: :cmsedit)
177
- html =<<EOT
178
- <div id="drgcms_filter" class="div-hidden">
179
- <h1>#{t('drgcms.filter_set')}</h1>
180
-
181
- #{ select(nil, 'filter_field1', options_for_select(choices, field_name), { include_blank: true }) }
182
- #{ select(nil, 'filter_oper', options_for_select(choices4_operators, operators_value)) }
183
- <div class="dc-menu">
184
- <div class="dc-link dc-animate drgcms_popup_submit" data-url="#{url}">#{fa_icon('check-square-o')} #{t('drgcms.filter_on')}</div>
185
- <div class="dc-link dc-animate">#{dc_link_to('drgcms.filter_off','close', {action: :index, filter: 'off', table: @form['table'], form_name: params['form_name']}) }</div>
186
- </div>
187
- </div>
188
- EOT
189
- html.html_safe
190
- end
191
-
192
- ############################################################################
193
- # Creates title div for cmsedit index result set records. Title div also includes paging
194
- # options.
195
- ############################################################################
196
- def dc_table_title_for_result(result=nil)
197
- title = if @form['title'] # form has title section
198
- t(@form['title'],@form['title'])
199
- else # get name from translations
200
- t('helpers.label.' + @form['table'] + '.tabletitle', @form['table'])
201
- end
202
- dc_table_title(title, result)
203
- end
204
-
205
- ############################################################################
206
- # Creates code for link or ajax action type. Subroutine of dc_actions_for_result.
207
- ############################################################################
208
- def dc_link_or_ajax(yaml, parms) #:nodoc:
209
- rest = {}
210
- rest['method'] = yaml['method'] || yaml['request'] || 'get'
211
- rest['caption'] = yaml['caption'] || yaml['text']
212
- # rest['class'] = (yaml['type'] == 'link' ? 'dc-link' : 'dc-link-ajax') + ' dc-animate'
213
- rest['class'] = 'dc-animate'
214
- rest['title'] = yaml['title']
215
-
216
- dc_deprecate "Form: result_set:action:text directive will be deprecated. Use caption instead of text." if yaml['text']
217
- if yaml['type'] == 'link'
218
- dc_link_to(yaml['caption'], yaml['icon'], parms, rest )
219
- else
220
- rest['data-url'] = url_for(parms)
221
- rest['class'] << " fa fa-#{yaml['icon']}"
222
- fa_icon(yaml['icon'], rest )
223
- end
224
- end
225
-
226
- ############################################################################
227
- # Determines actions and width of actions column
228
- ############################################################################
229
- def dc_actions_column()
230
- actions = @form['result_set']['actions']
231
- # standard actions
232
- actions = {'standard' => true} if actions.class == String && actions == 'standard'
233
- std_actions = {' 2' => 'edit', ' 3' => 'delete'}
234
- actions.merge!(std_actions) if actions['standard']
235
- #
236
- width = @form['result_set']['actions_width'] || 20*actions.size
237
- [ actions, "<div class=\"actions\" style=\"width: #{width}px;\">" ]
238
- end
239
-
240
- ############################################################################
241
- # Creates actions that could be performed on single row of result set.
242
- ############################################################################
243
- def dc_actions_for_result(document)
244
- actions = @form['result_set']['actions']
245
- return '' if actions.nil? or @form['readonly']
246
- #
247
- actions, html = dc_actions_column()
248
- actions.each do |k,v|
249
- session[:form_processing] = "result_set:actions: #{k}=#{v}"
250
- next if k == 'standard' # ignore standard definition
251
- parms = @parms.clone
252
- yaml = v.class == String ? {'type' => v} : v # if single definition simulate type parameter
253
- html << case
254
- when yaml['type'] == 'edit' then
255
- parms['action'] = 'edit'
256
- parms['id'] = document.id
257
- dc_link_to( nil, 'pencil lg', parms )
258
- when yaml['type'] == 'duplicate' then
259
- parms['id'] = document.id
260
- # duplicate string will be added to these fields.
261
- parms['dup_fields'] = yaml['dup_fields']
262
- parms['action'] = 'create'
263
- dc_link_to( nil, 'copy lg', parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post )
264
- when yaml['type'] == 'delete' then
265
- parms['action'] = 'destroy'
266
- parms['id'] = document.id
267
- dc_link_to( nil, 'remove lg', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
268
- # undocumented so far
269
- when yaml['type'] == 'edit_embedded'
270
- parms['controller'] = 'cmsedit'
271
- parms['table'] += ";#{yaml['table']}"
272
- parms['ids'] ||= ''
273
- parms['ids'] += "#{document.id};"
274
- dc_link_to( nil, 'table lg', parms, method: :get )
275
- when yaml['type'] == 'link' || yaml['type'] == 'ajax' then
276
- if yaml['url']
277
- parms['controller'] = yaml['url']
278
- parms['idr'] = document.id
279
- else
280
- parms['id'] = document.id
281
- end
282
- parms['controller'] = yaml['controller'] if yaml['controller']
283
- parms['action'] = yaml['action'] if yaml['action']
284
- parms['table'] = yaml['table'] if yaml['table']
285
- parms['form_name'] = yaml['form_name'] if yaml['form_name']
286
- parms['target'] = yaml['target'] if yaml['target']
287
- dc_link_or_ajax(yaml, parms)
288
- else # error.
289
- yaml['type'].to_s
290
- end
291
- end
292
- html << '</div>'
293
- html.html_safe
294
- end
295
-
296
- ############################################################################
297
- # Creates header div for result set.
298
- ############################################################################
299
- def dc_header_for_result()
300
- html = '<div class="dc-result-header">'
301
- if @form['result_set']['actions'] and !@form['readonly']
302
- ignore, code = dc_actions_column()
303
- html << code + '</div>'
304
- end
305
- # preparation for sort icon
306
- sort_field, sort_direction = nil, nil
307
- if session[@form['table']]
308
- sort_field, sort_direction = session[@form['table']][:sort].to_s.split(' ')
309
- end
310
- #
311
- if (columns = @form['result_set']['columns'])
312
- columns.each do |k,v|
313
- session[:form_processing] = "result_set:columns: #{k}=#{v}"
314
- #
315
- th = %Q[<div class="th" style="width: #{v['width'] || '15%'};text-align: #{v['align'] || 'left'};"]
316
- v = {'name' => v} if v.class == String
317
- caption = v['caption'] || t("helpers.label.#{@form['table']}.#{v['name']}")
318
- # no sorting when embedded documents or custom filter is active
319
- sort_ok = @form['result_set'].nil? || (@form['result_set'] && @form['result_set']['filter'].nil?)
320
- sort_ok = sort_ok || (@form['index'] && @form['index']['sort'])
321
- if @tables.size == 1 and sort_ok
322
- icon = 'sort lg'
323
- if v['name'] == sort_field
324
- icon = sort_direction == '1' ? 'sort-alpha-asc lg' : 'sort-alpha-desc lg'
325
- end
326
- th << ">#{dc_link_to(caption, icon, sort: v['name'], table: params[:table], form_name: params[:form_name], action: :index, icon_pos: :last )}</div>"
327
- else
328
- th << ">#{caption}</div>"
329
- end
330
- html << "<div class=\"spacer\"></div>" + th
331
- end
332
- end
333
- (html << '</div>').html_safe
334
- end
335
-
336
- ############################################################################
337
- # Creates link for single or double click on result column
338
- ############################################################################
339
- def dc_clicks_for_result(document)
340
- html = ''
341
- if @form['result_set']['dblclick']
342
- yaml = @form['result_set']['dblclick']
343
- opts = {}
344
- opts[:controller] = yaml['controller'] || 'cmsedit'
345
- opts[:action] = yaml['action']
346
- opts[:table] = yaml['table']
347
- opts[:form_name] = yaml['form_name']
348
- opts[:method] = yaml['method'] || 'get'
349
- opts[:id] = document['id']
350
- html << ' data-dblclick=' + url_for(opts)
351
- else
352
- html << (' data-dblclick=' +
353
- url_for(action: 'show', controller: 'cmsedit', id: document,
354
- readonly: (params[:readonly] ? 2 : 1), table: params[:table],
355
- form_name: params[:form_name], ids: params[:ids]) ) if @form['form']
356
- end
357
- html
358
- end
359
-
360
- ############################################################################
361
- # Formats value according to format supplied or data type. There is lots of things missing here.
362
- ############################################################################
363
- def dc_format_value(value, format=nil)
364
- # :TODO: Enable formating numbers.
365
- return '' if value.nil?
366
- klass = value.class.to_s
367
- case when klass.match('Time') then
368
- format ||= t('time.formats.default')
369
- value.strftime(format)
370
- when klass.match('Date') then
371
- format ||= t('date.formats.default')
372
- value.strftime(format)
373
- when format.to_s[0] == 'N' then
374
- dec = format[1].blank? ? nil : format[1].to_i
375
- sep = format[2].blank? ? nil : format[2]
376
- del = format[3].blank? ? nil : format[3]
377
- cur = format[4].blank? ? nil : format[4]
378
- dc_format_number(value, dec, sep, del, cur)
379
- else
380
- value.to_s
381
- end
382
- end
383
-
384
- ############################################################################
385
- # Defines style or class for row (tr) or column (td)
386
- ############################################################################
387
- def dc_style_or_class(selector, yaml, value, record)
388
- return '' if yaml.nil?
389
- # alias record and value so both names can be used in eval
390
- field = value
391
- document = record
392
- html = selector ? "#{selector}=\"" : ''
393
- html << if yaml.class == String
394
- yaml
395
- else
396
- (yaml['eval'] ? eval(yaml['eval']) : '') rescue 'background-color:red;'
397
- end
398
- html << '"' if selector
399
- html
400
- end
401
-
402
- ############################################################################
403
- # Creates tr code for each row of result set.
404
- ############################################################################
405
- def dc_row_for_result(document)
406
- clas = "dc-#{cycle('odd','even')} " + dc_style_or_class(nil, @form['result_set']['tr_class'], nil, document)
407
- style = dc_style_or_class('style', @form['result_set']['tr_style'], nil, document)
408
- "<div class=\"dc-result-data #{clas}\" #{dc_clicks_for_result(document)} #{style}>".html_safe
409
- end
410
-
411
- ############################################################################
412
- # Creates column for each field of result set document.
413
- ############################################################################
414
- def dc_columns_for_result(document)
415
- html = ''
416
- return html unless @form['result_set']['columns']
417
- #
418
- @form['result_set']['columns'].each do |k,v|
419
- session[:form_processing] = "result_set:columns: #{k}=#{v}"
420
- # convert shortcut to hash
421
- v = {'name' => v} if v.class == String
422
- # eval
423
- value = if v['eval']
424
- if v['eval'].match('dc_name4_id')
425
- a = v['eval'].split(',')
426
- if a.size == 3
427
- dc_name4_id(a[1], a[2], nil, document[ v['name'] ])
428
- else
429
- dc_name4_id(a[1], a[2], a[3], document[ v['name'] ])
430
- end
431
- elsif v['eval'].match('dc_name4_value')
432
- dc_name4_value( @form['table'], v['name'], document[ v['name'] ] )
433
- elsif v['eval'].match('eval ')
434
- # evaluate with specified parameters
435
- else
436
- if v['params']
437
- if v['params'] == 'document' # pass document as parameter when all
438
- eval( "#{v['eval']} document")
439
- else # list of fields delimeted by ,
440
- params = v['params'].chomp.split(',').inject('') do |result,e|
441
- result << (e.match(/\.|\:|\(/) ? e : "document['#{e.strip}']") + ','
442
- end
443
- params.chomp!(',')
444
- eval( "#{v['eval']} #{params}")
445
- end
446
- else
447
- eval( "#{v['eval']} '#{document[ v['name'] ]}'")
448
- end
449
- end
450
- # as field
451
- elsif document.respond_to?(v['name'])
452
- dc_format_value(document.send( v['name'] ), v['format'])
453
- # as hash (dc_memory)
454
- elsif document.class == Hash
455
- document[ v['name'] ]
456
- # error
457
- else
458
- "!!! #{v['name']}"
459
- end
460
- #
461
- td = '<div class="spacer"></div><div class="td" '
462
- td << dc_style_or_class('class', v['td_class'], value, document)
463
-
464
- width_align = %Q[width: #{v['width'] || '15%'};text-align: #{v['align'] || 'left'};]
465
- style = dc_style_or_class('style', v['td_style'] || v['style'], value, document)
466
- style = if style.size > 1
467
- # remove trailing " add width and add trailing " back
468
- style.slice(0..-1) + width_align + '"'
469
- else
470
- # create style string
471
- "style=\"#{width_align}\""
472
- end
473
- html << "#{td} #{style}>#{value}</div>"
474
- end
475
- html.html_safe
476
- end
477
-
478
- ############################################################################
479
- # Creates actions div for edit form.
480
- #
481
- # Displaying readonly form turned out to be challenge. For now when readonly parameter
482
- # has value 2, back link will force readonly form. Value 1 or not set will result in
483
- # normal link.
484
- ############################################################################
485
- def dc_actions_for_form()
486
- # create standard actions
487
- std_actions = {' 1' => 'back', ' 2' => {'type' => 'submit', 'caption' => 'drgcms.save'},
488
- ' 3' => {'type' => 'submit', 'caption' => 'drgcms.save&back'} }
489
- # when edit only
490
- unless @record.id.nil?
491
- std_actions.merge!({' 6' => 'new'} )
492
- std_actions.merge!(@record.active ? {' 5' => 'disable'} : {' 5' => 'enable'} ) if @record.respond_to?('active')
493
- end
494
- actions = @form['form']['actions']
495
- # shortcut for actions: standard
496
- actions = nil if actions.class == String && actions == 'standard'
497
- # standard actions
498
- actions = std_actions if actions.nil?
499
- # readonly
500
- actions = {' 1' => 'back'} if @form['readonly']
501
- # Actions are strictly forbidden
502
- if @form['form']['actions'] and dc_dont?(@form['form']['actions'])
503
- actions = []
504
- elsif actions['standard']
505
- actions.merge!(std_actions)
506
- actions['standard'] = nil
507
- end
508
- # Update save and save&back
509
- actions.each do |k,v|
510
- if v.class == String
511
- if v.match(/save\&back/i)
512
- actions[k] = {'type' => 'submit', 'caption' => 'drgcms.save&back'}
513
- elsif v == 'save'
514
- actions[k] = {'type' => 'submit', 'caption' => 'drgcms.save'}
515
- end
516
- end
517
- end
518
- # Sort so that standard actions come first
519
- actions = actions.to_a.sort {|x,y| x[0].to_s <=> y[0].to_s}
520
- # Add spinner to the beginning
521
- c = %Q[<span class="dc-spinner div-hidden">#{fa_icon('spinner lg spin')}</span><ul class="dc-menu">]
522
-
523
- actions.each do |element|
524
- session[:form_processing] = "form:actions: #{element}"
525
- v = element[1]
526
- next if v.nil? # yes it happends
527
- p "Using text option in actions_for form is replaced with caption. Table #{@form['table']}" if v['text']
528
- # on_save_ok should't go inside td tags
529
- if (element[0] == 'on_save_ok') then
530
- c << hidden_field_tag(:on_save_ok, v)
531
- next
532
- end
533
- #
534
- parms = @parms.clone
535
- if v.class == String
536
- next if params[:readonly] and !(v == 'back')
537
-
538
- c << '<li class="dc-link dc-animate">'
539
- c << case
540
- when (v == 'back' or v == 'cancle') then
541
- # If return_to is present link directly to URL
542
- if parms['xreturn_to'] # disabled for now
543
- dc_link_to( 'drgcms.back','arrow-left', parms['return_to'] )
544
- else
545
- parms['action'] = 'index'
546
- parms['readonly'] = parms['readonly'].to_s.to_i < 2 ? nil : 1
547
- dc_link_to( 'drgcms.back','arrow-left', parms )
548
- end
549
- when v == 'delete' then
550
- parms['operation'] = v
551
- parms['id'] = @record.id
552
- dc_link_to( 'drgcms.delete','remove', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
553
- when v == 'new' then
554
- parms['action'] = v
555
- dc_link_to( 'drgcms.new', 'plus', parms)
556
- when (v == 'enable' or v == 'disable') then
557
- parms['operation'] = v
558
- parms['id'] = @record.id
559
- icon = (v == 'enable' ? 'thumbs-o-up' : 'thumbs-o-down')
560
- dc_link_to( "drgcms.#{v}",icon, parms, method: :delete )
561
- when v == 'edit' then
562
- parms['operation'] = v
563
- parms['id'] = @record.id
564
- dc_link_to( "drgcms.#{v}",v, parms )
565
- else
566
- "err1 #{element[0]}=>#{v}"
567
- end
568
- c << '</td>'
569
- # non standard actions
570
- else
571
- c << case
572
- # submit button
573
- when v['type'] == 'submit'
574
- caption = v['caption'] || 'drgcms.save'
575
- icon = v['icon'] || 'save'
576
- '<li class="dc-link-submit dc-animate">' +
577
- dc_submit_tag(caption, icon, {:data => v['params'], :title => v['title']}) +
578
- '</li>'
579
- # delete with some sugar added
580
- when v['type'] == 'delete'
581
- parms['id'] = @record.id
582
- parms.merge!(v['params'])
583
- caption = v['caption'] || 'drgcms.delete'
584
- icon = v['icon'] || 'remove'
585
- '<li class="dc-link dc-animate">' +
586
- dc_link_to( caption, icon, parms, data: t('drgcms.confirm_delete'), method: :delete ) +
587
- '</li>'
588
- # ajax or link button
589
- when v['type'] == 'ajax' || v['type'] == 'link'
590
- parms = {}
591
- # direct url
592
- if v['url']
593
- parms['controller'] = v['url']
594
- parms['idr'] = @record.id
595
- # make url
596
- else
597
- parms['controller'] = v['controller']
598
- parms['action'] = v['action']
599
- parms['table'] = v['table']
600
- parms['form_name'] = v['form_name']
601
- parms['id'] = @record.id
602
- # additional parameters
603
- v['params'].each { |k,v| parms[k] = v } if v['params']
604
- end
605
- # Error if controller param is missing
606
- if parms['controller'].nil?
607
- "<li>#{t('drgcms.error')}</li>"
608
- else
609
- v['caption'] ||= v['text']
610
- caption = t("#{v['caption'].downcase}", v['caption'])
611
- url = url_for(parms)
612
- request = v['request'] || v['method'] || 'get'
613
- icon = v['icon'] ? "#{fa_icon(v['icon'])} " : ''
614
- if v['type'] == 'ajax' # ajax button
615
- %Q[<li class="dc-link-ajax dc-animate" id="dc-submit-ajax" data-url="#{url}"
616
- data-request="#{request}" title="#{v['title']}">#{icon}#{caption}</li>]
617
- else # link button
618
- # %Q[<td class="dc-link dc-animate" title="#{v['title']}><a href="#{url}">#{icon}#{caption}</a></td>]
619
- %Q[<li class="dc-link dc-animate">#{dc_link_to(v['caption'],v['icon'], parms)}</li>]
620
- end
621
- end
622
- # Javascript action
623
- when v['type'] == 'script'
624
- # v['caption'] ||= 'Caption missing!'
625
- # caption = t("#{v['caption'].downcase}", v['caption'])
626
- data = {'request' => 'script', 'script' => v['js']}
627
- %Q[<li class="dc-link-ajax dc-animate">#{ dc_link_to(v['caption'],v['icon'], '#', data: data ) }</li>]
628
- else
629
- '<li>err2</li>'
630
- end
631
- end
632
- end
633
- (c << '</ul>').html_safe
634
- end
635
-
636
- ############################################################################
637
- # Create background div and table definitions for result set.
638
- ############################################################################
639
- def dc_background_for_result(start)
640
- if start == :start
641
- html = '<div class="dc-result-div" '
642
- html << (@form['result_set']['table_style'] ? 'style="overflow-x: scroll;" >' : '>')
643
- #
644
- html << "\n<div class=\"dc-result #{@form['result_set']['table_class']}\" "
645
- html << (@form['result_set']['table_style'] ? "style=\"#{@form['result_set']['table_style']}\" >" : '>')
646
- else
647
- html = '</div></div>'
648
- end
649
- html.html_safe
650
- end
651
-
652
- ############################################################################
653
- # Checks if value is defined and sets default. If values are sent it also checks
654
- # if value is found in values. If not it will report error and set value to default.
655
- # Subroutine of dc_fields_for_tab.
656
- ############################################################################
657
- def dc_check_and_default(value, default, values=nil) #:nodoc:
658
- return default if value.nil?
659
- # check if value is within allowed values
660
- if values
661
- if !values.index(value)
662
- # parameters should be in downcase. Check downcase version.
663
- if n = values.index(value.downcase)
664
- return values[n]
665
- else
666
- logger.error("DRG Forms: Value #{value} not within values [#{values.join(',')}]. Default #{default} used!")
667
- return default
668
- end
669
- end
670
- end
671
- value
672
- end
673
-
674
- ############################################################################
675
- # Creates top or bottom horizontal line on form.
676
- ############################################################################
677
- def top_bottom_line(yaml, columns=2)
678
- '<div class="dc-separator"></div>'
679
- end
680
-
681
- ############################################################################
682
- # Creates input fields for one tab. Subroutine of dc_fields_for_form.
683
- ############################################################################
684
- def dc_fields_for_tab(fields_on_tab) #:nodoc:
685
- @js ||= ''
686
- html = '<div class="dc-form">'
687
- labels_pos = dc_check_and_default(@form['form']['labels_pos'], 'right', ['top','left','right'])
688
- hidden_fields = ''
689
- odd_even = nil
690
- group_option, group_count = 0, 0
691
- reset_cycle()
692
- # options and fields must be separated before sorting
693
- # form_options = fields.select {|field| field.class != Integer }
694
- # columns = form_options.try(:[],'columns') || 1
695
- # Select form fields and sort them by key
696
- form_fields = fields_on_tab.select {|field| field.class == Integer }
697
- form_fields.to_a.sort.each do |element|
698
- options = element.last
699
- session[:form_processing] = "form:fields: #{element.first}=#{options}"
700
- # ignore if edit_only singe field is required
701
- next if params[:edit_only] and params[:edit_only] != options['name']
702
- # hidden_fields. Add them at the end
703
- if options['type'] == 'hidden_field'
704
- hidden_fields << DrgcmsFormFields::HiddenField.new(self, @record, options).render
705
- next
706
- end
707
- # label
708
- text = if options['text']
709
- t(options['text'], options['text'])
710
- elsif options['name']
711
- t_name(options['name'], options['name'].capitalize.gsub('_',' ') )
712
- end
713
- # help text can be defined in form or in translations starting with helpers. or as helpers.help.collection.field
714
- help = if options['help']
715
- options['help'].match('helpers.') ? t(options['help']) : options['help']
716
- end
717
- help ||= t('helpers.help.' + @form['table'] + '.' + options['name'],' ') if options['name']
718
- # create field object from class and call its render method
719
- klas_string = options['type'].camelize
720
- field_html = if DrgcmsFormFields.const_defined?(klas_string) # check if field type is defined
721
- klas = DrgcmsFormFields.const_get(klas_string)
722
- field = klas.new(self, @record, options).render
723
- @js << field.js
724
- field.html
725
- else # litle error string
726
- "Error: Code for field type #{options['type']} not defined!"
727
- end
728
- # Line separator
729
- html << top_bottom_line(options['top-line']) if options['top-line']
730
- # Begining of new row
731
- if group_count == 0
732
- html << '<div class="row-div">'
733
- odd_even = cycle('odd','even')
734
- group_count = options['group'] || 1
735
- group_option = options['group'] || 1
736
- end
737
- #
738
- html << if labels_pos == 'top'
739
- %Q[
740
- <div class="dc-form-label-top dc-color-#{odd_even} dc-align-left" title="#{help}">
741
- <label for="record_#{options['name']}">#{text} </label>
742
- <div id="td_record_#{options['name']}">#{field_html}</div>
743
- </div> ]
744
- else
745
- label_width = 14
746
- # less place for label when more then 1 field per row
747
- label_width = 10 if group_option > 1 and group_option != group_count
748
- data_width = (94 - 10*group_option)/group_option
749
- %Q[
750
- <div class="dc-form-label dc-color-#{odd_even} dc-align-#{labels_pos}" style="width:#{label_width}%;" title="#{help}">
751
- <label for="record_#{options['name']}">#{text} </label>
752
- </div>
753
- <div id="td_record_#{options['name']}" class="dc-form-field dc-color-#{odd_even}" style="width:#{data_width}%;">#{field_html}</div>
754
- ]
755
- end
756
- # check if must go to next row
757
- group_count -= 1
758
- html << '</div>' if group_count == 0
759
- html << top_bottom_line(options['bottom-line']) if options['bottom-line']
760
- end
761
- html << '</div>' << hidden_fields
762
- end
763
-
764
- ############################################################################
765
- # Creates edit form div.
766
- ############################################################################
767
- def dc_fields_for_form()
768
- html, tabs, tdata = '',[], ''
769
- # Only fields defined
770
- if (form_fields = @form['form']['fields'])
771
- html << "<div id='data_fields' " + (@form['form']['height'] ? "style=\"height: #{@form['form']['height']}px;\">" : '>')
772
- html << dc_fields_for_tab(form_fields) + '</div>'
773
- else
774
- # there are multiple tabs on form
775
- first = true # first tab
776
- @form['form']['tabs'].keys.sort.each do |tabname|
777
- next if tabname.match('actions')
778
- # Tricky. If field name is not on the tab skip to next tab
779
- if params[:edit_only]
780
- is_on_tab = false
781
- @form['form']['tabs'][tabname].each {|k,v| is_on_tab = true if params[:edit_only] == v['name'] }
782
- next unless is_on_tab
783
- end
784
- # first div is displayed all other are hidden
785
- tdata << "<div id='data_#{tabname.delete("\s\n")}'"
786
- tdata << ' class="div-hidden"' unless first
787
- tdata << " style=\"height: #{@form['form']['height']}px;\"" if @form['form']['height']
788
- tdata << ">#{dc_fields_for_tab(@form['form']['tabs'][tabname])}</div>"
789
- tabs << tabname
790
- first = false
791
- end
792
- # make it all work together
793
- html << '<ul class="dc-form-ul" >'
794
- first = true # first tab must be selected
795
- tabs.each do |tab|
796
- html << "<li id='li_#{tab}' data-div='#{tab.delete("\s\n")}' class='dc-form-li #{'dc-form-li-selected' if first }'>#{t_name(tab, tab)}</li>"
797
- first = false
798
- end
799
- html << '</ul>'
800
- html << tdata
801
- end
802
- # add last_updated_at hidden field so controller can check if record was updated in during editing
803
- html << hidden_field(nil, :last_updated_at, value: @record.updated_at.to_i) if @record.respond_to?(:updated_at)
804
- # add form time stamp to prevent double form submit
805
- html << hidden_field(nil, :form_time_stamp, value: Time.now.to_i)
806
- html.html_safe
807
- end
808
-
809
- ############################################################################
810
- # Returns username for id. Subroutine of dc_document_statistics
811
- ############################################################################
812
- def _get_user_for(field_name) #:nodoc:
813
- if @record[field_name]
814
- u = DcUser.find(@record[field_name])
815
- return u ? u.name : @record[field_name]
816
- end
817
- # nil
818
- end
819
-
820
- ############################################################################
821
- # Creates current document statistics div (created_by, created_at, ....) at the bottom of edit form.
822
- # + lots of more. At the moment also adds icon for dumping current document as json text.
823
- ############################################################################
824
- def dc_document_statistics
825
- return '' if @record.new_record? or dc_dont?(@form['form']['info'])
826
- html = %Q[<div id="dc-document-info">#{fa_icon('info-circle lg')}</div> <div id="dc-document-info-popup" class="div-hidden"> ]
827
- #
828
- u = _get_user_for('created_by')
829
- html << %Q[<div><span>#{t('drgcms.created_by', 'Created by')}: </span><span>#{u}</span></div>] if u
830
- u = _get_user_for('updated_by')
831
- html << %Q[<div><span>#{t('drgcms.updated_by', 'Updated by')}: </span><span>#{u}</span></div>] if u
832
- html << %Q[<div><span>#{t('drgcms.created_at', 'Created at')}: </span><span>#{dc_format_value(@record.created_at)}</span></div>] if @record['created_at']
833
- html << %Q[<div><span>#{t('drgcms.updated_at', 'Updated at')}: </span><span>#{dc_format_value(@record.updated_at)}</span></div>] if @record['updated_at']
834
- # copy to clipboard icon
835
- parms = params.clone
836
- parms[:controller] = 'dc_common'
837
- parms[:action] = 'copy_clipboard'
838
- url = url_for(parms.permit!)
839
- html << fa_icon('copy 2x', class: 'dc-link-img dc-link-ajax dc-animate',
840
- 'data-url' => url, 'data-request' => 'get', title: t('drgcms.doc_copy_clipboard') )
841
- (html << '</div></div>').html_safe
842
- end
843
-
844
- end