sibu 0.9.0 → 1.0.0
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/app/assets/javascripts/sibu/sibu.js.erb +17 -3
- data/app/assets/javascripts/tabs/van11y-accessible-tab-panel-aria.js +122 -124
- data/app/assets/javascripts/tarteaucitron/advertising.js +1 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.cs.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.de.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.el.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.en.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.es.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.fr.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.it.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.nl.js +75 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.pl.js +76 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.pt.js +73 -0
- data/app/assets/javascripts/tarteaucitron/lang/tarteaucitron.ru.js +75 -0
- data/app/assets/javascripts/tarteaucitron/tarteaucitron.js.erb +1480 -0
- data/app/assets/javascripts/tarteaucitron/tarteaucitron.services.js +2627 -0
- data/app/assets/stylesheets/sibu/defaults.scss +118 -61
- data/app/assets/stylesheets/sibu/sibu.css +8 -0
- data/app/assets/stylesheets/tarteaucitron/tarteaucitron.css +749 -0
- data/app/controllers/sibu/application_controller.rb +8 -0
- data/app/controllers/sibu/pages_controller.rb +4 -3
- data/app/controllers/sibu/sites_controller.rb +4 -0
- data/app/helpers/sibu/pages_helper.rb +89 -25
- data/app/models/sibu/page.rb +3 -3
- data/app/models/sibu/site.rb +15 -1
- data/app/models/sibu/site_template.rb +4 -1
- data/app/views/layouts/sibu/edit_content.html.erb +176 -119
- data/app/views/layouts/sibu/site.html.erb +42 -6
- data/app/views/sibu/images/edit.js.erb +5 -3
- data/app/views/sibu/pages/_code_edit_panel.html.erb +2 -2
- data/app/views/sibu/pages/_link_edit_panel.html.erb +6 -6
- data/app/views/sibu/pages/_map_edit_panel.html.erb +2 -2
- data/app/views/sibu/pages/_media_edit_panel.html.erb +6 -6
- data/app/views/sibu/pages/_new_section_panel.html.erb +1 -1
- data/app/views/sibu/pages/_paragraph_edit_panel.html.erb +2 -2
- data/app/views/sibu/pages/_text_edit_panel.html.erb +2 -2
- data/app/views/sibu/pages/child_element.js.erb +2 -2
- data/app/views/sibu/pages/clone_element.js.erb +2 -2
- data/app/views/sibu/pages/create_section.js.erb +1 -1
- data/app/views/sibu/pages/delete_element.js.erb +1 -1
- data/app/views/sibu/pages/delete_section.js.erb +1 -1
- data/app/views/sibu/pages/edit_element.js.erb +68 -66
- data/app/views/sibu/pages/edit_section.js.erb +6 -5
- data/app/views/sibu/pages/index.html.erb +1 -1
- data/app/views/sibu/pages/new_section.js.erb +22 -13
- data/app/views/sibu/pages/update_element.js.erb +2 -2
- data/app/views/sibu/pages/update_section.js.erb +3 -3
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/constants.rb +5 -3
- data/config/routes.rb +3 -0
- data/db/migrate/20200401130601_add_ref_to_site_templates.rb +5 -0
- data/lib/sibu/engine.rb +0 -2
- data/lib/sibu/version.rb +1 -1
- metadata +19 -18
- data/app/views/sibu/pages/destroy.html.erb +0 -2
- data/app/views/sibu/pages/update.html.erb +0 -2
@@ -10,5 +10,13 @@ module Sibu
|
|
10
10
|
def sibu_user
|
11
11
|
send(conf[:current_user])
|
12
12
|
end
|
13
|
+
|
14
|
+
def check_site_ownership!
|
15
|
+
if conf[:multi_user] && conf[:admin_filter]
|
16
|
+
unless @site.nil? || @site.user_id == sibu_user.id || conf[:admin_filter].call(sibu_user)
|
17
|
+
redirect_to main_app.root_url, alert: "Vous n'êtes pas autorisé(e) à consulter cette page."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
13
21
|
end
|
14
22
|
end
|
@@ -101,9 +101,9 @@ module Sibu
|
|
101
101
|
@content_type = params[:content_type]
|
102
102
|
@links = @site.pages_path_by_id if @site
|
103
103
|
@element = @entity.element(*@section_id.split('|'), *@element_id.split('|'))
|
104
|
-
@repeat = params[:repeat]
|
104
|
+
@repeat = params[:repeat] == 'true'
|
105
|
+
@children = params[:children] == 'true'
|
105
106
|
@size = params[:size].blank? ? :medium : params[:size].to_sym
|
106
|
-
@children = params[:children]
|
107
107
|
end
|
108
108
|
|
109
109
|
def update_element
|
@@ -146,7 +146,6 @@ module Sibu
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def update_section
|
149
|
-
# {"utf8"=>"✓", "section"=>{"color"=>"#AFCA0B", "filters"=>"school_camps"}, "section_id"=>"cs1536301729", "refresh"=>"true", "commit"=>"Valider", "site_id"=>"3", "id"=>"1392"}
|
150
149
|
@entity.section(params[:section_id]).merge!(section_params)
|
151
150
|
logger.debug @entity.section(params[:section_id])
|
152
151
|
@updated = @entity.save
|
@@ -161,10 +160,12 @@ module Sibu
|
|
161
160
|
def set_page
|
162
161
|
@page = Sibu::Page.find(params[:id])
|
163
162
|
@site = Sibu::Site.includes(:pages).find(@page.site_id) if @page
|
163
|
+
check_site_ownership!
|
164
164
|
end
|
165
165
|
|
166
166
|
def set_site
|
167
167
|
@site = Sibu::Site.find(params[:site_id])
|
168
|
+
check_site_ownership!
|
168
169
|
end
|
169
170
|
|
170
171
|
def set_edit_context
|
@@ -37,6 +37,9 @@ module Sibu
|
|
37
37
|
if conf[:custom_styles] && @site.previous_changes.has_key?(:custom_data)
|
38
38
|
generate_styles(@site)
|
39
39
|
end
|
40
|
+
if @site.previous_changes.has_key?(:version)
|
41
|
+
@site.update_paths
|
42
|
+
end
|
40
43
|
redirect_to sites_url, notice: "Le site a bien été mis à jour."
|
41
44
|
else
|
42
45
|
flash.now[:alert] = "Une erreur s'est produite lors de l'enregistrement du site."
|
@@ -67,6 +70,7 @@ module Sibu
|
|
67
70
|
|
68
71
|
def set_site
|
69
72
|
@site = Sibu::Site.find(params[:id])
|
73
|
+
check_site_ownership!
|
70
74
|
end
|
71
75
|
|
72
76
|
def site_params
|
@@ -36,26 +36,49 @@ module Sibu
|
|
36
36
|
end
|
37
37
|
|
38
38
|
[:h1, :h2, :h3, :h4, :h5, :h6, :span].each do |t|
|
39
|
-
define_method(t) do |elt, html_opts = {}|
|
40
|
-
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "text" => DEFAULT_TEXT}
|
39
|
+
define_method(t) do |elt, html_opts = {}, &block|
|
40
|
+
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "text" => Sibu::DEFAULT_TEXT}
|
41
41
|
content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
|
42
42
|
html_opts.merge!({data: {id: elt_id(elt), type: "text"}}) if action_name != 'show'
|
43
|
-
|
43
|
+
if block
|
44
|
+
@sb_section = (@sb_section || []) + [elt_id(elt)]
|
45
|
+
html_output = content_tag(t, capture(content, nested_elements(elt), &block), html_opts)
|
46
|
+
@sb_section -= [elt_id(elt)]
|
47
|
+
html_output
|
48
|
+
else
|
49
|
+
content_tag(t, raw(content["text"]).html_safe, html_opts)
|
50
|
+
end
|
44
51
|
end
|
45
52
|
end
|
46
53
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
54
|
+
[:div, :section, :article, :aside, :header, :footer, :nav, :main, :ul].each do |t|
|
55
|
+
define_method(t) do |elt, html_opts = {}, &block|
|
56
|
+
t_id = elt.is_a?(Hash) ? elt["id"] : elt
|
57
|
+
@sb_section = (@sb_section || []) + [t_id]
|
58
|
+
html_opts = {"id" => t_id}.merge(html_opts)
|
59
|
+
html_opts.merge!(@sb_section.length == 1 ? {"data-sb-id" => t_id, "data-sb-entity" => @sb_entity == @site ? 'site' : 'page'} : {"data-id" => elt_id(elt), "data-type" => "group", "data-repeat" => false, "data-children" => false}) if action_name != 'show'
|
60
|
+
html_output = content_tag(t, capture(current_elt(elt), nested_elements(t_id), &block), html_opts)
|
61
|
+
@sb_section -= [t_id]
|
62
|
+
html_output
|
63
|
+
end
|
53
64
|
end
|
54
65
|
|
55
66
|
def sb
|
56
67
|
self
|
57
68
|
end
|
58
69
|
|
70
|
+
def join_tokens(tokens, suffix)
|
71
|
+
(tokens + [suffix]).select {|t| !t.blank?}.join("|")
|
72
|
+
end
|
73
|
+
|
74
|
+
def nested_elements(id)
|
75
|
+
element_id = elt_id(id)
|
76
|
+
element_id_tokens = (@sb_section + element_id.split("|")).uniq
|
77
|
+
nested_elts = @sb_entity.elements(*element_id_tokens)
|
78
|
+
nested_elts.blank? ? [{"id" => element_id.split("|").last, "data-id" => join_tokens(element_id_tokens[1..-1], "#{element_id}0")}] :
|
79
|
+
nested_elts.map {|e| e.merge({"data-id" => join_tokens(element_id_tokens[1..-1], e['id'])})}
|
80
|
+
end
|
81
|
+
|
59
82
|
def select_element(id)
|
60
83
|
@sb_entity.element(*@sb_section, id)
|
61
84
|
end
|
@@ -65,11 +88,19 @@ module Sibu
|
|
65
88
|
items.blank? ? [{"id" => "el#{Time.current.to_i}"}] : items
|
66
89
|
end
|
67
90
|
|
91
|
+
def p(elt, opts = {})
|
92
|
+
repeat = opts.delete(:repeat)
|
93
|
+
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "text" => Sibu::DEFAULT_PARAGRAPH}
|
94
|
+
content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
|
95
|
+
opts.merge!({data: {id: elt_id(elt), repeat: repeat, type: "paragraph"}}) if action_name != 'show'
|
96
|
+
content_tag(:div, content_tag(:p, raw(content["text"]).html_safe), opts)
|
97
|
+
end
|
98
|
+
|
68
99
|
def img(elt, opts = {})
|
69
100
|
wrapper = opts.delete(:wrapper)
|
70
101
|
repeat = opts.delete(:repeat)
|
71
102
|
size = opts.delete(:size)
|
72
|
-
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "src" => DEFAULT_IMG}
|
103
|
+
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "src" => Sibu::DEFAULT_IMG}
|
73
104
|
content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
|
74
105
|
if action_name == 'show'
|
75
106
|
content["src"] = ("/#{conf[:deployment_path]}" + content["src"]) if @online && conf[:deployment_path]
|
@@ -90,8 +121,16 @@ module Sibu
|
|
90
121
|
content_tag(wrapper, capture(*elts(elt), &block), opts)
|
91
122
|
end
|
92
123
|
|
124
|
+
def empty_tag(elt, tag, type, opts = {})
|
125
|
+
repeat = opts.delete(:repeat)
|
126
|
+
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt}.merge!(default_content(type))
|
127
|
+
opts = defaults.merge(opts)
|
128
|
+
opts.merge!({data: {id: elt_id(elt), type: type, repeat: repeat}}) if action_name != 'show'
|
129
|
+
content_tag(tag, nil, opts)
|
130
|
+
end
|
131
|
+
|
93
132
|
def form_label(elt, html_opts = {}, &block)
|
94
|
-
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "text" => DEFAULT_TEXT}
|
133
|
+
defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "text" => Sibu::DEFAULT_TEXT}
|
95
134
|
content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
|
96
135
|
html_opts.merge!({data: {id: elt_id(elt), type: "text"}}) if action_name != 'show'
|
97
136
|
content_tag(:label, raw(content["text"]).html_safe, html_opts)
|
@@ -125,20 +164,23 @@ module Sibu
|
|
125
164
|
|
126
165
|
alias site sb_site
|
127
166
|
|
167
|
+
def render_page_section(s)
|
168
|
+
@sb_section = [s['id']]
|
169
|
+
@sb_entity = @page
|
170
|
+
render partial: "shared/#{@site.section_template(s)}",
|
171
|
+
locals: {sibu: self, sibu_section: s, sibu_attrs: sibu_attributes(s).html_safe}
|
172
|
+
end
|
173
|
+
|
174
|
+
def sibu_attributes(section)
|
175
|
+
action_name != 'show' ? ('data-sb-id="' + section['id'] + '" data-sb-entity="page"') : ''
|
176
|
+
end
|
177
|
+
|
128
178
|
def section(id, tag, html_opts = {}, &block)
|
129
179
|
@sb_section = [id]
|
130
|
-
opts = action_name != 'show' ? html_opts.merge({"data-sb-id" => id, "data-sb-
|
180
|
+
opts = action_name != 'show' ? html_opts.merge({"data-sb-id" => id, "data-sb-entity" => @sb_entity == @site ? 'site' : 'page'}) : html_opts
|
131
181
|
content_tag(tag, capture(self, &block), opts)
|
132
182
|
end
|
133
183
|
|
134
|
-
def sections(id, tag, html_opts = {}, &block)
|
135
|
-
(@sb_entity.find_or_init(id)["elements"].map.with_index do |elt, i|
|
136
|
-
@sb_section = [id, elt["id"]]
|
137
|
-
opts = action_name != 'show' ? html_opts.merge({"data-sb-id" => @sb_section.join('|'), "data-sb-repeat" => true, "data-sb-entity" => @sb_entity == @site ? 'site' : 'page'}) : html_opts
|
138
|
-
content_tag(tag, capture(self, i, &block), opts)
|
139
|
-
end).join('').html_safe
|
140
|
-
end
|
141
|
-
|
142
184
|
def elts(id)
|
143
185
|
items = []
|
144
186
|
element_id = elt_id(id)
|
@@ -155,8 +197,9 @@ module Sibu
|
|
155
197
|
def link(elt, html_opts = {}, &block)
|
156
198
|
repeat = html_opts.delete(:repeat)
|
157
199
|
children = html_opts.delete(:children)
|
158
|
-
defaults = {"id" => elt_id(elt), "value" => "", "text" => DEFAULT_TEXT}
|
159
|
-
|
200
|
+
defaults = {"id" => elt_id(elt), "value" => "", "text" => Sibu::DEFAULT_TEXT}
|
201
|
+
link_elt = current_elt(elt)
|
202
|
+
content = defaults.merge(link_elt)
|
160
203
|
val = content.delete("value") || ""
|
161
204
|
text = content.delete("text")
|
162
205
|
html_opts.merge!({data: {id: elt_id(elt), type: "link", repeat: repeat, children: children}}) if action_name != 'show'
|
@@ -172,16 +215,18 @@ module Sibu
|
|
172
215
|
else
|
173
216
|
content["href"] = @links.keys.include?(val.to_s) ? (action_name == 'show' ? link_path(val) : site_page_edit_content_path(@site.id, val)) : '#'
|
174
217
|
end
|
175
|
-
# Note : sends elts in given order
|
176
218
|
if block_given?
|
177
|
-
|
219
|
+
@sb_section = (@sb_section || []) + [elt_id(elt)]
|
220
|
+
html_output = content_tag(:a, capture(link_elt, elts(elt), &block), content.merge(html_opts).except("elements"))
|
221
|
+
@sb_section -= [elt_id(elt)]
|
222
|
+
html_output
|
178
223
|
else
|
179
224
|
content_tag(:a, raw(text), content.merge(html_opts).except("elements"))
|
180
225
|
end
|
181
226
|
end
|
182
227
|
|
183
228
|
def interactive_map(elt, html_opts = {})
|
184
|
-
defaults = {"data-lat" => "45.68854", "data-lng" => "5.91587", "data-title" => DEFAULT_TEXT}
|
229
|
+
defaults = {"data-lat" => "45.68854", "data-lng" => "5.91587", "data-title" => Sibu::DEFAULT_TEXT}
|
185
230
|
content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {"id" => elt}))
|
186
231
|
html_opts.merge!({data: {id: elt_id(elt), type: "map"}}) if action_name != 'show'
|
187
232
|
content_tag(:div, nil, content.merge(html_opts))
|
@@ -190,5 +235,24 @@ module Sibu
|
|
190
235
|
def elt_id(elt)
|
191
236
|
elt.is_a?(Hash) ? (elt["data-id"] || elt["id"]) : elt
|
192
237
|
end
|
238
|
+
|
239
|
+
def current_elt(elt)
|
240
|
+
(elt.is_a?(Hash) ? elt : (select_element(elt) || {})).except('elements')
|
241
|
+
end
|
242
|
+
|
243
|
+
def default_content(type)
|
244
|
+
case type
|
245
|
+
when "text"
|
246
|
+
{"text" => Sibu::DEFAULT_TEXT}
|
247
|
+
when "link"
|
248
|
+
{"value" => "", "text" => Sibu::DEFAULT_TEXT}
|
249
|
+
when "paragraph"
|
250
|
+
{"text" => Sibu::DEFAULT_PARAGRAPH}
|
251
|
+
when "media"
|
252
|
+
{"src" => Sibu::DEFAULT_IMG}
|
253
|
+
when "embed"
|
254
|
+
{"code" => '<p>Contenu HTML personnalisé (iframe, etc...)</p>'}
|
255
|
+
end
|
256
|
+
end
|
193
257
|
end
|
194
258
|
end
|
data/app/models/sibu/page.rb
CHANGED
@@ -30,12 +30,12 @@ module Sibu
|
|
30
30
|
save
|
31
31
|
end
|
32
32
|
|
33
|
-
def update_path
|
33
|
+
def update_path(force_update = false)
|
34
34
|
prefix = site.version == Sibu::Site::DEFAULT_VERSION ? '' : "#{site.version}/"
|
35
35
|
if is_home == 'true'
|
36
|
-
self.path =
|
36
|
+
self.path = prefix
|
37
37
|
else
|
38
|
-
self.path = "#{prefix}#{name.parameterize}" if self.path.blank?
|
38
|
+
self.path = "#{prefix}#{name.parameterize}" if self.path.blank? || force_update
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
data/app/models/sibu/site.rb
CHANGED
@@ -36,7 +36,7 @@ module Sibu
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def section_template(section)
|
39
|
-
|
39
|
+
"#{site_template.path}/#{section["category"]}/#{section["template"]}"
|
40
40
|
end
|
41
41
|
|
42
42
|
def not_found
|
@@ -51,6 +51,13 @@ module Sibu
|
|
51
51
|
pages.where(id: page_id).select(:id, :path).first
|
52
52
|
end
|
53
53
|
|
54
|
+
def update_paths
|
55
|
+
pages.each do |p|
|
56
|
+
p.update_path(true)
|
57
|
+
p.save
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
54
61
|
def save_and_init
|
55
62
|
if valid?
|
56
63
|
self.sections = site_template.sections
|
@@ -69,6 +76,13 @@ module Sibu
|
|
69
76
|
Hash[pages.collect {|p| [p.id.to_s, p.path]}]
|
70
77
|
end
|
71
78
|
|
79
|
+
def update_paths
|
80
|
+
pages.each do |p|
|
81
|
+
p.update_path(true)
|
82
|
+
p.save
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
72
86
|
def init_pages(source)
|
73
87
|
site_data = Rails.application.config.sibu[:site_data][source]
|
74
88
|
site_data.pages.each do |p|
|
@@ -6,7 +6,7 @@ module Sibu
|
|
6
6
|
store :default_styles, accessors: [:primary_font, :secondary_font, :primary_color, :secondary_color], coder: JSON
|
7
7
|
|
8
8
|
def reference
|
9
|
-
name.parameterize.gsub('-', '_')
|
9
|
+
ref || name.parameterize.gsub('-', '_')
|
10
10
|
end
|
11
11
|
|
12
12
|
def available_sections(path_prefix = 'app/views/shared')
|
@@ -16,6 +16,9 @@ module Sibu
|
|
16
16
|
sections_list += Dir.glob(dir + "*.erb").map {|f| f.split('/').last}.
|
17
17
|
map {|f| f[1..-1].gsub('.html.erb', '')}.map {|f| {"id" => "sibu_template_#{f}", "category" => cat, "template" => f}}
|
18
18
|
end
|
19
|
+
if Rails.application.config.sibu[:sections_ordering]
|
20
|
+
sections_list = Rails.application.config.sibu[:sections_ordering].call(sections_list)
|
21
|
+
end
|
19
22
|
sections_list
|
20
23
|
end
|
21
24
|
end
|
@@ -2,13 +2,12 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title><%= conf[:title] %></title>
|
5
|
-
<%= stylesheet_link_tag "#{conf[:stylesheet]}-edit", media: 'all' %>
|
6
5
|
<%= stylesheet_link_tag 'sibu/sibu', media: 'all' %>
|
6
|
+
<%= stylesheet_link_tag conf[:stylesheet], media: 'all' %>
|
7
7
|
<%= javascript_include_tag "#{conf[:javascript]}-edit" %>
|
8
|
-
<%= javascript_include_tag 'sibu/sibu' %>
|
9
8
|
<% if @site %>
|
10
9
|
<%= stylesheet_link_tag (conf[:custom_styles] ? @site.style_url : @site.site_template.path), media: "all" %>
|
11
|
-
<%= javascript_include_tag
|
10
|
+
<%= javascript_include_tag @site.site_template.path %>
|
12
11
|
<% end %>
|
13
12
|
<%= csrf_meta_tags %>
|
14
13
|
<%= yield :styles %>
|
@@ -42,46 +41,53 @@
|
|
42
41
|
</div>
|
43
42
|
<% end %>
|
44
43
|
<% end %>
|
44
|
+
<%= javascript_include_tag 'sibu/sibu' %>
|
45
45
|
<script>
|
46
|
-
|
47
|
-
|
48
|
-
$(function () {
|
46
|
+
document.addEventListener("DOMContentLoaded", function() {
|
49
47
|
initOverlays();
|
50
48
|
sibuCallback("editContent");
|
51
49
|
<% unless @edit_section.blank? %>
|
52
|
-
|
50
|
+
document.querySelector("[data-sb-overlay='<%= @edit_section %>']").click();
|
53
51
|
<% end %>
|
54
52
|
});
|
55
53
|
|
56
54
|
function setEditMode(section, overlay, left, top, width, height) {
|
57
|
-
var editMode =
|
58
|
-
editMode.
|
59
|
-
editMode.
|
60
|
-
editMode.
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
55
|
+
var editMode = document.querySelector("#edit_mode_overlay");
|
56
|
+
editMode.querySelector(".overlay_top").style.height = top + "px";
|
57
|
+
editMode.querySelector(".overlay_bottom").style.top = top + height + "px";
|
58
|
+
var leftOverlay = editMode.querySelector(".overlay_left"), rightOverlay = editMode.querySelector(".overlay_right"),
|
59
|
+
editModeActions = editMode.querySelector(".edit_mode_actions");
|
60
|
+
leftOverlay.style.height = height + "px";
|
61
|
+
leftOverlay.style.width = left + "px";
|
62
|
+
leftOverlay.style.top = top + "px";
|
63
|
+
rightOverlay.style.height = height + "px";
|
64
|
+
rightOverlay.style.left = left + width + "px";
|
65
|
+
rightOverlay.style.top = top + "px";
|
66
|
+
editModeActions.style.top = (top <= 120 ? (top + height) : (top - 40 - 20)) + "px";
|
67
|
+
editModeActions.style.left = left + "px";
|
68
|
+
editModeActions.style.width = width + "px";
|
69
|
+
editMode.querySelector("#edit_section_msg").innerText = "Modifier la section";
|
70
|
+
editMode.style.display = "block";
|
71
|
+
if(section.getAttribute('data-sb-entity') === 'site') {
|
72
|
+
editMode.querySelector("#new_section_before").style.display = "none";
|
73
|
+
editMode.querySelector("#new_section_after").style.display = "none";
|
74
|
+
editMode.querySelector("#delete_section").style.display = "none";
|
69
75
|
} else {
|
70
|
-
editMode.
|
71
|
-
editMode.
|
72
|
-
editMode.
|
76
|
+
editMode.querySelector("#new_section_before").style.display = "block";
|
77
|
+
editMode.querySelector("#new_section_after").style.display = "block";
|
78
|
+
editMode.querySelector("#delete_section").style.display = "block";
|
73
79
|
}
|
74
|
-
|
75
|
-
section.
|
80
|
+
window.scrollTo(0, top);
|
81
|
+
section.classList.add('sb-editing');
|
76
82
|
initInnerOverlays(section);
|
77
|
-
|
83
|
+
document.querySelector("#edit_overlays").innerHTML = "";
|
78
84
|
}
|
79
85
|
|
80
86
|
function cancelEditMode() {
|
81
87
|
refreshAfterEdit(false);
|
82
|
-
|
88
|
+
document.querySelector("#edit_mode_overlay").style.display = "none";
|
83
89
|
cancelEdit();
|
84
|
-
|
90
|
+
document.querySelector(".sb-editing").classList.remove("sb-editing");
|
85
91
|
initOverlays();
|
86
92
|
if(typeof editCancelledCallback === "function") {
|
87
93
|
editCancelledCallback();
|
@@ -89,110 +95,109 @@
|
|
89
95
|
}
|
90
96
|
|
91
97
|
function newSection(isAfter) {
|
92
|
-
var section =
|
93
|
-
var sectionsPanel =
|
94
|
-
sectionsPanel.
|
98
|
+
var section = document.querySelector(".sb-editing");
|
99
|
+
var sectionsPanel = document.querySelector("#sections_panel");
|
100
|
+
sectionsPanel.innerHTML =
|
95
101
|
'<div class="sibu_panel sibu_view"><h2>Choix du type de section</h2></div>' +
|
96
102
|
'<div><div class="sibu_sections sibu_site_content" style="text-align: center;">Chargement en cours...</div></div>' +
|
97
|
-
'<div class="sibu_panel sibu_view"><div class="sibu_actions"><a href="#" onclick="cancelSectionsEdit(); return false;">Annuler</a></div></div>'
|
98
|
-
);
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
entity: section.data("sb-entity"),
|
103
|
+
'<div class="sibu_panel sibu_view"><div class="sibu_actions"><a href="#" onclick="cancelSectionsEdit(); return false;">Annuler</a></div></div>';
|
104
|
+
sectionsPanel.classList.add("active");
|
105
|
+
sendXmlHttpRequest(
|
106
|
+
"GET",
|
107
|
+
"<%= new_section_site_page_path(@site.id, @page.id) %>",
|
108
|
+
{
|
109
|
+
section_id: section.getAttribute("data-sb-id"),
|
110
|
+
entity: section.getAttribute("data-sb-entity"),
|
106
111
|
after: isAfter
|
107
112
|
}
|
108
|
-
|
113
|
+
);
|
109
114
|
}
|
110
115
|
|
111
116
|
function editSection() {
|
112
|
-
var section =
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
section_id: section.
|
118
|
-
entity: section.
|
117
|
+
var section = document.querySelector(".sb-editing");
|
118
|
+
sendXmlHttpRequest(
|
119
|
+
"GET",
|
120
|
+
"<%= edit_section_site_page_path(@site.id, @page.id) %>",
|
121
|
+
{
|
122
|
+
section_id: section.getAttribute("data-sb-id"),
|
123
|
+
entity: section.getAttribute("data-sb-entity")
|
119
124
|
}
|
120
|
-
|
125
|
+
);
|
121
126
|
}
|
122
127
|
|
123
128
|
function deleteSection() {
|
124
129
|
if (window.confirm("Supprimer la section ?")) {
|
125
|
-
var section =
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
section_id: section.
|
131
|
-
entity: section.
|
130
|
+
var section = document.querySelector(".sb-editing");
|
131
|
+
sendXmlHttpRequest(
|
132
|
+
"DELETE",
|
133
|
+
"<%= delete_section_site_page_path(@site.id, @page.id) %>",
|
134
|
+
{
|
135
|
+
section_id: section.getAttribute("data-sb-id"),
|
136
|
+
entity: section.getAttribute("data-sb-entity")
|
132
137
|
}
|
133
|
-
|
138
|
+
);
|
134
139
|
}
|
135
140
|
}
|
136
141
|
|
137
142
|
function cloneElement(entity, sectionId, elementId) {
|
138
143
|
if (window.confirm("Dupliquer l'élément ?")) {
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
144
|
+
sendXmlHttpRequest(
|
145
|
+
"POST",
|
146
|
+
"<%= clone_element_site_page_path(@site.id, @page.id) %>",
|
147
|
+
{
|
143
148
|
section_id: sectionId,
|
144
149
|
element_id: elementId,
|
145
150
|
entity: entity
|
146
151
|
}
|
147
|
-
|
152
|
+
);
|
148
153
|
}
|
149
154
|
}
|
150
155
|
|
151
156
|
function deleteElement(entity, sectionId, elementId) {
|
152
157
|
if (window.confirm("Supprimer l'élément ?")) {
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
158
|
+
sendXmlHttpRequest(
|
159
|
+
"DELETE",
|
160
|
+
"<%= delete_element_site_page_path(@site.id, @page.id) %>",
|
161
|
+
{
|
157
162
|
section_id: sectionId,
|
158
163
|
element_id: elementId,
|
159
164
|
entity: entity
|
160
165
|
}
|
161
|
-
|
166
|
+
);
|
162
167
|
}
|
163
168
|
}
|
164
169
|
|
165
170
|
function addChildElement(entity, sectionId, elementId) {
|
166
171
|
if (window.confirm("Ajouter un sous-menu ?")) {
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
172
|
+
sendXmlHttpRequest(
|
173
|
+
"POST",
|
174
|
+
"<%= child_element_site_page_path(@site.id, @page.id) %>",
|
175
|
+
{
|
171
176
|
section_id: sectionId,
|
172
177
|
element_id: elementId,
|
173
178
|
entity: entity
|
174
179
|
}
|
175
|
-
|
180
|
+
);
|
176
181
|
}
|
177
182
|
}
|
178
183
|
|
179
184
|
function cancelEdit() {
|
180
|
-
|
181
|
-
|
185
|
+
document.querySelector("#edit_panel").classList.remove("active");
|
186
|
+
document.querySelector("#edit_panel").innerHTML = "";
|
182
187
|
document.body.style.overflow = "initial";
|
183
188
|
}
|
184
189
|
|
185
190
|
function cancelSectionsEdit() {
|
186
|
-
|
187
|
-
|
191
|
+
document.querySelector("#edit_panel").classList.remove("active");
|
192
|
+
document.querySelector("#sections_panel").innerHTML = "";
|
188
193
|
document.body.style.overflow = "initial";
|
189
194
|
}
|
190
195
|
|
191
196
|
function editContent(eltId, sectionId, entity, repeat, contentType, size, children) {
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
197
|
+
sendXmlHttpRequest(
|
198
|
+
"GET",
|
199
|
+
"<%= edit_element_site_page_path(@site.id, @page.id, format: :js) %>",
|
200
|
+
{
|
196
201
|
element_id: eltId,
|
197
202
|
section_id: sectionId,
|
198
203
|
entity: entity,
|
@@ -201,60 +206,112 @@
|
|
201
206
|
size: size,
|
202
207
|
children: children
|
203
208
|
}
|
204
|
-
|
209
|
+
);
|
205
210
|
}
|
206
211
|
|
207
212
|
function initInnerOverlays(section) {
|
208
|
-
var editables = section.
|
209
|
-
editables.
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
213
|
+
var editables = section.querySelectorAll("[data-type]");
|
214
|
+
for (var i = 0; i < editables.length; i++) {
|
215
|
+
if (editables[i].getAttribute("data-type") !== 'group' || editables[i].getAttribute("data-repeat") !== 'false' || editables[i].getAttribute("data-children") !== 'false') {
|
216
|
+
editables[i].addEventListener("mouseenter", function(evt) {
|
217
|
+
evt.stopPropagation();
|
218
|
+
evt.currentTarget.classList.add("sb-editable");
|
219
|
+
});
|
220
|
+
editables[i].addEventListener("mouseleave", function(evt) {
|
221
|
+
evt.currentTarget.classList.remove("sb-editable");
|
222
|
+
});
|
223
|
+
editables[i].addEventListener("click", function(evt) {
|
224
|
+
evt.stopPropagation();
|
225
|
+
evt.preventDefault();
|
226
|
+
var elt = evt.currentTarget, eltId = elt.getAttribute("data-id"), repeat = elt.getAttribute("data-repeat"),
|
227
|
+
type = elt.getAttribute("data-type"), size = elt.getAttribute("data-size"), children = elt.getAttribute("data-children");
|
228
|
+
var sectionId = section.getAttribute("data-sb-id"), entity = section.getAttribute("data-sb-entity");
|
229
|
+
editContent(eltId, sectionId, entity, repeat, type, size, children);
|
230
|
+
});
|
231
|
+
}
|
232
|
+
}
|
224
233
|
}
|
225
234
|
|
226
235
|
function initOverlays() {
|
227
|
-
var container =
|
228
|
-
container.
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
236
|
+
var container = document.querySelector("#edit_overlays"), sections = document.querySelectorAll("[data-sb-id]");
|
237
|
+
container.innerHTML = "";
|
238
|
+
|
239
|
+
for (var i = 0; i < sections.length; i++) {
|
240
|
+
var sectionBox = sections[i].getBoundingClientRect();
|
241
|
+
var yOffset = sectionBox.top - document.querySelector(".sibu_content_panel").getBoundingClientRect().top;
|
242
|
+
var width = sections[i].offsetWidth, height = (sections[i].offsetHeight === 0 ? childrenHeight(sections[i]) : sections[i].offsetHeight);
|
243
|
+
var overlay = document.createElement("div");
|
244
|
+
overlay.setAttribute("data-sb-overlay", sections[i].getAttribute("data-sb-id"));
|
245
|
+
overlay.innerHTML = "Modifier";
|
246
|
+
container.appendChild(overlay);
|
247
|
+
overlay.style.top = yOffset + "px";
|
248
|
+
overlay.style.left = sectionBox.left + "px";
|
249
|
+
overlay.style.width = width + "px";
|
250
|
+
overlay.style.height = height + "px";
|
251
|
+
overlay.addEventListener("click", (function(section, offsetLeft, offsetTop, editWidth, editHeight) {
|
252
|
+
return function(evt) {
|
253
|
+
setEditMode(section, evt.currentTarget, offsetLeft, offsetTop, editWidth, editHeight);
|
254
|
+
};
|
255
|
+
})(sections[i], sectionBox.left, yOffset, width, height));
|
256
|
+
}
|
246
257
|
}
|
247
258
|
|
248
259
|
function childrenHeight(parentElt) {
|
249
|
-
var height = 0;
|
250
|
-
|
251
|
-
var childHeight =
|
260
|
+
var height = 0, children = parentElt.querySelectorAll("*");
|
261
|
+
for (var i = 0; i < children.length; i++) {
|
262
|
+
var childHeight = children[i].clientHeight;
|
252
263
|
if(childHeight > height) {
|
253
264
|
height = childHeight;
|
254
265
|
}
|
255
|
-
}
|
266
|
+
}
|
256
267
|
return height;
|
257
268
|
}
|
269
|
+
|
270
|
+
function submitForm(formElt, callback) {
|
271
|
+
sendXmlHttpRequest(formElt.getAttribute("method").toUpperCase(), formElt.getAttribute("action"),
|
272
|
+
new FormData(formElt))
|
273
|
+
}
|
274
|
+
|
275
|
+
function sendXmlHttpRequest(method, url, data, callback) {
|
276
|
+
var req = new XMLHttpRequest(), param;
|
277
|
+
if (callback) {
|
278
|
+
req.onload = callback;
|
279
|
+
} else {
|
280
|
+
req.onload = function() {
|
281
|
+
eval(req.responseText);
|
282
|
+
}
|
283
|
+
}
|
284
|
+
|
285
|
+
if (method === 'GET') {
|
286
|
+
var params = [];
|
287
|
+
for(param in data ) {
|
288
|
+
if (data.hasOwnProperty(param)) {
|
289
|
+
params.push(encodeURIComponent(param) + '=' + encodeURIComponent(data[param] || ""));
|
290
|
+
}
|
291
|
+
}
|
292
|
+
req.open(method, url + '?' + params.join('&').replace(/%20/g, '+'));
|
293
|
+
req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
294
|
+
req.send();
|
295
|
+
} else {
|
296
|
+
if (data instanceof FormData) {
|
297
|
+
formData = data;
|
298
|
+
} else {
|
299
|
+
var formData = new FormData();
|
300
|
+
for (var key in data) {
|
301
|
+
if (data.hasOwnProperty(key)) {
|
302
|
+
formData.append(key, data[key]);
|
303
|
+
}
|
304
|
+
}
|
305
|
+
}
|
306
|
+
|
307
|
+
req.open(method, url);
|
308
|
+
req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
309
|
+
var token = document.getElementsByName("csrf-token")[0].content;
|
310
|
+
req.setRequestHeader('X-CSRF-Token', token);
|
311
|
+
|
312
|
+
req.send(formData);
|
313
|
+
}
|
314
|
+
}
|
258
315
|
</script>
|
259
316
|
<%= yield :site_scripts %>
|
260
317
|
<%= yield :page_scripts %>
|