form-builder-pro 1.0.8 → 1.0.10

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/dist/index.mjs CHANGED
@@ -4150,6 +4150,67 @@ var cloneField = (field) => {
4150
4150
  };
4151
4151
  };
4152
4152
 
4153
+ // src/utils/mapper.ts
4154
+ var cleanFormSchema = (schema) => {
4155
+ const cleanField = (field) => {
4156
+ const cleaned = {
4157
+ id: field.id,
4158
+ type: field.type === "decimal" ? "number" : field.type,
4159
+ // Convert decimal to number
4160
+ label: field.label,
4161
+ width: field.width
4162
+ };
4163
+ if (field.placeholder !== void 0)
4164
+ cleaned.placeholder = field.placeholder;
4165
+ if (field.description !== void 0)
4166
+ cleaned.description = field.description;
4167
+ if (field.required !== void 0)
4168
+ cleaned.required = field.required;
4169
+ if (field.defaultValue !== void 0)
4170
+ cleaned.defaultValue = field.defaultValue;
4171
+ if (field.validation !== void 0)
4172
+ cleaned.validation = field.validation;
4173
+ if (field.hidden !== void 0)
4174
+ cleaned.hidden = field.hidden;
4175
+ if (field.position !== void 0)
4176
+ cleaned.position = field.position;
4177
+ if (field.enabled !== void 0)
4178
+ cleaned.enabled = field.enabled;
4179
+ if (field.visible !== void 0)
4180
+ cleaned.visible = field.visible;
4181
+ if (field.optionsSource !== void 0)
4182
+ cleaned.optionsSource = field.optionsSource;
4183
+ if ((field.type === "select" || field.type === "radio") && field.options) {
4184
+ cleaned.options = field.options;
4185
+ }
4186
+ if (field.type === "select" && field.groupName) {
4187
+ cleaned.groupName = field.groupName;
4188
+ }
4189
+ if (field.type === "select" && field.masterTypeName !== void 0) {
4190
+ cleaned.masterTypeName = field.masterTypeName;
4191
+ }
4192
+ return cleaned;
4193
+ };
4194
+ return {
4195
+ id: schema.id,
4196
+ title: schema.title,
4197
+ formName: schema.formName,
4198
+ sections: schema.sections.map((section) => ({
4199
+ id: section.id,
4200
+ title: section.title,
4201
+ fields: section.fields.map(cleanField),
4202
+ isExpanded: section.isExpanded,
4203
+ columns: section.columns
4204
+ }))
4205
+ };
4206
+ };
4207
+ var builderToPlatform = (builderSchema) => {
4208
+ return builderSchema;
4209
+ };
4210
+ var platformToBuilder = (platformSchema) => {
4211
+ return cleanFormSchema(platformSchema);
4212
+ };
4213
+
4153
4214
  // src/core/useFormStore.ts
4154
4215
  var INITIAL_SCHEMA = {
4155
4216
  id: "form_1",
@@ -4168,6 +4229,7 @@ var formStore = createStore((set, get) => ({
4168
4229
  masterTypes: [],
4169
4230
  dropdownOptionsMap: {},
4170
4231
  setSchema: (schema) => {
4232
+ const cleanedSchema = cleanFormSchema(schema);
4171
4233
  const convertIndexesToOptions = (indexes) => {
4172
4234
  if (!indexes || !Array.isArray(indexes) || indexes.length === 0) {
4173
4235
  return [];
@@ -4192,8 +4254,8 @@ var formStore = createStore((set, get) => ({
4192
4254
  );
4193
4255
  };
4194
4256
  const state = get();
4195
- if (state.masterTypes && state.masterTypes.length > 0 && schema.sections) {
4196
- const updatedSections = schema.sections.map((section) => ({
4257
+ if (state.masterTypes && state.masterTypes.length > 0 && cleanedSchema.sections) {
4258
+ const updatedSections = cleanedSchema.sections.map((section) => ({
4197
4259
  ...section,
4198
4260
  fields: section.fields.map((field) => {
4199
4261
  if (field.type === "select" && field.groupName) {
@@ -4226,9 +4288,9 @@ var formStore = createStore((set, get) => ({
4226
4288
  return field;
4227
4289
  })
4228
4290
  }));
4229
- set({ schema: { ...schema, sections: updatedSections } });
4291
+ set({ schema: { ...cleanedSchema, sections: updatedSections } });
4230
4292
  } else {
4231
- set({ schema });
4293
+ set({ schema: cleanedSchema });
4232
4294
  }
4233
4295
  },
4234
4296
  togglePreview: () => {
@@ -7940,6 +8002,7 @@ var FormBuilder = class {
7940
8002
  id: selectedMasterType.id,
7941
8003
  name: selectedMasterType.name
7942
8004
  },
8005
+ masterTypeName: selectedEnumName,
7943
8006
  options: options.length > 0 ? options : void 0
7944
8007
  });
7945
8008
  if (this.options.onGroupSelectionChange) {
@@ -7952,6 +8015,7 @@ var FormBuilder = class {
7952
8015
  } else {
7953
8016
  formStore.getState().updateField(selectedField.id, {
7954
8017
  groupName: void 0,
8018
+ masterTypeName: void 0,
7955
8019
  options: void 0
7956
8020
  // Clear options when groupName is cleared
7957
8021
  });
@@ -7992,8 +8056,6 @@ var FormBuilder = class {
7992
8056
  }
7993
8057
  }
7994
8058
  }
7995
- const validationHeader = createElement("h3", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wider mb-3 mt-6", text: "Validation Rules" });
7996
- body.appendChild(validationHeader);
7997
8059
  const validations = selectedField.validation || [];
7998
8060
  const updateValidation = (rule) => {
7999
8061
  const newValidations = validations.filter((v) => v.type !== rule.type);
@@ -8003,6 +8065,7 @@ var FormBuilder = class {
8003
8065
  formStore.getState().updateField(selectedField.id, { validation: newValidations });
8004
8066
  };
8005
8067
  const getRuleValue = (type) => validations.find((v) => v.type === type)?.value || "";
8068
+ const validationElements = [];
8006
8069
  if (["text", "textarea", "email", "password"].includes(selectedField.type)) {
8007
8070
  const minLenGroup = createElement("div", { className: "mb-3" });
8008
8071
  minLenGroup.appendChild(createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", text: "Min Length" }));
@@ -8013,7 +8076,7 @@ var FormBuilder = class {
8013
8076
  placeholder: "e.g. 3",
8014
8077
  onchange: (e) => updateValidation({ type: "minLength", value: parseInt(e.target.value) })
8015
8078
  }));
8016
- body.appendChild(minLenGroup);
8079
+ validationElements.push(minLenGroup);
8017
8080
  const maxLenGroup = createElement("div", { className: "mb-3" });
8018
8081
  maxLenGroup.appendChild(createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", text: "Max Length" }));
8019
8082
  maxLenGroup.appendChild(createElement("input", {
@@ -8023,7 +8086,7 @@ var FormBuilder = class {
8023
8086
  placeholder: "e.g. 100",
8024
8087
  onchange: (e) => updateValidation({ type: "maxLength", value: parseInt(e.target.value) })
8025
8088
  }));
8026
- body.appendChild(maxLenGroup);
8089
+ validationElements.push(maxLenGroup);
8027
8090
  const regexGroup = createElement("div", { className: "mb-3" });
8028
8091
  regexGroup.appendChild(createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", text: "Regex Pattern" }));
8029
8092
  regexGroup.appendChild(createElement("input", {
@@ -8041,7 +8104,7 @@ var FormBuilder = class {
8041
8104
  formStore.getState().updateField(selectedField.id, { validation: newValidations });
8042
8105
  }
8043
8106
  }));
8044
- body.appendChild(regexGroup);
8107
+ validationElements.push(regexGroup);
8045
8108
  }
8046
8109
  if (selectedField.type === "number") {
8047
8110
  const minValGroup = createElement("div", { className: "mb-3" });
@@ -8052,7 +8115,7 @@ var FormBuilder = class {
8052
8115
  value: getRuleValue("min"),
8053
8116
  onchange: (e) => updateValidation({ type: "min", value: parseInt(e.target.value) })
8054
8117
  }));
8055
- body.appendChild(minValGroup);
8118
+ validationElements.push(minValGroup);
8056
8119
  const maxValGroup = createElement("div", { className: "mb-3" });
8057
8120
  maxValGroup.appendChild(createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", text: "Max Value" }));
8058
8121
  maxValGroup.appendChild(createElement("input", {
@@ -8061,59 +8124,12 @@ var FormBuilder = class {
8061
8124
  value: getRuleValue("max"),
8062
8125
  onchange: (e) => updateValidation({ type: "max", value: parseInt(e.target.value) })
8063
8126
  }));
8064
- body.appendChild(maxValGroup);
8065
- }
8066
- if (["select", "radio"].includes(selectedField.type)) {
8067
- const optionsHeader = createElement("h3", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wider mb-3 mt-6", text: "Options Source" });
8068
- body.appendChild(optionsHeader);
8069
- const sourceGroup = createElement("div", { className: "mb-4" });
8070
- sourceGroup.appendChild(createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", text: "Source Type" }));
8071
- const sourceSelect = createElement("select", {
8072
- className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md bg-transparent",
8073
- onchange: (e) => {
8074
- const isAsync2 = e.target.value === "api";
8075
- if (isAsync2) {
8076
- formStore.getState().updateField(selectedField.id, {
8077
- optionsSource: { api: "https://", method: "GET", labelKey: "name", valueKey: "id" }
8078
- });
8079
- } else {
8080
- formStore.getState().updateField(selectedField.id, { optionsSource: void 0 });
8081
- }
8082
- this.render();
8083
- }
8084
- });
8085
- sourceSelect.appendChild(createElement("option", { value: "static", text: "Static Options", selected: !selectedField.optionsSource }));
8086
- sourceSelect.appendChild(createElement("option", { value: "api", text: "API Endpoint", selected: !!selectedField.optionsSource }));
8087
- sourceGroup.appendChild(sourceSelect);
8088
- body.appendChild(sourceGroup);
8089
- if (selectedField.optionsSource) {
8090
- const apiGroup = createElement("div", { className: "mb-3" });
8091
- apiGroup.appendChild(createElement("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", text: "API URL" }));
8092
- apiGroup.appendChild(createElement("input", {
8093
- className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md bg-transparent",
8094
- value: selectedField.optionsSource.api,
8095
- oninput: (e) => formStore.getState().updateField(selectedField.id, { optionsSource: { ...selectedField.optionsSource, api: e.target.value } })
8096
- }));
8097
- body.appendChild(apiGroup);
8098
- const keysRow = createElement("div", { className: "flex gap-2 mb-3" });
8099
- const labelKeyGroup = createElement("div", { className: "flex-1" });
8100
- labelKeyGroup.appendChild(createElement("label", { className: "block text-xs font-medium text-gray-500 mb-1", text: "Label Key" }));
8101
- labelKeyGroup.appendChild(createElement("input", {
8102
- className: "w-full px-2 py-1 border border-gray-300 dark:border-gray-700 rounded-md bg-transparent text-sm",
8103
- value: selectedField.optionsSource.labelKey,
8104
- oninput: (e) => formStore.getState().updateField(selectedField.id, { optionsSource: { ...selectedField.optionsSource, labelKey: e.target.value } })
8105
- }));
8106
- const valueKeyGroup = createElement("div", { className: "flex-1" });
8107
- valueKeyGroup.appendChild(createElement("label", { className: "block text-xs font-medium text-gray-500 mb-1", text: "Value Key" }));
8108
- valueKeyGroup.appendChild(createElement("input", {
8109
- className: "w-full px-2 py-1 border border-gray-300 dark:border-gray-700 rounded-md bg-transparent text-sm",
8110
- value: selectedField.optionsSource.valueKey,
8111
- oninput: (e) => formStore.getState().updateField(selectedField.id, { optionsSource: { ...selectedField.optionsSource, valueKey: e.target.value } })
8112
- }));
8113
- keysRow.appendChild(labelKeyGroup);
8114
- keysRow.appendChild(valueKeyGroup);
8115
- body.appendChild(keysRow);
8116
- }
8127
+ validationElements.push(maxValGroup);
8128
+ }
8129
+ if (validationElements.length > 0) {
8130
+ const validationHeader = createElement("h3", { className: "text-xs font-semibold text-gray-500 uppercase tracking-wider mb-3 mt-6", text: "Validation Rules" });
8131
+ body.appendChild(validationHeader);
8132
+ validationElements.forEach((el) => body.appendChild(el));
8117
8133
  }
8118
8134
  panel.appendChild(body);
8119
8135
  return panel;
@@ -8149,14 +8165,6 @@ var FormBuilder = class {
8149
8165
  }
8150
8166
  };
8151
8167
 
8152
- // src/utils/mapper.ts
8153
- var builderToPlatform = (builderSchema) => {
8154
- return builderSchema;
8155
- };
8156
- var platformToBuilder = (platformSchema) => {
8157
- return platformSchema;
8158
- };
8159
-
8160
8168
  // src/index.ts
8161
8169
  var initFormBuilder = (options) => {
8162
8170
  const container = document.getElementById(options.containerId);
@@ -8176,6 +8184,6 @@ sortablejs/modular/sortable.esm.js:
8176
8184
  *)
8177
8185
  */
8178
8186
 
8179
- export { FormBuilder, FormRenderer, FormSchemaValidation, builderToPlatform, formStore, initFormBuilder, platformToBuilder };
8187
+ export { FormBuilder, FormRenderer, FormSchemaValidation, builderToPlatform, cleanFormSchema, formStore, initFormBuilder, platformToBuilder };
8180
8188
  //# sourceMappingURL=out.js.map
8181
8189
  //# sourceMappingURL=index.mjs.map