Updating UI to also fit on mobile devices. Fix #34

This commit is contained in:
Gautier Pelloux-Prayer 2016-11-26 20:54:59 +01:00
parent 1e26cb1027
commit d7e476db82
44 changed files with 555 additions and 1305 deletions

View file

@ -1,6 +1,6 @@
BR.Control = L.Control.extend({
options: {
position: 'leftpane'
position: 'bottomleft'
},
onAdd: function (map) {

View file

@ -1,22 +1,16 @@
BR.Download = BR.Control.extend({
options: {
heading: 'Download'
},
onAdd: function (map) {
var container = BR.Control.prototype.onAdd.call(this, map);
return container;
},
BR.Download = L.Class.extend({
update: function (urls) {
var html = '<div class="value">';
if (urls.gpx) {
html += '<a href="' + urls.gpx + '" download="brouter.gpx">GPX</a> &middot; ';
html += '<a href="' + urls.kml + '" download="brouter.kml">KML</a> &middot; ';
html += '<a href="' + urls.geojson + '" download="brouter.geojson">GeoJSON</a> &middot; ';
html += '<a href="' + urls.csv + '" download="brouter.tsv">data CSV</a>';
if (urls) {
['gpx', 'kml', 'geojson', 'csv'].forEach(function(e, i, a) {
var a = L.DomUtil.get('dl-'+e);
a.setAttribute('href', urls[e]);
a.setAttribute('download', 'brouter.'+e);
a.removeAttribute('disabled');
})
}
html += '</div>';
this._content.innerHTML = html;
}
});
BR.download = function() {
return new BR.Download();
};

View file

@ -1,15 +1,10 @@
BR.Profile = L.Class.extend({
options: {
heading: 'Profile'
},
cache: {},
initialize: function () {
L.DomUtil.get('upload').onclick = L.bind(this._upload, this);
L.DomUtil.get('clear').onclick = L.bind(this.clear, this);
this.ele = document.profile_upload.profile;
this.ele = L.DomUtil.get('profile_upload');
this.message = new BR.Message('profile_message', {
alert: true
});
@ -65,8 +60,8 @@ BR.Profile = L.Class.extend({
$(button).button('uploading');
evt.preventDefault();
this.fire('update', {
profileText: profile,
this.fire('update', {
profileText: profile,
callback: function () {
$(button).button('reset');
$(button).blur();

View file

@ -1,51 +1,62 @@
BR.RoutingOptions = BR.Control.extend({
options: {
heading: 'Options',
divId: 'route_options'
},
onAdd: function (map) {
var select = L.DomUtil.get('profile'),
i,
option;
select.onchange = this._getChangeHandler();
L.DomUtil.get('alternative').onchange = this._getChangeHandler();
$('#profile-alternative').on('changed.bs.select', this._getChangeHandler());
// build option list from config
var profiles = BR.conf.profiles;
for (i = 0; i < profiles.length; i++) {
option = document.createElement("option");
var profiles_list = L.DomUtil.get('profile');
for (var i = 0; i < profiles.length; i++) {
var option = document.createElement("option");
option.value = profiles[i];
option.text = profiles[i];
select.add(option, null);
profiles_list.appendChild(option);
}
// <custom> option disabled, select next
select.options[1].selected = true;
// <custom> profile is empty at start, select next one
profiles_list.children[1].selected = true;
return BR.Control.prototype.onAdd.call(this, map);
},
getOptions: function() {
var profile = $('#profile option:selected'),
alternative = $('#alternative option:selected');
$('#stat-profile').html(profile.text() + ' (' + alternative.text() +')');
// we do not allow to select more than one profile and/or alternative at a time
// so we disable the current selected items
$('#profile-alternative').find('option:disabled').each(function(index) {
$(this).prop('disabled', false);
});
$('#profile-alternative').find('option:selected').each(function(index) {
$(this).prop('disabled', true);
});
// disable custom option if it has no value yet (default value is "Custom")
var custom = L.DomUtil.get('profile').children[0];
if (custom.value === "Custom") {
custom.disabled = true;
}
$('.selectpicker').selectpicker('refresh')
return {
profile: L.DomUtil.get('profile').value,
alternative: L.DomUtil.get('alternative').value
profile: profile.val(),
alternative: alternative.val()
};
},
setOptions: function(options) {
var select,
var profiles_grp,
profile = options.profile;
if (profile) {
select = L.DomUtil.get('profile');
select.value = profile;
profiles_grp = L.DomUtil.get('profile');
profiles_grp.value = profile;
// profile got not selected = not in option values -> custom profile passed with permalink
if (select.value != profile) {
if (profiles_grp.value != profile) {
this.setCustomProfile(profile, true);
}
}
if (options.alternative) {
L.DomUtil.get('alternative').value = options.alternative;
@ -53,13 +64,18 @@ BR.RoutingOptions = BR.Control.extend({
},
setCustomProfile: function(profile, noUpdate) {
var select,
var profiles_grp,
option;
select = L.DomUtil.get('profile');
option = select.options[0]
profiles_grp = L.DomUtil.get('profile');
option = profiles_grp.children[0]
option.value = profile;
option.disabled = !profile;
$('#profile').find('option:selected').each(function(index) {
$(this).prop('selected', false);
});
option.selected = !!profile;
if (!noUpdate) {
@ -68,8 +84,8 @@ BR.RoutingOptions = BR.Control.extend({
},
getCustomProfile: function() {
var select = L.DomUtil.get('profile'),
option = select.options[0],
var profiles_grp = L.DomUtil.get('profile'),
option = profiles_grp.children[0],
profile = null;
if (!option.disabled) {

View file

@ -1,6 +1,6 @@
BR.Tabs = BR.Control.extend({
options: {
divId: 'tabs_div',
divId: 'sidebar',
// tab a.hash > instance
tabs: {}
},

View file

@ -1,7 +1,7 @@
BR.TrackMessages = L.Class.extend({
options: {
heading: 'Data',
heading: 'Segment data',
edgeStyle: {
color: 'yellow',
opacity: 0.8,
@ -60,7 +60,6 @@ BR.TrackMessages = L.Class.extend({
headings = messages[0];
columns = this._getColumns(headings, data);
console.time('datatable');
this._table = $('#datatable').DataTable({
destroy: true,
data: data,
@ -68,9 +67,6 @@ BR.TrackMessages = L.Class.extend({
paging: false,
searching: false,
info: false,
// flexbox workaround: without scrollY height Firefox extends to content height
// (^= minimum height with flexbox?)
scrollY: 50,
scrollX: true,
scrollCollapse: true,
order: []
@ -79,8 +75,6 @@ BR.TrackMessages = L.Class.extend({
// highlight track segment (graph edge) on row hover
this._setEdges(polyline, segments);
$('#datatable tbody tr').hover(L.bind(this._handleHover, this), L.bind(this._handleHoverOut, this));
console.timeEnd('datatable');
},
show: function() {
@ -129,7 +123,7 @@ BR.TrackMessages = L.Class.extend({
_getEmptyColumns: function(data) {
var empty = new Array(data[0].length),
i;
for (i = 0; i < empty.length; i++) {
empty[i] = true;
}
@ -146,7 +140,7 @@ BR.TrackMessages = L.Class.extend({
_getMessageLatLng: function(message) {
var lon = message[0] / 1000000,
lat = message[1] / 1000000;
return L.latLng(lat, lon);
},

View file

@ -1,30 +1,13 @@
BR.TrackStats = BR.Control.extend({
options: {
heading: 'Route'
},
onAdd: function (map) {
var container = BR.Control.prototype.onAdd.call(this, map);
this.update();
return container;
},
BR.TrackStats = L.Class.extend({
update: function (polyline, segments) {
var stats = this.calcStats(polyline, segments),
length1 = L.Util.formatNum(stats.trackLength/1000,1),
length3 = L.Util.formatNum(stats.trackLength/1000,3),
meanCostFactor = stats.trackLength ? L.Util.formatNum(stats.cost / stats.trackLength, 2) : '',
html = '';
meanCostFactor = stats.trackLength ? L.Util.formatNum(stats.cost / stats.trackLength, 2) : ''
html += '<table id="stats">';
html += '<tr><td>Length: </td><td title="' + length3 + ' km">' + length1 + '</td><td>km</td></tr>';
html += '<tr><td>Ascent filtered:</td><td>' + stats.filteredAscend + '</td><td>m</td></tr>';
html += '<tr><td>Ascent plain:</td><td>' + stats.plainAscend + '</td><td>m</td></tr>';
html += '<tr><td>Cost: </td><td>' + stats.cost + '</td><td></td></tr>';
html += '<tr><td>Mean cost:</td><td>' + meanCostFactor + '</td><td></td></tr>';
html += '</table>';
this._content.innerHTML = html;
$('#distance').html(length1 + ' <abbr title="kilometer">km</abbr>');
$('#ascend').html(stats.filteredAscend + ' (' + stats.plainAscend +')' + ' <abbr title="meter">m</abbr>');
$('#cost').html(stats.cost + ' (' + meanCostFactor + ')');
},
calcStats: function(polyline, segments) {