Compare commits

...

218 Commits

Author SHA1 Message Date
louiscklaw
3f13cc41bf ```update Enh 2025-05-24 08:51:32 +08:00
cb8643b405 ``update Add Docker build and deployment workflow for CMS and Ionic Mobile, update docker-compose.yml with new service images, and enhance documentation with strategy diagram and endpoint table`` 2025-05-24 08:21:33 +08:00
1157bf0fda ``update Update service address table formatting and placeholders for REQ0021`` 2025-05-24 08:15:44 +08:00
louiscklaw
2375c144a8 ``update Add build status message and server restart log in CMS entrypoint script`` 2025-05-24 06:11:33 +08:00
louiscklaw
24c62d940c ``update Migrate from custom Node image to official Node 22 image, install pnpm, update Dockerfile and entrypoint script`` 2025-05-24 06:02:46 +08:00
louiscklaw
e38e775fee ``update Simplify ENTRYPOINT syntax in PocketBase Dockerfile`` 2025-05-24 06:02:35 +08:00
louiscklaw
db9d3fbffd ``update Update port mappings for PocketBase, CMS, and Ionic Mobile services as per REQ0021`` 2025-05-24 05:48:45 +08:00
louiscklaw
368af36acd ``update Fix CPU resource limits format in docker-compose.db.yml and clean up dc.sh`` 2025-05-24 05:48:45 +08:00
d283b8274f update ticket, 2025-05-24 05:43:53 +08:00
7a8bd60185 update docker config, 2025-05-24 05:41:35 +08:00
a94ead44ba build cms ok, 2025-05-23 17:16:47 +08:00
50fc385c2b ``update Add todo-tree filter exclusions for node_modules, bundles, Next.js build folders, and distribution artifacts`` 2025-05-17 18:12:32 +08:00
91b3f53abe ``add Add database guidelines document outlining db driver structure and collection mappings`` 2025-05-17 18:12:19 +08:00
cf0ec8bd64 ``update Change logout behavior back to route navigation after sign-out instead of full page reload `` 2025-05-17 10:02:35 +00:00
59cdf7257b ```
update Implement standardized documentation for all database modules, including purpose, rules, and requirements for each CRUD operation; refactor existing comments to follow new documentation standard
```
2025-05-17 10:02:05 +00:00
b8309596be update example for ai, 2025-05-17 11:20:33 +08:00
688e102f2c ``delete Remove database schema definitions and hidden field count retrieval functionality`` 2025-05-17 09:41:36 +08:00
4d57d0a5f3 ``update Change logout behavior from route navigation to full page reload after sign-out `` 2025-05-16 23:41:22 +08:00
720838f137 Merge branch 'develop/ionic_mobile/i18n/trunk' into develop/ionic_mobile/login-flow/trunk 2025-05-16 23:38:56 +08:00
c92ac33ade ```
replace setting tab button with conditional rendering based on user authentication status, showing avatar if available
```
2025-05-16 23:37:39 +08:00
72e478937d ``update Add QR code generation feature with dynamic sizing and styling, implement screen-width-based conditional rendering, update i18n translations, and adjust context providers structure`` 2025-05-16 22:51:33 +08:00
62d8519da5 ``delete Remove i18n configuration file and English translation resources; likely replaced by a JSON-based or externalized translation management approach`` 2025-05-16 22:50:24 +08:00
8d746f3aa9 ``update Refactor navigation URLs by replacing hardcoded LESSON_LINK with Paths.LESSON_LINK across App, RouteConfig, and multiple components; remove redundant LESSON_LINK from constants`` 2025-05-16 22:00:04 +08:00
69b2ef59e5 ``update Upgrade dependencies including i18next, react-i18next, eslint, and testing-library; adjust peer dependencies and add new ESLint plugins`` 2025-05-16 21:59:52 +08:00
f9c0deb2e9 ``add Add CMS project code-workspace file to define multi-root workspace including documentation and AI workspace directories`` 2025-05-16 21:57:52 +08:00
47760fa7b2 ``add Add code-workspace files for documentation, ionic_mobile, and test projects to define multi-root workspace configurations`` 2025-05-16 21:57:41 +08:00
83bd86cc9b ``update Add .env.example file with PocketBase URL configuration for development environment `` 2025-05-16 17:47:33 +08:00
49189a532e ```
update Add development environment configuration, I18n support, route adjustments, and various hooks refactoring
```
2025-05-16 17:47:05 +08:00
6b917c9fb9 ``update Add error constant for empty PocketBase URL and validate it during app initialization `` 2025-05-16 15:56:56 +08:00
aa834a43c9 ``update Add platform-specific back button for Android, replace header layout, use LoadingSpinner, and refactor imports in Lesson page component`` 2025-05-16 15:56:46 +08:00
1775d8c5a3 ``update Remove unused components, imports, and refactor file URL generation in WordPage component`` 2025-05-16 15:56:24 +08:00
779062e247 ``update Replace getStudentAvatar with getStudentAvatarUrl for avatar URL generation in student profile`` 2025-05-16 15:56:19 +08:00
60df47fb8d ``update Extract PocketBase URL to constant and refactor related functions to use it for dynamic file URL generation`` 2025-05-16 15:55:47 +08:00
c87357ff24 ``update Remove unused import path suffix and comment out unused useRequireAuth hook`` 2025-05-16 15:55:30 +08:00
34a7ff7ac9 ``refactor Rename LoadingScreen component to LoadingSpinner and refactor structure for better reusability`` 2025-05-16 15:55:07 +08:00
3556e77a7c ```
add Implement custom sign-out functionality with loading state and error handling
```
2025-05-16 13:26:17 +08:00
57e25ef65f update fix eslint, 2025-05-16 12:51:32 +08:00
af5040ac6c update to use, 2025-05-16 12:07:58 +08:00
7264d643d0 remove unused code, 2025-05-16 11:51:11 +08:00
de47ceea0b ``update Add test section and GIF image to REQ0016 and REQ0020 documentation files`` 2025-05-16 11:16:29 +08:00
7295b46c06 ```
init Add default VS Code workspace configuration with current and test folders
```
2025-05-16 11:16:21 +08:00
471175d08d ``refactor Update tsconfig.json to include trailing comments in compilerOptions paths and exclude patterns `` 2025-05-16 11:16:10 +08:00
dae97f52ae ``refactor Update PocketBase URL in development environment to use local network IP address `` 2025-05-16 11:14:45 +08:00
6e16b2e87d ```
refactor Add sign-in form component with OAuth integration, Zod validation, i18n support, and password visibility toggle following REQ0016 requirements
```
2025-05-16 11:14:38 +08:00
2371e40ad2 init 003_test, 2025-05-16 11:13:50 +08:00
3e3e23aa68 ``refactor Update docker-compose configurations, adjust PocketBase Dockerfile, modify seed scripts to use 'state' instead of 'status', and fix paths in development scripts `` 2025-05-16 11:13:14 +08:00
a8b0a63648 ```refactor Add reset password form component with Zod validation, email input handling, and internationalization support for custom auth flow
```
2025-05-16 11:07:13 +08:00
bf059147c7 ``refactor Implement custom sign-up form component with Zod validation, OAuth integration, and i18n support following REQ0016 requirements`` 2025-05-16 11:03:58 +08:00
4b750b8146 ``refactor Add explicit type annotation to isDevelopment variable in check-is-development utility function`` 2025-05-16 11:03:05 +08:00
11b1d21472 ``refactor Update CMS site name from 'Devias Kit Pro' to 'demo cms' in configuration`` 2025-05-16 11:02:54 +08:00
3d38af8100 ``refactor Enhance error logging in UserProvider by including full error details in development environment for debugging purposes`` 2025-05-16 11:02:45 +08:00
c5eb7100ea ``refactor Standardize status/state naming across students, teachers, and user metas pages, update filters and tabs to use 'state' parameter consistently `` 2025-05-16 11:02:27 +08:00
louiscklaw
f44539bf63 ``refactor Update .gitignore to exclude files with 'old' suffix in any directory`` 2025-05-15 11:35:47 +08:00
louiscklaw
407f622f24 ``refactor Prettier config to add comment placeholder for potential future plugin additions `` 2025-05-15 11:35:40 +08:00
louiscklaw
7e2844dd74 ```
refactor Student and Teacher create/edit forms to implement i18n support, update UI components, and standardize API calls
```
2025-05-15 11:35:29 +08:00
louiscklaw
097918340c ```
refactor Teachers list page to remove outdated implementation, simplifying component structure and improving maintainability
```
2025-05-15 11:31:03 +08:00
louiscklaw
3620837a6a ``refactor UserMeta creation and authentication client to improve documentation and type consistency`` 2025-05-15 11:27:02 +08:00
louiscklaw
c83e8c1b6e ```
refactor Student and UserMeta type definitions to deprecate obsolete fields, standardize structure, and update billing address format
```
2025-05-15 11:13:15 +08:00
louiscklaw
af15a6bce0 ```
refactor Student type definitions to deprecate obsolete fields, standardize structure, and update billing address format
```
2025-05-15 11:12:56 +08:00
louiscklaw
d0215cf23f ```
refactor GetById APIs for Students, Teachers, and UserMetas to use consistent type definitions and expand parameters
```
2025-05-15 11:12:29 +08:00
louiscklaw
e523f80123 ```
refactor UserMeta type definitions to deprecate obsolete fields and standardize structure
```
2025-05-15 11:10:40 +08:00
louiscklaw
7f8f8824a7 ```
refactor getImageUrlFromFile to use Pocketbase records and correct path in teachers routes
```
2025-05-15 11:10:12 +08:00
louiscklaw
2aa96eec62 ```
refactor student and teacher APIs to use COL_USER_METAS collection, standardize role assignment, and update type definitions
```
2025-05-15 09:27:38 +08:00
louiscklaw
ecab41abbf `` fix GetUserById API to include requestKey option for Pocketbase compatibility `` 2025-05-15 09:27:20 +08:00
louiscklaw
5a1832ca89 ```
remove obsolete GetAllCount API and related guidelines from Users.old module
```
2025-05-15 09:27:08 +08:00
louiscklaw
160c93b83d `` refactor GetUserById function and add Create/UpdateUser APIs with type definitions `` 2025-05-15 09:26:36 +08:00
louiscklaw
d4fcc1dd8f ```
add UserActivationEditForm component for user activation management
```
2025-05-15 09:24:41 +08:00
louiscklaw
8e3d463f78 ```
use dynamic route parameter for user ID in UserActivationEditForm
```
2025-05-15 09:24:27 +08:00
louiscklaw
fbf79b040f `` remove placeholder _PROMPT.md file and reference to external draft for UserMeta editing page `` 2025-05-15 09:24:21 +08:00
louiscklaw
e34782844e ```
add user profile navigation logic and update button in SettingContainer
```
2025-05-15 09:19:59 +08:00
louiscklaw
ba8e9cca69 fix translation, 2025-05-15 08:35:33 +08:00
louiscklaw
cc9fe057c1 ```
add abbreviations section and clarify guideline reading requirement
```
2025-05-14 18:45:23 +08:00
louiscklaw
cdd95faa89 ```
add new student menu route and component, update login default values and redirect logic
```
2025-05-14 18:31:04 +08:00
louiscklaw
030fc1a808 update login requirement for mobile, 2025-05-14 18:13:15 +08:00
louiscklaw
05c69481b5 update check session working, 2025-05-14 18:10:22 +08:00
louiscklaw
0fcc194860 in the middle, working for login and logout test, 2025-05-14 17:19:48 +08:00
louiscklaw
56f0f30ffb ```
replace inline loading text with LoadingScreen component in multiple pages
```
2025-05-14 16:27:30 +08:00
louiscklaw
0aefbfaeae fix typo, 2025-05-14 16:25:57 +08:00
louiscklaw
628c72190b fix typo, 2025-05-14 16:18:39 +08:00
louiscklaw
886a314df7 update settings pages in the middle, 2025-05-14 16:18:04 +08:00
louiscklaw
efc2d31f7c ```
add new student info route and related components, update auth guard implementation and signup success redirect
```
2025-05-14 15:40:59 +08:00
louiscklaw
1938e95948 ```
use async/await for authClient.signInWithPassword to ensure proper execution order
```
2025-05-14 15:20:02 +08:00
louiscklaw
8d37fba393 update login flow, in the middle, 2025-05-14 15:17:04 +08:00
louiscklaw
af160edd42 ```
update .gitignore to add api_ts and dist directories to exclusion list
```
2025-05-14 15:16:21 +08:00
louiscklaw
d880420a28 ``add configuration files for CrossNote, VSCode extensions, and documentation for system architecture and design requirements`` 2025-05-14 15:15:45 +08:00
louiscklaw
5bebc1f40e ```
add COL_BILLING_ADDRESS constant and update exports
```
2025-05-13 13:28:21 +08:00
louiscklaw
f4e5f94e17 ``update .gitignore to modify exclusion pattern for _del files from '**/_del' to '**/*del'`` 2025-05-13 13:28:13 +08:00
louiscklaw
2d022cb613 ```
remove Docker Compose configuration files for CMS, Doc, Ionic Mobile, API_TS, and PocketBase services
```
2025-05-13 13:27:56 +08:00
louiscklaw
3560ea79fc "``update teacher and student seed scripts to dynamically loop through row_array and um_row_array instead of fixed iterations``" 2025-05-13 13:27:48 +08:00
louiscklaw
a441e3e52d ```
refactor teacher and user meta management UI by updating form components, replacing COL_TEACHERS with COL_USER_METAS where applicable, adding development environment checks, improving type definitions for user meta including billing address, and fixing parameter naming inconsistencies in form handlers
```
2025-05-13 13:27:41 +08:00
louiscklaw
09ded06dd2 ``update student database operations to use COL_USER_METAS instead of COL_STUDENTS, refactor getStudentById to include expanded billing address data, and add/update related types and functions for student and user meta management`` 2025-05-13 13:27:27 +08:00
louiscklaw
7ecacd0692 ```
refactor student management UI by updating create form component name and adding new edit page with translation support and form integration
```
2025-05-13 13:27:17 +08:00
louiscklaw
8a094afdd2 "``refactor student create and edit forms with translation support, update schema validation, and use new database operations for student management``" 2025-05-13 13:26:58 +08:00
louiscklaw
64ca29cf60 ``add new database operations for billing address module including create, delete, get, update functions and related type definitions`` 2025-05-13 13:26:41 +08:00
louiscklaw
1aa0502edc ``fix inconsistent quotes in code and update schema with additional fields and rules`` 2025-05-13 13:26:22 +08:00
louiscklaw
3e1f2e1057 ```
add billing address seed data and update user seed scripts with teacher and student roles
```
2025-05-13 12:35:05 +08:00
louiscklaw
9be33f641f ```
add 'visible', 'state', 'company', 'taxId', 'timezone', 'language', 'currency' fields and update 'billingAddress' and 't1' collection rules in PocketBase seed schema
```
2025-05-13 12:34:51 +08:00
louiscklaw
30e4c69343 ```
add Docker Compose configuration files for CMS, Doc, Ionic Mobile, API_TS, and PocketBase services, along with .env file for environment variables and related scripts
```
2025-05-13 06:58:49 +08:00
louiscklaw
04634b5c65 ``update backup script to change archive directory name and add script to recursively remove node_modules directories`` 2025-05-12 19:25:19 +08:00
louiscklaw
f659020d89 ``add TODO list file for Ionic mobile project`` 2025-05-12 19:24:45 +08:00
louiscklaw
184aaa1b0a ``fix HTML doctype declaration in index.html for Ionic mobile project`` 2025-05-12 19:24:39 +08:00
louiscklaw
a6170778cd ```
add new hooks for fetching QuizCRQuestions and categories, update related components to use the new hooks, and refactor SelectCategory page to use the new API
```
2025-05-12 19:24:25 +08:00
louiscklaw
650127821b ```
update nodemon config to fix watch path syntax and upgrade dependencies including sass, parcel watcher, and chokidar
```
2025-05-12 19:23:44 +08:00
louiscklaw
5440f8ea14 ``add .env to .gitignore and update ignore patterns for log, temp, and backup files`` 2025-05-12 19:23:22 +08:00
louiscklaw
f4c9dbcc34 ``add Helloworld component in Ionic mobile project`` 2025-05-12 19:23:00 +08:00
louiscklaw
f756fb8527 ``` "update tsconfig.json: adjust lib array format, simplify include syntax, and refine exclude patterns """ 2025-05-12 19:22:46 +08:00
louiscklaw
3f10a0728c ```
add authentication routes, components, and pages including AuthHome, Login, and SignUp, and implement form fields utility functions
```
2025-05-12 19:22:00 +08:00
louiscklaw
ee0aa0353b ``add development and backup scripts for Ionic mobile project, including dev script, rsync backup script, and express commit script`` 2025-05-12 19:19:39 +08:00
louiscklaw
2c7316786c ``update dc_dev.sh to remove commented logs command and adjust startup sequence for pocketbase and api_ts`` 2025-05-12 14:03:52 +08:00
louiscklaw
89f91ec2a0 ``update Notifications table schema by removing 'author' text field, adding 'author' relation, 'content', 'company', and 'link' fields, and sync changes in schema.dbml, schema.json, and pb_hooks/seed/schema.json`` 2025-05-12 14:03:35 +08:00
louiscklaw
1441863dcd ``remove obsolete UserMetas migrations and related user collection modifications`` 2025-05-12 14:01:52 +08:00
louiscklaw
1835caee68 ``update prettier config with printWidth and quoteProps, add new routes for connective revision, and update guidelines for hooks and types`` 2025-05-12 13:49:11 +08:00
louiscklaw
bac8c70d4b ``fix typos and update base URL quotes in code files`` 2025-05-12 13:48:32 +08:00
louiscklaw
975a528b49 `` update prettier config to enforce LF line endings and ES5 trailing commas `` 2025-05-12 13:29:40 +08:00
louiscklaw
749fef7e28 `` update prettier config for Ionic mobile with new endOfLine and trailingComma settings `` 2025-05-12 13:26:39 +08:00
louiscklaw
cf34833d42 init project-wise prettier config, 2025-05-12 13:22:43 +08:00
louiscklaw
7bb45316af update dependencies, 2025-05-12 13:21:28 +08:00
louiscklaw
02771185af ```
add ionic mobile workspace configuration with linked folders and git/port settings
```
2025-05-12 13:20:37 +08:00
louiscklaw
cf70e2af21 ```
refactor notifications popover to include unread count, mark all as read button, and loading state
```
2025-05-12 13:10:19 +08:00
louiscklaw
1a77c3a5e8 update helloworld template for component, 2025-05-12 11:34:06 +08:00
louiscklaw
af446aed59 update seed file, 2025-05-12 11:33:13 +08:00
louiscklaw
c7f1f544ec ```
refactor notifications popover to use new hooks and improve functionality
```
2025-05-12 11:32:53 +08:00
louiscklaw
99ee2f9fc3 ```
add admin user ID to seed config and update notification relations
```
2025-05-11 17:29:19 +08:00
louiscklaw
a4cdb4b1cc ```
add phone field to User model and update notification relations
```
2025-05-11 16:59:02 +08:00
louiscklaw
b35b77557e ```
enable prettier-plugin-sort-imports for consistent import ordering
```
2025-05-11 16:32:27 +08:00
louiscklaw
6842459499 ```
remove deprecated repomix.md file used for AI analysis
```
2025-05-11 16:32:01 +08:00
louiscklaw
ba7682e7cb "update tsconfig.json exclusion patterns for build optimization" 2025-05-11 16:31:50 +08:00
louiscklaw
1003fa699c "refactor settings pages, add translation support and implement side navigation component" 2025-05-11 16:31:32 +08:00
louiscklaw
ec12ca3bdf "make avatar mandatory and add collectionId to User interface" 2025-05-11 16:30:50 +08:00
louiscklaw
7ece1c814b update order of import, 2025-05-11 16:07:06 +08:00
louiscklaw
39a7d32fcd update, 2025-05-11 15:47:49 +08:00
louiscklaw
85d1ecdc90 update, 2025-05-11 15:44:18 +08:00
louiscklaw
b26e1ff167 update user-button, 2025-05-11 13:47:14 +08:00
louiscklaw
de415a37bc update main-nav and side-nav, 2025-05-11 13:39:33 +08:00
louiscklaw
01a8d2ca02 update main-nav, 2025-05-11 13:24:52 +08:00
louiscklaw
e5b136b8b5 update main-nav refactoring, working, 2025-05-11 13:06:58 +08:00
louiscklaw
031dbed6a9 "implement responsive main navigation bar with dropdown menus and mobile view support" 2025-05-11 13:00:30 +08:00
louiscklaw
f20dfa00c2 "add CMS workspace configuration with linked documentation and AI workspace folders" 2025-05-11 13:00:05 +08:00
louiscklaw
24c91cb6f0 "update gitignore to exclude temporary and backup files" 2025-05-11 10:48:45 +08:00
louiscklaw
abca91c26a "introduce horizontal main navigation component with dynamic styling and interactive elements" 2025-05-11 10:39:09 +08:00
louiscklaw
3321eafffa "update gitignore to exclude draft files" 2025-05-11 10:36:46 +08:00
louiscklaw
adc9275d3f "update prettier config, add TODO list, and create workspace configuration" 2025-05-11 10:35:04 +08:00
louiscklaw
60eed00cb2 "add admin user seed script and refactor common seed utilities" 2025-05-11 10:34:48 +08:00
louiscklaw
c29ab4b920 update project, 2025-05-11 08:02:50 +08:00
louiscklaw
9d46de56c3 update util scripts, 2025-05-11 08:02:07 +08:00
louiscklaw
3f9d88e733 init req0018, family photo of frameworks, 2025-05-11 08:00:31 +08:00
louiscklaw
6e576919ab init docker cofig, 2025-05-11 07:59:35 +08:00
louiscklaw
9739583f43 update ide config, remove yaml and python, 2025-05-11 07:59:11 +08:00
louiscklaw
bc1ec72df1 Update multiple markdown files with project guidelines, tasks, and database handling instructions 2025-05-11 07:57:34 +08:00
louiscklaw
e62dc5f597 "fix QuestionProgress component missing key props in button arrays," 2025-05-11 07:55:37 +08:00
louiscklaw
b5e9c8ba34 "update user popover with dynamic user metadata loading and improved UI consistency," 2025-05-11 07:55:16 +08:00
louiscklaw
9a8fd1c073 update auth guard and sign-in forms, add guidelines for custom auth to handle login and logout, 2025-05-11 07:54:23 +08:00
louiscklaw
25c1d3c917 update remove migration files in pocketbase, 2025-05-11 07:52:04 +08:00
louiscklaw
f435300740 update requirements, 2025-05-09 14:14:25 +08:00
louiscklaw
299567dd7c update requirements, 2025-05-09 14:14:00 +08:00
louiscklaw
fe1740d76f update user-meta, 2025-05-08 19:44:07 +08:00
louiscklaw
f840f02daf init draft from teacher collections, 2025-05-08 17:30:49 +08:00
louiscklaw
5640d4d4f6 update, 2025-05-08 17:19:43 +08:00
louiscklaw
7105bc85e3 update, 2025-05-08 14:38:34 +08:00
louiscklaw
61c10821b6 update, 2025-05-08 14:38:30 +08:00
louiscklaw
ea3f99654d update users, 2025-05-08 14:38:18 +08:00
louiscklaw
30f494fc35 update teachers, 2025-05-08 14:37:48 +08:00
louiscklaw
367e58a8cf update working on cms users page, 2025-05-06 17:45:25 +08:00
louiscklaw
99274b9c73 update fix typo, 2025-05-06 08:43:57 +08:00
louiscklaw
51935d203a update, 2025-04-29 22:55:21 +08:00
louiscklaw
9d3e832081 update, 2025-04-29 16:09:30 +08:00
louiscklaw
4c72861eda update, 2025-04-28 08:03:21 +08:00
louiscklaw
d0ea7e5452 init commit, 2025-04-26 10:08:01 +08:00
louiscklaw
7d70b5826b update, 2025-04-26 09:56:29 +08:00
louiscklaw
a00d1ee7ce update, 2025-04-26 09:48:37 +08:00
louiscklaw
7296a10ec1 update, 2025-04-26 09:42:38 +08:00
louiscklaw
957df690f4 update, 2025-04-26 09:40:10 +08:00
louiscklaw
45d5c23512 update, 2025-04-26 07:46:09 +08:00
louiscklaw
caa224cbb6 update, 2025-04-26 07:44:55 +08:00
louiscklaw
9be92b41d1 update, 2025-04-26 07:14:53 +08:00
louiscklaw
6e8fea3bdd update, 2025-04-26 06:15:18 +08:00
louiscklaw
df87cfb037 update, 2025-04-24 23:41:39 +08:00
louiscklaw
d73e5f9c22 update left menu path, 2025-04-24 23:31:33 +08:00
louiscklaw
6884f1466f update vscode plugins, 2025-04-24 20:06:20 +08:00
louiscklaw
d308131a8a update hook hellowlrld sample, 2025-04-24 20:06:09 +08:00
louiscklaw
b3ebe8309a update prompts, 2025-04-24 20:05:54 +08:00
louiscklaw
fa35ef2bef update constants, 2025-04-24 20:04:34 +08:00
louiscklaw
0785fcd144 update notifications, 2025-04-24 20:03:26 +08:00
louiscklaw
2dcc765072 update notifications, 2025-04-24 20:02:56 +08:00
louiscklaw
b8e8968866 update build scripts and prompt,s 2025-04-24 13:19:51 +08:00
louiscklaw
92040c6efb update student pages, 2025-04-24 13:19:21 +08:00
louiscklaw
a3d2ee57f7 update init student, 2025-04-24 12:40:42 +08:00
louiscklaw
90835a7fe3 Merge branch 'develop/cms/frontend/dashboard/students/trunk' into develop/cms/frontend/dashboard/teachers/trunk 2025-04-24 12:10:09 +08:00
louiscklaw
ca2a9c235b update init teacher , 2025-04-24 12:09:47 +08:00
louiscklaw
29b074f6dd init helloworld test, 2025-04-24 10:26:30 +08:00
louiscklaw
2f8acbbcdf init test and snapshot, 2025-04-24 10:25:31 +08:00
louiscklaw
41a35b487a init students, 2025-04-24 02:12:27 +08:00
louiscklaw
7a33549a79 init teachers, 2025-04-24 02:12:07 +08:00
louiscklaw
d81b3e9a9e update summary, 2025-04-24 02:06:05 +08:00
louiscklaw
da08798b10 update, 2025-04-24 01:08:44 +08:00
louiscklaw
41cc82d54d update customers, 2025-04-23 02:02:47 +08:00
louiscklaw
c8d184465a update customer edit form in the middle, 2025-04-23 01:01:31 +08:00
louiscklaw
adc04a1a40 update fix status filter for customer, 2025-04-22 23:16:10 +08:00
louiscklaw
62da367589 update prompt and db schema, 2025-04-22 23:03:52 +08:00
louiscklaw
04ac1a8881 update ai prompt, 2025-04-22 23:03:15 +08:00
louiscklaw
dfd6ecc744 update customers in the middle, 2025-04-22 22:56:30 +08:00
louiscklaw
69cb0718be update customer driver, 2025-04-22 22:55:21 +08:00
louiscklaw
7dc7716f18 update for customers, 2025-04-22 22:28:40 +08:00
louiscklaw
633a1d3a4c update ai prompt, 2025-04-22 18:53:41 +08:00
louiscklaw
64b5f89fdf update build ok, 2025-04-22 18:53:17 +08:00
louiscklaw
f87dd2c3b1 update, in the middle, 2025-04-22 18:12:10 +08:00
louiscklaw
8b3dfe69e4 update schemas.json and seeding, 2025-04-22 17:14:27 +08:00
louiscklaw
375b0a3593 update init cr, no modification done yet, 2025-04-22 15:13:33 +08:00
louiscklaw
bd907b4dde init paths for cr, 2025-04-22 15:12:12 +08:00
louiscklaw
73a2b2dfb9 update, 2025-04-22 13:30:02 +08:00
louiscklaw
2f28d71060 update page.tsx visual=true filter, 2025-04-22 13:19:12 +08:00
louiscklaw
01ce517629 update fix import path, 2025-04-22 12:29:56 +08:00
louiscklaw
033ca95dfe refactor to dedicated directory, 2025-04-22 12:20:21 +08:00
louiscklaw
0fa277c50e update schema and seed, 2025-04-22 12:13:42 +08:00
louiscklaw
e8ded0cb30 update for filter, 2025-04-22 11:57:24 +08:00
louiscklaw
cc6e40c9d0 update delete lp_categories and lp_questions, 2025-04-22 11:55:18 +08:00
louiscklaw
407d851b92 update mf build ok, 2025-04-22 04:40:01 +08:00
louiscklaw
0b38de74a2 update refactoring, 2025-04-22 04:18:53 +08:00
1409 changed files with 118089 additions and 32901 deletions

15
.crossnote/config.js Normal file
View File

@@ -0,0 +1,15 @@
({
katexConfig: {
"macros": {}
},
mathjaxConfig: {
"tex": {},
"options": {},
"loader": {}
},
mermaidConfig: {
"startOnLoad": false
},
})

19
.crossnote/head.html Normal file
View File

@@ -0,0 +1,19 @@
<!-- The content below will be included at the end of the <head> element. -->
<script type="text/javascript">
const configureMermaidIconPacks = () => {
window['mermaid'].registerIconPacks([
{
name: 'logos',
loader: () => fetch('https://unpkg.com/@iconify-json/logos/icons.json').then((res) => res.json()),
},
]);
};
if (document.readyState !== 'loading') {
configureMermaidIconPacks();
} else {
document.addEventListener('DOMContentLoaded', () => {
configureMermaidIconPacks();
});
}
</script>

12
.crossnote/parser.js Normal file
View File

@@ -0,0 +1,12 @@
({
// Please visit the URL below for more information:
// https://shd101wyy.github.io/markdown-preview-enhanced/#/extend-parser
onWillParseMarkdown: async function(markdown) {
return markdown;
},
onDidParseMarkdown: async function(html) {
return html;
},
})

8
.crossnote/style.less Normal file
View File

@@ -0,0 +1,8 @@
/* Please visit the URL below for more information: */
/* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */
.markdown-preview.markdown-preview {
// modify your style here
// eg: background-color: blue;
}

9
.editorconfig Normal file
View File

@@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
* text=lf

11
.gitignore vendored
View File

@@ -1,9 +1,18 @@
# api_ts
dist
.next
node_modules
005_references/
_archive/
_del
*.bak
*.log
*.del
**/_del
**/*del
**/*old
**/volumes/**
006_lab
**/*.draft

10
.prettierrc Normal file
View File

@@ -0,0 +1,10 @@
{
"endOfLine": "lf",
"printWidth": 120,
"quoteProps": "consistent",
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"plugins": []
}

15
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,15 @@
{
"recommendations": [
"christian-kohler.path-intellisense",
"esbenp.prettier-vscode",
"humao.rest-client",
//
"matt-meyers.vscode-dbml",
"aflalo.dbml-formatter",
"nicolas-liger.dbml-viewer",
//
"bierner.markdown-mermaid",
"yzhang.markdown-all-in-one",
"shd101wyy.markdown-preview-enhanced"
]
}

23
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,23 @@
{
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"workbench.iconTheme": "material-icon-theme",
"workbench.colorTheme": "Mermaid Dark",
"editor.formatOnSave": true,
"git.ignoreLimitWarning": true,
//
"markdown.styles": ["https://use.fontawesome.com/releases/v5.7.1/css/all.css"]
}

View File

@@ -0,0 +1,25 @@
this `tsx` file is clone from elsewhere, please understand, modify and update the content of `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/app/dashboard/teachers/view/[id]/page.tsx.draft` to handle `Teacher` record thanks, modify comments/variables/paths/functions name please
---
please review and update all tsx files in folder `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/db/Users` to make it handle `user` record thanks
---
<!-- read and understand @/_AI_WORKSPACE/greetings/001_greetings.md -->
## clone source code from one type to another
please understand, modify and update the content of `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/components/dashboard/teacher/_GUIDELINES.md` to handle `Teacher` record thanks,
modify comments/variables/paths/functions name please
---
please help to update the tsx files inside folder `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/components/dashboard/student` to handle the `student` record
## steps
- list all `tsx` files inside directory, remember the list
- clone the original `<original>.tsx` files to `<original>.tsx.draft`
- do all your modification within `<original>.tsx.draft` files, leave `original.tsx` unchange
---

View File

@@ -0,0 +1,33 @@
Hi, i need your help.
## task
i am working on a `dbml` file
i got a `schema.json` which is exported from pocketbase
and i want to update it to my current `dbml` file (one way process for documentation usage)
## Rules
- the collection from `json` file started with `_` can be ignored. they are system collection and should not appear in `dbml`
- one collection from `json` file mapped with one table in `dbml` file
- the `presentable` field from `json` file should be ignored.
- the `id` of collection in `json` file should be jod down in the comment of `dbml` file as an reference.
- you can find the comments in `schema.dbml` contains `pb_xxx` and that is the reference to the table in `schema.json` file.
## steps
- list the collection
## information
json file: `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema.json`
dbml file: `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema.dbml`
## FAQ
1. 对于json中有但dbml中没有的表应该如何处理 添加为新表
1. 是否需要保留dbml文件中现有的注释和关系定义 完全保留
1. 字段类型映射是否有特殊规则? 沒有
1. please keep the existing comment
thanks

View File

@@ -0,0 +1,14 @@
```markdown
# Greetings
Hi,
Imagine you are a software engineer and i will send you the guideline.
plesae read it, prepare yourself and i will tell you the task afterwards
please read and understand the markdown files in directory
`/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/000_AI_WORKSPACE/software-engineer/greetings`,
it provides background information of project i want you to help.
thanks
```

View File

@@ -0,0 +1,37 @@
# guideline
## principles
- at any time, please keep your answer, solution, explaination simple and short (K.I.S.S. or 大道至簡)
- please divide the problem into small parts
- if you found youself cannot understand the problem, please stop and ask how to do
- if you found youself cannot solve the problem, plesae stop and ask how to do
- review the whole solution before you reply to user
- if code syntax is already there, do follow (e.g. naming convention, syntax) the existing code
- no need to explain the reason until you are told to do so
- no need to show me the code change, at the end just simple summary in point form is ok
## highlighted project directories and their meanings
- `_ignore_this_directory` please ignore this directory and any files inside it
- `001_documentation` documentation of this project
- `002_source` source code of this project
- `002_source/cms` home of Context management system of this project
- use singular form for `src/components/dashboard` (e.g. `src/components/dashboard/student`)
- use plural form for `src/app/dashboard` (e.g. `src/app/dashboard/students`)
- `002_source/ionic_mobile` home of mobile client of this project
- `002_source/pocketbase` home of pocketbase home directory this project
- `003_test` e2e test of this project (not yet implemented)
- `004_marketing` marketing page of this project (not yet implemented)
- `005_references` opensource refence of this project
- `006_lab` my test (POC) of this project
- `README.md` Readme of this project
- `TODO.md` todo list of this project
- `001_documentation/Requirements/REQ0019/index.md` describes updated system architecture
- if the directory contains `_GUIDELINES.md`, please read it before operation
## Abbreviations
T.B.A.

View File

@@ -0,0 +1,12 @@
# Knowledgebase
you can answer the question with below knowledge:
## frameworks and stacks
- if code syntax is already there, do follow (e.g. naming convention, syntax) the existing code
- make use of MCP `Context7` when you troubleshoot the problem with below topics:
- [pocketbase javascript SDK](https://context7.com/pocketbase/js-sdk/llms.txt)
- [DBML](https://context7.com/holistics/dbml/llms.txt)
- [ionic framework](https://context7.com/ionic-team/ionic-framework/llms.txt)
- [nextjs 14 app router](https://context7.com/nextjsargentina/next.js-docs/llms.txt)

View File

@@ -0,0 +1,22 @@
# FAQ
Q: where is `dbml` file ?
A: dbml file located in `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema.dbml`
Q: when file not found, do i need to search it in `_ignore_this_directory` ?
A: No, you just stop there and voice out.
Q: Shall I assume the component is already exist ?
A: yes, you can assume that
Q: Is `COL_USER_METAS` the collection for User related (e.g. `Teacher`, `Student`) collections?
A: yes
Q: Shall I verify `import` or `types` when do modification job ?
A: No, you just replace the name of the function, variables etc is ok. no need to check for dependencies thanks.
Q: how to list files with `.tsx.draft` extensions in `src/db/UserMetas` folder?
A: using command like `find src/db/UserMetas -name "*.tsx.draft" -type f -ls` to list the files with `.tsx.draft` extendions only exist in `src/db/UserMetas`
Q: when user want to modify `.tsx.draft` file, do i need to take care the `.tsx` file as well?
A: No, no don't need to, user will handle the remaining modifications. please restrict your modification in the mentioned file or directory only.

View File

@@ -0,0 +1,39 @@
# database and schemas
## getting started
Imagine there is a:
1. developer (provide the modification)
2. QA engineer (provide the feedback, and testing)
3. software engineer
4. technical writer
they will:
- conclude and integrate the ideas from developer and QA engineer
- make decision to modify the code accordingly.
## project background and initial setup
- **IMPORTANT**: No need to reply me what you are going on and your digest in this phase.
No need to show me your code plan
Just reply me "OK" when done
- base_dir=`/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project`
- `schema.dbml`
- read `<base_dir>/001_documentation/Requirements/REQ0006/schema.dbml`
this is file in `dbml` format stating the main database structure
- `schema.json`
- read `<base_dir>/002_source/cms/src/db/schema.json`
this is the file of current pocketbase schema
- look into the md files in folder `<base_dir>/002_source/ionic_mobile/_AI_WORKSPACE/001_guideline`
- if the directory user provided contins `_GUIDELINES.md`, please read the file
- read the files, remember and link up the ideas in file stated above, i will tell them the task afterwards
- please review at least 3 times after you modified the code

View File

@@ -0,0 +1,21 @@
please review and update all tsx files in folder `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/db/Users` to make it handle `user` record thanks
---
<!-- read and understand @/_AI_WORKSPACE/greetings/001_greetings.md -->
## clone source code from one type to another
please understand, modify and update the content of `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/components/dashboard/teacher/_GUIDELINES.md` to handle `Teacher` record thanks,
modify comments/variables/paths/functions name please
---
please help to update the tsx files inside folder `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/components/dashboard/student` to handle the `student` record
## steps
- list all `tsx` files inside directory, remember the list
- clone the original `<original>.tsx` files to `<original>.tsx.draft`
- do all your modification within `<original>.tsx.draft` files, leave `original.tsx` unchange
---

View File

@@ -0,0 +1,33 @@
Hi, i need your help.
## task
i am working on a `dbml` file
i got a `schema.json` which is exported from pocketbase
and i want to update it to my current `dbml` file (one way process for documentation usage)
## Rules
- the collection from `json` file started with `_` can be ignored. they are system collection and should not appear in `dbml`
- one collection from `json` file mapped with one table in `dbml` file
- the `presentable` field from `json` file should be ignored.
- the `id` of collection in `json` file should be jod down in the comment of `dbml` file as an reference.
- you can find the comments in `schema.dbml` contains `pb_xxx` and that is the reference to the table in `schema.json` file.
## steps
- list the collection
## information
json file: `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema.json`
dbml file: `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema.dbml`
## FAQ
1. 对于json中有但dbml中没有的表应该如何处理 添加为新表
1. 是否需要保留dbml文件中现有的注释和关系定义 完全保留
1. 字段类型映射是否有特殊规则? 沒有
1. please keep the existing comment
thanks

View File

@@ -0,0 +1,8 @@
Hi, i will send you the guideline,
plesae read it, prepare yourself and i will tell you the task afterwards
please read and understand the markdown files in directory
`/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/000_AI_WORKSPACE/_AI_WORKSPACE/greetings`,
it provides background information of project i want you to help.
thanks

View File

@@ -0,0 +1,28 @@
# guideline
## principles
- at any time, please keep your answer, solution, explaination simple and short (K.I.S.S. or 大道至簡)
- please divide the problem into small parts
- if you found youself cannot understand the problem, please stop and ask how to do
- if you found youself cannot solve the problem, plesae stop and ask how to do
- review the whole solution before you reply to user
- if code syntax is already there, do follow (e.g. naming convention, syntax) the existing code
- no need to explain the reason until you are told to do so
- no need to show me the code change, at the end just simple summary in point form is ok
## highlighted project directories and their meanings
- `_ignore_this_directory` please ignore this directory and any files inside it
- `001_documentation` documentation of this project
- `002_source` source code of this project
- `002_source/cms` home of Context management system of this project
- `002_source/ionic_mobile` home of mobile client of this project
- `002_source/pocketbase` home of pocketbase home directory this project
- `003_test` e2e test of this project (not yet implemented)
- `004_marketing` marketing page of this project (not yet implemented)
- `005_references` opensource refence of this project
- `006_lab` my test (POC) of this project
- `README.md` Readme of this project
- `TODO.md` todo list of this project

View File

@@ -0,0 +1,12 @@
# Knowledgebase
you can answer the question with below knowledge:
## frameworks and stacks
- if code syntax is already there, do follow (e.g. naming convention, syntax) the existing code
- make use of MCP `Context7` when you troubleshoot the problem with below topics:
- [pocketbase javascript SDK](https://context7.com/pocketbase/js-sdk/llms.txt)
- [DBML](https://context7.com/holistics/dbml/llms.txt)
- [ionic framework](https://context7.com/ionic-team/ionic-framework/llms.txt)
- [nextjs 14 app router](https://context7.com/nextjsargentina/next.js-docs/llms.txt)

View File

@@ -0,0 +1,7 @@
# FAQ
Q: where is `dbml` file ?
A: dbml file located in `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema.dbml`
Q: when file not found, do i need to search it in `_ignore_this_directory` ?
A: No, you just stop there and voice out.

View File

@@ -0,0 +1,48 @@
# database and schemas
## getting started
Imagine there is a:
1. developer (provide the modification)
2. QA engineer (provide the feedback, and testing)
3. software engineer
4. technical writer
they will:
- conclude and integrate the ideas from developer and QA engineer
- make decision to modify the code accordingly.
## project background and initial setup
- **IMPORTANT**: No need to reply me what you are going on and your digest in this phase.
No need to show me your code plan
Just reply me "OK" when done
- base_dir=`/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project`
- `schema.dbml`
- read `<base_dir>/001_documentation/Requirements/REQ0006/schema.dbml`
this is file in `dbml` format stating the main database structure
- `schema.json`
- read `<base_dir>/002_source/cms/src/db/schema.json`
this is the file of current pocketbase schema
- look into the md files in folder `<base_dir>/002_source/ionic_mobile/_AI_WORKSPACE/001_guideline`
- if the directory user provided contins `_GUIDELINES.md`, please read the file
- read the files, remember and link up the ideas in file stated above, i will tell them the task afterwards
- please review at least 3 times after you modified the code
## frameworks documentation and samples
- react
- ionic and capacitor
- pocketbase
- tanstack/react-query
- vite
- typescript

View File

@@ -1,6 +1,5 @@
{
"recommendations": [
"redhat.vscode-yaml",
"yzhang.markdown-all-in-one",
"esbenp.prettier-vscode",
"ms-python.python",
@@ -8,7 +7,6 @@
"ms-python.debugpy",
"ms-python.black-formatter",
"ms-python.isort",
"ms-python.pylint",
"bierner.markdown-mermaid",
"shd101wyy.markdown-preview-enhanced",
"yzhang.markdown-all-in-one",

View File

@@ -24,5 +24,4 @@ mindmap
Tools
Pen and paper
Mermaid
```

View File

@@ -1,9 +1,27 @@
---
tags: mobile, lesson
tags: time
---
# lesson page documentation
# time tracking
it should have a lesson page
T.B.A.
![alt text](image.png)
```mermaid
gantt
title A Gantt Diagram
dateFormat YYYY-MM-DD
section Section
A task :a1, 2014-01-01, 30d
Another task :after a1, 20d
section Another
Task in Another :2014-01-12, 12d
another task :24d
```
---
## TODOs of the project
- [cms TODO](../../../002_source/cms/TODO.md)
- [ionic TODO](../../../002_source/ionic_mobile/TODO.md)
- [pocketbase TODO](../../../002_source/pocketbase/TODO.md)

View File

@@ -0,0 +1,20 @@
# task
update `dbml` from `schema.json`, for collection `billingAddress`
## Background information
1. please ignore `presentable` properties from `schema.json`, this is for pocketbase internal usage
1. please ignore collections with `_` as its first character, this is for pocketbase internal usage
1. just return the collection with `billingAddress` is ok, please ignore other collections
## steps
1. read file `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/db/schema.json`. this is the export from `pocketbase`.
1. read file `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema.dbml`. this is file written in dbml format.
1. currently the collection in `schama.json` is mapped to table in `schema.dbml`
1. compare the `schema.json` and `schema.dbml`, remember the differences
1. you may found some comment already exist in `schema.dbml`, please keep them
1. while keeping `schema.json` content unchanged. write file to `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/001_documentation/Requirements/REQ0006/schema_ai_draft.dbml` content based on `schema.json`.
thanks.

View File

@@ -1,20 +0,0 @@
# LessonCategories / LessonCategory
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listLessonCategories.ts to cover `LessonCategories`,
draft `ts` code
- `CRUD`
- `getFulllistLessonCategories,`
- `getListByFilterLessonCategories,`
- `getFirstListItemLessonCategories,`
- `getOneLessonCategory,`
- `getListLessonCategoryById`
thanks

View File

@@ -1,20 +0,0 @@
# LessonTypes / LessonType
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listLessonTypes.ts to cover `LessonTypes`,
draft `ts` code
- `CRUD`
- `getFulllistLessonTypes,`
- `getListByFilterLessonTypes,`
- `getFirstListItemLessonTypes,`
- `getOneLessonType,`
- `getListLessonTypeById`
thanks

View File

@@ -1,20 +0,0 @@
# QuizCategories / QuizCategory
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listQuizCategories.ts to cover `QuizCategories`,
draft `ts` code
- `CRUD`
- `getFulllistQuizCategories,`
- `getListByFilterQuizCategories,`
- `getFirstListItemQuizCategories,`
- `getOneQuizCategory,`
- `getListQuizCategoryById`
thanks

View File

@@ -1,20 +0,0 @@
# QuizConnectives / QuizConnective
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listQuizConnectives.ts to cover `QuizConnectives`,
draft `ts` code
- `CRUD`
- `getFulllistQuizConnectives,`
- `getListByFilterQuizConnectives,`
- `getFirstListItemQuizConnectives,`
- `getOneQuizConnective,`
- `getListQuizConnectiveById`
thanks

View File

@@ -1,20 +0,0 @@
# QuizConnectivesCategories / QuizConnectivesCategory
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listQuizConnectivesCategories.ts to cover `QuizConnectivesCategories`,
draft `ts` code
- `CRUD`
- `getFulllistQuizConnectivesCategories,`
- `getListByFilterQuizConnectivesCategories,`
- `getFirstListItemQuizConnectivesCategories,`
- `getOneQuizConnectivesCategory,`
- `getListQuizConnectivesCategoryById`
thanks

View File

@@ -1,20 +0,0 @@
# QuizListenings / QuizListening
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listQuizListenings.ts to cover `QuizListenings`,
draft `ts` code
- `CRUD`
- `getFulllistQuizListenings,`
- `getListByFilterQuizListenings,`
- `getFirstListItemQuizListenings,`
- `getOneQuizListening,`
- `getListQuizListeningById`
thanks

View File

@@ -1,20 +0,0 @@
# QuizMatchings / QuizMatching
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listQuizMatchings.ts to cover `QuizMatchings`,
draft `ts` code
- `CRUD`
- `getFulllistQuizMatchings,`
- `getListByFilterQuizMatchings,`
- `getFirstListItemQuizMatchings,`
- `getOneQuizMatching,`
- `getListQuizMatchingById`
thanks

View File

@@ -1,20 +0,0 @@
# UserMetas / UserMeta
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listUserMetas.ts to cover `UserMetas`,
draft `ts` code
- `CRUD`
- `getFulllistUserMetas,`
- `getListByFilterUserMetas,`
- `getFirstListItemUserMetas,`
- `getOneUserMeta,`
- `getListUserMetaById`
thanks

View File

@@ -1,20 +0,0 @@
# Users / User
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listUsers.ts to cover `Users`,
draft `ts` code
- `CRUD`
- `getFulllistUsers,`
- `getListByFilterUsers,`
- `getFirstListItemUsers,`
- `getOneUser,`
- `getListUserById`
thanks

View File

@@ -1,20 +0,0 @@
# Vocabularies / Vocabulary
Hi, using information from
- @schema.dbml for schemas, fields and table names,
- @listHelloworld.ts for skeleton for ts script
- @listVocabularies.ts, @listUserMetas.ts, @listQuizListening.ts, @listQuisMatching.ts, @listQuizConnectivesCategories for reference
extend @listVocabularies.ts to cover `Vocabularies`,
draft `ts` code
- `CRUD`
- `getFulllistVocabularies,`
- `getListByFilterVocabularies,`
- `getFirstListItemVocabularies,`
- `getOneVocabulary,`
- `getListVocabularyById`
thanks

View File

@@ -0,0 +1,6 @@
# GUIDELINES
- `schema.dbml` means DB schema in `dbml` format
- `schema.json` contains the exported DB schema from pocketbase
- the `Collection ID: xxx` in `dbml` file contains the collection `id` mapping from `schema.json`
- the `presentable` field from `json` file should be ignored.

View File

@@ -0,0 +1,45 @@
# AI GUIDELINE
## getting started
Imagine there is a software developer and a QA engineer to solve the problems together
They will:
no need to reply me what you are going on and your digest in this phase.
just reply me "OK" when done
base_dir=`/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project`
- `schema.dbml`
- read `<base_dir>/001_documentation/Requirements/REQ0006/schema.dbml`
this is file in dbml syntax state the main database
- `schema.json`
- read `<base_dir>/002_source/cms/src/db/schema.json`
this is the file of live pocketbase schema output
- read `<base_dir>/002_source/cms/src/constants.ts`
this is the content of `@/constants`
- look into the md files in folder `<base_dir>/002_source/cms/_AI_WORKSPACE/001_guideline`
- read, remember and link up the ideas in file stated above,
i will tell them the task afterwards
---
Hi, i have 2 files
`schema.json` is a export from pocketbase (e.g. collections and fields)
`schema.dbml` is schema file for presentation of the database (e.g. tables)
please take a look in `schema.dbml` and `schema.json`,
associate the existing `collection` from json file to the `table` in dbml file
keep `schema.json` remain unchanged and update `schema.dbml` to match it.
please modify the `schema.dbml` to align with `schema.json`
to the collection `QuizLPCategories` align the dbml file in the previous prompt

View File

@@ -0,0 +1,86 @@
//
// # REQ0015:
// ## PURPOSE:
//
// This is a script to convert `schema.json` exported from pocketbase to dbml formatted file `schema.dbml`
//
//
const fs = require("fs");
const path = require("path");
// Load schema.json
const schemaPath = path.join(process.cwd(), "schema.json");
const schema = JSON.parse(fs.readFileSync(schemaPath, "utf8"));
// Type mapping from PocketBase to DBML/SQL
const typeMapping = {
text: "text",
number: "integer",
bool: "boolean",
email: "text",
url: "varchar",
date: "datetime",
select: "varchar",
json: "text",
file: "file",
password: "varchar",
relation: "integer", // Assuming relations are stored as integer IDs
autodate: "datetime",
};
function convertToDBML(schema) {
let dbml = "";
dbml = "// Generated at: " + new Date().toISOString();
dbml = dbml + "\n\n\n";
let collectionIdToTableMapping = {};
for (const [idx, tableDef] of Object.entries(schema)) {
collectionIdToTableMapping[tableDef.id] = tableDef.name;
}
for (const [idx, tableDef] of Object.entries(schema)) {
console.log({ idx });
dbml += `// \n`;
dbml += `// collection id: ${tableDef.id} \n`;
dbml += `// collection name: ${tableDef.name} \n`;
dbml += `// collection type: ${tableDef.type} \n`;
dbml += `Table ${tableDef.name} {\n`;
for (const field of tableDef.fields) {
// Get field type
let fieldType = typeMapping[field.type] || "text";
// Handle special cases
if (field.type === "number" && field.options?.max === 1) {
fieldType = "boolean";
}
// Build field definition
let line = ` ${field.name} ${fieldType}`;
// Add constraints
const constraints = [];
if (field.name === "id" || field.primary) constraints.push("pk");
if (field.required) constraints.push("not null");
if (constraints.length > 0) line += ` [${constraints.join(", ")}]`;
if (field.collectionId) {
line += ` [ref: > ${
collectionIdToTableMapping[field.collectionId]
}.id] // ${field.id}`;
}
dbml += `${line}\n`;
console.log({ line });
}
dbml += "}\n\n";
}
return dbml;
}
// Convert and save
const dbmlOutput = convertToDBML(schema);
fs.writeFileSync("schema.dbml", dbmlOutput);
console.log("DBML file generated successfully!");

View File

@@ -0,0 +1,29 @@
import { faker } from '@faker-js/faker';
const getId = (id) => id.padStart(15, '0');
const row_array = Array.from({ length: 10 }, (_, i) => [
getId(String(i + 1)),
faker.person.firstName(),
'',
faker.internet.email(),
faker.phone.number(),
faker.company.name(),
{
country: faker.location.country(),
state: faker.location.state(),
city: faker.location.city(),
zipCode: faker.location.zipCode(),
line1: faker.location.streetAddress(),
line2: faker.location.secondaryAddress(),
},
Math.floor(Math.random() * (100 - 0 + 1)) + 0,
faker.location.timeZone(),
['en', 'de', 'es', 'fr', 'ja', 'ko', 'zh-CN'].sort(() => Math.random() - 0.5)[0],
faker.finance.currencyCode(),
]);
import fs from 'fs';
const filePath = 'output.json';
fs.writeFileSync(filePath, JSON.stringify(row_array, null, 2));
console.log(`Wrote ${row_array.length} records to ${filePath}`);

View File

@@ -0,0 +1,202 @@
[
[
"000000000000001",
"May",
"",
"June_Wintheiser33@hotmail.com",
"281-378-5900 x822",
"Green, Rempel and Hoeger",
{
"country": "Central African Republic",
"state": "Arizona",
"city": "Winfieldburgh",
"zipCode": "92017-8004",
"line1": "1838 Willa Freeway",
"line2": "Suite 307"
},
98,
"Asia/Urumqi",
"de",
"MUR"
],
[
"000000000000002",
"Marilyne",
"",
"Carol_Blick@yahoo.com",
"(893) 919-2445 x193",
"White - Hessel",
{
"country": "Iraq",
"state": "Nevada",
"city": "Casa Grande",
"zipCode": "83831-3843",
"line1": "6984 Alberto Radial",
"line2": "Suite 154"
},
49,
"Africa/Tunis",
"zh-CN",
"CHF"
],
[
"000000000000003",
"Jacklyn",
"",
"Tamara_Lynch11@yahoo.com",
"597-593-0144 x168",
"Rolfson LLC",
{
"country": "Grenada",
"state": "Georgia",
"city": "New Brodyfort",
"zipCode": "18887-7075",
"line1": "493 Pfannerstill Meadow",
"line2": "Apt. 358"
},
44,
"Asia/Manila",
"zh-CN",
"CDF"
],
[
"000000000000004",
"Alana",
"",
"Ahmed_Willms@hotmail.com",
"401.212.0386 x31125",
"Friesen, Langworth and Thompson",
{
"country": "Australia",
"state": "North Carolina",
"city": "Fort Jerrell",
"zipCode": "14211",
"line1": "1763 West Street",
"line2": "Suite 699"
},
34,
"America/Boa_Vista",
"ja",
"KES"
],
[
"000000000000005",
"Rocky",
"",
"Angela_Kuhic@gmail.com",
"653.964.0412",
"Hayes - Morar",
{
"country": "Reunion",
"state": "New York",
"city": "Kayton",
"zipCode": "82048-0645",
"line1": "636 Angel Junction",
"line2": "Apt. 361"
},
70,
"America/Grand_Turk",
"fr",
"PGK"
],
[
"000000000000006",
"Carmela",
"",
"Larry94@hotmail.com",
"1-508-980-1889 x134",
"Goodwin - Brown",
{
"country": "Heard Island and McDonald Islands",
"state": "Wisconsin",
"city": "Jalenbury",
"zipCode": "75732-7013",
"line1": "669 Sven Trail",
"line2": "Suite 409"
},
48,
"Asia/Karachi",
"fr",
"AMD"
],
[
"000000000000007",
"Lucious",
"",
"Lera67@yahoo.com",
"(684) 748-3653 x8745",
"Harvey - Kilback",
{
"country": "Israel",
"state": "Maryland",
"city": "East Allenmouth",
"zipCode": "21779",
"line1": "6070 W Grand Avenue",
"line2": "Suite 448"
},
83,
"America/St_Barthelemy",
"en",
"SBD"
],
[
"000000000000008",
"Anika",
"",
"Shane.Moore@gmail.com",
"(996) 909-3575 x614",
"Donnelly, Larson and Stamm",
{
"country": "Canada",
"state": "Michigan",
"city": "Lafayette",
"zipCode": "90430-8775",
"line1": "430 Orland Place",
"line2": "Suite 891"
},
64,
"America/Toronto",
"fr",
"PKR"
],
[
"000000000000009",
"Otto",
"",
"Emery_Wisozk@yahoo.com",
"1-602-251-7035 x9461",
"Kreiger - Boehm",
{
"country": "South Georgia and the South Sandwich Islands",
"state": "Colorado",
"city": "Lake Isaias",
"zipCode": "26025-5909",
"line1": "143 Kautzer Unions",
"line2": "Apt. 752"
},
98,
"Africa/Ndjamena",
"fr",
"JOD"
],
[
"000000000000010",
"Cortez",
"",
"Jameson13@hotmail.com",
"1-660-472-1494",
"Parisian LLC",
{
"country": "Mali",
"state": "Illinois",
"city": "Stammburgh",
"zipCode": "92318",
"line1": "7669 Jude Drive",
"line2": "Apt. 594"
},
59,
"Africa/Lubumbashi",
"en",
"VND"
]
]

View File

@@ -0,0 +1,33 @@
{
"name": "gen_customer",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gen_customer",
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
"@faker-js/faker": "^9.7.0"
}
},
"node_modules/@faker-js/faker": {
"version": "9.7.0",
"resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.7.0.tgz",
"integrity": "sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/fakerjs"
}
],
"license": "MIT",
"engines": {
"node": ">=18.0.0",
"npm": ">=9.0.0"
}
}
}
}

View File

@@ -0,0 +1,15 @@
{
"name": "gen_customer",
"version": "1.0.0",
"main": "gen_customer.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"devDependencies": {
"@faker-js/faker": "^9.7.0"
}
}

View File

@@ -0,0 +1,23 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
devDependencies:
'@faker-js/faker':
specifier: ^9.7.0
version: 9.7.0
packages:
'@faker-js/faker@9.7.0':
resolution: {integrity: sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==}
engines: {node: '>=18.0.0', npm: '>=9.0.0'}
snapshots:
'@faker-js/faker@9.7.0': {}

View File

@@ -1,215 +1,476 @@
// LessonTypes stores different types of lessons
// lesson_types, lesson_type
Table LessonTypes {
// system field
id int [pk, increment] // unique identifier for the lesson type
created datetime [default: `now()`] // timestamp when the lesson type was created
updated datetime // timestamp when the lesson type was last updated
// value field
name varchar // name of the lesson type
type varchar // type category
}
// Generated at: 2025-05-13T05:24:33.962Z
// LessonCategories stores categories of lessons
// lesson_categories, lesson_category
Table LessonCategories {
// system field
id int [pk, increment] // unique identifier for the lesson category
created datetime [default: `now()`] // timestamp when the category was created
updated datetime // timestamp when the category was last updated
// value field
cat_name varchar // image file name
cat_image varchar // image representing the category
lesson_type_id integer [ref: > LessonTypes.id] // foreign key referencing LessonTypes.id
}
Table Helloworlds {
// system field
id int [pk, increment] // id field, increment
created datetime [default: `now()`] // record create time
updated datetime // record update time
}
Table Users {
// system field
id int [pk, increment]
created datetime [default: `now()`]
updated datetime
// value field
email varchar
//
// collection id: pbc_3142635823
// collection name: _superusers
// collection type: auth
Table _superusers {
id text [pk, not null]
password varchar [not null]
tokenKey text [not null]
email text [not null]
emailVisibility boolean
verified boolean
name varchar
avatar blob
}
Table UserMetas {
// system field
id int [pk, increment]
created datetime [default: `now()`]
created datetime
updated datetime
// value field
helloworld varchar
app_on_time_s integer
user_id integer [ref: > Users.id]
}
Table QuizCategories {
// system field
id int [pk, increment]
created datetime [default: `now()`]
//
// collection id: _pb_users_auth_
// collection name: users
// collection type: auth
Table users {
id text [pk, not null]
password varchar [not null]
tokenKey text [not null]
email text [not null]
emailVisibility boolean
verified boolean
name text
avatar file
created datetime
updated datetime
// value field
cat_name varchar // category name
cat_image varchar // category image
visible text
phone text
}
// stores all questions of matching frenzy
Table QuizMatchings {
// system field
id int [pk, increment] // id field, increment
created datetime [default: `now()`] // record create time
updated datetime // record update time
// value field
word varchar // modal answer
word_c varchar // question
cat_id integer [ref: > QuizCategories.id] // foreign key to QuizCategories.id
}
// QuizListening stores all listening quiz data
Table QuizListenings {
// system field
id int [pk, increment] // id field, increment
created datetime [default: `now()`] // record create time
updated datetime // record update time
// value field
sound varchar // URL to the sound file
word varchar // The word in the quiz
cat_id integer [ref: > QuizCategories.id]
}
// stores all categories of connectives revision quiz
Table QuizConnectivesCategories {
// system field
id int [pk, increment] // id field, increment
created datetime [default: `now()`] // record create time
updated datetime // record update time
// value field
cat_name varchar // category name
cat_image varchar // category image
}
// stores all questions of connectives revision quiz
Table QuizConnectives {
// system field
id int [pk, increment] // id field, increment
created datetime [default: `now()`] // record create time
updated datetime // record update time
// value field
question_fh varchar // first half
question_sh varchar // second half
modal_ans varchar // modal ans
cat_id integer [ref: > QuizConnectivesCategories.id] // foreign key to QuizConnectivesCategories.id
}
// Lessons stores all lessons in the database
Table Vocabularies {
// system field
id int [pk, increment] // unique identifier for the lesson
created datetime [default: `now()`] // timestamp when the lesson was created
updated datetime // timestamp when the lesson was last updated
// value field
image varchar // URL to the image associated with the lesson
sound varchar // URL to the sound file associated with the lesson
word varchar // The word in English
word_c varchar // The word in Chinese
sample_e varchar // Sample sentence in English using the word
sample_c varchar // Sample sentence in Chinese using the word
cat_id integer [ref: > LessonCategories.id] // foreign key referring to LessonCategories.id
category varchar // The category to which the lesson belongs
lesson_type_id integer [ref: > LessonTypes.id] // foreign key referring to LessonTypes.id
}
// Listening Practice Quiz Categories
// store listening practice category, (LpCategories, LpCategory)
Table QuizLPCategories {
// system fields
id text [pk] // changed from int to text to match PocketBase
created datetime [default: `now()`]
updated datetime
// value fields
cat_name varchar [presentable: true] // added presentable flag
cat_image file // changed from blob to file type
pos number // changed from integer to number
init_answer json
}
// Listening Practice Quiz Questions
Table QuizLPQuestions {
id int [pk, increment]
created datetime [default: `now()`]
updated datetime
word varchar
sound blob
cat_id integer [ref: > QuizLPCategories.id]
}
// Matching Frenzy Quiz Categories
Table QuizMFCategories {
id int [pk, increment]
created datetime [default: `now()`]
updated datetime
cat_name varchar
cat_image blob
//
// collection id: pbc_1430376151
// collection name: Categories
// collection type: base
Table Categories {
id text [pk, not null]
cat_name text
cat_image_url text
cat_image file
pos integer
init_answer json
}
// Matching Frenzy Quiz Questions
Table QuizMFQuestions {
id int [pk, increment]
created datetime [default: `now()`]
lesson_id integer [ref: > LessonsTypes.id] // relation3455582614
remarks text
visible text
created datetime
updated datetime
word varchar
word_c varchar
cat_id integer [ref: > QuizMFCategories.id]
}
// Connectives Revision Quiz Categories
//
// collection id: pbc_108570809
// collection name: Customers
// collection type: base
Table Customers {
id text [pk, not null]
name text
email text
phone text
quota integer
status text
avatar_file file
user_id integer [ref: > users.id] // relation2809058197
billingAddress text
timezone text
language text
currency text
created datetime
updated datetime
}
//
// collection id: pbc_1196309394
// collection name: LessonsCategories
// collection type: base
Table LessonsCategories {
id text [pk, not null]
cat_name text
cat_image_url text
cat_image file
pos integer
lesson_id integer [ref: > LessonsTypes.id] // relation3455582614
description text
remarks text
visible text
created datetime
updated datetime
}
//
// collection id: pbc_2328411368
// collection name: LessonsTypes
// collection type: base
Table LessonsTypes {
id text [pk, not null]
name text
type text
pos integer
visible text
created datetime
updated datetime
field datetime
}
//
// collection id: pbc_977978967
// collection name: Notifications
// collection type: base
Table Notifications {
id text [pk, not null]
read boolean
type text
job text
description text
NOTI_ID text
created datetime
updated datetime
to_user_id integer [ref: > UserMetas.id] // relation704048736
from_user_id integer [ref: > UserMetas.id] // relation556806202
author integer [ref: > UserMetas.id] // relation3182418120
content text
company text
link varchar
}
//
// collection id: pbc_4061499106
// collection name: QuizCRCategories
// collection type: base
Table QuizCRCategories {
id int [pk, increment]
created datetime [default: `now()`]
updated datetime
cat_name varchar
cat_image blob
id text [pk, not null]
cat_name text
cat_image file
pos integer
init_answer json
init_answer text
created datetime
updated datetime
}
// Connectives Revision Quiz Questions
//
// collection id: pbc_3141885671
// collection name: QuizCRQuestions
// collection type: base
Table QuizCRQuestions {
id int [pk, increment]
created datetime [default: `now()`]
id text [pk, not null]
question_fh text
question_sh text
modal_ans text
cat_id integer [ref: > QuizCRCategories.id] // relation1827623476
options text
created datetime
updated datetime
question_fh varchar
question_sh varchar
modal_ans varchar
cat_id integer [ref: > QuizCRCategories.id]
init_answer text
}
// Test table
Table t1 {
id int [pk, increment]
created datetime [default: `now()`]
//
// collection id: pbc_3571292172
// collection name: QuizCategories
// collection type: base
Table QuizCategories {
id text [pk, not null]
cat_name text
cat_image text
init_answer text
created datetime
updated datetime
name varchar
}
//
// collection id: pbc_96745150
// collection name: QuizConnectives
// collection type: base
Table QuizConnectives {
id text [pk, not null]
question_fh text
question_sh text
modal_ans text
cat_id integer [ref: > QuizConnectivesCategories.id] // relation3870140739
created datetime
updated datetime
}
//
// collection id: pbc_342761728
// collection name: QuizConnectivesCategories
// collection type: base
Table QuizConnectivesCategories {
id text [pk, not null]
cat_name text
cat_image file
created datetime
updated datetime
}
//
// collection id: pbc_3639453778
// collection name: QuizLPCategories
// collection type: base
Table QuizLPCategories {
id text [pk, not null]
cat_name text
cat_image file
pos integer
init_answer text
visible text
created datetime
updated datetime
slug text
remarks text
description text
}
//
// collection id: pbc_742947356
// collection name: QuizLPQuestions
// collection type: base
Table QuizLPQuestions {
id text [pk, not null]
word text
sound file
cat_id integer [ref: > QuizLPCategories.id] // relation3870140739
cat_name text
cat_image file
pos integer
init_answer text
visible text
slug text
remarks text
description text
created datetime
updated datetime
}
//
// collection id: pbc_2511066072
// collection name: QuizListenings
// collection type: base
Table QuizListenings {
id text [pk, not null]
sound file
word text
cat_id integer [ref: > QuizCategories.id] // relation3870140739
created datetime
updated datetime
}
//
// collection id: pbc_84667061
// collection name: QuizMFCategories
// collection type: base
Table QuizMFCategories {
id text [pk, not null]
cat_name text
cat_image file
pos integer
init_answer text
visible text
created datetime
updated datetime
}
//
// collection id: pbc_3346420851
// collection name: QuizMFQuestions
// collection type: base
Table QuizMFQuestions {
id text [pk, not null]
word text
word_c text
cat_id integer [ref: > QuizMFCategories.id] // relation3870140739
created datetime
updated datetime
visible text
sound file
cat_image file
init_answer text
}
//
// collection id: pbc_2936646783
// collection name: QuizMatchings
// collection type: base
Table QuizMatchings {
id text [pk, not null]
word text
word_c text
cat_id integer [ref: > QuizCategories.id] // relation3870140739
created datetime
updated datetime
}
//
// collection id: pbc_491894781
// collection name: Students
// collection type: base
Table Students {
id text [pk, not null]
name text
email text
phone text
quota integer
status text
avatar_file file
user_id integer [ref: > users.id] // relation2809058197
billingAddress text
timezone text
language text
currency text
created datetime
updated datetime
}
//
// collection id: pbc_1413424569
// collection name: Teachers
// collection type: base
Table Teachers {
id text [pk, not null]
name text
email text
phone text
quota integer
status text
avatar_file file
user_id integer [ref: > users.id] // relation2809058197
billingAddress text
timezone text
language text
currency text
created datetime
updated datetime
}
//
// collection id: pbc_1305841361
// collection name: UserMetas
// collection type: base
Table UserMetas {
id text [pk, not null]
address text
meta text
user_id integer [ref: > users.id] // relation2809058197
state text
created datetime
updated datetime
avatar file
role text
name text
email text
phone text
company text
taxId text
timezone text
language text
currency text
billingAddress integer [ref: > billingAddress.id] // relation2115670734
}
//
// collection id: pbc_1638686383
// collection name: Vocabularies
// collection type: base
Table Vocabularies {
id text [pk, not null]
image file
sound file
word text
word_c text
sample_e text
sample_c text
cat_id integer [ref: > Categories.id] // relation3870140739
category text
lesson_type_id integer [ref: > LessonsTypes.id] // relation808508980
created datetime
updated datetime
visible text
type text
}
//
// collection id: pbc_4275539003
// collection name: _authOrigins
// collection type: base
Table _authOrigins {
id text [pk, not null]
collectionRef text [not null]
recordRef text [not null]
fingerprint text [not null]
created datetime
updated datetime
}
//
// collection id: pbc_2281828961
// collection name: _externalAuths
// collection type: base
Table _externalAuths {
id text [pk, not null]
collectionRef text [not null]
recordRef text [not null]
provider text [not null]
providerId text [not null]
created datetime
updated datetime
}
//
// collection id: pbc_2279338944
// collection name: _mfas
// collection type: base
Table _mfas {
id text [pk, not null]
collectionRef text [not null]
recordRef text [not null]
method text [not null]
created datetime
updated datetime
}
//
// collection id: pbc_1638494021
// collection name: _otps
// collection type: base
Table _otps {
id text [pk, not null]
collectionRef text [not null]
recordRef text [not null]
password varchar [not null]
sentTo text
created datetime
updated datetime
}
//
// collection id: pbc_1509025625
// collection name: billingAddress
// collection type: base
Table billingAddress {
id text [pk, not null]
country text
state text
city text
zipCode text
line1 text
line2 text
created datetime
updated datetime
}
//
// collection id: pbc_123408445
// collection name: helloworlds
// collection type: base
Table helloworlds {
id text [pk, not null]
hello text
created datetime
updated datetime
}
//
// collection id: pbc_2109205374
// collection name: t1
// collection type: base
Table t1 {
id text [pk, not null]
hello text
created datetime
updated datetime
test_file file
}

View File

@@ -0,0 +1,11 @@
---
tags: cms
---
# cms dashboard
cms
## files
T.B.A.

View File

@@ -0,0 +1,11 @@
---
tags: mobile
---
# mobile client
mobile
## files
T.B.A.

View File

@@ -0,0 +1,86 @@
//
// # REQ0015:
// ## PURPOSE:
//
// This is a script to convert `schema.json` exported from pocketbase to dbml formatted file `schema.dbml`
//
//
const fs = require("fs");
const path = require("path");
// Load schema.json
const schemaPath = path.join(process.cwd(), "schema.json");
const schema = JSON.parse(fs.readFileSync(schemaPath, "utf8"));
// Type mapping from PocketBase to DBML/SQL
const typeMapping = {
text: "text",
number: "integer",
bool: "boolean",
email: "text",
url: "varchar",
date: "datetime",
select: "varchar",
json: "text",
file: "file",
password: "varchar",
relation: "integer", // Assuming relations are stored as integer IDs
autodate: "datetime",
};
function convertToDBML(schema) {
let dbml = "";
dbml = "// Generated at: " + new Date().toISOString();
dbml = dbml + "\n\n\n";
let collectionIdToTableMapping = {};
for (const [idx, tableDef] of Object.entries(schema)) {
collectionIdToTableMapping[tableDef.id] = tableDef.name;
}
for (const [idx, tableDef] of Object.entries(schema)) {
console.log({ idx });
dbml += `// \n`;
dbml += `// collection id: ${tableDef.id} \n`;
dbml += `// collection name: ${tableDef.name} \n`;
dbml += `// collection type: ${tableDef.type} \n`;
dbml += `Table ${tableDef.name} {\n`;
for (const field of tableDef.fields) {
// Get field type
let fieldType = typeMapping[field.type] || "text";
// Handle special cases
if (field.type === "number" && field.options?.max === 1) {
fieldType = "boolean";
}
// Build field definition
let line = ` ${field.name} ${fieldType}`;
// Add constraints
const constraints = [];
if (field.name === "id" || field.primary) constraints.push("pk");
if (field.required) constraints.push("not null");
if (constraints.length > 0) line += ` [${constraints.join(", ")}]`;
if (field.collectionId) {
line += ` [ref: > ${
collectionIdToTableMapping[field.collectionId]
}.id] // ${field.id}`;
}
dbml += `${line}\n`;
console.log({ line });
}
dbml += "}\n\n";
}
return dbml;
}
// Convert and save
const dbmlOutput = convertToDBML(schema);
fs.writeFileSync("schema.dbml", dbmlOutput);
console.log("DBML file generated successfully!");

View File

@@ -0,0 +1,9 @@
---
tags: mobile, cms, db, schema
---
# pocketbase json schema to dbml converter
## description
to generate a `schema.dbml` form `schema.json` exported from pocketbase

View File

@@ -0,0 +1,18 @@
// Generated at: 2025-05-06T06:24:44.009Z
//
// collection id: pbc_3142635823
// collection name: helloworld
// collection type: auth
Table helloworld {
id text [pk, not null]
password varchar [not null]
tokenKey text [not null]
email text [not null]
emailVisibility boolean
verified boolean
created datetime
updated datetime
}

View File

@@ -0,0 +1,174 @@
[
{
"id": "pbc_3142635823",
"listRule": null,
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"name": "helloworld",
"type": "auth",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"cost": 0,
"hidden": true,
"id": "password901924565",
"max": 0,
"min": 8,
"name": "password",
"pattern": "",
"presentable": false,
"required": true,
"system": true,
"type": "password"
},
{
"autogeneratePattern": "[a-zA-Z0-9]{50}",
"hidden": true,
"id": "text2504183744",
"max": 60,
"min": 30,
"name": "tokenKey",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": true,
"system": true,
"type": "text"
},
{
"exceptDomains": null,
"hidden": false,
"id": "email3885137012",
"name": "email",
"onlyDomains": null,
"presentable": false,
"required": true,
"system": true,
"type": "email"
},
{
"hidden": false,
"id": "bool1547992806",
"name": "emailVisibility",
"presentable": false,
"required": false,
"system": true,
"type": "bool"
},
{
"hidden": false,
"id": "bool256245529",
"name": "verified",
"presentable": false,
"required": false,
"system": true,
"type": "bool"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": true,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": true,
"type": "autodate"
}
],
"indexes": [
"CREATE UNIQUE INDEX `idx_tokenKey_pbc_3142635823` ON `_superusers` (`tokenKey`)",
"CREATE UNIQUE INDEX `idx_email_pbc_3142635823` ON `_superusers` (`email`) WHERE `email` != ''"
],
"system": true,
"authRule": "",
"manageRule": null,
"authAlert": {
"enabled": true,
"emailTemplate": {
"subject": "Login from a new location",
"body": "<p>Hello,</p>\n<p>We noticed a login to your {APP_NAME} account from a new location.</p>\n<p>If this was you, you may disregard this email.</p>\n<p><strong>If this wasn't you, you should immediately change your {APP_NAME} account password to revoke access from all other locations.</strong></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
}
},
"oauth2": {
"mappedFields": {
"id": "",
"name": "",
"username": "",
"avatarURL": ""
},
"enabled": false
},
"passwordAuth": {
"enabled": true,
"identityFields": [
"email"
]
},
"mfa": {
"enabled": false,
"duration": 1800,
"rule": ""
},
"otp": {
"enabled": false,
"duration": 180,
"length": 8,
"emailTemplate": {
"subject": "OTP for {APP_NAME}",
"body": "<p>Hello,</p>\n<p>Your one-time password is: <strong>{OTP}</strong></p>\n<p><i>If you didn't ask for the one-time password, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
}
},
"authToken": {
"duration": 86400
},
"passwordResetToken": {
"duration": 1800
},
"emailChangeToken": {
"duration": 1800
},
"verificationToken": {
"duration": 259200
},
"fileToken": {
"duration": 180
},
"verificationTemplate": {
"subject": "Verify your {APP_NAME} email",
"body": "<p>Hello,</p>\n<p>Thank you for joining us at {APP_NAME}.</p>\n<p>Click on the button below to verify your email address.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-verification/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Verify</a>\n</p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
},
"resetPasswordTemplate": {
"subject": "Reset your {APP_NAME} password",
"body": "<p>Hello,</p>\n<p>Click on the button below to reset your password.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-password-reset/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Reset password</a>\n</p>\n<p><i>If you didn't ask to reset your password, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
},
"confirmEmailChangeTemplate": {
"subject": "Confirm your {APP_NAME} new email address",
"body": "<p>Hello,</p>\n<p>Click on the button below to confirm your new email address.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-email-change/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Confirm new email</a>\n</p>\n<p><i>If you didn't ask to change your email address, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
}
}
]

View File

@@ -0,0 +1,39 @@
---
tags: cms, login-flow
---
# CMS login flow
## description
```mermaid
graph TD;
Start-->A;
A-->B;
B-->C;
B-->D;
D-->E;
E-->F;
C-->G;
G-->A
F-->End;
A[greeting, asking username and password]
B[check if username and password is valid]
C[pasword failed]
D[pasword ok]
E[login success]
F[redirect to '/dashboard']
G[prompt user wrong username and password]
Start((start));
End((end))
```
## test
![alt text](test.gif)
## relation

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

@@ -0,0 +1,9 @@
---
tags: mobile, lesson
---
# lesson page documentation
it should have a lesson page
![alt text](image.png)

View File

@@ -0,0 +1,7 @@
---
tags: mobile, cms, db
---
# family photo of frameworks
it should have a family photo of used framework

View File

@@ -0,0 +1,43 @@
---
tags: architecture,mobile, cms, db
---
# System architecture
## Description
it should have a family photo of used framework
## Diagram
```mermaid {align="center"}
architecture-beta
group running_config(logos:aws-opsworks)[running_config]
service db(database)[pocketbase] in running_config
service tra1(internet)[incoming traffic 3000] in running_config
service cms(logos:nextjs)[next app] in running_config
service tra2(internet)[incoming traffic 5173] in running_config
service ionic(logos:ionic)[ionic app] in running_config
tra1:R --> L:cms
cms:R --> L:db
tra2:R --> L:ionic
ionic:R --> B:db
%% group planning(logos:aws-lambda)[planning]
%% service api_ts(logos:aws-lambda)[api_ts] in planning
%% service pg_db(logos:postgresql)[pg_db] in planning
%% ui:R --> L:api_ts
%% ionic:R --> L:api_ts
%% api_ts:B --> T:pg_db
%% service task_server(logos:aws-lambda)[task_server] in planning
%% api_ts:R --> L:task_server
%% service marketing(logos:wordpress-icon)[marketing] in planning
```

View File

@@ -0,0 +1,41 @@
---
tags: mobile, login-flow
---
# Mobile login flow
## description
```mermaid
graph TD;
Start-->A;
A-->B;
B-->C;
B-->D;
D-->E;
E-->F;
C-->G;
G-->A
F-->End;
A[greeting, asking username and password]
B[check if username and password is valid]
C[pasword failed]
D[pasword ok]
E[login success]
F[redirect to '/dashboard']
G[prompt user wrong username and password]
Start((start));
End((end))
```
## test
![alt text](test.gif)
### relations
[REQ0016](../REQ0016/index.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -0,0 +1,44 @@
---
tags: docker
---
# description
docker and public endpoint
## strategy
```mermaid
graph LR
A["next build"]
B["docker build"]
A --> B --> deploy --> run
```
1. build on develop machine
1. docker build on develop machine (include source code)
1. push image to production machine
1. run image to production machine
## endpoint table
| function | address | | status |
| -------- | ---------------------------------------------------------------------------- | ---- | ---------------------------------------------------- |
| DB | [https://demo_ls_db.louislabs.com](https://demo_ls_db.louislabs.com) | 3013 | ![](https://status.iamon99.com/api/badge/108/uptime) |
| cms | [https://demo_ls_cms.louislabs.com](https://demo_ls_cms.louislabs.com) | 3011 | ![](https://status.iamon99.com/api/badge/109/uptime) |
| mobile | [https://demo_ls_mobile.louislabs.com](https://demo_ls_mobile.louislabs.com) | 3012 | ![](https://status.iamon99.com/api/badge/110/uptime) |
| T.B.A. | T.B.A. | 3014 | |
| T.B.A. | T.B.A. | 3015 | |
| T.B.A. | T.B.A. | 3016 | |
| T.B.A. | T.B.A. | 3017 | |
| T.B.A. | T.B.A. | 3018 | |
| T.B.A. | T.B.A. | 3019 | |
| T.B.A. | T.B.A. | 3010 | |
## status panel
[https://status.iamon99.com/status/demo-ls](https://status.iamon99.com/status/demo-ls)
## TODO
pending separated ssl certificate, currently using shared affine.louislabs.com

View File

@@ -1,50 +1,25 @@
# Requirements Index
## REQ0001: project overview
[View Requirement](./REQ0001/index.md)
## REQ0002: lesson page documentation
[View Requirement](./REQ0002/index.md)
## REQ0003: quiz page documentation
[View Requirement](./REQ0003/index.md)
## REQ0004: record page documentation
[View Requirement](./REQ0004/index.md)
## REQ0005: settings page documentation
[View Requirement](./REQ0005/index.md)
## REQ0006: db schema design
[View Requirement](./REQ0006/index.md)
## REQ0007: testing of mobile app home
[View Requirement](./REQ0007/index.md)
## REQ0008: schema design
[View Requirement](./REQ0008/index.md)
## REQ0009: loading screen
[View Requirement](./REQ0009/index.md)
## REQ0010: user friendly error messages
[View Requirement](./REQ0010/index.md)
## REQ0011: developer friendly error messages
[View Requirement](./REQ0011/index.md)
## REQ0012: cms navigation system
[View Requirement](./REQ0012/index.md)
- [REQ0001: project overview](./REQ0001/index.md)
- [REQ0002: time tracking](./REQ0002/index.md)
- [REQ0003: quiz page documentation](./REQ0003/index.md)
- [REQ0004: record page documentation](./REQ0004/index.md)
- [REQ0005: settings page documentation](./REQ0005/index.md)
- [REQ0006: task](./REQ0006/008_update_dbml_from_json.md)
- [REQ0006: GUIDELINES](./REQ0006/_GUIDELINE.md)
- [REQ0006: db schema design](./REQ0006/index.md)
- [REQ0007: testing of mobile app home](./REQ0007/index.md)
- [REQ0008: schema design](./REQ0008/index.md)
- [REQ0009: loading screen](./REQ0009/index.md)
- [REQ0010: user friendly error messages](./REQ0010/index.md)
- [REQ0011: developer friendly error messages](./REQ0011/index.md)
- [REQ0012: cms navigation system](./REQ0012/index.md)
- [REQ0013: cms dashboard](./REQ0013/index.md)
- [REQ0014: mobile client](./REQ0014/index.md)
- [REQ0015: pocketbase json schema to dbml converter](./REQ0015/index.md)
- [REQ0016: CMS login flow](./REQ0016/index.md)
- [REQ0017: lesson page documentation](./REQ0017/index.md)
- [REQ0018: family photo of frameworks](./REQ0018/index.md)
- [REQ0019: System architecture](./REQ0019/index.md)
- [REQ0020: Mobile login flow](./REQ0020/index.md)
- [REQ0021: description](./REQ0021/index.md)

View File

@@ -0,0 +1,5 @@
#!/usr/bin/env bash
set -ex
npx nodemon --delay 0.1 --ext md,js --ignore ./index.md --exec "node ./update_req_index.js"

View File

@@ -36,8 +36,8 @@ async function updateIndex() {
const heading = extractH1(content);
if (heading) {
indexContent += `## ${dir}: ${heading}\n\n`;
indexContent += `[View Requirement](./${dir}/${file})\n\n`;
indexContent += `- [${dir}: ${heading}](./${dir}/${file})\n`;
// indexContent += `[View Requirement](./${dir}/${file})\n\n`;
}
}
}

View File

@@ -0,0 +1,11 @@
{
"folders": [
{
"path": "."
},
{
"path": "../003_test"
}
],
"settings": {}
}

Binary file not shown.

14
002_source/.env Normal file
View File

@@ -0,0 +1,14 @@
# THIS IS env file for use with docker-compose.yml
# cms
# doc
# ionic_mobile
# api_ts
# pocketbase
PB_HOSTNAME=pocketbase
PB_USERNAME=admin@123.com
PB_PASSWORD=Aa12345678

6
002_source/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
**/*.del
**/*.log
**/_archive
**/_del
**/*copy*

74
002_source/README.md Normal file
View File

@@ -0,0 +1,74 @@
# README
## to start production
```bash
# start docker before hand
$ ./dc_build.sh
$ ./dc_up.sh
```
## to start develop
```bash
#
$ ./dc_build.sh
$ ./dc_dev.sh
$ docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d pocketbase api_ts --remove-orphans
$ docker compose logs -f pocketbase api_ts
```
## test api endpoint
```bash
# browse to http://localhost:3000/helloworld
```
```bash
# start docker before hand
$ cd 002_source
$ ./dev.sh
# docker containers up
```
---
## deprecated
```bash
# mobile
$ cd 002_source/mobile
$ pnpm run dev
# cms
$ cd 002_source/cms
$ npm run dev
```
ideation
prototyping
testing
production deployment
evaluation
monitoring
## addresses
```
mobile:
http://localhost:5173
pocketbase:
http://localhost:8090/_
cms:
http://localhost:3000
documentation
http://localhost:3001
```
extend to vocabularies

View File

@@ -0,0 +1,40 @@
# Ignore all files and directories by default
-
# Except for the following:
!.dockerignore
!.gitignore
!.env.example
!.git/
!.env
!.vscode/
!.idea/
# Node.js specific
node_modules/
# Build artifacts
dist/
build/
# Logs
logs/
\*.log
# Environment files
.env\*
# Cache files
\*.cache
# OS generated files
.DS_Store
Thumbs.db

View File

@@ -58,4 +58,4 @@ NEXT_PUBLIC_MAPBOX_API_KEY=
# Google Tag Manager
NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ID=
NEXT_PUBLIC_POCKETBASE_URL=http://localhost:8090
NEXT_PUBLIC_POCKETBASE_URL=http://192.168.222.199:8090

View File

@@ -1,7 +1,6 @@
const { resolve } = require('node:path');
const project = resolve(__dirname, 'tsconfig.json');
module.exports = {
root: true,
extends: [
@@ -83,5 +82,21 @@ module.exports = {
'eslintreact/jsx-sort-props': 'off',
'react/jsx-sort-props': 'off',
},
ignorePatterns: ['**/*del', '**/*bak', '**/*copy.*', '**/*copy*.*'],
ignorePatterns: [
'**/*.del',
'**/*.bak',
'**/*copy.*',
'**/*copy*.*',
'**/*draft*/**',
//
],
overrides: [
{
// override to ignore no-def for `describe`, `it`, and `expect`
files: ['*.test.ts', '*.test.tsx'],
rules: {
'no-undef': 'off',
},
},
],
};

View File

@@ -1,3 +1,10 @@
**/*del
**/*bak
**/*log
**/*tmp
.pnpm-store
.env
.env.production

33
002_source/cms/.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,33 @@
{
"recommendations": [
"wmaurer.change-case",
"saoudrizwan.claude-dev",
"naumovs.color-highlight",
"bocovo.dbml-erd-visualizer",
"aflalo.dbml-formatter",
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
"ms-vscode.vscode-typescript-next",
"tttpob.list-aligner",
"bierner.markdown-mermaid",
"onatm.open-in-new-window",
"christian-kohler.path-intellisense",
"esbenp.prettier-vscode",
"humao.rest-client",
"ryu1kn.text-marker",
"gruntfuggly.todo-tree",
"bibhasdn.unique-lines",
"neptunedesign.vs-sequential-number",
"matt-meyers.vscode-dbml",
"codeium.codeium",
"tencent-cloud.coding-copilot",
"yzhang.markdown-all-in-one",
"stubedston.align-text",
"mads-hartmann.bash-ide-vscode",
"duynvu.dbml-language",
"mikestead.dotenv",
"bpruitt-goddard.mermaid-markdown-syntax-highlighting",
"davidanson.vscode-markdownlint",
"foxundermoon.shell-format"
]
}

17
002_source/cms/Dockerfile Normal file
View File

@@ -0,0 +1,17 @@
# Use official Node 18 base image
FROM node:22-slim
# Install pnpm globally
RUN npm install -g pnpm
# Copy your application code (optional, comment out if not needed)
COPY . /app
RUN cd /app && pnpm i
RUN cd /app && pnpm run build
# Set working directory
WORKDIR /app
# Default command (optional)
CMD ["./scripts/docker/entrypoint.sh"]

View File

@@ -1,9 +1,12 @@
# TODO
need to fix local storage error
page right (next page) button is not working
in the middle of clone lesson type to lesson category
- [ ] listing page
- [ ] delete button on each row
- [ ] create page
- [ ] edit
- [ ] delete
- [ ] listing page
- [ ] delete button on each row
- [ ] create page
- [ ] edit
- [ ] delete

View File

@@ -1,15 +0,0 @@
# guideline
- please divide the problem into small parts
- if you found youself cannot understand the problem, please stop and ask how to do
- if you found youself cannot solve the problem, plesae stop and ask how to do
- review the whole solution before you reply to user
- if code syntax is already there, do follow (e.g. naming convention, syntax) the existing code
- example for page can be found in `./src/app/_helloworld/page.tsx`
- example for component can be found in `./src/components/_helloworld/index.tsx`
- no need to explain the reason until you are told to do so
- no need to show me the code change, at the end just simple summary in point form is ok
Thanks

View File

@@ -0,0 +1,14 @@
{
"folders": [
{
"path": "."
},
{
"path": "./../../001_documentation"
},
{
"path": "../../000_AI_WORKSPACE"
}
],
"settings": {}
}

View File

@@ -4,13 +4,16 @@
"version": "7.0.0",
"private": true,
"engines": {
"node": ">=18"
"node": "==22"
},
"scripts": {
"dev": "next dev",
"dev": "next dev -H 0.0.0.0",
"build": "next build",
"build:w": "pnpx nodemon --ext ts,tsx,json,mjs,js,jsx --delay 15 --exec \"pnpm run build\"",
"start": "next start",
"docker:push": "docker push 192.168.10.61:5000/demo_ls_cms ",
"docker:build": "docker build -t 192.168.10.61:5000/demo_ls_cms .",
"build:docker": "pnpm run build && pnpm run docker:build && pnpm run docker:push",
"start": "next start -H 0.0.0.0",
"lint": "next lint --quiet",
"lint:fix": "next lint --fix",
"lint:w": "pnpx nodemon --ext ts,tsx,json,mjs,js,jsx --delay 5 --exec \"pnpm run lint\"",
@@ -22,8 +25,8 @@
"test": "jest --watch",
"update_doc": "cd 001_documentation/Requirements && node update_req_index.js",
"update_doc:w": "pnpx nodemon --ext md --exec \"pnpm run update_doc\"",
"update_repomix": "npx repomix",
"update_repomix:w": "pnpx nodemon --delay 3 --exec \"pnpx repomix\"",
"update_repomix": "node ./scripts/update_repomix.js",
"update_repomix:w": "pnpx nodemon --delay 3 --exec \"npm run update_repomix\"",
"clean": "rm -rf node_modules && rm -rf .next"
},
"dependencies": {
@@ -91,6 +94,7 @@
"zod": "3.22.4"
},
"devDependencies": {
"@faker-js/faker": "^9.7.0",
"@ianvs/prettier-plugin-sort-imports": "4.1.1",
"@testing-library/jest-dom": "6.4.2",
"@testing-library/react": "14.2.1",
@@ -116,4 +120,4 @@
"protobufjs"
]
}
}
}

View File

@@ -195,6 +195,9 @@ importers:
specifier: 3.22.4
version: 3.22.4
devDependencies:
'@faker-js/faker':
specifier: ^9.7.0
version: 9.7.0
'@ianvs/prettier-plugin-sort-imports':
specifier: 4.1.1
version: 4.1.1(prettier@3.2.5)
@@ -725,6 +728,10 @@ packages:
resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@faker-js/faker@9.7.0':
resolution: {integrity: sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==}
engines: {node: '>=18.0.0', npm: '>=9.0.0'}
'@fastify/busboy@2.1.0':
resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==}
engines: {node: '>=14'}
@@ -6303,6 +6310,8 @@ snapshots:
'@eslint/js@8.57.0': {}
'@faker-js/faker@9.7.0': {}
'@fastify/busboy@2.1.0': {}
'@firebase/analytics-compat@0.2.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27)':

View File

@@ -28,7 +28,10 @@ const config = {
'',
'^[./]',
],
plugins: ['@ianvs/prettier-plugin-sort-imports'],
plugins: [
'@ianvs/prettier-plugin-sort-imports',
//
],
overrides: [
{
files: ['*.tsx'],

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="currentColor" d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38c0-.27.01-1.13.01-2.2c0-.75-.25-1.23-.54-1.48c1.78-.2 3.65-.88 3.65-3.95c0-.88-.31-1.59-.82-2.15c.08-.2.36-1.02-.08-2.12c0 0-.67-.22-2.2.82c-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82c-.44 1.1-.16 1.92-.08 2.12c-.51.56-.82 1.28-.82 2.15c0 3.06 1.86 3.75 3.64 3.95c-.23.2-.44.55-.51 1.07c-.46.21-1.61.55-2.33-.66c-.15-.24-.6-.83-1.23-.82c-.67.01-.27.38.01.53c.34.19.73.9.82 1.13c.16.45.68 1.31 2.69.94c0 .67.01 1.3.01 1.49c0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/></svg>

After

Width:  |  Height:  |  Size: 695 B

View File

@@ -0,0 +1,3 @@
{
"back-to-list": "Teachers"
}

View File

@@ -1,3 +1,6 @@
{
"languageChanged": "Sprache geändert"
"languageChanged": "Sprache geändert",
"teachers": {
"back-to-list": "Lehrer"
}
}

View File

@@ -1,39 +0,0 @@
# PROMPT
please update `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/public/locales/dev/translation.json`
to add below translations, thanks.
```
dashboard.lessonCategories.edit.title
dashboard.lessonCategories.edit.avatar
dashboard.lessonCategories.edit.avatarRequirements
dashboard.lessonCategories.edit.name
dashboard.lessonCategories.edit.type
```
---
please read `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src/components/dashboard/lesson_category/lesson-category-edit-form.tsx`
and update `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/public/locales/dev/translation.json` the missing translations, thanks.
---
please refactor `common.json` to smaller translation files, thanks
e.g. `lessonTypes` -> `lesson_type`
---
Hi, i want you to help merge two translation files.
base_dir=`/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/public/locales/dev`
I want you to merge the content
from `<base_dir>/lesson_type.json` (source file)
to `<base_dir>/listening_practice.json` (dest file)
please extract , link up and remember the document properties
(e.g. types, functions, variables, constants, etc)
update the variables and properties of dest file to reflect `listening practice categories`/`lp_categories`

View File

@@ -1,135 +1,4 @@
{
"languageChanged": "語言已更改",
"type": "類型",
"helloworld": "你好,世界",
"Add": "新增項目",
"visible": "可視",
"hidden": "屏閉",
"Hidden": "屏閉",
"Newest": "最新",
"Oldest": "最舊",
"Lesson position": "位置",
"Lesson type": "種類",
"Type": "種類",
"Name": "名稱",
"Filter by name": "依名稱過濾",
"Filter by type": "依類型過濾",
"Actions": "動作",
"Created at": "建立時間",
"Updated at": "更新時間",
"Position": "位置",
"Visible": "顯示",
"Apply": "套用",
"Overview": "概觀",
"Dashboard": "儀表板",
"Tickets": "票券",
"Sign ups": "註冊",
"Open issues": "開啟問題",
"Closed issues": "關閉問題",
"increase": "增加",
"decrease": "減少",
"common.loading": "載入中",
"vs last month": "與上個月相比",
"Dashboards": "儀表板",
"App usage": "應用程式使用情況",
"Find your dream job": "找到你的夢想工作",
"Need help figuring things out?": "需要幫助嗎?",
"Search for jobs that match your skills and apply to them directly": "搜索符合你技能的工作,直接申請",
"Find answers to your questions and get in touch with our team.": "找到你的問題並與我們的團隊聯繫",
"Explore documentation": "探索文件",
"Learn how to get started with our product and make the most of it.": "學習如何開始使用我們的產品並充分利用它",
"Search Jobs": "搜索工作",
"Help Center": "幫助中心",
"Documentation": "文件",
"increase_in_app_usage_with": "使用者量增加",
"new_products_purchased": "新產品購買",
"Our subscriptions": "我們的訂閱",
"this_year": "今年",
"is_forecasted_to_increase_in_your_traffic_by_the_end_of_the_current_month": "今年預計增加你的流量",
"Jan": "一月",
"Feb": "二月",
"Mar": "三月",
"Apr": "四月",
"May": "五月",
"Jun": "六月",
"Jul": "七月",
"Aug": "八月",
"Sep": "九月",
"Oct": "十月",
"Nov": "十一月",
"Dec": "十二月",
"See all subscriptions": "查看所有訂閱",
"app_chat": "應用程式聊天",
"Upcoming events": "即將發生的事件",
"Based on the linked bank accounts": "基於連結的銀行帳戶",
"App limits": "應用程式限制",
"You have used {percentage} of your available spots.": "您已使用 {percentage} 的可用座位。升級計劃以建立更多專案",
"userMessagesUnread": "hello userMessagesUnread",
"Upgrade plan to create more projects": "升級計劃以建立更多專案",
"You have almost reached your limit": "您已接近您的限制",
"Upgrade plan": "升級計劃",
"Help center": "幫助中心",
"Jobs": "工作",
"go_to_chat": "前往聊天",
"See all events": "查看所有事件",
"You have used": "您已使用",
"of your available spots": "的可用座位",
"Paid": "已付款",
"Canceled": "已取消",
"Pending": "待付款",
"Expiring": "已過期",
"Refunded": "已退款",
"Total": "總計",
"Total paid": "已付款",
"Total cancelled": "已取消",
"Total pending": "待付款",
"year": "年",
"month": "月",
"week": "週",
"day": "日",
"hour": "小時",
"minute": "分鐘",
"second": "秒",
"ago": "前",
"remaining": "剩下",
"days": "天",
"hours": "小時",
"minutes": "分鐘",
"seconds": "秒",
"Clear filters": "清除篩選",
"Type information": "輸入資訊",
"Cancel": "取消",
"Delete": "刪除",
"All": "全部",
"categories": "課程分類",
"loading": "載入中",
"Notifications": "通知",
"Mark all as read": "標記所有為已讀",
"There are no notifications": "沒有通知",
"listenings": "聽講 (Listenings)",
"question_category": "問題分類",
"question_list": "問題",
"matching_frenzy": "配對 (Matching Frenzy)",
"connective_revision": "連接詞 (Connective Revision)",
"settings": "設定",
"students": "學生",
"dashboard.lessonCategories.title": "課程分類",
"dashboard.lessonCategorys.edit.name": "課程分類名稱",
"dashboard.lessonCategorys.edit.position": "課程分類順序",
"dashboard.lessonCategorys.edit.title": "編輯課程分類",
"dashboard.lessonCategorys.edit.visibleToUser": "顯示給使用者",
"dashboard.lessonCategorys.edit.visible": "顯示",
"dashboard.lessonCategorys.edit.hidden": "隱藏",
"dashboard.lessonCategorys.edit.cancelButton": "取消",
"dashboard.lessonCategorys.edit.updateButton": "更新",
"dashboard.lessonCategorys.list.title": "課堂種類",
"word-count": "字數",
"unable-to-process-request": "無法處理請求",
"detailed-error-information": "詳細錯誤資訊",
"error": {
"unable-to-process-request": "無法處理您的請求",
"detailed-error-information": "詳細錯誤資訊"
},
"name-is-required": "名稱為必填",
"listening-practice": "聽講練習"
}
"hello": "world",
"teachers": "teachers"
}

View File

@@ -1,70 +0,0 @@
{
"add": "新增課程分類",
"title": "課程分類",
"basic_info": "基本資訊",
"error": {
"unable-to-process-request": "無法處理您的請求",
"detailed-error-information": "詳細錯誤資訊"
},
"create": {
"title": "建立課程類型",
"createButton": "建立",
"cancelButton": "取消",
"message": "請輸入課程類型名稱",
"success": "課程類型建立成功",
"error": "課程類型建立失敗",
"typeInformation": "輸入課程類型資訊",
"avatar": "上傳課程類型圖片",
"avatar_select": "選擇圖片",
"avatarRequirements": "最小 400x400 像素PNG 或 JPEG",
"select": "請選擇",
"name": "課程類型名稱",
"position": "課程類型順序",
"visibleToUser": "顯示給使用者",
"detail-information": "詳細資訊",
"description": "課程類型描述",
"remarks": "備註"
},
"edit": {
"avatar": "上傳圖片",
"avatarRequirements": "最小 400x400 像素PNG 或 JPEG",
"cancelButton": "取消",
"error": "課程類型更新失敗",
"hidden": "隱藏",
"name": "課程分類名稱",
"position": "課程分類順序",
"select": "請選擇",
"success": "課程類型更新成功",
"title": "編輯課程分類",
"basic-info": "基本資訊",
"type": "類型",
"updateButton": "更新",
"visible": "顯示",
"visibleToUser": "顯示給使用者",
"write-something": "輸入一些內容"
},
"delete": {
"title": "刪除課程類型",
"message": "確定要刪除課程類型嗎?",
"success": "課程類型刪除成功",
"error": "課程類型刪除失敗",
"cancelButton": "取消",
"deleteButton": "刪除"
},
"list": {
"title": "課堂種類",
"message": "請選擇課程類型",
"empty": {
"title": "目前沒有課程類型",
"message": "請建立課程類型",
"create": "建立課程類型"
},
"error": "課程類型載入失敗",
"add": "新增課程分類"
},
"view": {
"basic-details": "基本資訊"
},
"Delete Lesson Type ?": "刪除課程類型?",
"Are you sure you want to delete lesson type ?": "確定要刪除課程類型嗎?"
}

View File

@@ -1,65 +0,0 @@
{
"add": "新增課程類型",
"title": "課程類型",
"type": "類型",
"error": {
"unable-to-process-request": "無法處理您的請求",
"detailed-error-information": "詳細錯誤資訊"
},
"create": {
"title": "建立課程類型",
"createButton": "建立",
"cancelButton": "取消",
"message": "請輸入課程類型名稱",
"success": "課程類型建立成功",
"error": "課程類型建立失敗",
"typeInformation": "輸入課程類型資訊",
"avatar": "上傳課程類型圖片",
"avatarRequirements": "上傳課程類型圖片",
"select": "請選擇",
"name": "課程類型名稱",
"position": "課程類型順序",
"visibleToUser": "顯示給使用者"
},
"edit": {
"avatar": "上傳課程類型圖片",
"avatarRequirements": "上傳課程類型圖片",
"cancelButton": "取消",
"error": "課程類型更新失敗",
"hidden": "隱藏",
"name": "課程類型名稱",
"position": "課程類型順序",
"select": "請選擇",
"success": "課程類型更新成功",
"title": "編輯課程類型",
"typeInformation": "輸入課程類型資訊",
"updateButton": "更新",
"visible": "顯示",
"visibleToUser": "顯示給使用者"
},
"delete": {
"title": "刪除課程類型",
"message": "確定要刪除課程類型嗎?",
"success": "課程類型刪除成功",
"error": "課程類型刪除失敗",
"cancelButton": "取消",
"deleteButton": "刪除"
},
"list": {
"title": "課程類型列表",
"message": "請選擇課程類型",
"empty": {
"title": "目前沒有課程類型",
"message": "請建立課程類型",
"create": "建立課程類型"
},
"error": "課程類型載入失敗"
},
"view": {
"basic-details": "基本資訊"
},
"Lesson Type": "課程類型",
"Lesson Types": "課程類型",
"Delete Lesson Type ?": "刪除課程類型?",
"Are you sure you want to delete lesson type ?": "確定要刪除課程類型嗎?"
}

View File

@@ -1,36 +0,0 @@
{
"add": "新增",
"listening-practice": "聽力練習",
"list": {
"title": "聽力練習分類列表",
"empty": "沒有找到聽力練習分類",
"action": "動作?",
"basic-details": "基本資料"
},
"helloworld": "listening_practice",
"title": "聽力練習分類",
"type": "聽力練習分類",
"error": {
"invalid": "無效的聽力練習分類",
"not_found": "未找到聽力練習分類"
},
"create": {
"title": "創建聽力練習分類",
"success": "聽力練習分類創建成功",
"error": "創建聽力練習分類時出錯"
},
"edit": {
"title": "編輯聽力練習分類",
"success": "聽力練習分類更新成功",
"error": "更新聽力練習分類時出錯"
},
"delete": {
"title": "刪除聽力練習分類",
"confirm": "確定要刪除聽力練習分類嗎?",
"success": "聽力練習分類刪除成功",
"error": "刪除聽力練習分類時出錯"
},
"view": {
"title": "查看聽力練習分類詳情"
}
}

View File

@@ -0,0 +1,31 @@
{
"sign-in": "Sign in / 登入",
"dont-have-an-account": "Don't have an account ?",
"continue-with_fh": "以",
"continue-with_sh": "繼續",
"forgot-password": "Forgot password",
"user": "用戶名稱",
"password": "密碼",
"email-address": "用戶電郵",
"first-name-is-required": "名字是必填项",
"last-name-is-required": "姓氏不能为空",
"email-is-required": "邮箱不能为空",
"password-should-be-at-least-6-characters": "密码至少需要6个字符",
"you-must-accept-the-terms-and-conditions": "您必须接受条款和条件",
"sign-up": "注册",
"already-have-an-account": "已有账号?",
"or": "或",
"create-account": "创建账号",
"created-users-are-not-persisted": "已创建的用户不会被保存",
"i-have-read-the": "我已阅读",
"terms-and-conditions": "用户协议和隐私政策",
"e.g.": "例如:",
"first-name": "名",
"last-name": "姓",
"hello": "world",
"welcome-title": "Welcome to devias kit pro",
"welcome-notes": "A professional template that comes with ready-to-use MUI components developed with one common goal in mind, help you build faster & beautiful applications.",
"reset-password": "重置密码",
"back-to-login": "返回登录",
"send-recovery-link": "发送恢复链接"
}

View File

@@ -0,0 +1,3 @@
{
"back-to-list": "Teachers"
}

View File

@@ -1,200 +0,0 @@
{
"languageChanged": "語言已更改",
"type": "類型",
"helloworld": "你好,世界",
"Add": "新增項目",
"visible": "可視",
"hidden": "屏閉",
"Hidden": "屏閉",
"Newest": "最新",
"Oldest": "最舊",
"Lesson position": "位置",
"Lesson type": "種類",
"Type": "種類",
"Name": "名稱",
"Filter by name": "依名稱過濾",
"Filter by type": "依類型過濾",
"dashboard.lessonTypes.add": "新增課程類型",
"dashboard.lessonTypes.title": "課程類型",
"dashboard.lessonTypes.type": "類型",
"dashboard.lessonTypes.create.title": "建立課程類型",
"dashboard.lessonTypes.create.createButton": "建立",
"dashboard.lessonTypes.create.cancelButton": "取消",
"dashboard.lessonTypes.edit.title": "編輯課程類型",
"Actions": "動作",
"Created at": "建立時間",
"Updated at": "更新時間",
"dashboard.lessonTypes.edit": "編輯課程類型",
"dashboard.lessonTypes.delete": "刪除課程類型",
"dashboard.lessonTypes.delete.title": "刪除課程類型",
"dashboard.lessonTypes.delete.message": "確定要刪除課程類型嗎?",
"Lesson Type": "課程類型",
"dashboard.lessonTypes.create": "建立課程類型",
"dashboard.lessonTypes.create.message": "請輸入課程類型名稱",
"dashboard.lessonTypes.create.success": "課程類型建立成功",
"dashboard.lessonTypes.create.error": "課程類型建立失敗",
"dashboard.lessonTypes.edit.success": "課程類型更新成功",
"dashboard.lessonTypes.edit.error": "課程類型更新失敗",
"dashboard.lessonTypes.delete.success": "課程類型刪除成功",
"dashboard.lessonTypes.delete.error": "課程類型刪除失敗",
"dashboard.lessonTypes.list": "課程類型列表",
"dashboard.lessonTypes.list.title": "課程類型列表",
"dashboard.lessonTypes.list.message": "請選擇課程類型",
"dashboard.lessonTypes.list.empty": "目前沒有課程類型",
"dashboard.lessonTypes.list.empty.title": "目前沒有課程類型",
"dashboard.lessonTypes.list.empty.message": "請建立課程類型",
"dashboard.lessonTypes.list.empty.create": "建立課程類型",
"Lesson Name": "課程名稱",
"dashboard.lessonTypes.list.empty.create.title": "建立課程類型",
"dashboard.lessonTypes.list.empty.create.message": "請輸入課程名稱",
"dashboard.lessonTypes.list.empty.create.success": "課程建立成功",
"dashboard.lessonTypes.list.empty.create.error": "課程建立失敗",
"dashboard.lessonTypes.list.empty.create.name": "課程名稱",
"dashboard.lessonTypes.list.empty.create.type": "課程類型",
"dashboard.lessonTypes.list.empty.create.type.placeholder": "請選擇課程類型",
"dashboard.lessonTypes.list.empty.create.type.title": "課程類型",
"dashboard.lessonTypes.list.empty.create.type.message": "請選擇課程類型",
"dashboard.lessonTypes.list.empty.create.type.empty": "目前沒有課程類型",
"dashboard.lessonTypes.list.empty.create.type.empty.title": "目前沒有課程類型",
"dashboard.lessonTypes.list.empty.create.type.empty.message": "請建立課程類型",
"dashboard.lessonTypes.list.empty.create.type.empty.create": "建立課程類型",
"Position": "位置",
"Visible": "顯示",
"Lesson Types": "課程類型",
"Apply": "套用",
"Overview": "概觀",
"Dashboard": "儀表板",
"Tickets": "票券",
"Sign ups": "註冊",
"Open issues": "開啟問題",
"Closed issues": "關閉問題",
"increase": "增加",
"decrease": "減少",
"common.loading": "載入中",
"vs last month": "與上個月相比",
"Dashboards": "儀表板",
"App usage": "應用程式使用情況",
"Find your dream job": "找到你的夢想工作",
"Need help figuring things out?": "需要幫助嗎?",
"Search for jobs that match your skills and apply to them directly": "搜索符合你技能的工作,直接申請",
"Find answers to your questions and get in touch with our team.": "找到你的問題並與我們的團隊聯繫",
"Explore documentation": "探索文件",
"Learn how to get started with our product and make the most of it.": "學習如何開始使用我們的產品並充分利用它",
"Search Jobs": "搜索工作",
"Help Center": "幫助中心",
"Documentation": "文件",
"increase_in_app_usage_with": "使用者量增加",
"new_products_purchased": "新產品購買",
"Our subscriptions": "我們的訂閱",
"this_year": "今年",
"is_forecasted_to_increase_in_your_traffic_by_the_end_of_the_current_month": "今年預計增加你的流量",
"Jan": "一月",
"Feb": "二月",
"Mar": "三月",
"Apr": "四月",
"May": "五月",
"Jun": "六月",
"Jul": "七月",
"Aug": "八月",
"Sep": "九月",
"Oct": "十月",
"Nov": "十一月",
"Dec": "十二月",
"See all subscriptions": "查看所有訂閱",
"app_chat": "應用程式聊天",
"Upcoming events": "即將發生的事件",
"Based on the linked bank accounts": "基於連結的銀行帳戶",
"App limits": "應用程式限制",
"You have used {percentage} of your available spots.": "您已使用 {percentage} 的可用座位。升級計劃以建立更多專案",
"userMessagesUnread": "hello userMessagesUnread",
"Upgrade plan to create more projects": "升級計劃以建立更多專案",
"You have almost reached your limit": "您已接近您的限制",
"Upgrade plan": "升級計劃",
"Help center": "幫助中心",
"Jobs": "工作",
"go_to_chat": "前往聊天",
"See all events": "查看所有事件",
"You have used": "您已使用",
"of your available spots": "的可用座位",
"Paid": "已付款",
"Canceled": "已取消",
"Pending": "待付款",
"Expiring": "已過期",
"Refunded": "已退款",
"Total": "總計",
"Total paid": "已付款",
"Total cancelled": "已取消",
"Total pending": "待付款",
"year": "年",
"month": "月",
"week": "週",
"day": "日",
"hour": "小時",
"minute": "分鐘",
"second": "秒",
"ago": "前",
"remaining": "剩下",
"days": "天",
"hours": "小時",
"minutes": "分鐘",
"seconds": "秒",
"Clear filters": "清除篩選",
"Type information": "輸入資訊",
"dashboard.lessonTypes.create.typeInformation": "輸入課程類型資訊",
"dashboard.lessonTypes.create.avatar": "上傳課程類型圖片",
"dashboard.lessonTypes.create.avatarRequirements": "上傳課程類型圖片",
"dashboard.lessonTypes.create.select": "請選擇",
"dashboard.lessonTypes.create.name": "課程類型名稱",
"dashboard.lessonTypes.create.type": "課程類型",
"dashboard.lessonTypes.create.position": "課程類型順序",
"dashboard.lessonTypes.create.visibleToUser": "顯示給使用者",
"dashboard.lessonTypes.edit.typeInformation": "輸入課程類型資訊",
"dashboard.lessonTypes.edit.avatar": "上傳課程類型圖片",
"dashboard.lessonTypes.edit.avatarRequirements": "上傳課程類型圖片",
"dashboard.lessonTypes.edit.select": "請選擇",
"dashboard.lessonTypes.edit.name": "課程類型名稱",
"dashboard.lessonTypes.edit.type": "課程類型",
"dashboard.lessonTypes.edit.position": "課程類型順序",
"dashboard.lessonTypes.edit.visibleToUser": "顯示給使用者",
"dashboard.lessonTypes.edit.visible": "顯示",
"dashboard.lessonTypes.edit.hidden": "隱藏",
"dashboard.lessonTypes.edit.cancelButton": "取消",
"dashboard.lessonTypes.edit.updateButton": "更新",
"Delete Lesson Type ?": "刪除課程類型?",
"Are you sure you want to delete lesson type ?": "確定要刪除課程類型嗎?",
"Cancel": "取消",
"Delete": "刪除",
"All": "全部",
"categories": "問題分類",
"listening-practice": "聽講練習 (LP)",
"matching-frenzy": "配對練習 (MF)",
"connective-revision": "連接詞練習 (CR)",
"teachers": "導師",
"questions": "題目",
"loading": "載入中",
"Notifications": "通知",
"Mark all as read": "標記所有為已讀",
"There are no notifications": "沒有通知",
"listenings": "聽講 (Listenings)",
"question_category": "問題分類",
"question_list": "問題",
"matching_frenzy": "配對 (Matching Frenzy)",
"connective_revision": "連接詞 (Connective Revision)",
"settings": "設定",
"students": "學生",
"dashboard.lessonCategories.add": "新增課程分類",
"dashboard.lessonCategories.title": "課程分類",
"dashboard.lessonCategorys.edit.name": "課程分類名稱",
"dashboard.lessonCategorys.edit.position": "課程分類順序",
"dashboard.lessonCategorys.edit.title": "編輯課程分類",
"dashboard.lessonCategorys.edit.visibleToUser": "顯示給使用者",
"dashboard.lessonCategorys.edit.visible": "顯示",
"dashboard.lessonCategorys.edit.hidden": "隱藏",
"dashboard.lessonCategorys.edit.cancelButton": "取消",
"dashboard.lessonCategorys.edit.updateButton": "更新",
"dashboard.lessonCategorys.list.title": "課堂種類",
"word-count": "字數",
"dashboard.lessonTypes.list.error": "課程類型載入失敗",
"unable-to-process-request": "無法處理請求",
"detailed-error-information": "詳細錯誤資訊"
}

View File

@@ -0,0 +1,3 @@
{
"back-to-list": "Teachers"
}

View File

@@ -1,3 +1,7 @@
{
"languageChanged": "Language changed"
"languageChanged": "Language changed",
"teachers": {
"nav-title": "teachers",
"back-to-list": "Teachers"
}
}

View File

@@ -0,0 +1,3 @@
{
"back-to-list": "Teachers"
}

View File

@@ -1,3 +1,6 @@
{
"languageChanged": "Idioma cambiado"
"languageChanged": "Idioma cambiado",
"teachers": {
"back-to-list": "Profesores"
}
}

View File

@@ -3,5 +3,11 @@
set -ex
reset
rm -rf .next
# rm -rf .next
# pnpm run typecheck
# pnpm run lint
# echo "check ok"
pnpm run build

Some files were not shown because too many files have changed in this diff Show More