ORE Studio 0.0.4
Loading...
Searching...
No Matches
TenantOnboardingWizard.hpp
1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 *
3 * Copyright (C) 2026 Marco Craveiro <marco.craveiro@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20#ifndef ORES_QT_TENANT_ONBOARDING_WIZARD_HPP
21#define ORES_QT_TENANT_ONBOARDING_WIZARD_HPP
22
23#include <QWizard>
24#include <QWizardPage>
25#include <QLineEdit>
26#include <QLabel>
27#include <QComboBox>
28#include <QRadioButton>
29#include <QProgressBar>
30#include <QCheckBox>
31#include <QTextEdit>
32#include "ores.logging/make_logger.hpp"
33#include "ores.qt/ClientManager.hpp"
34
35namespace ores::qt {
36
37class LeiEntityPicker;
38
53class TenantOnboardingWizard final : public QWizard {
54 Q_OBJECT
55
56private:
57 inline static std::string_view logger_name =
58 "ores.qt.tenant_onboarding_wizard";
59
60 [[nodiscard]] static auto& lg() {
61 using namespace ores::logging;
62 static auto instance = make_logger(logger_name);
63 return instance;
64 }
65
66public:
67 enum PageId {
68 Page_ModeAndLei,
69 Page_TenantDetails,
70 Page_AdminAccount,
71 Page_Apply
72 };
73
75 ClientManager* clientManager,
76 QWidget* parent = nullptr);
77
78 ~TenantOnboardingWizard() override = default;
79
80 ClientManager* clientManager() const { return clientManager_; }
81
82 bool isGleifMode() const { return gleifMode_; }
83 void setGleifMode(bool gleif) { gleifMode_ = gleif; }
84
85 QString tenantCode() const { return tenantCode_; }
86 void setTenantCode(const QString& code) { tenantCode_ = code; }
87
88 QString tenantName() const { return tenantName_; }
89 void setTenantName(const QString& name) { tenantName_ = name; }
90
91 QString tenantType() const { return tenantType_; }
92 void setTenantType(const QString& type) { tenantType_ = type; }
93
94 QString tenantHostname() const { return tenantHostname_; }
95 void setTenantHostname(const QString& hostname) { tenantHostname_ = hostname; }
96
97 QString tenantDescription() const { return tenantDescription_; }
98 void setTenantDescription(const QString& desc) { tenantDescription_ = desc; }
99
100 QString rootLei() const { return rootLei_; }
101 void setRootLei(const QString& lei) { rootLei_ = lei; }
102
103 QString rootLeiName() const { return rootLeiName_; }
104 void setRootLeiName(const QString& name) { rootLeiName_ = name; }
105
106 QString adminUsername() const { return adminUsername_; }
107 void setAdminUsername(const QString& u) { adminUsername_ = u; }
108
109 QString adminPassword() const { return adminPassword_; }
110 void setAdminPassword(const QString& p) { adminPassword_ = p; }
111
112 QString adminEmail() const { return adminEmail_; }
113 void setAdminEmail(const QString& e) { adminEmail_ = e; }
114
115signals:
116 void onboardingCompleted(const QString& tenantName);
117
118private:
119 void setupPages();
120
121 ClientManager* clientManager_;
122 bool gleifMode_ = false;
123 QString tenantCode_;
124 QString tenantName_;
125 QString tenantType_ = QStringLiteral("evaluation");
126 QString tenantHostname_;
127 QString tenantDescription_;
128 QString rootLei_;
129 QString rootLeiName_;
130 QString adminUsername_;
131 QString adminPassword_;
132 QString adminEmail_;
133};
134
135// Forward declarations of page classes
136class ModeAndLeiPage;
140
147class ModeAndLeiPage final : public QWizardPage {
148 Q_OBJECT
149
150public:
151 explicit ModeAndLeiPage(TenantOnboardingWizard* wizard);
152 void initializePage() override;
153 bool validatePage() override;
154 int nextId() const override;
155
156private slots:
157 void onModeChanged();
158
159private:
160 void setupUI();
161
162 TenantOnboardingWizard* wizard_;
163 QRadioButton* blankRadio_;
164 QRadioButton* gleifRadio_;
165 LeiEntityPicker* leiPicker_;
166 QLabel* selectedEntityLabel_;
167 bool leiLoaded_ = false;
168};
169
176class TenantDetailsPage final : public QWizardPage {
177 Q_OBJECT
178
179public:
181 void initializePage() override;
182 bool validatePage() override;
183 int nextId() const override;
184
185private slots:
186 void onCodeChanged(const QString& text);
187
188private:
189 void setupUI();
190 void updateHostname();
191
192 TenantOnboardingWizard* wizard_;
193 QLineEdit* codeEdit_;
194 QLineEdit* nameEdit_;
195 QComboBox* typeCombo_;
196 QLineEdit* hostnameEdit_;
197 QLineEdit* descriptionEdit_;
198 QLabel* validationLabel_;
199 bool hostnameManuallyEdited_ = false;
200};
201
205class OnboardingAdminAccountPage final : public QWizardPage {
206 Q_OBJECT
207
208public:
210 void initializePage() override;
211 bool validatePage() override;
212 int nextId() const override;
213
214private slots:
215 void onShowPasswordToggled(bool checked);
216
217private:
218 void setupUI();
219
220 TenantOnboardingWizard* wizard_;
221 QLineEdit* usernameEdit_;
222 QLineEdit* emailEdit_;
223 QLineEdit* passwordEdit_;
224 QLineEdit* confirmPasswordEdit_;
225 QCheckBox* showPasswordCheck_;
226 QLabel* validationLabel_;
227};
228
234class ApplyOnboardingPage final : public QWizardPage {
235 Q_OBJECT
236
237private:
238 inline static std::string_view logger_name =
239 "ores.qt.apply_onboarding_page";
240
241 [[nodiscard]] static auto& lg() {
242 using namespace ores::logging;
243 static auto instance = make_logger(logger_name);
244 return instance;
245 }
246
247public:
249 void initializePage() override;
250 bool isComplete() const override;
251
252private:
253 void startOnboarding();
254 void appendLog(const QString& message);
255
256 TenantOnboardingWizard* wizard_;
257 QLabel* statusLabel_;
258 QProgressBar* progressBar_;
259 QTextEdit* logOutput_;
260 bool onboardingComplete_ = false;
261 bool onboardingSuccess_ = false;
262};
263
264}
265
266#endif
Implements logging infrastructure for ORE Studio.
Definition boost_severity.hpp:28
Qt-based graphical user interface for ORE Studio.
Definition AboutDialog.hpp:29
Manages the lifecycle of the NATS client and login state.
Definition ClientManager.hpp:109
Reusable widget for searching and selecting an LEI entity.
Definition LeiEntityPicker.hpp:42
Wizard for onboarding a new tenant.
Definition TenantOnboardingWizard.hpp:53
First page: choose Blank or GLEIF mode and select LEI entity.
Definition TenantOnboardingWizard.hpp:147
Second page: configure tenant details.
Definition TenantOnboardingWizard.hpp:176
Third page: create the initial admin account for the new tenant.
Definition TenantOnboardingWizard.hpp:205
Fourth page: provisions the tenant and creates admin account.
Definition TenantOnboardingWizard.hpp:234