Worked on login handling. Still in early development.
This commit is contained in:
parent
6262b35302
commit
0deafe6b08
7 changed files with 144 additions and 53 deletions
|
@ -28,7 +28,8 @@ DISTFILES += qml/harbour-nextcloudnotes.qml \
|
||||||
qml/pages/NotePage.qml \
|
qml/pages/NotePage.qml \
|
||||||
qml/pages/NotesPage.qml \
|
qml/pages/NotesPage.qml \
|
||||||
qml/pages/LoginDialog.qml \
|
qml/pages/LoginDialog.qml \
|
||||||
qml/pages/EditPage.qml
|
qml/pages/EditPage.qml \
|
||||||
|
qml/pages/SettingsPage.qml
|
||||||
|
|
||||||
SAILFISHAPP_ICONS = 86x86 108x108 128x128 172x172
|
SAILFISHAPP_ICONS = 86x86 108x108 128x128 172x172
|
||||||
|
|
||||||
|
|
|
@ -10,24 +10,23 @@ ApplicationWindow
|
||||||
ConfigurationGroup {
|
ConfigurationGroup {
|
||||||
id: appSettings
|
id: appSettings
|
||||||
path: "/apps/harbour-nextcloudnotes/settings"
|
path: "/apps/harbour-nextcloudnotes/settings"
|
||||||
property string lastUpdate: qsTr("never")
|
property var accounts: value("accounts", [])
|
||||||
property url server: ""
|
property int currentAccount: 0
|
||||||
property string username: ""
|
|
||||||
property string password: ""
|
|
||||||
property bool unsecureConnection: false
|
|
||||||
// For testing
|
// For testing
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
//server = ""
|
//appSettings.clear()
|
||||||
//username = ""
|
for(var i=0; i<accounts.length; i++) {
|
||||||
//password = ""
|
console.log("Server: " + accounts[i].server)
|
||||||
console.log("Server: " + server)
|
console.log("Username: " + accounts[i].username)
|
||||||
console.log("Username: " + username)
|
console.log("Password: " + accounts[i].password)
|
||||||
console.log("Password: " + password)
|
}
|
||||||
|
//notes.account = appSettings.accounts[appSettings.currentAccount]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property var notes: NotesApi {
|
property var notes: NotesApi {
|
||||||
name: "notes"
|
name: "notes"
|
||||||
|
account: appSettings.accounts[appSettings.currentAccount]
|
||||||
saveFile: false
|
saveFile: false
|
||||||
}
|
}
|
||||||
Connections {
|
Connections {
|
||||||
|
|
|
@ -4,15 +4,16 @@ import Sailfish.Silica 1.0
|
||||||
Dialog {
|
Dialog {
|
||||||
id: loginDialog
|
id: loginDialog
|
||||||
|
|
||||||
property url server
|
property var account
|
||||||
property string username
|
|
||||||
property string password
|
|
||||||
|
|
||||||
canAccept: (serverField.acceptableInput && usernameField.text.length > 0 && passwordField.text.length > 0)
|
canAccept: (serverField.acceptableInput && usernameField.text.length > 0 && passwordField.text.length > 0)
|
||||||
onAccepted: {
|
onAccepted: {
|
||||||
server = serverField.text
|
account = {
|
||||||
username = usernameField.text
|
server: serverField.text,
|
||||||
password = passwordField.text
|
username: usernameField.text,
|
||||||
|
password: passwordField.text,
|
||||||
|
lastUpdate: new Date(0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
|
@ -35,7 +36,7 @@ Dialog {
|
||||||
id: serverField
|
id: serverField
|
||||||
focus: true
|
focus: true
|
||||||
width: parent.width
|
width: parent.width
|
||||||
text: (server.toString().length > 0) ? server : "https://"
|
text: (typeof(account) !== 'undefined' && account.server.toString().length > 0) ? account.server : "https://"
|
||||||
placeholderText: qsTr("Nextcloud server")
|
placeholderText: qsTr("Nextcloud server")
|
||||||
label: placeholderText + " " + qsTr("(starting with \"https://\")")
|
label: placeholderText + " " + qsTr("(starting with \"https://\")")
|
||||||
inputMethodHints: Qt.ImhUrlCharactersOnly
|
inputMethodHints: Qt.ImhUrlCharactersOnly
|
||||||
|
@ -49,7 +50,7 @@ Dialog {
|
||||||
TextField {
|
TextField {
|
||||||
id: usernameField
|
id: usernameField
|
||||||
width: parent.width
|
width: parent.width
|
||||||
text: (username.length > 0) ? username : ""
|
text: (typeof(account) !== 'undefined' && account.username.length > 0) ? account.username : ""
|
||||||
placeholderText: qsTr("Username")
|
placeholderText: qsTr("Username")
|
||||||
label: placeholderText
|
label: placeholderText
|
||||||
inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase
|
inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase
|
||||||
|
@ -62,7 +63,7 @@ Dialog {
|
||||||
PasswordField {
|
PasswordField {
|
||||||
id: passwordField
|
id: passwordField
|
||||||
width: parent.width
|
width: parent.width
|
||||||
text: (password.length > 0) ? password : ""
|
text: (typeof(account) !== 'undefined' && account.password.length > 0) ? account.password : ""
|
||||||
label: placeholderText
|
label: placeholderText
|
||||||
errorHighlight: text.length === 0 && focus === true
|
errorHighlight: text.length === 0 && focus === true
|
||||||
EnterKey.enabled: text.length > 0
|
EnterKey.enabled: text.length > 0
|
||||||
|
|
|
@ -3,6 +3,7 @@ import Sailfish.Silica 1.0
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
property string name
|
property string name
|
||||||
|
property var account
|
||||||
property var model: ListModel { }
|
property var model: ListModel { }
|
||||||
|
|
||||||
property string json
|
property string json
|
||||||
|
@ -14,7 +15,7 @@ Item {
|
||||||
function callApi(method, data) {
|
function callApi(method, data) {
|
||||||
busy = true
|
busy = true
|
||||||
|
|
||||||
var endpoint = appSettings.server + "/index.php/apps/notes/api/v0.2/notes"
|
var endpoint = account.server + "/index.php/apps/notes/api/v0.2/notes"
|
||||||
if (data && (method === "GET" || method === "PUT" || method === "DELETE"))
|
if (data && (method === "GET" || method === "PUT" || method === "DELETE"))
|
||||||
if (data.id)
|
if (data.id)
|
||||||
endpoint = endpoint + "/" + data.id
|
endpoint = endpoint + "/" + data.id
|
||||||
|
@ -24,7 +25,7 @@ Item {
|
||||||
apiReq.setRequestHeader('User-Agent', 'SailfishOS/harbour-nextcloudnotes')
|
apiReq.setRequestHeader('User-Agent', 'SailfishOS/harbour-nextcloudnotes')
|
||||||
apiReq.setRequestHeader('OCS-APIRequest', 'true')
|
apiReq.setRequestHeader('OCS-APIRequest', 'true')
|
||||||
apiReq.setRequestHeader("Content-Type", "application/json")
|
apiReq.setRequestHeader("Content-Type", "application/json")
|
||||||
apiReq.setRequestHeader("Authorization", "Basic " + Qt.btoa(appSettings.username + ":" + appSettings.password))
|
apiReq.setRequestHeader("Authorization", "Basic " + Qt.btoa(account.username + ":" + account.password))
|
||||||
apiReq.onreadystatechange = function() {
|
apiReq.onreadystatechange = function() {
|
||||||
if (apiReq.readyState === XMLHttpRequest.DONE) {
|
if (apiReq.readyState === XMLHttpRequest.DONE) {
|
||||||
if (apiReq.status === 200) {
|
if (apiReq.status === 200) {
|
||||||
|
|
|
@ -11,30 +11,25 @@ Page {
|
||||||
|
|
||||||
PullDownMenu {
|
PullDownMenu {
|
||||||
busy: notes.busy
|
busy: notes.busy
|
||||||
|
|
||||||
|
MenuLabel {
|
||||||
|
visible: typeof(appSettings.accounts[appSettings.currentAccount]) !== 'undefined'
|
||||||
|
text: visible ? qsTr("Last update") + ": " + new Date(appSettings.accounts[appSettings.currentAccount].lastUpdate).toLocaleString(Qt.locale(), Locale.ShortFormat) : ""
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
text: qsTr("Reload")
|
||||||
|
visible: typeof(appSettings.accounts[appSettings.currentAccount]) !== 'undefined'
|
||||||
|
onClicked: notes.getNotes()
|
||||||
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: qsTr("Settings")
|
text: qsTr("Settings")
|
||||||
onClicked: {
|
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
||||||
var login = pageStack.push(Qt.resolvedUrl("LoginDialog.qml"), { server: appSettings.server, username: appSettings.username, password: appSettings.password } )
|
|
||||||
login.accepted.connect(function() {
|
|
||||||
console.log(login.username + ":" + login.password + "@" + login.server)
|
|
||||||
appSettings.server = login.server
|
|
||||||
appSettings.username = login.username
|
|
||||||
appSettings.password = login.password
|
|
||||||
notes.getNotes()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: qsTr("Add note")
|
text: qsTr("Add note")
|
||||||
|
enabled: typeof(appSettings.accounts[appSettings.currentAccount]) !== 'undefined'
|
||||||
onClicked: console.log("Add note")
|
onClicked: console.log("Add note")
|
||||||
}
|
}
|
||||||
MenuItem {
|
|
||||||
text: qsTr("Update")
|
|
||||||
onClicked: notes.getNotes()
|
|
||||||
}
|
|
||||||
MenuLabel {
|
|
||||||
text: qsTr("Last update") + ": " + new Date(appSettings.lastUpdate).toLocaleString(Qt.locale(), Locale.ShortFormat)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
header: SearchField {
|
header: SearchField {
|
||||||
|
@ -49,8 +44,9 @@ Page {
|
||||||
|
|
||||||
currentIndex: -1
|
currentIndex: -1
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
if (appSettings.server.toString().length > 0 && appSettings.username.length > 0 && appSettings.password.length > 0)
|
if (appSettings.accounts.length > 0) {
|
||||||
notes.getNotes()
|
notes.getNotes()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Component.onCompleted: notes.getNotes()
|
//Component.onCompleted: notes.getNotes()
|
||||||
|
@ -141,19 +137,33 @@ Page {
|
||||||
running: visible
|
running: visible
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ViewPlaceholder {
|
||||||
|
id: noLoginPlaceholder
|
||||||
|
enabled: (appSettings.accounts.length === 0)
|
||||||
|
text: qsTr("No accounts yet")
|
||||||
|
}
|
||||||
|
|
||||||
ViewPlaceholder {
|
ViewPlaceholder {
|
||||||
enabled: notesList.count === 0 && !notes.busy && !noLoginPlaceholder.enabled
|
enabled: notesList.count === 0 && !notes.busy && !noLoginPlaceholder.enabled
|
||||||
text: qsTr("No notes yet")
|
text: qsTr("No notes yet")
|
||||||
hintText: qsTr("Pull down to add a note")
|
hintText: qsTr("Pull down to add a note")
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewPlaceholder {
|
|
||||||
id: noLoginPlaceholder
|
|
||||||
enabled: (appSettings.server.length === 0 || appSettings.username.length === 0 || appSettings.password.length === 0)
|
|
||||||
text: qsTr("No Nextcloud account")
|
|
||||||
hintText: qsTr("Pull down to go to the settings")
|
|
||||||
}
|
|
||||||
|
|
||||||
VerticalScrollDecorator { flickable: notesList }
|
VerticalScrollDecorator { flickable: notesList }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TouchInteractionHint {
|
||||||
|
id: addAccountHint
|
||||||
|
Component.onCompleted: if (appSettings.accounts.length === 0) restart()
|
||||||
|
interactionMode: TouchInteraction.Pull
|
||||||
|
direction: TouchInteraction.Down
|
||||||
|
}
|
||||||
|
InteractionHintLabel {
|
||||||
|
anchors.fill: parent
|
||||||
|
text: qsTr("Open the settings to add a new Nextcloud account")
|
||||||
|
opacity: addAccountHint.running ? 1.0 : 0.0
|
||||||
|
Behavior on opacity { FadeAnimation {} }
|
||||||
|
width: parent.width
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
67
qml/pages/SettingsPage.qml
Normal file
67
qml/pages/SettingsPage.qml
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
import QtQuick 2.0
|
||||||
|
import Sailfish.Silica 1.0
|
||||||
|
|
||||||
|
Page {
|
||||||
|
id: page
|
||||||
|
|
||||||
|
SilicaFlickable {
|
||||||
|
id: flickable
|
||||||
|
anchors.fill: parent
|
||||||
|
contentHeight: column.height
|
||||||
|
|
||||||
|
Column {
|
||||||
|
id: column
|
||||||
|
width: parent.width
|
||||||
|
spacing: Theme.paddingMedium
|
||||||
|
|
||||||
|
PageHeader {
|
||||||
|
title: qsTr("Settings")
|
||||||
|
}
|
||||||
|
|
||||||
|
SectionHeader {
|
||||||
|
text: qsTr("Accounts")
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
id: noAccountsLabel
|
||||||
|
visible: typeof(appSettings.accounts) !== 'undefined'
|
||||||
|
text: qsTr("No Nextcloud account yet")
|
||||||
|
font.pixelSize: Theme.fontSizeExtraLarge
|
||||||
|
color: Theme.secondaryHighlightColor
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Repeater {
|
||||||
|
model: appSettings.accounts
|
||||||
|
delegate: BackgroundItem {
|
||||||
|
Label {
|
||||||
|
text: appSettings.accounts[index].username + "@" + appSettings.accounts[index].server
|
||||||
|
x: Theme.horizontalPageMargin
|
||||||
|
width: parent.width - 2*x
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
var login = pageStack.push(Qt.resolvedUrl("LoginDialog.qml"), { account: appSettings.accounts[index] } )
|
||||||
|
login.accepted.connect(function() {
|
||||||
|
console.log(login.account.username + ":" + login.account.password + "@" + login.account.server.toString())
|
||||||
|
appSettings.accounts[index] = login.account
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Add account")
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
onClicked: {
|
||||||
|
var login = pageStack.push(Qt.resolvedUrl("LoginDialog.qml"))
|
||||||
|
login.accepted.connect(function() {
|
||||||
|
console.log(login.account.username + ":" + login.account.password + "@" + login.account.server.toString())
|
||||||
|
appSettings.currentAccount = appSettings.accounts.length
|
||||||
|
appSettings.accounts[appSettings.currentAccount] = login.account
|
||||||
|
notes.getNotes()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VerticalScrollDecorator {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -69,22 +69,34 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Update</source>
|
<source>Reload</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>No Nextcloud account</source>
|
<source>No accounts yet</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Pull down to go to the settings</source>
|
<source>Open the settings to add a new Nextcloud account</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>harbour-nextcloudnotes</name>
|
<name>SettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
<source>never</source>
|
<source>Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Accounts</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Add account</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No Nextcloud account yet</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
|
Loading…
Reference in a new issue