diff --git a/www/assets/js/list.js b/www/assets/js/list.js index 09bd50c..3c17493 100644 --- a/www/assets/js/list.js +++ b/www/assets/js/list.js @@ -109,40 +109,43 @@ function loadPackageList(sortType) { } for (var i = 0; i < sortedPackages.length; i++) { - var icon = "fas fa-box-open"; - var classes = ""; - var delivered = false; - if (sortedPackages[i].value.delivered == true) { - delivered = true; - icon = "fas fa-check"; - classes = "text-color-green"; - } else if (typeof sortedPackages[i].value.distance != 'undefined' && sortedPackages[i].value.distance * 1 < localStorage.getItem("alertradius") * 1) { - classes = "text-color-deeporange"; + for (var j = 0; j < sortedPackages[i].value.items.length; j++) { + var item = sortedPackages[i].value.items[j]; + var icon = "fas fa-box-open"; + var classes = ""; + var delivered = false; + if (item.delivered) { + delivered = true; + icon = "fas fa-check"; + classes = "text-color-green"; + } else if (typeof sortedPackages[i].value.distance != 'undefined' && sortedPackages[i].value.distance * 1 < localStorage.getItem("alertradius") * 1) { + classes = "text-color-deeporange"; + } + $("#addresslist").append( + '
  • ' + + '
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ' + + ' ' + item.address + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ' + + ' ' + (delivered ? "  Undeliver" : "  Deliver") + '' + + '   Directions' + + '
    ' + + '
    ' + + '   Delete' + + '
    ' + + '
  • ' + ); } - $("#addresslist").append( - '
  • ' - + '
    ' - + '
    ' - + ' ' - + '
    ' - + '
    ' - + '
    ' - + ' ' + sortedPackages[i].value.address - + '
    ' - + ' ' - + '
    ' - + '
    ' - + '
    ' - + ' ' + (delivered ? "  Undeliver" : "  Deliver") + '' - + '   Directions' - + '
    ' - + '
    ' - + '   Delete' - + '
    ' - + '
  • ' - ); } } diff --git a/www/assets/js/location.js b/www/assets/js/location.js index 13ddfdf..018492d 100644 --- a/www/assets/js/location.js +++ b/www/assets/js/location.js @@ -53,8 +53,8 @@ if ("geolocation" in navigator) { if (packages[i].lastAlert > currentTimestamp - alertinterval) { continue; } - - if (packages[i].delivered) { + + if (getUndeliveredCount(packages[i]) == 0) { continue; } diff --git a/www/assets/js/main.js b/www/assets/js/main.js index d2ce47d..3ecd657 100644 --- a/www/assets/js/main.js +++ b/www/assets/js/main.js @@ -37,6 +37,18 @@ function restartApplication() { window.location = "index.html"; } +/** + * Generate a UUID. + * From https://stackoverflow.com/a/2117523 + * @returns {String} + */ +function uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + router.on("pageInit", function (pagedata) { pagedata.$el.find('script').each(function (el) { diff --git a/www/assets/js/manage.js b/www/assets/js/manage.js index 933ea4a..d87f87d 100644 --- a/www/assets/js/manage.js +++ b/www/assets/js/manage.js @@ -4,31 +4,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -function addPackage(address, latitude, longitude) { - packages.push({ - "address": address, - "coords": [ - latitude, - longitude - ] - }); - localStorage.setItem("packages", JSON.stringify(packages)); - - playSound("ok"); - - app.toast.show({ - text: 'Package Added!
    ' + address + "", - position: "bottom", - destroyOnClose: true, - closeTimeout: 1000 * 3 - }); - - if (map != null) { - reloadMap(); - } -} - $("#addpackagebtn").click(function () { if ($("input[name=number]").val().trim() == "") { playSound("error"); diff --git a/www/assets/js/map.js b/www/assets/js/map.js index 95b5dac..1ac1372 100644 --- a/www/assets/js/map.js +++ b/www/assets/js/map.js @@ -36,11 +36,16 @@ function reloadMap() { /** * Make the toggle button on the popup sheet do things */ -$("#app").on("click", "#package-info-sheet #package-info-toggle-status", function () { - var pid = $(this).data("packageid"); +$("#app").on("click", "#package-info-sheet .package-info-toggle-status", function () { + var pid = $(this).data("id"); markDelivered(pid); map.updatePackageLayer(packages); - openPackageInfoSheet(packages[pid], true); + for (var i = 0; i < packages.length; i++) { + if (packages[i].id == $(this).data("coordid")) { + openPackageInfoSheet(packages[i], true); + return; + } + } }); $("#app").on("click", "#package-info-sheet #package-info-get-directions", function () { @@ -51,18 +56,27 @@ function openPackageInfoSheet(package, refreshOnly) { if (typeof refreshOnly == "undefined") { refreshOnly = false; } - $("#package-info-toggle-status").data("packageid", packages.findIndex(function (p) { - return p == package; - })); - $("#package-info-address").text(package.address); + $("#package-info-get-directions").attr("href", "geo:" + package.coords[0] + "," + package.coords[1]); - if (package.delivered) { - $("#package-info-delivery-status").html(' Delivered'); - $("#package-info-toggle-status").text("Mark undelivered"); - } else { - $("#package-info-delivery-status").html(' Not delivered'); - $("#package-info-toggle-status").text("Mark delivered"); + $("#package-info-sheet-inner").html(""); + + for (var i = 0; i < package.items.length; i++) { + $("#package-info-sheet-inner").append('' + + '
    ' + + '
    ' + + ' ' + + ' ' + + (package.items[i].delivered ? ' Delivered' : ' Not delivered') + + ' ' + + '
    ' + + '

    ' + + ' ' + package.items[i].address + '' + + '

    ' + + '
    ' + + ' ' + (package.items[i].delivered ? "Undeliver" : "Deliver") + + '
    ' + + '
    '); } + if (!refreshOnly) { app.sheet.create({el: "#package-info-sheet"}).open(); } diff --git a/www/assets/js/map_leaflet.js b/www/assets/js/map_leaflet.js index 101c053..fbbc1cc 100644 --- a/www/assets/js/map_leaflet.js +++ b/www/assets/js/map_leaflet.js @@ -55,13 +55,11 @@ function leafletMap() { map.updatePackageLayer = function (data) { map.packagelayer.clearLayers(); - data.forEach(function (package) { - + for (var i = 0; i < data.length; i++) { var iconName = "box"; - - if (package.delivered) { + if (getUndeliveredCount(data[i]) == 0) { iconName = "box-check"; - } else if (package.distance * 1 < localStorage.getItem("alertradius") * 1) { + } else if (data[i].distance * 1 < localStorage.getItem("alertradius") * 1) { iconName = "box-alert"; } @@ -73,18 +71,18 @@ function leafletMap() { var marker = L.marker( [ - package.coords[0], - package.coords[1] + data[i].coords[0], + data[i].coords[1] ], { icon: icon }) .on("click", function () { - openPackageInfoSheet(package); + openPackageInfoSheet(data[i]); }); map.packagelayer.addLayer(marker); - }); + } } map.animateMapIn = function (latitude, longitude, zoom, heading) { diff --git a/www/assets/js/packages.js b/www/assets/js/packages.js index bcbdb46..832ddb2 100644 --- a/www/assets/js/packages.js +++ b/www/assets/js/packages.js @@ -10,18 +10,89 @@ if (localStorage.getItem("packages") != null) { packages = JSON.parse(localStorage.getItem("packages")); } -function markDelivered(id, delivered) { - if (typeof delivered == 'undefined') { - if (typeof packages[id].delivered == "undefined" || packages[id].delivered == false) { - delivered = true; - } else { - delivered = false; +/** + * Count how many items are still undelivered for an address. + * @param {type} address An item in the packages array. + * @returns {Number} + */ +function getUndeliveredCount(address) { + var undelivered = 0; + for (var i = 0; i < address.items.length; j++) { + if (!address.items[i].delivered) { + undelivered++; } } - if (delivered) { - packages[id].deliverytimestamp = Date.now(); + return undelivered; +} + +function addPackage(address, latitude, longitude) { + var added = false; + for (var i = 0; i < packages.length; i++) { + if (packages[i].coords == [latitude, longitude] && packages[i].address == address) { + packages[i].items.push({ + address: address, + delivered: false, + type: "package", + id: uuidv4() + }); + added = true; + break; + } } - packages[id].delivered = delivered; + if (!added) { + packages.push({ + coords: [ + latitude, + longitude + ], + id: uuidv4(), + address: address, + items: [ + { + address: address, + delivered: false, + type: "package", + id: uuidv4() + } + ] + }); + } + localStorage.setItem("packages", JSON.stringify(packages)); + + playSound("ok"); + + app.toast.show({ + text: 'Package Added!
    ' + address + "", + position: "bottom", + destroyOnClose: true, + closeTimeout: 1000 * 3 + }); + + if (map != null) { + reloadMap(); + } +} + +function markDelivered(id, delivered) { + for (var i = 0; i < packages.length; i++) { + for (var j = 0; j < packages[i].items.length; j++) { + if (packages[i].items[j].id == id) { + if (typeof delivered == 'undefined') { + if (typeof packages[id].delivered == "undefined" || packages[id].delivered == false) { + delivered = true; + } else { + delivered = false; + } + } + + packages[i].items[j].delivered = delivered; + if (delivered) { + packages[i].items[j].deliverytimestamp = Date.now(); + } + } + } + } + localStorage.setItem("packages", JSON.stringify(packages)); } @@ -40,16 +111,30 @@ function confirmDeletePackage(id) { } function deletePackage(id) { - packages.splice(id, 1); - localStorage.setItem("packages", JSON.stringify(packages)); - loadPackageList(); + for (var i = 0; i < packages.length; i++) { + for (var j = 0; j < packages[i].items.length; j++) { + if (packages[i].items[j].id == id) { + packages[i].items.splice(j, 1); + + if (packages[i].items.length == 0) { + packages.splice(i, 1); + } + + localStorage.setItem("packages", JSON.stringify(packages)); + loadPackageList(); + return; + } + } + } } function countRemainingPackages() { var undelivered = 0; for (var i = 0; i < packages.length; i++) { - if (packages[i].delivered != true) { - undelivered++; + for (var j = 0; j < packages[i].items.length; j++) { + if (packages[i].items[j].delivered != true) { + undelivered++; + } } } return undelivered; diff --git a/www/pages/map.html b/www/pages/map.html index c1fb70f..b6d5b7d 100644 --- a/www/pages/map.html +++ b/www/pages/map.html @@ -38,7 +38,7 @@
    Done
    -
    +