diff --git a/public/css/mango.css b/public/css/mango.css index a4a0ee3..d0cb6fe 100644 --- a/public/css/mango.css +++ b/public/css/mango.css @@ -127,3 +127,11 @@ td>.uk-dropdown { [x-cloak] { display: none; } + +#select-bar-controls a { + transform: scale(1.5, 1.5); +} + +#select-bar-controls a:hover { + color: orange; +} diff --git a/public/js/title.js b/public/js/title.js index 46fc25d..5e05613 100644 --- a/public/js/title.js +++ b/public/js/title.js @@ -186,7 +186,47 @@ const setupUpload = (eid) => { const deselectAll = () => { $('.item .uk-card').each((i, e) => { const data = e.__x.$data; - if (!data['disabled']) - data['selected'] = false; + data['selected'] = false; }); + $('#select-bar')[0].__x.$data['count'] = 0; +}; + +const selectedIDs = () => { + const ary = []; + $('.item .uk-card').each((i, e) => { + const data = e.__x.$data; + if (!data['disabled'] && data['selected']) { + const item = $(e).closest('.item'); + ary.push($(item).attr('id')); + } + }); + return ary; +}; + +const bulkProgress = (action, el) => { + const tid = $(el).attr('data-id'); + const ids = selectedIDs(); + const url = `${base_url}api/bulk-progress/${action}/${tid}`; + $.ajax({ + type: 'POST', + url: url, + contentType: "application/json", + dataType: 'json', + data: JSON.stringify({ + ids: ids + }) + }) + .done(data => { + if (data.error) { + alert('danger', `Failed to mark entries as ${action}. Error: ${data.error}`); + return; + } + location.reload(); + }) + .fail((jqXHR, status) => { + alert('danger', `Failed to mark entries as ${action}. Error: [${jqXHR.status}] ${jqXHR.statusText}`); + }) + .always(() => { + deselectAll(); + }); }; diff --git a/src/library/title.cr b/src/library/title.cr index 9ac8a72..6754504 100644 --- a/src/library/title.cr +++ b/src/library/title.cr @@ -355,4 +355,24 @@ class Title return zip if title_ids.empty? zip + titles.map { |t| t.deep_entries_with_date_added }.flatten end + + def bulk_progress(action, ids : Array(String), username) + selected_entries = ids + .map { |id| + @entries.find { |e| e.id == id } + } + .select(Entry) + + TitleInfo.new @dir do |info| + selected_entries.each do |e| + page = action == "read" ? e.pages : 0 + if info.progress[username]?.nil? + info.progress[username] = {e.title => page} + else + info.progress[username][e.title] = page + end + end + info.save + end + end end diff --git a/src/routes/api.cr b/src/routes/api.cr index 736d3cb..a6fb51a 100644 --- a/src/routes/api.cr +++ b/src/routes/api.cr @@ -97,6 +97,28 @@ class APIRouter < Router end end + post "/api/bulk-progress/:action/:title" do |env| + begin + username = get_username env + title = (@context.library.get_title env.params.url["title"]).not_nil! + action = env.params.url["action"] + ids = env.params.json["ids"].as(Array).map &.as_s + + unless action.in? ["read", "unread"] + raise "Unknow action #{action}" + end + title.bulk_progress action, ids, username + rescue e + @context.error e + send_json env, { + "success" => false, + "error" => e.message, + }.to_json + else + send_json env, {"success" => true}.to_json + end + end + post "/api/admin/display_name/:title/:name" do |env| begin title = (@context.library.get_title env.params.url["title"]) diff --git a/src/views/components/card.html.ecr b/src/views/components/card.html.ecr index 0e060a2..d1c02c9 100644 --- a/src/views/components/card.html.ecr +++ b/src/views/components/card.html.ecr @@ -46,7 +46,7 @@ <% end %>>
diff --git a/src/views/title.html.ecr b/src/views/title.html.ecr index 300164c..34efc48 100644 --- a/src/views/title.html.ecr +++ b/src/views/title.html.ecr @@ -1,7 +1,21 @@