Commit Graph

11 Commits

Author SHA1 Message Date
tigerenwork a29010fd51 Add embedded Feishu web view for record pages; bump to 1.6
Workflow (流程) fields like 流转状态 are entirely outside the OpenAPI —
absent from record reads and silently ignored on writes (confirmed by
Feishu engineers in larksuite/openclaw-lark#35). To advance them without
leaving the app, the record page can now be rendered in an embedded
WKWebView window:

- FeishuWebView (persistent cookie store, feishu:// links routed to the
  system) in a reusable 1100x800 window via AppDelegate.openWebWindow
- Entry points: "Open in App" toolbar button in the detail view and
  "Open in App (Web)" in the popover row context menu
- Web content pins a min size — a bare WKWebView in a hosting controller
  collapses the window to ~1px

Also:
- Info.plist now uses $(MARKETING_VERSION)/$(CURRENT_PROJECT_VERSION) so
  the project generator is the single version source (it was hardcoded
  and overrode build settings)
- Version 1.5 -> 1.6
2026-09-08 14:07:25 +08:00
tigerenwork 72cff00f72 Add main window with bug detail view and in-app editing
Phase 1 — read-only detail experience:
- New main window (NavigationSplitView): searchable bug list sidebar with
  Active/All filter, detail pane with full metadata, description, and
  per-bug Open in Feishu / Copy Link
- Popover row click now opens the in-app detail (Open in Feishu kept via
  context menu and footer)
- Display extra table fields: module, source, flow status, fix notes
  (new field mappings with Chinese defaults), and screenshot attachments
  with in-app thumbnails (media download with bitablePerm extra auth)
- FieldMappings now decodes tolerantly so older persisted configs survive

Phase 2 — editing (status, fix notes, screenshots):
- OAuth scope upgraded from bitable:app:readonly to bitable:app
  (requires re-auth; permission errors prompt to reconnect)
- Status picker driven by live field metadata (option names + colors)
- Fix notes text editor with Save/Cancel
- Add screenshots: image picker -> media upload (upload_all) -> append
  file tokens to the record
- AttachmentLoader and BugEditService share one field-metadata cache

Note: flow status (流转状态) is a Bitable workflow/Stage field and cannot
be written via the OpenAPI; it stays read-only.
2026-09-08 11:11:16 +08:00
tigerenwork 244da37318 fix: 修复设置窗口无法置前的问题 2026-07-05 21:10:51 +08:00
tigerenwork 55d8b50f1d fix: 增强配置容错与启动稳定性,优化错误状态交互 2026-07-05 20:25:06 +08:00
tigerenwork 3f1367790e fix: timestamp auto-updates without triggering fetch on tray open
- Reverted auto-refresh on tray click (fetch only happens on schedule
  or manual Refresh button)
- Timestamp now uses TimelineView(.periodic) to auto-update every 30s:
  'Just now' → '1m ago' → '5m ago' → etc. without any user action

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-29 23:54:28 +08:00
tigerenwork 5b1811db10 fix: auto-refresh on tray click, widen 'Just now' to 60s
- Opening the popover now triggers a fetch (via PollerService.fetchNow
  which deduplicates if already in progress)
- 'Just now' now covers 0-60s, then switches to 'Xm ago'.
  Avoids the frozen-timer look since the text only updates on re-render.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-29 23:51:48 +08:00
tigerenwork 2f2a65f1f7 fix: show 'Just now' instead of '1s ago' after refresh
Replaced RelativeDateTimeFormatter with manual formatting:
<5s → 'Just now', <60s → 'Xs ago', <1h → 'Xm ago',
<1d → 'Xh ago', else 'Xd ago'.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-29 23:49:23 +08:00
tigerenwork 07ac29faa6 feat: show refresh icon + last-updated time in popover header
Header now always shows: ↻ 2m ago  (or 'Never' before first fetch).
Refresh spinner replaces the text while loading. More discoverable
than the bare relative timestamp that was there before.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-29 23:45:24 +08:00
tigerenwork 7590389a04 feat: add Quit button, extended polling intervals
- Popover footer now has a Quit button (power icon) to terminate the app
- Polling interval picker now includes 1h, 2h, 4h, and 1 day options

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-29 01:17:07 +08:00
tigerenwork 94a3d76af9 fix: badge shows active count, floating widget shows priorities, record URL deep link
1. Menu bar badge and floating widget now show total active bugs count
   (was showing unseen-only count). Unseen dot still works independently
   in the bug list rows.

2. Floating widget now shows priority breakdown:
   🐜 12  🔴3 🟡4 🔵2 ⚪3
   Each priority gets a colored dot + count. Only non-zero priorities shown.

3. Fixed Feishu record URL format: now uses query-parameter deep link
   /base/{appToken}?table={tableId}&record={recordId} instead of path
   segments, which opens the specific record row directly in Feishu.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-29 01:01:01 +08:00
tigerenwork d9d8ce3e46 feat: full macOS menu bar app implementation
SwiftUI macOS menu bar app for tracking Feishu Bitable bugs:
- Menu bar icon with active bug count badge
- Popover with bug list sorted by priority, click to open in Feishu
- Floating always-on-top widget (NSPanel, optional)
- OAuth 2.0 flow with Feishu Open API (user_access_token + refresh)
- PollerService with configurable interval (default 5 min)
- Diff engine detecting new bugs, status/priority/assignee changes
- Native macOS notifications (UserNotifications framework)
- Keychain-backed token storage
- Settings window with field mapping, polling interval, widget toggle
- Support for custom Bitable column name mappings
- Zero third-party dependencies

17 source files across Models/Services/Views/ViewModels/Utils layers.
Xcode project generated via scripts/generate_xcode_project.py.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-28 20:56:44 +08:00