diff --git a/TASK_LOG.csv b/TASK_LOG.csv new file mode 100644 index 0000000..e094193 --- /dev/null +++ b/TASK_LOG.csv @@ -0,0 +1,8 @@ +"Mã Task","Sprint","Type","Component","Module/Page","Summary","AC","Deadline","Status","Note","Assignee" +"3155","—","Task","Home","Hero Section","Chuyển vị trí tổ chức sang Hà Nội","Hiển thị đúng ""Hà Nội / Hanoi"" trên trang chủ và sponsor (cả Anh/Việt)","14/7/2026","hoàn thành","—","Toàn" +"3155","—","Task","Home","Partners Carousel","Bổ sung đối tác IEAS vào carousel","Logo IEAS hiển thị ở vị trí đầu tiên hàng 1 carousel","14/7/2026","hoàn thành","—","Toàn" +"3155","—","Task","Home","Agenda Section","Bổ sung hình đại diện của người phát biểu","Avatar hiển thị đối xứng theo timeline, căn giữa dọc với text mô tả, responsive trên mobile","14/7/2026","hoàn thành","—","Toàn" +"3155","—","Task","Home","Feedback Page","Generate QR Code trang feedback","Sinh 2 ảnh QR (local+prod) trỏ vào đúng URL. Lưu vào public/assets/img và 1 bản gửi qua email","14/7/2026","hoàn thành","—","Toàn" +"3168","—","Task","Home","Agenda Section","Cập nhật thông tin agenda, speaker","Cập nhật đúng thời gian biểu, bổ sung các bài phát biểu mới và hình ảnh đại diện của diễn giả (cả Anh/Việt)","18/7/2026","hoàn thành","—","Toàn" +"3168","—","Task","Home","Agenda Section","Khôi phục cấu trúc Agenda cũ (loại bỏ IEAS)","Gỡ bỏ các bài phát biểu của đối tác IEAS và đưa khung giờ sự kiện về 8:30 AM","18/7/2026","hoàn thành","—","Toàn" +"3168","—","Task","Home","Partners Carousel","Tạm ẩn logo đối tác IEAS khỏi carousel","Comment out logo IEAS, không hiển thị trên trang chủ","18/7/2026","hoàn thành","—","Toàn" \ No newline at end of file diff --git a/TASK_LOG.md b/TASK_LOG.md new file mode 100644 index 0000000..2688216 --- /dev/null +++ b/TASK_LOG.md @@ -0,0 +1,27 @@ +# IPv6 Enhanced 2026 — Task & Feedback Log + +> **Ngày tạo:** 2026-07-14 +> **Cập nhật lần cuối:** 2026-07-18 + +--- + +## Quy định chung (Definition of Done - DoD) + +- [X] Code đã được review +- [X] Test pass trên môi trường staging +- [X] Không có lỗi console +- [ ] Đã thông báo QA sau khi deploy + +--- + +## Bảng Task / Feedback + +| Mã Task | Sprint | Type | Component | Module/Page | Summary | AC | Deadline | Status | Note | Assignee | +| :---: | :---: | :---: | :--- | :--- | :--- | :--- | :---: | :---: | :--- | :---: | +| 3155 | — | Task | Home | Hero Section | Chuyển vị trí tổ chức sang Hà Nội | Hiển thị đúng "Hà Nội / Hanoi" trên trang chủ và sponsor (cả Anh/Việt) | 14/7/2026 | `[x]` | — | Toàn | +| 3155 | — | Task | Home | Partners Carousel | Bổ sung đối tác IEAS vào carousel | Logo IEAS hiển thị ở vị trí đầu tiên hàng 1 carousel | 14/7/2026 | `[x]` | — | Toàn | +| 3155 | — | Task | Home | Agenda Section | Bổ sung hình đại diện của người phát biểu | Avatar hiển thị đối xứng theo timeline, căn giữa dọc với text mô tả, responsive trên mobile | 14/7/2026 | `[x]` | — | Toàn | +| 3155 | — | Task | Home | Feedback Page | Generate QR Code trang feedback | Sinh 2 ảnh QR (local+prod) trỏ vào đúng URL. Lưu vào public/assets/img và 1 bản gửi qua email | 14/7/2026 | `[x]` | — | Toàn | +| 3168 | — | Task | Home | Agenda Section | Cập nhật thông tin agenda, speaker | Cập nhật đúng thời gian biểu, bổ sung các bài phát biểu mới và hình ảnh đại diện của diễn giả (cả Anh/Việt) | 18/7/2026 | `[x]` | — | Toàn | +| 3168 | — | Task | Home | Agenda Section | Khôi phục cấu trúc Agenda cũ (loại bỏ IEAS) | Gỡ bỏ các bài phát biểu của đối tác IEAS và đưa khung giờ sự kiện về 8:30 AM | 18/7/2026 | `[x]` | — | Toàn | +| 3168 | — | Task | Home | Partners Carousel | Tạm ẩn logo đối tác IEAS khỏi carousel | Comment out logo IEAS, không hiển thị trên trang chủ | 18/7/2026 | `[x]` | — | Toàn | diff --git a/app/components/home/PartnersCarousel.tsx b/app/components/home/PartnersCarousel.tsx index ba427c2..eb85d46 100644 --- a/app/components/home/PartnersCarousel.tsx +++ b/app/components/home/PartnersCarousel.tsx @@ -2,7 +2,7 @@ // Tên file chính xác trong public/assets/img/carousel/ const ROW_1 = [ - { name: "IEAS", file: "ieas.png" }, +// { name: "IEAS", file: "ieas.png" }, { name: "NVIDIA", file: "Nvidia_logo.svg.png" }, { name: "Maxis", file: "Maxis-logo.png" }, { name: "Singtel", file: "Singtel_logo.svg.png" }, diff --git a/package.json b/package.json index a6ff85b..567357b 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "test:watch": "vitest", "lint": "eslint", "db:seed": "tsx scripts/seed-summit-requests.ts", + "task:export": "tsx scripts/export-tasks.ts", "scss:build": "sass public/assets/scss/main.scss public/assets/css/main.css --style=expanded --source-map", "scss:watch": "sass --watch public/assets/scss/main.scss:public/assets/css/main.css --style=expanded --source-map" }, diff --git a/scripts/export-tasks.ts b/scripts/export-tasks.ts new file mode 100644 index 0000000..f4cd170 --- /dev/null +++ b/scripts/export-tasks.ts @@ -0,0 +1,63 @@ +import fs from 'fs'; +import path from 'path'; + +function convertMarkdownTableToCsv() { + const mdPath = path.join(__dirname, '../TASK_LOG.md'); + const csvPath = path.join(__dirname, '../TASK_LOG.csv'); + + if (!fs.existsSync(mdPath)) { + console.error('Không tìm thấy file TASK_LOG.md'); + return; + } + + const content = fs.readFileSync(mdPath, 'utf-8'); + const lines = content.split(/\r?\n/); + const csvRows: string[] = []; + + for (const line of lines) { + const trimmed = line.trim(); + // Bảng Markdown bắt đầu bằng '|' + if (trimmed.startsWith('|')) { + // Bỏ qua dòng separator (ví dụ: | :---: | :---: |) + if (trimmed.includes('---')) { + continue; + } + + // Cắt dòng bằng kí tự '|' + const cells = trimmed.split('|'); + // split '|' của '| A | B |' sẽ ra ['', ' A ', ' B ', ''] + // Bỏ đi phần tử đầu tiên và cuối cùng + const dataCells = cells.slice(1, cells.length - 1); + + // Trim khoảng trắng và format lại từng cell + const formattedCells = dataCells.map((cell, index) => { + let value = cell.trim(); + + // Tự động chuyển đổi Status từ ký hiệu Markdown sang chữ thuần Tiếng Việt cho Excel (Cột Status có index là 8) + if (index === 8) { + if (value.includes('[x]')) { + value = 'hoàn thành'; + } else if (value.includes('[/]')) { + value = 'đang làm'; + } else if (value.includes('[ ]')) { + value = 'chưa làm'; + } + } + + // Escape dấu nháy kép nếu có + if (value.includes('"')) { + value = value.replace(/"/g, '""'); + } + // Bao quanh cell bằng dấu nháy kép để tránh lỗi dấu phẩy trong nội dung + return `"${value}"`; + }); + + csvRows.push(formattedCells.join(',')); + } + } + + fs.writeFileSync(csvPath, '\uFEFF' + csvRows.join('\n'), 'utf-8'); // Thêm BOM để Excel đọc đúng tiếng Việt có dấu + console.log(`Đã chuyển đổi thành công sang file: ${csvPath}`); +} + +convertMarkdownTableToCsv();