sibu 1.0.0 → 1.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6eb3cad54639de1385e45c0465b10aabeb58612
4
- data.tar.gz: 456b3d03e871ddf4d74efec50ac7439361843591
3
+ metadata.gz: 83f747d2d0f30d44d8321ea252994eb72a246743
4
+ data.tar.gz: 4e422b2041a2e3b8ca5eb86810e5440873c7c85e
5
5
  SHA512:
6
- metadata.gz: 6ac41267562d922d72f7b6d61fc70a9adf039b53b6f2b23fdb611e7630667545831a1fb7d337aa65fdde806d32612cc0f32261b8147d26332966f4e4d1749c19
7
- data.tar.gz: c8bd6917787c516117e671d09ebe3a57c4fd402f28dfbe2b6065260cc57d54c561b0016b478e71ce33dd6bb56764a049bec7492e507a0debb2934407f03c9632
6
+ metadata.gz: 22a3a04bb5835e8119274276106e99ab700cd85c55c47aecafd8111c7c7eaa633f1c57a5e35b088a3532de89d7250580e17965f411a974657df642ac3c6b8a3b
7
+ data.tar.gz: 284b06e15ef29a30528f605d4c7b003781f17cad85be9a5c42daf78fff8520818189128abe907976ace0930b34f5c05d1f80cf3e7d367c523267e45734e9b1b1
data/README.md CHANGED
@@ -1,9 +1,13 @@
1
- # Sibu - A site builder engine for Ruby on Rails
2
- This is an engine for Ruby on Rails that enables creation of static
3
- websites in a simple & wysiwyg way.
1
+ # Sibu
2
+ Sibu is an engine to build websites. It focuses on :
3
+ - Maintaining a simple data model, so it can be exported & imported in many formats
4
+ - Increasing the productivity of web developers by using a Domain Specific Language for page edition
5
+ - Providing non-technical users with a simple and accessible site administration interface
4
6
 
5
7
  ## Usage
6
- How to use my plugin.
8
+ Sibu is currently implemented as a Ruby on Rails engine. Therefore its setup requires a host Ruby on Rails application, that can be created via :
9
+
10
+ `rails new my_app`
7
11
 
8
12
  ## Installation
9
13
  Add this line to your application's Gemfile:
@@ -22,6 +26,79 @@ Or install it yourself as:
22
26
  $ gem install sibu
23
27
  ```
24
28
 
29
+ Once the installation is complete, make sure that you copy the database migrations to your application :
30
+ ```bash
31
+ rake sibu:install:migrations
32
+ ```
33
+
34
+ And finally run the migrations to update your database model :
35
+ ```bash
36
+ rake db:migrate
37
+ ```
38
+
39
+ ## Configuration
40
+ Configuration is provided via the `sibu` key of the Rails application configuration. Typically, this would be done in a `sibu.rb` file in the `config/initializers` folder of your Rails application.
41
+ The example below lists the configuration options available :
42
+ ```ruby
43
+ Rails.application.config.sibu = {
44
+
45
+ # Title metatag of the admin interface
46
+ title: 'My website administration',
47
+
48
+ # Stylesheet to use to style the admin interface
49
+ stylesheet: 'my_user_css',
50
+
51
+ # Javascript to include in the admin interface
52
+ javascript: 'my_user_js',
53
+
54
+ # Path to the admin interface header partial
55
+ top_panel: 'shared/user/top_panel',
56
+
57
+ # Path to the main content edition partial - must include a yield to delegate content display to the Sibu engine
58
+ content_panel: 'shared/user/content_panel',
59
+
60
+ # Path to the admin interface footer partial
61
+ bottom_panel: 'shared/user/bottom_panel',
62
+
63
+ # Name of the method that will be used to authenticate admin users - this method must be available to Sibu controllers
64
+ auth_filter: :authenticate_user!,
65
+
66
+ # Name of the method that will retrieve the current user - this method must be available to Sibu controllers
67
+ current_user: 'current_user',
68
+
69
+ # A flag to indicate that the Sibu instance should offer a separate environment for each user
70
+ multi_user: true,
71
+
72
+ # A proc to identify super-admin users in a multi-users setup (optional)
73
+ admin_filter: Proc.new {|usr| usr.is_admin},
74
+
75
+ # When active, users will be able to override the colors and fonts of the sites templates (optional)
76
+ custom_styles: true,
77
+
78
+ # Lists of colors and fonts available for sites templates customization - Only used when custom_styles is set to true (optional)
79
+ primary_colors: ['#23527c', '#00B1BF', '#BECD00'],
80
+ secondary_colors: ['#E2007A', '#aaaaa1', '#be6432'],
81
+ primary_fonts: ['Intro', 'Lato', 'SourceSansPro'],
82
+ secondary_fonts: ['Aleo', 'Bodoni', 'Cinzel'],
83
+
84
+ # The domain name that will host the admin interface (should be different from the website domain name)
85
+ host: 'localhost',
86
+
87
+ # A partial for 404 error pages
88
+ not_found: 'shared/templates/not_found',
89
+
90
+ # Dimensions of the images to use in the website - Uploaded images will be automatically resized in the provided formats
91
+ images: {large: 1600, medium: 800, small: 320},
92
+
93
+ # Versions available for the created websites
94
+ versions: [['Français', 'fr'], ['Anglais', 'en']],
95
+
96
+ # A proc to override the default ordering of the sections when editing content (optional)
97
+ sections_ordering: Proc.new {|sections| sections.sort_by {|s| SECTIONS_TABS.index(s['category'])}}
98
+ }
99
+ ```
100
+
101
+
25
102
  ## Improvements
26
103
  - Use a specific controller & helper for site display
27
104
  - Move page templates to SiteTemplate model
@@ -229,8 +229,7 @@ $sibu-color3 : #333 !default;
229
229
  padding: 2rem;
230
230
 
231
231
  img {
232
- padding-top: 2rem;
233
- padding-bottom: 2rem;
232
+ margin-bottom: 2rem;
234
233
  border-top: 2px solid $sibu-color1;
235
234
  box-shadow: 0 0 5px #ccc;
236
235
  }
@@ -3,10 +3,21 @@
3
3
  *= require_self
4
4
  */
5
5
 
6
- .sibu_content_panel {
6
+ body.sibu_edit_content, .sibu_content_panel {
7
7
  position: relative
8
8
  }
9
9
 
10
+ body.sibu_edit_content > .sibu_panel:first-child {
11
+ position: fixed;
12
+ width: 100%;
13
+ z-index: 999999;
14
+ top: 0;
15
+ }
16
+
17
+ body.sibu_edit_content > .sibu_content_panel {
18
+ padding-top: 60px;
19
+ }
20
+
10
21
  .sb-editable {
11
22
  cursor: pointer;
12
23
  outline: dashed rgba(94, 219, 255, 0.8) 3px;
@@ -2,6 +2,7 @@ require_dependency "sibu/application_controller"
2
2
 
3
3
  module Sibu
4
4
  class PagesController < ApplicationController
5
+ before_action :compile_assets, only: [:show, :edit_content]
5
6
  before_action :set_page, only: [:edit, :update, :destroy, :duplicate, :edit_element, :update_element, :clone_element,
6
7
  :delete_element, :child_element, :new_section, :create_section, :edit_section,
7
8
  :update_section, :delete_section]
@@ -10,6 +11,7 @@ module Sibu
10
11
  :child_element, :new_section, :create_section, :edit_section,
11
12
  :update_section, :delete_section]
12
13
  before_action :set_online, only: [:show, :edit]
14
+
13
15
  skip_before_action Rails.application.config.sibu[:auth_filter], only: [:show]
14
16
 
15
17
  def index
@@ -44,7 +46,7 @@ module Sibu
44
46
  end
45
47
 
46
48
  def new
47
- @page = Sibu::Page.new(site_id: @site.id)
49
+ @page = Sibu::Page.new(site_id: @site.id, source: 'Saisie manuelle')
48
50
  end
49
51
 
50
52
  def create
@@ -194,5 +196,9 @@ module Sibu
194
196
  def show_params
195
197
  params.permit!
196
198
  end
199
+
200
+ def compile_assets
201
+ Sibu::DynamicStyle.new(params[:site_id]).compile if Rails.env.development? && conf[:custom_styles] && !params[:site_id].blank?
202
+ end
197
203
  end
198
204
  end
@@ -6,7 +6,11 @@ module Sibu
6
6
  skip_before_action Rails.application.config.sibu[:auth_filter], only: [:show]
7
7
 
8
8
  def index
9
- @sites = Sibu::Site.for_user(sibu_user).order(:name, :version)
9
+ if conf[:admin_filter].call(sibu_user)
10
+ @sites = Sibu::Site.all.order(:name, :version)
11
+ else
12
+ @sites = Sibu::Site.for_user(sibu_user).order(:name, :version)
13
+ end
10
14
  end
11
15
 
12
16
  def show
@@ -5,7 +5,7 @@ module Sibu
5
5
  end
6
6
 
7
7
  def sibu_user
8
- send(Rails.application.config.sibu[:current_user])
8
+ send(conf[:current_user])
9
9
  end
10
10
  end
11
11
  end
@@ -7,6 +7,10 @@ module Sibu
7
7
  p ? (request.host == conf[:host] ? site_page_path(@site.id, p.id) : (conf[:deployment_path] ? "/#{conf[:deployment_path]}/#{p.path}" : "/#{p.path}")) : "#"
8
8
  end
9
9
 
10
+ def is_current_page(link_val)
11
+ /\d+/.match?(link_val) && link_val.to_i == @page.id
12
+ end
13
+
10
14
  def sections_templates
11
15
  @site.site_template.available_sections
12
16
  end
@@ -35,29 +39,53 @@ module Sibu
35
39
  end
36
40
  end
37
41
 
38
- [:h1, :h2, :h3, :h4, :h5, :h6, :span].each do |t|
39
- define_method(t) do |elt, html_opts = {}, &block|
40
- defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "text" => Sibu::DEFAULT_TEXT}
42
+ [:h1, :h2, :h3, :h4, :h5, :h6, :span, :p, :li].each do |t|
43
+ define_method(t) do |elt, opts = {}, &block|
44
+ t_id = elt.is_a?(Hash) ? elt["id"] : elt
45
+ defaults = {"id" => t_id, "text" => (t == :p ? Sibu::DEFAULT_PARAGRAPH : Sibu::DEFAULT_TEXT)}
41
46
  content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
42
- html_opts.merge!({data: {id: elt_id(elt), type: "text"}}) if action_name != 'show'
47
+ html_opts = {"id" => t_id}.merge(opts.except(:repeat, :children).stringify_keys)
48
+ @sb_section = (@sb_section || []) + [t_id]
49
+ if action_name != 'show'
50
+ html_opts.merge!({
51
+ "data-id" => @sb_section[1..-1].join('|'),
52
+ "data-type" => (t == :p ? "paragraph" : "text"),
53
+ "data-repeat" => opts.delete(:repeat),
54
+ "data-children" => opts.delete(:children)
55
+ })
56
+ end
43
57
  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
58
+ if t == :p
59
+ html_output = content_tag(:div, content_tag(t, capture(content, nested_elements(elt), &block)), html_opts)
60
+ else
61
+ html_output = content_tag(t, capture(content, nested_elements(t_id), &block), html_opts)
62
+ end
48
63
  else
49
- content_tag(t, raw(content["text"]).html_safe, html_opts)
64
+ if t == :p
65
+ html_output = content_tag(:div, content_tag(t, raw(content["text"]).html_safe), html_opts)
66
+ else
67
+ html_output = content_tag(t, raw(content["text"]).html_safe, html_opts)
68
+ end
50
69
  end
70
+ @sb_section -= [t_id]
71
+ html_output
51
72
  end
52
73
  end
53
74
 
54
- [:div, :section, :article, :aside, :header, :footer, :nav, :main, :ul].each do |t|
55
- define_method(t) do |elt, html_opts = {}, &block|
75
+ [:div, :section, :article, :aside, :header, :footer, :nav, :main, :ul, :ol, :wrapper].each do |t|
76
+ define_method(t) do |elt, opts = {}, &block|
56
77
  t_id = elt.is_a?(Hash) ? elt["id"] : elt
57
78
  @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)
79
+ html_opts = {"id" => t_id}.merge(opts.except(:repeat, :children).stringify_keys)
80
+ if action_name != 'show'
81
+ html_opts.merge!({
82
+ "data-id" => @sb_section[1..-1].join('|'),
83
+ "data-type" => "group",
84
+ "data-repeat" => opts.delete(:repeat),
85
+ "data-children" => opts.delete(:children)
86
+ })
87
+ end
88
+ html_output = t == :wrapper ? capture(current_elt(elt), nested_elements(t_id), &block) : content_tag(t, capture(current_elt(elt), nested_elements(t_id), &block), html_opts)
61
89
  @sb_section -= [t_id]
62
90
  html_output
63
91
  end
@@ -71,8 +99,12 @@ module Sibu
71
99
  (tokens + [suffix]).select {|t| !t.blank?}.join("|")
72
100
  end
73
101
 
74
- def nested_elements(id)
75
- element_id = elt_id(id)
102
+ # Note : the best option is probably a "section" helper that is instantiated from the section hash
103
+ # and that provides all the logic for elements manipulation (ex: section.h3(), section.elements, section.elements(nested_id), etc...)
104
+ # That will also remove the entity type references (site / page) from the partials (but is still has to be figured out by Sibu)
105
+ # Note : add "each_with_elements" and "elements" on section/elts enumerables
106
+ def nested_elements(elt_or_id)
107
+ element_id = elt_id(elt_or_id)
76
108
  element_id_tokens = (@sb_section + element_id.split("|")).uniq
77
109
  nested_elts = @sb_entity.elements(*element_id_tokens)
78
110
  nested_elts.blank? ? [{"id" => element_id.split("|").last, "data-id" => join_tokens(element_id_tokens[1..-1], "#{element_id}0")}] :
@@ -88,37 +120,37 @@ module Sibu
88
120
  items.blank? ? [{"id" => "el#{Time.current.to_i}"}] : items
89
121
  end
90
122
 
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
-
99
123
  def img(elt, opts = {})
100
124
  wrapper = opts.delete(:wrapper)
101
125
  repeat = opts.delete(:repeat)
102
126
  size = opts.delete(:size)
103
- defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "src" => Sibu::DEFAULT_IMG}
127
+ t_id = elt.is_a?(Hash) ? elt["id"] : elt
128
+ defaults = {"id" => t_id, "src" => Sibu::DEFAULT_IMG}
104
129
  content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
130
+ @sb_section = (@sb_section || []) + [t_id]
105
131
  if action_name == 'show'
106
132
  content["src"] = ("/#{conf[:deployment_path]}" + content["src"]) if @online && conf[:deployment_path]
107
133
  else
108
- opts.merge!({data: {id: elt_id(elt), type: "media", repeat: repeat, size: size}})
134
+ opts.merge!({data: {id: @sb_section[1..-1].join('|'), type: "media", repeat: repeat, size: size}})
109
135
  end
110
- wrapper ? content_tag(wrapper, content_tag(:img, nil, content.except("id")), opts)
136
+ html_output = wrapper ? content_tag(wrapper, content_tag(:img, nil, content.except("id")), opts)
111
137
  : content_tag(:img, nil, content.except("id").merge(opts.stringify_keys) {|k, old, new| k == 'class' ? [old, new].join(' ') : new})
138
+ @sb_section -= [t_id]
139
+ html_output
112
140
  end
113
141
 
114
142
  def grp(elt, opts = {}, &block)
115
143
  wrapper = opts.delete(:wrapper) || :div
116
144
  repeat = opts.delete(:repeat)
117
145
  children = opts.delete(:children)
118
- defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt}
146
+ t_id = elt.is_a?(Hash) ? elt["id"] : elt
147
+ @sb_section = (@sb_section || []) + [t_id]
148
+ defaults = {"id" => t_id}
119
149
  opts = defaults.merge(opts)
120
- opts.merge!({data: {id: elt_id(elt), type: "group", repeat: repeat, children: children}}) if action_name != 'show'
121
- content_tag(wrapper, capture(*elts(elt), &block), opts)
150
+ opts.merge!({data: {id: @sb_section[1..-1].join('|'), type: "group", repeat: repeat, children: children}}) if action_name != 'show'
151
+ html_output = content_tag(wrapper, capture(*elts(elt), &block), opts)
152
+ @sb_section -= [t_id]
153
+ html_output
122
154
  end
123
155
 
124
156
  def empty_tag(elt, tag, type, opts = {})
@@ -171,10 +203,18 @@ module Sibu
171
203
  locals: {sibu: self, sibu_section: s, sibu_attrs: sibu_attributes(s).html_safe}
172
204
  end
173
205
 
206
+ # Page sections attrs
174
207
  def sibu_attributes(section)
175
208
  action_name != 'show' ? ('data-sb-id="' + section['id'] + '" data-sb-entity="page"') : ''
176
209
  end
177
210
 
211
+ # Site sections attrs
212
+ def sibu_attrs(section_id)
213
+ @sb_section = [section_id]
214
+ @sb_entity = @site
215
+ action_name != 'show' ? ('data-sb-id="' + section_id + '" data-sb-entity="site"').html_safe : ''
216
+ end
217
+
178
218
  def section(id, tag, html_opts = {}, &block)
179
219
  @sb_section = [id]
180
220
  opts = action_name != 'show' ? html_opts.merge({"data-sb-id" => id, "data-sb-entity" => @sb_entity == @site ? 'site' : 'page'}) : html_opts
@@ -197,12 +237,14 @@ module Sibu
197
237
  def link(elt, html_opts = {}, &block)
198
238
  repeat = html_opts.delete(:repeat)
199
239
  children = html_opts.delete(:children)
200
- defaults = {"id" => elt_id(elt), "value" => "", "text" => Sibu::DEFAULT_TEXT}
240
+ t_id = elt.is_a?(Hash) ? elt["id"] : elt
241
+ defaults = {"id" => t_id, "value" => "", "text" => Sibu::DEFAULT_TEXT}
201
242
  link_elt = current_elt(elt)
202
243
  content = defaults.merge(link_elt)
203
244
  val = content.delete("value") || ""
204
245
  text = content.delete("text")
205
- html_opts.merge!({data: {id: elt_id(elt), type: "link", repeat: repeat, children: children}}) if action_name != 'show'
246
+ @sb_section = (@sb_section || []) + [t_id]
247
+ html_opts.merge!({data: {id: @sb_section[1..-1].join('|'), type: "link", repeat: repeat, children: children}}) if action_name != 'show'
206
248
  if val.to_s.start_with?('http')
207
249
  content["href"] = val
208
250
  elsif val.to_s.start_with?('#')
@@ -216,17 +258,16 @@ module Sibu
216
258
  content["href"] = @links.keys.include?(val.to_s) ? (action_name == 'show' ? link_path(val) : site_page_edit_content_path(@site.id, val)) : '#'
217
259
  end
218
260
  if block_given?
219
- @sb_section = (@sb_section || []) + [elt_id(elt)]
220
261
  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
223
262
  else
224
- content_tag(:a, raw(text), content.merge(html_opts).except("elements"))
263
+ html_output = content_tag(:a, raw(text), content.merge(html_opts).except("elements"))
225
264
  end
265
+ @sb_section -= [t_id]
266
+ html_output
226
267
  end
227
268
 
228
269
  def interactive_map(elt, html_opts = {})
229
- defaults = {"data-lat" => "45.68854", "data-lng" => "5.91587", "data-title" => Sibu::DEFAULT_TEXT}
270
+ defaults = {"data-lat" => "46.1988027", "data-lng" => "5.1748288", "data-title" => Sibu::DEFAULT_TEXT}
230
271
  content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {"id" => elt}))
231
272
  html_opts.merge!({data: {id: elt_id(elt), type: "map"}}) if action_name != 'show'
232
273
  content_tag(:div, nil, content.merge(html_opts))
@@ -62,5 +62,9 @@ module Sibu
62
62
  save
63
63
  end
64
64
  end
65
+
66
+ def home?
67
+ is_home == 'true' || is_home == '1'
68
+ end
65
69
  end
66
70
  end
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <title><%= conf[:title] %></title>
5
5
  <%= stylesheet_link_tag 'sibu/sibu', media: 'all' %>
6
- <%= stylesheet_link_tag conf[:stylesheet], media: 'all' %>
6
+ <%= stylesheet_link_tag "#{conf[:stylesheet]}-edit", media: 'all' %>
7
7
  <%= javascript_include_tag "#{conf[:javascript]}-edit" %>
8
8
  <% if @site %>
9
9
  <%= stylesheet_link_tag (conf[:custom_styles] ? @site.style_url : @site.site_template.path), media: "all" %>
@@ -12,7 +12,7 @@
12
12
  <%= csrf_meta_tags %>
13
13
  <%= yield :styles %>
14
14
  </head>
15
- <body>
15
+ <body class="sibu_edit_content">
16
16
  <% [:top_panel, :side_panel, :content_panel, :bottom_panel].each do |panel| %>
17
17
  <% unless conf[panel].blank? %>
18
18
  <div class="<%= panel == :content_panel ? 'sibu_content_panel' : 'sibu_panel' %>">
@@ -44,11 +44,8 @@
44
44
  <%= javascript_include_tag 'sibu/sibu' %>
45
45
  <script>
46
46
  document.addEventListener("DOMContentLoaded", function() {
47
- initOverlays();
47
+ initOverlays("<%= @edit_section || '' %>");
48
48
  sibuCallback("editContent");
49
- <% unless @edit_section.blank? %>
50
- document.querySelector("[data-sb-overlay='<%= @edit_section %>']").click();
51
- <% end %>
52
49
  });
53
50
 
54
51
  function setEditMode(section, overlay, left, top, width, height) {
@@ -77,7 +74,8 @@
77
74
  editMode.querySelector("#new_section_after").style.display = "block";
78
75
  editMode.querySelector("#delete_section").style.display = "block";
79
76
  }
80
- window.scrollTo(0, top);
77
+ var topPadding = top <= 120 ? 60 : 120;
78
+ window.scrollTo(0, top - topPadding);
81
79
  section.classList.add('sb-editing');
82
80
  initInnerOverlays(section);
83
81
  document.querySelector("#edit_overlays").innerHTML = "";
@@ -212,7 +210,7 @@
212
210
  function initInnerOverlays(section) {
213
211
  var editables = section.querySelectorAll("[data-type]");
214
212
  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') {
213
+ if (editables[i].getAttribute("data-type") !== 'group' || editables[i].getAttribute("data-repeat") === 'true' || editables[i].getAttribute("data-children") === 'true') {
216
214
  editables[i].addEventListener("mouseenter", function(evt) {
217
215
  evt.stopPropagation();
218
216
  evt.currentTarget.classList.add("sb-editable");
@@ -232,28 +230,52 @@
232
230
  }
233
231
  }
234
232
 
235
- function initOverlays() {
236
- var container = document.querySelector("#edit_overlays"), sections = document.querySelectorAll("[data-sb-id]");
237
- container.innerHTML = "";
233
+ function initOverlays(activeSection = "") {
234
+ setTimeout(function() {
235
+ var container = document.querySelector("#edit_overlays"), sections = document.querySelectorAll("[data-sb-id]");
236
+ container.innerHTML = "";
237
+
238
+ for (var i = 0; i < sections.length; i++) {
239
+ var sectionBox = eltBox(sections[i]);
240
+ var yOffset = sectionBox.top;
241
+ var width = sections[i].offsetWidth, height = (sections[i].offsetHeight === 0 ? childrenHeight(sections[i]) : sections[i].offsetHeight);
242
+ var overlay = document.createElement("div");
243
+ overlay.setAttribute("data-sb-overlay", sections[i].getAttribute("data-sb-id"));
244
+ overlay.innerHTML = "Modifier";
245
+ container.appendChild(overlay);
246
+ overlay.style.top = yOffset + "px";
247
+ overlay.style.left = sectionBox.left + "px";
248
+ overlay.style.width = width + "px";
249
+ overlay.style.height = height + "px";
250
+ overlay.addEventListener("click", (function(section, offsetLeft, offsetTop, editWidth, editHeight) {
251
+ return function(evt) {
252
+ setEditMode(section, evt.currentTarget, offsetLeft, offsetTop, editWidth, editHeight);
253
+ };
254
+ })(sections[i], sectionBox.left, yOffset, width, height));
255
+ }
256
+ if (activeSection) {
257
+ document.querySelector("[data-sb-overlay='" + activeSection + "']").click();
258
+ }
259
+ }, 800);
260
+ }
238
261
 
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));
262
+ function eltBox(elt) {
263
+ var x, y, w, h, bbox = elt.getBoundingClientRect();
264
+ if (isIE()) {
265
+ x = bbox.left + window.scrollX;
266
+ y = bbox.top + window.scrollY;
267
+ } else {
268
+ x = bbox.x + window.scrollX;
269
+ y = bbox.y + window.scrollY;
256
270
  }
271
+ w = bbox.width;
272
+ h = bbox.height;
273
+ return {top: y, left: x, width: w, height: h}
274
+ }
275
+
276
+ function isIE() {
277
+ let ua = navigator.userAgent;
278
+ return ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1;
257
279
  }
258
280
 
259
281
  function childrenHeight(parentElt) {
@@ -1,10 +1,11 @@
1
1
  <h2>Modifier le contenu</h2>
2
2
  <div id="edit_msg"></div>
3
+ <%= render 'element_actions' %>
3
4
  <div class="sibu_edit_form">
4
5
  <form class="edit_element_form" action="<%= update_element_site_page_path(@site.id, @page.id, format: :js) %>" accept-charset="UTF-8" method="patch">
5
6
  <div class="sibu_field">
6
7
  <%= label_tag 'element[code]', "Code d'intégration du contenu" %>
7
- <%= text_area_tag 'element[code]', @element["code"], placeholder: ' ex: <iframe src="..."></iframe>' %>
8
+ <%= text_area_tag 'element[code]', @element["code"], placeholder: 'ex: <iframe src="..."></iframe>' %>
8
9
  </div>
9
10
  <%= hidden_field_tag 'element[id]', @element["id"] %>
10
11
  <%= hidden_field_tag :element_id, @element_id %>
@@ -13,6 +13,13 @@
13
13
  <small>L'adresse (ou URL) de la page, utilisée par les navigateurs web pour y accéder</small>
14
14
  </div>
15
15
  </div>
16
+ <div class="sibu_field">
17
+ <%= f.label :source, "Référence" %>
18
+ <div>
19
+ <%= f.text_field :source, placeholder: "Référence interne optionnelle (Ex: test mise en page 2) " %>
20
+ <small>Un bref descriptif de la page, à usage interne uniquement</small>
21
+ </div>
22
+ </div>
16
23
  <div class="sibu_field">
17
24
  <%= f.label :is_home, "Page d'accueil" %>
18
25
  <div>
@@ -56,6 +63,7 @@
56
63
  </div>
57
64
  </div>
58
65
  <%= f.hidden_field :site_id %>
66
+ <%= f.hidden_field :site_id %>
59
67
  <div class="sibu_actions">
60
68
  <%= f.submit 'Valider' %>
61
69
  <%= link_to 'Annuler', :back %>
@@ -1,5 +1,6 @@
1
1
  <h2>Modifier la carte</h2>
2
2
  <div id="edit_msg"></div>
3
+ <%= render 'element_actions' %>
3
4
  <div class="sibu_edit_form">
4
5
  <form class="edit_element_form" action="<%= update_element_site_page_path(@site.id, @page.id, format: :js) %>" accept-charset="UTF-8" method="patch">
5
6
  <div class="sibu_field">
@@ -2,7 +2,7 @@
2
2
  <div class="actions">
3
3
  <%= link_to 'Retour', :back %>
4
4
  </div>
5
- <h2>Modifier une page</h2>
5
+ <h2>Réglages de la page</h2>
6
6
  <div class="sibu_form">
7
7
  <%= render 'form' %>
8
8
  </div>
@@ -86,8 +86,8 @@ setTimeout(function() {
86
86
  document.querySelector("#clone_elt").style.display = "inline-block";
87
87
  document.querySelector("#duplicate_elt").style.display = "inline-block";
88
88
  <% else %>
89
- document.querySelector("#clone_elt").remove();
90
- document.querySelector("#duplicate_elt").remove();
89
+ if (document.querySelector("#clone_elt")) document.querySelector("#clone_elt").remove();
90
+ if (document.querySelector("#duplicate_elt")) document.querySelector("#duplicate_elt").remove();
91
91
  <% end %>
92
92
 
93
93
  <% if @children %>
@@ -1,6 +1,9 @@
1
1
  <div id="pages" class="sibu_view">
2
2
  <div class="actions">
3
- <%= link_to 'Créer une page', new_site_page_path(@site.id) %> <%= link_to 'Retour', :back %>
3
+ <%= link_to "Bibliothèque d'images", images_path %>
4
+ <%= link_to "Documents", documents_path %>
5
+ <%= link_to 'Créer une page', new_site_page_path(@site.id) %>
6
+ <%= link_to 'Retour', :back %>
4
7
  </div>
5
8
  <h2>Pages du site "<%= @site.name %>"</h2>
6
9
  <table>
@@ -8,7 +11,7 @@
8
11
  <tr>
9
12
  <th>Nom</th>
10
13
  <th>Chemin d'accès</th>
11
- <th>Origine</th>
14
+ <th>Référence</th>
12
15
  <th>Mise à jour</th>
13
16
  <th></th>
14
17
  </tr>
@@ -24,7 +27,7 @@
24
27
  <%= link_to 'Voir', site_page_path(@site.id, p), target: '_blank' %> |
25
28
  <%= link_to 'Editer', site_page_edit_content_path(site_id: @site.id, page_id: p.id) %> |
26
29
  <%= link_to 'Copier', duplicate_site_page_path(@site.id, p), method: :post, data: {confirm: "Copier la page \"#{p.name}\" ?"} %> |
27
- <%= link_to 'Paramétrer', edit_site_page_path(@site.id, p) %> |
30
+ <%= link_to 'Paramétrer cette page', edit_site_page_path(@site.id, p) %> |
28
31
  <%= link_to 'Supprimer', site_page_path(@site.id, p), method: :delete, data: {confirm: "Supprimer la page \"#{p.name}\" ?"} %>
29
32
  </td>
30
33
  </tr>
@@ -16,8 +16,8 @@
16
16
  <div class="sibu_field">
17
17
  <%= f.label :site_template_id, 'Modèle' %>
18
18
  <div>
19
- <%= f.collection_select(:site_template_id, Sibu::SiteTemplate.all, :id, :name, {prompt: 'Sélectionnez un modèle de site'}, disabled: @site.persisted?) %>
20
- <small>Choisissez le gabarit qui servira de modèle pour votre site (non modifiable après création)</small>
19
+ <%= f.collection_select(:site_template_id, Sibu::SiteTemplate.all.order(:name), :id, :name, {prompt: 'Sélectionnez un modèle de site'}, disabled: @site.persisted?) %>
20
+ <small>Choisissez le gabarit qui servira de modèle pour votre site (voir exemples ci-dessous - non modifiable après création)</small>
21
21
  </div>
22
22
  </div>
23
23
  <div class="sibu_field">
@@ -24,7 +24,7 @@
24
24
  <td><%= l s.updated_at %></td>
25
25
  <td colspan="2">
26
26
  <%= link_to 'Pages', site_pages_path(s) %> |
27
- <%= link_to 'Paramétrer', edit_site_path(s) %> |
27
+ <%= link_to 'Réglages du site', edit_site_path(s) %> |
28
28
  <%= link_to 'Copier', duplicate_site_path(s), method: :post, data: {confirm: "Copier le site \"#{s.name}\" ?"} %> |
29
29
  <%= link_to 'Supprimer', site_path(s), method: :delete, data: {confirm: "Supprimer le site \"#{s.name}\" ?"} %>
30
30
  </td>
@@ -8,7 +8,7 @@
8
8
  </div>
9
9
  <h2>Aperçu des modèles</h2>
10
10
  <div>
11
- <% Sibu::SiteTemplate.all.each do |st| %>
11
+ <% Sibu::SiteTemplate.all.order(:name).each do |st| %>
12
12
  <div class="sibu_template">
13
13
  <h3><%= st.name %></h3>
14
14
  <%= image_tag "#{st.path}1.jpg" %>
@@ -1,3 +1,3 @@
1
1
  module Sibu
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.5'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sibu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Baptiste Vilain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-27 00:00:00.000000000 Z
11
+ date: 2020-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails