card 1.18.3 → 1.18.4
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/VERSION +1 -1
- data/card.gemspec +5 -3
- data/db/schema.rb +1 -1
- data/lib/card/active_record_helper.rb +2 -1
- data/lib/card/core_ext.rb +8 -0
- data/lib/card/format/nest.rb +13 -2
- data/lib/card/format/render.rb +7 -1
- data/lib/card/migration.rb +2 -1
- data/lib/card/set.rb +55 -70
- data/lib/card/set/trait.rb +70 -0
- data/lib/card/stage.rb +33 -8
- data/lib/card/stage_director.rb +3 -1
- data/lib/cardio.rb +2 -1
- data/mod/01_core/chunk/link.rb +7 -6
- data/mod/01_core/set/all/collection.rb +15 -52
- data/mod/01_core/set/all/fetch.rb +26 -6
- data/mod/01_core/set/all/references.rb +11 -3
- data/mod/01_core/set/all/subcards.rb +2 -2
- data/mod/01_core/set/all/tracked_attributes.rb +5 -1
- data/mod/01_core/set/all/utils.rb +1 -1
- data/mod/01_core/spec/set/all/collection_spec.rb +2 -2
- data/mod/01_history/set/all/content_history.rb +10 -11
- data/mod/02_basic_types/set/abstract/code_file.rb +57 -0
- data/mod/02_basic_types/set/type/pointer.rb +9 -5
- data/mod/03_machines/lib/javascript/wagn.js.coffee +4 -1
- data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +29 -24
- data/mod/03_machines/set/self/script_ace.rb +1 -11
- data/mod/03_machines/set/self/script_card_menu.rb +1 -10
- data/mod/03_machines/set/self/script_html5shiv_printshiv.rb +1 -2
- data/mod/03_machines/set/self/script_jquery.rb +1 -2
- data/mod/03_machines/set/self/script_jquery_helper.rb +4 -7
- data/mod/03_machines/set/self/script_slot.rb +4 -6
- data/mod/03_machines/set/self/script_tinymce.rb +1 -2
- data/mod/03_machines/set/self/style_bootstrap_compatible.rb +1 -5
- data/mod/03_machines/set/self/style_cards.rb +1 -6
- data/mod/03_machines/set/self/style_jquery_ui_smoothness.rb +1 -2
- data/mod/03_machines/set/type/coffee_script.rb +1 -1
- data/mod/03_machines/set/type/css.rb +10 -1
- data/mod/03_machines/set/type/java_script.rb +16 -1
- data/mod/03_machines/set/type/scss.rb +3 -2
- data/mod/05_standard/lib/image_uploader.rb +15 -0
- data/mod/05_standard/set/all/rich_html/editing.rb +2 -2
- data/mod/05_standard/set/all/rich_html/form.rb +40 -19
- data/mod/05_standard/set/all/rich_html/modal.rb +4 -2
- data/mod/05_standard/set/all/rich_html/toolbar.rb +88 -39
- data/mod/05_standard/set/type/search_type.rb +6 -3
- data/mod/06_bootstrap/set/all/bootstrap/table.rb +55 -0
- data/mod/06_bootstrap/set/all/bootstrap/tabs.rb +81 -0
- data/mod/06_bootstrap/set/self/bootstrap_cards.rb +1 -9
- data/mod/06_bootstrap/set/self/bootstrap_js.rb +4 -6
- data/mod/06_bootstrap/set/self/bootswatch_shared.rb +11 -3
- data/mod/06_bootstrap/set/self/smartmenu_css.rb +3 -5
- data/mod/06_bootstrap/set/self/smartmenu_js.rb +3 -5
- data/spec/lib/card/set/trait_spec.rb +62 -0
- metadata +24 -3
@@ -1,11 +1 @@
|
|
1
|
-
|
2
|
-
view :raw do |_args|
|
3
|
-
Rails.logger.info "reading file: #{Cardio.gem_root}/mod/03_machines/lib/javascript/#{card.codename}.js"
|
4
|
-
File.read "#{Cardio.gem_root}/mod/03_machines/lib/javascript/#{card.codename}.js"
|
5
|
-
end
|
6
|
-
|
7
|
-
format :html do
|
8
|
-
view :editor do |_args|
|
9
|
-
"Content is stored in file and can't be edited."
|
10
|
-
end
|
11
|
-
end
|
1
|
+
include_set Abstract::CodeFile
|
@@ -1,10 +1 @@
|
|
1
|
-
|
2
|
-
Rails.logger.info "reading file: #{Cardio.gem_root}/mod/03_machines/lib/javascript/#{card.codename}.js.coffee"
|
3
|
-
File.read "#{Cardio.gem_root}/mod/03_machines/lib/javascript/#{card.codename}.js.coffee"
|
4
|
-
end
|
5
|
-
|
6
|
-
format :html do
|
7
|
-
view :editor do |_args|
|
8
|
-
"Content is stored in file and can't be edited."
|
9
|
-
end
|
10
|
-
end
|
1
|
+
include_set Abstract::CodeFile
|
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
format(:html) { include ScriptAce::HtmlFormat }
|
1
|
+
include_set Abstract::CodeFile
|
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
format(:html) { include ScriptAce::HtmlFormat }
|
1
|
+
include_set Abstract::CodeFile
|
@@ -1,12 +1,9 @@
|
|
1
|
+
include_set Abstract::CodeFile
|
1
2
|
|
2
|
-
|
3
|
+
def source_files
|
3
4
|
# jquery.ui.all must be after jquery.mobile to override dialog weirdness *
|
4
5
|
# jquery.ui.autocomplete must be after jquery.ui stuff
|
5
6
|
# FIXME removed jquerymobile.js. Doesn't work with the new jquery version
|
6
|
-
|
7
|
-
|
8
|
-
File.read "#{Cardio.gem_root}/mod/03_machines/lib/javascript/#{filename}"
|
9
|
-
end.join("\n")
|
7
|
+
%w( jquery-ui.js jquery.ui.autocomplete.html.js jquery.autosize.js
|
8
|
+
jquery.fileupload.js jquery.iframe-transport.js jquery_ujs.js )
|
10
9
|
end
|
11
|
-
|
12
|
-
format(:html) { include ScriptAce::HtmlFormat }
|
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
['wagn_mod.js.coffee', 'wagn.js.coffee'].map do |name|
|
3
|
-
File.read "#{Cardio.gem_root}/mod/03_machines/lib/javascript/#{name}"
|
4
|
-
end.join("\n")
|
5
|
-
end
|
1
|
+
include_set Abstract::CodeFile
|
6
2
|
|
7
|
-
|
3
|
+
def source_files
|
4
|
+
%w( wagn_mod.js.coffee wagn.js.coffee )
|
5
|
+
end
|
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
format(:html) { include ScriptAce::HtmlFormat }
|
1
|
+
include_set Abstract::CodeFile
|
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
format(:html) { include ScriptAce::HtmlFormat }
|
1
|
+
include_set Abstract::CodeFile
|
@@ -12,7 +12,16 @@ end
|
|
12
12
|
def compress_css input
|
13
13
|
Sass.compile input, style: :compressed
|
14
14
|
rescue => e
|
15
|
-
|
15
|
+
# scss is compiled in a view
|
16
|
+
# If there is a scss syntax error we get the rescued view here
|
17
|
+
# and the error that the rescued view is no valid css
|
18
|
+
# To get the original error we have to refer to Card::Error.current
|
19
|
+
msg = if Card::Error.current
|
20
|
+
Card::Error.current.message
|
21
|
+
else
|
22
|
+
"Sass::SyntaxError (#{name}): #{e.message}"
|
23
|
+
end
|
24
|
+
raise Card::Error, msg
|
16
25
|
end
|
17
26
|
|
18
27
|
def clean_html?
|
@@ -7,7 +7,22 @@ include MachineInput
|
|
7
7
|
store_machine_output filetype: 'js'
|
8
8
|
|
9
9
|
machine_input do
|
10
|
-
|
10
|
+
compress_js format(:js)._render_core
|
11
|
+
end
|
12
|
+
|
13
|
+
def compress_js input
|
14
|
+
Uglifier.compile(input)
|
15
|
+
rescue => e
|
16
|
+
# CoffeeScript is compiled in a view
|
17
|
+
# If there is a CoffeeScript syntax error we get the rescued view here
|
18
|
+
# and the error that the rescued view is no valid Javascript
|
19
|
+
# To get the original error we have to refer to Card::Error.current
|
20
|
+
msg = if Card::Error.current
|
21
|
+
Card::Error.current.message
|
22
|
+
else
|
23
|
+
"CoffeeScript::SyntaxError (#{name}): #{e.message}"
|
24
|
+
end
|
25
|
+
raise Card::Error, msg
|
11
26
|
end
|
12
27
|
|
13
28
|
def clean_html?
|
@@ -20,6 +20,21 @@ class ImageUploader < FileUploader
|
|
20
20
|
process resize_to_fit: [500, 500]
|
21
21
|
end
|
22
22
|
|
23
|
+
# version :small_square, if: :create_versions?,
|
24
|
+
# from_version: :medium_square do
|
25
|
+
# process resize_to_fill: [75, 75]
|
26
|
+
# end
|
27
|
+
# version :medium_square, if: :create_versions? do
|
28
|
+
# process resize_to_fill: [200, 200]
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# In case we decide to support the squared versions
|
32
|
+
# we have to update all existing images with the following snippet:
|
33
|
+
# Card.search(type_id: Card::ImageID) do |card|
|
34
|
+
# card.image.cache_stored_file!
|
35
|
+
# card.image.recreate_versions!
|
36
|
+
# end
|
37
|
+
|
23
38
|
def identifier
|
24
39
|
full_filename(super())
|
25
40
|
end
|
@@ -73,7 +73,7 @@ format :html do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
view :edit, perms: :update, tags: :unknown_ok do |args|
|
76
|
-
frame_and_form :update, args.
|
76
|
+
frame_and_form :update, args.reverse_merge(optional_toolbar: :show) do
|
77
77
|
[
|
78
78
|
_optional_render(:content_formgroup, args),
|
79
79
|
_optional_render(:button_formgroup, args)
|
@@ -214,7 +214,7 @@ format :html do
|
|
214
214
|
view :edit_nests do |args|
|
215
215
|
frame args do
|
216
216
|
with_nest_mode :edit do
|
217
|
-
|
217
|
+
process_nested_fields optional_toolbar: :hide
|
218
218
|
end
|
219
219
|
end
|
220
220
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
format :html do
|
2
2
|
def edit_slot args={}
|
3
3
|
# note: @mode should already be :edit here...
|
4
|
-
if args[:structure] || card.structure
|
4
|
+
if args[:structure] || card.structure ||
|
5
|
+
args[:edit_fields]
|
5
6
|
multi_card_edit_slot args
|
6
7
|
else
|
7
8
|
single_card_edit_slot args
|
@@ -11,8 +12,10 @@ format :html do
|
|
11
12
|
def multi_card_edit_slot args
|
12
13
|
if args[:core_edit] # need better name
|
13
14
|
_render_core args
|
15
|
+
elsif args[:edit_fields]
|
16
|
+
process_edit_fields args[:edit_fields]
|
14
17
|
else
|
15
|
-
|
18
|
+
process_nested_fields optional_toolbar: :hide,
|
16
19
|
structure: args[:structure]
|
17
20
|
end
|
18
21
|
end
|
@@ -28,6 +31,28 @@ format :html do
|
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
34
|
+
def process_nested_fields args
|
35
|
+
nested_fields(args).map do |chunk|
|
36
|
+
nested_card = fetch_nested_card chunk.options
|
37
|
+
nest nested_card, chunk.options.reverse_merge(args)
|
38
|
+
end.join "\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
# @param [Hash|Array] fields either an array with field names and/or field
|
42
|
+
# cards or a hash with the fields as keys and a hash with nest options as
|
43
|
+
# values
|
44
|
+
def process_edit_fields fields
|
45
|
+
fields.map do |field, opts|
|
46
|
+
nested_card =
|
47
|
+
if field.is_a?(Card)
|
48
|
+
field
|
49
|
+
else
|
50
|
+
fetch_nested_card inc_name: field
|
51
|
+
end
|
52
|
+
nest nested_card, opts
|
53
|
+
end.join "\n"
|
54
|
+
end
|
55
|
+
|
31
56
|
def form_for_multi
|
32
57
|
instantiate_builder("card#{subcard_input_names}", card, {})
|
33
58
|
end
|
@@ -99,7 +124,7 @@ format :html do
|
|
99
124
|
def formgroup title, content, opts={}
|
100
125
|
wrap_with :div, formgroup_div_args(opts[:class]) do
|
101
126
|
%(
|
102
|
-
|
127
|
+
#{form.label(opts[:editor] || :content, title)}
|
103
128
|
<div>
|
104
129
|
#{editor_wrap(opts[:editor]) { content }}
|
105
130
|
#{formgroup_help_text opts[:help]}
|
@@ -127,12 +152,13 @@ format :html do
|
|
127
152
|
result = ''
|
128
153
|
hash ||= {}
|
129
154
|
hash.each do |key, val|
|
130
|
-
result +=
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
155
|
+
result +=
|
156
|
+
if val.is_a?(Hash)
|
157
|
+
hidden_tags val, key
|
158
|
+
else
|
159
|
+
name = base ? "#{base}[#{key}]" : key
|
160
|
+
hidden_field_tag name, val
|
161
|
+
end
|
136
162
|
end
|
137
163
|
result
|
138
164
|
end
|
@@ -140,15 +166,17 @@ format :html do
|
|
140
166
|
# FIELDSET VIEWS
|
141
167
|
|
142
168
|
view :name_formgroup do |args|
|
143
|
-
formgroup 'name', raw(name_field
|
169
|
+
formgroup 'name', raw(name_field(form)),
|
170
|
+
editor: 'name', help: args[:help]
|
144
171
|
end
|
145
172
|
|
146
173
|
view :type_formgroup do |args|
|
147
174
|
field = if args[:variety] == :edit # FIXME: dislike this api -ef
|
148
175
|
type_field class: 'type-field edit-type-field'
|
149
176
|
else
|
150
|
-
type_field class: 'type-field live-type-field',
|
151
|
-
|
177
|
+
type_field class: 'type-field live-type-field',
|
178
|
+
href: path(view: :new), 'data-remote' => true
|
179
|
+
end
|
152
180
|
formgroup 'type', field, editor: 'type', class: 'type-formgroup'
|
153
181
|
end
|
154
182
|
|
@@ -224,13 +252,6 @@ format :html do
|
|
224
252
|
formgroup fancy_title(args[:title]), content, opts
|
225
253
|
end
|
226
254
|
|
227
|
-
def process_relative_tags args
|
228
|
-
nested_fields(args).map do |chunk|
|
229
|
-
nested_card = fetch_nested_card chunk.options
|
230
|
-
nest nested_card, chunk.options.reverse_merge(args)
|
231
|
-
end.join "\n"
|
232
|
-
end
|
233
|
-
|
234
255
|
# form helpers
|
235
256
|
|
236
257
|
FIELD_HELPERS =
|
@@ -8,10 +8,12 @@ format :html do
|
|
8
8
|
link_to(args[:text] || _render_title(args), path(path_opts), html_args)
|
9
9
|
end
|
10
10
|
|
11
|
-
view :modal_slot do |args|
|
11
|
+
view :modal_slot, tags: :unknown_ok do |args|
|
12
12
|
id = "modal-#{args[:modal_id] || 'main-slot'}"
|
13
|
+
dialog_args = { class: 'modal-dialog' }
|
14
|
+
add_class dialog_args, args[:dialog_class]
|
13
15
|
wrap_with(:div, class: 'modal fade', role: 'dialog', id: id) do
|
14
|
-
wrap_with(:div,
|
16
|
+
wrap_with(:div, dialog_args) do
|
15
17
|
content_tag :div, class: 'modal-content' do
|
16
18
|
''
|
17
19
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
-
|
2
1
|
format :html do
|
3
2
|
def toolbar_pinned?
|
4
3
|
(tp = Card[:toolbar_pinned]) && tp.content == 'true'
|
5
4
|
end
|
6
5
|
|
7
6
|
view :toolbar do |args|
|
8
|
-
|
9
|
-
|
7
|
+
collapsed = close_link(args.merge(class: 'pull-right visible-xs'))
|
8
|
+
navbar "toolbar-#{card.cardname.safe_key}-#{args[:home_view]}",
|
9
|
+
toggle_align: :left, class: 'slotter toolbar',
|
10
|
+
navbar_type: 'inverse',
|
11
|
+
collapsed_content: collapsed do
|
10
12
|
[
|
11
13
|
close_link(args.merge(class: 'hidden-xs navbar-right')),
|
12
14
|
(wrap_with(:form, class: 'navbar-form navbar-left') do
|
@@ -25,6 +27,7 @@ format :html do
|
|
25
27
|
]
|
26
28
|
end
|
27
29
|
end
|
30
|
+
|
28
31
|
def default_toolbar_args args
|
29
32
|
args[:nested_fields] = nested_fields(args)
|
30
33
|
args[:active_toolbar_button] ||= active_toolbar_button @slot_view, args
|
@@ -54,11 +57,18 @@ format :html do
|
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
60
|
+
TOOLBAR_TITLE = {
|
61
|
+
edit: 'content', edit_name: 'name', edit_type: 'type',
|
62
|
+
edit_structure: 'structure', edit_nests: 'nests', history: 'history',
|
63
|
+
common_rules: 'common', recent_rules: 'recent', grouped_rules: 'all',
|
64
|
+
edit_nest_rules: 'nests'
|
65
|
+
}.freeze
|
66
|
+
|
57
67
|
def toolbar_view_title view
|
58
68
|
if view == :edit_rules
|
59
69
|
current_set_card.name
|
60
70
|
else
|
61
|
-
|
71
|
+
TOOLBAR_TITLE[view]
|
62
72
|
end
|
63
73
|
end
|
64
74
|
|
@@ -76,11 +86,16 @@ format :html do
|
|
76
86
|
end
|
77
87
|
|
78
88
|
def rules_split_button args
|
79
|
-
recent = smart_link 'recent', view: :edit_rules,
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
89
|
+
recent = smart_link 'recent', view: :edit_rules,
|
90
|
+
slot: { rule_view: :recent_rules }
|
91
|
+
common = smart_link 'common', view: :edit_rules,
|
92
|
+
slot: { rule_view: :common_rules }
|
93
|
+
group = smart_link 'by group', view: :edit_rules,
|
94
|
+
slot: { rule_view: :grouped_rules }
|
95
|
+
all = smart_link 'by name', view: :edit_rules,
|
96
|
+
slot: { rule_view: :all_rules }
|
97
|
+
nests = smart_link 'nests', view: :edit_nest_rules,
|
98
|
+
slot: { rule_view: :field_related_rules }
|
84
99
|
toolbar_split_button 'rules', { view: :edit_rules }, args do
|
85
100
|
{
|
86
101
|
common_rules: common,
|
@@ -97,19 +112,27 @@ format :html do
|
|
97
112
|
toolbar_split_button 'edit', { view: :edit }, args do
|
98
113
|
{
|
99
114
|
edit: _render_edit_content_link(args),
|
100
|
-
edit_nests: (_render_edit_nests_link if
|
101
|
-
structure: (
|
115
|
+
edit_nests: (_render_edit_nests_link if nests_editable?(args)),
|
116
|
+
structure: (_render_edit_structure_link if structure_editable?),
|
102
117
|
edit_name: _render_edit_name_link,
|
103
118
|
edit_type: _render_edit_type_link
|
104
119
|
}
|
105
120
|
end
|
106
121
|
end
|
107
122
|
|
123
|
+
def nests_editable? args
|
124
|
+
!card.structure && args[:nested_fields].present?
|
125
|
+
end
|
126
|
+
|
108
127
|
def account_split_button args
|
109
128
|
toolbar_split_button 'account', { related: Card[:account].key }, args do
|
110
129
|
{
|
111
|
-
account: smart_link('details',
|
112
|
-
|
130
|
+
account: smart_link('details',
|
131
|
+
related: {
|
132
|
+
name: "#{card.name}+#{Card[:account].key}",
|
133
|
+
view: :edit }
|
134
|
+
),
|
135
|
+
roles: smart_link('roles', related: Card[:roles].key),
|
113
136
|
created: smart_link('created', related: Card[:created].key),
|
114
137
|
edited: smart_link('edited', related: Card[:edited].key),
|
115
138
|
follow: smart_link('follow', related: Card[:follow].key)
|
@@ -118,12 +141,15 @@ format :html do
|
|
118
141
|
end
|
119
142
|
|
120
143
|
def toolbar_split_button name, button_args, args
|
121
|
-
button =
|
144
|
+
button =
|
145
|
+
button_link name, button_args,
|
146
|
+
class: ('active' if args[:active_toolbar_button] == name)
|
122
147
|
active_item =
|
123
148
|
if @slot_view == :related
|
124
149
|
if args[:rule_view]
|
125
150
|
args[:rule_view].to_sym
|
126
|
-
elsif args[:related_card] && (r = args[:related_card].right) &&
|
151
|
+
elsif args[:related_card] && (r = args[:related_card].right) &&
|
152
|
+
(cn = r.codename)
|
127
153
|
cn.to_sym
|
128
154
|
end
|
129
155
|
else
|
@@ -135,10 +161,10 @@ format :html do
|
|
135
161
|
end
|
136
162
|
|
137
163
|
def close_link args
|
138
|
-
link_opts = { title: 'cancel'
|
164
|
+
link_opts = { title: 'cancel',
|
165
|
+
class: 'btn-toolbar-control btn btn-primary' }
|
139
166
|
link_opts[:path_opts] = { slot: { subframe: true } } if args[:subslot]
|
140
|
-
|
141
|
-
link = view_link glyphicon('remove'), :home, link_opts.merge(class: 'btn-toolbar-control btn btn-primary')
|
167
|
+
link = view_link glyphicon('remove'), :home, link_opts
|
142
168
|
css_class = ['nav navbar-nav', args[:class]].compact.join "\n"
|
143
169
|
wrap_with :div, class: css_class do
|
144
170
|
[
|
@@ -146,17 +172,21 @@ format :html do
|
|
146
172
|
link
|
147
173
|
]
|
148
174
|
end
|
149
|
-
# list_tag link, class: css_class
|
150
175
|
end
|
151
176
|
|
152
177
|
def toolbar_pin_button
|
153
|
-
button_tag glyphicon('pushpin'),
|
178
|
+
button_tag glyphicon('pushpin'),
|
179
|
+
situation: :primary, remote: true,
|
180
|
+
title: "#{'un' if toolbar_pinned?}pin",
|
181
|
+
class: 'btn-toolbar-control toolbar-pin ' \
|
182
|
+
"#{'in' unless toolbar_pinned?}active"
|
154
183
|
end
|
155
184
|
|
156
185
|
view :toolbar_buttons do |args|
|
186
|
+
show_or_hide_delete = card.ok?(:delete) ? :show : :hide
|
157
187
|
wrap_with(:div, class: 'btn-group') do
|
158
188
|
[
|
159
|
-
_optional_render(:delete_button, args,
|
189
|
+
_optional_render(:delete_button, args, show_or_hide_delete),
|
160
190
|
_optional_render(:refresh_button, args, :show),
|
161
191
|
_optional_render(:related_button, args, :show),
|
162
192
|
_optional_render(:history_button, args, :hide)
|
@@ -166,52 +196,63 @@ format :html do
|
|
166
196
|
|
167
197
|
view :related_button do |_args|
|
168
198
|
path_opts = { slot: { show: :toolbar } }
|
169
|
-
dropdown_button '', icon: 'education', class: 'related' do
|
199
|
+
dropdown_button '', icon: 'education', class: 'related' do
|
170
200
|
[
|
171
|
-
menu_item(' children', 'baby-formula',
|
172
|
-
|
173
|
-
menu_item('
|
174
|
-
|
201
|
+
menu_item(' children', 'baby-formula',
|
202
|
+
path_opts.merge(related: '*children')),
|
203
|
+
menu_item(' mates', 'bed',
|
204
|
+
path_opts.merge(related: '*mates')),
|
205
|
+
menu_item(' references out', 'log-out',
|
206
|
+
path_opts.merge(related: '*refers_to')),
|
207
|
+
menu_item(' references in', 'log-in',
|
208
|
+
path_opts.merge(related: '*referred_to_by'))
|
175
209
|
]
|
176
210
|
end
|
177
211
|
end
|
178
212
|
view :refresh_button do |_args|
|
179
213
|
path_opts = { slot: { show: :toolbar }, page: card }
|
180
214
|
icon = main? ? 'refresh' : 'new-window'
|
181
|
-
toolbar_button
|
215
|
+
toolbar_button 'refresh', icon, 'hidden-xs hidden-sm hidden-md hidden-lg',
|
216
|
+
path_opts: path_opts
|
182
217
|
end
|
183
218
|
|
184
219
|
view :delete_button do |_args|
|
185
|
-
toolbar_button(
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
220
|
+
toolbar_button(
|
221
|
+
'delete', 'trash', 'hidden-xs hidden-sm hidden-md hidden-lg',
|
222
|
+
action: :delete,
|
223
|
+
class: 'slotter',
|
224
|
+
remote: true,
|
225
|
+
path_opts: {
|
226
|
+
success: main? ? 'REDIRECT: *previous' : "TEXT: #{card.name} deleted"
|
227
|
+
},
|
228
|
+
:'data-confirm' => "Are you sure you want to delete #{card.name}?"
|
229
|
+
)
|
192
230
|
end
|
193
231
|
|
194
232
|
def toolbar_button text, symbol, hide=nil, tag_args={}
|
195
233
|
hide ||= 'hidden-xs hidden-sm hidden-md hidden-lg'
|
196
234
|
tag_args[:class] = [tag_args[:class], 'btn btn-primary'].compact * ' '
|
197
235
|
tag_args[:title] ||= text
|
198
|
-
link_text =
|
236
|
+
link_text =
|
237
|
+
glyphicon(symbol) +
|
238
|
+
content_tag(:span, text.html_safe, class: "menu-item-label #{hide}")
|
199
239
|
|
200
|
-
if cardname = tag_args.delete(:page)
|
240
|
+
if (cardname = tag_args.delete(:page))
|
201
241
|
card_link cardname, class: klass, text: link_text
|
202
|
-
elsif viewname = tag_args.delete(:view)
|
242
|
+
elsif (viewname = tag_args.delete(:view))
|
203
243
|
tag_args[:path_opts] ||= { slot: { show: :toolbar } }
|
204
244
|
view_link link_text, viewname, tag_args
|
205
245
|
else
|
206
246
|
path_opts = tag_args.delete(:path_opts) || {}
|
207
247
|
path_opts[:action] = tag_args.delete(:action) if tag_args[:action]
|
208
248
|
link_to link_text, path_opts, tag_args
|
209
|
-
|
210
249
|
end
|
211
250
|
end
|
212
251
|
|
213
252
|
def autosaved_draft_link
|
214
|
-
view_link
|
253
|
+
view_link 'autosaved draft', :edit,
|
254
|
+
path_opts: { edit_draft: true, slot: { show: :toolbar } },
|
255
|
+
class: 'navbar-link slotter pull-right'
|
215
256
|
end
|
216
257
|
|
217
258
|
def default_edit_content_link_args args
|
@@ -220,24 +261,32 @@ format :html do
|
|
220
261
|
view :edit_content_link do |args|
|
221
262
|
toolbar_view_link :edit, args
|
222
263
|
end
|
264
|
+
|
223
265
|
def default_edit_name_link_args args
|
224
266
|
args[:title] ||= 'name'
|
225
267
|
end
|
226
268
|
view :edit_name_link do |args|
|
227
269
|
toolbar_view_link :edit_name, args
|
228
270
|
end
|
271
|
+
|
229
272
|
def default_edit_type_link_args args
|
230
273
|
args[:title] ||= 'type'
|
231
274
|
end
|
232
275
|
view :edit_type_link do |args|
|
233
276
|
toolbar_view_link :edit_type, args
|
234
277
|
end
|
278
|
+
|
279
|
+
view :edit_structure_link do |_args|
|
280
|
+
smart_link 'structure', view: :edit_structure
|
281
|
+
end
|
282
|
+
|
235
283
|
def default_history_link_args args
|
236
284
|
args[:title] ||= 'history'
|
237
285
|
end
|
238
286
|
view :history_link do |args|
|
239
287
|
toolbar_view_link :history, args
|
240
288
|
end
|
289
|
+
|
241
290
|
def default_edit_nests_link_args args
|
242
291
|
args[:title] ||= 'nests'
|
243
292
|
end
|