drg_cms 0.6.0.1 → 0.6.1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +454 -145
  3. data/app/assets/javascripts/drg_cms_application.js +1 -1
  4. data/app/assets/stylesheets/drg_cms/drg_cms.css +635 -244
  5. data/app/assets/stylesheets/drg_cms/select-multiple.css +18 -12
  6. data/app/assets/stylesheets/drg_cms_cms.css +1 -1
  7. data/app/controllers/cmsedit_controller.rb +515 -335
  8. data/app/controllers/dc_application_controller.rb +378 -111
  9. data/app/controllers/dc_common_controller.rb +105 -14
  10. data/app/{controllers → controls}/browse_models_control.rb +0 -0
  11. data/app/controls/dc_help_control.rb +126 -0
  12. data/app/{controllers → controls}/dc_page_control.rb +24 -8
  13. data/app/controls/dc_poll_result_control.rb +88 -0
  14. data/app/controls/dc_report.rb +223 -0
  15. data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
  16. data/app/forms/all_options.yml +44 -9
  17. data/app/forms/cms_menu.yml +28 -18
  18. data/app/forms/dc_ad.yml +11 -22
  19. data/app/forms/dc_big_table.yml +1 -0
  20. data/app/forms/dc_big_table_value.yml +1 -0
  21. data/app/forms/dc_category.yml +2 -1
  22. data/app/forms/dc_design.yml +20 -16
  23. data/app/forms/dc_filter.yml +3 -6
  24. data/app/forms/dc_help_1.yml +109 -0
  25. data/app/forms/dc_journal.yml +3 -1
  26. data/app/forms/dc_json_ld.yml +59 -0
  27. data/app/forms/dc_key_value.yml +32 -0
  28. data/app/forms/dc_link.yml +1 -1
  29. data/app/forms/dc_menu.yml +2 -0
  30. data/app/forms/dc_menu_item.yml +2 -0
  31. data/app/forms/dc_page.yml +3 -5
  32. data/app/forms/dc_part.yml +1 -0
  33. data/app/forms/dc_piece.yml +1 -0
  34. data/app/forms/dc_poll.yml +15 -5
  35. data/app/forms/dc_poll_item.yml +2 -1
  36. data/app/forms/dc_poll_result.yml +83 -0
  37. data/app/forms/dc_poll_result_export.yml +35 -0
  38. data/app/forms/dc_seo.yml +33 -0
  39. data/app/forms/dc_simple_menu.yml +2 -0
  40. data/app/forms/dc_site.yml +4 -12
  41. data/app/forms/dc_user.yml +27 -11
  42. data/app/forms/dc_user_role.yml +3 -0
  43. data/app/forms/json_ld_schema.yml +168 -0
  44. data/app/helpers/cms_common_helper.rb +375 -0
  45. data/app/helpers/cms_edit_helper.rb +506 -0
  46. data/app/helpers/cms_helper.rb +268 -0
  47. data/app/helpers/cms_index_helper.rb +580 -0
  48. data/app/helpers/dc_application_helper.rb +218 -306
  49. data/app/models/concerns/dc_page_concern.rb +40 -6
  50. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  51. data/app/models/concerns/dc_seo_concern.rb +66 -0
  52. data/app/models/concerns/dc_site_concern.rb +67 -44
  53. data/app/models/concerns/dc_user_concern.rb +57 -18
  54. data/app/models/dc_design.rb +30 -18
  55. data/app/models/dc_filter.rb +22 -13
  56. data/app/models/dc_json_ld.rb +152 -0
  57. data/app/models/dc_key_value.rb +48 -0
  58. data/app/models/dc_key_value_store.rb +1 -0
  59. data/app/models/dc_memory.rb +8 -1
  60. data/app/models/dc_page.rb +0 -1
  61. data/app/models/dc_permission.rb +49 -9
  62. data/app/models/dc_policy.rb +25 -14
  63. data/app/models/dc_policy_role.rb +22 -11
  64. data/app/models/dc_poll.rb +39 -19
  65. data/app/models/dc_poll_result.rb +46 -0
  66. data/app/models/dc_temp.rb +140 -0
  67. data/app/models/dc_user_role.rb +2 -2
  68. data/app/models/drgcms_form_fields.rb +12 -1
  69. data/app/models/drgcms_form_fields/action.rb +61 -0
  70. data/app/models/drgcms_form_fields/comment.rb +8 -4
  71. data/app/models/drgcms_form_fields/date_picker.rb +11 -9
  72. data/app/models/drgcms_form_fields/date_select.rb +1 -1
  73. data/app/models/drgcms_form_fields/datetime_picker.rb +12 -10
  74. data/app/models/drgcms_form_fields/datetime_select.rb +1 -1
  75. data/app/models/drgcms_form_fields/drgcms_field.rb +55 -9
  76. data/app/models/drgcms_form_fields/embedded.rb +26 -16
  77. data/app/models/drgcms_form_fields/file_field.rb +52 -0
  78. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  79. data/app/models/drgcms_form_fields/hash_field.rb +90 -0
  80. data/app/models/drgcms_form_fields/hidden_field.rb +1 -1
  81. data/app/models/drgcms_form_fields/html_field.rb +1 -1
  82. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  83. data/app/models/drgcms_form_fields/method.rb +66 -0
  84. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +23 -14
  85. data/app/models/drgcms_form_fields/number_field.rb +15 -6
  86. data/app/models/drgcms_form_fields/radio.rb +96 -0
  87. data/app/models/drgcms_form_fields/readonly.rb +2 -2
  88. data/app/models/drgcms_form_fields/select.rb +92 -29
  89. data/app/models/drgcms_form_fields/text_area.rb +1 -1
  90. data/app/models/drgcms_form_fields/text_autocomplete.rb +31 -17
  91. data/app/models/drgcms_form_fields/text_field.rb +1 -1
  92. data/app/models/drgcms_form_fields/text_with_select.rb +6 -3
  93. data/app/models/drgcms_form_fields/tree_select.rb +15 -4
  94. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  95. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
  96. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  97. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  98. data/app/{helpers → renderers}/dc_gallery_renderer.rb +1 -0
  99. data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
  100. data/app/{helpers → renderers}/dc_page_renderer.rb +1 -0
  101. data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
  102. data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
  103. data/app/{helpers → renderers}/dc_poll_renderer.rb +91 -64
  104. data/app/{helpers → renderers}/dc_renderer.rb +1 -0
  105. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
  106. data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
  107. data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
  108. data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
  109. data/app/views/cmsedit/_form.html.erb +4 -3
  110. data/app/views/cmsedit/_result.html.erb +2 -3
  111. data/app/views/cmsedit/edit.html.erb +4 -1
  112. data/app/views/cmsedit/index.html.erb +7 -1
  113. data/app/views/cmsedit/new.html.erb +3 -1
  114. data/app/views/dc_common/_help.html.erb +17 -0
  115. data/app/views/layouts/models.html.erb +2 -1
  116. data/config/locales/drgcms_en.yml +27 -3
  117. data/config/locales/drgcms_sl.yml +32 -5
  118. data/config/locales/models_en.yml +65 -17
  119. data/config/locales/models_sl.yml +69 -18
  120. data/drg_cms.gemspec +1 -1
  121. data/lib/drg_cms.rb +61 -1
  122. data/lib/drg_cms/version.rb +1 -1
  123. data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
  124. data/lib/tasks/database.rake +6 -56
  125. metadata +73 -54
  126. data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
  127. data/app/helpers/application_helper.rb +0 -2
  128. data/app/helpers/cmsedit_helper.rb +0 -888
  129. data/app/models/dc_dummy.rb +0 -102
  130. data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -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,888 +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
- code = case
104
- # sort
105
- when action == 'sort' then
106
- choices = [['id','id']]
107
- if @form['index']['sort']
108
- @form['index']['sort'].split(',').each do |s|
109
- s.strip!
110
- choices << [ t("helpers.label.#{@form['table']}.#{s}"), s ]
111
- end
112
- end
113
- fa_icon('sort-alpha-asc') + ' ' + t('drgcms.sort') + ' ' +
114
- select('sort', 'sort', choices, { include_blank: true },
115
- { class: 'drgcms_sort', 'data-table' => @form['table']} )
116
- # filter
117
- when action == 'filter' then
118
- caption = t('drgcms.filter')
119
- caption << '&nbsp;' + fa_icon('caret-down lg') + DcFilter.menu_filter(self)
120
- # add filter OFF link
121
- s = session[@form['table']]
122
- if s and s[:filter]
123
- caption << '&nbsp;&nbsp;' + dc_link_to(nil,'remove lg', {controller: 'cmsedit',
124
- filter: 'off', table: @form['table']}, { title: DcFilter.title4_filter_off(s[:filter]) })
125
- end
126
- caption
127
- # new
128
- when action == 'new' then
129
- caption = yaml['caption'] || 'drgcms.new'
130
- dc_link_to(caption,'plus', url, yhtml )
131
- # menu
132
- when action == 'menu' then
133
- caption = t(v['caption'], v['caption']) + '&nbsp;' + fa_icon('caret-down lg')
134
- caption + eval(v['eval'])
135
- =begin
136
- # reorder
137
- when action == 'reorder' then
138
- caption = t('drgcms.reorder')
139
- parms = @parms.clone
140
- parms['operation'] = v
141
- parms['id'] = params[:ids]
142
- parms['table'] = @form['table']
143
- dc_link_to( caption, 'reorder', parms, method: :delete )
144
- =end
145
- when action == 'script'
146
- html << dc_script_action(v)
147
- next
148
- else
149
- caption = yaml['caption'] || yaml['text']
150
- icon = yaml['icon'] ? yaml['icon'] : action
151
- dc_link_to(caption, icon, url, yhtml)
152
- end
153
- html << "<li class=\"dc-animate\">#{code}</li>"
154
- end
155
- html << '</ul>'
156
- html << DcFilter.get_filter_field(self)
157
- html << '</div>'
158
- html.html_safe
159
- end
160
-
161
- ############################################################################
162
- # Creates filter div for cmsedit index/filter action.
163
- ############################################################################
164
- def dc_div_filter()
165
- choices = []
166
- filter = (@form['index'] and @form['index']['filter']) ? @form['index']['filter'] + ',' : ''
167
- filter << 'id as text_field' # filter id is added by default
168
- filter.split(',').each do |f|
169
- f.strip!
170
- name = f.match(' as ') ? f.split(' ').first : f
171
- # like another field on the form
172
- if f.match(' like ')
173
- a = f.split(' ')
174
- name = a.first
175
- f = a.last
176
- end
177
- choices << [ t("helpers.label.#{@form['table']}.#{name}", name), f ]
178
- end
179
- choices4_operators = t('drgcms.choices4_filter_operators').chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )}
180
- # currently selected options
181
- if session[@form['table']] and session[@form['table']][:filter]
182
- field_name, operators_value, dummy = session[@form['table']][:filter].split("\t")
183
- else
184
- field_name, operators_value = nil, nil
185
- end
186
- #{ form_tag :table => @form['table'], filter: :on, filter_input: 1, action: :index, method: :post }
187
- url = url_for(table: @form['table'],form_name: params['form_name'], filter: :on, filter_input: 1, action: :index, controller: :cmsedit)
188
- html =<<EOT
189
- <div id="drgcms_filter" class="div-hidden">
190
- <h1>#{t('drgcms.filter_set')}</h1>
191
-
192
- #{ select(nil, 'filter_field1', options_for_select(choices, field_name), { include_blank: true }) }
193
- #{ select(nil, 'filter_oper', options_for_select(choices4_operators, operators_value)) }
194
- <div class="dc-menu">
195
- <div class="dc-link dc-animate drgcms_popup_submit" data-url="#{url}">#{fa_icon('check-square-o')} #{t('drgcms.filter_on')}</div>
196
- <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>
197
- </div>
198
- </div>
199
- EOT
200
- html.html_safe
201
- end
202
-
203
- ############################################################################
204
- # Creates title div for cmsedit index result set records. Title div also includes paging
205
- # options.
206
- ############################################################################
207
- def dc_table_title_for_result(result=nil)
208
- title = if @form['title'] # form has title section
209
- t(@form['title'],@form['title'])
210
- else # get name from translations
211
- t('helpers.label.' + @form['table'] + '.tabletitle', @form['table'])
212
- end
213
- dc_table_title(title, result)
214
- end
215
-
216
- ############################################################################
217
- # Creates code for link or ajax action type. Subroutine of dc_actions_for_result.
218
- ############################################################################
219
- def dc_link_or_ajax_action(yaml, parms) #:nodoc:
220
- rest = {}
221
- rest['method'] = yaml['method'] || yaml['request'] || 'get'
222
- rest['caption'] = yaml['caption'] || yaml['text']
223
- rest['class'] = 'dc-animate'
224
- rest['title'] = yaml['title']
225
-
226
- if yaml['type'] == 'link'
227
- dc_link_to(yaml['caption'], yaml['icon'], parms, rest )
228
- else
229
- rest['data-url'] = url_for(parms)
230
- rest['class'] << " fa fa-#{yaml['icon']}"
231
- fa_icon(yaml['icon'], rest )
232
- end
233
- end
234
-
235
- ############################################################################
236
- # Creates code for script action type.
237
- ############################################################################
238
- def dc_script_action(yaml)
239
- data = {'request' => 'script', 'script' => yaml['js']}
240
- %Q[<li class="dc-link-ajax dc-animate">#{ dc_link_to(yaml['caption'], yaml['icon'], '#', data: data ) }</li>]
241
- end
242
-
243
- ############################################################################
244
- # Determines actions and width of actions column
245
- ############################################################################
246
- def dc_actions_column()
247
- actions = @form['result_set']['actions']
248
- # standard actions
249
- actions = {'standard' => true} if actions.class == String && actions == 'standard'
250
- std_actions = {' 2' => 'edit', ' 3' => 'delete'}
251
- actions.merge!(std_actions) if actions['standard']
252
- #
253
- width = @form['result_set']['actions_width'] || 20*actions.size
254
- [ actions, "<div class=\"actions\" style=\"width: #{width}px;\">" ]
255
- end
256
-
257
- ############################################################################
258
- # Creates actions that could be performed on single row of result set.
259
- ############################################################################
260
- def dc_actions_for_result(document)
261
- actions = @form['result_set']['actions']
262
- return '' if actions.nil? or @form['readonly']
263
- #
264
- actions, html = dc_actions_column()
265
- actions.each do |k,v|
266
- session[:form_processing] = "result_set:actions: #{k}=#{v}"
267
- next if k == 'standard' # ignore standard definition
268
- parms = @parms.clone
269
- yaml = v.class == String ? {'type' => v} : v # if single definition simulate type parameter
270
- html << case
271
- when yaml['type'] == 'edit' then
272
- parms['action'] = 'edit'
273
- parms['id'] = document.id
274
- dc_link_to( nil, 'pencil lg', parms )
275
- when yaml['type'] == 'duplicate' then
276
- parms['id'] = document.id
277
- # duplicate string will be added to these fields.
278
- parms['dup_fields'] = yaml['dup_fields']
279
- parms['action'] = 'create'
280
- dc_link_to( nil, 'copy lg', parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post )
281
- when yaml['type'] == 'delete' then
282
- parms['action'] = 'destroy'
283
- parms['id'] = document.id
284
- dc_link_to( nil, 'remove lg', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
285
- # undocumented so far
286
- when yaml['type'] == 'edit_embedded'
287
- parms['controller'] = 'cmsedit'
288
- parms['table'] += ";#{yaml['table']}"
289
- parms['ids'] ||= ''
290
- parms['ids'] += "#{document.id};"
291
- dc_link_to( nil, 'table lg', parms, method: :get )
292
- when yaml['type'] == 'link' || yaml['type'] == 'ajax' then
293
- if yaml['url']
294
- parms['controller'] = yaml['url']
295
- parms['idr'] = document.id
296
- else
297
- parms['id'] = document.id
298
- end
299
- parms['controller'] = yaml['controller'] if yaml['controller']
300
- parms['action'] = yaml['action'] if yaml['action']
301
- parms['table'] = yaml['table'] if yaml['table']
302
- parms['form_name'] = yaml['form_name'] if yaml['form_name']
303
- parms['target'] = yaml['target'] if yaml['target']
304
- dc_link_or_ajax_action(yaml, parms)
305
- else # error.
306
- yaml['type'].to_s
307
- end
308
- end
309
- html << '</div>'
310
- html.html_safe
311
- end
312
-
313
- ############################################################################
314
- # Creates header div for result set.
315
- ############################################################################
316
- def dc_header_for_result()
317
- html = '<div class="dc-result-header">'
318
- if @form['result_set']['actions'] and !@form['readonly']
319
- ignore, code = dc_actions_column()
320
- html << code + '</div>'
321
- end
322
- # preparation for sort icon
323
- sort_field, sort_direction = nil, nil
324
- if session[@form['table']]
325
- sort_field, sort_direction = session[@form['table']][:sort].to_s.split(' ')
326
- end
327
- #
328
- if (columns = @form['result_set']['columns'])
329
- columns.each do |k,v|
330
- session[:form_processing] = "result_set:columns: #{k}=#{v}"
331
- #
332
- th = %Q[<div class="th" style="width: #{v['width'] || '15%'};text-align: #{v['align'] || 'left'};"]
333
- v = {'name' => v} if v.class == String
334
- caption = v['caption'] || t("helpers.label.#{@form['table']}.#{v['name']}")
335
- # no sorting when embedded documents or custom filter is active
336
- sort_ok = @form['result_set'].nil? || (@form['result_set'] && @form['result_set']['filter'].nil?)
337
- sort_ok = sort_ok || (@form['index'] && @form['index']['sort'])
338
- if @tables.size == 1 and sort_ok
339
- icon = 'sort lg'
340
- if v['name'] == sort_field
341
- icon = sort_direction == '1' ? 'sort-alpha-asc lg' : 'sort-alpha-desc lg'
342
- end
343
- th << ">#{dc_link_to(caption, icon, sort: v['name'], table: params[:table], form_name: params[:form_name], action: :index, icon_pos: :last )}</div>"
344
- else
345
- th << ">#{caption}</div>"
346
- end
347
- html << "<div class=\"spacer\"></div>" + th
348
- end
349
- end
350
- (html << '</div>').html_safe
351
- end
352
-
353
- ############################################################################
354
- # Creates link for single or double click on result column
355
- ############################################################################
356
- def dc_clicks_for_result(document)
357
- html = ''
358
- if @form['result_set']['dblclick']
359
- yaml = @form['result_set']['dblclick']
360
- opts = {}
361
- opts[:controller] = yaml['controller'] || 'cmsedit'
362
- opts[:action] = yaml['action']
363
- opts[:table] = yaml['table']
364
- opts[:form_name] = yaml['form_name']
365
- opts[:method] = yaml['method'] || 'get'
366
- opts[:id] = document['id']
367
- html << ' data-dblclick=' + url_for(opts)
368
- else
369
- html << (' data-dblclick=' +
370
- url_for(action: 'show', controller: 'cmsedit', id: document.id,
371
- readonly: (params[:readonly] ? 2 : 1), table: params[:table],
372
- form_name: params[:form_name], ids: params[:ids]) ) if @form['form']
373
- end
374
- html
375
- end
376
-
377
- ############################################################################
378
- # Formats value according to format supplied or data type. There is lots of things missing here.
379
- ############################################################################
380
- def dc_format_value(value, format=nil)
381
- return '' if value.nil?
382
- klass = value.class.to_s
383
- case when klass.match('Time') then
384
- format ||= t('time.formats.default')
385
- value.strftime(format)
386
- when klass.match('Date') then
387
- format ||= t('date.formats.default')
388
- value.strftime(format)
389
- when format.to_s[0] == 'N' then
390
- dec = format[1].blank? ? nil : format[1].to_i
391
- sep = format[2].blank? ? nil : format[2]
392
- del = format[3].blank? ? nil : format[3]
393
- cur = format[4].blank? ? nil : format[4]
394
- dc_format_number(value, dec, sep, del, cur)
395
- else
396
- value.to_s
397
- end
398
- end
399
-
400
- ############################################################################
401
- # Defines style or class for row (tr) or column (td)
402
- ############################################################################
403
- def dc_style_or_class(selector, yaml, value, record)
404
- return '' if yaml.nil?
405
- # alias record and value so both names can be used in eval
406
- field = value
407
- document = record
408
- html = selector ? "#{selector}=\"" : ''
409
- html << if yaml.class == String
410
- yaml
411
- else
412
- (yaml['eval'] ? eval(yaml['eval']) : '') rescue 'background-color:red;'
413
- end
414
- html << '"' if selector
415
- html
416
- end
417
-
418
- ############################################################################
419
- # Creates tr code for each row of result set.
420
- ############################################################################
421
- def dc_row_for_result(document)
422
- clas = "dc-#{cycle('odd','even')} " + dc_style_or_class(nil, @form['result_set']['tr_class'], nil, document)
423
- style = dc_style_or_class('style', @form['result_set']['tr_style'], nil, document)
424
- "<div class=\"dc-result-data #{clas}\" #{dc_clicks_for_result(document)} #{style}>".html_safe
425
- end
426
-
427
- ############################################################################
428
- # Creates column for each field of result set document.
429
- ############################################################################
430
- def dc_columns_for_result(document)
431
- html = ''
432
- return html unless @form['result_set']['columns']
433
- #
434
- @form['result_set']['columns'].each do |k,v|
435
- session[:form_processing] = "result_set:columns: #{k}=#{v}"
436
- # convert shortcut to hash
437
- v = {'name' => v} if v.class == String
438
- # eval
439
- value = if v['eval']
440
- if v['eval'].match('dc_name4_id')
441
- a = v['eval'].split(',')
442
- if a.size == 3
443
- dc_name4_id(a[1], a[2], nil, document[ v['name'] ])
444
- else
445
- dc_name4_id(a[1], a[2], a[3], document[ v['name'] ])
446
- end
447
- elsif v['eval'].match('dc_name4_value')
448
- dc_name4_value( @form['table'], v['name'], document[ v['name'] ] )
449
- elsif v['eval'].match('eval ')
450
- # evaluate with specified parameters
451
- else
452
- if v['params']
453
- if v['params'] == 'document' # pass document as parameter when all
454
- eval( "#{v['eval']} document")
455
- else # list of fields delimeted by ,
456
- params = v['params'].chomp.split(',').inject('') do |result,e|
457
- result << (e.match(/\.|\:|\(/) ? e : "document['#{e.strip}']") + ','
458
- end
459
- params.chomp!(',')
460
- eval( "#{v['eval']} #{params}")
461
- end
462
- else
463
- eval( "#{v['eval']} '#{document[ v['name'] ]}'")
464
- end
465
- end
466
- # as field
467
- elsif document.respond_to?(v['name'])
468
- dc_format_value(document.send( v['name'] ), v['format'])
469
- # as hash (dc_memory)
470
- elsif document.class == Hash
471
- dc_format_value(document[ v['name'] ], v['format'])
472
- # error
473
- else
474
- "!!! #{v['name']}"
475
- end
476
- #
477
- td = '<div class="spacer"></div><div class="td" '
478
- td << dc_style_or_class('class', v['td_class'], value, document)
479
-
480
- width_align = %Q[width: #{v['width'] || '15%'};text-align: #{v['align'] || 'left'};]
481
- style = dc_style_or_class('style', v['td_style'] || v['style'], value, document)
482
- style = if style.size > 1
483
- # remove trailing " add width and add trailing " back
484
- style.delete_suffix('"') + width_align + '"'
485
- else
486
- # create style string
487
- "style=\"#{width_align}\""
488
- end
489
- html << "#{td} #{style}>#{value}</div>"
490
- end
491
- html.html_safe
492
- end
493
-
494
- ############################################################################
495
- # Will return value for parameter required on form
496
- ############################################################################
497
- def dc_value_for_parameter(param)
498
- if param.class == Hash
499
- dc_internal_var(param['object'] || 'record', param['method'])
500
- else
501
- param
502
- end
503
- end
504
-
505
- ############################################################################
506
- # Creates actions div for edit form.
507
- #
508
- # Displaying readonly form turned out to be challenge. For now when readonly parameter
509
- # has value 2, back link will force readonly form. Value 1 or not set will result in
510
- # normal link.
511
- ############################################################################
512
- def dc_actions_for_form()
513
- # create standard actions
514
- std_actions = {' 1' => 'back', ' 2' => {'type' => 'submit', 'caption' => 'drgcms.save'},
515
- ' 3' => {'type' => 'submit', 'caption' => 'drgcms.save&back'} }
516
- # when edit only
517
- unless @record.id.nil?
518
- std_actions.merge!({' 6' => 'new'} )
519
- std_actions.merge!(@record.active ? {' 5' => 'disable'} : {' 5' => 'enable'} ) if @record.respond_to?('active')
520
- std_actions.merge!({' 7' => 'refresh'} )
521
- end
522
- actions = @form['form']['actions']
523
- # shortcut for actions: standard
524
- actions = nil if actions.class == String && actions == 'standard'
525
- # standard actions
526
- actions = std_actions if actions.nil?
527
- # readonly
528
- actions = {' 1' => 'back'} if @form['readonly']
529
- # Actions are strictly forbidden
530
- if @form['form']['actions'] and dc_dont?(@form['form']['actions'])
531
- actions = []
532
- elsif actions['standard']
533
- actions.merge!(std_actions)
534
- actions['standard'] = nil
535
- end
536
- # Update save and save&back
537
- actions.each do |k,v|
538
- if v.class == String
539
- if v.match(/save\&back/i)
540
- actions[k] = {'type' => 'submit', 'caption' => 'drgcms.save&back'}
541
- elsif v == 'save'
542
- actions[k] = {'type' => 'submit', 'caption' => 'drgcms.save'}
543
- end
544
- end
545
- end
546
- # Sort so that standard actions come first
547
- actions = actions.to_a.sort {|x,y| x[0].to_s <=> y[0].to_s}
548
- # Add spinner to the beginning
549
- c = %Q[<span class="dc-spinner div-hidden">#{fa_icon('spinner lg spin')}</span><ul class="dc-menu">]
550
-
551
- actions.each do |element|
552
- session[:form_processing] = "form:actions: #{element}"
553
- v = element[1]
554
- next if v.nil? # yes it happends
555
- p "Using text option in actions_for form is replaced with caption. Table #{@form['table']}" if v['text']
556
- # on_save_ok should't go inside td tags
557
- if (element[0] == 'on_save_ok') then
558
- c << hidden_field_tag(:on_save_ok, v)
559
- next
560
- end
561
- #
562
- action_active = !(dc_dont?(v['when_new']) and @record.new_record?)
563
- # p [v['caption'], action_active]
564
- parms = @parms.clone
565
- if v.class == String
566
- next if params[:readonly] and !(v == 'back')
567
-
568
- c << '<li class="dc-link dc-animate">'
569
- c << case
570
- when (v == 'back' or v == 'cancle') then
571
- # If return_to is present link directly to URL
572
- if parms['xreturn_to'] # disabled for now
573
- dc_link_to( 'drgcms.back','arrow-left', parms['return_to'] )
574
- else
575
- parms['action'] = 'index'
576
- parms['readonly'] = parms['readonly'].to_s.to_i < 2 ? nil : 1
577
- dc_link_to( 'drgcms.back','arrow-left', parms )
578
- end
579
- when v == 'delete' then
580
- parms['operation'] = v
581
- parms['id'] = @record.id
582
- dc_link_to( 'drgcms.delete','remove', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
583
- when v == 'new' then
584
- parms['action'] = v
585
- dc_link_to( 'drgcms.new', 'plus', parms)
586
- when (v == 'enable' or v == 'disable') then
587
- parms['operation'] = v
588
- parms['id'] = @record.id
589
- icon = (v == 'enable' ? 'thumbs-o-up' : 'thumbs-o-down')
590
- dc_link_to( "drgcms.#{v}",icon, parms, method: :delete )
591
- when v == 'edit' then
592
- parms['operation'] = v
593
- parms['id'] = @record.id
594
- dc_link_to( "drgcms.#{v}",v, parms )
595
- when v == 'refresh' then
596
- "<span onclick='window.location.href=window.location.href;'>#{fa_icon('refresh')} #{t('drgcms.refresh')}</span></li>"
597
- else
598
- "err1 #{element[0]}=>#{v}"
599
- end
600
- c << '</td>'
601
- # non standard actions
602
- else
603
- c << case
604
- # submit button
605
- when v['type'] == 'submit'
606
- caption = v['caption'] || 'drgcms.save'
607
- icon = v['icon'] || 'save'
608
- if action_active
609
- '<li class="dc-link-submit dc-animate">' +
610
- dc_submit_tag(caption, icon, {:data => v['params'], :title => v['title'] }) +
611
- '</li>'
612
- else
613
- "<li class=\"dc-link-no\">#{fa_icon(icon)} #{caption}</li>"
614
- end
615
-
616
- # delete with some sugar added
617
- when v['type'] == 'delete'
618
- parms['id'] = @record.id
619
- parms.merge!(v['params'])
620
- caption = v['caption'] || 'drgcms.delete'
621
- icon = v['icon'] || 'remove'
622
- '<li class="dc-link dc-animate">' +
623
- dc_link_to( caption, icon, parms, data: t('drgcms.confirm_delete'), method: :delete ) +
624
- '</li>'
625
-
626
- # ajax or link button
627
- when v['type'] == 'ajax' || v['type'] == 'link' || v['type'] == 'window'
628
- parms = {}
629
- # direct url
630
- if v['url']
631
- parms['controller'] = v['url']
632
- parms['idr'] = dc_document_path(@record)
633
- # make url from action controller
634
- else
635
- parms['controller'] = v['controller']
636
- parms['action'] = v['action']
637
- parms['table'] = v['table']
638
- parms['form_name'] = v['form_name']
639
- end
640
- # add current id to parameters
641
- parms['id'] = dc_document_path(@record)
642
- # additional parameters
643
- v['params'].each { |k,v| parms[k] = dc_value_for_parameter(v) } if v['params']
644
- # Error if controller parameter is missing
645
- if parms['controller'].nil?
646
- "<li>#{t('drgcms.error')}</li>"
647
- else
648
- v['caption'] ||= v['text']
649
- caption = t("#{v['caption'].downcase}", v['caption'])
650
- #
651
- url = url_for(parms) rescue ''
652
- request = v['request'] || v['method'] || 'get'
653
- icon = v['icon'] ? "#{fa_icon(v['icon'])} " : ''
654
- if v['type'] == 'ajax' # ajax button
655
- clas = action_active ? "dc-link-ajax dc-animate" : "dc-link-no"
656
- %Q[<li class="#{clas}" data-url="#{action_active ? url : ''}"
657
- data-request="#{request}" title="#{v['title']}">#{icon}#{caption}</li>]
658
- elsif v['type'] == 'link' # link button
659
- clas = action_active ? "dc-link dc-animate" : "dc-link-no"
660
- %Q[<li class="#{clas}">#{action_active ? dc_link_to(v['caption'],v['icon'], parms, {target: v['target']} ) : caption}</li>]
661
- elsif v['type'] == 'window'
662
- clas = action_active ? "dc-link dc-animate dc-window-open" : "dc-link-no"
663
- %Q[<li class="#{clas}" data-url="#{action_active ? url : ''}">#{icon}#{caption}</li>]
664
- else
665
- 'Action Type error'
666
- end
667
- end
668
-
669
- # Javascript action
670
- when v['type'] == 'script'
671
- dc_script_action(v)
672
- else
673
- '<li>err2</li>'
674
- end
675
- end
676
- end
677
- (c << '</ul>').html_safe
678
- end
679
-
680
- ############################################################################
681
- # Create background div and table definitions for result set.
682
- ############################################################################
683
- def dc_background_for_result(start)
684
- if start == :start
685
- html = '<div class="dc-result-div" '
686
- html << (@form['result_set']['table_style'] ? 'style="overflow-x: scroll;" >' : '>')
687
- #
688
- html << "\n<div class=\"dc-result #{@form['result_set']['table_class']}\" "
689
- html << (@form['result_set']['table_style'] ? "style=\"#{@form['result_set']['table_style']}\" >" : '>')
690
- else
691
- html = '</div></div>'
692
- end
693
- html.html_safe
694
- end
695
-
696
- ############################################################################
697
- # Checks if value is defined and sets default. If values are sent it also checks
698
- # if value is found in values. If not it will report error and set value to default.
699
- # Subroutine of dc_fields_for_tab.
700
- ############################################################################
701
- def dc_check_and_default(value, default, values=nil) #:nodoc:
702
- return default if value.nil?
703
- # check if value is within allowed values
704
- if values
705
- if !values.index(value)
706
- # parameters should be in downcase. Check downcase version.
707
- if n = values.index(value.downcase)
708
- return values[n]
709
- else
710
- logger.error("DRG Forms: Value #{value} not within values [#{values.join(',')}]. Default #{default} used!")
711
- return default
712
- end
713
- end
714
- end
715
- value
716
- end
717
-
718
- ############################################################################
719
- # Creates top or bottom horizontal line on form.
720
- ############################################################################
721
- def top_bottom_line(yaml, columns=2)
722
- '<div class="dc-separator"></div>'
723
- end
724
-
725
- ############################################################################
726
- # Creates input fields for one tab. Subroutine of dc_fields_for_form.
727
- ############################################################################
728
- def dc_fields_for_tab(fields_on_tab) #:nodoc:
729
- @js ||= ''
730
- html = '<div class="dc-form">'
731
- labels_pos = dc_check_and_default(@form['form']['labels_pos'], 'right', ['top','left','right'])
732
- hidden_fields = ''
733
- odd_even = nil
734
- group_option, group_count = 0, 0
735
- reset_cycle()
736
- # options and fields must be separated before sorting
737
- # form_options = fields.select {|field| field.class != Integer }
738
- # columns = form_options.try(:[],'columns') || 1
739
- # Select form fields and sort them by key
740
- form_fields = fields_on_tab.select {|field| field.class == Integer }
741
- form_fields.to_a.sort.each do |element|
742
- options = element.last
743
- session[:form_processing] = "form:fields: #{element.first}=#{options}"
744
- # ignore if edit_only singe field is required
745
- next if params[:edit_only] and params[:edit_only] != options['name']
746
- # hidden_fields. Add them at the end
747
- if options['type'] == 'hidden_field'
748
- hidden_fields << DrgcmsFormFields::HiddenField.new(self, @record, options).render
749
- next
750
- end
751
- # label
752
- text = if options['text']
753
- t(options['text'], options['text'])
754
- elsif options['name']
755
- t_name(options['name'], options['name'].capitalize.gsub('_',' ') )
756
- end
757
- # help text can be defined in form or in translations starting with helpers. or as helpers.help.collection.field
758
- help = if options['help']
759
- options['help'].match('helpers.') ? t(options['help']) : options['help']
760
- end
761
- help ||= t('helpers.help.' + @form['table'] + '.' + options['name'],' ') if options['name']
762
- # create field object from class and call its render method
763
- klas_string = options['type'].camelize
764
- field_html = if DrgcmsFormFields.const_defined?(klas_string) # check if field type is defined
765
- klas = DrgcmsFormFields.const_get(klas_string)
766
- field = klas.new(self, @record, options).render
767
- @js << field.js
768
- field.html
769
- else # litle error string
770
- "Error: Code for field type #{options['type']} not defined!"
771
- end
772
- # Line separator
773
- html << top_bottom_line(options['top-line']) if options['top-line']
774
- # Begining of new row
775
- if group_count == 0
776
- html << '<div class="row-div">'
777
- odd_even = cycle('odd','even')
778
- group_count = options['group'] || 1
779
- group_option = options['group'] || 1
780
- end
781
- #
782
- html << if labels_pos == 'top'
783
- %Q[
784
- <div class="dc-form-label-top dc-color-#{odd_even} dc-align-left" title="#{help}">
785
- <label for="record_#{options['name']}">#{text} </label>
786
- <div id="td_record_#{options['name']}">#{field_html}</div>
787
- </div> ]
788
- else
789
- label_width = 14
790
- # less place for label when more then 1 field per row
791
- label_width = 10 if group_option > 1 and group_option != group_count
792
- data_width = (94 - 10*group_option)/group_option
793
- %Q[
794
- <div class="dc-form-label dc-color-#{odd_even} dc-align-#{labels_pos}" style="width:#{label_width}%;" title="#{help}">
795
- <label for="record_#{options['name']}">#{text} </label>
796
- </div>
797
- <div id="td_record_#{options['name']}" class="dc-form-field dc-color-#{odd_even}" style="width:#{data_width}%;">#{field_html}</div>
798
- ]
799
- end
800
- # check if must go to next row
801
- group_count -= 1
802
- html << '</div>' if group_count == 0
803
- html << top_bottom_line(options['bottom-line']) if options['bottom-line']
804
- end
805
- html << '</div>' << hidden_fields
806
- end
807
-
808
- ############################################################################
809
- # Creates edit form div.
810
- ############################################################################
811
- def dc_fields_for_form()
812
- html, tabs, tdata = '',[], ''
813
- # Only fields defined
814
- if (form_fields = @form['form']['fields'])
815
- html << "<div id='data_fields' " + (@form['form']['height'] ? "style=\"height: #{@form['form']['height']}px;\">" : '>')
816
- html << dc_fields_for_tab(form_fields) + '</div>'
817
- else
818
- # there are multiple tabs on form
819
- first = true # first tab
820
- @form['form']['tabs'].keys.sort.each do |tabname|
821
- next if tabname.match('actions')
822
- # Tricky. If field name is not on the tab skip to next tab
823
- if params[:edit_only]
824
- is_on_tab = false
825
- @form['form']['tabs'][tabname].each {|k,v| is_on_tab = true if params[:edit_only] == v['name'] }
826
- next unless is_on_tab
827
- end
828
- # first div is displayed all other are hidden
829
- tdata << "<div id='data_#{tabname.delete("\s\n")}'"
830
- tdata << ' class="div-hidden"' unless first
831
- tdata << " style=\"height: #{@form['form']['height']}px;\"" if @form['form']['height']
832
- tdata << ">#{dc_fields_for_tab(@form['form']['tabs'][tabname])}</div>"
833
- tabs << tabname
834
- first = false
835
- end
836
- # make it all work together
837
- html << '<ul class="dc-form-ul" >'
838
- first = true # first tab must be selected
839
- tabs.each do |tab|
840
- 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>"
841
- first = false
842
- end
843
- html << '</ul>'
844
- html << tdata
845
- end
846
- # add last_updated_at hidden field so controller can check if record was updated in during editing
847
- html << hidden_field(nil, :last_updated_at, value: @record.updated_at.to_i) if @record.respond_to?(:updated_at)
848
- # add form time stamp to prevent double form submit
849
- html << hidden_field(nil, :form_time_stamp, value: Time.now.to_i)
850
- html.html_safe
851
- end
852
-
853
- ############################################################################
854
- # Returns username for id. Subroutine of dc_document_statistics
855
- ############################################################################
856
- def _get_user_for(field_name) #:nodoc:
857
- if @record[field_name]
858
- u = DcUser.find(@record[field_name])
859
- return u ? u.name : @record[field_name]
860
- end
861
- # nil
862
- end
863
-
864
- ############################################################################
865
- # Creates current document statistics div (created_by, created_at, ....) at the bottom of edit form.
866
- # + lots of more. At the moment also adds icon for dumping current document as json text.
867
- ############################################################################
868
- def dc_document_statistics
869
- return '' if @record.new_record? or dc_dont?(@form['form']['info'])
870
- html = %Q[<div id="dc-document-info">#{fa_icon('info-circle lg')}</div> <div id="dc-document-info-popup" class="div-hidden"> ]
871
- #
872
- u = _get_user_for('created_by')
873
- html << %Q[<div><span>#{t('drgcms.created_by', 'Created by')}: </span><span>#{u}</span></div>] if u
874
- u = _get_user_for('updated_by')
875
- html << %Q[<div><span>#{t('drgcms.updated_by', 'Updated by')}: </span><span>#{u}</span></div>] if u
876
- html << %Q[<div><span>#{t('drgcms.created_at', 'Created at')}: </span><span>#{dc_format_value(@record.created_at)}</span></div>] if @record['created_at']
877
- html << %Q[<div><span>#{t('drgcms.updated_at', 'Updated at')}: </span><span>#{dc_format_value(@record.updated_at)}</span></div>] if @record['updated_at']
878
- # copy to clipboard icon
879
- parms = params.clone
880
- parms[:controller] = 'dc_common'
881
- parms[:action] = 'copy_clipboard'
882
- url = url_for(parms.permit!)
883
- html << fa_icon('copy 2x', class: 'dc-link-img dc-link-ajax dc-animate',
884
- 'data-url' => url, 'data-request' => 'get', title: t('drgcms.doc_copy_clipboard') )
885
- (html << '</div></div>').html_safe
886
- end
887
-
888
- end