drg_cms 0.6.1.5 → 0.6.1.11
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.
- checksums.yaml +4 -4
- data/README.md +203 -24
- data/app/assets/fonts/ibm-plex-sans-300.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-400.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-500.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-600.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-700.woff2 +0 -0
- data/app/assets/fonts/ibm-plex-sans-italic.woff2 +0 -0
- data/app/assets/javascripts/drg_cms/drg_cms.js +253 -106
- data/app/assets/stylesheets/drg_cms/drg_cms.css +670 -521
- data/app/assets/stylesheets/drg_cms_application.css +1 -1
- data/app/assets/stylesheets/drg_cms_cms.css +1 -4
- data/app/controllers/cmsedit_controller.rb +33 -211
- data/app/controllers/dc_application_controller.rb +98 -22
- data/app/controllers/dc_common_controller.rb +9 -22
- data/app/controls/browse_models_control.rb +18 -27
- data/app/controls/cmsedit_control.rb +129 -0
- data/app/controls/dc_help_control.rb +1 -1
- data/app/controls/dc_page_control.rb +0 -1
- data/app/controls/dc_poll_result_control.rb +1 -1
- data/app/controls/dc_report.rb +2 -2
- data/app/controls/design_element_settings_control.rb +1 -1
- data/app/forms/all_options.yml +25 -7
- data/app/forms/cms_menu.yml +24 -24
- data/app/forms/dc_browse_fields.yml +13 -9
- data/app/forms/dc_browse_models.yml +24 -2
- data/app/forms/dc_poll_result_export.yml +1 -1
- data/app/forms/dc_site.yml +2 -5
- data/app/forms/dc_steps_template.yml +51 -0
- data/app/helpers/cms_common_helper.rb +73 -6
- data/app/helpers/cms_edit_helper.rb +275 -159
- data/app/helpers/cms_helper.rb +152 -59
- data/app/helpers/cms_index_helper.rb +220 -172
- data/app/helpers/dc_application_helper.rb +40 -67
- data/app/models/concerns/dc_page_concern.rb +1 -1
- data/app/models/concerns/dc_site_concern.rb +9 -3
- data/app/models/dc_filter.rb +30 -22
- data/app/models/dc_journal.rb +2 -2
- data/app/models/dc_json_ld.rb +19 -42
- data/app/models/dc_part.rb +19 -9
- data/app/models/dc_site.rb +0 -1
- data/app/models/drgcms_form_fields/drgcms_field.rb +10 -4
- data/app/models/drgcms_form_fields/link_to.rb +1 -1
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +5 -5
- data/app/models/drgcms_form_fields/readonly.rb +4 -1
- data/app/models/drgcms_form_fields/select.rb +10 -9
- data/app/models/drgcms_form_fields/text_autocomplete.rb +20 -12
- data/app/models/drgcms_form_fields/text_with_select.rb +1 -0
- data/app/renderers/dc_common_renderer.rb +20 -3
- data/app/renderers/dc_part_renderer.rb +1 -1
- data/app/renderers/dc_poll_renderer.rb +1 -1
- data/app/views/cmsedit/_edit_stuff.html.erb +12 -12
- data/app/views/cmsedit/_form.html.erb +19 -12
- data/app/views/cmsedit/edit.html.erb +10 -6
- data/app/views/cmsedit/index.html.erb +5 -3
- data/app/views/cmsedit/login.html.erb +1 -1
- data/app/views/cmsedit/new.html.erb +9 -5
- data/app/views/dc_common/_help.html.erb +1 -0
- data/app/views/dc_common/paste_clipboard.html.erb +1 -1
- data/app/views/layouts/cms.html.erb +3 -5
- data/config/locales/drgcms_en.yml +7 -1
- data/config/locales/drgcms_sl.yml +7 -1
- data/config/locales/kaminari.yml +1 -1
- data/drg_cms.gemspec +2 -2
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +4 -4
- metadata +16 -10
- data/app/views/cmsedit/__remove_edit_stuff.js.erb +0 -6
- data/app/views/cmsedit/__show.html.erb +0 -21
@@ -52,7 +52,7 @@ end
|
|
52
52
|
############################################################################
|
53
53
|
def dc_is_action_active?(options)
|
54
54
|
if options['when_new']
|
55
|
-
dc_deprecate("when_option will be deprecated and replaced by active: not_new_record! Form #{params
|
55
|
+
dc_deprecate("when_option will be deprecated and replaced by active: not_new_record! Form #{CmsHelper.form_param(params)}")
|
56
56
|
return !(dc_dont?(options['when_new']) && @record.new_record?)
|
57
57
|
end
|
58
58
|
return true unless options['active']
|
@@ -137,56 +137,57 @@ def dc_actions_for_form(position)
|
|
137
137
|
actions.delete('standard')
|
138
138
|
actions = actions.to_a.sort { |x, y| x[0] <=> y[0] }
|
139
139
|
# Add spinner to the beginning
|
140
|
-
html = %Q[<span class="dc-spinner">#{fa_icon('
|
140
|
+
html = %Q[<span class="dc-spinner">#{fa_icon('settings-o spin')}</span><ul class="dc-menu #{position}">]
|
141
141
|
|
142
142
|
actions.each do |key, options|
|
143
143
|
session[:form_processing] = "form:actions: #{key} #{options}"
|
144
144
|
next if options.nil? # yes it happens
|
145
|
-
|
145
|
+
|
146
|
+
parms = @form_params.clone
|
146
147
|
if options.class == String
|
147
148
|
next if @form['readonly'] and !options.match(/back|close/)
|
148
|
-
|
149
|
-
html << '<li
|
150
|
-
html << case
|
151
|
-
when (options == 'back'
|
149
|
+
|
150
|
+
html << '<li>'
|
151
|
+
html << case
|
152
|
+
when (options == 'back' || options == 'cancle')
|
152
153
|
# If return_to is present link directly to URL
|
153
154
|
if parms['xreturn_to'] # disabled for now
|
154
|
-
dc_link_to( 'drgcms.back','
|
155
|
+
dc_link_to( 'drgcms.back', 'arrow_back', parms['return_to'], class: 'dc-link' )
|
155
156
|
else
|
156
157
|
parms['action'] = 'index'
|
157
158
|
parms['readonly'] = parms['readonly'].to_s.to_i < 2 ? nil : 1
|
158
|
-
dc_link_to( 'drgcms.back','
|
159
|
+
dc_link_to( 'drgcms.back', 'arrow_back', parms, class: 'dc-link' )
|
159
160
|
end
|
160
161
|
|
161
|
-
when options == 'delete'
|
162
|
+
when options == 'delete'
|
162
163
|
parms['operation'] = options
|
163
164
|
parms['id'] = @record.id
|
164
|
-
dc_link_to( 'drgcms.delete','remove', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
|
165
|
+
dc_link_to( 'drgcms.delete','remove', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete, class: 'dc-link' )
|
165
166
|
|
166
|
-
when options == 'new'
|
167
|
+
when options == 'new'
|
167
168
|
parms['action'] = options
|
168
|
-
dc_link_to( 'drgcms.new', '
|
169
|
+
dc_link_to( 'drgcms.new', 'add', parms, class: 'dc-link')
|
169
170
|
|
170
|
-
when (options == 'enable'
|
171
|
+
when (options == 'enable' || options == 'disable')
|
171
172
|
parms['operation'] = options
|
172
173
|
parms['id'] = @record.id
|
173
|
-
icon = (options == 'enable' ? '
|
174
|
-
dc_link_to( "drgcms.#{options}",icon, parms, method: :delete )
|
174
|
+
icon = (options == 'enable' ? 'check_box-o' : 'check_box_outline_blank')
|
175
|
+
dc_link_to( "drgcms.#{options}",icon, parms, method: :delete, class: 'dc-link' )
|
175
176
|
|
176
|
-
when options == 'edit'
|
177
|
+
when options == 'edit'
|
177
178
|
parms['operation'] = options
|
178
179
|
parms['id'] = @record.id
|
179
|
-
dc_link_to( "drgcms.#{options}",options, parms )
|
180
|
+
dc_link_to( "drgcms.#{options}", options, parms, class: 'dc-link' )
|
180
181
|
|
181
|
-
when options == 'refresh'
|
182
|
-
|
182
|
+
when options == 'refresh'
|
183
|
+
%(<div class="dc-link" onclick='window.location.href=window.location.href;'>#{fa_icon('refresh')} #{t('drgcms.refresh')}</div></li>)
|
183
184
|
|
184
|
-
when options == 'close'
|
185
|
+
when options == 'close'
|
185
186
|
close = params[:window_close].to_i
|
186
187
|
if close < 2
|
187
|
-
|
188
|
+
%(<div class="dc-link" onclick='window.close();'>#{fa_icon('close')} #{t('drgcms.close')}</div></li>)
|
188
189
|
else
|
189
|
-
|
190
|
+
%(<div class="dc-link" onclick='history.back();'>#{fa_icon('close')} #{t('drgcms.close')}</div></li>)
|
190
191
|
end
|
191
192
|
else
|
192
193
|
"err1 #{key}=>#{options}"
|
@@ -203,14 +204,14 @@ def dc_actions_for_form(position)
|
|
203
204
|
when options['type'] == 'submit'
|
204
205
|
caption = options['caption'] || 'drgcms.save'
|
205
206
|
icon = options['icon'] || 'save'
|
206
|
-
|
207
|
-
options['params'].each { |k,v|
|
207
|
+
parameters = {}
|
208
|
+
options['params'].each { |k, v| parameters[k] = dc_value_for_parameter(v) } if options['params']
|
208
209
|
if dc_is_action_active?(options)
|
209
|
-
'<li
|
210
|
-
dc_submit_tag(caption, icon, {:
|
210
|
+
'<li>' +
|
211
|
+
dc_submit_tag(caption, icon, { data: parameters, title: options['title'] }) +
|
211
212
|
'</li>'
|
212
213
|
else
|
213
|
-
|
214
|
+
%(<li><div class="dc-link-no">#{fa_icon(icon)} #{caption}</div></li>)
|
214
215
|
end
|
215
216
|
|
216
217
|
# delete with some sugar added
|
@@ -219,21 +220,22 @@ def dc_actions_for_form(position)
|
|
219
220
|
parms.merge!(options['params'])
|
220
221
|
caption = options['caption'] || 'drgcms.delete'
|
221
222
|
icon = options['icon'] || 'remove'
|
222
|
-
'<li class="
|
223
|
-
dc_link_to( caption, icon, parms, data: t('drgcms.confirm_delete'), method: :delete ) +
|
223
|
+
'<li class="">' +
|
224
|
+
dc_link_to( caption, icon, parms, data: t('drgcms.confirm_delete'), method: :delete, class: 'dc-link' ) +
|
224
225
|
'</li>'
|
225
|
-
|
226
|
+
|
226
227
|
# ajax or link button
|
227
|
-
when %w(ajax link window).include?(options['type'])
|
228
|
+
when %w(ajax link window popup).include?(options['type'])
|
228
229
|
dc_link_ajax_window_submit_action(options, @record)
|
229
|
-
|
230
|
-
# Javascript action
|
230
|
+
|
231
|
+
# Javascript action
|
231
232
|
when options['type'] == 'script'
|
232
233
|
dc_script_action(options)
|
233
234
|
else
|
234
235
|
'<li>err2</li>'
|
235
236
|
end
|
236
237
|
end
|
238
|
+
|
237
239
|
end
|
238
240
|
(html << '</ul>').html_safe
|
239
241
|
end
|
@@ -277,127 +279,26 @@ def dc_check_and_default(value, default, values=nil) #:nodoc:
|
|
277
279
|
end
|
278
280
|
|
279
281
|
############################################################################
|
280
|
-
# Creates input fields
|
281
|
-
############################################################################
|
282
|
-
def dc_fields_for_tab(fields_on_tab) #:nodoc:
|
283
|
-
html = '<div class="dc-form">'
|
284
|
-
labels_pos = dc_check_and_default(@form['form']['labels_pos'], 'right', ['top', 'left', 'right'])
|
285
|
-
hidden_fields, odd_even = '', nil
|
286
|
-
group_option, group_count = 0, 0
|
287
|
-
reset_cycle()
|
288
|
-
# Select form fields and sort them by key
|
289
|
-
form_fields = fields_on_tab.select {|field| field.class == Integer }
|
290
|
-
form_fields.to_a.sort.each do |number, options|
|
291
|
-
session[:form_processing] = "form:fields: #{number}=#{options}"
|
292
|
-
# ignore if edit_only singe field is required
|
293
|
-
next if params[:edit_only] and params[:edit_only] != options['name']
|
294
|
-
# hidden_fields. Add them at the end
|
295
|
-
if options['type'] == 'hidden_field'
|
296
|
-
hidden_fields << DrgcmsFormFields::HiddenField.new(self, @record, options).render
|
297
|
-
next
|
298
|
-
end
|
299
|
-
# label
|
300
|
-
field_html,label,help = dc_field_label_help(options)
|
301
|
-
# Line separator
|
302
|
-
html << dc_top_bottom_line(:top, options)
|
303
|
-
# Beginning of new row
|
304
|
-
if group_count == 0
|
305
|
-
html << '<div class="row-div">'
|
306
|
-
odd_even = cycle('odd','even')
|
307
|
-
group_count = options['group'] || 1
|
308
|
-
group_option = options['group'] || 1
|
309
|
-
end
|
310
|
-
|
311
|
-
html << if labels_pos == 'top'
|
312
|
-
%(
|
313
|
-
<div class="dc-form-label-top dc-color-#{odd_even} dc-align-left" title="#{help}">
|
314
|
-
<label for="record_#{options['name']}">#{label} </label>
|
315
|
-
<div id="td_record_#{options['name']}">#{field_html}</div>
|
316
|
-
</div> )
|
317
|
-
else
|
318
|
-
# no label
|
319
|
-
if dc_dont?(options['caption'])
|
320
|
-
label = ''
|
321
|
-
label_width = 0
|
322
|
-
data_width = 100
|
323
|
-
elsif group_option > 1
|
324
|
-
label_width = group_option != group_count ? 10 : 14
|
325
|
-
data_width = 21
|
326
|
-
else
|
327
|
-
label_width = 14
|
328
|
-
data_width = 85
|
329
|
-
end
|
330
|
-
help.gsub!('<br>',"\n") if help.present?
|
331
|
-
%(
|
332
|
-
<div class="dc-form-label dc-color-#{odd_even} dc-align-#{labels_pos} dc-width-#{label_width}" title="#{help}">
|
333
|
-
<label for="record_#{options['name']}">#{label} </label>
|
334
|
-
</div>
|
335
|
-
<div id="td_record_#{options['name']}" class="dc-form-field dc-color-#{odd_even} dc-width-#{data_width}">#{field_html}</div>
|
336
|
-
)
|
337
|
-
end
|
338
|
-
# check if group end
|
339
|
-
if (group_count -= 1) == 0
|
340
|
-
html << '</div>'
|
341
|
-
# insert dummy div when only two fields in group
|
342
|
-
html << '<div></div>' if group_option == 2
|
343
|
-
end
|
344
|
-
|
345
|
-
html << dc_top_bottom_line(:bottom, options)
|
346
|
-
end
|
347
|
-
html << '</div>' << hidden_fields
|
348
|
-
end
|
349
|
-
|
350
|
-
############################################################################
|
351
|
-
# Creates edit form from fields or tabs options
|
282
|
+
# Creates input fields defined in form options
|
352
283
|
############################################################################
|
353
284
|
def dc_fields_for_form
|
354
|
-
html
|
285
|
+
html = "<div id='data_fields' " + (@form['form']['height'] ? "style=\"height: #{@form['form']['height']}px;\">" : '>')
|
355
286
|
@js ||= ''
|
356
287
|
@css ||= ''
|
357
|
-
#
|
288
|
+
# fields
|
358
289
|
if (form_fields = @form['form']['fields'])
|
359
|
-
html <<
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
first = true # first tab
|
364
|
-
@form['form']['tabs'].keys.sort.each do |tab_name|
|
365
|
-
next if tab_name.match('actions')
|
366
|
-
# Tricky when editing single field. If field is not present on the tab skip to next tab
|
367
|
-
if params[:edit_only]
|
368
|
-
is_on_tab = false
|
369
|
-
@form['form']['tabs'][tab_name].each { |k, v| is_on_tab = true if params[:edit_only] == v['name'] }
|
370
|
-
next unless is_on_tab
|
371
|
-
end
|
372
|
-
# first div is displayed, all others are hidden
|
373
|
-
tab_data << "<div id=\"data_#{tab_name.delete("\s\n")}\""
|
374
|
-
tab_data << ' class="div-hidden"' unless first
|
375
|
-
tab_data << " style=\"height: #{@form['form']['height']}px;\"" if @form['form']['height']
|
376
|
-
tab_data << ">#{dc_fields_for_tab(@form['form']['tabs'][tab_name])}</div>"
|
377
|
-
|
378
|
-
tab_label, tab_title = dc_tab_label_help(tab_name)
|
379
|
-
tabs << [tab_name, tab_label, tab_title]
|
380
|
-
first = false
|
381
|
-
end
|
382
|
-
# make it all work together
|
383
|
-
html << '<ul class="dc-form-ul" >'
|
384
|
-
first = true # first tab must be selected
|
385
|
-
tabs.each do |tab_name, tab_label, tab_title|
|
386
|
-
html << %(<li id="li_#{tab_name}" data-div="#{tab_name.delete("\s\n")}" title="#{tab_title}" class="dc-form-li)
|
387
|
-
html << ' dc-form-li-selected' if first
|
388
|
-
html << "\">#{tab_label}</li>"
|
389
|
-
first = false
|
390
|
-
end
|
391
|
-
html << '</ul>'
|
392
|
-
html << tab_data
|
290
|
+
html << dc_input_form_create(form_fields) + '</div>'
|
291
|
+
# tabs
|
292
|
+
elsif @form['form']['tabs']
|
293
|
+
html = dc_tabs_form_create()
|
393
294
|
end
|
394
295
|
# add last_updated_at hidden field so controller can check if record was updated in db during editing
|
395
296
|
html << hidden_field(nil, :last_updated_at, value: @record.updated_at.to_i) if @record.respond_to?(:updated_at)
|
396
297
|
# add form time stamp to prevent double form submit
|
397
298
|
html << hidden_field(nil, :form_time_stamp, value: Time.now.to_i)
|
398
299
|
# add javascript code if defined by form
|
399
|
-
@js << "\n#{@form['script']}"
|
400
|
-
@css << "\n#{@form['css']}"
|
300
|
+
@js << "\n#{@form['script']} #{@form['js']}"
|
301
|
+
@css << "\n#{@form['css']}\n#{@form['form']['css']}"
|
401
302
|
html.html_safe
|
402
303
|
end
|
403
304
|
|
@@ -409,6 +310,7 @@ def dc_head_for_form
|
|
409
310
|
@css ||= ''
|
410
311
|
head = @form['form']['head']
|
411
312
|
return '' if head.nil?
|
313
|
+
|
412
314
|
html = %(<div class="dc-head #{head['class']}">\n<div class="dc-row">)
|
413
315
|
split = head['split'] || 4
|
414
316
|
percent = 100/split
|
@@ -423,7 +325,7 @@ def dc_head_for_form
|
|
423
325
|
label = if caption.blank?
|
424
326
|
''
|
425
327
|
elsif options['name'] == caption
|
426
|
-
|
328
|
+
t_label_for_field(options['name'], options['name'].capitalize.gsub('_',' ') )
|
427
329
|
else
|
428
330
|
t(caption, caption)
|
429
331
|
end
|
@@ -441,13 +343,13 @@ def dc_head_for_form
|
|
441
343
|
#
|
442
344
|
klass = dc_style_or_class(nil, options['class'], field, @record)
|
443
345
|
style = dc_style_or_class(nil, options['style'], field, @record)
|
444
|
-
html << %
|
346
|
+
html << %(<div class="dc-column #{klass}" style="width:#{percent*span}%;#{style}">
|
445
347
|
#{label.blank? ? '' : "<span class=\"label\">#{label}</span>"}
|
446
348
|
<span id="head-#{options['name']}" class="field">#{field}</span>
|
447
|
-
</div>
|
349
|
+
</div>)
|
448
350
|
current += span
|
449
351
|
if current == split
|
450
|
-
html << %
|
352
|
+
html << %(</div>\n<div class="dc-row">)
|
451
353
|
current = 0
|
452
354
|
end
|
453
355
|
end
|
@@ -470,31 +372,61 @@ end
|
|
470
372
|
# + lots of more. At the moment also adds icon for dumping current document as json text.
|
471
373
|
############################################################################
|
472
374
|
def dc_document_statistics
|
473
|
-
return '' if @record.
|
474
|
-
|
475
|
-
|
375
|
+
return '' if @record.id.nil? || dc_dont?(@form['form']['info'])
|
376
|
+
|
377
|
+
html = %(<div id="dc-document-info">#{fa_icon('info md-18')}</div> <div id="dc-document-info-popup" class="div-hidden">)
|
476
378
|
u = dc_document_user_for('created_by')
|
477
|
-
html << %
|
379
|
+
html << %(<div><span>#{t('drgcms.created_by', 'Created by')}: </span><span>#{u}</span></div>) if u
|
478
380
|
u = dc_document_user_for('updated_by')
|
479
|
-
html << %
|
480
|
-
|
481
|
-
html << %
|
482
|
-
|
381
|
+
html << %(<div><span>#{t('drgcms.updated_by', 'Updated by')}: </span><span>#{u}</span></div>) if u
|
382
|
+
|
383
|
+
html << %(<div><span>#{t('drgcms.created_at', 'Created at')}: </span><span>#{dc_format_value(@record.created_at)}</span></div>) if @record['created_at']
|
384
|
+
html << %(<div><span>#{t('drgcms.updated_at', 'Updated at')}: </span><span>#{dc_format_value(@record.updated_at)}</span></div>) if @record['updated_at']
|
385
|
+
# copy to clipboard icon
|
483
386
|
parms = params.clone
|
484
387
|
parms[:controller] = 'dc_common'
|
485
388
|
parms[:action] = 'copy_clipboard'
|
486
389
|
url = url_for(parms.permit!)
|
487
|
-
html <<
|
390
|
+
html << '<div>'
|
391
|
+
html << fa_icon('content_copy-o md-18', class: 'dc-link-img dc-link-ajax',
|
488
392
|
'data-url' => url, 'data-request' => 'get', title: t('drgcms.doc_copy_clipboard') )
|
489
393
|
|
490
|
-
url = url_for(controller: :cmsedit, action: :
|
394
|
+
url = url_for(controller: :cmsedit, action: :run, table: 'dc_journal', control: 'cmsedit.filter_on',
|
491
395
|
filter_oper: 'eq', filter_field: 'doc_id', filter_value: @record.id)
|
492
|
-
|
396
|
+
|
397
|
+
html << fa_icon('history md-18', class: 'dc-link-img dc-window-open',
|
493
398
|
'data-url' => url, title: t('helpers.label.dc_journal.tabletitle') )
|
399
|
+
html << %(<span>ID: </span>
|
400
|
+
<span id="record-id" class="hover" onclick="dc_copy_to_clipboard('record-id');" title="Copy document ID to clipboard">#{@record.id}
|
401
|
+
</span>)
|
494
402
|
|
495
403
|
(html << '</div></div>').html_safe
|
496
404
|
end
|
497
405
|
|
406
|
+
############################################################################
|
407
|
+
# Updates form prior to processing form
|
408
|
+
############################################################################
|
409
|
+
def dc_form_update
|
410
|
+
# update form for steps options
|
411
|
+
if @form.dig('form', 'steps')
|
412
|
+
dc_form_update_steps
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
############################################################################
|
417
|
+
# If form is divided into two parts, this method gathers html to be painted
|
418
|
+
# on right side of the form pane.
|
419
|
+
############################################################################
|
420
|
+
def dc_form_left
|
421
|
+
yaml = @form.dig('form', 'form_left')
|
422
|
+
return '' unless yaml
|
423
|
+
|
424
|
+
html = ''
|
425
|
+
html << dc_process_eval(yaml['eval'], self) if yaml['eval']
|
426
|
+
|
427
|
+
html.html_safe
|
428
|
+
end
|
429
|
+
|
498
430
|
private
|
499
431
|
|
500
432
|
############################################################################
|
@@ -513,4 +445,188 @@ def dc_top_bottom_line(location, options)
|
|
513
445
|
end
|
514
446
|
end
|
515
447
|
|
448
|
+
############################################################################
|
449
|
+
# Creates input fields for one tab. Subroutine of dc_fields_for_form.
|
450
|
+
############################################################################
|
451
|
+
def dc_input_form_create(fields_on_tab) #:nodoc:
|
452
|
+
html = '<div class="dc-form">'
|
453
|
+
labels_pos = dc_check_and_default(@form['form']['labels_pos'], 'right', %w[top left right])
|
454
|
+
hidden_fields, odd_even = '', nil
|
455
|
+
group_option, group_count = 0, 0
|
456
|
+
reset_cycle()
|
457
|
+
# Select form fields and sort them by key
|
458
|
+
form_fields = fields_on_tab.select {|field| field.class == Integer }
|
459
|
+
form_fields.to_a.sort.each do |number, options|
|
460
|
+
session[:form_processing] = "form:fields: #{number}=#{options}"
|
461
|
+
# ignore if edit_only singe field is required
|
462
|
+
next if params[:edit_only] and params[:edit_only] != options['name']
|
463
|
+
next if options.nil?
|
464
|
+
|
465
|
+
# hidden_fields. Add them at the end
|
466
|
+
if options['type'] == 'hidden_field'
|
467
|
+
hidden_fields << DrgcmsFormFields::HiddenField.new(self, @record, options).render
|
468
|
+
next
|
469
|
+
end
|
470
|
+
# label
|
471
|
+
field_html,label,help = dc_field_label_help(options)
|
472
|
+
# Line separator
|
473
|
+
html << dc_top_bottom_line(:top, options)
|
474
|
+
# Beginning of new row
|
475
|
+
if group_count == 0
|
476
|
+
html << '<div class="row-div">'
|
477
|
+
odd_even = cycle('odd','even')
|
478
|
+
group_count = options['group'] || 1
|
479
|
+
group_option = options['group'] || 1
|
480
|
+
end
|
481
|
+
|
482
|
+
html << if labels_pos == 'top'
|
483
|
+
%(
|
484
|
+
<div class="dc-form-label-top dc-color-#{odd_even} dc-align-left" title="#{help}">
|
485
|
+
<label for="record_#{options['name']}">#{label} </label>
|
486
|
+
<div id="td_record_#{options['name']}">#{field_html}</div>
|
487
|
+
</div> )
|
488
|
+
else
|
489
|
+
# no label
|
490
|
+
if dc_dont?(options['caption'])
|
491
|
+
label = ''
|
492
|
+
label_width = 0
|
493
|
+
data_width = 100
|
494
|
+
elsif group_option > 1
|
495
|
+
label_width = group_option != group_count ? 10 : 14
|
496
|
+
data_width = 21
|
497
|
+
else
|
498
|
+
label_width = 14
|
499
|
+
data_width = 85
|
500
|
+
end
|
501
|
+
help.gsub!('<br>',"\n") if help.present?
|
502
|
+
%(
|
503
|
+
<div class="dc-form-label dc-color-#{odd_even} dc-align-#{labels_pos} dc-width-#{label_width}" title="#{help}">
|
504
|
+
<label for="record_#{options['name']}">#{label} </label>
|
505
|
+
</div>
|
506
|
+
<div id="td_record_#{options['name']}" class="dc-form-field dc-color-#{odd_even} dc-width-#{data_width}">#{field_html}</div>
|
507
|
+
)
|
508
|
+
end
|
509
|
+
# check if group end
|
510
|
+
if (group_count -= 1) == 0
|
511
|
+
html << '</div>'
|
512
|
+
# insert dummy div when only two fields in group
|
513
|
+
html << '<div></div>' if group_option == 2
|
514
|
+
end
|
515
|
+
|
516
|
+
html << dc_top_bottom_line(:bottom, options)
|
517
|
+
end
|
518
|
+
html << '</div>' << hidden_fields
|
519
|
+
end
|
520
|
+
|
521
|
+
############################################################################
|
522
|
+
# Will create html code required for input form with steps defined
|
523
|
+
############################################################################
|
524
|
+
def dc_steps_one_element(element, tab_name = nil)
|
525
|
+
def add_one_step(key, tab_name, key_number)
|
526
|
+
fields = tab_name ? @form['form']['tabs'][tab_name] : @form['form']['fields']
|
527
|
+
{ key_number => fields[key] }
|
528
|
+
end
|
529
|
+
|
530
|
+
key_number, fields = 0, {}
|
531
|
+
element.to_s.split(',').each do |particle|
|
532
|
+
if particle.match('-')
|
533
|
+
tabs_fields = tab_name ? @form['form']['tabs'][tab_name] : @form['form']['fields']
|
534
|
+
next if tabs_fields.nil?
|
535
|
+
|
536
|
+
start, to_end = particle.split('-').map(&:to_i)
|
537
|
+
tabs_fields.each { |key, data| fields.merge!(add_one_step(key, tab_name, key_number += 10)) if (start..to_end).include?(key) }
|
538
|
+
else
|
539
|
+
fields.merge!(add_one_step(particle.to_i, tab_name, key_number += 10))
|
540
|
+
end
|
541
|
+
end
|
542
|
+
fields
|
543
|
+
end
|
544
|
+
|
545
|
+
############################################################################
|
546
|
+
# Will create html code required for input form with steps defined and update
|
547
|
+
# actions.
|
548
|
+
############################################################################
|
549
|
+
def dc_form_update_steps
|
550
|
+
def add_step_to_form(index, step, next_step)
|
551
|
+
@form['form']['actions'][index]['params']['step'] = step
|
552
|
+
@form['form']['actions'][index]['params']['next_step'] = next_step
|
553
|
+
end
|
554
|
+
|
555
|
+
form = {}
|
556
|
+
step = params[:step].to_i
|
557
|
+
step_data = @form['form']['steps'].to_a[step - 1]
|
558
|
+
|
559
|
+
step_data.last.each do |element|
|
560
|
+
if element.first == 'fields'
|
561
|
+
form.merge!(dc_steps_one_element(element.second))
|
562
|
+
elsif element.first == 'tabs'
|
563
|
+
element.last.each do |tab_name, data|
|
564
|
+
form.merge!(dc_steps_one_element(data, tab_name))
|
565
|
+
end
|
566
|
+
end
|
567
|
+
end
|
568
|
+
# fraction updates of newly created form
|
569
|
+
form.deep_merge!(step_data.last['update']) if step_data.last['update']
|
570
|
+
# update steps data on form
|
571
|
+
add_step_to_form(10, step, step - 1)
|
572
|
+
add_step_to_form(20, step, step + 1)
|
573
|
+
add_step_to_form(100, step, step + 1)
|
574
|
+
# remove not needed steps
|
575
|
+
if step < 2
|
576
|
+
@form['form']['actions'].delete(10)
|
577
|
+
elsif step == @form['form']['steps'].size
|
578
|
+
@form['form']['actions'].delete(20)
|
579
|
+
end
|
580
|
+
@form['form']['actions'].delete(100) unless step == @form['form']['steps'].size
|
581
|
+
# update form_name and control name if defined
|
582
|
+
%w[1 10 20 100].each do |i|
|
583
|
+
next unless @form['form']['actions'][i.to_i]
|
584
|
+
|
585
|
+
@form['form']['actions'][i.to_i]['form_name'] = CmsHelper.form_param(params)
|
586
|
+
control = @form['control'] ? @form['control'] : @form['table']
|
587
|
+
@form['form']['actions'][i.to_i]['control'].sub!('x.', "#{control}.")
|
588
|
+
end
|
589
|
+
|
590
|
+
@form['form']['form_left'] ||= { 'eval' => 'dc_steps_menu_get'}
|
591
|
+
@form['form']['fields'] = form
|
592
|
+
end
|
593
|
+
|
594
|
+
############################################################################
|
595
|
+
# Will create html code required for input form with tabs
|
596
|
+
############################################################################
|
597
|
+
def dc_tabs_form_create
|
598
|
+
html, tabs, tab_data = '', [], ''
|
599
|
+
# there are multiple tabs on form
|
600
|
+
first = true # first tab
|
601
|
+
@form['form']['tabs'].keys.sort.each do |tab_name|
|
602
|
+
next if tab_name.match('actions')
|
603
|
+
# Tricky when editing single field. If field is not present on the tab skip to next tab
|
604
|
+
if params[:edit_only]
|
605
|
+
is_on_tab = false
|
606
|
+
@form['form']['tabs'][tab_name].each { |k, v| is_on_tab = true if params[:edit_only] == v['name'] }
|
607
|
+
next unless is_on_tab
|
608
|
+
end
|
609
|
+
# first div is displayed, all others are hidden
|
610
|
+
tab_data << "<div id=\"data_#{tab_name.delete("\s\n")}\""
|
611
|
+
tab_data << ' class="div-hidden"' unless first
|
612
|
+
tab_data << " style=\"height: #{@form['form']['height']}px;\"" if @form['form']['height']
|
613
|
+
tab_data << ">#{dc_input_form_create(@form['form']['tabs'][tab_name])}</div>"
|
614
|
+
|
615
|
+
tab_label, tab_title = dc_tab_label_help(tab_name)
|
616
|
+
tabs << [tab_name, tab_label, tab_title]
|
617
|
+
first = false
|
618
|
+
end
|
619
|
+
# make it all work together
|
620
|
+
html << '<ul class="dc-form-ul" >'
|
621
|
+
first = true # first tab must be selected
|
622
|
+
tabs.each do |tab_name, tab_label, tab_title|
|
623
|
+
html << %(<li id="li_#{tab_name}" data-div="#{tab_name.delete("\s\n")}" title="#{tab_title}" class="dc-form-li)
|
624
|
+
html << ' dc-form-li-selected' if first
|
625
|
+
html << "\">#{tab_label}</li>"
|
626
|
+
first = false
|
627
|
+
end
|
628
|
+
html << '</ul>'
|
629
|
+
html << tab_data
|
630
|
+
end
|
631
|
+
|
516
632
|
end
|