From 4fbeac38e712fc7f9c8f77f60eefe62a8a0af13c Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Mon, 7 Mar 2022 21:33:54 +0000 Subject: [PATCH] pop a "Check all" / "Clear all" button when multiple items are checked/cleared in succession --- public/css/style.css | 17 ++++++++++++ public/javascripts/lsl.js | 56 +++++++++++++++++++++++++++++++++++++++ views/index.tt | 5 ++++ 3 files changed, 78 insertions(+) diff --git a/public/css/style.css b/public/css/style.css index 4b1a73c..7ed1eef 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -63,6 +63,7 @@ background-color: white; border: 3px solid #aaa; border-top: none; padding: 1em; +box-sizing: border-box; } #sidebar { @@ -280,3 +281,19 @@ ul#list-items { width: 100%; box-sizing: border-box; } +#item-multi-action { + display: block; + position: fixed; + top: -3em; + opacity: 0; + transition: .5s cubic-bezier(0.0, 0.0, 0.0, 1.0); + background: white; + box-shadow: 0 0 1em 1ex white; +} +#item-multi-action.in-view { + top: 4em; + opacity: 1; +} +#item-multi-action button { display: none; } +#item-multi-action.checking button#btn-check-all { display: block; } +#item-multi-action.clearing button#btn-clear-all { display: block; } diff --git a/public/javascripts/lsl.js b/public/javascripts/lsl.js index f7efa52..bb9778e 100644 --- a/public/javascripts/lsl.js +++ b/public/javascripts/lsl.js @@ -8,6 +8,7 @@ var uri_id_re = new RegExp('/(\\d+)$'); var lists_version = -1; var lists = []; var selected_list; +var last_item_action, last_item_action_stamp, item_action_streak = 0; function debug(...args) { if (devel_env) @@ -373,10 +374,56 @@ function handle_new_list_item_submission(){ ) .done(new_list_item_submission_done); } +function reposition_item_multi_action() { + var box = $('#item-multi-action'); + var cnt = $('#content'); + var cnt_x = cnt.offset().left; + var cnt_w = cnt.css('width').replace('px', ''); + var box_w = box.width(); + + box.css('left', cnt_x + cnt_w / 2 - box_w / 2); +} function handle_list_item_state_changed(ev) { var item = $(ev.target).closest('li'); var cb = item.find('input[type="checkbox"]'); + var action = cb.prop('checked') ? 'check' : 'clear'; + var now = new Date(); + var since_last_action = now - last_item_action_stamp; + + console.debug(action, last_item_action, now - last_item_action_stamp, item_action_streak); + if (last_item_action + && last_item_action == action + && since_last_action < 3000) + { + item_action_streak ++; + + if (item_action_streak > 2 + && ( action == 'check' && $('#list-items input[type="checkbox"]').not(':checked').length + || action == 'clear' && $('#list-items input[type="checkbox"]').filter(':checked').length + ) + ) { + var box = $('#item-multi-action') + .removeClass('checking clearing') + .addClass(action+'ing') + .addClass('in-view'); + reposition_item_multi_action(); + var old_timer = box.data('lsl-hide-timer'); + if (old_timer) + window.clearTimeout(old_timer); + + box.data('lsl-hide-timer', window.setTimeout(() => { + box.removeClass('in-view').data('lsl-hide-timer', false); + }, 3000)); + } + } + else { + item_action_streak = 1; + } + + last_item_action = action; + last_item_action_stamp = now; + $.ajax(item.data('lsl-uri'), { type: 'PUT', data: JSON.stringify({ @@ -450,5 +497,14 @@ $(function(){ $('body').on('click', '.ui-widget-overlay', (ev) => { $(ev.target).siblings('.ui-dialog').find('.ui-dialog-content').dialog('close'); }); + $(window).on('resize', () => { reposition_item_multi_action(); }); + $('#btn-check-all').click((ev) => { + $('#list-items input[type="checkbox"]').not(':checked').prop('checked', true).trigger('change'); + return false; + }); + $('#btn-clear-all').click((ev) => { + $('#list-items input[type="checkbox"]').filter(':checked').prop('checked', false).trigger('change'); + return false; + }); }); })(); diff --git a/views/index.tt b/views/index.tt index 069f5f4..cacb56f 100644 --- a/views/index.tt +++ b/views/index.tt @@ -28,6 +28,10 @@ +
+ + +
+ -- 2.39.2