hyde_admin 0.0.13 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.rspec +3 -0
- data/CHANGELOG.md +31 -0
- data/CLAUDE.md +56 -0
- data/Gemfile +8 -0
- data/bin/admin_views/admin_layout.html.erb +76 -51
- data/bin/admin_views/configuration.erb +4 -4
- data/bin/admin_views/dashboard.erb +37 -1
- data/bin/admin_views/editor_html.erb +21 -18
- data/bin/admin_views/editor_js.erb +112 -111
- data/bin/admin_views/files/edit.erb +4 -4
- data/bin/admin_views/files/listing.erb +14 -14
- data/bin/admin_views/posts/edit.erb +159 -62
- data/bin/admin_views/posts/listing.erb +10 -10
- data/bin/admin_views/search.erb +42 -0
- data/bin/admin_views/upload_image_form.erb +5 -5
- data/bin/hyde_admin.ru +165 -11
- data/bin/hyde_assets/hyde_admin.css +58 -0
- data/bin/hyde_assets/hyde_admin.js +121 -18
- data/bin/i18n/en.yml +20 -1
- data/bin/i18n/fr.yml +21 -2
- data/hyde_admin.gemspec +6 -8
- data/lib/hyde_admin/version.rb +1 -1
- data/spec/files/create_file_spec.rb +92 -0
- data/spec/mid_helpers_spec.rb +105 -0
- data/spec/posts/create_draft_spec.rb +77 -0
- data/spec/posts/create_page_spec.rb +75 -0
- data/spec/posts/create_post_spec.rb +100 -0
- data/spec/search/global_search_spec.rb +92 -0
- data/spec/spec_helper.rb +25 -0
- metadata +26 -34
- data/.idea/.gitignore +0 -8
- data/.idea/hyde_admin.iml +0 -25
- data/.idea/misc.xml +0 -4
- data/.idea/modules.xml +0 -8
- data/.idea/vcs.xml +0 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1543e23f13b0754c2c354bed6a97ecf2ba5a6e2a06bd0dc7a7700e8d0118cc03
|
|
4
|
+
data.tar.gz: 21a4fb84e2fda24664dce4d9b160e9188fa03178e14d523ff1786d2131cf7739
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 339665fac60c5c1c56b8846495a90b23b76ebbd9c959e094bff37340096db7b768f165bdfede986bc1f5cc49340e86be8c0547cf326a022d92514f4497d61825
|
|
7
|
+
data.tar.gz: d8136ec6badb9af96ad5471f755ea44bbd9b22180e28950f14dab34b15f26a13b2b354708d1a4ed610c276573397a2786c9bef389f866c23763038cd85a04d61
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,34 @@
|
|
|
1
|
+
# 0.0.14
|
|
2
|
+
|
|
3
|
+
Security:
|
|
4
|
+
- Use YAML.safe_load instead of YAML.load
|
|
5
|
+
- Prevent path traversal on file operations
|
|
6
|
+
- Escape shell arguments in rebuild and deploy commands
|
|
7
|
+
- Escape HTML output in post/draft templates to prevent XSS
|
|
8
|
+
|
|
9
|
+
Features:
|
|
10
|
+
- Add preview & SFTP settings
|
|
11
|
+
- Add search, improved filenames for posts, UI improvements, autosave/recovery
|
|
12
|
+
- Add flash notice messages after rebuild, deploy and configuration save
|
|
13
|
+
- Add posts/drafts/pages counters to dashboard
|
|
14
|
+
|
|
15
|
+
Improvements:
|
|
16
|
+
- Remove jQuery dependency, use vanilla JS and fetch API
|
|
17
|
+
- Update Bootstrap from 5.1.1 to 5.3.8
|
|
18
|
+
- Update Font Awesome from 5.15.4 to 6.7.2
|
|
19
|
+
- Relax gem dependency version constraints
|
|
20
|
+
|
|
21
|
+
Bugfixes:
|
|
22
|
+
- Fix deploy/rebuild JS handler not working
|
|
23
|
+
- Fix image upload duplicate rename producing wrong filenames
|
|
24
|
+
- Frontmatter parser now supports keys with dashes and underscores
|
|
25
|
+
- Handle directory deletion safely in file browser
|
|
26
|
+
- Remove typo in french translation for previous_images
|
|
27
|
+
|
|
28
|
+
# 0.0.13
|
|
29
|
+
|
|
30
|
+
Add code highlighting
|
|
31
|
+
|
|
1
32
|
# 0.0.12
|
|
2
33
|
|
|
3
34
|
Add liquid code highlighter in wysiwyg editor
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Hyde Admin - CLAUDE.md
|
|
2
|
+
|
|
3
|
+
## Project Overview
|
|
4
|
+
Hyde Admin is a Ruby gem providing a web-based administration interface for Jekyll static sites. It allows managing pages, posts, drafts, files, images, and site configuration through a browser UI.
|
|
5
|
+
|
|
6
|
+
## Tech Stack
|
|
7
|
+
- **Language**: Ruby
|
|
8
|
+
- **Web framework**: Roda (lightweight Ruby web framework)
|
|
9
|
+
- **Server**: Puma (via Rack)
|
|
10
|
+
- **Templates**: ERB (in `bin/admin_views/`)
|
|
11
|
+
- **Frontend**: Bootstrap 5.3, jQuery 3.6, Font Awesome 5.15, CodeMirror (code editor), FSLightbox
|
|
12
|
+
- **Assets**: Served as static files (no asset pipeline), CDN for Bootstrap/jQuery/Font Awesome
|
|
13
|
+
- **Distribution**: Ruby gem (`hyde_admin.gemspec`)
|
|
14
|
+
|
|
15
|
+
## Project Structure
|
|
16
|
+
```
|
|
17
|
+
bin/
|
|
18
|
+
hyde_admin.ru # Main Roda application (routes, plugins, logic)
|
|
19
|
+
hyde_admin # CLI executable
|
|
20
|
+
hyde_admin_config # Config installer script
|
|
21
|
+
admin_views/ # ERB templates
|
|
22
|
+
admin_layout.html.erb # Main layout (CDN links, sidebar, modals)
|
|
23
|
+
partials/ # Reusable template fragments
|
|
24
|
+
hyde_assets/ # Custom CSS (hyde_admin.css) and JS (hyde_admin.js)
|
|
25
|
+
lib/ # CodeMirror editor library
|
|
26
|
+
mode/ # CodeMirror language modes
|
|
27
|
+
fslightbox/ # Lightbox library
|
|
28
|
+
i18n/ # Locale files (YAML)
|
|
29
|
+
img/ # Images (logo)
|
|
30
|
+
lib/
|
|
31
|
+
hyde_admin/version.rb # Gem version constant
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Key Commands
|
|
35
|
+
```bash
|
|
36
|
+
# Build the gem
|
|
37
|
+
gem build hyde_admin.gemspec
|
|
38
|
+
|
|
39
|
+
# Install locally
|
|
40
|
+
gem install hyde_admin-*.gem
|
|
41
|
+
|
|
42
|
+
# Run the admin server (from a Jekyll site directory)
|
|
43
|
+
hyde_admin
|
|
44
|
+
|
|
45
|
+
# Install/update config file
|
|
46
|
+
hyde_admin_config
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Development Notes
|
|
50
|
+
- All frontend dependencies (Bootstrap, jQuery, Font Awesome) are loaded via CDN in `admin_layout.html.erb`
|
|
51
|
+
- CodeMirror and FSLightbox are bundled locally in `bin/`
|
|
52
|
+
- The app uses `roda-i18n` for internationalization, locale files are in `bin/i18n/`
|
|
53
|
+
- Image upload uses `image_processing` + `mini_magick` for resizing
|
|
54
|
+
- Deployment uses rsync (configurable via `hyde_admin.yml`)
|
|
55
|
+
- No test suite currently exists
|
|
56
|
+
- Version is defined in `lib/hyde_admin/version.rb`
|
data/Gemfile
ADDED
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
<meta name="author" content="Sylvain Claudel (https://blog.rivsc.ovh)">
|
|
9
9
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
10
10
|
|
|
11
|
-
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.
|
|
12
|
-
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.
|
|
13
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/
|
|
11
|
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
|
|
12
|
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
|
|
13
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" integrity="sha512-Evv84Mr4kqVGRNSgIGL/F/aIDqQb7xQ2vcrdIwxfjThSH8CSR7PBEakCr51Ck+w+/U6swU2Im1vVX0SVk9ABhg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
|
14
14
|
|
|
15
15
|
<script src="/lib/codemirror.js"></script>
|
|
16
16
|
<link rel="stylesheet" href="/lib/codemirror.css">
|
|
@@ -21,8 +21,6 @@
|
|
|
21
21
|
<script src="/mode/yaml/yaml.js"></script>
|
|
22
22
|
<script src="/mode/xml/xml.js"></script>
|
|
23
23
|
<script src="/mode/markdown/markdown.js"></script>
|
|
24
|
-
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
|
|
25
|
-
|
|
26
24
|
<link rel="stylesheet" href="/hyde_assets/hyde_admin.css">
|
|
27
25
|
<script src="/hyde_assets/hyde_admin.js"></script>
|
|
28
26
|
</head>
|
|
@@ -32,64 +30,78 @@
|
|
|
32
30
|
<nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
|
|
33
31
|
<div class="position-sticky pt-3">
|
|
34
32
|
<a href="/"><img src="/img/logo.png" alt="Hyde Admin" title="Logo hyde admin" class="sidebarMenu-logo" /></a>
|
|
33
|
+
<form action="/search" method="get" class="px-3 mb-3">
|
|
34
|
+
<div class="input-group input-group-sm">
|
|
35
|
+
<input type="text" name="q" class="form-control" placeholder="<%= CGI.escapeHTML t.global_search_placeholder %>">
|
|
36
|
+
<button class="btn btn-outline-secondary" type="submit"><i class="fa-solid fa-magnifying-glass"></i></button>
|
|
37
|
+
</div>
|
|
38
|
+
</form>
|
|
35
39
|
<ul class="nav flex-column">
|
|
36
40
|
<li class="nav-item">
|
|
37
41
|
</li>
|
|
38
42
|
<li class="nav-item">
|
|
39
43
|
<a class="nav-link active" aria-current="page" href="/dashboard">
|
|
40
44
|
<span data-feather="home" class="fas fa-tachometer-alt"></span>
|
|
41
|
-
<%=
|
|
45
|
+
<%= CGI.escapeHTML t.dashboard.capitalize %>
|
|
42
46
|
</a>
|
|
43
47
|
</li>
|
|
44
48
|
<li class="nav-item">
|
|
45
49
|
<a class="nav-link" href="/pages/index">
|
|
46
50
|
<span data-feather="file" class="fas fa-file"></span>
|
|
47
|
-
<%=
|
|
51
|
+
<%= CGI.escapeHTML t.pages.capitalize %>
|
|
48
52
|
</a>
|
|
49
53
|
</li>
|
|
50
54
|
<li class="nav-item">
|
|
51
55
|
<a class="nav-link" href="/drafts/index">
|
|
52
56
|
<span data-feather="shopping-cart" class="fas fa-file"></span>
|
|
53
|
-
<%=
|
|
57
|
+
<%= CGI.escapeHTML t.drafts.capitalize %>
|
|
54
58
|
</a>
|
|
55
59
|
</li>
|
|
56
60
|
<li class="nav-item">
|
|
57
61
|
<a class="nav-link" href="/posts/index">
|
|
58
62
|
<span data-feather="users" class="fas fa-file"></span>
|
|
59
|
-
<%=
|
|
63
|
+
<%= CGI.escapeHTML t.posts.capitalize %>
|
|
60
64
|
</a>
|
|
61
65
|
</li>
|
|
62
66
|
<li class="nav-item">
|
|
63
67
|
<a class="nav-link" href="/files/index">
|
|
64
68
|
<span data-feather="users" class="fas fa-copy"></span>
|
|
65
|
-
<%=
|
|
69
|
+
<%= CGI.escapeHTML t.files.capitalize %>
|
|
66
70
|
</a>
|
|
67
71
|
</li>
|
|
68
72
|
<li></li>
|
|
69
73
|
<li class="nav-item mb-4 mt-4">
|
|
70
74
|
<a class="nav-link" href="/configuration">
|
|
71
75
|
<span data-feather="layers" class="fas fa-tools"></span>
|
|
72
|
-
<%=
|
|
76
|
+
<%= CGI.escapeHTML t.configuration.capitalize %>
|
|
73
77
|
</a>
|
|
74
78
|
</li>
|
|
75
79
|
<li></li>
|
|
76
80
|
<li class="nav-item">
|
|
77
81
|
<a class="nav-link active" aria-current="page" href="/rebuild" id="btn-rebuild">
|
|
78
82
|
<span data-feather="home" class="fas fa-hammer"></span>
|
|
79
|
-
<%=
|
|
83
|
+
<%= CGI.escapeHTML t.rebuild.capitalize %>
|
|
80
84
|
</a>
|
|
81
85
|
</li>
|
|
82
86
|
<li class="nav-item">
|
|
83
87
|
<a class="nav-link active" aria-current="page" target="_blank" href="/<%= @hyde_parameters['site_index'] %>">
|
|
84
88
|
<span data-feather="home" class="fas fa-eye"></span>
|
|
85
|
-
<%=
|
|
89
|
+
<%= CGI.escapeHTML t.overview.capitalize %>
|
|
86
90
|
</a>
|
|
87
91
|
</li>
|
|
88
92
|
<% if !@hyde_parameters['deploy_dest_address'].to_s.empty? %>
|
|
89
93
|
<li class="nav-item">
|
|
90
94
|
<a class="nav-link active" aria-current="page" href="/deploy" id="btn-deploy">
|
|
91
95
|
<span data-feather="home" class="fas fa-cloud-upload-alt"></span>
|
|
92
|
-
<%=
|
|
96
|
+
<%= CGI.escapeHTML t.deploy.capitalize %>
|
|
97
|
+
</a>
|
|
98
|
+
</li>
|
|
99
|
+
<% end %>
|
|
100
|
+
<% if !@hyde_parameters['sftp_host'].to_s.empty? %>
|
|
101
|
+
<li class="nav-item">
|
|
102
|
+
<a class="nav-link active" aria-current="page" href="/deploy_sftp" id="btn-deploy-sftp">
|
|
103
|
+
<span data-feather="home" class="fas fa-cloud-upload-alt"></span>
|
|
104
|
+
<%= CGI.escapeHTML t.deploy_sftp.capitalize %>
|
|
93
105
|
</a>
|
|
94
106
|
</li>
|
|
95
107
|
<% end %>
|
|
@@ -97,7 +109,13 @@
|
|
|
97
109
|
<p class="text-center text-muted"><br><br><em>Hyde Admin V.<%= HydeAdmin::VERSION %></em> <a href="https://github.com/rivsc/hyde_admin" class="link-secondary"><i class="fab fa-github"></i></a></p>
|
|
98
110
|
</div>
|
|
99
111
|
</nav>
|
|
100
|
-
<main class="col-md-9 ms-sm-auto col-lg-10
|
|
112
|
+
<main class="col-md-9 ms-sm-auto col-lg-10 p-4">
|
|
113
|
+
<% if @notice && !@notice.empty? %>
|
|
114
|
+
<div class="alert alert-success alert-dismissible fade show mt-2" role="alert">
|
|
115
|
+
<%= CGI.escapeHTML(@notice) %>
|
|
116
|
+
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
117
|
+
</div>
|
|
118
|
+
<% end %>
|
|
101
119
|
<%= yield %>
|
|
102
120
|
</main>
|
|
103
121
|
</div>
|
|
@@ -110,14 +128,14 @@
|
|
|
110
128
|
<div class="modal modal-image" tabindex="-1" role="dialog">
|
|
111
129
|
<div class="modal-dialog" role="document">
|
|
112
130
|
<div class="modal-content">
|
|
113
|
-
<div class="modal-header">
|
|
131
|
+
<div class="modal-header d-flex" style="gap:8px;">
|
|
114
132
|
<h5 class="modal-title"><%= t.images.capitalize %></h5>
|
|
115
133
|
<!--
|
|
116
134
|
<button type="button" class="btn btn-default close" data-dismiss="modal" aria-label="Close">
|
|
117
135
|
<span aria-hidden="true">×</span>
|
|
118
136
|
</button>
|
|
119
137
|
-->
|
|
120
|
-
<button type="button" class="btn btn-outline-secondary btn-sm load-image">
|
|
138
|
+
<button type="button" class="btn btn-outline-secondary btn-sm load-image ml-4">
|
|
121
139
|
<%= t.load_images.capitalize %>
|
|
122
140
|
</button>
|
|
123
141
|
</div>
|
|
@@ -127,18 +145,18 @@
|
|
|
127
145
|
<form action="" class="form-inline">
|
|
128
146
|
<div class="form-group mb-2">
|
|
129
147
|
<label>
|
|
130
|
-
<input class="form-check-input" type="radio" name="sort_date" value="asc"> <%=
|
|
148
|
+
<input class="form-check-input" type="radio" name="sort_date" value="asc"> <%= CGI.escapeHTML t.newer.capitalize %>
|
|
131
149
|
</label>
|
|
132
150
|
|
|
133
151
|
<label>
|
|
134
|
-
<input class="form-check-input" type="radio" name="sort_date" value="desc" checked> <%=
|
|
152
|
+
<input class="form-check-input" type="radio" name="sort_date" value="desc" checked> <%= CGI.escapeHTML t.older.capitalize %>
|
|
135
153
|
</label>
|
|
136
154
|
</div>
|
|
137
155
|
<div class="form-group mb-2">
|
|
138
|
-
<label for="inputFilename" class="sr-only"><%=
|
|
139
|
-
<input type="text" class="form-control" name="filename" id="inputFilename" placeholder="<%=
|
|
156
|
+
<label for="inputFilename" class="sr-only"><%= CGI.escapeHTML t.filename.capitalize %></label>
|
|
157
|
+
<input type="text" class="form-control" name="filename" id="inputFilename" placeholder="<%= CGI.escapeHTML t.filename_placeholder.capitalize %>">
|
|
140
158
|
</div>
|
|
141
|
-
<button type="submit" class="btn btn-primary image-selector-search-submit d-block mb-2"><%=
|
|
159
|
+
<button type="submit" class="btn btn-primary image-selector-search-submit d-block mb-2"><%= CGI.escapeHTML t.search.capitalize %></button>
|
|
142
160
|
</form>
|
|
143
161
|
</div>
|
|
144
162
|
<div class="image-selector-content">
|
|
@@ -146,10 +164,10 @@
|
|
|
146
164
|
<%= ERB.new(File.read(path)).result(binding) %>
|
|
147
165
|
</div>
|
|
148
166
|
<div class="image-selector-page text-center">
|
|
149
|
-
<a href="#" title="<%=
|
|
167
|
+
<a href="#" title="<%= CGI.escapeHTML t.previous_images %>" class="btn btn-secondary image-selector-page-prev px-4">
|
|
150
168
|
<i class="fas fa-chevron-left"></i>
|
|
151
169
|
</a>
|
|
152
|
-
<a href="#" title="<%=
|
|
170
|
+
<a href="#" title="<%= CGI.escapeHTML t.next_images %>" class="btn btn-secondary image-selector-page-next px-4">
|
|
153
171
|
<i class="fas fa-chevron-right"></i>
|
|
154
172
|
</a>
|
|
155
173
|
</div>
|
|
@@ -173,42 +191,49 @@
|
|
|
173
191
|
<% end %>
|
|
174
192
|
|
|
175
193
|
function search(offset_page){
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
194
|
+
var container = document.querySelector('.image-selector-search');
|
|
195
|
+
var checkedRadio = container.querySelector('input[name=sort_date]:checked');
|
|
196
|
+
var sort_date = checkedRadio ? checkedRadio.value : 'desc';
|
|
197
|
+
var filename = container.querySelector('input[name=filename]').value;
|
|
198
|
+
var page = parseInt(container.getAttribute('data-page')) + offset_page;
|
|
180
199
|
|
|
181
|
-
if(
|
|
182
|
-
new_page = 0;
|
|
183
|
-
}
|
|
200
|
+
if(page < 0){ page = 0; }
|
|
184
201
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
202
|
+
var body = new URLSearchParams({ sort_date: sort_date, filename: filename, page: page });
|
|
203
|
+
fetch("/ajax/images", { method: 'POST', body: body })
|
|
204
|
+
.then(function(r){ return r.text(); })
|
|
205
|
+
.then(function(data){
|
|
206
|
+
document.querySelector('.image-selector-content').innerHTML = data;
|
|
188
207
|
});
|
|
189
208
|
|
|
190
|
-
|
|
209
|
+
container.setAttribute('data-page', page);
|
|
191
210
|
return false;
|
|
192
211
|
}
|
|
193
212
|
|
|
194
|
-
|
|
195
|
-
search
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
213
|
+
document.addEventListener('click', function(e){
|
|
214
|
+
if(e.target.closest('.image-selector-search-submit')){
|
|
215
|
+
e.preventDefault();
|
|
216
|
+
search(0);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if(e.target.closest('.image-selector-page-prev')){
|
|
220
|
+
e.preventDefault();
|
|
221
|
+
search(-1);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if(e.target.closest('.image-selector-page-next')){
|
|
225
|
+
e.preventDefault();
|
|
226
|
+
search(1);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if(e.target.closest('.load-image')){
|
|
230
|
+
e.preventDefault();
|
|
231
|
+
window.open("/upload_image_form", "update_image", "dialog=yes,menubar=no,location=no,resizable=no,scrollbars=yes,status=yes,outerWidth=800,innerHeight=300,width=800,height=300");
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
209
234
|
});
|
|
210
235
|
function reload_image(){
|
|
211
|
-
|
|
236
|
+
document.querySelector('.load-image').click();
|
|
212
237
|
}
|
|
213
238
|
</script>
|
|
214
239
|
<script src="/fslightbox/fslightbox.js"></script>
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<h2><%=
|
|
1
|
+
<h2><%= CGI.escapeHTML 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"><%= (
|
|
6
|
+
<label for="i-<%= setting %>" class="form-label"><%= (CGI.escapeHTML t.send(setting).capitalize rescue setting) %></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"><%= (
|
|
8
|
+
<div id="i-<%= setting %>-help" class="form-text"><%= (CGI.escapeHTML t.send("help_#{setting}").capitalize rescue '') %></div>
|
|
9
9
|
</div>
|
|
10
10
|
<% end %>
|
|
11
|
-
<button type="submit" class="btn btn-primary"><%=
|
|
11
|
+
<button type="submit" class="btn btn-primary"><%= CGI.escapeHTML t.submit.capitalize %></button>
|
|
12
12
|
</form>
|
|
13
13
|
|
|
@@ -1 +1,37 @@
|
|
|
1
|
-
<h2><%=
|
|
1
|
+
<h2><%= CGI.escapeHTML t.dashboard.capitalize %></h2>
|
|
2
|
+
|
|
3
|
+
<div class="row mt-4">
|
|
4
|
+
<% posts_count = Dir[File.join(Dir.pwd, '_posts', '*')].size %>
|
|
5
|
+
<% drafts_count = Dir[File.join(Dir.pwd, '_drafts', '*')].size %>
|
|
6
|
+
<% pages_count = Dir[File.join(Dir.pwd, '_pages', '*')].size %>
|
|
7
|
+
|
|
8
|
+
<div class="col-md-4 mb-3">
|
|
9
|
+
<div class="card text-center">
|
|
10
|
+
<div class="card-body">
|
|
11
|
+
<h5 class="card-title"><i class="fas fa-file"></i> <%= CGI.escapeHTML t.posts.capitalize %></h5>
|
|
12
|
+
<p class="display-6"><%= posts_count %></p>
|
|
13
|
+
<a href="/posts/index" class="btn btn-outline-primary btn-sm"><%= CGI.escapeHTML t.view.capitalize %></a>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="col-md-4 mb-3">
|
|
19
|
+
<div class="card text-center">
|
|
20
|
+
<div class="card-body">
|
|
21
|
+
<h5 class="card-title"><i class="fas fa-file"></i> <%= CGI.escapeHTML t.drafts.capitalize %></h5>
|
|
22
|
+
<p class="display-6"><%= drafts_count %></p>
|
|
23
|
+
<a href="/drafts/index" class="btn btn-outline-primary btn-sm"><%= CGI.escapeHTML t.view.capitalize %></a>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="col-md-4 mb-3">
|
|
29
|
+
<div class="card text-center">
|
|
30
|
+
<div class="card-body">
|
|
31
|
+
<h5 class="card-title"><i class="fas fa-file"></i> <%= CGI.escapeHTML t.pages.capitalize %></h5>
|
|
32
|
+
<p class="display-6"><%= pages_count %></p>
|
|
33
|
+
<a href="/pages/index" class="btn btn-outline-primary btn-sm"><%= CGI.escapeHTML t.view.capitalize %></a>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
@@ -1,29 +1,32 @@
|
|
|
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="<%=
|
|
4
|
-
<button type="button" class="btn btn-light"><i class="fas fa-redo-alt" title="<%=
|
|
3
|
+
<button type="button" class="btn btn-light"><i class="fas fa-undo-alt" title="<%= CGI.escapeHTML t.editor_undo %>"></i></button>
|
|
4
|
+
<button type="button" class="btn btn-light"><i class="fas fa-redo-alt" title="<%= CGI.escapeHTML 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="<%=
|
|
8
|
-
<button type="button" class="btn btn-light"><i class="fas fa-list cmt-replace" title="<%=
|
|
9
|
-
<button type="button" class="btn btn-light"><i class="fas fa-list-ol cmt-replace" title="<%=
|
|
10
|
-
<button type="button" class="btn btn-light"><i class="fas fa-link cmt-replace" title="<%=
|
|
11
|
-
<button type="button" class="btn btn-light"><i class="fas fa-quote-left cmt-replace" title="<%=
|
|
7
|
+
<button type="button" class="btn btn-light"><i class="fas fa-file-image" title="<%= CGI.escapeHTML t.editor_file %>"></i></button>
|
|
8
|
+
<button type="button" class="btn btn-light"><i class="fas fa-list cmt-replace" title="<%= CGI.escapeHTML t.editor_list %>"></i></button>
|
|
9
|
+
<button type="button" class="btn btn-light"><i class="fas fa-list-ol cmt-replace" title="<%= CGI.escapeHTML t.editor_list_ol %>"></i></button>
|
|
10
|
+
<button type="button" class="btn btn-light"><i class="fas fa-link cmt-replace" title="<%= CGI.escapeHTML t.editor_link %>"></i></button>
|
|
11
|
+
<button type="button" class="btn btn-light"><i class="fas fa-quote-left cmt-replace" title="<%= CGI.escapeHTML 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="<%=
|
|
15
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-2" title="<%=
|
|
16
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-3" title="<%=
|
|
17
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-4" title="<%=
|
|
18
|
-
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-5" title="<%=
|
|
19
|
-
<button type="button" class="btn btn-light"><i class="fas fa-underline cmt-replace" title="<%=
|
|
20
|
-
<button type="button" class="btn btn-light"><i class="fas fa-bold cmt-replace" title="<%=
|
|
21
|
-
<button type="button" class="btn btn-light"><i class="fas fa-italic cmt-replace" title="<%=
|
|
22
|
-
<button type="button" class="btn btn-light"><i class="fas fa-strikethrough cmt-replace" title="<%=
|
|
14
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-1" title="<%= CGI.escapeHTML t.editor_title_h1 %>">1</i></button>
|
|
15
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-2" title="<%= CGI.escapeHTML t.editor_title_h2 %>">2</i></button>
|
|
16
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-3" title="<%= CGI.escapeHTML t.editor_title_h3 %>">3</i></button>
|
|
17
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-4" title="<%= CGI.escapeHTML t.editor_title_h4 %>">4</i></button>
|
|
18
|
+
<button type="button" class="btn btn-light"><i class="fas fa-heading cmt-heading-5" title="<%= CGI.escapeHTML t.editor_title_h5 %>">5</i></button>
|
|
19
|
+
<button type="button" class="btn btn-light"><i class="fas fa-underline cmt-replace" title="<%= CGI.escapeHTML t.editor_underline %>"></i></button>
|
|
20
|
+
<button type="button" class="btn btn-light"><i class="fas fa-bold cmt-replace" title="<%= CGI.escapeHTML t.editor_bold %>"></i></button>
|
|
21
|
+
<button type="button" class="btn btn-light"><i class="fas fa-italic cmt-replace" title="<%= CGI.escapeHTML t.editor_italic %>"></i></button>
|
|
22
|
+
<button type="button" class="btn btn-light"><i class="fas fa-strikethrough cmt-replace" title="<%= CGI.escapeHTML t.editor_strikethrough %>"></i></button>
|
|
23
23
|
</div>
|
|
24
24
|
<div class="btn-group mr-2" role="group" aria-label="Liquid tags">
|
|
25
|
-
<button type="button" class="btn btn-light"><i class="fas fa-code cmt-replace" title="<%=
|
|
26
|
-
<button type="button" class="btn btn-light"><i class="fas fa-terminal cmt-replace" title="<%=
|
|
25
|
+
<button type="button" class="btn btn-light"><i class="fas fa-code cmt-replace" title="<%= CGI.escapeHTML t.editor_liquid_code %>"></i></button>
|
|
26
|
+
<button type="button" class="btn btn-light"><i class="fas fa-terminal cmt-replace" title="<%= CGI.escapeHTML t.editor_pre_code %>"></i></button>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="btn-group mr-2" role="group" aria-label="Preview">
|
|
29
|
+
<button type="button" class="btn btn-light" id="btn-preview"><i class="fas fa-eye" title="<%= CGI.escapeHTML t.editor_preview %>"></i> <small><%= CGI.escapeHTML t.editor_preview %></small></button>
|
|
27
30
|
</div>
|
|
28
31
|
</div>
|
|
29
32
|
<% if @hyde_parameters['text_editor_maximized'].to_s == 'true' %>
|