sibu 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/sibu/empty.png +0 -0
- data/app/assets/javascripts/cropper/cropper.js +3695 -0
- data/app/assets/javascripts/sibu/sibu.js.erb +25 -0
- data/app/assets/stylesheets/cropper/cropper.css +305 -0
- data/app/assets/stylesheets/sibu/sibu.css +1 -0
- data/app/controllers/sibu/application_controller.rb +4 -0
- data/app/controllers/sibu/images_controller.rb +7 -11
- data/app/controllers/sibu/pages_controller.rb +14 -4
- data/app/controllers/sibu/sites_controller.rb +13 -3
- data/app/helpers/sibu/application_helper.rb +4 -0
- data/app/helpers/sibu/pages_helper.rb +1 -9
- data/app/helpers/sibu/sites_helper.rb +8 -4
- data/app/models/concerns/sibu/image_uploader.rb +2 -2
- data/app/models/concerns/sibu/user_concern.rb +9 -0
- data/app/models/sibu/image.rb +12 -4
- data/app/models/sibu/page.rb +12 -1
- data/app/models/sibu/site.rb +19 -2
- data/app/views/sibu/images/_edit_form.html.erb +4 -4
- data/app/views/sibu/images/_form.html.erb +2 -2
- data/app/views/sibu/images/index.html.erb +3 -3
- data/app/views/sibu/images/new.html.erb +4 -0
- data/app/views/sibu/pages/_form.html.erb +0 -7
- data/app/views/sibu/pages/_media_edit_panel.html.erb +24 -12
- data/app/views/sibu/pages/edit_element.js.erb +54 -39
- data/app/views/sibu/pages/index.html.erb +1 -0
- data/app/views/sibu/pages/update_element.js.erb +1 -1
- data/app/views/sibu/sites/_form.html.erb +35 -13
- data/app/views/sibu/sites/edit.html.erb +1 -0
- data/app/views/sibu/sites/index.html.erb +4 -1
- data/config/routes.rb +4 -2
- data/db/migrate/20180321144021_move_images_to_user_level.rb +7 -0
- data/db/migrate/20180321170310_add_version_to_sibu_sites.rb +7 -0
- data/lib/sibu/version.rb +1 -1
- metadata +8 -3
- data/app/views/sibu/pages/_custom_styles.html.erb +0 -23
@@ -2,6 +2,7 @@
|
|
2
2
|
//= require jquery_ujs
|
3
3
|
//= require sibu/common
|
4
4
|
//= require ../quill/quill
|
5
|
+
//= require ../cropper/cropper
|
5
6
|
//= require_self
|
6
7
|
|
7
8
|
var Inline = Quill.import('blots/inline');
|
@@ -77,3 +78,27 @@ function initQuillEditor(container) {
|
|
77
78
|
|
78
79
|
return quill;
|
79
80
|
}
|
81
|
+
|
82
|
+
|
83
|
+
function initCropper(imgId) {
|
84
|
+
var wrapper = $(".sibu_crop").first();
|
85
|
+
var srcImg = $("#content_panel").find(".sb-editing img[data-id='" + imgId + "']").first();
|
86
|
+
var srcContainer = srcImg.parent();
|
87
|
+
var ratio = parseFloat(srcContainer.css("width")) / parseFloat(wrapper.css("width"));
|
88
|
+
wrapper.css("height", (parseFloat(srcContainer.css("height")) / ratio) + "px");
|
89
|
+
var cropper = new Cropper(wrapper.find("img")[0], {
|
90
|
+
crop: function(event) {
|
91
|
+
var data = event.detail;
|
92
|
+
var cropper = this.cropper;
|
93
|
+
var imageData = cropper.getImageData();
|
94
|
+
var previewWidth = parseFloat(srcContainer.css("width"));
|
95
|
+
var imageScaledRatio = data.width / previewWidth;
|
96
|
+
var width = imageData.naturalWidth / imageScaledRatio + 'px';
|
97
|
+
var height = imageData.naturalHeight / imageScaledRatio + 'px';
|
98
|
+
var marginLeft = -data.x / imageScaledRatio + 'px';
|
99
|
+
var marginTop = -data.y / imageScaledRatio + 'px';
|
100
|
+
|
101
|
+
$("#element_style").val("width: " + width + "; height: " + height + "; margin-left: " + marginLeft + "; margin-top: " + marginTop +"; max-width: none; max-height: none;");
|
102
|
+
}
|
103
|
+
});
|
104
|
+
}
|
@@ -0,0 +1,305 @@
|
|
1
|
+
/*!
|
2
|
+
* Cropper.js v1.3.3
|
3
|
+
* https://github.com/fengyuanchen/cropperjs
|
4
|
+
*
|
5
|
+
* Copyright (c) 2015-2018 Chen Fengyuan
|
6
|
+
* Released under the MIT license
|
7
|
+
*
|
8
|
+
* Date: 2018-03-18T03:19:07.619Z
|
9
|
+
*/
|
10
|
+
|
11
|
+
.cropper-container {
|
12
|
+
direction: ltr;
|
13
|
+
font-size: 0;
|
14
|
+
line-height: 0;
|
15
|
+
position: relative;
|
16
|
+
-ms-touch-action: none;
|
17
|
+
touch-action: none;
|
18
|
+
-webkit-user-select: none;
|
19
|
+
-moz-user-select: none;
|
20
|
+
-ms-user-select: none;
|
21
|
+
user-select: none;
|
22
|
+
}
|
23
|
+
|
24
|
+
.cropper-container img {/*Avoid margin top issue (Occur only when margin-top <= -height)
|
25
|
+
*/
|
26
|
+
display: block;
|
27
|
+
height: 100%;
|
28
|
+
image-orientation: 0deg;
|
29
|
+
max-height: none !important;
|
30
|
+
max-width: none !important;
|
31
|
+
min-height: 0 !important;
|
32
|
+
min-width: 0 !important;
|
33
|
+
width: 100%;
|
34
|
+
}
|
35
|
+
|
36
|
+
.cropper-wrap-box,
|
37
|
+
.cropper-canvas,
|
38
|
+
.cropper-drag-box,
|
39
|
+
.cropper-crop-box,
|
40
|
+
.cropper-modal {
|
41
|
+
bottom: 0;
|
42
|
+
left: 0;
|
43
|
+
position: absolute;
|
44
|
+
right: 0;
|
45
|
+
top: 0;
|
46
|
+
}
|
47
|
+
|
48
|
+
.cropper-wrap-box,
|
49
|
+
.cropper-canvas {
|
50
|
+
overflow: hidden;
|
51
|
+
}
|
52
|
+
|
53
|
+
.cropper-drag-box {
|
54
|
+
background-color: #fff;
|
55
|
+
opacity: 0;
|
56
|
+
}
|
57
|
+
|
58
|
+
.cropper-modal {
|
59
|
+
background-color: #000;
|
60
|
+
opacity: .5;
|
61
|
+
}
|
62
|
+
|
63
|
+
.cropper-view-box {
|
64
|
+
display: block;
|
65
|
+
height: 100%;
|
66
|
+
outline-color: rgba(51, 153, 255, 0.75);
|
67
|
+
outline: 1px solid #39f;
|
68
|
+
overflow: hidden;
|
69
|
+
width: 100%;
|
70
|
+
}
|
71
|
+
|
72
|
+
.cropper-dashed {
|
73
|
+
border: 0 dashed #eee;
|
74
|
+
display: block;
|
75
|
+
opacity: .5;
|
76
|
+
position: absolute;
|
77
|
+
}
|
78
|
+
|
79
|
+
.cropper-dashed.dashed-h {
|
80
|
+
border-bottom-width: 1px;
|
81
|
+
border-top-width: 1px;
|
82
|
+
height: 33.33333%;
|
83
|
+
left: 0;
|
84
|
+
top: 33.33333%;
|
85
|
+
width: 100%;
|
86
|
+
}
|
87
|
+
|
88
|
+
.cropper-dashed.dashed-v {
|
89
|
+
border-left-width: 1px;
|
90
|
+
border-right-width: 1px;
|
91
|
+
height: 100%;
|
92
|
+
left: 33.33333%;
|
93
|
+
top: 0;
|
94
|
+
width: 33.33333%;
|
95
|
+
}
|
96
|
+
|
97
|
+
.cropper-center {
|
98
|
+
display: block;
|
99
|
+
height: 0;
|
100
|
+
left: 50%;
|
101
|
+
opacity: .75;
|
102
|
+
position: absolute;
|
103
|
+
top: 50%;
|
104
|
+
width: 0;
|
105
|
+
}
|
106
|
+
|
107
|
+
.cropper-center:before,
|
108
|
+
.cropper-center:after {
|
109
|
+
background-color: #eee;
|
110
|
+
content: ' ';
|
111
|
+
display: block;
|
112
|
+
position: absolute;
|
113
|
+
}
|
114
|
+
|
115
|
+
.cropper-center:before {
|
116
|
+
height: 1px;
|
117
|
+
left: -3px;
|
118
|
+
top: 0;
|
119
|
+
width: 7px;
|
120
|
+
}
|
121
|
+
|
122
|
+
.cropper-center:after {
|
123
|
+
height: 7px;
|
124
|
+
left: 0;
|
125
|
+
top: -3px;
|
126
|
+
width: 1px;
|
127
|
+
}
|
128
|
+
|
129
|
+
.cropper-face,
|
130
|
+
.cropper-line,
|
131
|
+
.cropper-point {
|
132
|
+
display: block;
|
133
|
+
height: 100%;
|
134
|
+
opacity: .1;
|
135
|
+
position: absolute;
|
136
|
+
width: 100%;
|
137
|
+
}
|
138
|
+
|
139
|
+
.cropper-face {
|
140
|
+
background-color: #fff;
|
141
|
+
left: 0;
|
142
|
+
top: 0;
|
143
|
+
}
|
144
|
+
|
145
|
+
.cropper-line {
|
146
|
+
background-color: #39f;
|
147
|
+
}
|
148
|
+
|
149
|
+
.cropper-line.line-e {
|
150
|
+
cursor: ew-resize;
|
151
|
+
right: -3px;
|
152
|
+
top: 0;
|
153
|
+
width: 5px;
|
154
|
+
}
|
155
|
+
|
156
|
+
.cropper-line.line-n {
|
157
|
+
cursor: ns-resize;
|
158
|
+
height: 5px;
|
159
|
+
left: 0;
|
160
|
+
top: -3px;
|
161
|
+
}
|
162
|
+
|
163
|
+
.cropper-line.line-w {
|
164
|
+
cursor: ew-resize;
|
165
|
+
left: -3px;
|
166
|
+
top: 0;
|
167
|
+
width: 5px;
|
168
|
+
}
|
169
|
+
|
170
|
+
.cropper-line.line-s {
|
171
|
+
bottom: -3px;
|
172
|
+
cursor: ns-resize;
|
173
|
+
height: 5px;
|
174
|
+
left: 0;
|
175
|
+
}
|
176
|
+
|
177
|
+
.cropper-point {
|
178
|
+
background-color: #39f;
|
179
|
+
height: 5px;
|
180
|
+
opacity: .75;
|
181
|
+
width: 5px;
|
182
|
+
}
|
183
|
+
|
184
|
+
.cropper-point.point-e {
|
185
|
+
cursor: ew-resize;
|
186
|
+
margin-top: -3px;
|
187
|
+
right: -3px;
|
188
|
+
top: 50%;
|
189
|
+
}
|
190
|
+
|
191
|
+
.cropper-point.point-n {
|
192
|
+
cursor: ns-resize;
|
193
|
+
left: 50%;
|
194
|
+
margin-left: -3px;
|
195
|
+
top: -3px;
|
196
|
+
}
|
197
|
+
|
198
|
+
.cropper-point.point-w {
|
199
|
+
cursor: ew-resize;
|
200
|
+
left: -3px;
|
201
|
+
margin-top: -3px;
|
202
|
+
top: 50%;
|
203
|
+
}
|
204
|
+
|
205
|
+
.cropper-point.point-s {
|
206
|
+
bottom: -3px;
|
207
|
+
cursor: s-resize;
|
208
|
+
left: 50%;
|
209
|
+
margin-left: -3px;
|
210
|
+
}
|
211
|
+
|
212
|
+
.cropper-point.point-ne {
|
213
|
+
cursor: nesw-resize;
|
214
|
+
right: -3px;
|
215
|
+
top: -3px;
|
216
|
+
}
|
217
|
+
|
218
|
+
.cropper-point.point-nw {
|
219
|
+
cursor: nwse-resize;
|
220
|
+
left: -3px;
|
221
|
+
top: -3px;
|
222
|
+
}
|
223
|
+
|
224
|
+
.cropper-point.point-sw {
|
225
|
+
bottom: -3px;
|
226
|
+
cursor: nesw-resize;
|
227
|
+
left: -3px;
|
228
|
+
}
|
229
|
+
|
230
|
+
.cropper-point.point-se {
|
231
|
+
bottom: -3px;
|
232
|
+
cursor: nwse-resize;
|
233
|
+
height: 20px;
|
234
|
+
opacity: 1;
|
235
|
+
right: -3px;
|
236
|
+
width: 20px;
|
237
|
+
}
|
238
|
+
|
239
|
+
@media (min-width: 768px) {
|
240
|
+
.cropper-point.point-se {
|
241
|
+
height: 15px;
|
242
|
+
width: 15px;
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
@media (min-width: 992px) {
|
247
|
+
.cropper-point.point-se {
|
248
|
+
height: 10px;
|
249
|
+
width: 10px;
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
@media (min-width: 1200px) {
|
254
|
+
.cropper-point.point-se {
|
255
|
+
height: 5px;
|
256
|
+
opacity: .75;
|
257
|
+
width: 5px;
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
.cropper-point.point-se:before {
|
262
|
+
background-color: #39f;
|
263
|
+
bottom: -50%;
|
264
|
+
content: ' ';
|
265
|
+
display: block;
|
266
|
+
height: 200%;
|
267
|
+
opacity: 0;
|
268
|
+
position: absolute;
|
269
|
+
right: -50%;
|
270
|
+
width: 200%;
|
271
|
+
}
|
272
|
+
|
273
|
+
.cropper-invisible {
|
274
|
+
opacity: 0;
|
275
|
+
}
|
276
|
+
|
277
|
+
.cropper-bg {
|
278
|
+
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');
|
279
|
+
}
|
280
|
+
|
281
|
+
.cropper-hide {
|
282
|
+
display: block;
|
283
|
+
height: 0;
|
284
|
+
position: absolute;
|
285
|
+
width: 0;
|
286
|
+
}
|
287
|
+
|
288
|
+
.cropper-hidden {
|
289
|
+
display: none !important;
|
290
|
+
}
|
291
|
+
|
292
|
+
.cropper-move {
|
293
|
+
cursor: move;
|
294
|
+
}
|
295
|
+
|
296
|
+
.cropper-crop {
|
297
|
+
cursor: crosshair;
|
298
|
+
}
|
299
|
+
|
300
|
+
.cropper-disabled .cropper-drag-box,
|
301
|
+
.cropper-disabled .cropper-face,
|
302
|
+
.cropper-disabled .cropper-line,
|
303
|
+
.cropper-disabled .cropper-point {
|
304
|
+
cursor: not-allowed;
|
305
|
+
}
|
@@ -2,23 +2,23 @@ require_dependency "sibu/application_controller"
|
|
2
2
|
|
3
3
|
module Sibu
|
4
4
|
class ImagesController < ApplicationController
|
5
|
-
before_action :set_site, only: [:index, :new, :create, :edit, :update, :destroy]
|
6
5
|
before_action :set_image, only: [:edit, :update, :destroy]
|
7
6
|
before_action :set_edition_context, only: [:new, :create]
|
8
7
|
|
9
8
|
def index
|
10
|
-
@images = Sibu::Image.
|
9
|
+
@images = Sibu::Image.for_user(sibu_user)
|
11
10
|
end
|
12
11
|
|
13
12
|
def new
|
14
|
-
@image = Sibu::Image.new(
|
13
|
+
@image = Sibu::Image.new(user_id: send(Rails.application.config.sibu[:current_user]).id)
|
15
14
|
end
|
16
15
|
|
17
16
|
def create
|
18
17
|
@image = Sibu::Image.new(image_params)
|
19
18
|
if @image.save
|
20
19
|
if !@page_id.blank? && !@section_id.blank? && !@element_id.blank? && !@size.blank?
|
21
|
-
|
20
|
+
p = Sibu::Page.find(@page_id)
|
21
|
+
entity = @entity_type == 'site' ? p.site : p
|
22
22
|
ids = (@section_id.split('|') + @element_id.split('|')).uniq[0...-1]
|
23
23
|
elt = entity.update_element(*ids, {"id" => @img_id, "src" => @image.file_url(@size.to_sym), "alt" => @image.alt})
|
24
24
|
if elt.nil?
|
@@ -28,7 +28,7 @@ module Sibu
|
|
28
28
|
end
|
29
29
|
redirect_to site_page_edit_content_path(@site.id, @page_id), msg
|
30
30
|
else
|
31
|
-
redirect_to
|
31
|
+
redirect_to images_url, notice: "L'image a bien été téléchargée."
|
32
32
|
end
|
33
33
|
else
|
34
34
|
flash.now[:alert] = "Une erreur s'est produite lors du téléchargement de l'image."
|
@@ -44,7 +44,7 @@ module Sibu
|
|
44
44
|
|
45
45
|
def update
|
46
46
|
if @image.update(image_params)
|
47
|
-
redirect_to
|
47
|
+
redirect_to images_url, notice: "L'image a bien été mise à jour."
|
48
48
|
else
|
49
49
|
flash.now[:alert] = "Une erreur s'est produite lors de l'enregistrement de l'image."
|
50
50
|
render :index
|
@@ -53,15 +53,11 @@ module Sibu
|
|
53
53
|
|
54
54
|
def destroy
|
55
55
|
@image.destroy
|
56
|
-
redirect_to
|
56
|
+
redirect_to images_url, notice: "L'image a bien été supprimée."
|
57
57
|
end
|
58
58
|
|
59
59
|
private
|
60
60
|
|
61
|
-
def set_site
|
62
|
-
@site = Sibu::Site.find(params[:site_id])
|
63
|
-
end
|
64
|
-
|
65
61
|
def set_image
|
66
62
|
@image = Sibu::Image.find(params[:id])
|
67
63
|
end
|
@@ -2,7 +2,7 @@ require_dependency "sibu/application_controller"
|
|
2
2
|
|
3
3
|
module Sibu
|
4
4
|
class PagesController < ApplicationController
|
5
|
-
before_action :set_page, only: [:edit, :update, :destroy, :edit_element, :update_element, :clone_element,
|
5
|
+
before_action :set_page, only: [:edit, :update, :destroy, :duplicate, :edit_element, :update_element, :clone_element,
|
6
6
|
:delete_element, :child_element, :new_section, :create_section, :delete_section]
|
7
7
|
before_action :set_site, only: [:index, :new]
|
8
8
|
before_action :set_edit_context, only: [:edit_element, :update_element, :clone_element, :delete_element,
|
@@ -15,9 +15,9 @@ module Sibu
|
|
15
15
|
|
16
16
|
def show
|
17
17
|
if params[:site_id].blank?
|
18
|
-
|
19
|
-
if
|
20
|
-
@
|
18
|
+
page = Page.lookup(request.domain, params[:path])
|
19
|
+
if page
|
20
|
+
@site = page.site
|
21
21
|
@links = @site.pages_path_by_id
|
22
22
|
view_template = @page ? 'show' : @site.not_found
|
23
23
|
else
|
@@ -62,6 +62,16 @@ module Sibu
|
|
62
62
|
def destroy
|
63
63
|
end
|
64
64
|
|
65
|
+
def duplicate
|
66
|
+
new_page = @page.deep_copy
|
67
|
+
if new_page.save
|
68
|
+
redirect_to site_pages_url(@page.site_id), notice: "La page a bien été copiée."
|
69
|
+
else
|
70
|
+
flash.now[:alert] = "Une erreur s'est produite lors de la copie de la page."
|
71
|
+
render :index
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
65
75
|
def edit_content
|
66
76
|
@page = Sibu::Page.find(params[:page_id])
|
67
77
|
@site = Sibu::Site.includes(:pages).find(@page.site_id) if @page
|
@@ -2,11 +2,11 @@ require_dependency "sibu/application_controller"
|
|
2
2
|
|
3
3
|
module Sibu
|
4
4
|
class SitesController < ApplicationController
|
5
|
-
before_action :set_site, only: [:show, :edit, :update, :destroy]
|
5
|
+
before_action :set_site, only: [:show, :edit, :update, :destroy, :duplicate]
|
6
6
|
skip_before_action Rails.application.config.sibu[:auth_filter], only: [:show]
|
7
7
|
|
8
8
|
def index
|
9
|
-
@sites = Sibu::Site.
|
9
|
+
@sites = Sibu::Site.for_user(sibu_user).order(:name, :version)
|
10
10
|
end
|
11
11
|
|
12
12
|
def show
|
@@ -15,7 +15,7 @@ module Sibu
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def new
|
18
|
-
@site = Sibu::Site.new(user_id:
|
18
|
+
@site = Sibu::Site.new(user_id: sibu_user.id, version: Sibu::Site::DEFAULT_VERSION)
|
19
19
|
end
|
20
20
|
|
21
21
|
def create
|
@@ -50,6 +50,16 @@ module Sibu
|
|
50
50
|
redirect_to sites_url, notice: "Le site a bien été supprimé."
|
51
51
|
end
|
52
52
|
|
53
|
+
def duplicate
|
54
|
+
new_site = @site.deep_copy
|
55
|
+
if new_site.save
|
56
|
+
redirect_to sites_url, notice: "Le site a bien été copié."
|
57
|
+
else
|
58
|
+
flash.now[:alert] = "Une erreur s'est produite lors de la copie du site."
|
59
|
+
render :index
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
53
63
|
private
|
54
64
|
|
55
65
|
def set_site
|
@@ -7,20 +7,12 @@ module Sibu
|
|
7
7
|
p ? (@site.domain.blank? ? site_page_path(@site.id, p.id) : "/#{p.path}") : "#"
|
8
8
|
end
|
9
9
|
|
10
|
-
def page_templates
|
11
|
-
[['Accueil', 'home'], ['Offre', 'offer'], ['Galerie', 'gallery'], ['Destination', 'destination'], ['Mentions légales', 'text']]
|
12
|
-
end
|
13
|
-
|
14
10
|
def sections_templates
|
15
11
|
@site.site_template.available_templates
|
16
12
|
end
|
17
13
|
|
18
|
-
def page_languages
|
19
|
-
[['Français', 'fr'], ['Anglais', 'en']]
|
20
|
-
end
|
21
|
-
|
22
14
|
def site_images
|
23
|
-
Sibu::Image.shared +
|
15
|
+
([Sibu::Image.empty] + Sibu::Image.shared + Sibu::Image.for_user(sibu_user)).uniq
|
24
16
|
end
|
25
17
|
|
26
18
|
def available_links
|
@@ -1,19 +1,23 @@
|
|
1
1
|
module Sibu
|
2
2
|
module SitesHelper
|
3
3
|
def primary_colors
|
4
|
-
Rails.application.config.sibu[:primary_colors]
|
4
|
+
([@site.site_template.primary_color] + Rails.application.config.sibu[:primary_colors]).uniq
|
5
5
|
end
|
6
6
|
|
7
7
|
def secondary_colors
|
8
|
-
Rails.application.config.sibu[:secondary_colors]
|
8
|
+
([@site.site_template.secondary_color] + Rails.application.config.sibu[:secondary_colors]).uniq
|
9
9
|
end
|
10
10
|
|
11
11
|
def primary_fonts
|
12
|
-
[
|
12
|
+
([@site.site_template.primary_font] + Rails.application.config.sibu[:primary_fonts]).uniq.map.each_with_index {|f, i| [i == 0 ? (f + ' (par défaut)') : f, f]}
|
13
13
|
end
|
14
14
|
|
15
15
|
def secondary_fonts
|
16
|
-
[
|
16
|
+
([@site.site_template.secondary_font] + Rails.application.config.sibu[:secondary_fonts]).uniq.map.each_with_index {|f, i| [i == 0 ? (f + ' (par défaut)') : f, f]}
|
17
|
+
end
|
18
|
+
|
19
|
+
def site_versions
|
20
|
+
[['Français (par défaut)', 'fr'], ['Anglais', 'en']]
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
@@ -18,10 +18,10 @@ class Sibu::ImageUploader < Shrine
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def generate_location(io, context)
|
21
|
-
|
21
|
+
user_id = context[:record].user_id
|
22
22
|
style = context[:version] != :original ? "resized" : "originals"
|
23
23
|
name = super
|
24
24
|
|
25
|
-
[
|
25
|
+
[user_id, style, name].compact.join("/")
|
26
26
|
end
|
27
27
|
end
|
data/app/models/sibu/image.rb
CHANGED
@@ -1,15 +1,23 @@
|
|
1
1
|
module Sibu
|
2
2
|
class Image < ApplicationRecord
|
3
3
|
include ImageUploader::Attachment.new(:file)
|
4
|
+
extend Sibu::UserConcern
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
store :metadata, accessors: [:alt], coder: JSON
|
6
|
+
store :metadata, accessors: [:alt, :reference], coder: JSON
|
8
7
|
|
9
8
|
validates_presence_of :file_data
|
10
9
|
|
11
10
|
def self.shared
|
12
|
-
where(
|
11
|
+
where(user_id: nil)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.empty
|
15
|
+
empty_img = where("metadata ILIKE '%default_empty_image%'").first
|
16
|
+
if empty_img.nil?
|
17
|
+
empty_img = new(reference: 'default_empty_image', file: File.new('app/assets/images/empty.png'))
|
18
|
+
empty_img.save
|
19
|
+
end
|
20
|
+
empty_img
|
13
21
|
end
|
14
22
|
end
|
15
23
|
end
|
data/app/models/sibu/page.rb
CHANGED
@@ -7,7 +7,12 @@ module Sibu
|
|
7
7
|
store :metadata, accessors: [:title, :description, :keywords], coder: JSON
|
8
8
|
|
9
9
|
before_save :update_path
|
10
|
-
validates_presence_of :name, :site
|
10
|
+
validates_presence_of :name, :site
|
11
|
+
|
12
|
+
def self.lookup(domain_name, page_path)
|
13
|
+
joins(:site).where("sibu_sites.domain = ? AND ((sibu_sites.version = ? AND sibu_pages.path = ?) OR sibu_pages.path = LTRIM(REPLACE(?, sibu_sites.version, ''), '/'))",
|
14
|
+
domain_name, Sibu::Site::DEFAULT_VERSION, page_path, page_path).first
|
15
|
+
end
|
11
16
|
|
12
17
|
def save_and_init
|
13
18
|
if valid?
|
@@ -25,5 +30,11 @@ module Sibu
|
|
25
30
|
def site_template
|
26
31
|
site.site_template
|
27
32
|
end
|
33
|
+
|
34
|
+
def deep_copy
|
35
|
+
new_page = deep_dup
|
36
|
+
new_page.name = name + ' - copie'
|
37
|
+
new_page
|
38
|
+
end
|
28
39
|
end
|
29
40
|
end
|
data/app/models/sibu/site.rb
CHANGED
@@ -2,15 +2,17 @@ module Sibu
|
|
2
2
|
class Site < ApplicationRecord
|
3
3
|
include StyleUploader::Attachment.new(:style, cache: :styles_cache, store: :styles_store)
|
4
4
|
include Sibu::SectionsConcern
|
5
|
+
extend Sibu::UserConcern
|
5
6
|
|
6
7
|
store :custom_data, accessors: [:primary_font, :secondary_font, :primary_color, :secondary_color], coder: JSON
|
7
8
|
store :metadata, accessors: [:analytics_id], coder: JSON
|
8
9
|
|
9
10
|
belongs_to :site_template, :class_name => 'Sibu::SiteTemplate'
|
10
11
|
has_many :pages, :class_name => 'Sibu::Page', dependent: :destroy
|
11
|
-
has_many :images, :class_name => 'Sibu::Image', dependent: :destroy
|
12
12
|
|
13
|
-
validates_presence_of :name, :site_template
|
13
|
+
validates_presence_of :name, :site_template, :version
|
14
|
+
|
15
|
+
DEFAULT_VERSION = 'fr'
|
14
16
|
|
15
17
|
def style_url
|
16
18
|
style ? style.url : site_template.path
|
@@ -54,6 +56,10 @@ module Sibu
|
|
54
56
|
site_template.pages.each do |p|
|
55
57
|
self.pages << Sibu::Page.new(p)
|
56
58
|
end
|
59
|
+
self.primary_color = site_template.primary_color
|
60
|
+
self.secondary_color = site_template.secondary_color
|
61
|
+
self.primary_font = site_template.primary_font
|
62
|
+
self.secondary_font = site_template.secondary_font
|
57
63
|
end
|
58
64
|
save
|
59
65
|
end
|
@@ -75,5 +81,16 @@ module Sibu
|
|
75
81
|
self.sections = site_data.sections(self)
|
76
82
|
save!
|
77
83
|
end
|
84
|
+
|
85
|
+
def deep_copy
|
86
|
+
site_copy = deep_dup
|
87
|
+
pages.each do |p|
|
88
|
+
site_copy.name = name + ' - copie'
|
89
|
+
site_copy.domain = nil
|
90
|
+
site_copy.pages << p.deep_dup
|
91
|
+
end
|
92
|
+
|
93
|
+
site_copy
|
94
|
+
end
|
78
95
|
end
|
79
96
|
end
|