Conversation
- SnmpCredentialDisplay: remove redundant version from description - UserApiKeyCard: permissions and networks as colored tags - DaemonCard: remove Created field, Docker Socket as text, fix Interfaces With empty state to use emptyText pattern - InviteCard: email as title, yellow "Pending Invite" status badge - InterfaceBindingDisplay/PortBindingDisplay: entity-specific icons - Remove unused i18n keys (common_notApplicable, invites_sentTo)
- Add create_trial_subscription method that creates a trialing subscription directly via the Stripe API instead of redirecting to an empty Checkout page - Route trial-eligible users (both first-time and existing with free plan) through direct subscription creation - Trial ends without payment → Stripe auto-cancels → existing webhook downgrades to Free - Non-trial and returning customer flows unchanged
…textual highlighting
- Add card-based plan layout with responsive grid (1/2/auto-fit columns)
- Add pricing simulator with stepper controls for addon seats/networks
- Show estimated total inline when extras are adjusted
- Use backend-computed incremental features and previous tier (no frontend plan ordering)
- Add feature-contextual plan highlighting via upgradeContext store
- Include trial duration in CTA button text ("Start 7-day free trial")
- Handle self-hosted plans with "Key features:" instead of incremental framing
- Add PartialOrd on BillingPlanDiscriminants for tier ordering
- Add minimum_plan to Feature metadata for upgrade CTAs
- Sync BillingPlanMetadata.features with actual backend struct fields
- Update UpgradeButton callers to use typed feature IDs
- Regenerate billing-plans.json and features.json with new metadata fields
- Remove stale -next.json intermediary fixture files
- Add EntityTag component with hover popover (shows Display component) and click-to-navigate (opens entity's edit modal or parent modal tab) - Add Popover component (portal-based, dismisses on scroll/escape/click) - Add entity-ui-config module mapping EntityDiscriminants to tab IDs, modal names, display components, and parent entity config - Add navigateToEntity() to modal-registry for entity navigation - Add EntityRef type and entityRef() helper to CardFieldItem - Add pill prop to Tag.svelte (rounded-full for interactive tags) - Wire entityRef into all card components: HostCard, ServiceCard, NetworkCard, DaemonCard, GroupCard, ShareCard, UserCard - Replace static Tags with EntityTags in IfEntryConfigPanel and InterfaceConfigPanel for actionable modal panel tags
- InterfaceDisplay.getLabel now matches formatInterface() output
("name: IP" or just "IP"), getDescription shows MAC only
- Sidebar NavItem gets entityType field, baseNavConfig entries
reference entityUIConfig for tab IDs (single source of truth)
- Fix email check error handling to show generic error instead of misleading "email in use" on network failures - Improve UX copy: "Checking..." spinner, active checklist labels, specific inquiry response time, daemon install reassurance - Add prerequisites to feature nudges (Tags, API, Share require prior milestones before showing) - Lower in-app upgrade threshold from 100% to 80% plan usage - Add absolute trial end date display in billing settings - Add confetti celebration on checklist completion - Add i18n empty state messages for discovery tabs - Add "No credit card required" trust signal on onboarding - Defer role/company-size collection from signup to post-activation ProfilePrompt (new component on Home page) - Add ProfileCompleted onboarding milestone and POST /api/auth/profile endpoint with Brevo sync - Reorder registration modal: OIDC buttons first, email second - Add approaching-limit warnings on Host and Network tabs - Embed demo topology on Home page before first topology rebuild - Add payment failed and payment action required email templates
Cloud deployment always has Brevo, so has_email_opt_in was redundant. Use deployment_type === 'cloud' as the sole environment check.
- Stronger popover drop shadow for better visibility against dark cards - Move Docker Socket from tags to description in DaemonDisplay, freeing space for subnet CIDR tags - Fix modal-to-modal navigation: add entity-switch branch to all 10 Tab deep-link effects so clicking a tag navigates within an open modal - Add SNMP enablement status to NetworkDisplay (description + tag) - Show service definition name in ServiceDisplay when it differs from service name - Make UserApiKeyCard network tags interactive with entityRef - Add entityRef to Display component tags (Interface→Subnet, Host→Service, Daemon→Subnet) with disablePopover to prevent recursion - Add staticTags prop to ListSelectItem; RichSelect passes it to keep dropdown tags non-interactive
- Show yearly pricing as monthly equivalent with "billed yearly" text - Round discounted monthly price first in to_yearly() for clean division - Remove Free plan from Commercial toggle (stays on Personal/All) - Move addon pricing text under resource label (left-aligned) - Add plan name column headers to feature comparison grid - Add feature description tooltips on plan cards and comparison grid - Auto-select "All Plans" tab when contextual highlight plan is set - Regenerate fixtures with Free plan incremental_features
… analytics - Restructure RegisterModal to 3 sub-steps (method/email/password) with OIDC providers shown first, email as secondary option - Suppress CookieConsent on /share/ pages (covers both share + embed) - Add AnalyticsEvent type + EventBus support for server-side tracking - Publish topology_share_viewed / topology_embed_viewed from share handler via PostHog subscriber - Remove frontend trackEvent calls from ShareView to avoid double-counting now that backend handles it
- Add resolveModalDeepLink<T>() pure helper to modal-registry.ts - Replace ~20-line $effect blocks in 10 Tab components with 5-line calls - ServiceTab uses validate callback for serviceHosts check - Add 14 unit tests covering all branches of the helper
form.state.values.terms_accepted is not reactive outside a form.Subscribe wrapper, so checking the terms checkbox was not enabling the OIDC and email buttons.
- Add activate_free_plan() to billing service that sets plan and status on the org without creating a Stripe checkout session - Route first-time Free plan selection through new method instead of falling through to create_checkout_session - Publish PlanSelected and CheckoutCompleted events to maintain onboarding and email automation parity
- Add CSS-only styled tooltips for feature descriptions (replaces invisible native title tooltips) - Label coming-soon features with gray check + "Soon" tag in cards - Sort card feature lists by category (Support/Enterprise last) - Integrate estimated total into top-line price instead of separate section when extras are added - Show "X included" count in seat/network/host addon pricing labels - Clear stale upgradeContext when opening billing modal from non-UpgradeButton paths (BillingTab, Sidebar, FeatureNudges) - Reduce card grid minmax/padding/gap so all 6 plans fit on desktop
- OIDC/email buttons use btn-primary for clearer enable/disable state - Demo embed uses relative URLs for local testing - Checklist renders when complete so confetti can fire - Discovery history filters to historical-only for empty state - Feature nudges show without checklist completion gate - ProfilePrompt uses TanStack forms + SelectInput pattern - Daemon install email reassurance moved above OS instructions - Host/network limit warnings include UpgradeButton CTA
- Add 150ms grace period on EntityTag mouse leave so users can hover into the popover to interact with it (copy text, etc.) - Close current modal when a different named modal opens via modalState, fixing modal-on-modal stacking issue - Replace plain text daemon/network fields in all 3 discovery cards with interactive EntityTag components - Replace ServiceCard subtitle with Host EntityTag field and remove Match Confidence field from card and display - Add fallback in navigateToEntity to navigate to tab when entity has no modal (fixes daemon click doing nothing) - Remove unused i18n keys for removed match confidence fields
- Resolve JSON conflicts by accepting branch versions - Fix UpgradeButton feature strings for near-limit state - Regenerate types
- Add planJustActivated flag to suppress needsPlanSelection before TanStack Query reactive update propagates from setQueryData - Recategorize features and add CSV export as a feature - Fix UpgradeButton feature strings for near-limit state
- Fix back-to-tab navigation: remove state.name guard from GenericModal effect so closeModal() triggers onClose() - Back button now shows destination: "Back to Hosts" (tab) or "Back to Host unifi-controller" (modal, with "Edit" stripped) - Extract TAB_LABELS to entity-ui-config.ts as single source of truth for tab display names, used by both Sidebar and back nav - Remove duplicate hardcoded labels from Sidebar (now references TAB_LABELS) and modal-registry (now imports TAB_LABELS)
- Replace optimistic setQueryData with invalidateQueries so org refetch completes before modal closes, preventing reactive reopen - Remove $effect that reset planJustActivated flag (could race) - Move register email step back button to modal footer with btn-secondary style
- Change Content-Security-Policy-Report-Only to Content-Security-Policy - Remove redundant frame_ancestors layer (now covered by full CSP) - All CSP directives unchanged
- Extend fixture generation to produce all 11 metadata categories - Initialize metadata store from static imports at module level - Remove getMetadata() API call from app init and share view - Remove get_metadata_registry handler and route entirely - Remove /api/metadata from rate limit exempt paths - Clean up stale -next.json intermediary files
- Add subtle category headers in incremental features list by detecting category transitions and inserting uppercase labels - Sort comparison table features within each category by how many plans enable them (most-enabled first)
billing-plans.json is a curated subset for the billing modal (missing Demo, Team). The metadata store needs all variants to match what /api/metadata previously served. Generate a separate billing-plans-all.json from BillingPlan::iter() for the store.
- Remove mv commands for billing-plans-next.json and features-next.json (fixture test now writes directly to final filenames) - Use glob ui/src/lib/data/*.json to capture all metadata fixtures
9 tasks
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.
No description provided.