Compare commits

..

1299 Commits

Author SHA1 Message Date
James
f938dd718f chore(release): v1.1.25 2022-11-15 08:39:43 -05:00
James Mikrut
94b2ef1613 Merge pull request #1411 from jacobsfletch/master
Saves tabs to user preferences
2022-11-15 08:06:03 -05:00
Jacob Fletcher
71a6c58b27 chore: cleans up handleTabChange async callback 2022-11-15 07:40:39 -05:00
Jacob Fletcher
35426eef36 feat: updates tab preference keys 2022-11-14 18:30:18 -05:00
Jacob Fletcher
32833ec571 Merge branch 'payloadcms:master' into master 2022-11-14 17:49:36 -05:00
Jacob Fletcher
5eb8e4a28f feat: saves tab index to user preferences 2022-11-14 17:49:18 -05:00
Thomas Ghysels
0f27b103b4 feat: let textarea grow based on value (#1398)
* feat: autogrowing textarea

* feat: sets textarea min-height and reduces height on mobile

Co-authored-by: Jessica Boezwinkle <jessica@trbl.design>
2022-11-14 16:26:22 -05:00
James
d103f6c94f fix: ensures admin components is defaulted 2022-11-14 15:46:34 -05:00
Alberto Maghini
a345ef0d31 feat: admin UI logout extensibility (#1274)
* added Logout documentation

* updated type and schema

* updated logout component, route and inactivityRoute references

* added custom Logout component into test admin instance

* fixed windows path management

* added dotenv usage

* added check on testSuiteDir and provided more meaningful error message

* fixed object destructure

* updated from logout.route to logoutRoute

* extracted getSanitizedLogoutRoutes method

* added unit tests

* updated references

* updated doc

* reviewed casing and added defaults

* updated usage

* restored workers previous value

* fixed config validation

* updated docs and schema

* updated reference to logoutRoute and inactivityRoute

* updated test ref

Co-authored-by: Alberto Maghini (MSC Technology Italia) <alberto.maghini@msc.com>
Co-authored-by: Alberto Maghini <alberto@newesis.com>
2022-11-14 14:55:31 -05:00
Thomas Ghysels
4d8cc97475 fix: add slug to DocumentInfo context (#1389) 2022-11-14 14:54:05 -05:00
James
7556b54017 chore: fixes TS error in UploadGallery 2022-11-14 14:49:31 -05:00
Feng Sun
5e8a8b2df9 fix: adds unique key to upload cards to prevent old images being shown while navigating to new page 2022-11-14 14:48:08 -05:00
James Mikrut
244fb63c6d Update what-is-payload.mdx 2022-11-14 14:19:48 -05:00
James Mikrut
84f01e8836 Update ui.mdx 2022-11-14 10:11:28 -05:00
Elliot DeNolf
cdaa8cc29f fix: global afterRead and afterChange execution (#1405) 2022-11-14 08:18:58 -05:00
James Mikrut
7356d8977f Update overview.mdx 2022-11-13 20:39:26 -05:00
James
a3959ca5d8 chore(release): v1.1.24 2022-11-13 19:21:13 -05:00
Thomas Ghysels
216b9f88d9 fix: cursor jumping while typing in inputs
* Revert "feat: optimizes field performance by storing internal values in useField hook"

This reverts commit 66210b856b.

* fix: Lightweight fix for cursor jump issue

Resolves #1393
2022-11-13 19:14:16 -05:00
James
183cd9a0be chore: updates docs to reflect new website public images folder 2022-11-13 17:41:39 -05:00
James
5f5c7ba7bf chore(release): v1.1.23 2022-11-12 18:58:34 -05:00
James
66210b856b feat: optimizes field performance by storing internal values in useField hook 2022-11-12 18:46:31 -05:00
James
2f684040fc fix: #1361, ensures collection auth depth works while retrieving static assets 2022-11-12 15:44:24 -05:00
James
2364476689 chore(release): v1.1.22 2022-11-12 14:49:20 -05:00
James
7136db4c71 fix: #1360, relationship field onMenuScrollToBottom not working in some browsers 2022-11-12 14:44:00 -05:00
James
562fccce05 docs: resolves #1273, inaccurate docs regarding local API overrideAccess 2022-11-12 14:22:23 -05:00
James
35f91b038b fix: 1309, duplicative logout in admin UI 2022-11-12 14:19:08 -05:00
James
eb0023e961 fix: #1358, allows listSearchableFields to work when indicated fields are nested 2022-11-12 13:44:30 -05:00
James
1d76e973bb fix: #1367, allows custom global components within schema validation 2022-11-12 13:08:10 -05:00
James
3f28a69959 fix: #1353, ensures errors returned from server make their way to UI 2022-11-12 12:55:30 -05:00
James
77792327f1 Merge branch 'master' of github.com:payloadcms/payload 2022-11-11 12:04:01 -07:00
James
86855d68f6 fix: #1357, nested arrays and blocks sometimes not allowing save 2022-11-11 12:03:39 -07:00
Nick Borko
cfef68f364 fix: fixed GraphQL Access query resolver to return the correct data (#1339) 2022-11-11 04:25:46 -08:00
Nut Pinyo
32b8f46bf2 docs: field hook example configuration (#1329) 2022-11-11 04:19:18 -08:00
James
cc5fa943ad Merge branch 'master' of github.com:payloadcms/payload 2022-11-11 04:12:48 -08:00
James
9da9d38aed docs: adds useEditDepth to docs 2022-11-11 04:12:43 -08:00
Feng Sun
d90ca777db chore: export useEditDepth (#1350) 2022-11-11 04:09:06 -08:00
James
e4b4931dba chore(release): v1.1.21 2022-11-05 12:10:30 -04:00
James
93acea9d7f chore: ensures when array / block rows are added, new row count is properly calculated 2022-11-05 12:05:34 -04:00
James
f883e04ee1 chore(release): v1.1.20 2022-11-05 11:45:07 -04:00
James
bb51a54ebe Merge branch 'master' of github.com:payloadcms/payload 2022-11-05 11:38:02 -04:00
James
483adf08c4 feat: optimizes blocks and arrays by removing some additional rerenders 2022-11-05 11:37:55 -04:00
Elliot DeNolf
4a78f7d3c3 chore: change discord readme badge to blurple 2022-11-04 10:31:42 -04:00
James
78c2306b73 Merge branch 'master' of github.com:payloadcms/payload 2022-11-01 17:51:03 -04:00
James
ddfb011904 docs: quick fix to strong tag 2022-11-01 17:50:55 -04:00
James Mikrut
d1c20e4fef Update CHANGELOG.md 2022-10-31 18:23:34 -04:00
James
a5139072c8 chore(release): v1.1.19 2022-10-31 18:23:10 -04:00
James
e004682799 Merge branch 'master' of github.com:payloadcms/payload 2022-10-31 17:51:00 -04:00
James
c651835061 fix: #1318, improves popup positioning and logic 2022-10-31 17:50:52 -04:00
Elliot DeNolf
2255ebb64a feat: revert enforce kebab-case slugs (#1322) (#1325) 2022-10-31 16:10:11 -04:00
James
e2ec2f7b97 fix: #1311, select existing upload modal always updates state 2022-10-31 15:40:18 -04:00
James
00196a8631 chore: ensures form is modified when rows are moved, fixes #1314 2022-10-31 13:25:19 -04:00
James
2a09f15a15 fix: #1307, #1321 - bug with disableFormData and blocks field 2022-10-31 13:21:16 -04:00
Elliot DeNolf
0420b6dc27 feat: enforce kebab-case slugs (#1322) 2022-10-31 11:11:00 -04:00
Dan Ribbens
10c30260dd docs: fix listSearchableFields anchor (#1297) 2022-10-31 09:44:49 -04:00
Elliot DeNolf
25000261bd fix: custom pino logger options (#1299) 2022-10-26 15:08:52 -04:00
Elliot DeNolf
bb82cdcef4 docs: better inline docs for InitOptions 2022-10-26 10:25:06 -04:00
Elliot DeNolf
027dff8363 chore(release): v1.1.18 2022-10-25 12:30:47 -04:00
James
31ca1ab379 chore: ensures defaultMaxTextLength is optional 2022-10-25 12:23:45 -04:00
Elliot DeNolf
33c1f287f3 chore(release): v1.1.17 2022-10-25 11:09:30 -04:00
Elliot DeNolf
cd4861afda chore: move release-it back to dev deps 2022-10-25 11:03:13 -04:00
James
9f56ac182f Merge branch 'master' of github.com:payloadcms/payload 2022-10-25 11:00:48 -04:00
James
3301f59822 fix: enforces depth: 0 in graphql resolvers 2022-10-25 11:00:38 -04:00
James
f9ca3a9f96 chore: fixes bad field name 2022-10-25 11:00:22 -04:00
Elliot DeNolf
3ba7594a65 chore: update release-it plugin 2022-10-25 10:31:37 -04:00
TomDo1234
6a1b25ab30 feat: adds default max length for text-based fields
* feat: Added to types.ts the default Max Field Length

* feat: Added the defaultMaxFieldLength to the schema.ts

* feat: applying defaultMaxFieldLength to 3 validators

* feat: renamed defaultMaxFieldLength to defaultMaxTextLength , adding defaultMax and min nums

* feat: validating numbers with new defaultminnum and defaultmaxnum

* feat: FIXED BUG, do not return an error message on the defaultmaxnum and minnum override checks

* Added test fields

* Eslint compliance

* feat : eslint compliacnce

* Added tests, though a reasonable payload config needs to be imported to them

* Removed my failed jest tests, relying on the yarn dev test instead

* Increased default num max and min range to JS safe integer

* Jmi suggestions

* feat: removing the superfluous number max and min default

* Added test for max text field

Co-authored-by: Tom Do <tom@iifuture.com>
Co-authored-by: TomDoFuture <108644869+TomDoFuture@users.noreply.github.com>
2022-10-24 18:57:45 -04:00
James
17dbbc7775 fix: group + group styles within collapsible 2022-10-24 18:56:56 -04:00
James
7e25abf87a chore: type fixes 2022-10-24 12:26:25 -04:00
James
0591dfd05b chore: typo 2022-10-24 12:18:03 -04:00
Will Laeri
17610adf36 chore: upgrade vulnerable dependencies (#1228)
* upgrade vulnerable deps

* removed specified node/yarn versions
2022-10-24 12:14:48 -04:00
Will Laeri
91814777b0 feat: specify node 14+ and yarn classic LTS (#1240) 2022-10-24 12:14:22 -04:00
Daniel Söderling
09d793926d feat: added beforeLogin hook (#1289) 2022-10-24 12:05:12 -04:00
James
a9f2f0ec03 fix: #1290, renders more than one rich text leaf where applicable 2022-10-24 12:03:06 -04:00
James
66bf8c3cbd fix: #1286, uses defaultDepth in graphql rich text depth 2022-10-24 11:31:09 -04:00
James
3967c1233f fix: #1291, add inline relationship drafts 2022-10-24 11:23:01 -04:00
James
c929725dd5 fix: ensures field updates when disableFormData changes 2022-10-24 08:56:08 -04:00
James
9c6098b191 chore(release): v1.1.16 2022-10-21 15:48:40 -04:00
James
6daab398da Merge branch 'master' of github.com:payloadcms/payload 2022-10-21 15:39:36 -04:00
James
36ef3789fb fix: obscure bug where upload collection has upload field relating to itself 2022-10-21 15:39:29 -04:00
Hung Vu
14cbf2f079 docs: correction to demo code of radio field (#1266) 2022-10-18 14:10:27 -04:00
Dan Ribbens
87bbf4416b Merge pull request #1272 from payloadcms/fix/#1271-index-sortable-fields-regression 2022-10-18 14:05:36 -04:00
Dan Ribbens
785b992c3e fix: indexSortableFields not respected 2022-10-17 20:17:55 -04:00
James
b4695e10b6 chore(release): v1.1.15 2022-10-14 11:38:48 -04:00
James
0b0d971491 fix: ensures svg mime type is always image/svg+xml 2022-10-14 11:33:41 -04:00
James
02af6b90b2 chore(release): v1.1.14 2022-10-14 10:22:14 -04:00
James
2181bc84a1 1.1.13 2022-10-14 10:02:40 -04:00
James
036cd5f831 1.1.12 2022-10-14 10:02:33 -04:00
James
da9825cd99 chore: reverts hiding scrollbars in tabs 2022-10-14 09:53:43 -04:00
James
4a43f95952 fix: hides scrollbar in tabs with overflowing tabs, closes #1259 2022-10-14 09:51:44 -04:00
James
9af9b73132 fix: cleans up draft global action buttons 2022-10-14 09:37:27 -04:00
James
7f7d3dbeef Merge branch 'master' of github.com:payloadcms/payload 2022-10-13 08:28:37 -04:00
James
8ef9206001 chore: properly exports BeforeDuplicate type 2022-10-13 08:17:05 -04:00
James
21ba237135 fix: #1183 - better handling of mime types with svgs + similar files 2022-10-13 08:12:15 -04:00
James Mikrut
3bda163e7b Merge pull request #1241 from jacobsfletch/master
feat: bumps @faceless-ui/modal to v2.0.1
2022-10-12 12:00:22 -04:00
James
e4e4ad1b08 chore: ensures beforeDuplicate works on each locale 2022-10-12 11:59:56 -04:00
James
f7352a7d08 chore(release): v1.1.11 2022-10-12 11:52:48 -04:00
James
6f6f2f8e7b feat: builds beforeDuplicate admin hook, closes #1243 2022-10-12 11:44:41 -04:00
James
5ca5abab42 fix: ensures arrays and blocks mount as disableFormData: true, fixes #1242 2022-10-12 10:52:59 -04:00
Jacob Fletcher
9a7553099c feat: migrates @faceless-ui/modal to v2.0.1 2022-10-12 01:28:17 -04:00
James
55d0c917e6 chore(release): v1.1.10 2022-10-11 13:40:19 -04:00
James
f52daeccf0 docs: adds access control vid to docs 2022-10-11 13:34:35 -04:00
James
6c871c57fc chore(release): v1.1.9 2022-10-11 12:12:40 -04:00
James
5322ada9e6 feat: improves access control typing 2022-10-11 11:46:58 -04:00
James
ee83a50ea9 chore: improves read-only styling of all react-selects 2022-10-11 11:46:44 -04:00
James
f6b19e074c chore: more predictably exports Access type 2022-10-11 09:44:52 -04:00
James
6cc1d9e41b chore(release): v1.1.8 2022-10-11 09:24:07 -04:00
James
74863f9462 chore: workaround for faceless-ui modal types 2022-10-11 09:19:20 -04:00
James
fdcf029da2 chore: adjusts LeaveWithoutSaving z-index 2022-10-11 09:00:19 -04:00
James
3e3d151e4c docs: #1235, broken typescript link 2022-10-11 08:32:27 -04:00
James Mikrut
5da204b152 Merge pull request #1224 from payloadcms/feat/use-context-selector
Feat/use context selector
2022-10-10 18:38:36 -04:00
James
3d6c3f7339 chore: cleanup 2022-10-10 18:38:15 -04:00
James
8d49517004 chore: merge master 2022-10-10 15:12:38 -04:00
James Mikrut
d1c0f2b97b Merge pull request #1230 from payloadcms/feat/add-inline-relationship
feat: adds ability to create related docs while editing another
2022-10-10 15:07:41 -04:00
James
1bc42ae098 chore: tests 2022-10-10 14:56:10 -04:00
James
c6edb7f53a chore: improves design 2022-10-10 13:57:08 -04:00
James
1e048fe037 feat: adds ability to create related docs while editing another 2022-10-09 20:24:38 -04:00
James
8fabdce584 chore: restores old useWatchForm to avoid breaking change 2022-10-07 17:54:35 -04:00
James
5c1a3fabee feat: implements use-context-selector for form field access 2022-10-07 17:41:41 -04:00
James
fe6d30210b Merge branch 'master' of github.com:payloadcms/payload into feat/use-context-selector 2022-10-07 10:09:20 -04:00
James
93f71e621c chore(release): v1.1.7 2022-10-06 18:14:37 -04:00
James Mikrut
39d1a09d5a Merge pull request #1215 from damtzi/chore/credentials-include
chore: Add 'credentials: include' to all fetch calls
2022-10-06 17:55:55 -04:00
Damian Tziamtzis
74ae6fd1d5 chore: Add 'credentials: include' to all fetch calls 2022-10-06 23:14:55 +02:00
James
bbbcf8c869 chore(release): v1.1.6 2022-10-06 17:10:10 -04:00
James
b379666dec chore: improves upload field button aesthetics a bit 2022-10-06 17:04:29 -04:00
James Mikrut
6f40b5c9ab Merge pull request #1175 from bigmistqke/fix/responsive-fileupload-width
Fix: responsive fileupload width
2022-10-06 16:42:25 -04:00
James Mikrut
b329be7dc1 Merge pull request #1214 from payloadcms/fix/#1184
fix: #1184
2022-10-06 16:12:05 -04:00
James
c2ec54a7cb fix: #1184 2022-10-06 16:11:24 -04:00
James
3641dfd38a fix: #1189 2022-10-06 15:42:20 -04:00
James
5bf1354741 chore: fixes tests 2022-10-06 15:23:49 -04:00
James Mikrut
b894b809bf Merge pull request #1212 from payloadcms/fix/#940
Fix/#940
2022-10-06 14:24:51 -04:00
James
a4504ca15b Merge branch 'master' of github.com:payloadcms/payload into fix/#940 2022-10-06 14:23:37 -04:00
James
7926083732 fix: #940 2022-10-06 14:23:08 -04:00
James Mikrut
534cd5ae53 Merge pull request #1211 from jacobsfletch/master
feat: async admin access control
2022-10-06 13:31:01 -04:00
James Mikrut
fb329a99ba Merge pull request #1210 from payloadcms/fix/#1204
fix: #1204
2022-10-06 13:24:42 -04:00
James Mikrut
9e726d9b90 Merge pull request #1174 from payloadcms/fix/#1156-file-uploads-changing-extensions
fix: upload xls renaming ext
2022-10-06 13:23:23 -04:00
James Mikrut
8d065d619d Merge pull request #1124 from payloadcms/feat/sortable-by-default
feat: sort select and relationship fields by default
2022-10-06 13:20:32 -04:00
James Mikrut
cbff1776e7 Merge pull request #1168 from payloadcms/fix/read-only
Fix: read only field styles
2022-10-06 13:20:16 -04:00
nwhitmont
e517695000 docs: +note that collection slug must be in kebab-case, refactor example routes to match (#1176)
Co-authored-by: Nils Whitmont <nwhitmont@genvidtech.com>
2022-10-06 13:18:44 -04:00
James Mikrut
4370cfca0c Merge pull request #1195 from bigmistqke/fix/textarea-resize-vertical
fix: resize textarea only vertically
2022-10-06 13:17:51 -04:00
James Mikrut
4135b618ef Merge pull request #1198 from dsod/fix/resize-images-naming-and-mimetype
use the converted image mimeType for filename and admin interface
2022-10-06 13:17:22 -04:00
Jacob Fletcher
1cfce87549 feat: async admin access control 2022-10-06 13:16:15 -04:00
James Mikrut
c48283ac1d Merge pull request #1201 from christian-reichart/fix/sibling-data-in-after-read
fix: sibling data in after read hook
2022-10-06 13:15:52 -04:00
James Mikrut
328be3e4bc Merge pull request #1206 from payloadcms/style/color-scheme
fix: system dark scrollbars
2022-10-06 13:14:54 -04:00
James
b4becd1493 fix: #1204 2022-10-06 13:11:25 -04:00
James
95fac0bd62 chore: wip 2022-10-05 15:51:22 -04:00
Jarrod Flesch
a30d9dc1d7 fix(style): system dark scrollbars 2022-10-05 15:33:41 -04:00
Christian Reichart
7bfcefbfea fix sibling data in after read hook 2022-10-04 14:39:09 +02:00
dsod
131b2796e7 now uses the converted image mimeType for file extension and in the admin interface 2022-10-03 19:24:14 +02:00
Elliot DeNolf
debcb003bb docs: clarify api key auth usage 2022-10-03 08:41:23 -04:00
bigmistqke
6e1dfff1b8 fix: resize textarea only vertically 2022-10-02 17:37:27 +02:00
Jarrod Flesch
a9ebb71a09 Merge branch 'master' into fix/read-only 2022-09-30 10:47:34 -04:00
James
3e34e5216f chore(release): v1.1.5 2022-09-29 17:56:44 -04:00
James
2400c58219 chore: addresses more flaky tests 2022-09-29 17:52:51 -04:00
James
90d504526c chore: adds more delay to flaky test 2022-09-29 17:17:14 -04:00
Jarrod Flesch
c97d4f9545 Merge branch 'master' into fix/read-only 2022-09-29 12:54:02 -04:00
Jarrod Flesch
09a8144f3c fix: richText e2e test, specific selectors 2022-09-29 12:53:16 -04:00
Jarrod Flesch
00ef1700ae fix: ajusts how disabled states are being set on anchors and buttons 2022-09-29 11:49:25 -04:00
James
3e03b2b5df Merge branch 'master' of github.com:payloadcms/payload 2022-09-29 11:11:14 -04:00
James
974f79e57e chore: sends 204 on GraphQL OPTIONS requests 2022-09-29 11:11:02 -04:00
James
34f42083b5 chore: rolls back changes to useThrottledEffect 2022-09-29 10:26:06 -04:00
Elliot DeNolf
c0cae1e834 chore: reorder bug report template 2022-09-29 09:27:33 -04:00
James
3ce8ee4661 fix: bug in useThrottledEffect 2022-09-28 17:40:31 -04:00
bigmistqke
f9feff58d6 add flex-wrap: wrap to upload__wrap 2022-09-26 21:03:28 +02:00
bigmistqke
73848b6037 fix: remove min-width from fileupload 2022-09-26 20:51:45 +02:00
Dan Ribbens
7fd8124df6 fix: upload xls renaming ext 2022-09-26 08:19:58 -04:00
James Mikrut
1c77455403 Merge pull request #1169 from payloadcms/docs/test-cache
Improves contributing doc
2022-09-24 12:06:42 -07:00
James
051a0fad84 chore(release): v1.1.4 2022-09-23 20:15:52 -07:00
Jarrod Flesch
8e53ef47a0 chore: adds note about clearing the node module cache when switching test directories 2022-09-23 15:23:28 -04:00
Jarrod Flesch
918130486e fix: styles readOnly RichTextEditor, removes interactivity within when readOnly 2022-09-23 14:34:02 -04:00
Jarrod Flesch
b454811698 fix: threads readOnly to ReactSelect 2022-09-23 13:17:11 -04:00
James Mikrut
f87c68f310 Merge pull request #1147 from abaco/fix/refine-relationship-typegen
fix: refine type generation for relationships
2022-09-23 09:51:36 -07:00
James
25006d44e8 Merge branch 'master' of github.com:payloadcms/payload 2022-09-23 09:49:06 -07:00
James Mikrut
d8e51dd200 Merge pull request #1157 from payloadcms/docs/cell-component-props
docs: cell component props and example
2022-09-23 09:46:49 -07:00
James Mikrut
f54210a528 Merge pull request #1161 from jacobsfletch/master
feat: supports root endpoints
2022-09-23 09:46:30 -07:00
James Mikrut
96dab15cd1 Merge pull request #1163 from payloadcms/fix/nested-fields-permissions
fix: field level access for nested fields
2022-09-23 09:44:02 -07:00
James Mikrut
4126843619 Merge pull request #1165 from jacobsfletch/docs/webpack-cache
docs: adds tip for clearing webpack cache when aliasing server modules
2022-09-23 09:42:35 -07:00
James
e0238ad393 chore: updates sass 2022-09-23 09:42:10 -07:00
Jacob Fletcher
aa0302c05e docs: adds tip for clearing webpack cache when aliasing server modules 2022-09-23 12:24:51 -04:00
Jacob Fletcher
1040ad2cfe Merge branch 'payloadcms:master' into master 2022-09-23 12:23:57 -04:00
Dan Ribbens
c64f15d4d9 test: field level access for nested fields 2022-09-23 03:26:26 -04:00
Dan Ribbens
22ea98ca33 fix: field level access for nested fields 2022-09-22 21:37:02 -04:00
Jacob Fletcher
75bab716d1 chore: adds root endpoint test 2022-09-22 13:23:42 -04:00
Dan Ribbens
52a8e9624c docs: plugins typo 2022-09-22 12:19:18 -04:00
Jacob Fletcher
52cd3b4a7e feat: supports root endpoints 2022-09-22 10:49:49 -04:00
addison-codes
cc63167307 docs: fix highlighting 2022-09-22 00:51:25 -04:00
Dan Ribbens
314671b3b7 docs: cell component props and example 2022-09-21 14:20:01 -04:00
Dario Aprea
ef83bdb709 fix: refine type generation for relationships 2022-09-20 16:27:09 +02:00
Dan Ribbens
686085496a chore(release): v1.1.3 2022-09-16 17:05:57 -04:00
Dan Ribbens
76ae20aa16 fix: disable-local-strategy-and-graphql 2022-09-16 16:56:29 -04:00
Dan Ribbens
a1a55386f0 fix: duplicate with relationships 2022-09-16 14:57:29 -04:00
Elliot DeNolf
b3bb421c6c fix: adjust prevPage and nextPage graphql typing (#1140) 2022-09-16 09:40:21 -07:00
Dan Ribbens
eabb981243 fix: duplicate with relationships 2022-09-16 12:26:18 -04:00
Dan Ribbens
4be14a12d0 chore(release): v1.1.2 2022-09-14 15:42:13 -04:00
Dan Ribbens
ce174878f3 fix: disableLocalStorage with image resizing 2022-09-14 15:34:59 -04:00
Dan Ribbens
14966796ae fix: resize images without local storage 2022-09-14 13:07:18 -04:00
Dan Ribbens
7b756f3421 fix: resize images without local storage 2022-09-14 11:34:40 -04:00
Marco Sangalli
9fea2b4e08 chore: fixing uploadFile when using s3 bucket 2022-09-14 14:43:47 +02:00
James
f9b1b1fe7f docs: adds Link example in rich text 2022-09-13 21:25:08 -07:00
Elliot DeNolf
205404a88a chore: remove unused cypress package 2022-09-13 20:09:24 -07:00
Elliot DeNolf
813c46c86d feat: sort select and relationship fields by default 2022-09-13 20:06:12 -07:00
Luciano Greiner
8bfe253157 Avoid adding password and email to schemas when disableLocalStrategy is on 2022-09-13 17:55:22 -03:00
Dan Ribbens
ed8e581629 chore: changelog update 2022-09-13 13:44:22 -04:00
Dan Ribbens
7cf66b081a chore(release): v1.1.1 2022-09-13 13:20:24 -04:00
Dan Ribbens
64503f8267 fix: conditions on collapsible fields 2022-09-13 13:16:52 -04:00
Dan Ribbens
d82c12eab6 Merge pull request #1120 from payloadcms/fix/#1117 2022-09-13 11:58:28 -04:00
Dan Ribbens
9c4f2b68b0 fix: conditions on conditionals 2022-09-13 11:53:52 -04:00
James
bcfda707ff Merge branch 'master' of github.com:payloadcms/payload 2022-09-13 07:40:57 -07:00
James
66b77f7dca chore: re-adds key to tabs RenderFields 2022-09-13 07:40:48 -07:00
Dan Ribbens
dcc8dad53b fix: dashboard links to globals 2022-09-13 09:47:28 -04:00
Elliot DeNolf
bb1477e08b chore(release): v1.1.0 2022-09-12 20:54:50 -07:00
James
4e165cf52e chore: ensures new listSearchableFields works with complex queries 2022-09-12 19:40:01 -07:00
James Mikrut
a1083727ef feat: #1001 - builds a way to allow list view to search multiple fields
* make textfields searchable

* shorten namings in placeholder function

* chore: finishes listSearchableFields

Co-authored-by: Christian Reichart <christian.reichart@camperboys.com>
2022-09-12 16:38:02 -07:00
Elliot DeNolf
d5ccd45b53 Ability to get the "previous" state in the AfterChange Hook (#1115)
Co-authored-by: Alessio Gravili <alessio@bonfireleads.com>
Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-09-12 15:48:50 -07:00
Dan Ribbens
94d355ba5e Merge pull request #1102 from payloadcms/feat/group-collections 2022-09-12 16:52:24 -04:00
Dan Ribbens
892a774998 Merge branch 'master' into feat/group-collections 2022-09-12 16:39:07 -04:00
James
78f39af5cf chore: finishes collapsible nav groups 2022-09-12 12:45:06 -07:00
James
813fa1571c Merge branch 'feat/group-collections' of github.com:payloadcms/payload into feat/group-collections 2022-09-12 10:55:15 -07:00
Dan Ribbens
c40e232ac6 feat: hide nav labels with no un-grouped collections 2022-09-12 13:51:24 -04:00
Dan Ribbens
834f4ebd38 feat/add support for setting collapsable fields (array, block, collapsable… (#1057)
Co-authored-by: liorix <liorix@gmail.com>
Co-authored-by: Elliot DeNolf <denolfe@gmail.com>
2022-09-12 10:39:49 -07:00
Elliot DeNolf
ca434b8a92 feat: implement gravatar (#1107) 2022-09-12 10:29:22 -07:00
Dan Ribbens
7acf944a28 Feat/expose sharp options (#1029)
Co-authored-by: khakimvinh <kha.kim.vinh@gmail.com>
Co-authored-by: Elliot DeNolf <denolfe@gmail.com>
2022-09-12 10:29:07 -07:00
Elliot DeNolf
391c9d8682 fix: word boundaries, no regex lookbehind support for Safari (#1114) 2022-09-12 10:28:29 -07:00
James Mikrut
8e47961da1 Merge pull request #814 from slavanossar/feat/optional-tab-namespacing
feat: optional tab namespacing
2022-09-11 21:42:54 -07:00
James
016f3e47ab chore: ensures generate types works with named tabs 2022-09-11 21:19:20 -07:00
James
21eb19edd1 chore: further refinements 2022-09-11 20:57:30 -07:00
James
ad4f7a5fff chore: fixes and cleanup 2022-09-11 20:07:02 -07:00
James
cd209379b2 chore: merge master 2022-09-11 18:07:05 -07:00
Elliot DeNolf
14a16dc05f chore: remove unneeded package (#1110) 2022-09-11 16:39:16 -07:00
James
9a461b8536 fix: #1106 2022-09-10 17:58:39 -07:00
Dan Ribbens
59af8725b4 feat: globals groups 2022-09-10 19:59:11 -04:00
Dan Ribbens
dffeaf6a69 feat: collection groups 2022-09-10 19:59:11 -04:00
James
c7851f8189 chore(release): v1.0.36 2022-09-10 13:55:23 -07:00
James
ada1871993 fix: bug with account view 2022-09-10 13:50:34 -07:00
James
78ccd2ad9b chore: cleanup exports 2022-09-10 13:33:14 -07:00
James
4cb69039ed chore(release): v1.0.35 2022-09-09 20:12:41 -07:00
James
c8b37f40cb fix: incorrect auth strategy type 2022-09-09 20:03:49 -07:00
Elliot DeNolf
4963f10a18 Merge pull request #1083 from payloadcms/feat/improve-rich-text-link
Co-authored-by: Elliot DeNolf <denolfe@gmail.com>
Co-authored-by: Jacob Fletcher <jacobsfletch@gmail.com>
2022-09-09 15:34:17 -07:00
Elliot DeNolf
6f77fe7c27 Merge branch 'master' into feat/improve-rich-text-link 2022-09-09 15:23:46 -07:00
Elliot DeNolf
c584c2ed47 test: rich text link e2e 2022-09-09 15:18:02 -07:00
Elliot DeNolf
5a19f6915a fix: rich text link with no selection 2022-09-09 15:17:51 -07:00
Jacob Fletcher
48f0c06edc chore: bumps @faceless-ui/modal to v2.0.0-alpha.4 2022-09-09 00:13:27 -04:00
Jacob Fletcher
50cc3c5a21 chore: bumps @faceless-ui/modal to v2.0.0-alpha.3 2022-09-08 23:08:54 -04:00
James
6674a0df6b Merge branch 'feat/improve-rich-text-link' of github.com:payloadcms/payload into feat/improve-rich-text-link 2022-09-08 18:05:39 -07:00
James
cbbace21ca chore: updates faceless modal 2022-09-08 18:05:21 -07:00
Elliot DeNolf
87346a97ab test: rich text internal link 2022-09-08 15:40:49 -07:00
Elliot DeNolf
4357c5491d docs: add rich text link fields 2022-09-08 15:40:49 -07:00
Elliot DeNolf
03847703b0 chore: update rich text data seeding 2022-09-08 15:40:49 -07:00
James
3c46851426 chore: migrates to new faceless modal version 2022-09-08 15:22:09 -07:00
James Mikrut
8115855e5a Merge pull request #1089 from payloadcms/fix/height-width-by-default
fix: add height/width if imageSizes not specified
2022-09-07 20:03:39 -07:00
James Mikrut
ddb2a0a4f5 Merge pull request #1095 from jacobsfletch/master
chore: bumps @faceless-ui/modal to v1.3.2 #1070
2022-09-07 20:03:27 -07:00
James
a45577f182 chore: misc ux improvements to rich text link 2022-09-07 17:25:15 -07:00
James
eb963066f7 chore: fixes bug with links always populating 2022-09-07 16:52:32 -07:00
James
a99d9c98c3 feat: allows rich text links to link to other docs 2022-09-07 16:42:43 -07:00
James
cdfc0dec70 chore: ensures logic is accurate while updating links 2022-09-07 13:48:36 -07:00
Elliot DeNolf
eb1ff7efce chore: update label for bug reports 2022-09-07 12:40:00 -07:00
Jacob Fletcher
55843f6c55 chore: bumps @faceless-ui/modal to v1.3.2 #1070 2022-09-07 15:23:47 -04:00
James
7856f66b31 merge master 2022-09-07 11:53:02 -07:00
James Mikrut
47ac86b4b7 Merge pull request #1094 from payloadcms/fix/#1059
fix: #1059
2022-09-07 11:51:42 -07:00
James
13dc39dc6d fix: #1059 2022-09-07 11:50:55 -07:00
James
65653bd1d3 chore(release): v1.0.34 2022-09-07 09:39:24 -07:00
James
299ee82ccf chore: pins faceless ui 2022-09-07 09:35:24 -07:00
James
b38b6427b8 fix: pins faceless ui modal 2022-09-07 09:29:04 -07:00
James
784696f9a6 chore: comments todos 2022-09-07 09:27:39 -07:00
Elliot DeNolf
8bd2a0e6c9 fix: add height/width if imageSizes not specified 2022-09-07 08:58:02 -07:00
Dan Ribbens
0f671b1b35 chore(release): v1.0.33 2022-09-07 10:57:08 -04:00
Dan Ribbens
d56882cc20 fix: require min 1 option in field schema validation (#1082) 2022-09-07 10:53:21 -04:00
James
6d13ae6846 chore: removes old comment 2022-09-06 22:58:14 -07:00
James
91000d7fda feat: improves rich text link ux 2022-09-06 22:53:27 -07:00
Elliot DeNolf
888734dcdf fix: accented label char sanitization for GraphQL (#1080) 2022-09-06 16:03:43 -07:00
James Mikrut
e81da57f61 Merge pull request #1079 from payloadcms/fix/#1062
fix: #1062
2022-09-06 13:58:20 -07:00
James
05d1b141b2 fix: #1062 2022-09-06 13:56:53 -07:00
Elliot DeNolf
b7e5828adc feat: cyrillic like query support (#1078) 2022-09-06 16:47:57 -04:00
Dan Ribbens
2ee4c7ad72 fix: update removing an upload with null (#1076) 2022-09-06 16:19:59 -04:00
max frühschütz
77ab11bce8 docs: move description prop doc to right place (#1077) 2022-09-06 16:19:47 -04:00
Arick
cd8edbaa1f fix: reorder plugin wrapping (#1051) 2022-09-06 16:19:21 -04:00
Matt Arnold
5e21048457 docs: update custom endpoints link (#1075) 2022-09-06 15:41:27 -04:00
pixelistik
c0c093d16c docs: Fix missing word (#1063) 2022-09-05 21:03:48 -04:00
James
117153fad7 chore: bump version 2022-09-02 14:56:09 -07:00
James
5ae666b0e0 fix: ensures adding new media to upload works when existing doc does not exist 2022-09-02 14:39:41 -07:00
Dustin Miller
afa03789b8 docs: Correct “autheticate” misspelling in docs (#1048) 2022-09-02 15:27:06 -04:00
Dan Ribbens
44b0073834 fix: update removing a relationship with null (#1056) 2022-09-02 15:21:09 -04:00
Dan Ribbens
254636167d test: custom css (#1053) 2022-09-02 14:03:49 -04:00
Dan Ribbens
29e82ec845 fix: children of conditional fields required in graphql schema (#1055) 2022-09-02 14:02:58 -04:00
Wesley
c3a0bd8625 fix: implement the same word boundary search as the like query (#1038)
Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-09-01 13:03:21 -04:00
Ikko Ashimine
32a4e8e9b9 docs: update overview.mdx (#1046) 2022-09-01 12:58:09 -04:00
Elliot DeNolf
482cbe71c7 feat: update operator type with contains (#1045) 2022-09-01 12:17:53 -04:00
Elliot DeNolf
7dbcd9ca89 docs: fix relationship where query 2022-09-01 12:14:07 -04:00
Dan Ribbens
a1f2dcab8f docs: fix defaultValue example (#1044) 2022-09-01 10:26:41 -04:00
James
21417c6598 chore: better logic for changing password in ui 2022-08-30 17:58:17 -07:00
James
f1a272f407 1.0.31 2022-08-30 15:21:59 -07:00
James Mikrut
064f797023 Merge pull request #1033 from Elliot67/patch-1
docs: fix graphql `disable` property explanation
2022-08-30 15:21:10 -07:00
James Mikrut
26c2020b12 Merge pull request #1034 from payloadcms/feat/duplicate-all-locales
Feat/duplicate all locales
2022-08-30 15:13:07 -07:00
James
af1a483e64 chore: ensures new Edit view is mounted when going directly between one id and another 2022-08-30 15:12:23 -07:00
James
f517cb5e93 chore: cleanup 2022-08-30 15:07:38 -07:00
James
c8a8914ea7 Merge branch 'feat/duplicate-all-locales' of github.com:payloadcms/payload into feat/duplicate-all-locales 2022-08-30 14:52:51 -07:00
James Mikrut
4f834c6bf8 Merge pull request #1035 from payloadcms/fix/#981
fix: #981
2022-08-30 14:44:40 -07:00
James
d588843121 fix: #981 2022-08-30 14:43:44 -07:00
Dan Ribbens
51c7770b10 feat: duplicate copies all locales 2022-08-30 17:23:30 -04:00
Elliot Lintz
18ff5d29b0 docs: fix graphql disable property explanation 2022-08-30 22:41:00 +02:00
Dan Ribbens
e31098eaa5 test: duplicate copies all locales 2022-08-30 16:25:26 -04:00
James Mikrut
0873050b32 Merge pull request #1032 from payloadcms/fix/#948
fix: #948
2022-08-30 11:55:39 -07:00
James
8df9ee7b2d fix: #948 2022-08-30 11:54:41 -07:00
Dan Ribbens
a9ef557ca4 chore(release): v1.0.30 2022-08-29 22:55:12 -04:00
Dan Ribbens
689fa008fb fix: upload field validation not required (#1025) 2022-08-29 22:49:08 -04:00
James
1a4ce65e6c chore(release): v1.0.29 2022-08-29 15:58:30 -07:00
James Mikrut
f6dff04cfe Merge pull request #1022 from payloadcms/fix/#953
fix: #953
2022-08-29 15:42:44 -07:00
James
a73c391c2c fix: #953 2022-08-29 15:41:59 -07:00
James
e88c7ca4b2 chore: revises the logic while clearing wherebuilder queries 2022-08-29 15:13:14 -07:00
Dan Ribbens
0cd8446735 chore(release): v1.0.28 2022-08-29 17:08:17 -04:00
Dan Ribbens
6a3cfced9a fix: relationship cell loading (#1021)
* fix: relationship cell lazy loading items in viewport

* fix: collection list page param changing
2022-08-29 17:03:45 -04:00
Hung Vu
0586d7aa7d fix: unpublish item will not crash the UI anymore (#1016) 2022-08-29 15:39:46 -04:00
Dan Ribbens
3736755a12 feat: types custom components to allow any props (#1013) 2022-08-29 14:57:30 -04:00
Dan Ribbens
d727fc8e24 feat: validate relationship and upload ids (#1004)
* feat: validate relationship and upload ids

* chore: update fields-relationship test data

* fix: skip FE relationship and upload id validation
2022-08-29 14:57:06 -04:00
Dan Ribbens
50b0303ab3 fix: incorrect field paths when nesting unnamed fields (#1011)
* chore: reproduce issue #976

* fix: incorrect field paths when nesting non-named fields
2022-08-29 14:52:17 -04:00
Dan Ribbens
6bc6e7bb61 fix: require properties in blocks and arrays fields (#1020)
* fix: make blocks required in block fields

* fix: make fields required in array fields
2022-08-29 14:51:12 -04:00
Dan Ribbens
cf2eb3e482 chore: fix dev hooks (#1006) 2022-08-26 11:11:21 -04:00
James Mikrut
4aa5500593 Merge pull request #965 from payloadcms/test/code-field
test: add code fields to test config
2022-08-24 08:26:08 -07:00
James Mikrut
c7432fb6e6 Merge pull request #986 from charkour/patch-1
docs: fix typo about collections
2022-08-24 08:25:46 -07:00
James Mikrut
f895443e33 Merge pull request #990 from payloadcms/docs/examples-with-ts-types
docs: update examples with ts types
2022-08-24 08:25:33 -07:00
James Mikrut
32cebb56ff Merge pull request #999 from jacobsfletch/master
chore: exports PayloadHandler interface
2022-08-24 08:24:14 -07:00
James Mikrut
4a6b01d094 Merge pull request #996 from payloadcms/fix/#948-tab-nav-scroll
fix: remove lazy load of array and blocks components
2022-08-24 08:23:46 -07:00
James Mikrut
f8295f7577 Merge pull request #1000 from payloadcms/ci/actions-on-pr
ci: run actions on PRs
2022-08-24 08:20:33 -07:00
Elliot DeNolf
a2fa99d06f ci: run actions on PRs 2022-08-24 09:00:52 -04:00
Jacob Fletcher
c508ac6dee chore: exports PayloadHandler interface 2022-08-24 07:54:09 -04:00
Dan Ribbens
4900fa799f fix: remove lazy loading of array and blocks 2022-08-23 15:42:33 -04:00
James Mikrut
135b1bcdd7 Merge pull request #975 from dsod/fix/node15-keep-request-properties
Keep original request and add properties to it, instead of copy
2022-08-23 11:19:01 -07:00
Elliot DeNolf
25f5d68b74 feat: export more fields config types and validation type (#989) 2022-08-23 13:26:00 -04:00
Elliot DeNolf
1ed867ce0c docs: update examples with ts types 2022-08-23 11:43:24 -04:00
Charles Kornoelje
5ef5f09a5c fix typo about collections
Really interesting product. Reading through the docs now. Loving it so far. 

Thanks
2022-08-22 16:23:59 -04:00
dsod
bc97d3d6f2 Keep original request and add properties to it, instead of copy 2022-08-20 01:33:29 +02:00
Dan Ribbens
b21a56fdf7 chore(release): v1.0.27 2022-08-18 17:45:16 -04:00
Dan Ribbens
97f2a9b484 test: fix e2e relationship 2022-08-18 17:43:06 -04:00
James
4ef6801230 fix: react-sortable-hoc dependency instead of dev dependency 2022-08-18 14:37:45 -07:00
Dan Ribbens
8e21a91b2c chore(release): v1.0.26 2022-08-18 17:03:45 -04:00
Afzaal Ahmad
38a1a38c0c feat: enable reordering of hasMany relationship and select fields (#952)
* feature: enable reordering of hasMany relationship and select fields using config

* update: correct docs for select, and relationship field for sortable config

* update: move sortable to admin config, and rename it to isSortable, apply grab, and grabbing classes while drag, and drop
2022-08-18 16:59:33 -04:00
Dan Ribbens
2b7785d101 chore: update endpoint type (#966) 2022-08-18 16:22:35 -04:00
Dan Ribbens
2cf9d35fed chore: run ci tests on pull request (#955)
* chore: run ci tests on pull request
2022-08-18 15:17:02 -04:00
Elliot DeNolf
4e1f9c7280 test: add code fields to test config 2022-08-18 14:44:10 -04:00
Will Viles
f45d5a0421 feat: adds more prismjs syntax highlighting options for code blocks (#961) 2022-08-18 13:17:05 -04:00
Dan Ribbens
39586d3cdb fix: missing fields in rows on custom id collections (#954) 2022-08-18 12:26:05 -04:00
James
5e66e3ee78 chore(release): v1.0.25 2022-08-17 15:36:28 -07:00
James Mikrut
a284f6c066 Merge pull request #950 from payloadcms/feat/top-level-endpoints
Feat/top level endpoints
2022-08-17 15:32:35 -07:00
James Mikrut
fdc0ad8a3c Merge pull request #947 from rustyy/chore/code-improvements
Chore/code improvements
2022-08-17 15:32:09 -07:00
James
fa01b353ef chore: removes unused code 2022-08-17 15:31:39 -07:00
Dan Ribbens
dac3308441 docs: custom api endpoints 2022-08-17 14:08:01 -04:00
Dan Ribbens
11d8fc71e8 feat: custom api endpoints 2022-08-17 13:28:50 -04:00
Dan Ribbens
771bbaedbc chore: validation reuses endpoints schema 2022-08-17 13:06:58 -04:00
Dan Ribbens
040833ead8 test: move endpoints tests to new suite 2022-08-17 12:57:07 -04:00
Felix Hofmann
7c2acb4324 chore: use type-var instead of 'as'-keyword for jwtDecode 2022-08-16 23:22:00 +02:00
Felix Hofmann
88fe797007 chore: remove unreachable return statement 2022-08-16 23:21:38 +02:00
Elliot DeNolf
5825d7e64f test: skip flaky sorting test for now (#945) 2022-08-16 12:04:25 -04:00
James Mikrut
97ff49f2bf Merge pull request #926 from rustyy/feat/datepicker-month-only
feat: add new pickerAppearance option 'monthOnly'
2022-08-15 19:21:50 -07:00
James
ccada2e8c9 chore: migrates to PATCH for collection updates 2022-08-15 19:19:44 -07:00
James
1d8bcd6e16 Merge commit 'refs/pull/863/head' of github.com:payloadcms/payload 2022-08-15 18:55:07 -07:00
James
1b58094e6f Merge branch 'master' of github.com:payloadcms/payload 2022-08-15 18:54:43 -07:00
James
1437bfe0c9 merge: #799 2022-08-15 18:54:34 -07:00
James Mikrut
171da32b00 Merge pull request #944 from payloadcms/fix/#568
fix: #568
2022-08-15 18:42:15 -07:00
James
a3edbf4fef fix: #568 2022-08-15 18:41:34 -07:00
James Mikrut
8ab4ec8d54 Update CHANGELOG.md 2022-08-15 18:04:32 -07:00
James
f8365abf1b chore(release): v1.0.24 2022-08-15 18:03:57 -07:00
James
078e8dcc51 feat: ensures you can query on blocks via specifying locale or not specifying locale 2022-08-15 17:59:08 -07:00
James
b1a1575122 fix: #939 2022-08-15 17:58:59 -07:00
James
201a8e1053 Merge branch 'master' of github.com:payloadcms/payload 2022-08-15 17:58:53 -07:00
Dan Ribbens
ff4c1a1c01 chore: simplifies indexing
* fix: create indexes in nested fields

* chore: remove unused devDependency mongodb

* fix: point index

* fix: nested schema indexes

* chore: begins to simplify index creation

* chore: simplifies index creation

Co-authored-by: James <james@trbl.design>
2022-08-15 17:56:39 -07:00
James
7c449e0d30 Merge branch 'chore/simplify-indexes' of github.com:payloadcms/payload 2022-08-15 13:58:10 -07:00
Dan Ribbens
2ca526bd22 chore: simplifies index creation 2022-08-15 16:54:23 -04:00
James
48f929f3ab chore: begins to simplify index creation 2022-08-15 13:03:13 -07:00
James
f2bec90663 Merge branch 'fix/#922-nested-index-creation' of github.com:payloadcms/payload into fix/#922-nested-index-creation 2022-08-15 12:37:10 -07:00
Dan Ribbens
1c7445dc7f fix: format graphql localization input type (#932)
* fix: format locales for graphql

* fix: locale missing from graphql mutation args
2022-08-15 11:42:29 -04:00
James
78630cafa2 chore(release): v1.0.23 2022-08-14 18:54:13 -07:00
James Mikrut
0a40dd43cb test: adds dataloader test (#936)
* chore: adds dataloader test config

* test: passing dataloader test
2022-08-14 11:04:05 -07:00
James Mikrut
32fb72a5bb Merge pull request #935 from payloadcms/fix/#930
fix: #930
2022-08-14 10:42:10 -07:00
James
cbb1c84be7 fix: #930 2022-08-14 10:40:52 -07:00
Dan Ribbens
145e1db05d fix: dev:generate-types on all test configs (#919) 2022-08-13 13:04:24 -04:00
Elliot DeNolf
4115045c15 test: flaky admin test fix (#929) 2022-08-13 08:08:40 -04:00
Dan Ribbens
d0744f3702 fix: nested schema indexes 2022-08-13 07:44:36 -04:00
James
e7caaf57a9 chore(release): v1.0.22 2022-08-12 16:25:55 -07:00
James
fba0847f0f fix: ensures you can query on mixed schema type within blocks 2022-08-12 16:08:36 -07:00
Felix Hofmann
566c6ba3a9 feat: add new pickerAppearance option 'monthOnly' 2022-08-12 23:11:33 +02:00
Dan Ribbens
b860959fea fix: point index 2022-08-12 16:35:08 -04:00
James
9e4e4b231c chore: adds commenting to obscure form function 2022-08-12 13:11:49 -07:00
James
b8421ddc0c fix: #905 2022-08-12 12:18:02 -07:00
Dan Ribbens
9165b25fd6 chore: remove unused devDependency mongodb 2022-08-12 12:01:34 -04:00
Dan Ribbens
f615abc9b1 fix: create indexes in nested fields 2022-08-12 11:59:51 -04:00
James
9237dd67da chore(release): v1.0.21 2022-08-11 15:06:20 -07:00
James
e1347d5a39 Merge branch 'master' of github.com:payloadcms/payload 2022-08-11 15:02:28 -07:00
James
ca852e8cb2 fix: ensures you can query on nested block fields 2022-08-11 15:02:17 -07:00
KGZM
d0da3d7962 fix: saving multiple versions (#918)
* test: saving multiple versions with unique fields

* fix: saving multiple versions with unique fields

Version schemas were getting produced with uniqueness constraints which
caused updates to likely fail because each successive version would
potentially reuse unchanged unique key-values (particularly ident keys
like slug) from previous versions.

This was due to `mongoose.buildSchema` not respecting buildSchemaOptions.disableUnique.

This regression was introduced with the fix at commit c175476e.

* test: eslint fix

Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-08-11 15:53:51 -04:00
Dan Ribbens
2ae33b603a feat: WIP tab compatible with traverseFields 2022-08-11 12:05:35 -04:00
Dan Ribbens
6a6a69190f feat: tabs support localization at the tab level 2022-08-11 12:05:33 -04:00
Dan Ribbens
a7b882c03d chore: run ci test workflow on pull requests 2022-08-11 12:05:05 -04:00
Dan Ribbens
a83921a2fe feat: support localized tab fields 2022-08-11 12:05:02 -04:00
Slava Nossar
4b7b04d5fa return full Tab object for column display 2022-08-11 12:04:20 -04:00
Slava Nossar
b403f5228b update Tabs field docs 2022-08-11 12:04:20 -04:00
Slava Nossar
dd289ca24a update data and path when tab had name 2022-08-11 12:04:20 -04:00
Slava Nossar
daf5fc83d8 update test data 2022-08-11 12:04:20 -04:00
Slava Nossar
08271086c3 return tab.name for columns 2022-08-11 12:04:20 -04:00
Slava Nossar
30da37becd add namespaced field path 2022-08-11 12:04:20 -04:00
Slava Nossar
df1491de74 add extra test fields and data 2022-08-11 12:04:20 -04:00
Slava Nossar
420fd67905 update mongodb schema builder 2022-08-11 12:04:20 -04:00
Slava Nossar
17a55e4a3a add tab field with name and data to test suite 2022-08-11 12:04:20 -04:00
Slava Nossar
1b3a328388 update graphql schema builder 2022-08-11 12:04:20 -04:00
Slava Nossar
060ee40bab add name to schema and types 2022-08-11 12:04:20 -04:00
Dan Ribbens
103966d36e chore(release): v1.0.20 2022-08-11 11:55:09 -04:00
Dan Ribbens
1ce2dc8e6d chore: update dependencies (#917)
* chore: update dependencies

* chore: mongoose version update

* chore: yarn lock

Co-authored-by: Elliot DeNolf <denolfe@gmail.com>
2022-08-11 11:51:30 -04:00
Tim Hallyburton
2f4f075441 feat: field name validation (#903)
* feat: add simple validation for field names

* test: add invalid field name coverage
2022-08-11 08:02:55 -04:00
Arick
50972b98a1 fix: E11000 duplicate key error has no keyValue (#916) 2022-08-11 07:49:59 -04:00
Dan Ribbens
874c001d3b fix: number validation works with 0 min and max (#906) 2022-08-10 08:18:39 -04:00
Petre Tudor
63519a8f54 docs: missing word (#909)
add `wait` in `...the second hook will wait for the first to complete before it starts.`
2022-08-10 07:59:52 -04:00
finnelliott
63a0336e98 docs: add missing comma to radio example (#901)
Missing comma in example, leading to syntax error when copied by user.
2022-08-08 20:56:55 -04:00
Yves Léon Jansen
ae51836187 docs: tabs example typo (#904) 2022-08-08 20:55:51 -04:00
James
888e756c6e chore(release): v1.0.19 2022-08-07 19:04:22 -04:00
James
a8d2e09952 feat: exposes static upload handlers 2022-08-07 19:00:26 -04:00
James
23d2ef5027 chore(release): v1.0.18 2022-08-06 15:44:34 -04:00
James
3735a28b0c chore: allows url to be used as thumbnail when no adminThumbnail property present 2022-08-06 15:35:54 -04:00
James
112defe846 chore(release): v1.0.17 2022-08-06 13:27:38 -04:00
James
804f3ced95 chore: simplifies base field merging 2022-08-06 13:12:47 -04:00
James
209b02b069 fix: #898 2022-08-06 13:12:25 -04:00
James
a5918059a8 chore(release): v1.0.16 2022-08-05 11:29:08 -04:00
James
c32dfea356 fix: #896 2022-08-05 11:22:26 -04:00
James
3b2061e54a chore(release): v1.0.15 2022-08-04 16:42:09 -04:00
James
61673907ca chore: threads through forceNullable in buildObjectType 2022-08-04 16:37:04 -04:00
James
1e72301cdf chore(release): v1.0.14 2022-08-04 16:14:30 -04:00
James Mikrut
055d1b9ea1 Merge pull request #892 from payloadcms/fix/allow-incomplete-drafts-graphql
fix: allows querying incomplete drafts in graphql
2022-08-04 15:47:41 -04:00
James
8d968b7690 fix: allows querying incomplete drafts in graphql 2022-08-04 15:45:33 -04:00
James Mikrut
2989ec5100 Merge pull request #887 from shumakmanohar/patch-1
Update overview.mdx
2022-08-04 14:05:00 -04:00
James Mikrut
c4d7df8bba Merge pull request #888 from payloadcms/feat/allow-rich-text-querying
feat: allows querying on rich text content
2022-08-04 14:04:40 -04:00
James Mikrut
d6cd5b1f0d Merge pull request #889 from payloadcms/fix/#884
Fix/#884
2022-08-04 14:04:28 -04:00
James
e9b3f3f060 fix: #884 2022-08-04 14:03:23 -04:00
James
ed80c30c74 chore: adds tests to reproduce #884 2022-08-04 11:39:15 -04:00
James
3343adb952 feat: allows querying on rich text content 2022-08-04 10:59:56 -04:00
Shumak Manohar
a8aaa6deea Update overview.mdx 2022-08-04 18:41:09 +05:30
Dan Ribbens
3c8fa72dc8 chore(release): v1.0.13 2022-08-03 15:33:52 -04:00
James
91c4f4f980 chore: remove duplicative video in docs 2022-08-03 15:28:29 -04:00
James
b2406b3696 docs: adds intro video to docs 2022-08-03 15:27:27 -04:00
James
b8504ffb25 fix: #878 2022-08-03 15:21:44 -04:00
James
0294c02aed feat: improves adjacent group styling 2022-08-03 15:21:32 -04:00
James Mikrut
31680dcdea Merge pull request #882 from payloadcms/fix/#880
fix: #880
2022-08-03 13:50:01 -04:00
James
d91b69c465 test: improves nested block test coverage 2022-08-03 13:49:49 -04:00
James
9c0c606b20 fix: #880 2022-08-03 13:39:22 -04:00
Dan Ribbens
6791352ce8 docs: payload plugins and getting started video (#876)
* docs: add link to payload-plugins github topic

* docs: add getting started developer intro video link
2022-08-02 17:08:02 -04:00
Dan Ribbens
d17d227fad chore(release): v1.0.12 2022-08-02 12:01:52 -04:00
Dan Ribbens
c175476e74 fix: unique index creation (#867)
* fix: unique indexes created for mongo 5 and later

* test: add index test coverage for unique, nested and localized fields
2022-08-02 11:56:18 -04:00
Falko Woudstra
f0ff1c7c99 Update documentation for PATCH instead of PUT in Rest API 2022-08-02 00:02:50 +02:00
Falko Woudstra
d0d498e9c7 Add warning PATCH update route and add deprecation warning on PUT 2022-08-01 23:59:26 +02:00
Dan Ribbens
da2a262208 test: e2e windows compatibility (#861)
* test: e2e compatible with windows
* chore: mongoose type fix
2022-08-01 15:21:25 -04:00
James
2f86a39e38 test: adds more tabs tests 2022-08-01 13:11:08 -04:00
James
408b66590a fix/#853 2022-08-01 12:23:53 -04:00
James
663cae4788 fix: ensures tabs can overflow on mobile when there are many 2022-08-01 08:54:23 -04:00
James
3a66860ab2 Merge branch 'master' of github.com:payloadcms/payload 2022-08-01 08:40:54 -04:00
James
9abb74abf7 fix/#854 2022-08-01 08:40:48 -04:00
Elliot DeNolf
bf47f69258 chore(release): v1.0.11 2022-07-28 14:09:41 -04:00
Elliot DeNolf
0b57e45ee4 test: consolidate e2e npm script 2022-07-28 13:51:34 -04:00
Elliot DeNolf
bf942bf015 ci: run all e2e tests (#847) 2022-07-28 13:33:06 -04:00
Elliot DeNolf
b2ae5da62a test: fix fields-relationship e2e (#846) 2022-07-28 11:50:23 -04:00
James
858b1afa54 fix: ensures when initial values changes, field value is updated 2022-07-28 11:46:52 -04:00
lordie
bc83153b60 assert every list element non null 2022-07-27 18:46:39 -03:00
Elliot DeNolf
1997153549 test: implement script to execute all e2e tests (#840) 2022-07-27 17:22:49 -04:00
Elliot DeNolf
b479013f00 test: fix admin e2e config (#839) 2022-07-27 17:10:51 -04:00
Dan Ribbens
211b960440 chore(release): v1.0.10 2022-07-27 15:53:41 -04:00
James
7157f70790 Merge branch 'master' of github.com:payloadcms/payload 2022-07-27 15:43:11 -04:00
James
84611aff2c fix: #836 2022-07-27 15:43:02 -04:00
James Mikrut
bd4dd45f8e Merge pull request #819 from payloadcms/feat/dataloader
feat: greatly enhances performance by using dataloader pattern to batch populations
2022-07-27 11:36:28 -04:00
James Mikrut
f190ad3576 Merge pull request #834 from payloadcms/fix/gql-refresh-resolver
fix: accesses payload config correctly in gql refresh resolver
2022-07-27 11:36:16 -04:00
Dan Ribbens
9813216ea9 test: add circular relationship to tests (#835) 2022-07-27 11:16:05 -04:00
Jarrod Flesch
d5e88cc1a9 fix: accesses payload config correctly in gql refresh resolver 2022-07-27 09:17:07 -04:00
James
5dc7caf356 fix: id now properly required in graphql findByID operation 2022-07-26 16:59:29 -04:00
James
a8a21e119b chore: better naming conventions within local api 2022-07-26 12:58:02 -04:00
Elliot DeNolf
2c9d45c59c chore: remove unused files 2022-07-26 11:02:53 -04:00
Elliot DeNolf
d176633804 test: increase custom id randomization window (#829) 2022-07-26 10:35:46 -04:00
wristshot9987
f65594be43 doc: Adding a contributing section to README.md (#804) 2022-07-26 09:58:11 -04:00
Elliot DeNolf
f0466f885f chore: update contributing guide (#825) 2022-07-25 21:07:28 -04:00
James Mikrut
309a8cde95 Merge pull request #823 from payloadcms/fix/#809
fix: ensures collapsible preferences are retained through doc save
2022-07-25 15:03:41 -07:00
James
61f0e8ea9f fix: ensures collapsible preferences are retained through doc save 2022-07-25 18:02:48 -04:00
James Mikrut
af00eb9cc4 Merge pull request #820 from payloadcms/fix/#801
fix: email not always loading while viewing auth collections
2022-07-25 14:07:50 -07:00
James Mikrut
61e8a4d6ee Merge pull request #821 from payloadcms/fix/#806
fix: #806, allow partial word matches using 'like' operator
2022-07-25 14:07:39 -07:00
James Mikrut
55a273d982 Merge pull request #811 from vincentvandijck/fix/set-overflow-modal-to-auto
fix: set overflow payload modal container to auto
2022-07-25 14:03:32 -07:00
James Mikrut
0993223e5c Merge pull request #810 from vincentvandijck/fix/trim-login-email
Fix/trim login email
2022-07-25 14:02:23 -07:00
James
08a38b03b9 chore: applies fix to other edit views 2022-07-25 16:58:47 -04:00
James
b79ae00603 test: adds like query partial word match test 2022-07-25 16:56:45 -04:00
James
c96985be0c fix: #806, allow partial word matches using 'like' operator 2022-07-25 16:48:45 -04:00
James
36e9acc637 fix: email not always loading while viewing auth collections 2022-07-25 16:29:20 -04:00
James
e541713282 chore: linting 2022-07-25 16:03:50 -04:00
James
5d57bfa438 feat: significantly improves complex GraphQL query performance 2022-07-25 15:54:52 -04:00
James
c5bcd1e341 feat: greatly enhances performance by using dataloader pattern to batch populations 2022-07-25 15:12:28 -04:00
Vincent Van Dijck
cfb5540e64 fix: set overflow payload modal container to auto 2022-07-25 03:14:19 +02:00
Vincent Van Dijck
38d1794ee2 Merge branch 'fix/trim-login-email' of https://github.com/vincentvandijck/payload into fix/trim-login-email 2022-07-24 23:12:09 +02:00
Vincent Van Dijck
8feed39fb9 fix: trim trailing whitespaces of email in login 2022-07-24 23:08:35 +02:00
Vincent Van Dijck
3140f9c3b8 trim trailing whitespaces of email in login 2022-07-24 23:05:50 +02:00
lordie
e13c6fa955 graphql schema: check blockfield 'required' property for null-ability 2022-07-22 18:05:43 -03:00
James Mikrut
b201168bd0 Merge pull request #796 from wenqingl/master
doc: Update README.md
2022-07-21 16:48:56 -07:00
James Mikrut
e5e675c14a Update CHANGELOG.md 2022-07-21 16:48:20 -07:00
James
9589f0798f chore(release): v1.0.9 2022-07-21 16:47:15 -07:00
James
e1c35b5220 chore: further documents strategies 2022-07-21 16:42:40 -07:00
Dan Ribbens
f22f56e73c feat: use provided auth strategy name or strategy.name (#797)
* feat: use provided auth strategy name or strategy.name

* fix: require strategy name when providing custom auth
2022-07-21 19:36:31 -04:00
wenqingl
61280e36c4 Update README.md 2022-07-21 16:17:10 -07:00
Luciano Greiner
3b4d5afd41 fix: avoid assuming Email will be present on JWT token. Using ID instead as email might not be in if using disableLocalStrategy (#789) 2022-07-21 15:20:23 -07:00
Luciano Greiner
3a3026cd63 feat: pass payload and names to custom auth strategies (#781) 2022-07-21 18:18:26 -04:00
Marco Sangalli
2a1f387bcc fix: enable index creation from schema (#791) 2022-07-21 18:16:28 -04:00
Jarrod Flesch
6f8b8d0fb8 fix(doc): corrects doc to match underlying Access type (#792) 2022-07-21 18:00:17 -04:00
Elliot DeNolf
8a81d0b274 fix: graphql gen logging output (#795) 2022-07-21 13:48:54 -07:00
Jarrod Flesch
e2c366f536 fix: sharpens radio input edges by replacing box-shadow trick with border property (#768) 2022-07-21 09:55:37 -07:00
Elliot DeNolf
4415f9db48 chore: add error message if test config doesn't exist 2022-07-21 08:17:54 -07:00
Elliot DeNolf
f6ff308dc4 chore(release): v1.0.8 2022-07-20 16:52:27 -07:00
Elliot DeNolf
546011d8a9 chore: add MIT license badge 2022-07-20 15:05:47 -07:00
Elliot DeNolf
60c0f0fb08 chore: organize relationship custom id tests 2022-07-20 15:04:57 -07:00
James Mikrut
4b6f451022 Merge pull request #785 from payloadcms/fix/#756
Fix/#756
2022-07-20 14:51:31 -07:00
Elliot DeNolf
3fb2bcfac7 feat: export PayloadRequest 2022-07-20 12:43:03 -07:00
Elliot DeNolf
66c820c863 feat: export PayloadRequest 2022-07-20 12:37:19 -07:00
Dan Ribbens
09f57e9a4c test: group relationships
* test: relationship fields inside groups and subgroup

* test: group nested relationships and arrays

* test: improves coverage for hooks

Co-authored-by: James <james@trbl.design>
2022-07-20 11:52:21 -07:00
James Mikrut
6f748f1adb feat: improves generated types by removing unnecessary optional properties (#784) 2022-07-20 11:51:19 -07:00
Dan Ribbens
893772ebd8 fix: await field hooks recursively 2022-07-19 19:57:47 -04:00
James
b987cb8dc4 fix: potential solution for #756 2022-07-19 15:52:05 -07:00
Dan Ribbens
aa322b2cf2 chore(release): v1.0.7 2022-07-19 14:45:11 -04:00
Dan Ribbens
4c68f64829 docs: update demo links and add examples to test dir (#773) 2022-07-19 14:42:14 -04:00
Elliot DeNolf
cc360191b5 docs: remove references to demo config 2022-07-19 11:09:13 -07:00
Elliot DeNolf
1d06117619 chore: adjust banner color 2022-07-19 07:20:59 -07:00
James
446a4e1d8a chore(release): v1.0.6 2022-07-19 01:46:02 -07:00
James
428edb05c4 feat: improves initAsync pattern 2022-07-19 01:42:56 -07:00
James
21708bcc1c chore(release): v1.0.5 2022-07-19 01:34:03 -07:00
James
23d605c5aa Merge branch 'master' of github.com:payloadcms/payload 2022-07-19 01:32:36 -07:00
James
b4ffa22885 feat: adds initAsync 2022-07-19 01:32:25 -07:00
Elliot DeNolf
d2bc4b72a0 chore: update onInit type 2022-07-19 01:05:49 -07:00
Elliot DeNolf
27c352c2ff chore: update changelog 2022-07-19 00:07:13 -07:00
James
19a354863f chore(release): v1.0.4 2022-07-18 23:54:41 -07:00
James
33f4a1322d chore: 1.0.3 2022-07-18 23:53:22 -07:00
Elliot DeNolf
563f98e2fb feat: merge 1.0 #762 2022-07-18 23:22:02 -07:00
Dan Ribbens
1e4b94c508 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-19 02:03:24 -04:00
Dan Ribbens
cd8d1c7ace docs: dark mode 2022-07-19 02:02:30 -04:00
Dan Ribbens
2ea545f0cf test: list cell data 2022-07-19 02:02:06 -04:00
Elliot DeNolf
e8a1cdafba test: misc e2e fixes 2022-07-18 22:59:48 -07:00
Elliot DeNolf
1f8b5d8e1a test: make auth e2e a todo 2022-07-18 22:53:30 -07:00
Dan Ribbens
793dfe96b9 test: promise hooks 2022-07-19 01:32:31 -04:00
Elliot DeNolf
6533af9c0e chore: add scss breaking change to changelog 2022-07-18 22:23:26 -07:00
Dan Ribbens
87ead2f89b Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-18 23:50:57 -04:00
Dan Ribbens
28e3928094 test: array fields 2022-07-18 23:50:28 -04:00
Elliot DeNolf
dc41372acb test: test sibling data in access control 2022-07-18 20:33:36 -07:00
Elliot DeNolf
6a9ea638d5 test: add access-control int tests 2022-07-18 18:50:41 -07:00
Elliot DeNolf
2a7651eb9c test: fix odd behavior 2022-07-18 15:27:20 -07:00
James
9021d5352d Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-18 13:07:25 -07:00
James
dc5c9ee3a0 chore: better fix to rich text upload 2022-07-18 13:07:20 -07:00
James
079623f40a fix: responsive improvements to rich text upload 2022-07-18 12:50:20 -07:00
Dan Ribbens
b59ba230de Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-18 14:26:09 -04:00
Dan Ribbens
6826e44072 test: field default values 2022-07-18 14:25:18 -04:00
Elliot DeNolf
878fd4ab92 test: custom id crud 2022-07-18 10:29:33 -07:00
Elliot DeNolf
abfb1868ab test: custom id number relation test 2022-07-18 10:08:01 -07:00
Elliot DeNolf
7319a8e90d test: rest client update now can return errors 2022-07-18 10:07:25 -07:00
Elliot DeNolf
d2be893a5a test: port relationships spec 2022-07-18 09:55:59 -07:00
Dan Ribbens
cc8b636248 test: relationship populates with locale 2022-07-18 12:19:35 -04:00
Elliot DeNolf
a103665bd9 chore: typo 2022-07-17 16:38:24 -07:00
Elliot DeNolf
0d1603b467 test: fix more stuff 2022-07-17 16:22:20 -07:00
Elliot DeNolf
d6a7b8c319 test: remove demo and rework node scripts 2022-07-17 16:18:48 -07:00
Elliot DeNolf
f5ad7a163a test: remove all old tests 2022-07-17 16:08:07 -07:00
James
d433351dbd chore: typo in changelog 2022-07-17 15:12:55 -07:00
James
3601ef90bc Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-17 15:12:36 -07:00
James
76b6c736e1 fix: success banner color rendering incorrectly 2022-07-17 15:12:27 -07:00
Dan Ribbens
a194a64845 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-17 18:02:49 -04:00
Dan Ribbens
b00d8584f3 feat: test admin globals 2022-07-17 18:02:41 -04:00
James
39d075b999 fix: ensures passing partial data to update works when fields are localized 2022-07-17 15:00:38 -07:00
James
e57a5741e5 chore: reduces lorem ipsum amount in rich text 2022-07-17 13:34:06 -07:00
James
a6a9ab15b7 feat: merges select isClearable 2022-07-17 13:29:18 -07:00
James
4280a59c77 Merge branch 'master' of github.com:payloadcms/payload into feat/1.0 2022-07-17 13:23:04 -07:00
James
3259e34e27 chore: merges master 2022-07-17 13:23:00 -07:00
Arick
3132d35e27 feat: allow clear select value (#735) 2022-07-17 13:22:49 -07:00
James
7376246592 fix: ensures success pills are properly colored 2022-07-17 13:22:01 -07:00
James
69ce6d78da Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-17 13:11:47 -07:00
James
b43e8c5db0 tests: ports versions tests to new infra 2022-07-17 13:11:38 -07:00
Dan Ribbens
e348bdcc21 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-17 15:58:47 -04:00
Dan Ribbens
039c3ec110 test: int test globals and endpoints 2022-07-17 15:58:32 -04:00
Elliot DeNolf
f98ef62ad3 test: port auth tests to int 2022-07-17 10:46:07 -07:00
Elliot DeNolf
17ebcc6925 chore: remove .prettierignore, unused 2022-07-17 10:45:46 -07:00
James
6347a2febf fix: ensures column selector renders active columns properly 2022-07-17 10:06:58 -07:00
James
2ef8a1e35a fix: ensures point field doesn't interrupt version creation 2022-07-17 10:03:22 -07:00
James
df11478905 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-17 09:51:55 -07:00
James
e7d2bdb45a fix: styles empty version diff row for dark mode 2022-07-17 09:51:42 -07:00
Dan Ribbens
1564fcaeb3 fix test collections rest endpoints 2022-07-17 12:44:39 -04:00
Dan Ribbens
cf38e8d520 feat: test collections rest endpoints 2022-07-17 12:41:47 -04:00
Dan Ribbens
bb9f28fb08 feat: remove files test helper 2022-07-17 12:39:45 -04:00
James
d8a28acfa8 feat: expands rich text field config for better coverage 2022-07-17 09:26:43 -07:00
Elliot DeNolf
b0eccdd12e chore: revert prettier
This reverts commit bc9de859c4.
2022-07-17 09:06:37 -07:00
James
1427fb4078 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-17 08:32:23 -07:00
James
1812be2e16 feat: adds uploads collection for testing to /fields tests 2022-07-17 08:32:15 -07:00
Elliot DeNolf
db87179576 chore: fix .prettierignore 2022-07-17 08:32:06 -07:00
Elliot DeNolf
0d8d41ce7e chore: format demo dir 2022-07-17 08:29:53 -07:00
Elliot DeNolf
a2f95f6cea test: add .gitkeep to uploads/media 2022-07-17 08:23:26 -07:00
Elliot DeNolf
fa9bd6191c chore: run prettier on entire test dir 2022-07-17 08:20:01 -07:00
Elliot DeNolf
bc9de859c4 chore: add prettier config, test dir only 2022-07-17 08:19:07 -07:00
James
73d04262ad chore: version bump 2022-07-16 18:12:18 -07:00
James
6e7d547da5 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-16 18:08:46 -07:00
James
6060e4cb27 fix: bug with version diff screen when arrays have no labels 2022-07-16 18:08:37 -07:00
Elliot DeNolf
b5ce54c7ae test: localization relationship tests 2022-07-16 18:01:13 -07:00
Dan Ribbens
492a1308cc Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-16 21:00:35 -04:00
Dan Ribbens
147a4f8624 hooks tests 2022-07-16 21:00:18 -04:00
James
eac982398e feat: avoids forcing fonts to be inline within webpack builds 2022-07-16 17:59:24 -07:00
Dan Ribbens
9afd51b7dd Merge branch 'feat/1.0' into feat/test-hooks 2022-07-16 20:42:13 -04:00
Dan Ribbens
dd810a3593 fix: tabs top margin 2022-07-16 19:09:36 -04:00
James
75a4c52071 chore: reduces padding in eyebrow on mobile 2022-07-16 16:03:22 -07:00
James
2707af1d45 fix: ensures blocks can be nested within tabs / rows / collapsibles 2022-07-16 15:51:05 -07:00
James
b7d49db536 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-16 15:45:20 -07:00
James
3a98c6ad53 feat: ensures groups within blocks render properly 2022-07-16 15:45:15 -07:00
Elliot DeNolf
79f3de8042 test: add localization int tests 2022-07-16 15:01:31 -07:00
Elliot DeNolf
81024e4753 test: extra desc block 2022-07-16 15:00:44 -07:00
James
e2c333ac02 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-16 13:57:44 -07:00
James
1bdacb9bda chore: removes unused file 2022-07-16 13:57:32 -07:00
James
2fa680cdf8 feat: refactors z index methodology 2022-07-16 13:56:49 -07:00
James
3a17a8a001 feat: styles nested groups and adds gutter back to richText 2022-07-16 12:45:15 -07:00
Dan Ribbens
afbb014cbd Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-16 14:40:46 -04:00
Dan Ribbens
c75c67ec86 feat: point field int test 2022-07-16 14:40:02 -04:00
James
e8b72f186f chore: restores deprecated features for ease of uploading 2022-07-16 11:27:28 -07:00
James
a777032894 chore: only imports get-port if dev 2022-07-16 11:11:14 -07:00
James
624e25c077 chore: adds pretest 2022-07-16 11:06:06 -07:00
James
34d0b89376 chore: increases jest timeout 2022-07-16 11:01:09 -07:00
James
fcd3b0d2cb chore: updates version 2022-07-16 10:59:25 -07:00
James
5512022a10 chore(release): v0.20.1 2022-07-16 10:58:46 -07:00
James
28e31fee72 chore: patch 0.20.0 2022-07-16 10:56:53 -07:00
James
779a60a42c chore: removes unused dependencies 2022-07-16 10:41:54 -07:00
Dan Ribbens
ba29898d97 Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-16 13:40:12 -04:00
Dan Ribbens
a636c65e34 chore: do not track images in media 2022-07-16 13:38:33 -04:00
Dan Ribbens
ff3e137c78 chore: media test dir 2022-07-16 13:37:56 -04:00
James
8c4e0fa7b2 feat: updates styling of group field 2022-07-15 22:24:52 -07:00
James
3ae1c26a07 fix: ensures duplicated rows have properly created ids 2022-07-15 22:04:31 -07:00
James
7a6f2392fa feat: restores built-in fields into table column builder 2022-07-15 21:08:49 -07:00
James
07949525ef Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-15 21:06:22 -07:00
James
3b9fdf3ffd feat: ensures nested fields not affecting data can be traversed properly 2022-07-15 21:06:12 -07:00
Dan Ribbens
2694c0d5bd * feat: point field e2e test (#760) 2022-07-15 23:36:07 -04:00
Elliot DeNolf
4f8b5b9f85 test(int): collections-graphl 2022-07-15 20:32:40 -07:00
Dan Ribbens
e75cca4512 feat: upload integration tests (#759) 2022-07-15 22:48:39 -04:00
James
68e7c41fdc feat: finishes tabs field 2022-07-15 18:40:31 -07:00
James
735e385537 feat: only renders arrays and blocks once they are initialized 2022-07-15 17:26:05 -07:00
James
c995f797fe feat: initializes useField internalValue with incoming field value 2022-07-15 17:20:32 -07:00
James
54162b52cc feat: ensures tabs and collapsibles render in version diff 2022-07-15 17:18:33 -07:00
James
66fc06895a Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/tabs 2022-07-15 16:24:59 -07:00
James
85b7a490eb feat: scaffolds tabs field 2022-07-15 16:24:54 -07:00
Elliot DeNolf
4b0a257246 test: fix all test scripts 2022-07-15 14:36:09 -07:00
Elliot DeNolf
29f1af7eb4 chore: remove console logs 2022-07-15 12:53:07 -07:00
Elliot DeNolf
ba79b4446c test: refactor all test directories into one 2022-07-15 12:51:43 -07:00
Dan Ribbens
40b6afff2d feat: remove duplication of config in tests 2022-07-15 14:11:16 -04:00
Dan Ribbens
a664b627f6 fix: upload e2e file path 2022-07-15 13:39:12 -04:00
Elliot DeNolf
3a4657e368 test: fix bad file ref and update locators 2022-07-15 10:02:09 -07:00
James
4cb565f1cc Merge branch 'feat/1.0' of github.com:payloadcms/payload into feat/1.0 2022-07-14 16:35:58 -07:00
James
31ca363982 feat: revises e2e field testing 2022-07-14 16:35:35 -07:00
Elliot DeNolf
4a3588e965 test: collections and new test ids and classes 2022-07-14 16:16:16 -07:00
Dan Ribbens
11600930b7 feat: e2e test upload (#755) 2022-07-14 18:43:19 -04:00
James
4bb0d3994f fix: bug with base colors 2022-07-14 15:27:17 -07:00
James
5fc4f3adad feat: more maintainable colors 2022-07-14 15:20:34 -07:00
James
41a0ba5780 feat: finishes block field 2022-07-14 14:46:42 -07:00
Elliot DeNolf
f7a81d70ac test(access-control): restricted and read-only (#754) 2022-07-14 14:33:54 -07:00
Elliot DeNolf
baf4664073 feat: add card ids 2022-07-14 14:09:59 -07:00
Dan Ribbens
48700a93e3 * fix: css selectors 2022-07-14 17:00:34 -04:00
James
49d09a349f feat: updates block field to use new collapsible 2022-07-14 14:00:14 -07:00
Dan Ribbens
31bc4c6532 * feat: optimize collection list relationship queries (#749)
* feat: optimize collection list relationship queries
2022-07-14 16:51:41 -04:00
James
aa89251a3b feat: retrofits array to new collapsible component 2022-07-13 20:09:50 -07:00
Elliot DeNolf
057846e250 test: collections-rest and dev type generation (#750) 2022-07-13 17:46:59 -07:00
Dan Ribbens
5a5e3b589c chore: set playwright timeout to 10m 2022-07-13 20:20:25 -04:00
James
270dd22f08 docs: updates fields overview to include collapsible 2022-07-13 15:41:41 -07:00
James
beec04a1bc docs: collapsible 2022-07-13 15:40:59 -07:00
James
60bfb1c3b8 feat: finishes collapsible field 2022-07-13 15:29:49 -07:00
James
98676bea69 feat: adds collapsible field type 2022-07-13 14:45:10 -07:00
James
8589fdefda feat: reorganizes mongo connection 2022-07-13 13:17:00 -07:00
James
8ba25e8602 chore: renames admin url util conventions 2022-07-13 12:47:53 -07:00
James
de43e21ebc chore: stubs out fields e2e 2022-07-13 12:40:29 -07:00
Elliot DeNolf
90ba15f9bd feat: testing refactor (e2e/int) (#748)
Co-authored-by: James <james@trbl.design>
Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-07-13 11:00:10 -07:00
James Mikrut
b9f9f15d77 feat/adds dark mode and evolves admin ui
* feat: builds color palette for light and dark mode, removes all conflicting rgba sass

* chore: replaces colors with css vars

* chore: adapts blur-bg to be more performant and stable

* chore: getting ready for dark mode

* chore: removes unused file

* chore: reverts input bg

* chore: reverses selection in dark mode

* feat: builds theme toggler

* feat: adds auto mode for theme

* feat: establishes light / dark css pattern, updates account and list

* chore: migrates more views to gutter component

* chore: adapts global, adjusts popups

* chore: finishes retrofitting views

* feat: moves to medium instead of semi-bold for headlines

* feat: introduces new font for rte

* feat: updates rich text styles

* feat: styles react select in dark mode

* chore: styles datepicker, misc refinements

* chore: updates style of UploadCard

* chore: fixes code styles

* chore: styles PerPage

* chore: improves styling of column / where selector

* feat: improves field errors in dark mode

* chore: styles built-in rich text elements

* chore: improves styling of rte elements

* chore: tweaks
2022-07-13 10:36:25 -07:00
James
cac5266c79 chore: changelog 2022-07-11 11:53:12 -07:00
James
420afc6838 chore(release): v0.19.2 2022-07-11 11:50:25 -07:00
James
4e3c4e9c0c Merge branch 'master' of github.com:payloadcms/payload into feat/extensible-auth-strategies 2022-07-11 11:45:48 -07:00
James
2c27812ba1 chore: removes cookie-parser 2022-07-11 11:45:44 -07:00
James Mikrut
2f57a983cd Merge pull request #739 from payloadcms/feat/extensible-auth-strategies
Feat/extensible auth strategies
2022-07-11 11:44:32 -07:00
James
91c4ef226b fix: ensures router switch only contains top-level route components 2022-07-11 08:31:43 -07:00
James
38b52bf67b feat: better types useAuth and custom provider components 2022-07-09 22:23:37 -07:00
James
281985970d Merge branch 'feat/extensible-auth-strategies' of github.com:payloadcms/payload into feat/extensible-auth-strategies 2022-07-09 17:39:19 -07:00
James
03f28a4804 feat: ensures auth component doesn't render if disabled 2022-07-09 17:16:19 -07:00
Dan Ribbens
c0acba94c6 Merge branch 'feat/extensible-auth-strategies' of github.com:payloadcms/payload into feat/extensible-auth-strategies 2022-07-09 19:58:19 -04:00
Dan Ribbens
8d550d411e docs: update collection hooks 2022-07-09 19:57:58 -04:00
Elliot DeNolf
e8064371b0 feat: add preMiddleware and postMiddleware, deprecate middleware 2022-07-09 16:47:23 -07:00
Dan Ribbens
166bd31506 feat: add res to token hooks 2022-07-09 19:38:24 -04:00
Dan Ribbens
4055908bc8 feat: add afterMe afterLogout and afterRefresh 2022-07-09 19:29:00 -04:00
James
d68bb8c292 fix: removes reliance on auth email 2022-07-09 14:40:31 -07:00
James
c8be171f24 chore: further disabling of local auth strategy 2022-07-09 12:04:21 -07:00
Dan Ribbens
43eafd4b9f chore(release): v0.19.1 2022-07-09 12:04:17 -04:00
Dan Ribbens
ce1c99b01c fix: ensures duplicative relationship options are not present (#732)
Co-authored-by: James <james@trbl.design>
2022-07-09 11:58:03 -04:00
James
4b2bc36f89 chore: reduces unnecessary strategy complexity 2022-07-09 08:40:13 -07:00
James
58587525e5 feat: adds cookie-parser 2022-07-08 18:36:12 -07:00
James
df76f60e7f fix: ensures anonymous passport strategy is loaded last 2022-07-08 17:56:39 -07:00
James
2c66ad8689 feat: ensures only plain objects are merged within incoming configs 2022-07-08 17:37:43 -07:00
James
6016e2346c feat: extends strategies with more properties 2022-07-08 15:16:30 -07:00
James
56cdd943fd feat: only adds email if local strategy enabled 2022-07-08 14:50:04 -07:00
James
6d02f7d3ac feat: begins extensible auth strategies 2022-07-08 13:46:12 -07:00
Dan Ribbens
18f8790062 chore: breaking changes 0.19.0 2022-07-08 14:08:04 -04:00
Dan Ribbens
854b63ec34 chore(release): v0.19.0 2022-07-08 14:07:28 -04:00
Dan Ribbens
beccbbd3e8 chore: package script quotes windows compatibility 2022-07-08 14:00:23 -04:00
Dan Ribbens
91d0d84c65 docs: update graphql schema 2022-07-08 13:53:40 -04:00
chris-schra
7dd67a8d39 chore: ignore Yarn Berry files in .gitignore (#713) 2022-07-08 13:51:42 -04:00
Dan Ribbens
ad43cbc808 feat: graphql schema output (#730)
* chore: refactor graphql initialization

* feat: generate graphql schema script

* feat: script commands are case insenstive
2022-07-08 13:50:46 -04:00
James Mikrut
2b2a562d83 Merge pull request #731 from payloadcms/fix/auth-me-gql-relationships
Fix/auth me gql relationships
2022-07-08 10:48:09 -07:00
James
d9e7696384 chore: strips trailing slashes from jwt strategy 2022-07-08 10:41:10 -07:00
James
01bc1fef1e fix: ensures auth/me relations in gql can be queried 2022-07-08 10:25:00 -07:00
Dan Ribbens
567d8c19bf fix: allow passing of autoIndex mongoose connectionOptions (#722) 2022-07-06 15:57:02 -04:00
James Mikrut
b722bed24f Merge pull request #720 from payloadcms/fix/#692
fix: ensures old data from arrays is not persisted
2022-07-06 14:36:00 -04:00
James
0af66d68a7 chore: tests array functionality 2022-07-06 11:34:22 -07:00
Henri Tuan
f3b7dcff57 feat: File argument in create/update operation (#708)
Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-07-06 11:26:04 -07:00
chris-schra
67331eb975 fix: copyfiles cross platform (#712) 2022-07-06 13:57:18 -04:00
James
d9ef803d20 fix: ensures old data from arrays is not persisted 2022-07-06 10:52:52 -07:00
Andrzej Kłapeć
9fd171b26d feat: allow clearing DatePicker value (#641)
Co-authored-by: Elliot DeNolf <denolfe@gmail.com>
2022-07-06 09:38:45 -07:00
Dan Ribbens
91e33d1c1c fix: relationship field disabled from access control in related collections (#644)
* fix: disabled relationship field from access control in related collections

* fix: ids can be read from relationships regardless of access of related document
2022-07-03 07:01:45 -04:00
Akansh Sirohi
601e69ab0d Fixes payloadcms/payload#650 (#706)
* fix: min/max number validation of decimal values
2022-07-03 06:25:03 -04:00
Andres Kalle
81aa74bbbe docs: fixed example URL (#705) 2022-07-02 07:42:12 -04:00
Dan Ribbens
e84b7a9c58 chore(release): v0.18.5 2022-06-29 14:14:47 -04:00
Dan Ribbens
b6b0ffb674 fix: empty cell data renders in list (#699) 2022-06-29 14:07:21 -04:00
Dan Ribbens
62bd2db5f9 chore: update json-schema-to-typescript to v11 (#700) 2022-06-29 14:03:30 -04:00
Steven Roh
74342a4dea Avoid app crashing when code (data) is undefined (#681)
* fix: code field ui errors when data is undefined
2022-06-29 12:12:33 -04:00
Min Somai
c78d77446a fix: icon appears above select field's option list (#685)
* fix: icon of the date field appears above the option list
2022-06-29 12:09:53 -04:00
Dan Ribbens
6eb4fc04b1 Fix/validate imagesizes with mimetypes (#688)
* fix: mimetype validation with image sizes

* fix: unique filename error on image sizes
2022-06-29 12:05:57 -04:00
Dan Ribbens
f1b00e85fc docs: update links 2022-06-29 11:19:34 -04:00
gonza moiguer
7c73f2c1d9 Corrected Radio field doc, 'option' for 'label' (#690) 2022-06-27 13:03:41 -04:00
James
704e543c7e chore(release): v0.18.4 2022-06-24 17:53:35 -04:00
Lachlan Heywood
fcaa1454dc Update load.ts (#679) 2022-06-24 17:52:06 -04:00
James
9d388f7a89 chore(release): v0.18.3 2022-06-24 17:51:01 -04:00
James
918062de2f fix: #670, max tokenExpiration 2022-06-24 17:49:36 -04:00
James
375738d99c chore(release): v0.18.2 2022-06-24 17:34:07 -04:00
Dan Ribbens
1c37ec3902 feat: telemetry
* feat: add telemetry to payload config

wip: more telemetry

* feat: send telemetry events

* chore: update node ci versions

* chore: cleanup console log

* chore: updates ts due to dependency update

* chore: remove unused deps

* chore: fix origin and casing

* docs: telemetry

* feat: uses oneWayHash within telemetry

* chore: sends hashed domain in telemetry

* feat: improves reliability of telemetry projectID

* chore: revises telemetry docs

Co-authored-by: Elliot DeNolf <denolfe@gmail.com>
Co-authored-by: James <james@trbl.design>
2022-06-24 17:32:09 -04:00
Kent Warren
7eb804daf9 docs: typo (#683)
Changes "you" to "your"
2022-06-24 16:52:57 -04:00
James
d99a67ca95 chore(release): v0.18.1 2022-06-21 15:45:20 -04:00
James
3d5ed93fce fix: #671, password reset broken 2022-06-21 15:43:12 -04:00
Ahmet Kilinc
b80006be45 Change "ist" to "it" (#668)
docs: Small typo on middleware page
2022-06-20 10:45:34 -04:00
Dan Ribbens
70edb0ba38 chore(release): v0.18.0 2022-06-14 08:53:17 -04:00
Dan Ribbens
a1fe17d05d fix: me auth route breaks with query params (#648) 2022-06-13 11:49:04 -04:00
James Mikrut
7083225abd Feat/remove this bindings (#629)
* feat: removes this bindings for cleaner, more maintainable code

Co-authored-by: Elliot DeNolf <denolfe@users.noreply.github.com>
Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-06-08 14:44:34 -04:00
Jarrod Flesch
af6479bf34 feat: adds timestamps to generated collection types if enabled (#604)
* feat: adds timestamps to generated collection types if enabled
2022-06-08 11:41:09 -04:00
Dan Ribbens
44c12325b4 feat: enable webpack filesystem cache in dev (#621) 2022-06-08 11:38:07 -04:00
Dan Ribbens
f2bf2399fa fix: custom fields values resetting in ui (#626) 2022-06-08 11:37:31 -04:00
Dan Ribbens
7fe2fece6c chore: remove node-sass (#605) 2022-06-08 11:36:33 -04:00
James
bf0fe090ab chore(release): v0.17.3 2022-06-08 10:33:12 -04:00
Dan Ribbens
397dba4a30 Fix/delete document workflow (#622)
* fix: admin ui display server errors when deleting documents

* fix: admin ui display delete document state gets stuck after 403
2022-06-08 10:24:34 -04:00
Dan Ribbens
593d6a596a docs: remove withCondition for custom component fields (#588) 2022-06-08 10:24:21 -04:00
Dan Ribbens
82a6db8b4f docs: add examples to collection hooks (#620) 2022-06-08 10:23:55 -04:00
Dan Ribbens
28aa3dd17b chore: update license in package.json (#631) 2022-06-08 10:23:15 -04:00
James Mikrut
3d4d807370 Fix/propagate locale relationship (#637)
* fix: propagate locale through relationship

* fix: ensures locales are populated properly through local operations

* chore: adds test for locale propagation

Co-authored-by: Elliot DeNolf <denolfe@gmail.com>
2022-06-08 10:23:01 -04:00
James
c18cc23c71 fix: ensures unflattening locales only happens if config specifies locales 2022-06-08 10:07:17 -04:00
GeorgeyB
7ee374ea1a Custom collection/global endpoints (#607)
* feat: add custom endpoints for collections and globals REST APIs

Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-05-30 12:43:18 -04:00
Dan Ribbens
20bbda95c6 fix: duplicate objects in array fields in validate data and siblingData (#599) 2022-05-25 13:44:28 -04:00
James
67fecf6c2c chore(release): v0.17.2 2022-05-23 22:08:23 -04:00
James Mikrut
20d251fd5d fix: #576, graphql where on hasMany relationship not working (#582) 2022-05-23 22:06:37 -04:00
Jarrod Flesch
982b3f0582 fix: adds optional chaining to safely read drafts setting on versions (#577) 2022-05-23 20:23:24 -04:00
Roman Bondarenko
200aa2e1c2 chore: fix typo in plugins/overview (#578) 2022-05-23 20:22:54 -04:00
GeorgeyB
734e905c18 fix: passes required prop for select field (#579) 2022-05-23 20:22:36 -04:00
Elliot DeNolf
5ce223e5f4 ci: remove e2e test run until figure out flaking 2022-05-23 17:07:56 -04:00
James
6a17d3db98 chore: doc readability 2022-05-23 11:01:47 -04:00
James
f27c5ca6f0 docs: adds detail regarding access control arguments 2022-05-23 10:56:49 -04:00
James
ac355b58d4 chore(release): v0.17.1 2022-05-17 13:15:24 -04:00
James
e1a5547fea fix: only localizes schema if both field and top-level config are enabled 2022-05-17 13:13:37 -04:00
Dan Ribbens
dd8c1d7a9e chore(release): v0.17.0 2022-05-16 19:29:03 -04:00
Dan Ribbens
4913441017 Free and open-source under MIT license (#565)
* feat: free and open-source under MIT license
2022-05-16 19:25:20 -04:00
Dan Ribbens
16b7edbc97 fix: prevent changing order of readOnly arrays (#563) 2022-05-16 19:00:08 -04:00
Dan Ribbens
5bfde9da91 chore: fix inconsistent e2e test results (#562)
* chore: fix inconsistent e2e test results
2022-05-11 23:19:08 -04:00
Dan Ribbens
52acfcb0e3 chore: export useDocumentInfo (#561)
* chore: export useDocumentInfo and add to custom component documenation
2022-05-11 21:50:17 -04:00
Dan Ribbens
8813bc7695 chore: e2e running in CI (#559)
* chore: e2e ci testing with mongo-memory-server
2022-05-11 21:49:11 -04:00
Dan Ribbens
1dfe2b8929 fix: apply field condition to custom components (#560) 2022-05-11 19:43:53 -04:00
Dan Ribbens
afb158fb50 chore(release): v0.16.4 2022-05-06 13:58:01 -04:00
Dan Ribbens
78edac684e fix: fields in groups causing console error in browser (#553) 2022-05-06 13:50:58 -04:00
Dan Ribbens
46f4bc2a07 fix: save resized image file when equal to upload size (#555) 2022-05-06 13:50:47 -04:00
James
f361a44cca chore(release): v0.16.3 2022-05-04 11:20:47 -04:00
James
47c37e0153 fix: rare bug while merging locale data 2022-05-04 11:18:52 -04:00
James
5df3b35189 chore(release): v0.16.2 2022-05-02 13:44:31 -04:00
Elliot DeNolf
1e4a68f76e fix: checkbox defaultValues and more typing of sanitize (#550) 2022-05-02 13:42:56 -04:00
James
b3832e21c9 feat: exposes findMany argument to afterRead hooks to discern between find and findByID 2022-05-02 13:38:13 -04:00
James Mikrut
18489faceb feat: optimizes field operations
* wip: beforeChange field op pattern

* feat: optimizes field-level beforeChange

* feat: optimizes beforeValidate

* feat: optimizes afterChange

* feat: optimizes afterRead

* chore: comment accuracy
2022-05-02 12:46:52 -04:00
Dan Ribbens
69d328d15e docs: updated link 2022-04-29 23:29:46 -04:00
Dan Ribbens
738e8ab9b6 docs: preventing abuse of file uploads 2022-04-29 23:25:55 -04:00
Elliot DeNolf
e7349fea9a chore: add explicit release scripts 2022-04-29 20:21:01 -04:00
James
51a6790f26 chore(release): v0.16.1 2022-04-29 18:34:40 -04:00
James
515f20372e chore: passing tests 2022-04-29 18:30:40 -04:00
James
12fbe8368f Merge branch 'fix/localization-defaultvalues' of github.com:payloadcms/payload 2022-04-29 16:49:17 -04:00
Dan Ribbens
55b4dfb309 chore: test defaultValue with localization 2022-04-29 16:48:50 -04:00
James
fb7bb76674 Merge branch 'master' of github.com:payloadcms/payload 2022-04-29 16:48:24 -04:00
James
e46b942259 feat: exposes payload within server-side validation args 2022-04-29 16:48:15 -04:00
Dan Ribbens
e4affd4bf9 docs: updated links 2022-04-29 14:40:49 -04:00
Dan Ribbens
16398d3438 chore(release): v0.16.0 2022-04-29 13:19:34 -04:00
Dan Ribbens
e8503232ba chore: changes eslint rules no-console and cleanup 2022-04-29 12:36:21 -04:00
Dan Ribbens
bf48fdf189 fix: file upload safely handles missing mimeTypes (#540)
* fix: file upload safely handles missing mimeTypes

* feat: uploaded files that do not have mimeTypes are given one based on file extension
2022-04-29 10:36:58 -04:00
Dan Ribbens
834f4c2700 feat: allow subfield readOnly to override parent readOnly (#546) 2022-04-29 10:36:38 -04:00
Dan Ribbens
e297eb9090 feat: allows defaultValue to accept async function to calculate defaultValue (#547)
* feat: field default values with async functions

* docs: improves field default value

* chore: simplifies async defaultValue

* chore: api test coverage for default value functions

* chore: WIP defaultValue async arrays

* chore: refactors and simplifies buildStateFromSchema

* chore: improves tests for defaultValues

Co-authored-by: James <james@trbl.design>
2022-04-29 10:36:10 -04:00
James
1f394bef72 chore(release): v0.15.13 2022-04-26 10:21:55 -04:00
James
1cdd5b96b3 chore: ensures array fields update modified state 2022-04-26 10:19:39 -04:00
James
2d14ab1217 chore(release): v0.15.12 2022-04-25 21:02:31 -04:00
James
8bdbd0dd41 fix: ensures adding array / block rows modifies form state 2022-04-25 20:59:33 -04:00
James
800be4c9a0 chore(release): v0.15.11 2022-04-24 19:37:39 -04:00
James
b99ec060ca fix: improperly typed access control 2022-04-24 19:35:58 -04:00
James
d5f4c030b4 chore(release): v0.15.10 2022-04-24 19:19:41 -04:00
James
4de92e3924 Merge branch 'master' of github.com:payloadcms/payload 2022-04-24 19:16:48 -04:00
James
3b70560e25 fix: block form-data bug 2022-04-24 19:16:39 -04:00
Dan Ribbens
d88c89fb05 chore: update discord invite link 2022-04-24 10:24:37 -04:00
Dan Ribbens
24d6d8e5f9 chore: add public discord link (#541) 2022-04-22 14:35:39 -04:00
Elliot DeNolf
9a9b28113a test: implement cypress test suite (#527) 2022-04-20 23:12:02 -04:00
James
ec84ffbee2 chore(release): v0.15.9 2022-04-20 17:25:20 -04:00
James
3c1dfb88df fix: intermittent blocks UI issue 2022-04-20 17:20:05 -04:00
James
4a6b79b231 chore(release): v0.15.8 2022-04-20 13:53:52 -04:00
James
9e2ed56ef0 chore: migrates to React 18 2022-04-20 11:29:09 -04:00
Alessio Gravili
9e324be057 fix: ensure relationTo is valid in upload fields (#533)
* Error handling

* Improve error message

* Re-position error handling

* Move error checking to sanitize
2022-04-20 09:21:14 -04:00
James Mikrut
b7f47c9bb1 chore/ts dep compat (#535)
* chore: ensures typescript dependency compatibility

* chore: updates dependencies

* chore: updates window-info breakpoints
2022-04-20 09:16:36 -04:00
Dan Ribbens
8a997c82be chore: github action runs demo generate types (#530) 2022-04-17 10:59:32 -04:00
Dan Ribbens
3dcd8a24cb fix: richtext editor input height (#529) 2022-04-17 10:56:33 -04:00
Dan Ribbens
203ce2c2f9 chore: update changelog 2022-04-12 11:50:27 -04:00
Dan Ribbens
42e42175db chore(release): v0.15.7 2022-04-12 11:41:04 -04:00
Dan Ribbens
6f84c0a869 Fix/checkbox validation error position (#521)
* fix: checkbox validation error positioning

* feat: sanitize defaultValue to false when field is required
2022-04-12 11:28:41 -04:00
Dan Ribbens
a4f2c5abd4 chore: update react 18 (#520)
* chore: update to react 18 and related dependencies
2022-04-12 11:26:55 -04:00
Dan Ribbens
6b06fe4481 chore: update react-toastify to 8.x (#522) 2022-04-12 11:26:20 -04:00
Outdated
1fc856faf5 Document Fix for admin/customizing-css (#513)
Addition of node package 'sass-loader' & 'node-sass' as dev dependencies for loading scss for customizing css variables for admin panel.
2022-04-11 17:03:48 -04:00
Dan Ribbens
6e45fd67ce docs: anchor link field component 2022-04-11 10:54:13 -04:00
Dan Ribbens
39415d4eed docs: update anchor links (#518) 2022-04-11 09:31:46 -04:00
John Beene
801b20ae75 Update fields.mdx (#509)
Fix destructuring of args inside exampleFieldHook function
2022-04-07 05:37:04 -04:00
Dan Ribbens
f564402565 chore(release): v0.15.6 2022-04-06 10:25:38 -04:00
Dan Ribbens
0156812af3 chore: generates new demo types 2022-04-06 10:23:48 -04:00
Elliot DeNolf
cf54b336d1 fix: new up separate logger for generateTypes script 2022-04-06 10:08:51 -04:00
Dan Ribbens
096303a93d chore(release): v0.15.5 2022-04-06 07:48:05 -04:00
Dan Ribbens
e1c6d9dd7d fix: relationship component showing no results (#508) 2022-04-06 07:44:30 -04:00
James
ed80d398ea chore: changelog 2022-04-05 16:30:46 -04:00
James
b4ce6ff4b0 chore(release): v0.15.4 2022-04-05 16:30:02 -04:00
James
ec91757257 feat: allows like to search by many words, adds contain to match exact strings 2022-04-05 16:22:57 -04:00
James
b99f6b16af fix: maintains field validation internally for speed 2022-04-05 15:29:03 -04:00
James
9dfb84656d chore: re-implements validation as user types 2022-04-05 15:21:47 -04:00
James
629e63e123 docs: relationship clarity 2022-04-05 15:15:43 -04:00
James
b4131800c9 Merge branch 'master' of github.com:payloadcms/payload 2022-04-05 14:59:09 -04:00
James
aee95eb041 merge: relationship options filter 2022-04-05 14:59:01 -04:00
GeorgeyB
0461c2109b feat: support className config for row, block and array fields (#504) 2022-04-05 14:55:50 -04:00
James
9e9aa6485c docs: payload.init accuracy 2022-04-05 14:55:29 -04:00
James
0651936856 Merge branch 'feat/logger-options' of github.com:payloadcms/payload 2022-04-05 14:51:57 -04:00
James Mikrut
1b4b5707bf feat: extended validation function arguments (#494)
* feat: WIP extended validation function arguments

* chore: optimizes validation extended args

* chore: more consistently passes validation args

* chore: removes field from form state

* chore: passing tests

* fix: default point validation allows not required and some edge cases

* chore: ensures default validate functions receive field config

* chore: demo validation with sibling data

* chore: optimize getDatabByPath and getSiblingData

* chore: adds tests to validate extra arg options

* docs: add validation arguments

* chore: export default field validation

* chore: top level getSiblingData

* fix: #495, avoids appending version to id queries

* chore: revises when field validation is run

* chore: restore original admin field validation

Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-04-05 14:51:28 -04:00
Dan Ribbens
89d56a0886 chore: test coverage for relationship filteroptions 2022-04-05 12:21:45 -04:00
Dan Ribbens
1482fded9a feat: upload field implements filterOptions 2022-04-05 12:03:57 -04:00
Elliot DeNolf
6620a4f682 feat(logging): allow pino logger options to be passed into init 2022-04-04 22:55:54 -04:00
James
df934dfeff feat: working PoC for reusing relationship filters in validate 2022-04-04 21:20:21 -04:00
Dan Ribbens
485991bd48 feat: filter relationship options in admin ui using filterOptions 2022-04-04 19:44:49 -04:00
James
1d4d30ce8f chore: revises when field validation is run 2022-04-04 17:07:24 -04:00
James
6c00c2a113 Merge branch 'feat/validate-extended-args' of github.com:payloadcms/payload into feat/validate-extended-args 2022-04-04 15:30:01 -04:00
James
57b5f17bf4 Merge branch 'master' into feat/validate-extended-args 2022-04-04 15:29:31 -04:00
James
bb3080aef7 chore(release): v0.15.3 2022-04-04 15:11:50 -04:00
James
f4a2dff892 fix: #499, graphql row / ui field bug 2022-04-04 15:09:56 -04:00
James
fa7f234b48 chore(release): v0.15.2 2022-04-04 13:59:36 -04:00
James
6f05fe80ae Merge branch 'master' of github.com:payloadcms/payload 2022-04-04 13:57:10 -04:00
James
a703e0582d fix: #495, avoids appending version to id queries 2022-04-04 13:56:09 -04:00
James
ab432a43dc fix: #495, avoids appending version to id queries 2022-04-04 13:54:02 -04:00
Elliot DeNolf
839e3f9dae test: fix all ts errors, eslint overrides 2022-04-03 23:40:29 -04:00
Elliot DeNolf
9c6af860d4 test: migrate test files to ts 2022-04-03 23:40:29 -04:00
Dan Ribbens
845b0b3709 chore: top level getSiblingData 2022-04-01 11:34:13 -04:00
Dan Ribbens
85596bbba6 chore: export default field validation 2022-04-01 10:58:08 -04:00
Dan Ribbens
9ea2777555 docs: add validation arguments 2022-03-31 01:00:52 -04:00
Dan Ribbens
c7eb929176 chore: adds tests to validate extra arg options 2022-03-30 18:06:05 -04:00
Dan Ribbens
42baf2e27e chore: optimize getDatabByPath and getSiblingData 2022-03-30 17:04:26 -04:00
Dan Ribbens
dade960615 chore: demo validation with sibling data 2022-03-30 15:32:58 -04:00
Dan Ribbens
80de7a720f Merge branch 'feat/validate-extended-args' of github.com:payloadcms/payload into feat/validate-extended-args 2022-03-30 15:00:29 -04:00
James
175642c07b chore: ensures default validate functions receive field config 2022-03-30 15:00:19 -04:00
Dan Ribbens
29405bbc0e fix: default point validation allows not required and some edge cases 2022-03-30 12:12:59 -04:00
James
60f295ba9f chore: passing tests 2022-03-29 18:37:02 -04:00
James
2b1a33efba chore: removes field from form state 2022-03-29 17:57:10 -04:00
James
f5191dc7c8 chore: more consistently passes validation args 2022-03-29 15:38:22 -04:00
James
e597b4c66b chore: optimizes validation extended args 2022-03-29 14:11:22 -04:00
James
50cf34ac2e Merge branch 'feat/validate-extended-args' of github.com:payloadcms/payload into feat/validate-extended-args 2022-03-29 10:41:10 -04:00
James
b3a7c16f8e chore(release): v0.15.1 2022-03-28 15:01:40 -04:00
Dan Ribbens
647cac3612 feat: WIP extended validation function arguments 2022-03-28 12:58:39 -04:00
Dan Ribbens
5a7e8a980b feat: builds a way to inject custom React providers into admin UI
* fix: rich text textarea height

* feat: custom providers for admin panel

* docs: custom provider component
2022-03-28 11:23:22 -04:00
Lukas Chladek
45f70114e6 feat: export Plugin type from config types (#491)
This type is useful for plugin authors to correctly type their plugin.
2022-03-28 11:22:33 -04:00
Dan Ribbens
f442552858 chore: add security readme (#489) 2022-03-24 21:14:17 -04:00
Dan Ribbens
483e8934c9 Merge branch 'master' of github.com:payloadcms/payload 2022-03-17 11:38:28 -04:00
Dan Ribbens
dc9898e355 docs: remove versions payload beta version 2022-03-17 11:38:11 -04:00
James
2b71144015 chore: changelog 2022-03-16 15:30:16 -04:00
James
9b17b5c08c chore(release): v0.15.0 2022-03-16 15:03:22 -04:00
Dan Ribbens
647db5122e feat: add pagination argument to optimize graphql relationships and use in local api (#482) 2022-03-16 14:58:41 -04:00
Dan Ribbens
ad98b29398 feat: adds path to GraphQL errors (#457)
* feat: adds path to GraphQL errors

* feat: afterError hook complete and error handling types

* Revert "feat: afterError hook complete and error handling types"

This reverts commit 5517d16c58f516fd4663b1bff791dd7c78b1e721.

* fix: moves extra graphql error response to extensions
2022-03-16 13:11:30 -04:00
Dan Ribbens
ba1a8284ac docs: init options for email, local, and onInit (#474) 2022-03-16 13:10:45 -04:00
Dan Ribbens
26dbebb380 chore: improve test coverage for upload relationship (#475) 2022-03-16 13:10:22 -04:00
Dan Ribbens
f14e187545 feat: allow empty string radio and select option values (#479) 2022-03-16 13:09:37 -04:00
Jarrod Flesch
8fc4f7f806 fix: adjusts lte and gte types to match docs and codebase (#480) 2022-03-16 13:08:45 -04:00
Dan Ribbens
24aa475640 fix: further sanitize serverURL to prevent undefined in admin routes (#481) 2022-03-16 13:08:11 -04:00
James
0bfc589d47 chore: beta release 2022-03-10 10:02:34 -05:00
James
97f3178005 fix: ensures overrideAccess is false if undefined while populating 2022-03-10 09:49:01 -05:00
James
73f418bb5c feat: exposes data arg within create and update access control 2022-03-08 14:42:47 -05:00
James
7e5eeef122 chore: revises logic used to determine if hasWhereAccessResult 2022-03-08 14:42:28 -05:00
James
aee86c6136 chore: beta release 2022-03-07 10:56:21 -05:00
James
c9795133b3 feat: adds originalDoc to field access control 2022-03-07 10:53:57 -05:00
James
561c43c564 chore: beta release 2022-03-07 10:28:08 -05:00
James
f5535f613a fix: rare crash with link rte element 2022-03-07 10:23:50 -05:00
James
2e9a4c7d71 feat: improves rich text link 2022-03-03 16:29:38 -05:00
James
966c3c6471 feat: improves adding rich text voids to RTE 2022-03-03 15:17:02 -05:00
James
c75054f562 chore: beta release 2022-03-01 19:46:00 -05:00
James
fd0629e932 fix: #464, graphql upload access control 2022-03-01 19:44:03 -05:00
James
bddb65a7a1 chore: beta release 2022-03-01 19:43:33 -05:00
James
8e23a24f34 feat: #458, provides field hooks with sibling data 2022-03-01 18:57:17 -05:00
James
82f0beffce chore: beta release 2022-02-24 10:02:57 -05:00
James
f225ad349d Merge branch 'fix/csrf-no-server-url' of github.com:payloadcms/payload into fix/461-searching-relationship-fields 2022-02-23 16:31:16 -05:00
Dan Ribbens
7e69fcbc7d fix: optimizes relationship input search querying 2022-02-23 14:43:33 -05:00
Dan Ribbens
cbf43fa0d8 fix: prevents None from appearing in hasMany relationship select options 2022-02-23 14:42:01 -05:00
James
bac2a0a0bf chore: cleanup 2022-02-23 09:41:56 -05:00
James
08924a1934 fix: #461 2022-02-23 09:40:54 -05:00
James
cfca6d67f1 chore: type cleanup 2022-02-23 08:16:13 -05:00
Oran Epelbaum
a9b83c8798 fix: #459 - in Relationship field to multiple collections, when the value is null, options are not populated (#460) 2022-02-23 08:05:17 -05:00
James
96a9b75558 chore: cleans up comments 2022-02-20 12:42:05 -05:00
James
d03bda9e87 chore: beta release 2022-02-20 12:27:55 -05:00
James
08b3e8f18f fix: ensures empty hasMany relationships save as empty arrays 2022-02-20 12:22:42 -05:00
Dan Ribbens
40487347e3 fix: allow jwt to work without csrf in config 2022-02-16 12:35:17 -05:00
James
56c16d5c16 fix: #454, withCondition type usability 2022-02-15 12:52:11 -05:00
James
0e5cff1923 chore: beta release 2022-02-14 16:04:22 -05:00
Dan Ribbens
99b9afc81c chore: version documentation for local and graphql apis 2022-02-14 15:50:04 -05:00
Dan Ribbens
4072e7ee06 feat: add local api for versions on globals 2022-02-14 15:50:04 -05:00
Dan Ribbens
85221e6109 chore: add type for collection graphQL 2022-02-14 12:35:07 -05:00
Dan Ribbens
7e7b0589ef fix: config empty and sparse csrf is now allowed 2022-02-14 12:34:09 -05:00
James
c1e4515562 chore: releases beta 2022-02-13 19:11:49 -05:00
James
c9fda13e61 chore: passing global graphql tests 2022-02-13 19:05:21 -05:00
James
2db80d2af8 Merge branch 'feat/graphql-versions' of github.com:payloadcms/payload 2022-02-13 18:20:11 -05:00
Dan Ribbens
76077c539d WIP: globals graphql versions 2022-02-13 17:34:22 -05:00
Dan Ribbens
a5c8ea4e2e fix: version where input type 2022-02-11 15:50:42 -05:00
James
fa8a6b769b chore: simplifies buildVersionWhereInput 2022-02-11 15:00:16 -05:00
James
8422d0dfda Merge branch 'feat/graphql-versions' of github.com:payloadcms/payload into feat/graphql-versions 2022-02-11 14:50:48 -05:00
Dan Ribbens
fc24485455 fix: improves version config sanitization 2022-02-11 14:22:10 -05:00
Dan Ribbens
407bc35a31 chore: rename buildInputObject to withWhereAndOr 2022-02-11 13:45:27 -05:00
Dan Ribbens
26b13a81c3 feat: improve code coverage for graphql versions 2022-02-11 13:39:17 -05:00
James
d65e856ada docs: improves versions heading hierarchy 2022-02-11 12:09:21 -05:00
James
c0150ae846 feat: allows global access control to return query constraints 2022-02-11 11:35:55 -05:00
James
cc4dc59aa9 docs: completes version docs 2022-02-11 11:25:18 -05:00
Dan Ribbens
dca90c4aa9 feat: serverURL is no longer required (#437) 2022-02-11 08:32:37 -05:00
Jacob Fletcher
500fb1c5c4 feat: allows select input to receive new options (#435) 2022-02-10 18:43:20 -05:00
James
6fab8bfbef fix: #431 - relationship field not properly fetching option results 2022-02-10 18:23:40 -05:00
Dan Ribbens
b159e148db chore: rename publishVersion to restoreVersion (#438) 2022-02-10 16:35:03 -05:00
Dan Ribbens
7cfb2f7f02 feat: GraphQL version collection resolvers 2022-02-10 15:23:39 -05:00
Dan Ribbens
ee58471aed WIP: graphql revisions operations 2022-02-10 15:09:08 -05:00
James
48aa27ce70 fix: improperly typed local create method 2022-02-10 14:52:58 -05:00
James
13318ff360 feat: improves relationship field performance 2022-02-10 14:52:35 -05:00
James
964cbe1899 chore: adds comparison to most recently published doc 2022-02-10 12:11:59 -05:00
James
d15c48429b chore: improves version count accuracy 2022-02-10 11:17:19 -05:00
James
6e57040aaf chore: ensures version comparison does not allow to compare same version to itself 2022-02-09 18:04:21 -05:00
James
756981172f fix: ensures VersionCount is accurate 2022-02-09 18:00:54 -05:00
James
6898d6151b chore: fixes DocumentInfo types 2022-02-09 16:38:28 -05:00
James
a9b2f7f3f3 chore: improves copy on Versions view 2022-02-09 16:28:10 -05:00
James
e81ba84ca7 feat: improves versions UI count and list view 2022-02-09 16:23:39 -05:00
James
e2814b5404 chore: swaps placement of version comparisons 2022-02-09 13:56:08 -05:00
James
eaa4858580 docs: progress to versions 2022-02-09 13:26:44 -05:00
James
652bd4ab23 chore: cleans up duplicative versions 2022-02-09 13:26:20 -05:00
James
e2662336b1 chore: removes console log 2022-02-08 19:18:05 -05:00
James
d7b669d404 chore: simplifies array / block field components 2022-02-08 19:04:37 -05:00
James
760dee370f chore: improves opt-in viability for versions 2022-02-08 18:23:14 -05:00
James
f710b8c4f3 fix: adds key to RichText based on initialValue 2022-02-08 17:50:27 -05:00
James
4e773c7152 feat: optimization of unpublish, revert to saved 2022-02-08 17:44:39 -05:00
James
160ab54b85 feat: builds revert to saved, unpublish 2022-02-08 13:13:43 -05:00
James
7841f2a86b fix: ensures fetching published doc only retrieves published docs 2022-02-08 11:54:25 -05:00
James
ee9cd24e10 feat: uses debounce in autosave 2022-02-08 11:46:39 -05:00
James
eb4f9572b8 feat: implements versions in global ui 2022-02-08 11:15:26 -05:00
James
a59b14bd8c feat: implements versions in globals, adds tests 2022-02-07 17:46:51 -05:00
James
86890a2de4 tests: fixes outdated test 2022-02-07 16:44:56 -05:00
James
03c8445a6d fix: removes required from versions status field 2022-02-07 16:16:49 -05:00
James
c5854afb37 docs: stubs version docs 2022-02-07 16:16:38 -05:00
James
0ecd9ff0cb chore: optimizes demo and version operations 2022-02-07 16:11:19 -05:00
James
7397d63073 feat: builds global publishVersion 2022-02-06 20:34:52 -05:00
James
4656381205 Merge branch 'master' of github.com:payloadcms/payload 2022-02-06 15:02:19 -05:00
James
c286e757b3 docs: adds legacy-peer-deps to docs 2022-02-06 15:01:54 -05:00
James
3ca3f533d0 feat: updates dependencies 2022-02-06 14:57:56 -05:00
James
c38470c7b2 feat: allows access control to prevent reading of drafts 2022-02-06 14:46:34 -05:00
James
6dffeeb06f feat: initial drafts and versions merge 2022-02-06 12:13:52 -05:00
Elliot DeNolf
c8ecc168e2 chore: beta release 2022-02-05 13:44:38 -05:00
Elliot DeNolf
ff33453736 feat: add logMockCredentials email option 2022-02-05 13:28:48 -05:00
James
a657c584fc chore: beta release 2022-02-03 12:33:21 -05:00
James
414679d86a fix: #422, prevents loading duplicative relationship options 2022-02-03 12:30:28 -05:00
James
ac4e5985d9 docs: elaborate on safe payload.config re-use, references #416 2022-02-03 12:19:42 -05:00
James
99fea79710 chore: beta release 2022-02-03 12:09:46 -05:00
James
417e83cf71 chore: cleans up _payload from req.body 2022-02-03 12:07:18 -05:00
James
1a05fe448c fix: #424, unable to clear localized property vals 2022-02-03 12:07:05 -05:00
James
28846547af fix: #423, #391 - prevents loading edit views until data initializes 2022-02-03 11:49:15 -05:00
James
7fd4b22180 chore: ensures locale is initiated properly if present in query param 2022-02-03 11:47:21 -05:00
James
5681a2793d chore: cleanup textarea 2022-02-03 11:47:08 -05:00
James
3f538cb818 chore: beta release 2022-02-01 09:47:40 -05:00
James
9dc11b2b83 chore: rich text upload cleanup 2022-02-01 09:45:43 -05:00
James
bef02062e7 feat: exposes useLocale for reuse 2022-02-01 09:33:23 -05:00
James
9a393fa974 chore: beta release 2022-01-31 21:41:02 -05:00
James
72d1099085 chore: beta release 2022-01-31 21:33:49 -05:00
Dan Ribbens
5591eeafca feat: add before and after login components (#427) 2022-01-31 21:26:12 -05:00
James
0a6349e323 chore: beta release 2022-01-31 10:29:34 -05:00
James
dbb3c50222 feat: adds a way to customize express.static options 2022-01-31 10:27:26 -05:00
James
c97cbeb6fd chore: beta release 2022-01-24 22:50:28 -05:00
James
43fb317812 chore: removes unused form stringify functionality 2022-01-24 22:45:26 -05:00
James
89fca20a44 chore: beta release 2022-01-24 18:09:29 -05:00
Jarrod Flesch
8327b5aae5 fix: rte upload field population 2022-01-24 18:07:04 -05:00
James
8451233f95 chore: beta release 2022-01-24 12:13:27 -05:00
James
39438b8460 fix: ensures rte upload is populated when only upload is enabled 2022-01-24 12:11:05 -05:00
James
d887b6bdc5 chore: beta release 2022-01-24 10:50:27 -05:00
James
671077669e chore: removes stubbed test 2022-01-21 16:58:07 -05:00
James
a0efa25616 feat: improvements to rte upload 2022-01-21 16:56:24 -05:00
James
bf142ff746 chore: beta release 2022-01-21 16:46:56 -05:00
Jarrod Flesch
c8b00206d9 style: adjusts style of nested RTE inside edit fields 2022-01-21 15:38:06 -05:00
Jarrod Flesch
0e4eb906f2 feat: enhances rich text upload with custom field API
* feat: adds admin.upload.collections[collection-name].fields to the RTE to save specific data on upload elements

* chore: renames flatten to unflatten in reduceFieldsToValues, disables automatic arrow function return in eslint

* docs: adds documentation for upload.collections[collection-name].fields feature

* feat: adds recursion to richText field to populate relationship and upload nested fields

* chore: removes unused css

* fix: import path for createRichTextRelationshipPromise

* docs: updates docs to include images for the RTE upload docs
2022-01-21 10:15:51 -05:00
Jarrod Flesch
d54d511133 docs: updates docs to include images for the RTE upload docs 2022-01-19 17:37:29 -05:00
Jarrod Flesch
586cd4d6af fix: import path for createRichTextRelationshipPromise 2022-01-19 16:55:51 -05:00
Jarrod Flesch
1e6295a788 chore: removes unused css 2022-01-19 16:44:42 -05:00
Jarrod Flesch
42af22c2a1 feat: adds recursion to richText field to populate relationship and upload nested fields 2022-01-19 15:29:00 -05:00
Jarrod Flesch
e76f7c88a5 docs: adds documentation for upload.collections[collection-name].fields feature 2022-01-19 11:42:18 -05:00
Jarrod Flesch
f8af99b058 chore: renames flatten to unflatten in reduceFieldsToValues, disables automatic arrow function return in eslint 2022-01-19 11:22:27 -05:00
Jarrod Flesch
3adf44a241 feat: adds admin.upload.collections[collection-name].fields to the RTE to save specific data on upload elements 2022-01-19 11:21:08 -05:00
James
d07bb932ca chore: beta release 2022-01-14 12:15:54 -05:00
James
609b871fa2 fix: awaits beforeDelete hooks 2022-01-14 12:13:43 -05:00
James
7c7b546812 chore: beta release 2022-01-12 14:45:22 -05:00
James
20e5dfbb4a fix: ensures nested lists always render properly 2022-01-12 14:39:32 -05:00
James
d7c9d9f55b chore: beta release 2022-01-12 14:21:32 -05:00
James
5e42a835a1 chore: merge rich text indent 2022-01-12 14:17:23 -05:00
James Mikrut
7df50f9bf9 feat: adds indentation controls to rich text
* feat: rich text indent PoC

* fix: new slate version types

* feat: ensures only lowest rich text list is shown as active

* feat: adds icons for indentation

* docs: adds indent to rich text
2022-01-12 14:16:05 -05:00
James
c5de01bfc4 fix: new slate version types 2022-01-10 22:19:19 -05:00
James
2deed8b146 feat: rich text indent PoC 2022-01-10 22:15:14 -05:00
James
baa6258bba chore: beta release 2022-01-07 14:34:41 -05:00
James
ef4e6d32a9 fix: type error in useField 2022-01-07 14:22:59 -05:00
James
df3a83634f feat: exposes FieldWithPath type for reuse 2022-01-07 14:21:36 -05:00
James Mikrut
c67a68f9d8 Merge pull request #415 from oranoran/admin-classname
Added "className" property to admin + documented existing "style" property
2022-01-07 14:20:05 -05:00
Jarrod Flesch
8591d97fa5 Adjusts Point field docs and test variables (#382)
* fix: corrects the label order and removes confusion for the values saved on a Point field type

* fix: adjusts code to mirror the doc change, replaces [x, y] with [lng, lat] and add type names to Geolocation

* chore: add nested point field test cases

* fix: index true creates a 2dsphere spatial index on point fields

Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-01-05 17:46:01 -05:00
Dan Ribbens
d4f3bbd91c chore: beta release 2022-01-05 17:34:13 -05:00
James
dd5ed218a5 Merge branch 'master' of github.com:payloadcms/payload 2022-01-05 17:27:43 -05:00
James
d720509849 chore: beta release 2022-01-05 17:27:37 -05:00
Oran Epelbaum
5549926d2c Fixed saving of a cleared number value (#412)
* Fixed saving of a cleared number value

* fix: clearing saved number for a localized field

Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
2022-01-05 17:24:14 -05:00
Oran Epelbaum
50dd65ef92 Added className property to admin, in addition to the existing style property. Also documented both properties. 2022-01-05 21:24:11 +02:00
James
ae44727fb9 fix: ensures multipart/form-data using _payload flattens field data before sending 2022-01-04 09:30:07 -05:00
James
07c3f757e6 chore: beta release 2022-01-03 17:22:37 -05:00
James
65b0ad7f08 feat: builds a way for multipart/form-data reqs to retain non-string values 2022-01-03 16:54:56 -05:00
James
433a52232b chore(release): v0.14.0 2022-01-03 10:14:33 -05:00
James
0ba508a87e fix: ensures versions have proper data 2021-12-31 17:42:42 -05:00
James
e835cbe0b1 fix: autosave 2021-12-31 17:35:31 -05:00
James
ed8abd94e6 feat: merges back in logic for non draft versions and draft versions 2021-12-31 17:35:27 -05:00
James
6bf7d82047 fix: bug with version count 2021-12-31 16:53:51 -05:00
James
01d07bcb9a feat: disables LeaveWithoutSaving if autosave enabled 2021-12-31 16:50:00 -05:00
James
1fb1eaab50 fix: bug in how find merges drafts 2021-12-31 16:47:57 -05:00
James
a7ecadaa52 fix: uses replace instead of push to autocreate a doc 2021-12-31 16:40:03 -05:00
James
c7c34188e1 fix: avoids console 404 on unpublished docs 2021-12-31 16:38:49 -05:00
James
5afabee1f2 separates version vs draft version functionality 2021-12-31 16:25:47 -05:00
James
c62707cd51 feat: working autosave 2021-12-31 14:32:18 -05:00
James
1e093e1eee feat: adds most recently published comparison doc 2021-12-31 14:29:41 -05:00
James
e4ee0f89eb chore: moves DocumentInfo up one level 2021-12-31 14:12:21 -05:00
James
b00517ec20 feat: working drafts 2021-12-31 14:02:16 -05:00
James
a2024b4f64 chore: removes old code 2021-12-31 13:58:08 -05:00
James
0463982b5b feat: styles multiple collection actions 2021-12-31 13:23:04 -05:00
James
4efc2cf71c feat: builds a way for multipart/form-data reqs to retain non-string values 2021-12-31 12:55:01 -05:00
James
cd0e172708 feat: reorders version creation 2021-12-31 12:45:02 -05:00
James
71c49bc5f2 feat: progress to saving drafts manually 2021-12-30 22:01:42 -05:00
James
f1840a5f6c chore: adds draft tests 2021-12-30 21:13:18 -05:00
James
b80d263e7f chore: passing tests 2021-12-30 21:07:03 -05:00
James
8f30c3bfef feat: uses DocumentInfo to fetch and maintain doc versions 2021-12-30 20:24:46 -05:00
James
7220ff7a8a feat: tests & autosave improvements 2021-12-30 16:37:49 -05:00
James
e910d8938f feat: functional autosave 2021-12-30 13:58:06 -05:00
James
be1da8507a feat: progress to drafts 2021-12-30 11:21:53 -05:00
James
13add5885d feat: progress to Autosave 2021-12-29 21:32:16 -05:00
James
aaab8b036c chore: merge 2021-12-29 16:50:30 -05:00
James
fd4319de06 chore: beta release 2021-12-29 16:49:22 -05:00
James
e5d9335596 chore: safely accesses req files 2021-12-29 16:47:37 -05:00
James
d70d33fb27 chore: merge master 2021-12-29 16:45:52 -05:00
James
932116e953 chore: beta release 2021-12-29 16:10:15 -05:00
James
5c3cfa4c93 fix: #408 2021-12-29 16:08:08 -05:00
James
2e6af97506 chore: beta release 2021-12-29 15:51:47 -05:00
James
e2c5d93751 fix: #408 2021-12-29 15:49:47 -05:00
James
2a8f564500 chore: beta release 2021-12-29 15:33:20 -05:00
James
a09570c78d fix: 407 2021-12-29 15:29:12 -05:00
James
546e6e56f1 chore: beta release 2021-12-29 15:29:05 -05:00
James
961787d681 fix: ensures searching relationships works with many pages of results 2021-12-29 15:09:08 -05:00
James
ec6453bb5f chore: beta release 2021-12-29 15:08:53 -05:00
James
9e091af67e fix: ensures row count is set properly in block fields 2021-12-29 11:03:20 -05:00
James
4119eec796 fix: cross-browser upload drag and drop 2021-12-29 10:56:36 -05:00
James
14e5d0977f feat: adds autosave to versions table 2021-12-28 21:41:43 -05:00
James
de48f4417a feat: builds autosave into existing update operation 2021-12-28 21:31:03 -05:00
James
b5fd917dda chore: de-duplicates upload logic 2021-12-28 20:47:58 -05:00
James
4fbddeeb46 feat: removes mongoose required 2021-12-28 19:56:34 -05:00
James
3a71afbd37 feat: renames revisions to versions 2021-12-28 19:41:36 -05:00
James
fdc6aeb47a Merge branch 'master' into feat/revisions 2021-12-28 12:40:09 -05:00
James
c54da719a1 chore: beta release 2021-12-28 12:40:05 -05:00
James
ba79fd42db fix: allows null in ImageSize width and height types 2021-12-28 11:56:10 -05:00
James
ffe8e17ac0 feat: exposes default Dashboard and Nav components for re-import 2021-12-28 11:25:13 -05:00
Elliot DeNolf
da7c0c984c fix: globals model typing 2021-12-26 23:52:05 -05:00
James
b59bb0bbc2 feat: progress to draft types 2021-12-26 17:04:13 -05:00
James
066b593d8f feat: scaffolds drafts / autosave config 2021-12-26 16:48:01 -05:00
James
23f4555ff6 chore: rolls back to displaying json in rich text diff 2021-12-23 11:35:11 -05:00
James
05288ee08c fix: ensures local findByID retains user 2021-12-23 11:29:45 -05:00
James
7bd60b5a3d feat: attempts to render rich text diffs more appropriately 2021-12-23 11:28:06 -05:00
James
0e093bf15e feat: finishes revision restore 2021-12-23 09:31:13 -05:00
James
210488ba4e feat: progress to revision restore 2021-12-22 16:25:19 -05:00
James
189bc21e48 feat: wires up restore 2021-12-22 16:02:15 -05:00
James
30ec146298 chore: typescript version compatibilities and improvements 2021-12-22 15:32:05 -05:00
James
2e946a0aac feat: progress to restore revision 2021-12-22 14:38:38 -05:00
James
8764a11b1d Merge branch 'feat/revisions' of github.com:payloadcms/payload into feat/revisions 2021-12-22 14:37:11 -05:00
Dan Ribbens
5eea398e43 feat: adds restore revisions to collections 2021-12-22 14:24:24 -05:00
James
35f35e6f42 Merge branch 'master' into feat/revisions 2021-12-22 14:21:43 -05:00
James
5eb03b675e chore: beta 2021-12-22 14:21:02 -05:00
James
140a3aa9ea fix: ensures getDataByPath works 2021-12-22 14:18:50 -05:00
James
a47977084f feat: builds remainder of diff field types 2021-12-22 13:26:24 -05:00
James
bddaefdae7 feat: builds group and iterable diffs 2021-12-21 20:18:53 -05:00
James
242584fd49 Merge branch 'master' into feat/revisions 2021-12-21 18:04:11 -05:00
James
35bf092813 chore: beta release 2021-12-21 17:59:39 -05:00
James
17b7ee29ac chore: updates pattern for before / after component injection 2021-12-21 14:45:57 -05:00
James
e337c62ba1 feat: builds custom routes API, Before/After Dashboard and Nav custom components 2021-12-21 12:27:22 -05:00
James
52edb5b77f feat: exports custom text and select inputs 2021-12-20 10:40:17 -05:00
James
01ae76ec29 chore: merge 2021-12-20 10:37:18 -05:00
James
9765fdb0ae chore: beta release 2021-12-14 16:15:14 -05:00
James Mikrut
3e40944e19 Merge pull request #394 from payloadcms/fix/393
fix: #393, ensures preview button gets up to date data
2021-12-14 10:27:58 -05:00
James
97388738de fix: #370, only performs password functions when auth enabled 2021-12-14 10:27:37 -05:00
James
a16b99b0c8 fix: #390, safari rich text link bug 2021-12-14 10:23:28 -05:00
James
2f47e39a9f fix: #393, ensures preview button gets up to date data 2021-12-14 10:10:13 -05:00
James
245e12e8b6 feat: renders diffs 2021-12-13 16:10:25 -05:00
James
f57223024a feat: allows selection of revisions in certain locales to compare 2021-12-13 14:09:13 -05:00
James
740d6b15e5 feat: further revisions views 2021-12-07 14:49:32 -05:00
James
40f93e9d64 feat: scaffold of individual Revision view 2021-12-01 12:51:37 -05:00
James
da5684df27 feat: abstracts revisions components for reuse in globals 2021-12-01 12:21:56 -05:00
James
1920a937b2 feat: builds revisions list view 2021-12-01 10:36:23 -05:00
James
b31f43f838 chore: merge 2021-12-01 05:18:34 -05:00
James
37f5fc3895 chore(release): v0.13.6 2021-11-30 13:34:13 -05:00
James
1d25c7fca7 Merge branch 'feat/form-onchange' of github.com:payloadcms/payload 2021-11-30 13:32:18 -05:00
Jacob Fletcher
925a33e560 fix: requires path in select, text, textarea, and upload components 2021-11-30 13:19:09 -05:00
James
6a33abbec2 chore(release): v0.13.5 2021-11-30 11:00:35 -05:00
Jacob Fletcher
ecabf130fd fix: select component rendered value 2021-11-30 10:50:32 -05:00
James
be2fdd1488 chore(release): v0.13.4 2021-11-30 09:55:44 -05:00
James
e4d03490a3 Merge branch 'feat/form-onchange' of github.com:payloadcms/payload 2021-11-30 09:54:04 -05:00
Jacob Fletcher
80c81ecfc6 Merge branch 'master' of github.com:payloadcms/payload into feat/form-onchange 2021-11-30 09:48:42 -05:00
Jacob Fletcher
f0fd859347 fix: prevents uncontrolled text field component 2021-11-30 09:28:07 -05:00
James
74f7101524 Merge branch 'feat/form-onchange' of github.com:payloadcms/payload 2021-11-30 08:48:14 -05:00
Jacob Fletcher
7e2b259816 fix: select component types 2021-11-29 18:27:14 -05:00
Jacob Fletcher
0b13eda1e5 fix: threads props through textarea component 2021-11-29 18:05:51 -05:00
Jacob Fletcher
c77bf3aa42 fix: passes hasMany through select component 2021-11-29 17:08:46 -05:00
Jacob Fletcher
86480b7482 feat: abstracts textarea component and improves event typing 2021-11-29 17:08:39 -05:00
Jacob Fletcher
f234f68019 feat: abstracts upload component 2021-11-29 17:08:32 -05:00
Jacob Fletcher
fa671378c7 feat: abstracts select component 2021-11-29 17:08:24 -05:00
Jacob Fletcher
615e3695f2 feat: abstracts input from text component 2021-11-29 17:08:09 -05:00
James
2faade7a03 chore(release): v0.13.3 2021-11-29 12:19:44 -05:00
James
89682cf034 chore: new yarn lock 2021-11-29 12:12:09 -05:00
James Mikrut
82c69a17b9 Merge pull request #372 from payloadcms/fix/sharp-m1-prebuilt
fix: upgrade sharp for prebuilt M1 binaries
2021-11-29 11:22:28 -05:00
James
f0f4dc12e5 chore(release): v0.13.2 2021-11-29 08:34:53 -05:00
James
727fbeceb4 fix: #373 2021-11-29 08:33:20 -05:00
James
5127826de0 chore(release): v0.13.1 2021-11-29 08:20:33 -05:00
James
ded891e390 fix: ensures sorting by _id instead of improper id 2021-11-29 08:18:59 -05:00
Elliot DeNolf
34f416aace fix: upgrade sharp for prebuilt M1 binaries 2021-11-28 20:21:46 -05:00
James
a589877698 feat: adds stepnav to revisions template 2021-11-28 17:11:24 -05:00
James
2176ce0cf7 chore: ensures tests pass 2021-11-28 17:03:20 -05:00
James
72537106a3 feat: scaffolds admin revisions 2021-11-28 16:37:21 -05:00
James
974fdd0bfd chore: tests revisions REST API 2021-11-27 12:24:56 -05:00
James
f56bbe814e fix: ensures revision hooks await promises 2021-11-27 12:13:41 -05:00
James
4a445f03e8 feat: scaffolds new revisions operations and rest routes 2021-11-27 12:09:45 -05:00
James
ec82b923f3 feat: creates global revisions 2021-11-27 11:07:34 -05:00
James
3d5be91f6c Merge branch 'master' into feat/revisions 2021-11-27 10:20:15 -05:00
James
bc753951a0 Merge branch 'master' of github.com:payloadcms/payload 2021-11-27 10:20:05 -05:00
James
d6d76d4088 feat: only adds list search query param if value is present 2021-11-27 10:19:50 -05:00
James
2a7459baf2 chore: test fixes 2021-11-27 10:03:50 -05:00
James
b13615f2bf fix: ensures unique is not set within revisions collections 2021-11-27 10:03:44 -05:00
James
c3f743af03 feat: ensures field hooks run on all locales when locale=all 2021-11-27 10:03:24 -05:00
James
f246252a42 fix: ensures revisions retain all locales 2021-11-27 10:03:04 -05:00
James
8df767e9a2 feat: ensures revisions are created and deleted accordingly 2021-11-26 19:54:35 -05:00
James
8ef1cc5373 chore: merge master 2021-11-26 18:00:59 -05:00
James Mikrut
70b58e2826 Update CHANGELOG.md 2021-11-26 17:14:57 -05:00
James
43a25195b7 chore(release): v0.13.0 2021-11-26 17:12:07 -05:00
James
e01173dd51 Merge branch 'master' of github.com:payloadcms/payload 2021-11-26 17:10:20 -05:00
James
77a208fff7 docs: typescript 2021-11-26 17:10:01 -05:00
James Mikrut
cef06e3c79 Merge pull request #367 from payloadcms/feat/form-onchange
Feat/form onchange
2021-11-25 10:39:02 -05:00
James
a0fb48c9a3 fix: #358 - reuploading with existing filenames 2021-11-25 10:34:03 -05:00
James
6b150e01d3 feat: further types field based functions 2021-11-25 09:54:12 -05:00
Elliot DeNolf
820b6ad4c7 feat: more typing of generics, better commenting of properties 2021-11-25 09:41:44 -05:00
Elliot DeNolf
bb18e8250c fix: typing for collection description 2021-11-25 09:41:44 -05:00
Elliot DeNolf
b99eb8ba73 feat: smarter generics 2021-11-25 09:41:44 -05:00
Elliot DeNolf
f258c5904e feat: type payload operation calls with generics 2021-11-25 09:41:44 -05:00
James
a3171c73d0 Merge branch 'master' into feat/revisions 2021-11-24 18:37:45 -05:00
James
57cab22387 chore: optimizes buildQuery legibility 2021-11-24 18:37:24 -05:00
James
7050b5285e fix: ensures non-localized relationships with many relationTos can be queried 2021-11-24 18:01:33 -05:00
James
38ee73ba2e chore: beta release 2021-11-24 17:20:10 -05:00
James
6d31aa8d86 Merge branch 'master' of github.com:payloadcms/payload into feat/revisions 2021-11-24 17:15:58 -05:00
Jarrod Flesch
96421b3d59 fix: ensures uploads can be fetched with CORS 2021-11-24 17:15:25 -05:00
Jacob Fletcher
0245747020 feat: renames useFieldType to useField 2021-11-24 15:37:36 -05:00
Jacob Fletcher
4affdc3a93 feat: supports custom onChange handling in text, select, and upload fields 2021-11-24 15:28:41 -05:00
James
ccbe9f5137 Merge branch 'master' of github.com:payloadcms/payload 2021-11-24 15:21:55 -05:00
James
23f7efe7d1 chore: changelog 2021-11-24 15:21:52 -05:00
Jarrod Flesch
051b7d45be feat: applies upload access control to all auto-generated image sizes 2021-11-24 15:19:21 -05:00
Jacob Fletcher
3540a188a4 Merge branch 'master' of github.com:payloadcms/payload into feat/form-onchange 2021-11-24 14:25:08 -05:00
James
da6e1df293 fix: allows sync or async preview urls 2021-11-24 13:20:13 -05:00
James
01429b6570 Merge branch 'feat/preview-async' of github.com:payloadcms/payload 2021-11-24 13:19:49 -05:00
James
cdd55a1c6b chore: adds tests for querying use cases 2021-11-24 13:18:10 -05:00
Jacob Fletcher
40ca3dae61 feat: migrates admin preview to async 2021-11-24 12:32:44 -05:00
James
07c8ac08e2 feat: indexes filenames 2021-11-24 11:35:07 -05:00
James
5d43262f42 feat: indexes filenames 2021-11-24 11:02:54 -05:00
James
bd373598b5 chore: beta release 2021-11-24 10:45:51 -05:00
James
26aaef8851 feat: merges type generation 2021-11-24 10:35:30 -05:00
James
6fd5ac2c08 feat: azure cosmos compatibility 2021-11-24 10:30:47 -05:00
James
763f32e22f chore: separates revisions from drafts 2021-11-23 17:14:06 -05:00
Elliot DeNolf
21a810c38c feat: add id fields to generated types 2021-11-23 16:43:59 -05:00
James
27fabf79bd Merge branch 'master' of github.com:payloadcms/payload into feat/revisions 2021-11-23 14:32:26 -05:00
James
91fae55d90 chore: updates type generation log message 2021-11-23 10:19:25 -05:00
James
d9e1b5ede3 fix: issue with querying by id and using comma-separated values 2021-11-23 10:18:30 -05:00
James
99a3386dd6 Merge branch 'master' of github.com:payloadcms/payload 2021-11-22 15:45:36 -05:00
James Mikrut
c49c9b0328 Merge pull request #361 from payloadcms/fix/description-type
fix: updates field description type to include react nodes
2021-11-22 12:22:20 -05:00
James Mikrut
d151003eb6 Merge pull request #364 from tejasahluwalia/fix/webp-support-admin-dashboard
fix: Include 'WebP' as image type for admin dashboard thumbnail component
2021-11-22 12:22:02 -05:00
Jacob Fletcher
3436e6173f wip: custom onchange events for text, select, and upload fields 2021-11-22 08:50:48 -05:00
Tejas Ahluwalia
b2fe27dda5 Include 'WebP' as image type
This is called in the useThumbail hook. Adding webp support for thumbnails in the admin Thumbnail component.
2021-11-21 00:05:10 +05:30
James
ed5a5ebe7e feat: finishes typing all fields 2021-11-16 21:15:49 -05:00
James
2ca76ba8ce feat: generates further field types 2021-11-16 21:01:57 -05:00
James
6dd1b0e033 feat: adds field types to type generation 2021-11-16 20:24:13 -05:00
James
5a965d2263 feat: baseline type generation 2021-11-16 18:49:42 -05:00
James
3ab9d9e740 Merge branch 'feature/ts-type-gen' of github.com:payloadcms/payload into feature/ts-type-gen 2021-11-16 18:17:31 -05:00
James
438b6b3e51 Merge branch 'master' of github.com:payloadcms/payload 2021-11-10 17:30:49 -05:00
James
40899c211b chore: beta release 2021-11-10 17:30:31 -05:00
James
b2c5b7e575 feat: ensures update hooks have access to full original docs even in spite of access control 2021-11-10 17:25:59 -05:00
Jacob Fletcher
291c193ad4 fix: updates field description type to include react nodes 2021-11-10 11:23:10 -05:00
Elliot DeNolf
7c6424ff35 chore: resolve conflicts 2021-11-09 20:00:21 -05:00
James Mikrut
a7525e2931 Merge pull request #355 from donstephan/donstephan-patch-1
Typo in docs for select field
2021-11-05 12:27:38 -04:00
Don Stephan
e7b1adf4ed Better english 2021-11-04 20:28:32 -05:00
Don Stephan
f67286be7b Typo in options label for select field 2021-11-04 20:13:17 -05:00
James
e3e41c3621 Merge branch 'feat/relationship-filter' 2021-11-01 23:16:11 -04:00
James
72fc413764 fix: ensures buildQuery works with fields as well as simultaneous or / and 2021-11-01 23:11:54 -04:00
James
463c4e60de feat: adds relationship filter field 2021-11-01 23:11:03 -04:00
James
e06df905c5 chore: beta release 2021-11-01 22:33:31 -04:00
James
8987ce1f69 chore: scaffolds relationship filter 2021-11-01 22:31:32 -04:00
James
7337169342 chore: adds query testing 2021-11-01 22:30:35 -04:00
James
bee18a5e99 chore: adds buildQuery testing 2021-11-01 22:30:16 -04:00
James
abf61d0734 fix: ensures richtext links retain proper formatting 2021-11-01 19:41:22 -04:00
James
20d4e72a95 fix: ensures 'like' query param remains functional in all cases 2021-11-01 19:05:09 -04:00
James
056f078615 chore: release beta 2021-11-01 17:12:08 -04:00
James
94c2b8d80b fix: #351 2021-11-01 17:10:11 -04:00
James
0eceb8d76c chore: improves demo collections for testing 2021-11-01 17:09:02 -04:00
James
37b21b0762 fix: ensures tquerying by relationship subpaths works 2021-11-01 17:07:42 -04:00
James
40b33d9f5e fix: bug with relationship cell when no doc is available 2021-11-01 17:07:05 -04:00
James Mikrut
7303312142 Merge pull request #349 from payloadcms/feat/query-improvements
feat: improves querying logic
2021-11-01 14:34:58 -04:00
James
57c0346a00 fix: ensures relationship field search can return more than 10 options 2021-11-01 14:34:46 -04:00
James
6b14984352 chore: removes non-functional buildQuery code 2021-10-27 13:08:42 -04:00
James
4c85747849 feat: improves querying logic 2021-10-27 00:49:27 -04:00
James
a870cc7036 chore(release): v0.12.3 2021-10-23 11:37:09 -04:00
James
b4c15ed3f3 fix: #348, relationship options appearing twice in admin ui 2021-10-23 11:34:23 -04:00
James
a0b38f6832 fix: ensures tooltips in email fields are positioned properly 2021-10-23 11:33:56 -04:00
James
ac53bac2f4 feat: revision access control config 2021-10-22 10:58:35 -04:00
James
fbbe590ea2 feat: scaffolds revisions tests 2021-10-22 10:58:14 -04:00
James
6ed11a5563 feat: adds base revision fields 2021-10-22 10:57:56 -04:00
James
d3f88a1bd9 fix: mobile styling to not found page 2021-10-22 10:23:06 -04:00
James
06861261fe feat: builds revisions models 2021-10-22 09:47:34 -04:00
James
83f41df82f chore(release): v0.12.2 2021-10-21 19:36:31 -04:00
James
5b36bd7b43 chore: dependencies 2021-10-21 19:35:22 -04:00
James
d443ea582c fix: improves paste html formatting 2021-10-21 19:33:50 -04:00
James
881952e1cc chore(release): v0.12.1 2021-10-21 18:40:01 -04:00
James
9d7feb9796 fix: rich text copy and paste now saves formatting properly 2021-10-21 18:38:34 -04:00
James
bc6c892e0a chore(release): v0.12.0 2021-10-21 13:22:21 -04:00
James
48315b0e67 Merge branch 'master' of github.com:payloadcms/payload 2021-10-21 13:20:37 -04:00
James
c35009f14c fix: bug where field hooks and access control couuld potentially compete 2021-10-21 13:20:23 -04:00
James Mikrut
935a483eaa Update overview.mdx 2021-10-21 09:27:42 -04:00
James
badbdca351 chore: changelog 2021-10-21 09:19:57 -04:00
James
c02e8f14c7 feat: exposes withCondition for re-use 2021-10-21 09:16:49 -04:00
James Mikrut
92cb30e921 Merge pull request #344 from payloadcms/feat/ui-field
feat: builds UI field
2021-10-20 19:33:03 -04:00
James
edb723a4fb feat: builds UI field 2021-10-20 16:56:07 -04:00
James Mikrut
dbac0724ad Update CHANGELOG.md 2021-10-20 09:27:58 -04:00
James
328585edbd chore(release): v0.11.0 2021-10-20 09:26:26 -04:00
James
914cca6b92 fix: #343 - upload rte element crashes admin when no upload collection present 2021-10-20 09:24:23 -04:00
James
e3b05f9076 chore: changelog, beta release 2021-10-19 10:35:38 -04:00
James
86e88d998f fix: #338, array / block fields with only nested array block fields break admin UI 2021-10-19 10:31:59 -04:00
James Mikrut
6d50afd864 Merge pull request #342 from payloadcms/feat/upload-url-field
feat: adds dynamic url field to upload-enabled collections
2021-10-19 10:30:38 -04:00
James
4527dda08c chore: ensures adminThumbnail uses new url field 2021-10-18 21:21:24 -04:00
James
cc4d1fd045 feat: adds dynamic url field to upload-enabled collections 2021-10-18 21:15:32 -04:00
James
3b99deda45 fix: #341 - searching on multiple relationship collections 2021-10-18 19:25:08 -04:00
James
900f05eefd feat: adds safety checks while querying on id with bad values 2021-10-18 19:23:24 -04:00
James
716c05f5d8 Merge branch 'master' of github.com:payloadcms/payload 2021-10-18 13:48:13 -04:00
James
b22c8963cb docs: accuracy 2021-10-18 13:48:02 -04:00
James
eb05b47c54 chore: changelog 2021-10-18 13:12:26 -04:00
James
ca91f47d32 feat: allows richText enter key break out functionality to be extended in custom elements 2021-10-18 13:08:57 -04:00
James Mikrut
5040ee629f Update README.md 2021-10-14 14:27:29 -04:00
Dan Ribbens
5be09ffc78 Merge branch 'master' of github.com:payloadcms/payload 2021-10-13 17:03:38 -04:00
Dan Ribbens
4c87123514 docs: fix typo 2021-10-13 17:03:21 -04:00
James
f57f81a3cb chore: publish beta 2021-10-13 16:19:38 -04:00
James
423ca01ab1 feat: improves richtext link 2021-10-13 16:14:00 -04:00
James
9eedce7345 Merge branch 'master' of github.com:payloadcms/payload 2021-10-13 09:19:48 -04:00
James
a2df67eccd fix: removes node 15 from CI 2021-10-13 09:19:39 -04:00
James Mikrut
3908c012f9 Update CHANGELOG.md 2021-10-12 21:36:10 -04:00
James
ecda271258 chore: rolls back ts / eslint updates 2021-10-12 21:35:07 -04:00
James
84f6a9d659 fix: more strict field typing 2021-10-12 21:18:12 -04:00
James
7d49302ffa fix: properly types row field 2021-10-12 19:42:37 -04:00
James
f3455aafe9 chore: changelog 2021-10-12 19:36:19 -04:00
James
fcd9c28871 fix: per page now properly modifies search query 2021-10-12 19:31:01 -04:00
James
a6fc1fdc58 feat: saves active list filters in URL, implements per-page control 2021-10-12 19:25:43 -04:00
James
630fa68714 Merge branch 'master' of github.com:payloadcms/payload 2021-10-12 11:08:37 -04:00
James
ef4f284fb0 Merge branch 'feature/per-page' of github.com:payloadcms/payload 2021-10-12 11:08:32 -04:00
James Mikrut
5a63f11ed7 Merge pull request #339 from payloadcms/fix/build-failure-code
fix: use proper error code on webpack build failure
2021-10-12 10:56:20 -04:00
Elliot DeNolf
6807637e25 wip(per-page): thread the needle, not working 2021-10-11 17:42:02 -04:00
Elliot DeNolf
d88ce2d342 feat(per-page): set and load from preferences 2021-10-11 17:09:44 -04:00
Dan Ribbens
b257e01c8d fix: make name required on field types (#337)
* fix: make name required on field types

* fix: improve typescript types
2021-10-11 15:52:18 -04:00
Elliot DeNolf
c132f2ff10 feat(per-page): add pagination to admin config 2021-10-11 11:34:25 -04:00
James
d0259ceecd chore(release): v0.10.11 2021-10-07 20:29:06 -04:00
James
fd4fbe8c8b fix: bug with local API and not passing array / block data 2021-10-07 20:25:42 -04:00
James
4432031341 chore(release): v0.10.10 2021-10-07 11:30:23 -04:00
Jarrod Flesch
932628bc14 Merge branch 'master' of github.com:payloadcms/payload 2021-10-07 10:58:39 -04:00
Jarrod Flesch
27117292f3 fix: deepObjectCopy returns Date object instead of empty object 2021-10-07 10:58:33 -04:00
Elliot DeNolf
3715e011c9 feat(admin): initial per page component 2021-10-06 21:39:12 -04:00
Elliot DeNolf
2eb81546c3 fix: use proper error code on webpack build failure 2021-10-06 10:30:56 -04:00
James
bbdeebd1d4 chore(release): v0.10.9 2021-10-05 18:13:04 -04:00
Jarrod Flesch
5056e18734 Merge branch 'master' of github.com:payloadcms/payload 2021-10-05 18:05:53 -04:00
Jarrod Flesch
e3229c55f3 fix: ensures field read access within login operation has id 2021-10-05 18:05:48 -04:00
James
78c3ab6c44 chore(release): v0.10.8 2021-10-04 18:07:57 -04:00
Jarrod Flesch
ffab6c46c1 fix: ensures update field access control receives id 2021-10-04 18:05:55 -04:00
James
8d6372ee4b chore(release): v0.10.7 2021-10-04 11:26:58 -04:00
James
ad2b47e725 docs: clarity 2021-10-04 11:25:12 -04:00
James
bba1f1ff62 Merge branch 'feat/index-sortable-fields' of github.com:payloadcms/payload 2021-10-04 11:22:13 -04:00
James
0a5a6071f0 chore: renames StrictPolicies to StrictAccess 2021-10-04 11:21:40 -04:00
James
1c69441f17 chore: adds tests for relationship population 2021-10-04 11:19:03 -04:00
James
a20110974d fix: ensures non populated relationships still retain IDs 2021-10-04 11:07:47 -04:00
Jarrod Flesch
d5d774877e Merge branch 'master' of github.com:payloadcms/payload into fix/relationship-access-missing-id 2021-10-01 17:08:37 -04:00
Jarrod Flesch
470d4345f9 fix: ensures relationship field access control receives id 2021-10-01 17:07:26 -04:00
Dan Ribbens
ad097820bf feat: add indexSortableField option to create indexes for sortable fields on all collections 2021-09-30 16:05:47 -04:00
James
fda9356749 chore(release): v0.10.6 2021-09-30 12:41:01 -04:00
James
60ff7afee0 Merge branch 'master' of github.com:payloadcms/payload 2021-09-30 12:36:06 -04:00
James
f42205307e fix: relationship + new slate incompatibility 2021-09-30 12:36:01 -04:00
Dan Ribbens
d498e37083 Merge pull request #330 from payloadcms/fix/debug-config-option
fix: allow debug in payload config
2021-09-28 15:54:25 -04:00
James Mikrut
f06808ac80 Update CHANGELOG.md 2021-09-28 14:38:04 -04:00
Dan Ribbens
65bf13d7c1 fix: allow debug in payload config 2021-09-23 14:56:21 -04:00
1037 changed files with 50204 additions and 23661 deletions

View File

@@ -21,6 +21,28 @@ module.exports = {
},
},
overrides: [
{
files: ['test/**/int.spec.ts'],
rules: {
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/consistent-type-imports': 'warn',
'jest/prefer-strict-equal': 'off',
}
},
{
files: ['test/**/e2e.spec.ts'],
extends: [
'plugin:playwright/playwright-test'
],
rules: {
'jest/consistent-test-it': 'off',
'jest/require-top-level-describe': 'off',
'jest/no-test-callback': 'off',
'jest/prefer-strict-equal': 'off',
'jest/expect-expect': 'off',
'jest-dom/prefer-to-have-attribute': 'off',
}
},
{
files: ['*.ts', '*.tsx'],
parser: '@typescript-eslint/parser',
@@ -28,8 +50,8 @@ module.exports = {
'plugin:@typescript-eslint/recommended',
],
rules: {
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error"],
'no-shadow': 'off',
'@typescript-eslint/no-shadow': ['error'],
'import/no-unresolved': [
2,
{
@@ -38,18 +60,35 @@ module.exports = {
],
},
],
}
},
},
{
files: ['*.spec.ts'],
rules: {
'@typescript-eslint/no-use-before-define': 'off',
},
},
{
files: ['*.e2e.ts'],
rules: {
'@typescript-eslint/no-use-before-define': 'off',
'jest/expect-expect': 'off',
},
},
],
rules: {
'no-sparse-arrays': 'off',
'import/no-extraneous-dependencies': ["error", { "packageDir": "./" }],
'import/no-extraneous-dependencies': ['error', { packageDir: './' }],
'react/jsx-filename-extension': [2, { extensions: ['.js', '.jsx', '.ts', '.tsx'] }],
'import/prefer-default-export': 'off',
'react/prop-types': 'off',
'react/require-default-props': 'off',
'react/no-unused-prop-types': 'off',
'no-console': 'warn',
'no-sparse-arrays': 'off',
'no-underscore-dangle': 'off',
'no-use-before-define': 'off',
'arrow-body-style': 0,
'@typescript-eslint/no-use-before-define': 'off',
'import/extensions': [
'error',
'ignorePackages',

View File

@@ -1,27 +1,28 @@
---
name: Bug Report
about: Create a bug report for Payload
labels: 'bug'
labels: 'possible-bug'
---
# Bug Report
<!--- Provide a general summary of the issue in the Title above -->
## Expected Behavior
<!--- Tell us what should happen -->
## Current Behavior
<!--- Tell us what happens instead of the expected behavior -->
## Expected Behavior
<!--- Tell us what you expected happen -->
## Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- Optional. If familiar with the codebase, suggest a fix/reason for the bug. -->
## Steps to Reproduce
<!--- Steps to reproduce this bug. Include any code, if relevant -->
1.
2.
3.

View File

@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Security Vulnerability
url: https://github.com/payloadcms/payload/blob/master/SECURITY.md
about: See instructions to privately disclose any security concerns
- name: Feature Request
url: https://github.com/payloadcms/payload/discussions
about: Suggest an idea to improve Payload in our GitHub Discussions

View File

@@ -1,13 +1,17 @@
name: build
on: [push]
on:
pull_request:
types: [opened, reopened, edited, synchronize]
push:
branches: ['master']
jobs:
build_yarn:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x, 14.x, 15.x, 16.x]
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v2
@@ -31,10 +35,26 @@ jobs:
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- run: yarn build
- run: yarn test:client
- run: yarn test:int # In-memory db + api tests
env:
CI: true
- name: Component Tests
run: yarn test:components
- name: Integration Tests
run: yarn test:int
- name: Generate Payload Types
run: yarn dev:generate-types fields
- name: Install Playwright Browsers
run: npx playwright install --with-deps
- name: E2E Tests
run: yarn test:e2e --bail
# - uses: actions/upload-artifact@v2
# if: always()
# with:
# name: playwright-report
# path: playwright-report/
# retention-days: 30
install_npm:
runs-on: ubuntu-latest
strategy:

13
.gitignore vendored
View File

@@ -86,6 +86,15 @@ typings/
# Yarn Integrity file
.yarn-integrity
# Yarn Berry
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.pnp.*
# dotenv environment variables file
.env
@@ -228,3 +237,7 @@ build
# Ignore built components
components/index.js
components/styles.css
# Ignore generated
demo/generated-types.ts
demo/generated-schema.graphql

1
.node-version Normal file
View File

@@ -0,0 +1 @@
v16.14.2

32
.vscode/launch.json vendored
View File

@@ -29,42 +29,18 @@
"request": "launch",
"name": "Launch Program",
"env": {
"PAYLOAD_CONFIG_PATH": "demo/payload.config.ts",
"BABEL_ENV": "development"
},
"program": "${workspaceFolder}/demo/index.js",
"program": "${workspaceFolder}/test/dev.js",
"skipFiles": [
"<node_internals>/**"
],
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node",
"runtimeArgs": [
"--nolazy"
],
"args": [
"fields"
]
},
{
"type": "node",
"request": "launch",
"name": "Launch Program - Production",
"env": {
"PAYLOAD_CONFIG_PATH": "demo/payload.config.ts",
"NODE_ENV": "production",
"BABEL_ENV": "development"
},
"program": "${workspaceFolder}/demo/index.js",
"skipFiles": [
"<node_internals>/**"
],
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node",
"runtimeArgs": [
"--nolazy"
],
},
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against Localhost",
"url": "http://localhost:3000/admin",
"webRoot": "${workspaceFolder}"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +1,22 @@
<h1 align="center">Payload</h1>
<p align="center">A self-hosted, JavaScript headless CMS & application framework built with Express, MongoDB and React.</p>
<p align="center">A free and open-source TypeScript headless CMS & application framework built with Express, MongoDB and React.</p>
<p align="center">
<a href="https://opensource.org/licenses/MIT">
<img src="https://img.shields.io/badge/License-MIT-blue.svg" />
</a>
<a href="https://github.com/payloadcms/payload/actions">
<img src="https://github.com/payloadcms/payload/workflows/build/badge.svg">
<img src="https://github.com/payloadcms/payload/workflows/build/badge.svg" />
</a>
<a href="https://www.npmjs.com/package/payload">
<img alt="npm" src="https://img.shields.io/npm/v/payload">
<img alt="npm" src="https://img.shields.io/npm/v/payload" />
</a>
<a href="https://twitter.com/intent/tweet?text=Payload%20-%20A%20self-hosted%2C%20headless%20JavaScript%20CMS%20%26%20application%20framework&url=https%3A%2F%2Fgithub.com%2Fpayloadcms%2Fpayload">
<img alt="Tweet Payload" src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social">
<img alt="Tweet Payload" src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social" />
</a>
<a href="https://discord.com/invite/r6sCXqVk3v">
<img alt="Discord" src="https://img.shields.io/discord/967097582721572934?label=Discord&color=7289da" />
</a>
</p>
@@ -17,25 +24,15 @@
<img src="https://payloadcms.com/images/og-image.jpg" alt="Payload headless CMS Admin panel built with React" />
</a>
### Quick Start
```
npx create-payload-app
```
Alternatively, it only takes about five minutes to [create an app from scratch](https://payloadcms.com/docs/getting-started/installation#from-scratch).
### Documentation
Check out the [Payload website](https://payloadcms.com/docs/getting-started/what-is-payload) to find in-depth documentation for everything that Payload offers.
### Features
- Completely free and open-source
- [GraphQL](https://payloadcms.com/docs/graphql/overview), [REST](https://payloadcms.com/docs/rest-api/overview), and [Local](https://payloadcms.com/docs/local-api/overview) APIs
- [Easily customizable ReactJS Admin](https://payloadcms.com/docs/admin/overview)
- [Fully self-hosted](https://payloadcms.com/docs/production/deployment)
- [Extensible Authentication](https://payloadcms.com/docs/authentication/overview)
- [Local file storage & upload](https://payloadcms.com/docs/upload/overview)
- [Version History and Drafts](https://payloadcms.com/docs/versions/overview)
- [Field-based Localization](https://payloadcms.com/docs/configuration/localization)
- [Block-based Layout Builder](https://payloadcms.com/docs/fields/blocks)
- [Extensible SlateJS rich text editor](https://payloadcms.com/docs/fields/rich-text)
@@ -49,18 +46,14 @@ Check out the [Payload website](https://payloadcms.com/docs/getting-started/what
### Code-first
If you know JavaScript, you know Payload. Payload is a _code-first_ CMS, which allows us to do a lot of things right:
Payload is a CMS that has been designed for developers from the ground up to deliver them what they need to build great digital products. If you know JavaScript, you know Payload. It's a _code-first_ CMS, which allows us to do a lot of things right:
- Payload gives you everything you need, but then steps back and lets you build what you want in JavaScript or TypeScript - with no unnecessary complexity brought by GUIs. You'll understand how your CMS works, because you will have written it exactly how you want it.
- Payload gives you everything you need, but then steps back and lets you build what you want in JavaScript or TypeScript - with no unnecessary complexity brought by GUIs. You'll understand how your CMS works because you will have written it exactly how you want it.
- Bring your own Express server and do whatever you need on top of Payload. Payload doesn't impose anything on you or your app.
- Completely control the Admin panel by using your own React components. Swap out fields or even entire views with ease.
- Use your data however and wherever you need thanks to auto-generated, yet fully extensible REST, GraphQL and Local Node APIs.
- Use your data however and wherever you need thanks to auto-generated, yet fully extensible REST, GraphQL, and Local Node APIs.
### Free forever for personal use and small projects
Payload is 100% free for personal projects or small use cases where only one admin user is required. You can also get started without an account whatsoever while running on `localhost`.
## Installation
### Quick Start
Before beginning to work with Payload, make sure you have all of the [required software](https://payloadcms.com/docs/getting-started/installation).
@@ -70,8 +63,22 @@ From there, the easiest way to get started with Payload is to use the `create-pa
npx create-payload-app
```
Alternatively, it only takes about five minutes to [write out your own app from scratch](https://payloadcms.com/docs/getting-started/installation#from-scratch).
Alternatively, it only takes about five minutes to [create an app from scratch](https://payloadcms.com/docs/getting-started/installation#from-scratch).
## License
### Documentation
Find the Payload license [here](https://github.com/payloadcms/payload/blob/master/license.md).
Check out the [Payload website](https://payloadcms.com/docs/getting-started/what-is-payload) to find in-depth documentation for everything that Payload offers.
### Contributing
If you want to add contributions to this repository, please follow the instructions in [contributing.md](./contributing.md).
### Other Resources
##### Discussions
There are lots of good conversations and resources in our [GitHub Discussions board](https://github.com/payloadcms/payload/discussions). If you're struggling with something, chances are, someone's already solved what you're up against. Searching Discussions will often provide very helpful tips and tricks.
##### Discord
Join [Payload's Discord channel](https://discord.com/invite/r6sCXqVk3v) to interact with Payload developers in realtime.

5
SECURITY.md Normal file
View File

@@ -0,0 +1,5 @@
# Security Policy
## Reporting a Vulnerability
Please report any security issues or concerns to [info@payloadcms.com](mailto:info@payloadcms.com).

5
components/elements.ts Normal file
View File

@@ -0,0 +1,5 @@
export { default as Button } from '../dist/admin/components/elements/Button';
export { default as Card } from '../dist/admin/components/elements/Card';
export { default as Eyebrow } from '../dist/admin/components/elements/Eyebrow';
export { default as Nav } from '../dist/admin/components/elements/Nav';
export { Gutter } from '../dist/admin/components/elements/Gutter';

View File

@@ -1,20 +1,38 @@
export {
useForm,
/**
* @deprecated useWatchForm is no longer preferred. If you need all form fields, prefer `useAllFormFields`.
*/
useWatchForm,
useFormFields,
useAllFormFields,
useFormSubmitted,
useFormProcessing,
useFormModified,
} from '../dist/admin/components/forms/Form/context';
export { default as useFieldType } from '../dist/admin/components/forms/useFieldType';
export { default as useField } from '../dist/admin/components/forms/useField';
/**
* @deprecated This method is now called useField. The useFieldType alias will be removed in an upcoming version.
*/
export { default as useFieldType } from '../dist/admin/components/forms/useField';
export { default as Form } from '../dist/admin/components/forms/Form';
export { default as Text } from '../dist/admin/components/forms/field-types/Text';
export { default as TextInput } from '../dist/admin/components/forms/field-types/Text/Input';
export { default as Group } from '../dist/admin/components/forms/field-types/Group';
export { default as Select } from '../dist/admin/components/forms/field-types/Select';
export { default as SelectInput } from '../dist/admin/components/forms/field-types/Select/Input';
export { default as Checkbox } from '../dist/admin/components/forms/field-types/Checkbox';
export { default as Submit } from '../dist/admin/components/forms/Submit';
export { default as Label } from '../dist/admin/components/forms/Label';
export { default as reduceFieldsToValues } from '../dist/admin/components/forms/Form/reduceFieldsToValues';
export { default as getSiblingData } from '../dist/admin/components/forms/Form/getSiblingData';
export { default as withCondition } from '../dist/admin/components/forms/withCondition';

1
components/hooks.ts Normal file
View File

@@ -0,0 +1 @@
export { useStepNav } from '../dist/admin/components/elements/StepNav';

2
components/icons.ts Normal file
View File

@@ -0,0 +1,2 @@
export { default as Chevron } from '../src/admin/components/icons/Chevron';
export { default as X } from '../src/admin/components/icons/X';

2
components/templates.ts Normal file
View File

@@ -0,0 +1,2 @@
export { default as DefaultTemplate } from '../dist/admin/components/templates/Default';
export { default as MinimalTemplate } from '../dist/admin/components/templates/Minimal';

6
components/utilities.ts Normal file
View File

@@ -0,0 +1,6 @@
export { default as Meta } from '../dist/admin/components/utilities/Meta';
export { useLocale } from '../dist/admin/components/utilities/Locale';
export { useDocumentInfo } from '../dist/admin/components/utilities/DocumentInfo';
export { useConfig } from '../dist/admin/components/utilities/Config';
export { useAuth } from '../dist/admin/components/utilities/Auth';
export { useEditDepth } from '../dist/admin/components/utilities/EditDepth';

View File

@@ -0,0 +1,3 @@
export { default as Dashboard } from '../../dist/admin/components/views/Dashboard/Default';
export type { Props } from '../../dist/admin/components/views/Dashboard/types';

View File

@@ -2,10 +2,6 @@
Below you'll find a set of guidelines for how to contribute to Payload CMS.
## Payload is proprietary software
Even though you can read Payload's source code, it's technically not "open source". Payload requires an active license to be used in all production purposes. That said, we do not expect PRs from the public, but we still welcome pull requests of any kind.
## Opening issues
Before you submit an issue, please check all existing [open and closed issues](https://github.com/payloadcms/payload/issues) to see if your issue has previously been resolved or is already known. If there is already an issue logged, feel free to upvote it by adding a :thumbsup: [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). If you would like to submit a new issue, please fill out our Issue Template to the best of your ability so we can accurately understand your report.
@@ -22,12 +18,41 @@ Payload documentation can be found directly within its codebase and you can feel
## Building additional features
If you're an incredibly awesome person and want to help us make Payload even better through new features or additions, we would be thrilled to work with you. If your proposed feature is accepted by our team and is significant enough, pending our discretion, we'd be happy to hook you up with a pro-bono license.
If you're an incredibly awesome person and want to help us make Payload even better through new features or additions, we would be thrilled to work with you.
To help us work on new features, you can reach out to our Development team at [`dev@payloadcms.com`](mailto:dev@payloadcms.com). Be as complete and descriptive as possible regarding your vision and we'll go from there!
### Before Starting
To help us work on new features, you can create a new feature request post in [GitHub Discussion](https://github.com/payloadcms/payload/discussions) or discuss it in our [Discord](https://discord.com/invite/r6sCXqVk3v). New functionality often has large implications across the entire Payload repo, so it is best to discuss the architecture and approach before starting work on a pull request.
### Code
Most new functionality should keep testing in mind. With 1.0, testability of new features has been vastly improved. All top-level directories within the `test/` directory are for testing a specific category: `fields`, `collections`, etc.
If it makes sense to add your feature to an existing test directory, please do so.
A typical directory with `test/` will be structured like this:
```text
.
├── config.ts
├── int.spec.ts
├── e2e.spec.ts
└── payload-types.ts
```
- `config.ts` - This is the _granular_ Payload config for testing. It should be as lightweight as possible. Reference existing configs for an example
- `int.spec.ts` - This is the test file run by jest. Any test file must have a `*int.spec.ts` suffix.
- `e2e.spec.ts` - This is the end-to-end test file that will load up the admin UI using the above config and run Playwright tests. These tests are typically only needed if a large change is being made to the Admin UI.
- `payload-types.ts` - Generated types from `config.ts`. Generate this file by running `yarn dev:generate-types my-test-dir`.
The directory split up in this way specifically to reduce friction when creating tests and to add the ability to boot up Payload with that specific config.
The following command will start Payload with your config: `yarn dev my-test-dir`. This command will start up Payload using your config and refresh a test database on every restart.
When switching between test directories, you will want to remove your `node_modules/.cache ` manually or by running `yarn clean:cache`.
NOTE: It is recommended to add the test credentials (located in `test/credentials.ts`) to your autofill for `localhost:3000/admin` as this will be required on every nodemon restart.
## Pull Requests
For all Pull Requests, you should be extremely descriptive about both your problem and proposed solution. If there are any affected open or closed issues, please leave the issue number in your PR message.
By opening a Pull Request against Payload's codebase, you automatically give the entirety of the contribution within your PR to Payload CMS, LLC and retain no personal ownership whatsoever afterward. For more information, please read the full [Payload license](https://github.com/payloadcms/payload/blob/master/license.md).

View File

@@ -1,17 +0,0 @@
/**
* authorize a request by comparing the current user with one or more roles
* @param allRoles
* @param user
* @returns {Function}
*/
const checkRole = (allRoles, user) => {
if (user) {
if (allRoles.some((role) => user.roles && user.roles.some((individualRole) => individualRole === role))) {
return true;
}
}
return false;
};
export default checkRole;

View File

@@ -1,7 +0,0 @@
export default [
'admin',
'editor',
'moderator',
'user',
'viewer',
];

View File

@@ -1,26 +0,0 @@
import { Block } from '../../src/fields/config/types';
const CTA: Block = {
slug: 'cta',
labels: {
singular: 'Call to Action',
plural: 'Calls to Action',
},
fields: [
{
name: 'label',
label: 'Label',
type: 'text',
maxLength: 100,
required: true,
},
{
name: 'url',
label: 'URL',
type: 'text',
required: true,
},
],
};
export default CTA;

View File

@@ -1,19 +0,0 @@
import { Block } from '../../src/fields/config/types';
const Email: Block = {
slug: 'email',
labels: {
singular: 'Email',
plural: 'Emails',
},
fields: [
{
name: 'testEmail',
label: 'Test Email Field',
type: 'email',
required: true,
},
],
};
export default Email;

View File

@@ -1,20 +0,0 @@
import { Block } from '../../src/fields/config/types';
const NumberBlock: Block = {
slug: 'number',
labels: {
singular: 'Number',
plural: 'Numbers',
},
fields: [
{
name: 'testNumber',
label: 'Test Number Field',
type: 'number',
max: 100,
required: true,
},
],
};
export default NumberBlock;

View File

@@ -1,34 +0,0 @@
import { Block } from '../../src/fields/config/types';
const Quote: Block = {
imageURL: '/static/assets/images/generic-block-image.svg',
slug: 'quote',
labels: {
singular: 'Quote',
plural: 'Quotes',
},
fields: [
{
name: 'author',
label: 'Author',
type: 'relationship',
relationTo: 'public-users',
required: true,
},
{
name: 'quote',
label: 'Quote',
type: 'textarea',
required: true,
},
{
name: 'color',
label: 'Color',
type: 'text',
maxLength: 7,
required: true,
},
],
};
export default Quote;

View File

@@ -1,14 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<div id="app"></div>
<div id="portal"></div>
</body>
</html>

View File

@@ -1,9 +0,0 @@
<svg width="82" height="53" viewBox="0 0 82 53" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect x="0.713013" width="80.574" height="52.7791" fill="url(#pattern0)"/>
<defs>
<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0" transform="scale(0.00387597 0.00591716)"/>
</pattern>
<image id="image0" width="258" height="169" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQIAAACpCAYAAADA4zPJAAALpklEQVR4Ae2dSY/UOhSF+///DCSGHQuEgAVI7BBITAI2zCCGZuhmpqEBP53W8yOvK1UdO3Zyr/NFilJdXalyTo4/X984zlZgQQEUWLwCW4tXAAFQAAUCIMAEKIACgAAPoAAKBECACVAABQABHkABFAiAABOgAAoAAjyAAiggBbhqgA9QAAUAAR5AARQgIsADKIACdA3wAAqggBQgR4APUAAFAAEeQAEUICLAAyiAAnQN8AAKoIAUIEeAD1AABQABHkABFCAiwAMogAJ0DfAACqCAFCBHgA9QAAUAAR5AARQgIsADKIACdA3wAAqggBQgR4APUAAFAAEeQAEUICLAAyiAAnQN8AAKoIAUIEeAD1AABQABHkABFCAiwAMogAJ0DfAACqCAFCBHgA9QAAUAAR5AARQgIsADKIACdA3wAAqggBQgR4APUAAFAAEeQAEUICLAAyiAAnQN8AAKoIAUIEeAD1AABQABHkABFCAiwAMLVmB/fz98+/YtfPr0KXz48CHs7u6GnZ2dg+3Hjx/D169fw48fP8KfP3+aV4muQfOnmAPsKqDKr4r/9u3bsL29PXgVKPb29pqFAiDouoTXzSrw8+fPg5Y+pfL3ffbdu3fh+/fvzekECJo7pRxQVwGF9YoA+ir1mPfUhVB00coCCFo5kxzHigKqqGrBx1T4Tfu+efOmmegAEKzYhzdaUEBdAVXUTRW51P+UVPS+AALvZ5DyryigSGAqCESYeIcBIFixEW94VuDXr1/JVwRiZR671VUFrwsg8HrmKPeKAkoMKok3tkLn7q8oRCDyuAACj2eNMvcqoMFBuZW41H4alORxAQQezxplXlHg9+/fk+cF1sHDYxcBEKxYijc8KvDly5fZo4EIhvfv37uTEBC4O2UU+LACyg2kDhmOlbbWVpcvPS2AwNPZoqy9CigUr1Whc79Xoxk9LYDA09mirL0K1BhCnAuAuJ8iFE8LIPB0tihrrwI1hxHHip2z9XQpERD0Wos3vSig/EBOJZ1iH09XDwCBF8dTzl4FNJx4ikqd8xu6kuFlAQRezhTl7FVAMwjlVNIp9vn8+XNvmS2+aR4E6md56mtZPMktl8niFYMIGU9XDkyDQCdZ47e1eupvtVzxrB0bEUGZM2ISBEoAafLISNa4FWH1PxYUiApo4E70h7UtOYJ4ljK2OrGbLgfpfy1NEZUhEbt0FNA9BtYAEMvjaW5DMxGBWnpN7hBFPGrrfSKIjpd5OVIBa8OLo3c9DTM2AQJRXbdvRgGHbrWP9mVZtgKaanyoZ6b6nPJanrqxs4MgJgRzTxCJxGVDQEevEDzXP7X2E5w8LbOBQLQsOUZ8TCLx9evX4fHjx+HRo0esTjW4efNmKL3eu3cvyBs5sPB2lWsWENSaZlr3gacmEi9fvhyOHTvGiga9Hjh79mwyDJSz8NQtUOQyOQhSEoI5JNY+mrJqyPLy5cvekw8YAGPXA7du3UqKCob6b4hHp/rMZCDITQjmwmBIIvH+/fuAgEjgSA9cuXJlMAh0edtbNCDYTAICjf6a4xKPflO/vW4BBLT83ZZ/3esUEHi6ZNitF1VBIDLqxovcVr3UfipDH6UBASBYV/m77w8FgaeRhF0I6HU1EChpp+Rdqco89nv6EomAABB0K/y610NAoCHxfY3N4Qpn9e8qILAwv3wfODTmoJvIef78+ZH9w3Xm4P3lQOTGjRsbGzSNGfAMgeIRgRKCFkd5HYaCyqiyaj1//jwwIGG41gOnT58Ourp02EPx7zHjVyxFB8UigrkSgvGEpG5jIlEw0ECiO3fusDaowe3bt8PVq1eDwvvU9fr162sh0NqI1tEgsJIQTAVB/Py6RKIlWlOWcQrIo+oSlrpypShADUhLyygQaOYgSwnBWLlTtzoGZkFqydb9xxKBkONZQUSNRqs+yQaBbvRQeJRa6ax+Xsfi6f7xfqvz7lAFVKEVJSjbLzCookc/a6uBQcol6ZKgxgZ4TwYepUsyCBQSeUgI5gJHxmgt7DvKBPwfBZJAIDKW6mflVtQp9tMxeh0hhqVRIEeBQSBQWKQQaYpKaOk3dMyth4Q5pmGf9hQ4EgTqS+3s7CwOAhFIOvZWE0Tt2ZkjylVgIwhaSwjGyp26JZGYay/286JALwiULOubTjy1ArX2ee/jyb2YknJOr8AKCJQk06WT1ipxqeORNiQSpzcqv1hXgf9AsNSEYC4gSCTWNSbfPq0CByBYekIwFwYkEqc1K79WT4GtsdOJ51aiVvZTItHbjLX17MQ3e1Vgq5UKOfdxtHI7ajSy7iYlFxLVaH8LCLa3iyVGlUhMnU7dmsWUK+pOL6dZpxlUZe0slS8PICgIghiV6F4M3ct+6dIlV+vFixcPJmo5d+5c6K4XLlwI+p/l47l27RpdtBF8AAQVQHDmzJm1M94wxVm9Kc6kOzeM5dEAEBQGgR6dRmWvV9mP0lbdM5Z0BQBBYRA8ePAAEMw4B6KeVciSrgAgAARNgQsQpENAewACQAAI8upOU3sBgsIgePjwYVMV66g+ubX/ExHk8QkQFAaB5sA/ceIEMJghT3D8+HHmnczjAF2DeO2/5Pbu3bvh1KlTwGBCGJw8eTI8efIksxqwGxFB4YggAuXVq1fh2bNn4enTp0euL168OJj/QaP4Sq26O1JzLw75/Rqf0czApY5lyPcwfmAczABBJRBEIAzd6ual7nMZx5xWK3eTxkfLjTkW9p1GAUBgBAQRGGMrj7W7SRWV6AYmFtsKAAJjIBAQciqPbgyyPL0cj5YDBMXu7out5lK2QyuPl+nleLScXRgQERiMCLqg2zQLkqIAJdK6n7f+mhmhbcIAEBgHgSp2X+VRlnx3d9cVBLqQGpsLsVmd/JYKEDgAQaxA8bmM1hKCsXypWx4tZwccgMARCFTRFB2kVjjrn2dG6PmBAAicgcB6pc4t36ZcyPzVpP0SAAJAYCbC6MuFtF8FbRwhIAAEZkAQowkeLTc9HAABIDAHAgGBR8tNCwNAAAhMgiBGByQSpwECIAAEpkEgIJBIrA8DQAAIzINAMFAikUfL1QMCIAAELkAQuwqtPVquXtVO+2ZAAAhcgUBAaOHRcmnVtP6nAQEgcAeCGB3ohiuWMgoAAkDgFgQCgm68Ypqy8TAABIDANQgEAxKJgMC9iWOYy3b84+lJJOYDgYiAiKApmGoWpP39/fwasdA9AQEgaAoEMbIqNSP0UrgACABBkyAQEEgkDscYIAAEzYJAMMiZEXp49Wnnk4AAEDQNgthVGDojdDtVO+1IAAEgWAQIBAQSievhAAgAwWJAIBhozAGJxFUgAAJAsCgQxK4C06n/HwaAABAsEgQCAonEvzAABIBgsSCI0QGJxBAAASBYPAgEhKU/lxEQAAJA8K8HljydOiAABIDgkAfio+X+9qDbfwUIDpkg9hvZjr8b0LOGS3suIyAABEQEGzywlOnUAcEGE3hu0Sh7uYhmCdOpAwJAQEQwwAOtJxIBwQAT0LqWa129a9nqcxkBASAgIkj0QIvPZQQEiSbw3qJR/nLRTUuJREAACIgIRniglUQiIBhhAlrXcq2rZy1bmE4dEAACIoJCHvA8nTogKGQCzy0aZS8X2Xh9LiMgAAREBBU84O25jICgggloYcu1sJ619DSdOiAABEQEFT3gJZEICCqawHNrRtnLRjXWE4mAABAQEUzkAcvTqQOCiUxAC1u2hfWsp8Xp1AEBICAimMED1hKJgGAGE3huzSh7ucjG0nTqgAAQEBHM7AEL06kDgplNQAtbroX1rOXciURAAAiICIx4QGMO5kokAgIjJvDcmlH2slHNHM9lBASAgIjAoAemTiQCAoMmoIUt28J61nOqRCIgAAREBMY9MMUsSIDAuAk8t2aUvVxkU3s6dUAACIgIHHmg1nMZAYEjE9DClmthPWtZYzp1QAAIiAiceqDkdOqAwKkJPLdolL1cZFMqkbilkUysaIAH/Hpgb28vjF3+AbSb48mcXO9tAAAAAElFTkSuQmCC"/>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -1,67 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import roles from '../access/roles';
import checkRole from '../access/checkRole';
const access = ({ req: { user } }) => {
const result = checkRole(['admin'], user);
return result;
};
const Admin: CollectionConfig = {
slug: 'admins',
labels: {
singular: 'Admin',
plural: 'Admins',
},
access: {
create: access,
read: access,
update: access,
delete: access,
admin: () => true,
},
auth: {
tokenExpiration: 7200, // 2 hours
verify: false,
maxLoginAttempts: 5,
lockTime: 600 * 1000, // lock time in ms
useAPIKey: true,
depth: 0,
cookies: {
secure: false,
sameSite: 'lax',
domain: undefined,
},
},
fields: [
{
name: 'roles',
label: 'Role',
type: 'select',
options: roles,
defaultValue: 'user',
required: true,
saveToJWT: true,
hasMany: true,
},
{
name: 'publicUser',
type: 'relationship',
hasMany: true,
relationTo: 'public-users',
},
{
name: 'apiKey',
type: 'text',
access: {
read: ({ req: { user } }) => checkRole(['admin'], user),
},
},
],
timestamps: true,
admin: {
useAsTitle: 'email',
},
};
export default Admin;

View File

@@ -1,339 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import checkRole from '../access/checkRole';
import Email from '../blocks/Email';
import Quote from '../blocks/Quote';
import NumberBlock from '../blocks/Number';
import CallToAction from '../blocks/CallToAction';
import CollectionDescription from '../customComponents/CollectionDescription';
const AllFields: CollectionConfig = {
slug: 'all-fields',
labels: {
singular: 'All Fields',
plural: 'All Fields',
},
admin: {
useAsTitle: 'text',
preview: (doc, { token }) => {
const { text } = doc;
if (doc && text) {
return `http://localhost:3000/previewable-posts/${text}?preview=true&token=${token}`;
}
return null;
},
description: CollectionDescription,
},
access: {
read: () => true,
},
fields: [
{
name: 'text',
type: 'text',
label: 'Text',
required: true,
defaultValue: 'Default Value',
unique: true,
access: {
create: ({ req: { user } }) => checkRole(['admin'], user),
update: ({ req: { user } }) => checkRole(['admin'], user),
read: ({ req: { user } }) => Boolean(user),
},
},
{
name: 'descriptionText',
type: 'text',
label: 'Text with text description',
defaultValue: 'Default Value',
admin: {
description: 'This text describes the field',
},
},
{
name: 'descriptionFunction',
type: 'text',
label: 'Text with function description',
defaultValue: 'Default Value',
maxLength: 20,
admin: {
description: ({ value }) => (typeof value === 'string' ? `${20 - value.length} characters left` : ''),
},
},
{
name: 'image',
type: 'upload',
label: 'Image',
relationTo: 'media',
admin: {
description: 'No selfies',
},
},
{
name: 'select',
label: 'Select',
type: 'select',
options: [{
value: 'option-1',
label: 'Option 1 Label',
}, {
value: 'option-2',
label: 'Option 2 Label',
}, {
value: 'option-3',
label: 'Option 3 Label',
}, {
value: 'option-4',
label: 'Option 4 Label',
}],
defaultValue: 'option-1',
required: true,
},
{
name: 'selectMany',
label: 'Select w/ hasMany',
type: 'select',
options: [{
value: 'option-1',
label: 'Option 1 Label',
}, {
value: 'option-2',
label: 'Option 2 Label',
}, {
value: 'option-3',
label: 'Option 3 Label',
}, {
value: 'option-4',
label: 'Option 4 Label',
}],
defaultValue: 'option-1',
required: true,
hasMany: true,
},
{
name: 'dayOnlyDateFieldExample',
label: 'Day Only',
type: 'date',
required: true,
admin: {
date: {
pickerAppearance: 'dayOnly',
monthsToShow: 2,
},
},
},
{
name: 'timeOnlyDateFieldExample',
label: 'Time Only',
type: 'date',
admin: {
date: {
pickerAppearance: 'timeOnly',
},
},
},
{
name: 'radioGroupExample',
label: 'Radio Group Example',
type: 'radio',
options: [{
value: 'option-1',
label: 'Options 1 Label',
}, {
value: 'option-2',
label: 'Option 2 Label',
}, {
value: 'option-3',
label: 'Option 3 Label',
}],
defaultValue: 'option-2',
required: true,
admin: {
readOnly: true,
},
},
{
type: 'row',
fields: [
{
name: 'email',
label: 'Email',
type: 'email',
}, {
name: 'number',
label: 'Number',
type: 'number',
},
],
},
{
type: 'group',
label: 'Group',
name: 'group',
fields: [
{
type: 'row',
fields: [
{
name: 'nestedText1',
label: 'Nested Text 1',
type: 'text',
}, {
name: 'nestedText2',
label: 'Nested Text 2',
type: 'text',
},
],
},
],
},
{
type: 'array',
label: 'Array',
name: 'array',
minRows: 2,
maxRows: 4,
fields: [
{
type: 'row',
fields: [
{
name: 'arrayText1',
label: 'Array Text 1',
type: 'text',
required: true,
admin: {
width: '50%',
},
},
{
name: 'arrayText2',
label: 'Array Text 2',
type: 'text',
required: true,
admin: {
width: '50%',
},
access: {
read: ({ req: { user } }) => Boolean(user),
update: ({ req: { user } }) => checkRole(['admin'], user),
},
},
],
},
{
type: 'text',
name: 'arrayText3',
label: 'Array Text 3',
admin: {
readOnly: true,
},
},
{
name: 'checkbox',
label: 'Checkbox',
type: 'checkbox',
},
],
},
{
type: 'blocks',
label: 'Blocks Content',
name: 'blocks',
minRows: 2,
blocks: [Email, NumberBlock, Quote, CallToAction],
localized: true,
required: true,
},
{
type: 'relationship',
label: 'Relationship to One Collection',
name: 'relationship',
relationTo: 'conditions',
admin: {
description: 'Relates to description',
},
},
{
type: 'relationship',
label: 'Relationship hasMany',
name: 'relationshipHasMany',
relationTo: 'localized-posts',
hasMany: true,
},
{
type: 'relationship',
label: 'Relationship to Multiple Collections',
name: 'relationshipMultipleCollections',
relationTo: ['localized-posts', 'conditions'],
},
{
type: 'textarea',
label: 'Textarea',
name: 'textarea',
admin: {
description: 'Hello textarea description',
},
},
{
name: 'richText',
type: 'richText',
label: 'Rich Text',
required: true,
admin: {
elements: [
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'blockquote',
'ul',
'ol',
'link',
],
leaves: [
'bold',
'italic',
'underline',
'strikethrough',
],
},
},
{
name: 'slug',
type: 'text',
label: 'Slug',
admin: {
position: 'sidebar',
},
localized: true,
unique: true,
required: true,
},
{
name: 'checkbox',
type: 'checkbox',
label: 'Checkbox',
admin: {
position: 'sidebar',
},
},
{
name: 'dateFieldExample',
label: 'Day and Time',
type: 'date',
admin: {
position: 'sidebar',
date: {
timeIntervals: 30,
},
},
},
],
timestamps: true,
};
export default AllFields;

View File

@@ -1,102 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const AutoLabel: CollectionConfig = {
slug: 'auto-label',
admin: {
useAsTitle: 'autoLabelField',
enableRichTextRelationship: true,
},
fields: [
{
name: 'autoLabelField',
type: 'text',
},
{
name: 'noLabel',
type: 'text',
label: false,
},
{
name: 'labelOverride',
type: 'text',
label: 'Custom Label',
},
{
name: 'testRelationship',
type: 'relationship',
relationTo: 'all-fields',
},
{
name: 'specialBlock',
type: 'blocks',
minRows: 1,
maxRows: 20,
// Will auto-label
// labels: {
// singular: 'Special Block',
// plural: 'Special Blocks',
// },
blocks: [
{
slug: 'number',
// Will auto-label
// labels: {
// singular: 'Number',
// plural: 'Numbers',
// },
fields: [
{
name: 'testNumber',
type: 'number',
},
],
},
],
},
{
name: 'noLabelBlock',
type: 'blocks',
label: false,
minRows: 1,
maxRows: 20,
blocks: [
{
slug: 'number',
// labels: {
// singular: 'Number',
// plural: 'Numbers',
// },
fields: [
{
name: 'testNumber',
type: 'number',
},
],
},
],
},
{
name: 'items',
type: 'array',
fields: [
{
name: 'itemName',
type: 'text',
},
],
},
{
name: 'noLabelArray',
type: 'array',
label: false,
fields: [
{
type: 'text',
name: 'textField',
},
],
},
],
};
export default AutoLabel;

View File

@@ -1,43 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import Email from '../blocks/Email';
import Quote from '../blocks/Quote';
import NumberBlock from '../blocks/Number';
import CallToAction from '../blocks/CallToAction';
const Blocks: CollectionConfig = {
slug: 'blocks',
labels: {
singular: 'Blocks',
plural: 'Blocks',
},
access: {
read: () => true,
},
fields: [
{
name: 'layout',
label: 'Layout Blocks',
labels: {
singular: 'Block',
plural: 'Blocks',
},
type: 'blocks',
blocks: [Email, NumberBlock, Quote, CallToAction],
localized: true,
required: true,
},
{
name: 'nonLocalizedLayout',
label: 'Non Localized Layout',
labels: {
singular: 'Layout',
plural: 'Layouts',
},
type: 'blocks',
blocks: [Email, NumberBlock, Quote, CallToAction],
required: true,
},
],
};
export default Blocks;

View File

@@ -1,23 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const Code: CollectionConfig = {
slug: 'code',
labels: {
singular: 'Code',
plural: 'Codes',
},
fields: [
{
name: 'code',
type: 'code',
label: 'Code',
required: true,
admin: {
language: 'js',
description: 'javascript example',
},
},
],
};
export default Code;

View File

@@ -1,73 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import Email from '../blocks/Email';
import Quote from '../blocks/Quote';
import NumberBlock from '../blocks/Number';
import CallToAction from '../blocks/CallToAction';
const Conditions: CollectionConfig = {
slug: 'conditions',
labels: {
singular: 'Conditions',
plural: 'Conditions',
},
fields: [
{
name: 'title',
type: 'text',
label: 'Title',
required: true,
},
{
name: 'enableTest',
type: 'checkbox',
label: 'Enable Test',
},
{
name: 'number',
type: 'number',
label: 'Number Field',
},
{
name: 'simpleCondition',
type: 'text',
label: 'Enable Test is checked',
required: true,
admin: {
condition: (_, siblings) => siblings.enableTest === true,
},
},
{
name: 'orCondition',
type: 'text',
label: 'Number is greater than 20 OR enableTest is checked',
required: true,
admin: {
condition: (_, siblings) => siblings.number > 20 || siblings.enableTest === true,
},
},
{
name: 'nestedConditions',
type: 'text',
label: 'Number is either greater than 20 AND enableTest is checked, OR number is less than 20 and enableTest is NOT checked',
admin: {
condition: (_, siblings) => (siblings.number > 20 && siblings.enableTest === true) || (siblings.number < 20 && siblings.enableTest === false),
},
},
{
name: 'blocks',
label: 'Blocks',
labels: {
singular: 'Block',
plural: 'Blocks',
},
type: 'blocks',
blocks: [Email, NumberBlock, Quote, CallToAction],
required: true,
admin: {
condition: (_, siblings) => siblings?.enableTest === true,
},
},
],
};
export default Conditions;

View File

@@ -1,5 +0,0 @@
import React from 'react';
const Cell: React.FC = () => <div className="description">fake description cell</div>;
export default Cell;

View File

@@ -1,5 +0,0 @@
import React from 'react';
const Description: React.FC = () => <div className="description">fake description field</div>;
export default Description;

View File

@@ -1,3 +0,0 @@
.custom-description-filter {
background: lightgray;
}

View File

@@ -1,15 +0,0 @@
import React from 'react';
import { Props } from './types';
import './index.scss';
const Filter: React.FC<Props> = ({ onChange, value }) => (
<input
className="custom-description-filter"
type="text"
onChange={(e) => onChange(e.target.value)}
value={value}
/>
);
export default Filter;

View File

@@ -1,4 +0,0 @@
export type Props = {
value?: string
onChange?: (value: string) => void
}

View File

@@ -1,19 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Group } from '../../../../../../../components/forms';
const CustomGroup: React.FC = (props) => (
<div className="custom-group">
<Group {...props} />
</div>
);
CustomGroup.defaultProps = {
value: '',
};
CustomGroup.propTypes = {
value: PropTypes.string,
};
export default CustomGroup;

View File

@@ -1,5 +0,0 @@
import React from 'react';
const NestedArrayCustomField = () => <div className="nested-array-custom-field">Nested array custom field</div>;
export default NestedArrayCustomField;

View File

@@ -1,5 +0,0 @@
import React from 'react';
const NestedGroupCustomField = () => <div className="nested-group-custom-field">Nested group custom field</div>;
export default NestedGroupCustomField;

View File

@@ -1,5 +0,0 @@
import React from 'react';
const NestedText1 = () => <div className="nested-text-1">Nested Text 1</div>;
export default NestedText1;

View File

@@ -1,5 +0,0 @@
$color: purple;
.custom-list {
color: $color;
}

View File

@@ -1,14 +0,0 @@
import React from 'react';
import DefaultList from '../../../../../../src/admin/components/views/collections/List/Default';
import './index.scss';
const CustomListView: React.FC = (props) => (
<div className="custom-list">
<p>This is a custom Pages list view</p>
<p>Sup</p>
<DefaultList {...props} />
</div>
);
export default CustomListView;

View File

@@ -1,120 +0,0 @@
import { CollectionConfig } from '../../../src/collections/config/types';
import DescriptionField from './components/fields/Description/Field';
import DescriptionCell from './components/fields/Description/Cell';
import DescriptionFilter from './components/fields/Description/Filter';
import NestedArrayField from './components/fields/NestedArrayCustomField/Field';
import GroupField from './components/fields/Group/Field';
import NestedGroupField from './components/fields/NestedGroupCustomField/Field';
import NestedText1Field from './components/fields/NestedText1/Field';
import ListView from './components/views/List';
import CustomDescriptionComponent from '../../customComponents/Description';
const CustomComponents: CollectionConfig = {
slug: 'custom-components',
labels: {
singular: 'Custom Component',
plural: 'Custom Components',
},
fields: [
{
name: 'title',
label: 'Title',
type: 'text',
maxLength: 100,
required: true,
unique: true,
localized: true,
},
{
name: 'description',
label: 'Description',
type: 'textarea',
required: true,
localized: true,
admin: {
components: {
Field: DescriptionField,
Cell: DescriptionCell,
Filter: DescriptionFilter,
},
},
},
{
name: 'componentDescription',
label: 'Component ViewDescription',
type: 'text',
admin: {
description: CustomDescriptionComponent,
},
},
{
name: 'array',
label: 'Array',
type: 'array',
fields: [
{
type: 'text',
name: 'nestedArrayCustomField',
label: 'Nested Array Custom Field',
admin: {
components: {
Field: NestedArrayField,
},
},
},
],
},
{
name: 'group',
label: 'Group',
type: 'group',
admin: {
components: {
Field: GroupField,
},
},
fields: [
{
type: 'text',
name: 'nestedGroupCustomField',
label: 'Nested Group Custom Field',
admin: {
components: {
Field: NestedGroupField,
},
},
},
],
},
{
type: 'row',
fields: [
{
name: 'nestedText1',
label: 'Nested Text 1',
type: 'text',
admin: {
components: {
Field: NestedText1Field,
},
},
}, {
name: 'nestedText2',
label: 'Nested Text 2',
type: 'text',
},
],
},
],
timestamps: true,
admin: {
useAsTitle: 'title',
components: {
views: {
List: ListView,
},
},
},
};
export default CustomComponents;

View File

@@ -1,22 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const CustomID: CollectionConfig = {
slug: 'custom-id',
labels: {
singular: 'CustomID',
plural: 'CustomIDs',
},
fields: [
{
name: 'id',
type: 'number',
},
{
name: 'name',
type: 'text',
required: true,
},
],
};
export default CustomID;

View File

@@ -1,287 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import checkRole from '../access/checkRole';
import Email from '../blocks/Email';
import Quote from '../blocks/Quote';
import NumberBlock from '../blocks/Number';
import CallToAction from '../blocks/CallToAction';
const DefaultValues: CollectionConfig = {
slug: 'default-values',
labels: {
singular: 'Default Value Test',
plural: 'Default Value Tests',
},
admin: {
useAsTitle: 'text',
},
access: {
read: () => true,
},
fields: [
{
name: 'text',
type: 'text',
label: 'Text',
defaultValue: 'Default Value',
unique: true,
access: {
create: ({ req: { user } }) => checkRole(['admin'], user),
update: ({ req: { user } }) => checkRole(['admin'], user),
read: ({ req: { user } }) => Boolean(user),
},
},
{
name: 'image',
type: 'upload',
label: 'Image',
relationTo: 'media',
},
{
name: 'select',
label: 'Select',
type: 'select',
options: [{
value: 'option-1',
label: 'Option 1 Label',
}, {
value: 'option-2',
label: 'Option 2 Label',
}, {
value: 'option-3',
label: 'Option 3 Label',
}, {
value: 'option-4',
label: 'Option 4 Label',
}],
defaultValue: 'option-1',
},
{
name: 'selectMany',
label: 'Select w/ hasMany',
type: 'select',
options: [{
value: 'option-1',
label: 'Option 1 Label',
}, {
value: 'option-2',
label: 'Option 2 Label',
}, {
value: 'option-3',
label: 'Option 3 Label',
}, {
value: 'option-4',
label: 'Option 4 Label',
}],
defaultValue: ['option-1', 'option-4'],
hasMany: true,
},
{
name: 'radioGroupExample',
label: 'Radio Group Example',
type: 'radio',
options: [{
value: 'option-1',
label: 'Options 1 Label',
}, {
value: 'option-2',
label: 'Option 2 Label',
}, {
value: 'option-3',
label: 'Option 3 Label',
}],
defaultValue: 'option-2',
},
{
type: 'row',
fields: [
{
name: 'email',
label: 'Email',
type: 'email',
defaultValue: 'some@email.com',
}, {
name: 'number',
label: 'Number',
type: 'number',
defaultValue: 5,
},
],
},
{
type: 'group',
label: 'Group',
name: 'group',
defaultValue: {
nestedText1: 'neat',
},
fields: [
{
type: 'row',
fields: [
{
name: 'nestedText1',
label: 'Nested Text 1',
type: 'text',
defaultValue: 'nested default text 1',
}, {
name: 'nestedText2',
label: 'Nested Text 2',
type: 'text',
defaultValue: 'nested default text 2',
},
],
},
],
},
{
type: 'array',
label: 'Array',
name: 'array',
admin: {
readOnly: true,
},
defaultValue: [
{
arrayText1: 'Get out',
},
],
fields: [
{
type: 'row',
fields: [
{
name: 'arrayText1',
label: 'Array Text 1',
type: 'text',
admin: {
width: '50%',
},
defaultValue: 'default array text',
},
{
name: 'arrayText2',
label: 'Array Text 2',
type: 'text',
admin: {
width: '50%',
},
access: {
read: ({ req: { user } }) => Boolean(user),
update: ({ req: { user } }) => checkRole(['admin'], user),
},
},
],
},
{
type: 'text',
name: 'arrayText3',
label: 'Array Text 3',
admin: {
readOnly: true,
},
},
{
name: 'checkbox',
label: 'Checkbox',
type: 'checkbox',
defaultValue: true,
},
],
},
{
type: 'blocks',
label: 'Blocks Content',
name: 'blocks',
labels: {
singular: 'Block',
plural: 'Blocks',
},
blocks: [Email, NumberBlock, Quote, CallToAction],
localized: true,
admin: {
readOnly: true,
},
defaultValue: [
{
blockType: 'email',
testEmail: 'dev@payloadcms.com',
},
],
},
{
type: 'relationship',
label: 'Relationship to One Collection',
name: 'relationship',
relationTo: 'conditions',
},
{
type: 'relationship',
label: 'Relationship hasMany',
name: 'relationshipHasMany',
relationTo: 'localized-posts',
hasMany: true,
},
{
type: 'relationship',
label: 'Relationship to Multiple Collections',
name: 'relationshipMultipleCollections',
relationTo: ['localized-posts', 'conditions'],
},
{
type: 'textarea',
label: 'Textarea',
name: 'textarea',
defaultValue: 'my textarea text',
},
{
name: 'slug',
type: 'text',
label: 'Slug',
admin: {
position: 'sidebar',
},
localized: true,
unique: true,
defaultValue: 'my-slug',
},
{
name: 'checkbox',
type: 'checkbox',
label: 'Checkbox',
admin: {
position: 'sidebar',
},
defaultValue: true,
},
{
name: 'richText',
type: 'richText',
label: 'Rich Text',
admin: {
elements: [
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'blockquote',
'ul',
'ol',
'link',
],
leaves: [
'bold',
'italic',
'underline',
'strikethrough',
],
},
defaultValue: [{
children: [{ text: 'Cookin now' }],
}],
},
],
timestamps: true,
};
export default DefaultValues;

View File

@@ -1,70 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import checkRole from '../access/checkRole';
const access = ({ req: { user } }) => {
const isAdmin = checkRole(['admin'], user);
if (isAdmin) {
return true;
}
if (user) {
return {
owner: {
equals: user.id,
},
};
}
return false;
};
const Files: CollectionConfig = {
slug: 'files',
labels: {
singular: 'File',
plural: 'Files',
},
upload: {
staticURL: '/files',
staticDir: './files',
},
access: {
create: () => true,
read: access,
update: access,
delete: access,
},
fields: [
{
name: 'type',
label: 'Type',
type: 'select',
options: [{
value: 'Type 1',
label: 'Type 1 Label',
}, {
value: 'Type 2',
label: 'Type 2 Label',
}, {
value: 'Type 3',
label: 'Type 3 Label',
}],
defaultValue: 'Type 1',
required: true,
},
{
name: 'owner',
label: 'Owner',
type: 'relationship',
relationTo: 'admins',
required: true,
},
],
timestamps: true,
admin: {
useAsTitle: 'filename',
},
};
export default Files;

View File

@@ -1,35 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const HiddenFields: CollectionConfig = {
slug: 'hidden-fields',
labels: {
singular: 'Hidden Fields',
plural: 'Hidden Fields',
},
fields: [
{
name: 'title',
type: 'text',
label: 'Title - Not Hidden',
required: true,
},
{
name: 'hiddenAdmin',
type: 'text',
label: 'Hidden on Admin',
admin: {
hidden: true,
},
required: true,
},
{
name: 'hiddenAPI',
type: 'text',
label: 'Hidden on API',
hidden: true,
required: true, // this should not matter
},
],
};
export default HiddenFields;

View File

@@ -1,95 +0,0 @@
/* eslint-disable no-param-reassign */
import { CollectionConfig } from '../../src/collections/config/types';
const Hooks: CollectionConfig = {
slug: 'hooks',
labels: {
singular: 'Hook',
plural: 'Hooks',
},
admin: {
useAsTitle: 'title',
},
access: {
create: () => true,
read: () => true,
update: () => true,
delete: () => true,
},
hooks: {
beforeRead: [
(operation) => {
if (operation.req.headers.hook === 'beforeRead') {
console.log('before reading Hooks document');
}
},
],
beforeChange: [
(operation) => {
if (operation.req.headers.hook === 'beforeChange') {
operation.data.description += '-beforeChangeSuffix';
}
return operation.data;
},
],
beforeDelete: [
(operation) => {
if (operation.req.headers.hook === 'beforeDelete') {
// TODO: Find a better hook operation to assert against in tests
operation.req.headers.hook = 'afterDelete';
}
},
],
afterRead: [
(operation) => {
const { doc } = operation;
doc.afterReadHook = true;
return doc;
},
],
afterChange: [
(operation) => {
if (operation.req.headers.hook === 'afterChange') {
operation.doc.afterChangeHook = true;
}
return operation.doc;
},
],
afterDelete: [
(operation) => {
if (operation.req.headers.hook === 'afterDelete') {
operation.doc.afterDeleteHook = true;
}
return operation.doc;
},
],
},
fields: [
{
name: 'title',
label: 'Title',
type: 'text',
maxLength: 100,
required: true,
unique: true,
localized: true,
hooks: {
afterRead: [
({ value }) => (value ? value.toUpperCase() : null),
],
},
},
{
name: 'description',
label: 'Description',
type: 'textarea',
required: true,
localized: true,
},
],
timestamps: true,
};
export default Hooks;

View File

@@ -1,38 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const LocalOperations: CollectionConfig = {
slug: 'local-operations',
labels: {
singular: 'Local Operation',
plural: 'Local Operations',
},
hooks: {
afterRead: [
async ({ req, doc }) => {
const formattedData = { ...doc };
const localizedPosts = await req.payload.find({
collection: 'localized-posts',
});
const blocksGlobal = await req.payload.findGlobal({
slug: 'blocks-global',
});
formattedData.localizedPosts = localizedPosts;
formattedData.blocksGlobal = blocksGlobal;
return formattedData;
},
],
},
fields: [
{
name: 'title',
type: 'text',
label: 'title',
required: true,
},
],
};
export default LocalOperations;

View File

@@ -1,142 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import { PayloadRequest } from '../../src/express/types';
import { Block } from '../../src/fields/config/types';
const validateLocalizationTransform = (hook: string, value, req: PayloadRequest) => {
if (req.locale !== 'all' && value !== undefined && typeof value !== 'string') {
console.error(hook, value);
throw new Error('Locale transformation should happen before hook is called');
}
return value;
};
const RichTextBlock: Block = {
slug: 'richTextBlock',
labels: {
singular: 'Rich Text Block',
plural: 'Rich Text Blocks',
},
fields: [
{
name: 'content',
localized: true,
type: 'richText',
admin: {
hideGutter: true,
},
},
],
};
const LocalizedPosts: CollectionConfig = {
slug: 'localized-posts',
labels: {
singular: 'Localized Post',
plural: 'Localized Posts',
},
admin: {
useAsTitle: 'title',
defaultColumns: [
'title',
'priority',
'createdAt',
],
enableRichTextRelationship: true,
},
access: {
read: () => true,
},
fields: [
{
name: 'title',
label: 'Title',
type: 'text',
maxLength: 100,
required: true,
unique: true,
localized: true,
hooks: {
beforeValidate: [({ value, req }) => validateLocalizationTransform('beforeValidate', value, req)],
beforeChange: [({ value, req }) => validateLocalizationTransform('beforeChange', value, req)],
afterChange: [({ value, req }) => validateLocalizationTransform('afterChange', value, req)],
afterRead: [({ value, req }) => validateLocalizationTransform('afterRead', value, req)],
},
},
{
name: 'summary',
label: 'Summary',
type: 'text',
index: true,
},
{
name: 'description',
label: 'Description',
type: 'textarea',
required: true,
localized: true,
},
{
type: 'richText',
name: 'richText',
label: 'Rich Text',
},
{
name: 'priority',
label: 'Priority',
type: 'number',
required: true,
localized: true,
},
{
name: 'localizedGroup',
label: 'Localized Group',
type: 'group',
localized: true,
fields: [
{
type: 'text',
name: 'text',
label: 'Text',
},
],
},
{
name: 'nonLocalizedGroup',
label: 'Non-Localized Group',
type: 'group',
fields: [
{
type: 'text',
name: 'text',
label: 'Text',
localized: true,
},
],
},
{
type: 'array',
label: 'Non-Localized Array',
name: 'nonLocalizedArray',
maxRows: 3,
fields: [
{
type: 'text',
name: 'localizedEmbeddedText',
label: 'Localized Embedded Text',
localized: true,
},
],
},
{
label: 'Blocks',
name: 'richTextBlocks',
type: 'blocks',
blocks: [
RichTextBlock,
],
},
],
timestamps: true,
};
export default LocalizedPosts;

View File

@@ -1,79 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import { FieldAccess } from '../../src/fields/config/types';
import checkRole from '../access/checkRole';
const PublicReadabilityAccess: FieldAccess = ({ req: { user }, siblingData }) => {
if (checkRole(['admin'], user)) {
return true;
}
if (siblingData?.allowPublicReadability) return true;
return false;
};
const LocalizedArrays: CollectionConfig = {
slug: 'localized-arrays',
labels: {
singular: 'Localized Array',
plural: 'Localized Arrays',
},
access: {
read: () => true,
},
fields: [
{
type: 'array',
label: false,
name: 'array',
localized: true,
required: true,
minRows: 2,
maxRows: 4,
fields: [
{
type: 'row',
fields: [
{
name: 'allowPublicReadability',
label: 'Allow Public Readability',
type: 'checkbox',
},
{
name: 'arrayText1',
label: 'Array Text 1',
type: 'text',
required: true,
admin: {
width: '50%',
},
access: {
read: PublicReadabilityAccess,
},
},
{
name: 'arrayText2',
label: 'Array Text 2',
type: 'text',
required: true,
admin: {
width: '50%',
},
},
],
},
{
type: 'text',
name: 'arrayText3',
label: 'Array Text 3',
admin: {
readOnly: true,
},
},
],
},
],
timestamps: true,
};
export default LocalizedArrays;

View File

@@ -1,78 +0,0 @@
import { CollectionConfig, BeforeChangeHook } from '../../src/collections/config/types';
const checkForUploadSizesHook: BeforeChangeHook = ({ req: { payloadUploadSizes }, data }) => {
if (typeof payloadUploadSizes === 'object') {
return {
...data,
foundUploadSizes: true,
};
}
return data;
};
const Media: CollectionConfig = {
slug: 'media',
labels: {
singular: 'Media',
plural: 'Media',
},
access: {
read: () => true,
},
admin: {
enableRichTextRelationship: true,
description: 'No selfies please',
},
hooks: {
beforeChange: [
checkForUploadSizesHook,
],
},
upload: {
staticURL: '/media',
staticDir: './media',
adminThumbnail: ({ doc }) => `/media/${doc.filename}`,
imageSizes: [
{
name: 'maintainedAspectRatio',
width: 1024,
height: null,
crop: 'center',
},
{
name: 'tablet',
width: 640,
height: 480,
crop: 'left top',
},
{
name: 'mobile',
width: 320,
height: 240,
crop: 'left top',
},
{
name: 'icon',
width: 16,
height: 16,
},
],
},
fields: [
{
name: 'alt',
label: 'Alt Text',
type: 'text',
required: true,
localized: true,
},
{
name: 'foundUploadSizes',
type: 'checkbox',
},
],
timestamps: true,
};
export default Media;

View File

@@ -1,71 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const NestedArray: CollectionConfig = {
slug: 'nested-arrays',
labels: {
singular: 'Nested Array',
plural: 'Nested Arrays',
},
access: {
read: () => true,
},
fields: [
{
type: 'array',
label: 'Array',
name: 'array',
labels: {
singular: 'Parent Row',
plural: 'Parent Rows',
},
required: true,
minRows: 2,
maxRows: 4,
fields: [
{
name: 'parentIdentifier',
label: 'Parent Identifier',
defaultValue: ' ',
type: 'text',
required: true,
},
{
type: 'array',
name: 'nestedArray',
labels: {
singular: 'Child Row',
plural: 'Child Rows',
},
required: true,
fields: [
{
name: 'childIdentifier',
label: 'Child Identifier',
type: 'text',
required: true,
},
{
type: 'array',
name: 'deeplyNestedArray',
labels: {
singular: 'Grandchild Row',
plural: 'Grandchild Rows',
},
required: true,
fields: [
{
name: 'grandchildIdentifier',
label: 'Grandchild Identifier',
type: 'text',
},
],
},
],
},
],
},
],
timestamps: true,
};
export default NestedArray;

View File

@@ -1,34 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const Preview: CollectionConfig = {
slug: 'previewable-post',
labels: {
singular: 'Previewable Post',
plural: 'Previewable Posts',
},
admin: {
useAsTitle: 'title',
preview: (doc, { token }) => {
const { title } = doc;
if (title) {
return `http://localhost:3000/previewable-posts/${title}?preview=true&token=${token}`;
}
return null;
},
},
fields: [
{
name: 'title',
label: 'Title',
type: 'text',
maxLength: 100,
required: true,
unique: true,
localized: true,
},
],
timestamps: true,
};
export default Preview;

View File

@@ -1,61 +0,0 @@
import checkRole from '../access/checkRole';
import { CollectionConfig } from '../../src/collections/config/types';
const access = ({ req: { user } }) => checkRole(['admin'], user);
const PublicUsers: CollectionConfig = {
slug: 'public-users',
labels: {
singular: 'Public User',
plural: 'Public Users',
},
admin: {
useAsTitle: 'email',
},
access: {
admin: () => false,
create: () => true,
read: () => true,
update: ({ req: { user } }) => {
if (checkRole(['admin'], user)) {
return true;
}
if (user) {
return {
id: user.id,
};
}
return false;
},
delete: ({ req: { user } }) => checkRole(['admin'], user),
},
auth: {
tokenExpiration: 300,
verify: true,
maxLoginAttempts: 5,
lockTime: 600 * 1000, // lock time in ms
cookies: {
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
domain: undefined,
},
},
fields: [
{
name: 'adminOnly',
label: 'This field should only be readable and editable by Admins with "admin" role',
type: 'text',
defaultValue: 'test',
access: {
create: access,
read: access,
update: access,
},
},
],
timestamps: true,
};
export default PublicUsers;

View File

@@ -1,64 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const RelationshipA: CollectionConfig = {
slug: 'relationship-a',
access: {
read: () => true,
},
labels: {
singular: 'Relationship A',
plural: 'Relationship A',
},
fields: [
{
name: 'post',
label: 'Post',
type: 'relationship',
relationTo: 'relationship-b',
localized: true,
},
{
name: 'LocalizedPost',
label: 'Localized Post',
type: 'relationship',
relationTo: 'localized-posts',
hasMany: true,
localized: true,
},
{
name: 'postLocalizedMultiple',
label: 'Localized Post Multiple',
type: 'relationship',
relationTo: ['localized-posts', 'all-fields', 'custom-id'],
hasMany: true,
localized: true,
},
{
name: 'postManyRelationships',
label: 'Post Many Relationships',
type: 'relationship',
relationTo: ['relationship-b'],
localized: true,
hasMany: false,
},
{
name: 'postMaxDepth',
maxDepth: 0,
label: 'Post With MaxDepth',
type: 'relationship',
relationTo: 'relationship-b',
hasMany: false,
},
{
name: 'customID',
label: 'CustomID Relation',
type: 'relationship',
relationTo: 'custom-id',
hasMany: true,
localized: true,
},
],
timestamps: true,
};
export default RelationshipA;

View File

@@ -1,40 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const RelationshipB: CollectionConfig = {
slug: 'relationship-b',
access: {
read: () => true,
},
labels: {
singular: 'Relationship B',
plural: 'Relationship B',
},
fields: [
{
name: 'post',
label: 'Post',
type: 'relationship',
relationTo: 'relationship-a',
localized: false,
hasMany: true,
},
{
name: 'postManyRelationships',
label: 'Post Many Relationships',
type: 'relationship',
relationTo: ['relationship-a', 'media'],
localized: true,
hasMany: false,
},
{
name: 'localizedPosts',
label: 'Localized Posts',
type: 'relationship',
hasMany: true,
relationTo: ['localized-posts', 'previewable-post'],
},
],
timestamps: true,
};
export default RelationshipB;

View File

@@ -1,41 +0,0 @@
import Button from '../client/components/richText/elements/Button';
import PurpleBackground from '../client/components/richText/leaves/PurpleBackground';
import { CollectionConfig } from '../../src/collections/config/types';
const RichText: CollectionConfig = {
slug: 'rich-text',
labels: {
singular: 'Rich Text',
plural: 'Rich Texts',
},
access: {
read: () => true,
},
fields: [
{
name: 'defaultRichText',
type: 'richText',
label: 'Default Rich Text',
required: true,
},
{
name: 'customRichText',
type: 'richText',
label: 'Customized Rich Text',
required: true,
admin: {
elements: [
'h2',
'h3',
Button,
],
leaves: [
'bold',
PurpleBackground,
],
},
},
],
};
export default RichText;

View File

@@ -1,70 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const Select: CollectionConfig = {
slug: 'select',
labels: {
singular: 'Select',
plural: 'Selects',
},
fields: [
{
name: 'Select',
type: 'select',
options: [{
value: 'one',
label: 'One',
}, {
value: 'two',
label: 'Two',
}, {
value: 'three',
label: 'Three',
}],
label: 'Select From',
required: true,
},
{
name: 'SelectHasMany',
type: 'select',
options: [{
value: 'one',
label: 'One',
}, {
value: 'two',
label: 'Two',
}, {
value: 'three',
label: 'Three',
}],
label: 'Select HasMany',
required: true,
hasMany: true,
},
{
name: 'SelectJustStrings',
type: 'select',
options: ['blue', 'green', 'yellow'],
label: 'Select Just Strings',
required: true,
hasMany: true,
},
{
name: 'Radio',
type: 'radio',
options: [{
value: 'one',
label: 'One',
}, {
value: 'two',
label: 'Two',
}, {
value: 'three',
label: 'Three',
}],
label: 'Choose From',
required: true,
},
],
};
export default Select;

View File

@@ -1,76 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
import checkRole from '../access/checkRole';
const StrictAccess: CollectionConfig = {
slug: 'strict-access',
labels: {
singular: 'Strict Access',
plural: 'Strict Access',
},
admin: {
useAsTitle: 'email',
},
access: {
create: () => true,
read: ({ req: { user } }) => {
if (checkRole(['admin'], user)) {
return true;
}
if (user) {
return {
owner: {
equals: user.id,
},
};
}
return false;
},
update: ({ req: { user } }) => {
if (checkRole(['admin'], user)) {
return true;
}
if (user) {
return {
owner: {
equals: user.id,
},
};
}
return false;
},
delete: ({ req: { user } }) => checkRole(['admin'], user),
},
fields: [
{
name: 'address',
type: 'text',
label: 'Address',
required: true,
},
{
name: 'city',
type: 'text',
label: 'City',
required: true,
},
{
name: 'state',
type: 'text',
label: 'State',
required: true,
},
{
name: 'zip',
type: 'number',
label: 'ZIP Code',
required: true,
},
],
timestamps: true,
};
export default StrictAccess;

View File

@@ -1,25 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const Uniques: CollectionConfig = {
slug: 'uniques',
labels: {
singular: 'Unique',
plural: 'Uniques',
},
fields: [
{
name: 'title',
type: 'text',
label: 'Title',
required: true,
unique: true,
},
{
name: 'description',
type: 'textarea',
label: 'Description',
},
],
};
export default Uniques;

View File

@@ -1,35 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const UnstoredMedia: CollectionConfig = {
slug: 'unstored-media',
labels: {
singular: 'Unstored Media',
plural: 'Unstored Media',
},
access: {
read: () => true,
},
upload: {
staticURL: '/unstored-media',
disableLocalStorage: true,
imageSizes: [
{
name: 'tablet',
width: 640,
height: 480,
crop: 'left top',
},
],
},
fields: [
{
name: 'alt',
label: 'Alt Text',
type: 'text',
required: true,
localized: true,
},
],
};
export default UnstoredMedia;

View File

@@ -1,113 +0,0 @@
import { CollectionConfig } from '../../src/collections/config/types';
const Validations: CollectionConfig = {
slug: 'validations',
labels: {
singular: 'Validation',
plural: 'Validations',
},
access: {
read: () => true,
},
fields: [
{
name: 'text',
type: 'text',
label: 'Text',
required: true,
validate: (value) => {
const result = value === 'test';
if (!result) {
return 'The only accepted value of this field is "test".';
}
return true;
},
},
{
type: 'row',
fields: [
{
name: 'lessThan10',
label: 'Less than 10',
type: 'number',
required: true,
validate: (value) => {
const result = parseInt(value, 10) < 10;
if (!result) {
return 'The value of this field needs to be less than 10.';
}
return true;
},
}, {
name: 'greaterThan10LessThan50',
label: 'Greater than 10, Less than 50',
type: 'number',
required: true,
min: 10,
max: 50,
},
],
},
{
type: 'array',
label: 'Should have at least 3 rows',
name: 'atLeast3Rows',
required: true,
validate: (value) => {
const result = value && value.length >= 3;
if (!result) {
return 'This array needs to have at least 3 rows.';
}
return true;
},
fields: [
{
type: 'number',
name: 'greaterThan30',
label: 'Number should be greater than 30',
required: true,
validate: (value) => {
const result = value > 30;
if (!result) {
return 'This value of this field needs to be greater than 30.';
}
return true;
},
},
],
},
{
type: 'array',
label: 'Default array validation',
name: 'array',
required: true,
fields: [
{
type: 'number',
name: 'lessThan20',
label: 'Number should be less than 20',
required: true,
validate: (value) => {
const result = value < 30;
if (!result) {
return 'This value of this field needs to be less than 20.';
}
return true;
},
},
],
},
],
};
export default Validations;

View File

@@ -1,15 +0,0 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="application-name" content="My Payload Application" />
</head>
<body>
<div id="app"></div>
<div id="portal"></div>
</body>
</html>

View File

@@ -1,9 +0,0 @@
import React from 'react';
const CollectionDescription: React.FC = () => (
<div>
Collection description
</div>
);
export default CollectionDescription;

View File

@@ -1,11 +0,0 @@
import React from 'react';
const CustomDescriptionComponent: React.FC = ({ value }) => (
<div>
Character count:
{' '}
{ value?.length || 0 }
</div>
);
export default CustomDescriptionComponent;

View File

@@ -1,5 +0,0 @@
import React from 'react';
const CustomAccountView: React.FC = () => <div>fake account view</div>;
export default CustomAccountView;

View File

@@ -1,5 +0,0 @@
import React from 'react';
const CustomDashboardView: React.FC = () => <div>fake dashboard view</div>;
export default CustomDashboardView;

View File

@@ -1,22 +0,0 @@
import checkRole from '../access/checkRole';
import Quote from '../blocks/Quote';
import CallToAction from '../blocks/CallToAction';
import { GlobalConfig } from '../../src/globals/config/types';
export default {
slug: 'blocks-global',
label: 'Blocks Global',
access: {
update: ({ req: { user } }) => checkRole(['admin'], user),
read: () => true,
},
fields: [
{
name: 'blocks',
label: 'Blocks',
type: 'blocks',
blocks: [Quote, CallToAction],
localized: true,
},
],
} as GlobalConfig;

View File

@@ -1,35 +0,0 @@
import { GlobalConfig } from '../../src/globals/config/types';
import checkRole from '../access/checkRole';
export default {
slug: 'global-with-access',
label: 'Global with Strict Access',
access: {
update: ({ req: { user } }) => checkRole(['admin'], user),
read: ({ req: { user } }) => checkRole(['admin'], user),
},
fields: [
{
name: 'title',
label: 'Site Title',
type: 'text',
maxLength: 100,
required: true,
},
{
name: 'relationship',
label: 'Test Relationship',
type: 'relationship',
relationTo: 'localized-posts',
hasMany: true,
required: true,
},
{
name: 'singleRelationship',
label: 'Test Single Relationship',
type: 'relationship',
relationTo: 'localized-posts',
required: true,
},
],
} as GlobalConfig;

View File

@@ -1,30 +0,0 @@
import { GlobalConfig } from '../../src/globals/config/types';
import checkRole from '../access/checkRole';
export default {
slug: 'navigation-array',
access: {
update: ({ req: { user } }) => checkRole(['admin', 'user'], user),
read: () => true,
},
admin: {
description: 'A description for the editor',
},
fields: [
{
name: 'array',
label: 'Array',
type: 'array',
localized: true,
fields: [{
name: 'text',
label: 'Text',
type: 'text',
}, {
name: 'textarea',
label: 'Textarea',
type: 'textarea',
}],
},
],
} as GlobalConfig;

View File

@@ -1,14 +0,0 @@
const babelConfig = require('../babel.config');
require('@babel/register')({
...babelConfig,
extensions: ['.ts', '.tsx', '.js', '.jsx'],
env: {
development: {
sourceMaps: 'inline',
retainLines: true,
},
},
});
require('./server.ts');

View File

@@ -1,143 +0,0 @@
import path from 'path';
import { buildConfig } from '../src/config/build';
import Admin from './collections/Admin';
import AllFields from './collections/AllFields';
import AutoLabel from './collections/AutoLabel';
import Code from './collections/Code';
import Conditions from './collections/Conditions';
import CustomComponents from './collections/CustomComponents';
import File from './collections/File';
import Blocks from './collections/Blocks';
import CustomID from './collections/CustomID';
import DefaultValues from './collections/DefaultValues';
import HiddenFields from './collections/HiddenFields';
import Hooks from './collections/Hooks';
import Localized from './collections/Localized';
import LocalizedArray from './collections/LocalizedArray';
import LocalOperations from './collections/LocalOperations';
import Media from './collections/Media';
import NestedArrays from './collections/NestedArrays';
import Preview from './collections/Preview';
import PublicUsers from './collections/PublicUsers';
import RelationshipA from './collections/RelationshipA';
import RelationshipB from './collections/RelationshipB';
import RichText from './collections/RichText';
import Select from './collections/Select';
import StrictPolicies from './collections/StrictPolicies';
import Validations from './collections/Validations';
import Uniques from './collections/Uniques';
import Geolocation from './collections/Geolocation';
import BlocksGlobal from './globals/BlocksGlobal';
import NavigationArray from './globals/NavigationArray';
import GlobalWithStrictAccess from './globals/GlobalWithStrictAccess';
import UnstoredMedia from './collections/UnstoredMedia';
export default buildConfig({
cookiePrefix: 'payload',
serverURL: 'http://localhost:3000',
admin: {
user: 'admins',
indexHTML: path.resolve(__dirname, './client/index.html'),
// meta: {
// titleSuffix: '- Payload Demo',
// // ogImage: '/static/find-image-here.jpg',
// // favicon: '/img/whatever.png',
// },
disable: false,
scss: path.resolve(__dirname, './client/scss/overrides.scss'),
components: {
// Nav: () => (
// <div>Hello</div>
// ),
views: {
// Dashboard: CustomDashboardView,
// Account: CustomAccountView,
},
},
webpack: (config) => config,
},
collections: [
Admin,
AllFields,
AutoLabel,
Code,
Conditions,
CustomComponents,
CustomID,
File,
DefaultValues,
Blocks,
HiddenFields,
Hooks,
Localized,
LocalizedArray,
LocalOperations,
Media,
NestedArrays,
Preview,
PublicUsers,
RelationshipA,
RelationshipB,
RichText,
Select,
StrictPolicies,
Validations,
Uniques,
UnstoredMedia,
Geolocation,
],
globals: [
NavigationArray,
GlobalWithStrictAccess,
BlocksGlobal,
],
cors: [
'http://localhost',
'http://localhost:3000',
'http://localhost:8080',
'http://localhost:8081',
],
csrf: [
'http://localhost:3000',
'https://other-app-here.com',
],
routes: {
api: '/api',
admin: '/admin',
graphQL: '/graphql',
graphQLPlayground: '/graphql-playground',
},
defaultDepth: 2,
graphQL: {
maxComplexity: 1000,
disablePlaygroundInProduction: false,
disable: false,
},
// rateLimit: {
// window: 15 * 60 * 100,
// max: 100,
// trustProxy: true,
// skip: (req) => req.ip === '127.0.0.1',
// },
maxDepth: 10,
localization: {
locales: [
'en',
'es',
],
defaultLocale: 'en',
fallback: true,
},
hooks: {
afterError: (err) => {
console.error('global error config handler', err);
},
},
upload: {
limits: {
fileSize: 10000000, // 10MB
},
},
});

View File

@@ -1,40 +0,0 @@
/* eslint-disable no-console */
import express from 'express';
import path from 'path';
import payload from '../src';
const expressApp = express();
expressApp.use('/static', express.static(path.resolve(__dirname, 'client/static')));
payload.init({
secret: 'SECRET_KEY',
mongoURL: 'mongodb://localhost/payload',
express: expressApp,
email: {
fromName: 'Payload',
fromAddress: 'hello@payloadcms.com',
},
onInit: (app) => {
app.logger.info('Payload Demo Initialized');
},
});
const externalRouter = express.Router();
externalRouter.use(payload.authenticate);
externalRouter.get('/', (req, res) => {
if (req.user) {
return res.send(`Authenticated successfully as ${req.user.email}.`);
}
return res.send('Not authenticated');
});
expressApp.use('/external-route', externalRouter);
expressApp.listen(3000, async () => {
payload.logger.info(`Admin URL on ${payload.getAdminURL()}`);
payload.logger.info(`API URL on ${payload.getAPIURL()}`);
});

View File

@@ -27,8 +27,10 @@ If a Collection supports [`Authentication`](/docs/authentication/overview), the
| **[`unlock`](#unlock)** | Used to restrict which users can access the `unlock` operation |
**Example Collection config:**
```js
export default {
```ts
import { CollectionConfig } from 'payload/types';
const Posts: CollectionConfig = {
slug: "posts",
// highlight-start
access: {
@@ -40,56 +42,135 @@ export default {
},
// highlight-end
};
export default Categories;
```
### Create
Returns a boolean which allows/denies access to the `create` request.
**Available argument properties :**
**Available argument properties:**
| Option | Description |
| --------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| Option | Description |
| ---------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| **`data`** | The data passed to create the document with. |
**Example:**
```ts
const PublicUsers = {
slug: 'public-users',
access: {
// highlight-start
// allow guest users to self-registration
create: () => true,
// highlight-end
...
},
fields: [ ... ],
}
```
### Read
Read access functions can return a boolean result or optionally return a [query constraint](/docs/queries/overview) which limits the documents that are returned to only those that match the constraint you provide. This can be helpful to restrict users' access to only certain documents however you specify.
**Available argument properties :**
**Available argument properties:**
| Option | Description |
| --------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| **`id`** | `id` of document requested, if within `findByID`. Otherwise, `id` is undefined. |
| **`id`** | `id` of document requested, if within `findByID` |
**Example:**
```ts
import { Access } from 'payload/config';
const canReadPage: Access = ({ req: { user } }) => {
// allow authenticated users
if (user) {
return true;
}
// using a query constraint, guest users can access when a field named 'isPublic' is set to true
return {
// assumes we have a checkbox field named 'isPublic'
isPublic: {
equals: true,
},
}
};
```
### Update
Update access functions can return a boolean result or optionally return a [query constraint](/docs/queries/overview) to limit the document(s) that can be updated by the currently authenticated user. For example, returning a `query` from the `update` Access Control is helpful in cases where you would like to restrict a user to only being able to update the documents containing a `createdBy` relationship field equal to the user's ID.
**Available argument properties :**
**Available argument properties:**
| Option | Description |
| --------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| **`id`** | `id` of document requested to update |
| Option | Description |
| ---------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| **`id`** | `id` of document requested to update |
| **`data`** | The data passed to update the document with |
**Example:**
```ts
import { Access } from 'payload/config';
const canUpdateUser: Access = ({ req: { user }, id }) => {
// allow users with a role of 'admin'
if (user.roles && user.roles.some(role => role === 'admin')) {
return true;
}
// allow any other users to update only oneself
return user.id === id;
};
```
### Delete
Similarly to the Update function, returns a boolean or a [query constraint](/docs/queries/overview) to limit which documents can be deleted by which users.
**Available argument properties :**
**Available argument properties:**
| Option | Description |
| --------- | ----------- |
| **`req`** | The Express `request` object with additional `user` property, which is the currently logged in user |
| **`id`** | `id` of document requested to delete |
**Example:**
```ts
import { Access } from 'payload/config'
const canDeleteCustomer: Access = async ({ req, id }) => {
if (!id) {
// allow the admin UI to show controls to delete since it is indeterminate without the id
return true;
}
// query another collection using the id
const result = await req.payload.find({
collection: 'contracts',
limit: 0,
depth: 0,
where: {
customer: { equals: id },
},
});
return result.totalDocs === 0;
};
```
### Admin
If the Collection is [used to access the Payload Admin panel](/docs/admin/overview#the-admin-user-collection), the `Admin` Access Control function determines whether or not the currently logged in user can access the admin UI.
**Available argument properties :**
**Available argument properties:**
| Option | Description |
| --------- | ----------- |
@@ -99,7 +180,7 @@ If the Collection is [used to access the Payload Admin panel](/docs/admin/overvi
Determines which users can [unlock](/docs/authentication/operations#unlock) other users who may be blocked from authenticating successfully due to [failing too many login attempts](/docs/authentication/config#options).
**Available argument properties :**
**Available argument properties:**
| Option | Description |
| --------- | ----------- |

View File

@@ -17,8 +17,10 @@ Field Access Control is specified with functions inside a field's config. All fi
| **[`update`](#update)** | Allows or denies the ability to update a field's value |
**Example Collection config:**
```js
export default {
```ts
import { CollectionConfig } from 'payload/types';
const Posts: CollectionConfig = {
slug: 'posts',
fields: [
{
@@ -33,7 +35,7 @@ export default {
// highlight-end
};
],
}
};
```
### Create
@@ -58,7 +60,7 @@ Returns a boolean which allows or denies the ability to read a field's value. If
| ----------------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| **`id`** | `id` of the document being read |
| **`data`** | The full data of the document being read. |
| **`doc`** | The full document data. |
| **`siblingData`** | Immediately adjacent field data of the document being read. |
### Update
@@ -73,3 +75,4 @@ Returns a boolean which allows or denies the ability to update a field's value.
| **`id`** | `id` of the document being updated |
| **`data`** | The full data passed to update the document. |
| **`siblingData`** | Immediately adjacent field data passed to update the document with. |
| **`doc`** | The full document data, before the update is applied. |

View File

@@ -18,21 +18,25 @@ You can define Global-level Access Control within each Global's `access` propert
| **[`update`](#update)** | Used in the `update` Global operation |
**Example Global config:**
```js
export default {
```ts
import { GlobalConfig } from 'payload/types';
const Header: GlobalConfig = {
slug: "header",
// highlight-start
access: {
read: ({ req: { user } }) => { ... },
update: ({ req: { user } }) => { ... },
read: ({ req: { user } }) => { /* */ },
update: ({ req: { user } }) => { /* */ },
},
// highlight-end
};
export default Header;
```
### Read
Returns a boolean result to allow or deny a user's ability to read the Global.
Returns a boolean result or optionally a [query constraint](/docs/queries/overview) which limits who can read this global based on its current properties.
**Available argument properties:**
@@ -42,10 +46,11 @@ Returns a boolean result to allow or deny a user's ability to read the Global.
### Update
Returns a boolean result to allow or deny a user's ability to update the Global.
Returns a boolean result or optionally a [query constraint](/docs/queries/overview) which limits who can update this global based on its current properties.
**Available argument properties:**
| Option | Description |
| --------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| Option | Description |
| ---------- | ----------- |
| **`req`** | The Express `request` object containing the currently authenticated `user` |
| **`data`** | The data passed to update the global with. |

View File

@@ -8,6 +8,11 @@ keywords: overview, access control, permissions, documentation, Content Manageme
Access control within Payload is extremely powerful while remaining easy and intuitive to manage. Declaring who should have access to what documents is no more complex than writing a simple JavaScript function that either returns a `boolean` or a [`query`](/docs/queries/overview) constraint to restrict which documents users can interact with.
<YouTube
id="DoPLyXG26Dg"
title="Overview of Payload Access Control"
/>
**Example use cases:**
- Allowing anyone `read` access to all `Post`s
@@ -23,7 +28,7 @@ Access control within Payload is extremely powerful while remaining easy and int
**Default Access function:**
```js
```ts
const defaultPayloadAccess = ({ req: { user } }) => {
// Return `true` if a user is found
// and `false` if it is undefined or null
@@ -43,3 +48,30 @@ You can manage access within Payload on three different levels:
- [Collections](/docs/access-control/collections)
- [Fields](/docs/access-control/fields)
- [Globals](/docs/access-control/globals)
### When Access Control is Executed
<Banner type="success">
<strong>Note:</strong><br/>
Access control functions are utilized in two places. It's important to understand how and when your access control is executed.
</Banner>
#### As you execute operations
When you perform Payload operations like `create`, `read`, `update`, and `delete`, your access control functions will be executed before any changes or operations are completed.
#### Within the Admin UI
The Payload Admin UI responds dynamically to the access control that you define. For example, if you restrict editing a `ExampleCollection` to only users that feature a `role` of `admin`, the Payload Admin UI will **hide** the `ExampleCollection` from the Admin UI entirely. This is super powerful and allows you to control who can do what with your Admin UI.
To accomplish this, Payload ships with an `Access` operation, which is executed when a user logs into the Admin UI. Payload will execute each one of your access control functions, across all collections, globals, and fields, at the top level and return a response that contains a reflection of what the currently authenticated user can do with your application.
### Argument Availability
<Banner type="warning">
<strong>Important:</strong><br/>
When your access control functions are executed via the <strong>access</strong> operation, the <strong>id</strong> and <strong>data</strong> arguments will be <strong>undefined</strong>, because Payload is executing your functions without referencing a specific document.
</Banner>
If you use `id` or `data` within your access control functions, make sure to check that they are defined first. If they are not, then you can assume that your access control is being executed via the `access` operation, to determine solely what the user can do within the Admin UI.

View File

@@ -11,31 +11,49 @@ While designing the Payload Admin panel, we determined it should be as minimal a
To swap in your own React component, first, consult the list of available component overrides below. Determine the scope that corresponds to what you are trying to accomplish, and then author your React component accordingly.
<Banner type="success">
<strong>Tip:</strong><br/>
Custom components will automatically be provided with all props that the default component would accept.
<strong>Tip:</strong>
<br />
Custom components will automatically be provided with all props that the
default component would accept.
</Banner>
### Base Component Overrides
You can override a set of admin panel-wide components by providing a component to your base Payload config's `admin.components` property. The following options are available:
| Path | Description |
| --------------------- | -------------|
| **`Nav`** | Contains the sidebar and mobile Nav in its entirety. |
| **`views.Account`** | The Account view is used to show the currently logged in user's Account page. |
| **`views.Dashboard`** | The main landing page of the Admin panel. |
| **`graphics.Icon`** | Used as a graphic within the `Nav` component. Often represents a condensed version of a full logo. |
| **`graphics.Logo`** | The full logo to be used in contexts like the `Login` view. |
| Path | Description |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`Nav`** | Contains the sidebar and mobile Nav in its entirety. |
| **`logout.Button`** | A custom React component.
| **`BeforeDashboard`** | Array of components to inject into the built-in Dashboard, _before_ the default dashboard contents. |
| **`AfterDashboard`** | Array of components to inject into the built-in Dashboard, _after_ the default dashboard contents. [Demo](https://github.com/payloadcms/payload/tree/master/test/admin/components/AfterDashboard/index.tsx) |
| **`BeforeLogin`** | Array of components to inject into the built-in Login, _before_ the default login form. |
| **`AfterLogin`** | Array of components to inject into the built-in Login, _after_ the default login form. |
| **`BeforeNavLinks`** | Array of components to inject into the built-in Nav, _before_ the links themselves. |
| **`AfterNavLinks`** | Array of components to inject into the built-in Nav, _after_ the links. |
| **`views.Account`** | The Account view is used to show the currently logged in user's Account page. |
| **`views.Dashboard`** | The main landing page of the Admin panel. |
| **`graphics.Icon`** | Used as a graphic within the `Nav` component. Often represents a condensed version of a full logo. |
| **`graphics.Logo`** | The full logo to be used in contexts like the `Login` view. |
| **`routes`** | Define your own routes to add to the Payload Admin UI. [More](#custom-routes) |
| **`providers`** | Define your own provider components that will wrap the Payload Admin UI. [More](#custom-providers) |
#### Full example:
`payload.config.js`
```js
import { buildConfig } from 'payload/config';
import { MyCustomNav, MyCustomLogo, MyCustomIcon, MyCustomAccount, MyCustomDashboard } from './customComponents.js';
```ts
import { buildConfig } from "payload/config";
import {
MyCustomNav,
MyCustomLogo,
MyCustomIcon,
MyCustomAccount,
MyCustomDashboard,
MyProvider,
} from "./customComponents";
export default buildConfig({
serverURL: 'http://localhost:3000',
admin: {
components: {
Nav: MyCustomNav,
@@ -46,73 +64,190 @@ export default buildConfig({
views: {
Account: MyCustomAccount,
Dashboard: MyCustomDashboard,
}
}
}
})
},
providers: [MyProvider],
},
},
});
```
*For more examples regarding how to customize components, look at the [demo app](https://github.com/payloadcms/payload/tree/master/demo).*
_For more examples regarding how to customize components, look at the following [examples](https://github.com/payloadcms/payload/tree/master/test/admin/components)._
### Collections
You can override components on a Collection-by-Collection basis via each Collection's `admin` property.
| Path | Description |
| ---------------- | -------------|
| **`views.Edit`** | Used while a document within this Collection is being edited. |
| **`views.List`** | The `List` view is used to render a paginated, filterable table of Documents in this Collection. |
| Path | Description |
| ---------------- | ------------------------------------------------------------------------------------------------ |
| **`views.Edit`** | Used while a document within this Collection is being edited. |
| **`views.List`** | The `List` view is used to render a paginated, filterable table of Documents in this Collection. |
### Globals
As with Collections, You can override components on a global-by-global basis via their `admin` property.
| Path | Description |
| ---------------- | -------------|
| **`views.Edit`** | Used while this Global is being edited. |
| Path | Description |
| ---------------- | --------------------------------------- |
| **`views.Edit`** | Used while this Global is being edited. |
### Fields
All Payload fields support the ability to swap in your own React components. So, for example, instead of rendering a default Text input, you might need to render a color picker that provides the editor with a custom color picker interface to restrict the data entered to colors only.
<Banner type="success">
<strong>Tip:</strong><br/>
Don't see a built-in field type that you need? Build it! Using a combination of custom validation and custom components, you can override the entirety of how a component functions within the admin panel and effectively create your own field type.
<strong>Tip:</strong>
<br />
Don't see a built-in field type that you need? Build it! Using a combination
of custom validation and custom components, you can override the entirety of
how a component functions within the admin panel and effectively create your
own field type.
</Banner>
**Fields support the following custom components:**
| Component | Description |
| --------------- | -------------|
| **`Filter`** | Override the text input that is presented in the `List` view when a user is filtering documents by the customized field. |
| **`Cell`** | Used in the `List` view's table to represent a table-based preview of the data stored in the field. |
| **`Field`** | Swap out the field itself within all `Edit` views. |
| Component | Description |
| ------------ | --------------------------------------------------------------------------------------------------------------------------- |
| **`Filter`** | Override the text input that is presented in the `List` view when a user is filtering documents by the customized field. |
| **`Cell`** | Used in the `List` view's table to represent a table-based preview of the data stored in the field. [More](#cell-component) |
| **`Field`** | Swap out the field itself within all `Edit` views. [More](#field-component) |
#### Sending and receiving values from the form
## Cell Component
When swapping out the `Field` component, you'll be responsible for sending and receiving the field's `value` from the form itself. To do so, import the `useFieldType` hook as follows:
These are the props that will be passed to your custom Cell to use in your own components.
```js
import { useFieldType } from 'payload/components/forms';
| Property | Description |
| ---------------- | ----------------------------------------------------------------- |
| **`field`** | An object that includes the field configuration. |
| **`colIndex`** | A unique number for the column in the list. |
| **`collection`** | An object with the config of the collection that the field is in. |
| **`cellData`** | The data for the field that the cell represents. |
| **`rowData`** | An object with all the field values for the row. |
const CustomTextField = ({ path }) => {
const { value, setValue } = useFieldType({ path });
#### Example
```tsx
import React from "react";
import "./index.scss";
const baseClass = "custom-cell";
const CustomCell: React.FC<Props> = (props) => {
const { field, colIndex, collection, cellData, rowData } = props;
return <span className={baseClass}>{cellData}</span>;
};
```
## Field Component
When writing your own custom components you can make use of a number of hooks to set data, get reactive changes to other fields, get the id of the document or interact with a context from a custom provider.
### Sending and receiving values from the form
When swapping out the `Field` component, you'll be responsible for sending and receiving the field's `value` from the form itself. To do so, import the `useField` hook as follows:
```tsx
import { useField } from "payload/components/forms";
type Props = { path: string };
const CustomTextField: React.FC<Props> = ({ path }) => {
// highlight-start
const { value, setValue } = useField<Props>({ path });
// highlight-end
return (
<input
onChange={(e) => setValue(e.target.value)}
value={value}
/>
)
}
<input onChange={(e) => setValue(e.target.value)} value={value.path} />
);
};
```
<Banner type="success">
For more information regarding the hooks that are available to you while you
build custom components, including the <strong>useField</strong> hook,{" "}
<a href="/docs/admin/hooks" style={{ color: "black" }}>
click here
</a>
.
</Banner>
## Custom routes
You can easily add your own custom routes to the Payload Admin panel using the `admin.components.routes` property. Payload currently uses the extremely powerful React Router v5.x and custom routes support all the properties of the React Router `<Route />` component.
**Custom routes support the following properties:**
| Property | Description |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| **`Component`** \* | Pass in the component that should be rendered when a user navigates to this route. |
| **`path`** \* | React Router `path`. [See the React Router docs](https://v5.reactrouter.com/web/api/Route/path-string-string) for more info. |
| **`exact`** | React Router `exact` property. [More](https://v5.reactrouter.com/web/api/Route/exact-bool) |
| **`strict`** | React Router `strict` property. [More](https://v5.reactrouter.com/web/api/Route/strict-bool) |
| **`sensitive`** | React Router `sensitive` property. [More](https://v5.reactrouter.com/web/api/Route/sensitive-bool) |
_\* An asterisk denotes that a property is required._
#### Custom route components
Your custom route components will be given all the props that a React Router `<Route />` typically would receive, as well as two props from Payload:
| Prop | Description |
| ----------------------- | ---------------------------------------------------------------------------- |
| **`user`** | The currently logged in user. Will be `null` if no user is logged in. |
| **`canAccessAdmin`** \* | If the currently logged in user is allowed to access the admin panel or not. |
<Banner type="warning">
<strong>Note:</strong>
<br />
It's up to you to secure your custom routes. If your route requires a user to
be logged in or to have certain access rights, you should handle that within
your route component yourself.
</Banner>
#### Example
You can find examples of custom route views in the [Payload source code `/test/admin/components/views` folder](https://github.com/payloadcms/payload/tree/master/test/admin/components/views). There, you'll find two custom routes:
1. A custom view that uses the `DefaultTemplate`, which is the built-in Payload template that displays the sidebar and "eyebrow nav"
1. A custom view that uses the `MinimalTemplate` - which is just a centered template used for things like logging in or out
To see how to pass in your custom views to create custom routes of your own, take a look at the `admin.components.routes` property of the [Payload test admin config](https://github.com/payloadcms/payload/blob/master/test/admin/config.ts).
## Custom providers
As your admin customizations gets more complex you may want to share state between fields or other components. You can add custom providers to do add your own context to any Payload app for use in other custom components within the admin panel. Within your config add `admin.components.providers`, these can be used to share context or provide other custom functionality. Read the [React context](https://reactjs.org/docs/context.html) docs to learn more.
<Banner type="warning">
<strong>Reminder:</strong> Don't forget to pass the **children** prop through
the provider component for the admin UI to show
</Banner>
### Styling Custom Components
Payload exports its SCSS variables and mixins for reuse in your own custom components. This is helpful in cases where you might want to style a custom input similarly to Payload's built-ini styling so it blends more thoroughly into the existing admin UI.
Payload exports its SCSS variables and mixins for reuse in your own custom components. This is helpful in cases where you might want to style a custom input similarly to Payload's built-ini styling, so it blends more thoroughly into the existing admin UI.
To make use of Payload SCSS variables / mixins to use directly in your own components, you can import them as follows:
```
@import '~payload/scss';
```
### Getting the current locale
In any custom component you can get the selected locale with the `useLocale` hook. Here is a simple example:
```tsx
import { useLocale } from "payload/components/utilities";
const Greeting: React.FC = () => {
// highlight-start
const locale = useLocale();
// highlight-end
const trans = {
en: "Hello",
es: "Hola",
};
return <span> {trans[locale]} </span>;
};
```

View File

@@ -1,7 +1,7 @@
---
title: Customizing CSS & SCSS
label: Customizing CSS
order: 30
order: 40
desc: Customize your Payload admin panel further by adding your own CSS or SCSS style sheet to the configuration, powerful theme and design options are waiting for you.
keywords: admin, css, scss, documentation, Content Management System, cms, headless, javascript, node, react, express
---
@@ -13,51 +13,37 @@ You can add your own CSS by providing your base Payload config with a path to yo
To do so, provide your base Payload config with a path to your own stylesheet. It can be either a CSS or SCSS file.
**Example in payload.config.js:**
```js
```ts
import { buildConfig } from 'payload/config';
import path from 'path';
const config = buildConfig({
serverURL: 'http://localhost:3000',
admin: {
css: path.resolve(__dirname, 'relative/path/to/stylesheet.scss'),
},
})
});
```
### Overriding SCSS variables
### Overriding built-in styles
You can specify your own SCSS variable stylesheet that will allow for the override of Payload's base theme. This unlocks a ton of powerful theming and design options such as:
To make it as easy as possible for you to override our styles, Payload uses [BEM naming conventions](http://getbem.com/) for all CSS within the Admin UI. If you provide your own CSS, you can override any built-in styles easily.
- Changing dashboard font families
- Modifying color palette
- Creating a dark theme
- Etc.
In addition to adding your own style definitions, you can also override Payload's built-in CSS variables. We use as much as possible behind the scenes, and you can override any of them that you'd like to.
To do so, provide your base Payload config with a path to your own SCSS variable sheet.
You can find the built-in Payload CSS variables within [`./src/admin/scss/app.scss`](https://github.com/payloadcms/payload/blob/master/src/admin/scss/app.scss) and [`./src/admin/scss/colors.scss`](https://github.com/payloadcms/payload/blob/master/src/admin/scss/colors.scss). The following variables are defined and can be overridden:
**Example in payload.config.js:**
```js
import { buildConfig } from 'payload/config';
import path from 'path';
- Breakpoints
- Base color shades (white to black by default)
- Success / warning / error color shades
- Theme-specific colors (background, input background, text color, etc.)
- Elevation colors (used to determine how "bright" something should be when compared to the background)
- Fonts
- Horizontal gutter
const config = buildConfig({
serverURL: 'http://localhost:3000',
admin: {
scss: path.resolve(__dirname, 'relative/path/to/vars.scss'),
},
})
```
#### Dark mode
**Example stylesheet override:**
```scss
$font-body: 'Papyrus';
$style-radius-m: 10px;
```
To reference all Sass variables that you can override, look at the default [SCSS variable stylesheet](https://github.com/payloadcms/payload/blob/master/src/admin/scss/vars.scss) within the Payload source code.
<Banner type="error">
<strong>Warning:</strong><br />
Only SCSS variables, mixins, functions, and extends are allowed in <strong>your SCSS overrides</strong>. Do not attempt to add any CSS declarations to this file, as this variable stylesheet is imported by many components throughout the Payload Admin panel and will result in your CSS definition(s) being duplicated many times. If you need to add real CSS definitions, see "Adding your own CSS / SCSS" the top of this page.
<Banner type="warning">
If you're overriding colors or theme elevations, make sure to consider how your changes will affect dark mode.
</Banner>
By default, Payload automatically overrides all `--theme-elevation`s and inverts all success / warning / error shades to suit dark mode. We also update some base theme variables like `--theme-bg`, `--theme-text`, etc.

289
docs/admin/hooks.mdx Normal file
View File

@@ -0,0 +1,289 @@
---
title: React Hooks
label: React Hooks
order: 30
desc: Make use of all of the powerful React hooks that Payload provides.
keywords: admin, components, custom, documentation, Content Management System, cms, headless, javascript, node, react, express
---
Payload provides a variety of powerful hooks that can be used within your own React components. With them, you can interface with Payload itself and build just about any type of complex customization you can think of—directly in familiar React code.
### useField
The `useField` hook is used internally within every applicable Payload field component, and it manages sending and receiving a field's state from its parent form.
Outside of internal use, its most common use-case is in custom `Field` components. When you build a custom React `Field` component, you'll be responsible for sending and receiving the field's `value` from the form itself. To do so, import the `useField` hook as follows:
```tsx
import { useField } from 'payload/components/forms'
type Props = { path: string }
const CustomTextField: React.FC<Props> = ({ path }) => {
// highlight-start
const { value, setValue } = useField<string>({ path })
// highlight-end
return <input onChange={e => setValue(e.target.value)} value={value.path} />
}
```
The `useField` hook accepts an `args` object and sends back information and helpers for you to make use of:
```ts
const field = useField<string>({
path: 'fieldPathHere', // required
validate: myValidateFunc, // optional
disableFormData?: false, // if true, the field's data will be ignored
condition?: myConditionHere, // optional, used to skip validation if condition fails
})
// Here is what `useField` sends back
const {
showError, // whether or not the field should show as errored
errorMessage, // the error message to show, if showError
value, // the current value of the field from the form
formSubmitted, // if the form has been submitted
formProcessing, // if the form is currently processing
setValue, // method to set the field's value in form state
initialValue, // the initial value that the field mounted with
} = field;
// The rest of your component goes here
```
### useFormFields
There are times when a custom field component needs to have access to data from other fields, and you have a few options to do so. The `useFormFields` hook is a powerful and highly performant way to retrieve a form's field state, as well as to retrieve the `dispatchFields` method, which can be helpful for setting other fields' form states from anywhere within a form.
<Banner type="success">
<strong>This hook is great for retrieving only certain fields from form state</strong> because it ensures that it will only cause a rerender when the items that you ask for change.
</Banner>
Thanks to the awesome package [`use-context-selector`](https://github.com/dai-shi/use-context-selector), you can retrieve a specific field's state easily. This is ideal because you can ensure you have an up-to-date field state, and your component will only re-render when _that field's state_ changes.
You can pass a Redux-like selector into the hook, which will ensure that you retrieve only the field that you want. The selector takes an argument with type of `[fields: Fields, dispatch: React.Dispatch<Action>]]`.
```tsx
import { useFormFields } from 'payload/components/forms';
const MyComponent: React.FC = () => {
// Get only the `amount` field state, and only cause a rerender when that field changes
const amount = useFormFields(([fields, dispatch]) => fields.amount);
// Do the same thing as above, but to the `feePercentage` field
const feePercentage = useFormFields(([fields, dispatch]) => fields.feePercentage);
if (typeof amount?.value !== 'undefined' && typeof feePercentage?.value !== 'undefined') {
return (
<span>The fee is ${(amount.value * feePercentage.value) / 100}</span>
);
}
};
```
### useAllFormFields
**To retrieve more than one field**, you can use the `useAllFormFields` hook. Your component will re-render when _any_ field changes, so use this hook only if you absolutely need to. Unlike the `useFormFields` hook, this hook does not accept a "selector", and it always returns an array with type of `[fields: Fields, dispatch: React.Dispatch<Action>]]`.
You can do lots of powerful stuff by retrieving the full form state, like using built-in helper functions to reduce field state to values only, or to retrieve sibling data by path.
```tsx
import { useAllFormFields, reduceFieldsToValues, getSiblingData } from 'payload/components/forms';
const ExampleComponent: React.FC = () => {
// the `fields` const will be equal to all fields' state,
// and the `dispatchFields` method is usable to send field state up to the form
const [fields, dispatchFields] = useAllFormFields();
// Pass in fields, and indicate if you'd like to "unflatten" field data.
// The result below will reflect the data stored in the form at the given time
const formData = reduceFieldsToValues(fields, true);
// Pass in field state and a path,
// and you will be sent all sibling data of the path that you've specified
const siblingData = getSiblingData(fields, 'someFieldName');
return (
// return some JSX here if necessary
)
};
```
##### Updating other fields' values
If you are building a custom component, then you should use `setValue` which is returned from the `useField` hook to programmatically set your field's value. But if you're looking to update _another_ field's value, you can use `dispatchFields` returned from `useFormFields`.
You can send the following actions to the `dispatchFields` function.
| Action | Description |
|------------------------|----------------------------------------------------------------------------|
| **`ADD_ROW`** | Adds a row of data (useful in array / block field data) |
| **`DUPLICATE_ROW`** | Duplicates a row of data (useful in array / block field data) |
| **`MODIFY_CONDITION`** | Updates a field's conditional logic result (true / false) |
| **`MOVE_ROW`** | Moves a row of data (useful in array / block field data) |
| **`REMOVE`** | Removes a field from form state |
| **`REMOVE_ROW`** | Removes a row of data from form state (useful in array / block field data) |
| **`REPLACE_STATE`** | Completely replaces form state |
| **`UPDATE`** | Update any property of a specific field's state |
To see types for each action supported within the `dispatchFields` hook, check out the Form types [here](https://github.com/payloadcms/payload/blob/master/src/admin/components/forms/Form/types.ts).
### useForm
The `useForm` hook can be used to interact with the form itself, and sends back many methods that can be used to reactively fetch form state without causing rerenders within your components each time a field is changed. This is useful if you have action-based callbacks that your components fire, and need to interact with form state _based on a user action_.
<Banner type="warning">
<strong>Warning:</strong><br/>
This hook is optimized to avoid causing rerenders when fields change, and as such, its `fields` property will be out of date. You should only leverage this hook if you need to perform actions against the form in response to your users' actions. Do not rely on its returned "fields" as being up-to-date. They will be removed from this hook's response in an upcoming version.
</Banner>
The `useForm` hook returns an object with the following properties:
| Action | Description |
|----------------------|---------------------------------------------------------------------|
| **`fields`** | Deprecated. This property cannot be relied on as up-to-date. |
| **`submit`** | Method to trigger the form to submit |
| **`dispatchFields`** | Dispatch actions to the form field state |
| **`validateForm`** | Trigger a validation of the form state |
| **`createFormData`** | Create a `multipart/form-data` object from the current form's state |
| **`disabled`** | Boolean denoting whether or not the form is disabled |
| **`getFields`** | Gets all fields from state |
| **`getField`** | Gets a single field from state by path |
| **`getData`** | Returns the data stored in the form |
| **`getSiblingData`** | Returns form sibling data for the given field path |
| **`setModified`** | Set the form's `modified` state |
| **`setProcessing`** | Set the form's `processing` state |
| **`setSubmitted`** | Set the form's `submitted` state |
| **`formRef`** | The ref from the form HTML element |
| **`reset`** | Method to reset the form to its initial state |
### useDocumentInfo
The `useDocumentInfo` hook provides lots of information about the document currently being edited, including the following:
| Property | Description |
|---------------------------|------------------------------------------------------------------------------------|
| **`collection`** | If the doc is a collection, its collection config will be returned |
| **`global`** | If the doc is a global, its global config will be returned |
| **`type`** | The type of document being edited (collection or global) |
| **`id`** | If the doc is a collection, its ID will be returned |
| **`preferencesKey`** | The `preferences` key to use when interacting with document-level user preferences |
| **`versions`** | Versions of the current doc |
| **`unpublishedVersions`** | Unpublished versions of the current doc |
| **`publishedDoc`** | The currently published version of the doc being edited |
| **`getVersions`** | Method to trigger the retrieval of document versions |
**Example:**
```tsx
import { useDocumentInfo } from 'payload/components/utilities';
const LinkFromCategoryToPosts: React.FC = () => {
// highlight-start
const { id } = useDocumentInfo();
// highlight-end
// id will be undefined on the create form
if (!id) {
return null;
}
return (
<a href={`/admin/collections/posts?where[or][0][and][0][category][in][0]=[${id}]`} >
View posts
</a>
)
};
```
### useLocale
In any custom component you can get the selected locale with the `useLocale` hook. Here is a simple example:
```tsx
import { useLocale } from 'payload/components/utilities';
const Greeting: React.FC = () => {
// highlight-start
const locale = useLocale();
// highlight-end
const trans = {
en: 'Hello',
es: 'Hola',
};
return (
<span> { trans[locale] } </span>
);
};
```
### useAuth
Useful to retrieve info about the currently logged in user as well as methods for interacting with it. It sends back an object with the following properties:
| Property | Description |
|---------------------|-----------------------------------------------------------------------------------------|
| **`user`** | The currently logged in user |
| **`logOut`** | A method to log out the currently logged in user |
| **`refreshCookie`** | A method to trigger the silent refreshing of a user's auth token |
| **`setToken`** | Set the token of the user, to be decoded and used to reset the user and token in memory |
| **`token`** | The logged in user's token (useful for creating preview links, etc.) |
| **`permissions`** | The permissions of the current user |
```tsx
import { useAuth } from 'payload/components/utilities';
import { User } from '../payload-types.ts';
const Greeting: React.FC = () => {
// highlight-start
const { user } = useConfig<User>();
// highlight-end
return (
<span>Hi, {user.email}!</span>
);
};
```
### useConfig
Used to easily fetch the full Payload config.
```tsx
import { useConfig } from 'payload/components/utilities';
const MyComponent: React.FC = () => {
// highlight-start
const config = useConfig();
// highlight-end
return (
<span>{config.serverURL}</span>
);
};
```
### useEditDepth
Sends back how many editing levels "deep" the current component is. Edit depth is relevant while adding new documents / editing documents in modal windows and other cases.
```tsx
import { useEditDepth } from 'payload/components/utilities';
const MyComponent: React.FC = () => {
// highlight-start
const editDepth = useEditDepth();
// highlight-end
return (
<span>My component is {editDepth} levels deep</span>
)
}
```
### usePreferences
Returns methods to set and get user preferences. More info can be found [here](https://payloadcms.com/docs/admin/preferences).

View File

@@ -14,7 +14,7 @@ The Payload Admin panel is built with Webpack, code-split, highly performant (ev
The Admin panel is meant to be simple enough to give you a starting point but not bring too much complexity, so that you can easily customize it to suit the needs of your application and your editors.
</Banner>
![Payload's Admin panel built in React](https://payloadcms.com/images/admin.jpg)
![Payload's Admin panel built in React](https://payloadcms.com/images/docs/admin.jpg)
*Screenshot of the Admin panel while editing a document from an example `AllFields` collection*
@@ -22,17 +22,20 @@ The Payload Admin panel is built with Webpack, code-split, highly performant (ev
All options for the Admin panel are defined in your base Payload config file.
| Option | Description |
| -------------------- | -------------|
| `user` | The `slug` of a Collection that you want be used to log in to the Admin dashboard. [More](/docs/admin/overview#the-admin-user-collection) |
| `meta` | Base meta data to use for the Admin panel. Included properties are `titleSuffix`, `ogImage`, and `favicon`. |
| `disable` | If set to `true`, the entire Admin panel will be disabled. |
| `indexHTML` | Optionally replace the entirety of the `index.html` file used by the Admin panel. Reference the [base index.html file](https://github.com/payloadcms/payload/blob/master/src/admin/index.html) to ensure your replacement has the appropriate HTML elements. |
| `css` | Absolute path to a stylesheet that you can use to override / customize the Admin panel styling. [More](/docs/admin/customizing-css). |
| `scss` | Absolute path to a Sass variables / mixins stylesheet meant to override Payload styles to make for an easy re-skinning of the Admin panel. [More](/docs/admin/customizing-css#overriding-scss-variables). |
| `dateFormat` | Global date format that will be used for all dates in the Admin panel. Any valid [date-fns](https://date-fns.org/) format pattern can be used.
| `components` | Component overrides that affect the entirety of the Admin panel. [More](/docs/admin/components) |
| `webpack` | Customize the Webpack config that's used to generate the Admin panel. [More](/docs/admin/webpack) |
| Option | Description |
| --------------------- | -------------|
| `user` | The `slug` of a Collection that you want be used to log in to the Admin dashboard. [More](/docs/admin/overview#the-admin-user-collection) |
| `meta` | Base meta data to use for the Admin panel. Included properties are `titleSuffix`, `ogImage`, and `favicon`. |
| `disable` | If set to `true`, the entire Admin panel will be disabled. |
| `indexHTML` | Optionally replace the entirety of the `index.html` file used by the Admin panel. Reference the [base index.html file](https://github.com/payloadcms/payload/blob/master/src/admin/index.html) to ensure your replacement has the appropriate HTML elements. |
| `css` | Absolute path to a stylesheet that you can use to override / customize the Admin panel styling. [More](/docs/admin/customizing-css). |
| `scss` | Absolute path to a Sass variables / mixins stylesheet meant to override Payload styles to make for an easy re-skinning of the Admin panel. [More](/docs/admin/customizing-css#overriding-scss-variables). |
| `dateFormat` | Global date format that will be used for all dates in the Admin panel. Any valid [date-fns](https://date-fns.org/) format pattern can be used. |
| `avatar` | Set account profile picture. Options: `gravatar`, `default` or a custom React component. |
| `components` | Component overrides that affect the entirety of the Admin panel. [More](/docs/admin/components) |
| `webpack` | Customize the Webpack config that's used to generate the Admin panel. [More](/docs/admin/webpack) | |
| **`logoutRoute`** | The route for the `logout` page. |
| **`inactivityRoute`** | The route for the `logout` inactivity page. |
### The Admin User Collection
@@ -45,15 +48,14 @@ All options for the Admin panel are defined in your base Payload config file.
To specify which Collection to use to log in to the Admin panel, pass the `admin` options a `user` key equal to the slug of the Collection that you'd like to use.
`payload.config.js`:
```js
```ts
import { buildConfig } from 'payload/config';
const config = buildConfig({
serverURL: 'http://localhost:3000',
admin: {
user: 'admins', // highlight-line
},
})
});
```
By default, if you have not specified a Collection, Payload will automatically provide you with a `User` Collection which will be used to access the Admin panel. You can customize or override the fields and settings of the default `User` Collection by passing your own collection using `users` as its `slug` to Payload. When this is done, Payload will use your provided `User` Collection instead of its default version.
@@ -67,10 +69,10 @@ For example, you may wish to have two Collections that both support `Authenticat
This is totally possible. For the above scenario, by specifying `admin: { user: 'admins' }`, your Payload Admin panel will use `admins`. Any users logged in as `customers` will not be able to log in via the Admin panel.
### Light and dark modes
Users in the admin panel have access to choosing between light mode and dark mode for their editing experience. The setting is managed while logged into the admin UI within the user account page and will be stored with the browser. By default, the operating system preference is detected and used.
### Restricting user access
If you would like to restrict which users from a single Collection can access the Admin panel, you can use the `admin` access control function. [Click here](/docs/access-control/overview#admin) to learn more.
## License enforcement
Payload requires a valid license key to be used on production domains. You can use it as much as you'd like locally and on staging / UAT domains, but when you deploy to production, you'll need a license key to activate Payload's Admin panel. For more information, [click here](/docs/production/licensing).

View File

@@ -1,7 +1,7 @@
---
title: Managing User Preferences
label: Preferences
order: 40
order: 50
desc: Store the preferences of your users as they interact with the Admin panel.
keywords: admin, preferences, custom, customize, documentation, Content Management System, cms, headless, javascript, node, react, express
---

View File

@@ -1,7 +1,7 @@
---
title: Webpack
label: Webpack
order: 50
order: 60
desc: The Payload admin panel uses Webpack 5 and supports many common functionalities such as SCSS and Typescript out of the box to give you more freedom.
keywords: admin, webpack, documentation, Content Management System, cms, headless, javascript, node, react, express
---
@@ -10,12 +10,11 @@ Payload uses Webpack 5 to build the Admin panel. It comes with support for many
To extend the Webpack config, add the `webpack` key to your base Payload config, and provide a function that accepts the default Webpack config as its only argument:
`payload.config.js`
```js
`payload.config.ts`
```ts
import { buildConfig } from 'payload/config';
export default buildConfig({
serverURL: 'http://localhost:3000',
admin: {
// highlight-start
webpack: (config) => {
@@ -25,7 +24,7 @@ export default buildConfig({
}
// highlight-end
}
})
});
```
### Aliasing server-only modules
@@ -53,16 +52,17 @@ You may rely on server-only packages such as the above to perform logic in acces
<br/><br/>
`collections/Subscriptions/index.js`
```js
```ts
import { CollectionConfig } from 'payload/types';
import createStripeSubscription from './hooks/createStripeSubscription';
const Subscription = {
const Subscription: CollectionConfig = {
slug: 'subscriptions',
hooks: {
beforeChange: [
createStripeSubscription,
]
}
},
fields: [
{
name: 'stripeSubscriptionID',
@@ -70,7 +70,7 @@ const Subscription = {
required: true,
}
]
}
};
export default Subscription;
```
@@ -128,7 +128,6 @@ const createStripeSubscriptionPath = path.resolve(__dirname, 'collections/Subscr
const mockModulePath = path.resolve(__dirname, 'mocks/emptyObject.js');
export default buildConfig({
serverURL: 'http://localhost:3000',
collections: [
Subscription
],
@@ -156,6 +155,11 @@ export default {};
Now, when Webpack sees that you're attempting to import your `createStripeSubscriptionPath` file, it'll disregard that actual file and load your mock file instead. Not only will your Admin panel now bundle successfully, you will have optimized its filesize by removing unnecessary code! And you might have learned something about Webpack, too.
<Banner type="success">
<strong>Tip:</strong><br/>
If changes to your Webpack aliases are not surfacing, they might be [cached](https://webpack.js.org/configuration/cache/) in `node_modules/.cache/webpack`. Try deleting that folder and restarting your server.
</Banner>
## Admin environment vars
<Banner type="warning">

View File

@@ -12,16 +12,18 @@ To enable Authentication on a collection, define an `auth` property and set it t
## Options
| Option | Description |
| ---------------------- | -------------|
| **`useAPIKey`** | Payload Authentication provides for API keys to be set on each user within an Authentication-enabled Collection. [More](/docs/authentication/config#api-keys) |
| **`tokenExpiration`** | How long (in seconds) to keep the user logged in. JWTs and HTTP-only cookies will both expire at the same time. |
| **`maxLoginAttempts`** | Only allow a user to attempt logging in X amount of times. Automatically locks out a user from authenticating if this limit is passed. Set to `0` to disable. |
| **`lockTime`** | Set the time that a user should be locked out if they fail authentication more times than `maxLoginAttempts` allows for. |
| **`depth`** | How many levels deep a `user` document should be populated when creating the JWT and binding the `user` to the express `req`. Defaults to `0` and should only be modified if absolutely necessary, as this will affect performance. |
| **`cookies`** | Set cookie options, including `secure`, `sameSite`, and `domain`. For advanced users. |
| **`forgotPassword`** | Customize the way that the `forgotPassword` operation functions. [More](/docs/authentication/config#forgot-password) |
| **`verify`** | Set to `true` or pass an object with verification options to require users to verify by email before they are allowed to log into your app. [More](/docs/authentication/config#email-verification) |
| Option | Description |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`useAPIKey`** | Payload Authentication provides for API keys to be set on each user within an Authentication-enabled Collection. [More](/docs/authentication/config#api-keys) |
| **`tokenExpiration`** | How long (in seconds) to keep the user logged in. JWTs and HTTP-only cookies will both expire at the same time. |
| **`maxLoginAttempts`** | Only allow a user to attempt logging in X amount of times. Automatically locks out a user from authenticating if this limit is passed. Set to `0` to disable. |
| **`lockTime`** | Set the time that a user should be locked out if they fail authentication more times than `maxLoginAttempts` allows for. |
| **`depth`** | How many levels deep a `user` document should be populated when creating the JWT and binding the `user` to the express `req`. Defaults to `0` and should only be modified if absolutely necessary, as this will affect performance. |
| **`cookies`** | Set cookie options, including `secure`, `sameSite`, and `domain`. For advanced users. |
| **`forgotPassword`** | Customize the way that the `forgotPassword` operation functions. [More](/docs/authentication/config#forgot-password) |
| **`verify`** | Set to `true` or pass an object with verification options to require users to verify by email before they are allowed to log into your app. [More](/docs/authentication/config#email-verification) |
| **`disableLocalStrategy`** | Advanced - disable Payload's built-in local auth strategy. Only use this property if you have replaced Payload's auth mechanisms with your own. |
| **`strategies`** | Advanced - an array of PassportJS authentication strategies to extend this collection's authentication with. [More](/docs/authentication/config#strategies) |
### API keys
@@ -37,7 +39,8 @@ Technically, both of these options will work for third-party integrations but th
To enable API keys on a collection, set the `useAPIKey` auth option to `true`. From there, a new interface will appear in the Admin panel for each document within the collection that allows you to generate an API key for each user in the Collection.
<Banner type="success">
User API keys are encrypted within the database, meaning that if your database is compromised, your API keys will not be.
User API keys are encrypted within the database, meaning that if your database
is compromised, your API keys will not be.
</Banner>
##### Authenticating via API Key
@@ -45,14 +48,17 @@ To enable API keys on a collection, set the `useAPIKey` auth option to `true`. F
To utilize your API key while interacting with the REST or GraphQL API, add the `Authorization` header.
**For example, using Fetch:**
```js
const response = await fetch('http://localhost:3000/api/pages', {
```ts
const response = await fetch("http://localhost:3000/api/pages", {
headers: {
Authorization: `${collection.labels.singular} API-Key ${YOUR_API_KEY}`,
},
});
```
Note: The label portion of the header is case-sensitive and will likely have a capitalized first character unless the label has been customized.
### Forgot Password
You can customize how the Forgot Password workflow operates with the following options on the `auth.forgotPassword` property:
@@ -62,14 +68,21 @@ You can customize how the Forgot Password workflow operates with the following o
Function that accepts one argument, containing `{ req, token, user }`, that allows for overriding the HTML within emails that are sent to users attempting to reset their password. The function should return a string that supports HTML, which can be a full HTML email.
<Banner type="success">
<strong>Tip:</strong><br />
HTML templating can be used to create custom email templates, inline CSS automatically, and more. You can make a reusable function that standardizes all email sent from Payload, which makes sending custom emails more DRY. Payload doesn't ship with an HTML templating engine, so you are free to choose your own.
<strong>Tip:</strong>
<br />
HTML templating can be used to create custom email templates, inline CSS
automatically, and more. You can make a reusable function that standardizes
all email sent from Payload, which makes sending custom emails more DRY.
Payload doesn't ship with an HTML templating engine, so you are free to choose
your own.
</Banner>
Example:
```js
{
```ts
import { CollectionConfig } from 'payload/types';
const Customers: CollectionConfig = {
slug: 'customers',
auth: {
forgotPassword: {
@@ -95,12 +108,17 @@ Example:
// highlight-end
}
}
}
};
```
<Banner type="warning">
<strong>Important:</strong><br />
If you specify a different URL to send your users to for resetting their password, such as a page on the frontend of your app or similar, you need to handle making the call to the Payload REST or GraphQL reset-password operation yourself on your frontend, using the token that was provided for you. Above, it was passed via query parameter.
<strong>Important:</strong>
<br />
If you specify a different URL to send your users to for resetting their
password, such as a page on the frontend of your app or similar, you need to
handle making the call to the Payload REST or GraphQL reset-password operation
yourself on your frontend, using the token that was provided for you. Above,
it was passed via query parameter.
</Banner>
**`generateEmailSubject`**
@@ -109,7 +127,7 @@ Similarly to the above `generateEmailHTML`, you can also customize the subject o
Example:
```js
```ts
{
slug: 'customers',
auth: {
@@ -134,8 +152,11 @@ Function that accepts one argument, containing `{ req, token, user }`, that allo
Example:
```js
{
```ts
import { CollectionConfig } from 'payload/types';
const Customers: CollectionConfig = {
slug: 'customers',
auth: {
verify: {
@@ -149,12 +170,17 @@ Example:
// highlight-end
}
}
}
};
```
<Banner type="warning">
<strong>Important:</strong><br />
If you specify a different URL to send your users to for email verification, such as a page on the frontend of your app or similar, you need to handle making the call to the Payload REST or GraphQL verification operation yourself on your frontend, using the token that was provided for you. Above, it was passed via query parameter.
<strong>Important:</strong>
<br />
If you specify a different URL to send your users to for email verification,
such as a page on the frontend of your app or similar, you need to handle
making the call to the Payload REST or GraphQL verification operation yourself
on your frontend, using the token that was provided for you. Above, it was
passed via query parameter.
</Banner>
**`generateEmailSubject`**
@@ -163,7 +189,7 @@ Similarly to the above `generateEmailHTML`, you can also customize the subject o
Example:
```js
```ts
{
slug: 'customers',
auth: {
@@ -177,3 +203,29 @@ Example:
}
}
```
### Strategies
As of Payload `1.0.0`, you can add additional authentication strategies to Payload easily by passing them to your collection's `auth.strategies` array.
Behind the scenes, Payload uses PassportJS to power its local authentication strategy, so most strategies listed on the PassportJS website will work seamlessly. Combined with adding custom components to the admin panel's `Login` view, you can create advanced authentication strategies directly within Payload.
<Banner type="warning">
This is an advanced feature, so only attempt this if you are an experienced
developer. Otherwise, just let Payload's built-in authentication handle user
auth for you.
</Banner>
The `strategies` property is an array that takes objects with the following properties:
**`strategy`**
This property can accept a Passport strategy directly, or you can pass a function that takes a `payload` argument, and returns a Passport strategy.
**`name`**
If you pass a strategy to the `strategy` property directly, the `name` property is optional and allows you to override the strategy's built-in name.
However, if you pass a function to `strategy`, `name` is a required property.
In either case, Payload will prefix the strategy name with the collection `slug` that the strategy is passed to.

View File

@@ -17,10 +17,9 @@ The Access operation returns what a logged in user can and can't do with the col
`GET http://localhost:3000/api/access`
Example response:
```js
```ts
{
canAccessAdmin: true,
license: 'LICENSE_KEY_HERE',
collections: {
pages: {
create: {
@@ -55,7 +54,7 @@ Example response:
**Example GraphQL Query**:
```
```graphql
query {
Access {
pages {
@@ -76,7 +75,7 @@ Returns either a logged in user with token or null when there is no logged in us
`GET http://localhost:3000/api/[collection-slug]/me`
Example response:
```js
```ts
{
user: { // The JWT "payload" ;) from the logged in user
email: 'dev@payloadcms.com',
@@ -91,7 +90,7 @@ Example response:
**Example GraphQL Query**:
```
```graphql
query {
Me[collection-singular-label] {
user {
@@ -107,7 +106,7 @@ query {
Accepts an `email` and `password`. On success, it will return the logged in user as well as a token that can be used to authenticate. In the GraphQL and REST APIs, this operation also automatically sets an HTTP-only cookie including the user's token. If you pass an Express `res` to the Local API operation, Payload will set a cookie there as well.
**Example REST API login**:
```js
```ts
const res = await fetch('http://localhost:3000/api/[collection-slug]/login', {
method: 'POST',
headers: {
@@ -138,7 +137,7 @@ const json = await res.json();
**Example GraphQL Mutation**:
```
```graphql
mutation {
login[collection-singular-label](email: "dev@payloadcms.com", password: "yikes") {
user {
@@ -152,7 +151,7 @@ mutation {
**Example Local API login**:
```js
```ts
const result = await payload.login({
collection: '[collection-slug]',
data: {
@@ -167,7 +166,7 @@ const result = await payload.login({
As Payload sets HTTP-only cookies, logging out cannot be done by just removing a cookie in JavaScript, as HTTP-only cookies are inaccessible by JS within the browser. So, Payload exposes a `logout` operation to delete the token in a safe way.
**Example REST API logout**:
```js
```ts
const res = await fetch('http://localhost:3000/api/[collection-slug]/logout', {
method: 'POST',
headers: {
@@ -193,7 +192,7 @@ This operation requires a non-expired token to send back a new one. If the user'
If successful, this operation will automatically renew the user's HTTP-only cookie and will send back the updated token in JSON.
**Example REST API token refresh**:
```js
```ts
const res = await fetch('http://localhost:3000/api/[collection-slug]/refresh-token', {
method: 'POST',
headers: {
@@ -240,18 +239,18 @@ mutation {
If your collection supports email verification, the Verify operation will be exposed which accepts a verification token and sets the user's `_verified` property to `true`, thereby allowing the user to authenticate with the Payload API.
**Example REST API user verification**:
```js
```ts
const res = await fetch(`http://localhost:3000/api/[collection-slug]/verify/${TOKEN_HERE}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
})
});
```
**Example GraphQL Mutation**:
```
```graphql
mutation {
verifyEmail[collection-singular-label](token: "TOKEN_HERE")
}
@@ -259,7 +258,7 @@ mutation {
**Example Local API verification**:
```js
```ts
const result = await payload.verifyEmail({
collection: '[collection-slug]',
token: 'TOKEN_HERE',
@@ -273,7 +272,7 @@ If a user locks themselves out and you wish to deliberately unlock them, you can
To restrict who is allowed to unlock users, you can utilize the [`unlock`](/docs/access-control/overview#unlock) access control function.
**Example REST API unlock**:
```js
```ts
const res = await fetch(`http://localhost:3000/api/[collection-slug]/unlock`, {
method: 'POST',
headers: {
@@ -292,7 +291,7 @@ mutation {
**Example Local API unlock**:
```js
```ts
const result = await payload.unlock({
collection: '[collection-slug]',
})
@@ -307,7 +306,7 @@ The link to reset the user's password contains a token which is what allows the
By default, the Forgot Password operations send users to the Payload Admin panel to reset their password, but you can customize the generated email to send users to the frontend of your app instead by [overriding the email HTML](/docs/authentication/config#forgot-password).
**Example REST API Forgot Password**:
```js
```ts
const res = await fetch(`http://localhost:3000/api/[collection-slug]/forgot-password`, {
method: 'POST',
headers: {
@@ -316,7 +315,7 @@ const res = await fetch(`http://localhost:3000/api/[collection-slug]/forgot-pass
body: JSON.stringify({
email: 'dev@payloadcms.com',
}),
})
});
```
**Example GraphQL Mutation**:
@@ -329,14 +328,14 @@ mutation {
**Example Local API forgot password**:
```js
```ts
const token = await payload.forgotPassword({
collection: '[collection-slug]',
data: {
email: 'dev@payloadcms.com',
},
disableEmail: false // you can disable the auto-generation of email via local API
})
});
```
<Banner type="success">
@@ -349,7 +348,7 @@ const token = await payload.forgotPassword({
After a user has "forgotten" their password and a token is generated, that token can be used to send to the reset password operation along with a new password which will allow the user to reset their password securely.
**Example REST API Reset Password**:
```js
```ts
const res = await fetch(`http://localhost:3000/api/[collection-slug]/reset-password`, {
method: 'POST',
headers: {
@@ -359,7 +358,7 @@ const res = await fetch(`http://localhost:3000/api/[collection-slug]/reset-passw
token: 'TOKEN_GOES_HERE'
password: 'not-today',
}),
})
});
const json = await res.json();
@@ -380,7 +379,7 @@ const json = await res.json();
**Example GraphQL Mutation**:
```
```graphql
mutation {
resetPassword[collection-singular-label](token: "TOKEN_GOES_HERE", password: "not-today")
}

View File

@@ -12,7 +12,7 @@ keywords: authentication, config, configuration, overview, documentation, Conten
Authentication is used within the Payload Admin panel itself as well as throughout your app(s) themselves however you determine necessary.
![Authentication admin panel functionality](https://payloadcms.com/images/auth-admin.jpg)
![Authentication admin panel functionality](https://payloadcms.com/images/docs/auth-admin.jpg)
*Admin panel screenshot depicting an Admins Collection with Auth enabled*
**Here are some common use cases of Authentication outside of Payload's dashboard itself:**
@@ -32,8 +32,10 @@ Every Payload Collection can opt-in to supporting Authentication by specifying t
Simple example collection:
```js
const Admins = {
```ts
import { CollectionConfig } from 'payload/types';
const Admins: CollectionConfig = {
slug:
// highlight-start
auth: {
@@ -60,7 +62,7 @@ const Admins = {
}
```
**By enabling Authetication on a config, the following modifications will automatically be made to your Collection:**
**By enabling Authentication on a config, the following modifications will automatically be made to your Collection:**
1. `email` as well as password `salt` & `hash` fields will be added to your Collection's schema
1. The Admin panel will feature a new set of corresponding UI to allow for changing password and editing email
@@ -95,7 +97,7 @@ However, if you use `fetch` or similar APIs to retrieve Payload resources from i
Fetch example, including credentials:
```js
```ts
const response = await fetch('http://localhost:3000/api/pages', {
credentials: 'include',
});
@@ -124,12 +126,11 @@ So, if a user of coolsite.com is logged in and just browsing around on the inter
To define domains that should allow users to identify themselves via the Payload HTTP-only cookie, use the `csrf` option on the base Payload config to whitelist domains that you trust.
`payload.config.js`:
```js
`payload.config.ts`:
```ts
import { buildConfig } from 'payload/config';
const config = buildConfig({
serverURL: 'http://localhost:3000',
collections: [
// collections here
],
@@ -149,7 +150,7 @@ export default config;
In addition to authenticating via an HTTP-only cookie, you can also identify users via the `Authorization` header on an HTTP request.
Example:
```js
```ts
const request = await fetch('http://localhost:3000', {
headers: {
Authorization: `JWT ${token}`

View File

@@ -6,7 +6,7 @@ desc: Make full use of Payload's built-in authentication with your own custom Ex
keywords: authentication, middleware, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express
---
Because Payload uses your existing Express server, you are free to add whatever logic you need to your app through endpoints of your own. However, Payload does not add its middleware to your Express app itself—instead, ist scopes all of its middleware to Payload-specific routers.
Because Payload uses your existing Express server, you are free to add whatever logic you need to your app through endpoints of your own. However, Payload does not add its middleware to your Express app itself—instead, it scopes all of its middleware to Payload-specific routers.
This approach has a ton of benefits - it's great for isolation of concerns and limiting scope, but it also means that your additional routes won't have access to Payload's user authentication.
@@ -15,7 +15,7 @@ This approach has a ton of benefits - it's great for isolation of concerns and l
</Banner>
Example in `server.js`:
```js
```ts
import express from 'express';
import payload from 'payload';

View File

@@ -17,20 +17,23 @@ It's often best practice to write your Collections in separate files and then im
| **`slug`** * | Unique, URL-friendly string that will act as an identifier for this Collection. |
| **`fields`** * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [Click here](/docs/fields/overview) for a full list of field types as well as how to configure them. |
| **`labels`** | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. |
| **`description`**| Text or React component to display below the Collection label in the List view to give editors more information. |
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-options). |
| **`hooks`** | Entry points to "tie in" to Collection actions at specific points. [More](/docs/hooks/overview#collection-hooks) |
| **`access`** | Provide access control functions to define exactly who should be able to do what with Documents in this Collection. [More](/docs/access-control/overview/#collections) |
| **`auth`** | Specify options if you would like this Collection to feature authentication. For more, consult the [Authentication](/docs/authentication/config) documentation. |
| **`upload`** | Specify options if you would like this Collection to support file uploads. For more, consult the [Uploads](/docs/upload/overview) documentation. |
| **`timestamps`** | Set to false to disable documents' automatically generated `createdAt` and `updatedAt` timestamps. |
| **`versions`** | Set to true to enable default options, or configure with object properties. [More](/docs/versions/overview#collection-config)|
| **`endpoints`** | Add custom routes to the REST API. [More](/docs/rest-api/overview#custom-endpoints) |
*\* An asterisk denotes that a property is required.*
#### Simple collection example
```js
const Orders = {
```ts
import { CollectionConfig } from 'payload/types';
const Orders: CollectionConfig = {
slug: 'orders',
fields: [
{
@@ -45,25 +48,29 @@ const Orders = {
required: true,
}
]
}
};
```
#### More collection config examples
You can find an assortment of [example collection configs](https://github.com/payloadcms/payload/blob/master/demo/collections) in the Payload source code on GitHub.
You can find an assortment of [example collection configs](https://github.com/payloadcms/public-demo/tree/master/src/collections) in the Public Demo source code on GitHub.
### Admin options
You can customize the way that the Admin panel behaves on a collection-by-collection basis by defining the `admin` property on a collection's config.
| Option | Description |
| ---------------------------- | -------------|
| `useAsTitle` | Specify a top-level field to use for a document title throughout the Admin panel. If no field is defined, the ID of the document is used as the title. |
| `defaultColumns` | Array of field names that correspond to which columns to show by default in this collection's List view. |
| `disableDuplicate ` | Disables the "Duplicate" button while editing documents within this collection. |
| Option | Description |
| --------------------------- | -------------|
| `group` | Text used as a label for grouping collection links together in the navigation. |
| `hooks` | Admin-specific hooks for this collection. [More](#admin-hooks) |
| `useAsTitle` | Specify a top-level field to use for a document title throughout the Admin panel. If no field is defined, the ID of the document is used as the title. |
| `description` | Text or React component to display below the Collection label in the List view to give editors more information. |
| `defaultColumns` | Array of field names that correspond to which columns to show by default in this collection's List view. |
| `disableDuplicate ` | Disables the "Duplicate" button while editing documents within this collection. |
| `enableRichTextRelationship` | The [Rich Text](/docs/fields/rich-text) field features a `Relationship` element which allows for users to automatically reference related documents within their rich text. Set to `true` by default. |
| `preview` | Function to generate preview URLS within the Admin panel that can point to your app. [More](#preview). |
| `components` | Swap in your own React components to be used within this collection. [More](/docs/admin/components#collections) |
| `preview` | Function to generate preview URLS within the Admin panel that can point to your app. [More](#preview). |
| `components` | Swap in your own React components to be used within this collection. [More](/docs/admin/components#collections) |
| `listSearchableFields` | Specify which fields should be searched in the List search view. [More](#list-searchable-fields) |
### Preview
@@ -74,30 +81,32 @@ If the function is specified, a Preview button will automatically appear in the
**The preview function accepts two arguments:**
1. The document being edited
1. An `options` object, containing `locale` and `token` properties. The `token` is the currently logged in user's JWT.
1. An `options` object, containing `locale` and `token` properties. The `token` is the currently logged-in user's JWT.
**Example collection with preview function:**
```js
{
```ts
import { CollectionConfig } from 'payload/types';
const Posts: CollectionConfig = {
slug: 'posts',
fields: [
{
name: 'slug',
type: 'text',
required: true,
}
]
},
],
admin: {
preview: (doc, { locale }) => {
if (doc?.slug) {
return `https://bigbird.com/preview/posts/${doc.slug}?locale=${locale}`,
return `https://bigbird.com/preview/posts/${doc.slug}?locale=${locale}`;
}
return null;
}
}
}
},
},
};
```
### Access control
@@ -112,18 +121,73 @@ Hooks are a powerful way to extend collection functionality and execute your own
Collections support all field types that Payload has to offer—including simple fields like text and checkboxes all the way to more complicated layout-building field groups like Blocks. [Click here](/docs/fields/overview) to learn more about field types.
### List Searchable Fields
In the List view, there is a "search" box that allows you to quickly find a document with a search. By default, it searches on the ID field. If you have `admin.useAsTitle` defined, the list search will use that field. However, you can define more than one field to search to make it easier on your admin editors to find the data they need.
For example, let's say you have a Posts collection with `title`, `metaDescription`, and `tags` fields - and you want all three of those fields to be searchable in the List view. You can simply add `admin.listSearchableFields: ['title', 'metaDescription', 'tags']` - and the admin UI will automatically search on those three fields plus the ID field.
<Banner type="warning">
<strong>Note:</strong><br/>
If you are adding <strong>listSearchableFields</strong>, make sure you index each of these fields so your admin queries can remain performant.
</Banner>
### Admin Hooks
In addition to collection hooks themselves, Payload provides for admin UI-specific hooks that you can leverage.
**`beforeDuplicate`**
The `beforeDuplicate` hook is an async function that accepts an object containing the data to duplicate, as well as the locale of the doc to duplicate. Within this hook, you can modify the data to be duplicated, which is useful in cases where you have unique fields that need to be incremented or similar, as well as if you want to automatically modify a document's `title`.
Example:
```ts
import { BeforeDuplicate, CollectionConfig } from 'payload/types';
// Your auto-generated Page type
import { Page } from '../payload-types.ts';
const beforeDuplicate: BeforeDuplicate<Page> = ({ data }) => {
return {
...data,
title: `${data.title} Copy`,
uniqueField: data.uniqueField ? `${data.uniqueField}-copy` : '',
};
};
export const Page: CollectionConfig = {
slug: 'pages',
admin: {
hooks: {
beforeDuplicate,
}
},
fields: [
{
name: 'title',
type: 'text',
},
{
name: 'uniqueField',
type: 'text',
unique: true,
}
]
}
```
### TypeScript
You can import collection types as follows:
```js
```ts
import { CollectionConfig } from 'payload/types';
// This is the type used for incoming collection configs.
// Only the bare minimum properties are marked as required.
```
```js
```ts
import { SanitizedCollectionConfig } from 'payload/types';
// This is the type used after an incoming collection config is fully sanitized.

View File

@@ -16,7 +16,6 @@ Payload utilizes a few Express-specific middleware packages within its own route
```js
{
serverURL: 'http://localhost:3000',
express: {
json: {
limit: '4mb',
@@ -37,7 +36,6 @@ To customize compression options, pass an object to the Payload config's `expres
```js
{
serverURL: 'http://localhost:3000',
express: {
compression: {
// settings go here

View File

@@ -21,13 +21,17 @@ As with Collection configs, it's often best practice to write your Globals in se
| **`admin`** | Admin-specific configuration. See below for [more detail](/docs/configuration/globals#admin-options). |
| **`hooks`** | Entry points to "tie in" to collection actions at specific points. [More](/docs/hooks/overview#global-hooks) |
| **`access`** | Provide access control functions to define exactly who should be able to do what with this Global. [More](/docs/access-control/overview/#globals) |
| **`versions`** | Set to true to enable default options, or configure with object properties. [More](/docs/versions/overview#globals-config)|
| **`endpoints`** | Add custom routes to the REST API. [More](/docs/rest-api/overview#custom-endpoints)|
*\* An asterisk denotes that a property is required.*
#### Simple Global example
```js
const Nav = {
```ts
import { GlobalConfig } from 'payload/types';
const Nav: GlobalConfig = {
slug: 'nav',
fields: [
{
@@ -45,12 +49,14 @@ const Nav = {
]
},
]
}
};
export default Nav;
```
#### More Global config examples
#### Global config example
You can find an assortment of [example Global configs](https://github.com/payloadcms/payload/blob/master/demo/globals) in the Payload source code on GitHub.
You can find an [example Global config](https://github.com/payloadcms/public-demo/blob/master/src/globals/MainMenu.ts) in the Public Demo source code on GitHub.
### Admin options
@@ -76,14 +82,14 @@ Globals support all field types that Payload has to offer—including simple fie
You can import global types as follows:
```js
```ts
import { GlobalConfig } from 'payload/types';
// This is the type used for incoming global configs.
// Only the bare minimum properties are marked as required.
```
```js
```ts
import { SanitizedGlobalConfig } from 'payload/types';
// This is the type used after an incoming global config is fully sanitized.

View File

@@ -14,22 +14,23 @@ Add the `localization` property to your Payload config to enable localization pr
**Example Payload config set up for localization:**
```js
{
serverURL: 'http://localhost:3000',
collections: [
... // collections go here
],
localization: {
locales: [
'en',
'es',
'de',
],
defaultLocale: 'en',
fallback: true,
},
}
```ts
import { buildConfig } from 'payload/config'
export default buildConfig({
collections: [
// collections go here
],
localization: {
locales: [
'en',
'es',
'de',
],
defaultLocale: 'en',
fallback: true,
},
});
```
**Here is a brief explanation of each of the options available within the `localization` property:**
@@ -54,11 +55,11 @@ Payload localization works on a **field** level—not a document level. In addit
```js
{
name: 'title',
type: 'text',
// highlight-start
localized: true,
// highlight-end
name: 'title',
type: 'text',
// highlight-start
localized: true,
// highlight-end
}
```
@@ -67,8 +68,8 @@ With the above configuration, the `title` field will now be saved in the databas
All field types with a `name` property support the `localized` property—even the more complex field types like `array`s and `block`s.
<Banner>
<strong>Note:</strong><br/>
Enabling localization for field types that support nested fields will automatically create localized "sets" of all fields contained within the field. For example, if you have a page layout using a blocks field type, you have the choice of either localizing the full layout, by enabling localization on the top-level blocks field, or only certain fields within the layout.
<strong>Note:</strong><br/>
Enabling localization for field types that support nested fields will automatically create localized "sets" of all fields contained within the field. For example, if you have a page layout using a blocks field type, you have the choice of either localizing the full layout, by enabling localization on the top-level blocks field, or only certain fields within the layout.
</Banner>
### Retrieving localized docs
@@ -105,16 +106,16 @@ The `fallbackLocale` arg will accept valid locales as well as `none` to disable
```graphql
query {
Posts(locale: de, fallbackLocale: none) {
docs {
title
}
}
Posts(locale: de, fallbackLocale: none) {
docs {
title
}
}
}
```
<Banner>
In GraphQL, specifying the locale at the top level of a query will automatically apply it throughout all nested relationship fields. You can override this behavior by re-specifying locale arguments in nested related document queries.
In GraphQL, specifying the locale at the top level of a query will automatically apply it throughout all nested relationship fields. You can override this behavior by re-specifying locale arguments in nested related document queries.
</Banner>
##### Local API
@@ -125,9 +126,9 @@ You can specify `locale` as well as `fallbackLocale` within the Local API as wel
```js
const posts = await payload.find({
collection: 'posts',
locale: 'es',
fallbackLocale: false,
collection: 'posts',
locale: 'es',
fallbackLocale: false,
})
```

View File

@@ -8,7 +8,7 @@ keywords: overview, config, configuration, documentation, Content Management Sys
Payload is a *config-based*, code-first CMS and application framework. The Payload config is central to everything that Payload does. It scaffolds the data that Payload stores as well as maintains custom React components, hook logic, custom validations, and much more. The config itself and all of its dependencies are run through Babel, so you can take full advantage of newer JavaScript features and even directly import React components containing JSX.
<strong>Also, because the Payload source code is fully written in TypeScript, its configs are strongly typed—meaning that even if you aren't using TypeScript to build your project, your IDE (such as VSCode) may still provide helpful information like type-ahead suggestions while you write your config.</strong>
**Also, because the Payload source code is fully written in TypeScript, its configs are strongly typed—meaning that even if you aren't using TypeScript to build your project, your IDE (such as VSCode) may still provide helpful information like type-ahead suggestions while you write your config.**
<Banner type="warning">
<strong>Important:</strong><br />This file is included in the Payload admin bundle, so make sure you do not embed any sensitive information.
@@ -18,33 +18,35 @@ Payload is a *config-based*, code-first CMS and application framework. The Paylo
| Option | Description |
| -------------------- | -------------|
| `serverURL` | A _required_ string used to define the absolute URL of your app including the protocol, for example `https://'example.com`. No paths allowed, only protocol, domain and (optionally) port |
| `serverURL` | A string used to define the absolute URL of your app including the protocol, for example `https://example.com`. No paths allowed, only protocol, domain and (optionally) port |
| `collections` | An array of all Collections that Payload will manage. To read more about how to define your collection configs, [click here](/docs/configuration/collections). |
| `cors` | Either a whitelist array of URLS to allow CORS requests from, or a wildcard string (`'*'`) to accept incoming requests from any domain. |
| `globals` | An array of all Globals that Payload will manage. For more on Globals and their configs, [click here](/docs/configuration/globals). |
| `admin` | Base Payload admin configuration. Specify custom components, control metadata, set the Admin user collection, and [more](/docs/admin/overview#admin-options). |
| `localization` | Opt-in and control how Payload handles the translation of your content into multiple locales. [More](/docs/configuration/localization) |
| `graphQL` | Manage GraphQL-specific functionality here. Define your own queries and mutations, manage query complexity limits, and [more](/docs/graphql/overview). |
| `graphQL` | Manage GraphQL-specific functionality here. Define your own queries and mutations, manage query complexity limits, and [more](/docs/graphql/overview#graphql-options). |
| `cookiePrefix` | A string that will be prefixed to all cookies that Payload sets. |
| `cors` | Either a whitelist array of URLS to allow CORS requests from, or a wildcard string (`'*'`) to accept incoming requests from any domain. |
| `csrf` | A whitelist array of URLs to allow Payload cookies to be accepted from as a form of CSRF protection. [More](/docs/authentication/overview#csrf-protection) |
| `defaultDepth` | If a user does not specify `depth` while requesting a resource, this depth will be used. [More](/docs/getting-started/concepts#depth) |
| `maxDepth` | The maximum allowed depth to be permitted application-wide. This setting helps prevent against malicious queries. Defaults to `10`. |
| `indexSortableFields`| Automatically index all sortable top-level fields in the database to improve sort performance and add database compatibility for Azure Cosmos and similar. |
| `upload` | Base Payload upload configuration. [More](/docs/upload/overview#payload-wide-upload-options). |
| `routes` | Control the routing structure that Payload binds itself to. Specify `admin`, `api`, `graphQL`, and `graphQLPlayground`. |
| `email` | Base email settings to allow Payload to generate email such as Forgot Password requests and other requirements. [More](/docs/email/overview#configuration) |
| `express` | Express-specific middleware options such as compression and JSON parsing. [More](/docs/configuration/express). |
| `express` | Express-specific middleware options such as compression and JSON parsing. [More](/docs/configuration/express) |
| `debug` | Enable to expose more detailed error information. |
| `telemetry` | Disable Payload telemetry by passing `false`. [More](/docs/configuration/overview#telemetry) |
| `rateLimit` | Control IP-based rate limiting for all Payload resources. Used to prevent DDoS attacks and [more](/docs/production/preventing-abuse#rate-limiting-requests). |
| `hooks` | Tap into Payload-wide hooks. [More](/docs/hooks/overview) |
| `plugins` | An array of Payload plugins. [More](/docs/plugins/overview) |
| `endpoints` | An array of custom API endpoints added to the Payload router. [More](/docs/rest-api/overview#custom-endpoints) |
#### Simple example
```js
```ts
import { buildConfig } from 'payload/config';
const config = buildConfig({
serverURL: 'http://localhost:3000',
export default buildConfig({
collections: [
{
slug: 'pages',
@@ -81,14 +83,11 @@ const config = buildConfig({
}
]
});
export default config;
```
#### Full example config
You can see a full [example config](https://github.com/payloadcms/payload/blob/master/demo/payload.config.ts) in the Payload source code on GitHub.
You can see a full [example config](https://github.com/payloadcms/public-demo/blob/master/src/payload.config.ts) in the Public Demo source code on GitHub.
### Using environment variables in your config
@@ -138,7 +137,9 @@ The Payload config itself, as well as all files that it requires or imports, are
Payload comes with `isomorphic-fetch` installed which means that even in Node, you can use the `fetch` API just as you would within the browser. No need to import `axios` or similar, unless you want to!
#### Re-using the Payload `babel.config.js`
#### Payload Config and Babel
The entire Payload config is transpiled automatically by Payload via `babel`.
If for any reason you need to re-use the built-in Payload `babel.config.js`, you can do so by importing it as follows:
@@ -146,20 +147,46 @@ If for any reason you need to re-use the built-in Payload `babel.config.js`, you
import { config } from 'payload/babel';
```
<Banner type="warning">
<strong>Note:</strong><br/>
Because the Payload config is transpiled internally, if you want to import it to share or reuse any of its properties within your own Node server's code, you need to make sure that <em>you manually transpile it</em> using <strong>babel-register</strong> or similar. For example, if you try to import your config directly into your server, your Node process will likely crash because the Payload config supports React components, TypeScript, and new ES6+ features.
</Banner>
However, you can share code, like for example your config's `serverURL` property by "hoisting" your shared properties above your config and writing any "shared" code in a module that is compatible with your Node environment.
For example, to share your `serverURL`, you could create a file like the following:
`serverURL.js`:
```js
const serverURL = 'http://localhost:3000';
module.exports = serverURL;
```
Then, you could import this file into both your Payload config and your server, in an effort to avoid importing your full Payload config directly into your server.
### TypeScript
You can import config types as follows:
```js
```ts
import { Config } from 'payload/config';
// This is the type used for an incoming Payload config.
// Only the bare minimum properties are marked as required.
```
```js
```ts
import { SanitizedConfig } from 'payload/config';
// This is the type used after an incoming Payload config is fully sanitized.
// Generally, this is only used internally by Payload.
```
### Telemetry
Payload collects **completely anonymous** telemetry data about general usage. This data is super important to us and helps us accurately understand how we're growing and what we can do to build the software into everything that it can possibly be. The telemetry that we collect also help us demonstrate our growth in an accurate manner, which helps us as we seek investment to build and scale our team. If we can accurately demonstrate our growth, we can more effectively continue to support Payload as free and open-source software. To opt out of telemetry, you can pass `telemetry: false` within your Payload config.
For more information about what we track, take a look at our [privacy policy](/privacy).

View File

@@ -27,10 +27,11 @@ The following options are configurable in the `email` property object as part of
| Option | Description |
| ---------------------------- | -------------|
| **`transport`** | The NodeMailer transport object for when you want to do it yourself, not needed when transportOptions is set |
| **`transportOptions`** | An object that configures the transporter that Payload will create. For all the available options see the [NodeMailer documentation](https://nodemailer.com/smtp/) or see the examples below |
| **`fromName`** * | The name part of the From field that will be seen on the delivered email |
| **`fromAddress`** * | The email address part of the From field that will be used when delivering email |
| **`transport`** | The NodeMailer transport object for when you want to do it yourself, not needed when transportOptions is set |
| **`transportOptions`** | An object that configures the transporter that Payload will create. For all the available options see the [NodeMailer documentation](https://nodemailer.com/smtp/) or see the examples below |
| **`logMockCredentials`** | If set to true and no transport/transportOptions, ethereal credentials will be logged to console on startup |
*\* An asterisk denotes that a property is required.*
@@ -39,7 +40,7 @@ The following options are configurable in the `email` property object as part of
Simple Mail Transfer Protocol, also known as SMTP can be passed in using the `transportOptions` object on the `email` options.
**Example email part using SMTP:**
```js
```ts
payload.init({
email: {
transportOptions: {
@@ -59,6 +60,7 @@ payload.init({
fromAddress: 'hello@example.com'
}
// ...
})
```
<Banner type="warning">
@@ -69,9 +71,9 @@ payload.init({
Many third party mail providers are available and offer benefits beyond basic SMTP. As an example your payload init could look this if you wanted to use SendGrid.com though the same approach would work for any other [NodeMailer transports](https://nodemailer.com/transports/) shown here or provided by another third party.
```js
const nodemailerSendgrid = require('nodemailer-sendgrid');
const payload = require('payload');
```ts
import payload from 'payload'
import nodemailerSendgrid from 'nodemailer-sendgrid'
const sendGridAPIKey = process.env.SENDGRID_API_KEY;
@@ -91,7 +93,10 @@ payload.init({
### Use a custom NodeMailer transport
To take full control of the mail transport you may wish to use `nodemailer.createTransport()` on your server and provide it to Payload init.
```js
```ts
import payload from 'payload'
import nodemailer from 'nodemailer'
const payload = require('payload');
const nodemailer = require('nodemailer');
@@ -111,6 +116,7 @@ payload.init({
transport
},
// ...
});
```
### Sending Mail
@@ -119,7 +125,20 @@ With a working transport you can call it anywhere you have access to payload by
### Mock transport
By default, Payload uses a mock implementation that only sends mail to the [ethereal](https://ethereal.email) capture service that will never reach a user's inbox. While in development you may wish to make use of the captured messages which is why the payload output during server output helpfully logs this out on the server console.
**Console output when starting payload with a mock email instance**
To see ethereal credentials, add `logMockCredentials: true` to the email options. This will cause them to be logged to console on startup.
```ts
payload.init({
email: {
fromName: 'Admin',
fromAddress: 'admin@example.com',
logMockCredentials: true, // Optional
},
// ...
});
```
**Console output when starting payload with a mock email instance and logMockCredentials: true**
```
[06:37:21] INFO (payload): Starting Payload...
[06:37:22] INFO (payload): Payload Demo Initialized

View File

@@ -16,7 +16,7 @@ keywords: array, fields, config, configuration, documentation, Content Managemen
- Navigational structures where editors can specify nav items containing pages ([relationship field](/docs/fields/relationship)), an "open in new tab" [checkbox field](/docs/fields/checkbox)
- Event agenda "timeslots" where you need to specify start & end time ([date field](/docs/fields/date)), label ([text field](/docs/fields/text)), and Learn More page [relationship](/docs/fields/relationship)
![Array field in Payload admin panel](https://payloadcms.com/images/fields/array.jpg)
![Array field in Payload admin panel](https://payloadcms.com/images/docs/fields/array.jpg)
*Admin panel screenshot of an Array field with a Row containing two text fields, a read-only text field and a checkbox*
### Config
@@ -31,19 +31,30 @@ keywords: array, fields, config, configuration, documentation, Content Managemen
| **`hooks`** | Provide field-based hooks to control logic for this field. [More](/docs/fields/overview#field-level-hooks) |
| **`access`** | Provide field-based access control to denote what users can see and do with this field's data. [More](/docs/fields/overview#field-level-access-control) |
| **`hidden`** | Restrict this field's visibility from all APIs entirely. Will still be saved to the database, but will not appear in any API or the Admin panel. |
| **`defaultValue`** | Provide an array of row data to be used for this field's default value. |
| **`defaultValue`** | Provide an array of row data to be used for this field's default value. [More](/docs/fields/overview#default-values) |
| **`localized`** | Enable localization for this field. Requires [localization to be enabled](/docs/configuration/localization) in the Base config. If enabled, a separate, localized set of all data within this Array will be kept, so there is no need to specify each nested field as `localized`. |
| **`required`** | Require this field to have a value. |
| **`labels`** | Customize the row labels appearing in the Admin dashboard. |
| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
*\* An asterisk denotes that a property is required.*
### Admin Config
In addition to the default [field admin config](/docs/fields/overview#admin-config), you can adjust the following properties:
| Option | Description |
| ---------------------- | ------------------------------- |
| **`initCollapsed`** | Set the initial collapsed state |
### Example
`collections/ExampleCollection.js`
```js
{
`collections/ExampleCollection.ts`
```ts
import { CollectionConfig } from 'payload/types';
const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
@@ -70,6 +81,5 @@ keywords: array, fields, config, configuration, documentation, Content Managemen
]
}
]
}
};
```

View File

@@ -16,7 +16,7 @@ keywords: blocks, fields, config, configuration, documentation, Content Manageme
- A form builder tool where available block configs might be `Text`, `Select`, or `Checkbox`.
- Virtual event agenda "timeslots" where a timeslot could either be a `Break`, a `Presentation`, or a `BreakoutSession`.
![Blocks field in Payload admin panel](https://payloadcms.com/images/fields/blocks.jpg)
![Blocks field in Payload admin panel](https://payloadcms.com/images/docs/fields/blocks.jpg)
*Admin panel screenshot of a Blocks field type with Call to Action and Number block examples*
@@ -32,14 +32,22 @@ keywords: blocks, fields, config, configuration, documentation, Content Manageme
| **`hooks`** | Provide field-level hooks to control logic for this field. [More](/docs/fields/overview#field-level-hooks) |
| **`access`** | Provide field-level access control to denote what users can see and do with this field's data. [More](/docs/fields/overview#field-level-access-control) |
| **`hidden`** | Restrict this field's visibility from all APIs entirely. Will still be saved to the database, but will not appear in any API response or the Admin panel. |
| **`defaultValue`** | Provide an array of block data to be used for this field's default value. |
| **`defaultValue`** | Provide an array of block data to be used for this field's default value. [More](/docs/fields/overview#default-values) |
| **`localized`** | Enable localization for this field. Requires [localization to be enabled](/docs/configuration/localization) in the Base config. If enabled, a separate, localized set of all data within this field will be kept, so there is no need to specify each nested field as `localized`. || **`required`** | Require this field to have a value. |
| **`unique`** | Enforce that each entry in the Collection has a unique value for this field. |
| **`labels`** | Customize the block row labels appearing in the Admin dashboard. |
| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
*\* An asterisk denotes that a property is required.*
### Admin Config
In addition to the default [field admin config](/docs/fields/overview#admin-config), you can adjust the following properties:
| Option | Description |
| ---------------------- | ------------------------------- |
| **`initCollapsed`** | Set the initial collapsed state |
### Block configs
Blocks are defined as separate configs of their own.
@@ -72,8 +80,10 @@ The Admin panel provides each block with a `blockName` field which optionally al
### Example
`collections/ExampleCollection.js`
```js
const QuoteBlock = {
```ts
import { Block, CollectionConfig } from 'payload/types';
const QuoteBlock: Block = {
slug: 'Quote', // required
imageURL: 'https://google.com/path/to/image.jpg',
imageAltText: 'A nice thumbnail image to show what this block looks like',
@@ -90,7 +100,7 @@ const QuoteBlock = {
]
};
const ExampleCollection = {
const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
@@ -106,3 +116,12 @@ const ExampleCollection = {
}
```
### TypeScript
As you build your own Block configs, you might want to store them in separate files but retain typing accordingly. To do so, you can import and use Payload's `Block` type:
```ts
import type { Block } from 'payload/types';
```

View File

@@ -22,7 +22,7 @@ keywords: checkbox, fields, config, configuration, documentation, Content Manage
| **`hooks`** | Provide field-based hooks to control logic for this field. [More](/docs/fields/overview#field-level-hooks) |
| **`access`** | Provide field-based access control to denote what users can see and do with this field's data. [More](/docs/fields/overview#field-level-access-control) |
| **`hidden`** | Restrict this field's visibility from all APIs entirely. Will still be saved to the database, but will not appear in any API or the Admin panel. |
| **`defaultValue`** | Provide data to be used for this field's default value. |
| **`defaultValue`** | Provide data to be used for this field's default value, will default to false if field is also `required`. [More](/docs/fields/overview#default-values) |
| **`localized`** | Enable localization for this field. Requires [localization to be enabled](/docs/configuration/localization) in the Base config. |
| **`required`** | Require this field to have a value. |
| **`admin`** | Admin-specific configuration. See the [default field admin config](/docs/fields/overview#admin-config) for more details. |
@@ -31,9 +31,11 @@ keywords: checkbox, fields, config, configuration, documentation, Content Manage
### Example
`collections/ExampleCollection.js`
```js
{
`collections/ExampleCollection.ts`
```ts
import { CollectionConfig } from 'payload/types';
const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
@@ -43,6 +45,5 @@ keywords: checkbox, fields, config, configuration, documentation, Content Manage
defaultValue: false,
}
]
}
};
```

View File

@@ -28,7 +28,7 @@ This field uses `prismjs` for syntax highlighting and `react-simple-code-editor`
| **`hooks`** | Provide field-based hooks to control logic for this field. [More](/docs/fields/overview#field-level-hooks) |
| **`access`** | Provide field-based access control to denote what users can see and do with this field's data. [More](/docs/fields/overview#field-level-access-control) |
| **`hidden`** | Restrict this field's visibility from all APIs entirely. Will still be saved to the database, but will not appear in any API or the Admin panel. |
| **`defaultValue`** | Provide data to be used for this field's default value. |
| **`defaultValue`** | Provide data to be used for this field's default value. [More](/docs/fields/overview#default-values) |
| **`localized`** | Enable localization for this field. Requires [localization to be enabled](/docs/configuration/localization) in the Base config. |
| **`required`** | Require this field to have a value. |
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
@@ -39,13 +39,27 @@ This field uses `prismjs` for syntax highlighting and `react-simple-code-editor`
In addition to the default [field admin config](/docs/fields/overview#admin-config), the Code field type also allows for the customization of a `language` property.
Currently, the `language` property only supports JavaScript syntax but more support will be added as requested.
The following `prismjs` plugins are imported, enabling the `language` property to accept the following values:
| Plugin | Language |
| ---------------------------- | ----------- |
| **`prism-css`** | `css` |
| **`prism-clike`** | `clike` |
| **`prism-markup`** | `markup`, `html`, `xml`, `svg`, `mathml`, `ssml`, `atom`, `rss` |
| **`prism-javascript`** | `javascript`, `js` |
| **`prism-json`** | `json` |
| **`prism-jsx`** | `jsx` |
| **`prism-typescript`** | `typescript`, `ts` |
| **`prism-tsx`** | `tsx` |
| **`prism-yaml`** | `yaml`, `yml` |
### Example
`collections/ExampleCollection.js`
```js
{
`collections/ExampleCollection.ts
```ts
import { CollectionConfig } from 'payload/types';
const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
@@ -57,6 +71,5 @@ Currently, the `language` property only supports JavaScript syntax but more supp
}
}
]
}
};
```

View File

@@ -0,0 +1,53 @@
---
title: Collapsible Field
label: Collapsible
order: 60
desc: With the Collapsible field, you can place fields within a collapsible layout component that can be collapsed / expanded.
keywords: row, fields, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, express
---
<Banner >
The Collapsible field is presentational-only and only affects the Admin panel. By using it, you can place fields within a nice layout component that can be collapsed / expanded.
</Banner>
### Config
| Option | Description |
| -------------- | ------------------------------------------------------------------------- |
| **`label`** * | A label to render within the header of the collapsible component. |
| **`fields`** * | Array of field types to nest within this Collapsible. |
| **`admin`** | Admin-specific configuration. See below for [more detail](#admin-config). |
*\* An asterisk denotes that a property is required.*
### Admin Config
In addition to the default [field admin config](/docs/fields/overview#admin-config), you can adjust the following properties:
| Option | Description |
| ---------------------- | ------------------------------- |
| **`initCollapsed`** | Set the initial collapsed state |
### Example
`collections/ExampleCollection.ts`
```ts
import { CollectionConfig } from 'payload/types';
const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
label: 'Header of collapsible goes here',
type: 'collapsible', // required
fields: [ // required
{
name: 'someTextField',
type: 'text',
required: true,
},
],
}
]
};
```

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