sibu 0.1.5 → 0.1.6

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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/sibu/sibu.css +64 -1
  3. data/app/controllers/sibu/images_controller.rb +47 -0
  4. data/app/controllers/sibu/pages_controller.rb +7 -4
  5. data/app/controllers/sibu/sites_controller.rb +1 -1
  6. data/app/helpers/sibu/images_helper.rb +4 -0
  7. data/app/helpers/sibu/pages_helper.rb +55 -20
  8. data/app/models/concerns/sibu/image_uploader.rb +26 -2
  9. data/app/models/concerns/sibu/sections_concern.rb +11 -9
  10. data/app/models/sibu/image.rb +2 -0
  11. data/app/models/sibu/site.rb +10 -7
  12. data/app/models/sibu/site_template.rb +2 -0
  13. data/app/views/layouts/sibu/edit_content.html.erb +98 -45
  14. data/app/views/sibu/images/_form.html.erb +11 -0
  15. data/app/views/sibu/images/edit.html.erb +2 -0
  16. data/app/views/sibu/images/index.html.erb +10 -0
  17. data/app/views/sibu/images/new.html.erb +9 -0
  18. data/app/views/sibu/images/show.html.erb +2 -0
  19. data/app/views/sibu/pages/_link_edit_panel.html.erb +22 -0
  20. data/app/views/sibu/pages/_media_edit_panel.html.erb +25 -0
  21. data/app/views/sibu/pages/{_edit_panel.html.erb → _text_edit_panel.html.erb} +3 -3
  22. data/app/views/sibu/pages/edit_element.js.erb +16 -3
  23. data/app/views/sibu/pages/update_element.js.erb +9 -1
  24. data/config/initializers/shrine.rb +2 -2
  25. data/config/routes.rb +2 -0
  26. data/db/migrate/20180208082317_rename_images_user_id_to_site_id.rb +5 -0
  27. data/db/migrate/20180208125024_rename_image_data_column.rb +5 -0
  28. data/db/migrate/20180210181644_add_defaults_to_site_templates.rb +6 -0
  29. data/lib/sibu/engine.rb +1 -0
  30. data/lib/sibu/version.rb +1 -1
  31. metadata +43 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0759366a72fa83ad3e5c5ed0288d0c9f2f3c180
4
- data.tar.gz: d0d7497a1224778cbc8fc771d5e4ee864fab877f
3
+ metadata.gz: 3d01668ddff9c00c0ff68dcd8334ccab00b95a24
4
+ data.tar.gz: 1e78b2109e6a725646fe51c0e20e02630118d29f
5
5
  SHA512:
6
- metadata.gz: ae3b4f04caf0fe037407dd5a37093373a0490c67e0f4c46e4b570a8fc7cb23551fd6d91d9e9a7737af1875ae4ddbac40bac1ba93105ad29fbaf84367790277b4
7
- data.tar.gz: b7151b91df5c7ab7c04da668776175c5bc34ab03f7ab0fd486826b0ca9f9a0ec9be2c11914737e52a39855021d445abcb22eace1b831d56a6601e180e92f7d5c
6
+ metadata.gz: 0fe91b0963e43c828f0011536d81e165fadb46f774948b372f0f7d68c41ee1a5b4e0a86531f7e3300a8ae47de2166c803d0ee850c24f8ea4c5bca63b0d26a6b4
7
+ data.tar.gz: 4256d29e8642ce55a1577580fa013726f7326d9deb227bb042b492b9762a907e85db707423443caf452858c96dc9d809a635047ec0a930fcf9dbe3a2cf70ed3f
@@ -3,8 +3,70 @@
3
3
  *= require_self
4
4
  */
5
5
 
6
- sb-edit .sb-edit-active {
6
+ .sibu_content_panel {
7
+ position: relative
8
+ }
9
+
10
+ sb-edit {
11
+ position: relative;
12
+ }
13
+
14
+ sb-edit div.sb-overlay {
15
+ position: absolute;
16
+ z-index: 999;
17
+ opacity: 0;
18
+ background-color: rgba(0, 0, 0, 0.5);
19
+ cursor: pointer;
20
+ top: 0;
21
+ left: 0;
22
+ }
23
+
24
+ sb-edit div.sb-overlay a {
25
+ display: inline-block;
26
+ width: 100%;
27
+ height: 100%;
28
+ }
29
+
30
+ sb-edit .sb-editable {
7
31
  cursor: pointer;
32
+ outline: dashed rgba(94, 219, 255, 0.8) 2px;
33
+ outline-offset: -3px;
34
+ }
35
+
36
+ #edit_mode_overlay {
37
+ display: none;
38
+ }
39
+
40
+ #edit_mode_overlay > div {
41
+ position: absolute;
42
+ z-index: 999;
43
+ }
44
+
45
+ #edit_mode_overlay .overlay_top,
46
+ #edit_mode_overlay .overlay_bottom,
47
+ #edit_mode_overlay .overlay_left,
48
+ #edit_mode_overlay .overlay_right {
49
+ background-color: rgba(94, 219, 255, 0.5);
50
+ }
51
+
52
+ #edit_mode_overlay > .overlay_top {
53
+ top: 0;
54
+ left: 0;
55
+ width: 100%;
56
+ }
57
+
58
+ #edit_mode_overlay > .overlay_bottom {
59
+ bottom: 0;
60
+ left: 0;
61
+ width: 100%;
62
+ }
63
+
64
+ #edit_mode_overlay > .overlay_left {
65
+ left: 0;
66
+ }
67
+
68
+ #edit_mode_overlay > .overlay_right {
69
+ right: 0;
8
70
  }
9
71
 
10
72
  #edit_panel {
@@ -14,6 +76,7 @@ sb-edit .sb-edit-active {
14
76
  width: 100%;
15
77
  display: none;
16
78
  z-index: 1000;
79
+ background-color: white;
17
80
  }
18
81
 
19
82
  .trix-button-group--block-tools {
@@ -0,0 +1,47 @@
1
+ require_dependency "sibu/application_controller"
2
+
3
+ module Sibu
4
+ class ImagesController < ApplicationController
5
+ before_action :set_site, only: [:index, :new]
6
+
7
+ def index
8
+ @images = Sibu::Image.where(site_id: params[:site_id])
9
+ end
10
+
11
+ def new
12
+ @image = Sibu::Image.new(site_id: @site.id)
13
+ end
14
+
15
+ def create
16
+ @image = Sibu::Image.new(image_params)
17
+ if @image.save
18
+ redirect_to site_images_url(@image.site_id), notice: "L'image a bien été téléchargée."
19
+ else
20
+ flash.now[:alert] = "Une erreur s'est produite lors du téléchargement de l'image."
21
+ render :new
22
+ end
23
+ end
24
+
25
+ def show
26
+ end
27
+
28
+ def edit
29
+ end
30
+
31
+ def updateé
32
+ end
33
+
34
+ def destroy
35
+ end
36
+
37
+ private
38
+
39
+ def set_site
40
+ @site = Sibu::Site.find(params[:site_id])
41
+ end
42
+
43
+ def image_params
44
+ params.require(:image).permit!
45
+ end
46
+ end
47
+ end
@@ -16,7 +16,7 @@ module Sibu
16
16
  @site = Sibu::Site.find_by_domain(request.domain)
17
17
  if @site
18
18
  @page = @site.page(params[:path])
19
- @links = @site.internal_links
19
+ @links = @site.pages_path_by_id
20
20
  view_template = @page ? 'show' : @site.not_found
21
21
  else
22
22
  view_template = Rails.application.config.sibu[:not_found]
@@ -24,7 +24,7 @@ module Sibu
24
24
  else
25
25
  @site = Sibu::Site.find(params[:site_id])
26
26
  @page = Sibu::Page.find(params[:id])
27
- @links = @site.internal_links
27
+ @links = @site.pages_path_by_id
28
28
  view_template = 'show'
29
29
  end
30
30
 
@@ -38,7 +38,7 @@ module Sibu
38
38
  def create
39
39
  @page = Sibu::Page.new(page_params)
40
40
  if @page.save
41
- redirect_to site_pages_url(@page.site_id), "La page a bien été créée."
41
+ redirect_to site_pages_url(@page.site_id), notice: "La page a bien été créée."
42
42
  else
43
43
  flash.now[:alert] = "Une erreur s'est produite lors de la création de la page."
44
44
  render :new
@@ -63,11 +63,14 @@ module Sibu
63
63
  def edit_content
64
64
  @page = Sibu::Page.find(params[:page_id])
65
65
  @site = Sibu::Site.includes(:pages).find(@page.site_id) if @page
66
- @links = @site.internal_links if @site
66
+ @links = @site.pages_path_by_id if @site
67
67
  render :edit_content, layout: 'sibu/edit_content'
68
68
  end
69
69
 
70
70
  def edit_element
71
+ @content_type = params[:content_type]
72
+ @links = @site.pages_path_by_id if @site
73
+ @element = @entity.element(@section_id, @element_id)
71
74
  end
72
75
 
73
76
  def update_element
@@ -20,7 +20,7 @@ module Sibu
20
20
 
21
21
  def create
22
22
  @site = Sibu::Site.new(site_params)
23
- if @site.save_and_init(:default)
23
+ if @site.save_and_init
24
24
  redirect_to sites_url, notice: "Le site a bien été créé."
25
25
  else
26
26
  flash.now[:alert] = "Une erreur s'est produite lors de la création du site."
@@ -0,0 +1,4 @@
1
+ module Sibu
2
+ module ImagesHelper
3
+ end
4
+ end
@@ -18,9 +18,10 @@ module Sibu
18
18
  end
19
19
 
20
20
  [:h1, :h2, :h3, :h4, :h5, :h6, :p, :span, :div].each do |t|
21
- define_method(t) do |id_or_elt, html_opts = {}|
22
- content = id_or_elt.is_a?(Hash) ? (id_or_elt || {"text" => "Texte à modifier"}) : (select(id_or_elt) || {"text" => "Texte à modifier"})
23
- html_opts.merge!({class: "sb-#{t} #{html_opts[:class]}", data: {id: id_or_elt.is_a?(Hash) ? id_or_elt["id"] : id_or_elt}}) if action_name != 'show'
21
+ define_method(t) do |elt, html_opts = {}|
22
+ defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt,"text" => "Texte à modifier"}
23
+ content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
24
+ html_opts.merge!({class: "sb-#{t} #{html_opts[:class]}", data: {id: elt.is_a?(Hash) ? elt["id"] : elt}}) if action_name != 'show'
24
25
  content_tag(t, raw(content["text"]).html_safe, html_opts)
25
26
  end
26
27
  end
@@ -29,20 +30,36 @@ module Sibu
29
30
  self
30
31
  end
31
32
 
32
- def select(id)
33
- @sb_entity.section(@sb_section).select {|elt| elt["id"] == id}.first
33
+ def select_element(id)
34
+ @sb_entity.section(*@sb_section).select {|elt| elt["id"] == id}.first
34
35
  end
35
36
 
36
- def site_section(id, &block)
37
+ def site_section(id, sub_id = nil, &block)
37
38
  @sb_entity = @site
38
- @sb_section = id
39
- "<sb-edit data-id='#{id}'>#{capture(self, &block)}</sb-edit>".html_safe
39
+ @sb_section = sub_id ? [id, sub_id] : id
40
+ if block_given?
41
+ "<sb-edit data-id='#{id}' data-entity='site'>#{capture(self, &block)}</sb-edit>".html_safe
42
+ else
43
+ self
44
+ end
40
45
  end
41
46
 
42
- def section(id, &block)
47
+ def section(id, sub_id = nil, &block)
43
48
  @sb_entity = @page
44
- @sb_section = id
45
- "<sb-edit data-id='#{id}'>#{capture(self, &block)}</sb-edit>".html_safe
49
+ @sb_section = sub_id ? [id, sub_id] : id
50
+ "<sb-edit data-id='#{id}' data-entity='page'>#{capture(self, &block)}</sb-edit>".html_safe
51
+ end
52
+
53
+ def site_sections(id)
54
+ @site.section(id).map {|s| s["id"]}
55
+ end
56
+
57
+ def sections(id)
58
+ @page.section(id).map {|s| s["id"]}
59
+ end
60
+
61
+ def elements(id = nil)
62
+ id ? select_element(id)["elements"] : @sb_entity.section(*@sb_section)
46
63
  end
47
64
 
48
65
  def each
@@ -58,14 +75,24 @@ module Sibu
58
75
  end
59
76
  end
60
77
 
61
- def img(id_or_elt, html_opts = {})
62
- content = id_or_elt.is_a?(Hash) ? (id_or_elt || {"src" => "/default.jpg"}) : (select(id_or_elt) || {"src" => "/default.jpg"})
63
- opts = action_name == 'show' ? html_opts.merge({class: "sb-img #{html_opts[:class]}", data: {id: id_or_elt.is_a?(Hash) ? id_or_elt["id"] : id_or_elt}}) : html_opts
64
- content_tag(:img, nil, content.except("id").merge(opts))
78
+ def img(elt, html_opts = {})
79
+ defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "src" => "/default.jpg"}
80
+ content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
81
+ html_opts.merge!({class: "sb-img #{html_opts[:class]}", data: {id: elt.is_a?(Hash) ? elt["id"] : elt}}) if action_name != 'show'
82
+ content_tag(:img, nil, content.except("id").merge(html_opts))
83
+ end
84
+
85
+ def bg_img(elt, html_opts = {})
86
+ defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "src" => "/default.jpg"}
87
+ content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
88
+ html_opts.merge!({class: "sb-img #{html_opts[:class]}", data: {id: elt.is_a?(Hash) ? elt["id"] : elt}}) if action_name != 'show'
89
+ content_tag(:div, content_tag(:img, nil, content.except("id")), html_opts)
65
90
  end
66
91
 
67
- def link(id_or_elt, html_opts = {}, &block)
68
- content = id_or_elt.is_a?(Hash) ? (id_or_elt || {"value" => "", "text" => "Nouveau lien"}) : (select(id_or_elt) || {"value" => "", "text" => "Nouveau lien"})
92
+ def link(elt, html_opts = {}, &block)
93
+ defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "value" => "", "text" => "Nouveau lien"}
94
+ content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
95
+ html_opts.merge!({class: "sb-link #{html_opts[:class]}", data: {id: elt.is_a?(Hash) ? elt["id"] : elt}}) if action_name != 'show'
69
96
  val = content["value"] || ""
70
97
  if val.to_s.include?('http')
71
98
  href = val
@@ -79,10 +106,18 @@ module Sibu
79
106
  end
80
107
  end
81
108
 
82
- def form_label(id_or_elt, html_opts = {}, &block)
83
- content = id_or_elt.is_a?(Hash) ? (id_or_elt || {"text" => "Texte à modifier"}) : (select(id_or_elt) || {"text" => "Texte à modifier"})
84
- html_opts.merge!({class: "sb-label #{html_opts[:class]}", data: {id: id_or_elt.is_a?(Hash) ? id_or_elt["id"] : id_or_elt}}) if action_name != 'show'
109
+ def form_label(elt, html_opts = {}, &block)
110
+ defaults = {"id" => elt.is_a?(Hash) ? elt["id"] : elt, "text" => "Texte à modifier"}
111
+ content = defaults.merge(elt.is_a?(Hash) ? elt : (select_element(elt) || {}))
112
+ html_opts.merge!({class: "sb-label #{html_opts[:class]}", data: {id: elt.is_a?(Hash) ? elt["id"] : elt}}) if action_name != 'show'
85
113
  content_tag(:label, raw(content["text"]).html_safe, html_opts)
86
114
  end
115
+
116
+ def interactive_map(elt, html_opts = {}, &block)
117
+ defaults = {"data-lat" => "45.68854", "data-lng" => "5.91587", "data-title" => "Titre marqueur"}
118
+ content = elt.is_a?(Hash) ? defaults.merge(elt) : (select_element(elt) || {"id" => elt}).merge(defaults)
119
+ html_opts.merge!({class: "sb-map #{html_opts[:class]}", data: {id: elt.is_a?(Hash) ? elt["id"] : elt}}) if action_name != 'show'
120
+ content_tag(:div, nil, content.merge(html_opts))
121
+ end
87
122
  end
88
123
  end
@@ -1,3 +1,27 @@
1
- class ImageUploader < Shrine
2
- # plugins and uploading logic
1
+ require "image_processing/mini_magick"
2
+
3
+ class Sibu::ImageUploader < Shrine
4
+ include ImageProcessing::MiniMagick
5
+ plugin :processing
6
+ plugin :versions
7
+ plugin :delete_raw
8
+
9
+ process(:store) do |io, context|
10
+ original = io.download
11
+ images_config = Rails.application.config.sibu[:images]
12
+
13
+ large = resize_to_limit!(original, images_config[:large], images_config[:large]) { |cmd| cmd.auto_orient }
14
+ medium = resize_to_limit(large, images_config[:medium], images_config[:medium])
15
+ small = resize_to_limit(medium, images_config[:small], images_config[:small])
16
+
17
+ {original: io, large: large, medium: medium, small: small}
18
+ end
19
+
20
+ def generate_location(io, context)
21
+ site_id = context[:record].site_id
22
+ style = context[:version] != :original ? "resized" : "originals"
23
+ name = super
24
+
25
+ [site_id, style, name].compact.join("/")
26
+ end
3
27
  end
@@ -2,22 +2,24 @@ module Sibu
2
2
  module SectionsConcern
3
3
  include ActiveSupport::Concern
4
4
 
5
- def section(id)
5
+ def section(*ids)
6
6
  # elts = nil
7
- # if ids.length == 1
7
+ if ids.length == 1
8
8
  s = nil
9
9
  if sections.blank?
10
10
  self.sections = {}
11
11
  else
12
- s = sections[id]
12
+ s = sections[ids[0]]
13
13
  end
14
14
  if s.nil?
15
15
  s = []
16
- self.sections[id] = s
16
+ self.sections[ids[0]] = s
17
17
  save
18
18
  end
19
19
  s
20
- # elsif ids.length == 2
20
+ elsif ids.length == 2
21
+ subsection(*ids)
22
+ end
21
23
  # s = section(ids[0])
22
24
  # sub = s.select {|elt| elt["id"] == ids[1]}
23
25
  # unless sub
@@ -32,13 +34,13 @@ module Sibu
32
34
 
33
35
  def subsection(id, subid)
34
36
  s = section(id)
35
- sub = s.select {|elt| elt["id"] == ids[1]}
37
+ sub = s.select {|elt| elt["id"] == subid}.first
36
38
  unless sub
37
- sub = {"id" => ids[1], "elements" => []}
38
- self.sections[ids[0]] << sub
39
+ sub = {"id" => subid, "elements" => []}
40
+ self.sections[id] << sub
39
41
  save
40
42
  end
41
- elts = sub
43
+ sub["elements"]
42
44
  end
43
45
 
44
46
  def element(section_id, element_id)
@@ -1,5 +1,7 @@
1
1
  module Sibu
2
2
  class Image < ApplicationRecord
3
3
  include ImageUploader::Attachment.new(:file)
4
+
5
+ belongs_to :site, :class_name => 'Sibu::Site'
4
6
  end
5
7
  end
@@ -4,6 +4,7 @@ module Sibu
4
4
 
5
5
  belongs_to :site_template, :class_name => 'Sibu::SiteTemplate'
6
6
  has_many :pages, :class_name => 'Sibu::Page', dependent: :destroy
7
+ has_many :images, :class_name => 'Sibu::Image', dependent: :destroy
7
8
 
8
9
  validates_presence_of :name, :site_template
9
10
 
@@ -23,16 +24,18 @@ module Sibu
23
24
  pages.where(id: page_id).first
24
25
  end
25
26
 
26
- def save_and_init(source)
27
- ActiveRecord::Base.transaction do
28
- save!
29
- init_pages(source)
30
- init_sections(source)
27
+ def save_and_init
28
+ if valid?
29
+ self.sections = site_template.sections
30
+ site_template.pages.each do |p|
31
+ self.pages << Sibu::Page.new(p)
32
+ end
31
33
  end
34
+ save!
32
35
  end
33
36
 
34
- def internal_links
35
- Hash[pages.collect {|p| [p.id, p.path]}]
37
+ def pages_path_by_id
38
+ Hash[pages.collect {|p| [p.id.to_s, p.path]}]
36
39
  end
37
40
 
38
41
  def init_pages(source)
@@ -1,4 +1,6 @@
1
1
  module Sibu
2
2
  class SiteTemplate < ApplicationRecord
3
+ store :default_sections, accessors: [:sections], coder: JSON
4
+ store :default_pages, accessors: [:pages], coder: JSON
3
5
  end
4
6
  end
@@ -15,71 +15,124 @@
15
15
  <body>
16
16
  <% [:top_panel, :side_panel, :content_panel, :bottom_panel].each do |panel| %>
17
17
  <% unless conf[panel].blank? %>
18
- <div class="<%= 'sibu_panel' unless panel == :content_panel %>">
18
+ <div class="<%= panel == :content_panel ? 'sibu_content_panel' : 'sibu_panel' %>">
19
19
  <%= render conf[panel] %>
20
20
  </div>
21
21
  <% end %>
22
22
  <% end %>
23
23
  <div id="edit_panel" class="sibu_view"></div>
24
+ <div id="edit_mode_overlay">
25
+ <div class="overlay_top"></div>
26
+ <div class="overlay_right"></div>
27
+ <div class="overlay_left"></div>
28
+ <div class="overlay_bottom"></div>
29
+ <div class="edit_mode_actions">
30
+ <button onclick="cancelEditMode()">Fermer</button>
31
+ </div>
32
+ </div>
24
33
 
25
34
  <script>
35
+ const TEXT_TAGS = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'span'];
36
+ const IMG_TAGS = ['img'];
37
+ const LINK_TAGS = ['a'];
38
+
26
39
  $(function () {
27
40
  initOverlays();
28
41
  });
29
42
 
30
- function initOverlays() {
31
- const textTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'p', 'span'];
43
+ function setEditMode(elt) {
44
+ var offset = elt.offset();
45
+ var width = elt.width(), height = elt.height();
46
+ var overlay = $("#edit_mode_overlay");
47
+ overlay.find(".overlay_top").css("height", offset.top);
48
+ overlay.find(".overlay_bottom").css("top", offset.top + height);
49
+ overlay.find(".overlay_left").css({"height": height, "width": offset.left, "top": offset.top});
50
+ overlay.find(".overlay_right").css({"height": height, "left": offset.left + width, "top": offset.top});
51
+ overlay.find(".edit_mode_actions").css({"top": (offset.top <= 40 ? (offset.top + height) : (offset.top - 40)), left: offset.left, width: width});
52
+ overlay.show();
53
+ initInnerOverlays(elt);
54
+ elt.remove();
55
+ }
56
+
57
+ function cancelEditMode() {
58
+ $("#edit_mode_overlay").hide();
59
+ cancelEdit();
60
+ initOverlays();
61
+ }
62
+
63
+ function cancelEdit() {
64
+ $("#edit_panel").slideUp("fast");
65
+ }
66
+
67
+ function editContent(eltId, sectionId, entity, contentType) {
68
+ $.ajax({
69
+ url: "<%= edit_element_site_page_path(@site.id, @page.id) %>",
70
+ method: "GET",
71
+ data: {
72
+ element_id: eltId,
73
+ section_id: sectionId,
74
+ entity: entity,
75
+ content_type: contentType
76
+ }
77
+ })
78
+ }
32
79
 
33
- var elts = $("[class*='sb-']");
34
- elts.each(function () {
35
- var previous;
36
- var elt = $(this), tag = elt.prop("tagName").toLowerCase(), width = elt.width(),
37
- height = elt.height(), display = elt.css("display"), padding = elt.css("padding"), margin = elt.css("margin");
80
+ function initInnerOverlays(elt) {
81
+ var editables = elt.parents("sb-edit").first().find("[class*='sb-']");
82
+ editables.off();
83
+ editables.hover(function() {
84
+ $(this).addClass("sb-editable");
85
+ }, function() {
86
+ $(this).removeClass("sb-editable");
87
+ });
88
+ editables.click(function(evt) {
89
+ evt.preventDefault();
90
+ var elt = $(this), tag = elt.prop("tagName").toLowerCase();
38
91
  var section = elt.parents("sb-edit").first();
39
92
  var eltId = elt.data("id"), sectionId = section.data("id"), entity = section.data("entity");
40
- var overlayElt = $(editOverlay(width, height, display, padding, margin));
41
- bindMouseEnter(elt, overlayElt, eltId, sectionId, entity);
42
- });
93
+ if (TEXT_TAGS.indexOf(tag) !== -1) {
94
+ editContent(eltId, sectionId, entity, 'text');
95
+ } else if (IMG_TAGS.indexOf(tag) !== -1 || elt.hasClass('sb-img')) {
96
+ editContent(eltId, sectionId, entity, 'media');
97
+ } else if (LINK_TAGS.indexOf(tag) !== -1) {
98
+ editContent(eltId, sectionId, entity, 'link');
99
+ } else {
100
+ console.log('Sibu - Unsupported tag type : ' + tag);
101
+ }
102
+ })
103
+ }
43
104
 
44
- function bindMouseEnter(element, overlay, elementId, sectionId, entity) {
45
- element.mouseenter(function () {
46
- overlay.replaceAll(element);
47
- overlay.addClass("sb-edit-active sibu_panel");
48
- overlay.click(function() {
49
- editContent(elementId, sectionId, entity)
50
- });
51
- bindMouseLeave(element, overlay, elementId, sectionId, entity);
52
- });
53
- }
105
+ function initOverlays() {
106
+ $("div.sb-overlay").remove();
107
+ $("sb-edit").each(function() {
108
+ var elt = $(this);
109
+ elt.prepend("<div class='sb-overlay'><a>Modifier</a></div>");
110
+ var overlay = elt.find(".sb-overlay");
111
+ var dimensions = overlayDimensions(overlay, elt);
112
+ overlay.width(dimensions.width);
113
+ overlay.height(dimensions.height);
54
114
 
55
- function bindMouseLeave(element, overlay, elementId, sectionId, entity) {
56
- overlay.mouseleave(function() {
57
- overlay.removeClass("sb-edit-active sibu_panel");
58
- element.replaceAll(overlay);
59
- bindMouseEnter(element, overlay, elementId, sectionId, entity);
115
+ elt.hover(function() {
116
+ overlay.css("opacity", 1);
117
+ }, function() {
118
+ overlay.css("opacity", 0);
60
119
  });
61
- }
62
120
 
63
- function editOverlay(width, height, display, padding, margin) {
64
- return '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ' +
65
- 'style="box-sizing: content-box; display: ' + display + '; padding: ' + padding + '; margin: ' + margin + ';"' +
66
- 'viewBox="0 0 ' + width + ' ' + height + '" width="' + width + 'px" height="' + height + 'px">' +
67
- '<rect width="' + width + '" height="' + height + '" x="0" y="0" fill="#dedede"/>' +
68
- '</svg>';
69
- }
70
-
71
- function editContent(eltId, sectionId, entity) {
72
- $.ajax({
73
- url: "<%= edit_element_site_page_path(@site.id, @page.id) %>",
74
- method: "GET",
75
- data: {
76
- element_id: eltId,
77
- section_id: sectionId,
78
- entity: entity
79
- }
121
+ overlay.click(function() {
122
+ setEditMode($(this));
80
123
  })
81
- }
124
+ });
125
+ }
82
126
 
127
+ function overlayDimensions(overlay, element) {
128
+ var children = element.find("> *:not(.sb-overlay)");
129
+ var width = - +children.first().css("margin-left").replace("px", ""), height = - +children.first().css("margin-top").replace("px", "");
130
+ var maxWidth = element.parent().outerWidth(true), maxHeight = element.parent().outerHeight(true);
131
+ element.find("> *:not(.sb-overlay)").each(function() {
132
+ width = width + $(this).outerWidth(true);
133
+ height = height + $(this).outerHeight(true);
134
+ });
135
+ return {width: Math.min(width, maxWidth), height: Math.min(height, maxHeight)};
83
136
  }
84
137
  </script>
85
138
  <%= yield :scripts %>
@@ -0,0 +1,11 @@
1
+ <%= form_for([@site, @image]) do |f| %>
2
+ <div class="sibu_field">
3
+ <%= f.hidden_field :file, value: @image.cached_file_data %>
4
+ <%= f.file_field :file %>
5
+ </div>
6
+ <%= f.hidden_field :site_id %>
7
+ <div class="sibu_actions">
8
+ <%= f.submit 'Valider' %>
9
+ <%= link_to 'Annuler', :back %>
10
+ </div>
11
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h1>Images#edit</h1>
2
+ <p>Find me in app/views/sibu/images/edit.html.erb</p>
@@ -0,0 +1,10 @@
1
+ <div id="pages" class="sibu_view">
2
+ <div class="actions">
3
+ <%= link_to 'Télécharger une image', new_site_image_path(@site.id) %> | <%= link_to 'Retour', :back %>
4
+ </div>
5
+ <h2>Images du site "<%= @site.name %>"</h2>
6
+ <% @images.each do |image| %>
7
+ <div class="sibu_image"><%= image_tag image.file_url(:small) %></div>
8
+ <% end %>
9
+ </div>
10
+
@@ -0,0 +1,9 @@
1
+ <div class="sibu_view">
2
+ <div class="actions">
3
+ <%= link_to 'Retour', :back %>
4
+ </div>
5
+ <h2>Télécharger une image</h2>
6
+ <div class="sibu_form">
7
+ <%= render 'form' %>
8
+ </div>
9
+ </div>
@@ -0,0 +1,2 @@
1
+ <h1>Images#show</h1>
2
+ <p>Find me in app/views/sibu/images/show.html.erb</p>
@@ -0,0 +1,22 @@
1
+ <h2>Modifier le lien</h2>
2
+ <div id="edit_msg"></div>
3
+ <div class="sibu_form">
4
+ <%= form_tag(update_element_site_page_path(@site.id, @page.id), method: :patch, remote: true) do |f| %>
5
+ <div class="sibu_field">
6
+ <%= label_tag 'element[text]', 'Libellé' %>
7
+ <%= text_field_tag 'element[text]', @element["text"] %>
8
+ </div>
9
+ <div class="sibu_field">
10
+ <%= label_tag 'element[value]', 'Lien' %>
11
+ <%= select_tag 'element[value]', options_from_collection_for_select(@site.pages, :id, :name, @element["value"]),
12
+ {prompt: 'Sélectionnez une page'} %>
13
+ </div>
14
+ <%= hidden_field_tag 'element[id]', @element["id"] %>
15
+ <%= hidden_field_tag :section_id, @section_id %>
16
+ <%= hidden_field_tag :entity, @entity_type %>
17
+ <div class="sibu_actions">
18
+ <%= submit_tag 'Valider' %>
19
+ <%= link_to 'Annuler', '#', onclick: 'cancelEdit(); return false;' %>
20
+ </div>
21
+ <% end %>
22
+ </div>
@@ -0,0 +1,25 @@
1
+ <h2>Modifier l'image</h2>
2
+ <div id="edit_msg"></div>
3
+ <div class="sibu_form">
4
+ <%= form_tag(update_element_site_page_path(@site.id, @page.id), method: :patch, remote: true) do |f| %>
5
+ <div class="sibu_select_images">
6
+ <% @site.images.each do |image| %>
7
+ <div class="sibu_image">
8
+ <%= image_tag image.file_url(:small) %>
9
+ </div>
10
+ <% end %>
11
+ </div>
12
+ <div class="sibu_field">
13
+ <%= label_tag 'element[alt]', 'Texte alternatif' %>
14
+ <%= text_field_tag 'element[alt]', @element["alt"] %>
15
+ </div>
16
+ <%= hidden_field_tag 'element[id]', @element["id"] %>
17
+ <%= hidden_field_tag 'element[src]', @element["src"] %>
18
+ <%= hidden_field_tag :section_id, @section_id %>
19
+ <%= hidden_field_tag :entity, @entity_type %>
20
+ <div class="sibu_actions">
21
+ <%= submit_tag 'Valider' %>
22
+ <%= link_to 'Annuler', '#', onclick: '$("#edit_panel").slideUp("fast"); return false;' %>
23
+ </div>
24
+ <% end %>
25
+ </div>
@@ -1,14 +1,14 @@
1
- <h2>Modifier l'élément</h2>
1
+ <h2>Modifier le texte</h2>
2
2
  <div id="edit_msg"></div>
3
3
  <div class="sibu_form">
4
4
  <%= form_tag(update_element_site_page_path(@site.id, @page.id), method: :patch, remote: true) do |f| %>
5
5
  <%= trix_editor_tag 'element[text]', '', input: 'element_text' %>
6
- <%= hidden_field_tag 'element[id]', @element_id %>
6
+ <%= hidden_field_tag 'element[id]', @element["id"] %>
7
7
  <%= hidden_field_tag :section_id, @section_id %>
8
8
  <%= hidden_field_tag :entity, @entity_type %>
9
9
  <div class="sibu_actions">
10
10
  <%= submit_tag 'Valider' %>
11
- <%= link_to 'Annuler', '#', onclick: '$("#edit_panel").slideUp("fast"); return false;' %>
11
+ <%= link_to 'Annuler', '#', onclick: 'cancelEdit(); return false;' %>
12
12
  </div>
13
13
  <% end %>
14
14
  </div>
@@ -1,5 +1,18 @@
1
1
  var editPanel = $("#edit_panel");
2
- editPanel.html("<%= j(render 'edit_panel') %>");
3
- var editorElt = editPanel.find("trix-editor")[0];
4
- editorElt.editor.loadHTML("<%= raw(@entity.element(@section_id, @element_id)["text"].gsub("\n", "<br/>")) %>");
2
+ editPanel.html("");
3
+ <% if @content_type == 'text' %>
4
+ <% text_value = @element["text"] || 'Texte à modifier' %>
5
+ editPanel.html("<%= j(render 'text_edit_panel') %>");
6
+ var editorElt = editPanel.find("trix-editor")[0];
7
+ editorElt.editor.loadHTML("<%= raw(text_value.gsub("\n", "<br/>")) %>");
8
+ <% elsif @content_type == 'media' %>
9
+ editPanel.html("<%= j(render 'media_edit_panel') %>");
10
+ editPanel.find(".sibu_image img").click(function() {
11
+ $("#element_src").val($(this).attr("src"));
12
+ });
13
+ <% elsif @content_type == 'link' %>
14
+ editPanel.html("<%= j(render 'link_edit_panel') %>");
15
+ <% end %>
16
+
17
+
5
18
  editPanel.slideDown("fast");
@@ -2,5 +2,13 @@
2
2
  $("#edit_panel #edit_msg").html("<p class='sibu_alert'>Une erreur s'est produite lors de l'enregistrement.</p>");
3
3
  <% else %>
4
4
  $("#edit_panel").slideUp();
5
- $("sb-edit[data-id='<%= @section_id %>']").find("[data-id='<%= @updated["id"] %>']").html("<%= j(raw @updated["text"]) %>");
5
+ var updatedElt = $("sb-edit[data-id='<%= @section_id %>']").find("[data-id='<%= @updated["id"] %>']");
6
+ <% if @updated["text"] %>
7
+ updatedElt.html("<%= j(raw @updated["text"]) %>");
8
+ <% end %>
9
+ <% unless @updated.except("id", "text").blank? %>
10
+ <% @updated.except("id", "text").each_pair do |attr, val| %>
11
+ updatedElt.attr("<%= attr %>", "<%= val %>");
12
+ <% end %>
13
+ <% end %>
6
14
  <% end %>
@@ -2,8 +2,8 @@ require "shrine"
2
2
  require "shrine/storage/file_system"
3
3
 
4
4
  Shrine.storages = {
5
- cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"), # temporary
6
- store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/store"), # permanent
5
+ cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"),
6
+ store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/store"),
7
7
  }
8
8
 
9
9
  Shrine.plugin :activerecord
data/config/routes.rb CHANGED
@@ -12,6 +12,8 @@ Sibu::Engine.routes.draw do
12
12
  patch 'update_element', on: :member
13
13
  patch 'update_section', on: :member
14
14
  end
15
+
16
+ resources :images
15
17
  end
16
18
  end
17
19
  end
@@ -0,0 +1,5 @@
1
+ class RenameImagesUserIdToSiteId < ActiveRecord::Migration[5.1]
2
+ def change
3
+ rename_column :sibu_images, :user_id, :site_id
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class RenameImageDataColumn < ActiveRecord::Migration[5.1]
2
+ def change
3
+ rename_column :sibu_images, :data, :file_data
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddDefaultsToSiteTemplates < ActiveRecord::Migration[5.1]
2
+ def change
3
+ add_column :sibu_site_templates, :default_sections, :text
4
+ add_column :sibu_site_templates, :default_pages, :text
5
+ end
6
+ end
data/lib/sibu/engine.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'jquery-rails'
1
2
  require 'trix'
2
3
 
3
4
  module Sibu
data/lib/sibu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sibu
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.6'
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: 0.1.5
4
+ version: 0.1.6
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: 2018-02-01 00:00:00.000000000 Z
11
+ date: 2018-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: image_processing
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.4'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mini_magick
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.3'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.3'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: jquery-rails
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -95,9 +123,11 @@ files:
95
123
  - app/assets/javascripts/sibu/sibu.js.erb
96
124
  - app/assets/stylesheets/sibu/sibu.css
97
125
  - app/controllers/sibu/application_controller.rb
126
+ - app/controllers/sibu/images_controller.rb
98
127
  - app/controllers/sibu/pages_controller.rb
99
128
  - app/controllers/sibu/sites_controller.rb
100
129
  - app/helpers/sibu/application_helper.rb
130
+ - app/helpers/sibu/images_helper.rb
101
131
  - app/helpers/sibu/pages_helper.rb
102
132
  - app/helpers/sibu/sites_helper.rb
103
133
  - app/jobs/sibu/application_job.rb
@@ -112,8 +142,15 @@ files:
112
142
  - app/views/layouts/sibu/application.html.erb
113
143
  - app/views/layouts/sibu/edit_content.html.erb
114
144
  - app/views/layouts/sibu/site.html.erb
115
- - app/views/sibu/pages/_edit_panel.html.erb
145
+ - app/views/sibu/images/_form.html.erb
146
+ - app/views/sibu/images/edit.html.erb
147
+ - app/views/sibu/images/index.html.erb
148
+ - app/views/sibu/images/new.html.erb
149
+ - app/views/sibu/images/show.html.erb
116
150
  - app/views/sibu/pages/_form.html.erb
151
+ - app/views/sibu/pages/_link_edit_panel.html.erb
152
+ - app/views/sibu/pages/_media_edit_panel.html.erb
153
+ - app/views/sibu/pages/_text_edit_panel.html.erb
117
154
  - app/views/sibu/pages/destroy.html.erb
118
155
  - app/views/sibu/pages/edit.html.erb
119
156
  - app/views/sibu/pages/edit_content.html.erb
@@ -140,6 +177,9 @@ files:
140
177
  - db/migrate/20180126114522_rename_url_to_path_in_pages.rb
141
178
  - db/migrate/20180126114628_add_domain_to_sites.rb
142
179
  - db/migrate/20180127211533_create_sibu_images.rb
180
+ - db/migrate/20180208082317_rename_images_user_id_to_site_id.rb
181
+ - db/migrate/20180208125024_rename_image_data_column.rb
182
+ - db/migrate/20180210181644_add_defaults_to_site_templates.rb
143
183
  - lib/sibu.rb
144
184
  - lib/sibu/engine.rb
145
185
  - lib/sibu/version.rb