XTransformer
Trình chỉnh sửa JSON aip-304-app dạng bảng cho macOS + Windows. Thay thế quy trình Google Sheets cũ — full CRUD cho Screens, Banners, Categories, Styles, Media, Countries với cam kết round-trip identity (file xuất ra giống hệt file đầu vào khi không có chỉnh sửa).
1. Cài đặt
macOS (Apple Silicon)
- Tải
release/XTransformer-0.1.0-arm64.dmg. - Mở DMG → kéo XTransformer.app vào thư mục Applications.
- Mở app lần đầu: chuột phải → Open → Open (vì app chưa được Apple notarize, Gatekeeper sẽ cảnh báo).
Windows (64-bit)
Chọn 1 trong 2:
| File | Khi nào dùng |
|---|---|
XTransformer-0.1.0-x64-setup.exe |
Cài cố định — chạy installer → chọn thư mục → tạo Desktop + Start Menu shortcut. |
XTransformer-0.1.0-x64-portable.exe |
Chạy thẳng từ USB / Downloads, không cài, không ghi registry. |
Lần đầu mở: Windows SmartScreen có thể chặn → click More info → Run anyway (vì .exe chưa có code-sign).
2. Cách dùng cơ bản
Mở và lưu file JSON
- Click Open JSON (hoặc
⌘O/Ctrl+O) → chọn fileaip-304-app-*.json. - App load file → mỗi entity hiện ở 1 tab riêng:
- Screens: danh sách màn hình của app
- Banners: banner trong từng screen
- Categories: nhóm style xếp theo screen
- Styles: style đầy đủ + cardPreviews
- Media: thư viện ảnh/video referenced
- Countries: country code i18n
- Meta: version + exportedAt
- Sửa trực tiếp trong bảng — mọi thay đổi tự validate realtime.
- Click Save JSON (
⌘S/Ctrl+S):- Nếu có lỗi validation → dialog hiện errors, phải sửa trước khi xuất.
- Nếu có warning → dialog hỏi xác nhận, vẫn cho xuất.
- Hiện diff (added / modified / deleted) trước khi ghi file.
Phím tắt
| Tổ hợp | Hành động |
|---|---|
⌘O / Ctrl+O |
Mở file JSON |
⌘S / Ctrl+S |
Lưu (chạy validate + diff) |
⌘⇧V / Ctrl+Shift+V |
Validate ngay |
Esc |
Đóng dialog đang mở |
Chỉnh sửa cell
- Text: click vào ô → gõ → Enter để commit, Esc để hủy.
- Foreign key (FK): dropdown chỉ liệt kê giá trị hợp lệ — không thể tạo dangling reference.
- Boolean: toggle.
- Tags: gõ tag → Enter, dùng
×để xóa.
Master-detail (Banners, Categories, Styles)
- Click mũi tên
▶đầu hàng để mở rộng row. - Detail panel cho phép sửa i18n titles/subtitles theo countryCode, style refs (Categories), card previews (Styles).
Bộ lọc theo Banner action
- Banner.action chỉ nhận 2 giá trị:
CATEGORYhoặcSTYLE. - Đổi action sẽ tự xóa FK đối ngược (chọn CATEGORY → styleCode về null, ngược lại).
- Cột được dùng (Category hoặc Style) sẽ highlight vàng; cột không dùng mờ đi.
Validation
- Status bar đáy màn hình hiện số
errors / warningsrealtime. - Click vào chip màu để mở Validation dialog xem chi tiết.
- Errors block xuất file; warnings chỉ cảnh báo.
Autosave
- Mỗi 5 giây khi có thay đổi chưa lưu, app backup vào localStorage.
- Mở app lần sau nếu phát hiện draft → prompt Restore / Discard.
3. Upload media lên CMS
Tích hợp Strapi CMS để upload ảnh/file thay vì phải vào trình duyệt → upload thủ công → copy URL → paste.
Setup lần đầu
- Tab Media → click ⚙ Settings.
- Confirm Base URL (mặc định
https://cms.aperogroup.ai) → Save URL. - Click Sign in to Strapi → cửa sổ login mở ra → đăng nhập Google bằng tài khoản công ty.
- App tự thu thập JWT-looking tokens trong localStorage/sessionStorage/cookies/URL của cửa sổ login → test từng cái với
/upload/folders→ cái nào trả 200 sẽ được lưu. - Nếu auto-detect fail → hiện danh sách candidates để pick thủ công, hoặc dán token trực tiếp từ DevTools.
- Set Default upload folder từ dropdown (có search theo tên).
Upload
- Tab Media → click ☁ Upload to CMS (hoặc dialog tự mở khi chưa đăng nhập).
- Chọn folder đích (dropdown có search — gõ tên folder).
- Pick file: hỗ trợ chọn nhiều file cùng lúc (
⌘/Ctrl+ click), mọi định dạng (image, video, zip, json, etc.). - Click Upload N files → progress bar realtime, mỗi file có status: ⏱ pending → ⟳ uploading → ✓ done / ⚠ error.
- File upload thành công → tự thêm row mới vào Media table với
strapi_id,url,name,mimeđã fill, highlight vàng 60 giây để dễ nhận.
Đổi tài khoản Google
Trong Settings → click Switch account → app xóa cookies/storage của cửa sổ login → lần sign-in sau Google sẽ hiện lại màn chọn account.
Fallback dán token thủ công
Nếu Strapi setup khác lạ làm auto-detect fail:
- Đăng nhập Strapi trong browser bình thường.
- DevTools → Application → Local Storage →
https://cms.aperogroup.ai. - Tìm key có giá trị dạng
eyJhbGci...(JWT). - Settings → Paste token manually → dán → Save token.
4. Build & phát triển
# Cài dependencies
npm install
# Chạy dev mode (hot reload)
npm run dev
# Build production bundle
npm run build
# Type check
npm run typecheck
# Chạy test (Vitest round-trip)
npm test
# Đóng gói installer
npm run package:mac # → release/XTransformer-*-arm64.dmg
npm run package:win # → release/XTransformer-*-x64-setup.exe + portable
npm run package:all # cả 2
5. Kiến trúc tóm tắt
src/
├── main/ Electron main process (file dialogs, IPC, Strapi handlers)
├── preload/ contextBridge (window.api)
└── renderer/ React app
├── lib/ schema · import · export · validate (port từ Sheets tool)
├── store/ Zustand (editor + diff-tracker + autosave + Strapi config)
├── components/ data-table · cells · dialogs · upload · folder-picker
└── pages/ 1 tab cho mỗi entity group
Tech stack: Electron 33 · Vite 5 · React 18 + TypeScript 5 · TanStack Table v8 · Tailwind 3 · Zustand 5 · Zod · Vitest · electron-builder
6. Không thuộc phạm vi (out of scope)
- Multi-user collab (single-user only)
- Cloud sync / backend riêng
- Schema editor (schema khoá ở
aip-304-app v1.0) - Sửa media trực tiếp (chỉ link URL)
- i18n cho UI app (chỉ data có i18n, UI dùng tiếng Anh)
- Code signing / notarization (skip cho nội bộ)
Made by Bạch Tử Hoạ