X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Flsl.js;h=7d0c4e03e630921a2743fad380d5f9d0d905ce8b;hb=dfeabddaac016f698fa33d8568131baa761a4c0f;hp=8ecf08e1fb9ae15097133a8d1907943f61fce9c6;hpb=0ddba2456ee68202f1086a8f5db82ac5e2403b6c;p=lsl.git diff --git a/public/javascripts/lsl.js b/public/javascripts/lsl.js index 8ecf08e..7d0c4e0 100644 --- a/public/javascripts/lsl.js +++ b/public/javascripts/lsl.js @@ -1,20 +1,156 @@ "use strict"; (function(){ var ui_icon_class_re = new RegExp('\\bui-icon-\\S+\\b'); -var uri_base; -var lists_version; +var uri_base; // filled on page load from an HTML attribute +var lists_version = -1; var lists = []; -var current_list; +var selected_list; +function add_list_item(data) { + var item = $('
  • ').addClass('list-item-row').data('item', data); + var cb = $(''); + if (data.done) cb.prop('checked', true); + item.append(cb); + item.append($('').text(data.description || '')); + item.append($('').text('…')); + + $('#list-items').append(item).addClass('have-list-items'); +} +function got_lists_version(new_version) { + if (new_version != lists_version) + window.setTimeout(load_lists); +} +function got_list_version(new_version) { + var id_data = selected_list.data('id'); + if (new_version != id_data.version) + window.setTimeout(() => load_list_items(id_data.uri, selected_list)); +} +function load_list_items(uri, target) { + $.get(uri) + .done(item_data => { + target.data('items', item_data); + + var item_list = $('#list-items').empty().removeClass('have-list-items'); + + $.each(item_data.items, (i,item) => { + add_list_item(item); + }); + + got_lists_version(item_data.lists_version); + }); +} +function select_list(new_selected_list) { + if (new_selected_list == selected_list) + return; + + var id_data = new_selected_list.data('id'); + + if (selected_list) + selected_list.removeClass('selected'); + load_list_items(id_data.uri, new_selected_list); + selected_list = new_selected_list; + selected_list.addClass('selected'); + $('#selected-list-name').text(id_data.name); + +} function load_lists() { - console.log('TODO'); + $.get(uri_base + '/api/v1/list') + .done(data => { + lists_version = data.lists_version; + + if (data.lists.length) { + var lists = $('#lists'); + var new_selected_list; + + $.each(data.lists, (i, list) => { + var my_id = 'shopping-list-id'+i; + var list_item = $('
  • ') + .data('id', list) + .prop('id', my_id) + .text(list.name); + + lists.append(list_item); + + if (!new_selected_list + ||selected_list && selected_list.uri == list.uri) + new_selected_list = list_item; + + }); + + select_list(new_selected_list); + + $('#page').addClass('have-lists'); + selected_list = new_selected_list; + } + else { + $('#page').removeClass('have-lists'); + selected_list = null; + } + }); +} +function new_list_submission_done(data) { + if (data.lists_version != lists_version) { + load_lists(); + return; + } + + console.log("TODO: easy-add new list"); + } function handle_new_list_submission(){ $.post(uri_base + '/api/v1/list', JSON.stringify({name:$('input[name="list_name"]').val()})) - .done(load_lists); + .done(new_list_submission_done); return false; } +function new_list_item_submission_done(data) { + got_lists_version(data.lists_version); + 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, + }; + item_data.items.push(new_item); + item_data.version = data.version; + add_list_item(new_item); + + $('#new-list-item input').val(''); +} +function handle_new_list_item_submission(){ + var description = $('#new-list-item input[type="text"]').val().trim(); + if (description.length == 0) return; + + var id_data = selected_list.data('id'); + $.post(id_data.uri, + JSON.stringify({ + description: description, + done: $('#new-list-item input[type="checkbox"]').prop('checked') + }), + ) + .done(new_list_item_submission_done); +} +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, + { type: 'PUT', + data: JSON.stringify({ + version: item_data.version, + done: cb.prop('checked')}) + } + ) + .done(function(resp){ + item_data.version = resp.version; + got_lists_version(resp.lists_version); + got_list_version(resp.list_version); + }); +} $(function(){ uri_base = $('#page').attr('lsl-uri-base'); $(document).ajaxStart(function(){ @@ -49,6 +185,18 @@ $(function(){ return true; }); + $('ul#lists').on('click', 'li', ev=>{ + select_list($(ev.target)); + }); + $('#new-list-item button').on('click', handle_new_list_item_submission); + $('#new-list-item input').on('keypress', ev => { + if (13 == ev.keyCode) { + handle_new_list_item_submission(); + return false; + } + return true; + }); + $('#list-items').on('change', '.list-item-row input[type="checkbox"]', handle_list_item_state_changed); load_lists(); }); })();