Improve autocomplete behavior, disable browser autocomplete

master
Skylar Ittner 5 years ago
parent 5a2a3500bf
commit 47bd443689

@ -1,15 +1,20 @@
/* /*
* This Source Code Form is subject to the terms of the Mozilla Public * 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 * 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/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
var autofillDB = {}; var autofillDB = {};
var autofillStreetDB = [];
if (localStorage.getItem("autofill_db") != null) { if (localStorage.getItem("autofill_db") != null) {
autofillDB = JSON.parse(localStorage.getItem("autofill_db")); autofillDB = JSON.parse(localStorage.getItem("autofill_db"));
} }
if (localStorage.getItem("autofill_streetdb") != null) {
autofillStreetDB = JSON.parse(localStorage.getItem("autofill_streetdb"));
}
function addressToNumberAndStreet(address) { function addressToNumberAndStreet(address) {
var number = ""; var number = "";
var street = ""; var street = "";
@ -50,9 +55,39 @@ function addAutofillEntry(address) {
} }
localStorage.setItem("autofill_db", JSON.stringify(autofillDB)); localStorage.setItem("autofill_db", JSON.stringify(autofillDB));
var found = false;
for (var i = 0; i < autofillStreetDB.length; i++) {
if (autofillStreetDB[i][0] == street) {
autofillStreetDB[i][1]++;
found = true;
break;
}
}
if (!found) {
autofillStreetDB.push([street, 1]);
}
localStorage.setItem("autofill_streetdb", JSON.stringify(autofillStreetDB));
}
function searchAutofill(q, number) {
var byNumber = [];
if (typeof number != 'undefined') {
byNumber = searchAutofillByNumber(number);
}
var byStreet = [];
if (q.length > 0) {
byStreet = searchAutofillByStreet(q);
}
return byNumber.concat(byStreet.filter((item) => byNumber.indexOf(item) < 0));
} }
function searchAutofill(number) { function searchAutofillByNumber(number) {
if (typeof autofillDB[number] == 'undefined') { if (typeof autofillDB[number] == 'undefined') {
return []; return [];
} }
@ -67,5 +102,26 @@ function searchAutofill(number) {
streets.push(sorted[i][0]); streets.push(sorted[i][0]);
} }
return streets;
}
function searchAutofillByStreet(q) {
var streets = [];
var sortedDB = autofillStreetDB.sort(function (a, b) {
return b[1] - a[1];
});
console.log(sortedDB);
q = q.toLowerCase();
for (var i = 0; i < sortedDB.length; i++) {
console.log(sortedDB[i][0].toLowerCase().indexOf(q));
if (sortedDB[i][0].toLowerCase().includes(q)) {
streets.push(sortedDB[i][0]);
}
}
return streets; return streets;
} }

@ -77,34 +77,4 @@ $(".view-main").on("click", "#historylist .history-list-item", function () {
// Restore user's last entered city/state combo // Restore user's last entered city/state combo
if (localStorage.getItem("citystate") != null) { if (localStorage.getItem("citystate") != null) {
$("input[name=citystate]").val(localStorage.getItem("citystate")); $("input[name=citystate]").val(localStorage.getItem("citystate"));
} }
var streetAutocomplete = app.autocomplete.create({
inputEl: '#streetInput',
openIn: 'dropdown',
preloader: false, //enable preloader
/* If we set valueProperty to "id" then input value on select will be set according to this property */
valueProperty: 'name', //object's "value" property name
textProperty: 'name', //object's "text" property name
limit: 10, //limit to 10 results
typeahead: true,
dropdownPlaceholderText: '',
source: function (query, render) {
var autocomplete = this;
var streets = searchAutofill($("input[name=number]").val());
if (query.length === 0) {
render(streets);
return;
}
var results = [];
for (var i = 0; i < streets.length; i++) {
if (streets[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) {
results.push(streets[i]);
}
}
render(results);
}
});

@ -41,7 +41,7 @@
<div class="item-inner"> <div class="item-inner">
<div class="item-title item-label">Address Number</div> <div class="item-title item-label">Address Number</div>
<div class="item-input-wrap"> <div class="item-input-wrap">
<input type="number" name="number" placeholder="1234"> <input type="number" name="number" placeholder="1234" autocomplete="off" autocorrect="off" autocapitalize="off">
<span class="input-clear-button"></span> <span class="input-clear-button"></span>
</div> </div>
</div> </div>
@ -50,7 +50,7 @@
<div class="item-inner"> <div class="item-inner">
<div class="item-title item-label">Street</div> <div class="item-title item-label">Street</div>
<div class="item-input-wrap"> <div class="item-input-wrap">
<input type="text" name="street" id="streetInput" placeholder="Road Drive"> <input type="text" name="street" id="streetInput" placeholder="Road Drive" autocomplete="off" autocorrect="off">
<span class="input-clear-button"></span> <span class="input-clear-button"></span>
</div> </div>
</div> </div>
@ -59,7 +59,7 @@
<div class="item-inner"> <div class="item-inner">
<div class="item-title item-label">City, State, ZIP</div> <div class="item-title item-label">City, State, ZIP</div>
<div class="item-input-wrap"> <div class="item-input-wrap">
<input type="text" name="citystate" placeholder="City, ST, 12345" value=""> <input type="text" name="citystate" placeholder="City, ST, 12345" value="" autocomplete="off" autocorrect="off">
</div> </div>
</div> </div>
</li> </li>

@ -28,7 +28,26 @@ var routes = [
{ {
path: '/manage', path: '/manage',
url: './pages/manage.html', url: './pages/manage.html',
name: 'manage' name: 'manage',
on: {
pageAfterIn: function () {
app.autocomplete.create({
inputEl: '#streetInput',
openIn: 'dropdown',
/* If we set valueProperty to "id" then input value on select will be set according to this property */
valueProperty: 'name', //object's "value" property name
textProperty: 'name', //object's "text" property name
limit: 10, //limit to 10 results
typeahead: true,
dropdownPlaceholderText: '',
source: function (query, render) {
var streets = searchAutofill(query, $("input[name=number]").val());
render(streets);
}
});
}
}
}, },
{ {
path: '/list', path: '/list',
@ -64,7 +83,7 @@ var routes = [
} }
} }
}, },
{ {
path: '/credits', path: '/credits',
url: './pages/credits.html', url: './pages/credits.html',
name: 'credits' name: 'credits'

Loading…
Cancel
Save