Skip to content

feat(UI): Account wizard redesign#10030

Open
Rello wants to merge 2 commits into
masterfrom
feature/AccountWizard
Open

feat(UI): Account wizard redesign#10030
Rello wants to merge 2 commits into
masterfrom
feature/AccountWizard

Conversation

@Rello
Copy link
Copy Markdown
Collaborator

@Rello Rello commented May 14, 2026

closing #8822

@Rello Rello moved this to 🏗️ In progress in 💻 Desktop Clients team May 14, 2026
@Rello Rello self-assigned this May 14, 2026
@Rello Rello added the design Design, UI, UX, etc. label May 14, 2026
@Rello

This comment was marked as outdated.

@kra-mo
Copy link
Copy Markdown
Member

kra-mo commented May 15, 2026

@kra-mo wdyt?

I mean, obvious points of feedback are that the input field should be as big as the "Log in" button and the side/bottom padding for buttons should be equal, plus the buttons on the first screen should all take up as much width as possible, like on the second screen. The "Authorize this device in the browser window that opened." string can also be removed and the icons made the same as on the mockup. The colors of the primary buttons also don't meet contrast requirements, I don’t know where this color is from.

Generally just getting it in-line with the mockup.

@kra-mo
Copy link
Copy Markdown
Member

kra-mo commented May 15, 2026

Plus the "Add Nextcloud account" window title can be made invisible on Mac here. Each screen should give you enough context on its own.

@Rello
Copy link
Copy Markdown
Collaborator Author

Rello commented May 15, 2026

Bildschirmfoto 2026-05-27 um 14 05 13 Bildschirmfoto 2026-05-27 um 14 26 45 Bildschirmfoto 2026-05-27 um 14 05 53 Bildschirmfoto 2026-05-27 um 14 06 43 Bildschirmfoto 2026-05-27 um 14 08 42

@Rello
Copy link
Copy Markdown
Collaborator Author

Rello commented May 27, 2026

@kra-mo can you re-check the current screenshots? if ok we will do win/linux also

@Rello Rello requested review from jancborchardt and kra-mo May 27, 2026 19:04
@Rello Rello added this to the 34.0.0 milestone May 27, 2026
@Rello Rello marked this pull request as ready for review May 27, 2026 19:04
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9995d5f252

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +86 to +93
const auto defaultUrl =
Theme::instance()->multipleOverrideServers() ? QString{} : Theme::instance()->overrideServerUrl();

_remoteFolder = Theme::instance()->defaultServerFolder();
setServerUrl(defaultUrl);
const auto hasForcedConcreteServerUrl =
Theme::instance()->forceOverrideServerUrl() && !defaultUrl.isEmpty() && !Theme::instance()->multipleOverrideServers();
setServerUrlEditable(!hasForcedConcreteServerUrl);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve forced override server choices

When overrideServerUrl() contains the JSON array used for forced multiple-server deployments, this initializes the QML wizard with an empty, editable URL instead of presenting the configured choices. The legacy setup page handled multipleOverrideServers() && forceOverrideServerUrl() by hiding the free-form field and populating a combo box from the JSON array, so this new path lets users type arbitrary servers and prevents them from selecting the branded servers.

Useful? React with 👍 / 👎.

Comment on lines +230 to +233
_qmlWizardWindow->show();
_qmlWizardWindow->raise();
_qmlWizardWindow->requestActivate();
return true;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Start the enforced URL login automatically

For single forced override URLs, ConfigFile::overrideServerUrl() still sets startLoginFlowAutomatically(), but the QML path now only shows the window and returns. The legacy OwncloudSetupPage::initializePage() immediately called validation for that scenario, so custom-link/branded launches that are supposed to open the browser login without user input now stop on a read-only server page until the user clicks Log in.

Useful? React with 👍 / 👎.

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
2 Security Hotspots
8.2% Coverage on New Code (required ≥ 80%)
158 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Copy link
Copy Markdown
Member

@kra-mo kra-mo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks fine enough.

@Rello
Copy link
Copy Markdown
Collaborator Author

Rello commented May 28, 2026

implementing missing features like TOS and shares

@Rello
Copy link
Copy Markdown
Collaborator Author

Rello commented May 28, 2026

Multi-URL setting

Bildschirmfoto 2026-05-28 um 12 02 36

Connect to Share
Bildschirmfoto 2026-05-28 um 12 11 30

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: af0c8254cc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

fetchRootFolderSize();

#if defined(Q_OS_WIN) || defined(Q_OS_MACOS)
setNeedsSyncOptions(!canUseVirtualFiles());
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep sync options visible on Windows

On Windows machines where CfAPI virtual files are available, canUseVirtualFiles() returns true, so this skips the SyncOptionsStep entirely; because the constructor also defaults _syncMode to VirtualFiles, finish() immediately creates a virtual-files sync folder without giving the user the previous choices to pick a local folder, synchronize everything, or use selective sync. The old wizard only auto-skipped folder configuration for the macOS File Provider path (useVirtualFileSyncByDefault() under BUILD_FILE_PROVIDER_MODULE), while Windows still went through the advanced setup page.

Useful? React with 👍 / 👎.

Comment thread src/gui/owncloudsetupwizard.cpp Outdated
Comment on lines 494 to 495
connect(job, &PropfindJob::finishedWithError, this, [this] (QNetworkReply *reply) -> void {
if (reply && reply->error() == QNetworkReply::ContentAccessDenied) {
// A 403 might indicate that the terms of service need to be signed.
// catch this special case here, fall back to the standard error handler if it's not TOS-related
auto davException = OCC::getExceptionFromReply(reply);
if (!davException.first.isEmpty() && davException.first == QStringLiteral(R"(OCA\TermsOfService\TermsNotSignedException)")) {
// authentication was successful, but the user hasn't signed the terms of service yet. Prompt for that in the next step
qCInfo(lcWizard) << "Terms of service not accepted yet! Will prompt the user in the next step";
_ocWizard->_needsToAcceptTermsOfService = true;
_ocWizard->successfulStep();
return;
}
}
slotAuthError();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve terms-of-service handling during setup

When the authenticated PROPFIND returns 403 with OCA\TermsOfService\TermsNotSignedException, this now always falls through to slotAuthError() in the legacy setup path instead of treating authentication as successful and prompting the user to accept the terms. Servers with the Terms of Service app enabled will therefore block account setup with a generic auth/access error, whereas the previous code detected this exception before calling the error handler.

Useful? React with 👍 / 👎.

@mgallien
Copy link
Copy Markdown
Collaborator

mgallien commented May 28, 2026

windows light mode

  • step 1
image
  • proxy settings
image image
  • step 2
image
  • removing account dialog
image

Copy link
Copy Markdown
Collaborator

@mgallien mgallien left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the proxy popup is not being reset when closed and will open with the previous state if open again

@Rello
Copy link
Copy Markdown
Collaborator Author

Rello commented May 28, 2026

the proxy popup is not being reset when closed and will open with the previous state if open again

but should it? if you did the effort to enter e.g. a long password, you do not want to have it reset by making a wrong click

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7eeeb50f2b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

}

folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, _selectiveSyncBlacklist);
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, QStringList() << QLatin1String("/"));
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don't pre-whitelist folders when confirmations are enabled

When the user chooses "Synchronize everything" while "ask before large folders" or external-storage confirmation is enabled, writing / to the selective-sync whitelist marks every remote child as already accepted; DiscoveryPhase::checkSelectiveSyncNewFolder returns before the size/external checks when a parent is whitelisted, so the first sync downloads large or external folders without prompting. The old wizard only wrote / when the big-folder confirmation checkbox was off, leaving the whitelist empty so those checks could fire.

Useful? React with 👍 / 👎.

case DetermineAuthTypeJob::NoAuthType:
setBusy(false);
setErrorText(tr("This server requires an authentication method that is still handled by the classic account wizard."));
emit legacyWizardRequested();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Carry entered server into the classic fallback

For servers whose auth type falls back to the classic wizard (Basic or WebView), this signal closes the QML wizard after the user already entered and validated a URL, but the connected handler starts a fresh OwncloudWizard; startWizard() initializes the account from Theme::overrideServerUrl() only, so ordinary manually entered servers reopen on a blank/default server page and lose any proxy/client-certificate choices. Passing the current account or at least _serverUrl into the fallback preserves the setup flow for those servers.

Useful? React with 👍 / 👎.

Squash the account wizard branch into a single visible change set.

Signed-off-by: Rello <github@scherello.de>
@Rello Rello force-pushed the feature/AccountWizard branch from 7eeeb50 to 2e9222f Compare May 28, 2026 12:02
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2e9222f32e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

#endif

if (needsSyncOptions()) {
setCurrentStep(SyncOptionsStep);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Auto-finish one-shot local-dir setup

When the client is launched with both --overrideserverurl and --overridelocaldir, platforms that still need sync options now stop on this page even though the local folder was supplied. The legacy advanced page immediately accepted the wizard when overrideLocalDir() was present for a forced override URL, so scripted/preconfigured setup flows now require manual interaction before the account is usable.

Useful? React with 👍 / 👎.

accountState = manager->addAccount(_account);
}

manager->saveAccount(_account);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Clear one-shot override settings after saving

After a successful QML setup, the one-shot ConfigFile::overrideServerUrl() / overrideLocalDir() values written from command-line overrides are never cleared. The next client start will read them again in initialiseAccount(), force the same server URL, and potentially reuse the same local directory; the legacy advanced page cleared both values on accepted setup, so this should happen once the account is saved here.

Useful? React with 👍 / 👎.

@mgallien
Copy link
Copy Markdown
Collaborator

the proxy popup is not being reset when closed and will open with the previous state if open again

but should it? if you did the effort to enter e.g. a long password, you do not want to have it reset by making a wrong click

in classic real popup, you delete the first popup item and when opening the new one, you would only get default values (unless you explicitly save previous value and reuse them)
I would keep previous behavior to minimize the surprises (other such dialogs in desktop client do not reuse previous state)
I also forgot to mention that using a not real popup via qml may be an issue when selecting manual proxy mode because the enclosing window may be too small to display it correctly (see my snapshot)

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 68ff9bcfe3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +198 to +203
Button {
visible: root.controller && root.controller.currentStep === AccountWizardController.ServerStep
enabled: root.controller && !root.controller.busy
flat: true
text: qsTr("Proxy settings")
font.pointSize: 16
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Respect proxy-disabled builds in the wizard

In builds with DO_NOT_USE_PROXY enabled, the legacy wizard omitted the proxy button and Application/network settings force accounts to direct connections, but this QML path always exposes proxy settings and startServerCheck() applies them during setup. In those branded/policy builds a user can still route the initial account discovery/authentication through a manual proxy, bypassing the intended direct-only behavior; hide this action and ignore proxy overrides when Theme::doNotUseProxy() is true.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member

@jancborchardt jancborchardt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me from what you showed also in person @Rello! :)

The button text looks a bit large on Windows though?

@github-actions
Copy link
Copy Markdown

Artifact containing the AppImage: nextcloud-appimage-pr-10030.zip

Digest: sha256:3ea244fb3475d728ffc56f033dc52b970a7ff188de9dd3bd73209fce59479171

To test this change/fix you can download the above artifact file, unzip it, and run it.

Please make sure to quit your existing Nextcloud app and backup your data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

design Design, UI, UX, etc.

Projects

Status: 🏗️ In progress

Development

Successfully merging this pull request may close these issues.

4 participants