drg_cms 0.5.52.12 → 0.5.52.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +17 -2
  3. data/app/assets/stylesheets/drg_cms/drg_cms.css +16 -3
  4. data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
  5. data/app/controllers/cmsedit_controller.rb +56 -16
  6. data/app/controllers/dc_application_controller.rb +83 -1
  7. data/app/controllers/dc_common_controller.rb +2 -52
  8. data/app/forms/all_options.yml +27 -4
  9. data/app/forms/cms_menu.yml +5 -0
  10. data/app/forms/dc_gallery.yml +53 -0
  11. data/app/forms/dc_link.yml +16 -10
  12. data/app/forms/dc_menu_item.yml +5 -0
  13. data/app/forms/dc_page.yml +1 -2
  14. data/app/forms/dc_removed_url.yml +42 -0
  15. data/app/helpers/cmsedit_helper.rb +63 -22
  16. data/app/helpers/dc_application_helper.rb +35 -11
  17. data/app/helpers/dc_gallery_renderer.rb +94 -0
  18. data/app/helpers/dc_page_renderer.rb +20 -3
  19. data/app/helpers/dc_poll_renderer.rb +6 -7
  20. data/app/models/concerns/dc_page_concern.rb +1 -1
  21. data/app/models/dc_filter.rb +15 -7
  22. data/app/models/dc_gallery.rb +64 -0
  23. data/app/models/dc_link.rb +1 -0
  24. data/app/models/dc_memory.rb +19 -4
  25. data/app/models/dc_page.rb +1 -1
  26. data/app/models/dc_removed_url.rb +54 -0
  27. data/app/models/drgcms_form_fields.rb +5 -1649
  28. data/app/models/drgcms_form_fields/check_box.rb +69 -0
  29. data/app/models/drgcms_form_fields/comment.rb +49 -0
  30. data/app/models/drgcms_form_fields/date_picker.rb +102 -0
  31. data/app/models/drgcms_form_fields/date_select.rb +68 -0
  32. data/app/models/drgcms_form_fields/date_time_picker.rb +87 -0
  33. data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
  34. data/app/models/drgcms_form_fields/drgcms_field.rb +241 -0
  35. data/app/models/drgcms_form_fields/drgcms_form_fields.rb +25 -0
  36. data/app/models/drgcms_form_fields/embedded.rb +84 -0
  37. data/app/models/drgcms_form_fields/file_select.rb +70 -0
  38. data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
  39. data/app/models/drgcms_form_fields/html_field.rb +70 -0
  40. data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
  41. data/app/models/drgcms_form_fields/link_to.rb +69 -0
  42. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +195 -0
  43. data/app/models/drgcms_form_fields/number_field.rb +83 -0
  44. data/app/models/drgcms_form_fields/password_field.rb +62 -0
  45. data/app/models/drgcms_form_fields/readonly.rb +79 -0
  46. data/app/models/drgcms_form_fields/select.rb +164 -0
  47. data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
  48. data/app/models/drgcms_form_fields/text_area.rb +68 -0
  49. data/app/models/drgcms_form_fields/text_autocomplete.rb +143 -0
  50. data/app/models/drgcms_form_fields/text_field.rb +56 -0
  51. data/app/models/drgcms_form_fields/text_with_select.rb +92 -0
  52. data/app/models/drgcms_form_fields/tree_select.rb +150 -0
  53. data/config/locales/drgcms_en.yml +1 -0
  54. data/config/locales/drgcms_sl.yml +2 -1
  55. data/config/locales/models_en.yml +42 -6
  56. data/config/locales/models_sl.yml +38 -3
  57. data/lib/drg_cms.rb +1 -1
  58. data/lib/drg_cms/version.rb +1 -1
  59. data/lib/tasks/dc_cleanup.rake +1 -1
  60. metadata +33 -4
@@ -118,6 +118,11 @@ menu:
118
118
  controller: cmsedit
119
119
  icon: filter lg
120
120
  table: dc_filter
121
+ 90:
122
+ caption: helpers.label.dc_removed_url.tabletitle
123
+ controller: cmsedit
124
+ icon: trash-o lg
125
+ table: dc_removed_url
121
126
  500:
122
127
  caption: helpers.label.dc_journal.tabletitle
123
128
  controller: cmsedit
@@ -0,0 +1,53 @@
1
+ # Form for dc_gallery
2
+ table: dc_gallery
3
+ index:
4
+ filter: id as text_field, doc_id as text_field
5
+ actions: standard
6
+
7
+ result_set:
8
+ actions: standard
9
+
10
+ # Choose from
11
+ # _id,created_at,updated_at,title,description,picture,thumbnail,doc_id,order,active,created_by,updated_by
12
+ columns:
13
+ 10:
14
+ name: doc_id
15
+ 20:
16
+ name: title
17
+ 30:
18
+ name: created_at
19
+ width: 10%
20
+ 50:
21
+ name: active
22
+ eval: dc_icon4_boolean
23
+
24
+ form:
25
+ actions: standard
26
+
27
+ fields:
28
+ 10:
29
+ name: doc_id
30
+ type: readonly
31
+ 20:
32
+ name: title
33
+ type: text_field
34
+ size: 50
35
+ 30:
36
+ name: description
37
+ type: text_area
38
+ size: 80x10
39
+ 40:
40
+ name: picture
41
+ type: file_select
42
+ size: 50
43
+ 50:
44
+ name: thumbnail
45
+ type: file_select
46
+ size: 50
47
+ 60:
48
+ name: order
49
+ type: text_field
50
+ size: 3
51
+ 70:
52
+ name: active
53
+ type: check_box
@@ -14,13 +14,14 @@ result_set:
14
14
  3: delete
15
15
 
16
16
  columns:
17
- 1:
17
+ 10:
18
18
  name: name
19
- style: "text-align: left;"
20
- width: 40%
21
- 2:
19
+ width: 20%
20
+ 20:
21
+ name: redirect
22
+ width: 20%
23
+ 30:
22
24
  name: params
23
- style: "text-align: left;"
24
25
 
25
26
  form:
26
27
  title:
@@ -32,24 +33,29 @@ form:
32
33
  10:
33
34
  name: name
34
35
  type: text_field
35
- html:
36
- size: 30
36
+ size: 40
37
37
 
38
38
  20:
39
39
  name: dc_site_id
40
40
  type: select
41
41
  eval: DcSite.choices4_site
42
+ html:
43
+ include_blank: true
42
44
 
43
45
  30:
46
+ name: redirect
47
+ type: text_field
48
+ size: 40
49
+
50
+ 40:
44
51
  name: page_id
45
52
  type: text_autocomplete
46
53
  table:
47
54
  eval: '@parent.session[:site_page_table]'
48
55
  search: subject
49
- html:
50
- size: 80
56
+ size: 60
51
57
 
52
- 40:
58
+ 50:
53
59
  name: params
54
60
  type: text_area
55
61
  html:
@@ -19,6 +19,11 @@ result_set:
19
19
  3:
20
20
  name: order
21
21
  align: right
22
+ width: 10%
23
+ 4:
24
+ name: active
25
+ eval: dc_icon4_boolean
26
+ width: 10%
22
27
 
23
28
  form:
24
29
  title:
@@ -69,8 +69,7 @@ form:
69
69
  size: 50
70
70
  90:
71
71
  name: gallery
72
- type: text_field
73
- size: 20
72
+ type: check_box
74
73
  100:
75
74
  name: valid_from
76
75
  type: datetime_select
@@ -0,0 +1,42 @@
1
+ # Form for dc_removed_url
2
+ table: dc_removed_url
3
+
4
+ index:
5
+ filter: url, dc_site_id
6
+ actions: standard
7
+
8
+ result_set:
9
+ actions: standard
10
+
11
+ columns:
12
+ 10:
13
+ name: dc_site_id
14
+ eval: dc_name4_id,dc_site,name
15
+ 20:
16
+ name: url
17
+ width: 40%
18
+ 30:
19
+ name: updated_at
20
+ format: '%d.%m.%Y'
21
+
22
+ form:
23
+ title:
24
+ field: url
25
+
26
+ actions: standard
27
+
28
+ fields:
29
+ 10:
30
+ name: url
31
+ type: text_field
32
+ size: 50
33
+ 20:
34
+ name: description
35
+ type: text_field
36
+ size: 50
37
+ 30:
38
+ name: dc_site_id
39
+ type: select
40
+ eval: dc_choices4('dc_site','name','_id')
41
+ html:
42
+ include_blank: true
@@ -134,6 +134,16 @@ EOT
134
134
  when action == 'menu' then
135
135
  caption = t(v['caption'], v['caption']) + ' ' + fa_icon('caret-down lg')
136
136
  caption + eval(v['eval'])
137
+ =begin
138
+ # reorder
139
+ when action == 'reorder' then
140
+ caption = t('drgcms.reorder')
141
+ parms = @parms.clone
142
+ parms['operation'] = v
143
+ parms['id'] = params[:ids]
144
+ parms['table'] = @form['table']
145
+ dc_link_to( caption, 'reorder', parms, method: :delete )
146
+ =end
137
147
  else
138
148
  caption = yaml['caption'] || yaml['text']
139
149
  icon = yaml['icon'] ? yaml['icon'] : action
@@ -173,7 +183,7 @@ def dc_div_filter()
173
183
  field_name, operators_value = nil, nil
174
184
  end
175
185
  #{ 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)
186
+ url = url_for(table: @form['table'],form_name: params['form_name'], filter: :on, filter_input: 1, action: :index, controller: :cmsedit)
177
187
  html =<<EOT
178
188
  <div id="drgcms_filter" class="div-hidden">
179
189
  <h1>#{t('drgcms.filter_set')}</h1>
@@ -350,7 +360,7 @@ def dc_clicks_for_result(document)
350
360
  html << ' data-dblclick=' + url_for(opts)
351
361
  else
352
362
  html << (' data-dblclick=' +
353
- url_for(action: 'show', controller: 'cmsedit', id: document,
363
+ url_for(action: 'show', controller: 'cmsedit', id: document.id,
354
364
  readonly: (params[:readonly] ? 2 : 1), table: params[:table],
355
365
  form_name: params[:form_name], ids: params[:ids]) ) if @form['form']
356
366
  end
@@ -475,6 +485,17 @@ def dc_columns_for_result(document)
475
485
  html.html_safe
476
486
  end
477
487
 
488
+ ############################################################################
489
+ # Will return value for parameter required on form
490
+ ############################################################################
491
+ def dc_value_for_parameter(param)
492
+ if param.class == Hash
493
+ dc_internal_var(param['object'] || 'record', param['method'])
494
+ else
495
+ param
496
+ end
497
+ end
498
+
478
499
  ############################################################################
479
500
  # Creates actions div for edit form.
480
501
  #
@@ -490,6 +511,7 @@ def dc_actions_for_form()
490
511
  unless @record.id.nil?
491
512
  std_actions.merge!({' 6' => 'new'} )
492
513
  std_actions.merge!(@record.active ? {' 5' => 'disable'} : {' 5' => 'enable'} ) if @record.respond_to?('active')
514
+ std_actions.merge!({' 7' => 'refresh'} )
493
515
  end
494
516
  actions = @form['form']['actions']
495
517
  # shortcut for actions: standard
@@ -531,6 +553,8 @@ def dc_actions_for_form()
531
553
  next
532
554
  end
533
555
  #
556
+ action_active = !(dc_dont?(v['when_new']) and @record.new_record?)
557
+ # p [v['caption'], action_active]
534
558
  parms = @parms.clone
535
559
  if v.class == String
536
560
  next if params[:readonly] and !(v == 'back')
@@ -562,21 +586,28 @@ def dc_actions_for_form()
562
586
  parms['operation'] = v
563
587
  parms['id'] = @record.id
564
588
  dc_link_to( "drgcms.#{v}",v, parms )
589
+ when v == 'refresh' then
590
+ "<span onclick='window.location.href=window.location.href;'>#{fa_icon('refresh')} #{t('drgcms.refresh')}</span></li>"
565
591
  else
566
592
  "err1 #{element[0]}=>#{v}"
567
593
  end
568
594
  c << '</td>'
569
- # non standard actions
595
+ # non standard actions
570
596
  else
571
597
  c << case
572
- # submit button
598
+ # submit button
573
599
  when v['type'] == 'submit'
574
600
  caption = v['caption'] || 'drgcms.save'
575
601
  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
602
+ if action_active
603
+ '<li class="dc-link-submit dc-animate">' +
604
+ dc_submit_tag(caption, icon, {:data => v['params'], :title => v['title'] }) +
605
+ '</li>'
606
+ else
607
+ "<li class=\"dc-link-no\">#{fa_icon(icon)} #{caption}</li>"
608
+ end
609
+
610
+ # delete with some sugar added
580
611
  when v['type'] == 'delete'
581
612
  parms['id'] = @record.id
582
613
  parms.merge!(v['params'])
@@ -585,40 +616,50 @@ def dc_actions_for_form()
585
616
  '<li class="dc-link dc-animate">' +
586
617
  dc_link_to( caption, icon, parms, data: t('drgcms.confirm_delete'), method: :delete ) +
587
618
  '</li>'
588
- # ajax or link button
589
- when v['type'] == 'ajax' || v['type'] == 'link'
619
+
620
+ # ajax or link button
621
+ when v['type'] == 'ajax' || v['type'] == 'link' || v['type'] == 'window'
590
622
  parms = {}
591
- # direct url
623
+ # direct url
592
624
  if v['url']
593
625
  parms['controller'] = v['url']
594
- parms['idr'] = @record.id
595
- # make url
626
+ parms['idr'] = dc_document_path(@record)
627
+ # make url from action controller
596
628
  else
597
629
  parms['controller'] = v['controller']
598
630
  parms['action'] = v['action']
599
631
  parms['table'] = v['table']
600
632
  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
633
  end
605
- # Error if controller param is missing
634
+ # add current id to parameters
635
+ parms['id'] = dc_document_path(@record)
636
+ # additional parameters
637
+ v['params'].each { |k,v| parms[k] = dc_value_for_parameter(v) } if v['params']
638
+ # Error if controller parameter is missing
606
639
  if parms['controller'].nil?
607
640
  "<li>#{t('drgcms.error')}</li>"
608
641
  else
609
642
  v['caption'] ||= v['text']
610
643
  caption = t("#{v['caption'].downcase}", v['caption'])
611
- url = url_for(parms)
644
+ #
645
+ url = url_for(parms) rescue ''
612
646
  request = v['request'] || v['method'] || 'get'
613
647
  icon = v['icon'] ? "#{fa_icon(v['icon'])} " : ''
614
648
  if v['type'] == 'ajax' # ajax button
615
- %Q[<li class="dc-link-ajax dc-animate" id="dc-submit-ajax" data-url="#{url}"
649
+ clas = action_active ? "dc-link-ajax dc-animate" : "dc-link-no"
650
+ %Q[<li class="#{clas}" data-url="#{action_active ? url : ''}"
616
651
  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>]
652
+ elsif v['type'] == 'link' # link button
653
+ clas = action_active ? "dc-link dc-animate" : "dc-link-no"
654
+ %Q[<li class="#{clas}">#{action_active ? dc_link_to(v['caption'],v['icon'], parms, {target: v['target']} ) : caption}</li>]
655
+ elsif v['type'] == 'window'
656
+ clas = action_active ? "dc-link dc-animate dc-window-open" : "dc-link-no"
657
+ %Q[<li class="#{clas}" data-url="#{action_active ? url : ''}">#{icon}#{caption}</li>]
658
+ else
659
+ 'Action Type error'
620
660
  end
621
661
  end
662
+
622
663
  # Javascript action
623
664
  when v['type'] == 'script'
624
665
  # v['caption'] ||= 'Caption missing!'
@@ -54,7 +54,9 @@ attr_reader :part
54
54
  attr_accessor :page_title
55
55
  # all parts read from page, design, ...
56
56
  attr_accessor :parts
57
-
57
+ #
58
+ attr_accessor :record
59
+ #
58
60
  attr_accessor :record_footer
59
61
 
60
62
  ############################################################################
@@ -283,7 +285,7 @@ def dc_edit_title()
283
285
  dc_deprecate('form:edit_title will be deprecated. Use form:title:field instead.') if @form['form']['edit_title']
284
286
  #
285
287
  c << "#{@record[ title ]} : " if title and @record.respond_to?(title)
286
- c << @record._id if @record
288
+ c << @record.id if @record
287
289
  end
288
290
  c
289
291
  end
@@ -440,7 +442,7 @@ end
440
442
  # String. HTML code formatted for display.
441
443
  ####################################################################
442
444
  def dc_error_messages_for(doc)
443
- return '' unless doc.errors.any?
445
+ return '' unless doc and doc.errors.any?
444
446
  msgs = ''
445
447
  doc.errors.each do |attribute, errors_array|
446
448
  label = t("helpers.label.#{decamelize_type(doc.class)}.#{attribute}", attribute)
@@ -527,13 +529,15 @@ end
527
529
  # Create edit link with edit picture. Subroutine of dc_page_edit_menu.
528
530
  ####################################################################
529
531
  def dc_link_menu_tag(title) #:nodoc:
530
- html =<<EOT
531
- <dl>
532
+ html = %Q[
533
+ <dl>
532
534
  <dt><div class='drgcms_popmenu' href="#">
533
- #{_origin.fa_icon('edit lg', class: 'dc-inline-link', title: title)}</div></dt>
534
- <dd>
535
- <ul class=' div-hidden drgcms_popmenu_class'>
536
- EOT
535
+ #{_origin.fa_icon('file-text-o lg', class: 'dc-inline-link', title: title)}
536
+ </div></dt>
537
+ <dd>
538
+ <ul class=' div-hidden drgcms_popmenu_class'>
539
+ ]
540
+
537
541
  yield html
538
542
  html << "</ul></dd></dl>"
539
543
  end
@@ -1288,7 +1292,7 @@ end
1288
1292
  # [var_name] String[symbol]: Variable name (:user_name, 'user_id', ...)
1289
1293
  #
1290
1294
  # Example:
1291
- # # called when constructiong iframe for display
1295
+ # # called when constructing iframe for display
1292
1296
  # dc_internal_var(session, :user_id)
1293
1297
  # dc_internal_var(params, :some_external_parameter)
1294
1298
  # dc_internal_var(site, :name)
@@ -1303,13 +1307,33 @@ def dc_internal_var(object, var_name)
1303
1307
  when object == 'params' then _origin.params[var_name]
1304
1308
  when object == 'site' then _origin.dc_get_site.send(var_name)
1305
1309
  when object == 'page' then _origin.page.send(var_name)
1310
+ when object == 'record' then _origin.record.send(var_name)
1306
1311
  else
1307
1312
  'VARIABLE: UNKNOWN OBJECT'
1308
1313
  end
1309
1314
  rescue Exception => e
1310
- Rails.logger.debug "Method dc_internal var. Runtime error. #{e.message}"
1315
+ Rails.logger.error "Method dc_internal var. Runtime error. #{e.message}"
1311
1316
  'VARIABLE: ERROR'
1312
1317
  end
1313
1318
  end
1314
1319
 
1320
+
1321
+ ########################################################################
1322
+ # Will return whole path to document if document is embedded in another document.
1323
+ #
1324
+ # Parameters:
1325
+ # [document] Object: Document object
1326
+ #
1327
+ # Returns:
1328
+ # String of ID-s separated by semicolon.
1329
+ #######################################################################
1330
+ def dc_document_path(document)
1331
+ path, parent = [document.id], document._parent
1332
+ while parent
1333
+ path << parent.id
1334
+ parent = parent._parent
1335
+ end
1336
+ path.reverse.join(';')
1337
+ end
1338
+
1315
1339
  end
@@ -0,0 +1,94 @@
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
+ # DcGalleryRenderer renders data for displaying picture galary under the document.
26
+ #
27
+ # Example:
28
+ # <div id="page">
29
+ # <%= dc_render(:dc_gallery) if document.gallery %>
30
+ # </div>
31
+ #
32
+ ########################################################################
33
+ class DcGalleryRenderer
34
+
35
+ include DcApplicationHelper
36
+
37
+ ########################################################################
38
+ # Object initialization.
39
+ ########################################################################
40
+ def initialize( parent, opts={} ) #:nodoc:
41
+ @parent = parent
42
+ @opts = opts
43
+ @page = @parent.page
44
+ @css = ''
45
+ end
46
+
47
+ #########################################################################
48
+ # Default DcGallery render method. It will simply put thumbnail pictures side by side and
49
+ # open big picture when clicked on thumbnail.
50
+ #########################################################################
51
+ def default
52
+ can_view, msg = dc_user_can_view(@parent, @page)
53
+ return msg unless can_view
54
+ #
55
+ html = '<div class="picture-gallery"><ul>'
56
+ DcGallery.where(doc_id: @opts[:doc_id], active: true).order_by(order: 1).each do |picture|
57
+ html << '<li>'
58
+ html << edit_menu(picture) if @opts[:edit_mode] > 1
59
+ html << "#{@parent.link_to(i@parent.mage_tag(picture.thumbnail, title: picture.title), picture.picture)}<li>"
60
+ end
61
+ #
62
+ html << '</ul></div>'
63
+ end
64
+
65
+ #########################################################################
66
+ # Renderer dispatcher. Method returns HTML part of code.
67
+ ########################################################################
68
+ def render_html
69
+ method = @opts[:method] || 'default'
70
+ respond_to?(method) ? send(method) : "Error DcPage: Method #{method} doesn't exist!"
71
+ end
72
+
73
+ ########################################################################
74
+ # Return CSS part of code.
75
+ ########################################################################
76
+ def render_css
77
+ @css
78
+ end
79
+
80
+ private
81
+ ########################################################################
82
+ #
83
+ ########################################################################
84
+ def edit_menu(picture)
85
+ opts = { controller: 'cmsedit', action: 'edit' }
86
+ opts[:title] = "#{t('drgcms.edit')}: #{picture.title}"
87
+ opts[:id] = picture.id
88
+ opts[:table] = 'dc_gallery'
89
+
90
+ '<li>'+dc_link_for_edit(opts)+'</li>'
91
+ end
92
+
93
+
94
+ end