Commit Graph

186 Commits

Author SHA1 Message Date
Ruslan Bakiev
d892d0c604 refactor: distribute types from crm-types.ts to owning composables
Each composable now owns its types and exports them. Other composables
import types from the owning composable. Deleted centralized crm-types.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:21:30 +07:00
Ruslan Bakiev
a4d8d81de9 refactor: decompose CrmWorkspaceApp.vue into 15 composables
Split the 6000+ line monolithic component into modular composables:
- crm-types.ts: shared types and utility functions
- useAuth, useContacts, useContactInboxes, useCalendar, useDeals,
  useDocuments, useFeed, useTimeline, usePilotChat, useCallAudio,
  usePins, useChangeReview, useCrmRealtime, useWorkspaceRouting
CrmWorkspaceApp.vue is now a thin orchestrator (~2500 lines) that
wires composables together with glue code, keeping template and
styles intact.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:05:01 +07:00
Ruslan Bakiev
e5ad3809e0 feat(calendar): flying label animation from card title to toolbar on zoom
The label (month name, week number, day label) now animates from its
position above the source card to the toolbar center on zoom-in, and
flies back from toolbar to the target card title on zoom-out. The
fly-rect rectangle no longer contains text — only skeleton placeholder
lines. Sibling card titles and week numbers also fade during zoom.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:03:16 +07:00
Ruslan Bakiev
00e036946c feat(calendar): move labels outside card borders for visual continuity
- Month names moved above month cards in year view (outside article border)
  Hidden in non-year views; toolbar shows context label instead
- Day labels (Mon 24, Tue 25) moved above day columns in week view
- Each card/column wrapped in flex container: title above, card below
- New .calendar-card-title CSS: 11px, 55% opacity, subtle label above card
- No duplicate headers: toolbar is the single source of current context

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:42:09 +07:00
Ruslan Bakiev
9505cecab2 feat(calendar): header continuity with week numbers + skeleton content in fly-rect
- Add ISO week numbers to the left of week rows in month view (8, 9, 10...)
  with spacer alignment on day-of-week headers
- Inject label + skeleton placeholder lines into fly-rect during zoom animations:
  zoom-in shows source label (month name / "Week N" / day name) + pulsing bars
  zoom-out shows target context label + skeleton
- Skeleton CSS uses pulse animation (0.8s alternate) for loading hint
- Non-scoped style block for dynamically injected innerHTML elements
- isoWeekNumber helper for ISO 8601 week calculation
- Extended MonthRow type with weekNumber property

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:28:31 +07:00
Ruslan Bakiev
77141978c5 feat(calendar): seamless zoom animation with clone-and-swap + full-area coverage
Zoom-in: fade siblings → fade source content → clone source style to fly-rect →
hide source → animate fly-rect to viewport → switch view → fade in new content.

Zoom-out: fade scene → show fly-rect at viewport → switch view → clone target
style → animate fly-rect to target → fade in scene.

Full-area: all views (month/week/day) now fill 100% of container height.
Month grid rows stretch equally, day cells fill row height, depth layers flex.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 11:56:42 +07:00
Ruslan Bakiev
227030b9ae feat(calendar): replace CSS-transform zoom with GSAP flying-rect animation and scope data to year
- Add CalendarDateRange input to GraphQL schema; server resolver now accepts from/to params
- Frontend query sends year-scoped date range variables reactively
- Rewrite zoom-in/zoom-out animations using GSAP flying-rect overlay (650ms vs 2400ms)
- Add flying-rect element to CrmCalendarPanel with proper CSS
- Remove old calendarSceneTransformStyle CSS-transition approach
- Add calendarKillTweens cleanup in onBeforeUnmount

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 11:41:35 +07:00
Ruslan Bakiev
638652b4d8 fix(calendar-lab): enable hover on grid cells by removing pointer-events block
Content overlay layer was intercepting mouse events (pointer-events: auto
with z-index: 5), preventing :hover from reaching the grid cells underneath.
Removed pointer-events: auto from .canvas-content-visible since the content
layer is purely visual and needs no click handling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 11:16:20 +07:00
Ruslan Bakiev
f553c26931 fix: add browserHttpEndpoint for client-side Apollo requests
The Apollo Client was using httpEndpoint (http://localhost:3000/api/graphql)
for browser requests, which fails on remote servers. Added browserHttpEndpoint
as relative URL "/api/graphql" so browser requests go to the correct origin.
Also added error logging to setInboxHidden mutation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:40:08 +07:00
Ruslan Bakiev
5657da13c1 feat(calendar-lab): add hover-targeted zoom with progressive tension and zoom slider
- Zoom animation now targets the hovered cell (not a fixed demo block)
- Progressive "pull" tension: cell scales 5%→10% over 2 scroll ticks
  before the full flying-rect animation triggers (400ms decay timeout)
- Added zoom slider in top-right toolbar matching production design
  (range 0-3 with dot markers, drives step-by-step zoom animations)
- Slider handles mid-drag target updates via sliderTarget variable

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:36:22 +07:00
Ruslan Bakiev
947ef4d56d refactor: migrate CRM data layer from manual gqlFetch to Apollo Client
Replace custom gqlFetch() with proper Apollo useQuery/useMutation hooks
powered by codegen-generated TypedDocumentNode types. Key changes:

- Add GraphQL SDL schema file and codegen config for typescript-vue-apollo
- Replace all 28 raw .graphql imports with generated typed documents
- Add 12 useQuery() hooks with cache-and-network fetch policy
- Add 17 useMutation() hooks with surgical refetchQueries per mutation
- Optimistic cache update for setContactInboxHidden (instant archive UX)
- Fix contact list subtitle: show lastText instead of channel name
- Migrate login page from gqlFetch to useMutation
- WebSocket realtime now calls Apollo refetch instead of full data reload

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:07:35 +07:00
Ruslan Bakiev
3e711a5533 fix(calendar-lab): rewrite zoom as GSAP flying-rect with proper async sequencing
- Replace panzoom + timeline approach with clean async/await GSAP tweens
- Flying rect morphs from cell position to full viewport (aspect ratio change)
- Fix zoomOut race condition: nested gsap.to inside tl.call fired outside timeline
- Fix opacity conflict: GSAP controls all opacity, CSS class only for pointer-events
- Fix gridLayerRef losing reference on :key remount during resize
- Make viewport dimensions reactive via ResizeObserver (vpWidth/vpHeight refs)
- Wait for fade-in completion before unlocking isAnimating

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-24 09:47:45 +07:00
Ruslan Bakiev
b316b024be feat(calendar-lab): replace tldraw with two-layer panzoom canvas
Drop tldraw/React dependency in favor of @panzoom/panzoom with a
two-layer architecture: outline rectangles (borders only) are zoomed
via CSS transforms while HTML content renders at native 1:1 scale
as a fade-in overlay — eliminating blur at any zoom level.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-24 01:09:46 +07:00
Ruslan Bakiev
1db8e58da1 fix(calendar-lab): rewrite tldraw zoom as LOD — render only current level shapes
Previous implementation created all ~589 shapes (year + months + weeks + days)
at once, causing visual chaos on load and broken zoom. New approach dynamically
creates/destroys shapes per level: year shows 12 months, month shows 6 weeks,
week shows 7 days, day shows time slots. Wheel prime pattern (2 ticks) prevents
accidental zooms. Double-click resets to year view.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-24 00:52:58 +07:00
Ruslan Bakiev
6cce211c0b fix(calendar-lab): use local tldraw runtime to avoid react/cdn instance mismatch 2026-02-23 19:47:57 +07:00
Ruslan Bakiev
c5d3a90413 refactor(voice): extract chat dictation into reusable component 2026-02-23 19:43:00 +07:00
Ruslan Bakiev
c1e8f912d1 fix(communications): restore voice dictation in message composer 2026-02-23 19:34:39 +07:00
Ruslan Bakiev
ed78532260 feat(calendar-lab): use tldraw canvas engine with nested zoom rectangles 2026-02-23 19:29:52 +07:00
Ruslan Bakiev
94d8d46693 fix telegram contact identity context for in/out messages 2026-02-23 19:28:03 +07:00
Ruslan Bakiev
79f1012f41 fix(calendar-lab): restore nested calendar canvas demo on zoom route 2026-02-23 19:22:14 +07:00
Ruslan Bakiev
faea65dfcb style(communications): show call play button only on waveform hover 2026-02-23 19:21:54 +07:00
Ruslan Bakiev
bb628a7c0d feat(calendar-lab): switch demo route to tldraw canvas preview 2026-02-23 18:48:34 +07:00
Ruslan Bakiev
2e1014d726 style(communications): center play control on call waveform 2026-02-23 18:44:35 +07:00
Ruslan Bakiev
5fb8113ed7 feat(communications): add play/pause for call voice messages 2026-02-23 18:42:21 +07:00
Ruslan Bakiev
2a3d18f326 compact pilot change summary row in sidebar 2026-02-23 18:37:44 +07:00
Ruslan Bakiev
0ed2a6b353 fix(calendar-lab): stabilize center fit and wheel direction 2026-02-23 18:26:07 +07:00
Ruslan Bakiev
179cc39d53 fix(calendar-lab): center panzoom fit on selected target 2026-02-23 18:19:09 +07:00
Ruslan Bakiev
6ab3b374a2 feat(calendar-lab): switch zoom scene to panzoom engine 2026-02-23 18:12:05 +07:00
Ruslan Bakiev
49c4757490 feat(calendar-lab): switch to hierarchical grid zoom mechanics 2026-02-23 18:03:27 +07:00
Ruslan Bakiev
67a186e916 feat(calendar-lab): render content only after zoom settle 2026-02-23 17:47:58 +07:00
Ruslan Bakiev
6d5402dcc1 feat(calendar-lab): amplify nested board zoom depth 2026-02-23 17:42:19 +07:00
Ruslan Bakiev
295b3a3dda fix(frontend): use exported toast-ui entry to fix nuxt build 2026-02-23 16:04:38 +07:00
Ruslan Bakiev
94c01516ba precompute call waveforms and stop list-time audio loading 2026-02-23 16:02:57 +07:00
Ruslan Bakiev
2eb2f3109c feat(calendar): add nested zoom lab page with four persistent levels 2026-02-23 15:57:12 +07:00
Ruslan Bakiev
6bc0bfa156 fix(documents): switch markdown editor to single-pane wysiwyg 2026-02-23 15:53:29 +07:00
Ruslan Bakiev
cb2d12819c fix(calendar): stretch year months grid to full viewport height 2026-02-23 15:39:09 +07:00
Ruslan Bakiev
0bbeef5594 fix(calendar): scope zoom selectors by layer and stretch week days to full height 2026-02-23 15:32:52 +07:00
Ruslan Bakiev
df8c06d313 refactor(review): rollback-only flow and compact change summary 2026-02-23 15:28:46 +07:00
Ruslan Bakiev
f716a0ea26 feat(documents): use toast-ui markdown rich editor 2026-02-23 15:23:58 +07:00
Ruslan Bakiev
7c019a6300 fix(calendar): keep depth layers mounted in one card without display swap 2026-02-23 14:58:52 +07:00
Ruslan Bakiev
ec94dd6e2a fix(calendar): zoom selected block first, then commit level 2026-02-23 14:56:11 +07:00
Ruslan Bakiev
40a225783d feat(documents): render markdown as rich text in editor 2026-02-23 14:54:03 +07:00
Ruslan Bakiev
60b9bb9fd1 remove contact company/country/location across db and ui 2026-02-23 14:52:26 +07:00
Ruslan Bakiev
f6b738352b fix(calendar): use full available calendar viewport height on desktop 2026-02-23 14:40:59 +07:00
Ruslan Bakiev
db49c4a830 fix(calendar): make nested block zoom smooth in both directions 2026-02-23 14:33:24 +07:00
Ruslan Bakiev
6ad53e64c5 feat(documents): delete document from context menu 2026-02-23 14:27:00 +07:00
Ruslan Bakiev
68cbe7bc64 fix(chat-ui): move source settings to thread header 2026-02-23 14:24:58 +07:00
Ruslan Bakiev
a19ba07baa fix(chat-ui): align voice cards by message direction 2026-02-23 12:52:33 +07:00
Ruslan Bakiev
894210cd42 fix(calendar): remove overlay swap and keep in-place zoom flow 2026-02-23 12:50:11 +07:00
Ruslan Bakiev
d3b751db65 refactor(graphql): replace dashboard query with resource queries 2026-02-23 12:46:29 +07:00