From 502a8eff1497c00691d1d7da92d43e6497113696 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Wed, 16 Feb 2022 20:32:20 +0000 Subject: [PATCH] identify lists by their id (part of the URI) --- public/javascripts/lsl.js | 84 +++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/public/javascripts/lsl.js b/public/javascripts/lsl.js index 7d0c4e0..bd767d3 100644 --- a/public/javascripts/lsl.js +++ b/public/javascripts/lsl.js @@ -1,11 +1,16 @@ "use strict"; (function(){ var ui_icon_class_re = new RegExp('\\bui-icon-\\S+\\b'); +var uri_id_re = new RegExp('/(\\d+)$'); var uri_base; // filled on page load from an HTML attribute var lists_version = -1; var lists = []; var selected_list; +function uri_id(uri) { + var m = uri.match(uri_id_re); + return m ? m[1] : null; +} function add_list_item(data) { var item = $('
  • ').addClass('list-item-row').data('item', data); var cb = $(''); @@ -21,15 +26,19 @@ function got_lists_version(new_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)); + if (new_version != selected_list.attr('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); + // TODO: merge new items into existing ones + // keep track of the last existing item, and append new one + // after it, prepending if there is no last existing item + // the newly prepended/inserted item becomes the last existing var item_list = $('#list-items').empty().removeClass('have-list-items'); $.each(item_data.items, (i,item) => { @@ -40,52 +49,60 @@ function load_list_items(uri, target) { }); } function select_list(new_selected_list) { - if (new_selected_list == selected_list) + if (new_selected_list && selected_list + && new_selected_list.length && selected_list.length + && new_selected_list.get(0) == selected_list.get(0) + ) return; - var id_data = new_selected_list.data('id'); + if (new_selected_list && !new_selected_list.length) + new_selected_list = null; + + $('#page').toggleClass('have-lists', !!new_selected_list); 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); + if (new_selected_list) { + load_list_items(new_selected_list.data('lsl-uri'), new_selected_list); + new_selected_list.addClass('selected'); + $('#selected-list-name').text(new_selected_list.data('lsl-name')); + } + + selected_list = new_selected_list; } function load_lists() { $.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 lists = $('#lists'); + lists.find('>li').addClass('old'); + + $.each(data.lists, (i, list) => { + var list_id = uri_id(list.uri); + var existing = lists.find('li#list-'+list_id); + if (existing.length) { + existing.data('lsl-version', list.version) + .data('lsl-name', list.name) + .text(list.name) + .removeClass('old'); + } + else { var list_item = $('
  • ') - .data('id', list) - .prop('id', my_id) + .prop('id', 'list-'+list_id) + .data('lsl-uri', list.uri) + .data('lsl-version', list.version) + .data('lsl-name', list.name) .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); + if (!selected_list || selected_list.hasClass('old')) + select_list(lists.find('>li').eq(0)); - $('#page').addClass('have-lists'); - selected_list = new_selected_list; - } - else { - $('#page').removeClass('have-lists'); - selected_list = null; - } + lists.find('li.old').remove(); }); } function new_list_submission_done(data) { @@ -124,8 +141,7 @@ 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, + $.post(selected_list.data('lsl-uri'), JSON.stringify({ description: description, done: $('#new-list-item input[type="checkbox"]').prop('checked') -- 2.39.2