X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Flsl.js;h=942f2498f011a8ade58f9dcee7204604662196cd;hb=82c64db67b297c8970efdd85fa03d7d761ba7333;hp=46eebf710524ffd374e0c4b48f91855c0577b516;hpb=75bdf601ff5f2ac092795ce27bdbe59a9013eb26;p=lsl.git diff --git a/public/javascripts/lsl.js b/public/javascripts/lsl.js index 46eebf7..942f249 100644 --- a/public/javascripts/lsl.js +++ b/public/javascripts/lsl.js @@ -19,7 +19,11 @@ function uri_id(uri) { return m ? m[1] : null; } function add_list_item(data) { - var item = $('
  • ').addClass('list-item-row').data('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); item.append(cb); @@ -34,14 +38,15 @@ function got_lists_version(new_version) { window.setTimeout(load_lists); } function got_list_version(new_version) { - if (new_version != selected_list.attr('lsl-version')) + if (new_version != selected_list.data('lsl-version')) window.setTimeout( () => load_list_items(selected_list.data('lsl-uri'), selected_list)); } function load_list_items(uri, target) { $.get(uri) .done(item_data => { - target.data('items', item_data); + target.data('lsl-items', item_data.items); + target.data('lsl-version', item_data.version); // TODO: merge new items into existing ones // keep track of the last existing item, and append new one @@ -80,33 +85,40 @@ function select_list(new_selected_list) { selected_list = new_selected_list; } -function edit_list(li) { - li.addClass('editing'); - +function edit_list() { var d = $('
    ') .append( $('
    ') .append( $('').text('List name'), - $('').val(li.data('lsl-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', - close: ()=>{ - li.removeClass('editing'); - }, width: 'max-content', + close: (ev) => { + $(ev.target).dialog('destroy'); + }, buttons: [ { class: 'btn-delete', icon: 'ui-icon-trash', - text: 'Delete', click: () => { - delete_list(li, d); + delete_list(d); }, }, { @@ -117,38 +129,59 @@ function edit_list(li) { icon: 'ui-icon-disk', text: 'OK', click: () => { - save_list(li, d); + save_list(d); }, }, ], }); } -function delete_list(li, dlg) { - // TODO: fetch all list items and store all data in a "Deleted" +function delete_list(dlg) { + // TODO: store all data including list items in a "Deleted" // pop-up with an "Undo" link that can be used to restore the list var lists_ver = lists_version; - $.ajax( li.data('lsl-uri'), + $.ajax( selected_list.data('lsl-uri'), { type: 'DELETE' } ) .done((d)=>{ lists_version = lists_ver + 1; - if (li.hasClass('selected')) { - var new_selected = li.next(); + var deleted_list = selected_list; + + var new_selected = deleted_list.next(); + if (new_selected.length) { + select_list(new_selected) + } + else { + new_selected = deleted_list.prev(); if (new_selected.length) { - select_list(new_selected) + select_list(new_selected); } else { - new_selected = li.prev(); - if (new_selected.length) { - select_list(new_selected); - } - else { - $('#page').removeClass('have-lists'); - } + $('#page').removeClass('have-lists'); } } - li.remove(); + deleted_list.remove(); + dlg.dialog('destroy'); + got_lists_version(d.lists_version); + }); +} +function save_list(dlg) { + var lists_ver = lists_version; + var new_name = dlg.find('input[type="text"]').val(); + + $.ajax( selected_list.data('lsl-uri'), + { type: 'PUT', + data: JSON.stringify({ name: new_name, + version: selected_list.data('lsl-version')}) + } + ) + .done((d)=>{ + lists_version = lists_ver + 1; + + selected_list.find('.list-name').text(new_name); + selected_list.data('lsl-name', new_name); + $('#selected-list-name').text(new_name); + dlg.dialog('destroy'); got_lists_version(d.lists_version); }); @@ -199,10 +232,6 @@ function load_lists() { .append( $('') .text(list.name) - ) - .append( - $('') - .append('') ); lists.append(list_item); } @@ -238,21 +267,108 @@ function handle_new_list_submission(){ } function new_list_item_submission_done(data) { got_lists_version(data.lists_version); + selected_list.data('lsl-version', selected_list.data('lsl-version') + 1 ); got_list_version(data.list_version); - var item_data = selected_list.data('items'); - var new_item = { description: $('#new-list-item input[type="text"]').val().trim(), done: $('#new-list-item input[type="checkbox"]').prop('checked'), version: 1, + uri: data.uri, }; - item_data.items.push(new_item); - item_data.version = data.version; + selected_list.data('lsl-items').push(new_item); add_list_item(new_item); $('#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: 'max-content', + close: (ev) => { + $(ev.target).dialog('destroy'); + }, + buttons: [ + { + class: 'btn-delete', + icon: 'ui-icon-trash', + click: () => { + delete_list_item(d, li); + }, + }, + { + text: 'Cancel', + click: ()=>{ d.dialog('destroy'); }, + }, + { + 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; @@ -268,18 +384,18 @@ function handle_new_list_item_submission(){ function handle_list_item_state_changed(ev) { var item = $(ev.target).closest('li'); var cb = item.find('input[type="checkbox"]'); - var item_data = item.data('item'); - $.ajax(item_data.uri, + $.ajax(item.data('lsl-uri'), { type: 'PUT', data: JSON.stringify({ - version: item_data.version, + version: item.data('lsl-version'), done: cb.prop('checked')}) } ) .done(function(resp){ - item_data.version = resp.version; + item.data('lsl-version', resp.version); got_lists_version(resp.lists_version); + selected_list.data('lsl-version', selected_list.data('lsl-version')+1); got_list_version(resp.list_version); }); } @@ -320,14 +436,15 @@ $(function(){ return true; }); - $('ul#lists') + $('#lists') .on('click', 'li', ev=>{ select_list($(ev.target).closest('li')); - }) - .on('click', 'li > span.list-edit-trigger', ev => { - edit_list($(ev.target).closest('li')); - return false; }); + $('#list-edit-trigger').on('click', ev => { + 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) {