Commit Graph
257 Commits
Author SHA1 Message Date
Maulana SodiqinandClaude Opus 4.6 63dfb7299f feat(backoffice): redesign backoffice UI dengan shadcn/ui
Menyeluruh merancang ulang apps/backoffice memakai pola shadcn/ui sambil
mempertahankan seluruh palette warna existing (primary/neutral/success/
info/warning/danger) dan typography Bai Jamjuree.

UI library (libs/ui):
- Atoms existing (Button, Input, Label, Textarea, Card, Dialog, Drawer,
  Form, Select, Toggle) dirombak ke pola shadcn, API dipertahankan agar
  sibling apps (gacha, dimentorin, hackathon, qrcampaign) tidak break
- Select atom beralih dari native ke Radix Select + NativeSelect fallback
- 18 atom baru: Badge, Avatar, Separator, Skeleton, Tabs, Tooltip,
  DropdownMenu, Popover, AlertDialog, Checkbox, RadioGroup, Switch,
  ScrollArea, Sheet, Sidebar, Breadcrumb, Table, + use-mobile hook
- DataTable, Filter, BackofficeWrapper, Pagination, Modal (alias Dialog)
  direstyle dengan token baru
- CSS variable layer shadcn ditambahkan (--color-primary, --color-sidebar-*,
  dll) dipetakan ke palette existing; tw-animate-css di-import untuk
  transisi

Backoffice shell:
- Sidebar bersarang SidebarProvider + SidebarInset, built-in mobile Sheet,
  user DropdownMenu (Avatar + logout), ikon lucide-react

Pages redesign (19 list/dashboard/settings):
- accounts, cms-events, cms-testimonials, dashboard, dashboard-dimentorin
  (dengan recharts di Card), feedback-review-dimentorin, gacha-roll,
  hackathon-dashboard, hackathon-submissions, hackathon-teams,
  hackathon-users, permissions, prizes, roadmap-dimentorin, roles,
  session-dimentorin, settings-dimentorin (Tabs), transactions,
  users-dimentorin (Tabs mentor/mentee)
- Pola unified: BackofficeWrapper > Card (CardHeader toolbar + CardContent
  DataTable) + AlertDialog untuk delete confirm
- Form accounts_/$id diredesign; form pages lain tetap pakai
  ControlledInputField yang sekarang berbasis shadcn Input

Dependencies:
- +20 radix-ui primitives, lucide-react, cmdk, input-otp
- Select native patched di dimentorin (profile-sidebar, schedule step)
  untuk tetap kompatibel via NativeSelect alias

Verifikasi:
- nx build backoffice: sukses (2.33s, 4801 modules)
- nx build dimentorin/gacha/hackathon/qrcampaign: semua sukses (zero
  regresi dari rewrite libs/ui)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:01:47 +07:00
maulanasdqn 53079fe868 refactor: move backoffice sidebar from shared libs to app-local component 2026-04-12 00:11:04 +07:00
maulanasdqnandClaude Opus 4.6 2944a2b98a chore: remove dead code and unused dependencies
Deleted:
- libs/utils/src/react-router/ — old file-based routing system (replaced by TanStack Router)
- next-themes dependency (unused since Astro migration)
- react-router-dom from vite external config

Cleaned:
- Removed react-router barrel export from utils/index.ts
- Kept landing data files (still used by Astro components)
- Kept QueryProvider and ModalLoginProvider (still used by apps)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 23:37:28 +07:00
maulanasdqn 79f087e2fc fix: replace beforeLoad redirect with client-side navigate on backoffice index route 2026-04-11 23:24:59 +07:00
maulanasdqnandClaude Opus 4.6 d5b267332f fix: generate route trees and fix build errors for all apps
- Generated routeTree.gen.ts for all 6 apps (was empty placeholder)
- Fixed className backtick syntax in roles create/edit pages
- Fixed unescaped quote in dimentorin settings FAQ
- Route trees enable proper SPA navigation (no more full page reloads)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:53:17 +07:00
maulanasdqnandClaude Opus 4.6 b2ed098067 feat: integrate dimentorin pages with real API, convert modals to pages
Roadmap: integrated with /v1/landing/cms/roadmap API (was dummy data)
- Created roadmap service layer (types, API, hooks)
- List page with search/filter, create/edit as dedicated pages

Session: converted modal detail to dedicated /session-dimentorin/$id page
Users: converted modal detail/delete to dedicated /users-dimentorin/$id page

Deleted all dimentorin modal components (roadmap, session, users).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:19:06 +07:00
maulanasdqnandClaude Opus 4.6 8749e83dad feat: convert all backoffice CRUD from modals to dedicated pages
Replaced modal-based create/edit/delete with dedicated TanStack Router
pages for 7 modules:

- Roles: /roles, /roles/create, /roles/$id
- Permissions: /permissions, /permissions/create, /permissions/$id
- CMS Events: /cms-events, /cms-events/create, /cms-events/$id
- CMS Testimonials: /cms-testimonials, /cms-testimonials/create, /cms-testimonials/$id
- Accounts: /accounts, /accounts/$id
- Gacha Dashboard: /dashboard, /dashboard/create, /dashboard/$id
- Gacha Rolls: /gacha-roll, /gacha-roll/create, /gacha-roll/$id

Each module now has:
- List page with DataTable + inline delete confirmation
- Dedicated create page with form + back navigation
- Dedicated edit page with pre-filled form + back navigation
- No more modals for CRUD operations

Deleted 21 modal component files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:02:57 +07:00
maulanasdqn 00b0997a9b chore: remove unused useSearch import from hackathon-users 2026-04-11 20:49:55 +07:00
maulanasdqn e78002ff69 fix: handle nested data.data response from hackathon admin API 2026-04-11 18:11:07 +07:00
maulanasdqn b48f653a97 fix: replace all remaining react-router imports with @tanstack/react-router in shared UI and hackathon components 2026-04-11 17:54:04 +07:00
maulanasdqn 63da701b1b fix: resolve _hook import paths and signUpWithEmail type mismatch 2026-04-11 17:35:52 +07:00
maulanasdqnandClaude Opus 4.6 4240e8eb51 feat: migrate all 5 Vite apps from react-router to TanStack Router
Migrated backoffice, hackathon, dimentorin, gacha, qrcampaign, and
infra from custom react-router file-based routing to TanStack Router
file-based routing following the tanstack-frontend-best-practice
convention.

Key changes per app:
- New routes/ directory with __root.tsx, _public.tsx, _authenticated.tsx
- Auth guards via beforeLoad (replaces old middleware.ts)
- createFileRoute pattern for all page components
- TanStackRouterVite plugin in vite.config for auto route generation
- _components/_hooks folders colocated with routes (ignored by router)
- routeTree.gen.ts auto-generated on dev/build

Convention:
- _public/* routes redirect to dashboard if authenticated
- _authenticated/* routes redirect to /auth/login if not authenticated
- $param for dynamic segments (was [param] in old convention)
- _layout suffix for pathless layout routes

Removed:
- Old src/app/ directories from all apps
- Old src/middleware.ts files
- Custom convertPagesToRoute utility (no longer needed)
- react-router dependency usage (kept in package.json for shared libs)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 17:04:14 +07:00
maulanasdqnandClaude Opus 4.6 6b3faf2a21 fix: remove dev-only CSS links from index.html in all Vite apps
The <link rel="stylesheet" href="/src/..."> tags reference source
paths that only exist in dev mode. In production builds, Vite injects
CSS through the JS bundle. These broken links caused 404 errors and
unstyled pages in production.

Affected: backoffice, dimentorin, gacha, hackathon, infra

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 15:40:03 +07:00
maulanasdqnandClaude Opus 4.6 bcfac70e2a fix: remove all dark mode styles from shared UI components
Stripped dark: classes from Input, Textarea, Button, and InputField
components. These were causing black/dark backgrounds in modals and
forms across all apps (backoffice, gacha, dimentorin, etc).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 10:44:04 +07:00
maulanasdqn 0e0ca9720a chore: update npmDepsHash after security fixes 2026-04-11 10:10:49 +07:00
maulanasdqn a7ec622925 fix: center navbar links in landing page header 2026-04-11 10:00:55 +07:00
maulanasdqn 931355e64e chore: force landing Astro deploy 2026-04-10 22:37:10 +07:00
maulanasdqn 063587aca9 fix: update landing project.json for Nx affected detection and correct build output 2026-04-10 22:27:00 +07:00
maulanasdqnandClaude Opus 4.6 95bf09c2fa feat: migrate landing page from Next.js to Astro
Replaces the heavy Next.js SSR app with Astro static site:
- Zero JS shipped for static pages (hero, community, CTA, footer)
- Server-side data fetching in Astro frontmatter (events, hackathon, testimonials)
- Only 4 React islands for interactive parts (mobile menu, roadmap voting, testimonials home, feature request)
- Google Fonts via <link> instead of next/font
- Nix build changed from Node.js systemd service to static nginx (mkStaticAppModule)
- npmDepsHash needs update (set to fake hash, CI will provide correct one)

Performance gains:
- No Node.js server process needed (was using ~10MB RAM)
- No Next.js runtime JS (~200KB+ saved)
- No framer-motion bundle (~130KB saved)
- Static HTML served directly by nginx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 22:10:52 +07:00
maulanasdqnandClaude Opus 4.6 0ade3c3e50 perf: optimize landing page - remove framer-motion, use Google Fonts
Performance improvements:
- Replaced framer-motion animations with CSS @keyframes in hero,
  testimonial, and community sections (saves ~130KB bundle)
- Switched from local Poppins/BaiJamjuree font files (750KB) to
  next/font/google with auto-subsetting
- Deleted 10 local .ttf font files
- Community section is now a server component (no 'use client')
- Removed scroll parallax effect from hero (was causing repaints)
- Hero image marked as priority for LCP optimization

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 21:53:04 +07:00
maulanasdqnandClaude Opus 4.6 e945da4b7f feat: integrate landing with real APIs, remove auth pages
Landing page changes:
- Removed entire (auth) directory — landing doesn't need login/signup
- Removed auth buttons (Masuk/Daftar) from header navigation
- Hackathon page now fetches teams + winners from real API
- Roadmap page now fetches from /v1/landing/cms/roadmap API with
  real-time voting via POST /roadmap/vote/{id}
- Deleted dummy JSON files: events.json, testimonials.json, hackathons.json
- Kept static config: hero-content, hero-stats, navigations, socials

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 21:42:43 +07:00
maulanasdqnandClaude Opus 4.6 61b650bb25 feat: add react-hook-form + zod validation to all login forms
All login pages now use react-hook-form with zod resolver for
real-time validation:
- Email validated as proper email format on each keystroke
- Password required validation
- Red border + error message shown inline below invalid fields
- Submit button disabled until all fields are valid
- Input type="text" instead of type="email" to avoid browser tooltip

Also fixed:
- Gacha API trailing slash on /items/ and /credits/ causing 404s

Apps updated: hackathon, dimentorin, backoffice, qrcampaign, gacha

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 19:47:03 +07:00
maulanasdqnandClaude Opus 4.6 e61c003e07 fix: convert landing events/testimonials to client components
Server-side fetch fails during Nix build due to SSL cert issues in
the sandbox. Converted to client components with useEffect+fetch
so data loads at runtime instead of build time.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:34:37 +07:00
maulanasdqn 8fff0df753 chore: force dimentorin redeploy 2026-04-10 15:10:47 +07:00
maulanasdqnandClaude Opus 4.6 0193245551 fix: replace ugly Loading... text with spinner across all apps
- Updated default HydrateFallback in file-based-routing to show a
  centered blue spinner instead of bare "Loading..." text
- Added inline spinner to all index.html root divs so users see a
  spinner immediately while JS bundles load (instead of blank white)
- Affects: dimentorin, hackathon, backoffice, gacha, qrcampaign, infra

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:47:24 +07:00
maulanasdqnandClaude Opus 4.6 7f5948724b fix: remove dark mode from all login UIs, redesign gacha login modal
- Stripped all dark: classes from hackathon, dimentorin, backoffice,
  and qrcampaign login pages — light mode only
- Rewrote gacha login modal to match the unified clean design:
  clean typography, native inputs with eye toggle, proper spacing,
  removed old IMPHNEN logo header and Indonesian text

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:44:32 +07:00
maulanasdqnandClaude Opus 4.6 2cba806cd5 feat: integrate landing page with real API and add CMS to backoffice
Landing page:
- Events page now fetches from /v1/landing/cms/events (was hardcoded JSON)
- Testimonials section and page fetch from /v1/landing/cms/testimonials
- Removed dummy data, uses ISR with 60s revalidation
- Replaced thumbnail images with text-based cards (API has no thumbnails)
- Avatar initials for testimonials instead of placeholder images

Backoffice CMS:
- Added Events management page (/cms-events) with full CRUD
- Added Testimonials management page (/cms-testimonials) with full CRUD
- Both follow existing backoffice patterns (DataTable, modals, search, pagination)
- Added CMS section to sidebar navigation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:42:24 +07:00
maulanasdqnandClaude Opus 4.6 414e4d19b8 feat: add dimentorin dashboard and settings pages (#42, #43, #54)
Dashboard (/dashboard):
- Welcome header with user name
- Stats cards: upcoming sessions, completed, role (mentor/mentee)
- Mentor registration CTA for non-mentors
- Upcoming sessions list with status badges
- Profile card with avatar and gradient header

Settings (/dashboard/settings):
- Account Details: displays user info and role
- Privacy & Security: 2FA (coming soon), change password, active sessions
- Preferences: email notifications, language, theme
- FAQ & Support: expandable FAQ accordion with contact info

Dashboard Layout:
- Top nav with Dimentorin branding
- Navigation links: Dashboard, Settings
- Auth guard redirects to login if not authenticated
- Logout button

Closes #42, #43, #54

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:31:49 +07:00
maulanasdqnandClaude Opus 4.6 7268403ca4 fix: add image upload size limits for hackathon (#63)
- useUploadFile: add 5MB limit + image type validation for team
  logo/banner uploads (was unrestricted)
- useUploadAvatar: tighten limit from 5MB to 2MB per issue request
- Submit page: switch from useUploadFile to useUploadSubmission
  which has proper 50MB limit + broader file type support

Size limits:
  - Profile avatar: 2MB (JPEG, PNG, WebP, GIF)
  - Team logo/banner: 5MB (JPEG, PNG, WebP, GIF)
  - Team files: 20MB (images + PDF)
  - Submissions: 50MB (images, PDF, ZIP, video)

Closes #63

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:24:18 +07:00
maulanasdqnandClaude Opus 4.6 651fd65ccb feat: unify login UI across all apps to match hackathon design
- Dimentorin: replaced anime-themed login with clean dark-mode design,
  removed Google login, uses shared useLogin hook
- Backoffice: replaced custom hook login with unified design, clean
  admin-only layout (no signup link)
- QR Campaign: added dark mode support to match hackathon style

All login pages now share consistent:
- Dark/light mode support
- Email + password fields with show/hide toggle
- GitHub OAuth button
- Error handling UI
- Same Tailwind class patterns

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:18:04 +07:00
maulanasdqnandClaude Sonnet 4.6 53ad40f3fd feat: integrate all backend APIs into frontend apps
- Fix API service paths to use /v1/iam/, /v1/dimentorin/, /v1/gacha/, /v1/hackathon/ prefixes
- Add roles, permissions, events, testimonials, sessions API services and hooks
- Rewrite gacha service with full CRUD + roll/claim endpoints
- Replace all mock data in backoffice pages with real API calls (accounts, roles, permissions, gacha-roll, dashboard, sessions, users-dimentorin, feedback-review, settings)
- Wire dimentorin mentoring list to useMentorList with search + pagination
- Wire dimentorin mentor detail page to useMentorById, pass real data to all sections
- Wire appointment modal to useBookSession with controlled schedule inputs
- Wire gacha app Spin Now to useExecuteGachaRoll, show credits and real items

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 17:08:58 +07:00
maulanasdqnandClaude Opus 4.6 1afd7c014c ci: trigger test build for landing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:09:13 +07:00
maulanasdqnandClaude Opus 4.6 3f4461c65c chore: upgrade dependencies, restructure shared libs, and fix UI
- Upgrade Nx 22.1.1 → 22.6.3 and all patch/minor dependencies
- Restructure shared libs: move business logic from utils to service
- Consolidate shadcn-ui into ui lib with atomic design pattern
- Fix container centering for landing app (Tailwind v4 compatibility)
- Fix button styling by updating @source directive in globals.css
- Fix SiCss3 → SiCss rename in react-icons 5.6
- Fix duplicate useSession export conflict
- Remove dead code, comments, and unused files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 01:44:17 +07:00
maulanasdqnandClaude Opus 4.6 bbb1bae909 chore: migrate to Nix flakes, remove Docker and legacy configs
Remove all Docker files, Vercel config, Verdaccio, and old CI workflow.
Standardize on nodejs_22 across devShell and nix build helpers.
Update CI to build all packages and push to Cachix on merge to develop.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:05:37 +07:00
Hafid NurandGitHub 3de1748f12 fix(qr): Empty State (#76)
* fix(qr): add empty state for campaign & user management page to handle unexcepted null error

* fix(qr): fix empty state logic in the user management page
2026-02-23 10:06:08 +07:00
Hafid Nur a610e180ba fix(qr): update API url to https 2026-02-14 18:29:30 +07:00
Hafid Nur ce8cb8188c fix(qr): hardcode API url 2026-02-14 18:13:28 +07:00
maulanasdqn 3aaf022393 feat(infra): update to include all apps and CI/CD flow 2026-02-14 18:03:58 +07:00
Hafid Nur ebe27a3f05 fix: update API endpoint for QR campaign app 2026-02-14 17:57:03 +07:00
Hafid NurandGitHub 9d37cba65f Add a new app: QR code generator for campaign (#75)
* Initialize a new NX project - QR campaign

* Develop QR code generator app for campaign

* Add deployment script

Add Dockerfile, docker compose, and update Nix config for deployment

* Revert package.json to fix ci

* Revert package-lock.json to ensure ci (Nix build & cache) successful
2026-02-14 17:15:46 +07:00
maulanasdqnandClaude Opus 4.5 8728d0abd7 feat(landing): add Powered By Ancikri badge to hero section
Add clickable "Powered By Ancikri" badge beside the community badge
with matching pill design, linking to ancikri.com

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 21:58:35 +07:00
maulanasdqnandClaude Opus 4.5 1f4f4ddaa1 feat(landing): add Powered by Ancikri to footer
Add clickable "Powered by Ancikri" link in the footer
pointing to ancikri.com

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 21:38:19 +07:00
maulanasdqn 951db0f28a feat: add infra app for infrastructure documentation 2026-01-21 20:22:27 +07:00
maulanasdqnandClaude Opus 4.5 1f0798752c feat(landing): use local fonts instead of Google Fonts
- Download Poppins and Bai Jamjuree font files locally
- Convert from next/font/google to next/font/local
- Enables builds in sandboxed environments without network access

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:55:26 +07:00
Hafid NurandGitHub f77967a092 feat(hackathon): update certificate to include project submission name (#74)
* update hackathon landing page

* feat(hackathon): draft winner certificate

* feat(hackathon): refine winner certificate

* feat(hackathon): update certificate

- add submission project name to the certificate
2025-12-16 13:58:43 +07:00
Hafid NurandGitHub fe172cc128 feat(hackathon): winner certificate (#73)
* update hackathon landing page

* feat(hackathon): draft winner certificate

* feat(hackathon): refine winner certificate
2025-12-16 12:33:23 +07:00
Hafid NurandGitHub 38ee9a9549 update hackathon landing page (#72) 2025-12-15 14:43:11 +07:00
Maulana SodiqinandClaude 3ad828e759 feat: update certificate design with SVG template and Poppins font
- Changed certificate background from PNG to SVG for better quality
- Added Poppins font import to index.html
- Updated certificate layout with Team Name and Person Name in blue (#59bef5)
- Repositioned QR code to fit in designated white box placeholder
- Removed generated copyright and date overlays (now part of SVG template)
- Adjusted text positioning for better alignment with new design
- Increased canvas scale to 4x and wait time to 1500ms for sharper rendering

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-13 23:41:56 +07:00
Maulana SodiqinandClaude 782cce820b feat: hide certificate buttons for non-team members
- Added isTeamMember check (session user ID === certificate user ID)
- Hide all action buttons (Download, Print, View Submission) for non-members
- Hide "Back to Submission" button in header for non-members
- Unauthenticated users and other users can view certificate but cannot interact with buttons

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-11 00:48:21 +07:00
Maulana SodiqinandClaude f5882e3cdc feat: integrate new certificate endpoint from backend
- Updated certificate page to use useCertificatePublicData hook
- Removed old multi-API-call approach
- Now uses single /certificates/{userId} endpoint
- Simplified data fetching for user, team, submission data
- Certificate now works for unauthenticated users
- Removed duplicate certificate hook file

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-11 00:16:29 +07:00