drg_cms 0.4.58 → 0.4.61

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,4 +9,5 @@
9
9
  * compiled file, but it's generally better to create a new file per style scope.
10
10
  *
11
11
  *= require drg_cms/drg_cms
12
+ *= require font-awesome
12
13
  */
@@ -15,6 +15,7 @@
15
15
  *= require jquery-ui/autocomplete
16
16
  *= #require ../javascripts/drg_cms/elfinder/css/elfinder.min.css
17
17
  *= #require ../javascripts/drg_cms/elfinder/css/theme.css
18
+ *= require font-awesome
18
19
  */
19
20
 
20
21
 
@@ -76,7 +76,9 @@
76
76
  # If filter method returns false user will be presented with flash error.
77
77
  ########################################################################
78
78
  class CmseditController < DcApplicationController
79
- before_action :check_authorization, :except => [:show, :login]
79
+ before_action :check_authorization, :except => [:login]
80
+ before_filter :reload_patches if Rails.env.development?
81
+
80
82
  layout 'cms'
81
83
 
82
84
  ########################################################################
@@ -101,6 +103,39 @@ def check_sort_options() #:nodoc:
101
103
  params['sort'] = nil # otherwise there is problem with other links
102
104
  end
103
105
 
106
+ ########################################################################
107
+ # Set aditional filter options when filter is defined by filter method in control object.
108
+ ########################################################################
109
+ def user_filter_options(model) #:nodoc:
110
+ # no filter is active or set off
111
+ if params[:filter] == 'off' or (params[:filter].nil? and session[:tmp_filter].nil?)
112
+ session[:tmp_filter] = nil
113
+ return model
114
+ end
115
+ #
116
+ table, field, oper, value = if params[:filter] == 'on'
117
+ [model.to_s, params[:filter_field], params[:filter_oper], params[:record][params[:filter_field]] ]
118
+ else
119
+ session[:tmp_filter].split("\t")
120
+ end
121
+ # filter set previously on other collection
122
+ if table != model.to_s
123
+ session[:tmp_filter] = nil
124
+ return model
125
+ end
126
+ #
127
+ field = '_id' if field == 'id' # must be
128
+ value = /#{value}/ if oper == 'like' # do regex if operation is like
129
+ # when field type is ObjectId transform value
130
+ if model.fields[field].type == BSON::ObjectId
131
+ value = BSON::ObjectId.from_string(value) rescue nil
132
+ flash[:error] = t('drgcms.not_id') if value.nil?
133
+ end
134
+ # save filter to session
135
+ session[:tmp_filter] = [ table, field, oper, value ].join("\t")
136
+ model.where(field => value)
137
+ end
138
+
104
139
  ########################################################################
105
140
  # Will check and set current filter options for result set. Subroutine of index method.
106
141
  ########################################################################
@@ -120,25 +155,31 @@ def check_filter_options() #:nodoc:
120
155
  session[table_name][:page] = 1
121
156
  params[:filter] = nil # must be. Otherwise kaminari includes parameter on paging and everything goes wrong
122
157
  end
123
- # if data model has field dc_site_id ensure that only records which belong to the site
124
- # are selected.
125
- t = @tables.first[0]
158
+ # if data model has field dc_site_id ensure that only documents which belong
159
+ # to the site are selected.
160
+ model = @tables.first[0]
126
161
  site_id = dc_get_site._id if dc_get_site
127
162
  # dont't filter site if no dc_site_id field or user is ADMIN
128
- site_id = nil if !t.method_defined?('dc_site_id') or dc_user_can(DcPermission::CAN_ADMIN)
163
+ site_id = nil if !model.method_defined?('dc_site_id') or dc_user_can(DcPermission::CAN_ADMIN)
129
164
  if session[table_name][:filter]
130
165
  field, oper, value = session[table_name][:filter].split( "\t")
131
- value = /#{value}/ if oper == 'like' # change to regex if like
166
+ field = '_id' if field == 'id' # must be
167
+ value = /#{value}/ if oper == 'like' # do regex if operation is like
168
+ # when field type is ObjectId transform value
169
+ if model.fields[field].type == BSON::ObjectId
170
+ value = BSON::ObjectId.from_string(value) rescue nil
171
+ flash[:error] = t('drgcms.not_id') if value.nil?
172
+ end
132
173
  @records = if site_id
133
- t.where(dc_site_id: site_id, field => value)
174
+ model.where(dc_site_id: site_id, field => value)
134
175
  else
135
- t.where(field => value)
176
+ model.where(field => value)
136
177
  end
137
178
  else
138
179
  @records = if site_id
139
- t.where(dc_site_id: site_id)
180
+ model.where(dc_site_id: site_id)
140
181
  else
141
- t
182
+ model
142
183
  end
143
184
  end
144
185
  # pagination if required
@@ -202,11 +243,15 @@ end
202
243
  # and logout actions can be directly performed by calling http://site.com/cmsedit/login
203
244
  ########################################################################
204
245
  def show
246
+ =begin
205
247
  case
206
248
  when params[:id].in?(%w(login logout)) then # show login menu
207
249
  session[:edit_mode] = 0
208
- render action: 'show', layout: 'cms'
250
+ render action: 'show'#, layout: 'cms'
209
251
  end
252
+ =end
253
+ find_record
254
+ render action: 'edit', layout: 'cms'
210
255
  end
211
256
 
212
257
  ########################################################################
@@ -215,6 +260,7 @@ end
215
260
  def login #:nodoc:
216
261
  # session[:edit_mode] = 0 if params[:id].in? %w(login logout) # show login menu
217
262
  # dc_collect_menu_forms
263
+ session[:edit_mode] = 0
218
264
  render action: 'show', layout: 'cms'
219
265
  end
220
266
 
@@ -498,10 +544,12 @@ def read_drg_cms_form
498
544
  @form = forms_merge(form, @form)
499
545
  end
500
546
  # add readonly key to form if readonly parameter is passed in url
501
- @form['readonly'] = 1 if params['readonly'] and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
547
+ @form['readonly'] = 1 if params['readonly'] #and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
502
548
  # !!!!!! Always use strings for key names since @parms['table'] != @parms[:table]
503
- @parms = { 'table' => table_name, 'ids' => ids, 'formname' => formname,
504
- 'return_to' => params['return_to'], 'edit_only' => params['edit_only'] }
549
+ @parms = { 'table' => table_name, 'ids' => params[:ids], 'formname' => formname,
550
+ 'return_to' => params['return_to'], 'edit_only' => params['edit_only'],
551
+ 'readonly' => params['readonly']
552
+ }
505
553
  end
506
554
 
507
555
  ############################################################################
@@ -511,7 +559,8 @@ end
511
559
  def check_authorization
512
560
  params[:table] ||= params[:formname]
513
561
  # Just show menu
514
- return show if params[:action] == 'show'
562
+ # return show if params[:action] == 'show'
563
+ return login if params[:id].in?(%w(login logout))
515
564
  # request shouldn't pass
516
565
  if session[:user_roles].nil? or params[:table].to_s.strip.downcase.size < 3 or
517
566
  !dc_user_can(DcPermission::CAN_VIEW)
@@ -687,7 +736,7 @@ def save_data
687
736
  next if params[:edit_only] and params[:edit_only] != v['name'] # otherwise other fields would be wiped
688
737
  next unless @record.respond_to?(v['name']) # there can be temporary fields on the form
689
738
  # return value from form field definition
690
- value = DrgcmsFormField.const_get(v['type'].camelize).get_data(params, v['name'])
739
+ value = DrgcmsFormFields.const_get(v['type'].camelize).get_data(params, v['name'])
691
740
  @record.send("#{v['name']}=", value)
692
741
  end
693
742
  #
@@ -712,19 +761,14 @@ def save_data
712
761
  end
713
762
  saved
714
763
  end
715
-
716
- =begin
764
+
717
765
  ########################################################################
718
- # Returns true if model has field defined. This might be defined by mongoid,
719
- # but I didn't found method.
720
- #
721
- # @param [model] Model object
722
- # @param [field_name] Field name to be checked
766
+ # Reload patches in development.
723
767
  ########################################################################
724
- def model_has_field?(model, field_name)
725
- model.fields.each {|f| return true if f.first == field_name.to_s}
726
- false
768
+ def reload_patches
769
+ DrgCms.paths(:patches).each do |patches|
770
+ Dir["#{patches}/**/*.rb"].each { |path| require_dependency path }
771
+ end
727
772
  end
728
- =end
729
773
 
730
774
  end
@@ -52,7 +52,7 @@ form:
52
52
  name: body
53
53
  type: text_area
54
54
  html:
55
- size: 140x30
55
+ size: 120x30
56
56
 
57
57
  50:
58
58
  name: css
@@ -35,7 +35,7 @@ module CmseditHelper
35
35
  # Creates action div for cmsedit index action.
36
36
  ############################################################################
37
37
  def dc_actions_for_index()
38
- return '' if @form['index'].nil?
38
+ return '' if @form['index'].nil? or @form['readonly']
39
39
  actions = @form['index']['actions']
40
40
  return '' if actions.nil? or actions.size == 0
41
41
  # Simulate standard actions
@@ -48,9 +48,11 @@ def dc_actions_for_index()
48
48
  # start div with hidden spinner image
49
49
  html = <<EOT
50
50
  <div id="dc-action-menu">
51
- <span id="dc-spinner" class="div-hidden">#{image_tag('drg_cms/spinner.gif')}"</span>
51
+ <span id="dc-spinner" class="div-hidden">#{fa_icon('spinner lg spin')}"</span>
52
52
  <ul class="dc-action-menu">
53
53
  EOT
54
+ # #{fa_icon('spinner lg spin', id: 'dc-spinner', class: 'div-hidden')}
55
+
54
56
  #
55
57
  actions.each do |k,v|
56
58
  session[:form_processing] = "index:actions: #{k}=#{v}"
@@ -84,22 +86,27 @@ EOT
84
86
  choices << [ t("helpers.label.#{@form['table']}.#{s}"), s ]
85
87
  end
86
88
  end
87
- t('drgcms.sort')+ ' ' + select('sort', 'sort', choices, { include_blank: true }, { class: 'drgcms_sort', 'data-table' => @form['table']} )
89
+ fa_icon('sort-alpha-asc') + ' ' + t('drgcms.sort') + ' ' +
90
+ select('sort', 'sort', choices, { include_blank: true },
91
+ { class: 'drgcms_sort', 'data-table' => @form['table']} )
88
92
 
89
93
  when action == 'filter' then # filter
90
94
  caption = t('drgcms.filter')
91
95
  s = session[@form['table']]
92
96
  # add checked image to filter, so user will know that data is filtered
93
- caption << '&nbsp;'+image_tag('drg_cms/checkbox-checked.png') if s and s[:filter]
97
+ # caption << '&nbsp;'+image_tag('drg_cms/checkbox-checked.png') if s and s[:filter]
94
98
  yhtml['onclick'] = "$('#drgcms_filter').toggle(300);"
95
- link_to(caption.html_safe, '#', yhtml )
99
+ # link_to(caption.html_safe, '#', yhtml )
100
+ dc_link_to('drgcms.filter','filter', '#', yhtml )
101
+ when action == 'new' then # new
102
+ dc_link_to(t('drgcms.new'),'plus', url, yhtml )
96
103
  when action == 'menu' then # menu
97
104
  caption = t(v['caption'], v['caption'])
98
105
  caption + eval(v['eval'])
99
106
  else
100
107
  caption = yaml['caption'] || yaml['text']
101
- caption = caption ? t(caption, caption) : t('drgcms.' + action)
102
- link_to(caption, url, yhtml)
108
+ icon = yaml['icon'] ? yaml['icon'] : action
109
+ dc_link_to(caption, icon, url, yhtml)
103
110
  end
104
111
  html << '</li>'
105
112
  end
@@ -128,11 +135,9 @@ def _get_field_div(name) #:nodoc:
128
135
  # field not defined on form. Must be defined: name as form_field_type
129
136
  filter = nil
130
137
  if session[@form['table']] and session[@form['table']][:filter]
131
- filter = session[@form['table']][:filter].split("\t")
138
+ filter, operation, value = session[@form['table']][:filter].split("\t")
132
139
  end
133
-
134
- #params[:filter_field], params[:filter_oper], params[:record][params[:filter_field]]
135
-
140
+ #
136
141
  if name.match(' as ')
137
142
  name, dummy, type = name.split(' ')
138
143
  field = {"name" => name, "type" => type, "html"=>{"size"=>20}}
@@ -141,18 +146,21 @@ def _get_field_div(name) #:nodoc:
141
146
  field = {"name" => name, "type" => 'text_field', "html"=>{"size"=>20}} if field.nil?
142
147
  end
143
148
  #
149
+ div_hidden = 'div-hidden'
144
150
  if filter
151
+ div_hidden = '' if name == filter
145
152
  if field['html']
146
- field['html']['value'] = filter[2]
153
+ field['html']['value'] = value
147
154
  else
148
- field['html'] = {"value"=>filter[2]}
155
+ field['html'] = { "value" => value }
149
156
  end
150
157
  end
151
158
  klas_string = field['type'].camelize
152
- klas = DrgcmsFormField::const_get(klas_string) || nil
159
+ klas = DrgcmsFormFields::const_get(klas_string) || nil
153
160
  return 'error' if klas.nil?
161
+ #
154
162
  o = klas.new(self, @record, field).render
155
- "<span id=\"filter_#{field['name']}\" class=\"div-hidden\">" << o.html << (o.js.size > 2 ? javascript_tag(o.js) : '') << '</span>'
163
+ "<span id=\"filter_#{field['name']}\" class=\"#{div_hidden}\">" << o.html << (o.js.size > 2 ? javascript_tag(o.js) : '') << '</span>'
156
164
  end
157
165
 
158
166
  ############################################################################
@@ -160,9 +168,8 @@ end
160
168
  ############################################################################
161
169
  def dc_div_filter()
162
170
  choices, inputs = [], ''
163
- # searching by id is added by default
164
171
  filter = (@form['index'] and @form['index']['filter']) ? @form['index']['filter'] + ',' : ''
165
- filter << 'id as text_field'
172
+ filter << 'id as text_field' # filter id is added by default
166
173
  filter.split(',').each do |f|
167
174
  f.strip!
168
175
  name = f.match(' as ') ? f.split(' ').first : f
@@ -173,21 +180,28 @@ def dc_div_filter()
173
180
  choices4_operators = t('drgcms.choices4_filter_operators').chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )}
174
181
  s = session[@form['table']]
175
182
  is_hidden = (s and s[:filter]) ? '' : ' class="div-hidden" '
183
+ #
184
+ if session[@form['table']] and session[@form['table']][:filter]
185
+ field_name, operators_value, dummy = session[@form['table']][:filter].split("\t")
186
+ else
187
+ field_name, operators_value = nil, nil
188
+ end
176
189
  html =<<EOT
177
190
  <div id="drgcms_filter" #{is_hidden}>
178
191
  <table class="dc-menu"><td>
179
192
  #{ form_tag :table => @form['table'], filter: :on, action: :index, method: :post }
180
- #{ select(nil, 'filter_field', choices, { include_blank: true}) }
181
- #{ select(nil, 'filter_oper', choices4_operators) }
193
+ #{ select(nil, 'filter_field', options_for_select(choices, field_name), { include_blank: true }) }
194
+ #{ select(nil, 'filter_oper', options_for_select(choices4_operators, operators_value)) }
182
195
  #{ inputs }
183
196
  </td>
184
- <td class="dc-link-submit dc-animate">#{submit_tag(t('drgcms.filter_on'), :class => 'dc-submit')}</td>
185
- <td class="dc-link dc-animate">#{link_to t('drgcms.filter_off'), action: 'index', filter: 'off', :table => @form['table']}</td>
197
+ <td class="dc-link-submit dc-animate">#{fa_icon('check-square-o')} #{submit_tag(t('drgcms.filter_on'), :class => 'dc-submit')}</td>
198
+ <td class="dc-link dc-animate">#{dc_link_to('drgcms.filter_off','close', {action: 'index', filter: 'off', :table => @form['table']}) }</td>
186
199
  </table>
187
200
  </form>
188
201
  </div>
189
202
 
190
203
  EOT
204
+ # <td class="dc-link dc-animate">#{link_to t('drgcms.filter_off'), action: 'index', filter: 'off', :table => @form['table']}</td>
191
205
  html.html_safe
192
206
  end
193
207
 
@@ -204,14 +218,56 @@ def dc_table_title_for_result(result=nil)
204
218
  dc_table_title(title, result)
205
219
  end
206
220
 
221
+ ############################################################################
222
+ # Similar to rails submit_tag, but also takes care of link icon, translation, ...
223
+ ############################################################################
224
+ def dc_submit_tag(caption, icon, parms, rest={})
225
+ parms['class'] ||= 'dc-submit'
226
+ if icon
227
+ icon_image = if icon.match(/\./)
228
+ image_tag(icon, class: 'dc-animate')
229
+ else
230
+ fa_icon(icon)
231
+ end
232
+ end
233
+ html = icon_image || ''
234
+ html << submit_tag(t(caption, caption), parms)
235
+ end
236
+ ############################################################################
237
+ # Similar to rails link_to, but also takes care of link icon, translation, ...
238
+ ############################################################################
239
+ def dc_link_to(caption, icon, parms, rest={})
240
+ rest['class'] = rest['class'].to_s + ' dc-animate'
241
+ if icon
242
+ icon_image = if icon.match(/\./)
243
+ image_tag(icon, class: 'dc-link-img dc-animate')
244
+ else
245
+ fa_icon(icon)
246
+ end
247
+ end
248
+ #
249
+ if caption
250
+ caption = t(caption, caption)
251
+ icon_image << ' ' if icon_image
252
+ end
253
+ link_to("#{icon_image}#{caption}".html_safe, parms, rest)
254
+ end
255
+
207
256
  ############################################################################
208
257
  # Creates code for link or ajax action type. Subroutine of dc_actions_for_result.
209
258
  ############################################################################
210
259
  def dc_link_or_ajax(yaml, parms) #:nodoc:
211
- method = yaml['method'] || yaml['request'] || 'get'
212
- caption = yaml['caption'] || yaml['text']
260
+ rest = {}
261
+ rest['method'] = yaml['method'] || yaml['request'] || 'get'
262
+ rest['caption'] = yaml['caption'] || yaml['text']
263
+ rest['class'] = rest['class'].to_s + ' dc-animate'
264
+ rest['title'] = yaml['title']
265
+
266
+ # method = yaml['method'] || yaml['request'] || 'get'
267
+ # caption = yaml['caption'] || yaml['text']
213
268
  p "Form: result_set:action:text directive will be deprecated. Use caption instead of text." if yaml['text']
214
269
  #
270
+ =begin
215
271
  if yaml['type'] == 'link'
216
272
  if yaml['icon'] # icon
217
273
  link_to( image_tag(yaml['icon'], class: 'dc-link-img dc-link-ajax dc-animate'), parms, method: method, title: t(yaml['title'],yaml['title']) )
@@ -225,7 +281,32 @@ def dc_link_or_ajax(yaml, parms) #:nodoc:
225
281
  else # caption
226
282
  %Q[<span class="dc-link-ajax dc-animate" data-url="#{url}" data-request="#{method}">#{caption}</span>]
227
283
  end
228
- end
284
+ end
285
+ #####
286
+ caption = ''
287
+ if yaml['type'] == 'link'
288
+ if yaml['icon'] # icon
289
+ caption = if yaml['icon'].match('.')
290
+ image_tag(yaml['icon'], class: 'dc-link-img dc-link-ajax dc-animate')
291
+ else
292
+ fa_icon("#{yaml['icon']} 2x" , class: 'dc-link-ajax dc-animate')
293
+ end
294
+ end
295
+ if yaml['caption']
296
+ caption << ' ' if caption.size > 0
297
+ caption << t(yaml['caption'],yaml['caption'])
298
+ end
299
+ link_to(caption, parms, method: method, title: t(yaml['title'],yaml['title']) )
300
+ else
301
+ ''
302
+ end
303
+ =end
304
+ if yaml['type'] == 'link'
305
+ dc_link_to(yaml['caption'], yaml['icon'], parms, rest )
306
+ else
307
+ ''
308
+ end
309
+
229
310
  end
230
311
 
231
312
  ############################################################################
@@ -233,7 +314,7 @@ end
233
314
  ############################################################################
234
315
  def dc_actions_for_result(record)
235
316
  actions = @form['result_set']['actions']
236
- return '' if actions.nil?
317
+ return '' if actions.nil? or @form['readonly']
237
318
  # standard actions
238
319
  actions = {'standard' => true} if actions.class == String && actions == 'standard'
239
320
  std_actions = {' 2' => 'edit', ' 3' => 'delete'}
@@ -250,23 +331,23 @@ def dc_actions_for_result(record)
250
331
  when yaml['type'] == 'edit' then
251
332
  parms['action'] = 'edit'
252
333
  parms['id'] = record.id
253
- link_to( image_tag('drg_cms/edit.png', class: 'dc-link-img dc-animate'), parms )
334
+ dc_link_to( nil, 'pencil lg', parms )
254
335
  when yaml['type'] == 'duplicate' then
255
336
  parms['id'] = record.id
256
337
  # duplicate string will be added to these fields.
257
338
  parms['dup_fields'] = yaml['dup_fields']
258
- link_to( image_tag('drg_cms/copy.png', class: 'dc-link-img dc-animate'), parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post )
339
+ dc_link_to( nil, 'copy lg', parms, data: { confirm: t('drgcms.confirm_dup') }, method: :post )
259
340
  when yaml['type'] == 'delete' then
260
341
  parms['action'] = 'destroy'
261
342
  parms['id'] = record.id
262
- link_to( image_tag('drg_cms/x.png', class: 'dc-link-img dc-animate'), parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
343
+ dc_link_to( nil, 'remove lg', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
263
344
  # undocumented so far
264
345
  when yaml['type'] == 'edit_embedded'
265
346
  parms['controller'] = 'cmsedit'
266
347
  parms['table'] += ";#{yaml['table']}"
267
348
  parms['ids'] ||= ''
268
349
  parms['ids'] += "#{record.id};"
269
- link_to( image_tag('drg_cms/cols.png', class: 'dc-link-img dc-animate'), parms, method: :get )
350
+ dc_link_to( nil, 'table lg', parms, method: :get )
270
351
  when yaml['type'] == 'link' || yaml['type'] == 'ajax' then
271
352
  if yaml['url']
272
353
  parms['controller'] = yaml['url']
@@ -294,7 +375,7 @@ end
294
375
  def dc_header_for_result()
295
376
  c = ''
296
377
  actions = @form['result_set']['actions']
297
- c = '<th style="border-left: 0px;">&nbsp;</th>' unless actions.nil?
378
+ c = '<th style="border-left: 0px;">&nbsp;</th>' unless actions.nil? or @form['readonly']
298
379
 
299
380
  if (columns = @form['result_set']['columns'])
300
381
  columns.each do |k,v|
@@ -382,7 +463,11 @@ def dc_columns_for_result(document)
382
463
  end
383
464
 
384
465
  ############################################################################
385
- # Creates actions div for edit form
466
+ # Creates actions div for edit form.
467
+ #
468
+ # Displaying readonly form turned out to be challenge. For now when readonly parameter
469
+ # has value 2, back link will force readonly form. Value 1 or not set will result in
470
+ # normal link.
386
471
  ############################################################################
387
472
  def dc_actions_for_form()
388
473
  # create standard actions
@@ -390,7 +475,6 @@ def dc_actions_for_form()
390
475
  ' 3' => {'type' => 'submit', 'caption' => 'drgcms.save&back'} }
391
476
  # when edit only
392
477
  unless @record.id.nil?
393
- # std_actions.merge!({' 4' => 'delete', ' 6' => 'new'} ) # delete is not OK here
394
478
  std_actions.merge!({' 6' => 'new'} )
395
479
  std_actions.merge!(@record.active ? {' 5' => 'disable'} : {' 5' => 'enable'} ) if @record.respond_to?('active')
396
480
  end
@@ -399,6 +483,9 @@ def dc_actions_for_form()
399
483
  actions = nil if actions.class == String && actions == 'standard'
400
484
  # standard actions
401
485
  actions = std_actions if actions.nil?
486
+ # readonly
487
+ actions = {' 1' => 'back'} if @form['readonly']
488
+
402
489
  if actions['standard']
403
490
  actions.merge!(std_actions)
404
491
  actions['standard'] = nil
@@ -416,7 +503,8 @@ def dc_actions_for_form()
416
503
  # Sort so that standard actions come first
417
504
  actions = actions.to_a.sort {|x,y| x[0].to_s <=> y[0].to_s}
418
505
  # Add spinner to the beginning
419
- c = %Q[<td id="dc-spinner" class="div-hidden">#{image_tag('drg_cms/spinner.gif')}</td>]
506
+ c = %Q[<td id="dc-spinner" class="div-hidden">#{fa_icon('spinner lg spin')}</td>]
507
+
420
508
  actions.each do |element|
421
509
  session[:form_processing] = "form:actions: #{element}"
422
510
  v = element[1]
@@ -430,28 +518,35 @@ def dc_actions_for_form()
430
518
  #
431
519
  parms = @parms.clone
432
520
  if v.class == String
521
+ next if params[:readonly] and !(v == 'back')
522
+
433
523
  c << '<td class="dc-link dc-animate">'
434
524
  c << case
435
525
  when (v == 'back' or v == 'cancle') then
436
526
  # If return_to is present link directly to URL
437
527
  if parms['xreturn_to'] # disabled for now
438
- link_to(t('drgcms.back'), parms['return_to'] )
528
+ dc_link_to( 'drgcms.back','arrow-left', parms['return_to'] )
439
529
  else
440
530
  parms['action'] = 'index'
441
- link_to(t('drgcms.back'), parms)
531
+ parms['readonly'] = parms['readonly'].to_s.to_i < 2 ? nil : 1
532
+ dc_link_to( 'drgcms.back','arrow-left', parms )
442
533
  end
443
534
  when v == 'delete' then
444
535
  parms['operation'] = v
445
536
  parms['id'] = @record.id
446
- link_to( t('drgcms.delete'), parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
537
+ dc_link_to( 'drgcms.delete','remove', parms, data: { confirm: t('drgcms.confirm_delete') }, method: :delete )
447
538
  when v == 'new' then
448
539
  parms['action'] = v
449
- #parms['id'] = @record.id
450
- link_to( t('drgcms.new'), parms)
540
+ dc_link_to( 'drgcms.new', 'plus', parms)
451
541
  when (v == 'enable' or v == 'disable') then
452
542
  parms['operation'] = v
453
- parms['id'] = @record.id
454
- link_to( t("drgcms.#{v}"), parms, method: :delete )
543
+ parms['id'] = @record.id
544
+ icon = (v == 'enable' ? 'thumbs-o-up' : 'thumbs-o-down')
545
+ dc_link_to( "drgcms.#{v}",icon, parms, method: :delete )
546
+ when v == 'edit' then
547
+ parms['operation'] = v
548
+ parms['id'] = @record.id
549
+ dc_link_to( "drgcms.#{v}",v, parms )
455
550
  else
456
551
  "err1 #{element[0]}=>#{v}"
457
552
  end
@@ -462,16 +557,18 @@ def dc_actions_for_form()
462
557
  # submit button
463
558
  when v['type'] == 'submit'
464
559
  caption = v['caption'] || 'drgcms.save'
560
+ icon = v['icon'] || 'save'
465
561
  '<td class="dc-link-submit dc-animate">' +
466
- submit_tag(t(caption, caption), :data => v['params'], :class => 'dc-submit') +
562
+ dc_submit_tag(caption, icon, {:data => v['params'], :title => v['title']}) +
467
563
  '</td>'
468
564
  # delete with some sugar added
469
565
  when v['type'] == 'delete'
470
566
  parms['id'] = @record.id
471
567
  parms.merge!(v['params'])
472
568
  caption = v['caption'] || 'drgcms.delete'
569
+ icon = v['icon'] || 'remove'
473
570
  '<td class="dc-link dc-animate">' +
474
- link_to( t(caption, caption), parms, data: t('drgcms.confirm_delete'), method: :delete ) +
571
+ dc_link_to( caption, icon, parms, data: t('drgcms.confirm_delete'), method: :delete ) +
475
572
  '</td>'
476
573
  # ajax or link button
477
574
  when v['type'] == 'ajax' || v['type'] == 'link'
@@ -494,22 +591,24 @@ def dc_actions_for_form()
494
591
  if parms['controller'].nil?
495
592
  "<td>#{t('drgcms.error')}</td>"
496
593
  else
497
- v['caption'] ||= v['text'] || 'Caption missing!'
594
+ v['caption'] ||= v['text']
498
595
  caption = t("#{v['caption'].downcase}", v['caption'])
499
596
  url = url_for(parms)
500
597
  request = v['request'] || v['method'] || 'get'
598
+ icon = v['icon'] ? "#{fa_icon(v['icon'])} " : ''
501
599
  if v['type'] == 'ajax' # ajax button
502
- %Q[<td class="dc-link-ajax dc-animate" id="dc-submit-ajax" data-url="#{url}" data-request="#{request}">#{caption}</td>]
600
+ %Q[<td class="dc-link-ajax dc-animate" id="dc-submit-ajax" data-url="#{url}"
601
+ data-request="#{request}" title="#{v['title']}">#{icon}#{caption}</td>]
503
602
  else # link button
504
- %Q[<td class="dc-link dc-animate"><a href="#{url}">#{caption}</a></td>]
603
+ %Q[<td class="dc-link dc-animate" title="#{v['title']}><a href="#{url}">#{icon}#{caption}</a></td>]
505
604
  end
506
605
  end
507
606
  # Javascript action
508
607
  when v['type'] == 'script'
509
- v['caption'] ||= 'Caption missing!'
510
- caption = t("#{v['caption'].downcase}", v['caption'])
608
+ # v['caption'] ||= 'Caption missing!'
609
+ # caption = t("#{v['caption'].downcase}", v['caption'])
511
610
  data = {'request' => 'script', 'script' => v['js']}
512
- %Q[<td class="dc-link-ajax dc-animate">#{ link_to(caption, '#', data: data ) }</td>]
611
+ %Q[<td class="dc-link-ajax dc-animate">#{ dc_link_to(v['caption'],v['icon'], '#', data: data ) }</td>]
513
612
  else
514
613
  '<td>err2</td>'
515
614
  end
@@ -545,6 +644,7 @@ end
545
644
  ############################################################################
546
645
  def dc_fields_for_tab(fields) #:nodoc:
547
646
  @js ||= ''
647
+ double_field = 0
548
648
  html = '<table class="dc-form-table">'
549
649
  labels_pos = dc_check_and_default(@form['form']['labels_pos'], 'right', ['top','left','right'])
550
650
  reset_cycle()
@@ -556,7 +656,7 @@ def dc_fields_for_tab(fields) #:nodoc:
556
656
  next if params[:edit_only] and params[:edit_only] != options['name']
557
657
  # hidden_fields. Ignore description text, otherwise it will be seen on screen
558
658
  if options['type'] == 'hidden_field'
559
- html << DrgcmsFormField::HiddenField.new(self, @record, options).render
659
+ html << DrgcmsFormFields::HiddenField.new(self, @record, options).render
560
660
  next
561
661
  end
562
662
  # label
@@ -568,26 +668,35 @@ def dc_fields_for_tab(fields) #:nodoc:
568
668
  end
569
669
  help ||= t('helpers.help.' + @form['table'] + '.' + options['name'],' ')
570
670
  odd_even = cycle('odd','even')
671
+ odd_even = cycle('odd','even') if double_field == 2 # it should be same style as first
571
672
  # create field object from class and call its render method
572
673
  klas_string = options['type'].camelize
573
- field_html = if DrgcmsFormField.const_defined?(klas_string) # check if field type is defined
574
- klas = DrgcmsFormField.const_get(klas_string)
674
+ field_html = if DrgcmsFormFields.const_defined?(klas_string) # check if field type is defined
675
+ klas = DrgcmsFormFields.const_get(klas_string)
575
676
  field = klas.new(self, @record, options).render
576
677
  @js << field.js
577
678
  field.html
578
679
  else # litle error string
579
680
  "Error: Code for field type #{options['type']} not defined!"
580
681
  end
682
+ double_field = 1 if options['double']
683
+ html << '<tr>' if double_field < 2
581
684
  #
582
685
  html << if labels_pos == 'top'
583
- %Q[<tr><td class="dc-form-label dc-color-#{odd_even} dc-align-left" title="#{help}">
686
+ %Q[<td class="dc-form-label dc-color-#{odd_even} dc-align-left" title="#{help}"
687
+ #{double_field == 0 ? 'colspan="2"' : 'style="width:50%;"'}>
584
688
  <div><label for="record_#{options['name']}">#{text} </label></div>
585
- <div id="td_record_#{options['name']}" >#{field_html}</div></td></tr>]
689
+ <div id="td_record_#{options['name']}">#{field_html}</div></td>]
586
690
  else
587
- %Q[<tr><td class="dc-form-label dc-color-#{odd_even} dc-align-#{labels_pos}" title="#{help}">
691
+ %Q[<td class="dc-form-label dc-color-#{odd_even} dc-align-#{labels_pos}" title="#{help}">
588
692
  <label for="record_#{options['name']}">#{text} </label></td>
589
- <td id=\"td_record_#{options['name']}\" class=\"dc-form-field dc-color-#{odd_even}\">#{field_html}</td></tr>]
693
+ <td id=\"td_record_#{options['name']}\" class=\"dc-form-field dc-color-#{odd_even}\" #{'colspan="3"' if double_field == 0 }>#{field_html}
694
+ </td>
695
+ ]
590
696
  end
697
+ html << '</tr>' if double_field != 1
698
+ double_field = 0 if double_field == 2
699
+ double_field = 2 if double_field == 1
591
700
  end
592
701
  html << '</table></table>'
593
702
  end
@@ -653,6 +762,7 @@ end
653
762
  def dc_document_statistics
654
763
  return '' if @record.new_record? or dc_dont?(@form['form']['info'])
655
764
  html = "<div id='dc-document-info'>#{t('drgcms.doc_info')}</div>"
765
+ # html = "<div id='dc-document-info'>#{fa_icon 'info-circle 2x'}</div>"
656
766
  html << "<div id='dc-document-info-popup' class='div-hidden'><table>"
657
767
  #
658
768
  u = _get_user_for('created_by')
@@ -667,11 +777,12 @@ def dc_document_statistics
667
777
  parms[:controller] = 'dc_common'
668
778
  parms[:action] = 'copy_clipboard'
669
779
  url = url_for(parms)
670
- caption = image_tag('drg_cms/copy.png', title: t('drgcms.doc_copy_clipboard'))
671
- html << %Q[<hr><img class="dc-link-img dc-link-ajax dc-animate" data-url="#{url}" data-request="get" #{caption}]
672
-
673
- html << '</div>'
674
- html.html_safe
780
+ # caption = image_tag('drg_cms/copy.png', title: t('drgcms.doc_copy_clipboard'))
781
+ # html << %Q[<hr><img class="dc-link-img dc-link-ajax dc-animate" data-url="#{url}" data-request="get" #{caption}]
782
+ html << fa_icon('copy 2x', class: 'dc-link-img dc-link-ajax dc-animate',
783
+ 'data-url' => url, 'data-request' => 'get', title: t('drgcms.doc_copy_clipboard') )
784
+ (html << '</div>').html_safe
785
+ # html.html_safe
675
786
  end
676
787
 
677
788
  end