sibu 1.0.0 → 1.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 +4 -4
- data/README.md +81 -4
- data/app/helpers/sibu/pages_helper.rb +38 -22
- data/app/views/layouts/sibu/edit_content.html.erb +23 -21
- data/lib/sibu/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6916799ff35b88c15850f4911c93517a43e8ba1f
|
4
|
+
data.tar.gz: ef515f1129ed26fdf3f156794e79ac402a37011d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 471eee1cd3b1388651e1771f65396748f48a5e59826552fda85588373cbd2e8df68fa6d0b0a99f6c33f43b0291cba853dd36ded178aa3ec6f2dadd510d968095
|
7
|
+
data.tar.gz: 913ed58b8942eb16f66b492536e7466927835ff9be32523335c3ec13dc3a1898d0f81aeeedbfda4eb6e38e41ef7a6491f698b5dccc1e334fb12fc160e255faf9
|
data/README.md
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
-
# Sibu
|
2
|
-
|
3
|
-
|
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
|
-
|
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
|
@@ -35,29 +35,53 @@ module Sibu
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
[:h1, :h2, :h3, :h4, :h5, :h6, :span].each do |t|
|
39
|
-
define_method(t) do |elt,
|
40
|
-
|
38
|
+
[:h1, :h2, :h3, :h4, :h5, :h6, :span, :p, :li].each do |t|
|
39
|
+
define_method(t) do |elt, opts = {}, &block|
|
40
|
+
t_id = elt.is_a?(Hash) ? elt["id"] : elt
|
41
|
+
defaults = {"id" => t_id, "text" => (t == :p ? Sibu::DEFAULT_PARAGRAPH : Sibu::DEFAULT_TEXT)}
|
41
42
|
content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
|
42
|
-
html_opts
|
43
|
+
html_opts = {"id" => t_id}.merge(opts.except(:repeat, :children).stringify_keys)
|
44
|
+
@sb_section = (@sb_section || []) + [t_id]
|
45
|
+
if action_name != 'show'
|
46
|
+
html_opts.merge!({
|
47
|
+
"data-id" => @sb_section[1..-1].join('|'),
|
48
|
+
"data-type" => (t == :p ? "paragraph" : "text"),
|
49
|
+
"data-repeat" => opts.delete(:repeat),
|
50
|
+
"data-children" => opts.delete(:children)
|
51
|
+
})
|
52
|
+
end
|
43
53
|
if block
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
54
|
+
if t == :p
|
55
|
+
html_output = content_tag(:div, content_tag(t, capture(content, nested_elements(elt), &block)), html_opts)
|
56
|
+
else
|
57
|
+
html_output = content_tag(t, capture(content, nested_elements(t_id), &block), html_opts)
|
58
|
+
end
|
48
59
|
else
|
49
|
-
|
60
|
+
if t == :p
|
61
|
+
html_output = content_tag(:div, content_tag(t, raw(content["text"]).html_safe, html_opts), html_opts)
|
62
|
+
else
|
63
|
+
html_output = content_tag(t, raw(content["text"]).html_safe, html_opts)
|
64
|
+
end
|
50
65
|
end
|
66
|
+
@sb_section -= [t_id]
|
67
|
+
html_output
|
51
68
|
end
|
52
69
|
end
|
53
70
|
|
54
|
-
[:div, :section, :article, :aside, :header, :footer, :nav, :main, :ul].each do |t|
|
55
|
-
define_method(t) do |elt,
|
71
|
+
[:div, :section, :article, :aside, :header, :footer, :nav, :main, :ul, :ol, :wrapper].each do |t|
|
72
|
+
define_method(t) do |elt, opts = {}, &block|
|
56
73
|
t_id = elt.is_a?(Hash) ? elt["id"] : elt
|
57
74
|
@sb_section = (@sb_section || []) + [t_id]
|
58
|
-
html_opts = {"id" => t_id}.merge(
|
59
|
-
|
60
|
-
|
75
|
+
html_opts = {"id" => t_id}.merge(opts.except(:repeat, :children).stringify_keys)
|
76
|
+
if action_name != 'show'
|
77
|
+
html_opts.merge!({
|
78
|
+
"data-id" => @sb_section[1..-1].join('|'),
|
79
|
+
"data-type" => "group",
|
80
|
+
"data-repeat" => opts.delete(:repeat),
|
81
|
+
"data-children" => opts.delete(:children)
|
82
|
+
})
|
83
|
+
end
|
84
|
+
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
85
|
@sb_section -= [t_id]
|
62
86
|
html_output
|
63
87
|
end
|
@@ -88,14 +112,6 @@ module Sibu
|
|
88
112
|
items.blank? ? [{"id" => "el#{Time.current.to_i}"}] : items
|
89
113
|
end
|
90
114
|
|
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
115
|
def img(elt, opts = {})
|
100
116
|
wrapper = opts.delete(:wrapper)
|
101
117
|
repeat = opts.delete(:repeat)
|
@@ -212,7 +212,7 @@
|
|
212
212
|
function initInnerOverlays(section) {
|
213
213
|
var editables = section.querySelectorAll("[data-type]");
|
214
214
|
for (var i = 0; i < editables.length; i++) {
|
215
|
-
if (editables[i].getAttribute("data-type") !== 'group' || editables[i].getAttribute("data-repeat")
|
215
|
+
if (editables[i].getAttribute("data-type") !== 'group' || editables[i].getAttribute("data-repeat") === 'true' || editables[i].getAttribute("data-children") === 'true') {
|
216
216
|
editables[i].addEventListener("mouseenter", function(evt) {
|
217
217
|
evt.stopPropagation();
|
218
218
|
evt.currentTarget.classList.add("sb-editable");
|
@@ -233,27 +233,29 @@
|
|
233
233
|
}
|
234
234
|
|
235
235
|
function initOverlays() {
|
236
|
-
|
237
|
-
|
236
|
+
setTimeout(function() {
|
237
|
+
var container = document.querySelector("#edit_overlays"), sections = document.querySelectorAll("[data-sb-id]");
|
238
|
+
container.innerHTML = "";
|
238
239
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
240
|
+
for (var i = 0; i < sections.length; i++) {
|
241
|
+
var sectionBox = sections[i].getBoundingClientRect();
|
242
|
+
var yOffset = sectionBox.top - document.querySelector(".sibu_content_panel").getBoundingClientRect().top;
|
243
|
+
var width = sections[i].offsetWidth, height = (sections[i].offsetHeight === 0 ? childrenHeight(sections[i]) : sections[i].offsetHeight);
|
244
|
+
var overlay = document.createElement("div");
|
245
|
+
overlay.setAttribute("data-sb-overlay", sections[i].getAttribute("data-sb-id"));
|
246
|
+
overlay.innerHTML = "Modifier";
|
247
|
+
container.appendChild(overlay);
|
248
|
+
overlay.style.top = yOffset + "px";
|
249
|
+
overlay.style.left = sectionBox.left + "px";
|
250
|
+
overlay.style.width = width + "px";
|
251
|
+
overlay.style.height = height + "px";
|
252
|
+
overlay.addEventListener("click", (function(section, offsetLeft, offsetTop, editWidth, editHeight) {
|
253
|
+
return function(evt) {
|
254
|
+
setEditMode(section, evt.currentTarget, offsetLeft, offsetTop, editWidth, editHeight);
|
255
|
+
};
|
256
|
+
})(sections[i], sectionBox.left, yOffset, width, height));
|
257
|
+
}
|
258
|
+
}, 800);
|
257
259
|
}
|
258
260
|
|
259
261
|
function childrenHeight(parentElt) {
|
data/lib/sibu/version.rb
CHANGED
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.
|
4
|
+
version: 1.0.1
|
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-
|
11
|
+
date: 2020-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|