powr-sdk-web 6.15.0 → 6.15.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.
Files changed (2) hide show
  1. package/dist/forms/admin.js +158 -87
  2. package/package.json +1 -1
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
@@ -9,6 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
9
8
  var _auth = require("../utils/auth");
10
9
  var cache;
11
10
  function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var r, c, a = Object.defineProperty, n = { __proto__: null, "default": e }; if (Object(e) !== e) return n; if (cache || "function" != typeof WeakMap || (cache = new WeakMap()), cache) { if (cache.has(e)) return cache.get(e); cache.set(e, n); } for (c in e) "default" !== c && {}.hasOwnProperty.call(e, c) && ((r = a && Object.getOwnPropertyDescriptor(e, c)) && (r.get || r.set) ? a(n, c, r) : n[c] = e[c]); return n; }
11
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
12
12
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
13
13
  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."); }
14
14
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
@@ -1057,34 +1057,67 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
1057
1057
  }, "Responses (", responseCount, ")"))), activeTab === 'structure' && /*#__PURE__*/_react["default"].createElement("div", {
1058
1058
  className: "space-y-4"
1059
1059
  }, /*#__PURE__*/_react["default"].createElement("div", {
1060
- className: "grid grid-cols-2 gap-4 text-sm"
1060
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4 text-sm bg-gray-50 p-4 rounded-lg border border-gray-200"
1061
1061
  }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
1062
- className: "font-medium text-gray-700"
1063
- }, "Form ID:"), /*#__PURE__*/_react["default"].createElement("p", {
1064
- className: "text-gray-900"
1062
+ className: "font-medium text-gray-500"
1063
+ }, "Form ID"), /*#__PURE__*/_react["default"].createElement("p", {
1064
+ className: "text-gray-900 font-semibold mt-0.5"
1065
1065
  }, selectedForm.formId)), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
1066
- className: "font-medium text-gray-700"
1067
- }, "Form Name:"), /*#__PURE__*/_react["default"].createElement("p", {
1068
- className: "text-gray-900"
1066
+ className: "font-medium text-gray-500"
1067
+ }, "Form Name (Slug)"), /*#__PURE__*/_react["default"].createElement("p", {
1068
+ className: "text-gray-900 font-mono mt-0.5"
1069
1069
  }, selectedForm.formName)), selectedForm.description && /*#__PURE__*/_react["default"].createElement("div", {
1070
1070
  className: "md:col-span-2"
1071
1071
  }, /*#__PURE__*/_react["default"].createElement("p", {
1072
- className: "font-medium text-gray-700"
1073
- }, "Description:"), /*#__PURE__*/_react["default"].createElement("p", {
1074
- className: "text-gray-900 whitespace-pre-wrap"
1072
+ className: "font-medium text-gray-500"
1073
+ }, "Description"), /*#__PURE__*/_react["default"].createElement("p", {
1074
+ className: "text-gray-900 whitespace-pre-wrap mt-0.5"
1075
1075
  }, selectedForm.description)), selectedForm.imageUrl && /*#__PURE__*/_react["default"].createElement("div", {
1076
1076
  className: "md:col-span-2"
1077
1077
  }, /*#__PURE__*/_react["default"].createElement("p", {
1078
- className: "font-medium text-gray-700"
1079
- }, "Banner / share image:"), /*#__PURE__*/_react["default"].createElement("p", {
1080
- className: "text-gray-900 break-all"
1078
+ className: "font-medium text-gray-500"
1079
+ }, "Banner / share image"), /*#__PURE__*/_react["default"].createElement("a", {
1080
+ href: selectedForm.imageUrl,
1081
+ target: "_blank",
1082
+ rel: "noopener noreferrer",
1083
+ className: "text-blue-600 hover:text-blue-800 underline break-all inline-block mt-0.5"
1081
1084
  }, selectedForm.imageUrl))), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", {
1082
- className: "font-medium text-gray-700 mb-2"
1083
- }, "Form Fields:"), /*#__PURE__*/_react["default"].createElement("div", {
1084
- className: "bg-gray-50 p-4 rounded-lg"
1085
- }, /*#__PURE__*/_react["default"].createElement("pre", {
1086
- className: "text-sm overflow-x-auto"
1087
- }, JSON.stringify(selectedForm.fields, null, 2))))), activeTab === 'responses' && /*#__PURE__*/_react["default"].createElement("div", {
1085
+ className: "font-medium text-gray-700 mb-3"
1086
+ }, "Form Fields (", (selectedForm.fields || []).length, ")"), !selectedForm.fields || selectedForm.fields.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", {
1087
+ className: "text-center py-6 bg-gray-50 rounded-lg border border-dashed border-gray-300 text-sm text-gray-500"
1088
+ }, "No fields configured on this form.") : /*#__PURE__*/_react["default"].createElement("div", {
1089
+ className: "space-y-3"
1090
+ }, selectedForm.fields.map(function (field, idx) {
1091
+ return /*#__PURE__*/_react["default"].createElement("div", {
1092
+ key: field.name || idx,
1093
+ className: "rounded-lg border border-gray-200 bg-white p-4 shadow-sm"
1094
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1095
+ className: "flex flex-wrap items-center justify-between gap-2"
1096
+ }, /*#__PURE__*/_react["default"].createElement("div", {
1097
+ className: "flex items-center gap-2"
1098
+ }, /*#__PURE__*/_react["default"].createElement("span", {
1099
+ className: "text-xs font-semibold text-gray-400"
1100
+ }, "#", idx + 1), /*#__PURE__*/_react["default"].createElement("span", {
1101
+ className: "text-sm font-semibold text-gray-900"
1102
+ }, field.label || field.name), field.required && /*#__PURE__*/_react["default"].createElement("span", {
1103
+ className: "rounded-full bg-red-50 px-2 py-0.5 text-xs font-medium text-red-700 border border-red-200"
1104
+ }, "Required")), /*#__PURE__*/_react["default"].createElement("div", {
1105
+ className: "flex items-center gap-2"
1106
+ }, /*#__PURE__*/_react["default"].createElement("span", {
1107
+ className: "rounded bg-gray-100 px-2 py-0.5 text-xs font-mono text-gray-600"
1108
+ }, field.name), /*#__PURE__*/_react["default"].createElement("span", {
1109
+ className: "rounded-full bg-blue-50 px-2.5 py-0.5 text-xs font-medium text-blue-700 capitalize border border-blue-200"
1110
+ }, field.type || 'text'))), field.description && /*#__PURE__*/_react["default"].createElement("p", {
1111
+ className: "mt-1.5 text-xs text-gray-500"
1112
+ }, field.description), field.type === 'radio' && Array.isArray(field.options) && field.options.length > 0 && /*#__PURE__*/_react["default"].createElement("div", {
1113
+ className: "mt-2 flex flex-wrap gap-1.5"
1114
+ }, field.options.map(function (opt, optIdx) {
1115
+ return /*#__PURE__*/_react["default"].createElement("span", {
1116
+ key: optIdx,
1117
+ className: "rounded-md bg-gray-50 border border-gray-200 px-2 py-0.5 text-xs text-gray-700"
1118
+ }, opt);
1119
+ })));
1120
+ })))), activeTab === 'responses' && /*#__PURE__*/_react["default"].createElement("div", {
1088
1121
  className: "space-y-4"
1089
1122
  }, loadingResponses ? /*#__PURE__*/_react["default"].createElement("div", {
1090
1123
  className: "flex items-center justify-center h-32"
@@ -1097,88 +1130,126 @@ var PowrFormsAdmin = function PowrFormsAdmin(_ref) {
1097
1130
  }, "Share your form to start collecting responses")) : /*#__PURE__*/_react["default"].createElement("div", {
1098
1131
  className: "space-y-4"
1099
1132
  }, formResponses.map(function (response, index) {
1133
+ var schemaFields = Array.isArray(selectedForm.fields) ? selectedForm.fields : [];
1134
+ var schemaFieldNames = new Set(schemaFields.map(function (f) {
1135
+ return f.name;
1136
+ }).filter(Boolean));
1137
+ var metaKeys = new Set(['_id', 'id', 'projectId', 'formName', 'formTitle', 'formId', 'submittedAt', 'createdAt', 'updatedAt', 'userId', 'paymentProofUrls']);
1138
+ var extraEntries = Object.entries(response || {}).filter(function (_ref9) {
1139
+ var _ref0 = _slicedToArray(_ref9, 2),
1140
+ key = _ref0[0],
1141
+ val = _ref0[1];
1142
+ return !schemaFieldNames.has(key) && !metaKeys.has(key) && val !== undefined && val !== null && String(val).trim() !== '';
1143
+ });
1144
+ var formatKeyLabel = function formatKeyLabel(key) {
1145
+ return String(key).replace(/_/g, ' ').replace(/([a-z])([A-Z])/g, '$1 $2').replace(/\b\w/g, function (c) {
1146
+ return c.toUpperCase();
1147
+ });
1148
+ };
1149
+ var isUrlValue = function isUrlValue(val) {
1150
+ return typeof val === 'string' && (val.startsWith('http://') || val.startsWith('https://'));
1151
+ };
1152
+ var isImageUrl = function isImageUrl(val) {
1153
+ return isUrlValue(val) && /\.(png|jpe?g|gif|webp|svg)(\?.*)?$/i.test(val);
1154
+ };
1155
+ var renderValueBox = function renderValueBox(val, fieldType, label) {
1156
+ if (val === undefined || val === null || String(val).trim() === '') {
1157
+ return /*#__PURE__*/_react["default"].createElement("p", {
1158
+ className: "text-sm text-gray-400 italic bg-gray-50 p-2.5 rounded border border-gray-100"
1159
+ }, "Not provided");
1160
+ }
1161
+ if (fieldType === 'photo' || isImageUrl(val)) {
1162
+ return /*#__PURE__*/_react["default"].createElement("div", {
1163
+ className: "space-y-1.5"
1164
+ }, /*#__PURE__*/_react["default"].createElement("a", {
1165
+ href: val,
1166
+ target: "_blank",
1167
+ rel: "noopener noreferrer",
1168
+ className: "inline-block"
1169
+ }, /*#__PURE__*/_react["default"].createElement("img", {
1170
+ src: val,
1171
+ alt: label,
1172
+ className: "max-h-44 rounded-lg border border-gray-200 bg-gray-50 object-contain"
1173
+ })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("a", {
1174
+ href: val,
1175
+ target: "_blank",
1176
+ rel: "noopener noreferrer",
1177
+ className: "text-xs text-blue-600 hover:text-blue-800 underline break-all"
1178
+ }, "Open image in new tab")));
1179
+ }
1180
+ if (fieldType === 'fileUploader' || isUrlValue(val)) {
1181
+ return /*#__PURE__*/_react["default"].createElement("a", {
1182
+ href: val,
1183
+ target: "_blank",
1184
+ rel: "noopener noreferrer",
1185
+ className: "inline-flex items-center gap-2 text-sm text-blue-600 hover:text-blue-800 underline bg-blue-50 border border-blue-100 px-3 py-2 rounded-md break-all"
1186
+ }, "Open uploaded file");
1187
+ }
1188
+ if (_typeof(val) === 'object') {
1189
+ return /*#__PURE__*/_react["default"].createElement("p", {
1190
+ className: "text-sm text-gray-900 bg-gray-50 p-2.5 rounded border border-gray-100 whitespace-pre-wrap break-words"
1191
+ }, Array.isArray(val) ? val.join(', ') : Object.entries(val).map(function (_ref1) {
1192
+ var _ref10 = _slicedToArray(_ref1, 2),
1193
+ k = _ref10[0],
1194
+ v = _ref10[1];
1195
+ return "".concat(k, ": ").concat(v);
1196
+ }).join('\n'));
1197
+ }
1198
+ return /*#__PURE__*/_react["default"].createElement("p", {
1199
+ className: "text-sm text-gray-900 bg-gray-50 p-2.5 rounded border border-gray-100 whitespace-pre-wrap break-words"
1200
+ }, String(val));
1201
+ };
1202
+ var respondentSubtitle = response.respondent_name || response.person_name || response.name || response.whatsapp || response.email || '';
1100
1203
  return /*#__PURE__*/_react["default"].createElement("div", {
1101
- key: index,
1102
- className: "border rounded-lg p-6 bg-white"
1204
+ key: response._id || index,
1205
+ className: "border border-gray-200 rounded-xl p-6 bg-white shadow-sm"
1103
1206
  }, /*#__PURE__*/_react["default"].createElement("div", {
1104
- className: "flex items-center justify-between mb-4"
1105
- }, /*#__PURE__*/_react["default"].createElement("h3", {
1106
- className: "text-lg font-semibold text-gray-900"
1107
- }, "Response #", index + 1), /*#__PURE__*/_react["default"].createElement("div", {
1108
- className: "text-sm text-gray-500"
1207
+ className: "flex flex-wrap items-center justify-between gap-2 mb-4 pb-3 border-b border-gray-100"
1208
+ }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("h3", {
1209
+ className: "text-base font-semibold text-gray-900"
1210
+ }, "Response #", index + 1, respondentSubtitle ? /*#__PURE__*/_react["default"].createElement("span", {
1211
+ className: "ml-2 text-sm font-normal text-gray-600"
1212
+ }, "\xB7 ", respondentSubtitle) : null)), /*#__PURE__*/_react["default"].createElement("div", {
1213
+ className: "text-xs text-gray-500"
1109
1214
  }, response.submittedAt ? new Date(response.submittedAt).toLocaleString() : 'No date')), /*#__PURE__*/_react["default"].createElement("div", {
1110
1215
  className: "grid grid-cols-1 md:grid-cols-2 gap-4"
1111
- }, response.name && /*#__PURE__*/_react["default"].createElement("div", {
1112
- className: "space-y-1"
1113
- }, /*#__PURE__*/_react["default"].createElement("label", {
1114
- className: "text-sm font-medium text-gray-700"
1115
- }, "Name"), /*#__PURE__*/_react["default"].createElement("p", {
1116
- className: "text-gray-900 bg-gray-50 p-2 rounded"
1117
- }, response.name)), response.email && /*#__PURE__*/_react["default"].createElement("div", {
1118
- className: "space-y-1"
1119
- }, /*#__PURE__*/_react["default"].createElement("label", {
1120
- className: "text-sm font-medium text-gray-700"
1121
- }, "Email"), /*#__PURE__*/_react["default"].createElement("p", {
1122
- className: "text-gray-900 bg-gray-50 p-2 rounded"
1123
- }, response.email)), response.whatsapp && /*#__PURE__*/_react["default"].createElement("div", {
1124
- className: "space-y-1"
1125
- }, /*#__PURE__*/_react["default"].createElement("label", {
1126
- className: "text-sm font-medium text-gray-700"
1127
- }, "WhatsApp"), /*#__PURE__*/_react["default"].createElement("p", {
1128
- className: "text-gray-900 bg-gray-50 p-2 rounded"
1129
- }, response.whatsapp)), response.subject && /*#__PURE__*/_react["default"].createElement("div", {
1130
- className: "space-y-1"
1131
- }, /*#__PURE__*/_react["default"].createElement("label", {
1132
- className: "text-sm font-medium text-gray-700"
1133
- }, "Subject"), /*#__PURE__*/_react["default"].createElement("p", {
1134
- className: "text-gray-900 bg-gray-50 p-2 rounded"
1135
- }, response.subject)), response.message && /*#__PURE__*/_react["default"].createElement("div", {
1136
- className: "space-y-1 md:col-span-2"
1137
- }, /*#__PURE__*/_react["default"].createElement("label", {
1138
- className: "text-sm font-medium text-gray-700"
1139
- }, "Message"), /*#__PURE__*/_react["default"].createElement("p", {
1140
- className: "text-gray-900 bg-gray-50 p-3 rounded whitespace-pre-wrap"
1141
- }, response.message)), (selectedForm.fields || []).filter(function (field) {
1142
- return field.type === 'photo' && response[field.name];
1143
- }).map(function (field) {
1216
+ }, schemaFields.map(function (field) {
1217
+ var val = response[field.name];
1218
+ var wide = field.type === 'textarea' || field.type === 'photo' || field.type === 'fileUploader' || typeof val === 'string' && val.length > 80;
1144
1219
  return /*#__PURE__*/_react["default"].createElement("div", {
1145
1220
  key: field.name,
1146
- className: "space-y-1"
1221
+ className: "space-y-1 ".concat(wide ? 'md:col-span-2' : '')
1147
1222
  }, /*#__PURE__*/_react["default"].createElement("label", {
1148
- className: "text-sm font-medium text-gray-700"
1149
- }, field.label), /*#__PURE__*/_react["default"].createElement("a", {
1150
- href: response[field.name],
1151
- target: "_blank",
1152
- rel: "noopener noreferrer",
1153
- className: "block"
1154
- }, /*#__PURE__*/_react["default"].createElement("img", {
1155
- src: response[field.name],
1156
- alt: field.label,
1157
- className: "max-h-40 rounded border border-gray-200 bg-gray-50"
1158
- })));
1159
- }), response.paymentProofUrls && response.paymentProofUrls.length > 0 && /*#__PURE__*/_react["default"].createElement("div", {
1223
+ className: "text-xs font-semibold uppercase tracking-wide text-gray-500"
1224
+ }, field.label || formatKeyLabel(field.name)), renderValueBox(val, field.type, field.label || field.name));
1225
+ }), extraEntries.map(function (_ref11) {
1226
+ var _ref12 = _slicedToArray(_ref11, 2),
1227
+ key = _ref12[0],
1228
+ val = _ref12[1];
1229
+ var wide = typeof val === 'string' && val.length > 80;
1230
+ return /*#__PURE__*/_react["default"].createElement("div", {
1231
+ key: key,
1232
+ className: "space-y-1 ".concat(wide ? 'md:col-span-2' : '')
1233
+ }, /*#__PURE__*/_react["default"].createElement("label", {
1234
+ className: "text-xs font-semibold uppercase tracking-wide text-gray-500"
1235
+ }, formatKeyLabel(key)), renderValueBox(val, 'text', formatKeyLabel(key)));
1236
+ }), Array.isArray(response.paymentProofUrls) && response.paymentProofUrls.length > 0 && !schemaFields.some(function (f) {
1237
+ return f.type === 'fileUploader' && response[f.name];
1238
+ }) && /*#__PURE__*/_react["default"].createElement("div", {
1160
1239
  className: "space-y-1 md:col-span-2"
1161
1240
  }, /*#__PURE__*/_react["default"].createElement("label", {
1162
- className: "text-sm font-medium text-gray-700"
1163
- }, "Payment Proof"), /*#__PURE__*/_react["default"].createElement("div", {
1164
- className: "space-y-2"
1241
+ className: "text-xs font-semibold uppercase tracking-wide text-gray-500"
1242
+ }, "Uploaded Files / Proofs"), /*#__PURE__*/_react["default"].createElement("div", {
1243
+ className: "flex flex-wrap gap-2"
1165
1244
  }, response.paymentProofUrls.map(function (url, urlIndex) {
1166
1245
  return /*#__PURE__*/_react["default"].createElement("a", {
1167
1246
  key: urlIndex,
1168
1247
  href: url,
1169
1248
  target: "_blank",
1170
1249
  rel: "noopener noreferrer",
1171
- className: "text-blue-600 hover:text-blue-800 underline block bg-gray-50 p-2 rounded"
1172
- }, "View Payment Proof #", urlIndex + 1);
1173
- })))), /*#__PURE__*/_react["default"].createElement("div", {
1174
- className: "mt-4 pt-4 border-t border-gray-200"
1175
- }, /*#__PURE__*/_react["default"].createElement("details", {
1176
- className: "group"
1177
- }, /*#__PURE__*/_react["default"].createElement("summary", {
1178
- className: "cursor-pointer text-sm font-medium text-gray-700 hover:text-gray-900"
1179
- }, "View Raw Data"), /*#__PURE__*/_react["default"].createElement("pre", {
1180
- className: "mt-2 text-xs bg-gray-50 p-3 rounded overflow-x-auto"
1181
- }, JSON.stringify(response, null, 2)))));
1250
+ className: "text-sm text-blue-600 hover:text-blue-800 underline bg-blue-50 border border-blue-100 px-3 py-2 rounded-md"
1251
+ }, "Open file #", urlIndex + 1);
1252
+ })))));
1182
1253
  }))))), showEditModal && /*#__PURE__*/_react["default"].createElement("div", {
1183
1254
  className: "fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-[60] p-4"
1184
1255
  }, /*#__PURE__*/_react["default"].createElement("div", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "6.15.0",
3
+ "version": "6.15.1",
4
4
  "main": "dist/index.js",
5
5
  "files": [
6
6
  "dist"