powr-sdk-web 5.6.7 → 5.6.9

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 (2) hide show
  1. package/dist/forms/admin.js +337 -87
  2. package/package.json +1 -1
@@ -8,6 +8,15 @@ exports["default"] = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _auth = require("../utils/auth");
10
10
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t4 in e) "default" !== _t4 && {}.hasOwnProperty.call(e, _t4) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t4)) && (i.get || i.set) ? o(f, _t4, i) : f[_t4] = e[_t4]); return f; })(e, t); }
11
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
12
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
14
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
15
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
16
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
17
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
18
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
19
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
11
20
  function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
12
21
  function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
13
22
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
@@ -39,38 +48,47 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
39
48
  _useState8 = _slicedToArray(_useState7, 2),
40
49
  showCreateModal = _useState8[0],
41
50
  setShowCreateModal = _useState8[1];
42
- var _useState9 = (0, _react.useState)(null),
51
+ var _useState9 = (0, _react.useState)(false),
43
52
  _useState0 = _slicedToArray(_useState9, 2),
44
- selectedFile = _useState0[0],
45
- setSelectedFile = _useState0[1];
46
- var _useState1 = (0, _react.useState)(false),
53
+ isSaving = _useState0[0],
54
+ setIsSaving = _useState0[1];
55
+ var _useState1 = (0, _react.useState)(''),
47
56
  _useState10 = _slicedToArray(_useState1, 2),
48
- isUploading = _useState10[0],
49
- setIsUploading = _useState10[1];
50
- var _useState11 = (0, _react.useState)(null),
57
+ createFeedback = _useState10[0],
58
+ setCreateFeedback = _useState10[1];
59
+ var _useState11 = (0, _react.useState)({
60
+ formTitle: '',
61
+ formName: '',
62
+ formId: '',
63
+ fields: []
64
+ }),
51
65
  _useState12 = _slicedToArray(_useState11, 2),
52
- selectedForm = _useState12[0],
53
- setSelectedForm = _useState12[1];
54
- var _useState13 = (0, _react.useState)(false),
66
+ formDraft = _useState12[0],
67
+ setFormDraft = _useState12[1];
68
+ var _useState13 = (0, _react.useState)(null),
55
69
  _useState14 = _slicedToArray(_useState13, 2),
56
- showDetailModal = _useState14[0],
57
- setShowDetailModal = _useState14[1];
58
- var _useState15 = (0, _react.useState)('responses'),
70
+ selectedForm = _useState14[0],
71
+ setSelectedForm = _useState14[1];
72
+ var _useState15 = (0, _react.useState)(false),
59
73
  _useState16 = _slicedToArray(_useState15, 2),
60
- activeTab = _useState16[0],
61
- setActiveTab = _useState16[1];
62
- var _useState17 = (0, _react.useState)([]),
74
+ showDetailModal = _useState16[0],
75
+ setShowDetailModal = _useState16[1];
76
+ var _useState17 = (0, _react.useState)('responses'),
63
77
  _useState18 = _slicedToArray(_useState17, 2),
64
- formResponses = _useState18[0],
65
- setFormResponses = _useState18[1];
66
- var _useState19 = (0, _react.useState)(0),
78
+ activeTab = _useState18[0],
79
+ setActiveTab = _useState18[1];
80
+ var _useState19 = (0, _react.useState)([]),
67
81
  _useState20 = _slicedToArray(_useState19, 2),
68
- responseCount = _useState20[0],
69
- setResponseCount = _useState20[1];
70
- var _useState21 = (0, _react.useState)(false),
82
+ formResponses = _useState20[0],
83
+ setFormResponses = _useState20[1];
84
+ var _useState21 = (0, _react.useState)(0),
71
85
  _useState22 = _slicedToArray(_useState21, 2),
72
- loadingResponses = _useState22[0],
73
- setLoadingResponses = _useState22[1];
86
+ responseCount = _useState22[0],
87
+ setResponseCount = _useState22[1];
88
+ var _useState23 = (0, _react.useState)(false),
89
+ _useState24 = _slicedToArray(_useState23, 2),
90
+ loadingResponses = _useState24[0],
91
+ setLoadingResponses = _useState24[1];
74
92
  var fetchForms = /*#__PURE__*/function () {
75
93
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
76
94
  var _yield$apiCall, data, ok, _t;
@@ -176,86 +194,185 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
176
194
  return _ref3.apply(this, arguments);
177
195
  };
178
196
  }();
197
+ var notify = function notify(type, message) {
198
+ setCreateFeedback(message);
199
+ if (onFormAction) {
200
+ onFormAction(type, message);
201
+ }
202
+ };
203
+ var resetFormDraft = function resetFormDraft() {
204
+ setFormDraft({
205
+ formTitle: '',
206
+ formName: '',
207
+ formId: '',
208
+ fields: []
209
+ });
210
+ };
211
+ var slugify = function slugify(value) {
212
+ return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, '').slice(0, 32);
213
+ };
214
+ var uniqueFieldName = function uniqueFieldName(label, index, fields) {
215
+ var taken = fields.map(function (field) {
216
+ return field.name;
217
+ }).filter(Boolean);
218
+ var base = slugify(label) || "field".concat(index + 1);
219
+ var candidate = base;
220
+ var suffix = 2;
221
+ while (taken.includes(candidate)) {
222
+ candidate = "".concat(base).concat(suffix);
223
+ suffix += 1;
224
+ }
225
+ return candidate;
226
+ };
227
+ var addField = function addField(type) {
228
+ var index = formDraft.fields.length + 1;
229
+ setFormDraft(function (prev) {
230
+ return _objectSpread(_objectSpread({}, prev), {}, {
231
+ fields: [].concat(_toConsumableArray(prev.fields), [_objectSpread({
232
+ name: "field".concat(index),
233
+ label: "Field ".concat(index),
234
+ type: type,
235
+ required: false
236
+ }, type === 'radio' ? {
237
+ options: ['Option 1', 'Option 2']
238
+ } : {})])
239
+ });
240
+ });
241
+ };
242
+ var updateField = function updateField(index, updates) {
243
+ setFormDraft(function (prev) {
244
+ return _objectSpread(_objectSpread({}, prev), {}, {
245
+ fields: prev.fields.map(function (field, i) {
246
+ return i === index ? _objectSpread(_objectSpread({}, field), updates) : field;
247
+ })
248
+ });
249
+ });
250
+ };
251
+ var removeField = function removeField(index) {
252
+ setFormDraft(function (prev) {
253
+ return _objectSpread(_objectSpread({}, prev), {}, {
254
+ fields: prev.fields.filter(function (_, i) {
255
+ return i !== index;
256
+ })
257
+ });
258
+ });
259
+ };
179
260
  var createForm = /*#__PURE__*/function () {
180
261
  var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
181
- var formData, _yield$apiCall3, result, ok, errorMessage, _errorMessage, _t3;
262
+ var trimmedTitle, trimmedName, trimmedId, hasInvalidField, fieldNames, duplicateNames, payload, _yield$apiCall3, result, ok, errorMessage, _t3;
182
263
  return _regenerator().w(function (_context3) {
183
264
  while (1) switch (_context3.p = _context3.n) {
184
265
  case 0:
185
- if (!(!projectId || !selectedFile)) {
266
+ setCreateFeedback('');
267
+ if (projectId) {
186
268
  _context3.n = 1;
187
269
  break;
188
270
  }
189
- if (onFormAction) {
190
- onFormAction('error', 'Please select a JSON file to upload');
191
- }
271
+ notify('error', 'Project ID is required');
192
272
  return _context3.a(2);
193
273
  case 1:
194
- setIsUploading(true);
195
- _context3.p = 2;
196
- formData = new FormData();
197
- formData.append('jsonFile', selectedFile);
198
- _context3.n = 3;
274
+ trimmedTitle = formDraft.formTitle.trim();
275
+ trimmedName = formDraft.formName.trim();
276
+ trimmedId = formDraft.formId.trim();
277
+ if (!(!trimmedTitle || !trimmedName || !trimmedId)) {
278
+ _context3.n = 2;
279
+ break;
280
+ }
281
+ notify('error', 'Form title, name, and ID are required');
282
+ return _context3.a(2);
283
+ case 2:
284
+ if (!(formDraft.fields.length === 0)) {
285
+ _context3.n = 3;
286
+ break;
287
+ }
288
+ notify('error', 'Add at least one field');
289
+ return _context3.a(2);
290
+ case 3:
291
+ hasInvalidField = formDraft.fields.some(function (field) {
292
+ var _field$name, _field$label;
293
+ return !((_field$name = field.name) !== null && _field$name !== void 0 && _field$name.trim()) || !((_field$label = field.label) !== null && _field$label !== void 0 && _field$label.trim());
294
+ });
295
+ if (!hasInvalidField) {
296
+ _context3.n = 4;
297
+ break;
298
+ }
299
+ notify('error', 'Each field needs a name and label');
300
+ return _context3.a(2);
301
+ case 4:
302
+ fieldNames = formDraft.fields.map(function (field) {
303
+ return field.name.trim();
304
+ });
305
+ duplicateNames = fieldNames.filter(function (name, index) {
306
+ return fieldNames.indexOf(name) !== index;
307
+ });
308
+ if (!(duplicateNames.length > 0)) {
309
+ _context3.n = 5;
310
+ break;
311
+ }
312
+ notify('error', "Each field needs a unique name. Duplicate: ".concat(_toConsumableArray(new Set(duplicateNames)).join(', ')));
313
+ return _context3.a(2);
314
+ case 5:
315
+ setIsSaving(true);
316
+ _context3.p = 6;
317
+ payload = {
318
+ formTitle: trimmedTitle,
319
+ formName: trimmedName,
320
+ formId: trimmedId,
321
+ fields: formDraft.fields.map(function (field) {
322
+ return _objectSpread({
323
+ name: field.name.trim(),
324
+ label: field.label.trim(),
325
+ type: field.type,
326
+ required: !!field.required
327
+ }, field.type === 'radio' ? {
328
+ options: field.options || []
329
+ } : {});
330
+ })
331
+ };
332
+ _context3.n = 7;
199
333
  return (0, _auth.apiCall)(apiUrl, "/forms/create-form", projectId, {
200
334
  method: 'POST',
201
- body: formData
335
+ body: payload
202
336
  });
203
- case 3:
337
+ case 7:
204
338
  _yield$apiCall3 = _context3.v;
205
339
  result = _yield$apiCall3.data;
206
340
  ok = _yield$apiCall3.ok;
207
341
  if (ok) {
208
- _context3.n = 4;
342
+ _context3.n = 8;
209
343
  break;
210
344
  }
211
- errorMessage = result.message || 'Failed to create form';
212
- throw new Error(errorMessage);
213
- case 4:
214
- if (onFormAction) {
215
- onFormAction('success', result.message || 'Form created successfully!');
216
- }
217
- setSelectedFile(null);
345
+ throw new Error(result.message || 'Failed to create form');
346
+ case 8:
347
+ notify('success', result.message || 'Form created successfully!');
348
+ resetFormDraft();
349
+ setCreateFeedback('');
218
350
  setShowCreateModal(false);
219
351
  fetchForms();
220
352
  if (onRefresh) {
221
353
  onRefresh();
222
354
  }
223
- _context3.n = 6;
355
+ _context3.n = 10;
224
356
  break;
225
- case 5:
226
- _context3.p = 5;
357
+ case 9:
358
+ _context3.p = 9;
227
359
  _t3 = _context3.v;
228
360
  console.error('Error creating form:', _t3);
229
- _errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
230
- if (onFormAction) {
231
- onFormAction('error', _errorMessage);
232
- }
233
- setSelectedFile(null);
234
- setShowCreateModal(false);
235
- case 6:
236
- _context3.p = 6;
237
- setIsUploading(false);
238
- return _context3.f(6);
239
- case 7:
361
+ errorMessage = _t3 instanceof Error ? _t3.message : 'Failed to create form';
362
+ notify('error', errorMessage);
363
+ case 10:
364
+ _context3.p = 10;
365
+ setIsSaving(false);
366
+ return _context3.f(10);
367
+ case 11:
240
368
  return _context3.a(2);
241
369
  }
242
- }, _callee3, null, [[2, 5, 6, 7]]);
370
+ }, _callee3, null, [[6, 9, 10, 11]]);
243
371
  }));
244
372
  return function createForm() {
245
373
  return _ref4.apply(this, arguments);
246
374
  };
247
375
  }();
248
- var handleFileChange = function handleFileChange(e) {
249
- var _e$target$files;
250
- var file = (_e$target$files = e.target.files) === null || _e$target$files === void 0 ? void 0 : _e$target$files[0];
251
- if (file && file.type === 'application/json') {
252
- setSelectedFile(file);
253
- } else {
254
- if (onFormAction) {
255
- onFormAction('error', 'Please select a valid JSON file');
256
- }
257
- }
258
- };
259
376
  var handleViewForm = function handleViewForm(form) {
260
377
  setSelectedForm(form);
261
378
  setActiveTab('responses');
@@ -287,7 +404,9 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
287
404
  className: "text-gray-600 mt-1"
288
405
  }, "Create and manage your dynamic forms")), /*#__PURE__*/_react["default"].createElement("button", {
289
406
  onClick: function onClick() {
290
- return setShowCreateModal(true);
407
+ resetFormDraft();
408
+ setCreateFeedback('');
409
+ setShowCreateModal(true);
291
410
  },
292
411
  className: "bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg flex items-center gap-2"
293
412
  }, /*#__PURE__*/_react["default"].createElement("svg", {
@@ -345,38 +464,169 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
345
464
  className: "text-sm text-gray-500"
346
465
  }, ((_form$fields = form.fields) === null || _form$fields === void 0 ? void 0 : _form$fields.length) || 0, " fields"));
347
466
  })))), showCreateModal && /*#__PURE__*/_react["default"].createElement("div", {
348
- className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
467
+ className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50 p-4"
349
468
  }, /*#__PURE__*/_react["default"].createElement("div", {
350
- className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-lg"
469
+ className: "bg-white rounded-2xl shadow-xl p-8 w-full max-w-3xl max-h-[90vh] overflow-y-auto"
351
470
  }, /*#__PURE__*/_react["default"].createElement("h2", {
352
471
  className: "text-xl font-bold text-gray-800 mb-6"
353
- }, "Create New Form"), /*#__PURE__*/_react["default"].createElement("div", {
354
- className: "space-y-4"
472
+ }, "Create New Form"), createFeedback && /*#__PURE__*/_react["default"].createElement("div", {
473
+ className: "mb-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"
474
+ }, createFeedback), /*#__PURE__*/_react["default"].createElement("div", {
475
+ className: "space-y-6"
476
+ }, /*#__PURE__*/_react["default"].createElement("div", {
477
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4"
355
478
  }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
356
- htmlFor: "jsonFile",
479
+ htmlFor: "formTitle",
357
480
  className: "block text-sm font-medium text-gray-700 mb-1"
358
- }, "JSON Form Schema *"), /*#__PURE__*/_react["default"].createElement("input", {
359
- id: "jsonFile",
360
- name: "jsonFile",
361
- type: "file",
362
- accept: ".json",
363
- onChange: handleFileChange,
364
- required: true,
481
+ }, "Form Title *"), /*#__PURE__*/_react["default"].createElement("input", {
482
+ id: "formTitle",
483
+ type: "text",
484
+ value: formDraft.formTitle,
485
+ onChange: function onChange(e) {
486
+ var formTitle = e.target.value;
487
+ setFormDraft(function (prev) {
488
+ return _objectSpread(_objectSpread({}, prev), {}, {
489
+ formTitle: formTitle,
490
+ formName: prev.formName || slugify(formTitle)
491
+ });
492
+ });
493
+ },
494
+ placeholder: "Genkit Workshop Registration",
495
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
496
+ })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
497
+ htmlFor: "formId",
498
+ className: "block text-sm font-medium text-gray-700 mb-1"
499
+ }, "Form ID *"), /*#__PURE__*/_react["default"].createElement("input", {
500
+ id: "formId",
501
+ type: "text",
502
+ value: formDraft.formId,
503
+ onChange: function onChange(e) {
504
+ return setFormDraft(function (prev) {
505
+ return _objectSpread(_objectSpread({}, prev), {}, {
506
+ formId: e.target.value.toUpperCase()
507
+ });
508
+ });
509
+ },
510
+ placeholder: "KHA2025A2",
511
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
512
+ })), /*#__PURE__*/_react["default"].createElement("div", {
513
+ className: "md:col-span-2"
514
+ }, /*#__PURE__*/_react["default"].createElement("label", {
515
+ htmlFor: "formName",
516
+ className: "block text-sm font-medium text-gray-700 mb-1"
517
+ }, "Form Name (URL slug) *"), /*#__PURE__*/_react["default"].createElement("input", {
518
+ id: "formName",
519
+ type: "text",
520
+ value: formDraft.formName,
521
+ onChange: function onChange(e) {
522
+ return setFormDraft(function (prev) {
523
+ return _objectSpread(_objectSpread({}, prev), {}, {
524
+ formName: slugify(e.target.value)
525
+ });
526
+ });
527
+ },
528
+ placeholder: "workshopform",
365
529
  className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
366
530
  }), /*#__PURE__*/_react["default"].createElement("p", {
367
531
  className: "text-xs text-gray-500 mt-1"
368
- }, "Upload a JSON file containing your form schema"))), /*#__PURE__*/_react["default"].createElement("div", {
532
+ }, "Used in URLs like `/forms?id=workshopform`"))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
533
+ className: "flex items-center justify-between mb-3"
534
+ }, /*#__PURE__*/_react["default"].createElement("h3", {
535
+ className: "text-sm font-semibold text-gray-900"
536
+ }, "Fields"), /*#__PURE__*/_react["default"].createElement("div", {
537
+ className: "flex flex-wrap gap-2"
538
+ }, ['text', 'email', 'textarea', 'radio', 'fileUploader'].map(function (type) {
539
+ return /*#__PURE__*/_react["default"].createElement("button", {
540
+ key: type,
541
+ type: "button",
542
+ onClick: function onClick() {
543
+ return addField(type);
544
+ },
545
+ className: "px-3 py-1 text-xs rounded-full border border-gray-300 hover:bg-gray-50"
546
+ }, "+ ", type);
547
+ }))), formDraft.fields.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", {
548
+ className: "rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-500"
549
+ }, "Add fields using the buttons above") : /*#__PURE__*/_react["default"].createElement("div", {
550
+ className: "space-y-4"
551
+ }, formDraft.fields.map(function (field, index) {
552
+ return /*#__PURE__*/_react["default"].createElement("div", {
553
+ key: "".concat(field.name, "-").concat(index),
554
+ className: "rounded-lg border border-gray-200 p-4 space-y-3"
555
+ }, /*#__PURE__*/_react["default"].createElement("div", {
556
+ className: "flex items-center justify-between"
557
+ }, /*#__PURE__*/_react["default"].createElement("span", {
558
+ className: "text-sm font-medium text-gray-700 capitalize"
559
+ }, field.type, " field"), /*#__PURE__*/_react["default"].createElement("button", {
560
+ type: "button",
561
+ onClick: function onClick() {
562
+ return removeField(index);
563
+ },
564
+ className: "text-sm text-red-600 hover:text-red-700"
565
+ }, "Remove")), /*#__PURE__*/_react["default"].createElement("div", {
566
+ className: "grid grid-cols-1 md:grid-cols-2 gap-3"
567
+ }, /*#__PURE__*/_react["default"].createElement("input", {
568
+ type: "text",
569
+ value: field.label,
570
+ onChange: function onChange(e) {
571
+ var label = e.target.value;
572
+ updateField(index, {
573
+ label: label,
574
+ name: uniqueFieldName(label, index, formDraft.fields.filter(function (_, i) {
575
+ return i !== index;
576
+ }))
577
+ });
578
+ },
579
+ placeholder: "Label",
580
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
581
+ }), /*#__PURE__*/_react["default"].createElement("input", {
582
+ type: "text",
583
+ value: field.name,
584
+ onChange: function onChange(e) {
585
+ return updateField(index, {
586
+ name: slugify(e.target.value)
587
+ });
588
+ },
589
+ placeholder: "name",
590
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
591
+ })), /*#__PURE__*/_react["default"].createElement("label", {
592
+ className: "flex items-center gap-2 text-sm text-gray-700"
593
+ }, /*#__PURE__*/_react["default"].createElement("input", {
594
+ type: "checkbox",
595
+ checked: !!field.required,
596
+ onChange: function onChange(e) {
597
+ return updateField(index, {
598
+ required: e.target.checked
599
+ });
600
+ }
601
+ }), "Required"), field.type === 'radio' && /*#__PURE__*/_react["default"].createElement("textarea", {
602
+ value: (field.options || []).join('\n'),
603
+ onChange: function onChange(e) {
604
+ return updateField(index, {
605
+ options: e.target.value.split('\n').map(function (option) {
606
+ return option.trim();
607
+ }).filter(Boolean)
608
+ });
609
+ },
610
+ placeholder: "One option per line",
611
+ rows: 3,
612
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md"
613
+ }));
614
+ })))), /*#__PURE__*/_react["default"].createElement("div", {
369
615
  className: "flex justify-end gap-4 mt-6"
370
616
  }, /*#__PURE__*/_react["default"].createElement("button", {
617
+ type: "button",
371
618
  onClick: function onClick() {
372
- return setShowCreateModal(false);
619
+ resetFormDraft();
620
+ setCreateFeedback('');
621
+ setShowCreateModal(false);
373
622
  },
374
623
  className: "bg-gray-300 text-gray-700 hover:bg-gray-400 px-4 py-2 rounded-md"
375
624
  }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
625
+ type: "button",
376
626
  onClick: createForm,
377
- disabled: isUploading || !selectedFile,
627
+ disabled: isSaving,
378
628
  className: "bg-blue-600 text-white hover:bg-blue-700 px-4 py-2 rounded-md disabled:opacity-50"
379
- }, isUploading ? /*#__PURE__*/_react["default"].createElement("div", {
629
+ }, isSaving ? /*#__PURE__*/_react["default"].createElement("div", {
380
630
  className: "animate-spin h-5 w-5 mx-auto border-2 border-white border-t-transparent rounded-full"
381
631
  }) : 'Create Form')))), showDetailModal && selectedForm && /*#__PURE__*/_react["default"].createElement("div", {
382
632
  className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.6.7",
3
+ "version": "5.6.9",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",