@bigbinary/neeto-templates-frontend 1.1.18 → 1.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var neetocist = require('neetocist');
6
+ var neetoCist = require('@bigbinary/neeto-cist');
7
7
  var neetoui = require('@bigbinary/neetoui');
8
8
  var PageLoader = require('@bigbinary/neeto-molecules/PageLoader');
9
9
  var Search = require('@bigbinary/neeto-molecules/Search');
@@ -60,31 +60,31 @@ function _arrayWithHoles(arr) {
60
60
  if (Array.isArray(arr)) return arr;
61
61
  }
62
62
 
63
- function _iterableToArrayLimit(arr, i) {
64
- var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
65
- if (null != _i) {
66
- var _s,
67
- _e,
68
- _x,
69
- _r,
70
- _arr = [],
71
- _n = !0,
72
- _d = !1;
63
+ function _iterableToArrayLimit(r, l) {
64
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
65
+ if (null != t) {
66
+ var e,
67
+ n,
68
+ i,
69
+ u,
70
+ a = [],
71
+ f = !0,
72
+ o = !1;
73
73
  try {
74
- if (_x = (_i = _i.call(arr)).next, 0 === i) {
75
- if (Object(_i) !== _i) return;
76
- _n = !1;
77
- } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);
78
- } catch (err) {
79
- _d = !0, _e = err;
74
+ if (i = (t = t.call(r)).next, 0 === l) {
75
+ if (Object(t) !== t) return;
76
+ f = !1;
77
+ } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
78
+ } catch (r) {
79
+ o = !0, n = r;
80
80
  } finally {
81
81
  try {
82
- if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return;
82
+ if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return;
83
83
  } finally {
84
- if (_d) throw _e;
84
+ if (o) throw n;
85
85
  }
86
86
  }
87
- return _arr;
87
+ return a;
88
88
  }
89
89
  }
90
90
 
@@ -125,14 +125,14 @@ var MENU_ITEMS = {
125
125
  PREVIEW: "preview"
126
126
  };
127
127
 
128
- function _typeof(obj) {
128
+ function _typeof(o) {
129
129
  "@babel/helpers - typeof";
130
130
 
131
- return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
132
- return typeof obj;
133
- } : function (obj) {
134
- return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
135
- }, _typeof(obj);
131
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
132
+ return typeof o;
133
+ } : function (o) {
134
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
135
+ }, _typeof(o);
136
136
  }
137
137
 
138
138
  function _toPrimitive(input, hint) {
@@ -2515,8 +2515,8 @@ var QUERY_KEYS = {
2515
2515
  TEMPLATE_TAGS: "template-tags"
2516
2516
  };
2517
2517
 
2518
- function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2519
- function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$3(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
2518
+ function ownKeys$3(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2519
+ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2520
2520
  var useFetchTemplates = function useFetchTemplates(_ref) {
2521
2521
  var searchTerm = _ref.searchTerm,
2522
2522
  category = _ref.category;
@@ -2554,7 +2554,7 @@ var useCreateTemplate = function useCreateTemplate(_ref3, options) {
2554
2554
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2555
2555
  args[_key] = arguments[_key];
2556
2556
  }
2557
- options === null || options === void 0 ? void 0 : options.onSuccess.apply(options, args);
2557
+ options === null || options === void 0 || options.onSuccess.apply(options, args);
2558
2558
  }
2559
2559
  }));
2560
2560
  };
@@ -2590,14 +2590,14 @@ var BlankCard = function BlankCard(_ref) {
2590
2590
  title = _ref.title,
2591
2591
  description = _ref.description,
2592
2592
  _ref$onClick = _ref.onClick,
2593
- onClick = _ref$onClick === void 0 ? neetocist.noop : _ref$onClick,
2593
+ onClick = _ref$onClick === void 0 ? neetoCist.noop : _ref$onClick,
2594
2594
  _ref$disabled = _ref.disabled,
2595
2595
  disabled = _ref$disabled === void 0 ? false : _ref$disabled;
2596
2596
  return /*#__PURE__*/React__default["default"].createElement("div", {
2597
2597
  className: "neeto-ui-rounded-lg neeto-ui-bg-white hover:neeto-ui-bg-white neeto-ui-border-primary-500 outline-none flex cursor-pointer flex-col items-center justify-center border border-dashed p-6 transition-all duration-300 ease-in-out hover:border-solid focus:border-solid",
2598
2598
  "data-cy": "start-from-scratch-button",
2599
2599
  tabIndex: 0,
2600
- onClick: !disabled ? onClick : neetocist.noop
2600
+ onClick: !disabled ? onClick : neetoCist.noop
2601
2601
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2602
2602
  className: "neeto-ui-text-primary-500 mb-4"
2603
2603
  }, /*#__PURE__*/React__default["default"].createElement(Icon, {
@@ -2724,8 +2724,8 @@ var CategoryItem = function CategoryItem(_ref) {
2724
2724
  }, /*#__PURE__*/React__default["default"].createElement("span", null, label), /*#__PURE__*/React__default["default"].createElement("span", null, count));
2725
2725
  };
2726
2726
 
2727
- function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2728
- function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
2727
+ function ownKeys$2(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2728
+ function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$2(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2729
2729
  var List = function List(_ref) {
2730
2730
  var setCurrentScreen = _ref.setCurrentScreen,
2731
2731
  setSelectedTemplate = _ref.setSelectedTemplate,
@@ -2782,7 +2782,7 @@ var List = function List(_ref) {
2782
2782
  return /*#__PURE__*/React__default["default"].createElement("div", {
2783
2783
  className: "neeto-ui-bg-gray-100 relative flex min-h-full items-start"
2784
2784
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2785
- className: "sticky left-0 top-0 w-80 flex-shrink-0 space-y-8 py-6 pl-16"
2785
+ className: "sticky left-0 top-0 w-52 flex-shrink-0 space-y-8 py-6 pl-4 md:w-72 md:pl-10 lg:w-80 xl:pl-16"
2786
2786
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2787
2787
  className: "space-y-4"
2788
2788
  }, /*#__PURE__*/React__default["default"].createElement("div", {
@@ -2800,7 +2800,8 @@ var List = function List(_ref) {
2800
2800
  placeholder: t("neetoTemplate.templates.search"),
2801
2801
  onSearch: function onSearch(value) {
2802
2802
  return setSearchTerm(value);
2803
- }
2803
+ },
2804
+ "data-cy": "template-search-input"
2804
2805
  })), /*#__PURE__*/React__default["default"].createElement("div", {
2805
2806
  className: "space-y-3"
2806
2807
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
@@ -2826,12 +2827,12 @@ var List = function List(_ref) {
2826
2827
  }
2827
2828
  });
2828
2829
  })))), /*#__PURE__*/React__default["default"].createElement("div", {
2829
- className: "overflow-y-auto px-16 py-6",
2830
+ className: "h-screen overflow-y-auto py-8 pl-5 pr-4 md:pl-8 md:pr-20 xl:px-20",
2830
2831
  ref: rootRef
2831
2832
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2832
2833
  className: "flex-grow space-y-6"
2833
2834
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2834
- className: "grid grid-cols-2 gap-6 md:grid-cols-3 2xl:grid-cols-4"
2835
+ className: "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 lg:gap-5 xl:gap-6 2xl:grid-cols-4"
2835
2836
  }, /*#__PURE__*/React__default["default"].createElement(BlankCard, {
2836
2837
  description: t("neetoTemplate.templates.blankCard.description"),
2837
2838
  disabled: isCreating,
@@ -2880,10 +2881,11 @@ var Preview$1 = function Preview(_ref) {
2880
2881
  return /*#__PURE__*/React__default["default"].createElement("div", {
2881
2882
  className: "m-auto flex h-full w-full max-w-5xl flex-col space-y-6 py-6"
2882
2883
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2883
- className: "flex items-center justify-between gap-6"
2884
+ className: "flex flex-col items-center justify-between gap-6 pl-4 pr-16 md:flex-row md:pr-20 xl:px-0"
2884
2885
  }, /*#__PURE__*/React__default["default"].createElement("div", {
2885
2886
  className: "flex min-w-0 flex-grow items-center gap-2"
2886
2887
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
2888
+ className: "flex-shrink-0",
2887
2889
  "data-cy": "preview-template-back-button",
2888
2890
  icon: neetoIcons.LeftArrow,
2889
2891
  style: "text",
@@ -2896,6 +2898,7 @@ var Preview$1 = function Preview(_ref) {
2896
2898
  style: "h2",
2897
2899
  weight: "semibold"
2898
2900
  }, title)), /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
2901
+ className: "flex-shrink-0",
2899
2902
  "data-cy": "preview-use-template-button",
2900
2903
  disabled: isCreating,
2901
2904
  label: t("neetoTemplate.templates.editTemplate"),
@@ -2916,9 +2919,9 @@ var CreateTemplateModal = function CreateTemplateModal(_ref) {
2916
2919
  isCreating = _ref.isCreating,
2917
2920
  refetchResource = _ref.refetchResource,
2918
2921
  _ref$onCreate = _ref.onCreate,
2919
- onCreate = _ref$onCreate === void 0 ? neetocist.noop : _ref$onCreate,
2922
+ onCreate = _ref$onCreate === void 0 ? neetoCist.noop : _ref$onCreate,
2920
2923
  _ref$afterCreate = _ref.afterCreate,
2921
- afterCreate = _ref$afterCreate === void 0 ? neetocist.noop : _ref$afterCreate;
2924
+ afterCreate = _ref$afterCreate === void 0 ? neetoCist.noop : _ref$afterCreate;
2922
2925
  var _useState = React.useState(TEMPLATE_SCREENS.LIST),
2923
2926
  _useState2 = _slicedToArray(_useState, 2),
2924
2927
  currentScreen = _useState2[0],
@@ -2969,8 +2972,8 @@ var templateTagsApi = {
2969
2972
  list: list
2970
2973
  };
2971
2974
 
2972
- function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2973
- function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
2975
+ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2976
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2974
2977
  var useCreateTemplateTag = function useCreateTemplateTag(options) {
2975
2978
  var queryClient = reactQuery.useQueryClient();
2976
2979
  return reactQuery.useMutation(templateTagsApi.create, _objectSpread$1(_objectSpread$1({}, options), {}, {
@@ -2978,7 +2981,7 @@ var useCreateTemplateTag = function useCreateTemplateTag(options) {
2978
2981
  var _options$onSuccess;
2979
2982
  neetoTagsFrontend.refetchTags();
2980
2983
  queryClient.invalidateQueries(QUERY_KEYS.TEMPLATE_TAGS);
2981
- options === null || options === void 0 || (_options$onSuccess = options.onSuccess) === null || _options$onSuccess === void 0 ? void 0 : _options$onSuccess.call(options);
2984
+ options === null || options === void 0 || (_options$onSuccess = options.onSuccess) === null || _options$onSuccess === void 0 || _options$onSuccess.call(options);
2982
2985
  }
2983
2986
  }));
2984
2987
  };
@@ -3000,7 +3003,7 @@ var FormikImageUploader = function FormikImageUploader(_ref) {
3000
3003
  return setValue(file.url);
3001
3004
  };
3002
3005
  return /*#__PURE__*/React__default["default"].createElement(neetoImageUploaderFrontend.ImageUploader, {
3003
- className: "h-80 w-full",
3006
+ className: "h-52 w-full md:h-80",
3004
3007
  src: field.value,
3005
3008
  uploadConfig: IMAGE_UPLOAD_CONFIG,
3006
3009
  onUploadComplete: handleImageUpload
@@ -3053,7 +3056,7 @@ var Tags = function Tags(_ref) {
3053
3056
  return onUpdate([].concat(_toConsumableArray(selectedTags), [newTag]));
3054
3057
  };
3055
3058
  var handleTagRemove = function handleTagRemove(removedTag) {
3056
- var updatedTags = neetocist.removeBy({
3059
+ var updatedTags = neetoCist.removeBy({
3057
3060
  value: removedTag.value
3058
3061
  }, selectedTags);
3059
3062
  onUpdate(updatedTags);
@@ -3099,17 +3102,20 @@ var Preview = function Preview(_ref) {
3099
3102
  className: "neeto-template__header"
3100
3103
  }, /*#__PURE__*/React__default["default"].createElement("img", {
3101
3104
  className: "neeto-template__image",
3105
+ "data-cy": "template-image-preview",
3102
3106
  src: imageUrl || "https://d2v7kzglnr2dnh.cloudfront.net/images/neetoForm/default-form-template.svg"
3103
3107
  })), /*#__PURE__*/React__default["default"].createElement("div", {
3104
3108
  className: "neeto-ui-bg-white flex items-center justify-between gap-2 rounded-b-lg px-2 py-1.5"
3105
3109
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
3106
3110
  className: "neeto-ui-text-gray-800",
3111
+ "data-cy": "template-title-text",
3107
3112
  lineHeight: "normal",
3108
3113
  style: "body2"
3109
3114
  }, template.title)));
3110
3115
  };
3111
3116
 
3112
- var buildSelectOptionsBy = function buildSelectOptionsBy(labelField, options) {
3117
+ var buildSelectOptionsBy = function buildSelectOptionsBy(labelField) {
3118
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
3113
3119
  var valueField = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "id";
3114
3120
  return options.map(function (option) {
3115
3121
  return {
@@ -3120,7 +3126,7 @@ var buildSelectOptionsBy = function buildSelectOptionsBy(labelField, options) {
3120
3126
  };
3121
3127
  var buildTagOptions = function buildTagOptions() {
3122
3128
  var tags = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
3123
- return neetocist.renameKeys({
3129
+ return neetoCist.renameKeys({
3124
3130
  id: "value",
3125
3131
  name: "label"
3126
3132
  }, tags);
@@ -3132,8 +3138,8 @@ var buildTemplateUpdatePayload = function buildTemplateUpdatePayload(values) {
3132
3138
  };
3133
3139
  };
3134
3140
 
3135
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
3136
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3141
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3142
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3137
3143
  var TemplateSettings = function TemplateSettings(_ref) {
3138
3144
  var _ref$onCancelTemplate = _ref.onCancelTemplatePreview,
3139
3145
  onCancelTemplatePreview = _ref$onCancelTemplate === void 0 ? "" : _ref$onCancelTemplate,
@@ -3180,7 +3186,10 @@ var TemplateSettings = function TemplateSettings(_ref) {
3180
3186
  breadcrumbs: breadcrumbs,
3181
3187
  title: t("neetoTemplate.templateSettings.title")
3182
3188
  }), /*#__PURE__*/React__default["default"].createElement(PageContent, {
3183
- className: "h-full"
3189
+ className: classnames__default["default"]({
3190
+ "min-h-0": !isLoading,
3191
+ "h-full": isLoading
3192
+ })
3184
3193
  }, isLoading ? /*#__PURE__*/React__default["default"].createElement(PageLoader__default["default"], null) : /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
3185
3194
  className: "mb-1",
3186
3195
  "data-cy": "thank-you-action-text",
@@ -3225,7 +3234,7 @@ var TemplateSettings = function TemplateSettings(_ref) {
3225
3234
  }), /*#__PURE__*/React__default["default"].createElement("div", {
3226
3235
  className: "mt-12 flex flex-row items-center justify-start"
3227
3236
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
3228
- className: "mr-3",
3237
+ className: "mr-3 flex-shrink-0",
3229
3238
  "data-cy": "save-changes-button",
3230
3239
  disabled: !dirty,
3231
3240
  loading: isUpdatingTemplate,