Add list sharing feature (no sync, simply transfer+merge).
This commit is contained in:
parent
c4900d2505
commit
9f5caa2593
@ -153,6 +153,49 @@ function addPackage(address, latitude, longitude, type, callback, deadline) {
|
||||
addAutofillEntry(address);
|
||||
}
|
||||
|
||||
/**
|
||||
* Import a second package list and merge it with the existing one.
|
||||
* @param {type} newlist
|
||||
* @return {number} The number of packages that were skipped because they already exist locally.
|
||||
*/
|
||||
function importPackageList(newlist) {
|
||||
skipped = 0;
|
||||
for (latlng in newlist) {
|
||||
var latitude = newlist[latlng].coords[0];
|
||||
var longitude = newlist[latlng].coords[1];
|
||||
var address = newlist[latlng].address;
|
||||
|
||||
for (pkg in newlist[latlng].items) {
|
||||
var added = false;
|
||||
for (var i = 0; i < packages.length; i++) {
|
||||
if (packages[i].coords[0] == latitude && packages[i].coords[1] == longitude && packages[i].address == address) {
|
||||
var newpackage = newlist[latlng].items[pkg];
|
||||
for (var j in packages[i].items) {
|
||||
if (packages[i].items[j].id == newpackage.id) {
|
||||
// This package already exists in the local database.
|
||||
added = true;
|
||||
skipped++;
|
||||
}
|
||||
}
|
||||
if (!added) {
|
||||
packages[i].items.push(package);
|
||||
added = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!added) {
|
||||
packages.push(newlist[latlng]);
|
||||
}
|
||||
}
|
||||
}
|
||||
localStorage.setItem("packages", JSON.stringify(packages));
|
||||
if (map != null) {
|
||||
reloadMap();
|
||||
}
|
||||
return skipped;
|
||||
}
|
||||
|
||||
function markDelivered(id, delivered) {
|
||||
for (var i = 0; i < packages.length; i++) {
|
||||
for (var j = 0; j < packages[i].items.length; j++) {
|
||||
|
101
www/assets/js/toolbox_sharelist.js
Normal file
101
www/assets/js/toolbox_sharelist.js
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
|
||||
function uploadList() {
|
||||
if (packages.length == 0) {
|
||||
app.dialog.alert("Your list doesn't have anything to send.", "Empty List");
|
||||
return;
|
||||
}
|
||||
app.dialog.preloader("Uploading...");
|
||||
var uploadlistdialogopen = true;
|
||||
$.ajax({
|
||||
url: SETTINGS.sharelistapi,
|
||||
dataType: 'json',
|
||||
method: 'post',
|
||||
data: {
|
||||
packages: JSON.stringify(packages)
|
||||
},
|
||||
timeout: 15 * 1000,
|
||||
success: function (resp) {
|
||||
if (uploadlistdialogopen) {
|
||||
app.dialog.close();
|
||||
uploadlistdialogopen = false;
|
||||
}
|
||||
if (resp.status == "OK") {
|
||||
JsBarcode("#listidbarcode", resp.uuid, {
|
||||
format: "code128",
|
||||
ean128: false,
|
||||
width: 2,
|
||||
height: 40
|
||||
});
|
||||
$("#listidbarcodeli").css("display", "");
|
||||
} else {
|
||||
app.dialog.alert(resp.message, "Error");
|
||||
}
|
||||
},
|
||||
error: function (jqXHR, status, errorThrown) {
|
||||
if (uploadlistdialogopen) {
|
||||
app.dialog.close();
|
||||
uploadlistdialogopen = false;
|
||||
}
|
||||
app.dialog.alert("There was a network or server issue while uploading the list. Please try again.", "Error");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function downloadItemList(code) {
|
||||
if (typeof code == "undefined") {
|
||||
code = $("#getlistidbox").val();
|
||||
}
|
||||
if (code.match(/^[a-f0-9]{10}$/i)) {
|
||||
app.dialog.preloader("Downloading...");
|
||||
var downloadlistdialogopen = true;
|
||||
$.ajax({
|
||||
url: SETTINGS.sharelistapi,
|
||||
dataType: 'json',
|
||||
method: 'get',
|
||||
data: {
|
||||
uuid: code
|
||||
},
|
||||
timeout: 15 * 1000,
|
||||
success: function (resp) {
|
||||
if (downloadlistdialogopen) {
|
||||
app.dialog.close();
|
||||
downloadlistdialogopen = false;
|
||||
}
|
||||
if (resp.status == "OK") {
|
||||
var skipped = importPackageList(resp.packages);
|
||||
if (skipped > 0) {
|
||||
app.dialog.alert("List imported and merged with the existing one. " + skipped + " items already existed locally and were skipped. Verify their delivery status manually.", "Import Complete");
|
||||
} else {
|
||||
app.dialog.alert("List imported and merged with the existing one.", "Import Complete");
|
||||
}
|
||||
} else {
|
||||
app.dialog.alert(resp.message, "Error");
|
||||
}
|
||||
},
|
||||
error: function (jqXHR, status, errorThrown) {
|
||||
if (downloadlistdialogopen) {
|
||||
app.dialog.close();
|
||||
downloadlistdialogopen = false;
|
||||
}
|
||||
app.dialog.alert("There was a network or server issue while downloading the list. Please try again.", "Error");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
app.dialog.alert("That's not a valid list ID.", "Error");
|
||||
}
|
||||
}
|
||||
|
||||
function scanListIDBarcode() {
|
||||
scanBarcode(function (code) {
|
||||
playSound("scan");
|
||||
downloadItemList(code);
|
||||
}, function (error) {
|
||||
app.dialog.alert(error, "Error");
|
||||
});
|
||||
}
|
@ -43,6 +43,14 @@
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/toolbox/sharelist" class="item-link item-content">
|
||||
<div class="item-media"><i class="icon fas fa-share-alt"></i></div>
|
||||
<div class="item-inner">
|
||||
<div class="item-title">Share Item List</div>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
68
www/pages/toolbox/sharelist.html
Normal file
68
www/pages/toolbox/sharelist.html
Normal file
@ -0,0 +1,68 @@
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<div class="page" data-name="sharelist">
|
||||
|
||||
<div class="navbar">
|
||||
<div class="navbar-bg"></div>
|
||||
<div class="navbar-inner">
|
||||
<div class="left">
|
||||
<a href="#" class="link icon-only back">
|
||||
<i class="icon icon-back"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="title">Share Item List</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="page-content">
|
||||
<div class="list media-list no-hairlines tablet-inset no-margin-top">
|
||||
<ul>
|
||||
<li class="item-divider">Send List</li>
|
||||
<li>
|
||||
<div class="item-content">
|
||||
<a class="button button-fill" id="sendlistbtn" onclick="uploadList();"><i class="fas fa-upload"></i> Upload List</a>
|
||||
</div>
|
||||
</li>
|
||||
<li style="display: none;" id="listidbarcodeli">
|
||||
<div class="item-content" style="background-color: white; display: flex; justify-content: center; padding-left: 1rem; padding-right: 1rem;">
|
||||
<svg class="barcode" id="listidbarcode"></svg>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
|
||||
<li class="item-divider">Receive List</li>
|
||||
<li>
|
||||
<div class="item-content">
|
||||
<div class="item-inner">
|
||||
<div class="item-title item-label">List ID</div>
|
||||
<div class="item-input-wrap">
|
||||
<input type="text" id="getlistidbox" placeholder="" autocomplete="off" autocorrect="off" autocapitalize="off" />
|
||||
<span class="input-clear-button"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="item-content">
|
||||
<a class="button button-fill" onclick="downloadItemList();"><i class="fas fa-download"></i> Download List</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="item-content">
|
||||
<a class="button button-fill" id="scanlistbarcodebtn" onclick="scanListIDBarcode();"><i class="fas fa-barcode"></i> Scan List Barcode</a>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="block text-align-center">
|
||||
<i class="material-icons">info</i>
|
||||
<br />
|
||||
Share your delivery list to another device. The sender uploads the list,
|
||||
and the receiver(s) either scan the barcode on the sender's device, or
|
||||
type in the code beneath the barcode.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/toolbox_sharelist.js"></script>
|
||||
</div>
|
@ -161,6 +161,11 @@ var routes = [
|
||||
loadWeather();
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
path: '/sharelist',
|
||||
url: './pages/toolbox/sharelist.html',
|
||||
name: 'sharelist'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -300,5 +300,6 @@ var SETTINGS = {
|
||||
geocodeapi: "https://apis.netsyms.net/packagehelper/geocode.php",
|
||||
trackingapi: "https://apis.netsyms.net/packagehelper/track.php",
|
||||
weatherapi: "https://apis.netsyms.net/packagehelper/weather.php",
|
||||
geoipapi: "https://apis.netsyms.net/packagehelper/geoip.php"
|
||||
geoipapi: "https://apis.netsyms.net/packagehelper/geoip.php",
|
||||
sharelistapi: "https://apis.netsyms.net/packagehelper/sharepackagelist.php"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user