Combine packages for single lat/lng/address (#3)
This commit is contained in:
parent
385f0ae535
commit
825565a9b1
@ -109,40 +109,43 @@ function loadPackageList(sortType) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < sortedPackages.length; i++) {
|
for (var i = 0; i < sortedPackages.length; i++) {
|
||||||
var icon = "fas fa-box-open";
|
for (var j = 0; j < sortedPackages[i].value.items.length; j++) {
|
||||||
var classes = "";
|
var item = sortedPackages[i].value.items[j];
|
||||||
var delivered = false;
|
var icon = "fas fa-box-open";
|
||||||
if (sortedPackages[i].value.delivered == true) {
|
var classes = "";
|
||||||
delivered = true;
|
var delivered = false;
|
||||||
icon = "fas fa-check";
|
if (item.delivered) {
|
||||||
classes = "text-color-green";
|
delivered = true;
|
||||||
} else if (typeof sortedPackages[i].value.distance != 'undefined' && sortedPackages[i].value.distance * 1 < localStorage.getItem("alertradius") * 1) {
|
icon = "fas fa-check";
|
||||||
classes = "text-color-deeporange";
|
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(
|
||||||
|
'<li class="swipeout package-list-item" data-packageid="' + item.id + '" data-coordid=' + sortedPackages[i].value.id + '>'
|
||||||
|
+ '<div class="item-content swipeout-content ' + classes + '" data-packageid="' + item.id + '" data-latitude="' + sortedPackages[i].value.coords[0] + '" data-longitude="' + sortedPackages[i].value.coords[1] + '">'
|
||||||
|
+ ' <div class="item-media">'
|
||||||
|
+ ' <i class="icon ' + icon + '"></i>'
|
||||||
|
+ ' </div>'
|
||||||
|
+ ' <div class="item-inner">'
|
||||||
|
+ ' <div class="item-title">'
|
||||||
|
+ ' ' + item.address
|
||||||
|
+ ' </div>'
|
||||||
|
+ ' <div class="item-footer">'
|
||||||
|
+ ' <span class="distance">' + (typeof sortedPackages[i].value.distance != 'undefined' ? getDisplayDistance(sortedPackages[i].value.distance) : '...') + '</span>'
|
||||||
|
+ ' </div>'
|
||||||
|
+ ' </div>'
|
||||||
|
+ '</div>'
|
||||||
|
+ '<div class="swipeout-actions-left">'
|
||||||
|
+ ' <a href="#" class="color-green deliver-btn" data-packageid="' + item.id + '">' + (delivered ? "<i class='fas fa-undo'></i> Undeliver" : "<i class='fas fa-check'></i> Deliver") + '</a>'
|
||||||
|
+ ' <a href="geo:' + sortedPackages[i].value.coords[0] + ',' + sortedPackages[i].value.coords[1] + '" class="color-blue directions-btn"><i class="fas fa-route"></i> Directions</a>'
|
||||||
|
+ '</div>'
|
||||||
|
+ '<div class="swipeout-actions-right">'
|
||||||
|
+ ' <a href="#" class="swipeout-delete"><i class="fas fa-trash"></i> Delete</a>'
|
||||||
|
+ '</div>'
|
||||||
|
+ '</li>'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$("#addresslist").append(
|
|
||||||
'<li class="swipeout package-list-item" data-packageid="' + sortedPackages[i].index + '">'
|
|
||||||
+ '<div class="item-content swipeout-content ' + classes + '" data-packageid="' + sortedPackages[i].index + '" data-latitude="' + sortedPackages[i].value.coords[0] + '" data-longitude="' + sortedPackages[i].value.coords[1] + '">'
|
|
||||||
+ ' <div class="item-media">'
|
|
||||||
+ ' <i class="icon ' + icon + '"></i>'
|
|
||||||
+ ' </div>'
|
|
||||||
+ ' <div class="item-inner">'
|
|
||||||
+ ' <div class="item-title">'
|
|
||||||
+ ' ' + sortedPackages[i].value.address
|
|
||||||
+ ' </div>'
|
|
||||||
+ ' <div class="item-footer">'
|
|
||||||
+ ' <span class="distance">' + (typeof sortedPackages[i].value.distance != 'undefined' ? getDisplayDistance(sortedPackages[i].value.distance) : '...') + '</span>'
|
|
||||||
+ ' </div>'
|
|
||||||
+ ' </div>'
|
|
||||||
+ '</div>'
|
|
||||||
+ '<div class="swipeout-actions-left">'
|
|
||||||
+ ' <a href="#" class="color-green deliver-btn" data-packageid="' + sortedPackages[i].index + '">' + (delivered ? "<i class='fas fa-undo'></i> Undeliver" : "<i class='fas fa-check'></i> Deliver") + '</a>'
|
|
||||||
+ ' <a href="geo:' + sortedPackages[i].value.coords[0] + ',' + sortedPackages[i].value.coords[1] + '" class="color-blue directions-btn"><i class="fas fa-route"></i> Directions</a>'
|
|
||||||
+ '</div>'
|
|
||||||
+ '<div class="swipeout-actions-right">'
|
|
||||||
+ ' <a href="#" class="swipeout-delete"><i class="fas fa-trash"></i> Delete</a>'
|
|
||||||
+ '</div>'
|
|
||||||
+ '</li>'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,8 +53,8 @@ if ("geolocation" in navigator) {
|
|||||||
if (packages[i].lastAlert > currentTimestamp - alertinterval) {
|
if (packages[i].lastAlert > currentTimestamp - alertinterval) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packages[i].delivered) {
|
if (getUndeliveredCount(packages[i]) == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,18 @@ function restartApplication() {
|
|||||||
window.location = "index.html";
|
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) {
|
router.on("pageInit", function (pagedata) {
|
||||||
pagedata.$el.find('script').each(function (el) {
|
pagedata.$el.find('script').each(function (el) {
|
||||||
|
@ -4,31 +4,6 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* 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!<br><span style="font-size: 80%;">' + address + "</span>",
|
|
||||||
position: "bottom",
|
|
||||||
destroyOnClose: true,
|
|
||||||
closeTimeout: 1000 * 3
|
|
||||||
});
|
|
||||||
|
|
||||||
if (map != null) {
|
|
||||||
reloadMap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#addpackagebtn").click(function () {
|
$("#addpackagebtn").click(function () {
|
||||||
if ($("input[name=number]").val().trim() == "") {
|
if ($("input[name=number]").val().trim() == "") {
|
||||||
playSound("error");
|
playSound("error");
|
||||||
|
@ -36,11 +36,16 @@ function reloadMap() {
|
|||||||
/**
|
/**
|
||||||
* Make the toggle button on the popup sheet do things
|
* Make the toggle button on the popup sheet do things
|
||||||
*/
|
*/
|
||||||
$("#app").on("click", "#package-info-sheet #package-info-toggle-status", function () {
|
$("#app").on("click", "#package-info-sheet .package-info-toggle-status", function () {
|
||||||
var pid = $(this).data("packageid");
|
var pid = $(this).data("id");
|
||||||
markDelivered(pid);
|
markDelivered(pid);
|
||||||
map.updatePackageLayer(packages);
|
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 () {
|
$("#app").on("click", "#package-info-sheet #package-info-get-directions", function () {
|
||||||
@ -51,18 +56,27 @@ function openPackageInfoSheet(package, refreshOnly) {
|
|||||||
if (typeof refreshOnly == "undefined") {
|
if (typeof refreshOnly == "undefined") {
|
||||||
refreshOnly = false;
|
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]);
|
$("#package-info-get-directions").attr("href", "geo:" + package.coords[0] + "," + package.coords[1]);
|
||||||
if (package.delivered) {
|
$("#package-info-sheet-inner").html("");
|
||||||
$("#package-info-delivery-status").html('<span class="text-color-green"><i class="fas fa-check-circle"></i> Delivered</span>');
|
|
||||||
$("#package-info-toggle-status").text("Mark undelivered");
|
for (var i = 0; i < package.items.length; i++) {
|
||||||
} else {
|
$("#package-info-sheet-inner").append(''
|
||||||
$("#package-info-delivery-status").html('<i class="fas fa-circle"></i> Not delivered');
|
+ '<div class="block margin-top-half">'
|
||||||
$("#package-info-toggle-status").text("Mark delivered");
|
+ ' <div>'
|
||||||
|
+ ' <span class="package-info-delivery-status">'
|
||||||
|
+ ' ' + + (package.items[i].delivered ? '<span class="text-color-green"><i class="fas fa-check-circle"></i> Delivered</span>' : '<i class="fas fa-circle"></i> Not delivered')
|
||||||
|
+ ' </span>'
|
||||||
|
+ ' </div>'
|
||||||
|
+ ' <h3>'
|
||||||
|
+ ' <span class="package-info-address">' + package.items[i].address + '</span>'
|
||||||
|
+ ' </h3>'
|
||||||
|
+ ' <div class="button button-fill margin-top" class="package-info-toggle-status" data-id="' + package.items[i].id + '" data-coordid=' + package.id + '>'
|
||||||
|
+ ' ' + (package.items[i].delivered ? "Undeliver" : "Deliver")
|
||||||
|
+ ' </div>'
|
||||||
|
+ '</div>');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!refreshOnly) {
|
if (!refreshOnly) {
|
||||||
app.sheet.create({el: "#package-info-sheet"}).open();
|
app.sheet.create({el: "#package-info-sheet"}).open();
|
||||||
}
|
}
|
||||||
|
@ -55,13 +55,11 @@ function leafletMap() {
|
|||||||
map.updatePackageLayer = function (data) {
|
map.updatePackageLayer = function (data) {
|
||||||
map.packagelayer.clearLayers();
|
map.packagelayer.clearLayers();
|
||||||
|
|
||||||
data.forEach(function (package) {
|
for (var i = 0; i < data.length; i++) {
|
||||||
|
|
||||||
var iconName = "box";
|
var iconName = "box";
|
||||||
|
if (getUndeliveredCount(data[i]) == 0) {
|
||||||
if (package.delivered) {
|
|
||||||
iconName = "box-check";
|
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";
|
iconName = "box-alert";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,18 +71,18 @@ function leafletMap() {
|
|||||||
|
|
||||||
var marker = L.marker(
|
var marker = L.marker(
|
||||||
[
|
[
|
||||||
package.coords[0],
|
data[i].coords[0],
|
||||||
package.coords[1]
|
data[i].coords[1]
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
icon: icon
|
icon: icon
|
||||||
})
|
})
|
||||||
.on("click", function () {
|
.on("click", function () {
|
||||||
openPackageInfoSheet(package);
|
openPackageInfoSheet(data[i]);
|
||||||
});
|
});
|
||||||
|
|
||||||
map.packagelayer.addLayer(marker);
|
map.packagelayer.addLayer(marker);
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
map.animateMapIn = function (latitude, longitude, zoom, heading) {
|
map.animateMapIn = function (latitude, longitude, zoom, heading) {
|
||||||
|
@ -10,18 +10,89 @@ if (localStorage.getItem("packages") != null) {
|
|||||||
packages = JSON.parse(localStorage.getItem("packages"));
|
packages = JSON.parse(localStorage.getItem("packages"));
|
||||||
}
|
}
|
||||||
|
|
||||||
function markDelivered(id, delivered) {
|
/**
|
||||||
if (typeof delivered == 'undefined') {
|
* Count how many items are still undelivered for an address.
|
||||||
if (typeof packages[id].delivered == "undefined" || packages[id].delivered == false) {
|
* @param {type} address An item in the packages array.
|
||||||
delivered = true;
|
* @returns {Number}
|
||||||
} else {
|
*/
|
||||||
delivered = false;
|
function getUndeliveredCount(address) {
|
||||||
|
var undelivered = 0;
|
||||||
|
for (var i = 0; i < address.items.length; j++) {
|
||||||
|
if (!address.items[i].delivered) {
|
||||||
|
undelivered++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (delivered) {
|
return undelivered;
|
||||||
packages[id].deliverytimestamp = Date.now();
|
}
|
||||||
|
|
||||||
|
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!<br><span style="font-size: 80%;">' + address + "</span>",
|
||||||
|
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));
|
localStorage.setItem("packages", JSON.stringify(packages));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,16 +111,30 @@ function confirmDeletePackage(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function deletePackage(id) {
|
function deletePackage(id) {
|
||||||
packages.splice(id, 1);
|
for (var i = 0; i < packages.length; i++) {
|
||||||
localStorage.setItem("packages", JSON.stringify(packages));
|
for (var j = 0; j < packages[i].items.length; j++) {
|
||||||
loadPackageList();
|
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() {
|
function countRemainingPackages() {
|
||||||
var undelivered = 0;
|
var undelivered = 0;
|
||||||
for (var i = 0; i < packages.length; i++) {
|
for (var i = 0; i < packages.length; i++) {
|
||||||
if (packages[i].delivered != true) {
|
for (var j = 0; j < packages[i].items.length; j++) {
|
||||||
undelivered++;
|
if (packages[i].items[j].delivered != true) {
|
||||||
|
undelivered++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undelivered;
|
return undelivered;
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
<div class="right"><a class="link sheet-close" href="#">Done</a></div>
|
<div class="right"><a class="link sheet-close" href="#">Done</a></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sheet-modal-inner">
|
<div class="sheet-modal-inner" id="package-info-sheet-inner">
|
||||||
<div class="block margin-top-half">
|
<div class="block margin-top-half">
|
||||||
<div>
|
<div>
|
||||||
<span id="package-info-delivery-status"></span>
|
<span id="package-info-delivery-status"></span>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user