@payloadcms/plugin-seo 1.0.5 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +29 -11
  2. package/dist/collections/FormSubmissions/hooks/createCharge.d.ts +3 -0
  3. package/dist/collections/FormSubmissions/hooks/createCharge.js +53 -0
  4. package/dist/collections/FormSubmissions/hooks/createCharge.js.map +1 -0
  5. package/dist/collections/FormSubmissions/hooks/sendEmail.d.ts +3 -0
  6. package/dist/collections/FormSubmissions/hooks/sendEmail.js +151 -0
  7. package/dist/collections/FormSubmissions/hooks/sendEmail.js.map +1 -0
  8. package/dist/collections/FormSubmissions/index.d.ts +3 -0
  9. package/dist/collections/FormSubmissions/index.js +137 -0
  10. package/dist/collections/FormSubmissions/index.js.map +1 -0
  11. package/dist/collections/Forms/DynamicFieldSelector.d.ts +3 -0
  12. package/dist/collections/Forms/DynamicFieldSelector.js +62 -0
  13. package/dist/collections/Forms/DynamicFieldSelector.js.map +1 -0
  14. package/dist/collections/Forms/DynamicPriceSelector.d.ts +3 -0
  15. package/dist/collections/Forms/DynamicPriceSelector.js +76 -0
  16. package/dist/collections/Forms/DynamicPriceSelector.js.map +1 -0
  17. package/dist/collections/Forms/fields.d.ts +6 -0
  18. package/dist/collections/Forms/fields.js +481 -0
  19. package/dist/collections/Forms/fields.js.map +1 -0
  20. package/dist/collections/Forms/index.d.ts +3 -0
  21. package/dist/collections/Forms/index.js +194 -0
  22. package/dist/collections/Forms/index.js.map +1 -0
  23. package/dist/fields/MetaDescription.js +2 -4
  24. package/dist/fields/MetaDescription.js.map +1 -1
  25. package/dist/fields/MetaImage.js +1 -0
  26. package/dist/fields/MetaImage.js.map +1 -1
  27. package/dist/fields/MetaTitle.js +2 -4
  28. package/dist/fields/MetaTitle.js.map +1 -1
  29. package/dist/index.js +25 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/mocks/serverModule.d.ts +2 -0
  32. package/dist/mocks/serverModule.js +4 -0
  33. package/dist/mocks/serverModule.js.map +1 -0
  34. package/dist/types.d.ts +2 -0
  35. package/dist/ui/Preview.js +2 -4
  36. package/dist/ui/Preview.js.map +1 -1
  37. package/dist/utilities/deepMerge.d.ts +2 -0
  38. package/dist/utilities/deepMerge.js +44 -0
  39. package/dist/utilities/deepMerge.js.map +1 -0
  40. package/dist/utilities/generateMetaDescription.d.ts +2 -0
  41. package/dist/utilities/generateMetaDescription.js +57 -0
  42. package/dist/utilities/generateMetaDescription.js.map +1 -0
  43. package/dist/utilities/generateMetaImage.d.ts +2 -0
  44. package/dist/utilities/generateMetaImage.js +14 -0
  45. package/dist/utilities/generateMetaImage.js.map +1 -0
  46. package/dist/utilities/generateMetaTitle.d.ts +2 -0
  47. package/dist/utilities/generateMetaTitle.js +74 -0
  48. package/dist/utilities/generateMetaTitle.js.map +1 -0
  49. package/dist/utilities/replaceDoubleCurlys.d.ts +7 -0
  50. package/dist/utilities/replaceDoubleCurlys.js +20 -0
  51. package/dist/utilities/replaceDoubleCurlys.js.map +1 -0
  52. package/dist/utilities/serializeRichText.d.ts +10 -0
  53. package/dist/utilities/serializeRichText.js +49 -0
  54. package/dist/utilities/serializeRichText.js.map +1 -0
  55. package/dist/utilities/stringifyRichText.d.ts +3 -0
  56. package/dist/utilities/stringifyRichText.js +16 -0
  57. package/dist/utilities/stringifyRichText.js.map +1 -0
  58. package/package.json +3 -3
package/README.md CHANGED
@@ -5,12 +5,12 @@
5
5
  A plugin for [Payload CMS](https://github.com/payloadcms/payload) to auto-generate SEO meta data based on the content of your documents.
6
6
 
7
7
  Core features:
8
- - Adds a `meta` field to every SEO-enabled collection that:
9
- - Includes title, description, and image subfields
10
- - Auto-generates meta data from your document's content
11
- - Displays hints and indicators to help content editors
12
- - Renders a snippet of what a search engine might display
13
- - Soon: variable injection
8
+ - Adds a `meta` field to every SEO-enabled collection or global. It:
9
+ - includes title, description, and image subfields
10
+ - auto-generates meta data from your document's content
11
+ - displays hints and indicators to help content editors
12
+ - renders a snippet of what a search engine might display
13
+ - soon will support variable injection
14
14
 
15
15
  ## Installation
16
16
 
@@ -59,16 +59,23 @@ export default config;
59
59
 
60
60
  ### Options
61
61
 
62
- - `collections`
62
+ - `collections` : string[] | optional
63
63
 
64
64
  An array of collections slugs to enable SEO. Enabled collections receive a `meta` field which is an object of title, description, and image subfields.
65
65
 
66
+ - `globals` : string[] | optional
66
67
 
67
- - `uploadsCollection`
68
+ An array of global slugs to enable SEO. Enabled globals receive a `meta` field which is an object of title, description, and image subfields.
69
+
70
+ - `uploadsCollection` : string | optional
68
71
 
69
72
  An upload-enabled collection slug, for the meta image to access.
70
73
 
71
- - `generateTitle`
74
+ - `tabbedUI` : boolean | optional
75
+
76
+ Displays meta fields as tabs using Payload's [Tabs Field](https://payloadcms.com/docs/fields/tabs). Defaults to `false`.
77
+
78
+ - `generateTitle` : method | optional
72
79
 
73
80
  A function that allows you to return any meta title, including from document's content.
74
81
 
@@ -79,7 +86,7 @@ export default config;
79
86
  })
80
87
  ```
81
88
 
82
- - `generateDescription`
89
+ - `generateDescription` : method | optional
83
90
 
84
91
  A function that allows you to return any meta description, including from document's content.
85
92
 
@@ -90,7 +97,18 @@ export default config;
90
97
  })
91
98
  ```
92
99
 
93
- - `generateURL`
100
+ - `generateImage` : method | optional
101
+
102
+ A function that allows you to return any meta image, including from document's content.
103
+
104
+ ```js
105
+ seo({
106
+ ...
107
+ generateImage: ({ doc, locale }) => doc?.featuredImage?.value
108
+ })
109
+ ```
110
+
111
+ - `generateURL` : method | optional
94
112
 
95
113
  A function called by the search preview component to display the actual URL of your page.
96
114
 
@@ -0,0 +1,3 @@
1
+ import { FormConfig } from "../../../types";
2
+ declare const createCharge: (beforeChangeData: any, formConfig: FormConfig) => Promise<any>;
3
+ export default createCharge;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var createCharge = function (beforeChangeData, formConfig) { return __awaiter(void 0, void 0, void 0, function () {
40
+ var operation, handlePayment;
41
+ return __generator(this, function (_a) {
42
+ operation = beforeChangeData.operation;
43
+ if (operation === 'create') {
44
+ handlePayment = (formConfig || {}).handlePayment;
45
+ if (typeof handlePayment === 'function') {
46
+ handlePayment(beforeChangeData);
47
+ }
48
+ }
49
+ return [2 /*return*/, beforeChangeData];
50
+ });
51
+ }); };
52
+ exports.default = createCharge;
53
+ //# sourceMappingURL=createCharge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCharge.js","sourceRoot":"","sources":["../../../../src/collections/FormSubmissions/hooks/createCharge.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAM,YAAY,GAAG,UAAO,gBAAqB,EAAE,UAAsB;;;QAErE,SAAS,GACP,gBAAgB,UADT,CACU;QAErB,IAAI,SAAS,KAAK,QAAQ,EAAE;YAExB,aAAa,GACX,CAAA,UAAU,IAAI,EAAE,CAAA,cADL,CACM;YAErB,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE;gBACvC,aAAa,CAAC,gBAAgB,CAAC,CAAC;aACjC;SACF;QAED,sBAAO,gBAAgB,EAAC;;KACzB,CAAC;AAEF,kBAAe,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { FormConfig } from '../../../types';
2
+ declare const sendEmail: (beforeChangeData: any, formConfig: FormConfig) => Promise<any>;
3
+ export default sendEmail;
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __rest = (this && this.__rest) || function (s, e) {
50
+ var t = {};
51
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
+ t[p] = s[p];
53
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
+ t[p[i]] = s[p[i]];
57
+ }
58
+ return t;
59
+ };
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ var serializeRichText_1 = require("../../../utilities/serializeRichText");
62
+ var replaceDoubleCurlys_1 = require("../../../utilities/replaceDoubleCurlys");
63
+ var sendEmail = function (beforeChangeData, formConfig) { return __awaiter(void 0, void 0, void 0, function () {
64
+ var operation, data, formSubmissionID, payload_1, _a, formID, submissionData_1, _b, beforeEmail, formOverrides, form, emails, formattedEmails, emailsToSend, log, err_1;
65
+ return __generator(this, function (_c) {
66
+ switch (_c.label) {
67
+ case 0:
68
+ operation = beforeChangeData.operation;
69
+ if (!(operation === 'create')) return [3 /*break*/, 11];
70
+ data = beforeChangeData.data, formSubmissionID = beforeChangeData.data.id, payload_1 = beforeChangeData.req.payload;
71
+ _a = data || {}, formID = _a.form, submissionData_1 = _a.submissionData;
72
+ _b = formConfig || {}, beforeEmail = _b.beforeEmail, formOverrides = _b.formOverrides;
73
+ _c.label = 1;
74
+ case 1:
75
+ _c.trys.push([1, 9, , 10]);
76
+ return [4 /*yield*/, payload_1.findByID({
77
+ id: formID,
78
+ collection: (formOverrides === null || formOverrides === void 0 ? void 0 : formOverrides.slug) || 'forms',
79
+ })];
80
+ case 2:
81
+ form = _c.sent();
82
+ if (!form) return [3 /*break*/, 7];
83
+ emails = form.emails;
84
+ if (!emails) return [3 /*break*/, 6];
85
+ formattedEmails = emails.map(function (email) {
86
+ var message = email.message, subject = email.subject, emailTo = email.emailTo, emailFrom = email.emailFrom;
87
+ var to = (0, replaceDoubleCurlys_1.replaceDoubleCurlys)(emailTo, submissionData_1);
88
+ var from = (0, replaceDoubleCurlys_1.replaceDoubleCurlys)(emailFrom, submissionData_1);
89
+ if (to && from) {
90
+ return ({
91
+ to: to,
92
+ from: from,
93
+ subject: (0, replaceDoubleCurlys_1.replaceDoubleCurlys)(subject, submissionData_1),
94
+ html: "<div>".concat((0, serializeRichText_1.serialize)(message, submissionData_1))
95
+ });
96
+ }
97
+ return null;
98
+ }).filter(Boolean);
99
+ emailsToSend = formattedEmails;
100
+ if (!(typeof beforeEmail === 'function')) return [3 /*break*/, 4];
101
+ return [4 /*yield*/, beforeEmail(formattedEmails)];
102
+ case 3:
103
+ emailsToSend = _c.sent();
104
+ _c.label = 4;
105
+ case 4:
106
+ log = emailsToSend.map(function (_a) {
107
+ var html = _a.html, rest = __rest(_a, ["html"]);
108
+ return (__assign({}, rest));
109
+ });
110
+ return [4 /*yield*/, Promise.all(emailsToSend.map(function (email) { return __awaiter(void 0, void 0, void 0, function () {
111
+ var to, emailPromise, err_2;
112
+ return __generator(this, function (_a) {
113
+ switch (_a.label) {
114
+ case 0:
115
+ to = email.to;
116
+ _a.label = 1;
117
+ case 1:
118
+ _a.trys.push([1, 3, , 4]);
119
+ return [4 /*yield*/, payload_1.sendEmail(email)];
120
+ case 2:
121
+ emailPromise = _a.sent();
122
+ return [2 /*return*/, emailPromise];
123
+ case 3:
124
+ err_2 = _a.sent();
125
+ console.error("Error while sending email to address: ".concat(to, ". Email not sent."));
126
+ console.error(err_2);
127
+ return [3 /*break*/, 4];
128
+ case 4: return [2 /*return*/];
129
+ }
130
+ });
131
+ }); }))];
132
+ case 5:
133
+ _c.sent();
134
+ _c.label = 6;
135
+ case 6: return [3 /*break*/, 8];
136
+ case 7:
137
+ console.log('No emails to send.');
138
+ _c.label = 8;
139
+ case 8: return [3 /*break*/, 10];
140
+ case 9:
141
+ err_1 = _c.sent();
142
+ console.error("Error while sending one or more emails in form submission id: ".concat(formSubmissionID, "."));
143
+ console.error(err_1);
144
+ return [3 /*break*/, 10];
145
+ case 10: return [2 /*return*/, data];
146
+ case 11: return [2 /*return*/, beforeChangeData];
147
+ }
148
+ });
149
+ }); };
150
+ exports.default = sendEmail;
151
+ //# sourceMappingURL=sendEmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendEmail.js","sourceRoot":"","sources":["../../../../src/collections/FormSubmissions/hooks/sendEmail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { CollectionConfig } from 'payload/types';
2
+ import { FormConfig } from '../../types';
3
+ export declare const generateSubmissionCollection: (formConfig: FormConfig) => CollectionConfig;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateSubmissionCollection = void 0;
7
+ var deepMerge_1 = __importDefault(require("../../utilities/deepMerge"));
8
+ var sendEmail_1 = __importDefault(require("./hooks/sendEmail"));
9
+ var createCharge_1 = __importDefault(require("./hooks/createCharge"));
10
+ // all settings can be overridden by the config
11
+ var generateSubmissionCollection = function (formConfig) {
12
+ var _a;
13
+ return (0, deepMerge_1.default)({
14
+ slug: ((_a = formConfig === null || formConfig === void 0 ? void 0 : formConfig.formSubmissionOverrides) === null || _a === void 0 ? void 0 : _a.slug) || 'formSubmissions',
15
+ access: {
16
+ create: function () { return true; },
17
+ update: function () { return false; },
18
+ read: function (_a) {
19
+ var user = _a.req.user;
20
+ return !!user;
21
+ } // logged-in users
22
+ },
23
+ admin: {
24
+ enableRichTextRelationship: false
25
+ },
26
+ hooks: {
27
+ beforeChange: [
28
+ function (data) { return (0, createCharge_1.default)(data, formConfig); },
29
+ function (data) { return (0, sendEmail_1.default)(data, formConfig); },
30
+ ],
31
+ },
32
+ fields: [
33
+ {
34
+ name: 'form',
35
+ type: 'relationship',
36
+ relationTo: 'forms',
37
+ required: true,
38
+ admin: {
39
+ readOnly: true
40
+ },
41
+ },
42
+ {
43
+ name: 'submissionData',
44
+ type: 'array',
45
+ admin: {
46
+ readOnly: true
47
+ },
48
+ fields: [
49
+ {
50
+ name: 'field',
51
+ type: 'text',
52
+ required: true,
53
+ },
54
+ {
55
+ name: 'value',
56
+ type: 'text',
57
+ required: true,
58
+ validate: function (value) {
59
+ // TODO:
60
+ // create a validation function that dynamically
61
+ // relies on the field type and its options as configured.
62
+ // How to access sibling data from this field?
63
+ // Need the `name` of the field in order to validate it.
64
+ // Might not be possible to use this validation function.
65
+ // Instead, might need to do all validation in a `beforeValidate` collection hook.
66
+ if (typeof value !== 'undefined') {
67
+ return true;
68
+ }
69
+ return 'This field is required.';
70
+ },
71
+ },
72
+ ],
73
+ },
74
+ {
75
+ name: 'payments',
76
+ type: 'array',
77
+ admin: {
78
+ readOnly: true
79
+ },
80
+ fields: [
81
+ {
82
+ name: 'field',
83
+ label: 'Field',
84
+ type: 'text'
85
+ },
86
+ {
87
+ name: 'status',
88
+ label: 'Status',
89
+ type: 'text'
90
+ },
91
+ {
92
+ name: 'amount',
93
+ type: 'number'
94
+ },
95
+ {
96
+ name: 'amount',
97
+ type: 'number'
98
+ },
99
+ {
100
+ name: 'paymentProcessor',
101
+ type: 'select',
102
+ options: [
103
+ {
104
+ label: 'Stripe',
105
+ value: 'stripe'
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ name: 'creditCard',
111
+ label: 'Credit Card',
112
+ type: 'group',
113
+ fields: [
114
+ {
115
+ name: 'token',
116
+ label: 'token',
117
+ type: 'text'
118
+ },
119
+ {
120
+ name: 'brand',
121
+ label: 'Brand',
122
+ type: 'text'
123
+ },
124
+ {
125
+ name: 'number',
126
+ label: 'Number',
127
+ type: 'text'
128
+ }
129
+ ]
130
+ }
131
+ ]
132
+ }
133
+ ],
134
+ }, formConfig.formSubmissionOverrides || {});
135
+ };
136
+ exports.generateSubmissionCollection = generateSubmissionCollection;
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/collections/FormSubmissions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { TextField } from 'payload/dist/fields/config/types';
3
+ export declare const DynamicFieldSelector: React.FC<TextField>;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || function (mod) {
26
+ if (mod && mod.__esModule) return mod;
27
+ var result = {};
28
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
+ __setModuleDefault(result, mod);
30
+ return result;
31
+ };
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.DynamicFieldSelector = void 0;
34
+ var react_1 = __importStar(require("react"));
35
+ var forms_1 = require("payload/components/forms");
36
+ var DynamicFieldSelector = function (props) {
37
+ var _a = (0, forms_1.useForm)(), fields = _a.fields, getDataByPath = _a.getDataByPath;
38
+ var _b = (0, react_1.useState)([]), options = _b[0], setOptions = _b[1];
39
+ (0, react_1.useEffect)(function () {
40
+ // @ts-ignore
41
+ var fields = getDataByPath('fields');
42
+ if (fields) {
43
+ var allNonPaymentFields = fields.map(function (block) {
44
+ var name = block.name, id = block.id, blockType = block.blockType;
45
+ if (blockType !== 'payment') {
46
+ return ({
47
+ label: name,
48
+ value: id
49
+ });
50
+ }
51
+ return null;
52
+ }).filter(Boolean);
53
+ setOptions(allNonPaymentFields);
54
+ }
55
+ }, [
56
+ fields,
57
+ getDataByPath
58
+ ]);
59
+ return (react_1.default.createElement(forms_1.Select, __assign({}, props, { options: options })));
60
+ };
61
+ exports.DynamicFieldSelector = DynamicFieldSelector;
62
+ //# sourceMappingURL=DynamicFieldSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamicFieldSelector.js","sourceRoot":"","sources":["../../../src/collections/Forms/DynamicFieldSelector.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAmD;AACnD,kDAA2D;AAIpD,IAAM,oBAAoB,GAAwB,UAAC,KAAK;IACvD,IAAA,KAGF,IAAA,eAAO,GAAE,EAFX,MAAM,YAAA,EACN,aAAa,mBACF,CAAC;IAER,IAAA,KAAwB,IAAA,gBAAQ,EAAsB,EAAE,CAAC,EAAxD,OAAO,QAAA,EAAE,UAAU,QAAqC,CAAC;IAEhE,IAAA,iBAAS,EAAC;QACR,aAAa;QACb,IAAM,MAAM,GAAU,aAAa,CAAC,QAAQ,CAAC,CAAA;QAE7C,IAAI,MAAM,EAAE;YACV,IAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK;gBAEzC,IAAA,IAAI,GAGF,KAAK,KAHH,EACJ,EAAE,GAEA,KAAK,GAFL,EACF,SAAS,GACP,KAAK,UADE,CACD;gBAEV,IAAI,SAAS,KAAK,SAAS,EAAE;oBAC3B,OAAO,CAAC;wBACN,KAAK,EAAE,IAAI;wBACX,KAAK,EAAE,EAAE;qBACV,CAAC,CAAA;iBACH;gBAED,OAAO,IAAI,CAAA;YACb,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAwB,CAAC;YAC1C,UAAU,CAAC,mBAAmB,CAAC,CAAC;SACjC;IACH,CAAC,EAAE;QACD,MAAM;QACN,aAAa;KACd,CAAC,CAAC;IAEH,OAAO,CACL,8BAAC,cAAM,eACD,KAAK,IACT,OAAO,EAAE,OAAO,IAChB,CACH,CAAC;AACJ,CAAC,CAAC;AA1CW,QAAA,oBAAoB,wBA0C/B"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { Props as TextFieldType } from 'payload/dist/admin/components/forms/field-types/Text/types';
3
+ export declare const DynamicPriceSelector: React.FC<TextFieldType>;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || function (mod) {
26
+ if (mod && mod.__esModule) return mod;
27
+ var result = {};
28
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
+ __setModuleDefault(result, mod);
30
+ return result;
31
+ };
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.DynamicPriceSelector = void 0;
34
+ var react_1 = __importStar(require("react"));
35
+ var forms_1 = require("payload/components/forms");
36
+ var DynamicPriceSelector = function (props) {
37
+ var path = props.path, label = props.label;
38
+ var _a = (0, forms_1.useForm)(), fields = _a.fields, getDataByPath = _a.getDataByPath, getData = _a.getData;
39
+ var _b = (0, react_1.useState)(), isNumberField = _b[0], setIsNumberField = _b[1];
40
+ var _c = (0, react_1.useState)(), valueType = _c[0], setValueType = _c[1];
41
+ // only number fields can set 'valueType' to 'valueOfField`
42
+ (0, react_1.useEffect)(function () {
43
+ if (path) {
44
+ var parentPath = path.split('.').slice(0, -1).join('.');
45
+ var paymentFieldData = getDataByPath(parentPath);
46
+ if (paymentFieldData) {
47
+ var fieldToUse_1 = paymentFieldData.fieldToUse, valueType_1 = paymentFieldData.valueType;
48
+ setValueType(valueType_1);
49
+ var allFields = getData().fields;
50
+ var field = allFields.find(function (field) { return field.id === fieldToUse_1; });
51
+ if (field) {
52
+ var blockType = field.blockType;
53
+ setIsNumberField(blockType === 'number');
54
+ }
55
+ }
56
+ }
57
+ }, [
58
+ fields,
59
+ path,
60
+ getDataByPath,
61
+ getData
62
+ ]);
63
+ if (valueType === 'static') {
64
+ return (react_1.default.createElement(forms_1.Text, __assign({}, props)));
65
+ }
66
+ if (valueType === 'dynamic' && !isNumberField) {
67
+ return (react_1.default.createElement("div", null,
68
+ react_1.default.createElement("div", null, label),
69
+ react_1.default.createElement("div", { style: {
70
+ color: '#9A9A9A',
71
+ } }, "The selected field must be of type number to be dynamic.")));
72
+ }
73
+ return null;
74
+ };
75
+ exports.DynamicPriceSelector = DynamicPriceSelector;
76
+ //# sourceMappingURL=DynamicPriceSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamicPriceSelector.js","sourceRoot":"","sources":["../../../src/collections/Forms/DynamicPriceSelector.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAmD;AACnD,kDAAyD;AAMlD,IAAM,oBAAoB,GAA4B,UAAC,KAAK;IAE/D,IAAA,IAAI,GAEF,KAAK,KAFH,EACJ,KAAK,GACH,KAAK,MADF,CACG;IAEJ,IAAA,KAIF,IAAA,eAAO,GAAE,EAHX,MAAM,YAAA,EACN,aAAa,mBAAA,EACb,OAAO,aACI,CAAC;IAER,IAAA,KAAoC,IAAA,gBAAQ,GAAW,EAAtD,aAAa,QAAA,EAAE,gBAAgB,QAAuB,CAAC;IACxD,IAAA,KAA4B,IAAA,gBAAQ,GAAU,EAA7C,SAAS,QAAA,EAAE,YAAY,QAAsB,CAAC;IAErD,2DAA2D;IAC3D,IAAA,iBAAS,EAAC;QACR,IAAI,IAAI,EAAE;YACR,IAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACzD,IAAM,gBAAgB,GAAQ,aAAa,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,gBAAgB,EAAE;gBAElB,IAAA,YAAU,GAER,gBAAgB,WAFR,EACV,WAAS,GACP,gBAAgB,UADT,CACU;gBAErB,YAAY,CAAC,WAAS,CAAC,CAAC;gBAEhB,IAAQ,SAAS,GAAW,OAAO,EAAE,OAApB,CAAqB;gBAC9C,IAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,UAAC,KAAkB,IAAK,OAAA,KAAK,CAAC,EAAE,KAAK,YAAU,EAAvB,CAAuB,CAAC,CAAC;gBAE9E,IAAI,KAAK,EAAE;oBACD,IAAA,SAAS,GAAK,KAAK,UAAV,CAAW;oBAC5B,gBAAgB,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;iBAC1C;aACF;SACF;IACH,CAAC,EAAE;QACD,MAAM;QACN,IAAI;QACJ,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,SAAS,KAAK,QAAQ,EAAE;QAC1B,OAAO,CACL,8BAAC,YAAI,eAAK,KAAK,EAAI,CACpB,CAAA;KACF;IAED,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,aAAa,EAAE;QAC7C,OAAO,CACL;YACE,2CACG,KAAK,CACF;YACN,uCACE,KAAK,EAAE;oBACL,KAAK,EAAE,SAAS;iBACjB,+DAGG,CACF,CACP,CAAA;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAC;AApEW,QAAA,oBAAoB,wBAoE/B"}
@@ -0,0 +1,6 @@
1
+ import { Block } from 'payload/types';
2
+ import { FieldConfig } from '../../types';
3
+ declare const _default: {
4
+ [key: string]: Block | ((fieldConfig: FieldConfig) => Block);
5
+ };
6
+ export default _default;