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.
- checksums.yaml +5 -5
- data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
- data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +476 -215
- data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
- data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
- data/app/assets/stylesheets/drg_cms_cms.css +1 -1
- data/app/controllers/cmsedit_controller.rb +474 -233
- data/app/controllers/dc_application_controller.rb +264 -41
- data/app/controllers/dc_common_controller.rb +75 -63
- data/app/{controllers → controls}/browse_models_control.rb +0 -0
- data/app/{controllers → controls}/dc_page_control.rb +24 -8
- data/app/controls/dc_poll_result_control.rb +88 -0
- data/app/controls/dc_report.rb +227 -0
- data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
- data/app/forms/all_options.yml +70 -12
- data/app/forms/cms_menu.yml +26 -17
- data/app/forms/dc_ad.yml +11 -22
- data/app/forms/dc_big_table.yml +1 -0
- data/app/forms/dc_big_table_value.yml +1 -0
- data/app/forms/dc_design.yml +19 -16
- data/app/forms/dc_filter.yml +3 -6
- data/app/forms/dc_gallery.yml +53 -0
- data/app/forms/dc_json_ld.yml +59 -0
- data/app/forms/dc_key_value.yml +32 -0
- data/app/forms/dc_link.yml +16 -10
- data/app/forms/dc_menu_item.yml +6 -0
- data/app/forms/dc_page.yml +2 -7
- data/app/forms/dc_poll.yml +16 -9
- data/app/forms/dc_poll_item.yml +2 -1
- data/app/forms/dc_poll_result.yml +83 -0
- data/app/forms/dc_poll_result_export.yml +35 -0
- data/app/forms/dc_removed_url.yml +42 -0
- data/app/forms/dc_seo.yml +33 -0
- data/app/forms/dc_site.yml +2 -6
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/cms_common_helper.rb +311 -0
- data/app/helpers/cms_edit_helper.rb +498 -0
- data/app/helpers/cms_helper.rb +230 -0
- data/app/helpers/cms_index_helper.rb +564 -0
- data/app/helpers/dc_application_helper.rb +195 -268
- data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
- data/app/models/concerns/dc_page_concern.rb +31 -6
- data/app/models/concerns/dc_seo_concern.rb +66 -0
- data/app/models/concerns/dc_site_concern.rb +12 -1
- data/app/models/concerns/dc_user_concern.rb +5 -3
- data/app/models/dc_design.rb +2 -0
- data/app/models/dc_filter.rb +37 -20
- data/app/models/dc_gallery.rb +64 -0
- data/app/models/dc_json_ld.rb +152 -0
- data/app/models/dc_key_value.rb +48 -0
- data/app/models/dc_link.rb +1 -0
- data/app/models/dc_memory.rb +26 -4
- data/app/models/dc_page.rb +1 -2
- data/app/models/dc_permission.rb +30 -0
- data/app/models/dc_poll.rb +39 -19
- data/app/models/dc_poll_result.rb +46 -0
- data/app/models/dc_removed_url.rb +54 -0
- data/app/models/dc_temp.rb +140 -0
- data/app/models/drgcms_form_fields.rb +6 -1642
- data/app/models/drgcms_form_fields/action.rb +61 -0
- data/app/models/drgcms_form_fields/check_box.rb +72 -0
- data/app/models/drgcms_form_fields/comment.rb +53 -0
- data/app/models/drgcms_form_fields/date_picker.rb +104 -0
- data/app/models/drgcms_form_fields/date_select.rb +68 -0
- data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
- data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
- data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
- data/app/models/drgcms_form_fields/embedded.rb +97 -0
- data/app/models/drgcms_form_fields/file_field.rb +52 -0
- data/app/models/drgcms_form_fields/file_select.rb +70 -0
- data/app/models/drgcms_form_fields/hash_field.rb +86 -0
- data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
- data/app/models/drgcms_form_fields/html_field.rb +70 -0
- data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
- data/app/models/drgcms_form_fields/link_to.rb +69 -0
- data/app/models/drgcms_form_fields/method.rb +65 -0
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
- data/app/models/drgcms_form_fields/number_field.rb +92 -0
- data/app/models/drgcms_form_fields/password_field.rb +62 -0
- data/app/models/drgcms_form_fields/radio.rb +96 -0
- data/app/models/drgcms_form_fields/readonly.rb +79 -0
- data/app/models/drgcms_form_fields/select.rb +226 -0
- data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
- data/app/models/drgcms_form_fields/text_area.rb +68 -0
- data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
- data/app/models/drgcms_form_fields/text_field.rb +56 -0
- data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
- data/app/models/drgcms_form_fields/tree_select.rb +169 -0
- data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
- data/app/renderers/dc_gallery_renderer.rb +95 -0
- data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
- data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
- data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
- data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
- data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
- data/app/{helpers → renderers}/dc_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
- data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
- data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
- data/app/views/cmsedit/_form.html.erb +4 -3
- data/app/views/cmsedit/_result.html.erb +2 -3
- data/app/views/cmsedit/edit.html.erb +2 -1
- data/app/views/cmsedit/index.html.erb +6 -1
- data/app/views/cmsedit/new.html.erb +1 -1
- data/config/locales/drgcms_en.yml +15 -3
- data/config/locales/drgcms_sl.yml +18 -6
- data/config/locales/models_en.yml +103 -19
- data/config/locales/models_sl.yml +102 -17
- data/drg_cms.gemspec +3 -3
- data/lib/drg_cms.rb +6 -2
- data/lib/drg_cms/version.rb +2 -2
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
- data/lib/tasks/database.rake +6 -56
- data/lib/tasks/dc_cleanup.rake +1 -1
- metadata +106 -61
- data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
- data/app/helpers/application_helper.rb +0 -2
- data/app/helpers/cmsedit_helper.rb +0 -844
- 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,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 << ' ' + 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 << ' ' + 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']) + ' ' + 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
|