@mobilizehub/payload-plugin 0.5.0 → 0.5.1

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.
@@ -104,17 +104,29 @@
104
104
  }
105
105
  ],
106
106
  filterOptions: ({ siblingData })=>{
107
- const blocks = siblingData?.contactFields;
108
- if (!blocks || blocks.length === 0) {
109
- return CONTACT_FIELD_DEFINITIONS.map((def)=>def.name);
110
- }
111
- const usedSlugs = blocks?.map((block)=>block.blockType) || [];
112
- return CONTACT_FIELD_DEFINITIONS.map((def)=>def.name).filter((slug)=>!usedSlugs.includes(slug));
107
+ const allFieldNames = CONTACT_FIELD_DEFINITIONS.map((def)=>def.name);
108
+ const existingBlocks = siblingData?.contactFields ?? [];
109
+ const usedFieldNames = new Set(existingBlocks.map((block)=>block.blockType));
110
+ return allFieldNames.filter((name)=>!usedFieldNames.has(name));
113
111
  },
114
112
  label: 'Fields',
115
113
  labels: {
116
114
  plural: 'Fields',
117
115
  singular: 'Field'
116
+ },
117
+ validate: (value)=>{
118
+ if (!value || !Array.isArray(value) || value.length === 0) {
119
+ return 'Email field is required';
120
+ }
121
+ const blockTypes = value.map((block)=>block.blockType);
122
+ if (!blockTypes.includes('email')) {
123
+ return 'Email field is required';
124
+ }
125
+ const uniqueTypes = new Set(blockTypes);
126
+ if (blockTypes.length !== uniqueTypes.size) {
127
+ return 'Each contact field can only be added once';
128
+ }
129
+ return true;
118
130
  }
119
131
  };
120
132
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fields/contact-fields.ts"],"sourcesContent":["import type { Field } from 'payload'\n\n/**\n * Definitions for each contact field, including default required status and label.\n */\nexport const CONTACT_FIELD_DEFINITIONS = [\n { name: 'email', defaultLabel: 'Email', defaultRequired: true, label: 'Email' },\n {\n name: 'emailOptIn',\n defaultLabel: 'Receive emails',\n defaultRequired: false,\n label: 'Email Opt-In',\n },\n { name: 'firstName', defaultLabel: 'First Name', defaultRequired: false, label: 'First Name' },\n { name: 'lastName', defaultLabel: 'Last Name', defaultRequired: false, label: 'Last Name' },\n {\n name: 'mobileNumber',\n defaultLabel: 'Mobile Number',\n defaultRequired: false,\n label: 'Mobile Number',\n },\n {\n name: 'mobileOptIn',\n defaultLabel: 'Receive SMS',\n defaultRequired: false,\n label: 'Mobile Opt-In',\n },\n { name: 'address', defaultLabel: 'Address', defaultRequired: false, label: 'Address' },\n { name: 'city', defaultLabel: 'City', defaultRequired: false, label: 'City' },\n { name: 'state', defaultLabel: 'State', defaultRequired: false, label: 'State' },\n { name: 'zip', defaultLabel: 'Zip Code', defaultRequired: false, label: 'Zip Code' },\n { name: 'country', defaultLabel: 'Country', defaultRequired: false, label: 'Country' },\n] as const\n\n/**\n * Creates the contact fields configuration for a Payload CMS collection.\n * Each field can be customized with a label and whether it is required.\n */\nexport const createContactFieldsConfig = (): Field => {\n return {\n name: 'contactFields',\n type: 'blocks',\n admin: {\n description: 'Configure the fields to be included in the contact form.',\n },\n blocks: CONTACT_FIELD_DEFINITIONS.map((def) => ({\n slug: def.name,\n fields: [\n {\n name: 'label',\n type: 'text',\n admin: {\n placeholder: def.label,\n },\n defaultValue: def.defaultLabel,\n },\n {\n name: 'required',\n type: 'checkbox',\n defaultValue: def.defaultRequired,\n },\n ],\n })),\n defaultValue: [\n {\n blockType: 'email',\n label: 'Email',\n required: true,\n },\n ],\n filterOptions: ({ siblingData }) => {\n const blocks = (siblingData as any)?.contactFields as { blockType: string }[] | undefined\n if (!blocks || blocks.length === 0) {\n return CONTACT_FIELD_DEFINITIONS.map((def) => def.name)\n }\n const usedSlugs = blocks?.map((block) => block.blockType) || []\n return CONTACT_FIELD_DEFINITIONS.map((def) => def.name).filter(\n (slug) => !usedSlugs.includes(slug),\n )\n },\n label: 'Fields',\n labels: {\n plural: 'Fields',\n singular: 'Field',\n },\n }\n}\n"],"names":["CONTACT_FIELD_DEFINITIONS","name","defaultLabel","defaultRequired","label","createContactFieldsConfig","type","admin","description","blocks","map","def","slug","fields","placeholder","defaultValue","blockType","required","filterOptions","siblingData","contactFields","length","usedSlugs","block","filter","includes","labels","plural","singular"],"mappings":"AAEA;;CAEC,GACD,OAAO,MAAMA,4BAA4B;IACvC;QAAEC,MAAM;QAASC,cAAc;QAASC,iBAAiB;QAAMC,OAAO;IAAQ;IAC9E;QACEH,MAAM;QACNC,cAAc;QACdC,iBAAiB;QACjBC,OAAO;IACT;IACA;QAAEH,MAAM;QAAaC,cAAc;QAAcC,iBAAiB;QAAOC,OAAO;IAAa;IAC7F;QAAEH,MAAM;QAAYC,cAAc;QAAaC,iBAAiB;QAAOC,OAAO;IAAY;IAC1F;QACEH,MAAM;QACNC,cAAc;QACdC,iBAAiB;QACjBC,OAAO;IACT;IACA;QACEH,MAAM;QACNC,cAAc;QACdC,iBAAiB;QACjBC,OAAO;IACT;IACA;QAAEH,MAAM;QAAWC,cAAc;QAAWC,iBAAiB;QAAOC,OAAO;IAAU;IACrF;QAAEH,MAAM;QAAQC,cAAc;QAAQC,iBAAiB;QAAOC,OAAO;IAAO;IAC5E;QAAEH,MAAM;QAASC,cAAc;QAASC,iBAAiB;QAAOC,OAAO;IAAQ;IAC/E;QAAEH,MAAM;QAAOC,cAAc;QAAYC,iBAAiB;QAAOC,OAAO;IAAW;IACnF;QAAEH,MAAM;QAAWC,cAAc;QAAWC,iBAAiB;QAAOC,OAAO;IAAU;CACtF,CAAS;AAEV;;;CAGC,GACD,OAAO,MAAMC,4BAA4B;IACvC,OAAO;QACLJ,MAAM;QACNK,MAAM;QACNC,OAAO;YACLC,aAAa;QACf;QACAC,QAAQT,0BAA0BU,GAAG,CAAC,CAACC,MAAS,CAAA;gBAC9CC,MAAMD,IAAIV,IAAI;gBACdY,QAAQ;oBACN;wBACEZ,MAAM;wBACNK,MAAM;wBACNC,OAAO;4BACLO,aAAaH,IAAIP,KAAK;wBACxB;wBACAW,cAAcJ,IAAIT,YAAY;oBAChC;oBACA;wBACED,MAAM;wBACNK,MAAM;wBACNS,cAAcJ,IAAIR,eAAe;oBACnC;iBACD;YACH,CAAA;QACAY,cAAc;YACZ;gBACEC,WAAW;gBACXZ,OAAO;gBACPa,UAAU;YACZ;SACD;QACDC,eAAe,CAAC,EAAEC,WAAW,EAAE;YAC7B,MAAMV,SAAUU,aAAqBC;YACrC,IAAI,CAACX,UAAUA,OAAOY,MAAM,KAAK,GAAG;gBAClC,OAAOrB,0BAA0BU,GAAG,CAAC,CAACC,MAAQA,IAAIV,IAAI;YACxD;YACA,MAAMqB,YAAYb,QAAQC,IAAI,CAACa,QAAUA,MAAMP,SAAS,KAAK,EAAE;YAC/D,OAAOhB,0BAA0BU,GAAG,CAAC,CAACC,MAAQA,IAAIV,IAAI,EAAEuB,MAAM,CAC5D,CAACZ,OAAS,CAACU,UAAUG,QAAQ,CAACb;QAElC;QACAR,OAAO;QACPsB,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/fields/contact-fields.ts"],"sourcesContent":["import type { Field } from 'payload'\n\n/**\n * Definitions for each contact field, including default required status and label.\n */\nexport const CONTACT_FIELD_DEFINITIONS = [\n { name: 'email', defaultLabel: 'Email', defaultRequired: true, label: 'Email' },\n {\n name: 'emailOptIn',\n defaultLabel: 'Receive emails',\n defaultRequired: false,\n label: 'Email Opt-In',\n },\n { name: 'firstName', defaultLabel: 'First Name', defaultRequired: false, label: 'First Name' },\n { name: 'lastName', defaultLabel: 'Last Name', defaultRequired: false, label: 'Last Name' },\n {\n name: 'mobileNumber',\n defaultLabel: 'Mobile Number',\n defaultRequired: false,\n label: 'Mobile Number',\n },\n {\n name: 'mobileOptIn',\n defaultLabel: 'Receive SMS',\n defaultRequired: false,\n label: 'Mobile Opt-In',\n },\n { name: 'address', defaultLabel: 'Address', defaultRequired: false, label: 'Address' },\n { name: 'city', defaultLabel: 'City', defaultRequired: false, label: 'City' },\n { name: 'state', defaultLabel: 'State', defaultRequired: false, label: 'State' },\n { name: 'zip', defaultLabel: 'Zip Code', defaultRequired: false, label: 'Zip Code' },\n { name: 'country', defaultLabel: 'Country', defaultRequired: false, label: 'Country' },\n] as const\n\n/**\n * Creates the contact fields configuration for a Payload CMS collection.\n * Each field can be customized with a label and whether it is required.\n */\nexport const createContactFieldsConfig = (): Field => {\n return {\n name: 'contactFields',\n type: 'blocks',\n admin: {\n description: 'Configure the fields to be included in the contact form.',\n },\n blocks: CONTACT_FIELD_DEFINITIONS.map((def) => ({\n slug: def.name,\n fields: [\n {\n name: 'label',\n type: 'text',\n admin: {\n placeholder: def.label,\n },\n defaultValue: def.defaultLabel,\n },\n {\n name: 'required',\n type: 'checkbox',\n defaultValue: def.defaultRequired,\n },\n ],\n })),\n defaultValue: [\n {\n blockType: 'email',\n label: 'Email',\n required: true,\n },\n ],\n filterOptions: ({ siblingData }) => {\n const allFieldNames = CONTACT_FIELD_DEFINITIONS.map((def) => def.name)\n const existingBlocks =\n (siblingData as { contactFields?: { blockType: string }[] })?.contactFields ?? []\n const usedFieldNames = new Set(existingBlocks.map((block) => block.blockType))\n\n return allFieldNames.filter((name) => !usedFieldNames.has(name))\n },\n label: 'Fields',\n labels: {\n plural: 'Fields',\n singular: 'Field',\n },\n validate: (value) => {\n if (!value || !Array.isArray(value) || value.length === 0) {\n return 'Email field is required'\n }\n const blockTypes = value.map((block: { blockType: string }) => block.blockType)\n if (!blockTypes.includes('email')) {\n return 'Email field is required'\n }\n const uniqueTypes = new Set(blockTypes)\n if (blockTypes.length !== uniqueTypes.size) {\n return 'Each contact field can only be added once'\n }\n return true\n },\n }\n}\n"],"names":["CONTACT_FIELD_DEFINITIONS","name","defaultLabel","defaultRequired","label","createContactFieldsConfig","type","admin","description","blocks","map","def","slug","fields","placeholder","defaultValue","blockType","required","filterOptions","siblingData","allFieldNames","existingBlocks","contactFields","usedFieldNames","Set","block","filter","has","labels","plural","singular","validate","value","Array","isArray","length","blockTypes","includes","uniqueTypes","size"],"mappings":"AAEA;;CAEC,GACD,OAAO,MAAMA,4BAA4B;IACvC;QAAEC,MAAM;QAASC,cAAc;QAASC,iBAAiB;QAAMC,OAAO;IAAQ;IAC9E;QACEH,MAAM;QACNC,cAAc;QACdC,iBAAiB;QACjBC,OAAO;IACT;IACA;QAAEH,MAAM;QAAaC,cAAc;QAAcC,iBAAiB;QAAOC,OAAO;IAAa;IAC7F;QAAEH,MAAM;QAAYC,cAAc;QAAaC,iBAAiB;QAAOC,OAAO;IAAY;IAC1F;QACEH,MAAM;QACNC,cAAc;QACdC,iBAAiB;QACjBC,OAAO;IACT;IACA;QACEH,MAAM;QACNC,cAAc;QACdC,iBAAiB;QACjBC,OAAO;IACT;IACA;QAAEH,MAAM;QAAWC,cAAc;QAAWC,iBAAiB;QAAOC,OAAO;IAAU;IACrF;QAAEH,MAAM;QAAQC,cAAc;QAAQC,iBAAiB;QAAOC,OAAO;IAAO;IAC5E;QAAEH,MAAM;QAASC,cAAc;QAASC,iBAAiB;QAAOC,OAAO;IAAQ;IAC/E;QAAEH,MAAM;QAAOC,cAAc;QAAYC,iBAAiB;QAAOC,OAAO;IAAW;IACnF;QAAEH,MAAM;QAAWC,cAAc;QAAWC,iBAAiB;QAAOC,OAAO;IAAU;CACtF,CAAS;AAEV;;;CAGC,GACD,OAAO,MAAMC,4BAA4B;IACvC,OAAO;QACLJ,MAAM;QACNK,MAAM;QACNC,OAAO;YACLC,aAAa;QACf;QACAC,QAAQT,0BAA0BU,GAAG,CAAC,CAACC,MAAS,CAAA;gBAC9CC,MAAMD,IAAIV,IAAI;gBACdY,QAAQ;oBACN;wBACEZ,MAAM;wBACNK,MAAM;wBACNC,OAAO;4BACLO,aAAaH,IAAIP,KAAK;wBACxB;wBACAW,cAAcJ,IAAIT,YAAY;oBAChC;oBACA;wBACED,MAAM;wBACNK,MAAM;wBACNS,cAAcJ,IAAIR,eAAe;oBACnC;iBACD;YACH,CAAA;QACAY,cAAc;YACZ;gBACEC,WAAW;gBACXZ,OAAO;gBACPa,UAAU;YACZ;SACD;QACDC,eAAe,CAAC,EAAEC,WAAW,EAAE;YAC7B,MAAMC,gBAAgBpB,0BAA0BU,GAAG,CAAC,CAACC,MAAQA,IAAIV,IAAI;YACrE,MAAMoB,iBACJ,AAACF,aAA6DG,iBAAiB,EAAE;YACnF,MAAMC,iBAAiB,IAAIC,IAAIH,eAAeX,GAAG,CAAC,CAACe,QAAUA,MAAMT,SAAS;YAE5E,OAAOI,cAAcM,MAAM,CAAC,CAACzB,OAAS,CAACsB,eAAeI,GAAG,CAAC1B;QAC5D;QACAG,OAAO;QACPwB,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;QACAC,UAAU,CAACC;YACT,IAAI,CAACA,SAAS,CAACC,MAAMC,OAAO,CAACF,UAAUA,MAAMG,MAAM,KAAK,GAAG;gBACzD,OAAO;YACT;YACA,MAAMC,aAAaJ,MAAMtB,GAAG,CAAC,CAACe,QAAiCA,MAAMT,SAAS;YAC9E,IAAI,CAACoB,WAAWC,QAAQ,CAAC,UAAU;gBACjC,OAAO;YACT;YACA,MAAMC,cAAc,IAAId,IAAIY;YAC5B,IAAIA,WAAWD,MAAM,KAAKG,YAAYC,IAAI,EAAE;gBAC1C,OAAO;YACT;YACA,OAAO;QACT;IACF;AACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mobilizehub/payload-plugin",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Edvocacy plugin for Payload",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -40,12 +40,12 @@
40
40
  "devDependencies": {
41
41
  "@changesets/cli": "^2.29.8",
42
42
  "@eslint/eslintrc": "^3.2.0",
43
- "@payloadcms/db-postgres": "3.68.5",
44
- "@payloadcms/db-sqlite": "3.68.5",
43
+ "@payloadcms/db-postgres": "3.70.0",
44
+ "@payloadcms/db-sqlite": "3.70.0",
45
45
  "@payloadcms/eslint-config": "3.9.0",
46
- "@payloadcms/next": "3.68.5",
47
- "@payloadcms/richtext-lexical": "3.68.5",
48
- "@payloadcms/ui": "3.68.5",
46
+ "@payloadcms/next": "3.70.0",
47
+ "@payloadcms/richtext-lexical": "3.70.0",
48
+ "@payloadcms/ui": "3.70.0",
49
49
  "@playwright/test": "1.56.1",
50
50
  "@swc-node/register": "1.10.9",
51
51
  "@swc/cli": "0.6.0",
@@ -60,7 +60,7 @@
60
60
  "husky": "^9.1.7",
61
61
  "next": "15.4.10",
62
62
  "open": "^10.1.0",
63
- "payload": "3.68.5",
63
+ "payload": "3.70.0",
64
64
  "prettier": "^3.4.2",
65
65
  "qs-esm": "7.0.2",
66
66
  "react": "19.2.1",
@@ -73,7 +73,7 @@
73
73
  "vitest": "^3.1.2"
74
74
  },
75
75
  "peerDependencies": {
76
- "payload": "^3.68.5"
76
+ "payload": "^3.70.0"
77
77
  },
78
78
  "engines": {
79
79
  "node": "^18.20.2 || >=20.9.0",