hyde_admin 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/TODO.md +3 -1
- data/bin/admin_views/admin_layout.html.erb +77 -18
- data/bin/admin_views/configuration.erb +4 -4
- data/bin/admin_views/dashboard.erb +1 -1
- data/bin/admin_views/editor_html.erb +16 -16
- data/bin/admin_views/editor_js.erb +2 -2
- data/bin/admin_views/files/edit.erb +6 -6
- data/bin/admin_views/files/listing.erb +13 -13
- data/bin/admin_views/partials/image_element.html.erb +4 -0
- data/bin/admin_views/partials/images_page.html.erb +8 -0
- data/bin/admin_views/posts/edit.erb +21 -21
- data/bin/admin_views/posts/listing.erb +7 -7
- data/bin/hyde_admin.ru +30 -0
- data/bin/hyde_assets/hyde_admin.css +17 -4
- data/bin/i18n/en.yml +8 -1
- data/bin/i18n/fr.yml +8 -1
- data/hyde_admin.gemspec +1 -0
- data/lib/hyde_admin/version.rb +1 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb95670b96fd382d5e1f1ae437e50b055de1e1196192cb5438cb8a5b9da2a553
|
4
|
+
data.tar.gz: f2febcd67319f60a862b79e88e06290df9495dd2388d85900e38eb9486c76f50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb71c84a6420d278a484fb14a08ff24d155c926140838c243ba9fdd8df8d0495ed5d182fd12b58c9e5ab2981adbeaacb053e0f9e40f16f30ca812b564d7bde51
|
7
|
+
data.tar.gz: cac253c8000aa874cd925df410d3d4174032c573ffe3d359d7f09128d129be23e7a4d8b76c23354f3ef62b4074f6ae5df8af80b64ec133150228b715fab28f7f
|
data/CHANGELOG.md
CHANGED
data/TODO.md
CHANGED
@@ -35,7 +35,7 @@
|
|
35
35
|
<li class="nav-item">
|
36
36
|
<a class="nav-link active" aria-current="page" href="/<%= @hyde_parameters['site_index'] %>">
|
37
37
|
<span data-feather="home" class="fas fa-eye"></span>
|
38
|
-
<%= t.overview.capitalize %>
|
38
|
+
<%= EscapeUtils.escape_html t.overview.capitalize %>
|
39
39
|
</a>
|
40
40
|
</li>
|
41
41
|
<li class="nav-item">
|
@@ -43,52 +43,52 @@
|
|
43
43
|
<li class="nav-item">
|
44
44
|
<a class="nav-link active" aria-current="page" href="/dashboard">
|
45
45
|
<span data-feather="home" class="fas fa-tachometer-alt"></span>
|
46
|
-
<%= t.dashboard.capitalize %>
|
46
|
+
<%= EscapeUtils.escape_html t.dashboard.capitalize %>
|
47
47
|
</a>
|
48
48
|
</li>
|
49
49
|
<li class="nav-item">
|
50
50
|
<a class="nav-link" href="/pages/index">
|
51
51
|
<span data-feather="file" class="fas fa-file"></span>
|
52
|
-
<%= t.pages.capitalize %>
|
52
|
+
<%= EscapeUtils.escape_html t.pages.capitalize %>
|
53
53
|
</a>
|
54
54
|
</li>
|
55
55
|
<li class="nav-item">
|
56
56
|
<a class="nav-link" href="/drafts/index">
|
57
57
|
<span data-feather="shopping-cart" class="fas fa-file"></span>
|
58
|
-
<%= t.drafts.capitalize %>
|
58
|
+
<%= EscapeUtils.escape_html t.drafts.capitalize %>
|
59
59
|
</a>
|
60
60
|
</li>
|
61
61
|
<li class="nav-item">
|
62
62
|
<a class="nav-link" href="/posts/index">
|
63
63
|
<span data-feather="users" class="fas fa-file"></span>
|
64
|
-
<%= t.posts.capitalize %>
|
64
|
+
<%= EscapeUtils.escape_html t.posts.capitalize %>
|
65
65
|
</a>
|
66
66
|
</li>
|
67
67
|
<li class="nav-item"></li>
|
68
68
|
<li class="nav-item">
|
69
69
|
<a class="nav-link" href="/files/index">
|
70
70
|
<span data-feather="users" class="fas fa-copy"></span>
|
71
|
-
<%= t.files.capitalize %>
|
71
|
+
<%= EscapeUtils.escape_html t.files.capitalize %>
|
72
72
|
</a>
|
73
73
|
</li>
|
74
74
|
<li class="nav-item"></li>
|
75
75
|
<li class="nav-item">
|
76
76
|
<a class="nav-link active" aria-current="page" href="/rebuild" id="btn-rebuild">
|
77
77
|
<span data-feather="home" class="fas fa-hammer"></span>
|
78
|
-
<%= t.rebuild.capitalize %>
|
78
|
+
<%= EscapeUtils.escape_html t.rebuild.capitalize %>
|
79
79
|
</a>
|
80
80
|
</li>
|
81
81
|
<li class="nav-item">
|
82
82
|
<a class="nav-link active" aria-current="page" href="/deploy" id="btn-deploy">
|
83
83
|
<span data-feather="home" class="fas fa-cloud-upload-alt"></span>
|
84
|
-
<%= t.deploy.capitalize %>
|
84
|
+
<%= EscapeUtils.escape_html t.deploy.capitalize %>
|
85
85
|
</a>
|
86
86
|
</li>
|
87
87
|
<li class="nav-item"></li>
|
88
88
|
<li class="nav-item">
|
89
89
|
<a class="nav-link" href="/configuration">
|
90
90
|
<span data-feather="layers" class="fas fa-tools"></span>
|
91
|
-
<%= t.configuration.capitalize %>
|
91
|
+
<%= EscapeUtils.escape_html t.configuration.capitalize %>
|
92
92
|
</a>
|
93
93
|
</li>
|
94
94
|
</ul>
|
@@ -125,19 +125,46 @@
|
|
125
125
|
<div class="modal-content">
|
126
126
|
<div class="modal-header">
|
127
127
|
<h5 class="modal-title">Images</h5>
|
128
|
-
|
128
|
+
<!--
|
129
|
+
<button type="button" class="btn btn-default close" data-dismiss="modal" aria-label="Close">
|
129
130
|
<span aria-hidden="true">×</span>
|
130
131
|
</button>
|
132
|
+
-->
|
131
133
|
</div>
|
132
|
-
<div class="modal-body
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
134
|
+
<div class="modal-body">
|
135
|
+
<div>
|
136
|
+
<div class="image-selector-search d-block" data-page="0">
|
137
|
+
<form action="" class="form-inline">
|
138
|
+
<div class="form-group mb-2">
|
139
|
+
<label for="inputPassword2" class="sr-only"><%= EscapeUtils.escape_html t.sort_by_date %></label>
|
140
|
+
<label>
|
141
|
+
<input class="form-check-input" type="radio" name="sort_date" value="asc"> <%= EscapeUtils.escape_html t.older %>
|
142
|
+
</label>
|
143
|
+
|
144
|
+
<label>
|
145
|
+
<input class="form-check-input" type="radio" name="sort_date" value="desc"> <%= EscapeUtils.escape_html t.newer %>
|
146
|
+
</label>
|
147
|
+
</div>
|
148
|
+
<div class="form-group mb-2">
|
149
|
+
<label for="inputFilename" class="sr-only"><%= EscapeUtils.escape_html t.filename %></label>
|
150
|
+
<input type="text" class="form-control" name="filename" id="inputFilename" placeholder="Filename...">
|
151
|
+
</div>
|
152
|
+
<button type="submit" class="btn btn-primary image-selector-search-submit d-block mb-2"><%= EscapeUtils.escape_html t.search %></button>
|
153
|
+
</form>
|
139
154
|
</div>
|
140
|
-
|
155
|
+
<div class="image-selector-content">
|
156
|
+
<% path = File.join(Pathname.new(App.gem_source_path), 'admin_views', 'partials', 'images_page.html.erb') %>
|
157
|
+
<%= ERB.new(File.read(path)).result(binding) %>
|
158
|
+
</div>
|
159
|
+
<div class="image-selector-page">
|
160
|
+
<a href="#" title="<%= EscapeUtils.escape_html t.previous_images %>" class="btn btn-secondary image-selector-page-prev">
|
161
|
+
<i class="fas fa-chevron-left"></i>
|
162
|
+
</a>
|
163
|
+
<a href="#" title="<%= EscapeUtils.escape_html t.next_images %>"class="btn btn-secondary image-selector-page-next">
|
164
|
+
<i class="fas fa-chevron-right"></i>
|
165
|
+
</a>
|
166
|
+
</div>
|
167
|
+
</div>
|
141
168
|
</div>
|
142
169
|
</div>
|
143
170
|
</div>
|
@@ -154,6 +181,38 @@
|
|
154
181
|
});
|
155
182
|
}
|
156
183
|
<% end %>
|
184
|
+
|
185
|
+
function search(offset_page){
|
186
|
+
let sort_date = $('.image-selector-search input[name=sort_date]:checked').val();
|
187
|
+
let filename = $('.image-selector-search input[name=filename]').val();
|
188
|
+
let page = $('.image-selector-search').attr('data-page');
|
189
|
+
let new_page = parseInt(page) + offset_page;
|
190
|
+
|
191
|
+
if(new_page < 0){
|
192
|
+
new_page = 0;
|
193
|
+
}
|
194
|
+
|
195
|
+
$.post( "/ajax/images", { sort_date: sort_date, filename: filename, page: new_page })
|
196
|
+
.done(function( data ) {
|
197
|
+
$('.image-selector-content').html(data);
|
198
|
+
});
|
199
|
+
|
200
|
+
$('.image-selector-search').attr('data-page', new_page);
|
201
|
+
return false;
|
202
|
+
}
|
203
|
+
|
204
|
+
$(document).on('click', '.image-selector-search-submit', function(){
|
205
|
+
search(0);
|
206
|
+
return false;
|
207
|
+
});
|
208
|
+
$(document).on('click', '.image-selector-page-prev', function(){
|
209
|
+
search(-1);
|
210
|
+
return false;
|
211
|
+
});
|
212
|
+
$(document).on('click', '.image-selector-page-next', function(){
|
213
|
+
search(1);
|
214
|
+
return false;
|
215
|
+
});
|
157
216
|
</script>
|
158
217
|
<script src="/fslightbox/fslightbox.js"></script>
|
159
218
|
</body>
|
@@ -1,13 +1,13 @@
|
|
1
|
-
<h2><%= t.configuration.capitalize %></h2>
|
1
|
+
<h2><%= EscapeUtils.escape_html t.configuration.capitalize %></h2>
|
2
2
|
|
3
3
|
<form action="/configuration" method="post">
|
4
4
|
<% @hyde_parameters.each_pair do |setting, value| %>
|
5
5
|
<div class="mb-3">
|
6
|
-
<label for="i-<%= setting %>" class="form-label"><%= t.send(setting).capitalize %></label>
|
6
|
+
<label for="i-<%= setting %>" class="form-label"><%= EscapeUtils.escape_html t.send(setting).capitalize %></label>
|
7
7
|
<input type="text" class="form-control" value="<%= value %>" name="<%= setting %>" id="i-<%= setting %>">
|
8
|
-
<div id="i-<%= setting %>-help" class="form-text"><%= t.send("help_#{setting}").capitalize %></div>
|
8
|
+
<div id="i-<%= setting %>-help" class="form-text"><%= EscapeUtils.escape_html t.send("help_#{setting}").capitalize %></div>
|
9
9
|
</div>
|
10
10
|
<% end %>
|
11
|
-
<button type="submit" class="btn btn-primary"><%= t.submit.capitalize %></button>
|
11
|
+
<button type="submit" class="btn btn-primary"><%= EscapeUtils.escape_html t.submit.capitalize %></button>
|
12
12
|
</form>
|
13
13
|
|
@@ -1 +1 @@
|
|
1
|
-
<h2><%= t.dashboard.capitalize %></h2>
|
1
|
+
<h2><%= EscapeUtils.escape_html t.dashboard.capitalize %></h2>
|
@@ -1,24 +1,24 @@
|
|
1
1
|
<div class="codemirror-toolbar btn-toolbar" role="toolbar">
|
2
2
|
<div class="btn-group mr-2" role="group" aria-label="Undo/redo">
|
3
|
-
<button type="button" class="btn btn-light"><i class="fas fa-undo-alt" title="<%= t.editor_undo %>"></i></button>
|
4
|
-
<button type="button" class="btn btn-light"><i class="fas fa-redo-alt" title="<%= t.editor_redo %>"></i></button>
|
3
|
+
<button type="button" class="btn btn-light"><i class="fas fa-undo-alt" title="<%= EscapeUtils.escape_html t.editor_undo %>"></i></button>
|
4
|
+
<button type="button" class="btn btn-light"><i class="fas fa-redo-alt" title="<%= EscapeUtils.escape_html t.editor_redo %>"></i></button>
|
5
5
|
</div>
|
6
6
|
<div class="btn-group mr-2" role="group" aria-label="Structural tags">
|
7
|
-
<button type="button" class="btn btn-light"><i class="fas fa-file-image" title="<%= t.editor_file %>"></i></button>
|
8
|
-
<button type="button" class="btn btn-light"><i class="fas fa-list cmt-replace" title="<%= t.editor_list %>"></i></button>
|
9
|
-
<button type="button" class="btn btn-light"><i class="fas fa-list-ol cmt-replace" title="<%= t.editor_list_ol %>"></i></button>
|
10
|
-
<button type="button" class="btn btn-light"><i class="fas fa-link cmt-replace" title="<%= t.editor_link %>"></i></button>
|
11
|
-
<button type="button" class="btn btn-light"><i class="fas fa-quote-left cmt-replace" title="<%= t.editor_quote %>"></i></button>
|
7
|
+
<button type="button" class="btn btn-light"><i class="fas fa-file-image" title="<%= EscapeUtils.escape_html t.editor_file %>"></i></button>
|
8
|
+
<button type="button" class="btn btn-light"><i class="fas fa-list cmt-replace" title="<%= EscapeUtils.escape_html t.editor_list %>"></i></button>
|
9
|
+
<button type="button" class="btn btn-light"><i class="fas fa-list-ol cmt-replace" title="<%= EscapeUtils.escape_html t.editor_list_ol %>"></i></button>
|
10
|
+
<button type="button" class="btn btn-light"><i class="fas fa-link cmt-replace" title="<%= EscapeUtils.escape_html t.editor_link %>"></i></button>
|
11
|
+
<button type="button" class="btn btn-light"><i class="fas fa-quote-left cmt-replace" title="<%= EscapeUtils.escape_html t.editor_quote %>"></i></button>
|
12
12
|
</div>
|
13
13
|
<div class="btn-group mr-2" role="group" aria-label="Style tags">
|
14
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-1" title="<%= t.editor_title_h1 %>">1</i></button>
|
15
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-2" title="<%= t.editor_title_h2 %>">2</i></button>
|
16
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-3" title="<%= t.editor_title_h3 %>">3</i></button>
|
17
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-4" title="<%= t.editor_title_h4 %>">4</i></button>
|
18
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-5" title="<%= t.editor_title_h5 %>">5</i></button>
|
19
|
-
<button type="button" class="btn btn-light"><i class="fas fa-underline cmt-replace" title="<%= t.editor_underline %>"></i></button>
|
20
|
-
<button type="button" class="btn btn-light"><i class="fas fa-bold cmt-replace" title="<%= t.editor_bold %>"></i></button>
|
21
|
-
<button type="button" class="btn btn-light"><i class="fas fa-italic cmt-replace" title="<%= t.editor_italic %>"></i></button>
|
22
|
-
<button type="button" class="btn btn-light"><i class="fas fa-strikethrough cmt-replace" title="<%= t.editor_strikethrough %>"></i></button>
|
14
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-1" title="<%= EscapeUtils.escape_html t.editor_title_h1 %>">1</i></button>
|
15
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-2" title="<%= EscapeUtils.escape_html t.editor_title_h2 %>">2</i></button>
|
16
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-3" title="<%= EscapeUtils.escape_html t.editor_title_h3 %>">3</i></button>
|
17
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-4" title="<%= EscapeUtils.escape_html t.editor_title_h4 %>">4</i></button>
|
18
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-5" title="<%= EscapeUtils.escape_html t.editor_title_h5 %>">5</i></button>
|
19
|
+
<button type="button" class="btn btn-light"><i class="fas fa-underline cmt-replace" title="<%= EscapeUtils.escape_html t.editor_underline %>"></i></button>
|
20
|
+
<button type="button" class="btn btn-light"><i class="fas fa-bold cmt-replace" title="<%= EscapeUtils.escape_html t.editor_bold %>"></i></button>
|
21
|
+
<button type="button" class="btn btn-light"><i class="fas fa-italic cmt-replace" title="<%= EscapeUtils.escape_html t.editor_italic %>"></i></button>
|
22
|
+
<button type="button" class="btn btn-light"><i class="fas fa-strikethrough cmt-replace" title="<%= EscapeUtils.escape_html t.editor_strikethrough %>"></i></button>
|
23
23
|
</div>
|
24
24
|
</div>
|
@@ -8,9 +8,9 @@ $(document).on('click', '.codemirror-toolbar .fa-file-image', function(){
|
|
8
8
|
$('.modal-image').modal('show');
|
9
9
|
});
|
10
10
|
$(document).on('click', '.modal-image img', function(){
|
11
|
-
let img_src = '<img src="' + $(this).attr('src') + '" alt="<%= t.default_alt_img %>" title="<%= t.default_title_img %>" />';
|
11
|
+
let img_src = '<img src="' + $(this).attr('src') + '" alt="<%= EscapeUtils.escape_html t.default_alt_img %>" title="<%= EscapeUtils.escape_html t.default_title_img %>" />';
|
12
12
|
if(window.mode_markdown){
|
13
|
-
img_src = '![<%= t.default_alt_img %>](' + $(this).attr('src') + ')';
|
13
|
+
img_src = '![<%= EscapeUtils.escape_html t.default_alt_img %>](' + $(this).attr('src') + ')';
|
14
14
|
}
|
15
15
|
window.myCodeMirror.replaceSelection(img_src);
|
16
16
|
$('.modal-image').modal('hide');
|
@@ -1,30 +1,30 @@
|
|
1
|
-
<h2><%= t.edit.capitalize %></h2>
|
1
|
+
<h2><%= EscapeUtils.escape_html t.edit.capitalize %></h2>
|
2
2
|
|
3
3
|
<form action="/files/update?file=<%= @file %>" method="post">
|
4
4
|
<% if @has_header %>
|
5
5
|
<div class="mb-3">
|
6
|
-
<label for="i-header" class="form-label"><%= t.header.capitalize %></label>
|
6
|
+
<label for="i-header" class="form-label"><%= EscapeUtils.escape_html t.header.capitalize %></label>
|
7
7
|
<textarea class="form-control text-editor" id="i-header" rows="3" name="header" style="font-family: <%= (['.html', '.xml', '.yml', '.js', '.md'].include?(File.extname(@file)) ? 'monospace' : 'inherit') %>"><%= @header %></textarea>
|
8
8
|
</div>
|
9
9
|
<% end %>
|
10
10
|
<div class="mb-3">
|
11
|
-
<label for="i-content" class="form-label"><%= t.content.capitalize %>
|
11
|
+
<label for="i-content" class="form-label"><%= EscapeUtils.escape_html t.content.capitalize %>
|
12
12
|
<% if ['.html','.md'].include?(File.extname(@file)) %>
|
13
13
|
<a href="https://jekyllrb.com/docs/liquid/" class="text-secondary" target="_blank"><i class="fas fa-question-circle"></i></a>
|
14
14
|
<% end %>
|
15
15
|
</label>
|
16
16
|
|
17
17
|
<% if @has_editor %>
|
18
|
-
<% path = File.join(Pathname.new(
|
18
|
+
<% path = File.join(Pathname.new(App.gem_source_path), 'admin_views', 'editor_html.erb') %>
|
19
19
|
<%= ERB.new(File.read(path)).result(binding) %>
|
20
20
|
<% end %>
|
21
21
|
|
22
22
|
<textarea class="form-control text-editor" id="i-content" rows="3" name="content" style="font-family: <%= (['.html', '.xml', '.yml', '.js', '.md'].include?(File.extname(@file)) ? 'monospace' : 'inherit') %>"><%= @content %></textarea>
|
23
23
|
|
24
24
|
<script type="text/javascript" charset="utf-8">
|
25
|
-
<% path = File.join(Pathname.new(
|
25
|
+
<% path = File.join(Pathname.new(App.gem_source_path), 'admin_views', 'editor_js.erb') %>
|
26
26
|
<%= ERB.new(File.read(path)).result(binding) %>
|
27
27
|
</script>
|
28
28
|
</div>
|
29
|
-
<button type="submit" class="btn btn-primary"><%= t.submit.capitalize %></button>
|
29
|
+
<button type="submit" class="btn btn-primary"><%= EscapeUtils.escape_html t.submit.capitalize %></button>
|
30
30
|
</form>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<h2><%= t.files.capitalize %></h2>
|
1
|
+
<h2><%= EscapeUtils.escape_html t.files.capitalize %></h2>
|
2
2
|
|
3
3
|
<div class="row g-3">
|
4
4
|
<div class="col-auto">
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<input type="file" multiple name="files[]" class="form-control">
|
9
9
|
</div>
|
10
10
|
<div class="col-auto">
|
11
|
-
<button type="submit" class="btn btn-outline-secondary"><i class="fa fa-plus" title="<%= t.create.capitalize %>"></i> <%= t.upload %></button>
|
11
|
+
<button type="submit" class="btn btn-outline-secondary"><i class="fa fa-plus" title="<%= EscapeUtils.escape_html t.create.capitalize %>"></i> <%= EscapeUtils.escape_html t.upload %></button>
|
12
12
|
</div>
|
13
13
|
</div>
|
14
14
|
</form>
|
@@ -19,10 +19,10 @@
|
|
19
19
|
<form method="post" action="/files/create_dir?dir_path=<%= @dir_path %>">
|
20
20
|
<div class="row g-2 align-items-center">
|
21
21
|
<div class="col-auto">
|
22
|
-
<input type="text" name="directory_name" class="form-control" placeholder="<%= t.directory_input_placeholder %>">
|
22
|
+
<input type="text" name="directory_name" class="form-control" placeholder="<%= EscapeUtils.escape_html t.directory_input_placeholder %>">
|
23
23
|
</div>
|
24
24
|
<div class="col-auto">
|
25
|
-
<button type="submit" class="btn btn-outline-secondary"><i class="fa fa-plus" title="<%= t.create.capitalize %>"></i> <%= t.create %></button>
|
25
|
+
<button type="submit" class="btn btn-outline-secondary"><i class="fa fa-plus" title="<%= EscapeUtils.escape_html t.create.capitalize %>"></i> <%= EscapeUtils.escape_html t.create %></button>
|
26
26
|
</div>
|
27
27
|
</div>
|
28
28
|
</form>
|
@@ -33,10 +33,10 @@
|
|
33
33
|
<form method="post" action="/files/create_file?dir_path=<%= @dir_path %>">
|
34
34
|
<div class="row g-2 align-items-center">
|
35
35
|
<div class="col-auto">
|
36
|
-
<input type="text" name="file_name" class="form-control" placeholder="<%= t.file_input_placeholder %>">
|
36
|
+
<input type="text" name="file_name" class="form-control" placeholder="<%= EscapeUtils.escape_html t.file_input_placeholder %>">
|
37
37
|
</div>
|
38
38
|
<div class="col-auto">
|
39
|
-
<button type="submit" class="btn btn-outline-secondary"><i class="fa fa-plus" title="<%= t.create.capitalize %>"></i> <%= t.create %></button>
|
39
|
+
<button type="submit" class="btn btn-outline-secondary"><i class="fa fa-plus" title="<%= EscapeUtils.escape_html t.create.capitalize %>"></i> <%= EscapeUtils.escape_html t.create %></button>
|
40
40
|
</div>
|
41
41
|
</div>
|
42
42
|
</form>
|
@@ -49,20 +49,20 @@
|
|
49
49
|
<table class="table table-striped table-sm">
|
50
50
|
<tr>
|
51
51
|
<th>
|
52
|
-
<%= t.file.capitalize %>
|
52
|
+
<%= EscapeUtils.escape_html t.file.capitalize %>
|
53
53
|
</th>
|
54
54
|
<th class="text-center">
|
55
|
-
<%= t.edit.capitalize %>
|
55
|
+
<%= EscapeUtils.escape_html t.edit.capitalize %>
|
56
56
|
</th>
|
57
57
|
<th class="text-center">
|
58
|
-
<%= t.delete.capitalize %>
|
58
|
+
<%= EscapeUtils.escape_html t.delete.capitalize %>
|
59
59
|
</th>
|
60
60
|
</tr>
|
61
61
|
<% if @parent_dir %>
|
62
62
|
<tr>
|
63
63
|
<td colspan="3">
|
64
64
|
<i class="fas fa-folder"></i>
|
65
|
-
<a href="/files/index?dir_path=<%= File.dirname(@dir_path) %>">[<%= t.parent_dir.capitalize %>]</a>
|
65
|
+
<a href="/files/index?dir_path=<%= File.dirname(@dir_path) %>">[<%= EscapeUtils.escape_html t.parent_dir.capitalize %>]</a>
|
66
66
|
</td>
|
67
67
|
</tr>
|
68
68
|
<% end %>
|
@@ -95,13 +95,13 @@
|
|
95
95
|
</td>
|
96
96
|
<td class="text-center">
|
97
97
|
<% if !File.directory?(f) %>
|
98
|
-
<a href="/files/edit?file=<%= f %>&dir_path=<%= @dir_path %>" class="btn btn-default"><i class="fa fa-edit" title="<%= t.edit %>"></i></a>
|
98
|
+
<a href="/files/edit?file=<%= f %>&dir_path=<%= @dir_path %>" class="btn btn-default"><i class="fa fa-edit" title="<%= EscapeUtils.escape_html t.edit %>"></i></a>
|
99
99
|
<% end %>
|
100
100
|
</td>
|
101
101
|
<td class="text-center">
|
102
|
-
<form method="post" action="/files/delete?file=<%= f %>" class="inline form-confirm" data-confirm="<%= t.are_you_sure %>">
|
102
|
+
<form method="post" action="/files/delete?file=<%= f %>" class="inline form-confirm" data-confirm="<%= EscapeUtils.escape_html t.are_you_sure %>">
|
103
103
|
<input name="path" type="hidden" value="<%= @dir_path %>">
|
104
|
-
<button type="submit" class="btn btn-default"><i class="fa fa-trash" title="<%= t.delete %>"></i></button>
|
104
|
+
<button type="submit" class="btn btn-default"><i class="fa fa-trash" title="<%= EscapeUtils.escape_html t.delete %>"></i></button>
|
105
105
|
</form>
|
106
106
|
</td>
|
107
107
|
</tr>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<% path = File.join(Pathname.new(App.gem_source_path), 'admin_views', 'partials', 'image_element.html.erb') %>
|
2
|
+
<% myerb = ERB.new(File.read(path), eoutvar: "@bidule") %>
|
3
|
+
<% # Why %= don't work !? Need to do a loop concat... %>
|
4
|
+
<% $stderr.puts @images %>
|
5
|
+
<% (@images || []).each do |img| %>
|
6
|
+
<% @img = img.gsub(Dir.pwd, "") %>
|
7
|
+
<%= myerb.result(binding) %>
|
8
|
+
<% end %>
|
@@ -1,49 +1,49 @@
|
|
1
|
-
<h2><%= t.send(@type_file).capitalize %></h2>
|
1
|
+
<h2><%= EscapeUtils.escape_html t.send(@type_file).capitalize %></h2>
|
2
2
|
|
3
3
|
<% file_params = (!@new_record ? "?file=#{@file}" : "") %>
|
4
4
|
|
5
5
|
<form action="/<%= @type_file %><%= file_params %>" method="post">
|
6
6
|
<% if !@new_record %>
|
7
7
|
<div class="mb-3">
|
8
|
-
<label for="i-path" class="form-label"><%= t.path.capitalize %></label>
|
8
|
+
<label for="i-path" class="form-label"><%= EscapeUtils.escape_html t.path.capitalize %></label>
|
9
9
|
<div class="input-group">
|
10
|
-
<input type="text" class="form-control" value="<%= @file %>" name="new_file" id="i-path">
|
11
10
|
<span class="input-group-text">
|
12
|
-
<i class="fas fa-calendar-alt" id="btn-date-path" title="<%= t.change_date_path %>"></i>
|
11
|
+
<i class="fas fa-calendar-alt" id="btn-date-path" title="<%= EscapeUtils.escape_html t.change_date_path %>"></i>
|
13
12
|
</span>
|
14
13
|
<span class="input-group-text">
|
15
|
-
<i class="fas fa-sync-alt" id="btn-title-path" title="<%= t.change_title_path %>"></i>
|
14
|
+
<i class="fas fa-sync-alt" id="btn-title-path" title="<%= EscapeUtils.escape_html t.change_title_path %>"></i>
|
16
15
|
</span>
|
16
|
+
<input type="text" class="form-control" value="<%= @file %>" name="new_file" id="i-path">
|
17
17
|
</div>
|
18
|
-
<div id="i-path-help" class="form-text"><%= t.help_path %></div>
|
18
|
+
<div id="i-path-help" class="form-text"><%= EscapeUtils.escape_html t.help_path %></div>
|
19
19
|
</div>
|
20
20
|
<% end %>
|
21
21
|
<div class="mb-3">
|
22
|
-
<label for="i-title" class="form-label"><%= t.title.capitalize %></label>
|
22
|
+
<label for="i-title" class="form-label"><%= EscapeUtils.escape_html t.title.capitalize %></label>
|
23
23
|
<input type="text" value="<%= @headers.delete('title') %>" class="form-control" name="title" id="i-title">
|
24
24
|
</div>
|
25
25
|
<div class="mb-3">
|
26
|
-
<label for="i-date" class="form-label"><%= t.date.capitalize %></label>
|
26
|
+
<label for="i-date" class="form-label"><%= EscapeUtils.escape_html t.date.capitalize %></label>
|
27
27
|
<div class="input-group">
|
28
|
-
<input type="text" value="<%= @headers.delete('date') || Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>" class="form-control" name="date" id="i-date">
|
29
28
|
<span class="input-group-text">
|
30
|
-
<i class="fas fa-calendar-day" id="btn-date-today" title="<%= t.set_date_today %>"></i>
|
29
|
+
<i class="fas fa-calendar-day" id="btn-date-today" title="<%= EscapeUtils.escape_html t.set_date_today %>"></i>
|
31
30
|
</span>
|
31
|
+
<input type="text" value="<%= @headers.delete('date') || Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>" class="form-control" name="date" id="i-date">
|
32
32
|
</div>
|
33
33
|
</div>
|
34
34
|
<div class="mb-3">
|
35
|
-
<label for="i-tags" class="form-label"><%= t.tags.capitalize %></label>
|
36
|
-
<input type="text" value="<%= @headers.delete('tags') %>" class="form-control" name="tags" id="i-tags">
|
37
|
-
<div id="i-tags-help" class="form-text"><%= t.help_tags %></div>
|
35
|
+
<label for="i-tags" class="form-label"><%= EscapeUtils.escape_html t.tags.capitalize %></label>
|
36
|
+
<input type="text" value="<%= App.extract_tags(@headers.delete('tags')).join(',') %>" class="form-control" name="tags" id="i-tags">
|
37
|
+
<div id="i-tags-help" class="form-text"><%= EscapeUtils.escape_html t.help_tags %></div>
|
38
38
|
</div>
|
39
39
|
<div class="mb-3 form-check">
|
40
40
|
<input type="checkbox" class="form-check-input" name="publish" value="publish" id="i-publish">
|
41
|
-
<label class="form-check-label" for="i-publish"><%= t.publish.capitalize %></label>
|
41
|
+
<label class="form-check-label" for="i-publish"><%= EscapeUtils.escape_html t.publish.capitalize %></label>
|
42
42
|
</div>
|
43
43
|
|
44
44
|
<% if @hyde_parameters['display_layout'].to_s == 'true' %>
|
45
45
|
<div class="mb-3">
|
46
|
-
<label for="i-layout" class="form-label"><%= t.layout.capitalize %></label>
|
46
|
+
<label for="i-layout" class="form-label"><%= EscapeUtils.escape_html t.layout.capitalize %></label>
|
47
47
|
<select class="form-select" aria-label="Choice layout" name="layout">
|
48
48
|
<% Dir.glob(File.join(Dir.pwd, '_layouts', '*')).each do |f| %>
|
49
49
|
<% layout = File.basename(f, File.extname(f)) %>
|
@@ -58,7 +58,7 @@
|
|
58
58
|
|
59
59
|
<% if @hyde_parameters['display_format'].to_s == 'true' %>
|
60
60
|
<div class="mb-3">
|
61
|
-
<label for="i-format" class="form-label"><%= t.format.capitalize %></label>
|
61
|
+
<label for="i-format" class="form-label"><%= EscapeUtils.escape_html t.format.capitalize %></label>
|
62
62
|
<select class="form-select" id="select-format" aria-label="Choice format" name="format">
|
63
63
|
<% format = File.extname(@file) %>
|
64
64
|
<% format = ".#{@hyde_parameters['default_format']}" if format.empty? %>
|
@@ -84,7 +84,7 @@
|
|
84
84
|
</div>
|
85
85
|
<% end %>
|
86
86
|
|
87
|
-
<a href="#" class="btn btn-secondary mb-2" id="add-header"><i class="fas fa-plus"></i> <%= t.add_header.capitalize %></a>
|
87
|
+
<a href="#" class="btn btn-secondary mb-2" id="add-header"><i class="fas fa-plus"></i> <%= EscapeUtils.escape_html t.add_header.capitalize %></a>
|
88
88
|
<div class="mb-3 custom-headers"></div>
|
89
89
|
|
90
90
|
<div class="mb-3 template-header" style="display: none">
|
@@ -109,14 +109,14 @@
|
|
109
109
|
</script>
|
110
110
|
|
111
111
|
<div class="mb-3">
|
112
|
-
<label for="i-content" class="form-label"><%= t.content.capitalize %> <a href="https://jekyllrb.com/docs/liquid/" class="text-secondary" target="_blank"><i class="fas fa-question-circle"></i></a></label>
|
112
|
+
<label for="i-content" class="form-label"><%= EscapeUtils.escape_html t.content.capitalize %> <a href="https://jekyllrb.com/docs/liquid/" class="text-secondary" target="_blank"><i class="fas fa-question-circle"></i></a></label>
|
113
113
|
|
114
|
-
<% path = File.join(Pathname.new(
|
114
|
+
<% path = File.join(Pathname.new(App.gem_source_path), 'admin_views', 'editor_html.erb') %>
|
115
115
|
<%= ERB.new(File.read(path)).result(binding) %>
|
116
116
|
|
117
117
|
<textarea class="form-control text-editor" id="i-content" rows="3" name="content"><%= @content %></textarea>
|
118
118
|
</div>
|
119
|
-
<button type="submit" class="btn btn-primary"><%= t.submit.capitalize %></button>
|
119
|
+
<button type="submit" class="btn btn-primary"><%= EscapeUtils.escape_html t.submit.capitalize %></button>
|
120
120
|
</form>
|
121
121
|
|
122
122
|
<script type="text/javascript" charset="utf-8">
|
@@ -150,7 +150,7 @@
|
|
150
150
|
return false;
|
151
151
|
});
|
152
152
|
|
153
|
-
<% path = File.join(Pathname.new(
|
153
|
+
<% path = File.join(Pathname.new(App.gem_source_path), 'admin_views', 'editor_js.erb') %>
|
154
154
|
<%= ERB.new(File.read(path)).result(binding) %>
|
155
155
|
|
156
156
|
</script>
|
@@ -1,16 +1,16 @@
|
|
1
|
-
<h2><%= t.send(@type_file).capitalize %> <a href="/<%= @type_file %>/new" class="btn btn-secondary btn-sm"><i class="fas fa-plus"></i> <%= t.new.capitalize %></a></h2>
|
1
|
+
<h2><%= EscapeUtils.escape_html t.send(@type_file).capitalize %> <a href="/<%= @type_file %>/new" class="btn btn-secondary btn-sm"><i class="fas fa-plus"></i> <%= EscapeUtils.escape_html t.new.capitalize %></a></h2>
|
2
2
|
|
3
3
|
<div class="table-responsive">
|
4
4
|
<table class="table table-striped table-sm">
|
5
5
|
<tr>
|
6
6
|
<th>
|
7
|
-
<%= t.file.capitalize %>
|
7
|
+
<%= EscapeUtils.escape_html t.file.capitalize %>
|
8
8
|
</th>
|
9
9
|
<th>
|
10
|
-
<%= t.edit.capitalize %>
|
10
|
+
<%= EscapeUtils.escape_html t.edit.capitalize %>
|
11
11
|
</th>
|
12
12
|
<th>
|
13
|
-
<%= t.delete.capitalize %>
|
13
|
+
<%= EscapeUtils.escape_html t.delete.capitalize %>
|
14
14
|
</th>
|
15
15
|
</tr>
|
16
16
|
<% @files.each do |f| %>
|
@@ -19,12 +19,12 @@
|
|
19
19
|
<%= f.gsub(File.join(Dir.pwd, ''),'') %>
|
20
20
|
</td>
|
21
21
|
<td>
|
22
|
-
<a href="/<%= @type_file %>?file=<%= f %>" class="btn btn-default"><i class="fa fa-edit" title="<%= t.edit.capitalize %>"></i></a>
|
22
|
+
<a href="/<%= @type_file %>?file=<%= f %>" class="btn btn-default"><i class="fa fa-edit" title="<%= EscapeUtils.escape_html t.edit.capitalize %>"></i></a>
|
23
23
|
</td>
|
24
24
|
<td>
|
25
|
-
<form method="post" action="/<%= @type_file %>/delete" class="inline form-confirm" data-confirm="<%= t.are_you_sure %>">
|
25
|
+
<form method="post" action="/<%= @type_file %>/delete" class="inline form-confirm" data-confirm="<%= EscapeUtils.escape_html t.are_you_sure %>">
|
26
26
|
<input type="hidden" name="file" value="<%= f %>">
|
27
|
-
<button type="submit" class="btn btn-default"><i class="fa fa-trash" title="<%= t.delete.capitalize %>"></i></button>
|
27
|
+
<button type="submit" class="btn btn-default"><i class="fa fa-trash" title="<%= EscapeUtils.escape_html t.delete.capitalize %>"></i></button>
|
28
28
|
</form>
|
29
29
|
</td>
|
30
30
|
</tr>
|
data/bin/hyde_admin.ru
CHANGED
@@ -5,6 +5,7 @@ require 'yaml'
|
|
5
5
|
require 'fileutils'
|
6
6
|
require 'i18n'
|
7
7
|
require 'date'
|
8
|
+
require 'escape_utils'
|
8
9
|
require_relative '../lib/hyde_admin/version'
|
9
10
|
|
10
11
|
# TODO détecter format nouveau post (pour codemirror)
|
@@ -70,6 +71,14 @@ class App < Roda
|
|
70
71
|
str.gsub(/---(.*?)---/m, "")
|
71
72
|
end
|
72
73
|
|
74
|
+
def self.gem_source_path
|
75
|
+
File.expand_path(File.dirname(__FILE__))
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.extract_tags(str)
|
79
|
+
str.scan(/^\[?(.*?)\]?$/).flatten.first.split(',')
|
80
|
+
end
|
81
|
+
|
73
82
|
FORMAT_DATE_FILENAME = '%Y-%m-%d'
|
74
83
|
FORMAT_DATE_INPUT_FILENAME = '%Y-%m-%d %H:%M:%S %z'
|
75
84
|
|
@@ -217,6 +226,27 @@ class App < Roda
|
|
217
226
|
date = Time.now.strftime(FORMAT_DATE_INPUT_FILENAME)
|
218
227
|
response.write(date)
|
219
228
|
end
|
229
|
+
r.post "images" do
|
230
|
+
nb_elements_per_page = 9
|
231
|
+
|
232
|
+
sort_date = r.params['sort_date']
|
233
|
+
filename = r.params['filename']
|
234
|
+
page = r.params['page'].to_i
|
235
|
+
start_elts = (page || 0) * nb_elements_per_page
|
236
|
+
|
237
|
+
search_filename = "*#{filename.strip}*"
|
238
|
+
|
239
|
+
path_of_images = File.join(Dir.pwd, @hyde_parameters['images_path'], search_filename)
|
240
|
+
|
241
|
+
all_images = Dir.glob(path_of_images).sort_by {|filename| File.mtime(filename) }
|
242
|
+
all_images = all_images.reverse if sort_date == 'asc'
|
243
|
+
@images = all_images[start_elts, nb_elements_per_page]
|
244
|
+
|
245
|
+
path = File.join(Pathname.new(App.gem_source_path), 'admin_views', 'partials', 'images_page.html.erb')
|
246
|
+
data = ERB.new(File.read(path)).result(binding)
|
247
|
+
|
248
|
+
response.write(data)
|
249
|
+
end
|
220
250
|
end
|
221
251
|
|
222
252
|
# Posts/pages/drafts
|
@@ -1,18 +1,31 @@
|
|
1
1
|
/* modal pictures */
|
2
|
-
.
|
2
|
+
.image-selector-content{
|
3
3
|
display: grid;
|
4
4
|
grid-template-columns: 1fr 1fr 1fr;
|
5
5
|
}
|
6
|
-
.
|
6
|
+
.image-selector-content .image-element{
|
7
7
|
width: 150px;
|
8
8
|
height: 150px;
|
9
9
|
}
|
10
|
-
.
|
10
|
+
.image-selector-content .image-element img{
|
11
11
|
width: 100%;
|
12
12
|
height: 100%;
|
13
13
|
object-fit: contain;
|
14
14
|
overflow: hidden;
|
15
15
|
}
|
16
|
-
.
|
16
|
+
.image-selector-content .image-element img:hover{
|
17
17
|
border:2px solid gray;
|
18
|
+
}
|
19
|
+
|
20
|
+
.image-element{
|
21
|
+
position: relative;
|
22
|
+
}
|
23
|
+
|
24
|
+
.image-element span{
|
25
|
+
position: absolute;
|
26
|
+
bottom:5px;
|
27
|
+
left:5px;
|
28
|
+
z-index: 10;
|
29
|
+
font-weight: bold;
|
30
|
+
text-shadow:white 0px 0px 3px, white 0px 0px 2px;
|
18
31
|
}
|
data/bin/i18n/en.yml
CHANGED
@@ -85,4 +85,11 @@ editor_italic: Italic
|
|
85
85
|
editor_strikethrough: Strikethrough
|
86
86
|
default_alt_img: Alt text
|
87
87
|
default_title_img: Title text
|
88
|
-
parent_dir:
|
88
|
+
parent_dir: parent directory
|
89
|
+
sort_by_date: sort_by_date
|
90
|
+
older: older first
|
91
|
+
newer: newer first
|
92
|
+
previous_images: previous images
|
93
|
+
next_images: next images
|
94
|
+
search: search
|
95
|
+
filename: filename
|
data/bin/i18n/fr.yml
CHANGED
@@ -85,4 +85,11 @@ editor_italic: Italique
|
|
85
85
|
editor_strikethrough: Barré
|
86
86
|
default_alt_img: Texte alternatif
|
87
87
|
default_title_img: Titre image
|
88
|
-
parent_dir: dossier parent
|
88
|
+
parent_dir: dossier parent
|
89
|
+
sort_by_date: tri par date
|
90
|
+
older: vieille d'abord
|
91
|
+
newer: récente d'abord
|
92
|
+
previous_images: images précédentes " lol
|
93
|
+
next_images: images suivantes
|
94
|
+
search: recherche
|
95
|
+
filename: nom de fichier
|
data/hyde_admin.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_runtime_dependency("roda", "~> 3.48.0")
|
29
29
|
s.add_runtime_dependency("roda-i18n", "~> 0.4.0")
|
30
30
|
s.add_runtime_dependency("roda-http-auth", "0.2.0")
|
31
|
+
s.add_runtime_dependency("escape_utils") # escape_javascript / escape_html
|
31
32
|
#s.add_runtime_dependency("i18n", "~> 0.4.0") # I18n.transliterate (already required by jekyll)
|
32
33
|
s.add_runtime_dependency('jekyll') # Because we call jekyll binary
|
33
34
|
end
|
data/lib/hyde_admin/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hyde_admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Claudel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: roda
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: escape_utils
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: jekyll
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,6 +103,8 @@ files:
|
|
89
103
|
- bin/admin_views/editor_js.erb
|
90
104
|
- bin/admin_views/files/edit.erb
|
91
105
|
- bin/admin_views/files/listing.erb
|
106
|
+
- bin/admin_views/partials/image_element.html.erb
|
107
|
+
- bin/admin_views/partials/images_page.html.erb
|
92
108
|
- bin/admin_views/posts/edit.erb
|
93
109
|
- bin/admin_views/posts/listing.erb
|
94
110
|
- bin/fslightbox/fslightbox.js
|