card-mod-edit 0.1
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 +7 -0
- data/set/all/bridge.rb +64 -0
- data/set/all/bridge/bridge.haml +8 -0
- data/set/all/bridge/bridge_pills.rb +47 -0
- data/set/all/bridge/follow_section.rb +37 -0
- data/set/all/bridge/related_section.rb +34 -0
- data/set/all/bridge/tab_views.rb +41 -0
- data/set/all/bridge/tab_visibility.rb +53 -0
- data/set/all/edit_content.rb +60 -0
- data/set/all/edit_inline.rb +56 -0
- data/set/all/edit_name.rb +58 -0
- data/set/all/edit_type.rb +101 -0
- data/set/all/editing.rb +91 -0
- data/set/all/editor.rb +56 -0
- data/set/all/form.rb +245 -0
- data/set/all/form_buttons.rb +64 -0
- data/set/all/form_elements.rb +71 -0
- data/set/all/formgroup.rb +37 -0
- data/set/all/new.rb +188 -0
- data/set/all/overlay_guide.haml +7 -0
- data/set/all/overlay_guide.rb +9 -0
- data/set/all/template_nest.rb +42 -0
- data/set/type/list.rb +15 -0
- data/set/type/plain_text.rb +13 -0
- data/set/type/pointer.rb +11 -0
- metadata +71 -0
@@ -0,0 +1,64 @@
|
|
1
|
+
format :html do
|
2
|
+
def standard_submit_button
|
3
|
+
output [standard_save_button, standard_save_and_close_button]
|
4
|
+
end
|
5
|
+
|
6
|
+
def standard_save_button opts={}
|
7
|
+
return if voo&.hide?(:save_button)
|
8
|
+
add_class opts, "submit-button btn-sm mr-3 _update-history-pills"
|
9
|
+
opts[:text] ||= "Save"
|
10
|
+
opts["data-cy"] = "save"
|
11
|
+
submit_button opts
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param opts [Hash]
|
15
|
+
# @option close [:modal, :overlay]
|
16
|
+
#
|
17
|
+
def standard_save_and_close_button opts={}
|
18
|
+
close = opts.delete(:close) || :modal
|
19
|
+
text = opts[:text] || "Save and Close"
|
20
|
+
add_class opts, "submit-button btn-sm mr-3 _close-on-success"
|
21
|
+
add_class opts, "_update-origin" unless opts[:no_origin_update]
|
22
|
+
opts.reverse_merge! text: text, "data-cy": "submit-#{close}"
|
23
|
+
|
24
|
+
submit_button opts
|
25
|
+
end
|
26
|
+
|
27
|
+
def standard_cancel_button args={}
|
28
|
+
args.reverse_merge! class: "cancel-button ml-4", href: path, "data-cy": "cancel"
|
29
|
+
cancel_button args
|
30
|
+
end
|
31
|
+
|
32
|
+
def modal_cancel_button
|
33
|
+
modal_close_button "Cancel", situation: "secondary", class: "btn-sm cancel-button"
|
34
|
+
end
|
35
|
+
|
36
|
+
def edit_cancel_button
|
37
|
+
modal_cancel_button
|
38
|
+
end
|
39
|
+
|
40
|
+
def new_cancel_button
|
41
|
+
voo.show?(:cancel_button) && modal_cancel_button
|
42
|
+
end
|
43
|
+
|
44
|
+
def delete_button opts={}
|
45
|
+
link_to "Delete", delete_button_opts(opts)
|
46
|
+
end
|
47
|
+
|
48
|
+
def delete_button_opts opts={}
|
49
|
+
add_class opts, "slotter btn btn-outline-danger ml-auto btn-sm"
|
50
|
+
opts["data-confirm"] = delete_confirm opts
|
51
|
+
opts[:path] = { action: :delete }
|
52
|
+
opts[:path][:success] = delete_success(opts) unless opts.delete(:no_success)
|
53
|
+
opts[:remote] = true
|
54
|
+
opts
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete_confirm opts
|
58
|
+
opts.delete(:confirm) || "Are you sure you want to delete #{safe_name}?"
|
59
|
+
end
|
60
|
+
|
61
|
+
def delete_success opts
|
62
|
+
opts.delete(:success) || (main? ? "REDIRECT: *previous" : { view: :just_deleted })
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
format :html do
|
2
|
+
def success_tags opts
|
3
|
+
return "" unless opts.present?
|
4
|
+
|
5
|
+
hidden_tags success: opts
|
6
|
+
end
|
7
|
+
|
8
|
+
# convert hash into a collection of hidden tags
|
9
|
+
def hidden_tags hash, base=nil
|
10
|
+
hash ||= {}
|
11
|
+
hash.inject("") do |result, (key, val)|
|
12
|
+
new_base = base ? "#{base}[#{key}]" : key
|
13
|
+
result + process_hidden_value(val, new_base)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def process_hidden_value val, base
|
18
|
+
case val
|
19
|
+
when Hash
|
20
|
+
hidden_tags val, base
|
21
|
+
when Array
|
22
|
+
base += "[]"
|
23
|
+
val.map do |v|
|
24
|
+
hidden_field_tag base, v
|
25
|
+
end.join
|
26
|
+
else
|
27
|
+
hidden_field_tag base, val
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
FIELD_HELPERS =
|
32
|
+
%w[
|
33
|
+
hidden_field color_field date_field datetime_field datetime_local_field
|
34
|
+
email_field month_field number_field password_field phone_field
|
35
|
+
range_field search_field telephone_field text_area text_field time_field
|
36
|
+
url_field week_field file_field label check_box radio_button
|
37
|
+
].freeze
|
38
|
+
|
39
|
+
FIELD_HELPERS.each do |method_name|
|
40
|
+
define_method(method_name) do |*args|
|
41
|
+
form.send(method_name, *args)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def submit_button args={}
|
46
|
+
text = args.delete(:text) || "Submit"
|
47
|
+
args.reverse_merge! situation: "primary", data: {}
|
48
|
+
args[:data][:disable_with] ||= args.delete(:disable_with) || "Submitting"
|
49
|
+
button_tag text, args
|
50
|
+
end
|
51
|
+
|
52
|
+
# redirect to *previous if no :href is given
|
53
|
+
def cancel_button args={}
|
54
|
+
return unless voo.show? :cancel_button
|
55
|
+
text = args.delete(:text) || "Cancel"
|
56
|
+
add_class args, "btn btn-#{args.delete(:situation) || 'secondary'}"
|
57
|
+
add_class args, cancel_strategy(args[:redirect], args[:href])
|
58
|
+
args[:href] ||= path_to_previous
|
59
|
+
args["data-remote"] = true
|
60
|
+
link_to text, args
|
61
|
+
end
|
62
|
+
|
63
|
+
def cancel_strategy redirect, href
|
64
|
+
redirect = href.blank? if redirect.nil?
|
65
|
+
redirect ? "redirecter" : "slotter"
|
66
|
+
end
|
67
|
+
|
68
|
+
def path_to_previous
|
69
|
+
path mark: "*previous"
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
format :html do
|
2
|
+
# a formgroup has a label, an input and help text
|
3
|
+
def formgroup title, opts={}, &block
|
4
|
+
wrap_with :div, formgroup_div_args(opts[:class]) do
|
5
|
+
formgroup_body title, opts, &block
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def formgroup_body title, opts, &block
|
10
|
+
label = formgroup_label opts[:input], title
|
11
|
+
editor_body = editor_wrap opts[:input], &block
|
12
|
+
help_text = formgroup_help_text opts[:help]
|
13
|
+
"#{label}<div>#{help_text} #{editor_body}</div>"
|
14
|
+
end
|
15
|
+
|
16
|
+
def formgroup_label input, title
|
17
|
+
return if voo&.hide?(:title) || title.blank?
|
18
|
+
|
19
|
+
label_type = input || :content
|
20
|
+
form.label label_type, title
|
21
|
+
end
|
22
|
+
|
23
|
+
def formgroup_div_args html_class
|
24
|
+
div_args = { class: ["form-group", html_class].compact.join(" ") }
|
25
|
+
div_args[:card_id] = card.id if card.real?
|
26
|
+
div_args[:card_name] = h card.name if card.name.present?
|
27
|
+
div_args
|
28
|
+
end
|
29
|
+
|
30
|
+
def formgroup_help_text text=nil
|
31
|
+
return "" if text == false
|
32
|
+
|
33
|
+
class_up "help-text", "help-block"
|
34
|
+
voo.help = text if voo && text.to_s != "true"
|
35
|
+
_render_help
|
36
|
+
end
|
37
|
+
end
|
data/set/all/new.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
format :html do
|
2
|
+
view :new, perms: :create, unknown: true, cache: :never do
|
3
|
+
new_view_frame_and_form new_form_opts
|
4
|
+
end
|
5
|
+
|
6
|
+
view :new_content_form, wrap: :slot, unknown: true, cache: :never do
|
7
|
+
with_nest_mode :edit do
|
8
|
+
create_form
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
view :new_in_modal, perms: :create, unknown: true, cache: :never,
|
13
|
+
wrap: { modal: { footer: "", size: :edit_modal_size,
|
14
|
+
title: :new_in_modal_title,
|
15
|
+
menu: :new_modal_menu } } do
|
16
|
+
_render_new_content_form
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_form
|
20
|
+
form_opts = new_in_modal_form_opts.reverse_merge(success: new_in_modal_success)
|
21
|
+
buttons = form_opts.delete(:buttons) || _render_new_buttons
|
22
|
+
|
23
|
+
voo.title ||= new_view_title if new_name_prompt?
|
24
|
+
voo.show :help
|
25
|
+
card_form(:create, form_opts) do
|
26
|
+
create_form_with_alert_guide buttons
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def new_modal_size
|
31
|
+
:large
|
32
|
+
end
|
33
|
+
|
34
|
+
def new_modal_menu
|
35
|
+
wrap_with_modal_menu do
|
36
|
+
[close_modal_window, render_bridge_link]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def new_view_frame_and_form form_opts={}
|
41
|
+
buttons = form_opts.delete(:buttons) || _render_new_buttons
|
42
|
+
form_opts = form_opts.reverse_merge(success: new_success)
|
43
|
+
|
44
|
+
with_nest_mode :edit do
|
45
|
+
voo.title ||= new_view_title if new_name_prompt?
|
46
|
+
voo.show :help
|
47
|
+
frame_and_form :create, form_opts do
|
48
|
+
create_form_with_alert_guide buttons
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_form_with_alert_guide buttons
|
54
|
+
wrap_with :div, class: "d-flex justify-content-between" do
|
55
|
+
[(wrap_with(:div, class: "w-100") do
|
56
|
+
[
|
57
|
+
new_view_hidden,
|
58
|
+
new_view_name,
|
59
|
+
new_view_type,
|
60
|
+
_render_content_formgroups,
|
61
|
+
buttons
|
62
|
+
]
|
63
|
+
end),
|
64
|
+
(alert_guide if voo.show?(:guide))]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def new_view_hidden; end
|
69
|
+
|
70
|
+
def new_in_modal_form_opts
|
71
|
+
{ "data-slot-selector": "modal-origin", "data-slot-error-selector": ".card-slot",
|
72
|
+
buttons: _render_new_in_modal_buttons }
|
73
|
+
end
|
74
|
+
|
75
|
+
def new_form_opts
|
76
|
+
{ "main-success" => "REDIRECT" }
|
77
|
+
end
|
78
|
+
|
79
|
+
def new_view_title
|
80
|
+
output(
|
81
|
+
"New",
|
82
|
+
(card.type_name unless card.type_id == Card.default_type_id)
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
def new_in_modal_title
|
87
|
+
new_name_prompt? ? new_view_title : render_title
|
88
|
+
end
|
89
|
+
|
90
|
+
def new_success
|
91
|
+
card.rule(:thanks) || "_self"
|
92
|
+
end
|
93
|
+
|
94
|
+
def new_in_modal_success; end
|
95
|
+
|
96
|
+
# NAME HANDLING
|
97
|
+
|
98
|
+
def new_view_name
|
99
|
+
if new_name_prompt?
|
100
|
+
new_name_formgroup
|
101
|
+
elsif !autoname?
|
102
|
+
hidden_field_tag "card[name]", card.name
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def new_name_formgroup
|
107
|
+
output _render_name_formgroup,
|
108
|
+
hidden_field_tag("name_prompt", true)
|
109
|
+
end
|
110
|
+
|
111
|
+
def new_name_prompt?
|
112
|
+
voo.visible? :name_formgroup do
|
113
|
+
needs_name? || params[:name_prompt]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def autoname?
|
118
|
+
@autoname.nil? ? (@autoname = card.rule_card :autoname).present? : @autoname
|
119
|
+
end
|
120
|
+
|
121
|
+
def needs_name?
|
122
|
+
card.name.blank? && !autoname?
|
123
|
+
end
|
124
|
+
|
125
|
+
# TYPE HANDLING
|
126
|
+
|
127
|
+
def new_view_type
|
128
|
+
if new_type_prompt?
|
129
|
+
_render_new_type_formgroup
|
130
|
+
else
|
131
|
+
hidden_field_tag "card[type_id]", card.type_id
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def new_type_prompt?
|
136
|
+
voo.visible? :new_type_formgroup do
|
137
|
+
!new_type_preset? && new_type_prompt_context? && new_type_permitted?
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def new_type_preset?
|
142
|
+
params[:type] || voo.type
|
143
|
+
end
|
144
|
+
|
145
|
+
def new_type_prompt_context?
|
146
|
+
main? || card.simple? || card.is_template?
|
147
|
+
end
|
148
|
+
|
149
|
+
def new_type_permitted?
|
150
|
+
Card.new(type_id: card.type_id).ok? :create
|
151
|
+
end
|
152
|
+
|
153
|
+
view :new_type_formgroup do
|
154
|
+
wrap_type_formgroup do
|
155
|
+
type_field class: "type-field live-type-field",
|
156
|
+
href: path(view: :new),
|
157
|
+
"data-remote" => true
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
view :new_buttons do
|
162
|
+
button_formgroup do
|
163
|
+
[standard_create_button, standard_cancel_button(cancel_button_new_args)]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
view :new_in_modal_buttons do
|
168
|
+
button_formgroup do
|
169
|
+
wrap_with "div", class: "d-flex" do
|
170
|
+
[standard_save_and_close_button(text: "Submit"), modal_cancel_button]
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# path to redirect to after canceling a new form
|
176
|
+
def cancel_button_new_args
|
177
|
+
href = case
|
178
|
+
when main? then path_to_previous
|
179
|
+
when voo&.home_view then path(view: voo.home_view)
|
180
|
+
else path(view: :unknown)
|
181
|
+
end
|
182
|
+
{ href: href }
|
183
|
+
end
|
184
|
+
|
185
|
+
def standard_create_button
|
186
|
+
submit_button class: "submit-button create-submit-button"
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
format :html do
|
2
|
+
view :overlay_guide,
|
3
|
+
cache: :never, unknown: true, template: :haml,
|
4
|
+
wrap: { slot: { class: "_overlay d0-card-overlay card nodblclick" } } do
|
5
|
+
# TODO: use a common template for this and the nest editor
|
6
|
+
# (the common thing is that they both are an overlay of the bridge sidebar)
|
7
|
+
# and maybe make it look more like the overlay on the left with the same close icon
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
format do
|
2
|
+
view :template_nest, cache: :never, unknown: true do
|
3
|
+
return "" unless voo.nest_name
|
4
|
+
|
5
|
+
if voo.nest_name.to_name.field_only?
|
6
|
+
with_nest_mode :normal do
|
7
|
+
nest template_link_set_name, view: :template_link
|
8
|
+
end
|
9
|
+
else
|
10
|
+
"{{#{voo.nest_syntax}}}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def template_link_set_name
|
15
|
+
name = voo.nest_name.to_name
|
16
|
+
if name.absolute?
|
17
|
+
name.trait_name :self
|
18
|
+
else
|
19
|
+
template_link_set_name_for_relative_name name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def template_link_set_name_for_relative_name name
|
24
|
+
name = name.stripped.gsub(/^\+/, "")
|
25
|
+
|
26
|
+
if (type = on_type_set)
|
27
|
+
[type, name].to_name.trait_name :type_plus_right
|
28
|
+
else
|
29
|
+
name.to_name.trait_name :right
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_type_set
|
34
|
+
return unless
|
35
|
+
(tmpl_set_name = parent.card.name.trunk_name) &&
|
36
|
+
(tmpl_set_class_name = tmpl_set_name.tag_name) &&
|
37
|
+
(tmpl_set_class_card = Card[tmpl_set_class_name]) &&
|
38
|
+
(tmpl_set_class_card.codename == :type)
|
39
|
+
|
40
|
+
tmpl_set_name.left_name
|
41
|
+
end
|
42
|
+
end
|
data/set/type/list.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
def input_type_content_options
|
2
|
+
["multiselect", "checkbox", "autocompleted list", "filtered list"]
|
3
|
+
end
|
4
|
+
|
5
|
+
def show_content_options?
|
6
|
+
true
|
7
|
+
end
|
8
|
+
|
9
|
+
def show_input_type?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def field_settings
|
14
|
+
%i[default help input_type content_options content_option_view]
|
15
|
+
end
|