X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Flsl.js;h=bb9778e6e73b354cea06b1e516dac8134c03239c;hb=4fbeac38e712fc7f9c8f77f60eefe62a8a0af13c;hp=97c0dfe03f7a48129b1dd9feb83e6aa5ffabc01f;hpb=a720b382c5ce6629148bdf6a0523555b9f921b77;p=lsl.git diff --git a/public/javascripts/lsl.js b/public/javascripts/lsl.js index 97c0dfe..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) @@ -22,6 +23,7 @@ function add_list_item(data) { var item = $('
  • ').addClass('list-item-row').data({ 'lsl-uri': data.uri, 'lsl-version': data.version, + 'lsl-description': data.description, 'lsl-done': data.done}); var cb = $(''); if (data.done) cb.prop('checked', true); @@ -90,29 +92,36 @@ function edit_list() { $('
    ') .append( $('').text('List name'), - $('') + $('') + .on('keypress', (ev) => { + if (13 == ev.keyCode) { + save_list(d); + return false; + } + + return true; + }) .val(selected_list.data('lsl-name')) ) ); d.dialog({ + dialogClass: 'edit-list-dialog', autoOpen: true, modal: true, title: 'Edit list', - width: 'max-content', + width: 'min(calc(100% - 2em), 20em)', + close: (ev) => { + $(ev.target).dialog('destroy'); + }, buttons: [ { class: 'btn-delete', icon: 'ui-icon-trash', - text: 'Delete', click: () => { delete_list(d); }, }, - { - text: 'Cancel', - click: ()=>{ d.dialog('destroy'); }, - }, { icon: 'ui-icon-disk', text: 'OK', @@ -269,6 +278,90 @@ function new_list_item_submission_done(data) { $('#new-list-item input').val(''); } +function delete_list_item(dlg, li) { + $.ajax(li.data('lsl-uri'), + { type: 'DELETE' }) + .done((resp) => { + li.remove(); + dlg.dialog('destroy'); + selected_list.data('lsl-version', selected_list.data('lsl-version')+1); + got_list_version(resp.list_version); + got_lists_version(resp.lists_version); + }); +} +function save_list_item(dlg,li) { + var new_description = dlg.find('input[type="text"]').val(); + + $.ajax( li.data('lsl-uri'), + { type: 'PUT', + data: JSON.stringify({ + description: new_description, + version: li.data('lsl-version')}) + } + ) + .done((d)=>{ + selected_list.data('lsl-version', selected_list.data('lsl-version') + 1); + + li.data('lsl-description', new_description); + li.data('lsl-version', d.version); + li.find('.description').text(new_description); + + dlg.dialog('destroy'); + got_list_version(d.list_version); + got_lists_version(d.lists_version); + }); +} +function edit_list_item(li) { + var d = $('
    ') + .append( + $('
    ') + .append( + $('').text('Item name'), + $('') + .on('keypress', (ev) => { + if (13 == ev.keyCode) { + save_list_item(d, li); + return false; + } + + return true; + }) + .val(li.data('lsl-description')) + ) + ); + + d.dialog({ + dialogClass: 'edit-item-dialog', + autoOpen: true, + modal: true, + title: 'Edit item', + width: 'min(calc(100% - 2em), 20em)', + close: (ev) => { + $(ev.target).dialog('destroy'); + }, + buttons: [ + { + class: 'btn-delete', + icon: 'ui-icon-trash', + click: () => { + delete_list_item(d, li); + }, + }, + { + icon: 'ui-icon-disk', + text: 'OK', + click: () => { + save_list_item(d, li); + }, + }, + ], + }); +} +function handle_list_item_edit(ev) { + var li = $(ev.target).closest('li'); + edit_list_item(li); + return false; +} function handle_new_list_item_submission(){ var description = $('#new-list-item input[type="text"]').val().trim(); if (description.length == 0) return; @@ -281,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({ @@ -344,6 +483,7 @@ $(function(){ edit_list(); return false; }); + $('#list-items').on('click', '>li .edit-trigger', handle_list_item_edit); $('#new-list-item button').on('click', handle_new_list_item_submission); $('#new-list-item input').on('keypress', ev => { if (13 == ev.keyCode) { @@ -354,5 +494,17 @@ $(function(){ }); $('#list-items').on('change', '.list-item-row input[type="checkbox"]', handle_list_item_state_changed); load_lists(); + $('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; + }); }); })();