95 |
100 |
101 | {isAdding && (
102 |
103 | setColorToAdd(e.target.value)}
108 | value={colorToAdd}
109 | />
110 |
121 |
131 |
132 | )}
133 | {!isAdding && (
134 |
135 |
136 | {colorOptions.map((color, i) => (
137 | -
138 |
147 | )
148 | )}
149 |
150 |
162 | )}
163 |
164 | )
165 | };
166 | export default InputField;
167 |
--------------------------------------------------------------------------------
/src/color-picker/config.ts:
--------------------------------------------------------------------------------
1 | import { Field } from 'payload/types';
2 | import InputField from './InputField';
3 | import Cell from './Cell';
4 |
5 | export const validateHexColor = (value: string = ''): true | string => {
6 | return value.match(/^#(?:[0-9a-fA-F]{3}){1,2}$/) !== null || `Please give a valid hex color`;
7 | }
8 |
9 | const colorField: Field = {
10 | name: 'color',
11 | type: 'text',
12 | validate: validateHexColor,
13 | required: true,
14 | admin: {
15 | components: {
16 | Field: InputField,
17 | Cell,
18 | }
19 | }
20 | };
21 |
22 | export default colorField;
23 |
--------------------------------------------------------------------------------
/src/color-picker/styles.scss:
--------------------------------------------------------------------------------
1 | @import '~payload/scss';
2 |
3 | .add-color.btn {
4 | margin: 0;
5 | padding: 0;
6 | border: $style-stroke-width-m solid #fff;
7 | }
8 |
9 | .custom-color-picker {
10 | &__btn.btn {
11 | margin: base(.25);
12 |
13 | &:first-of-type {
14 | margin-left: unset;
15 | }
16 | }
17 |
18 | &__input {
19 | // Payload exports a mixin from the vars file for quickly applying formInput rules to the class for our input
20 | @include formInput
21 | }
22 |
23 | &__colors {
24 | display: flex;
25 | flex-wrap: wrap;
26 | list-style: none;
27 | padding: 0;
28 | margin: 0;
29 | }
30 |
31 | .error {
32 | background-color: var(--theme-error-100);
33 | border: 1px solid var(--theme-error-400);
34 | }
35 | }
36 |
37 | .chip {
38 | border-radius: 50%;
39 | border: $style-stroke-width-m solid #fff;
40 | height: base(1.25);
41 | width: base(1.25);
42 | margin-right: base(.5);
43 | box-shadow: none;
44 |
45 | &--selected {
46 | box-shadow: 0 0 0 $style-stroke-width-m $color-dark-gray;
47 | }
48 |
49 | &--clickable {
50 | cursor: pointer;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/payload.config.ts:
--------------------------------------------------------------------------------
1 | import { buildConfig } from 'payload/config';
2 | import TodoLists from './collections/TodoLists';
3 | import Users from './collections/Users';
4 |
5 | export default buildConfig({
6 | serverURL: 'http://localhost:3000',
7 | admin: {
8 | user: Users.slug,
9 | },
10 | collections: [
11 | TodoLists,
12 | Users,
13 | ],
14 | });
15 |
--------------------------------------------------------------------------------
/src/server.ts:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import payload from 'payload';
3 |
4 | require('dotenv').config();
5 | const app = express();
6 |
7 | // Initialize Payload
8 | payload.init({
9 | secret: process.env.PAYLOAD_SECRET,
10 | mongoURL: process.env.MONGODB_URI,
11 | express: app,
12 | onInit: () => {
13 | payload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`);
14 | },
15 | });
16 |
17 | // Add your own express routes here
18 |
19 | app.listen(3000);
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": [
5 | "dom",
6 | "dom.iterable",
7 | "esnext"
8 | ],
9 | "strict": false,
10 | "esModuleInterop": true,
11 | "skipLibCheck": true,
12 | "outDir": "./dist",
13 | "rootDir": "./src",
14 | "jsx": "react",
15 | },
16 | "ts-node": {
17 | "transpileOnly": true
18 | }
19 | }
--------------------------------------------------------------------------------