summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen D'Ambrosio <ken@jots.org>2026-05-11 12:09:55 +0000
committerKen D'Ambrosio <ken@jots.org>2026-05-11 12:09:55 +0000
commitf219e7e41e37f3bc6118999c1f99d84d1096c772 (patch)
treeb8e26fd8f8af2f1c8aeed436955af6ad174a0775
parent15fda4f8d6baa53eedf45d736383607eece02a63 (diff)
Replace cover dropdown with Random checkbox and per-file cover radio
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-rw-r--r--app.rb9
-rw-r--r--views/admin/album.erb29
2 files changed, 25 insertions, 13 deletions
diff --git a/app.rb b/app.rb
index 9b636fe..8cde4ff 100644
--- a/app.rb
+++ b/app.rb
@@ -359,14 +359,17 @@ def save_edits(rel, dir)
data = load_album(dir)
data['title'] = blank_to_nil(params['album_title'])
data['description'] = blank_to_nil(params['album_description'])
- data['cover'] = blank_to_nil(params['album_cover'])
+ data['cover'] = if params['album_cover_random'] == '1'
+ '__random__'
+ else
+ blank_to_nil(params['album_cover_file'])
+ end
data['sort_reverse'] = params['album_sort_reverse'] == '1'
data['visible'] = params['album_visible'] == '1'
data['files'] ||= {}
- (params['file_title'] || {}).each_key do |name|
+ (params['file_visible'] || {}).each_key do |name|
data['files'][name] ||= {}
- data['files'][name]['title'] = blank_to_nil((params['file_title'] || {})[name])
data['files'][name]['caption'] = blank_to_nil((params['file_caption'] || {})[name])
data['files'][name]['visible'] = (params['file_visible'] || {})[name] == '1'
end
diff --git a/views/admin/album.erb b/views/admin/album.erb
index b25dea9..9d98c5e 100644
--- a/views/admin/album.erb
+++ b/views/admin/album.erb
@@ -25,14 +25,9 @@
</label>
</div>
<div class="form-row form-row-inline">
- <label>Cover image
- <select name="album_cover">
- <option value="">— auto (first image) —</option>
- <option value="__random__"<%= ' selected' if @data['cover'] == '__random__' %>>— random image —</option>
- <% @files.each do |name| %>
- <option value="<%= name %>"<%= ' selected' if @data['cover'] == name %>><%= name %></option>
- <% end %>
- </select>
+ <label class="checkbox-label">
+ <input type="checkbox" name="album_cover_random" value="1" id="cover-random"<%= ' checked' if @data['cover'] == '__random__' %>>
+ Random cover
</label>
<label class="checkbox-label">
<input type="checkbox" name="album_sort_reverse" value="1"<%= ' checked' if @data['sort_reverse'] %>>
@@ -58,9 +53,9 @@
<tr>
<th>Thumb</th>
<th>Filename</th>
- <th>Title</th>
<th>Caption</th>
<th>Visible</th>
+ <th>Cover</th>
</tr>
</thead>
<tbody>
@@ -70,12 +65,14 @@
<tr>
<td><img src="/thumb/<%= file_rel %>" width="60" height="60" loading="lazy" style="object-fit:cover"></td>
<td class="filename"><code><%= name %></code></td>
- <td><input type="text" name="file_title[<%= name %>]" value="<%= ERB::Util.html_escape(meta['title'].to_s) %>" placeholder="<%= ERB::Util.html_escape(name) %>"></td>
<td><input type="text" name="file_caption[<%= name %>]" value="<%= ERB::Util.html_escape(meta['caption'].to_s) %>" placeholder="caption…"></td>
<td class="visible-cell">
<input type="hidden" name="file_visible[<%= name %>]" value="0">
<input type="checkbox" name="file_visible[<%= name %>]" value="1"<%= ' checked' if meta['visible'] != false %>>
</td>
+ <td class="cover-cell">
+ <input type="radio" name="album_cover_file" value="<%= name %>" class="cover-radio"<%= ' checked' if @data['cover'] == name %>>
+ </td>
</tr>
<% end %>
</tbody>
@@ -88,6 +85,18 @@
</div>
</form>
+ <script>
+ (function () {
+ const randomCb = document.getElementById('cover-random');
+ const radios = () => document.querySelectorAll('.cover-radio');
+ if (!randomCb) return;
+ radios().forEach(r => r.addEventListener('change', () => { randomCb.checked = false; }));
+ randomCb.addEventListener('change', function () {
+ if (this.checked) radios().forEach(r => { r.checked = false; });
+ });
+ })();
+ </script>
+
<% unless @sub_dirs.empty? %>
<section class="sub-albums-section">
<h2>Sub-albums</h2>