Skip to content

Dev#522

Merged
mayanayza merged 86 commits intomainfrom
dev
Mar 5, 2026
Merged

Dev#522
mayanayza merged 86 commits intomainfrom
dev

Conversation

@mayanayza
Copy link
Collaborator

No description provided.

mayanayza added 30 commits March 3, 2026 19:44
- 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
mayanayza and others added 28 commits March 4, 2026 20:08
- 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant