Commit Graph

109 Commits

Author SHA1 Message Date
Matthew Meszaros 545dcea940 feat: show scheduled replies in threads
Add a thread_id filter for scheduled Unibox sends and expose a per-thread hook for the dashboard.

Render queued sends inline in ThreadView with cancellation, refreshing the thread, scheduled list, and overview caches after cancel.
2026-05-31 05:19:39 +00:00
Matthew Meszaros 2d11ed8166 feat: add mobile unibox scope picker
Expose the Unibox scope rail through a mobile sheet so smaller screens can switch between inbox scopes, mailboxes, tags, and scheduled views.

Simplify template rows in the reply composer to keep the picker compact.
2026-05-31 05:17:32 +00:00
Matthew Meszaros 6249d3e1a2 feat: refine unibox reply workflow
Open the reply composer only after the user chooses a message to reply to or forward, and wire per-message actions through the thread view.

Also clean up cancelled scheduled sends from Cloud Tasks on a best-effort basis while keeping the database status as the source of truth.
2026-05-31 05:14:22 +00:00
Matthew Meszaros 70bfa39163 feat: update unibox scheduled UI
Add scheduled-send scope, queued-send review and cancel flows, richer reply composer controls, snooze picker polish, and API client models for the new Unibox endpoints.
2026-05-31 04:26:46 +00:00
Matthew Meszaros bf40834557 feat: update unibox experience 2026-05-30 16:37:50 +00:00
Matthew Meszaros 4663333d2c feat: update billing and email settings 2026-05-30 15:45:10 +00:00
Matthew Meszaros a227938778 feat: seed unibox trial fixtures 2026-05-30 14:06:36 +00:00
Matthew Meszaros d08c984c42 feat: snapshot current dashboard changes 2026-05-30 13:56:27 +00:00
Matthew Meszaros 44c837d8ac Merge branch 'main' into feature/dashboard-plans
# Conflicts:
#	AGENTS.md
2026-05-30 09:49:12 +00:00
Matthew Meszaros b168f4d466 feat: simplify worker installer route 2026-05-30 09:37:26 +00:00
Matthew Meszaros e35a91f6bc feat: make worker enrollment default 2026-05-30 05:13:18 +00:00
Matthew Meszaros 60773b3d8e feat: make dashboard realtime 2026-05-30 04:17:10 +00:00
Matthew Meszaros 7f830b976f feat: sync org session, harden campaign loading, add mailbox bulk-remove 2026-05-30 03:42:39 +00:00
Matthew Meszaros b146417b50 chore: dashboard and plans 2026-05-29 16:42:05 +00:00
Matthew Meszaros ff763c4483 feat: add role and team-size onboarding questions and rework site SEO me 2026-05-29 14:47:16 +00:00
Matthew Meszaros 1d132ccd56 feat: rework auth layout for mobile sky backdrop and email pill 2026-05-29 09:57:59 +00:00
Matthew Meszaros 483e27270b feat: telegraph next slide via progress bar fill and fix panel blur 2026-05-29 09:44:19 +00:00
Matthew Meszaros bb7008c50a feat: pin logo to showcase pane and restructure auth layout 2026-05-29 06:11:18 +00:00
Matthew Meszaros 68022ad813 feat: rework auth showcase carousel and layout framing 2026-05-29 06:05:35 +00:00
Matthew Meszaros 6766031cc5 feat: add discount code support for checkout and plan changes 2026-05-29 05:49:19 +00:00
Matthew Meszaros e7ef328b2d Merge pull request #18 from warmbly/feature/admin-management
feat: admin management surface with overrides, ban scope, and throttles
2026-05-29 05:01:00 +02:00
Matt 93bb56a458 feat(limits): admin queue + customer request form + ToS clause
Three surfaces close the loop on the limit-increase workflow:

  - admin/dashboard/LimitRequestsPage.tsx queues every pending request
    with full context (org → users → field → current vs requested →
    +delta) and one-click approve/reject. Both actions open a review
    dialog; approve notes are optional, reject notes are required and
    surface to the customer.
  - web/settings/limits/page.tsx is the customer-facing form. Resource
    selector, requested value, reason textarea, plus a list of every
    past request with its status (pending/approved/rejected/cancelled)
    and the reviewer's notes when present. Pending rows expose a
    cancel link. Footer links to the ToS limits clause.
  - site/terms.astro grows a new section 07 ("Usage limits and
    increase requests"). Explicit: "unlimited" means no plan-tier cap
    but a product-wide hard ceiling still applies, increases are at
    Warmbly's sole discretion, and previously granted increases can be
    revoked when reputation signals deteriorate. Bumps every existing
    section heading and id from 07 onward.

Admin sidebar grows a "Limit requests" entry under Accounts (Gauge
icon). Web settings layout grows a "Limits" section under owner-only
sections.
2026-05-28 12:16:02 +02:00
Matt d86029fcc0 refactor(web): align integrations dashboard with new catalog
Removes DMARC reports, DNS verifier, Postmaster snapshots, and DNS
verifications from the dashboard. Adds connect-drawer fields for the
new catalog set (HubSpot, Salesforce, Pipedrive, Close, Zapier, Make,
n8n, Slack, Discord), keeps Calendly, Cal.com, and Google Sheets.
Category order is now CRM, Automation, Notifications, Meetings, Data.
2026-05-28 08:56:18 +02:00
Matt 33fffbacbb feat(integration): dashboard page in existing theme
New /app/integrations route with sidebar entry. Page uses the existing
Page / StatStrip / SectionBar primitives — catalog cards grouped by
category (Deliverability, DNS, Meetings, Data), connect/disconnect
inline drawer per provider, inbound-URL modal that surfaces the
per-org webhook URL once, DMARC reports list, meeting bookings list,
and a DNS verifier widget that resolves SPF / DKIM / DMARC / tracking
CNAME inline.
2026-05-28 08:26:54 +02:00
Matt 679c9a44d2 feat(integration): web API client + hooks for integrations surface
Mirrors the backend models in TypeScript and adds React-Query hooks for
catalog, connections, DMARC reports, meeting bookings, DNS verifications,
and the connect / disconnect / verify mutations.
2026-05-28 08:20:54 +02:00
Matthew Meszaros c790812207 Merge pull request #11 from warmbly/feature/api-keys-dashboard
feat: ship api keys dashboard with smart limits and analytics
2026-05-25 12:26:54 +02:00
Matthew Meszaros e38d571610 Merge pull request #12 from warmbly/feature/campaign-creation-overhaul
feat: fix campaign creation 500 and ship full-config wizard
2026-05-25 12:26:44 +02:00
Matthew Meszaros 30a1138583 feat: smart contact activity tab — search, date range, infinite scroll
- useContactTimeline now uses cursor-based useInfiniteQuery (50/page,
  before=oldest cached at) instead of a one-shot fetch
- search input filters subject/content/campaign/sequence/mailbox/
  reason/intent; matches are highlighted in the row
- date range picker (popover with from/to + 7/30/90d presets) filters
  the visible list by event timestamp
- segmented type chips with motion indicator
- IntersectionObserver sentinel auto-fetches next page as user scrolls
- when filters narrow the visible set, lazy-prefetch more pages so
  results aren't artificially short (bounded to 250 events / 5 pages)
- skeleton rows with staggered pulse on first load, inline spinner on
  subsequent page loads, "end of history" marker when done
2026-05-25 09:12:20 +00:00
Matthew Meszaros 149825783e refactor: simplify contact activity tab to match monochrome theme
- drop colored timeline rail and per-type dot colors
- collapse per-event bordered cards into one bordered list container
  with divided rows (matches Overview's "Latest activity" treatment)
- segmented filter strip with motion indicator, matches main tab strip
- quote-style left border for body content (notes, reply snippets)
  instead of a free-floating block
2026-05-25 09:06:17 +00:00
Matthew Meszaros ae091ec28e refactor: simplify contact slide-over to match app's monochrome theme
- solid slate-100 round avatar with slate-700 initials (no gradient)
- single contextual status pill only when something is off
  (suppressed/unsubscribed); no chip when everything's fine
- text-only segmented tab strip, drop icons + side tint band
- flat stat tiles, no gradient hero variant
- keep animated motion indicator on tabs and email copy affordance
2026-05-25 09:04:56 +00:00
Matthew Meszaros d15e3c3c9b feat: redesign contact slide-over header and tab switcher
- gradient avatar deterministically colored by email
- bigger display name, copy-email affordance, status + company chips
- segmented tab strip with icons and animated motion indicator
- 34rem panel, deeper shadow, subtle tinted body background
2026-05-25 08:59:29 +00:00
Matthew Meszaros dd58de3a93 feat: tabbed contact 360 slide-over with overview, activity, notes 2026-05-25 08:39:09 +00:00
Matthew Meszaros 2170b86106 fix: stop import 500 by installing no-op audit service and drop redundant banner 2026-05-25 06:19:22 +00:00
Matthew Meszaros b6c5081a1f fix: surface real backend error on import commit instead of generic failure 2026-05-25 06:08:33 +00:00
Matthew Meszaros be6596d4ad fix: import custom-field mapping and dropdown clipping in scroll containers 2026-05-25 05:43:58 +00:00
Matthew Meszaros d28df0d27d feat: edit contact categories in detail view, fix dropdown outside-click in slide-over 2026-05-25 05:28:41 +00:00
Matthew Meszaros 6a070b6e59 fix: stop /onboarding ping-ponging with /app/emails via authlayout guard 2026-05-25 04:51:09 +00:00
Matthew Meszaros adb8b703a6 fix: stop orggate from looping navigate() to /select-org after login 2026-05-25 04:43:06 +00:00
Matthew Meszaros b94134bce7 fix: guard /select-org and /auth, give dev backend a lenient healthcheck 2026-05-25 03:57:02 +00:00
Matthew Meszaros 13e9fc5635 fix: load user on select-org so log out footer renders 2026-05-25 03:32:56 +00:00
Matthew Meszaros 7a9b1d6f28 feat: add log out button to workspace selector 2026-05-25 03:30:12 +00:00
Matthew Meszaros 3a55d317ae fix: log out and switch workspace properly via the server 2026-05-24 16:57:59 +00:00
Matthew Meszaros 5a2128890b feat: contacts power-tools UI (categories, export dialog, import wizard) 2026-05-24 16:17:03 +00:00
Matthew Meszaros 03dc3bce95 feat: overhaul campaign creation with atomic transactional create + multi-step wizard
- fix 500 on POST /campaigns: insert now sets NOT NULL created_at/updated_at
- atomic create writes campaign + sequences + ab variants + tag/folder links + advanced overrides in one tx
- create accepts full optional config (schedule, sender pool, tracking, sequences, variants)
- handler forwards orgID so future start/stop and org-scoped routes resolve
- fix Get/GetByID joining campaign_email_tags/campaign_folders on wrong column
- publish CAMPAIGN_CREATED realtime event after successful create
- replace name+description modal with 4-step wizard (basics, schedule, sender pool, first email + follow-ups)
2026-05-24 16:13:22 +00:00
Matthew Meszaros 9123c4bfcf feat: full api keys product (smart limits, analytics, dashboard) 2026-05-24 16:07:18 +00:00
Matthew Meszaros 64341064cf feat(web): preset templates picker in new-template editor 2026-05-24 15:11:55 +00:00
Matthew Meszaros 9bce2ad29e feat: full reply templates (search/reorder/duplicate/render + UI) 2026-05-24 12:01:37 +00:00
Matthew Meszaros 939f2160d9 Merge pull request #6 from warmbly/feature/redesign-email-onboarding
ci: fix CI permissions, add web pipeline, prune go linters
2026-05-24 13:26:25 +02:00
Matthew Meszaros cde1646338 fix(web): compact smtp/imap form, host+port in one bordered input 2026-05-24 05:01:21 +00:00
Matthew Meszaros edf8a0c5a6 feat(web): smtp/imap form with vertical labels, icon-tile sections, fixed-width port 2026-05-24 04:55:31 +00:00