More work on netconnectd plugin frontend

* now also correctly displays current state
* detects current wifi network
* spinner while configuring wifi
* quality display only if quality available
This commit is contained in:
Gina Häußge 2014-09-10 10:26:28 +02:00
parent 75017d7ac6
commit 803e17f3a3
6 changed files with 103 additions and 34 deletions

View file

@ -16,8 +16,6 @@ import octoprint.plugin
default_settings = {
"socket": "/var/run/netconnectd.sock"
}
s = octoprint.plugin.plugin_settings("netconnectd", defaults=default_settings)
@ -129,11 +127,7 @@ class NetconnectdSettingsPlugin(octoprint.plugin.SettingsPlugin,
if not flag:
raise RuntimeError("Error while querying status: " + content)
return dict(
ap=content["ap"],
link=content["link"],
wifi_available=content["wifi_available"]
)
return content
def _configure_and_select_wifi(self, ssid, psk, force=False):
payload = dict(

View file

@ -1 +1,25 @@
table th.settings_plugin_netconnectd_wifis_name,table td.settings_plugin_netconnectd_wifis_name{text-overflow:ellipsis;text-align:left}table th.settings_plugin_netconnectd_wifis_quality,table td.settings_plugin_netconnectd_wifis_quality{text-align:right;width:70px}table th.settings_plugin_netconnectd_wifis_action,table td.settings_plugin_netconnectd_wifis_action{text-align:center;width:70px}table th.settings_plugin_netconnectd_wifis_action a,table td.settings_plugin_netconnectd_wifis_action a{text-decoration:none;color:#000}table th.settings_plugin_netconnectd_wifis_action a.disabled,table td.settings_plugin_netconnectd_wifis_action a.disabled{color:#ccc;cursor:default}
table th.settings_plugin_netconnectd_wifis_name,
table td.settings_plugin_netconnectd_wifis_name {
text-overflow: ellipsis;
text-align: left;
}
table th.settings_plugin_netconnectd_wifis_quality,
table td.settings_plugin_netconnectd_wifis_quality {
text-align: right;
width: 70px;
}
table th.settings_plugin_netconnectd_wifis_action,
table td.settings_plugin_netconnectd_wifis_action {
text-align: center;
width: 100px;
}
table th.settings_plugin_netconnectd_wifis_action a,
table td.settings_plugin_netconnectd_wifis_action a {
text-decoration: none;
color: #000;
}
table th.settings_plugin_netconnectd_wifis_action a.disabled,
table td.settings_plugin_netconnectd_wifis_action a.disabled {
color: #ccc;
cursor: default;
}

View file

@ -10,34 +10,52 @@ $(function() {
self.enableQualitySorting = ko.observable(false);
self.statusAp = ko.observable();
self.statusLink = ko.observable();
self.statusWifiAvailable = ko.observable();
self.status = {
link: ko.observable(),
connections: {
ap: ko.observable(),
wifi: ko.observable(),
wired: ko.observable()
},
wifi: {
current_ssid: ko.observable(),
current_address: ko.observable()
}
};
self.statusCurrentWifi = ko.observable();
self.editorWifi = undefined;
self.editorWifiSsid = ko.observable();
self.editorWifiPassphrase1 = ko.observable();
self.editorWifiPassphrase2 = ko.observable();
self.working = ko.observable(false);
self.editorWifiPassphraseMismatch = ko.computed(function() {
return self.editorWifiPassphrase1() != self.editorWifiPassphrase2();
});
self.working = ko.observable(false);
self.error = ko.observable(false);
self.connectionStateText = ko.computed(function() {
if (self.error()) {
return gettext("Error while talking to netconnectd, is the service running?")
} else if (self.statusAp() && !self.statusWifiAvailable()) {
return gettext("Access Point is active, wifi configured but not available");
} else if (self.statusAp() && self.statusWifiAvailable()) {
return gettext("Access Point is active, wifi configured");
} else if (self.statusLink()) {
return gettext("Connected");
return gettext("Error while talking to netconnectd, is the service running?");
} else if (self.status.link()) {
if (self.status.connections.ap()) {
return gettext("Acting as access point");
} else if (self.status.connections.wired()) {
return gettext("Connected via wire");
} else if (self.status.connections.wifi()) {
if (self.status.wifi.current_ssid()) {
return _.sprintf(gettext("Connected via wifi (SSID \"%(ssid)s\")"), {ssid: self.status.wifi.current_ssid()});
} else {
return gettext("Connected via wifi (unknown SSID)")
}
} else {
return gettext("Connected (unknown connection)");
}
} else {
return gettext("Not connected to network");
}
return gettext("Unknown connection state");
});
// initialize list helper
@ -65,7 +83,7 @@ $(function() {
10
);
self.getEntryId = function(ssid) {
self.getEntryId = function(data) {
return "settings_plugin_netconnectd_connectbutton_" + md5(data.ssid);
};
@ -81,9 +99,22 @@ $(function() {
self.error(false);
}
self.statusAp(response.status.ap);
self.statusLink(response.status.link);
self.statusWifiAvailable(response.status.wifi_available);
self.status.link(response.status.link);
self.status.connections.ap(response.status.connections.ap);
self.status.connections.wifi(response.status.connections.wifi);
self.status.connections.wired(response.status.connections.wired);
self.status.wifi.current_ssid(response.status.wifi.current_ssid);
self.status.wifi.current_address(response.status.wifi.current_address);
self.statusCurrentWifi(undefined);
if (response.status.wifi.current_ssid && response.status.wifi.current_address) {
_.each(response.wifis, function(wifi) {
if (wifi.ssid == response.status.wifi.current_ssid && wifi.address.toLowerCase() == response.status.wifi.current_address.toLowerCase()) {
self.statusCurrentWifi(self.getEntryId(wifi));
}
});
}
var enableQualitySorting = false;
_.each(response.wifis, function(wifi) {
@ -93,7 +124,27 @@ $(function() {
});
self.enableQualitySorting(enableQualitySorting);
self.listHelper.updateItems(response.wifis);
var wifis = [];
_.each(response.wifis, function(wifi) {
var qualityInt = parseInt(wifi.quality);
var quality = undefined;
if (!isNaN(qualityInt)) {
if (qualityInt <= 0) {
qualityInt = (-1) * qualityInt;
}
quality = qualityInt;
}
wifis.push({
ssid: wifi.ssid,
address: wifi.address,
encrypted: wifi.encrypted,
quality: quality,
qualityText: (quality != undefined) ? "" + quality + "%" : undefined
});
});
self.listHelper.updateItems(wifis);
if (!enableQualitySorting) {
self.listHelper.changeSorting("ssid");
}

View file

@ -13,7 +13,7 @@ table {
&.settings_plugin_netconnectd_wifis_action {
text-align: center;
width: 70px;
width: 100px;
a {
text-decoration: none;

View file

@ -5,7 +5,7 @@
<div class="pull-right" data-bind="visible: enableQualitySorting">
<small>
{{ _('Sort by') }}: <a href="#" data-bind="click: function() { listHelper.changeSorting('name'); }">{{ _('Name') }} ({{ _('ascending') }})</a> | <a href="#" data-bind="click: function() { listHelper.changeSorting('quality'); }">{{ _('Quality') }} ({{ _('descending') }})</a>
{{ _('Sort by') }}: <a href="#" data-bind="click: function() { listHelper.changeSorting('ssid'); }">{{ _('SSID') }} ({{ _('ascending') }})</a> | <a href="#" data-bind="click: function() { listHelper.changeSorting('quality'); }">{{ _('Quality') }} ({{ _('descending') }})</a>
</small>
</div>
<table class="table table-striped table-hover table-condensed table-hover" id="log_files">
@ -18,10 +18,10 @@
</thead>
<tbody data-bind="foreach: listHelper.paginatedItems">
<tr data-bind="attr: {title: name}">
<td class="settings_plugin_netconnectd_wifis_ssid"><span class="icon-lock" data-bind="invisible: !encrypted"></span> <span data-bind="text: ssid"></span></td>
<td class="settings_plugin_netconnectd_wifis_quality" data-bind="visible: $root.enableQualitySorting, text: quality"></td>
<td class="settings_plugin_netconnectd_wifis_ssid"><span class="icon-lock" data-bind="invisible: !encrypted"></span> <span data-bind="text: ssid"></span> <small class="muted">({{ _('Address') }}: <span data-bind="text: address"></span>)</small></td>
<td class="settings_plugin_netconnectd_wifis_quality" data-bind="visible: $root.enableQualitySorting, text: qualityText"></td>
<td class="settings_plugin_netconnectd_wifis_action">
<button class="btn btn-small" data-bind="click: function() { $parent.configureWifi($data); }, css: {disabled: !$root.loginState.isUser() || $root.working() || $root.error()}"><i class="icon-spinner icon-spin" data-bind="visible: $root.working"></i> {{ _('Connect') }}</button>
<button class="btn btn-small" data-bind="click: function() { $parent.configureWifi($data); }, css: {disabled: !$root.loginState.isUser() || $root.working() || $root.error() || $root.getEntryId($data) == $root.statusCurrentWifi()}"><i class="icon-spinner icon-spin" data-bind="visible: $root.working"></i><i class="icon-signin" data-bind="visible: !$root.working()"></i> {{ _('Connect') }}</button>
</td>
</tr>
</tbody>

View file

@ -11,7 +11,7 @@ function ItemListHelper(listType, supportedSorting, supportedFilters, defaultSor
self.searchFunction = undefined;
self.allItems = [];
0
self.items = ko.observableArray([]);
self.pageSize = ko.observable(filesPerPage);
self.currentPage = ko.observable(0);