@vulcanjs/react-ui 0.6.8-alpha.1 → 0.6.8-alpha.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  export * from "./core/FormContext";
2
2
  export * from "./core/Form";
3
3
  export * from "./core/FormContainer";
4
- export type { FormInputProps } from "./typings";
4
+ export type { FormInputProps, FormOption } from "./typings";
5
5
  export * from "./utils";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../components/form/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AAErC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../components/form/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AAErC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5D,cAAc,SAAS,CAAC"}
@@ -37,6 +37,8 @@ export declare type FormOption<TField = any> = {
37
37
  label: string;
38
38
  value: TField;
39
39
  checked?: boolean;
40
+ intlId?: string;
41
+ disabled?: boolean;
40
42
  };
41
43
  export interface FormComponentInnerProps extends FormComponentProps {
42
44
  inputType: VulcanCoreInput;
@@ -1 +1 @@
1
- {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../components/form/typings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../components/form/typings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,kBAAkB,CAAC,MAAM,GAAG,GAAG,CAC9C,SAAQ,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,GAAG,CAAC;IAKd,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAEnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,KAAK,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACpD,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACtE,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;CAC7C;AAGD,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACpC;AAED,oBAAY,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEtC,oBAAY,UAAU,CAAC,MAAM,GAAG,GAAG,IAAI;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IAEd,OAAO,CAAC,EAAE,OAAO,CAAC;IAIlB,MAAM,CAAC,EAAE,MAAM,CAAC;IAIhB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAKF,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,SAAS,EAAE,eAAe,CAAC;IAM3B,UAAU,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAIlD,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,GAAG,CAAC;IAChB,cAAc,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,cAAc,EAAE,GAAG,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,eAAe,EAAE,GAAG,CAAC;IACrB,cAAc,EAAE,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC;IACZ,kBAAkB,EAAE,GAAG,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC;IACpB,eAAe,EAAE,GAAG,CAAC;IACrB,SAAS,EAAE,GAAG,CAAC;CAChB;AAKD,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,gBAAgB,CACvD,SAAQ,uBAAuB;IAU/B,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,cAAc,EAAE,GAAG,CAAC;CACrB;AACD,oBAAY,iBAAiB,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/tsup/assets/esm_shims.js","../../../node_modules/tslib/tslib.js","../index.ts","../components/core/index.ts","../components/core/LoadingButton.tsx","../components/VulcanComponents/Consumer.tsx","../components/VulcanComponents/Context.ts","../components/VulcanComponents/Dummy.tsx","../components/core/MutationButton.tsx","../../../node_modules/graphql-tag/lib/index.js","../../../node_modules/tslib/modules/index.js","../components/core/typings.ts","../components/form/index.ts","../components/form/core/FormContext.tsx","../components/form/core/Form/index.ts","../components/form/core/Form/Form.tsx","../components/form/utils/schema_utils.ts","../components/form/utils/utils.ts","../components/form/utils/path_utils.ts","../components/form/core/Form/fields.ts","../components/form/core/Form/utils.ts","../components/form/hooks/useWarnOnUnsaved/index.ts","../components/form/hooks/useWarnOnUnsaved/useWarnOnUnsaved.ts","../components/form/hooks/useBlockTransition/useBlockTransition.ts","../components/form/hooks/useBlockTransition/block.ts","../components/form/core/Form/typings.ts","../components/form/core/FormContainer.tsx","../components/form/utils/formFragments.ts","../components/VulcanCurrentUser/index.ts","../components/VulcanCurrentUser/Consumer.tsx","../components/VulcanCurrentUser/Context.ts","../components/VulcanCurrentUser/Provider.tsx","../components/form/utils/index.ts","../components/form/utils/ui_utils.ts","../components/VulcanComponents/index.ts","../components/VulcanComponents/Provider.tsx","../components/VulcanComponents/typings.ts","../components/VulcanComponents/defaultVulcanComponents/index.ts","../components/form/core/index.ts","../componentsHelpers.tsx"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __classPrivateFieldIn;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n __classPrivateFieldIn = function (state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n exporter(\"__classPrivateFieldIn\", __classPrivateFieldIn);\r\n});\r\n","export * from \"./components/core\";\nexport * from \"./components/form\";\nexport * from \"./components/VulcanComponents\";\nexport * from \"./components/VulcanCurrentUser\";\nexport * from \"./componentsHelpers\";\n","export * from \"./LoadingButton\";\nexport * from \"./MutationButton\";\n\nexport * from \"./typings\";\n","import React, { CSSProperties } from \"react\";\nimport { useVulcanComponents } from \"../VulcanComponents/Consumer\";\nimport type { ButtonProps } from \"./typings\";\nexport interface LoadingButtonProps extends ButtonProps {\n loading?: boolean;\n label?: string | React.ReactNode;\n onClick?: any;\n children?: React.ReactNode;\n className?: string;\n}\nexport const LoadingButton = ({\n loading,\n label,\n onClick,\n children,\n className = \"\",\n ...rest\n}: LoadingButtonProps & any) => {\n const Components = useVulcanComponents();\n\n const wrapperStyle: CSSProperties = {\n position: \"relative\",\n };\n\n const labelStyle = loading ? { opacity: 0.5 } : {};\n\n const loadingStyle: CSSProperties = loading\n ? {\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }\n : { display: \"none\" };\n\n return (\n <Components.Button\n className={`loading-button ${loading ? \"loading-button-loading\" : \"loading-button-notloading\"\n } ${className}`}\n onClick={onClick}\n {...rest}\n >\n <span style={wrapperStyle}>\n <span style={labelStyle}>{label || children}</span>\n <span style={loadingStyle}>\n <Components.Loading />\n </span>\n </span>\n </Components.Button>\n );\n};\n","import { deprecate } from \"@vulcanjs/utils\";\nimport React, { useContext, useEffect } from \"react\";\nimport { VulcanComponentsContext } from \"./Context\";\n\nexport const VulcanComponentsConsumer = VulcanComponentsContext.Consumer;\n\nexport const useVulcanComponents = () => {\n const val = useContext(VulcanComponentsContext);\n return val;\n};\n\nexport const withVulcanComponents = (C) => (props) => {\n const vulcanComponents = useVulcanComponents();\n deprecate(\n \"0.0.0\",\n \"Using withVulcanComponents HOC => prefer useVulcanComponents with hooks\"\n );\n return <C vulcanComponents={vulcanComponents} {...props} />;\n};\n","import React from \"react\";\nimport type { PossibleVulcanComponents } from \"./typings\";\nimport { Dummy } from \"./Dummy\";\n\nconst dummyHandler = {\n get(target, property) {\n //console.log(\"target\", property);\n if (property in target) {\n return target[property];\n }\n console.log(\n `Property ${property} not in possible Vulcan components, returning Dummy`\n );\n return Dummy;\n },\n};\n// We need this to shut TypeScript up\n// You should use the Provider to get the right default values\nexport const VulcanComponentsContext =\n React.createContext<PossibleVulcanComponents>(\n // @ts-ignore\n new Proxy(\n {\n __not_initialized: true,\n },\n dummyHandler\n )\n );\n\n// Needed to guarantee that the exports stays named\nVulcanComponentsContext.displayName = \"VulcanComponentsContext\";\n","import React from \"react\";\nexport interface DummyProps { }\n\nexport const Dummy = () => (\n <span>\n You have not setup VulcanComponentsProvider. Please add following code in\n your app:{\" \"}\n <code>{`import { VulcanComponentsProvider } from \"@vulcanjs/react-ui\"; const YourApp = <VulcanComponentsProvider>{/* your app */}</VulcanComponentsProvider>;}`}</code>\n </span>\n);\n","/*\n\nExample Usage\n\n<Components.MutationButton\n label=\"Cancel Subscription\"\n variant=\"primary\"\n mutationOptions={{\n name: 'cancelSubscription',\n args: { bookingId: 'String' },\n fragmentName: 'BookingsStripeDataFragment',\n }}\n mutationArguments={{ bookingId: booking._id }}\n submitCallback={() => {}}\n successCallback={result => { console.log(result) }}\n/>\n\n*/\nimport React, { useState } from \"react\";\nimport { DocumentNode } from \"graphql\";\nimport { MutationHookOptions, useMutation } from \"@apollo/client\";\nimport gql from \"graphql-tag\";\nimport { useVulcanComponents } from \"../VulcanComponents/Consumer\";\nimport { LoadingButtonProps } from \"./LoadingButton\";\n// import withMutation from '../containers/registeredMutation';\n\n// TODO:\n/**\n * Difference with Vulcan Meteor: there is no\n * registered mutation anymore,\n * so you need to pass your mutations explicitely, using graphql\n */\n/*\nexport class MutationButton extends PureComponent {\n constructor(props) {\n super(props);\n this.button = withMutation(props.mutationOptions)(MutationButtonInner);\n }\n\n render() {\n const Component = this.button;\n return <Component {...this.props} />;\n }\n}*/\n\nexport interface MutationButtonProps {\n /**\n * NOTE: in Vulcan Meteor you had to write:\n * mutationOptions: { name: \"foobar\", mutationOptions: {refetchQueries:[\"hello\"]}}\n *\n * In Vulcan Next, you can only pass the \"mutationOptions\" object:\n * mutationOptions: { refetchQueries:[\"hello\"]}\n * and the mutation is provided via the new \"mutation\" prop\n */\n mutationOptions?: MutationHookOptions;\n /**\n * @example\n mutation: gql`\n mutation sampleMutation($input: Input) {\n hello\n }\n `,\n */\n mutation: string | DocumentNode;\n /** Variables passed to the mutation (NOTE: we can't pass other options at the moment) */\n mutationArguments?: MutationHookOptions<any>[\"variables\"];\n /** Callback run before submitting. Can optionnaly return mutationArguments that will override current ones. */\n submitCallback?: (\n mutationArgumentsFromProps: MutationHookOptions<any>[\"variables\"]\n ) =>\n | void\n | { mutationArguments: MutationHookOptions<any>[\"variables\"] }\n | Promise<void | {\n mutationArguments: MutationHookOptions<any>[\"variables\"];\n }>;\n successCallback?: (res: any) => void | Promise<void>;\n errorCallback?: (err: any) => void | Promise<void>;\n /** Now isolated into their own object to avoid needed to explicitely pick/omit */\n loadingButtonProps?: LoadingButtonProps;\n /** Shortcut for loadingButtonProps.label */\n label?: string | React.ReactNode;\n}\nexport const MutationButton = (props: MutationButtonProps) => {\n const Components = useVulcanComponents();\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<any | undefined>();\n\n const {\n //mutationOptions,\n mutation,\n loadingButtonProps = {},\n label,\n } = props;\n let { mutationArguments } = props;\n const mutationAsNode =\n typeof mutation === \"string\"\n ? gql`\n ${mutation}\n `\n : mutation;\n const [mutationFunc] = useMutation(mutationAsNode);\n\n const handleClick = async (e) => {\n e.preventDefault();\n setLoading(true);\n setError(undefined);\n const {\n //mutationOptions,\n submitCallback,\n successCallback,\n errorCallback,\n } = props;\n //const mutationName = mutationOptions.name;\n //const mutation = this.props[mutationName];\n\n try {\n if (submitCallback) {\n const callbackReturn = await submitCallback(mutationArguments);\n if (callbackReturn && callbackReturn.mutationArguments) {\n mutationArguments = callbackReturn.mutationArguments;\n }\n }\n const result = await mutationFunc({ variables: mutationArguments });\n if (successCallback) {\n await successCallback(result);\n }\n } catch (error) {\n // TODO: may not work because the mutationFunc may not throw in case of error\n setError(error);\n if (errorCallback) {\n await errorCallback(error);\n }\n } finally {\n setLoading(false);\n }\n\n // mutation(mutationArguments)\n // .then(result => {\n // this.setState({ loading: false });\n // if (successCallback) {\n // successCallback(result);\n // }\n // })\n // .catch(error => {\n // this.setState({ loading: false });\n // if (errorCallback) {\n // errorCallback(error);\n // }\n // });\n };\n\n //const mutationName = this.props.mutationOptions.name;\n\n const loadingButton = (\n <Components.LoadingButton\n loading={loading}\n onClick={handleClick}\n label={label}\n {...loadingButtonProps}\n />\n );\n\n if (error) {\n return (\n <Components.TooltipTrigger trigger={loadingButton} defaultShow={true}>\n {error.message.replace(\"GraphQL error: \", \"\")}\n </Components.TooltipTrigger>\n );\n }\n return loadingButton;\n};\n","import { __assign } from \"tslib\";\nimport { parse } from 'graphql';\nvar docCache = new Map();\nvar fragmentSourceMap = new Map();\nvar printFragmentWarnings = true;\nvar experimentalFragmentVariables = false;\nfunction normalize(string) {\n return string.replace(/[\\s,]+/g, ' ').trim();\n}\nfunction cacheKeyFromLoc(loc) {\n return normalize(loc.source.body.substring(loc.start, loc.end));\n}\nfunction processFragments(ast) {\n var seenKeys = new Set();\n var definitions = [];\n ast.definitions.forEach(function (fragmentDefinition) {\n if (fragmentDefinition.kind === 'FragmentDefinition') {\n var fragmentName = fragmentDefinition.name.value;\n var sourceKey = cacheKeyFromLoc(fragmentDefinition.loc);\n var sourceKeySet = fragmentSourceMap.get(fragmentName);\n if (sourceKeySet && !sourceKeySet.has(sourceKey)) {\n if (printFragmentWarnings) {\n console.warn(\"Warning: fragment with name \" + fragmentName + \" already exists.\\n\"\n + \"graphql-tag enforces all fragment names across your application to be unique; read more about\\n\"\n + \"this in the docs: http://dev.apollodata.com/core/fragments.html#unique-names\");\n }\n }\n else if (!sourceKeySet) {\n fragmentSourceMap.set(fragmentName, sourceKeySet = new Set);\n }\n sourceKeySet.add(sourceKey);\n if (!seenKeys.has(sourceKey)) {\n seenKeys.add(sourceKey);\n definitions.push(fragmentDefinition);\n }\n }\n else {\n definitions.push(fragmentDefinition);\n }\n });\n return __assign(__assign({}, ast), { definitions: definitions });\n}\nfunction stripLoc(doc) {\n var workSet = new Set(doc.definitions);\n workSet.forEach(function (node) {\n if (node.loc)\n delete node.loc;\n Object.keys(node).forEach(function (key) {\n var value = node[key];\n if (value && typeof value === 'object') {\n workSet.add(value);\n }\n });\n });\n var loc = doc.loc;\n if (loc) {\n delete loc.startToken;\n delete loc.endToken;\n }\n return doc;\n}\nfunction parseDocument(source) {\n var cacheKey = normalize(source);\n if (!docCache.has(cacheKey)) {\n var parsed = parse(source, {\n experimentalFragmentVariables: experimentalFragmentVariables,\n allowLegacyFragmentVariables: experimentalFragmentVariables\n });\n if (!parsed || parsed.kind !== 'Document') {\n throw new Error('Not a valid GraphQL document.');\n }\n docCache.set(cacheKey, stripLoc(processFragments(parsed)));\n }\n return docCache.get(cacheKey);\n}\nexport function gql(literals) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (typeof literals === 'string') {\n literals = [literals];\n }\n var result = literals[0];\n args.forEach(function (arg, i) {\n if (arg && arg.kind === 'Document') {\n result += arg.loc.source.body;\n }\n else {\n result += arg;\n }\n result += literals[i + 1];\n });\n return parseDocument(result);\n}\nexport function resetCaches() {\n docCache.clear();\n fragmentSourceMap.clear();\n}\nexport function disableFragmentWarnings() {\n printFragmentWarnings = false;\n}\nexport function enableExperimentalFragmentVariables() {\n experimentalFragmentVariables = true;\n}\nexport function disableExperimentalFragmentVariables() {\n experimentalFragmentVariables = false;\n}\nvar extras = {\n gql: gql,\n resetCaches: resetCaches,\n disableFragmentWarnings: disableFragmentWarnings,\n enableExperimentalFragmentVariables: enableExperimentalFragmentVariables,\n disableExperimentalFragmentVariables: disableExperimentalFragmentVariables\n};\n(function (gql_1) {\n gql_1.gql = extras.gql, gql_1.resetCaches = extras.resetCaches, gql_1.disableFragmentWarnings = extras.disableFragmentWarnings, gql_1.enableExperimentalFragmentVariables = extras.enableExperimentalFragmentVariables, gql_1.disableExperimentalFragmentVariables = extras.disableExperimentalFragmentVariables;\n})(gql || (gql = {}));\ngql[\"default\"] = gql;\nexport default gql;\n//# sourceMappingURL=index.js.map","import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n __classPrivateFieldIn,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n __classPrivateFieldIn,\r\n};\r\n","// @see https://stackoverflow.com/questions/51835611/specify-specific-props-and-accept-general-html-props-in-typescript-react-app\nexport type ButtonProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> &\n // The any is important here: we allow end-application to \"hack\" the component with a custom replacement implementation,\n // so we authorize them to pass additionnal unknown props\n any;\n","export * from \"./core/FormContext\";\nexport * from \"./core/Form\";\nexport * from \"./core/FormContainer\";\n\nexport type { FormInputProps } from \"./typings\";\n\nexport * from \"./utils\";\n","import React, { useContext } from \"react\";\n\ninterface FormContextValue {\n addToDeletedValues: Function;\n addToFailureForm: Function;\n addToSubmitForm: Function;\n addToSuccessForm: Function;\n clearForm: Function;\n clearFormCallbacks: Function;\n clearFieldErrors: Function;\n currentValues: object;\n deletedValues: Array<any>;\n errors: Array<any>;\n getDocument: Function;\n getLabel: (fieldName: string, fieldLocale?: string) => string;\n initialDocument: object;\n isChanged: boolean;\n refetchForm: Function;\n // TODO: we deprecate this, it doesn't make sense to allow a child to setState this way\n // setFormState: Function;\n // FIXME: this type doesn't work, it doesn't necessarily have the event + it has to be defined\n submitForm: Function; //React.HTMLAttributes<HTMLFormElement>[\"onSubmit\"];\n throwError: Function;\n updateCurrentValues: Function;\n}\n\nexport const FormContext =\n React.createContext<FormContextValue | undefined>(undefined);\n\nexport const useFormContext = () => {\n const formContext = useContext(FormContext);\n if (!formContext)\n throw new Error(\n `A component is trying to access form context but it is undefined. Please wrap your component with a <Form>.\n You may be importing \"FormContext\" from different packages or have accidentaly made a copy of it?\n FormContext is exposed by \"@vulcanjs/react-ui\".`\n );\n return formContext;\n};\n","export * from \"./Form\";\nexport * from \"./typings\";\n","/*\n\nMain form component.\n\nThis component expects:\n\n### All Forms:\n\n- collection\n- currentUser\n- client (Apollo client)\n\n*/\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { runCallbacks, getErrors } from \"@vulcanjs/core\";\nimport { useIntlContext } from \"@vulcanjs/react-i18n\";\nimport { removeProperty } from \"@vulcanjs/utils\";\nimport _filter from \"lodash/filter.js\";\nimport cloneDeep from \"lodash/cloneDeep.js\";\nimport compact from \"lodash/compact.js\";\nimport get from \"lodash/get.js\";\nimport isObject from \"lodash/isObject.js\";\nimport mapValues from \"lodash/mapValues.js\";\nimport merge from \"lodash/merge.js\";\nimport omit from \"lodash/omit.js\";\nimport omitBy from \"lodash/omitBy.js\";\nimport pick from \"lodash/pick.js\";\nimport pickBy from \"lodash/pickBy.js\";\nimport set from \"lodash/set.js\";\nimport unset from \"lodash/unset.js\";\nimport update from \"lodash/update.js\";\nimport without from \"lodash/without.js\";\nimport isEmpty from \"lodash/isEmpty.js\";\n//import type { FormLayoutProps } from \"../../elements/FormLayout\";\n//import type { FormSubmitProps } from \"../../elements/FormSubmit\";\n\nimport {\n convertSchema,\n getEditableFields,\n getInsertableFields,\n} from \"../../utils/schema_utils\";\nimport { isEmptyValue } from \"../../utils/utils\";\nimport { getParentPath } from \"../../utils/path_utils\";\n// import withCollectionProps from \"./withCollectionProps\";\nimport { FormContext } from \"../FormContext\";\nimport { getFieldGroups, getFieldNames, getLabel } from \"./fields\";\nimport { isNotSameDocument } from \"./utils\";\nimport { useWarnOnUnsaved } from \"../../hooks/useWarnOnUnsaved\";\n\nimport type { FormType } from \"../../typings\";\nimport {\n CreateDocumentResult,\n FormProps,\n FormState,\n UpdateDocumentResult,\n} from \"./typings\";\nimport { MutationResult } from \"@apollo/client\";\nimport { useVulcanComponents } from \"../../../VulcanComponents/Consumer\";\n\n// props that should trigger a form reset\nconst RESET_PROPS = [\n \"model\",\n // \"collection\",\n // \"collectionName\",\n \"document\",\n \"schema\",\n \"currentUser\",\n \"fields\",\n \"removeFields\",\n \"prefilledProps\", // TODO: prefilledProps should be merged instead?\n];\n\nconst compactParent = (object, path) => {\n const parentPath = getParentPath(path);\n\n // note: we only want to compact arrays, not objects\n const compactIfArray = (x) => (Array.isArray(x) ? compact(x) : x);\n\n update(object, parentPath, compactIfArray);\n};\n\nconst getDefaultValues = (convertedSchema) => {\n // TODO: make this work with nested schemas, too\n return pickBy(\n mapValues(convertedSchema, (field) => field.defaultValue),\n (value) => value\n );\n};\n\nconst compactObject = (o) => omitBy(o, (f) => f === null || f === undefined);\n\nconst getInitialStateFromProps = (nextProps: FormProps): FormState => {\n const schema = nextProps.schema || nextProps.model.schema;\n const convertedSchema = convertSchema(schema);\n const formType: FormType = nextProps.document ? \"edit\" : \"new\";\n // for new document forms, add default values to initial document\n const defaultValues =\n formType === \"new\" ? getDefaultValues(convertedSchema) : {};\n // note: we remove null/undefined values from the loaded document so they don't overwrite possible prefilledProps\n const initialDocument = merge(\n {},\n defaultValues,\n nextProps.prefilledProps,\n compactObject(nextProps.document)\n );\n\n //if minCount is specified, go ahead and create empty nested documents\n Object.keys(convertedSchema).forEach((key) => {\n let minCount = convertedSchema[key].minCount;\n if (minCount) {\n initialDocument[key] = initialDocument[key] || [];\n while (initialDocument[key].length < minCount)\n initialDocument[key].push({});\n }\n });\n\n // remove all instances of the `__typename` property from document\n removeProperty(initialDocument, \"__typename\");\n\n return {\n disabled: nextProps.disabled,\n errors: [],\n deletedValues: [],\n currentValues: {},\n originalSchema: convertSchema(schema, { removeArrays: false }),\n // convert SimpleSchema schema into JSON object\n schema: convertedSchema,\n // Also store all field schemas (including nested schemas) in a flat structure\n flatSchema: convertSchema(schema, { flatten: true }),\n // the initial document passed as props\n initialDocument,\n // initialize the current document to be the same as the initial document\n currentDocument: initialDocument,\n };\n};\n\nconst getChildrenProps = (\n props: FormProps,\n state: Pick<FormState, \"disabled\" | \"currentDocument\">,\n options: { formType: FormType },\n // TODO: that belongs to the context instead\n callbacks: { deleteDocument: Function }\n): {\n formLayoutProps: any;//FormLayoutProps;\n formGroupProps: Function;\n commonProps: any;\n formSubmitProps: any;// FormSubmitProps;\n} => {\n const {\n currentUser,\n repeatErrors,\n submitLabel,\n cancelLabel,\n revertLabel,\n cancelCallback,\n revertCallback,\n id,\n model,\n prefilledProps,\n itemProperties,\n contextName,\n showRemove,\n showDelete,\n } = props;\n const { disabled, currentDocument } = state;\n const { formType } = options;\n const { deleteDocument } = callbacks;\n const commonProps = {\n document: currentDocument,\n formType,\n currentUser,\n disabled,\n prefilledProps,\n itemProperties,\n contextName,\n };\n\n const docClassName = `document-${formType}`;\n const modelName = model.name.toLowerCase();\n const formProps = {\n className: `${docClassName} ${docClassName}-${modelName}`,\n id: id,\n // It's the form element responsibility to get submitForm from context\n // onSubmit: this.submitForm(formType),\n // TODO: update to useRef\n //ref: (e) => {\n // this.form = e;\n //},\n };\n\n const formGroupProps = (group) => ({\n key: group.name,\n ...group,\n group: omit(group, [\"fields\"]),\n ...commonProps,\n });\n\n const formSubmitProps = {\n model,\n currentUser,\n submitLabel,\n cancelLabel,\n revertLabel,\n cancelCallback,\n revertCallback,\n document: currentDocument,\n // TODO: should probably be passed through context\n deleteDocument:\n (formType === \"edit\" && showRemove && showDelete && deleteDocument) ||\n null,\n };\n\n const formLayoutProps = {\n formProps: formProps,\n repeatErrors: repeatErrors,\n submitProps: formSubmitProps,\n commonProps,\n };\n return {\n commonProps,\n formSubmitProps,\n formGroupProps,\n formLayoutProps,\n };\n};\n\n// component form until we go stateless\nconst FormWarnUnsaved = ({\n isChanged,\n warnUnsavedChanges,\n children,\n}: {\n isChanged: boolean;\n warnUnsavedChanges?: boolean;\n children: React.ReactNode;\n}) => {\n useWarnOnUnsaved({\n isChanged,\n warnUnsavedChanges,\n });\n return <>{children}</>;\n};\n\n/*\n\n Like getDocument, but cross-reference with getFieldNames()\n to only return fields that actually need to be submitted\n\n Also remove any deleted values.\n\n */\nconst getData = (\n customArgs,\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"deletedValues\">,\n // previously from \"this\" object\n { submitFormCallbacks, form }: any\n) => {\n const { currentDocument } = state;\n const { model, prefilledProps } = props;\n // we want to keep prefilled data even for hidden/removed fields\n let data = prefilledProps || {};\n\n // omit prefilled props for nested fields\n data = omitBy(data, (value, key) => key.endsWith(\".$\"));\n\n const args = {\n schema: model.schema,\n excludeRemovedFields: false,\n excludeHiddenFields: false,\n replaceIntlFields: true,\n addExtraFields: false,\n ...customArgs,\n };\n\n // only keep relevant fields\n // for intl fields, make sure we look in foo_intl and not foo\n const fields = getFieldNames(props, currentDocument, args);\n data = { ...data, ...pick(currentDocument, ...fields) };\n\n // compact deleted values\n state.deletedValues.forEach((path) => {\n if (path.includes(\".\")) {\n /*\n\n If deleted field is a nested field, nested array, or nested array item, try to compact its parent array\n\n - Nested field: 'address.city'\n - Nested array: 'addresses.1'\n - Nested array item: 'addresses.1.city'\n\n */\n compactParent(data, path);\n }\n });\n\n // run data object through submitForm callbacks\n data = runCallbacks({\n callbacks: submitFormCallbacks,\n iterator: data,\n args: [\n {\n /*form: this*/\n },\n ],\n });\n\n return data;\n};\n\nexport const Form = (props: FormProps) => {\n const { initCallback, createDocument, updateDocument, deleteDocument } =\n props;\n const initialState = getInitialStateFromProps(props);\n const { schema, originalSchema, flatSchema, initialDocument } = initialState;\n const isFirstRender = useRef(true);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false; // toggle flag after first render/mounting\n return;\n }\n if (initCallback) initCallback(initialState.currentDocument);\n }, [initCallback]);\n const defaultProps = {\n layout: \"horizontal\",\n prefilledProps: {},\n repeatErrors: false,\n showRemove: true,\n showDelete: true,\n };\n const allProps = { ...defaultProps, ...props };\n const defaultValues = {};\n const submitFormCallbacks: Array<Function> = [];\n const successFormCallbacks: Array<Function> = [];\n const failureFormCallbacks: Array<Function> = [];\n const intl = useIntlContext();\n\n // --------------------------------------------------------------------- //\n // ------------------------------- Errors ------------------------------ //\n // --------------------------------------------------------------------- //\n\n /*\n\n Add error to form state\n\n Errors can have the following properties:\n - id: used as an internationalization key, for example `errors.required`\n - path: for field-specific errors, the path of the field with the issue\n - properties: additional data. Will be passed to vulcan-i18n as values\n - message: if id cannot be used as i81n key, message will be used\n\n */\n const [errors, setErrors] = useState<Array<any>>([]);\n const throwError = (error) => {\n let formErrors = getErrors(error);\n\n // eslint-disable-next-line no-console\n console.log(formErrors);\n\n // add error(s) to state\n setErrors((prevErrors) => [...prevErrors, ...formErrors]);\n };\n\n /*\n\n Clear errors for a field\n\n */\n const clearFieldErrors = (path) => {\n setErrors((prevErrors) =>\n prevErrors.filter((error) => error.path !== path)\n );\n };\n\n // --------------------------------------------------------------------- //\n // ------------------------------- Context ----------------------------- //\n // --------------------------------------------------------------------- //\n\n const [deletedValues, setDeletedValues] = useState<Array<any>>([]);\n\n // add something to deleted values\n const addToDeletedValues = (name) => {\n setDeletedValues((prevDeletedValues) => [...prevDeletedValues, name]);\n };\n\n interface Callbacks {\n submitFormCallbacks: Array<any>;\n successFormCallbacks: Array<any>;\n failureFormCallbacks: Array<any>;\n }\n const [callbacks, setCallbacks] = useState<Callbacks>({\n submitFormCallbacks: [],\n successFormCallbacks: [],\n failureFormCallbacks: [],\n });\n // add a callback to the form submission\n const addToSubmitForm = (callback) => {\n setCallbacks((cbs) => ({\n ...cbs,\n // submitFormCallbacks: [...cbs.submitFormCallbacks, callback],\n }));\n };\n\n // add a callback to form submission success\n const addToSuccessForm = (callback) => {\n setCallbacks((cbs) => ({\n ...cbs,\n successFormCallbacks: [...cbs.successFormCallbacks, callback],\n }));\n };\n\n // add a callback to form submission failure\n const addToFailureForm = (callback) => {\n setCallbacks((cbs) => ({\n ...cbs,\n failureFormCallbacks: [...cbs.failureFormCallbacks, callback],\n }));\n };\n\n const clearFormCallbacks = () => {\n setCallbacks({\n submitFormCallbacks: [],\n successFormCallbacks: [],\n failureFormCallbacks: [],\n });\n };\n\n /*\n setFormState = (fn) => {\n this.setState(fn);\n };\n */\n\n const [currentValues, setCurrentValues] = useState<Object>({});\n\n const submitFormContext = (formType: FormType) => (event /*newValues*/) => {\n /*\n TODO: previously this callback was updating the current values with new values after this call\n Need to check how this worked in Vulcan initially\n setCurrentValues((prevCurrentValues) => ({\n ...prevCurrentValues,\n ...newValues,\n }));\n */\n // TODO: previously, this was using a callback from setCurrentValues\n // this needs to be rearchitectured to work without, will need some check\n // https://stackoverflow.com/questions/56247433/how-to-use-setstate-callback-on-react-hooks\n submitForm(formType)(event);\n };\n\n // --------------------------------------------------------------------- //\n // ------------------------------ Lifecycle ---------------------------- //\n // --------------------------------------------------------------------- //\n\n /*\n\n When props change, reinitialize the form state\n Triggered only for data related props (collection, document, currentUser etc.)\n\n @see https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html\n\n */\n /*\n UNSAFE_componentWillReceiveProps(nextProps) {\n const needReset = !!RESET_PROPS.find(\n (prop) => !isEqual(this.props[prop], nextProps[prop])\n );\n if (needReset) {\n const newState = getInitialStateFromProps(nextProps);\n this.setState(newState);\n if (nextProps.initCallback)\n nextProps.initCallback(newState.currentDocument);\n }\n }*/\n\n const [currentDocument, setCurrentDocument] = useState<{\n title?: string;\n _id?: string;\n name?: string;\n }>(initialDocument);\n\n /*\n\n Manually update the current values of one or more fields(i.e. on change or blur).\n\n */\n const updateCurrentValues = (newValues, options: { mode?: string } = {}) => {\n // default to overwriting old value with new\n const { mode = \"overwrite\" } = options;\n const { changeCallback } = props;\n\n // keep the previous ones and extend (with possible replacement) with new ones\n // keep only the relevant properties\n const newState = {\n currentValues: cloneDeep(currentValues),\n currentDocument: cloneDeep(currentDocument),\n deletedValues: cloneDeep(deletedValues),\n };\n\n Object.keys(newValues).forEach((key) => {\n const path = key;\n let value = newValues[key];\n\n if (isEmptyValue(value)) {\n // delete value\n unset(newState.currentValues, path);\n set(newState.currentDocument, path, null);\n newState.deletedValues = [...newState.deletedValues, path];\n } else {\n // 1. update currentValues\n set(newState.currentValues, path, value);\n\n // 2. update currentDocument\n // For arrays and objects, give option to merge instead of overwrite\n if (mode === \"merge\" && (Array.isArray(value) || isObject(value))) {\n const oldValue = get(newState.currentDocument, path);\n set(newState.currentDocument, path, merge(oldValue, value));\n } else {\n set(newState.currentDocument, path, value);\n }\n\n // 3. in case value had previously been deleted, \"undelete\" it\n newState.deletedValues = without(newState.deletedValues, path);\n }\n });\n if (changeCallback) changeCallback(newState.currentDocument);\n\n // TODO: prefer a reducer\n setCurrentValues(newState.currentValues);\n setCurrentDocument(newState.currentDocument);\n setDeletedValues(newState.deletedValues);\n };\n\n /*\n\n Refetch the document from the database (in case it was updated by another process or to reset the form)\n\n */\n const refetchForm = () => {\n if (props.refetch) {\n props.refetch();\n }\n };\n\n const [disabled, setDisabled] = useState<boolean>(false); // TODO\n const [success, setSuccess] = useState<boolean>(false); // TODO\n /**\n * Clears form errors and values.\n *\n * @example Clear form\n * // form will be fully emptied, with exception of prefilled values\n * clearForm({ document: {} });\n *\n * @example Reset/revert form\n * // form will be reverted to its initial state\n * clearForm();\n *\n * @example Clear with new values\n * // form will be cleared but initialized with the new document\n * const document = {\n * // ... some values\n * };\n * clearForm({ document });\n *\n * @param {Object=} options\n * @param {Object=} options.document\n * Document to use as new initial document when values are cleared instead of\n * the existing one. Note that prefilled props will be merged\n */\n const clearForm = (options: { document?: any } = {}) => {\n const { document: optionsDocument } = options;\n const document = optionsDocument\n ? merge({}, props.prefilledProps, optionsDocument)\n : null;\n // TODO: prefer a reducer\n setErrors([]);\n setCurrentValues({});\n setDeletedValues([]);\n setCurrentDocument(document || initialDocument);\n // setInitialDocument(document || initialDocument);\n setDisabled(false);\n };\n\n const newMutationSuccessCallback = function <TModel = Object>(\n result: CreateDocumentResult<TModel>\n ) {\n mutationSuccessCallback(result, \"new\");\n };\n\n const editMutationSuccessCallback = function <TModel = Object>(\n result: UpdateDocumentResult<TModel>\n ) {\n mutationSuccessCallback(result, \"edit\");\n };\n\n const formRef = useRef(null);\n const mutationSuccessCallback = function <TModel = Object>(\n // must be called only on valid results\n result: CreateDocumentResult<TModel>,\n mutationType: FormType\n ) {\n // TODO: use a reducer\n setDisabled(false);\n setSuccess(true);\n // for new mutation, run refetch function if it exists\n // TODO: the create mutation should already return the freshest value, do we really need that?\n // instead we might want to update currentResult with the result of the creation\n if (mutationType === \"new\") refetchForm();\n let { document } = result;\n\n // call the clear form method (i.e. trigger setState) only if the form has not been unmounted\n // (we are in an async callback, everything can happen!)\n // TODO: this should rely on a ref\n if (formRef.current) {\n clearForm({\n document: mutationType === \"edit\" ? document : undefined,\n });\n }\n\n // run document through mutation success callbacks\n document = runCallbacks({\n callbacks: successFormCallbacks,\n iterator: document,\n args: [{ form: formRef.current }],\n });\n\n // run success callback if it exists\n if (props.successCallback) props.successCallback(document, { form: this });\n };\n\n // catch graphql errors\n const mutationErrorCallback = (document, error) => {\n setDisabled(false);\n\n // eslint-disable-next-line no-console\n console.error(\"// graphQL Error\");\n // eslint-disable-next-line no-console\n console.error(error);\n\n // run mutation failure callbacks on error, we do not allow the callbacks to change the error\n runCallbacks({\n callbacks: failureFormCallbacks,\n iterator: error,\n args: [{ error, form: formRef.current }],\n });\n\n if (!isEmpty(error)) {\n // add error to state\n throwError(error);\n }\n\n // run error callback if it exists\n if (props.errorCallback)\n props.errorCallback(document, error, { form: this });\n\n // scroll back up to show error messages\n // TODO: migrate this to scroll on top of the form\n //Utils.scrollIntoView(\".flash-message\");\n };\n\n /*\n\n Submit form handler\n\n */\n const submitForm = (formType: FormType) => async (event?: Event) => {\n event && event.preventDefault();\n event && event.stopPropagation();\n\n const { contextName } = props;\n\n // if form is disabled (there is already a submit handler running) don't do anything\n if (disabled) {\n return;\n }\n\n // clear errors and disable form while it's submitting\n setErrors([]);\n setDisabled(true);\n\n // complete the data with values from custom components\n // note: it follows the same logic as SmartForm's getDocument method\n let data = getData(\n { replaceIntlFields: true, addExtraFields: false, mutableFields },\n props,\n {\n currentDocument,\n deletedValues,\n },\n { form: formRef.current, submitFormCallbacks }\n );\n\n // if there's a submit callback, run it\n if (props.submitCallback) {\n data = props.submitCallback(data) || data;\n }\n\n if (formType === \"new\") {\n // create document form\n try {\n const result = await createDocument({\n input: {\n data,\n contextName,\n },\n });\n if (result.errors?.length) {\n // TODO: previously got from meta, we could have more than 1 error\n mutationErrorCallback(document, result.errors[0]);\n } else {\n newMutationSuccessCallback(result);\n }\n } catch (error) {\n mutationErrorCallback(document, error);\n }\n } else {\n // update document form\n try {\n const documentId = currentDocument._id;\n const result = await updateDocument({\n input: {\n id: documentId,\n data,\n contextName,\n },\n });\n // TODO: handle more than 1 error\n if (result.errors?.length) {\n mutationErrorCallback(document, result.errors[0]);\n } else {\n editMutationSuccessCallback(result);\n }\n } catch (error) {\n mutationErrorCallback(document, error);\n }\n }\n };\n\n /*\n\n Delete document handler\n\n */\n const deleteDocumentWithConfirm = () => {\n const document = currentDocument;\n const documentId = props.document._id;\n const documentTitle = document.title || document.name || \"\";\n\n const deleteDocumentConfirm = intl.formatMessage(\n { id: \"forms.delete_confirm\" },\n { title: documentTitle }\n );\n\n if (window.confirm(deleteDocumentConfirm)) {\n deleteDocument({ input: { id: documentId } })\n .then((mutationResult) => {\n // the mutation result looks like {data:{collectionRemove: null}} if succeeded\n if (props.removeSuccessCallback)\n props.removeSuccessCallback({ documentId, documentTitle });\n refetchForm();\n })\n .catch((error) => {\n // eslint-disable-next-line no-console\n console.log(error);\n });\n }\n };\n\n // --------------------------------------------------------------------- //\n // ------------------------- Props to Pass ----------------------------- //\n // --------------------------------------------------------------------- //\n\n // --------------------------------------------------------------------- //\n // ----------------------------- Render -------------------------------- //\n // --------------------------------------------------------------------- //\n\n const { successComponent, document, currentUser, model, warnUnsavedChanges } =\n props;\n const FormComponents = useVulcanComponents();\n\n const formType: \"edit\" | \"new\" = document ? \"edit\" : \"new\";\n\n // Fields computation\n const mutableFields =\n formType === \"edit\"\n ? getEditableFields(schema, currentUser, initialDocument)\n : getInsertableFields(schema, currentUser);\n\n const { formLayoutProps, formGroupProps } = getChildrenProps(\n props,\n { disabled, currentDocument },\n {\n formType,\n },\n {\n deleteDocument: deleteDocumentWithConfirm,\n }\n );\n const isChanged = isNotSameDocument(initialDocument, currentDocument);\n\n return success && successComponent ? (\n successComponent\n ) : (\n <FormWarnUnsaved\n isChanged={isChanged}\n warnUnsavedChanges={warnUnsavedChanges}\n >\n <FormContext.Provider\n value={{\n throwError,\n clearForm,\n refetchForm,\n isChanged,\n submitForm: submitFormContext(formType), //Change in name because we already have a function\n // called submitForm, but no reason for the user to know\n // about that\n addToDeletedValues: addToDeletedValues,\n updateCurrentValues: updateCurrentValues,\n getDocument: () => currentDocument,\n getLabel: (fieldName, fieldLocale) =>\n getLabel(model, flatSchema, intl, fieldName, fieldLocale),\n initialDocument: initialDocument,\n // TODO BAD: check where used\n //setFormState: this.setFormState,\n addToSubmitForm,\n addToSuccessForm,\n addToFailureForm,\n clearFormCallbacks,\n errors,\n currentValues,\n deletedValues,\n clearFieldErrors,\n }}\n >\n <FormComponents.FormLayout {...formLayoutProps}>\n {getFieldGroups(\n props,\n {\n currentDocument,\n schema,\n flatSchema,\n originalSchema,\n },\n intl,\n mutableFields,\n intl.formatMessage\n ).map((group, i) => (\n <FormComponents.FormGroup key={i} {...formGroupProps(group)} />\n ))}\n </FormComponents.FormLayout>\n </FormContext.Provider>\n </FormWarnUnsaved>\n );\n};\n\n// Mutation that yield a success result\ntype SuccessfulMutationResult<TData = Object> = MutationResult<TData> & {\n data: TData;\n};\n/**\n * Typeguared to allow considering the request as successful\n */\nconst isSuccessful = function <T = any>(\n result: MutationResult<T> | undefined\n): result is SuccessfulMutationResult<T> {\n return !!result?.data;\n};\n\nexport default Form;\n","/*\n * Schema converter/getters\n */\nimport { canCreateField, canUpdateField } from \"@vulcanjs/permissions\";\nimport { VulcanFieldSchema, VulcanSchema } from \"@vulcanjs/schema\";\nimport { getFieldType } from \"./utils\";\n\n/* getters */\n// filter out fields with \".\" or \"$\"\nexport const getValidFields = (schema) => {\n return Object.keys(schema).filter(\n (fieldName) => !fieldName.includes(\"$\") && !fieldName.includes(\".\")\n );\n};\n\n/*\n\nConvert a nested SimpleSchema schema into a JSON object\nIf flatten = true, will create a flat object instead of nested tree\n\n/* permissions */\n\n/**\n * @method Mongo.Collection.getInsertableFields\n * Get an array of all fields editable by a specific user for a given collection\n * @param {Object} user – the user for which to check field permissions\n */\nexport const getInsertableFields = function (schema, user) {\n const fields = Object.keys(schema).filter(function (fieldName) {\n var field = schema[fieldName];\n return canCreateField(user, field);\n });\n return fields;\n};\n\n/**\n * @method Mongo.Collection.getEditableFields\n * Get an array of all fields editable by a specific user for a given collection (and optionally document)\n * @param {Object} user – the user for which to check field permissions\n */\nexport const getEditableFields = function (schema, user, document) {\n const fields = Object.keys(schema).filter(function (fieldName) {\n var field = schema[fieldName];\n return canUpdateField(user, field, document);\n });\n return fields;\n};\n\nconst isNestedSchema = (schema: any): schema is VulcanSchema => {\n return typeof schema === \"object\";\n};\n\n/**\n * Vulcan Schema => Form Schema\n * TODO: type this better\n * @param schema\n * @param options\n * @returns\n */\nexport const convertSchema = (\n schema: VulcanSchema,\n options: { flatten?: boolean; removeArrays?: boolean } = {}\n) => {\n const { flatten = false, removeArrays = true } = options;\n\n let jsonSchema = {};\n\n Object.keys(schema).forEach((fieldName) => {\n // exclude array fields\n if (removeArrays && fieldName.includes(\"$\")) {\n return;\n }\n\n // extract schema\n jsonSchema[fieldName] = getFieldSchema(fieldName, schema);\n\n // check for existence of nested field\n // and get its schema if possible or its type otherwise\n const subSchemaOrType = getNestedFieldSchemaOrType(fieldName, schema);\n if (subSchemaOrType) {\n // remember the subschema if it exists, allow to customize labels for each group of items for arrays of objects\n jsonSchema[fieldName].arrayFieldSchema = getFieldSchema(\n `${fieldName}.$`,\n schema\n );\n\n // nested schema can be a field schema ({type, canRead, etc.}) (convertedSchema will be null)\n // or a schema on its own with subfields (convertedSchema will return smth)\n if (isNestedSchema(subSchemaOrType)) {\n // call convertSchema recursively on the subSchema\n const convertedSubSchema = convertSchema(subSchemaOrType, options);\n // subSchema is a full schema with multiple fields (eg array of objects)\n if (flatten) {\n jsonSchema = { ...jsonSchema, ...convertedSubSchema };\n } else {\n jsonSchema[fieldName].schema = convertedSubSchema;\n }\n } else {\n // subSchema is a simple field in this case (eg array of numbers)\n jsonSchema[fieldName].isSimpleArrayField = true; //getFieldSchema(`${fieldName}.$`, schema);\n }\n }\n });\n return jsonSchema;\n};\n\n/*\n\nGet a JSON object representing a field's schema\n\n*/\nexport const getFieldSchema = (fieldName: string, schema: VulcanSchema) => {\n let fieldSchema = {};\n schemaProperties.forEach((property) => {\n const propertyValue = schema[fieldName]?.[property];\n if (propertyValue) {\n fieldSchema[property] = propertyValue;\n }\n });\n return fieldSchema;\n};\n\n// type is an array due to the possibility of using SimpleSchema.oneOf\n// right now we support only fields with one type\nexport const getSchemaType = (fieldSchema: VulcanFieldSchema) =>\n getFieldType(fieldSchema);\n\nconst getArrayNestedSchema = (fieldName: string, schema: VulcanSchema) => {\n const arrayItemSchema = schema[`${fieldName}.$`];\n const nestedSchema = arrayItemSchema && getSchemaType(arrayItemSchema);\n return nestedSchema;\n};\n\n// TODO: not 100% it's valid with current implementation\nconst isNestedSchemaField = (fieldSchema: VulcanFieldSchema) => {\n const fieldType = getSchemaType(fieldSchema);\n return fieldType && typeof fieldType === \"object\";\n};\nconst getObjectNestedSchema = (fieldName: string, schema: VulcanSchema) => {\n const fieldSchema = schema[fieldName];\n if (!isNestedSchemaField(fieldSchema)) return null;\n const nestedSchema = fieldSchema && getSchemaType(fieldSchema);\n return nestedSchema;\n};\n/*\n\nGiven an array field, get its nested schema\nIf the field is not an object, this will return the subfield type instead\n*/\nexport const getNestedFieldSchemaOrType = (fieldName, schema) => {\n const arrayItemSchema = getArrayNestedSchema(fieldName, schema);\n if (!arrayItemSchema) {\n // look for an object schema\n const objectItemSchema = getObjectNestedSchema(fieldName, schema);\n // no schema was found\n if (!objectItemSchema) return null;\n return objectItemSchema;\n }\n return arrayItemSchema;\n};\n\nexport const schemaProperties = [\n \"type\",\n \"label\",\n \"optional\",\n \"required\",\n \"min\",\n \"max\",\n \"exclusiveMin\",\n \"exclusiveMax\",\n \"minCount\",\n \"maxCount\",\n \"allowedValues\",\n \"regEx\",\n \"blackbox\",\n \"trim\",\n \"custom\",\n \"defaultValue\",\n \"autoValue\",\n \"hidden\", // hidden: true means the field is never shown in a form no matter what\n \"mustComplete\", // mustComplete: true means the field is required to have a complete profile\n \"form\", // form placeholder\n \"inputProperties\", // form placeholder\n \"itemProperties\",\n \"control\", // SmartForm control (String or React component)\n \"input\", // SmartForm control (String or React component)\n \"autoform\", // legacy form placeholder; backward compatibility (not used anymore)\n \"order\", // position in the form\n \"group\", // form fieldset group\n \"onCreate\", // field insert callback\n \"onUpdate\", // field edit callback\n \"onDelete\", // field remove callback\n \"onInsert\", // OpenCRUD backwards compatibility\n \"onEdit\", // OpenCRUD backwards compatibility\n \"onRemove\", // OpenCRUD backwards compatibility\n \"canRead\",\n \"canCreate\",\n \"canUpdate\",\n \"viewableBy\", // OpenCRUD backwards compatibility\n \"insertableBy\", // OpenCRUD backwards compatibility\n \"editableBy\", // OpenCRUD backwards compatibility\n \"resolveAs\",\n \"searchable\",\n \"description\",\n \"beforeComponent\",\n \"afterComponent\",\n \"placeholder\",\n \"options\",\n \"query\",\n \"queryWaitsForValue\",\n \"autocompleteQuery\",\n \"fieldProperties\",\n \"intl\",\n \"intlId\",\n];\n\nexport const formProperties = [\n \"optional\",\n \"required\",\n \"min\",\n \"max\",\n \"exclusiveMin\",\n \"exclusiveMax\",\n \"minCount\",\n \"maxCount\",\n \"allowedValues\",\n \"regEx\",\n \"blackbox\",\n \"trim\",\n \"custom\",\n \"defaultValue\",\n \"autoValue\",\n \"mustComplete\", // mustComplete: true means the field is required to have a complete profile\n \"form\", // form placeholder\n \"inputProperties\", // form placeholder\n \"itemProperties\",\n \"control\", // SmartForm control (String or React component)\n \"input\", // SmartForm control (String or React component)\n \"order\", // position in the form\n \"group\", // form fieldset group\n \"description\",\n \"beforeComponent\",\n \"afterComponent\",\n \"placeholder\",\n \"options\",\n \"query\",\n \"queryWaitsForValue\",\n \"autocompleteQuery\",\n \"fieldProperties\",\n];\n","import merge from \"lodash/merge.js\";\nimport find from \"lodash/find.js\";\nimport isPlainObject from \"lodash/isPlainObject.js\";\nimport set from \"lodash/set.js\";\nimport size from \"lodash/size.js\";\n\nimport { removePrefix, filterPathsByPrefix } from \"./path_utils\";\nimport { VulcanFieldSchema } from \"@vulcanjs/schema\";\n\n// add support for nested properties\nexport const deepValue = function (obj, path) {\n const pathArray = path.split(\".\");\n\n for (var i = 0; i < pathArray.length; i++) {\n obj = obj[pathArray[i]];\n }\n\n return obj;\n};\n\n// see http://stackoverflow.com/questions/19098797/fastest-way-to-flatten-un-flatten-nested-json-objects\nexport const flatten = function (data) {\n var result = {};\n function recurse(cur, prop) {\n if (Object.prototype.toString.call(cur) !== \"[object Object]\") {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (var i = 0, l = cur.length; i < l; i++)\n recurse(cur[i], prop + \"[\" + i + \"]\");\n if (l == 0) result[prop] = [];\n } else {\n var isEmpty = true;\n for (var p in cur) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + \".\" + p : p);\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n recurse(data, \"\");\n return result;\n};\n\nexport const isEmptyValue = (value) =>\n typeof value === \"undefined\" ||\n value === null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0);\n\n/**\n * Merges values. It takes into account the current, original and deleted values,\n * and the merge produces the proper type for simple objects or arrays.\n *\n * @param {Object} props\n * Form component props. Only specific properties for this function are documented.\n * @param {*} props.currentValue\n * Current value of the field\n * @param {*} props.documentValue\n * Original value of the field\n * @return {*|undefined}\n * Merged value or undefined if no merge was performed\n */\nexport const mergeValue = ({\n currentValue,\n documentValue,\n deletedValues: deletedFields,\n path,\n locale,\n datatype,\n}) => {\n if (locale) {\n // note: intl fields are of type Object but should be treated as Strings\n return currentValue || documentValue || \"\";\n }\n\n // note: retrieve nested deleted values is performed here to avoid skipping\n // the merge in case the current field is not in `currentValues` but a nested\n // property has been removed directly by path\n const deletedValues = getNestedDeletedValues(path, deletedFields);\n const hasDeletedValues = !!size(deletedValues);\n if (\n (Array.isArray(currentValue) || hasDeletedValues) &&\n find(datatype, [\"type\", Array])\n ) {\n return merge([], documentValue, currentValue, deletedValues);\n } else if (\n (isPlainObject(currentValue) || hasDeletedValues) &&\n find(datatype, [\"type\", Object])\n ) {\n return merge({}, documentValue, currentValue, deletedValues);\n }\n return undefined;\n};\n\n/**\n * Converts a list of field names to an object of deleted values.\n *\n * @param {string[]|Object.<string|string>} deletedFields\n * List of deleted field names or paths\n * @param {Object|Array=} accumulator={}\n * Value to reduce the values to\n * @return {Object|Array}\n * Deleted values, with the structure defined by taking the received deleted\n * fields as paths\n * @example\n * const deletedFields = [\n * 'field.subField',\n * 'field.subFieldArray[0]',\n * 'fieldArray[0]',\n * 'fieldArray[2].name',\n * ];\n * getNestedDeletedValues(deletedFields);\n * // => { 'field': { 'subField': null, 'subFieldArray': [null] }, 'fieldArray': [null, undefined, { name: null } }\n */\nexport const getDeletedValues = (deletedFields, accumulator = {}) =>\n deletedFields.reduce(\n (deletedValues, path) => set(deletedValues, path, null),\n accumulator\n );\n\n/**\n * Filters the given field names by prefix, removes it from each one of them\n * and convert the list to an object of deleted values.\n *\n * @param {string=} prefix\n * Prefix to filter and remove from deleted fields\n * @param {string[]|Object.<string|string>} deletedFields\n * List of deleted field names or paths\n * @param {Object|Array=} accumulator={}\n * Value to reduce the values to\n * @return {Object.<string, null>}\n * Object keyed with the given deleted fields, valued with `null`\n * @example\n * const deletedFields = [\n * 'field.subField',\n * 'field.subFieldArray[0]',\n * 'fieldArray[0]',\n * 'fieldArray[2].name',\n * ];\n * getNestedDeletedValues('field', deletedFields);\n * // => { 'subField': null, 'subFieldArray': [null] }\n * getNestedDeletedValues('fieldArray', deletedFields);\n * // => { '0': null, '2': { 'name': null } }\n * getNestedDeletedValues('fieldArray', deletedFields, []);\n * // => [null, undefined, { 'name': null } ]\n */\nexport const getNestedDeletedValues = (\n prefix,\n deletedFields,\n accumulator = {}\n) =>\n getDeletedValues(\n removePrefix(prefix, filterPathsByPrefix(prefix, deletedFields)),\n accumulator\n );\n\n//TODO: check if it still works as expected\n// previously was dataType[0].type\nexport const getFieldType = (fieldSchema: VulcanFieldSchema) =>\n fieldSchema.type;\n/**\n * Get appropriate null value for various field types\n *\n * @param {Array} datatype\n * Field's datatype property\n */\nexport const getNullValue = (datatype) => {\n const fieldType = getFieldType(datatype);\n if (fieldType === Array) {\n return [];\n } else if (fieldType === Boolean) {\n return false;\n } else if (fieldType === String) {\n return \"\";\n } else if (fieldType === Number) {\n return \"\";\n } else {\n // normalize to null\n return null;\n }\n};\n","import toPath from \"lodash/toPath.js\";\nimport initial from \"lodash/initial.js\";\nimport flow from \"lodash/fp/flow.js\";\nimport takeRight from \"lodash/takeRight.js\";\n\n/**\n * Splits a path in string format into an array.\n */\nexport const splitPath = (string: string) => toPath(string);\n\n/**\n * Joins a path in array format into a string.\n */\nexport const joinPath = (array: Array<string | number>): string =>\n array.reduce<string>(\n (string, item) =>\n string +\n (Number.isNaN(Number(item))\n ? `${string === \"\" ? \"\" : \".\"}${item}`\n : `[${item}]`),\n \"\"\n );\n\n/**\n * Retrieves parent path from the given one.\n *\n * @param {String} string\n * Path in string format\n * @return {String}\n */\nexport const getParentPath = flow(splitPath, initial, joinPath);\n\n/**\n * Removes prefix from the given paths.\n *\n * @param {String} prefix\n * @param {String[]} paths\n * @return {String[]}\n */\nexport const removePrefix = (\n prefix: string,\n paths: Array<string>\n): Array<string> => {\n const explodedPrefix = splitPath(prefix);\n return paths.map((path) => {\n if (path === prefix) {\n return path;\n }\n const explodedPath = splitPath(path);\n const explodedSuffix = takeRight(\n explodedPath,\n explodedPath.length - explodedPrefix.length\n );\n return joinPath(explodedSuffix);\n });\n};\n\n/**\n * Filters paths that have the given prefix.\n *\n * @param {String} prefix\n * @param {String[]} paths\n * @return {String[]}\n */\nexport const filterPathsByPrefix = (prefix: string, paths: Array<string>) =>\n paths.filter(\n (path) =>\n path === prefix ||\n path.startsWith(`${prefix}.`) ||\n path.startsWith(`${prefix}[`)\n );\n","/**\n * Field processing functions that computes groups and add relevant props for i18n\n */\nimport { formProperties } from \"../../utils/schema_utils\";\nimport { FieldGroup } from \"@vulcanjs/schema\";\nimport { FormField } from \"../../typings\";\nimport { FormProps, FormState } from \"./typings\";\n\n/**\n * Field related functions\n */\n\nimport { VulcanSchema } from \"@vulcanjs/schema\";\nimport uniq from \"lodash/uniq.js\";\nimport compact from \"lodash/compact.js\";\nimport get from \"lodash/get.js\";\nimport pick from \"lodash/pick.js\";\nimport {\n isIntlField,\n formatLabel,\n getIntlKeys,\n getIntlLabel,\n} from \"@vulcanjs/i18n\";\n\nimport { IntlProviderContextValue } from \"@vulcanjs/react-i18n\";\nimport map from \"lodash/map.js\";\nimport sortBy from \"lodash/sortBy.js\";\nimport uniqBy from \"lodash/uniqBy.js\";\nimport difference from \"lodash/difference.js\";\nimport reject from \"lodash/reject.js\";\nimport intersection from \"lodash/intersection.js\";\nimport _filter from \"lodash/filter.js\";\nimport { capitalize } from \"@vulcanjs/utils\";\nimport { VulcanFieldSchema } from \"@vulcanjs/schema\";\nimport { VulcanModel } from \"@vulcanjs/model\";\n\n/*\n\n Get a field's intl keys (useful for debugging)\n\n */\nconst getModelIntlKeys = (\n model: VulcanModel,\n flatSchema: any,\n fieldName: string\n) => {\n return getIntlKeys({\n fieldName: fieldName,\n modelName: model.name,\n schema: flatSchema,\n });\n};\n\n/*\n\n Get a field's label\n\n */\nexport const getLabel = (\n model: VulcanModel,\n flatSchema: any,\n context: IntlProviderContextValue,\n fieldName: string,\n fieldLocale?: string\n) => {\n const collectionName = model.name.toLowerCase();\n const label = formatLabel({\n intl: context,\n fieldName: fieldName,\n collectionName: collectionName,\n schema: flatSchema,\n });\n if (fieldLocale) {\n const intlFieldLocale = context.formatMessage({\n id: `locales.${fieldLocale}`,\n defaultMessage: fieldLocale,\n });\n return `${label} (${intlFieldLocale})`;\n } else {\n return label;\n }\n};\n\n/*\n\n Get a field's description\n\n (Same as getLabel but pass isDescription: true )\n */\nconst getDescription = (\n model: VulcanModel,\n flatSchema: any,\n context: any,\n fieldName: string\n) => {\n const collectionName = model.name.toLowerCase();\n const description = getIntlLabel({\n intl: context,\n fieldName: fieldName,\n collectionName: collectionName,\n schema: flatSchema,\n isDescription: true,\n });\n return description || null;\n};\n\n/*\n\n Get a field option's label\n\n */\nconst getOptionLabel = (\n model: VulcanModel,\n context: { formatMessage: Function },\n fieldName: string,\n option: { intlId?: string; label: string; value?: any }\n) => {\n const collectionName = model.name.toLowerCase();\n const intlId =\n option.intlId || `${collectionName}.${fieldName}.${option.value}`;\n return context.formatMessage({\n id: intlId,\n defaultMessage: option.label,\n });\n};\n\n/*\n\n Get a list of the fields to be included in the current form\n\n Note: when submitting the form (getData()), do not include any extra fields.\n\n */\nexport const getFieldNames = (\n props: Pick<FormProps, \"fields\" | \"addFields\" | \"removeFields\">,\n currentDocument,\n optionsFromArgs: {\n excludeHiddenFields?: boolean;\n excludeRemovedFields?: boolean;\n replaceIntlFields?: boolean;\n addExtraFields?: boolean;\n schema?: VulcanSchema;\n mutableFields?: Array<any>;\n }\n) => {\n const { fields, addFields, removeFields } = props;\n const defaultOptions = {\n excludeHiddenFields: true,\n excludeRemovedFields: true,\n replaceIntlFields: false,\n addExtraFields: false,\n };\n const options = {\n ...defaultOptions,\n ...optionsFromArgs,\n };\n const {\n schema,\n mutableFields,\n excludeRemovedFields,\n excludeHiddenFields,\n addExtraFields,\n replaceIntlFields,\n } = options;\n\n // get all editable/insertable fields (depending on current form type)\n let relevantFields = mutableFields;\n\n // if \"fields\" prop is specified, restrict list of fields to it\n if (typeof fields !== \"undefined\" && fields.length > 0) {\n relevantFields = intersection(relevantFields, fields);\n }\n\n // if \"hideFields\" prop is specified, remove its fields\n if (excludeRemovedFields) {\n // OpenCRUD backwards compatibility\n //const removeFields = removeFields || hideFields;\n if (typeof removeFields !== \"undefined\" && removeFields.length > 0) {\n relevantFields = difference(relevantFields, removeFields);\n }\n }\n\n // if \"addFields\" prop is specified, add its fields\n if (\n addExtraFields &&\n typeof addFields !== \"undefined\" &&\n addFields.length > 0\n ) {\n relevantFields = relevantFields?.concat(addFields);\n }\n\n // remove all hidden fields\n if (excludeHiddenFields) {\n const document = currentDocument;\n relevantFields = reject(relevantFields, (fieldName) => {\n const hidden = schema?.[fieldName].hidden;\n return typeof hidden === \"function\"\n ? hidden({ props, document })\n : hidden;\n });\n }\n\n // replace intl fields\n if (replaceIntlFields) {\n relevantFields = relevantFields?.map((fieldName) =>\n isIntlField(schema?.[fieldName]) ? `${fieldName}_intl` : fieldName\n );\n }\n\n // remove any duplicates\n relevantFields = uniq(relevantFields);\n\n return relevantFields;\n};\n\n// --------------------------------------------------------------------- //\n// -------------------------------- Fields ----------------------------- //\n// --------------------------------------------------------------------- //\n\nconst initField = (\n props: { model: VulcanModel; layout?: \"horizontal\" | \"vertical\" },\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n fieldName: string,\n fieldSchema: VulcanFieldSchema\n) => {\n const { model } = props;\n const { currentDocument, flatSchema } = state;\n const isArray = fieldSchema.type === Array;\n\n // intialize properties\n let field: Partial<FormField> = {\n ...pick(fieldSchema, formProperties),\n name: fieldName,\n datatype: fieldSchema.type,\n layout: props.layout, // A layout property used to control how the form fields are displayed. Defaults to horizontal.\n input: fieldSchema.input || fieldSchema.control, // TODO\n };\n\n // if this is an array field also store its array item type\n if (isArray) {\n const itemFieldSchema = state.originalSchema[`${fieldName}.$`];\n field.itemDatatype = get(itemFieldSchema, \"type.0.type\");\n }\n\n field.label = getLabel(model, flatSchema, context, fieldName);\n field.intlKeys = getIntlKeys({\n fieldName,\n modelName: model.name,\n schema: model.schema,\n });\n // // replace value by prefilled value if value is empty\n // const prefill = fieldSchema.prefill || (fieldSchema.form && fieldSchema.form.prefill);\n // if (prefill) {\n // const prefilledValue = typeof prefill === 'function' ? prefill.call(fieldSchema) : prefill;\n // if (!!prefilledValue && !field.value) {\n // field.prefilledValue = prefilledValue;\n // field.value = prefilledValue;\n // }\n // }\n\n const document = currentDocument;\n field.document = document;\n\n // internationalize field options labels\n if (field.options && Array.isArray(field.options)) {\n field.options = field.options.map((option) => ({\n ...option,\n label: getOptionLabel(model, context, fieldName, option),\n }));\n }\n\n // if this an intl'd field, use a special intlInput\n if (isIntlField(fieldSchema)) {\n field.intlInput = true;\n }\n\n // add any properties specified in fieldSchema.form as extra props passed on\n // to the form component, calling them if they are functions\n const inputProperties = fieldSchema.form || fieldSchema.inputProperties || {};\n for (const prop in inputProperties) {\n const property = inputProperties[prop];\n field[prop] =\n typeof property === \"function\"\n ? property.call(fieldSchema, {\n ...props,\n fieldName,\n document,\n intl: context,\n })\n : property;\n }\n\n // add description as help prop\n const description = getDescription(model, flatSchema, context, fieldName);\n if (description) {\n field.help = description;\n }\n\n return field as FormField;\n};\nconst handleFieldPath = (\n field: FormField,\n fieldName: string,\n parentPath?: string\n) => {\n const fieldPath = parentPath ? `${parentPath}.${fieldName}` : fieldName;\n field.path = fieldPath;\n // TODO: reintroduce this side effect to correctly set the default values\n // (previously was in Form.tsx)\n // Note sure if this is actually needed\n // if (field.defaultValue) {\n // set(this.defaultValues, fieldPath, field.defaultValue);\n // }\n return field;\n};\nconst handleFieldParent = (field: FormField, parentFieldName?: string) => {\n // if field has a parent field, pass it on\n if (parentFieldName) {\n field.parentFieldName = parentFieldName;\n }\n\n return field;\n};\nconst handlePermissions = (\n field: FormField,\n fieldName: string,\n mutableFields: Array<any>\n) => {\n // if field is not creatable/updatable, disable it\n if (!mutableFields.includes(fieldName)) {\n field.disabled = true;\n }\n return field;\n};\nconst handleFieldChildren = (\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n field: FormField,\n fieldName: string,\n fieldSchema: any, // TODO: not a VulcanField, more a FormField\n schema: VulcanSchema,\n mutableFields: Array<any>\n) => {\n const { currentDocument } = state;\n // array field\n if (fieldSchema.arrayFieldSchema) {\n field.arrayFieldSchema = fieldSchema.arrayFieldSchema;\n // create a field that can be exploited by the form\n field.arrayField = createArraySubField(\n props,\n state,\n context,\n fieldName,\n field.arrayFieldSchema,\n schema,\n mutableFields\n );\n //field.nestedInput = true\n }\n // nested fields: set input to \"nested\"\n if (fieldSchema.schema) {\n field.nestedSchema = fieldSchema.schema;\n field.nestedInput = true;\n\n // get nested schema\n // for each nested field, get field object by calling createField recursively\n field.nestedFields = getFieldNames(props, currentDocument, {\n schema: field.nestedSchema,\n addExtraFields: false,\n }).map((subFieldName) => {\n return createField(\n props,\n state,\n context,\n subFieldName,\n field.nestedSchema,\n mutableFields,\n fieldName,\n field.path\n );\n });\n }\n return field;\n};\n\n/*\n Given a field's name, the containing schema, and parent, create the\n complete field object to be passed to the component\n\n */\nconst createField = (\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n fieldName: string,\n schema: any,\n mutableFields: Array<any>,\n parentFieldName?: string,\n parentPath?: string\n): FormField => {\n const fieldSchema = schema[fieldName];\n let field = initField(props, state, context, fieldName, fieldSchema);\n field = handleFieldPath(field, fieldName, parentPath);\n field = handleFieldParent(field, parentFieldName);\n field = handlePermissions(field, fieldName, mutableFields);\n field = handleFieldChildren(\n props,\n state,\n context,\n field,\n fieldName,\n fieldSchema,\n schema,\n mutableFields\n );\n return field;\n};\nconst createArraySubField = (\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n fieldName: string,\n subFieldSchema: VulcanFieldSchema,\n schema: VulcanSchema,\n mutableFields: Array<string>\n) => {\n const subFieldName = `${fieldName}.$`;\n let subField = initField(props, state, context, subFieldName, subFieldSchema);\n // array subfield has the same path and permissions as its parent\n // so we use parent name (fieldName) and not subfieldName\n subField = handleFieldPath(subField, fieldName);\n subField = handlePermissions(subField, fieldName, mutableFields /*schema*/);\n // we do not allow nesting yet\n //subField = this.handleFieldChildren(field, fieldSchema)\n return subField;\n};\n\n// Group of multiple fields (obtained by parsing the whole schema)\ninterface GroupWithFields extends FieldGroup {\n fields: Array<FormField>;\n}\n\ntype FormSchemaState = Pick<\n FormState,\n \"currentDocument\" | \"schema\" | \"flatSchema\" | \"originalSchema\"\n>;\n\n/*\n\n Get all field groups\n\n */\nexport const getFieldGroups = (\n props: FormProps,\n state: FormSchemaState,\n context: IntlProviderContextValue,\n mutableFields: Array<string>,\n formatMessage: any\n) => {\n const { schema, currentDocument } = state;\n // build fields array by iterating over the list of field names\n let fields = getFieldNames(props, currentDocument, {\n mutableFields,\n schema,\n }).map((fieldName) => {\n // get schema for the current field\n return createField(props, state, context, fieldName, schema, mutableFields);\n });\n\n fields = sortBy(fields, \"order\");\n\n // get list of all unique groups (based on their name) used in current fields, remove \"empty\" group\n let groups = compact(uniqBy(map(fields, \"group\"), (g) => (g ? g.name : \"\")));\n\n // for each group, add relevant fields\n let groupsWithFields = groups.map((group) => {\n const label =\n group.label ||\n //this.context.formatMessage({ id: group.name }) ||\n capitalize(group.name);\n const groupFields = _filter<FormField>(fields, (field) => {\n return field.group && field.group.name === group.name;\n });\n const groupWithFields: GroupWithFields = {\n ...group,\n label,\n fields: groupFields,\n };\n return groupWithFields;\n });\n\n // add default group if necessary\n const defaultGroupFields = _filter(fields, (field) => !field.group);\n if (defaultGroupFields.length) {\n const defaultGroup: GroupWithFields = {\n name: \"default\",\n label: \"default\",\n order: 0,\n fields: defaultGroupFields,\n };\n groupsWithFields = [defaultGroup].concat(groupsWithFields);\n }\n\n // sort by order\n groupsWithFields = sortBy(groupsWithFields, \"order\");\n\n // console.log(groups);\n\n return groupsWithFields;\n};\n","import find from \"lodash/find.js\";\nimport isEqualWith from \"lodash/isEqualWith.js\";\nexport const isNotSameDocument = (initialDocument, changedDocument) => {\n const changedValue = find(changedDocument, (value, key, collection) => {\n return !isEqualWith(value, initialDocument[key], (objValue, othValue) => {\n if (!objValue && !othValue) return true;\n });\n });\n return typeof changedValue !== \"undefined\";\n};\n","export * from \"./useWarnOnUnsaved\";\n","import { useBlockTransition } from \"../useBlockTransition/useBlockTransition\";\nimport debug from \"debug\";\nimport { useIntlContext } from \"@vulcanjs/react-i18n\";\nconst debugTransitions = debug(\"vn:route-transitions\");\n\n/**\n * Can trigger an alert on unsaved changes\n *\n * Triggers event so you can also block SPA transition (implementation is NOT provided by this hook, you\n * need listeners whose implementation depends on your router (React Router, Next Router...), see block.ts)\n *\n * @see https://github.com/ReactTraining/history/blob/master/docs/blocking-transitions.md\n *\n * @param param0\n */\nexport const useWarnOnUnsaved = ({\n isChanged,\n warnUnsavedChanges,\n}: {\n isChanged: boolean;\n warnUnsavedChanges?: boolean;\n}) => {\n const context = useIntlContext();\n /**\n * To be passed to onbeforeunload event. The returned message will be displayed\n * by the prompt.\n *\n * see https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload\n * the message returned is actually ignored by most browsers and a default message 'Are you sure you want to leave this page? You might have unsaved changes' is displayed. See the Notes section on the mozilla docs above\n */\n const getBlockedMessage = (event?: BeforeUnloadEvent) => {\n debugTransitions(\"running handlePageLeave\", event);\n const message = context.formatMessage({\n id: \"forms.confirm_discard\",\n defaultMessage: \"Are you sure you want to discard your changes?\",\n });\n return message;\n };\n useBlockTransition({\n shouldBlock: !!(warnUnsavedChanges && isChanged),\n getBlockedMessage: getBlockedMessage,\n });\n};\n","import { useEffect, useRef } from \"react\";\nimport { block } from \"./block\";\nimport debug from \"debug\";\nconst debugTransitions = debug(\"vn:router-transitions\");\n\n/**\n * Can trigger an alert on unsaved changes\n *\n * Triggers event so you can also block SPA transition (implementation is NOT provided by this hook, you\n * need listeners whose implementation depends on your router (React Router, Next Router...), see block.ts)\n *\n * @see https://github.com/ReactTraining/history/blob/master/docs/blocking-transitions.md\n *\n * @param param0\n */\nexport const useBlockTransition = ({\n shouldBlock,\n getBlockedMessage,\n}: {\n shouldBlock: boolean;\n getBlockedMessage: (evt?: BeforeUnloadEvent) => string;\n}) => {\n // function to unblock the form\n const unblockRef = useRef<Function | undefined>();\n\n useEffect(() => {\n const isBlocking = !!unblockRef.current;\n debugTransitions(\n \"running effect\",\n \"should block\",\n shouldBlock,\n \"currently blocked\",\n isBlocking\n );\n\n const onUnblock = () => {\n debugTransitions(\"running unblock from effect\");\n if (!shouldBlock) {\n if (unblockRef.current) {\n unblockRef.current();\n }\n }\n };\n // block\n const onBlocked = (evt?: BeforeUnloadEvent): string => {\n const message = getBlockedMessage(evt);\n debugTransitions(\n \"user is being blocked after trying to leave the page, with message: \" +\n message\n );\n if (evt) {\n evt.returnValue = message;\n }\n return message;\n };\n if (shouldBlock) {\n debugTransitions(\n \"should block transition, setting up relevant event listener\"\n );\n unblockRef.current = block(onBlocked, onUnblock);\n }\n // unblock if not blocking anymore and was blocking previously\n if (!shouldBlock && isBlocking) {\n debugTransitions(\"should unblock (state has been reinitialized)\");\n if (unblockRef.current) {\n unblockRef.current();\n }\n }\n // trigger the potentially registered unblock function when component unmounts\n //return onUnblock;\n }, [shouldBlock]);\n};\n","import debug from \"debug\";\nconst debugTransitions = debug(\"vn:route-transition\");\nconst BeforeUnloadEventType = \"beforeunload\";\n/**\n * Event triggered when a warning on unsaved changes is necessary\n * The app should listen for this event to setup relevant blocking methods depending on the framework\n *\n * For instance with React Router:\n *\n * let unblock\n * window.addEventListener(\"blocktransition\", () => {\n * unblock = router.history.block(...)\n * })\n * window.addEventListener(\"unblocktransition\", () => {\n * unblock()\n * })\n *\n * For Next.js, you would do something similar\n * Check https://github.com/vercel/next.js/discussions/12348\n *\n */\nexport const BLOCK_TRANSITION_EVENT_TYPE = \"blocktransition\";\n/**\n * Called when blocking is not necessary anymore:\n * - there are no unsaved changes anymore\n * - user has confirmed they want to leave\n */\nexport const UNBLOCK_TRANSITION_EVENT_TYPE = \"unblocktransition\";\n/**\n * Intercepts the beforeunload event\n *\n * Code taken from React Router history feature\n * @see https://github.com/ReactTraining/history/blob/master/docs/blocking-transitions.md\n */\nfunction blockBeforeUnload(event: BeforeUnloadEvent) {\n // Cancel the event.\n event.preventDefault();\n // Chrome (and legacy IE) requires returnValue to be set.\n event.returnValue = \"\";\n}\n\n/**\n * Blocks transition\n *\n * /!\\ In order to catch SPA transition, you need to implement\n * an event listener in your own app.\n *\n *\n * @param onUnblock Callback to call on unblock, for custom behaviour\n * @returns A function to unblock the transition (eg if the form is back to\n * its original state)\n */\nexport const block = (\n setConfirmationMessage: (event?: BeforeUnloadEvent) => string,\n onUnblock?: Function\n) => {\n debugTransitions(\"running block function\");\n // trigger a block event, to be handled at the framework level\n // TODO: setConfirmationMessage should be passed as well\n const blockEvent = new Event(BLOCK_TRANSITION_EVENT_TYPE);\n window.dispatchEvent(blockEvent);\n // block at browser level\n window.addEventListener(BeforeUnloadEventType, blockBeforeUnload);\n window.addEventListener(BeforeUnloadEventType, setConfirmationMessage);\n // return an unblock function to cancel\n const unblock = () => {\n debugTransitions(\"running unblock function\");\n if (onUnblock) {\n debugTransitions(\"running user defined function\");\n onUnblock(); // callback from user land\n }\n // trigger an unblock event, to be handled at the framework level\n const unblockEvent = new Event(UNBLOCK_TRANSITION_EVENT_TYPE);\n window.dispatchEvent(unblockEvent);\n // remove the browser level events\n window.removeEventListener(BeforeUnloadEventType, blockBeforeUnload);\n window.removeEventListener(BeforeUnloadEventType, setConfirmationMessage);\n // unblock browser change\n // @ts-ignore\n window.onbeforeunload = undefined; //undefined instead of null to support IE\n };\n return unblock;\n};\n","import type {\n CreateVariables,\n UpdateVariables,\n DeleteVariables,\n} from \"@vulcanjs/crud\";\nimport { VulcanModel } from \"@vulcanjs/model\";\nimport { VulcanUser } from \"@vulcanjs/permissions\";\nimport { VulcanSchema } from \"@vulcanjs/schema\";\nimport { DocumentNode } from \"graphql\";\n\nexport interface FormState {\n schema: any;\n initialDocument: Object;\n currentDocument: Object;\n deletedValues: any;\n errors: any;\n currentValues: any;\n disabled: any;\n success?: any;\n flatSchema: any;\n originalSchema: any;\n}\n\n/**\n * Props that can be passed to the FormContainer (= SmartForm)\n * and will be passed down to the Form\n *\n * TODO: this might not be complete yet. We need to move relevant props from \"FormProps\" to this type,\n * based on current usage of the SmartForm in existing apps\n */\nexport interface PassedDownFormProps {\n itemProperties?: Object;\n showDelete?: boolean;\n /**\n * Disable the form\n */\n disabled?: boolean;\n /**\n * Will prevent leaving the page/unmounting the form on unsaved changes\n */\n warnUnsavedChanges?: boolean;\n /*A callback called on form submission on the form data. Can return the submitted data object as well.*/\n submitCallback?: (data) => any;\n /*A callback called on mutation success.*/\n successCallback?: (document, meta: { form: any }) => void;\n /*A callback called on mutation failure.*/\n errorCallback?: (document, error, meta: { form: any }) => void;\n\n // Fragments\n /**\n * A GraphQL fragment used to specify the data to fetch to populate edit forms.\n * If no fragment is passed, SmartForm will do its best to figure out what data to load based on the fields included in the form.\n *\n * Can be either a string or a DocumentNode (using \"gql\" tag)\n */\n queryFragment?: DocumentNode | string;\n /**\n * A GraphQL fragment used to specify the data to return once a mutation is complete.\n\nIf no fragment is passed, SmartForm will only return fields used in the form, but note that this might sometimes lead to discrepancies when compared with documents already loaded on the client.\n\nAn example would be a createdAt date added automatically on creation even though it’s not part of the actual form. If you’d like that field to be returned after the mutation, you can define a custom mutationFragment that includes it explicitly.\n\n * Can be either a string or a DocumentNode (using \"gql\" tag)\n*/\n mutationFragment?: DocumentNode | string;\n /** Force a query fragment name\n *\n * NOTE: needed only for string fragments\n * If you use a DocumentNode (with \"gql\" tag), it will be computed automatically\n *\n * @deprecated Prefer using DocumentNode fragment, using the gql tag\n */\n queryFragmentName?: string;\n /** Force a mutation fragment name\n *\n *NOTE: needed only for string fragments\n *If you use a DocumentNode (with \"gql\" tag), it will be computed automatically\n *\n * @deprecated Prefer using DocumentNode fragment, using the gql tag\n */\n mutationFragmentName?: string;\n}\n\nexport interface FormProps<TModel = { [key in string]: any }>\n extends PassedDownFormProps {\n /**\n * Function that retriggers data fetching in edit mode\n * Usually provided by the useSingle but could be any function\n */\n refetch?: () => void;\n /**\n * Document id in update mode\n */\n id?: string;\n /* The model in which to edit or insert a document. */\n model: VulcanModel;\n /** Passing directly a raw schema (TODO: model is still mandatory atm) */\n schema?: VulcanSchema;\n /**\n * Passing directly a document (TODO: not yet tested in the new version)\n */\n document?: any;\n /**\n * currentUser to check authorizations to update/create some fields\n */\n currentUser?: VulcanUser;\n addFields?: Array<string>;\n removeFields?: Array<string>;\n // deprecated\n //hideFields?: any;\n /**\n * Label so that graphql queries are contextualized\n */\n contextName?: string;\n // labels\n cancelLabel?: string;\n revertLabel?: string;\n //\n revertCallback?: Function;\n // TODO: probably should be removed\n successComponent?: any;\n /* Instead of passing collection you can pass the name of the collection.*/\n // collectionName?: string;\n /*If present, the document to edit. If not present, the form will be a “new document” form.*/\n documentId?: string;\n /*An array of field names, if you want to restrict the form to a specific set of fields.*/\n fields?: Array<keyof TModel>;\n /*The text inside the submit button of the form.*/\n submitLabel?: string;\n /*A layout property used to control how the form fields are displayed. Defaults to horizontal.*/\n layout?: \"horizontal\" | \"vertical\";\n /*Whether to show a “delete document” link on edit forms.*/\n showRemove?: boolean;\n /*A set of props used to prefill the form. */\n prefilledProps?: TModel & Object; // TODO: should it allow only fields from the Model or also additional fields?\n /*Whether to repeat validation errors at the bottom of the form.*/\n repeatErrors?: boolean;\n //Callbacks\n /** Callback ran on first render */\n initCallback?: Function;\n /*If a cancelCallback function is provided, a “cancel” link will be shown next to the form’s submit button and the callback will be called on click.*/\n cancelCallback?: (document) => void;\n /*A callback to call when a document is successfully removed (deleted).*/\n removeSuccessCallback?: (document) => void;\n\n /*A callback called a every change or blur event inside the form.*/\n changeCallback: (currentDocument) => void;\n\n // mutations from container\n // => replace the \"onSubmit\" of a normal form\n /**\n * The result is usually extracted from a graphql mutation\n * But we have a simplified abstracted API, so we could also use the Form without graphql\n */\n createDocument: <TModel = any>(\n createVars: CreateVariables\n ) => Promise<CreateDocumentResult<TModel>>;\n updateDocument: <TModel = any>(\n vars: UpdateVariables\n ) => Promise<UpdateDocumentResult<TModel>>;\n deleteDocument: (vars: DeleteVariables) => Promise<void>;\n // Other results from the Apollo query => should be ignored, in order to avoid dependency to graphql in the Form\n // instead the container is responsible for passing errors and stuff\n // createDocumentMeta?: { error?: any };\n // updateDocumentMeta?: { error?: any };\n // EXPERIMENTAL: allowing to manually set the form children\n children?: React.ReactNode;\n}\n\nexport interface CreateDocumentResult<TDocument = any> {\n document: TDocument;\n errors: Array<any>;\n}\n\nexport interface UpdateDocumentResult<TDocument = any> {\n document: TDocument;\n errors: Array<any>;\n}\n","/*\n\nFormContainer aka SmartForm\n\nChanges compared to Vulcan Meteor:\n\n- previously was named FormWrapper\n- accepts a model instead of collection\n- no queryFragmentName (resp. mutation name), instead you need to pass the fragment explicitely\n\nTechnically, this is a GraphqlSmartForm, while Form.tsx is the more\ngeneric SmartForm, or a \"ModelForm\".\n\n\n---\n\nGenerate the appropriate fragment for the current form, then\nwrap the main Form component with the necessary HoCs while passing\nthem the fragment.\n\nThis component is itself wrapped with:\n\n- withCurrentUser\n- withApollo (used to access the Apollo client for form pre-population)\n\nAnd wraps the Form component with:\n\n- withNew\n\nOr:\n\n- withSingle\n- withUpdate\n- withDelete\n\n(When wrapping with withSingle, withUpdate, and withDelete, a special Loader\ncomponent is also added to wait for withSingle's loading prop to be false)\n\n*/\nimport React, { useRef } from \"react\";\n// import // withCurrentUser,\n// Utils,\n// getFragment,\n//\"meteor/vulcan:core\";\nimport { DocumentNode } from \"@apollo/client\";\nimport gql from \"graphql-tag\";\n\nimport getFormFragments from \"../utils/formFragments\";\n// import { VulcanModel } from \"@vulcanjs/model\";\nimport { VulcanGraphqlModel, getFragmentName } from \"@vulcanjs/graphql\";\nimport type {\n CreateVariables,\n UpdateVariables,\n DeleteVariables,\n} from \"@vulcanjs/crud\";\nimport { capitalize } from \"@vulcanjs/utils\";\nimport {\n useSingle,\n useCreate,\n useUpdate,\n useDelete,\n UseSingleOptions,\n} from \"@vulcanjs/react-hooks\";\nimport { FetchResult } from \"@apollo/client\";\n// import { FormType } from \"./typings\";\nimport { debugVulcan } from \"@vulcanjs/utils\";\nimport { VulcanUser } from \"@vulcanjs/permissions\";\nimport { PassedDownFormProps } from \"./Form/typings\";\n// Be careful to import from the Consumer!\nimport { useVulcanComponents } from \"../../VulcanComponents/Consumer\";\nimport { useVulcanCurrentUser } from \"../../VulcanCurrentUser\";\nconst debugForm = debugVulcan(\"form\");\n\n// Mutation that yield a success result\ntype SuccessfulFetchResult<TData = Object> = FetchResult<TData> & {\n data: TData;\n};\n/**\n * Typeguared to allow considering the request as successful\n */\nconst isSuccessful = function <T = any>(\n result: FetchResult<T> | undefined\n): result is SuccessfulFetchResult<T> {\n return !!result?.data;\n};\n\nexport interface FormContainerProps extends PassedDownFormProps {\n model: VulcanGraphqlModel;\n /** Document id for edition mode, will automatically fetch the document */\n documentId?: string;\n /** Slug (= human readable unique id) for edition mode, will automatically fetch the document */\n slug?: string;\n /**\n * List only those fields in the form\n */\n fields?: Array<string>;\n /**\n * List default fields + those additional fields as well\n */\n addFields?: Array<string>;\n /**\n * Force a currentUser, overriding the currentUser obtained\n * via Context\n *\n * If you use many forms in your app,\n * it might be better to set VulcanCurrentUserContext\n * at the top-level of your app\n * (eg in \"pages/_app.js\" for Next.js)\n */\n currentUser?: VulcanUser | null;\n loadingCurrentUser?: boolean;\n}\nexport type SmartFormProps = FormContainerProps;\n\nconst useFragments = (\n props: Pick<\n FormContainerProps,\n | \"mutationFragment\"\n | \"mutationFragmentName\"\n | \"queryFragment\"\n | \"queryFragmentName\"\n // for auto generation\n | \"model\"\n | \"fields\"\n | \"addFields\"\n >,\n formType: \"edit\" | \"new\"\n) => {\n // get fragment used to decide what data to load from the server to populate the form,\n // as well as what data to ask for as return value for the mutation\n // TODO: move out of the component\n //const getFragments = () => {\n let queryFragment: DocumentNode | undefined;\n let queryFragmentName: string | undefined;\n let mutationFragment: DocumentNode | undefined;\n let mutationFragmentName: string | undefined;\n\n // if queryFragment or mutationFragment props are specified, accept either fragment object or fragment string\n // TODO: not sure we actually need that, gApollo accepts fragments or string normally\n if (props.queryFragment) {\n if (typeof props.queryFragment === \"string\") {\n queryFragment = gql`\n ${props.queryFragment}\n `;\n if (!props.queryFragmentName)\n throw new Error(\n \"When using a string queryFragment, queryFragmentName is mandatory\"\n );\n queryFragmentName = props.queryFragmentName;\n } else {\n // DocumentNode\n queryFragment = props.queryFragment;\n // automatically compute the fragment name\n queryFragmentName =\n props.queryFragmentName || getFragmentName(props.queryFragment);\n }\n }\n if (props.mutationFragment) {\n if (typeof props.mutationFragment === \"string\") {\n mutationFragment = gql`\n ${props.mutationFragment}\n `;\n if (!props.mutationFragmentName)\n throw new Error(\n \"When using a string mutationFragment, mutationFragmentName is mandatory\"\n );\n queryFragmentName = props.mutationFragmentName;\n } else {\n // DocumentNode\n mutationFragment = props.mutationFragment;\n // automatically compute the fragment name\n mutationFragmentName =\n props.mutationFragmentName || getFragmentName(props.mutationFragment);\n }\n }\n // auto generate fragments\n let autoFormFragments;\n if (!props.queryFragment || !props.mutationFragment) {\n const { model, fields, addFields } = props;\n // autogenerated fragments\n autoFormFragments = getFormFragments({\n formType,\n model,\n fields,\n addFields,\n });\n }\n // use autogenerated value if necessary\n if (!props.queryFragment) {\n queryFragment = autoFormFragments.queryFragment;\n queryFragmentName = autoFormFragments.queryFragmentName;\n }\n if (!props.mutationFragment) {\n mutationFragment = autoFormFragments.mutationFragment;\n mutationFragmentName = autoFormFragments.mutationFragmentName;\n }\n return {\n mutationFragment: mutationFragment as DocumentNode,\n mutationFragmentName: mutationFragmentName as string,\n queryFragment: queryFragment as DocumentNode,\n queryFragmentName: queryFragmentName as string,\n };\n};\n// Fonctionnal version to be able to use hooks\nexport const FormContainer = (props: FormContainerProps) => {\n const {\n model,\n documentId,\n slug,\n fields,\n addFields,\n currentUser: currentUserFromProps,\n loadingCurrentUser: loadingCurrentUserFromProps,\n } = props;\n const { schema } = model;\n // if a document is being passed, this is an edit form\n const isEdit = documentId || slug;\n const selector = {\n documentId,\n slug,\n };\n const formType = isEdit ? \"edit\" : \"new\";\n const VulcanComponents = useVulcanComponents();\n\n // get query & mutation fragments from props or else default to same as generatedFragment\n //return {\n // queryFragment,\n // mutationFragment,\n //};\n //}\n\n const prefix = `${model.name}${capitalize(formType)}`;\n // props to pass on to child component (i.e. <Form />)\n const childProps = {\n formType,\n schema,\n };\n\n const {\n mutationFragment,\n mutationFragmentName,\n queryFragment,\n queryFragmentName,\n } = useFragments(props, formType);\n\n // options for useCreate, useUpdate and useDelete\n const mutationOptions = {\n model,\n // collection: this.props.collection,\n fragment: mutationFragment,\n fragmentName: mutationFragmentName,\n };\n\n const queryOptions: UseSingleOptions<any> = {\n model,\n // TODO: what this option does?\n // queryName: `${prefix}FormQuery`,\n fragment: queryFragment,\n fragmentName: queryFragmentName,\n // fragmentName?\n input: {\n id: documentId,\n enableCache: false,\n // TODO: support slug\n },\n queryOptions: {\n // we always want to load a fresh copy of the document\n fetchPolicy: \"network-only\" as \"network-only\", // cast is for fixing annoying TS issue... https://github.com/vuejs/vue-apollo/issues/936\n pollInterval: 0, // no polling, only load data once\n skip: formType === \"new\",\n },\n };\n /* debug\n console.log(\n \"MUT\",\n (mutationFragment as any).loc.source.body,\n mutationFragmentName\n );\n console.log(\n \"QUERY\",\n (queryFragment as any).loc.source.body,\n queryFragmentName\n );*/\n const { data, document, loading, refetch } = useSingle(queryOptions);\n if (formType !== \"new\") {\n debugForm(\n \"useSingle result\",\n \"data\",\n data,\n \"document\",\n document,\n \"loading\",\n loading\n );\n }\n // TODO: pass the creation functions down to the Form\n const [createDocument] = useCreate(mutationOptions);\n const [updateDocument] = useUpdate(mutationOptions);\n const [deleteDocument] = useDelete(mutationOptions);\n\n const {\n currentUser: currentUserFromContext,\n loading: loadingCurrentUserFromContext,\n } = useVulcanCurrentUser();\n const shouldGetCurrentUserFromProps =\n typeof currentUserFromProps !== \"undefined\";\n const currentUser = shouldGetCurrentUserFromProps\n ? currentUserFromProps\n : currentUserFromContext;\n const loadingCurrentUser = shouldGetCurrentUserFromProps\n ? loadingCurrentUserFromProps\n : loadingCurrentUserFromContext;\n\n // callbacks\n /*\n const formRef = useRef(null);\n const newMutationSuccessCallback = function <TData = Object>(\n result: SuccessfulFetchResult<TData>\n ) {\n getDocumentFromResult(result, \"new\");\n };\n const editMutationSuccessCallback = function <TData = Object>(\n result: SuccessfulFetchResult<TData>\n ) {\n getDocumentFromResult(result, \"edit\");\n };\n */\n\n /*\n The create hook already creates a document prop in a more stable way\n const getDocumentFromResult = function <TData = Object>(\n // must be called only on valid results\n result: SuccessfulFetchResult<TData> | undefined\n ) {\n if (!result) return undefined;\n // TODO: quite risky... we should have a better way to get the document\n let document = result.data[Object.keys(result.data)[0]].data; // document is always on first property\n\n return document;\n };*/\n // for new mutation, run refetch function if it exists\n /*\n if (mutationType === \"new\" && refetch) refetch();\n */\n\n const createAndReturnDocument = async (variables: CreateVariables) => {\n const result = await createDocument(variables);\n const { errors, document } = result;\n return {\n document,\n errors,\n };\n };\n const updateAndReturnDocument = async (variables: UpdateVariables) => {\n const result = await updateDocument(variables);\n const { errors, document } = result;\n return {\n document,\n errors,\n };\n };\n\n const deleteDocumentAndRefetch = async (variables: DeleteVariables) => {\n await deleteDocument(variables as any);\n };\n\n if (isEdit && loading) {\n return <VulcanComponents.Loading />;\n }\n return (\n <VulcanComponents.Form\n document={document}\n loading={loading || loadingCurrentUser}\n createDocument={createAndReturnDocument /*createDocument*/}\n updateDocument={updateAndReturnDocument}\n deleteDocument={deleteDocumentAndRefetch}\n refetch={refetch}\n currentUser={currentUser}\n {...childProps}\n {...props}\n />\n );\n};\n\n/*\nFormContainer.propTypes = {\n // main options\n documentId: PropTypes.string, // if a document is passed, this will be an edit form\n mutationFragment: PropTypes.object,\n mutationFragmentName: PropTypes.string,\n\n // graphQL\n // createFoo, deleteFoo, updateFoo\n // newMutation: PropTypes.func, // the new mutation\n // editMutation: PropTypes.func, // the edit mutation\n // removeMutation: PropTypes.func, // the remove mutation\n\n // form\n prefilledProps: PropTypes.object,\n layout: PropTypes.string,\n fields: PropTypes.arrayOf(PropTypes.string),\n hideFields: PropTypes.arrayOf(PropTypes.string),\n addFields: PropTypes.arrayOf(PropTypes.string),\n showRemove: PropTypes.bool,\n submitLabel: PropTypes.node,\n cancelLabel: PropTypes.node,\n revertLabel: PropTypes.node,\n repeatErrors: PropTypes.bool,\n warnUnsavedChanges: PropTypes.bool,\n formComponents: PropTypes.object,\n disabled: PropTypes.bool,\n itemProperties: PropTypes.object,\n successComponent: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n contextName: PropTypes.string,\n\n // callbacks\n ...callbackProps,\n\n currentUser: PropTypes.object,\n client: PropTypes.object,\n};\n\nFormContainer.defaultProps = {\n layout: \"horizontal\",\n};\n*/\n\n/*\nregisterComponent({\n name: 'SmartForm',\n component: FormContainer,\n hocs: [withCurrentUser, withApollo, withRouter, withCollectionProps],\n});\n*/\n\nexport const SmartForm = FormContainer;\n\nexport default FormContainer;\n","/**\n * Generate mutation and query fragments for a form based on the schema\n * TODO: refactor to mutualize more code with vulcan-core defaultFragment functions\n * TODO: move to lib when refactored\n */\nimport _uniq from \"lodash/uniq.js\";\nimport _intersection from \"lodash/intersection.js\";\nimport gql from \"graphql-tag\";\nimport {\n getCreateableFields,\n getUpdateableFields,\n getFragmentFieldNames,\n //isBlackbox,\n} from \"@vulcanjs/schema\";\nimport {\n getFieldFragment,\n VulcanGraphqlModel,\n //isBlackbox,\n} from \"@vulcanjs/graphql\";\nimport { capitalize } from \"@vulcanjs/utils\";\nimport type { FormType } from \"../typings\";\nimport compact from \"lodash/compact.js\";\n// getFieldFragment,\nconst intlSuffix = \"_intl\";\n\n// PostsEditFormQueryFragment/PostsNewFormMutationFragment/etc.\nconst getFragmentName = (\n formType: FormType,\n multiTypeName: string,\n fragmentType: \"mutation\" | \"query\"\n) =>\n [multiTypeName, formType, \"form\", fragmentType, \"fragment\"]\n .map(capitalize)\n .join(\"\");\n\n// get modifiable fields in the query either for update or create operations\nconst getQueryFieldNames = ({ schema, options }) => {\n const queryFields =\n options.formType === \"new\"\n ? getCreateableFields(schema)\n : getUpdateableFields(schema);\n return queryFields;\n};\n// add readable fields to mutation fields\nconst getMutationFieldNames = ({ readableFieldNames, queryFieldNames }) => {\n return _uniq(queryFieldNames.concat(readableFieldNames));\n};\n\n/*\nconst getFieldFragment = ({ schema, fieldName, options }) => {\n let fieldFragment = fieldName;\n const field = schema[fieldName];\n if (!(field && field.type)) return fieldName;\n const fieldType = field.type.singleType;\n const fieldTypeName =\n typeof fieldType === 'object'\n ? 'Object'\n : typeof fieldType === 'function'\n ? fieldType.name\n : fieldType;\n\n if (fieldName.slice(-5) === intlSuffix) {\n fieldFragment = `${fieldName}{ locale value }`;\n } else {\n switch (fieldTypeName) {\n // recursive call for nested arrays and objects\n case 'Object':\n if (!isBlackbox(field) && fieldType._schema) {\n fieldFragment =\n getSchemaFragment({\n fragmentName: fieldName,\n schema: fieldType._schema,\n options,\n }) || null;\n }\n break;\n case 'Array':\n const arrayItemFieldName = `${fieldName}.$`;\n const arrayItemField = schema[arrayItemFieldName];\n // note: make sure field has an associated array item field\n if (arrayItemField) {\n // child will either be native value or a an object (first case)\n const arrayItemFieldType = arrayItemField.type.singleType;\n if (!arrayItemField.blackbox && arrayItemFieldType._schema) {\n fieldFragment =\n getSchemaFragment({\n fragmentName: fieldName,\n schema: arrayItemFieldType._schema,\n options,\n }) || null;\n }\n }\n break;\n default:\n // handle intl or return fieldName\n fieldFragment = fieldName;\n break;\n }\n }\n return fieldFragment;\n};\n*/\n\n// get fragment for a whole schema (root schema or nested schema of an object or an array)\nconst getSchemaFragment = ({\n schema,\n fragmentName,\n options,\n fieldNames: providedFieldNames,\n}) => {\n // differentiate mutation/query and create/update cases\n // respect provided fieldNames if any (needed for the root schema)\n const fieldNames =\n providedFieldNames ||\n (options.isMutation\n ? getMutationFieldNames({\n queryFieldNames: getQueryFieldNames({ schema, options }),\n readableFieldNames: getFragmentFieldNames({\n schema,\n options: { onlyViewable: true },\n }),\n })\n : getQueryFieldNames({ schema, options }));\n\n const childFragments =\n fieldNames.length &&\n fieldNames\n .map((fieldName) =>\n getFieldFragment({\n schema,\n fieldName,\n options,\n getObjectFragment: getSchemaFragment, // allow to reuse the code from defaultFragment with another behaviour\n })\n )\n // remove empty values\n .filter((f) => !!f);\n if (childFragments.length) {\n return `${fragmentName} { ${childFragments.join(\"\\n\")} }`;\n }\n return null;\n};\n\n/**\n * Generate query and mutation fragments for forms, dynamically based on the selected fields\n */\nconst getFormFragments = ({\n formType = \"new\",\n model,\n fields, // restrict on certain fields\n addFields, // add additional fields (eg to display static fields)\n}: {\n model: VulcanGraphqlModel;\n formType: FormType;\n fields?: Array<string>; // restrict on certain fields\n addFields?: Array<string>; // add additional fields (eg to display static fields)\n}) => {\n const { schema, name, graphql } = model;\n const { typeName, multiTypeName } = graphql;\n // get the root schema fieldNames\n let queryFieldNames = getQueryFieldNames({ schema, options: { formType } });\n let mutationFieldNames = getMutationFieldNames({\n queryFieldNames,\n readableFieldNames: getFragmentFieldNames({\n schema,\n options: { onlyViewable: true },\n }),\n });\n\n // if \"fields\" prop is specified, restrict list of fields to it\n if (fields && fields?.length > 0) {\n // add \"_intl\" suffix to all fields in case some of them are intl fields\n const fieldsWithIntlSuffix = fields.map((field) => `${field}${intlSuffix}`);\n const allFields = [...fields, ...fieldsWithIntlSuffix];\n queryFieldNames = _intersection(queryFieldNames, allFields);\n mutationFieldNames = _intersection(mutationFieldNames, allFields);\n }\n\n // add \"addFields\" prop contents to list of fields\n if (addFields?.length) {\n queryFieldNames = queryFieldNames.concat(addFields);\n mutationFieldNames = mutationFieldNames.concat(addFields);\n }\n\n // userId is used to check for permissions, so add it to fragments if possible\n if (schema.userId) {\n queryFieldNames.unshift(\"userId\");\n mutationFieldNames.unshift(\"userId\");\n }\n\n if (schema._id) {\n queryFieldNames.unshift(\"_id\");\n mutationFieldNames.unshift(\"_id\");\n }\n\n // check unicity (_id can be added twice)\n queryFieldNames = _uniq(queryFieldNames);\n mutationFieldNames = _uniq(mutationFieldNames);\n\n if (queryFieldNames.length === 0)\n // NOTE: in theory, you could have no queriable fields, but mutable fields =>\n // a form for data that you can create but can never see...\n // Since that doesn't make much sense, we throw an error to secure the end user\n throw new Error(\n `Model \"${model.name}\" has no queryable fields, cannot create a form for it. Please add readable/createable/updateable fields to the model schema.`\n );\n if (mutationFieldNames.length === 0)\n throw new Error(\n `Model \"${model.name}\" has no mutable fields, cannot create a form for it. Please add createable/updateable fields to model schema.`\n );\n\n const queryFragmentName = getFragmentName(\n formType,\n multiTypeName, // previously collectionName //name,\n \"query\"\n );\n // generate query fragment based on the fields that can be edited. Note: always add _id, and userId if possible.\n // TODO: support nesting\n const queryFragmentText = getSchemaFragment({\n schema,\n fragmentName: `fragment ${queryFragmentName} on ${typeName}`,\n options: { formType, isMutation: false },\n fieldNames: queryFieldNames,\n });\n if (!queryFragmentText) {\n // NOTE: this should never happen if we don't have an empty array for field names\n throw new Error(\n `Model ${model.name} with fields ${queryFieldNames} yield an empty query fragment.`\n );\n }\n const generatedQueryFragment = gql(queryFragmentText);\n\n const mutationFragmentName = getFragmentName(\n formType,\n multiTypeName, // previously collectionName,\n \"mutation\"\n );\n const mutationFragmentText = getSchemaFragment({\n schema,\n fragmentName: `fragment ${mutationFragmentName} on ${typeName}`,\n options: { formType, isMutation: true },\n fieldNames: mutationFieldNames,\n });\n if (!mutationFragmentText) {\n // NOTE: this should never happen if we don't have an empty array for field names\n throw new Error(\n `Model ${model.name} with fields ${mutationFieldNames} yield an empty mutation fragment.`\n );\n }\n // generate mutation fragment based on the fields that can be edited and/or viewed. Note: always add _id, and userId if possible.\n // TODO: support nesting\n const generatedMutationFragment = gql(mutationFragmentText);\n\n // if any field specifies extra queries, add them\n const extraQueries = compact(\n getQueryFieldNames({ schema, options: { formType } }).map((fieldName) => {\n const field = schema[fieldName];\n return field.query;\n })\n );\n // get query & mutation fragments from props or else default to same as generatedFragment\n return {\n queryFragment: generatedQueryFragment,\n mutationFragment: generatedMutationFragment,\n queryFragmentName,\n mutationFragmentName,\n extraQueries,\n };\n};\n\nexport default getFormFragments;\n","export * from \"./Consumer\";\nexport * from \"./Provider\";\n","import { useContext } from \"react\";\nimport { VulcanCurrentUserContext } from \"./Context\";\n\nexport const VulcanCurrentUserConsumer = VulcanCurrentUserContext.Consumer;\n\nexport const useVulcanCurrentUser = () => useContext(VulcanCurrentUserContext);\n","import React from \"react\";\nimport type { VulcanUser } from \"@vulcanjs/permissions\";\n\nexport type VulcanCurrentUserContextType =\n | { currentUser: VulcanUser | null; loading: false }\n | { loading: true; currentUser: any };\n// We need this to shut TypeScript up\n// You should use the Provider to get the right default values\nexport const VulcanCurrentUserContext =\n React.createContext<VulcanCurrentUserContextType>({\n currentUser: null,\n loading: false,\n });\n","/**\n * NOTE: KEEP SEPARATED FROM THE HOOKS TO CONSUME THE CONTEXT\n * otherwise you'll end up with circular dependencies because of the default components\n */\n// TODO: we might need to adapt the provider to merge its value with a potentially higher up context\nimport React from \"react\";\n\nimport {\n VulcanCurrentUserContext,\n VulcanCurrentUserContextType,\n} from \"./Context\";\n\n// So that you can override only some components by adding an additional context while keeping the defaults\nexport const VulcanCurrentUserProvider = ({\n value,\n ...props\n}: {\n value: VulcanCurrentUserContextType;\n children: React.ReactNode;\n}) => (\n <VulcanCurrentUserContext.Provider\n value={value} // merge provided components so the user can provide only a partial replacement\n {...props}\n />\n);\n","export * as pathUtils from \"./path_utils\";\nexport * as utils from \"./utils\";\nexport * as schemaUtils from \"./schema_utils\";\nexport * as formFragmentsUtils from \"./formFragments\";\nexport * as uiUtils from \"./ui_utils\";\n","import pick from \"lodash/pick.js\";\n\n/**\n * Extract input props for the FormComponentInner\n * @param {*} props All component props\n * @returns Initial props + props specific to the HTML input in an inputProperties object\n */\nexport const getHtmlInputProps = (props) => {\n const { name, path, options, label, onChange, onBlur, value, disabled } =\n props;\n\n // these properties are whitelisted so that they can be safely passed to the actual form input\n // and avoid https://facebook.github.io/react/warnings/unknown-prop.html warnings\n const inputProperties = {\n ...props.inputProperties,\n name,\n path,\n options,\n label,\n onChange,\n onBlur,\n value,\n disabled,\n };\n\n return {\n ...props,\n inputProperties,\n };\n};\n\n/**\n * Extract input props for the FormComponentInner\n * @param {*} props All component props\n * @returns Initial props + props specific to the HTML input in an inputProperties object\n */\nexport const whitelistInputProps = (\n props: any\n): React.HTMLProps<HTMLInputElement> => {\n const whitelist = [\n \"name\",\n \"path\",\n \"options\",\n \"label\",\n \"onChange\",\n \"onBlur\",\n \"value\",\n \"disabled\",\n \"placeholder\",\n ];\n const value = props.value;\n let safeValue = value;\n // No null values in HTML inputs\n if (value === null) safeValue = undefined;\n // if value is null, return undefined\n return { ...pick(props, whitelist), value: safeValue };\n};\n","export * from \"./Provider\";\nexport * from \"./Context\";\nexport * from \"./Consumer\";\nexport * from \"./typings\";\n\nexport * from \"./defaultVulcanComponents\";\n","/**\n * NOTE: KEEP SEPARATED FROM THE HOOKS TO CONSUME THE CONTEXT\n * otherwise you'll end up with circular dependencies because of the default components\n */\n// TODO: we might need to adapt the provider to merge its value with a potentially higher up context\nimport React from \"react\";\n\nimport { PossibleVulcanComponents } from \"./typings\";\nimport { VulcanComponentsContext } from \"./Context\";\nimport { useVulcanComponents } from \"./Consumer\";\nimport { debugVulcan } from \"@vulcanjs/utils\";\nconst debugComponents = debugVulcan(\"components\"); //console.log;\n\n/**\n *\n * @param options.value An object of Vulcan components to be overriden.\n */\nexport const VulcanComponentsProvider = ({\n value,\n ...props\n}: {\n value?: Partial<PossibleVulcanComponents>;\n children: React.ReactNode;\n}) => {\n const currentComponents = useVulcanComponents();\n debugComponents(\n \"Current components __not_initialized?\",\n currentComponents.__not_initialized\n );\n const mergedComponents = {\n // merge with a parent Provider if needed\n ...(currentComponents?.__not_initialized ? {} : currentComponents || {}),\n ...(value || {}),\n };\n debugComponents(\"Merged components\", mergedComponents);\n // For preserving displayName, that is lost after build somehow\n Object.keys(mergedComponents).forEach((componentName) => {\n if (mergedComponents[componentName]) {\n mergedComponents[componentName].displayName = \"Vulcan.\" + componentName;\n } else {\n console.warn(`Encountered an undefined component: ${componentName}.\n The component may not be registered, or import failed.\n For instance due to an infinite import loop when importing\n \"useVulcanComponents\" from index instead of Consumer.`);\n }\n });\n return (\n <VulcanComponentsContext.Provider\n // We make the assumption that all components are there, user is responsible\n // for adding them correctly in the context where necessary\n value={mergedComponents as PossibleVulcanComponents} // merge provided components so the user can provide only a partial replacement\n {...props}\n />\n );\n};\n","import React from \"react\";\n\n// Creating a dependency with the raw\n// implemention is actually a bad idea\n// An \"any\" type is acceptable as long as we\n// do expose reusable hooks and\n// enough typings for common things, such as\n// \"FormInputProps\" or useFormContext, typings for some events and so on\n/*\n import type { FormSubmitProps } from \"../form/elements\";\n import type { ButtonProps } from \"../core/Button\";\n */\n// We keep this import because it barely have any HTML, you are\n// not supposed to restyle it in each package\n// import type { MutationButtonProps } from \"../MutationButton\";\n// datatable\n/*\nimport type {\n Datatable,\n DatatableAbove,\n DatatableAboveLayout,\n DatatableAboveLeft,\n DatatableAboveRight,\n DatatableAboveSearchInput,\n DatatableLayout,\n} from \"../Datatable/Datatable\";\nimport type {\n DatatableContents,\n DatatableContentsBodyLayout,\n DatatableContentsHeadLayout,\n DatatableContentsInnerLayout,\n DatatableContentsLayout,\n DatatableContentsMoreLayout,\n DatatableEmpty,\n DatatableLoadMoreButton,\n DatatableTitle,\n} from \"../Datatable/DatatableContents\";\nimport type {\n DatatableHeader,\n DatatableHeaderCellLayout,\n} from \"../Datatable/DatatableHeader\";\nimport type {\n DatatableRow,\n DatatableRowLayout,\n} from \"../Datatable/DatatableRow\";\nimport type {\n DatatableCell,\n DatatableCellLayout,\n DatatableDefaultCell,\n} from \"../Datatable/DatatableCell\";\nimport type {\n DatatableFilter,\n DatatableFilterBooleans,\n DatatableFilterCheckboxes,\n DatatableFilterContents,\n DatatableFilterContentsWithData,\n DatatableFilterDates,\n DatatableFilterNumbers,\n} from \"../Datatable/DatatableFilter\";\nimport type { DatatableSorter } from \"../Datatable/DatatableSorter\";\nimport type { DatatableSelect } from \"../Datatable/DatatableSelect\";\nimport type { DatatableSubmitSelected } from \"../Datatable/DatatableSubmitSelected\";\nimport type { EditButton, EditForm } from \"../Datatable/others/EditButton\";\nimport type { NewButton, NewForm } from \"../Datatable/others/NewButton\";\nimport type { DeleteButton } from \"../Datatable/others/DeleteButton\";\n*/\n//import type { BootstrapModal as Modal } from \"../bootstrap/Modal\";\n// Cell\n/*\nimport type { CardItemSwitcher } from \"../cell/CardItem\";\nimport type {\n CardItemRelationItem,\n DefaultCell,\n UserCell,\n} from \"../cell/CardItemRelationItem\";\nimport type { CardItemArray } from \"../cell/CardItemArray\";\nimport type { CardItemDate } from \"../cell/CardItemDate\";\nimport type { CardItemDefault } from \"../cell/CardItemDefault\";\nimport type { CardItemHTML } from \"../cell/CardItemHTML\";\nimport type { CardItemImage } from \"../cell/CardItemImage\";\nimport type { CardItemNumber } from \"../cell/CardItemNumber\";\nimport type { CardItemObject } from \"../cell/CardItemObject\";\nimport type { CardItemRelationHasMany } from \"../cell/CardItemRelationHasMany\";\nimport type { CardItemRelationHasOne } from \"../cell/CardItemRelationHasOne\";\nimport type { CardItemString } from \"../cell/CardItemString\";\nimport type { CardItemURL } from \"../cell/CardItemURL\";\n*/\n//import type { ModalTrigger } from \"../bootstrap/ModalTrigger\";\n//import type { FormOptionLabelProps } from \"../form/inputs/FormOptionLabel\";\n\nexport interface PossibleCoreComponents {\n Loading: any;\n FormattedMessage: any;\n Alert: any;\n Button: any; //React.ComponentType<ButtonProps>;\n Icon: any;\n // TODO: define props more precisely\n MutationButton: any; //React.ComponentType<MutationButtonProps>;\n LoadingButton: React.ComponentType<any>;\n HeadTags: React.ComponentType<any>;\n // Previously from Bootstrap and Mui\n TooltipTrigger: React.ComponentType<any>;\n Dropdown: React.ComponentType<any>;\n Modal: any; // typeof Modal;\n ModalTrigger: any; // typeof ModalTrigger;\n}\n// TODO: differentiate components that are provided out of the box and those that require a UI frameworK?\nexport interface PossibleFormComponents {\n FormError: any; // FieldErrors\n // From FormComponent\n FormComponentDefault: any;\n /** Alias of the default FormComponent */\n FormComponentText: any;\n FormComponentPassword: any;\n FormComponentNumber: any;\n FormComponentUrl: any;\n FormComponentEmail: any;\n FormComponentTextarea: any;\n FormComponentCheckbox: any;\n FormComponentCheckboxGroup: any;\n FormComponentRadioGroup: any;\n FormComponentSelect: any;\n FormComponentSelectMultiple: any;\n FormComponentDateTime: any;\n FormComponentDate: any;\n // FormComponentDate2: any;\n FormComponentTime: any;\n FormComponentStaticText: any;\n FormComponentLikert: any;\n FormComponentAutocomplete: any;\n FormComponentMultiAutocomplete: any;\n //\n FormComponent: any;\n FormComponentInner: any;\n FormComponentLoader: any;\n FormElement: any;\n FormGroup: any;\n FormGroupLayout: any;\n FormGroupHeader: any;\n // intl\n FormIntlLayout: any;\n FormIntlItemLayout: any;\n FormIntl: any;\n // Layout\n FormErrors: any;\n FormSubmit: any; //React.ComponentType<FormSubmitProps>;\n FormLayout: any;\n\n // arrays and objects\n FormNestedArray: any;\n FormNestedArrayInnerLayout: any;\n FormNestedArrayLayout: any;\n FormNestedItem: any;\n IconAdd: any;\n IconRemove: any;\n FieldErrors: any;\n FormNestedDivider: any;\n //\n FormNestedItemLayout: any;\n FormNestedObjectLayout: any;\n FormNestedObject: any;\n FormOptionLabel: any; //React.ComponentType<FormOptionLabelProps>;\n // Form\n Form: any;\n SmartForm: any;\n // Used by ui-boostrap and ui-material\n FormItem;\n // flag to detect parent state\n __not_initialized?: boolean;\n}\n\nexport interface DatatableComponents {\n Datatable: any; // typeof Datatable;\n // DatatableContents: any; // typeof DatatableContents\n DatatableAbove: any; // typeof DatatableAbove;\n DatatableAboveLayout: any; // typeof DatatableAboveLayout;\n DatatableAboveLeft: any; // typeof DatatableAboveLeft;\n DatatableAboveRight: any; // typeof DatatableAboveRight;\n DatatableAboveSearchInput: any; // typeof DatatableAboveSearchInput;\n DatatableLayout: any; // typeof DatatableLayout;\n // Contents\n DatatableContents: any; // typeof DatatableContents;\n DatatableContentsBodyLayout: any; // typeof DatatableContentsBodyLayout;\n DatatableContentsHeadLayout: any; // typeof DatatableContentsHeadLayout;\n DatatableContentsInnerLayout: any; // typeof DatatableContentsInnerLayout;\n DatatableContentsLayout: any; // typeof DatatableContentsLayout;\n DatatableContentsMoreLayout: any; // typeof DatatableContentsMoreLayout;\n DatatableEmpty: any; // typeof DatatableEmpty;\n DatatableLoadMoreButton: any; // typeof DatatableLoadMoreButton;\n DatatableTitle: any; // typeof DatatableTitle;\n // Header\n DatatableHeader: any; // typeof DatatableHeader;\n DatatableHeaderCellLayout: any; // typeof DatatableHeaderCellLayout;\n // Row\n DatatableRow: any; // typeof DatatableRow;\n DatatableRowLayout: any; // typeof DatatableRowLayout;\n // Cell\n DatatableCell: any; // typeof DatatableCell;\n DatatableCellLayout: any; // typeof DatatableCellLayout;\n DatatableDefaultCell: any; // typeof DatatableDefaultCell;\n // Filter\n DatatableFilter: any; // typeof DatatableFilter;\n DatatableFilterBooleans: any; // typeof DatatableFilterBooleans;\n DatatableFilterCheckboxes: any; // typeof DatatableFilterCheckboxes;\n DatatableFilterContents: any; // typeof DatatableFilterContents;\n DatatableFilterContentsWithData: any; // typeof DatatableFilterContentsWithData;\n DatatableFilterDates: any; // typeof DatatableFilterDates;\n DatatableFilterNumbers: any; // typeof DatatableFilterNumbers;\n // Sort\n DatatableSorter: any; // typeof DatatableSorter;\n // Select\n DatatableSelect: any; // typeof DatatableSelect;\n // SubmitSelect\n DatatableSubmitSelected: any; // typeof DatatableSubmitSelected;\n // Core\n EditButton: any; // typeof EditButton;\n EditForm: any; // typeof EditForm;\n NewButton: any; // typeof NewButton;\n NewForm: any; // typeof NewForm;\n DeleteButton: any; // typeof DeleteButton;\n}\n\nexport interface CellComponents {\n CardItemSwitcher: any; // typeof CardItemSwitcher;\n CardItem: any; // any; // typeof CardItemSwitcher;\n DefaultCell: any; // typeof DefaultCell;\n UserCell: any; // typeof UserCell;\n CardItemArray: any; // typeof CardItemArray;\n CardItemDate: any; // typeof CardItemDate;\n CardItemDefault: any; // typeof CardItemDefault;\n CardItemHTML: any; // typeof CardItemHTML;\n CardItemImage: any; // typeof CardItemImage;\n CardItemNumber: any; // typeof CardItemNumber;\n CardItemObject: any; // typeof CardItemObject;\n CardItemRelationHasMany: any; // typeof CardItemRelationHasMany;\n CardItemRelationHasOne: any; // typeof CardItemRelationHasOne;\n CardItemRelationItem: any; // typeof CardItemRelationItem;\n CardItemString: any; // typeof CardItemString;\n CardItemURL: any; // typeof CardItemURL;\n}\n\nexport type PossibleVulcanComponents = PossibleCoreComponents &\n PossibleFormComponents &\n DatatableComponents &\n CellComponents;\n","import { LoadingButton } from \"../../core/LoadingButton\";\nimport { MutationButton } from \"../../core/MutationButton\";\nimport { Form, FormContainer } from \"../../form/core\";\nimport { PossibleFormComponents } from \"../typings\";\n\nexport const defaultFormComponents: Partial<PossibleFormComponents> = {\n Form,\n SmartForm: FormContainer,\n};\n// All those components are defined in each relevant package instead\nexport const defaultDatatableComponents = {};\nexport const defaultCellComponents = {};\nexport const defaultCoreComponents = {\n MutationButton,\n LoadingButton,\n};\n","export * from \"./Form\";\nexport * from \"./FormContainer\";\nexport * from \"./FormContext\";\n","// import { compose } from \"recompose\";\nimport React from \"react\";\n\nexport const Components = {}; // will be populated on startup\nexport const ComponentsTable = {}; // storage for infos about components\n\nexport const coreComponents = [\n \"Alert\",\n \"Button\",\n \"Modal\",\n \"ModalTrigger\",\n \"Table\",\n \"FormComponentCheckbox\",\n \"FormComponentCheckboxGroup\",\n \"FormComponentDate\",\n \"FormComponentDate2\",\n \"FormComponentDateTime\",\n \"FormComponentDefault\",\n \"FormComponentText\",\n \"FormComponentEmail\",\n \"FormComponentNumber\",\n \"FormComponentRadioGroup\",\n \"FormComponentSelect\",\n \"FormComponentSelectMultiple\",\n \"FormComponentStaticText\",\n \"FormComponentTextarea\",\n \"FormComponentTime\",\n \"FormComponentUrl\",\n \"FormComponentInner\",\n \"FormControl\",\n \"FormElement\",\n];\n\n/**\n * Register a Vulcan component with a name, a raw component than can be extended\n * and one or more optional higher order components.\n *\n * @param {String} name The name of the component to register.\n * @param {Component} rawComponent Interchangeable/extendable react component.\n * @param {...(Function|Array)} hocs The HOCs to compose with the raw component.\n *\n * Note: when a component is registered without higher order component, `hocs` will be\n * an empty array, and it's ok!\n * See https://github.com/reactjs/redux/blob/master/src/compose.js#L13-L15\n *\n * @returns Structure of a component in the list:\n *\n * ComponentsTable.Foo = {\n * name: 'Foo',\n * hocs: [fn1, fn2],\n * rawComponent: React.Component,\n * call: () => compose(...hocs)(rawComponent),\n * }\n *\n */\n/*\nexport function registerComponent(name, rawComponent, ...hocs) {\n // support single-argument syntax\n if (typeof arguments[0] === \"object\") {\n // note: cannot use `const` because name, components, hocs are already defined\n // as arguments so destructuring cannot work\n // eslint-disable-next-line no-redeclare\n var {\n name,\n component,\n // @ts-ignore\n hocs = [],\n } = arguments[0];\n rawComponent = component;\n }\n // store the component in the table\n ComponentsTable[name] = {\n name,\n rawComponent,\n hocs,\n };\n}\n*/\n\n/**\n * Returns true if a component with the given name has been registered with\n * registerComponent(name, component, ...hocs).\n *\n * @param {String} name The name of the component to get.\n * @returns {Boolean}\n */\nexport const componentExists = (name) => {\n const component = ComponentsTable[name];\n return !!component;\n};\n\n/**\n * Get a component registered with registerComponent(name, component, ...hocs).\n *\n * @param {String} name The name of the component to get.\n * @returns {Function|React Component} A (wrapped) React component\n */\n/*\nexport const getComponent = (name) => {\n const component = ComponentsTable[name];\n if (!component) {\n throw new Error(`Component ${name} not registered.`);\n }\n if (component.hocs && component.hocs.length) {\n const hocs = component.hocs.map((hoc) => {\n if (!Array.isArray(hoc)) {\n if (typeof hoc !== \"function\") {\n throw new Error(\n `In registered component ${name}, an hoc is of type ${typeof hoc}`\n );\n }\n return hoc;\n }\n const [actualHoc, ...args] = hoc;\n if (typeof actualHoc !== \"function\") {\n throw new Error(\n `In registered component ${name}, an hoc is of type ${typeof actualHoc}`\n );\n }\n return actualHoc(...args);\n });\n return compose(...hocs)(component.rawComponent);\n } else {\n return component.rawComponent;\n }\n};\n*/\n\n/**\n * Populate the lookup table for components to be callable\n * ℹ️ Called once on app startup\n **/\n/*\nexport const populateComponentsApp = () => {\n const registeredComponents = Object.keys(ComponentsTable);\n\n // loop over each component in the list\n registeredComponents.map((name) => {\n // populate an entry in the lookup table\n Components[name] = getComponent(name);\n\n // uncomment for debug\n // console.log('init component:', name);\n });\n\n const missingComponents = difference(coreComponents, registeredComponents);\n\n if (missingComponents.length) {\n // eslint-disable-next-line no-console\n console.warn(\n `Found the following missing core components: ${missingComponents.join(\n \", \"\n )}. Include a UI package such as vulcan:ui-bootstrap to add them.`\n );\n }\n};\n*/\n/**\n * Get the **raw** (original) component registered with registerComponent\n * without the possible HOCs wrapping it.\n *\n * @param {String} name The name of the component to get.\n * @returns {Function|React Component} An interchangeable/extendable React component\n */\nexport const getRawComponent = (name) => {\n return ComponentsTable[name].rawComponent;\n};\n\n/**\n * Replace a Vulcan component with the same name with a new component or\n * an extension of the raw component and one or more optional higher order components.\n * This function keeps track of the previous HOCs and wrap the new HOCs around previous ones\n *\n * @param {String} name The name of the component to register.\n * @param {React Component} newComponent Interchangeable/extendable component.\n * @param {...Function} newHocs The HOCs to compose with the raw component.\n * @returns {Function|React Component} A component callable with Components[name]\n *\n * Note: when a component is registered without higher order component, `hocs` will be\n * an empty array, and it's ok!\n * See https://github.com/reactjs/redux/blob/master/src/compose.js#L13-L15\n */\n/*\nexport function replaceComponent(name, newComponent, ...newHocs) {\n // support single argument syntax\n if (typeof arguments[0] === \"object\") {\n // eslint-disable-next-line no-redeclare\n var { name, component, hocs = [] } = arguments[0];\n newComponent = component;\n newHocs = hocs;\n }\n\n const previousComponent = ComponentsTable[name];\n const previousHocs = (previousComponent && previousComponent.hocs) || [];\n\n if (!previousComponent) {\n // eslint-disable-next-line no-console\n console.warn(\n `Trying to replace non-registered component ${name}. The component is ` +\n \"being registered. If you were trying to replace a component defined by \" +\n \"another package, make sure that you haven't misspelled the name. Check \" +\n \"also if the original component is still being registered or that it \" +\n \"hasn't been renamed.\"\n );\n }\n\n return registerComponent(name, newComponent, ...newHocs, ...previousHocs);\n}\n*/\n\n/*\nexport const copyHoCs = (sourceComponent, targetComponent) => {\n return compose(...sourceComponent.hocs)(targetComponent);\n};\n*/\n\n/**\n * Returns an instance of the given component name of function\n * @param {string|function} component A component, the name of a component, or a react element\n * @param {Object} [props] Optional properties to pass to the component\n */\n//eslint-disable-next-line react/display-name\n// legacy\nexport const instantiateComponent = (\n component?: React.ComponentType | Function | any,\n props?: any\n) => {\n if (!component) {\n return null;\n } /*else if (typeof component === \"string\") {\n const Component = Components[component];\n return <Component {...props} />;\n } */ else if (React.isValidElement(component)) {\n return React.cloneElement(component, props);\n } else if (\n typeof component === \"function\" &&\n component.prototype &&\n component.prototype.isReactComponent\n ) {\n const Component = component as React.ComponentType<any>;\n return <Component {...props} />;\n } else if (typeof component === \"function\") {\n return component(props);\n } else if (\n typeof component === \"object\" &&\n component.$$typeof &&\n component.render\n ) {\n const Component = component as React.ComponentType<any>;\n return <Component {...props} />;\n } else {\n return component;\n }\n};\n\n/**\n * Creates a component that will render the registered component with the given name.\n *\n * This function may be useful when in need for some registered component, but in contexts\n * where they have not yet been initialized, for example at compile time execution. In other\n * words, when using `Components.ComponentName` is not allowed (because it has not yet been\n * populated, hence would be `undefined`), then `delayedComponent('ComponentName')` can be\n * used instead.\n *\n * @example Create a container for a registered component\n * // SomeContainer.js\n * import compose from 'recompose/compose';\n * import { delayedComponent } from 'meteor/vulcan:core';\n *\n * export default compose(\n * // ...some hocs with container logic\n * )(delayedComponent('ComponentName')); // cannot use Components.ComponentName in this context!\n *\n * @example {@link dynamicLoader}\n * @param {String} name Component name\n * @return {Function}\n * Functional component that will render the given registered component\n */\nexport const delayedComponent = (name) => {\n return (props) => {\n const Component = Components[name] || null;\n return Component && <Component {...props} />;\n };\n};\n\n// Example with Proxy (might be unstable/hard to reason about)\n//const mergeWithComponents = (myComponents = {}) => {\n// const handler = {\n// get: function(target, name) {\n// return name in target ? target[name] : Components[name];\n// }\n// };\n// const proxy = new Proxy(myComponents, handler);\n// return proxy;\n//};\nexport const mergeWithComponents = (myComponents) =>\n myComponents ? { ...Components, ...myComponents } : Components;\n"],"mappings":"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AAM;AAC9D,MAAI,CAAC,iBAAiB;AAEpB,UAAM,mBAAmB,sBAAsB,WAAW,MAAM;AAEhE,QAAI,CAAC;AAAkB,aAAO;AAC9B,WAAO;;AAET,SAAO;GATiC;AAYnC,IAAM,mBAAmB;EAC9B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGK,IAAM,iBAAiB;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;AGxPF;AAaA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA0BO,IAAM,WAAW,wBACtB,OACA,YACA,SACA,WACA,gBACG;AACH,QAAM,iBAAiB,MAAM,KAAK,YAAW;AAC7C,QAAM,QAAQ,YAAY;IACxB,MAAM;IACN;IACA;IACA,QAAQ;GACT;AACD,MAAI,aAAa;AACf,UAAM,kBAAkB,QAAQ,cAAc;MAC5C,IAAI,WAAW;MACf,gBAAgB;KACjB;AACD,WAAO,GAAG,UAAU;SACf;AACL,WAAO;;GArBa;AA+BxB,IAAM,iBAAiB,wBACrB,OACA,YACA,SACA,cACG;AACH,QAAM,iBAAiB,MAAM,KAAK,YAAW;AAC7C,QAAM,cAAc,aAAa;IAC/B,MAAM;IACN;IACA;IACA,QAAQ;IACR,eAAe;GAChB;AACD,SAAO,eAAe;GAdD;AAsBvB,IAAM,iBAAiB,wBACrB,OACA,SACA,WACA,WACG;AACH,QAAM,iBAAiB,MAAM,KAAK,YAAW;AAC7C,QAAM,SACJ,OAAO,UAAU,GAAG,kBAAkB,aAAa,OAAO;AAC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","names":[]}
1
+ {"version":3,"sources":["../../../node_modules/tslib/tslib.js","../index.ts","../components/core/index.ts","../components/core/LoadingButton.tsx","../components/VulcanComponents/Consumer.tsx","../components/VulcanComponents/Context.ts","../components/VulcanComponents/Dummy.tsx","../components/core/MutationButton.tsx","../../../node_modules/graphql-tag/lib/index.js","../../../node_modules/tslib/modules/index.js","../components/core/typings.ts","../components/form/index.ts","../components/form/core/FormContext.tsx","../components/form/core/Form/index.ts","../components/form/core/Form/Form.tsx","../components/form/utils/schema_utils.ts","../components/form/utils/utils.ts","../components/form/utils/path_utils.ts","../components/form/core/Form/fields.ts","../components/form/core/Form/utils.ts","../components/form/hooks/useWarnOnUnsaved/index.ts","../components/form/hooks/useWarnOnUnsaved/useWarnOnUnsaved.ts","../components/form/hooks/useBlockTransition/useBlockTransition.ts","../components/form/hooks/useBlockTransition/block.ts","../components/form/core/Form/typings.ts","../components/form/core/FormContainer.tsx","../components/form/utils/formFragments.ts","../components/VulcanCurrentUser/index.ts","../components/VulcanCurrentUser/Consumer.tsx","../components/VulcanCurrentUser/Context.ts","../components/VulcanCurrentUser/Provider.tsx","../components/form/utils/index.ts","../components/form/utils/ui_utils.ts","../components/VulcanComponents/index.ts","../components/VulcanComponents/Provider.tsx","../components/VulcanComponents/typings.ts","../components/VulcanComponents/defaultVulcanComponents/index.ts","../components/form/core/index.ts","../componentsHelpers.tsx"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __classPrivateFieldIn;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n __classPrivateFieldIn = function (state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n exporter(\"__classPrivateFieldIn\", __classPrivateFieldIn);\r\n});\r\n","export * from \"./components/core\";\nexport * from \"./components/form\";\nexport * from \"./components/VulcanComponents\";\nexport * from \"./components/VulcanCurrentUser\";\nexport * from \"./componentsHelpers\";\n","export * from \"./LoadingButton\";\nexport * from \"./MutationButton\";\n\nexport * from \"./typings\";\n","import React, { CSSProperties } from \"react\";\nimport { useVulcanComponents } from \"../VulcanComponents/Consumer\";\nimport type { ButtonProps } from \"./typings\";\nexport interface LoadingButtonProps extends ButtonProps {\n loading?: boolean;\n label?: string | React.ReactNode;\n onClick?: any;\n children?: React.ReactNode;\n className?: string;\n}\nexport const LoadingButton = ({\n loading,\n label,\n onClick,\n children,\n className = \"\",\n ...rest\n}: LoadingButtonProps & any) => {\n const Components = useVulcanComponents();\n\n const wrapperStyle: CSSProperties = {\n position: \"relative\",\n };\n\n const labelStyle = loading ? { opacity: 0.5 } : {};\n\n const loadingStyle: CSSProperties = loading\n ? {\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }\n : { display: \"none\" };\n\n return (\n <Components.Button\n className={`loading-button ${loading ? \"loading-button-loading\" : \"loading-button-notloading\"\n } ${className}`}\n onClick={onClick}\n {...rest}\n >\n <span style={wrapperStyle}>\n <span style={labelStyle}>{label || children}</span>\n <span style={loadingStyle}>\n <Components.Loading />\n </span>\n </span>\n </Components.Button>\n );\n};\n","import { deprecate } from \"@vulcanjs/utils\";\nimport React, { useContext, useEffect } from \"react\";\nimport { VulcanComponentsContext } from \"./Context\";\n\nexport const VulcanComponentsConsumer = VulcanComponentsContext.Consumer;\n\nexport const useVulcanComponents = () => {\n const val = useContext(VulcanComponentsContext);\n return val;\n};\n\nexport const withVulcanComponents = (C) => (props) => {\n const vulcanComponents = useVulcanComponents();\n deprecate(\n \"0.0.0\",\n \"Using withVulcanComponents HOC => prefer useVulcanComponents with hooks\"\n );\n return <C vulcanComponents={vulcanComponents} {...props} />;\n};\n","import React from \"react\";\nimport type { PossibleVulcanComponents } from \"./typings\";\nimport { Dummy } from \"./Dummy\";\n\nconst dummyHandler = {\n get(target, property) {\n //console.log(\"target\", property);\n if (property in target) {\n return target[property];\n }\n console.log(\n `Property ${property} not in possible Vulcan components, returning Dummy`\n );\n return Dummy;\n },\n};\n// We need this to shut TypeScript up\n// You should use the Provider to get the right default values\nexport const VulcanComponentsContext =\n React.createContext<PossibleVulcanComponents>(\n // @ts-ignore\n new Proxy(\n {\n __not_initialized: true,\n },\n dummyHandler\n )\n );\n\n// Needed to guarantee that the exports stays named\nVulcanComponentsContext.displayName = \"VulcanComponentsContext\";\n","import React from \"react\";\nexport interface DummyProps { }\n\nexport const Dummy = () => (\n <span>\n You have not setup VulcanComponentsProvider. Please add following code in\n your app:{\" \"}\n <code>{`import { VulcanComponentsProvider } from \"@vulcanjs/react-ui\"; const YourApp = <VulcanComponentsProvider>{/* your app */}</VulcanComponentsProvider>;}`}</code>\n </span>\n);\n","/*\n\nExample Usage\n\n<Components.MutationButton\n label=\"Cancel Subscription\"\n variant=\"primary\"\n mutationOptions={{\n name: 'cancelSubscription',\n args: { bookingId: 'String' },\n fragmentName: 'BookingsStripeDataFragment',\n }}\n mutationArguments={{ bookingId: booking._id }}\n submitCallback={() => {}}\n successCallback={result => { console.log(result) }}\n/>\n\n*/\nimport React, { useState } from \"react\";\nimport { DocumentNode } from \"graphql\";\nimport { MutationHookOptions, useMutation } from \"@apollo/client\";\nimport gql from \"graphql-tag\";\nimport { useVulcanComponents } from \"../VulcanComponents/Consumer\";\nimport { LoadingButtonProps } from \"./LoadingButton\";\n// import withMutation from '../containers/registeredMutation';\n\n// TODO:\n/**\n * Difference with Vulcan Meteor: there is no\n * registered mutation anymore,\n * so you need to pass your mutations explicitely, using graphql\n */\n/*\nexport class MutationButton extends PureComponent {\n constructor(props) {\n super(props);\n this.button = withMutation(props.mutationOptions)(MutationButtonInner);\n }\n\n render() {\n const Component = this.button;\n return <Component {...this.props} />;\n }\n}*/\n\nexport interface MutationButtonProps {\n /**\n * NOTE: in Vulcan Meteor you had to write:\n * mutationOptions: { name: \"foobar\", mutationOptions: {refetchQueries:[\"hello\"]}}\n *\n * In Vulcan Next, you can only pass the \"mutationOptions\" object:\n * mutationOptions: { refetchQueries:[\"hello\"]}\n * and the mutation is provided via the new \"mutation\" prop\n */\n mutationOptions?: MutationHookOptions;\n /**\n * @example\n mutation: gql`\n mutation sampleMutation($input: Input) {\n hello\n }\n `,\n */\n mutation: string | DocumentNode;\n /** Variables passed to the mutation (NOTE: we can't pass other options at the moment) */\n mutationArguments?: MutationHookOptions<any>[\"variables\"];\n /** Callback run before submitting. Can optionnaly return mutationArguments that will override current ones. */\n submitCallback?: (\n mutationArgumentsFromProps: MutationHookOptions<any>[\"variables\"]\n ) =>\n | void\n | { mutationArguments: MutationHookOptions<any>[\"variables\"] }\n | Promise<void | {\n mutationArguments: MutationHookOptions<any>[\"variables\"];\n }>;\n successCallback?: (res: any) => void | Promise<void>;\n errorCallback?: (err: any) => void | Promise<void>;\n /** Now isolated into their own object to avoid needed to explicitely pick/omit */\n loadingButtonProps?: LoadingButtonProps;\n /** Shortcut for loadingButtonProps.label */\n label?: string | React.ReactNode;\n}\nexport const MutationButton = (props: MutationButtonProps) => {\n const Components = useVulcanComponents();\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<any | undefined>();\n\n const {\n //mutationOptions,\n mutation,\n loadingButtonProps = {},\n label,\n } = props;\n let { mutationArguments } = props;\n const mutationAsNode =\n typeof mutation === \"string\"\n ? gql`\n ${mutation}\n `\n : mutation;\n const [mutationFunc] = useMutation(mutationAsNode);\n\n const handleClick = async (e) => {\n e.preventDefault();\n setLoading(true);\n setError(undefined);\n const {\n //mutationOptions,\n submitCallback,\n successCallback,\n errorCallback,\n } = props;\n //const mutationName = mutationOptions.name;\n //const mutation = this.props[mutationName];\n\n try {\n if (submitCallback) {\n const callbackReturn = await submitCallback(mutationArguments);\n if (callbackReturn && callbackReturn.mutationArguments) {\n mutationArguments = callbackReturn.mutationArguments;\n }\n }\n const result = await mutationFunc({ variables: mutationArguments });\n if (successCallback) {\n await successCallback(result);\n }\n } catch (error) {\n // TODO: may not work because the mutationFunc may not throw in case of error\n setError(error);\n if (errorCallback) {\n await errorCallback(error);\n }\n } finally {\n setLoading(false);\n }\n\n // mutation(mutationArguments)\n // .then(result => {\n // this.setState({ loading: false });\n // if (successCallback) {\n // successCallback(result);\n // }\n // })\n // .catch(error => {\n // this.setState({ loading: false });\n // if (errorCallback) {\n // errorCallback(error);\n // }\n // });\n };\n\n //const mutationName = this.props.mutationOptions.name;\n\n const loadingButton = (\n <Components.LoadingButton\n loading={loading}\n onClick={handleClick}\n label={label}\n {...loadingButtonProps}\n />\n );\n\n if (error) {\n return (\n <Components.TooltipTrigger trigger={loadingButton} defaultShow={true}>\n {error.message.replace(\"GraphQL error: \", \"\")}\n </Components.TooltipTrigger>\n );\n }\n return loadingButton;\n};\n","import { __assign } from \"tslib\";\nimport { parse } from 'graphql';\nvar docCache = new Map();\nvar fragmentSourceMap = new Map();\nvar printFragmentWarnings = true;\nvar experimentalFragmentVariables = false;\nfunction normalize(string) {\n return string.replace(/[\\s,]+/g, ' ').trim();\n}\nfunction cacheKeyFromLoc(loc) {\n return normalize(loc.source.body.substring(loc.start, loc.end));\n}\nfunction processFragments(ast) {\n var seenKeys = new Set();\n var definitions = [];\n ast.definitions.forEach(function (fragmentDefinition) {\n if (fragmentDefinition.kind === 'FragmentDefinition') {\n var fragmentName = fragmentDefinition.name.value;\n var sourceKey = cacheKeyFromLoc(fragmentDefinition.loc);\n var sourceKeySet = fragmentSourceMap.get(fragmentName);\n if (sourceKeySet && !sourceKeySet.has(sourceKey)) {\n if (printFragmentWarnings) {\n console.warn(\"Warning: fragment with name \" + fragmentName + \" already exists.\\n\"\n + \"graphql-tag enforces all fragment names across your application to be unique; read more about\\n\"\n + \"this in the docs: http://dev.apollodata.com/core/fragments.html#unique-names\");\n }\n }\n else if (!sourceKeySet) {\n fragmentSourceMap.set(fragmentName, sourceKeySet = new Set);\n }\n sourceKeySet.add(sourceKey);\n if (!seenKeys.has(sourceKey)) {\n seenKeys.add(sourceKey);\n definitions.push(fragmentDefinition);\n }\n }\n else {\n definitions.push(fragmentDefinition);\n }\n });\n return __assign(__assign({}, ast), { definitions: definitions });\n}\nfunction stripLoc(doc) {\n var workSet = new Set(doc.definitions);\n workSet.forEach(function (node) {\n if (node.loc)\n delete node.loc;\n Object.keys(node).forEach(function (key) {\n var value = node[key];\n if (value && typeof value === 'object') {\n workSet.add(value);\n }\n });\n });\n var loc = doc.loc;\n if (loc) {\n delete loc.startToken;\n delete loc.endToken;\n }\n return doc;\n}\nfunction parseDocument(source) {\n var cacheKey = normalize(source);\n if (!docCache.has(cacheKey)) {\n var parsed = parse(source, {\n experimentalFragmentVariables: experimentalFragmentVariables,\n allowLegacyFragmentVariables: experimentalFragmentVariables\n });\n if (!parsed || parsed.kind !== 'Document') {\n throw new Error('Not a valid GraphQL document.');\n }\n docCache.set(cacheKey, stripLoc(processFragments(parsed)));\n }\n return docCache.get(cacheKey);\n}\nexport function gql(literals) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (typeof literals === 'string') {\n literals = [literals];\n }\n var result = literals[0];\n args.forEach(function (arg, i) {\n if (arg && arg.kind === 'Document') {\n result += arg.loc.source.body;\n }\n else {\n result += arg;\n }\n result += literals[i + 1];\n });\n return parseDocument(result);\n}\nexport function resetCaches() {\n docCache.clear();\n fragmentSourceMap.clear();\n}\nexport function disableFragmentWarnings() {\n printFragmentWarnings = false;\n}\nexport function enableExperimentalFragmentVariables() {\n experimentalFragmentVariables = true;\n}\nexport function disableExperimentalFragmentVariables() {\n experimentalFragmentVariables = false;\n}\nvar extras = {\n gql: gql,\n resetCaches: resetCaches,\n disableFragmentWarnings: disableFragmentWarnings,\n enableExperimentalFragmentVariables: enableExperimentalFragmentVariables,\n disableExperimentalFragmentVariables: disableExperimentalFragmentVariables\n};\n(function (gql_1) {\n gql_1.gql = extras.gql, gql_1.resetCaches = extras.resetCaches, gql_1.disableFragmentWarnings = extras.disableFragmentWarnings, gql_1.enableExperimentalFragmentVariables = extras.enableExperimentalFragmentVariables, gql_1.disableExperimentalFragmentVariables = extras.disableExperimentalFragmentVariables;\n})(gql || (gql = {}));\ngql[\"default\"] = gql;\nexport default gql;\n//# sourceMappingURL=index.js.map","import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n __classPrivateFieldIn,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n __classPrivateFieldIn,\r\n};\r\n","// @see https://stackoverflow.com/questions/51835611/specify-specific-props-and-accept-general-html-props-in-typescript-react-app\nexport type ButtonProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLButtonElement>,\n HTMLButtonElement\n> &\n // The any is important here: we allow end-application to \"hack\" the component with a custom replacement implementation,\n // so we authorize them to pass additionnal unknown props\n any;\n","export * from \"./core/FormContext\";\nexport * from \"./core/Form\";\nexport * from \"./core/FormContainer\";\n\nexport type { FormInputProps, FormOption } from \"./typings\";\n\nexport * from \"./utils\";\n","import React, { useContext } from \"react\";\n\ninterface FormContextValue {\n addToDeletedValues: Function;\n addToFailureForm: Function;\n addToSubmitForm: Function;\n addToSuccessForm: Function;\n clearForm: Function;\n clearFormCallbacks: Function;\n clearFieldErrors: Function;\n currentValues: object;\n deletedValues: Array<any>;\n errors: Array<any>;\n getDocument: Function;\n getLabel: (fieldName: string, fieldLocale?: string) => string;\n initialDocument: object;\n isChanged: boolean;\n refetchForm: Function;\n // TODO: we deprecate this, it doesn't make sense to allow a child to setState this way\n // setFormState: Function;\n // FIXME: this type doesn't work, it doesn't necessarily have the event + it has to be defined\n submitForm: Function; //React.HTMLAttributes<HTMLFormElement>[\"onSubmit\"];\n throwError: Function;\n updateCurrentValues: Function;\n}\n\nexport const FormContext =\n React.createContext<FormContextValue | undefined>(undefined);\n\nexport const useFormContext = () => {\n const formContext = useContext(FormContext);\n if (!formContext)\n throw new Error(\n `A component is trying to access form context but it is undefined. Please wrap your component with a <Form>.\n You may be importing \"FormContext\" from different packages or have accidentaly made a copy of it?\n FormContext is exposed by \"@vulcanjs/react-ui\".`\n );\n return formContext;\n};\n","export * from \"./Form\";\nexport * from \"./typings\";\n","/*\n\nMain form component.\n\nThis component expects:\n\n### All Forms:\n\n- collection\n- currentUser\n- client (Apollo client)\n\n*/\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { runCallbacks, getErrors } from \"@vulcanjs/core\";\nimport { useIntlContext } from \"@vulcanjs/react-i18n\";\nimport { removeProperty } from \"@vulcanjs/utils\";\nimport _filter from \"lodash/filter.js\";\nimport cloneDeep from \"lodash/cloneDeep.js\";\nimport compact from \"lodash/compact.js\";\nimport get from \"lodash/get.js\";\nimport isObject from \"lodash/isObject.js\";\nimport mapValues from \"lodash/mapValues.js\";\nimport merge from \"lodash/merge.js\";\nimport omit from \"lodash/omit.js\";\nimport omitBy from \"lodash/omitBy.js\";\nimport pick from \"lodash/pick.js\";\nimport pickBy from \"lodash/pickBy.js\";\nimport set from \"lodash/set.js\";\nimport unset from \"lodash/unset.js\";\nimport update from \"lodash/update.js\";\nimport without from \"lodash/without.js\";\nimport isEmpty from \"lodash/isEmpty.js\";\n//import type { FormLayoutProps } from \"../../elements/FormLayout\";\n//import type { FormSubmitProps } from \"../../elements/FormSubmit\";\n\nimport {\n convertSchema,\n getEditableFields,\n getInsertableFields,\n} from \"../../utils/schema_utils\";\nimport { isEmptyValue } from \"../../utils/utils\";\nimport { getParentPath } from \"../../utils/path_utils\";\n// import withCollectionProps from \"./withCollectionProps\";\nimport { FormContext } from \"../FormContext\";\nimport { getFieldGroups, getFieldNames, getLabel } from \"./fields\";\nimport { isNotSameDocument } from \"./utils\";\nimport { useWarnOnUnsaved } from \"../../hooks/useWarnOnUnsaved\";\n\nimport type { FormType } from \"../../typings\";\nimport {\n CreateDocumentResult,\n FormProps,\n FormState,\n UpdateDocumentResult,\n} from \"./typings\";\nimport { MutationResult } from \"@apollo/client\";\nimport { useVulcanComponents } from \"../../../VulcanComponents/Consumer\";\n\n// props that should trigger a form reset\nconst RESET_PROPS = [\n \"model\",\n // \"collection\",\n // \"collectionName\",\n \"document\",\n \"schema\",\n \"currentUser\",\n \"fields\",\n \"removeFields\",\n \"prefilledProps\", // TODO: prefilledProps should be merged instead?\n];\n\nconst compactParent = (object, path) => {\n const parentPath = getParentPath(path);\n\n // note: we only want to compact arrays, not objects\n const compactIfArray = (x) => (Array.isArray(x) ? compact(x) : x);\n\n update(object, parentPath, compactIfArray);\n};\n\nconst getDefaultValues = (convertedSchema) => {\n // TODO: make this work with nested schemas, too\n return pickBy(\n mapValues(convertedSchema, (field) => field.defaultValue),\n (value) => value\n );\n};\n\nconst compactObject = (o) => omitBy(o, (f) => f === null || f === undefined);\n\nconst getInitialStateFromProps = (nextProps: FormProps): FormState => {\n const schema = nextProps.schema || nextProps.model.schema;\n const convertedSchema = convertSchema(schema);\n const formType: FormType = nextProps.document ? \"edit\" : \"new\";\n // for new document forms, add default values to initial document\n const defaultValues =\n formType === \"new\" ? getDefaultValues(convertedSchema) : {};\n // note: we remove null/undefined values from the loaded document so they don't overwrite possible prefilledProps\n const initialDocument = merge(\n {},\n defaultValues,\n nextProps.prefilledProps,\n compactObject(nextProps.document)\n );\n\n //if minCount is specified, go ahead and create empty nested documents\n Object.keys(convertedSchema).forEach((key) => {\n let minCount = convertedSchema[key].minCount;\n if (minCount) {\n initialDocument[key] = initialDocument[key] || [];\n while (initialDocument[key].length < minCount)\n initialDocument[key].push({});\n }\n });\n\n // remove all instances of the `__typename` property from document\n removeProperty(initialDocument, \"__typename\");\n\n return {\n disabled: nextProps.disabled,\n errors: [],\n deletedValues: [],\n currentValues: {},\n originalSchema: convertSchema(schema, { removeArrays: false }),\n // convert SimpleSchema schema into JSON object\n schema: convertedSchema,\n // Also store all field schemas (including nested schemas) in a flat structure\n flatSchema: convertSchema(schema, { flatten: true }),\n // the initial document passed as props\n initialDocument,\n // initialize the current document to be the same as the initial document\n currentDocument: initialDocument,\n };\n};\n\nconst getChildrenProps = (\n props: FormProps,\n state: Pick<FormState, \"disabled\" | \"currentDocument\">,\n options: { formType: FormType },\n // TODO: that belongs to the context instead\n callbacks: { deleteDocument: Function }\n): {\n formLayoutProps: any;//FormLayoutProps;\n formGroupProps: Function;\n commonProps: any;\n formSubmitProps: any;// FormSubmitProps;\n} => {\n const {\n currentUser,\n repeatErrors,\n submitLabel,\n cancelLabel,\n revertLabel,\n cancelCallback,\n revertCallback,\n id,\n model,\n prefilledProps,\n itemProperties,\n contextName,\n showRemove,\n showDelete,\n } = props;\n const { disabled, currentDocument } = state;\n const { formType } = options;\n const { deleteDocument } = callbacks;\n const commonProps = {\n document: currentDocument,\n formType,\n currentUser,\n disabled,\n prefilledProps,\n itemProperties,\n contextName,\n };\n\n const docClassName = `document-${formType}`;\n const modelName = model.name.toLowerCase();\n const formProps = {\n className: `${docClassName} ${docClassName}-${modelName}`,\n id: id,\n // It's the form element responsibility to get submitForm from context\n // onSubmit: this.submitForm(formType),\n // TODO: update to useRef\n //ref: (e) => {\n // this.form = e;\n //},\n };\n\n const formGroupProps = (group) => ({\n key: group.name,\n ...group,\n group: omit(group, [\"fields\"]),\n ...commonProps,\n });\n\n const formSubmitProps = {\n model,\n currentUser,\n submitLabel,\n cancelLabel,\n revertLabel,\n cancelCallback,\n revertCallback,\n document: currentDocument,\n // TODO: should probably be passed through context\n deleteDocument:\n (formType === \"edit\" && showRemove && showDelete && deleteDocument) ||\n null,\n };\n\n const formLayoutProps = {\n formProps: formProps,\n repeatErrors: repeatErrors,\n submitProps: formSubmitProps,\n commonProps,\n };\n return {\n commonProps,\n formSubmitProps,\n formGroupProps,\n formLayoutProps,\n };\n};\n\n// component form until we go stateless\nconst FormWarnUnsaved = ({\n isChanged,\n warnUnsavedChanges,\n children,\n}: {\n isChanged: boolean;\n warnUnsavedChanges?: boolean;\n children: React.ReactNode;\n}) => {\n useWarnOnUnsaved({\n isChanged,\n warnUnsavedChanges,\n });\n return <>{children}</>;\n};\n\n/*\n\n Like getDocument, but cross-reference with getFieldNames()\n to only return fields that actually need to be submitted\n\n Also remove any deleted values.\n\n */\nconst getData = (\n customArgs,\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"deletedValues\">,\n // previously from \"this\" object\n { submitFormCallbacks, form }: any\n) => {\n const { currentDocument } = state;\n const { model, prefilledProps } = props;\n // we want to keep prefilled data even for hidden/removed fields\n let data = prefilledProps || {};\n\n // omit prefilled props for nested fields\n data = omitBy(data, (value, key) => key.endsWith(\".$\"));\n\n const args = {\n schema: model.schema,\n excludeRemovedFields: false,\n excludeHiddenFields: false,\n replaceIntlFields: true,\n addExtraFields: false,\n ...customArgs,\n };\n\n // only keep relevant fields\n // for intl fields, make sure we look in foo_intl and not foo\n const fields = getFieldNames(props, currentDocument, args);\n data = { ...data, ...pick(currentDocument, ...fields) };\n\n // compact deleted values\n state.deletedValues.forEach((path) => {\n if (path.includes(\".\")) {\n /*\n\n If deleted field is a nested field, nested array, or nested array item, try to compact its parent array\n\n - Nested field: 'address.city'\n - Nested array: 'addresses.1'\n - Nested array item: 'addresses.1.city'\n\n */\n compactParent(data, path);\n }\n });\n\n // run data object through submitForm callbacks\n data = runCallbacks({\n callbacks: submitFormCallbacks,\n iterator: data,\n args: [\n {\n /*form: this*/\n },\n ],\n });\n\n return data;\n};\n\nexport const Form = (props: FormProps) => {\n const { initCallback, createDocument, updateDocument, deleteDocument } =\n props;\n const initialState = getInitialStateFromProps(props);\n const { schema, originalSchema, flatSchema, initialDocument } = initialState;\n const isFirstRender = useRef(true);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false; // toggle flag after first render/mounting\n return;\n }\n if (initCallback) initCallback(initialState.currentDocument);\n }, [initCallback]);\n const defaultProps = {\n layout: \"horizontal\",\n prefilledProps: {},\n repeatErrors: false,\n showRemove: true,\n showDelete: true,\n };\n const allProps = { ...defaultProps, ...props };\n const defaultValues = {};\n const submitFormCallbacks: Array<Function> = [];\n const successFormCallbacks: Array<Function> = [];\n const failureFormCallbacks: Array<Function> = [];\n const intl = useIntlContext();\n\n // --------------------------------------------------------------------- //\n // ------------------------------- Errors ------------------------------ //\n // --------------------------------------------------------------------- //\n\n /*\n\n Add error to form state\n\n Errors can have the following properties:\n - id: used as an internationalization key, for example `errors.required`\n - path: for field-specific errors, the path of the field with the issue\n - properties: additional data. Will be passed to vulcan-i18n as values\n - message: if id cannot be used as i81n key, message will be used\n\n */\n const [errors, setErrors] = useState<Array<any>>([]);\n const throwError = (error) => {\n let formErrors = getErrors(error);\n\n // eslint-disable-next-line no-console\n console.log(formErrors);\n\n // add error(s) to state\n setErrors((prevErrors) => [...prevErrors, ...formErrors]);\n };\n\n /*\n\n Clear errors for a field\n\n */\n const clearFieldErrors = (path) => {\n setErrors((prevErrors) =>\n prevErrors.filter((error) => error.path !== path)\n );\n };\n\n // --------------------------------------------------------------------- //\n // ------------------------------- Context ----------------------------- //\n // --------------------------------------------------------------------- //\n\n const [deletedValues, setDeletedValues] = useState<Array<any>>([]);\n\n // add something to deleted values\n const addToDeletedValues = (name) => {\n setDeletedValues((prevDeletedValues) => [...prevDeletedValues, name]);\n };\n\n interface Callbacks {\n submitFormCallbacks: Array<any>;\n successFormCallbacks: Array<any>;\n failureFormCallbacks: Array<any>;\n }\n const [callbacks, setCallbacks] = useState<Callbacks>({\n submitFormCallbacks: [],\n successFormCallbacks: [],\n failureFormCallbacks: [],\n });\n // add a callback to the form submission\n const addToSubmitForm = (callback) => {\n setCallbacks((cbs) => ({\n ...cbs,\n // submitFormCallbacks: [...cbs.submitFormCallbacks, callback],\n }));\n };\n\n // add a callback to form submission success\n const addToSuccessForm = (callback) => {\n setCallbacks((cbs) => ({\n ...cbs,\n successFormCallbacks: [...cbs.successFormCallbacks, callback],\n }));\n };\n\n // add a callback to form submission failure\n const addToFailureForm = (callback) => {\n setCallbacks((cbs) => ({\n ...cbs,\n failureFormCallbacks: [...cbs.failureFormCallbacks, callback],\n }));\n };\n\n const clearFormCallbacks = () => {\n setCallbacks({\n submitFormCallbacks: [],\n successFormCallbacks: [],\n failureFormCallbacks: [],\n });\n };\n\n /*\n setFormState = (fn) => {\n this.setState(fn);\n };\n */\n\n const [currentValues, setCurrentValues] = useState<Object>({});\n\n const submitFormContext = (formType: FormType) => (event /*newValues*/) => {\n /*\n TODO: previously this callback was updating the current values with new values after this call\n Need to check how this worked in Vulcan initially\n setCurrentValues((prevCurrentValues) => ({\n ...prevCurrentValues,\n ...newValues,\n }));\n */\n // TODO: previously, this was using a callback from setCurrentValues\n // this needs to be rearchitectured to work without, will need some check\n // https://stackoverflow.com/questions/56247433/how-to-use-setstate-callback-on-react-hooks\n submitForm(formType)(event);\n };\n\n // --------------------------------------------------------------------- //\n // ------------------------------ Lifecycle ---------------------------- //\n // --------------------------------------------------------------------- //\n\n /*\n\n When props change, reinitialize the form state\n Triggered only for data related props (collection, document, currentUser etc.)\n\n @see https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html\n\n */\n /*\n UNSAFE_componentWillReceiveProps(nextProps) {\n const needReset = !!RESET_PROPS.find(\n (prop) => !isEqual(this.props[prop], nextProps[prop])\n );\n if (needReset) {\n const newState = getInitialStateFromProps(nextProps);\n this.setState(newState);\n if (nextProps.initCallback)\n nextProps.initCallback(newState.currentDocument);\n }\n }*/\n\n const [currentDocument, setCurrentDocument] = useState<{\n title?: string;\n _id?: string;\n name?: string;\n }>(initialDocument);\n\n /*\n\n Manually update the current values of one or more fields(i.e. on change or blur).\n\n */\n const updateCurrentValues = (newValues, options: { mode?: string } = {}) => {\n // default to overwriting old value with new\n const { mode = \"overwrite\" } = options;\n const { changeCallback } = props;\n\n // keep the previous ones and extend (with possible replacement) with new ones\n // keep only the relevant properties\n const newState = {\n currentValues: cloneDeep(currentValues),\n currentDocument: cloneDeep(currentDocument),\n deletedValues: cloneDeep(deletedValues),\n };\n\n Object.keys(newValues).forEach((key) => {\n const path = key;\n let value = newValues[key];\n\n if (isEmptyValue(value)) {\n // delete value\n unset(newState.currentValues, path);\n set(newState.currentDocument, path, null);\n newState.deletedValues = [...newState.deletedValues, path];\n } else {\n // 1. update currentValues\n set(newState.currentValues, path, value);\n\n // 2. update currentDocument\n // For arrays and objects, give option to merge instead of overwrite\n if (mode === \"merge\" && (Array.isArray(value) || isObject(value))) {\n const oldValue = get(newState.currentDocument, path);\n set(newState.currentDocument, path, merge(oldValue, value));\n } else {\n set(newState.currentDocument, path, value);\n }\n\n // 3. in case value had previously been deleted, \"undelete\" it\n newState.deletedValues = without(newState.deletedValues, path);\n }\n });\n if (changeCallback) changeCallback(newState.currentDocument);\n\n // TODO: prefer a reducer\n setCurrentValues(newState.currentValues);\n setCurrentDocument(newState.currentDocument);\n setDeletedValues(newState.deletedValues);\n };\n\n /*\n\n Refetch the document from the database (in case it was updated by another process or to reset the form)\n\n */\n const refetchForm = () => {\n if (props.refetch) {\n props.refetch();\n }\n };\n\n const [disabled, setDisabled] = useState<boolean>(false); // TODO\n const [success, setSuccess] = useState<boolean>(false); // TODO\n /**\n * Clears form errors and values.\n *\n * @example Clear form\n * // form will be fully emptied, with exception of prefilled values\n * clearForm({ document: {} });\n *\n * @example Reset/revert form\n * // form will be reverted to its initial state\n * clearForm();\n *\n * @example Clear with new values\n * // form will be cleared but initialized with the new document\n * const document = {\n * // ... some values\n * };\n * clearForm({ document });\n *\n * @param {Object=} options\n * @param {Object=} options.document\n * Document to use as new initial document when values are cleared instead of\n * the existing one. Note that prefilled props will be merged\n */\n const clearForm = (options: { document?: any } = {}) => {\n const { document: optionsDocument } = options;\n const document = optionsDocument\n ? merge({}, props.prefilledProps, optionsDocument)\n : null;\n // TODO: prefer a reducer\n setErrors([]);\n setCurrentValues({});\n setDeletedValues([]);\n setCurrentDocument(document || initialDocument);\n // setInitialDocument(document || initialDocument);\n setDisabled(false);\n };\n\n const newMutationSuccessCallback = function <TModel = Object>(\n result: CreateDocumentResult<TModel>\n ) {\n mutationSuccessCallback(result, \"new\");\n };\n\n const editMutationSuccessCallback = function <TModel = Object>(\n result: UpdateDocumentResult<TModel>\n ) {\n mutationSuccessCallback(result, \"edit\");\n };\n\n const formRef = useRef(null);\n const mutationSuccessCallback = function <TModel = Object>(\n // must be called only on valid results\n result: CreateDocumentResult<TModel>,\n mutationType: FormType\n ) {\n // TODO: use a reducer\n setDisabled(false);\n setSuccess(true);\n // for new mutation, run refetch function if it exists\n // TODO: the create mutation should already return the freshest value, do we really need that?\n // instead we might want to update currentResult with the result of the creation\n if (mutationType === \"new\") refetchForm();\n let { document } = result;\n\n // call the clear form method (i.e. trigger setState) only if the form has not been unmounted\n // (we are in an async callback, everything can happen!)\n // TODO: this should rely on a ref\n if (formRef.current) {\n clearForm({\n document: mutationType === \"edit\" ? document : undefined,\n });\n }\n\n // run document through mutation success callbacks\n document = runCallbacks({\n callbacks: successFormCallbacks,\n iterator: document,\n args: [{ form: formRef.current }],\n });\n\n // run success callback if it exists\n if (props.successCallback) props.successCallback(document, { form: this });\n };\n\n // catch graphql errors\n const mutationErrorCallback = (document, error) => {\n setDisabled(false);\n\n // eslint-disable-next-line no-console\n console.error(\"// graphQL Error\");\n // eslint-disable-next-line no-console\n console.error(error);\n\n // run mutation failure callbacks on error, we do not allow the callbacks to change the error\n runCallbacks({\n callbacks: failureFormCallbacks,\n iterator: error,\n args: [{ error, form: formRef.current }],\n });\n\n if (!isEmpty(error)) {\n // add error to state\n throwError(error);\n }\n\n // run error callback if it exists\n if (props.errorCallback)\n props.errorCallback(document, error, { form: this });\n\n // scroll back up to show error messages\n // TODO: migrate this to scroll on top of the form\n //Utils.scrollIntoView(\".flash-message\");\n };\n\n /*\n\n Submit form handler\n\n */\n const submitForm = (formType: FormType) => async (event?: Event) => {\n event && event.preventDefault();\n event && event.stopPropagation();\n\n const { contextName } = props;\n\n // if form is disabled (there is already a submit handler running) don't do anything\n if (disabled) {\n return;\n }\n\n // clear errors and disable form while it's submitting\n setErrors([]);\n setDisabled(true);\n\n // complete the data with values from custom components\n // note: it follows the same logic as SmartForm's getDocument method\n let data = getData(\n { replaceIntlFields: true, addExtraFields: false, mutableFields },\n props,\n {\n currentDocument,\n deletedValues,\n },\n { form: formRef.current, submitFormCallbacks }\n );\n\n // if there's a submit callback, run it\n if (props.submitCallback) {\n data = props.submitCallback(data) || data;\n }\n\n if (formType === \"new\") {\n // create document form\n try {\n const result = await createDocument({\n input: {\n data,\n contextName,\n },\n });\n if (result.errors?.length) {\n // TODO: previously got from meta, we could have more than 1 error\n mutationErrorCallback(document, result.errors[0]);\n } else {\n newMutationSuccessCallback(result);\n }\n } catch (error) {\n mutationErrorCallback(document, error);\n }\n } else {\n // update document form\n try {\n const documentId = currentDocument._id;\n const result = await updateDocument({\n input: {\n id: documentId,\n data,\n contextName,\n },\n });\n // TODO: handle more than 1 error\n if (result.errors?.length) {\n mutationErrorCallback(document, result.errors[0]);\n } else {\n editMutationSuccessCallback(result);\n }\n } catch (error) {\n mutationErrorCallback(document, error);\n }\n }\n };\n\n /*\n\n Delete document handler\n\n */\n const deleteDocumentWithConfirm = () => {\n const document = currentDocument;\n const documentId = props.document._id;\n const documentTitle = document.title || document.name || \"\";\n\n const deleteDocumentConfirm = intl.formatMessage(\n { id: \"forms.delete_confirm\" },\n { title: documentTitle }\n );\n\n if (window.confirm(deleteDocumentConfirm)) {\n deleteDocument({ input: { id: documentId } })\n .then((mutationResult) => {\n // the mutation result looks like {data:{collectionRemove: null}} if succeeded\n if (props.removeSuccessCallback)\n props.removeSuccessCallback({ documentId, documentTitle });\n refetchForm();\n })\n .catch((error) => {\n // eslint-disable-next-line no-console\n console.log(error);\n });\n }\n };\n\n // --------------------------------------------------------------------- //\n // ------------------------- Props to Pass ----------------------------- //\n // --------------------------------------------------------------------- //\n\n // --------------------------------------------------------------------- //\n // ----------------------------- Render -------------------------------- //\n // --------------------------------------------------------------------- //\n\n const { successComponent, document, currentUser, model, warnUnsavedChanges } =\n props;\n const FormComponents = useVulcanComponents();\n\n const formType: \"edit\" | \"new\" = document ? \"edit\" : \"new\";\n\n // Fields computation\n const mutableFields =\n formType === \"edit\"\n ? getEditableFields(schema, currentUser, initialDocument)\n : getInsertableFields(schema, currentUser);\n\n const { formLayoutProps, formGroupProps } = getChildrenProps(\n props,\n { disabled, currentDocument },\n {\n formType,\n },\n {\n deleteDocument: deleteDocumentWithConfirm,\n }\n );\n const isChanged = isNotSameDocument(initialDocument, currentDocument);\n\n return success && successComponent ? (\n successComponent\n ) : (\n <FormWarnUnsaved\n isChanged={isChanged}\n warnUnsavedChanges={warnUnsavedChanges}\n >\n <FormContext.Provider\n value={{\n throwError,\n clearForm,\n refetchForm,\n isChanged,\n submitForm: submitFormContext(formType), //Change in name because we already have a function\n // called submitForm, but no reason for the user to know\n // about that\n addToDeletedValues: addToDeletedValues,\n updateCurrentValues: updateCurrentValues,\n getDocument: () => currentDocument,\n getLabel: (fieldName, fieldLocale) =>\n getLabel(model, flatSchema, intl, fieldName, fieldLocale),\n initialDocument: initialDocument,\n // TODO BAD: check where used\n //setFormState: this.setFormState,\n addToSubmitForm,\n addToSuccessForm,\n addToFailureForm,\n clearFormCallbacks,\n errors,\n currentValues,\n deletedValues,\n clearFieldErrors,\n }}\n >\n <FormComponents.FormLayout {...formLayoutProps}>\n {getFieldGroups(\n props,\n {\n currentDocument,\n schema,\n flatSchema,\n originalSchema,\n },\n intl,\n mutableFields,\n intl.formatMessage\n ).map((group, i) => (\n <FormComponents.FormGroup key={i} {...formGroupProps(group)} />\n ))}\n </FormComponents.FormLayout>\n </FormContext.Provider>\n </FormWarnUnsaved>\n );\n};\n\n// Mutation that yield a success result\ntype SuccessfulMutationResult<TData = Object> = MutationResult<TData> & {\n data: TData;\n};\n/**\n * Typeguared to allow considering the request as successful\n */\nconst isSuccessful = function <T = any>(\n result: MutationResult<T> | undefined\n): result is SuccessfulMutationResult<T> {\n return !!result?.data;\n};\n\nexport default Form;\n","/*\n * Schema converter/getters\n */\nimport { canCreateField, canUpdateField } from \"@vulcanjs/permissions\";\nimport { VulcanFieldSchema, VulcanSchema } from \"@vulcanjs/schema\";\nimport { getFieldType } from \"./utils\";\n\n/* getters */\n// filter out fields with \".\" or \"$\"\nexport const getValidFields = (schema) => {\n return Object.keys(schema).filter(\n (fieldName) => !fieldName.includes(\"$\") && !fieldName.includes(\".\")\n );\n};\n\n/*\n\nConvert a nested SimpleSchema schema into a JSON object\nIf flatten = true, will create a flat object instead of nested tree\n\n/* permissions */\n\n/**\n * @method Mongo.Collection.getInsertableFields\n * Get an array of all fields editable by a specific user for a given collection\n * @param {Object} user – the user for which to check field permissions\n */\nexport const getInsertableFields = function (schema, user) {\n const fields = Object.keys(schema).filter(function (fieldName) {\n var field = schema[fieldName];\n return canCreateField(user, field);\n });\n return fields;\n};\n\n/**\n * @method Mongo.Collection.getEditableFields\n * Get an array of all fields editable by a specific user for a given collection (and optionally document)\n * @param {Object} user – the user for which to check field permissions\n */\nexport const getEditableFields = function (schema, user, document) {\n const fields = Object.keys(schema).filter(function (fieldName) {\n var field = schema[fieldName];\n return canUpdateField(user, field, document);\n });\n return fields;\n};\n\nconst isNestedSchema = (schema: any): schema is VulcanSchema => {\n return typeof schema === \"object\";\n};\n\n/**\n * Vulcan Schema => Form Schema\n * TODO: type this better\n * @param schema\n * @param options\n * @returns\n */\nexport const convertSchema = (\n schema: VulcanSchema,\n options: { flatten?: boolean; removeArrays?: boolean } = {}\n) => {\n const { flatten = false, removeArrays = true } = options;\n\n let jsonSchema = {};\n\n Object.keys(schema).forEach((fieldName) => {\n // exclude array fields\n if (removeArrays && fieldName.includes(\"$\")) {\n return;\n }\n\n // extract schema\n jsonSchema[fieldName] = getFieldSchema(fieldName, schema);\n\n // check for existence of nested field\n // and get its schema if possible or its type otherwise\n const subSchemaOrType = getNestedFieldSchemaOrType(fieldName, schema);\n if (subSchemaOrType) {\n // remember the subschema if it exists, allow to customize labels for each group of items for arrays of objects\n jsonSchema[fieldName].arrayFieldSchema = getFieldSchema(\n `${fieldName}.$`,\n schema\n );\n\n // nested schema can be a field schema ({type, canRead, etc.}) (convertedSchema will be null)\n // or a schema on its own with subfields (convertedSchema will return smth)\n if (isNestedSchema(subSchemaOrType)) {\n // call convertSchema recursively on the subSchema\n const convertedSubSchema = convertSchema(subSchemaOrType, options);\n // subSchema is a full schema with multiple fields (eg array of objects)\n if (flatten) {\n jsonSchema = { ...jsonSchema, ...convertedSubSchema };\n } else {\n jsonSchema[fieldName].schema = convertedSubSchema;\n }\n } else {\n // subSchema is a simple field in this case (eg array of numbers)\n jsonSchema[fieldName].isSimpleArrayField = true; //getFieldSchema(`${fieldName}.$`, schema);\n }\n }\n });\n return jsonSchema;\n};\n\n/*\n\nGet a JSON object representing a field's schema\n\n*/\nexport const getFieldSchema = (fieldName: string, schema: VulcanSchema) => {\n let fieldSchema = {};\n schemaProperties.forEach((property) => {\n const propertyValue = schema[fieldName]?.[property];\n if (propertyValue) {\n fieldSchema[property] = propertyValue;\n }\n });\n return fieldSchema;\n};\n\n// type is an array due to the possibility of using SimpleSchema.oneOf\n// right now we support only fields with one type\nexport const getSchemaType = (fieldSchema: VulcanFieldSchema) =>\n getFieldType(fieldSchema);\n\nconst getArrayNestedSchema = (fieldName: string, schema: VulcanSchema) => {\n const arrayItemSchema = schema[`${fieldName}.$`];\n const nestedSchema = arrayItemSchema && getSchemaType(arrayItemSchema);\n return nestedSchema;\n};\n\n// TODO: not 100% it's valid with current implementation\nconst isNestedSchemaField = (fieldSchema: VulcanFieldSchema) => {\n const fieldType = getSchemaType(fieldSchema);\n return fieldType && typeof fieldType === \"object\";\n};\nconst getObjectNestedSchema = (fieldName: string, schema: VulcanSchema) => {\n const fieldSchema = schema[fieldName];\n if (!isNestedSchemaField(fieldSchema)) return null;\n const nestedSchema = fieldSchema && getSchemaType(fieldSchema);\n return nestedSchema;\n};\n/*\n\nGiven an array field, get its nested schema\nIf the field is not an object, this will return the subfield type instead\n*/\nexport const getNestedFieldSchemaOrType = (fieldName, schema) => {\n const arrayItemSchema = getArrayNestedSchema(fieldName, schema);\n if (!arrayItemSchema) {\n // look for an object schema\n const objectItemSchema = getObjectNestedSchema(fieldName, schema);\n // no schema was found\n if (!objectItemSchema) return null;\n return objectItemSchema;\n }\n return arrayItemSchema;\n};\n\nexport const schemaProperties = [\n \"type\",\n \"label\",\n \"optional\",\n \"required\",\n \"min\",\n \"max\",\n \"exclusiveMin\",\n \"exclusiveMax\",\n \"minCount\",\n \"maxCount\",\n \"allowedValues\",\n \"regEx\",\n \"blackbox\",\n \"trim\",\n \"custom\",\n \"defaultValue\",\n \"autoValue\",\n \"hidden\", // hidden: true means the field is never shown in a form no matter what\n \"mustComplete\", // mustComplete: true means the field is required to have a complete profile\n \"form\", // form placeholder\n \"inputProperties\", // form placeholder\n \"itemProperties\",\n \"control\", // SmartForm control (String or React component)\n \"input\", // SmartForm control (String or React component)\n \"autoform\", // legacy form placeholder; backward compatibility (not used anymore)\n \"order\", // position in the form\n \"group\", // form fieldset group\n \"onCreate\", // field insert callback\n \"onUpdate\", // field edit callback\n \"onDelete\", // field remove callback\n \"onInsert\", // OpenCRUD backwards compatibility\n \"onEdit\", // OpenCRUD backwards compatibility\n \"onRemove\", // OpenCRUD backwards compatibility\n \"canRead\",\n \"canCreate\",\n \"canUpdate\",\n \"viewableBy\", // OpenCRUD backwards compatibility\n \"insertableBy\", // OpenCRUD backwards compatibility\n \"editableBy\", // OpenCRUD backwards compatibility\n \"resolveAs\",\n \"searchable\",\n \"description\",\n \"beforeComponent\",\n \"afterComponent\",\n \"placeholder\",\n \"options\",\n \"query\",\n \"queryWaitsForValue\",\n \"autocompleteQuery\",\n \"fieldProperties\",\n \"intl\",\n \"intlId\",\n];\n\nexport const formProperties = [\n \"optional\",\n \"required\",\n \"min\",\n \"max\",\n \"exclusiveMin\",\n \"exclusiveMax\",\n \"minCount\",\n \"maxCount\",\n \"allowedValues\",\n \"regEx\",\n \"blackbox\",\n \"trim\",\n \"custom\",\n \"defaultValue\",\n \"autoValue\",\n \"mustComplete\", // mustComplete: true means the field is required to have a complete profile\n \"form\", // form placeholder\n \"inputProperties\", // form placeholder\n \"itemProperties\",\n \"control\", // SmartForm control (String or React component)\n \"input\", // SmartForm control (String or React component)\n \"order\", // position in the form\n \"group\", // form fieldset group\n \"description\",\n \"beforeComponent\",\n \"afterComponent\",\n \"placeholder\",\n \"options\",\n \"query\",\n \"queryWaitsForValue\",\n \"autocompleteQuery\",\n \"fieldProperties\",\n];\n","import merge from \"lodash/merge.js\";\nimport find from \"lodash/find.js\";\nimport isPlainObject from \"lodash/isPlainObject.js\";\nimport set from \"lodash/set.js\";\nimport size from \"lodash/size.js\";\n\nimport { removePrefix, filterPathsByPrefix } from \"./path_utils\";\nimport { VulcanFieldSchema } from \"@vulcanjs/schema\";\n\n// add support for nested properties\nexport const deepValue = function (obj, path) {\n const pathArray = path.split(\".\");\n\n for (var i = 0; i < pathArray.length; i++) {\n obj = obj[pathArray[i]];\n }\n\n return obj;\n};\n\n// see http://stackoverflow.com/questions/19098797/fastest-way-to-flatten-un-flatten-nested-json-objects\nexport const flatten = function (data) {\n var result = {};\n function recurse(cur, prop) {\n if (Object.prototype.toString.call(cur) !== \"[object Object]\") {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (var i = 0, l = cur.length; i < l; i++)\n recurse(cur[i], prop + \"[\" + i + \"]\");\n if (l == 0) result[prop] = [];\n } else {\n var isEmpty = true;\n for (var p in cur) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + \".\" + p : p);\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n recurse(data, \"\");\n return result;\n};\n\nexport const isEmptyValue = (value) =>\n typeof value === \"undefined\" ||\n value === null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0);\n\n/**\n * Merges values. It takes into account the current, original and deleted values,\n * and the merge produces the proper type for simple objects or arrays.\n *\n * @param {Object} props\n * Form component props. Only specific properties for this function are documented.\n * @param {*} props.currentValue\n * Current value of the field\n * @param {*} props.documentValue\n * Original value of the field\n * @return {*|undefined}\n * Merged value or undefined if no merge was performed\n */\nexport const mergeValue = ({\n currentValue,\n documentValue,\n deletedValues: deletedFields,\n path,\n locale,\n datatype,\n}) => {\n if (locale) {\n // note: intl fields are of type Object but should be treated as Strings\n return currentValue || documentValue || \"\";\n }\n\n // note: retrieve nested deleted values is performed here to avoid skipping\n // the merge in case the current field is not in `currentValues` but a nested\n // property has been removed directly by path\n const deletedValues = getNestedDeletedValues(path, deletedFields);\n const hasDeletedValues = !!size(deletedValues);\n if (\n (Array.isArray(currentValue) || hasDeletedValues) &&\n find(datatype, [\"type\", Array])\n ) {\n return merge([], documentValue, currentValue, deletedValues);\n } else if (\n (isPlainObject(currentValue) || hasDeletedValues) &&\n find(datatype, [\"type\", Object])\n ) {\n return merge({}, documentValue, currentValue, deletedValues);\n }\n return undefined;\n};\n\n/**\n * Converts a list of field names to an object of deleted values.\n *\n * @param {string[]|Object.<string|string>} deletedFields\n * List of deleted field names or paths\n * @param {Object|Array=} accumulator={}\n * Value to reduce the values to\n * @return {Object|Array}\n * Deleted values, with the structure defined by taking the received deleted\n * fields as paths\n * @example\n * const deletedFields = [\n * 'field.subField',\n * 'field.subFieldArray[0]',\n * 'fieldArray[0]',\n * 'fieldArray[2].name',\n * ];\n * getNestedDeletedValues(deletedFields);\n * // => { 'field': { 'subField': null, 'subFieldArray': [null] }, 'fieldArray': [null, undefined, { name: null } }\n */\nexport const getDeletedValues = (deletedFields, accumulator = {}) =>\n deletedFields.reduce(\n (deletedValues, path) => set(deletedValues, path, null),\n accumulator\n );\n\n/**\n * Filters the given field names by prefix, removes it from each one of them\n * and convert the list to an object of deleted values.\n *\n * @param {string=} prefix\n * Prefix to filter and remove from deleted fields\n * @param {string[]|Object.<string|string>} deletedFields\n * List of deleted field names or paths\n * @param {Object|Array=} accumulator={}\n * Value to reduce the values to\n * @return {Object.<string, null>}\n * Object keyed with the given deleted fields, valued with `null`\n * @example\n * const deletedFields = [\n * 'field.subField',\n * 'field.subFieldArray[0]',\n * 'fieldArray[0]',\n * 'fieldArray[2].name',\n * ];\n * getNestedDeletedValues('field', deletedFields);\n * // => { 'subField': null, 'subFieldArray': [null] }\n * getNestedDeletedValues('fieldArray', deletedFields);\n * // => { '0': null, '2': { 'name': null } }\n * getNestedDeletedValues('fieldArray', deletedFields, []);\n * // => [null, undefined, { 'name': null } ]\n */\nexport const getNestedDeletedValues = (\n prefix,\n deletedFields,\n accumulator = {}\n) =>\n getDeletedValues(\n removePrefix(prefix, filterPathsByPrefix(prefix, deletedFields)),\n accumulator\n );\n\n//TODO: check if it still works as expected\n// previously was dataType[0].type\nexport const getFieldType = (fieldSchema: VulcanFieldSchema) =>\n fieldSchema.type;\n/**\n * Get appropriate null value for various field types\n *\n * @param {Array} datatype\n * Field's datatype property\n */\nexport const getNullValue = (datatype) => {\n const fieldType = getFieldType(datatype);\n if (fieldType === Array) {\n return [];\n } else if (fieldType === Boolean) {\n return false;\n } else if (fieldType === String) {\n return \"\";\n } else if (fieldType === Number) {\n return \"\";\n } else {\n // normalize to null\n return null;\n }\n};\n","import toPath from \"lodash/toPath.js\";\nimport initial from \"lodash/initial.js\";\nimport flow from \"lodash/fp/flow.js\";\nimport takeRight from \"lodash/takeRight.js\";\n\n/**\n * Splits a path in string format into an array.\n */\nexport const splitPath = (string: string) => toPath(string);\n\n/**\n * Joins a path in array format into a string.\n */\nexport const joinPath = (array: Array<string | number>): string =>\n array.reduce<string>(\n (string, item) =>\n string +\n (Number.isNaN(Number(item))\n ? `${string === \"\" ? \"\" : \".\"}${item}`\n : `[${item}]`),\n \"\"\n );\n\n/**\n * Retrieves parent path from the given one.\n *\n * @param {String} string\n * Path in string format\n * @return {String}\n */\nexport const getParentPath = flow(splitPath, initial, joinPath);\n\n/**\n * Removes prefix from the given paths.\n *\n * @param {String} prefix\n * @param {String[]} paths\n * @return {String[]}\n */\nexport const removePrefix = (\n prefix: string,\n paths: Array<string>\n): Array<string> => {\n const explodedPrefix = splitPath(prefix);\n return paths.map((path) => {\n if (path === prefix) {\n return path;\n }\n const explodedPath = splitPath(path);\n const explodedSuffix = takeRight(\n explodedPath,\n explodedPath.length - explodedPrefix.length\n );\n return joinPath(explodedSuffix);\n });\n};\n\n/**\n * Filters paths that have the given prefix.\n *\n * @param {String} prefix\n * @param {String[]} paths\n * @return {String[]}\n */\nexport const filterPathsByPrefix = (prefix: string, paths: Array<string>) =>\n paths.filter(\n (path) =>\n path === prefix ||\n path.startsWith(`${prefix}.`) ||\n path.startsWith(`${prefix}[`)\n );\n","/**\n * Field processing functions that computes groups and add relevant props for i18n\n */\nimport { formProperties } from \"../../utils/schema_utils\";\nimport { FieldGroup } from \"@vulcanjs/schema\";\nimport { FormField } from \"../../typings\";\nimport { FormProps, FormState } from \"./typings\";\n\n/**\n * Field related functions\n */\n\nimport { VulcanSchema } from \"@vulcanjs/schema\";\nimport uniq from \"lodash/uniq.js\";\nimport compact from \"lodash/compact.js\";\nimport get from \"lodash/get.js\";\nimport pick from \"lodash/pick.js\";\nimport {\n isIntlField,\n formatLabel,\n getIntlKeys,\n getIntlLabel,\n} from \"@vulcanjs/i18n\";\n\nimport { IntlProviderContextValue } from \"@vulcanjs/react-i18n\";\nimport map from \"lodash/map.js\";\nimport sortBy from \"lodash/sortBy.js\";\nimport uniqBy from \"lodash/uniqBy.js\";\nimport difference from \"lodash/difference.js\";\nimport reject from \"lodash/reject.js\";\nimport intersection from \"lodash/intersection.js\";\nimport _filter from \"lodash/filter.js\";\nimport { capitalize } from \"@vulcanjs/utils\";\nimport { VulcanFieldSchema } from \"@vulcanjs/schema\";\nimport { VulcanModel } from \"@vulcanjs/model\";\n\n/*\n\n Get a field's intl keys (useful for debugging)\n\n */\nconst getModelIntlKeys = (\n model: VulcanModel,\n flatSchema: any,\n fieldName: string\n) => {\n return getIntlKeys({\n fieldName: fieldName,\n modelName: model.name,\n schema: flatSchema,\n });\n};\n\n/*\n\n Get a field's label\n\n */\nexport const getLabel = (\n model: VulcanModel,\n flatSchema: any,\n context: IntlProviderContextValue,\n fieldName: string,\n fieldLocale?: string\n) => {\n const collectionName = model.name.toLowerCase();\n const label = formatLabel({\n intl: context,\n fieldName: fieldName,\n collectionName: collectionName,\n schema: flatSchema,\n });\n if (fieldLocale) {\n const intlFieldLocale = context.formatMessage({\n id: `locales.${fieldLocale}`,\n defaultMessage: fieldLocale,\n });\n return `${label} (${intlFieldLocale})`;\n } else {\n return label;\n }\n};\n\n/*\n\n Get a field's description\n\n (Same as getLabel but pass isDescription: true )\n */\nconst getDescription = (\n model: VulcanModel,\n flatSchema: any,\n context: any,\n fieldName: string\n) => {\n const collectionName = model.name.toLowerCase();\n const description = getIntlLabel({\n intl: context,\n fieldName: fieldName,\n collectionName: collectionName,\n schema: flatSchema,\n isDescription: true,\n });\n return description || null;\n};\n\n/*\n\n Get a field option's label\n\n */\nconst getOptionLabel = (\n model: VulcanModel,\n context: { formatMessage: Function },\n fieldName: string,\n option: { intlId?: string; label: string; value?: any }\n) => {\n const collectionName = model.name.toLowerCase();\n const intlId =\n option.intlId || `${collectionName}.${fieldName}.${option.value}`;\n return context.formatMessage({\n id: intlId,\n defaultMessage: option.label,\n });\n};\n\n/*\n\n Get a list of the fields to be included in the current form\n\n Note: when submitting the form (getData()), do not include any extra fields.\n\n */\nexport const getFieldNames = (\n props: Pick<FormProps, \"fields\" | \"addFields\" | \"removeFields\">,\n currentDocument,\n optionsFromArgs: {\n excludeHiddenFields?: boolean;\n excludeRemovedFields?: boolean;\n replaceIntlFields?: boolean;\n addExtraFields?: boolean;\n schema?: VulcanSchema;\n mutableFields?: Array<any>;\n }\n) => {\n const { fields, addFields, removeFields } = props;\n const defaultOptions = {\n excludeHiddenFields: true,\n excludeRemovedFields: true,\n replaceIntlFields: false,\n addExtraFields: false,\n };\n const options = {\n ...defaultOptions,\n ...optionsFromArgs,\n };\n const {\n schema,\n mutableFields,\n excludeRemovedFields,\n excludeHiddenFields,\n addExtraFields,\n replaceIntlFields,\n } = options;\n\n // get all editable/insertable fields (depending on current form type)\n let relevantFields = mutableFields;\n\n // if \"fields\" prop is specified, restrict list of fields to it\n if (typeof fields !== \"undefined\" && fields.length > 0) {\n relevantFields = intersection(relevantFields, fields);\n }\n\n // if \"hideFields\" prop is specified, remove its fields\n if (excludeRemovedFields) {\n // OpenCRUD backwards compatibility\n //const removeFields = removeFields || hideFields;\n if (typeof removeFields !== \"undefined\" && removeFields.length > 0) {\n relevantFields = difference(relevantFields, removeFields);\n }\n }\n\n // if \"addFields\" prop is specified, add its fields\n if (\n addExtraFields &&\n typeof addFields !== \"undefined\" &&\n addFields.length > 0\n ) {\n relevantFields = relevantFields?.concat(addFields);\n }\n\n // remove all hidden fields\n if (excludeHiddenFields) {\n const document = currentDocument;\n relevantFields = reject(relevantFields, (fieldName) => {\n const hidden = schema?.[fieldName].hidden;\n return typeof hidden === \"function\"\n ? hidden({ props, document })\n : hidden;\n });\n }\n\n // replace intl fields\n if (replaceIntlFields) {\n relevantFields = relevantFields?.map((fieldName) =>\n isIntlField(schema?.[fieldName]) ? `${fieldName}_intl` : fieldName\n );\n }\n\n // remove any duplicates\n relevantFields = uniq(relevantFields);\n\n return relevantFields;\n};\n\n// --------------------------------------------------------------------- //\n// -------------------------------- Fields ----------------------------- //\n// --------------------------------------------------------------------- //\n\nconst initField = (\n props: { model: VulcanModel; layout?: \"horizontal\" | \"vertical\" },\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n fieldName: string,\n fieldSchema: VulcanFieldSchema\n) => {\n const { model } = props;\n const { currentDocument, flatSchema } = state;\n const isArray = fieldSchema.type === Array;\n\n // intialize properties\n let field: Partial<FormField> = {\n ...pick(fieldSchema, formProperties),\n name: fieldName,\n datatype: fieldSchema.type,\n layout: props.layout, // A layout property used to control how the form fields are displayed. Defaults to horizontal.\n input: fieldSchema.input || fieldSchema.control, // TODO\n };\n\n // if this is an array field also store its array item type\n if (isArray) {\n const itemFieldSchema = state.originalSchema[`${fieldName}.$`];\n field.itemDatatype = get(itemFieldSchema, \"type.0.type\");\n }\n\n field.label = getLabel(model, flatSchema, context, fieldName);\n field.intlKeys = getIntlKeys({\n fieldName,\n modelName: model.name,\n schema: model.schema,\n });\n // // replace value by prefilled value if value is empty\n // const prefill = fieldSchema.prefill || (fieldSchema.form && fieldSchema.form.prefill);\n // if (prefill) {\n // const prefilledValue = typeof prefill === 'function' ? prefill.call(fieldSchema) : prefill;\n // if (!!prefilledValue && !field.value) {\n // field.prefilledValue = prefilledValue;\n // field.value = prefilledValue;\n // }\n // }\n\n const document = currentDocument;\n field.document = document;\n\n // internationalize field options labels\n if (field.options && Array.isArray(field.options)) {\n field.options = field.options.map((option) => ({\n ...option,\n label: getOptionLabel(model, context, fieldName, option),\n }));\n }\n\n // if this an intl'd field, use a special intlInput\n if (isIntlField(fieldSchema)) {\n field.intlInput = true;\n }\n\n // add any properties specified in fieldSchema.form as extra props passed on\n // to the form component, calling them if they are functions\n const inputProperties = fieldSchema.form || fieldSchema.inputProperties || {};\n for (const prop in inputProperties) {\n const property = inputProperties[prop];\n field[prop] =\n typeof property === \"function\"\n ? property.call(fieldSchema, {\n ...props,\n fieldName,\n document,\n intl: context,\n })\n : property;\n }\n\n // add description as help prop\n const description = getDescription(model, flatSchema, context, fieldName);\n if (description) {\n field.help = description;\n }\n\n return field as FormField;\n};\nconst handleFieldPath = (\n field: FormField,\n fieldName: string,\n parentPath?: string\n) => {\n const fieldPath = parentPath ? `${parentPath}.${fieldName}` : fieldName;\n field.path = fieldPath;\n // TODO: reintroduce this side effect to correctly set the default values\n // (previously was in Form.tsx)\n // Note sure if this is actually needed\n // if (field.defaultValue) {\n // set(this.defaultValues, fieldPath, field.defaultValue);\n // }\n return field;\n};\nconst handleFieldParent = (field: FormField, parentFieldName?: string) => {\n // if field has a parent field, pass it on\n if (parentFieldName) {\n field.parentFieldName = parentFieldName;\n }\n\n return field;\n};\nconst handlePermissions = (\n field: FormField,\n fieldName: string,\n mutableFields: Array<any>\n) => {\n // if field is not creatable/updatable, disable it\n if (!mutableFields.includes(fieldName)) {\n field.disabled = true;\n }\n return field;\n};\nconst handleFieldChildren = (\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n field: FormField,\n fieldName: string,\n fieldSchema: any, // TODO: not a VulcanField, more a FormField\n schema: VulcanSchema,\n mutableFields: Array<any>\n) => {\n const { currentDocument } = state;\n // array field\n if (fieldSchema.arrayFieldSchema) {\n field.arrayFieldSchema = fieldSchema.arrayFieldSchema;\n // create a field that can be exploited by the form\n field.arrayField = createArraySubField(\n props,\n state,\n context,\n fieldName,\n field.arrayFieldSchema,\n schema,\n mutableFields\n );\n //field.nestedInput = true\n }\n // nested fields: set input to \"nested\"\n if (fieldSchema.schema) {\n field.nestedSchema = fieldSchema.schema;\n field.nestedInput = true;\n\n // get nested schema\n // for each nested field, get field object by calling createField recursively\n field.nestedFields = getFieldNames(props, currentDocument, {\n schema: field.nestedSchema,\n addExtraFields: false,\n }).map((subFieldName) => {\n return createField(\n props,\n state,\n context,\n subFieldName,\n field.nestedSchema,\n mutableFields,\n fieldName,\n field.path\n );\n });\n }\n return field;\n};\n\n/*\n Given a field's name, the containing schema, and parent, create the\n complete field object to be passed to the component\n\n */\nconst createField = (\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n fieldName: string,\n schema: any,\n mutableFields: Array<any>,\n parentFieldName?: string,\n parentPath?: string\n): FormField => {\n const fieldSchema = schema[fieldName];\n let field = initField(props, state, context, fieldName, fieldSchema);\n field = handleFieldPath(field, fieldName, parentPath);\n field = handleFieldParent(field, parentFieldName);\n field = handlePermissions(field, fieldName, mutableFields);\n field = handleFieldChildren(\n props,\n state,\n context,\n field,\n fieldName,\n fieldSchema,\n schema,\n mutableFields\n );\n return field;\n};\nconst createArraySubField = (\n props: FormProps,\n state: Pick<FormState, \"currentDocument\" | \"flatSchema\" | \"originalSchema\">,\n context: any,\n fieldName: string,\n subFieldSchema: VulcanFieldSchema,\n schema: VulcanSchema,\n mutableFields: Array<string>\n) => {\n const subFieldName = `${fieldName}.$`;\n let subField = initField(props, state, context, subFieldName, subFieldSchema);\n // array subfield has the same path and permissions as its parent\n // so we use parent name (fieldName) and not subfieldName\n subField = handleFieldPath(subField, fieldName);\n subField = handlePermissions(subField, fieldName, mutableFields /*schema*/);\n // we do not allow nesting yet\n //subField = this.handleFieldChildren(field, fieldSchema)\n return subField;\n};\n\n// Group of multiple fields (obtained by parsing the whole schema)\ninterface GroupWithFields extends FieldGroup {\n fields: Array<FormField>;\n}\n\ntype FormSchemaState = Pick<\n FormState,\n \"currentDocument\" | \"schema\" | \"flatSchema\" | \"originalSchema\"\n>;\n\n/*\n\n Get all field groups\n\n */\nexport const getFieldGroups = (\n props: FormProps,\n state: FormSchemaState,\n context: IntlProviderContextValue,\n mutableFields: Array<string>,\n formatMessage: any\n) => {\n const { schema, currentDocument } = state;\n // build fields array by iterating over the list of field names\n let fields = getFieldNames(props, currentDocument, {\n mutableFields,\n schema,\n }).map((fieldName) => {\n // get schema for the current field\n return createField(props, state, context, fieldName, schema, mutableFields);\n });\n\n fields = sortBy(fields, \"order\");\n\n // get list of all unique groups (based on their name) used in current fields, remove \"empty\" group\n let groups = compact(uniqBy(map(fields, \"group\"), (g) => (g ? g.name : \"\")));\n\n // for each group, add relevant fields\n let groupsWithFields = groups.map((group) => {\n const label =\n group.label ||\n //this.context.formatMessage({ id: group.name }) ||\n capitalize(group.name);\n const groupFields = _filter<FormField>(fields, (field) => {\n return field.group && field.group.name === group.name;\n });\n const groupWithFields: GroupWithFields = {\n ...group,\n label,\n fields: groupFields,\n };\n return groupWithFields;\n });\n\n // add default group if necessary\n const defaultGroupFields = _filter(fields, (field) => !field.group);\n if (defaultGroupFields.length) {\n const defaultGroup: GroupWithFields = {\n name: \"default\",\n label: \"default\",\n order: 0,\n fields: defaultGroupFields,\n };\n groupsWithFields = [defaultGroup].concat(groupsWithFields);\n }\n\n // sort by order\n groupsWithFields = sortBy(groupsWithFields, \"order\");\n\n // console.log(groups);\n\n return groupsWithFields;\n};\n","import find from \"lodash/find.js\";\nimport isEqualWith from \"lodash/isEqualWith.js\";\nexport const isNotSameDocument = (initialDocument, changedDocument) => {\n const changedValue = find(changedDocument, (value, key, collection) => {\n return !isEqualWith(value, initialDocument[key], (objValue, othValue) => {\n if (!objValue && !othValue) return true;\n });\n });\n return typeof changedValue !== \"undefined\";\n};\n","export * from \"./useWarnOnUnsaved\";\n","import { useBlockTransition } from \"../useBlockTransition/useBlockTransition\";\nimport debug from \"debug\";\nimport { useIntlContext } from \"@vulcanjs/react-i18n\";\nconst debugTransitions = debug(\"vn:route-transitions\");\n\n/**\n * Can trigger an alert on unsaved changes\n *\n * Triggers event so you can also block SPA transition (implementation is NOT provided by this hook, you\n * need listeners whose implementation depends on your router (React Router, Next Router...), see block.ts)\n *\n * @see https://github.com/ReactTraining/history/blob/master/docs/blocking-transitions.md\n *\n * @param param0\n */\nexport const useWarnOnUnsaved = ({\n isChanged,\n warnUnsavedChanges,\n}: {\n isChanged: boolean;\n warnUnsavedChanges?: boolean;\n}) => {\n const context = useIntlContext();\n /**\n * To be passed to onbeforeunload event. The returned message will be displayed\n * by the prompt.\n *\n * see https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload\n * the message returned is actually ignored by most browsers and a default message 'Are you sure you want to leave this page? You might have unsaved changes' is displayed. See the Notes section on the mozilla docs above\n */\n const getBlockedMessage = (event?: BeforeUnloadEvent) => {\n debugTransitions(\"running handlePageLeave\", event);\n const message = context.formatMessage({\n id: \"forms.confirm_discard\",\n defaultMessage: \"Are you sure you want to discard your changes?\",\n });\n return message;\n };\n useBlockTransition({\n shouldBlock: !!(warnUnsavedChanges && isChanged),\n getBlockedMessage: getBlockedMessage,\n });\n};\n","import { useEffect, useRef } from \"react\";\nimport { block } from \"./block\";\nimport debug from \"debug\";\nconst debugTransitions = debug(\"vn:router-transitions\");\n\n/**\n * Can trigger an alert on unsaved changes\n *\n * Triggers event so you can also block SPA transition (implementation is NOT provided by this hook, you\n * need listeners whose implementation depends on your router (React Router, Next Router...), see block.ts)\n *\n * @see https://github.com/ReactTraining/history/blob/master/docs/blocking-transitions.md\n *\n * @param param0\n */\nexport const useBlockTransition = ({\n shouldBlock,\n getBlockedMessage,\n}: {\n shouldBlock: boolean;\n getBlockedMessage: (evt?: BeforeUnloadEvent) => string;\n}) => {\n // function to unblock the form\n const unblockRef = useRef<Function | undefined>();\n\n useEffect(() => {\n const isBlocking = !!unblockRef.current;\n debugTransitions(\n \"running effect\",\n \"should block\",\n shouldBlock,\n \"currently blocked\",\n isBlocking\n );\n\n const onUnblock = () => {\n debugTransitions(\"running unblock from effect\");\n if (!shouldBlock) {\n if (unblockRef.current) {\n unblockRef.current();\n }\n }\n };\n // block\n const onBlocked = (evt?: BeforeUnloadEvent): string => {\n const message = getBlockedMessage(evt);\n debugTransitions(\n \"user is being blocked after trying to leave the page, with message: \" +\n message\n );\n if (evt) {\n evt.returnValue = message;\n }\n return message;\n };\n if (shouldBlock) {\n debugTransitions(\n \"should block transition, setting up relevant event listener\"\n );\n unblockRef.current = block(onBlocked, onUnblock);\n }\n // unblock if not blocking anymore and was blocking previously\n if (!shouldBlock && isBlocking) {\n debugTransitions(\"should unblock (state has been reinitialized)\");\n if (unblockRef.current) {\n unblockRef.current();\n }\n }\n // trigger the potentially registered unblock function when component unmounts\n //return onUnblock;\n }, [shouldBlock]);\n};\n","import debug from \"debug\";\nconst debugTransitions = debug(\"vn:route-transition\");\nconst BeforeUnloadEventType = \"beforeunload\";\n/**\n * Event triggered when a warning on unsaved changes is necessary\n * The app should listen for this event to setup relevant blocking methods depending on the framework\n *\n * For instance with React Router:\n *\n * let unblock\n * window.addEventListener(\"blocktransition\", () => {\n * unblock = router.history.block(...)\n * })\n * window.addEventListener(\"unblocktransition\", () => {\n * unblock()\n * })\n *\n * For Next.js, you would do something similar\n * Check https://github.com/vercel/next.js/discussions/12348\n *\n */\nexport const BLOCK_TRANSITION_EVENT_TYPE = \"blocktransition\";\n/**\n * Called when blocking is not necessary anymore:\n * - there are no unsaved changes anymore\n * - user has confirmed they want to leave\n */\nexport const UNBLOCK_TRANSITION_EVENT_TYPE = \"unblocktransition\";\n/**\n * Intercepts the beforeunload event\n *\n * Code taken from React Router history feature\n * @see https://github.com/ReactTraining/history/blob/master/docs/blocking-transitions.md\n */\nfunction blockBeforeUnload(event: BeforeUnloadEvent) {\n // Cancel the event.\n event.preventDefault();\n // Chrome (and legacy IE) requires returnValue to be set.\n event.returnValue = \"\";\n}\n\n/**\n * Blocks transition\n *\n * /!\\ In order to catch SPA transition, you need to implement\n * an event listener in your own app.\n *\n *\n * @param onUnblock Callback to call on unblock, for custom behaviour\n * @returns A function to unblock the transition (eg if the form is back to\n * its original state)\n */\nexport const block = (\n setConfirmationMessage: (event?: BeforeUnloadEvent) => string,\n onUnblock?: Function\n) => {\n debugTransitions(\"running block function\");\n // trigger a block event, to be handled at the framework level\n // TODO: setConfirmationMessage should be passed as well\n const blockEvent = new Event(BLOCK_TRANSITION_EVENT_TYPE);\n window.dispatchEvent(blockEvent);\n // block at browser level\n window.addEventListener(BeforeUnloadEventType, blockBeforeUnload);\n window.addEventListener(BeforeUnloadEventType, setConfirmationMessage);\n // return an unblock function to cancel\n const unblock = () => {\n debugTransitions(\"running unblock function\");\n if (onUnblock) {\n debugTransitions(\"running user defined function\");\n onUnblock(); // callback from user land\n }\n // trigger an unblock event, to be handled at the framework level\n const unblockEvent = new Event(UNBLOCK_TRANSITION_EVENT_TYPE);\n window.dispatchEvent(unblockEvent);\n // remove the browser level events\n window.removeEventListener(BeforeUnloadEventType, blockBeforeUnload);\n window.removeEventListener(BeforeUnloadEventType, setConfirmationMessage);\n // unblock browser change\n // @ts-ignore\n window.onbeforeunload = undefined; //undefined instead of null to support IE\n };\n return unblock;\n};\n","import type {\n CreateVariables,\n UpdateVariables,\n DeleteVariables,\n} from \"@vulcanjs/crud\";\nimport { VulcanModel } from \"@vulcanjs/model\";\nimport { VulcanUser } from \"@vulcanjs/permissions\";\nimport { VulcanSchema } from \"@vulcanjs/schema\";\nimport { DocumentNode } from \"graphql\";\n\nexport interface FormState {\n schema: any;\n initialDocument: Object;\n currentDocument: Object;\n deletedValues: any;\n errors: any;\n currentValues: any;\n disabled: any;\n success?: any;\n flatSchema: any;\n originalSchema: any;\n}\n\n/**\n * Props that can be passed to the FormContainer (= SmartForm)\n * and will be passed down to the Form\n *\n * TODO: this might not be complete yet. We need to move relevant props from \"FormProps\" to this type,\n * based on current usage of the SmartForm in existing apps\n */\nexport interface PassedDownFormProps {\n itemProperties?: Object;\n showDelete?: boolean;\n /**\n * Disable the form\n */\n disabled?: boolean;\n /**\n * Will prevent leaving the page/unmounting the form on unsaved changes\n */\n warnUnsavedChanges?: boolean;\n /*A callback called on form submission on the form data. Can return the submitted data object as well.*/\n submitCallback?: (data) => any;\n /*A callback called on mutation success.*/\n successCallback?: (document, meta: { form: any }) => void;\n /*A callback called on mutation failure.*/\n errorCallback?: (document, error, meta: { form: any }) => void;\n\n // Fragments\n /**\n * A GraphQL fragment used to specify the data to fetch to populate edit forms.\n * If no fragment is passed, SmartForm will do its best to figure out what data to load based on the fields included in the form.\n *\n * Can be either a string or a DocumentNode (using \"gql\" tag)\n */\n queryFragment?: DocumentNode | string;\n /**\n * A GraphQL fragment used to specify the data to return once a mutation is complete.\n\nIf no fragment is passed, SmartForm will only return fields used in the form, but note that this might sometimes lead to discrepancies when compared with documents already loaded on the client.\n\nAn example would be a createdAt date added automatically on creation even though it’s not part of the actual form. If you’d like that field to be returned after the mutation, you can define a custom mutationFragment that includes it explicitly.\n\n * Can be either a string or a DocumentNode (using \"gql\" tag)\n*/\n mutationFragment?: DocumentNode | string;\n /** Force a query fragment name\n *\n * NOTE: needed only for string fragments\n * If you use a DocumentNode (with \"gql\" tag), it will be computed automatically\n *\n * @deprecated Prefer using DocumentNode fragment, using the gql tag\n */\n queryFragmentName?: string;\n /** Force a mutation fragment name\n *\n *NOTE: needed only for string fragments\n *If you use a DocumentNode (with \"gql\" tag), it will be computed automatically\n *\n * @deprecated Prefer using DocumentNode fragment, using the gql tag\n */\n mutationFragmentName?: string;\n}\n\nexport interface FormProps<TModel = { [key in string]: any }>\n extends PassedDownFormProps {\n /**\n * Function that retriggers data fetching in edit mode\n * Usually provided by the useSingle but could be any function\n */\n refetch?: () => void;\n /**\n * Document id in update mode\n */\n id?: string;\n /* The model in which to edit or insert a document. */\n model: VulcanModel;\n /** Passing directly a raw schema (TODO: model is still mandatory atm) */\n schema?: VulcanSchema;\n /**\n * Passing directly a document (TODO: not yet tested in the new version)\n */\n document?: any;\n /**\n * currentUser to check authorizations to update/create some fields\n */\n currentUser?: VulcanUser;\n addFields?: Array<string>;\n removeFields?: Array<string>;\n // deprecated\n //hideFields?: any;\n /**\n * Label so that graphql queries are contextualized\n */\n contextName?: string;\n // labels\n cancelLabel?: string;\n revertLabel?: string;\n //\n revertCallback?: Function;\n // TODO: probably should be removed\n successComponent?: any;\n /* Instead of passing collection you can pass the name of the collection.*/\n // collectionName?: string;\n /*If present, the document to edit. If not present, the form will be a “new document” form.*/\n documentId?: string;\n /*An array of field names, if you want to restrict the form to a specific set of fields.*/\n fields?: Array<keyof TModel>;\n /*The text inside the submit button of the form.*/\n submitLabel?: string;\n /*A layout property used to control how the form fields are displayed. Defaults to horizontal.*/\n layout?: \"horizontal\" | \"vertical\";\n /*Whether to show a “delete document” link on edit forms.*/\n showRemove?: boolean;\n /*A set of props used to prefill the form. */\n prefilledProps?: TModel & Object; // TODO: should it allow only fields from the Model or also additional fields?\n /*Whether to repeat validation errors at the bottom of the form.*/\n repeatErrors?: boolean;\n //Callbacks\n /** Callback ran on first render */\n initCallback?: Function;\n /*If a cancelCallback function is provided, a “cancel” link will be shown next to the form’s submit button and the callback will be called on click.*/\n cancelCallback?: (document) => void;\n /*A callback to call when a document is successfully removed (deleted).*/\n removeSuccessCallback?: (document) => void;\n\n /*A callback called a every change or blur event inside the form.*/\n changeCallback: (currentDocument) => void;\n\n // mutations from container\n // => replace the \"onSubmit\" of a normal form\n /**\n * The result is usually extracted from a graphql mutation\n * But we have a simplified abstracted API, so we could also use the Form without graphql\n */\n createDocument: <TModel = any>(\n createVars: CreateVariables\n ) => Promise<CreateDocumentResult<TModel>>;\n updateDocument: <TModel = any>(\n vars: UpdateVariables\n ) => Promise<UpdateDocumentResult<TModel>>;\n deleteDocument: (vars: DeleteVariables) => Promise<void>;\n // Other results from the Apollo query => should be ignored, in order to avoid dependency to graphql in the Form\n // instead the container is responsible for passing errors and stuff\n // createDocumentMeta?: { error?: any };\n // updateDocumentMeta?: { error?: any };\n // EXPERIMENTAL: allowing to manually set the form children\n children?: React.ReactNode;\n}\n\nexport interface CreateDocumentResult<TDocument = any> {\n document: TDocument;\n errors: Array<any>;\n}\n\nexport interface UpdateDocumentResult<TDocument = any> {\n document: TDocument;\n errors: Array<any>;\n}\n","/*\n\nFormContainer aka SmartForm\n\nChanges compared to Vulcan Meteor:\n\n- previously was named FormWrapper\n- accepts a model instead of collection\n- no queryFragmentName (resp. mutation name), instead you need to pass the fragment explicitely\n\nTechnically, this is a GraphqlSmartForm, while Form.tsx is the more\ngeneric SmartForm, or a \"ModelForm\".\n\n\n---\n\nGenerate the appropriate fragment for the current form, then\nwrap the main Form component with the necessary HoCs while passing\nthem the fragment.\n\nThis component is itself wrapped with:\n\n- withCurrentUser\n- withApollo (used to access the Apollo client for form pre-population)\n\nAnd wraps the Form component with:\n\n- withNew\n\nOr:\n\n- withSingle\n- withUpdate\n- withDelete\n\n(When wrapping with withSingle, withUpdate, and withDelete, a special Loader\ncomponent is also added to wait for withSingle's loading prop to be false)\n\n*/\nimport React, { useRef } from \"react\";\n// import // withCurrentUser,\n// Utils,\n// getFragment,\n//\"meteor/vulcan:core\";\nimport { DocumentNode } from \"@apollo/client\";\nimport gql from \"graphql-tag\";\n\nimport getFormFragments from \"../utils/formFragments\";\n// import { VulcanModel } from \"@vulcanjs/model\";\nimport { VulcanGraphqlModel, getFragmentName } from \"@vulcanjs/graphql\";\nimport type {\n CreateVariables,\n UpdateVariables,\n DeleteVariables,\n} from \"@vulcanjs/crud\";\nimport { capitalize } from \"@vulcanjs/utils\";\nimport {\n useSingle,\n useCreate,\n useUpdate,\n useDelete,\n UseSingleOptions,\n} from \"@vulcanjs/react-hooks\";\nimport { FetchResult } from \"@apollo/client\";\n// import { FormType } from \"./typings\";\nimport { debugVulcan } from \"@vulcanjs/utils\";\nimport { VulcanUser } from \"@vulcanjs/permissions\";\nimport { PassedDownFormProps } from \"./Form/typings\";\n// Be careful to import from the Consumer!\nimport { useVulcanComponents } from \"../../VulcanComponents/Consumer\";\nimport { useVulcanCurrentUser } from \"../../VulcanCurrentUser\";\nconst debugForm = debugVulcan(\"form\");\n\n// Mutation that yield a success result\ntype SuccessfulFetchResult<TData = Object> = FetchResult<TData> & {\n data: TData;\n};\n/**\n * Typeguared to allow considering the request as successful\n */\nconst isSuccessful = function <T = any>(\n result: FetchResult<T> | undefined\n): result is SuccessfulFetchResult<T> {\n return !!result?.data;\n};\n\nexport interface FormContainerProps extends PassedDownFormProps {\n model: VulcanGraphqlModel;\n /** Document id for edition mode, will automatically fetch the document */\n documentId?: string;\n /** Slug (= human readable unique id) for edition mode, will automatically fetch the document */\n slug?: string;\n /**\n * List only those fields in the form\n */\n fields?: Array<string>;\n /**\n * List default fields + those additional fields as well\n */\n addFields?: Array<string>;\n /**\n * Force a currentUser, overriding the currentUser obtained\n * via Context\n *\n * If you use many forms in your app,\n * it might be better to set VulcanCurrentUserContext\n * at the top-level of your app\n * (eg in \"pages/_app.js\" for Next.js)\n */\n currentUser?: VulcanUser | null;\n loadingCurrentUser?: boolean;\n}\nexport type SmartFormProps = FormContainerProps;\n\nconst useFragments = (\n props: Pick<\n FormContainerProps,\n | \"mutationFragment\"\n | \"mutationFragmentName\"\n | \"queryFragment\"\n | \"queryFragmentName\"\n // for auto generation\n | \"model\"\n | \"fields\"\n | \"addFields\"\n >,\n formType: \"edit\" | \"new\"\n) => {\n // get fragment used to decide what data to load from the server to populate the form,\n // as well as what data to ask for as return value for the mutation\n // TODO: move out of the component\n //const getFragments = () => {\n let queryFragment: DocumentNode | undefined;\n let queryFragmentName: string | undefined;\n let mutationFragment: DocumentNode | undefined;\n let mutationFragmentName: string | undefined;\n\n // if queryFragment or mutationFragment props are specified, accept either fragment object or fragment string\n // TODO: not sure we actually need that, gApollo accepts fragments or string normally\n if (props.queryFragment) {\n if (typeof props.queryFragment === \"string\") {\n queryFragment = gql`\n ${props.queryFragment}\n `;\n if (!props.queryFragmentName)\n throw new Error(\n \"When using a string queryFragment, queryFragmentName is mandatory\"\n );\n queryFragmentName = props.queryFragmentName;\n } else {\n // DocumentNode\n queryFragment = props.queryFragment;\n // automatically compute the fragment name\n queryFragmentName =\n props.queryFragmentName || getFragmentName(props.queryFragment);\n }\n }\n if (props.mutationFragment) {\n if (typeof props.mutationFragment === \"string\") {\n mutationFragment = gql`\n ${props.mutationFragment}\n `;\n if (!props.mutationFragmentName)\n throw new Error(\n \"When using a string mutationFragment, mutationFragmentName is mandatory\"\n );\n queryFragmentName = props.mutationFragmentName;\n } else {\n // DocumentNode\n mutationFragment = props.mutationFragment;\n // automatically compute the fragment name\n mutationFragmentName =\n props.mutationFragmentName || getFragmentName(props.mutationFragment);\n }\n }\n // auto generate fragments\n let autoFormFragments;\n if (!props.queryFragment || !props.mutationFragment) {\n const { model, fields, addFields } = props;\n // autogenerated fragments\n autoFormFragments = getFormFragments({\n formType,\n model,\n fields,\n addFields,\n });\n }\n // use autogenerated value if necessary\n if (!props.queryFragment) {\n queryFragment = autoFormFragments.queryFragment;\n queryFragmentName = autoFormFragments.queryFragmentName;\n }\n if (!props.mutationFragment) {\n mutationFragment = autoFormFragments.mutationFragment;\n mutationFragmentName = autoFormFragments.mutationFragmentName;\n }\n return {\n mutationFragment: mutationFragment as DocumentNode,\n mutationFragmentName: mutationFragmentName as string,\n queryFragment: queryFragment as DocumentNode,\n queryFragmentName: queryFragmentName as string,\n };\n};\n// Fonctionnal version to be able to use hooks\nexport const FormContainer = (props: FormContainerProps) => {\n const {\n model,\n documentId,\n slug,\n fields,\n addFields,\n currentUser: currentUserFromProps,\n loadingCurrentUser: loadingCurrentUserFromProps,\n } = props;\n const { schema } = model;\n // if a document is being passed, this is an edit form\n const isEdit = documentId || slug;\n const selector = {\n documentId,\n slug,\n };\n const formType = isEdit ? \"edit\" : \"new\";\n const VulcanComponents = useVulcanComponents();\n\n // get query & mutation fragments from props or else default to same as generatedFragment\n //return {\n // queryFragment,\n // mutationFragment,\n //};\n //}\n\n const prefix = `${model.name}${capitalize(formType)}`;\n // props to pass on to child component (i.e. <Form />)\n const childProps = {\n formType,\n schema,\n };\n\n const {\n mutationFragment,\n mutationFragmentName,\n queryFragment,\n queryFragmentName,\n } = useFragments(props, formType);\n\n // options for useCreate, useUpdate and useDelete\n const mutationOptions = {\n model,\n // collection: this.props.collection,\n fragment: mutationFragment,\n fragmentName: mutationFragmentName,\n };\n\n const queryOptions: UseSingleOptions<any> = {\n model,\n // TODO: what this option does?\n // queryName: `${prefix}FormQuery`,\n fragment: queryFragment,\n fragmentName: queryFragmentName,\n // fragmentName?\n input: {\n id: documentId,\n enableCache: false,\n // TODO: support slug\n },\n queryOptions: {\n // we always want to load a fresh copy of the document\n fetchPolicy: \"network-only\" as \"network-only\", // cast is for fixing annoying TS issue... https://github.com/vuejs/vue-apollo/issues/936\n pollInterval: 0, // no polling, only load data once\n skip: formType === \"new\",\n },\n };\n /* debug\n console.log(\n \"MUT\",\n (mutationFragment as any).loc.source.body,\n mutationFragmentName\n );\n console.log(\n \"QUERY\",\n (queryFragment as any).loc.source.body,\n queryFragmentName\n );*/\n const { data, document, loading, refetch } = useSingle(queryOptions);\n if (formType !== \"new\") {\n debugForm(\n \"useSingle result\",\n \"data\",\n data,\n \"document\",\n document,\n \"loading\",\n loading\n );\n }\n // TODO: pass the creation functions down to the Form\n const [createDocument] = useCreate(mutationOptions);\n const [updateDocument] = useUpdate(mutationOptions);\n const [deleteDocument] = useDelete(mutationOptions);\n\n const {\n currentUser: currentUserFromContext,\n loading: loadingCurrentUserFromContext,\n } = useVulcanCurrentUser();\n const shouldGetCurrentUserFromProps =\n typeof currentUserFromProps !== \"undefined\";\n const currentUser = shouldGetCurrentUserFromProps\n ? currentUserFromProps\n : currentUserFromContext;\n const loadingCurrentUser = shouldGetCurrentUserFromProps\n ? loadingCurrentUserFromProps\n : loadingCurrentUserFromContext;\n\n // callbacks\n /*\n const formRef = useRef(null);\n const newMutationSuccessCallback = function <TData = Object>(\n result: SuccessfulFetchResult<TData>\n ) {\n getDocumentFromResult(result, \"new\");\n };\n const editMutationSuccessCallback = function <TData = Object>(\n result: SuccessfulFetchResult<TData>\n ) {\n getDocumentFromResult(result, \"edit\");\n };\n */\n\n /*\n The create hook already creates a document prop in a more stable way\n const getDocumentFromResult = function <TData = Object>(\n // must be called only on valid results\n result: SuccessfulFetchResult<TData> | undefined\n ) {\n if (!result) return undefined;\n // TODO: quite risky... we should have a better way to get the document\n let document = result.data[Object.keys(result.data)[0]].data; // document is always on first property\n\n return document;\n };*/\n // for new mutation, run refetch function if it exists\n /*\n if (mutationType === \"new\" && refetch) refetch();\n */\n\n const createAndReturnDocument = async (variables: CreateVariables) => {\n const result = await createDocument(variables);\n const { errors, document } = result;\n return {\n document,\n errors,\n };\n };\n const updateAndReturnDocument = async (variables: UpdateVariables) => {\n const result = await updateDocument(variables);\n const { errors, document } = result;\n return {\n document,\n errors,\n };\n };\n\n const deleteDocumentAndRefetch = async (variables: DeleteVariables) => {\n await deleteDocument(variables as any);\n };\n\n if (isEdit && loading) {\n return <VulcanComponents.Loading />;\n }\n return (\n <VulcanComponents.Form\n document={document}\n loading={loading || loadingCurrentUser}\n createDocument={createAndReturnDocument /*createDocument*/}\n updateDocument={updateAndReturnDocument}\n deleteDocument={deleteDocumentAndRefetch}\n refetch={refetch}\n currentUser={currentUser}\n {...childProps}\n {...props}\n />\n );\n};\n\n/*\nFormContainer.propTypes = {\n // main options\n documentId: PropTypes.string, // if a document is passed, this will be an edit form\n mutationFragment: PropTypes.object,\n mutationFragmentName: PropTypes.string,\n\n // graphQL\n // createFoo, deleteFoo, updateFoo\n // newMutation: PropTypes.func, // the new mutation\n // editMutation: PropTypes.func, // the edit mutation\n // removeMutation: PropTypes.func, // the remove mutation\n\n // form\n prefilledProps: PropTypes.object,\n layout: PropTypes.string,\n fields: PropTypes.arrayOf(PropTypes.string),\n hideFields: PropTypes.arrayOf(PropTypes.string),\n addFields: PropTypes.arrayOf(PropTypes.string),\n showRemove: PropTypes.bool,\n submitLabel: PropTypes.node,\n cancelLabel: PropTypes.node,\n revertLabel: PropTypes.node,\n repeatErrors: PropTypes.bool,\n warnUnsavedChanges: PropTypes.bool,\n formComponents: PropTypes.object,\n disabled: PropTypes.bool,\n itemProperties: PropTypes.object,\n successComponent: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n contextName: PropTypes.string,\n\n // callbacks\n ...callbackProps,\n\n currentUser: PropTypes.object,\n client: PropTypes.object,\n};\n\nFormContainer.defaultProps = {\n layout: \"horizontal\",\n};\n*/\n\n/*\nregisterComponent({\n name: 'SmartForm',\n component: FormContainer,\n hocs: [withCurrentUser, withApollo, withRouter, withCollectionProps],\n});\n*/\n\nexport const SmartForm = FormContainer;\n\nexport default FormContainer;\n","/**\n * Generate mutation and query fragments for a form based on the schema\n * TODO: refactor to mutualize more code with vulcan-core defaultFragment functions\n * TODO: move to lib when refactored\n */\nimport _uniq from \"lodash/uniq.js\";\nimport _intersection from \"lodash/intersection.js\";\nimport gql from \"graphql-tag\";\nimport {\n getCreateableFields,\n getUpdateableFields,\n getFragmentFieldNames,\n //isBlackbox,\n} from \"@vulcanjs/schema\";\nimport {\n getFieldFragment,\n VulcanGraphqlModel,\n //isBlackbox,\n} from \"@vulcanjs/graphql\";\nimport { capitalize } from \"@vulcanjs/utils\";\nimport type { FormType } from \"../typings\";\nimport compact from \"lodash/compact.js\";\n// getFieldFragment,\nconst intlSuffix = \"_intl\";\n\n// PostsEditFormQueryFragment/PostsNewFormMutationFragment/etc.\nconst getFragmentName = (\n formType: FormType,\n multiTypeName: string,\n fragmentType: \"mutation\" | \"query\"\n) =>\n [multiTypeName, formType, \"form\", fragmentType, \"fragment\"]\n .map(capitalize)\n .join(\"\");\n\n// get modifiable fields in the query either for update or create operations\nconst getQueryFieldNames = ({ schema, options }) => {\n const queryFields =\n options.formType === \"new\"\n ? getCreateableFields(schema)\n : getUpdateableFields(schema);\n return queryFields;\n};\n// add readable fields to mutation fields\nconst getMutationFieldNames = ({ readableFieldNames, queryFieldNames }) => {\n return _uniq(queryFieldNames.concat(readableFieldNames));\n};\n\n/*\nconst getFieldFragment = ({ schema, fieldName, options }) => {\n let fieldFragment = fieldName;\n const field = schema[fieldName];\n if (!(field && field.type)) return fieldName;\n const fieldType = field.type.singleType;\n const fieldTypeName =\n typeof fieldType === 'object'\n ? 'Object'\n : typeof fieldType === 'function'\n ? fieldType.name\n : fieldType;\n\n if (fieldName.slice(-5) === intlSuffix) {\n fieldFragment = `${fieldName}{ locale value }`;\n } else {\n switch (fieldTypeName) {\n // recursive call for nested arrays and objects\n case 'Object':\n if (!isBlackbox(field) && fieldType._schema) {\n fieldFragment =\n getSchemaFragment({\n fragmentName: fieldName,\n schema: fieldType._schema,\n options,\n }) || null;\n }\n break;\n case 'Array':\n const arrayItemFieldName = `${fieldName}.$`;\n const arrayItemField = schema[arrayItemFieldName];\n // note: make sure field has an associated array item field\n if (arrayItemField) {\n // child will either be native value or a an object (first case)\n const arrayItemFieldType = arrayItemField.type.singleType;\n if (!arrayItemField.blackbox && arrayItemFieldType._schema) {\n fieldFragment =\n getSchemaFragment({\n fragmentName: fieldName,\n schema: arrayItemFieldType._schema,\n options,\n }) || null;\n }\n }\n break;\n default:\n // handle intl or return fieldName\n fieldFragment = fieldName;\n break;\n }\n }\n return fieldFragment;\n};\n*/\n\n// get fragment for a whole schema (root schema or nested schema of an object or an array)\nconst getSchemaFragment = ({\n schema,\n fragmentName,\n options,\n fieldNames: providedFieldNames,\n}) => {\n // differentiate mutation/query and create/update cases\n // respect provided fieldNames if any (needed for the root schema)\n const fieldNames =\n providedFieldNames ||\n (options.isMutation\n ? getMutationFieldNames({\n queryFieldNames: getQueryFieldNames({ schema, options }),\n readableFieldNames: getFragmentFieldNames({\n schema,\n options: { onlyViewable: true },\n }),\n })\n : getQueryFieldNames({ schema, options }));\n\n const childFragments =\n fieldNames.length &&\n fieldNames\n .map((fieldName) =>\n getFieldFragment({\n schema,\n fieldName,\n options,\n getObjectFragment: getSchemaFragment, // allow to reuse the code from defaultFragment with another behaviour\n })\n )\n // remove empty values\n .filter((f) => !!f);\n if (childFragments.length) {\n return `${fragmentName} { ${childFragments.join(\"\\n\")} }`;\n }\n return null;\n};\n\n/**\n * Generate query and mutation fragments for forms, dynamically based on the selected fields\n */\nconst getFormFragments = ({\n formType = \"new\",\n model,\n fields, // restrict on certain fields\n addFields, // add additional fields (eg to display static fields)\n}: {\n model: VulcanGraphqlModel;\n formType: FormType;\n fields?: Array<string>; // restrict on certain fields\n addFields?: Array<string>; // add additional fields (eg to display static fields)\n}) => {\n const { schema, name, graphql } = model;\n const { typeName, multiTypeName } = graphql;\n // get the root schema fieldNames\n let queryFieldNames = getQueryFieldNames({ schema, options: { formType } });\n let mutationFieldNames = getMutationFieldNames({\n queryFieldNames,\n readableFieldNames: getFragmentFieldNames({\n schema,\n options: { onlyViewable: true },\n }),\n });\n\n // if \"fields\" prop is specified, restrict list of fields to it\n if (fields && fields?.length > 0) {\n // add \"_intl\" suffix to all fields in case some of them are intl fields\n const fieldsWithIntlSuffix = fields.map((field) => `${field}${intlSuffix}`);\n const allFields = [...fields, ...fieldsWithIntlSuffix];\n queryFieldNames = _intersection(queryFieldNames, allFields);\n mutationFieldNames = _intersection(mutationFieldNames, allFields);\n }\n\n // add \"addFields\" prop contents to list of fields\n if (addFields?.length) {\n queryFieldNames = queryFieldNames.concat(addFields);\n mutationFieldNames = mutationFieldNames.concat(addFields);\n }\n\n // userId is used to check for permissions, so add it to fragments if possible\n if (schema.userId) {\n queryFieldNames.unshift(\"userId\");\n mutationFieldNames.unshift(\"userId\");\n }\n\n if (schema._id) {\n queryFieldNames.unshift(\"_id\");\n mutationFieldNames.unshift(\"_id\");\n }\n\n // check unicity (_id can be added twice)\n queryFieldNames = _uniq(queryFieldNames);\n mutationFieldNames = _uniq(mutationFieldNames);\n\n if (queryFieldNames.length === 0)\n // NOTE: in theory, you could have no queriable fields, but mutable fields =>\n // a form for data that you can create but can never see...\n // Since that doesn't make much sense, we throw an error to secure the end user\n throw new Error(\n `Model \"${model.name}\" has no queryable fields, cannot create a form for it. Please add readable/createable/updateable fields to the model schema.`\n );\n if (mutationFieldNames.length === 0)\n throw new Error(\n `Model \"${model.name}\" has no mutable fields, cannot create a form for it. Please add createable/updateable fields to model schema.`\n );\n\n const queryFragmentName = getFragmentName(\n formType,\n multiTypeName, // previously collectionName //name,\n \"query\"\n );\n // generate query fragment based on the fields that can be edited. Note: always add _id, and userId if possible.\n // TODO: support nesting\n const queryFragmentText = getSchemaFragment({\n schema,\n fragmentName: `fragment ${queryFragmentName} on ${typeName}`,\n options: { formType, isMutation: false },\n fieldNames: queryFieldNames,\n });\n if (!queryFragmentText) {\n // NOTE: this should never happen if we don't have an empty array for field names\n throw new Error(\n `Model ${model.name} with fields ${queryFieldNames} yield an empty query fragment.`\n );\n }\n const generatedQueryFragment = gql(queryFragmentText);\n\n const mutationFragmentName = getFragmentName(\n formType,\n multiTypeName, // previously collectionName,\n \"mutation\"\n );\n const mutationFragmentText = getSchemaFragment({\n schema,\n fragmentName: `fragment ${mutationFragmentName} on ${typeName}`,\n options: { formType, isMutation: true },\n fieldNames: mutationFieldNames,\n });\n if (!mutationFragmentText) {\n // NOTE: this should never happen if we don't have an empty array for field names\n throw new Error(\n `Model ${model.name} with fields ${mutationFieldNames} yield an empty mutation fragment.`\n );\n }\n // generate mutation fragment based on the fields that can be edited and/or viewed. Note: always add _id, and userId if possible.\n // TODO: support nesting\n const generatedMutationFragment = gql(mutationFragmentText);\n\n // if any field specifies extra queries, add them\n const extraQueries = compact(\n getQueryFieldNames({ schema, options: { formType } }).map((fieldName) => {\n const field = schema[fieldName];\n return field.query;\n })\n );\n // get query & mutation fragments from props or else default to same as generatedFragment\n return {\n queryFragment: generatedQueryFragment,\n mutationFragment: generatedMutationFragment,\n queryFragmentName,\n mutationFragmentName,\n extraQueries,\n };\n};\n\nexport default getFormFragments;\n","export * from \"./Consumer\";\nexport * from \"./Provider\";\n","import { useContext } from \"react\";\nimport { VulcanCurrentUserContext } from \"./Context\";\n\nexport const VulcanCurrentUserConsumer = VulcanCurrentUserContext.Consumer;\n\nexport const useVulcanCurrentUser = () => useContext(VulcanCurrentUserContext);\n","import React from \"react\";\nimport type { VulcanUser } from \"@vulcanjs/permissions\";\n\nexport type VulcanCurrentUserContextType =\n | { currentUser: VulcanUser | null; loading: false }\n | { loading: true; currentUser: any };\n// We need this to shut TypeScript up\n// You should use the Provider to get the right default values\nexport const VulcanCurrentUserContext =\n React.createContext<VulcanCurrentUserContextType>({\n currentUser: null,\n loading: false,\n });\n","/**\n * NOTE: KEEP SEPARATED FROM THE HOOKS TO CONSUME THE CONTEXT\n * otherwise you'll end up with circular dependencies because of the default components\n */\n// TODO: we might need to adapt the provider to merge its value with a potentially higher up context\nimport React from \"react\";\n\nimport {\n VulcanCurrentUserContext,\n VulcanCurrentUserContextType,\n} from \"./Context\";\n\n// So that you can override only some components by adding an additional context while keeping the defaults\nexport const VulcanCurrentUserProvider = ({\n value,\n ...props\n}: {\n value: VulcanCurrentUserContextType;\n children: React.ReactNode;\n}) => (\n <VulcanCurrentUserContext.Provider\n value={value} // merge provided components so the user can provide only a partial replacement\n {...props}\n />\n);\n","export * as pathUtils from \"./path_utils\";\nexport * as utils from \"./utils\";\nexport * as schemaUtils from \"./schema_utils\";\nexport * as formFragmentsUtils from \"./formFragments\";\nexport * as uiUtils from \"./ui_utils\";\n","import pick from \"lodash/pick.js\";\n\n/**\n * Extract input props for the FormComponentInner\n * @param {*} props All component props\n * @returns Initial props + props specific to the HTML input in an inputProperties object\n */\nexport const getHtmlInputProps = (props) => {\n const { name, path, options, label, onChange, onBlur, value, disabled } =\n props;\n\n // these properties are whitelisted so that they can be safely passed to the actual form input\n // and avoid https://facebook.github.io/react/warnings/unknown-prop.html warnings\n const inputProperties = {\n ...props.inputProperties,\n name,\n path,\n options,\n label,\n onChange,\n onBlur,\n value,\n disabled,\n };\n\n return {\n ...props,\n inputProperties,\n };\n};\n\n/**\n * Extract input props for the FormComponentInner\n * @param {*} props All component props\n * @returns Initial props + props specific to the HTML input in an inputProperties object\n */\nexport const whitelistInputProps = (\n props: any\n): React.HTMLProps<HTMLInputElement> => {\n const whitelist = [\n \"name\",\n \"path\",\n \"options\",\n \"label\",\n \"onChange\",\n \"onBlur\",\n \"value\",\n \"disabled\",\n \"placeholder\",\n ];\n const value = props.value;\n let safeValue = value;\n // No null values in HTML inputs\n if (value === null) safeValue = undefined;\n // if value is null, return undefined\n return { ...pick(props, whitelist), value: safeValue };\n};\n","export * from \"./Provider\";\nexport * from \"./Context\";\nexport * from \"./Consumer\";\nexport * from \"./typings\";\n\nexport * from \"./defaultVulcanComponents\";\n","/**\n * NOTE: KEEP SEPARATED FROM THE HOOKS TO CONSUME THE CONTEXT\n * otherwise you'll end up with circular dependencies because of the default components\n */\n// TODO: we might need to adapt the provider to merge its value with a potentially higher up context\nimport React from \"react\";\n\nimport { PossibleVulcanComponents } from \"./typings\";\nimport { VulcanComponentsContext } from \"./Context\";\nimport { useVulcanComponents } from \"./Consumer\";\nimport { debugVulcan } from \"@vulcanjs/utils\";\nconst debugComponents = debugVulcan(\"components\"); //console.log;\n\n/**\n *\n * @param options.value An object of Vulcan components to be overriden.\n */\nexport const VulcanComponentsProvider = ({\n value,\n ...props\n}: {\n value?: Partial<PossibleVulcanComponents>;\n children: React.ReactNode;\n}) => {\n const currentComponents = useVulcanComponents();\n debugComponents(\n \"Current components __not_initialized?\",\n currentComponents.__not_initialized\n );\n const mergedComponents = {\n // merge with a parent Provider if needed\n ...(currentComponents?.__not_initialized ? {} : currentComponents || {}),\n ...(value || {}),\n };\n debugComponents(\"Merged components\", mergedComponents);\n // For preserving displayName, that is lost after build somehow\n Object.keys(mergedComponents).forEach((componentName) => {\n if (mergedComponents[componentName]) {\n mergedComponents[componentName].displayName = \"Vulcan.\" + componentName;\n } else {\n console.warn(`Encountered an undefined component: ${componentName}.\n The component may not be registered, or import failed.\n For instance due to an infinite import loop when importing\n \"useVulcanComponents\" from index instead of Consumer.`);\n }\n });\n return (\n <VulcanComponentsContext.Provider\n // We make the assumption that all components are there, user is responsible\n // for adding them correctly in the context where necessary\n value={mergedComponents as PossibleVulcanComponents} // merge provided components so the user can provide only a partial replacement\n {...props}\n />\n );\n};\n","import React from \"react\";\n\n// Creating a dependency with the raw\n// implemention is actually a bad idea\n// An \"any\" type is acceptable as long as we\n// do expose reusable hooks and\n// enough typings for common things, such as\n// \"FormInputProps\" or useFormContext, typings for some events and so on\n/*\n import type { FormSubmitProps } from \"../form/elements\";\n import type { ButtonProps } from \"../core/Button\";\n */\n// We keep this import because it barely have any HTML, you are\n// not supposed to restyle it in each package\n// import type { MutationButtonProps } from \"../MutationButton\";\n// datatable\n/*\nimport type {\n Datatable,\n DatatableAbove,\n DatatableAboveLayout,\n DatatableAboveLeft,\n DatatableAboveRight,\n DatatableAboveSearchInput,\n DatatableLayout,\n} from \"../Datatable/Datatable\";\nimport type {\n DatatableContents,\n DatatableContentsBodyLayout,\n DatatableContentsHeadLayout,\n DatatableContentsInnerLayout,\n DatatableContentsLayout,\n DatatableContentsMoreLayout,\n DatatableEmpty,\n DatatableLoadMoreButton,\n DatatableTitle,\n} from \"../Datatable/DatatableContents\";\nimport type {\n DatatableHeader,\n DatatableHeaderCellLayout,\n} from \"../Datatable/DatatableHeader\";\nimport type {\n DatatableRow,\n DatatableRowLayout,\n} from \"../Datatable/DatatableRow\";\nimport type {\n DatatableCell,\n DatatableCellLayout,\n DatatableDefaultCell,\n} from \"../Datatable/DatatableCell\";\nimport type {\n DatatableFilter,\n DatatableFilterBooleans,\n DatatableFilterCheckboxes,\n DatatableFilterContents,\n DatatableFilterContentsWithData,\n DatatableFilterDates,\n DatatableFilterNumbers,\n} from \"../Datatable/DatatableFilter\";\nimport type { DatatableSorter } from \"../Datatable/DatatableSorter\";\nimport type { DatatableSelect } from \"../Datatable/DatatableSelect\";\nimport type { DatatableSubmitSelected } from \"../Datatable/DatatableSubmitSelected\";\nimport type { EditButton, EditForm } from \"../Datatable/others/EditButton\";\nimport type { NewButton, NewForm } from \"../Datatable/others/NewButton\";\nimport type { DeleteButton } from \"../Datatable/others/DeleteButton\";\n*/\n//import type { BootstrapModal as Modal } from \"../bootstrap/Modal\";\n// Cell\n/*\nimport type { CardItemSwitcher } from \"../cell/CardItem\";\nimport type {\n CardItemRelationItem,\n DefaultCell,\n UserCell,\n} from \"../cell/CardItemRelationItem\";\nimport type { CardItemArray } from \"../cell/CardItemArray\";\nimport type { CardItemDate } from \"../cell/CardItemDate\";\nimport type { CardItemDefault } from \"../cell/CardItemDefault\";\nimport type { CardItemHTML } from \"../cell/CardItemHTML\";\nimport type { CardItemImage } from \"../cell/CardItemImage\";\nimport type { CardItemNumber } from \"../cell/CardItemNumber\";\nimport type { CardItemObject } from \"../cell/CardItemObject\";\nimport type { CardItemRelationHasMany } from \"../cell/CardItemRelationHasMany\";\nimport type { CardItemRelationHasOne } from \"../cell/CardItemRelationHasOne\";\nimport type { CardItemString } from \"../cell/CardItemString\";\nimport type { CardItemURL } from \"../cell/CardItemURL\";\n*/\n//import type { ModalTrigger } from \"../bootstrap/ModalTrigger\";\n//import type { FormOptionLabelProps } from \"../form/inputs/FormOptionLabel\";\n\nexport interface PossibleCoreComponents {\n Loading: any;\n FormattedMessage: any;\n Alert: any;\n Button: any; //React.ComponentType<ButtonProps>;\n Icon: any;\n // TODO: define props more precisely\n MutationButton: any; //React.ComponentType<MutationButtonProps>;\n LoadingButton: React.ComponentType<any>;\n HeadTags: React.ComponentType<any>;\n // Previously from Bootstrap and Mui\n TooltipTrigger: React.ComponentType<any>;\n Dropdown: React.ComponentType<any>;\n Modal: any; // typeof Modal;\n ModalTrigger: any; // typeof ModalTrigger;\n}\n// TODO: differentiate components that are provided out of the box and those that require a UI frameworK?\nexport interface PossibleFormComponents {\n FormError: any; // FieldErrors\n // From FormComponent\n FormComponentDefault: any;\n /** Alias of the default FormComponent */\n FormComponentText: any;\n FormComponentPassword: any;\n FormComponentNumber: any;\n FormComponentUrl: any;\n FormComponentEmail: any;\n FormComponentTextarea: any;\n FormComponentCheckbox: any;\n FormComponentCheckboxGroup: any;\n FormComponentRadioGroup: any;\n FormComponentSelect: any;\n FormComponentSelectMultiple: any;\n FormComponentDateTime: any;\n FormComponentDate: any;\n // FormComponentDate2: any;\n FormComponentTime: any;\n FormComponentStaticText: any;\n FormComponentLikert: any;\n FormComponentAutocomplete: any;\n FormComponentMultiAutocomplete: any;\n //\n FormComponent: any;\n FormComponentInner: any;\n FormComponentLoader: any;\n FormElement: any;\n FormGroup: any;\n FormGroupLayout: any;\n FormGroupHeader: any;\n // intl\n FormIntlLayout: any;\n FormIntlItemLayout: any;\n FormIntl: any;\n // Layout\n FormErrors: any;\n FormSubmit: any; //React.ComponentType<FormSubmitProps>;\n FormLayout: any;\n\n // arrays and objects\n FormNestedArray: any;\n FormNestedArrayInnerLayout: any;\n FormNestedArrayLayout: any;\n FormNestedItem: any;\n IconAdd: any;\n IconRemove: any;\n FieldErrors: any;\n FormNestedDivider: any;\n //\n FormNestedItemLayout: any;\n FormNestedObjectLayout: any;\n FormNestedObject: any;\n FormOptionLabel: any; //React.ComponentType<FormOptionLabelProps>;\n // Form\n Form: any;\n SmartForm: any;\n // Used by ui-boostrap and ui-material\n FormItem;\n // flag to detect parent state\n __not_initialized?: boolean;\n}\n\nexport interface DatatableComponents {\n Datatable: any; // typeof Datatable;\n // DatatableContents: any; // typeof DatatableContents\n DatatableAbove: any; // typeof DatatableAbove;\n DatatableAboveLayout: any; // typeof DatatableAboveLayout;\n DatatableAboveLeft: any; // typeof DatatableAboveLeft;\n DatatableAboveRight: any; // typeof DatatableAboveRight;\n DatatableAboveSearchInput: any; // typeof DatatableAboveSearchInput;\n DatatableLayout: any; // typeof DatatableLayout;\n // Contents\n DatatableContents: any; // typeof DatatableContents;\n DatatableContentsBodyLayout: any; // typeof DatatableContentsBodyLayout;\n DatatableContentsHeadLayout: any; // typeof DatatableContentsHeadLayout;\n DatatableContentsInnerLayout: any; // typeof DatatableContentsInnerLayout;\n DatatableContentsLayout: any; // typeof DatatableContentsLayout;\n DatatableContentsMoreLayout: any; // typeof DatatableContentsMoreLayout;\n DatatableEmpty: any; // typeof DatatableEmpty;\n DatatableLoadMoreButton: any; // typeof DatatableLoadMoreButton;\n DatatableTitle: any; // typeof DatatableTitle;\n // Header\n DatatableHeader: any; // typeof DatatableHeader;\n DatatableHeaderCellLayout: any; // typeof DatatableHeaderCellLayout;\n // Row\n DatatableRow: any; // typeof DatatableRow;\n DatatableRowLayout: any; // typeof DatatableRowLayout;\n // Cell\n DatatableCell: any; // typeof DatatableCell;\n DatatableCellLayout: any; // typeof DatatableCellLayout;\n DatatableDefaultCell: any; // typeof DatatableDefaultCell;\n // Filter\n DatatableFilter: any; // typeof DatatableFilter;\n DatatableFilterBooleans: any; // typeof DatatableFilterBooleans;\n DatatableFilterCheckboxes: any; // typeof DatatableFilterCheckboxes;\n DatatableFilterContents: any; // typeof DatatableFilterContents;\n DatatableFilterContentsWithData: any; // typeof DatatableFilterContentsWithData;\n DatatableFilterDates: any; // typeof DatatableFilterDates;\n DatatableFilterNumbers: any; // typeof DatatableFilterNumbers;\n // Sort\n DatatableSorter: any; // typeof DatatableSorter;\n // Select\n DatatableSelect: any; // typeof DatatableSelect;\n // SubmitSelect\n DatatableSubmitSelected: any; // typeof DatatableSubmitSelected;\n // Core\n EditButton: any; // typeof EditButton;\n EditForm: any; // typeof EditForm;\n NewButton: any; // typeof NewButton;\n NewForm: any; // typeof NewForm;\n DeleteButton: any; // typeof DeleteButton;\n}\n\nexport interface CellComponents {\n CardItemSwitcher: any; // typeof CardItemSwitcher;\n CardItem: any; // any; // typeof CardItemSwitcher;\n DefaultCell: any; // typeof DefaultCell;\n UserCell: any; // typeof UserCell;\n CardItemArray: any; // typeof CardItemArray;\n CardItemDate: any; // typeof CardItemDate;\n CardItemDefault: any; // typeof CardItemDefault;\n CardItemHTML: any; // typeof CardItemHTML;\n CardItemImage: any; // typeof CardItemImage;\n CardItemNumber: any; // typeof CardItemNumber;\n CardItemObject: any; // typeof CardItemObject;\n CardItemRelationHasMany: any; // typeof CardItemRelationHasMany;\n CardItemRelationHasOne: any; // typeof CardItemRelationHasOne;\n CardItemRelationItem: any; // typeof CardItemRelationItem;\n CardItemString: any; // typeof CardItemString;\n CardItemURL: any; // typeof CardItemURL;\n}\n\nexport type PossibleVulcanComponents = PossibleCoreComponents &\n PossibleFormComponents &\n DatatableComponents &\n CellComponents;\n","import { LoadingButton } from \"../../core/LoadingButton\";\nimport { MutationButton } from \"../../core/MutationButton\";\nimport { Form, FormContainer } from \"../../form/core\";\nimport { PossibleFormComponents } from \"../typings\";\n\nexport const defaultFormComponents: Partial<PossibleFormComponents> = {\n Form,\n SmartForm: FormContainer,\n};\n// All those components are defined in each relevant package instead\nexport const defaultDatatableComponents = {};\nexport const defaultCellComponents = {};\nexport const defaultCoreComponents = {\n MutationButton,\n LoadingButton,\n};\n","export * from \"./Form\";\nexport * from \"./FormContainer\";\nexport * from \"./FormContext\";\n","// import { compose } from \"recompose\";\nimport React from \"react\";\n\nexport const Components = {}; // will be populated on startup\nexport const ComponentsTable = {}; // storage for infos about components\n\nexport const coreComponents = [\n \"Alert\",\n \"Button\",\n \"Modal\",\n \"ModalTrigger\",\n \"Table\",\n \"FormComponentCheckbox\",\n \"FormComponentCheckboxGroup\",\n \"FormComponentDate\",\n \"FormComponentDate2\",\n \"FormComponentDateTime\",\n \"FormComponentDefault\",\n \"FormComponentText\",\n \"FormComponentEmail\",\n \"FormComponentNumber\",\n \"FormComponentRadioGroup\",\n \"FormComponentSelect\",\n \"FormComponentSelectMultiple\",\n \"FormComponentStaticText\",\n \"FormComponentTextarea\",\n \"FormComponentTime\",\n \"FormComponentUrl\",\n \"FormComponentInner\",\n \"FormControl\",\n \"FormElement\",\n];\n\n/**\n * Register a Vulcan component with a name, a raw component than can be extended\n * and one or more optional higher order components.\n *\n * @param {String} name The name of the component to register.\n * @param {Component} rawComponent Interchangeable/extendable react component.\n * @param {...(Function|Array)} hocs The HOCs to compose with the raw component.\n *\n * Note: when a component is registered without higher order component, `hocs` will be\n * an empty array, and it's ok!\n * See https://github.com/reactjs/redux/blob/master/src/compose.js#L13-L15\n *\n * @returns Structure of a component in the list:\n *\n * ComponentsTable.Foo = {\n * name: 'Foo',\n * hocs: [fn1, fn2],\n * rawComponent: React.Component,\n * call: () => compose(...hocs)(rawComponent),\n * }\n *\n */\n/*\nexport function registerComponent(name, rawComponent, ...hocs) {\n // support single-argument syntax\n if (typeof arguments[0] === \"object\") {\n // note: cannot use `const` because name, components, hocs are already defined\n // as arguments so destructuring cannot work\n // eslint-disable-next-line no-redeclare\n var {\n name,\n component,\n // @ts-ignore\n hocs = [],\n } = arguments[0];\n rawComponent = component;\n }\n // store the component in the table\n ComponentsTable[name] = {\n name,\n rawComponent,\n hocs,\n };\n}\n*/\n\n/**\n * Returns true if a component with the given name has been registered with\n * registerComponent(name, component, ...hocs).\n *\n * @param {String} name The name of the component to get.\n * @returns {Boolean}\n */\nexport const componentExists = (name) => {\n const component = ComponentsTable[name];\n return !!component;\n};\n\n/**\n * Get a component registered with registerComponent(name, component, ...hocs).\n *\n * @param {String} name The name of the component to get.\n * @returns {Function|React Component} A (wrapped) React component\n */\n/*\nexport const getComponent = (name) => {\n const component = ComponentsTable[name];\n if (!component) {\n throw new Error(`Component ${name} not registered.`);\n }\n if (component.hocs && component.hocs.length) {\n const hocs = component.hocs.map((hoc) => {\n if (!Array.isArray(hoc)) {\n if (typeof hoc !== \"function\") {\n throw new Error(\n `In registered component ${name}, an hoc is of type ${typeof hoc}`\n );\n }\n return hoc;\n }\n const [actualHoc, ...args] = hoc;\n if (typeof actualHoc !== \"function\") {\n throw new Error(\n `In registered component ${name}, an hoc is of type ${typeof actualHoc}`\n );\n }\n return actualHoc(...args);\n });\n return compose(...hocs)(component.rawComponent);\n } else {\n return component.rawComponent;\n }\n};\n*/\n\n/**\n * Populate the lookup table for components to be callable\n * ℹ️ Called once on app startup\n **/\n/*\nexport const populateComponentsApp = () => {\n const registeredComponents = Object.keys(ComponentsTable);\n\n // loop over each component in the list\n registeredComponents.map((name) => {\n // populate an entry in the lookup table\n Components[name] = getComponent(name);\n\n // uncomment for debug\n // console.log('init component:', name);\n });\n\n const missingComponents = difference(coreComponents, registeredComponents);\n\n if (missingComponents.length) {\n // eslint-disable-next-line no-console\n console.warn(\n `Found the following missing core components: ${missingComponents.join(\n \", \"\n )}. Include a UI package such as vulcan:ui-bootstrap to add them.`\n );\n }\n};\n*/\n/**\n * Get the **raw** (original) component registered with registerComponent\n * without the possible HOCs wrapping it.\n *\n * @param {String} name The name of the component to get.\n * @returns {Function|React Component} An interchangeable/extendable React component\n */\nexport const getRawComponent = (name) => {\n return ComponentsTable[name].rawComponent;\n};\n\n/**\n * Replace a Vulcan component with the same name with a new component or\n * an extension of the raw component and one or more optional higher order components.\n * This function keeps track of the previous HOCs and wrap the new HOCs around previous ones\n *\n * @param {String} name The name of the component to register.\n * @param {React Component} newComponent Interchangeable/extendable component.\n * @param {...Function} newHocs The HOCs to compose with the raw component.\n * @returns {Function|React Component} A component callable with Components[name]\n *\n * Note: when a component is registered without higher order component, `hocs` will be\n * an empty array, and it's ok!\n * See https://github.com/reactjs/redux/blob/master/src/compose.js#L13-L15\n */\n/*\nexport function replaceComponent(name, newComponent, ...newHocs) {\n // support single argument syntax\n if (typeof arguments[0] === \"object\") {\n // eslint-disable-next-line no-redeclare\n var { name, component, hocs = [] } = arguments[0];\n newComponent = component;\n newHocs = hocs;\n }\n\n const previousComponent = ComponentsTable[name];\n const previousHocs = (previousComponent && previousComponent.hocs) || [];\n\n if (!previousComponent) {\n // eslint-disable-next-line no-console\n console.warn(\n `Trying to replace non-registered component ${name}. The component is ` +\n \"being registered. If you were trying to replace a component defined by \" +\n \"another package, make sure that you haven't misspelled the name. Check \" +\n \"also if the original component is still being registered or that it \" +\n \"hasn't been renamed.\"\n );\n }\n\n return registerComponent(name, newComponent, ...newHocs, ...previousHocs);\n}\n*/\n\n/*\nexport const copyHoCs = (sourceComponent, targetComponent) => {\n return compose(...sourceComponent.hocs)(targetComponent);\n};\n*/\n\n/**\n * Returns an instance of the given component name of function\n * @param {string|function} component A component, the name of a component, or a react element\n * @param {Object} [props] Optional properties to pass to the component\n */\n//eslint-disable-next-line react/display-name\n// legacy\nexport const instantiateComponent = (\n component?: React.ComponentType | Function | any,\n props?: any\n) => {\n if (!component) {\n return null;\n } /*else if (typeof component === \"string\") {\n const Component = Components[component];\n return <Component {...props} />;\n } */ else if (React.isValidElement(component)) {\n return React.cloneElement(component, props);\n } else if (\n typeof component === \"function\" &&\n component.prototype &&\n component.prototype.isReactComponent\n ) {\n const Component = component as React.ComponentType<any>;\n return <Component {...props} />;\n } else if (typeof component === \"function\") {\n return component(props);\n } else if (\n typeof component === \"object\" &&\n component.$$typeof &&\n component.render\n ) {\n const Component = component as React.ComponentType<any>;\n return <Component {...props} />;\n } else {\n return component;\n }\n};\n\n/**\n * Creates a component that will render the registered component with the given name.\n *\n * This function may be useful when in need for some registered component, but in contexts\n * where they have not yet been initialized, for example at compile time execution. In other\n * words, when using `Components.ComponentName` is not allowed (because it has not yet been\n * populated, hence would be `undefined`), then `delayedComponent('ComponentName')` can be\n * used instead.\n *\n * @example Create a container for a registered component\n * // SomeContainer.js\n * import compose from 'recompose/compose';\n * import { delayedComponent } from 'meteor/vulcan:core';\n *\n * export default compose(\n * // ...some hocs with container logic\n * )(delayedComponent('ComponentName')); // cannot use Components.ComponentName in this context!\n *\n * @example {@link dynamicLoader}\n * @param {String} name Component name\n * @return {Function}\n * Functional component that will render the given registered component\n */\nexport const delayedComponent = (name) => {\n return (props) => {\n const Component = Components[name] || null;\n return Component && <Component {...props} />;\n };\n};\n\n// Example with Proxy (might be unstable/hard to reason about)\n//const mergeWithComponents = (myComponents = {}) => {\n// const handler = {\n// get: function(target, name) {\n// return name in target ? target[name] : Components[name];\n// }\n// };\n// const proxy = new Proxy(myComponents, handler);\n// return proxy;\n//};\nexport const mergeWithComponents = (myComponents) =>\n myComponents ? { ...Components, ...myComponents } : Components;\n"],"mappings":"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AAC9D,MAAI,CAAC,iBAAiB;AAEpB,UAAM,mBAAmB,sBAAsB,WAAW,MAAM;AAEhE,QAAI,CAAC;AAAkB,aAAO;AAC9B,WAAO;;AAET,SAAO;GATiC;AAYnC,IAAM,mBAAmB;EAC9B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGK,IAAM,iBAAiB;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;AGxPF;AAaA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA0BO,IAAM,WAAW,wBACtB,OACA,YACA,SACA,WACA,gBACG;AACH,QAAM,iBAAiB,MAAM,KAAK,YAAW;AAC7C,QAAM,QAAQ,YAAY;IACxB,MAAM;IACN;IACA;IACA,QAAQ;GACT;AACD,MAAI,aAAa;AACf,UAAM,kBAAkB,QAAQ,cAAc;MAC5C,IAAI,WAAW;MACf,gBAAgB;KACjB;AACD,WAAO,GAAG,UAAU;SACf;AACL,WAAO;;GArBa;AA+BxB,IAAM,iBAAiB,wBACrB,OACA,YACA,SACA,cACG;AACH,QAAM,iBAAiB,MAAM,KAAK,YAAW;AAC7C,QAAM,cAAc,aAAa;IAC/B,MAAM;IACN;IACA;IACA,QAAQ;IACR,eAAe;GAChB;AACD,SAAO,eAAe;GAdD;AAsBvB,IAAM,iBAAiB,wBACrB,OACA,SACA,WACA,WACG;AACH,QAAM,iBAAiB,MAAM,KAAK,YAAW;AAC7C,QAAM,SACJ,OAAO,UAAU,GAAG,kBAAkB,aAAa,OAAO;AAC5D,S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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vulcanjs/react-ui",
3
- "version": "0.6.8-alpha.1",
3
+ "version": "0.6.8-alpha.2",
4
4
  "description": "Vulcan UI components for React",
5
5
  "main": "./dist/index.js",
6
6
  "files": [
@@ -55,5 +55,5 @@
55
55
  "publishConfig": {
56
56
  "access": "public"
57
57
  },
58
- "gitHead": "e8354630506a35f831d620d9a99202835652c836"
58
+ "gitHead": "1d35936a726f75e13eb0f76767c00197775e4819"
59
59
  }