[Portal] Framework-first Create Application wizard#5737
Draft
fungc-io wants to merge 85 commits into
Draft
Conversation
Contributor
|
@fungc-io Should I review this? |
fungc-io
marked this pull request as draft
May 27, 2026 12:54
Member
Author
|
@tung2744 , no, it's still in progress, i've changed it to draft |
Additive, nullable. JSON schema enum lists allowed framework IDs. No behavior change; field is a label used by the portal. ref DEV-2392
ref DEV-2392
ref DEV-2392
ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ref DEV-2392
ref DEV-2392
ref DEV-2392
ref DEV-2392
Behavior unchanged. Route wired in the next commit. ref DEV-2392
ref DEV-2392
Replaces the type-first ChoiceGroup with a framework grid and an inline Stage-2 callout for server-side frameworks. Submits the chosen framework as x_framework alongside the resolved x_application_type. M2M flow extracted to its own screen in a previous commit. ref DEV-2392
ref DEV-2392
ref DEV-2392
ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
constructConfig was called on every render via useMemo, but threw when the user had not yet picked a framework — crashing the screen on initial mount. Return the input config unchanged in that state so the form stays clean until the user makes a selection. ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirror the constructConfig guard: a server framework selected without a stage-2 choice would still crash via resolveType. Return undefined so no secret instruction is emitted until the user has completed the Stage 2 selection. ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reuses the same FluentUI CompoundButton-based ChoiceButton used by the Login Methods authentication selectors (Passwordless / Enter password). Visual treatment of selected/unselected states matches the rest of the portal automatically. ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The checked ChoiceButton draws a 1px outline outside its border-box. Without padding on the grid, that outline gets clipped against the parent's overflow boundary on the outermost cards (React, Angular, Next.js, Other SPAs). ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop the 16 placeholder SVG files and switch the catalog from file-import logos to Tabler glyph names (already loaded in the portal via the iconfont). The visual style now matches LoginMethodIcon and other Tabler usages in the portal. Frameworks without a Tabler brand glyph fall back to a closely related icon: - express -> brand-javascript - other-spa -> world-www - java -> coffee - aspnet -> brand-windows - other-oidc -> shield-check - ionic -> device-mobile ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Restore the original gating: only M2M clients show the Quick Start tab. The wizard's post-create ?tab=quick-start URL still works for M2M; for other types the query value is invalid and usePivot falls back to Settings — which is the desired behavior until DEV-2532 fills in framework-specific Quick Start content for SPA / native / confidential / traditional_webapp. ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Framework column reads from x_framework via the catalog and shows the framework display name (e.g. "React", "Python (Django)"). For legacy apps without x_framework, or for M2M clients, it falls back to the application-type label so the cell is never empty. ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop the custom 15px font-size in FrameworkGrid section labels and the AuthMethodChoice question. Both now use WidgetSubtitle (Text variant 'medium', fontWeight 600) to match the rest of the portal. ref DEV-2392 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Move the Other OIDC/SAML compatible card out of the Website section into a new integration section, in preparation for surfacing machine-to-machine in the same category. ref DEV-2392
Add an M2M card to the Integrations & other section of the Create Application grid. Selecting it navigates to the existing machine-to-machine create screen, so M2M is discoverable from the main flow instead of only the split-button dropdown. ref DEV-2392
Machine-to-machine is now discoverable as a card in the Create Application wizard, so the split-button dropdown that exposed it is redundant. Revert the Add Application button to a plain button and drop the now-unused create menu and its strings. ref DEV-2392
Selecting the machine-to-machine card no longer jumps straight to the M2M screen. It now behaves like the framework tiles: it toggles selection so the user can switch to another tile, hides the name field (the M2M screen collects its own name), and turns the primary button into Next, which routes to the machine-to-machine setup screen. ref DEV-2392
Right-align the machine-to-machine screen's buttons to match the wizard, and make them a Back button that returns to the framework grid plus a primary Create application button (was a single left-aligned Save). Remove the now unused .buttons style. ref DEV-2392
Clarify what the Other OIDC/SAML compatible tile is for by giving a concrete example. ref DEV-2392
"Integrations · other" read awkwardly; "Other" is a clean catch-all alongside Website and Mobile · Desktop. ref DEV-2392
Match the rest of the portal: the Create Application wizard and the machine-to-machine screen now left-align their footer buttons with the primary action on the left and the secondary (Cancel / Back) on the right, instead of right-aligning with the primary last. ref DEV-2392
The application name is now entered on the New Application (/add) screen for M2M applications too, then carried to the add-m2m screen via router state where it is shown read-only instead of as an editable input.
Generalize the starter-kit config model to support both .env files and JS-file edits (public/app.js), then add Vue (Vite .env) and Other SPAs (spa-js, public/app.js) catalog entries. Download URLs use HEAD.zip so they work regardless of the repo's default branch.
Add a 'literal' config token (for a self-generated SESSION_SECRET placeholder) and parameterize the config file name so the step can reference .env.local. Add the Next.js catalog entry (public client, server callback redirect URI, npm install / npm run dev on :3000).
… run steps Generalize redirectURI to a redirectURIs list (authorized together in one click; step 2 pluralizes and lists them). Add an optional mobileRun to the kit and render 'Run on iOS' / 'Run on Android' steps after the web-test step, with the trailing step numbers computed dynamically. Add the Ionic catalog entry (native client, Capacitor build/run, ionic serve on :8100).
Configure via lib/constants.dart (reusing the const-assignment config format), single custom-scheme redirect URI, flutter pub get / flutter run. Make homepageUrl optional and add a device-launch variant of the start step for apps with no local web homepage.
Add a swift config format (static let in Constants.swift), make the install and start commands optional, and add an IDE run variant (open in Xcode). Step numbers are now derived from which optional steps are present, so iOS omits the install step and renumbers accordingly.
Add a kotlin config format (const val in Constants.kt), Android Studio as the IDE-run target (no install/start command), and broaden the IDE run wording to cover simulators and emulators.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Replaces the type-first "Create Application" screen with a framework-first wizard and builds out Quick Start tabs per client kind. The portal's OAuth-app management UX is redesigned around what the user is building (React, Django, iOS, etc.) instead of OAuth taxonomy.
Backend
x_frameworkfield onOAuthClientConfig(pkg/lib/config/oauth.go). JSON-schema enum of allowed framework ids. Nullable, additive, no migration needed. The auth server never branches on this field — it's a portal-only label.Portal — Create flow
Application→ new framework wizard at/configuration/apps/add,Machine-to-Machine→ extracted M2M flow at/configuration/apps/add-m2m.ChoiceButtontiles (consistent with Login Methods). Picking a server framework reveals an inline Stage 2 ("OIDC tokens" / "Cookie session via reverse proxy") — defaults to OIDC tokens with the nginx docs link clickable below.frameworks.tsviaresolveType(stage2?). Submitting writes bothx_application_typeandx_framework.…/edit?tab=quick-start.Portal — App details
Type · Frameworksubline.Portal — Quick Start tab
A new tab for every framework-typed client (spa / traditional_webapp / native / confidential), in addition to the existing M2M Quick Start.
ChoiceButtongrid as the create wizard, filtered to same-type frameworks). Changes save on Apply viasaveWithState.other-oidcclients.Misc fixes / polish
repeat(auto-fill, minmax(240px, 1fr))so columns reflow on narrow viewports.ref DEV-2392
Related: DEV-2532 (richer per-framework Quick Start content) — out of scope here.
Test plan
🤖 Generated with Claude Code