Improved login usability

Locations automatically fast forward to login skipping location
  selection if just one location is available
RsLoginPassView nicer look
This commit is contained in:
Gioacchino Mazzurco 2017-04-04 02:15:22 +02:00
parent 8e03fab8da
commit 70e91f7164
4 changed files with 121 additions and 78 deletions

View File

@ -19,5 +19,6 @@
<file>qml/icons/document-share.png</file>
<file>qml/icons/application-menu.png</file>
<file>qml/ContactSort.js</file>
<file>qml/icons/emblem-locked.png</file>
</qresource>
</RCC>

View File

@ -50,8 +50,10 @@ Item
buttonText: "Save"
onSubmit:
{
var jsonData = { pgp_name: login, ssl_name: login, pgp_password: password }
rsApi.request("/control/create_location/", JSON.stringify(jsonData))
var jsonData = { pgp_name: login, ssl_name: login,
pgp_password: password }
rsApi.request("/control/create_location/",
JSON.stringify(jsonData))
locationView.state = "selectLocation"
}
}
@ -72,76 +74,40 @@ Item
rsApi.request( "/control/login/",
JSON.stringify({id: locationView.sslid}) )
locationView.attemptLogin = true
busyIndicator.running = true
attemptTimer.start()
}
}
}
]
function requestLocationsList() { rsApi.request("/control/locations/", "") }
onFocusChanged: focus && requestLocationsList()
LibresapiLocalClient
function requestLocationsListCB(par)
{
id: rsApi
Component.onCompleted:
var jsonData = JSON.parse(par.response).data
if(jsonData.length === 1)
{
openConnection(apiSocketPath)
locationView.requestLocationsList()
// There is only one location so we can jump selecting location
var location = jsonData[0]
loginView.login = location.name
locationView.sslid = location.peer_id
locationView.state = "login"
}
onGoodResponseReceived:
else
{
var jsonData = JSON.parse(msg)
if(jsonData)
{
if(jsonData.data)
{
if(jsonData.data[0] && jsonData.data[0].pgp_id)
{
// if location list update
locationsModel.json = msg
busyIndicator.running = false
}
if (jsonData.data.key_name)
{
if(jsonData.data.want_password)
{
// if Server requested password
var jsonPass = { password: locationView.password }
rsApi.request( "/control/password/",
JSON.stringify(jsonPass) )
locationView.attemptLogin = false
console.debug("RS core asked for password")
}
else
{
// if Already logged in
bottomButton.enabled = false
bottomButton.text = "Already logged in"
locationView.attemptLogin = false
busyIndicator.running = false
locationView.state = "selectLocation"
locationsListView.enabled = false
console.debug("Already logged in")
}
}
}
}
// There is more then one location to choose from
locationsModel.json = par.response
}
}
function requestLocationsList()
{ rsApi.request("/control/locations/", "", requestLocationsListCB) }
BusyIndicator { id: busyIndicator; anchors.centerIn: parent }
onFocusChanged: focus && requestLocationsList()
Component.onCompleted: requestLocationsList()
JSONListModel
{
id: locationsModel
query: "$.data[*]"
}
ListView
{
id: locationsListView
@ -151,22 +117,23 @@ Item
model: locationsModel.model
delegate: Button
{
text: model.name
text: model.name
onClicked:
{
loginView.login = text
locationView.sslid = model.id
locationView.state = "login"
}
}
visible: false
}
visible: false
}
Button
{
Button
{
id: bottomButton
text: "Create new location"
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
onClicked: locationView.state = "createLocation"
}
@ -177,19 +144,60 @@ Item
anchors.fill: parent
}
BusyIndicator
{
id: busyIndicator
anchors.centerIn: parent
running: false
Connections
{
target: locationView
onAttemptLoginChanged:
if(locationView.attemptLogin) busyIndicator.running = true
}
}
LibresapiLocalClient
{
id: loginApi
Component.onCompleted: openConnection(apiSocketPath)
onGoodResponseReceived:
{
var jsonData = JSON.parse(msg)
if(jsonData && jsonData.data && jsonData.data.key_name)
{
if(jsonData.data.want_password)
{
// if Server requested password
var jsonPass = { password: locationView.password }
request( "/control/password/", JSON.stringify(jsonPass) )
locationView.attemptLogin = false
console.debug("RS core asked for password")
}
else
{
// if Already logged in
bottomButton.enabled = false
bottomButton.text = "Unlocking location..."
locationView.attemptLogin = false
locationView.state = "selectLocation"
locationsListView.enabled = false
console.debug("Already logged in")
}
}
}
}
Timer
{
id: attemptTimer
interval: 500
interval: 1000
repeat: true
triggeredOnStart: true
onTriggered:
{
if(locationView.focus)
locationView.requestLocationsList()
if (locationView.attemptLogin)
rsApi.request("/control/password/", "")
loginApi.request("/control/password/", "")
}
}
}

View File

@ -19,13 +19,12 @@
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.0
import QtQml 2.2
import org.retroshare.qml_components.LibresapiLocalClient 1.0
//import QtQml 2.2
Item
{
id: loginView
property string buttonText: "Login"
property string buttonText: "Unlock"
property string login
property string password
signal submit(string login, string password)
@ -34,19 +33,54 @@ Item
{
id: inputView
width: parent.width
anchors.top: parent.top
anchors.bottom: bottomButton.top
anchors.centerIn: parent
Row { Text {text: "Name:" } TextField { id: nameField; text: loginView.login } }
Row { Text {text: "Password:" } TextField { id: passwordField; text: loginView.password } }
}
Image
{
source: "qrc:/qml/icons/emblem-locked.png"
Layout.alignment: Qt.AlignHCenter
}
Button
{
id: bottomButton
text: loginView.buttonText
anchors.bottom: parent.bottom
anchors.right: parent.right
onClicked: loginView.submit(nameField.text, passwordField.text)
Text
{
text: "Login"
visible: loginView.login.length === 0
Layout.alignment: Qt.AlignHCenter
anchors.bottom: nameField.top
anchors.bottomMargin: 5
}
TextField
{
id: nameField;
text: loginView.login
visible: loginView.login.length === 0
Layout.alignment: Qt.AlignHCenter
}
Text
{
id: passLabel
text: nameField.visible ?
"Passphrase" : "Enter passphrase for " + loginView.login
Layout.alignment: Qt.AlignHCenter
anchors.bottom: passwordField.top
anchors.bottomMargin: 5
}
TextField
{
id: passwordField
text: loginView.password
width: passLabel.width
echoMode: TextInput.Password
Layout.alignment: Qt.AlignHCenter
}
Button
{
id: bottomButton
text: loginView.buttonText
onClicked: loginView.submit(nameField.text, passwordField.text)
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB