Login.qml Example File
socialtodos/Login.qml/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtEnginio module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.1 import QtQuick.Layouts 1.0 import QtQuick.Controls 1.0 as Controls import Enginio 1.0 Rectangle { width: 400 height: 600 Rectangle { id: header anchors.top: parent.top width: parent.width height: 70 * scaleFactor color: "white" Row { id: logo anchors.centerIn: parent anchors.horizontalCenterOffset: -4 spacing: 4 Image { source: "qrc:images/enginio.png" width: 160 * scaleFactor ; height: 60 * scaleFactor fillMode: Image.PreserveAspectFit } Text { text: "Todos" anchors.verticalCenter: parent.verticalCenter anchors.verticalCenterOffset: -3 font.bold: true font.pixelSize: 46 * scaleFactor color: "#555" } } Rectangle { width: parent.width ; height: 1 anchors.bottom: parent.bottom color: "#bbb" } } BorderImage { id: input width: parent.width anchors.top: header.bottom anchors.bottom: parent.bottom source: "qrc:images/delegate.png" border.left: 5; border.top: 5 border.right: 5; border.bottom: 5 Rectangle { y: -1 ; height: 1 width: parent.width color: "#bbb" } Rectangle { y: 0 ; height: 1 width: parent.width color: "white" } } Column { anchors.centerIn: parent anchors.alignWhenCentered: true width: 360 * scaleFactor spacing: 14 * intScaleFactor TextField { id: nameInput onAccepted: passwordInput.forceActiveFocus() placeholderText: "Username" KeyNavigation.tab: passwordInput } TextField { id: passwordInput onAccepted: login() placeholderText: "Password" echoMode: TextInput.Password KeyNavigation.tab: loginButton } Row { // button spacing: 20 * scaleFactor width: 360 * scaleFactor anchors.horizontalCenter: parent.horizontalCenter anchors.alignWhenCentered: true TouchButton { id: loginButton text: "Login" baseColor: "#7a5" width: (parent.width - parent.spacing)/2 onClicked: login() enabled: enginioClient.authenticationState !== Enginio.Authenticating && nameInput.text.length && passwordInput.text.length KeyNavigation.tab: registerButton } TouchButton { id: registerButton text: "Register" onClicked: registerAndLogin() width: (parent.width - parent.spacing)/2 enabled: enginioClient.authenticationState !== Enginio.Authenticating && nameInput.text.length && passwordInput.text.length KeyNavigation.tab: nameInput } } } Text { id: statusText anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter anchors.bottomMargin: 70 * scaleFactor font.pixelSize: 18 * scaleFactor color: "#444" } Component.onCompleted: { enginioClient.sessionAuthenticationError.connect(function(reply){ statusText.text = "Login failed: " + reply.errorString }) enginioClient.sessionAuthenticated.connect(function(reply){ addUserToAllUsersGroup(reply.data.enginio_data.user.id) }) } Controls.Stack.onStatusChanged: { if (Controls.Stack.status == Controls.Stack.Activating) { nameInput.text = "" passwordInput.text = "" statusText.text = "" nameInput.forceActiveFocus() } } function login() { statusText.text = "Logging in..." enginioClient.identity = null auth.user = nameInput.text auth.password = passwordInput.text enginioClient.identity = auth } // Register a new user and add her to the group "allUsers" function registerAndLogin() { statusText.text = "Creating user account..." var createAccount = enginioClient.create({ "username": nameInput.text, "password": passwordInput.text }, Enginio.UserOperation) createAccount.finished.connect(function() { if (createAccount.errorType !== EnginioReply.NoError) { statusText.text = "Account creation failed: " + createAccount.errorString } else { login() } }) } function addUserToAllUsersGroup(userId) { var groupQuery = enginioClient.query({ "query": { "name" : "allUsers" } }, Enginio.UsergroupOperation) groupQuery.finished.connect(function(){ if (groupQuery.errorType !== EnginioReply.NoError) { statusText.text = groupQuery.errorString } else if (groupQuery.data.results.length === 0 ){ statusText.text = "Usergroup 'allUsers' not found, check required backend configuration from Social Todos example documentation." } else { var addUserToGroupData = { "id": groupQuery.data.results[0].id, "member" : { "id": userId, "objectType": "users" } } var addUserToGroup = enginioClient.create(addUserToGroupData, Enginio.UsergroupMembersOperation) addUserToGroup.finished.connect(function(){ if (addUserToGroup.errorType === EnginioReply.NoError) { switchToListsView() } else if (addUserToGroup.errorType === EnginioReply.BackendError && addUserToGroup.backendStatus === 400) { //User already present in group, OK to proceed switchToListsView() } else { statusText.text = "User add to group failed: " + JSON.stringify(addUserToGroup.data.errors[0]) } }) } }) } function switchToListsView() { mainView.push({ item: lists, properties: {"username": enginioClient.identity.user}}) } }