Compare commits
5 Commits
f435300740
...
bc1ec72df1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bc1ec72df1 | ||
![]() |
e62dc5f597 | ||
![]() |
b5e9c8ba34 | ||
![]() |
9a8fd1c073 | ||
![]() |
25c1d3c917 |
25
000_AI_WORKSPACE/software-engineer/_examples/001_clone.md
Normal file
25
000_AI_WORKSPACE/software-engineer/_examples/001_clone.md
Normal 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
|
||||||
|
|
||||||
|
---
|
@@ -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
|
@@ -0,0 +1,11 @@
|
|||||||
|
# Greetings
|
||||||
|
|
||||||
|
Hi,
|
||||||
|
Imaging 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
|
@@ -0,0 +1,32 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
- if the directory contains `_GUIDELINES.md`, please read it before operation
|
@@ -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)
|
22
000_AI_WORKSPACE/software-engineer/greetings/010_FAQ.md
Normal file
22
000_AI_WORKSPACE/software-engineer/greetings/010_FAQ.md
Normal 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.
|
39
000_AI_WORKSPACE/software-engineer/greetings/013_DB.md
Normal file
39
000_AI_WORKSPACE/software-engineer/greetings/013_DB.md
Normal 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
|
21
000_AI_WORKSPACE/testing-engineer/_examples/001_clone.md
Normal file
21
000_AI_WORKSPACE/testing-engineer/_examples/001_clone.md
Normal 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
|
||||||
|
|
||||||
|
---
|
@@ -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
|
@@ -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
|
28
000_AI_WORKSPACE/testing-engineer/greetings/002_guideline.md
Normal file
28
000_AI_WORKSPACE/testing-engineer/greetings/002_guideline.md
Normal 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
|
@@ -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)
|
7
000_AI_WORKSPACE/testing-engineer/greetings/010_FAQ.md
Normal file
7
000_AI_WORKSPACE/testing-engineer/greetings/010_FAQ.md
Normal 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.
|
48
000_AI_WORKSPACE/testing-engineer/greetings/013_DB.md
Normal file
48
000_AI_WORKSPACE/testing-engineer/greetings/013_DB.md
Normal 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
|
@@ -29,6 +29,7 @@ export function AuthGuard({ children }: AuthGuardProps): React.JSX.Element | nul
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: here state that if user = null, eject user to login page
|
||||||
if (!user) {
|
if (!user) {
|
||||||
logger.debug('[AuthGuard]: User is not logged in, redirecting to sign in');
|
logger.debug('[AuthGuard]: User is not logged in, redirecting to sign in');
|
||||||
|
|
||||||
|
10
002_source/cms/src/components/auth/custom/_GUIDELINES.md
Normal file
10
002_source/cms/src/components/auth/custom/_GUIDELINES.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# GUIDELINES
|
||||||
|
|
||||||
|
This folder contains login pages
|
||||||
|
|
||||||
|
the `@` sign refer to `/home/logic/_wsl_workspace/001_github_ws/lettersoup-online-ws/lettersoup-online/project/002_source/cms/src`
|
||||||
|
|
||||||
|
## Assumption and Requirements
|
||||||
|
|
||||||
|
- assume `pb` is located in `@/lib/pb`
|
||||||
|
- no need to handle error in this function, i'll handle it in the caller
|
@@ -1,4 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
// RULES:
|
||||||
|
// refer to ticket REQ0016 for login flow
|
||||||
|
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import RouterLink from 'next/link';
|
import RouterLink from 'next/link';
|
||||||
@@ -25,6 +27,7 @@ import { authClient } from '@/lib/auth/custom/client';
|
|||||||
import { useUser } from '@/hooks/use-user';
|
import { useUser } from '@/hooks/use-user';
|
||||||
import { DynamicLogo } from '@/components/core/logo';
|
import { DynamicLogo } from '@/components/core/logo';
|
||||||
import { toast } from '@/components/core/toaster';
|
import { toast } from '@/components/core/toaster';
|
||||||
|
import { pb } from '@/lib/pb';
|
||||||
|
|
||||||
interface OAuthProvider {
|
interface OAuthProvider {
|
||||||
id: 'google' | 'discord';
|
id: 'google' | 'discord';
|
||||||
@@ -44,7 +47,7 @@ const schema = zod.object({
|
|||||||
|
|
||||||
type Values = zod.infer<typeof schema>;
|
type Values = zod.infer<typeof schema>;
|
||||||
|
|
||||||
const defaultValues = { email: '', password: '' } satisfies Values;
|
const defaultValues = { email: 'admin@123.com', password: 'admin@123.com' } satisfies Values;
|
||||||
|
|
||||||
export function SignInForm(): React.JSX.Element {
|
export function SignInForm(): React.JSX.Element {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -103,15 +106,31 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
return (
|
return (
|
||||||
<Stack spacing={4}>
|
<Stack spacing={4}>
|
||||||
<div>
|
<div>
|
||||||
<Box component={RouterLink} href={paths.home} sx={{ display: 'inline-block', fontSize: 0 }}>
|
<Box
|
||||||
<DynamicLogo colorDark="light" colorLight="dark" height={32} width={122} />
|
component={RouterLink}
|
||||||
|
href={paths.home}
|
||||||
|
sx={{ display: 'inline-block', fontSize: 0 }}
|
||||||
|
>
|
||||||
|
<DynamicLogo
|
||||||
|
colorDark="light"
|
||||||
|
colorLight="dark"
|
||||||
|
height={32}
|
||||||
|
width={122}
|
||||||
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
</div>
|
</div>
|
||||||
<Stack spacing={1}>
|
<Stack spacing={1}>
|
||||||
<Typography variant="h5">Sign in</Typography>
|
<Typography variant="h5">Sign in</Typography>
|
||||||
<Typography color="text.secondary" variant="body2">
|
<Typography
|
||||||
|
color="text.secondary"
|
||||||
|
variant="body2"
|
||||||
|
>
|
||||||
Don't have an account?{' '}
|
Don't have an account?{' '}
|
||||||
<Link component={RouterLink} href={paths.auth.custom.signUp} variant="subtitle2">
|
<Link
|
||||||
|
component={RouterLink}
|
||||||
|
href={paths.auth.custom.signUp}
|
||||||
|
variant="subtitle2"
|
||||||
|
>
|
||||||
Sign up
|
Sign up
|
||||||
</Link>
|
</Link>
|
||||||
</Typography>
|
</Typography>
|
||||||
@@ -123,7 +142,15 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
<Button
|
<Button
|
||||||
color="secondary"
|
color="secondary"
|
||||||
disabled={isPending}
|
disabled={isPending}
|
||||||
endIcon={<Box alt="" component="img" height={24} src={provider.logo} width={24} />}
|
endIcon={
|
||||||
|
<Box
|
||||||
|
alt=""
|
||||||
|
component="img"
|
||||||
|
height={24}
|
||||||
|
src={provider.logo}
|
||||||
|
width={24}
|
||||||
|
/>
|
||||||
|
}
|
||||||
key={provider.id}
|
key={provider.id}
|
||||||
onClick={(): void => {
|
onClick={(): void => {
|
||||||
onAuth(provider.id).catch(() => {
|
onAuth(provider.id).catch(() => {
|
||||||
@@ -147,7 +174,10 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormControl error={Boolean(errors.email)}>
|
<FormControl error={Boolean(errors.email)}>
|
||||||
<InputLabel>Email address</InputLabel>
|
<InputLabel>Email address</InputLabel>
|
||||||
<OutlinedInput {...field} type="email" />
|
<OutlinedInput
|
||||||
|
{...field}
|
||||||
|
type="email"
|
||||||
|
/>
|
||||||
{errors.email ? <FormHelperText>{errors.email.message}</FormHelperText> : null}
|
{errors.email ? <FormHelperText>{errors.email.message}</FormHelperText> : null}
|
||||||
</FormControl>
|
</FormControl>
|
||||||
)}
|
)}
|
||||||
@@ -187,27 +217,65 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
{errors.root ? <Alert color="error">{errors.root.message}</Alert> : null}
|
{errors.root ? <Alert color="error">{errors.root.message}</Alert> : null}
|
||||||
<Button disabled={isPending} type="submit" variant="contained">
|
<Button
|
||||||
|
disabled={isPending}
|
||||||
|
type="submit"
|
||||||
|
variant="contained"
|
||||||
|
>
|
||||||
Sign in
|
Sign in
|
||||||
</Button>
|
</Button>
|
||||||
</Stack>
|
</Stack>
|
||||||
</form>
|
</form>
|
||||||
<div>
|
<div>
|
||||||
<Link component={RouterLink} href={paths.auth.custom.resetPassword} variant="subtitle2">
|
<Link
|
||||||
|
component={RouterLink}
|
||||||
|
href={paths.auth.custom.resetPassword}
|
||||||
|
variant="subtitle2"
|
||||||
|
>
|
||||||
Forgot password?
|
Forgot password?
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Stack>
|
</Stack>
|
||||||
<Alert color="warning">
|
<Alert color="warning">
|
||||||
Use{' '}
|
<Stack>
|
||||||
<Typography component="span" sx={{ fontWeight: 700 }} variant="inherit">
|
<Box>
|
||||||
|
user:{' '}
|
||||||
|
<Typography
|
||||||
|
component="span"
|
||||||
|
sx={{ fontWeight: 700 }}
|
||||||
|
variant="inherit"
|
||||||
|
>
|
||||||
|
admin@123.com
|
||||||
|
</Typography>{' '}
|
||||||
|
password{' '}
|
||||||
|
<Typography
|
||||||
|
component="span"
|
||||||
|
sx={{ fontWeight: 700 }}
|
||||||
|
variant="inherit"
|
||||||
|
>
|
||||||
|
admin@123.com
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
user{' '}
|
||||||
|
<Typography
|
||||||
|
component="span"
|
||||||
|
sx={{ fontWeight: 700 }}
|
||||||
|
variant="inherit"
|
||||||
|
>
|
||||||
sofia@devias.io
|
sofia@devias.io
|
||||||
</Typography>{' '}
|
</Typography>{' '}
|
||||||
with password{' '}
|
password{' '}
|
||||||
<Typography component="span" sx={{ fontWeight: 700 }} variant="inherit">
|
<Typography
|
||||||
|
component="span"
|
||||||
|
sx={{ fontWeight: 700 }}
|
||||||
|
variant="inherit"
|
||||||
|
>
|
||||||
Secret1
|
Secret1
|
||||||
</Typography>
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
</Alert>
|
</Alert>
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
|
@@ -115,15 +115,31 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
return (
|
return (
|
||||||
<Stack spacing={4}>
|
<Stack spacing={4}>
|
||||||
<div>
|
<div>
|
||||||
<Box component={RouterLink} href={paths.home} sx={{ display: 'inline-block', fontSize: 0 }}>
|
<Box
|
||||||
<DynamicLogo colorDark="light" colorLight="dark" height={32} width={122} />
|
component={RouterLink}
|
||||||
|
href={paths.home}
|
||||||
|
sx={{ display: 'inline-block', fontSize: 0 }}
|
||||||
|
>
|
||||||
|
<DynamicLogo
|
||||||
|
colorDark="light"
|
||||||
|
colorLight="dark"
|
||||||
|
height={32}
|
||||||
|
width={122}
|
||||||
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
</div>
|
</div>
|
||||||
<Stack spacing={1}>
|
<Stack spacing={1}>
|
||||||
<Typography variant="h5">Sign in</Typography>
|
<Typography variant="h5">Sign in</Typography>
|
||||||
<Typography color="text.secondary" variant="body2">
|
<Typography
|
||||||
|
color="text.secondary"
|
||||||
|
variant="body2"
|
||||||
|
>
|
||||||
Don't have an account?{' '}
|
Don't have an account?{' '}
|
||||||
<Link component={RouterLink} href={paths.auth.supabase.signUp} variant="subtitle2">
|
<Link
|
||||||
|
component={RouterLink}
|
||||||
|
href={paths.auth.supabase.signUp}
|
||||||
|
variant="subtitle2"
|
||||||
|
>
|
||||||
Sign up
|
Sign up
|
||||||
</Link>
|
</Link>
|
||||||
</Typography>
|
</Typography>
|
||||||
@@ -135,7 +151,15 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
<Button
|
<Button
|
||||||
color="secondary"
|
color="secondary"
|
||||||
disabled={isPending}
|
disabled={isPending}
|
||||||
endIcon={<Box alt="" component="img" height={24} src={provider.logo} width={24} />}
|
endIcon={
|
||||||
|
<Box
|
||||||
|
alt=""
|
||||||
|
component="img"
|
||||||
|
height={24}
|
||||||
|
src={provider.logo}
|
||||||
|
width={24}
|
||||||
|
/>
|
||||||
|
}
|
||||||
key={provider.id}
|
key={provider.id}
|
||||||
onClick={(): void => {
|
onClick={(): void => {
|
||||||
onAuth(provider.id).catch(() => {
|
onAuth(provider.id).catch(() => {
|
||||||
@@ -159,7 +183,10 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormControl error={Boolean(errors.email)}>
|
<FormControl error={Boolean(errors.email)}>
|
||||||
<InputLabel>Email address</InputLabel>
|
<InputLabel>Email address</InputLabel>
|
||||||
<OutlinedInput {...field} type="email" />
|
<OutlinedInput
|
||||||
|
{...field}
|
||||||
|
type="email"
|
||||||
|
/>
|
||||||
{errors.email ? <FormHelperText>{errors.email.message}</FormHelperText> : null}
|
{errors.email ? <FormHelperText>{errors.email.message}</FormHelperText> : null}
|
||||||
</FormControl>
|
</FormControl>
|
||||||
)}
|
)}
|
||||||
@@ -199,13 +226,21 @@ export function SignInForm(): React.JSX.Element {
|
|||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
{errors.root ? <Alert color="error">{errors.root.message}</Alert> : null}
|
{errors.root ? <Alert color="error">{errors.root.message}</Alert> : null}
|
||||||
<Button disabled={isPending} type="submit" variant="contained">
|
<Button
|
||||||
|
disabled={isPending}
|
||||||
|
type="submit"
|
||||||
|
variant="contained"
|
||||||
|
>
|
||||||
Sign in
|
Sign in
|
||||||
</Button>
|
</Button>
|
||||||
</Stack>
|
</Stack>
|
||||||
</form>
|
</form>
|
||||||
<div>
|
<div>
|
||||||
<Link component={RouterLink} href={paths.auth.supabase.resetPassword} variant="subtitle2">
|
<Link
|
||||||
|
component={RouterLink}
|
||||||
|
href={paths.auth.supabase.resetPassword}
|
||||||
|
variant="subtitle2"
|
||||||
|
>
|
||||||
Forgot password?
|
Forgot password?
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -37,7 +37,11 @@ export function CustomSignOut(): React.JSX.Element {
|
|||||||
}, [checkSession, router]);
|
}, [checkSession, router]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MenuItem component="div" onClick={handleSignOut} sx={{ justifyContent: 'center' }}>
|
<MenuItem
|
||||||
|
component="div"
|
||||||
|
onClick={handleSignOut}
|
||||||
|
sx={{ justifyContent: 'center' }}
|
||||||
|
>
|
||||||
Sign out
|
Sign out
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
);
|
);
|
||||||
|
@@ -23,8 +23,10 @@ import { CognitoSignOut } from './cognito-sign-out';
|
|||||||
import { CustomSignOut } from './custom-sign-out';
|
import { CustomSignOut } from './custom-sign-out';
|
||||||
import { FirebaseSignOut } from './firebase-sign-out';
|
import { FirebaseSignOut } from './firebase-sign-out';
|
||||||
import { SupabaseSignOut } from './supabase-sign-out';
|
import { SupabaseSignOut } from './supabase-sign-out';
|
||||||
|
import { authClient } from '@/lib/auth/custom/client';
|
||||||
|
import { logger } from '@/lib/default-logger';
|
||||||
|
|
||||||
const user = {
|
const defaultUser = {
|
||||||
id: 'USR-000',
|
id: 'USR-000',
|
||||||
name: 'Sofia Rivers',
|
name: 'Sofia Rivers',
|
||||||
avatar: '/assets/avatar.png',
|
avatar: '/assets/avatar.png',
|
||||||
@@ -38,6 +40,23 @@ export interface UserPopoverProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function UserPopover({ anchorEl, onClose, open }: UserPopoverProps): React.JSX.Element {
|
export function UserPopover({ anchorEl, onClose, open }: UserPopoverProps): React.JSX.Element {
|
||||||
|
const [userMeta, setUserMeta] = React.useState<User>(defaultUser);
|
||||||
|
async function loadUserMeta(): Promise<void> {
|
||||||
|
try {
|
||||||
|
const tempUserMeta = await authClient.getUser();
|
||||||
|
if (tempUserMeta.error) throw new Error(tempUserMeta.error);
|
||||||
|
setUserMeta(tempUserMeta.data as unknown as User);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
void loadUserMeta();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (!userMeta) return <>loading</>;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover
|
<Popover
|
||||||
anchorEl={anchorEl}
|
anchorEl={anchorEl}
|
||||||
@@ -48,26 +67,41 @@ export function UserPopover({ anchorEl, onClose, open }: UserPopoverProps): Reac
|
|||||||
transformOrigin={{ horizontal: 'right', vertical: 'top' }}
|
transformOrigin={{ horizontal: 'right', vertical: 'top' }}
|
||||||
>
|
>
|
||||||
<Box sx={{ p: 2 }}>
|
<Box sx={{ p: 2 }}>
|
||||||
<Typography>{user.name}</Typography>
|
<Typography>{userMeta.name}</Typography>
|
||||||
<Typography color="text.secondary" variant="body2">
|
<Typography
|
||||||
{user.email}
|
color="text.secondary"
|
||||||
|
variant="body2"
|
||||||
|
>
|
||||||
|
{userMeta.email}
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>
|
</Box>
|
||||||
<Divider />
|
<Divider />
|
||||||
<List sx={{ p: 1 }}>
|
<List sx={{ p: 1 }}>
|
||||||
<MenuItem component={RouterLink} href={paths.dashboard.settings.account} onClick={onClose}>
|
<MenuItem
|
||||||
|
component={RouterLink}
|
||||||
|
href={paths.dashboard.settings.account}
|
||||||
|
onClick={onClose}
|
||||||
|
>
|
||||||
<ListItemIcon>
|
<ListItemIcon>
|
||||||
<UserIcon />
|
<UserIcon />
|
||||||
</ListItemIcon>
|
</ListItemIcon>
|
||||||
Account
|
Account
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem component={RouterLink} href={paths.dashboard.settings.security} onClick={onClose}>
|
<MenuItem
|
||||||
|
component={RouterLink}
|
||||||
|
href={paths.dashboard.settings.security}
|
||||||
|
onClick={onClose}
|
||||||
|
>
|
||||||
<ListItemIcon>
|
<ListItemIcon>
|
||||||
<LockKeyIcon />
|
<LockKeyIcon />
|
||||||
</ListItemIcon>
|
</ListItemIcon>
|
||||||
Security
|
Security
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem component={RouterLink} href={paths.dashboard.settings.billing} onClick={onClose}>
|
<MenuItem
|
||||||
|
component={RouterLink}
|
||||||
|
href={paths.dashboard.settings.billing}
|
||||||
|
onClick={onClose}
|
||||||
|
>
|
||||||
<ListItemIcon>
|
<ListItemIcon>
|
||||||
<CreditCardIcon />
|
<CreditCardIcon />
|
||||||
</ListItemIcon>
|
</ListItemIcon>
|
||||||
|
@@ -60,7 +60,11 @@ export function MainNav({ items }: MainNavProps): React.JSX.Element {
|
|||||||
py: 1,
|
py: 1,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Stack direction="row" spacing={2} sx={{ alignItems: 'center', flex: '1 1 auto' }}>
|
<Stack
|
||||||
|
direction="row"
|
||||||
|
spacing={2}
|
||||||
|
sx={{ alignItems: 'center', flex: '1 1 auto' }}
|
||||||
|
>
|
||||||
<IconButton
|
<IconButton
|
||||||
onClick={(): void => {
|
onClick={(): void => {
|
||||||
setOpenNav(true);
|
setOpenNav(true);
|
||||||
@@ -105,11 +109,17 @@ function SearchButton(): React.JSX.Element {
|
|||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Tooltip title="Search">
|
<Tooltip title="Search">
|
||||||
<IconButton onClick={dialog.handleOpen} sx={{ display: { xs: 'none', lg: 'inline-flex' } }}>
|
<IconButton
|
||||||
|
onClick={dialog.handleOpen}
|
||||||
|
sx={{ display: { xs: 'none', lg: 'inline-flex' } }}
|
||||||
|
>
|
||||||
<MagnifyingGlassIcon />
|
<MagnifyingGlassIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<SearchDialog onClose={dialog.handleClose} open={dialog.open} />
|
<SearchDialog
|
||||||
|
onClose={dialog.handleClose}
|
||||||
|
open={dialog.open}
|
||||||
|
/>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -120,11 +130,18 @@ function ContactsButton(): React.JSX.Element {
|
|||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Tooltip title="Contacts">
|
<Tooltip title="Contacts">
|
||||||
<IconButton onClick={popover.handleOpen} ref={popover.anchorRef}>
|
<IconButton
|
||||||
|
onClick={popover.handleOpen}
|
||||||
|
ref={popover.anchorRef}
|
||||||
|
>
|
||||||
<UsersIcon />
|
<UsersIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<ContactsPopover anchorEl={popover.anchorRef.current} onClose={popover.handleClose} open={popover.open} />
|
<ContactsPopover
|
||||||
|
anchorEl={popover.anchorRef.current}
|
||||||
|
onClose={popover.handleClose}
|
||||||
|
open={popover.open}
|
||||||
|
/>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -140,12 +157,19 @@ function NotificationsButton(): React.JSX.Element {
|
|||||||
sx={{ '& .MuiBadge-dot': { borderRadius: '50%', height: '10px', right: '6px', top: '6px', width: '10px' } }}
|
sx={{ '& .MuiBadge-dot': { borderRadius: '50%', height: '10px', right: '6px', top: '6px', width: '10px' } }}
|
||||||
variant="dot"
|
variant="dot"
|
||||||
>
|
>
|
||||||
<IconButton onClick={popover.handleOpen} ref={popover.anchorRef}>
|
<IconButton
|
||||||
|
onClick={popover.handleOpen}
|
||||||
|
ref={popover.anchorRef}
|
||||||
|
>
|
||||||
<BellIcon />
|
<BellIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Badge>
|
</Badge>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<NotificationsPopover anchorEl={popover.anchorRef.current} onClose={popover.handleClose} open={popover.open} />
|
<NotificationsPopover
|
||||||
|
anchorEl={popover.anchorRef.current}
|
||||||
|
onClose={popover.handleClose}
|
||||||
|
open={popover.open}
|
||||||
|
/>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -165,11 +189,20 @@ function LanguageSwitch(): React.JSX.Element {
|
|||||||
sx={{ display: { xs: 'none', lg: 'inline-flex' } }}
|
sx={{ display: { xs: 'none', lg: 'inline-flex' } }}
|
||||||
>
|
>
|
||||||
<Box sx={{ height: '24px', width: '24px' }}>
|
<Box sx={{ height: '24px', width: '24px' }}>
|
||||||
<Box alt={language} component="img" src={flag} sx={{ height: 'auto', width: '100%' }} />
|
<Box
|
||||||
|
alt={language}
|
||||||
|
component="img"
|
||||||
|
src={flag}
|
||||||
|
sx={{ height: 'auto', width: '100%' }}
|
||||||
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<LanguagePopover anchorEl={popover.anchorRef.current} onClose={popover.handleClose} open={popover.open} />
|
<LanguagePopover
|
||||||
|
anchorEl={popover.anchorRef.current}
|
||||||
|
onClose={popover.handleClose}
|
||||||
|
open={popover.open}
|
||||||
|
/>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -210,7 +243,11 @@ function UserButton(): React.JSX.Element {
|
|||||||
<Avatar src={user.avatar} />
|
<Avatar src={user.avatar} />
|
||||||
</Badge>
|
</Badge>
|
||||||
</Box>
|
</Box>
|
||||||
<UserPopover anchorEl={popover.anchorRef.current} onClose={popover.handleClose} open={popover.open} />
|
<UserPopover
|
||||||
|
anchorEl={popover.anchorRef.current}
|
||||||
|
onClose={popover.handleClose}
|
||||||
|
open={popover.open}
|
||||||
|
/>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -71,29 +71,55 @@ export function SideNav(): React.JSX.Element {
|
|||||||
width: { xs: '100%', md: '240px' },
|
width: { xs: '100%', md: '240px' },
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Stack component="ul" spacing={3} sx={{ listStyle: 'none', m: 0, p: 0 }}>
|
<Stack
|
||||||
|
component="ul"
|
||||||
|
spacing={3}
|
||||||
|
sx={{ listStyle: 'none', m: 0, p: 0 }}
|
||||||
|
>
|
||||||
{navItems.map((group) => (
|
{navItems.map((group) => (
|
||||||
<Stack component="li" key={group.key} spacing={2}>
|
<Stack
|
||||||
|
component="li"
|
||||||
|
key={group.key}
|
||||||
|
spacing={2}
|
||||||
|
>
|
||||||
{group.title ? (
|
{group.title ? (
|
||||||
<div>
|
<div>
|
||||||
<Typography color="text.secondary" variant="caption">
|
<Typography
|
||||||
|
color="text.secondary"
|
||||||
|
variant="caption"
|
||||||
|
>
|
||||||
{group.title}
|
{group.title}
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
<Stack component="ul" spacing={1} sx={{ listStyle: 'none', m: 0, p: 0 }}>
|
<Stack
|
||||||
|
component="ul"
|
||||||
|
spacing={1}
|
||||||
|
sx={{ listStyle: 'none', m: 0, p: 0 }}
|
||||||
|
>
|
||||||
{group.items.map((item) => (
|
{group.items.map((item) => (
|
||||||
<NavItem {...item} key={item.key} pathname={pathname} />
|
<NavItem
|
||||||
|
{...item}
|
||||||
|
key={item.key}
|
||||||
|
pathname={pathname}
|
||||||
|
/>
|
||||||
))}
|
))}
|
||||||
</Stack>
|
</Stack>
|
||||||
</Stack>
|
</Stack>
|
||||||
))}
|
))}
|
||||||
</Stack>
|
</Stack>
|
||||||
<Stack direction="row" spacing={2} sx={{ alignItems: 'center' }}>
|
<Stack
|
||||||
|
direction="row"
|
||||||
|
spacing={2}
|
||||||
|
sx={{ alignItems: 'center' }}
|
||||||
|
>
|
||||||
<Avatar src="/assets/avatar.png">AV</Avatar>
|
<Avatar src="/assets/avatar.png">AV</Avatar>
|
||||||
<div>
|
<div>
|
||||||
<Typography variant="subtitle1">Sofia Rivers</Typography>
|
<Typography variant="subtitle1">Sofia Rivers</Typography>
|
||||||
<Typography color="text.secondary" variant="caption">
|
<Typography
|
||||||
|
color="text.secondary"
|
||||||
|
variant="caption"
|
||||||
|
>
|
||||||
sofia@devias.io
|
sofia@devias.io
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
@@ -112,7 +138,10 @@ function NavItem({ disabled, external, href, icon, pathname, title }: NavItemPro
|
|||||||
const Icon = icon ? icons[icon] : null;
|
const Icon = icon ? icons[icon] : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box component="li" sx={{ userSelect: 'none' }}>
|
<Box
|
||||||
|
component="li"
|
||||||
|
sx={{ userSelect: 'none' }}
|
||||||
|
>
|
||||||
<Box
|
<Box
|
||||||
{...(href
|
{...(href
|
||||||
? {
|
? {
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import { getUserMetaById } from '@/db/UserMetas/GetById';
|
||||||
|
import { logger } from '@/lib/default-logger';
|
||||||
|
import { pb } from '@/lib/pb';
|
||||||
import type { User } from '@/types/user';
|
import type { User } from '@/types/user';
|
||||||
|
|
||||||
function generateToken(): string {
|
function generateToken(): string {
|
||||||
@@ -8,7 +11,7 @@ function generateToken(): string {
|
|||||||
return Array.from(arr, (v) => v.toString(16).padStart(2, '0')).join('');
|
return Array.from(arr, (v) => v.toString(16).padStart(2, '0')).join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
const user = {
|
const user_xxx = {
|
||||||
id: 'USR-000',
|
id: 'USR-000',
|
||||||
avatar: '/assets/avatar.png',
|
avatar: '/assets/avatar.png',
|
||||||
firstName: 'Sofia',
|
firstName: 'Sofia',
|
||||||
@@ -54,17 +57,23 @@ class AuthClient {
|
|||||||
async signInWithPassword(params: SignInWithPasswordParams): Promise<{ error?: string }> {
|
async signInWithPassword(params: SignInWithPasswordParams): Promise<{ error?: string }> {
|
||||||
const { email, password } = params;
|
const { email, password } = params;
|
||||||
|
|
||||||
|
try {
|
||||||
// Make API request
|
// Make API request
|
||||||
|
await pb.collection('users').authWithPassword(email, password);
|
||||||
|
|
||||||
// We do not handle the API, so we'll check if the credentials match with the hardcoded ones.
|
// // We do not handle the API, so we'll check if the credentials match with the hardcoded ones.
|
||||||
if (email !== 'sofia@devias.io' || password !== 'Secret1') {
|
// if (email !== 'sofia@devias.io' || password !== 'Secret1') {
|
||||||
return { error: 'Invalid credentials' };
|
// return { error: 'Invalid credentials' };
|
||||||
}
|
// }
|
||||||
|
// const token = generateToken();
|
||||||
|
|
||||||
const token = generateToken();
|
localStorage.setItem('custom-auth-token', pb.authStore.token);
|
||||||
localStorage.setItem('custom-auth-token', token);
|
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
return { error: 'Invalid credentials' };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async resetPassword(_: ResetPasswordParams): Promise<{ error?: string }> {
|
async resetPassword(_: ResetPasswordParams): Promise<{ error?: string }> {
|
||||||
@@ -79,16 +88,28 @@ class AuthClient {
|
|||||||
// Make API request
|
// Make API request
|
||||||
|
|
||||||
// We do not handle the API, so just check if we have a token in localStorage.
|
// We do not handle the API, so just check if we have a token in localStorage.
|
||||||
const token = localStorage.getItem('custom-auth-token');
|
// const token = localStorage.getItem('custom-auth-token');
|
||||||
|
// if (!token) {
|
||||||
if (!token) {
|
// return { data: null };
|
||||||
return { data: null };
|
// }
|
||||||
|
try {
|
||||||
|
logger.debug(JSON.stringify(`getUser: ${pb.authStore.record?.id}`));
|
||||||
|
//
|
||||||
|
if (pb.authStore.record?.id !== undefined) {
|
||||||
|
const userMeta = await getUserMetaById(pb.authStore.record?.id);
|
||||||
|
logger.debug({ userMeta });
|
||||||
|
return { data: userMeta as unknown as User };
|
||||||
}
|
}
|
||||||
|
|
||||||
return { data: user };
|
return { data: null };
|
||||||
|
} catch (error) {
|
||||||
|
return { error: 'sorry cannot get user meta' };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async signOut(): Promise<{ error?: string }> {
|
async signOut(): Promise<{ error?: string }> {
|
||||||
|
pb.authStore.clear();
|
||||||
|
|
||||||
localStorage.removeItem('custom-auth-token');
|
localStorage.removeItem('custom-auth-token');
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
@@ -12,12 +12,12 @@ const QuestionProgress: React.FC<ContainerProps> = ({ num_rating = 0, num_full_r
|
|||||||
<>
|
<>
|
||||||
<div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center', gap: '0.15rem' }}>
|
<div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center', gap: '0.15rem' }}>
|
||||||
{Array.from({ length: num_rating }, (_, index) => (
|
{Array.from({ length: num_rating }, (_, index) => (
|
||||||
<IonButton shape="round" fill="outline" size="small" color="success">
|
<IonButton key={index} shape="round" fill="outline" size="small" color="success">
|
||||||
<IonIcon slot="icon-only" icon={checkmarkOutline}></IonIcon>
|
<IonIcon slot="icon-only" icon={checkmarkOutline}></IonIcon>
|
||||||
</IonButton>
|
</IonButton>
|
||||||
))}
|
))}
|
||||||
{Array.from({ length: num_full_rating - num_rating }, (_, index) => (
|
{Array.from({ length: num_full_rating - num_rating }, (_, index) => (
|
||||||
<IonButton shape="round" fill="outline" size="small" color="medium">
|
<IonButton key={index} shape="round" fill="outline" size="small" color="medium">
|
||||||
<IonIcon slot="icon-only"></IonIcon>
|
<IonIcon slot="icon-only"></IonIcon>
|
||||||
</IonButton>
|
</IonButton>
|
||||||
))}
|
))}
|
||||||
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_2109205374")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_2109205374")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,42 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update field
|
|
||||||
collection.fields.addAt(1, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text4192936109",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "address",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update field
|
|
||||||
collection.fields.addAt(1, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text4192936109",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "helloworld",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,26 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(7, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "file376926767",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"maxSize": 0,
|
|
||||||
"mimeTypes": [],
|
|
||||||
"name": "avatar",
|
|
||||||
"presentable": false,
|
|
||||||
"protected": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"thumbs": [],
|
|
||||||
"type": "file"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("file376926767")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(8, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1466534506",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "role",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1466534506")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3639453778")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(5, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2058414169",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "visible",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3639453778")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text2058414169")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3639453778")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(8, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2560465762",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "slug",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3639453778")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text2560465762")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_84667061")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(5, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2058414169",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "visible",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_84667061")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text2058414169")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,153 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_742947356")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(4, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1125157303",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "cat_name",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(5, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "file2034676914",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"maxSize": 0,
|
|
||||||
"mimeTypes": [],
|
|
||||||
"name": "cat_image",
|
|
||||||
"presentable": false,
|
|
||||||
"protected": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"thumbs": [],
|
|
||||||
"type": "file"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(6, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "number2161764012",
|
|
||||||
"max": null,
|
|
||||||
"min": null,
|
|
||||||
"name": "pos",
|
|
||||||
"onlyInt": false,
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "number"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(7, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "json3915970527",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "init_answer",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "json"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(8, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2058414169",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "visible",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(9, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2560465762",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "slug",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(10, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1156222427",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "remarks",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(11, new Field({
|
|
||||||
"convertURLs": false,
|
|
||||||
"hidden": false,
|
|
||||||
"id": "editor1843675174",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "description",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "editor"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_742947356")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1125157303")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("file2034676914")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("number2161764012")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("json3915970527")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text2058414169")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text2560465762")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1156222427")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("editor1843675174")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3346420851")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(4, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2058414169",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "visible",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3346420851")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text2058414169")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,48 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3346420851")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(7, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "file4170105732",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"maxSize": 0,
|
|
||||||
"mimeTypes": [],
|
|
||||||
"name": "sound",
|
|
||||||
"presentable": false,
|
|
||||||
"protected": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"thumbs": [],
|
|
||||||
"type": "file"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(8, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "file2034676914",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"maxSize": 0,
|
|
||||||
"mimeTypes": [],
|
|
||||||
"name": "cat_image",
|
|
||||||
"presentable": false,
|
|
||||||
"protected": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"thumbs": [],
|
|
||||||
"type": "file"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3346420851")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("file4170105732")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("file2034676914")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,57 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = new Collection({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate2990389176",
|
|
||||||
"name": "created",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": false,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate3332085495",
|
|
||||||
"name": "updated",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": true,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": "pbc_108570809",
|
|
||||||
"indexes": [],
|
|
||||||
"listRule": null,
|
|
||||||
"name": "customers",
|
|
||||||
"system": false,
|
|
||||||
"type": "base",
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.save(collection);
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809");
|
|
||||||
|
|
||||||
return app.delete(collection);
|
|
||||||
})
|
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,122 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(1, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1579384326",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "name",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(2, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text3885137012",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "email",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(3, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1146066909",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "phone",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(4, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "number1813778413",
|
|
||||||
"max": null,
|
|
||||||
"min": null,
|
|
||||||
"name": "quota",
|
|
||||||
"onlyInt": false,
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "number"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(5, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2063623452",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "status",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(6, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "file507207115",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"maxSize": 0,
|
|
||||||
"mimeTypes": [],
|
|
||||||
"name": "avatar_file",
|
|
||||||
"presentable": false,
|
|
||||||
"protected": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"thumbs": [],
|
|
||||||
"type": "file"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1579384326")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text3885137012")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1146066909")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("number1813778413")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text2063623452")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("file507207115")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(7, new Field({
|
|
||||||
"cascadeDelete": false,
|
|
||||||
"collectionId": "_pb_users_auth_",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "relation2809058197",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"minSelect": 0,
|
|
||||||
"name": "user_id",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "relation"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("relation2809058197")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,25 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("_pb_users_auth_")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("json2115670734")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("_pb_users_auth_")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(8, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "json2115670734",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "billingAddress",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "json"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,25 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(8, new Field({
|
|
||||||
"hidden": false,
|
|
||||||
"id": "json2115670734",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "billingAddress",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "json"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("json2115670734")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(9, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text922858135",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "timezone",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text922858135")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,48 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(10, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text3571151285",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "language",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(11, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1767278655",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "currency",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text3571151285")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1767278655")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,204 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = new Collection({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1579384326",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "name",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text3885137012",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "email",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1146066909",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "phone",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "number1813778413",
|
|
||||||
"max": null,
|
|
||||||
"min": null,
|
|
||||||
"name": "quota",
|
|
||||||
"onlyInt": false,
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2063623452",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "status",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "file507207115",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"maxSize": 0,
|
|
||||||
"mimeTypes": [],
|
|
||||||
"name": "avatar_file",
|
|
||||||
"presentable": false,
|
|
||||||
"protected": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"thumbs": [],
|
|
||||||
"type": "file"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cascadeDelete": false,
|
|
||||||
"collectionId": "_pb_users_auth_",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "relation2809058197",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"minSelect": 0,
|
|
||||||
"name": "user_id",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "relation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "json2115670734",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "billingAddress",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text922858135",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "timezone",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text3571151285",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "language",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1767278655",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "currency",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate2990389176",
|
|
||||||
"name": "created",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": false,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate3332085495",
|
|
||||||
"name": "updated",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": true,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": "pbc_1413424569",
|
|
||||||
"indexes": [],
|
|
||||||
"listRule": "",
|
|
||||||
"name": "Teachers",
|
|
||||||
"system": false,
|
|
||||||
"type": "base",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.save(collection);
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1413424569");
|
|
||||||
|
|
||||||
return app.delete(collection);
|
|
||||||
})
|
|
@@ -1,204 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = new Collection({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1579384326",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "name",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text3885137012",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "email",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1146066909",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "phone",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "number1813778413",
|
|
||||||
"max": null,
|
|
||||||
"min": null,
|
|
||||||
"name": "quota",
|
|
||||||
"onlyInt": false,
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2063623452",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "status",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "file507207115",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"maxSize": 0,
|
|
||||||
"mimeTypes": [],
|
|
||||||
"name": "avatar_file",
|
|
||||||
"presentable": false,
|
|
||||||
"protected": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"thumbs": [],
|
|
||||||
"type": "file"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cascadeDelete": false,
|
|
||||||
"collectionId": "_pb_users_auth_",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "relation2809058197",
|
|
||||||
"maxSelect": 1,
|
|
||||||
"minSelect": 0,
|
|
||||||
"name": "user_id",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "relation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "json2115670734",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "billingAddress",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text922858135",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "timezone",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text3571151285",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "language",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1767278655",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "currency",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate2990389176",
|
|
||||||
"name": "created",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": false,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate3332085495",
|
|
||||||
"name": "updated",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": true,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": "pbc_491894781",
|
|
||||||
"indexes": [],
|
|
||||||
"listRule": "",
|
|
||||||
"name": "Students",
|
|
||||||
"system": false,
|
|
||||||
"type": "base",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.save(collection);
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_491894781");
|
|
||||||
|
|
||||||
return app.delete(collection);
|
|
||||||
})
|
|
@@ -1,100 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = new Collection({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "bool2555855207",
|
|
||||||
"name": "read",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "bool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text2363381545",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "type",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "json3182418120",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "author",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "json4225294584",
|
|
||||||
"maxSize": 0,
|
|
||||||
"name": "job",
|
|
||||||
"presentable": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate2990389176",
|
|
||||||
"name": "created",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": false,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hidden": false,
|
|
||||||
"id": "autodate3332085495",
|
|
||||||
"name": "updated",
|
|
||||||
"onCreate": true,
|
|
||||||
"onUpdate": true,
|
|
||||||
"presentable": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "autodate"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": "pbc_977978967",
|
|
||||||
"indexes": [],
|
|
||||||
"listRule": null,
|
|
||||||
"name": "Notifications",
|
|
||||||
"system": false,
|
|
||||||
"type": "base",
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
});
|
|
||||||
|
|
||||||
return app.save(collection);
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_977978967");
|
|
||||||
|
|
||||||
return app.delete(collection);
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_977978967")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(5, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1843675174",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "description",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_977978967")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1843675174")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,29 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_977978967")
|
|
||||||
|
|
||||||
// add field
|
|
||||||
collection.fields.addAt(6, new Field({
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1798508311",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "NOTI_ID",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
}))
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_977978967")
|
|
||||||
|
|
||||||
// remove field
|
|
||||||
collection.fields.removeById("text1798508311")
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,28 +0,0 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
|
||||||
migrate((app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_977978967")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": "",
|
|
||||||
"deleteRule": "",
|
|
||||||
"listRule": "",
|
|
||||||
"updateRule": "",
|
|
||||||
"viewRule": ""
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_977978967")
|
|
||||||
|
|
||||||
// update collection data
|
|
||||||
unmarshal({
|
|
||||||
"createRule": null,
|
|
||||||
"deleteRule": null,
|
|
||||||
"listRule": null,
|
|
||||||
"updateRule": null,
|
|
||||||
"viewRule": null
|
|
||||||
}, collection)
|
|
||||||
|
|
||||||
return app.save(collection)
|
|
||||||
})
|
|
@@ -1,8 +1,12 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
/// <reference path="../pb_data/types.d.ts" />
|
||||||
migrate((app) => {
|
migrate((app) => {
|
||||||
|
const collection = app.findCollectionByNameOrId("pbc_1305841361");
|
||||||
|
|
||||||
|
return app.delete(collection);
|
||||||
|
}, (app) => {
|
||||||
const collection = new Collection({
|
const collection = new Collection({
|
||||||
"createRule": null,
|
"createRule": "",
|
||||||
"deleteRule": null,
|
"deleteRule": "",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"autogeneratePattern": "[a-z0-9]{15}",
|
"autogeneratePattern": "[a-z0-9]{15}",
|
||||||
@@ -21,10 +25,10 @@ migrate((app) => {
|
|||||||
{
|
{
|
||||||
"autogeneratePattern": "",
|
"autogeneratePattern": "",
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"id": "text1400097126",
|
"id": "text4192936109",
|
||||||
"max": 0,
|
"max": 0,
|
||||||
"min": 0,
|
"min": 0,
|
||||||
"name": "country",
|
"name": "helloworld",
|
||||||
"pattern": "",
|
"pattern": "",
|
||||||
"presentable": false,
|
"presentable": false,
|
||||||
"primaryKey": false,
|
"primaryKey": false,
|
||||||
@@ -33,74 +37,27 @@ migrate((app) => {
|
|||||||
"type": "text"
|
"type": "text"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"id": "text2744374011",
|
"id": "json3622966325",
|
||||||
"max": 0,
|
"maxSize": 0,
|
||||||
"min": 0,
|
"name": "meta",
|
||||||
"name": "state",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
"presentable": false,
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
"required": false,
|
||||||
"system": false,
|
"system": false,
|
||||||
"type": "text"
|
"type": "json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"autogeneratePattern": "",
|
"cascadeDelete": false,
|
||||||
|
"collectionId": "_pb_users_auth_",
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"id": "text760939060",
|
"id": "relation2809058197",
|
||||||
"max": 0,
|
"maxSelect": 1,
|
||||||
"min": 0,
|
"minSelect": 0,
|
||||||
"name": "city",
|
"name": "user_id",
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
"presentable": false,
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
"required": false,
|
||||||
"system": false,
|
"system": false,
|
||||||
"type": "text"
|
"type": "relation"
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text4114525948",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "zipCode",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text3620973610",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "line1",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"autogeneratePattern": "",
|
|
||||||
"hidden": false,
|
|
||||||
"id": "text1322974608",
|
|
||||||
"max": 0,
|
|
||||||
"min": 0,
|
|
||||||
"name": "line2",
|
|
||||||
"pattern": "",
|
|
||||||
"presentable": false,
|
|
||||||
"primaryKey": false,
|
|
||||||
"required": false,
|
|
||||||
"system": false,
|
|
||||||
"type": "text"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
@@ -121,21 +78,59 @@ migrate((app) => {
|
|||||||
"presentable": false,
|
"presentable": false,
|
||||||
"system": false,
|
"system": false,
|
||||||
"type": "autodate"
|
"type": "autodate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"autogeneratePattern": "",
|
||||||
|
"hidden": false,
|
||||||
|
"id": "text2744374011",
|
||||||
|
"max": 0,
|
||||||
|
"min": 0,
|
||||||
|
"name": "state",
|
||||||
|
"pattern": "",
|
||||||
|
"presentable": false,
|
||||||
|
"primaryKey": false,
|
||||||
|
"required": false,
|
||||||
|
"system": false,
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"hidden": false,
|
||||||
|
"id": "file376926767",
|
||||||
|
"maxSelect": 1,
|
||||||
|
"maxSize": 0,
|
||||||
|
"mimeTypes": [],
|
||||||
|
"name": "avatar",
|
||||||
|
"presentable": false,
|
||||||
|
"protected": false,
|
||||||
|
"required": false,
|
||||||
|
"system": false,
|
||||||
|
"thumbs": [],
|
||||||
|
"type": "file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"autogeneratePattern": "",
|
||||||
|
"hidden": false,
|
||||||
|
"id": "text1466534506",
|
||||||
|
"max": 0,
|
||||||
|
"min": 0,
|
||||||
|
"name": "role",
|
||||||
|
"pattern": "",
|
||||||
|
"presentable": false,
|
||||||
|
"primaryKey": false,
|
||||||
|
"required": false,
|
||||||
|
"system": false,
|
||||||
|
"type": "text"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"id": "pbc_1509025625",
|
"id": "pbc_1305841361",
|
||||||
"indexes": [],
|
"indexes": [],
|
||||||
"listRule": null,
|
"listRule": "",
|
||||||
"name": "billingAddress",
|
"name": "UserMetas",
|
||||||
"system": false,
|
"system": false,
|
||||||
"type": "base",
|
"type": "base",
|
||||||
"updateRule": null,
|
"updateRule": "",
|
||||||
"viewRule": null
|
"viewRule": ""
|
||||||
});
|
});
|
||||||
|
|
||||||
return app.save(collection);
|
return app.save(collection);
|
||||||
}, (app) => {
|
|
||||||
const collection = app.findCollectionByNameOrId("pbc_1509025625");
|
|
||||||
|
|
||||||
return app.delete(collection);
|
|
||||||
})
|
})
|
@@ -1,15 +1,15 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
/// <reference path="../pb_data/types.d.ts" />
|
||||||
migrate((app) => {
|
migrate((app) => {
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3639453778")
|
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
||||||
|
|
||||||
// add field
|
// add field
|
||||||
collection.fields.addAt(9, new Field({
|
collection.fields.addAt(9, new Field({
|
||||||
"autogeneratePattern": "",
|
"autogeneratePattern": "",
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"id": "text1156222427",
|
"id": "text1579384326",
|
||||||
"max": 0,
|
"max": 0,
|
||||||
"min": 0,
|
"min": 0,
|
||||||
"name": "remarks",
|
"name": "name",
|
||||||
"pattern": "",
|
"pattern": "",
|
||||||
"presentable": false,
|
"presentable": false,
|
||||||
"primaryKey": false,
|
"primaryKey": false,
|
||||||
@@ -20,26 +20,26 @@ migrate((app) => {
|
|||||||
|
|
||||||
// add field
|
// add field
|
||||||
collection.fields.addAt(10, new Field({
|
collection.fields.addAt(10, new Field({
|
||||||
"convertURLs": false,
|
"exceptDomains": null,
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"id": "editor1843675174",
|
"id": "email3885137012",
|
||||||
"maxSize": 0,
|
"name": "email",
|
||||||
"name": "description",
|
"onlyDomains": null,
|
||||||
"presentable": false,
|
"presentable": false,
|
||||||
"required": false,
|
"required": false,
|
||||||
"system": false,
|
"system": false,
|
||||||
"type": "editor"
|
"type": "email"
|
||||||
}))
|
}))
|
||||||
|
|
||||||
return app.save(collection)
|
return app.save(collection)
|
||||||
}, (app) => {
|
}, (app) => {
|
||||||
const collection = app.findCollectionByNameOrId("pbc_3639453778")
|
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
||||||
|
|
||||||
// remove field
|
// remove field
|
||||||
collection.fields.removeById("text1156222427")
|
collection.fields.removeById("text1579384326")
|
||||||
|
|
||||||
// remove field
|
// remove field
|
||||||
collection.fields.removeById("editor1843675174")
|
collection.fields.removeById("email3885137012")
|
||||||
|
|
||||||
return app.save(collection)
|
return app.save(collection)
|
||||||
})
|
})
|
@@ -3,15 +3,19 @@ migrate((app) => {
|
|||||||
const collection = app.findCollectionByNameOrId("_pb_users_auth_")
|
const collection = app.findCollectionByNameOrId("_pb_users_auth_")
|
||||||
|
|
||||||
// add field
|
// add field
|
||||||
collection.fields.addAt(8, new Field({
|
collection.fields.addAt(11, new Field({
|
||||||
|
"autogeneratePattern": "",
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"id": "json2115670734",
|
"id": "text1146066909",
|
||||||
"maxSize": 0,
|
"max": 0,
|
||||||
"name": "billingAddress",
|
"min": 0,
|
||||||
|
"name": "phone",
|
||||||
|
"pattern": "",
|
||||||
"presentable": false,
|
"presentable": false,
|
||||||
|
"primaryKey": false,
|
||||||
"required": false,
|
"required": false,
|
||||||
"system": false,
|
"system": false,
|
||||||
"type": "json"
|
"type": "text"
|
||||||
}))
|
}))
|
||||||
|
|
||||||
return app.save(collection)
|
return app.save(collection)
|
||||||
@@ -19,7 +23,7 @@ migrate((app) => {
|
|||||||
const collection = app.findCollectionByNameOrId("_pb_users_auth_")
|
const collection = app.findCollectionByNameOrId("_pb_users_auth_")
|
||||||
|
|
||||||
// remove field
|
// remove field
|
||||||
collection.fields.removeById("json2115670734")
|
collection.fields.removeById("text1146066909")
|
||||||
|
|
||||||
return app.save(collection)
|
return app.save(collection)
|
||||||
})
|
})
|
@@ -3,13 +3,13 @@ migrate((app) => {
|
|||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
||||||
|
|
||||||
// add field
|
// add field
|
||||||
collection.fields.addAt(4, new Field({
|
collection.fields.addAt(11, new Field({
|
||||||
"autogeneratePattern": "",
|
"autogeneratePattern": "",
|
||||||
"hidden": false,
|
"hidden": false,
|
||||||
"id": "text2744374011",
|
"id": "text1146066909",
|
||||||
"max": 0,
|
"max": 0,
|
||||||
"min": 0,
|
"min": 0,
|
||||||
"name": "state",
|
"name": "phone",
|
||||||
"pattern": "",
|
"pattern": "",
|
||||||
"presentable": false,
|
"presentable": false,
|
||||||
"primaryKey": false,
|
"primaryKey": false,
|
||||||
@@ -23,7 +23,7 @@ migrate((app) => {
|
|||||||
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
const collection = app.findCollectionByNameOrId("pbc_1305841361")
|
||||||
|
|
||||||
// remove field
|
// remove field
|
||||||
collection.fields.removeById("text2744374011")
|
collection.fields.removeById("text1146066909")
|
||||||
|
|
||||||
return app.save(collection)
|
return app.save(collection)
|
||||||
})
|
})
|
@@ -1,19 +1,19 @@
|
|||||||
/// <reference path="../pb_data/types.d.ts" />
|
/// <reference path="../pb_data/types.d.ts" />
|
||||||
migrate((app) => {
|
migrate((app) => {
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
const collection = app.findCollectionByNameOrId("pbc_1413424569")
|
||||||
|
|
||||||
// update collection data
|
// update collection data
|
||||||
unmarshal({
|
unmarshal({
|
||||||
"name": "Customers"
|
"name": "Teachers_xxx"
|
||||||
}, collection)
|
}, collection)
|
||||||
|
|
||||||
return app.save(collection)
|
return app.save(collection)
|
||||||
}, (app) => {
|
}, (app) => {
|
||||||
const collection = app.findCollectionByNameOrId("pbc_108570809")
|
const collection = app.findCollectionByNameOrId("pbc_1413424569")
|
||||||
|
|
||||||
// update collection data
|
// update collection data
|
||||||
unmarshal({
|
unmarshal({
|
||||||
"name": "customers"
|
"name": "Teachers"
|
||||||
}, collection)
|
}, collection)
|
||||||
|
|
||||||
return app.save(collection)
|
return app.save(collection)
|
Reference in New Issue
Block a user