@pixelated-tech/components 3.2.14 → 3.3.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.
- package/README.COMPONENTS.md +520 -31
- package/README.md +163 -49
- package/dist/components/cms/cloudinary.image.js +1 -0
- package/dist/components/cms/wordpress.components.js +1 -0
- package/dist/components/general/sidepanel.js +1 -1
- package/dist/components/general/tab.css +105 -0
- package/dist/components/general/tab.js +26 -0
- package/dist/components/menu/menu-accordion.css +10 -0
- package/dist/components/menu/menu-accordion.js +2 -1
- package/dist/components/menu/menu-simple.css +0 -7
- package/dist/components/seo/metadata.components.js +0 -19
- package/dist/components/seo/metadata.functions.js +111 -0
- package/dist/components/seo/schema-blogposting.functions.js +42 -0
- package/dist/components/seo/schema-blogposting.js +0 -46
- package/dist/components/seo/sitemap.js +1 -1
- package/dist/components/shoppingcart/shoppingcart.components.js +4 -4
- package/dist/components/sitebuilder/config/CompoundFontSelector.css +25 -0
- package/dist/components/sitebuilder/config/CompoundFontSelector.js +41 -0
- package/dist/components/sitebuilder/config/ConfigBuilder.css +277 -0
- package/dist/components/sitebuilder/config/ConfigBuilder.js +380 -0
- package/dist/components/sitebuilder/config/ConfigEngine.js +82 -0
- package/dist/components/sitebuilder/config/FontSelector.css +82 -0
- package/dist/components/sitebuilder/config/FontSelector.js +115 -0
- package/dist/components/sitebuilder/config/google-fonts.js +112 -0
- package/dist/components/{pagebuilder → sitebuilder}/form/form.css +55 -34
- package/dist/components/sitebuilder/form/formbuilder.js +107 -0
- package/dist/components/sitebuilder/form/formcomponents.js +380 -0
- package/dist/components/sitebuilder/form/formengine.js +82 -0
- package/dist/components/{pagebuilder/form/form.js → sitebuilder/form/formextractor.js} +10 -211
- package/dist/components/sitebuilder/form/formutils.js +206 -0
- package/dist/components/sitebuilder/form/formvalidator.js +123 -0
- package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.js +1 -1
- package/dist/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.js +2 -2
- package/dist/components/{pagebuilder → sitebuilder/page}/components/PageEngine.js +1 -1
- package/dist/components/sitebuilder/page/documentation/api-examples/save-route-example.js +37 -0
- package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMap.js +3 -3
- package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.js +2 -2
- package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.js +2 -2
- package/dist/components/sitebuilder/page/lib/pageStorageTypes.js +1 -0
- package/dist/components/structured/markdown.js +1 -0
- package/dist/components/structured/recipe.js +1 -0
- package/dist/components/structured/timeline.js +1 -0
- package/dist/css/pixelated.global.css +0 -35
- package/dist/css/pixelated.grid.scss +4 -0
- package/dist/css/pixelated.visualdesign.scss +88 -0
- package/dist/data/form.json +18 -18
- package/dist/data/routes.json +32 -1
- package/dist/data/shipping.to.json +9 -9
- package/dist/data/siteinfo-form.json +200 -0
- package/dist/data/visualdesignform.json +244 -0
- package/dist/index.js +33 -21
- package/dist/index.server.js +24 -17
- package/dist/types/components/cms/cloudinary.image.d.ts.map +1 -1
- package/dist/types/components/cms/wordpress.components.d.ts.map +1 -1
- package/dist/types/components/general/semantic.d.ts +3 -3
- package/dist/types/components/general/tab.d.ts +18 -0
- package/dist/types/components/general/tab.d.ts.map +1 -0
- package/dist/types/components/menu/menu-accordion.d.ts.map +1 -1
- package/dist/types/components/seo/metadata.components.d.ts +0 -17
- package/dist/types/components/seo/metadata.components.d.ts.map +1 -1
- package/dist/types/components/seo/{metadata.d.ts → metadata.functions.d.ts} +15 -1
- package/dist/types/components/seo/metadata.functions.d.ts.map +1 -0
- package/dist/types/components/seo/schema-blogposting.d.ts +1 -25
- package/dist/types/components/seo/schema-blogposting.d.ts.map +1 -1
- package/dist/types/components/seo/schema-blogposting.functions.d.ts +26 -0
- package/dist/types/components/seo/schema-blogposting.functions.d.ts.map +1 -0
- package/dist/types/components/seo/sitemap.d.ts.map +1 -1
- package/dist/types/components/shoppingcart/shoppingcart.components.d.ts +1 -1
- package/dist/types/components/sitebuilder/config/CompoundFontSelector.d.ts +23 -0
- package/dist/types/components/sitebuilder/config/CompoundFontSelector.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts +354 -0
- package/dist/types/components/sitebuilder/config/ConfigBuilder.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/config/ConfigEngine.d.ts +10 -0
- package/dist/types/components/sitebuilder/config/ConfigEngine.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/config/FontSelector.d.ts +27 -0
- package/dist/types/components/sitebuilder/config/FontSelector.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/config/google-fonts.d.ts +41 -0
- package/dist/types/components/sitebuilder/config/google-fonts.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formbuilder.d.ts +11 -0
- package/dist/types/components/sitebuilder/form/formbuilder.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder}/form/formcomponents.d.ts +15 -17
- package/dist/types/components/sitebuilder/form/formcomponents.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder/form/form.submit.d.ts → sitebuilder/form/formemailer.d.ts} +1 -1
- package/dist/types/components/sitebuilder/form/formemailer.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formengine.d.ts +14 -0
- package/dist/types/components/sitebuilder/form/formengine.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formextractor.d.ts +25 -0
- package/dist/types/components/sitebuilder/form/formextractor.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder/form/formvalidations.d.ts → sitebuilder/form/formfieldvalidations.d.ts} +1 -1
- package/dist/types/components/sitebuilder/form/formfieldvalidations.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formtypes.d.ts +66 -0
- package/dist/types/components/sitebuilder/form/formtypes.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formutils.d.ts +20 -0
- package/dist/types/components/sitebuilder/form/formutils.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/form/formvalidator.d.ts +20 -0
- package/dist/types/components/sitebuilder/form/formvalidator.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/ComponentPropertiesForm.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/ComponentSelector.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/ComponentTree.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageBuilderUI.d.ts +1 -1
- package/dist/types/components/sitebuilder/page/components/PageBuilderUI.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/PageEngine.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/components/SaveLoadSection.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts +6 -0
- package/dist/types/components/sitebuilder/page/documentation/api-examples/save-route-example.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/componentGeneration.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMap.d.ts +3 -3
- package/dist/types/components/sitebuilder/page/lib/componentMap.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/componentMetadata.d.ts.map +1 -0
- package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageContentful.d.ts +1 -1
- package/dist/types/components/sitebuilder/page/lib/pageStorageContentful.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/pageStorageLocal.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/pageStorageTypes.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/propTypeIntrospection.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/types.d.ts.map +1 -0
- package/dist/types/components/sitebuilder/page/lib/usePageBuilder.d.ts.map +1 -0
- package/dist/types/components/structured/markdown.d.ts.map +1 -1
- package/dist/types/components/structured/recipe.d.ts.map +1 -1
- package/dist/types/components/structured/timeline.d.ts.map +1 -1
- package/dist/types/index.d.ts +33 -20
- package/dist/types/index.server.d.ts +23 -16
- package/dist/types/stories/general/tab.stories.d.ts +45 -0
- package/dist/types/stories/general/tab.stories.d.ts.map +1 -0
- package/dist/types/stories/seo/seo.metadata.stories.d.ts +1 -1
- package/dist/types/stories/seo/seo.metadata.stories.d.ts.map +1 -1
- package/dist/types/stories/sitebuilder/compoundfontselector.stories.d.ts +51 -0
- package/dist/types/stories/sitebuilder/compoundfontselector.stories.d.ts.map +1 -0
- package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts +103 -0
- package/dist/types/stories/sitebuilder/configbuilder.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/form-builder.stories.d.ts +1 -1
- package/dist/types/stories/sitebuilder/form-builder.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/form-engine.stories.d.ts +1 -1
- package/dist/types/stories/sitebuilder/form-engine.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/form-extractor.stories.d.ts +1 -1
- package/dist/types/stories/sitebuilder/form-extractor.stories.d.ts.map +1 -0
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.stories.d.ts.map +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pagebuilder.usageguide.stories.d.ts.map +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts +1 -1
- package/dist/types/stories/{pagebuilder → sitebuilder}/pageengine.stories.d.ts.map +1 -1
- package/dist/types/tests/compoundfontselector.test.d.ts +2 -0
- package/dist/types/tests/compoundfontselector.test.d.ts.map +1 -0
- package/dist/types/tests/configbuilder.test.d.ts +2 -0
- package/dist/types/tests/configbuilder.test.d.ts.map +1 -0
- package/dist/types/tests/configengine.test.d.ts +2 -0
- package/dist/types/tests/configengine.test.d.ts.map +1 -0
- package/dist/types/tests/fontselector.test.d.ts +2 -0
- package/dist/types/tests/fontselector.test.d.ts.map +1 -0
- package/dist/types/tests/tab.test.d.ts +2 -0
- package/dist/types/tests/tab.test.d.ts.map +1 -0
- package/package.json +15 -12
- package/dist/components/pagebuilder/form/formcomponents.js +0 -359
- package/dist/components/seo/metadata.js +0 -108
- package/dist/types/components/pagebuilder/components/ComponentPropertiesForm.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/ComponentSelector.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/ComponentTree.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/PageBuilderUI.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/PageEngine.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/components/SaveLoadSection.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/form.d.ts +0 -46
- package/dist/types/components/pagebuilder/form/form.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/form.submit.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/formcomponents.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/form/formvalidations.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/componentGeneration.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/componentMap.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/componentMetadata.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/pageStorageContentful.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/pageStorageLocal.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/pageStorageTypes.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/propTypeIntrospection.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/types.d.ts.map +0 -1
- package/dist/types/components/pagebuilder/lib/usePageBuilder.d.ts.map +0 -1
- package/dist/types/components/seo/metadata.d.ts.map +0 -1
- package/dist/types/stories/pagebuilder/form-builder.stories.d.ts.map +0 -1
- package/dist/types/stories/pagebuilder/form-engine.stories.d.ts.map +0 -1
- package/dist/types/stories/pagebuilder/form-extractor.stories.d.ts.map +0 -1
- /package/dist/components/{pagebuilder/form/form.submit.js → sitebuilder/form/formemailer.js} +0 -0
- /package/dist/components/{pagebuilder/form/formvalidations.js → sitebuilder/form/formfieldvalidations.js} +0 -0
- /package/dist/components/{pagebuilder/lib/pageStorageTypes.js → sitebuilder/form/formtypes.js} +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/components/pagebuilder.scss +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/types.js +0 -0
- /package/dist/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.js +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentSelector.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/ComponentTree.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/PageEngine.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/components/SaveLoadSection.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentGeneration.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/componentMetadata.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageLocal.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/pageStorageTypes.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/propTypeIntrospection.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/types.d.ts +0 -0
- /package/dist/types/components/{pagebuilder → sitebuilder/page}/lib/usePageBuilder.d.ts +0 -0
|
@@ -1,224 +1,23 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
4
|
import * as FC from './formcomponents';
|
|
5
|
-
import * as
|
|
6
|
-
import {
|
|
7
|
-
import './
|
|
8
|
-
const debug = false;
|
|
9
|
-
/* ===== FORM ENGINE =====
|
|
10
|
-
Generate all the elements to display a form */
|
|
11
|
-
FormEngine.propTypes = {
|
|
12
|
-
name: PropTypes.string,
|
|
13
|
-
id: PropTypes.string,
|
|
14
|
-
method: PropTypes.string,
|
|
15
|
-
onSubmitHandler: PropTypes.func,
|
|
16
|
-
formData: PropTypes.object.isRequired
|
|
17
|
-
};
|
|
18
|
-
export function FormEngine(props) {
|
|
19
|
-
function generateFormProps(props) {
|
|
20
|
-
// GENERATE PROPS TO RENDER THE FORM CONTAINER, INTERNAL FUNCTION
|
|
21
|
-
if (debug)
|
|
22
|
-
console.log("Generating Form Props");
|
|
23
|
-
const formProps = JSON.parse(JSON.stringify(props));
|
|
24
|
-
['formData', 'onSubmitHandler'].forEach(e => delete formProps[e]);
|
|
25
|
-
return formProps;
|
|
26
|
-
}
|
|
27
|
-
generateNewFields.propTypes = {
|
|
28
|
-
formData: PropTypes.any.isRequired,
|
|
29
|
-
};
|
|
30
|
-
function generateNewFields(props) {
|
|
31
|
-
// CORE OF THE FORM ENGINE - CONVERT JSON TO COMPONENTS - INTERNAL
|
|
32
|
-
if (debug)
|
|
33
|
-
console.log("Generating Form Fields");
|
|
34
|
-
const newFields = [];
|
|
35
|
-
const formFields = props.formData.fields;
|
|
36
|
-
if (props.formData && formFields) {
|
|
37
|
-
// const thisFields = formFields;
|
|
38
|
-
for (let field = 0; field < formFields.length; field++) {
|
|
39
|
-
const thisField = formFields[field];
|
|
40
|
-
const newProps = JSON.parse(JSON.stringify(thisField.props));
|
|
41
|
-
newProps.key = generateKey();
|
|
42
|
-
// Convert string numeric props to numbers where needed
|
|
43
|
-
const numericProps = ['maxLength', 'minLength', 'rows', 'cols', 'size', 'step'];
|
|
44
|
-
numericProps.forEach(prop => {
|
|
45
|
-
if (newProps[prop] !== undefined &&
|
|
46
|
-
newProps[prop] !== null &&
|
|
47
|
-
newProps[prop] !== '') {
|
|
48
|
-
// Only convert if the value is not already a number
|
|
49
|
-
if (typeof newProps[prop] === 'string') {
|
|
50
|
-
const num = Number(newProps[prop]);
|
|
51
|
-
if (!isNaN(num)) {
|
|
52
|
-
newProps[prop] = num;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
const componentName = thisField.component;
|
|
58
|
-
const newElementType = FC[componentName];
|
|
59
|
-
const newElement = React.createElement(newElementType, newProps);
|
|
60
|
-
newFields.push(newElement);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return newFields;
|
|
64
|
-
}
|
|
65
|
-
function handleSubmit(event) {
|
|
66
|
-
// HANDLES THE FORM ACTION / FORM SUBMIT - EXPOSED EXTERNAL
|
|
67
|
-
event.preventDefault();
|
|
68
|
-
if (props.onSubmitHandler)
|
|
69
|
-
props.onSubmitHandler(event);
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
return (_jsx("form", { ...generateFormProps(props), onSubmit: (event) => { handleSubmit(event); }, suppressHydrationWarning: true, children: generateNewFields(props) }));
|
|
73
|
-
}
|
|
74
|
-
/* ===== FORM BUILDER =====
|
|
75
|
-
Display all the components for a Form Builder -
|
|
76
|
-
Element Buttons, Element Details, and the Form */
|
|
77
|
-
function mapTypeToComponent(myType) {
|
|
78
|
-
if (debug)
|
|
79
|
-
console.log("Mapping Type Field to Component");
|
|
80
|
-
let myComponent = (["button"].includes(myType)) ? 'FormButton' :
|
|
81
|
-
(["checkbox"].includes(myType)) ? 'FormCheckbox' :
|
|
82
|
-
(["datalist"].includes(myType)) ? 'FormDataList' :
|
|
83
|
-
(["radio"].includes(myType)) ? 'FormRadio' :
|
|
84
|
-
(["select"].includes(myType)) ? 'FormSelect' :
|
|
85
|
-
(["textarea"].includes(myType)) ? 'FormTextarea' :
|
|
86
|
-
"FormInput";
|
|
87
|
-
return myComponent;
|
|
88
|
-
}
|
|
89
|
-
export function FormBuilder() {
|
|
90
|
-
const [formData, setFormData] = useState({});
|
|
91
|
-
const [fieldFormData, setFieldFormData] = useState({});
|
|
92
|
-
function appendFormData(event) {
|
|
93
|
-
// APPEND JSON FOR NEW FIELD TO EXISTING JSON CONFIG OBJECT - EXPOSED EXTERNAL
|
|
94
|
-
if (debug)
|
|
95
|
-
console.log("Appending form Data...");
|
|
96
|
-
const props = {};
|
|
97
|
-
const target = event.target;
|
|
98
|
-
for (const prop in target) {
|
|
99
|
-
const thisProp = target[prop];
|
|
100
|
-
if (thisProp && thisProp.value && (thisProp.value !== Object(thisProp.value))) {
|
|
101
|
-
props[thisProp.name] = thisProp.value;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const field = {};
|
|
105
|
-
field.props = props;
|
|
106
|
-
field.component = mapTypeToComponent(field.props.type);
|
|
107
|
-
let fields = [];
|
|
108
|
-
if (Object.keys(formData).length > 0) {
|
|
109
|
-
fields = JSON.parse(JSON.stringify(formData.fields));
|
|
110
|
-
}
|
|
111
|
-
fields[fields.length] = field;
|
|
112
|
-
setFormData({ fields: fields });
|
|
113
|
-
setFieldFormData({});
|
|
114
|
-
return (field);
|
|
115
|
-
}
|
|
116
|
-
/* function getCircularReplacer() {
|
|
117
|
-
const seen = new WeakSet();
|
|
118
|
-
return (key, value) => {
|
|
119
|
-
if (typeof value === 'object' && value !== null) {
|
|
120
|
-
if (seen.has(value)) {
|
|
121
|
-
return ; // return undefined ;
|
|
122
|
-
}
|
|
123
|
-
seen.add(value);
|
|
124
|
-
}
|
|
125
|
-
return value;
|
|
126
|
-
};
|
|
127
|
-
} */
|
|
128
|
-
return (_jsxs("div", { className: "section-container", children: [_jsxs("div", { style: { display: 'inline-block', verticalAlign: 'top' }, children: [_jsx(FormBuild, { setFormData: setFieldFormData }), _jsx("div", {}), _jsx(FormEngine, { name: "field_props", id: "field_props", onSubmitHandler: appendFormData, formData: fieldFormData })] }), _jsx("div", { style: { display: 'inline-block', verticalAlign: 'top' }, children: _jsx("pre", { style: { width: '100%' }, children: JSON.stringify(formData, null, 2) }) }), _jsxs("div", { children: [_jsx("br", {}), _jsx("br", {}), _jsx("hr", {}), _jsx("br", {}), _jsx("br", {})] }), _jsx("div", { style: { display: 'block', verticalAlign: 'top' }, children: _jsx(FormEngine, { formData: formData || {} }) })] }));
|
|
129
|
-
}
|
|
130
|
-
/*
|
|
131
|
-
===== FORM BUILD =====
|
|
132
|
-
Dynamically generate, component by component, and prop by prop,
|
|
133
|
-
the JSON to create a form via FormEngine
|
|
134
|
-
*/
|
|
135
|
-
FormBuild.propTypes = {
|
|
136
|
-
setFormData: PropTypes.func.isRequired,
|
|
137
|
-
};
|
|
138
|
-
export function FormBuild(props) {
|
|
139
|
-
function generateFieldJSON(component, type) {
|
|
140
|
-
// GENERATE THE JSON TO DISPLAY A FORM TO ADD A FIELD - INTERNAL
|
|
141
|
-
if (debug)
|
|
142
|
-
console.log("Generating Form JSON for ", component, " Type : ", type);
|
|
143
|
-
const form = { fields: [] };
|
|
144
|
-
let i = 0;
|
|
145
|
-
for (const prop in FC[component].propTypes) {
|
|
146
|
-
const field = {};
|
|
147
|
-
field.component = 'FormInput';
|
|
148
|
-
const props = {};
|
|
149
|
-
props.label = prop;
|
|
150
|
-
props.name = prop;
|
|
151
|
-
props.id = prop;
|
|
152
|
-
props.type = 'text';
|
|
153
|
-
if (prop === 'type') {
|
|
154
|
-
props.disabled = true;
|
|
155
|
-
props.value = type;
|
|
156
|
-
props.list = 'inputTypes';
|
|
157
|
-
}
|
|
158
|
-
field.props = props;
|
|
159
|
-
form.fields[i] = field;
|
|
160
|
-
i++;
|
|
161
|
-
}
|
|
162
|
-
const addButton = {
|
|
163
|
-
component: 'FormButton',
|
|
164
|
-
props: {
|
|
165
|
-
label: 'Add ' + component,
|
|
166
|
-
type: 'submit',
|
|
167
|
-
id: 'Add ' + component,
|
|
168
|
-
text: 'Add ' + component
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
form.fields[i] = addButton;
|
|
172
|
-
return (form);
|
|
173
|
-
}
|
|
174
|
-
function handlePhaseOneSubmit(event) {
|
|
175
|
-
// GENERATE THE JSON TO DISPLAY A FORM TO ADD A FIELD - EXTERNAL
|
|
176
|
-
const target = event.target;
|
|
177
|
-
const typeElement = target.elements.namedItem('type');
|
|
178
|
-
const myType = typeElement ? typeElement.value : '';
|
|
179
|
-
const myComponent = mapTypeToComponent(myType);
|
|
180
|
-
const fieldJSON = generateFieldJSON(myComponent, myType);
|
|
181
|
-
props.setFormData(fieldJSON);
|
|
182
|
-
return true;
|
|
183
|
-
}
|
|
184
|
-
function generateTypeField() {
|
|
185
|
-
const form = {};
|
|
186
|
-
const typeField = {
|
|
187
|
-
component: 'FormInput',
|
|
188
|
-
props: {
|
|
189
|
-
label: 'Type : ',
|
|
190
|
-
name: 'type',
|
|
191
|
-
id: 'type',
|
|
192
|
-
type: 'text',
|
|
193
|
-
list: 'inputTypes'
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
const addButton = {
|
|
197
|
-
component: 'FormButton',
|
|
198
|
-
props: {
|
|
199
|
-
label: 'Build',
|
|
200
|
-
type: 'submit',
|
|
201
|
-
id: 'build',
|
|
202
|
-
text: '=== Build ==='
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
form.fields = [typeField, addButton];
|
|
206
|
-
return (form);
|
|
207
|
-
}
|
|
208
|
-
return (_jsx(_Fragment, { children: _jsx(FormEngine, { formData: generateTypeField(), onSubmitHandler: event => { handlePhaseOneSubmit(event); }, name: "build", id: "build", method: "post" }) }));
|
|
209
|
-
}
|
|
5
|
+
import * as FVF from './formfieldvalidations';
|
|
6
|
+
import { capitalize, attributeMap, debug } from './formutils';
|
|
7
|
+
import { FormEngine } from './formengine';
|
|
210
8
|
/*
|
|
211
9
|
===== FORM EXTRACT =====
|
|
212
10
|
Submit a page URL of a form to extract all form elements and
|
|
213
11
|
convert them to JSON to create a form via FormEngine
|
|
214
12
|
*/
|
|
215
13
|
FormExtractor.propTypes = {
|
|
216
|
-
url: PropTypes.string
|
|
14
|
+
url: PropTypes.string,
|
|
15
|
+
htmlPaste: PropTypes.string
|
|
217
16
|
};
|
|
218
17
|
export function FormExtractor(props) {
|
|
219
18
|
const [url, setURL] = useState(props.url || "");
|
|
220
|
-
const [htmlPaste, setHtmlPaste] = useState();
|
|
221
|
-
const [formData, setFormData] = useState({});
|
|
19
|
+
const [htmlPaste, setHtmlPaste] = useState(props.htmlPaste || "");
|
|
20
|
+
const [formData, setFormData] = useState({ fields: [] });
|
|
222
21
|
setParentState.propTypes = {
|
|
223
22
|
url: PropTypes.string.isRequired,
|
|
224
23
|
htmlPaste: PropTypes.string.isRequired,
|
|
@@ -256,7 +55,7 @@ export function FormExtractUI(props) {
|
|
|
256
55
|
console.log("Form Submitted...");
|
|
257
56
|
props.setParentState({ url: url, htmlPaste: htmlPaste });
|
|
258
57
|
}
|
|
259
|
-
return (_jsxs("form", { onSubmit: e => { e.preventDefault(); }, method: "post", name: "extract", children: [_jsx("label", { htmlFor: "url", children: "URL : " }), _jsx("input", { type: "text", list: "form_urls", id: "url", name: "url", size: 100, onChange: onChange }), _jsx(FC.FormDataList, { id: 'form_urls', items:
|
|
58
|
+
return (_jsxs("form", { onSubmit: e => { e.preventDefault(); }, method: "post", name: "extract", children: [_jsx("label", { htmlFor: "url", children: "URL : " }), _jsx("input", { type: "text", list: "form_urls", id: "url", name: "url", size: 100, onChange: onChange }), _jsx(FC.FormDataList, { id: 'form_urls', items: FVF.formURLs }), _jsx("div", { style: { width: '100%', textAlign: 'center' }, children: "OR" }), _jsx("label", { htmlFor: "htmlPaste", children: "HTML : " }), _jsx("textarea", { id: "htmlPaste", name: "htmlPaste", rows: 10, cols: 80, onChange: onChange }), _jsx("br", {}), _jsxs("div", { style: { width: '100%', textAlign: 'center' }, children: [_jsx("button", { type: "button", onClick: onSubmit, children: "Extract" }), _jsx("input", { type: "reset" })] })] }));
|
|
260
59
|
}
|
|
261
60
|
FormExtractEngine.propTypes = {
|
|
262
61
|
url: PropTypes.string,
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// Shared utility functions for form components
|
|
2
|
+
import { generateKey, capitalize, attributeMap } from '../../utilities/functions';
|
|
3
|
+
export const debug = false;
|
|
4
|
+
/**
|
|
5
|
+
* Maps input type to form component name
|
|
6
|
+
*/
|
|
7
|
+
export function mapTypeToComponent(myType) {
|
|
8
|
+
if (debug)
|
|
9
|
+
console.log("Mapping Type Field to Component");
|
|
10
|
+
let myComponent = (["button"].includes(myType)) ? 'FormButton' :
|
|
11
|
+
(["checkbox"].includes(myType)) ? 'FormCheckbox' :
|
|
12
|
+
(["datalist"].includes(myType)) ? 'FormDataList' :
|
|
13
|
+
(["radio"].includes(myType)) ? 'FormRadio' :
|
|
14
|
+
(["select"].includes(myType)) ? 'FormSelect' :
|
|
15
|
+
(["textarea"].includes(myType)) ? 'FormTextarea' :
|
|
16
|
+
"FormInput";
|
|
17
|
+
return myComponent;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generates field JSON for form building
|
|
21
|
+
*/
|
|
22
|
+
export function generateFieldJSON(component, type) {
|
|
23
|
+
const form = {};
|
|
24
|
+
form.fields = [];
|
|
25
|
+
// Common fields for all components
|
|
26
|
+
const commonFields = [
|
|
27
|
+
{
|
|
28
|
+
component: 'FormInput',
|
|
29
|
+
props: {
|
|
30
|
+
label: 'ID : ',
|
|
31
|
+
name: 'id',
|
|
32
|
+
id: 'id',
|
|
33
|
+
type: 'text',
|
|
34
|
+
required: true
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
component: 'FormInput',
|
|
39
|
+
props: {
|
|
40
|
+
label: 'Label : ',
|
|
41
|
+
name: 'label',
|
|
42
|
+
id: 'label',
|
|
43
|
+
type: 'text'
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
];
|
|
47
|
+
// Type-specific fields
|
|
48
|
+
let typeSpecificFields = [];
|
|
49
|
+
if (component === 'FormSelect') {
|
|
50
|
+
typeSpecificFields = [
|
|
51
|
+
{
|
|
52
|
+
component: 'FormTextarea',
|
|
53
|
+
props: {
|
|
54
|
+
label: 'Options (JSON) : ',
|
|
55
|
+
name: 'options',
|
|
56
|
+
id: 'options',
|
|
57
|
+
rows: 5,
|
|
58
|
+
placeholder: '[{"value": "option1", "text": "Option 1"}, {"value": "option2", "text": "Option 2"}]'
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
else if (component === 'FormRadio' || component === 'FormCheckbox') {
|
|
64
|
+
typeSpecificFields = [
|
|
65
|
+
{
|
|
66
|
+
component: 'FormInput',
|
|
67
|
+
props: {
|
|
68
|
+
label: 'Value : ',
|
|
69
|
+
name: 'value',
|
|
70
|
+
id: 'value',
|
|
71
|
+
type: 'text'
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
component: 'FormTextarea',
|
|
76
|
+
props: {
|
|
77
|
+
label: 'Options (JSON) : ',
|
|
78
|
+
name: 'options',
|
|
79
|
+
id: 'options',
|
|
80
|
+
rows: 5,
|
|
81
|
+
placeholder: '[{"value": "option1", "text": "Option 1"}, {"value": "option2", "text": "Option 2"}]'
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
typeSpecificFields = [
|
|
88
|
+
{
|
|
89
|
+
component: 'FormInput',
|
|
90
|
+
props: {
|
|
91
|
+
label: 'Type : ',
|
|
92
|
+
name: 'type',
|
|
93
|
+
id: 'type',
|
|
94
|
+
type: 'text',
|
|
95
|
+
value: type,
|
|
96
|
+
list: 'inputTypes'
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
component: 'FormInput',
|
|
101
|
+
props: {
|
|
102
|
+
label: 'Placeholder : ',
|
|
103
|
+
name: 'placeholder',
|
|
104
|
+
id: 'placeholder',
|
|
105
|
+
type: 'text'
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
component: 'FormInput',
|
|
110
|
+
props: {
|
|
111
|
+
label: 'Value : ',
|
|
112
|
+
name: 'value',
|
|
113
|
+
id: 'value',
|
|
114
|
+
type: 'text'
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
// Add required field
|
|
120
|
+
const requiredField = {
|
|
121
|
+
component: 'FormCheckbox',
|
|
122
|
+
props: {
|
|
123
|
+
label: 'Required : ',
|
|
124
|
+
name: 'required',
|
|
125
|
+
id: 'required',
|
|
126
|
+
value: 'required'
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
// Add validation field
|
|
130
|
+
const validationField = {
|
|
131
|
+
component: 'FormInput',
|
|
132
|
+
props: {
|
|
133
|
+
label: 'Validate : ',
|
|
134
|
+
name: 'validate',
|
|
135
|
+
id: 'validate',
|
|
136
|
+
type: 'text',
|
|
137
|
+
list: 'validationTypes',
|
|
138
|
+
placeholder: 'isValidEmailAddress, isValidUrl, etc.'
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
// Combine all fields
|
|
142
|
+
let i = 0;
|
|
143
|
+
[...commonFields, ...typeSpecificFields, requiredField, validationField].forEach(field => {
|
|
144
|
+
form.fields[i] = field;
|
|
145
|
+
i++;
|
|
146
|
+
});
|
|
147
|
+
// Add submit button
|
|
148
|
+
const addButton = {
|
|
149
|
+
component: 'FormButton',
|
|
150
|
+
props: {
|
|
151
|
+
label: 'Add ' + component,
|
|
152
|
+
type: 'submit',
|
|
153
|
+
id: 'Add ' + component,
|
|
154
|
+
text: 'Add ' + component
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
form.fields[i] = addButton;
|
|
158
|
+
return form;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Generates type selection field for form builder
|
|
162
|
+
*/
|
|
163
|
+
export function generateTypeField() {
|
|
164
|
+
const form = {};
|
|
165
|
+
const typeField = {
|
|
166
|
+
component: 'FormInput',
|
|
167
|
+
props: {
|
|
168
|
+
label: 'Type : ',
|
|
169
|
+
name: 'type',
|
|
170
|
+
id: 'type',
|
|
171
|
+
type: 'text',
|
|
172
|
+
list: 'inputTypes'
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const addButton = {
|
|
176
|
+
component: 'FormButton',
|
|
177
|
+
props: {
|
|
178
|
+
label: 'Build',
|
|
179
|
+
type: 'submit',
|
|
180
|
+
id: 'build',
|
|
181
|
+
text: '=== Build ==='
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
form.fields = [typeField, addButton];
|
|
185
|
+
return form;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Converts numeric string props to numbers
|
|
189
|
+
*/
|
|
190
|
+
export function convertNumericProps(props) {
|
|
191
|
+
const numericProps = ['maxLength', 'minLength', 'rows', 'cols', 'size', 'step'];
|
|
192
|
+
numericProps.forEach(prop => {
|
|
193
|
+
if (props[prop] !== undefined &&
|
|
194
|
+
props[prop] !== null &&
|
|
195
|
+
props[prop] !== '') {
|
|
196
|
+
if (typeof props[prop] === 'string') {
|
|
197
|
+
const num = Number(props[prop]);
|
|
198
|
+
if (!isNaN(num)) {
|
|
199
|
+
props[prop] = num;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Re-export utilities from main utilities file for convenience
|
|
206
|
+
export { generateKey, capitalize, attributeMap };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useState, useCallback } from 'react';
|
|
3
|
+
import * as FVF from './formfieldvalidations';
|
|
4
|
+
/**
|
|
5
|
+
* Centralized field validation service
|
|
6
|
+
*/
|
|
7
|
+
export async function validateField(fieldProps, event) {
|
|
8
|
+
const errors = [];
|
|
9
|
+
let isValid = true;
|
|
10
|
+
// 1. Field-specific validation (e.g., isValidEmailAddress, isValidUrl, etc.)
|
|
11
|
+
if (fieldProps.validate && typeof fieldProps.validate === "string" && fieldProps.validate in FVF) {
|
|
12
|
+
const fieldValid = FVF[fieldProps.validate](event.target);
|
|
13
|
+
if (!fieldValid) {
|
|
14
|
+
isValid = false;
|
|
15
|
+
errors.push(`${fieldProps.validate} validation failed`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// 2. Parent validation (for grouped/nested fields)
|
|
19
|
+
if (fieldProps.parent?.validate && typeof fieldProps.parent.validate === "string" && fieldProps.parent.validate in FVF) {
|
|
20
|
+
const parentValid = FVF[fieldProps.parent.validate](event.target);
|
|
21
|
+
if (!parentValid) {
|
|
22
|
+
isValid = false;
|
|
23
|
+
errors.push(`Parent ${fieldProps.parent.validate} validation failed`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// 3. HTML5 required validation
|
|
27
|
+
if (fieldProps.required) {
|
|
28
|
+
const requiredValid = event.target.checkValidity();
|
|
29
|
+
if (!requiredValid) {
|
|
30
|
+
isValid = false;
|
|
31
|
+
errors.push('Required field validation failed');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// 4. Required not empty check
|
|
35
|
+
if (fieldProps.required && !event.target.value) {
|
|
36
|
+
isValid = false;
|
|
37
|
+
errors.push('Field cannot be empty');
|
|
38
|
+
}
|
|
39
|
+
// 5. Custom validation rules can be added here
|
|
40
|
+
// Example: minimum length, maximum length, pattern matching, etc.
|
|
41
|
+
return { isValid, errors };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Form validation context for managing form-wide validation state
|
|
45
|
+
*/
|
|
46
|
+
const FormValidationContext = createContext(null);
|
|
47
|
+
export function useFormValidation() {
|
|
48
|
+
const context = useContext(FormValidationContext);
|
|
49
|
+
if (!context) {
|
|
50
|
+
throw new Error('useFormValidation must be used within FormValidationProvider');
|
|
51
|
+
}
|
|
52
|
+
return context;
|
|
53
|
+
}
|
|
54
|
+
export function FormValidationProvider({ children }) {
|
|
55
|
+
const [fieldValidity, setFieldValidity] = useState({});
|
|
56
|
+
const [fieldErrors, setFieldErrors] = useState({});
|
|
57
|
+
const validateField = useCallback((fieldId, isValid, errors) => {
|
|
58
|
+
setFieldValidity(prev => ({ ...prev, [fieldId]: isValid }));
|
|
59
|
+
setFieldErrors(prev => ({ ...prev, [fieldId]: errors }));
|
|
60
|
+
}, []);
|
|
61
|
+
const validateAllFields = useCallback(() => {
|
|
62
|
+
return Object.values(fieldValidity).every(valid => valid === true);
|
|
63
|
+
}, [fieldValidity]);
|
|
64
|
+
const resetValidation = useCallback(() => {
|
|
65
|
+
setFieldValidity({});
|
|
66
|
+
setFieldErrors({});
|
|
67
|
+
}, []);
|
|
68
|
+
const isFormValid = Object.values(fieldValidity).every(valid => valid === true);
|
|
69
|
+
const value = {
|
|
70
|
+
fieldValidity,
|
|
71
|
+
fieldErrors,
|
|
72
|
+
isFormValid,
|
|
73
|
+
validateField,
|
|
74
|
+
validateAllFields,
|
|
75
|
+
resetValidation
|
|
76
|
+
};
|
|
77
|
+
return (_jsx(FormValidationContext.Provider, { value: value, children: children }));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Cross-field validation functions
|
|
81
|
+
*/
|
|
82
|
+
export function validatePasswordMatch(formData) {
|
|
83
|
+
const password = formData.password?.value;
|
|
84
|
+
const confirm = formData.passwordConfirm?.value;
|
|
85
|
+
if (!password || !confirm) {
|
|
86
|
+
return { isValid: true, errors: [] }; // Not required fields
|
|
87
|
+
}
|
|
88
|
+
const isValid = password === confirm;
|
|
89
|
+
return {
|
|
90
|
+
isValid,
|
|
91
|
+
errors: isValid ? [] : ['Passwords do not match']
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function validateAgeRestriction(formData) {
|
|
95
|
+
const age = parseInt(formData.age?.value);
|
|
96
|
+
const hasParentalConsent = formData.parentalConsent?.value === 'yes';
|
|
97
|
+
if (isNaN(age) || age >= 13) {
|
|
98
|
+
return { isValid: true, errors: [] };
|
|
99
|
+
}
|
|
100
|
+
const isValid = hasParentalConsent;
|
|
101
|
+
return {
|
|
102
|
+
isValid,
|
|
103
|
+
errors: isValid ? [] : ['Parental consent required for users under 13']
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Form-level validation orchestrator
|
|
108
|
+
*/
|
|
109
|
+
export function validateFormLevel(formData, customValidators = []) {
|
|
110
|
+
const allErrors = [];
|
|
111
|
+
let isValid = true;
|
|
112
|
+
// Run custom cross-field validations
|
|
113
|
+
const defaultValidators = [validatePasswordMatch, validateAgeRestriction];
|
|
114
|
+
const allValidators = [...defaultValidators, ...customValidators];
|
|
115
|
+
for (const validator of allValidators) {
|
|
116
|
+
const result = validator(formData);
|
|
117
|
+
if (!result.isValid) {
|
|
118
|
+
isValid = false;
|
|
119
|
+
allErrors.push(...result.errors);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { isValid, errors: allErrors };
|
|
123
|
+
}
|
package/dist/components/{pagebuilder → sitebuilder/page}/components/ComponentPropertiesForm.js
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
// import { PageSectionHeader } from '../../general/pixelated.headers';
|
|
4
|
-
import { FormEngine } from '
|
|
4
|
+
import { FormEngine } from '../../form/formengine';
|
|
5
5
|
/**
|
|
6
6
|
* ComponentPropertiesForm - Displays the component properties form
|
|
7
7
|
* Shows FormEngine when component is selected, placeholder otherwise
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import { PageSectionHeader } from '
|
|
4
|
+
import { PageSectionHeader } from '../../../general/semantic';
|
|
5
5
|
import { usePageBuilder } from '../lib/usePageBuilder';
|
|
6
6
|
import { ComponentSelector } from '../components/ComponentSelector';
|
|
7
7
|
import { ComponentPropertiesForm } from '../components/ComponentPropertiesForm';
|
|
8
8
|
import { PageEngine } from '../components/PageEngine';
|
|
9
9
|
import { SaveLoadSection } from '../components/SaveLoadSection';
|
|
10
|
-
import "
|
|
10
|
+
import "../../../../css/pixelated.global.css";
|
|
11
11
|
import './pagebuilder.scss';
|
|
12
12
|
/**
|
|
13
13
|
* PageBuilderUI - Main orchestrator component
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
|
-
import { generateKey } from '
|
|
4
|
+
import { generateKey } from '../../../utilities/functions';
|
|
5
5
|
import { componentMap, layoutComponents } from '../lib/componentMap';
|
|
6
6
|
import './pagebuilder.scss';
|
|
7
7
|
/**
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
// Choose ONE of these imports:
|
|
3
|
+
// Option 1: File-based storage
|
|
4
|
+
import { savePage } from '../../lib/pageStorageLocal';
|
|
5
|
+
// Option 2: Contentful storage
|
|
6
|
+
// import { savePage } from '@pixelated-tech/components/server';
|
|
7
|
+
// import type { ContentfulConfig } from '@pixelated-tech/components/server';
|
|
8
|
+
export async function POST(request) {
|
|
9
|
+
try {
|
|
10
|
+
const body = await request.json();
|
|
11
|
+
const { name, data } = body;
|
|
12
|
+
if (!name || !data) {
|
|
13
|
+
return NextResponse.json({
|
|
14
|
+
success: false,
|
|
15
|
+
message: 'Name and data are required'
|
|
16
|
+
}, { status: 400 });
|
|
17
|
+
}
|
|
18
|
+
// ===== OPTION 1: File-based storage =====
|
|
19
|
+
const result = await savePage(name, data);
|
|
20
|
+
// ===== OPTION 2: Contentful storage =====
|
|
21
|
+
// ===== OPTION 2: Contentful storage (recommended when using the unified PIXELATED config blob) =====
|
|
22
|
+
// The app reads the unified config on the server via `getFullPixelatedConfig()` which
|
|
23
|
+
// sources values from `PIXELATED_CONFIG_JSON` or `PIXELATED_CONFIG_B64`.
|
|
24
|
+
// Example (server-side):
|
|
25
|
+
// import { getFullPixelatedConfig } from '@pixelated-tech/components/server';
|
|
26
|
+
// const cfg = getFullPixelatedConfig();
|
|
27
|
+
// const contentfulConfig = cfg.contentful;
|
|
28
|
+
// const result = await savePage(name, data, contentfulConfig);
|
|
29
|
+
return NextResponse.json(result);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return NextResponse.json({
|
|
33
|
+
success: false,
|
|
34
|
+
message: `Invalid request: ${error}`
|
|
35
|
+
}, { status: 400 });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { PageTitleHeader, PageSectionHeader } from "
|
|
2
|
-
import { Callout } from "
|
|
3
|
-
import { PageSection, PageGridItem, PageFlexItem } from "
|
|
1
|
+
import { PageTitleHeader, PageSectionHeader } from "../../../general/semantic";
|
|
2
|
+
import { Callout } from "../../../callout/callout";
|
|
3
|
+
import { PageSection, PageGridItem, PageFlexItem } from "../../../general/semantic";
|
|
4
4
|
/**
|
|
5
5
|
* Component registry and constants
|
|
6
6
|
*/
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* used in PropTypes, generate TypeScript types via InferProps, and provide
|
|
7
7
|
* runtime values for form generation.
|
|
8
8
|
*/
|
|
9
|
-
import { variants, shapes, layouts, directions } from "
|
|
10
|
-
import { layoutTypes, autoFlowValues, flexDirections, flexWraps, justifyContentValues, alignItemsValues } from "
|
|
9
|
+
import { variants, shapes, layouts, directions } from "../../../callout/callout";
|
|
10
|
+
import { layoutTypes, autoFlowValues, flexDirections, flexWraps, justifyContentValues, alignItemsValues } from "../../../general/semantic";
|
|
11
11
|
export const componentMetadata = {
|
|
12
12
|
'Callout': {
|
|
13
13
|
variant: {
|