From d12f5b58edc7c245d5bfd1c802ecc687d28499e0 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 17:02:56 +0100 Subject: [PATCH 01/23] make giantswarm client available in qml --- src/applicationui.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/applicationui.cpp b/src/applicationui.cpp index 4bb3b96..f22d1c8 100644 --- a/src/applicationui.cpp +++ b/src/applicationui.cpp @@ -57,23 +57,26 @@ ApplicationUI::ApplicationUI() : QObject() connection.setDatabaseName("./data/giantswarm.db"); connection.open(); - GiantswarmClient giantswarm(connection); - qDebug() << "Ping:" << (giantswarm.ping() ? "successful" : "failed"); + GiantswarmClient *giantswarm = new GiantswarmClient(connection); + qDebug() << "Ping:" << (giantswarm->ping() ? "successful" : "failed"); // Create scene document from main.qml asset, the parent is set // to ensure the document gets destroyed properly at shut down. AbstractPane *root; + QmlDocument *qml; if (false) { - QmlDocument *qml = QmlDocument::create("asset:///qml/main.qml").parent(this); + qml = QmlDocument::create("asset:///qml/main.qml").parent(this); root = qml->createRootObject(); } else { - QmlDocument *qml = QmlDocument::create("asset:///qml/Login/LoginPage.qml").parent(this); + qml = QmlDocument::create("asset:///qml/Login/LoginPage.qml").parent(this); root = qml->createRootObject(); qml->connect(root, SIGNAL(finished()), this, SLOT(onSetupFinished())); } + qml->setContextProperty("giantswarm", giantswarm); + // Set created root object as the application scene Application::instance()->setScene(root); } From 36b33efbf85d907a2cda1bf7c0ed2f82838ef628 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 17:07:52 +0100 Subject: [PATCH 02/23] update version test to 0.15.0 --- assets/qml/Welcome/WelcomePage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/qml/Welcome/WelcomePage.qml b/assets/qml/Welcome/WelcomePage.qml index eac67e2..d143238 100644 --- a/assets/qml/Welcome/WelcomePage.qml +++ b/assets/qml/Welcome/WelcomePage.qml @@ -20,7 +20,7 @@ Page { horizontalAlignment: HorizontalAlignment.Center } Label { - text: "0.10.2-beta" + text: "0.15.0-beta" textStyle.fontSize: FontSize.XSmall textStyle.color: Color.Red topMargin: ui.du(0) From 112b7a15cd7ae5f36ac4234dbe0de280771bfed3 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 18:57:59 +0100 Subject: [PATCH 03/23] moved giantswarm client into instance property --- src/applicationui.cpp | 18 ++++++++---------- src/applicationui.hpp | 5 +++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/applicationui.cpp b/src/applicationui.cpp index f22d1c8..1e2061f 100644 --- a/src/applicationui.cpp +++ b/src/applicationui.cpp @@ -25,7 +25,6 @@ #include #include "activeframe.hpp" -#include "bidstack/giantswarm/giantswarmclient.hpp" using namespace bb::cascades; using namespace bb::system; @@ -34,9 +33,13 @@ using namespace Bidstack::Giantswarm; ApplicationUI::ApplicationUI() : QObject() { - // prepare the localization + QSqlDatabase connection = QSqlDatabase::addDatabase("QSQLITE", "giantswarm"); + connection.setDatabaseName("./data/giantswarm.db"); + connection.open(); + m_pTranslator = new QTranslator(this); m_pLocaleHandler = new LocaleHandler(this); + m_giantswarm = new GiantswarmClient(connection); bool res = QObject::connect( m_pLocaleHandler, SIGNAL(systemLanguageChanged()), @@ -53,13 +56,6 @@ ApplicationUI::ApplicationUI() : QObject() ActiveFrame* activeFrame = new ActiveFrame(); Application::instance()->setCover(activeFrame); - QSqlDatabase connection = QSqlDatabase::addDatabase("QSQLITE", "giantswarm"); - connection.setDatabaseName("./data/giantswarm.db"); - connection.open(); - - GiantswarmClient *giantswarm = new GiantswarmClient(connection); - qDebug() << "Ping:" << (giantswarm->ping() ? "successful" : "failed"); - // Create scene document from main.qml asset, the parent is set // to ensure the document gets destroyed properly at shut down. @@ -75,7 +71,7 @@ ApplicationUI::ApplicationUI() : QObject() qml->connect(root, SIGNAL(finished()), this, SLOT(onSetupFinished())); } - qml->setContextProperty("giantswarm", giantswarm); + qml->setContextProperty("giantswarm", m_giantswarm); // Set created root object as the application scene Application::instance()->setScene(root); @@ -97,6 +93,8 @@ void ApplicationUI::onSystemLanguageChanged() void ApplicationUI::onSetupFinished() { QmlDocument *qml = QmlDocument::create("asset:///qml/main.qml").parent(this); + qml->setContextProperty("giantswarm", m_giantswarm); + AbstractPane *root = qml->createRootObject(); Application::instance()->setScene(root); diff --git a/src/applicationui.hpp b/src/applicationui.hpp index a2e4625..b51f777 100644 --- a/src/applicationui.hpp +++ b/src/applicationui.hpp @@ -19,6 +19,10 @@ #include +#include "bidstack/giantswarm/giantswarmclient.hpp" + +using namespace Bidstack::Giantswarm; + namespace bb { namespace cascades @@ -46,6 +50,7 @@ private slots: private: QTranslator* m_pTranslator; bb::cascades::LocaleHandler* m_pLocaleHandler; + GiantswarmClient *m_giantswarm; }; #endif /* ApplicationUI_HPP_ */ From a106e0aa335e97c7ade70e011cc5e78d4ab88b91 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:03:09 +0100 Subject: [PATCH 04/23] covered basic login functionality --- assets/qml/Login/LoginPage.qml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/assets/qml/Login/LoginPage.qml b/assets/qml/Login/LoginPage.qml index eb44960..103e3a9 100644 --- a/assets/qml/Login/LoginPage.qml +++ b/assets/qml/Login/LoginPage.qml @@ -41,11 +41,29 @@ NavigationPane { Button { text: qsTr("Login") + attachedObjects: [ + SystemToast { + id: emailOrPasswordMissingToast + body: qsTr("Email and/or password missing!") + }, + SystemToast { + id: loginFailedToast + body: "Login failed! Please check your credentials and try again!" + } + ] onClicked: { - if (false) { - // TODO: Open environments wizard + var email = emailTextField.text + , password = passwordTextField.text; + + if (email && password) { + if (giantswarm.login(email, password)) { + // TODO: Open environments wizard + nav.finished(); + } else { + loginFailedToast.show(); + } } else { - nav.finished(); + emailOrPasswordMissingToast.show(); } } } From c8938b0884b18a54d8e10b15878be9f0b30335cb Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:03:25 +0100 Subject: [PATCH 05/23] fill company list model with real data --- assets/qml/Company/CompaniesPage.qml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/assets/qml/Company/CompaniesPage.qml b/assets/qml/Company/CompaniesPage.qml index f4f28f2..7990774 100644 --- a/assets/qml/Company/CompaniesPage.qml +++ b/assets/qml/Company/CompaniesPage.qml @@ -104,10 +104,11 @@ NavigationPane { } } onCreationCompleted: { - companiesDataModel.insertList([ - { name: "bidstack" }, - { name: "giantswarm" } - ]); + companiesDataModel.insertList( + giantswarm.getCompanies().map(function (companyName) { + return { name: companyName }; + } + )); } onTriggered: { nav.push(Qt.createComponent( From 335cd7848ee6ff242dfc3eae8c263ade55b8a100 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:10:16 +0100 Subject: [PATCH 06/23] added company user handling --- assets/qml/Company/CompanyPage.qml | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/assets/qml/Company/CompanyPage.qml b/assets/qml/Company/CompanyPage.qml index 95f8d4a..6c2bcb3 100644 --- a/assets/qml/Company/CompanyPage.qml +++ b/assets/qml/Company/CompanyPage.qml @@ -25,7 +25,12 @@ Page { confirmButton.label: qsTr("Add") onFinished: { if (result == SystemUiResult.ConfirmButtonSelection) { - if (true) { + var added = giantswarm.addUserToCompany( + company["name"], // company name + inputFieldTextEntry() // name of user + ); + + if (added) { usersDataModel.insert({ name: inputFieldTextEntry() }); userHasSuccessfullyBeenAddedToast.show(); } else { @@ -113,7 +118,12 @@ Page { confirmButton.label: qsTr("Yes") onFinished: { if (result == SystemUiResult.ConfirmButtonSelection) { - if (true) { + var removed = giantswarm.removeUserFromCompany( + company["name"], // company name + ListItemData.name // name of user + ); + + if (removed) { item.ListItem.view.dataModel.removeAt(item.ListItem.indexPath); userHasSuccessfullyBeenRemovedToast.show(); } else { @@ -140,10 +150,11 @@ Page { } } onCreationCompleted: { - usersDataModel.insertList([ - { name: "jan.pieper" }, - { name: "support" } - ]); + usersDataModel.insertList(giantswarm.getCompanyUsers( + company["name"] + ).map(function (username) { + return { name: username }; + })); } } } From d90213ee15f9cecc42c2436ebbddb6b019716511 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:16:31 +0100 Subject: [PATCH 07/23] read user data from api --- assets/qml/Account/AccountPage.qml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/assets/qml/Account/AccountPage.qml b/assets/qml/Account/AccountPage.qml index c62cd9a..f3f6a99 100644 --- a/assets/qml/Account/AccountPage.qml +++ b/assets/qml/Account/AccountPage.qml @@ -34,7 +34,7 @@ Page { label: qsTr("Username") inputMode: TextFieldInputMode.Text hintText: qsTr("Enter your username here") - text: "bidstack" + text: "" active: false } } @@ -44,7 +44,7 @@ Page { label: qsTr("Email") inputMode: TextFieldInputMode.EmailAddress hintText: qsTr("Enter your email here") - text: "info@bidstack.io" + text: "" active: false } } @@ -58,4 +58,9 @@ Page { } } } + onCreationCompleted: { + var user = giantswarm.getUser(); + emailTextField.text = user["email"]; + usernameTextField.text = user["name"]; + } } From 5b16b163278110ebd54daa416664b904e242d7f8 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:16:45 +0100 Subject: [PATCH 08/23] disabled update of email and/or password * New API method needed or the UI needs to be changed to make clear that you can only update the email OR the password. --- assets/qml/Account/AccountPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/qml/Account/AccountPage.qml b/assets/qml/Account/AccountPage.qml index f3f6a99..4357d00 100644 --- a/assets/qml/Account/AccountPage.qml +++ b/assets/qml/Account/AccountPage.qml @@ -8,6 +8,7 @@ Page { title: qsTr("Account") acceptAction: ActionItem { title: qsTr("Save") + enabled: false // TODO: New API method needed to update both (email & password) attachedObjects: [ SystemToast { id: accountCouldNotBeSavedToast From a959fc660e1c51f41f37b5bb62989b12e5e46ecb Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:25:03 +0100 Subject: [PATCH 09/23] basic environment handling --- assets/qml/Environment/EnvironmentsPage.qml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/assets/qml/Environment/EnvironmentsPage.qml b/assets/qml/Environment/EnvironmentsPage.qml index b104407..b71955b 100644 --- a/assets/qml/Environment/EnvironmentsPage.qml +++ b/assets/qml/Environment/EnvironmentsPage.qml @@ -91,7 +91,16 @@ NavigationPane { confirmButton.label: qsTr("Yes") onFinished: { if (result == SystemUiResult.ConfirmButtonSelection) { - if (true) { + var parts = ListItemData.name.split("/") + , companyName = parts[0] + , environmentName = parts[1]; + + var deleted = giantswarm.deleteEnvironment( + companyName, + environmentName + ); + + if (deleted) { item.ListItem.view.dataModel.removeAt(item.ListItem.indexPath); environmentHasSuccessfullyBeenRemovedToast.show(); } else { @@ -118,10 +127,11 @@ NavigationPane { } } onCreationCompleted: { - environmentsDataModel.insertList([ - { name: "bidstack/staging" }, - { name: "giantswarm/production" } - ]); + environmentsDataModel.insertList( + giantswarm.getEnvironments().map(function (environmentName) { + return { name: environmentName }; + }) + ); } } } From 7d907c8871b65fd3df8df73c2d8d9884f053b98a Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:28:40 +0100 Subject: [PATCH 10/23] allow environment creation --- .../qml/Environment/EnvironmentCreatePage.qml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/assets/qml/Environment/EnvironmentCreatePage.qml b/assets/qml/Environment/EnvironmentCreatePage.qml index f521f1c..7e48c5c 100644 --- a/assets/qml/Environment/EnvironmentCreatePage.qml +++ b/assets/qml/Environment/EnvironmentCreatePage.qml @@ -30,19 +30,19 @@ Sheet { } ] onTriggered: { - var companyName = companyDropDown.value; - var environmentName = environmentTextField.text; + var companyName = companyDropDown.value + , environmentName = environmentTextField.text; - if (true) { - if (true) { + if (giantswarm.hasEnvironment(companyName, environmentName)) { + if (giantswarm.createEnvironment(companyName, environmentName)) { sheet.environmentCreated(companyName, environmentName); environmentHasSuccessfullyBeenCreatedToast.show(); sheet.close(); } else { - environmentAlreadyExistentToast.show(); + environmentCouldNotBeCreatedToast.show(); } } else { - environmentCouldNotBeCreatedToast.show(); + environmentAlreadyExistentToast.show(); } } } @@ -66,8 +66,9 @@ Sheet { } } onCreationCompleted: { - addOption("bidstack"); - addOption("giantswarm"); + giantswarm.getCompanies().forEach(function (companyName) { + addOption(companyName); + }); } } } From 2b60cf5eb94317345379a60811edd6c61757fc18 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 19:35:47 +0100 Subject: [PATCH 11/23] fetch applications from api * The list of applications does not contain the current status. --- assets/qml/Application/ApplicationsPage.qml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/assets/qml/Application/ApplicationsPage.qml b/assets/qml/Application/ApplicationsPage.qml index 29757a9..63f2c84 100644 --- a/assets/qml/Application/ApplicationsPage.qml +++ b/assets/qml/Application/ApplicationsPage.qml @@ -57,10 +57,15 @@ NavigationPane { } } onCreationCompleted: { - applicationsDataModel.insertList([ - { name: "bidstack-api", environment: "bidstack/staging", status: "up" }, - { name: "giantswarm-weather", environment: "giantswarm/production", status: "starting" } - ]); + applicationsDataModel.insertList( + giantswarm.getApplications().map(function (application) { + return { + name: application["application"], + environment: application["environment"], + status: "unknown" // TODO + }; + }) + ); } onTriggered: { navigation.push(Qt.createComponent( From d863149410decabdcac0beb63856d9a1ab19bf82 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Sun, 15 Mar 2015 20:04:08 +0100 Subject: [PATCH 12/23] disable login button if email and/or password missing --- assets/qml/Login/LoginPage.qml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/assets/qml/Login/LoginPage.qml b/assets/qml/Login/LoginPage.qml index 103e3a9..8f5370e 100644 --- a/assets/qml/Login/LoginPage.qml +++ b/assets/qml/Login/LoginPage.qml @@ -12,6 +12,12 @@ NavigationPane { Container { layout: DockLayout {} Container { + function checkAndSetLoginButtonStatus() { + var emailIsGiven = emailTextField.text.length > 0 + , passwordIsGiven = passwordTextField.text.length > 0; + + loginButton.enabled = emailIsGiven && passwordIsGiven; + } verticalAlignment: VerticalAlignment.Center horizontalAlignment: HorizontalAlignment.Center ImageView { @@ -26,6 +32,7 @@ NavigationPane { inputMode: TextFieldInputMode.EmailAddress label: qsTr("Email") hintText: qsTr("Enter your email here") + onTextChanged: checkAndSetLoginButtonStatus() } } SpacedContainer { @@ -34,18 +41,17 @@ NavigationPane { inputMode: TextFieldInputMode.Password label: qsTr("Password") hintText: qsTr("Enter your password here") + onTextChanged: checkAndSetLoginButtonStatus() } } SpacedContainer { horizontalAlignment: HorizontalAlignment.Center Button { + id: loginButton text: qsTr("Login") + enabled: false attachedObjects: [ - SystemToast { - id: emailOrPasswordMissingToast - body: qsTr("Email and/or password missing!") - }, SystemToast { id: loginFailedToast body: "Login failed! Please check your credentials and try again!" @@ -55,15 +61,11 @@ NavigationPane { var email = emailTextField.text , password = passwordTextField.text; - if (email && password) { - if (giantswarm.login(email, password)) { - // TODO: Open environments wizard - nav.finished(); - } else { - loginFailedToast.show(); - } + if (giantswarm.login(email, password)) { + // TODO: Open environments wizard + nav.finished(); } else { - emailOrPasswordMissingToast.show(); + loginFailedToast.show(); } } } From 992cb99d2095b444f63e11d9dcc71949faf5b0fc Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Mon, 16 Mar 2015 22:03:46 +0100 Subject: [PATCH 13/23] expose TextField's textChanging() event --- assets/qml/Elements/LabeledTextField.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assets/qml/Elements/LabeledTextField.qml b/assets/qml/Elements/LabeledTextField.qml index a7a311e..8b524cd 100644 --- a/assets/qml/Elements/LabeledTextField.qml +++ b/assets/qml/Elements/LabeledTextField.qml @@ -1,6 +1,10 @@ import bb.cascades 1.4 Container { + id: labeledTextField + + signal textChanging(); + property alias label: label.text property alias text: textField.text property alias inputMode: textField.inputMode @@ -19,5 +23,6 @@ Container { textStyle.fontSize: FontSize.Large accessibility.labelledBy: label text: "" + onTextChanging: labeledTextField.textChanging() } } \ No newline at end of file From 070462017d1577775c4891aea125f280c7428fa0 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Mon, 16 Mar 2015 22:04:35 +0100 Subject: [PATCH 14/23] fixed en-/disabling login button --- assets/qml/Login/LoginPage.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/assets/qml/Login/LoginPage.qml b/assets/qml/Login/LoginPage.qml index 8f5370e..86d09b3 100644 --- a/assets/qml/Login/LoginPage.qml +++ b/assets/qml/Login/LoginPage.qml @@ -18,6 +18,7 @@ NavigationPane { loginButton.enabled = emailIsGiven && passwordIsGiven; } + id: formContainer verticalAlignment: VerticalAlignment.Center horizontalAlignment: HorizontalAlignment.Center ImageView { @@ -32,7 +33,7 @@ NavigationPane { inputMode: TextFieldInputMode.EmailAddress label: qsTr("Email") hintText: qsTr("Enter your email here") - onTextChanged: checkAndSetLoginButtonStatus() + onTextChanging: formContainer.checkAndSetLoginButtonStatus() } } SpacedContainer { @@ -41,7 +42,7 @@ NavigationPane { inputMode: TextFieldInputMode.Password label: qsTr("Password") hintText: qsTr("Enter your password here") - onTextChanged: checkAndSetLoginButtonStatus() + onTextChanging: formContainer.checkAndSetLoginButtonStatus() } } SpacedContainer { From e53d6d7e87fff154e7824a4708383211663c6f04 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Wed, 18 Mar 2015 21:40:42 +0100 Subject: [PATCH 15/23] updated bidstack-giantswarm dependency * list of environments now contains the company name * new method that returns a list of all applications for all companies * fixed url for getting a list of all applications for one company * fixed getting environment name * pseudo auto-login functionality --- src/bidstack/giantswarm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bidstack/giantswarm b/src/bidstack/giantswarm index 99c512e..496b620 160000 --- a/src/bidstack/giantswarm +++ b/src/bidstack/giantswarm @@ -1 +1 @@ -Subproject commit 99c512ea70fb3875dcf63d83db459796949d8a18 +Subproject commit 496b6203e8bf0f2246cb5d5eb71b8e3a9cdf3167 From 71fc576f2e4d1cf41fa060b73ed77a2b40a5e503 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Wed, 18 Mar 2015 22:54:42 +0100 Subject: [PATCH 16/23] show all applications for all companies --- assets/qml/Application/ApplicationsPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/qml/Application/ApplicationsPage.qml b/assets/qml/Application/ApplicationsPage.qml index 63f2c84..39d3856 100644 --- a/assets/qml/Application/ApplicationsPage.qml +++ b/assets/qml/Application/ApplicationsPage.qml @@ -58,7 +58,7 @@ NavigationPane { } onCreationCompleted: { applicationsDataModel.insertList( - giantswarm.getApplications().map(function (application) { + giantswarm.getAllApplications().map(function (application) { return { name: application["application"], environment: application["environment"], From 9197acde2175b7cab5e784cb9a320a2099f9404d Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Wed, 18 Mar 2015 22:57:09 +0100 Subject: [PATCH 17/23] fixed assigning giantswarm client to qml --- src/applicationui.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/applicationui.cpp b/src/applicationui.cpp index 1e2061f..2978410 100644 --- a/src/applicationui.cpp +++ b/src/applicationui.cpp @@ -62,16 +62,21 @@ ApplicationUI::ApplicationUI() : QObject() AbstractPane *root; QmlDocument *qml; - if (false) { + bool connectFinishedEvent; + if (m_giantswarm->isLoggedIn()) { qml = QmlDocument::create("asset:///qml/main.qml").parent(this); - root = qml->createRootObject(); + connectFinishedEvent = false; } else { qml = QmlDocument::create("asset:///qml/Login/LoginPage.qml").parent(this); - root = qml->createRootObject(); - qml->connect(root, SIGNAL(finished()), this, SLOT(onSetupFinished())); + connectFinishedEvent = true; } qml->setContextProperty("giantswarm", m_giantswarm); + root = qml->createRootObject(); + + if (connectFinishedEvent) { + qml->connect(root, SIGNAL(finished()), this, SLOT(onSetupFinished())); + } // Set created root object as the application scene Application::instance()->setScene(root); From 6235b1fefe6a609dd9be5e4c59c60181821c14cc Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Wed, 18 Mar 2015 23:30:26 +0100 Subject: [PATCH 18/23] updated bidstack-giantswarm dependency * fixed cache key for instance statistics * catch exceptions to avoid app crashes * moved variable initialization out off try-catch block * fixed typo in class name (Httpresponse --> HttpResponse) * return empty application object on failure --- src/bidstack/giantswarm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bidstack/giantswarm b/src/bidstack/giantswarm index 496b620..dab2bee 160000 --- a/src/bidstack/giantswarm +++ b/src/bidstack/giantswarm @@ -1 +1 @@ -Subproject commit 496b6203e8bf0f2246cb5d5eb71b8e3a9cdf3167 +Subproject commit dab2beee3e5ab837b798e591c509ce89766c52e7 From 41713acffd7534ebadf8d9669b973e20abad9c20 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Wed, 18 Mar 2015 23:58:49 +0100 Subject: [PATCH 19/23] fixed navigation's variable name --- assets/qml/Application/ApplicationsPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/qml/Application/ApplicationsPage.qml b/assets/qml/Application/ApplicationsPage.qml index 39d3856..8aad96b 100644 --- a/assets/qml/Application/ApplicationsPage.qml +++ b/assets/qml/Application/ApplicationsPage.qml @@ -68,7 +68,7 @@ NavigationPane { ); } onTriggered: { - navigation.push(Qt.createComponent( + nav.push(Qt.createComponent( "ApplicationPage.qml" ).createObject(nav, { application: applicationsDataModel.data(indexPath) From 3a28bedc40f30b0dfc010b9c7f30d2fe48a961be Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Thu, 19 Mar 2015 00:00:34 +0100 Subject: [PATCH 20/23] disable password field --- assets/qml/Account/AccountPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/qml/Account/AccountPage.qml b/assets/qml/Account/AccountPage.qml index 4357d00..987adb5 100644 --- a/assets/qml/Account/AccountPage.qml +++ b/assets/qml/Account/AccountPage.qml @@ -56,6 +56,7 @@ Page { inputMode: TextFieldInputMode.Password hintText: qsTr("Enter your password here") text: "" + active: false } } } From 30890ae5570c552acb478c6ef6cd920347134e06 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Thu, 19 Mar 2015 00:01:11 +0100 Subject: [PATCH 21/23] combine company and environment name --- assets/qml/Application/ApplicationsPage.qml | 2 +- assets/qml/Environment/EnvironmentsPage.qml | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/assets/qml/Application/ApplicationsPage.qml b/assets/qml/Application/ApplicationsPage.qml index 8aad96b..09d386d 100644 --- a/assets/qml/Application/ApplicationsPage.qml +++ b/assets/qml/Application/ApplicationsPage.qml @@ -61,7 +61,7 @@ NavigationPane { giantswarm.getAllApplications().map(function (application) { return { name: application["application"], - environment: application["environment"], + environment: application["company"] + "/" + application["environment"], status: "unknown" // TODO }; }) diff --git a/assets/qml/Environment/EnvironmentsPage.qml b/assets/qml/Environment/EnvironmentsPage.qml index b71955b..367a6ca 100644 --- a/assets/qml/Environment/EnvironmentsPage.qml +++ b/assets/qml/Environment/EnvironmentsPage.qml @@ -128,8 +128,10 @@ NavigationPane { } onCreationCompleted: { environmentsDataModel.insertList( - giantswarm.getEnvironments().map(function (environmentName) { - return { name: environmentName }; + giantswarm.getEnvironments().map(function (environment) { + return { + name: environment["company_name"] + "/" + environment["name"] + }; }) ); } From 1bec96c90806ce8fa7a925005f4a94f5bcf4d273 Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Fri, 20 Mar 2015 01:09:27 +0100 Subject: [PATCH 22/23] colorize on status change --- assets/qml/Elements/StatusLabel.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/qml/Elements/StatusLabel.qml b/assets/qml/Elements/StatusLabel.qml index 437bcca..026d013 100644 --- a/assets/qml/Elements/StatusLabel.qml +++ b/assets/qml/Elements/StatusLabel.qml @@ -2,11 +2,11 @@ import bb.cascades 1.4 Label { property string status; - + text: status textStyle.fontSize: FontSize.Small - - onCreationCompleted: { + + onStatusChanged: { if (status == "up") { textStyle.color = Color.Green } else if (status == "starting") { @@ -17,4 +17,4 @@ Label { textStyle.color = Color.Gray } } -} \ No newline at end of file +} From 8916fefe787f34909307bb9cb28e8d9f34631bbe Mon Sep 17 00:00:00 2001 From: Jan Pieper Date: Fri, 20 Mar 2015 01:10:39 +0100 Subject: [PATCH 23/23] use data from giantswarm api --- assets/qml/Application/ApplicationPage.qml | 21 ++++++++++++++------- assets/qml/Application/ApplicationsPage.qml | 16 ++++++++-------- assets/qml/Application/ComponentPage.qml | 8 ++------ assets/qml/Application/InstancePage.qml | 2 +- assets/qml/Application/ServicePage.qml | 5 +---- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/assets/qml/Application/ApplicationPage.qml b/assets/qml/Application/ApplicationPage.qml index bf1e994..4f72806 100644 --- a/assets/qml/Application/ApplicationPage.qml +++ b/assets/qml/Application/ApplicationPage.qml @@ -3,7 +3,9 @@ import bb.cascades 1.4 import "../Elements" Page { - property variant application; + property string application_name; + property string company_name; + property string environment_name; titleBar: TitleBar { title: qsTr("Application") acceptAction: ActionItem { @@ -26,7 +28,7 @@ Page { } Container { Label { - text: application["name"] + text: application_name textStyle.fontSize: FontSize.Large bottomMargin: ui.du(0) } @@ -41,7 +43,8 @@ Page { rightMargin: ui.du(0) } StatusLabel { - status: application["status"] + id: statusLabel + status: "unknown" leftMargin: ui.du(0) } } @@ -85,10 +88,14 @@ Page { } } onCreationCompleted: { - servicesDataModel.insertList([ - { name: "website", status: "starting" }, - { name: "api", status: "failed" } - ]); + var application = giantswarm.getApplicationStatus( + company_name, + environment_name, + application_name + ); + + statusLabel.status = application["status"]; + servicesDataModel.insertList(application["services"]); } onTriggered: { nav.push(Qt.createComponent( diff --git a/assets/qml/Application/ApplicationsPage.qml b/assets/qml/Application/ApplicationsPage.qml index 09d386d..b58e3e0 100644 --- a/assets/qml/Application/ApplicationsPage.qml +++ b/assets/qml/Application/ApplicationsPage.qml @@ -36,12 +36,12 @@ NavigationPane { } verticalAlignment: VerticalAlignment.Center Label { - text: ListItemData.name + text: ListItemData.application_name textStyle.fontSize: FontSize.Large bottomMargin: 0 } Label { - text: ListItemData.environment + text: ListItemData.company_name + "/" + ListItemData.environment_name verticalAlignment: VerticalAlignment.Center textStyle.fontSize: FontSize.Small textStyle.color: Color.Gray @@ -60,9 +60,9 @@ NavigationPane { applicationsDataModel.insertList( giantswarm.getAllApplications().map(function (application) { return { - name: application["application"], - environment: application["company"] + "/" + application["environment"], - status: "unknown" // TODO + application_name: application["application"], + company_name: application["company"], + environment_name: application["environment"] }; }) ); @@ -70,9 +70,9 @@ NavigationPane { onTriggered: { nav.push(Qt.createComponent( "ApplicationPage.qml" - ).createObject(nav, { - application: applicationsDataModel.data(indexPath) - })); + ).createObject(nav, applicationsDataModel.data( + indexPath + ))); } } } diff --git a/assets/qml/Application/ComponentPage.qml b/assets/qml/Application/ComponentPage.qml index 02b3522..619607d 100644 --- a/assets/qml/Application/ComponentPage.qml +++ b/assets/qml/Application/ComponentPage.qml @@ -72,7 +72,7 @@ Page { layoutProperties: StackLayoutProperties { spaceQuota: 1 } - text: ListItemData.name + text: ListItemData.id textStyle.fontSize: FontSize.Large verticalAlignment: VerticalAlignment.Center } @@ -85,11 +85,7 @@ Page { } } onCreationCompleted: { - instancesDataModel.insertList([ - { name: "c6ef55dc-d501-4669-b175-34b5c112ba79", status: "up" }, - { name: "37df40f4-fd6d-4b60-a662-d7d61ec0741c", status: "starting" }, - { name: "7a1f51cf-33b7-4a5b-b101-c943dcc8b48a", status: "failed" } - ]); + instancesDataModel.insertList(component["instances"]); } onTriggered: { nav.push(Qt.createComponent( diff --git a/assets/qml/Application/InstancePage.qml b/assets/qml/Application/InstancePage.qml index e4ed056..5dd52d4 100644 --- a/assets/qml/Application/InstancePage.qml +++ b/assets/qml/Application/InstancePage.qml @@ -29,7 +29,7 @@ Page { spaceQuota: 1 } Label { - text: instance["name"] + text: instance["id"] textStyle.fontSize: FontSize.Large bottomMargin: ui.du(0) } diff --git a/assets/qml/Application/ServicePage.qml b/assets/qml/Application/ServicePage.qml index 08b0066..d81da52 100644 --- a/assets/qml/Application/ServicePage.qml +++ b/assets/qml/Application/ServicePage.qml @@ -85,10 +85,7 @@ Page { } } onCreationCompleted: { - componentsDataModel.insertList([ - { name: "nginx", status: "up" }, - { name: "rails", status: "up" } - ]); + componentsDataModel.insertList(service["components"]); } onTriggered: { nav.push(Qt.createComponent(