v9.2 follow-up: skip ms-word on Mac by default + sideload notes

- Web: ยิง ms-word:ofe คู่กับการดาวน์โหลดเฉพาะ non-Mac โดย default —
  บน Mac ไม่ยิงเพราะ Word 16.101+ เมิน URL แล้วเด้งหน้าเลือกไฟล์
  ทุกครั้งจนรำคาญ (override ด้วย NUXT_PUBLIC_OPEN_IN_WORD=on|off)
- CLAUDE.md: จดสูตร sideload บน Mac — ปิด Word ก่อน npm start
  (Word อ่าน manifest ตอน startup เท่านั้น), ปล่อย dev server รันทิ้ง,
  แก้โค้ดใช้ hot reload
- Spec/plan sync + web 60/60 + build; QA reviewer PASS (1 round,
  minors 3 — แก้ 2 ปฏิเสธ 1 พร้อมเหตุผล)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
Suphonchai Phoonsawat 2026-09-10 13:59:45 +07:00
parent ee4d8573ee
commit 83a949cfa0
7 changed files with 52 additions and 10 deletions

View file

@ -20,6 +20,8 @@ function mount() {
beforeEach(() => {
vi.stubGlobal('useApi', () => ({ apiJson }))
// default: auto — happy-dom ไม่ใช่ Mac UA จึงยิง ms-word ควบคู่ (แต่ละ test ที่ต้องการก็ stub ทับได้)
vi.stubGlobal('useRuntimeConfig', () => ({ public: { openInWord: '' } }))
tab = { opener: {}, closed: false, location: { replace }, close }
vi.spyOn(window, 'open').mockReturnValue(tab as unknown as Window)
})
@ -130,4 +132,28 @@ describe('version open lifecycle', () => {
expect(saved[1].href).toBe('https://files.example/second.docx')
expect(state.fallbackUrl.value).toBe('https://files.example/second.docx')
})
it('OPEN_IN_WORD=off: ไม่ยิง ms-word เลย — ดาวน์โหลดอย่างเดียว (Word 16.101+ บน Mac เด้งหน้าเลือกไฟล์ทุกครั้ง)', () => {
vi.stubGlobal('useRuntimeConfig', () => ({ public: { openInWord: 'off' } }))
const assign = vi.spyOn(window.location, 'assign').mockImplementation(() => {})
vi.spyOn(HTMLAnchorElement.prototype, 'click').mockImplementation(() => {})
const state = mount()
state.openDocxUrl('https://files.example/draft.docx')
expect(assign).not.toHaveBeenCalled()
expect(state.openNotice.value).not.toContain('อัตโนมัติ') // ข้อความไม่เกี้ยวเรื่องเปิดอัตโนมัติ
})
it('auto บน Mac: ไม่ยิง ms-word (default), override on แล้วยิงแม้บน Mac', () => {
vi.spyOn(window.navigator, 'platform', 'get').mockReturnValue('MacIntel')
let state = mount() // default '' → auto → Mac = ไม่ยิง
const assign = vi.spyOn(window.location, 'assign').mockImplementation(() => {})
vi.spyOn(HTMLAnchorElement.prototype, 'click').mockImplementation(() => {})
state.openDocxUrl('https://files.example/draft.docx')
expect(assign).not.toHaveBeenCalled()
app.unmount()
host.remove()
vi.stubGlobal('useRuntimeConfig', () => ({ public: { openInWord: 'on' } }))
state = mount()
state.openDocxUrl('https://files.example/draft.docx')
expect(assign).toHaveBeenCalledWith('ms-word:ofe|u|https://files.example/draft.docx')
})
})