@guillotinaweb/react-gmi 0.20.1 → 0.22.2

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/react-gmi.js CHANGED
@@ -107,124 +107,148 @@ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
107
107
  return it.next.bind(it);
108
108
  }
109
109
 
110
- var RestClient = /*#__PURE__*/function () {
111
- function RestClient(url, auth) {
112
- this.auth = auth;
113
- this.url = url;
110
+ var AuthContext = React.createContext({});
111
+ var ClientContext = React.createContext({});
112
+ var TraversalContext = React.createContext({});
113
+
114
+ var Traversal = /*#__PURE__*/function () {
115
+ function Traversal(_ref) {
116
+ var flash = _ref.flash,
117
+ props = _objectWithoutPropertiesLoose(_ref, ["flash"]);
118
+
119
+ Object.assign(this, props);
120
+ if (typeof flash === 'function') this.flash = flash;
114
121
  }
115
122
 
116
- var _proto = RestClient.prototype;
123
+ var _proto = Traversal.prototype;
117
124
 
118
- _proto.request = function request(path, data, headers) {
119
- try {
120
- var _this2 = this;
125
+ _proto.refresh = function refresh(_temp) {
126
+ var _ref2 = _temp === void 0 ? {} : _temp,
127
+ _ref2$transparent = _ref2.transparent,
128
+ transparent = _ref2$transparent === void 0 ? false : _ref2$transparent;
121
129
 
122
- data = data || {};
123
- data.headers = headers || _this2.getHeaders();
124
- return Promise.resolve(fetch("" + _this2.url + path, data));
125
- } catch (e) {
126
- return Promise.reject(e);
127
- }
130
+ this.dispatch({
131
+ type: 'REFRESH',
132
+ payload: {
133
+ transparent: transparent
134
+ }
135
+ });
128
136
  };
129
137
 
130
- _proto.getHeaders = function getHeaders() {
131
- var authToken = this.auth.getToken();
132
- if (!authToken) return {};
133
- return {
134
- Accept: 'application/json',
135
- 'Content-Type': 'application/json',
136
- Authorization: 'Bearer ' + authToken
137
- };
138
+ _proto.apply = function apply(data) {
139
+ // apply a optimistic update to context
140
+ this.dispatch({
141
+ type: 'APPLY',
142
+ payload: data
143
+ });
138
144
  };
139
145
 
140
- _proto.post = function post(path, data) {
141
- try {
142
- var _this4 = this;
143
-
144
- return Promise.resolve(_this4.request(path, {
145
- method: 'post',
146
- body: JSON.stringify(data)
147
- }));
148
- } catch (e) {
149
- return Promise.reject(e);
150
- }
146
+ _proto.flash = function flash(message, type) {
147
+ this.dispatch({
148
+ type: 'SET_FLASH',
149
+ payload: {
150
+ flash: {
151
+ message: message,
152
+ type: type
153
+ }
154
+ }
155
+ });
156
+ window.scrollTo({
157
+ top: 0,
158
+ left: 0,
159
+ behavior: 'smooth'
160
+ });
151
161
  };
152
162
 
153
- _proto.get = function get(path) {
154
- try {
155
- var _this6 = this;
156
-
157
- return Promise.resolve(_this6.request(path, {}));
158
- } catch (e) {
159
- return Promise.reject(e);
160
- }
163
+ _proto.clearFlash = function clearFlash() {
164
+ this.dispatch({
165
+ type: 'CLEAR_FLASH'
166
+ });
161
167
  };
162
168
 
163
- _proto.put = function put(path, data) {
164
- try {
165
- var _this8 = this;
166
-
167
- return Promise.resolve(_this8.request(path, {
168
- method: 'put',
169
- body: JSON.stringify(data)
170
- }));
171
- } catch (e) {
172
- return Promise.reject(e);
173
- }
169
+ _proto.doAction = function doAction(action, params) {
170
+ this.dispatch({
171
+ type: 'SET_ACTION',
172
+ payload: {
173
+ action: action,
174
+ params: params
175
+ }
176
+ });
174
177
  };
175
178
 
176
- _proto.patch = function patch(path, data) {
177
- try {
178
- var _this10 = this;
179
+ _proto.cancelAction = function cancelAction() {
180
+ this.dispatch({
181
+ type: 'CLEAR_ACTION'
182
+ });
183
+ };
179
184
 
180
- return Promise.resolve(_this10.request(path, {
181
- method: 'PATCH',
182
- body: JSON.stringify(data)
183
- }));
184
- } catch (e) {
185
- return Promise.reject(e);
186
- }
185
+ _proto.hasPerm = function hasPerm(permission) {
186
+ return this.state.permissions[permission] === true;
187
187
  };
188
188
 
189
- _proto.upload = function upload(path, data) {
190
- try {
191
- var _this12 = this;
189
+ _proto.filterTabs = function filterTabs(tabs, tabsPermissions) {
190
+ var _this = this;
192
191
 
193
- var headers = _this12.getHeaders();
192
+ var result = {};
193
+ Object.keys(tabs).forEach(function (item) {
194
+ var perm = tabsPermissions[item];
194
195
 
195
- delete headers['Content-Type'];
196
- headers['Content-Type'] = data['content-type'];
197
- headers['X-UPLOAD-FILENAME'] = data.filename;
198
- headers['Content-Encoding'] = 'base64';
199
- return Promise.resolve(_this12.request(path, {
200
- method: 'PATCH',
201
- body: data.data
202
- }, headers));
203
- } catch (e) {
204
- return Promise.reject(e);
205
- }
196
+ if (perm && _this.hasPerm(perm)) {
197
+ result[item] = tabs[item];
198
+ } else if (!perm) {
199
+ result[item] = tabs[item];
200
+ }
201
+ });
202
+ return result;
206
203
  };
207
204
 
208
- _proto.delete = function _delete(path, data) {
209
- if (data === void 0) {
210
- data = undefined;
205
+ _createClass(Traversal, [{
206
+ key: "path",
207
+ get: function get() {
208
+ return this.state.path;
211
209
  }
212
-
213
- try {
214
- var _this14 = this;
215
-
216
- return Promise.resolve(_this14.request(path, {
217
- method: 'delete',
218
- body: JSON.stringify(data)
219
- }));
220
- } catch (e) {
221
- return Promise.reject(e);
210
+ }, {
211
+ key: "pathPrefix",
212
+ get: function get() {
213
+ return this.state.path.slice(1);
222
214
  }
223
- };
215
+ }, {
216
+ key: "context",
217
+ get: function get() {
218
+ return this.state.context;
219
+ }
220
+ }, {
221
+ key: "containerPath",
222
+ get: function get() {
223
+ return this.client.getContainerFromPath(this.path);
224
+ }
225
+ }]);
224
226
 
225
- return RestClient;
227
+ return Traversal;
226
228
  }();
227
229
 
230
+ function TraversalProvider(_ref3) {
231
+ var children = _ref3.children,
232
+ props = _objectWithoutPropertiesLoose(_ref3, ["children"]);
233
+
234
+ return /*#__PURE__*/React__default['default'].createElement(TraversalContext.Provider, {
235
+ value: new Traversal(props)
236
+ }, children);
237
+ }
238
+ function useTraversal() {
239
+ return React__default['default'].useContext(TraversalContext);
240
+ }
241
+ function ClientProvider(_ref4) {
242
+ var children = _ref4.children,
243
+ client = _ref4.client;
244
+ return /*#__PURE__*/React__default['default'].createElement(ClientContext.Provider, {
245
+ value: client
246
+ }, children);
247
+ }
248
+ function useGuillotinaClient() {
249
+ return React__default['default'].useContext(ClientContext);
250
+ }
251
+
228
252
  var classnames = function classnames(classNames) {
229
253
  return classNames.filter(Boolean).join(' ').trim();
230
254
  };
@@ -276,2067 +300,2071 @@ function sleep(ms) {
276
300
  });
277
301
  }
278
302
 
279
- var Icon = function Icon(_ref) {
280
- var icon = _ref.icon,
281
- className = _ref.className,
282
- align = _ref.align;
283
- var addClass = className ? className.split(' ') : [className];
284
- align = align || 'is-right';
285
- return /*#__PURE__*/React__default['default'].createElement("span", {
286
- className: classnames(['icon', align].concat(addClass))
287
- }, /*#__PURE__*/React__default['default'].createElement("i", {
288
- className: icon
289
- }));
290
- };
303
+ var noop$1 = function noop() {};
291
304
 
292
- var Loading = function Loading(_ref) {
293
- var rest = _extends({}, _ref);
305
+ var Button = function Button(_ref) {
306
+ var _ref2;
294
307
 
295
- return /*#__PURE__*/React__default['default'].createElement("div", _extends({
296
- className: "progress-line"
297
- }, rest));
298
- };
308
+ var children = _ref.children,
309
+ _ref$className = _ref.className,
310
+ className = _ref$className === void 0 ? 'is-primary' : _ref$className,
311
+ onClick = _ref.onClick,
312
+ _ref$type = _ref.type,
313
+ type = _ref$type === void 0 ? 'submit' : _ref$type,
314
+ _ref$loading = _ref.loading,
315
+ loading = _ref$loading === void 0 ? false : _ref$loading,
316
+ _ref$disabled = _ref.disabled,
317
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
318
+ dataTest = _ref.dataTest,
319
+ rest = _objectWithoutPropertiesLoose(_ref, ["children", "className", "onClick", "type", "loading", "disabled", "dataTest"]);
299
320
 
300
- var Tag = function Tag(_ref) {
301
- var name = _ref.name,
302
- onRemove = _ref.onRemove,
303
- _ref$size = _ref.size,
304
- size = _ref$size === void 0 ? 'is-medium' : _ref$size,
305
- _ref$color = _ref.color,
306
- color = _ref$color === void 0 ? 'is-warning' : _ref$color;
307
- return /*#__PURE__*/React__default['default'].createElement("span", {
308
- className: classnames(['tag', color, size])
309
- }, name, onRemove !== undefined && /*#__PURE__*/React__default['default'].createElement("button", {
310
- className: "delete is-small",
311
- onClick: function onClick() {
312
- return onRemove();
313
- }
314
- }));
315
- };
321
+ var css = (_ref2 = []).concat.apply(_ref2, ['button'].concat(className.split(' ')));
316
322
 
317
- function Delete(_ref) {
318
- var onClick = _ref.onClick,
319
- className = _ref.className,
320
- children = _ref.children;
321
- return /*#__PURE__*/React__default['default'].createElement("button", {
322
- type: "button",
323
+ if (loading) css = css.concat('is-loading');
324
+ if (disabled) onClick = noop$1;
325
+ return /*#__PURE__*/React__default['default'].createElement("p", {
326
+ className: "control"
327
+ }, /*#__PURE__*/React__default['default'].createElement("button", _extends({
328
+ type: type,
329
+ className: classnames(css),
323
330
  onClick: onClick,
324
- className: "delete " + className,
325
- "data-test": "btnDeleteTest"
326
- }, children);
327
- }
328
-
329
- function Table(_ref) {
330
- var headers = _ref.headers,
331
- children = _ref.children,
332
- className = _ref.className;
333
- className = className ? className.split(' ') : ' is-full is-fullwidth is-narrow'.split(' ');
334
- return /*#__PURE__*/React__default['default'].createElement("table", {
335
- className: classnames(['table'].concat(className))
336
- }, /*#__PURE__*/React__default['default'].createElement("thead", null, /*#__PURE__*/React__default['default'].createElement("tr", null, headers && headers.map(function (item, idx) {
337
- return /*#__PURE__*/React__default['default'].createElement("th", {
338
- key: item + idx
339
- }, item);
340
- }))), /*#__PURE__*/React__default['default'].createElement("tbody", null, children));
341
- }
342
-
343
- function Notification(_ref) {
344
- var _ref$isColor = _ref.isColor,
345
- isColor = _ref$isColor === void 0 ? '' : _ref$isColor,
346
- children = _ref.children;
347
- return /*#__PURE__*/React__default['default'].createElement("div", {
348
- className: 'notification is-' + isColor,
349
- "data-test": "notificationTest"
350
- }, children);
351
- }
352
-
353
- // https://github.com/molefrog/wouter
354
-
355
- var setURLParams = function setURLParams(p) {
356
- return window.history['pushState'](0, 0, (window.history.pathname || '') + '?' + p.toString().replace(/%2F/g, '/'));
357
- };
358
-
359
- var clean = function clean(to) {
360
- var current = new URLSearchParams();
361
- Object.keys(to).forEach(function (_key) {
362
- return current.set(_key, to[_key]);
363
- });
364
- setURLParams(current);
331
+ disabled: disabled
332
+ }, rest, {
333
+ "data-test": dataTest
334
+ }), children));
365
335
  };
366
336
 
367
- var useLocation = function useLocation() {
368
- var _useState = React.useState(currentSearchParams()),
369
- path = _useState[0],
370
- update = _useState[1];
337
+ function Modal(props) {
338
+ var isActive = props.isActive,
339
+ setActive = props.setActive,
340
+ children = props.children;
371
341
 
372
- var prevPath = React.useRef(path);
373
- React.useEffect(function () {
374
- patchHistoryEvents(); // this function checks if the location has been changed since the
375
- // last render and updates the state only when needed.
376
- // unfortunately, we can't rely on `path` value here, since it can be stale,
377
- // that's why we store the last pathname in a ref.
342
+ var _usePortal = usePortal__default['default'](),
343
+ Portal = _usePortal.Portal;
378
344
 
379
- var checkForUpdates = function checkForUpdates() {
380
- var pathname = currentSearchParams();
381
- prevPath.current !== pathname && update(prevPath.current = pathname);
382
- };
345
+ var css = 'modal ' + (isActive ? 'is-active ' : '') + props.className;
346
+ return /*#__PURE__*/React__default['default'].createElement(Portal, null, /*#__PURE__*/React__default['default'].createElement("div", {
347
+ className: css
348
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
349
+ className: "modal-background",
350
+ onClick: function onClick() {
351
+ return setActive(false);
352
+ }
353
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
354
+ className: "modal-content"
355
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
356
+ className: "box"
357
+ }, children)), /*#__PURE__*/React__default['default'].createElement("button", {
358
+ className: "modal-close is-large",
359
+ "aria-label": "close",
360
+ onClick: function onClick() {
361
+ return setActive(false);
362
+ }
363
+ })));
364
+ }
365
+ function Confirm(_ref) {
366
+ var message = _ref.message,
367
+ onCancel = _ref.onCancel,
368
+ onConfirm = _ref.onConfirm,
369
+ loading = _ref.loading;
383
370
 
384
- var events = ['popstate', 'pushState', 'replaceState'];
385
- events.map(function (e) {
386
- return window.addEventListener(e, checkForUpdates);
387
- }); // it's possible that an update has occurred between render and the effect handler,
388
- // so we run additional check on mount to catch these updates. Based on:
389
- // https://gist.github.com/bvaughn/e25397f70e8c65b0ae0d7c90b731b189
371
+ var setActive = function setActive() {
372
+ return onCancel();
373
+ };
390
374
 
391
- checkForUpdates();
392
- return function () {
393
- return events.map(function (e) {
394
- return window.removeEventListener(e, checkForUpdates);
395
- });
396
- };
397
- }, []); // the 2nd argument of the `useLocation` return value is a function
398
- // that allows to perform a navigation.
399
- //
400
- // the function reference should stay the same between re-renders, so that
401
- // it can be passed down as an element prop without any performance concerns.
375
+ return /*#__PURE__*/React__default['default'].createElement(Modal, {
376
+ isActive: true,
377
+ setActive: setActive,
378
+ className: "confirm"
379
+ }, /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement("h1", {
380
+ className: "title is-size-5"
381
+ }, message || 'Are you Sure?'), /*#__PURE__*/React__default['default'].createElement("div", {
382
+ className: "level",
383
+ style: {
384
+ marginTop: 50
385
+ }
386
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
387
+ className: "level-left"
388
+ }), /*#__PURE__*/React__default['default'].createElement("div", {
389
+ className: "level-right"
390
+ }, /*#__PURE__*/React__default['default'].createElement("button", {
391
+ className: "button is-danger",
392
+ onClick: function onClick() {
393
+ return onCancel();
394
+ },
395
+ "data-test": "btnCancelModalTest"
396
+ }, "Cancel"), "\xA0\xA0", /*#__PURE__*/React__default['default'].createElement(Button, {
397
+ loading: loading,
398
+ className: "is-success",
399
+ onClick: function onClick() {
400
+ return onConfirm();
401
+ },
402
+ dataTest: "btnConfirmModalTest"
403
+ }, "Confirm")))));
404
+ } // @todo Improve it... Replacing the inputText to a tree
402
405
 
403
- var navigate = React.useCallback(function (to, replace) {
404
- if (replace) {
405
- clean(to);
406
- return;
406
+ function PathTree(_ref2) {
407
+ var title = _ref2.title,
408
+ defaultPath = _ref2.defaultPath,
409
+ children = _ref2.children,
410
+ onConfirm = _ref2.onConfirm,
411
+ onCancel = _ref2.onCancel;
412
+ return /*#__PURE__*/React__default['default'].createElement(Modal, {
413
+ isActive: true,
414
+ setActive: onCancel
415
+ }, /*#__PURE__*/React__default['default'].createElement("h1", null, title), /*#__PURE__*/React__default['default'].createElement("form", {
416
+ onSubmit: function onSubmit(e) {
417
+ e.preventDefault();
418
+ onConfirm(e.target[0].value, e.target);
419
+ }
420
+ }, /*#__PURE__*/React__default['default'].createElement("small", {
421
+ style: {
422
+ display: 'block',
423
+ marginTop: 20
407
424
  }
425
+ }, "Example: /folder (without /db/container on front)"), /*#__PURE__*/React__default['default'].createElement("input", {
426
+ className: "input mb-3",
427
+ defaultValue: defaultPath,
428
+ type: "text",
429
+ "data-test": "inputPathTreeTest"
430
+ }), children, /*#__PURE__*/React__default['default'].createElement("div", {
431
+ className: "level-right mt-3"
432
+ }, /*#__PURE__*/React__default['default'].createElement("button", {
433
+ type: "button",
434
+ className: "button is-danger",
435
+ onClick: onCancel,
436
+ "data-test": "btnCancelModalTest"
437
+ }, "Cancel"), "\xA0\xA0", /*#__PURE__*/React__default['default'].createElement("button", {
438
+ type: "submit",
439
+ className: "button is-success",
440
+ "data-test": "btnConfirmModalTest"
441
+ }, "Confirm"))));
442
+ }
408
443
 
409
- var current = new URLSearchParams(path.toString());
410
- Object.keys(to).forEach(function (_key) {
411
- return current.set(_key, to[_key]);
444
+ function useSetState(initialState) {
445
+ var _useState = React.useState(initialState),
446
+ state = _useState[0],
447
+ set = _useState[1];
448
+
449
+ var setState = React.useCallback(function (patch) {
450
+ set(function (prevState) {
451
+ return Object.assign({}, prevState, patch instanceof Function ? patch(prevState) : patch);
412
452
  });
413
- setURLParams(current);
414
- }, [path]);
415
- var remove = React.useCallback(function (param) {
416
- var current = new URLSearchParams(path.toString());
417
- current.delete(param);
418
- setURLParams(current);
419
- }, [path]);
420
- return [path, navigate, remove];
421
- }; // While History API does have `popstate` event, the only
422
- // proper way to listen to changes via `push/replaceState`
423
- // is to monkey-patch these methods.
424
- //
425
- // See https://stackoverflow.com/a/4585031
453
+ }, [set]);
454
+ return [state, setState];
455
+ }
426
456
 
427
- var patched = 0;
457
+ function _catch(body, recover) {
458
+ try {
459
+ var result = body();
460
+ } catch (e) {
461
+ return recover(e);
462
+ }
428
463
 
429
- var patchHistoryEvents = function patchHistoryEvents() {
430
- if (patched) return;
431
- ['pushState', 'replaceState'].map(function (type) {
432
- var original = window.history[type];
464
+ if (result && result.then) {
465
+ return result.then(void 0, recover);
466
+ }
433
467
 
434
- window.history[type] = function () {
435
- var result = original.apply(this, arguments);
436
- var event = new Event(type);
437
- event.arguments = arguments;
438
- dispatchEvent(event);
439
- return result;
440
- };
441
- });
442
- return patched = 1;
468
+ return result;
469
+ }
470
+
471
+ var initial = {
472
+ loading: undefined,
473
+ isError: false,
474
+ errorMessage: undefined,
475
+ result: undefined,
476
+ response: undefined
443
477
  };
444
478
 
445
- var currentSearchParams = function currentSearchParams(path) {
446
- if (path === void 0) {
447
- path = window.location.search;
479
+ var getErrorMessage = function getErrorMessage(dataError, defaultValue) {
480
+ if (dataError && dataError.details) {
481
+ return dataError.details;
482
+ } else if (dataError && dataError.reason) {
483
+ return dataError.reason;
448
484
  }
449
485
 
450
- return new URLSearchParams(path);
486
+ return defaultValue;
451
487
  };
452
488
 
453
- function Link(_ref) {
454
- var aRef = _ref.aRef,
455
- model = _ref.model,
456
- children = _ref.children,
457
- props = _objectWithoutPropertiesLoose(_ref, ["aRef", "model", "children"]);
458
-
459
- var _useLocation = useLocation(),
460
- path = _useLocation[0],
461
- navigate = _useLocation[1];
462
-
463
- var aStyle = {
464
- textDecoration: 'none',
465
- color: 'currentColor'
466
- };
467
-
468
- function onClick(e) {
469
- e.stopPropagation();
470
- if (actAsLink(e)) return;
471
- e.preventDefault();
472
- navigate({
473
- path: model.path
474
- }, true);
475
- if (props.onClick) props.onClick(e);
489
+ var processResponse = function processResponse(res, ready_body) {
490
+ if (ready_body === void 0) {
491
+ ready_body = true;
476
492
  }
477
493
 
478
- return /*#__PURE__*/React__default['default'].createElement("a", _extends({}, props, {
479
- ref: aRef,
480
- href: "?" + path + model.id + "/",
481
- style: aStyle,
482
- onClick: onClick
483
- }), children);
484
- }
485
-
486
- function actAsLink(e) {
487
- return e.ctrlKey || e.metaKey || e.altKey || e.shiftKey || e.button !== 0;
488
- }
489
-
490
- function TdLink(_ref) {
491
- var model = _ref.model,
492
- children = _ref.children,
493
- props = _objectWithoutPropertiesLoose(_ref, ["model", "children"]);
494
-
495
- var link = React.useRef();
494
+ try {
495
+ var _temp2 = function _temp2(_res$json) {
496
+ return {
497
+ isError: false,
498
+ loading: false,
499
+ result: _res$json,
500
+ response: res
501
+ };
502
+ };
496
503
 
497
- function onClick() {
498
- link.current.click();
504
+ if (res.status < 400) return Promise.resolve(ready_body ? Promise.resolve(res.json()).then(_temp2) : _temp2(res.status));else return Promise.resolve(res.json()).then(function (_res$json2) {
505
+ return {
506
+ isError: true,
507
+ loading: false,
508
+ errorMessage: getErrorMessage(_res$json2, res.status),
509
+ response: res
510
+ };
511
+ });
512
+ } catch (e) {
513
+ return Promise.reject(e);
499
514
  }
515
+ };
500
516
 
501
- return /*#__PURE__*/React__default['default'].createElement("td", _extends({}, props, {
502
- onClick: onClick
503
- }), /*#__PURE__*/React__default['default'].createElement(Link, {
504
- model: model,
505
- aRef: link
506
- }, children));
507
- }
517
+ var patch = function patch(setState, Ctx) {
518
+ return function (data, endpoint, body) {
519
+ if (body === void 0) {
520
+ body = false;
521
+ }
508
522
 
509
- var SEP = '=';
510
- var DEFAULT_FIELD = 'title__in';
511
- var CLEANER = '||';
512
- function parser(qs, defaultField) {
513
- if (defaultField === void 0) {
514
- defaultField = DEFAULT_FIELD;
515
- }
523
+ try {
524
+ var _temp5 = function _temp5() {
525
+ setState(newState);
526
+ return newState;
527
+ };
516
528
 
517
- var lastKey = undefined;
518
- qs.trim();
529
+ setState({
530
+ loading: true
531
+ });
532
+ var newState = {};
519
533
 
520
- if (qs.includes('"')) {
521
- qs = qs.replace(/"(\w+) (\w+)"/, "$1" + CLEANER + "$2");
522
- }
534
+ var _temp6 = _catch(function () {
535
+ var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
536
+ return Promise.resolve(Ctx.client.patch(path, data)).then(function (res) {
537
+ return Promise.resolve(processResponse(res, body)).then(function (_processResponse) {
538
+ newState = _processResponse;
539
+ });
540
+ });
541
+ }, function (e) {
542
+ console.error('Error', e);
543
+ newState = {
544
+ isError: true,
545
+ errorMessage: 'unhandled exception'
546
+ };
547
+ });
523
548
 
524
- qs = qs.split(' ');
525
- return qs.map(function (part) {
526
- if (part.includes(CLEANER)) {
527
- part = part.replace('||', ' ');
549
+ return Promise.resolve(_temp6 && _temp6.then ? _temp6.then(_temp5) : _temp5(_temp6));
550
+ } catch (e) {
551
+ return Promise.reject(e);
528
552
  }
553
+ };
554
+ };
529
555
 
530
- if (!part.includes(SEP)) {
531
- return !lastKey ? [defaultField, part] : [lastKey, part];
556
+ var del = function del(setState, Ctx) {
557
+ return function (data, endpoint, body) {
558
+ if (body === void 0) {
559
+ body = false;
532
560
  }
533
561
 
534
- var _part$split = part.split(SEP),
535
- key = _part$split[0],
536
- val = _part$split[1];
562
+ try {
563
+ var _temp9 = function _temp9() {
564
+ setState(newState);
565
+ return newState;
566
+ };
537
567
 
538
- lastKey = key;
539
- return [key, val];
540
- });
541
- }
542
- function buildQs(parsedQuery) {
543
- return parsedQuery.map(function (_ref) {
544
- var key = _ref[0],
545
- val = _ref[1];
546
- return encodeURIComponent(key) + "=" + encodeURIComponent(val);
547
- }).join('&');
548
- }
568
+ setState({
569
+ loading: true
570
+ });
571
+ var newState = {};
549
572
 
550
- var cacheTypes = {};
551
- var cacheSchemas = {};
552
- var GuillotinaClient = /*#__PURE__*/function () {
553
- function GuillotinaClient(rest, isContainer) {
554
- this.rest = rest;
555
- this.isContainer = isContainer;
556
- }
573
+ var _temp10 = _catch(function () {
574
+ var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
575
+ return Promise.resolve(Ctx.client.delete(path, data)).then(function (res) {
576
+ return Promise.resolve(processResponse(res, body)).then(function (_processResponse2) {
577
+ newState = _processResponse2;
578
+ });
579
+ });
580
+ }, function (e) {
581
+ console.error('Error', e);
582
+ newState = {
583
+ isError: true,
584
+ errorMessage: 'unhandled exception'
585
+ };
586
+ });
557
587
 
558
- var _proto = GuillotinaClient.prototype;
588
+ return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(_temp9) : _temp9(_temp10));
589
+ } catch (e) {
590
+ return Promise.reject(e);
591
+ }
592
+ };
593
+ };
594
+
595
+ var post = function post(setState, Ctx) {
596
+ return function (data, endpoint, body) {
597
+ if (body === void 0) {
598
+ body = true;
599
+ }
559
600
 
560
- _proto.getContext = function getContext(path) {
561
601
  try {
562
- var _this2 = this;
602
+ var _temp13 = function _temp13() {
603
+ setState(newState);
604
+ return newState;
605
+ };
563
606
 
564
- switch (path) {
565
- case '/':
566
- return Promise.resolve(_this2.rest.get(''));
607
+ setState({
608
+ loading: true
609
+ });
610
+ var newState = {};
567
611
 
568
- default:
569
- if (path.startsWith('/')) {
570
- path = path.substring(1);
571
- }
612
+ var _temp14 = _catch(function () {
613
+ var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
614
+ return Promise.resolve(Ctx.client.post(path, data)).then(function (res) {
615
+ return Promise.resolve(processResponse(res, body)).then(function (_processResponse3) {
616
+ newState = _processResponse3;
617
+ });
618
+ });
619
+ }, function (e) {
620
+ console.error('Error', e);
621
+ newState = {
622
+ isError: true,
623
+ errorMessage: 'unhandled exception'
624
+ };
625
+ });
572
626
 
573
- return Promise.resolve(_this2.rest.get(path));
574
- }
627
+ return Promise.resolve(_temp14 && _temp14.then ? _temp14.then(_temp13) : _temp13(_temp14));
575
628
  } catch (e) {
576
629
  return Promise.reject(e);
577
630
  }
578
631
  };
632
+ };
579
633
 
580
- _proto.get = function get(path) {
634
+ var get = function get(setState, Ctx) {
635
+ return function (endpoint) {
581
636
  try {
582
- var _this4 = this;
583
-
584
- if (path.startsWith('/')) {
585
- path = path.slice(1);
586
- }
587
-
588
- return Promise.resolve(_this4.rest.get(path));
637
+ setState({
638
+ loading: true
639
+ });
640
+ var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
641
+ return Promise.resolve(Ctx.client.get(path)).then(function (req) {
642
+ return Promise.resolve(req.json()).then(function (data) {
643
+ setState({
644
+ loading: false,
645
+ result: data,
646
+ response: req
647
+ });
648
+ return data;
649
+ });
650
+ });
589
651
  } catch (e) {
590
652
  return Promise.reject(e);
591
653
  }
592
654
  };
655
+ };
593
656
 
594
- _proto.getQueryParamsPostresql = function getQueryParamsPostresql(_ref) {
595
- var _ref$start = _ref.start,
596
- start = _ref$start === void 0 ? 0 : _ref$start,
597
- _ref$pageSize = _ref.pageSize,
598
- pageSize = _ref$pageSize === void 0 ? 10 : _ref$pageSize,
599
- _ref$withDepth = _ref.withDepth,
600
- withDepth = _ref$withDepth === void 0 ? true : _ref$withDepth;
601
- var result = [];
602
- result = [].concat(parser(start.toString(), 'b_start'), parser(pageSize.toString(), 'b_size'));
603
-
604
- if (withDepth) {
605
- var _parser;
657
+ function useCrudContext() {
658
+ var Ctx = useTraversal();
606
659
 
607
- result = [].concat(result, (_parser = parser('1', 'depth')) != null ? _parser : []);
608
- }
660
+ var _useSetState = useSetState(initial),
661
+ state = _useSetState[0],
662
+ setState = _useSetState[1];
609
663
 
610
- return result;
611
- };
612
-
613
- _proto.getQueryParamsElasticsearch = function getQueryParamsElasticsearch(_ref2) {
614
- var _ref2$start = _ref2.start,
615
- start = _ref2$start === void 0 ? 0 : _ref2$start,
616
- _ref2$pageSize = _ref2.pageSize,
617
- pageSize = _ref2$pageSize === void 0 ? 10 : _ref2$pageSize,
618
- path = _ref2.path,
619
- _ref2$withDepth = _ref2.withDepth,
620
- withDepth = _ref2$withDepth === void 0 ? true : _ref2$withDepth;
621
- var result = [];
622
- var containerPath = getContainerFromPath(path);
664
+ return _extends({}, state, {
665
+ Ctx: Ctx,
666
+ patch: patch(setState, Ctx),
667
+ del: del(setState, Ctx),
668
+ post: post(setState, Ctx),
669
+ get: get(setState, Ctx)
670
+ });
671
+ }
623
672
 
624
- if (containerPath.startsWith('/')) {
625
- containerPath = containerPath.slice(1);
626
- }
673
+ function AddItem(props) {
674
+ var doSubmit = function doSubmit(data) {
675
+ try {
676
+ var form = Object.assign({}, {
677
+ '@type': type
678
+ }, data.formData ? data.formData : data);
679
+ return Promise.resolve(post(form)).then(function (_ref) {
680
+ var isError = _ref.isError,
681
+ errorMessage = _ref.errorMessage;
627
682
 
628
- var objectPath = path.replace(containerPath, '');
683
+ if (!isError) {
684
+ Ctx.flash('Content created!', 'success');
685
+ } else {
686
+ Ctx.flash("An error has ocurred: " + errorMessage, 'danger');
687
+ }
629
688
 
630
- if (objectPath.endsWith('/')) {
631
- objectPath = objectPath.slice(0, -1);
689
+ Ctx.cancelAction();
690
+ Ctx.refresh();
691
+ });
692
+ } catch (e) {
693
+ return Promise.reject(e);
632
694
  }
695
+ };
633
696
 
634
- result = [].concat(parser(start.toString(), '_from'), parser(pageSize.toString(), 'size'));
635
-
636
- if (withDepth) {
637
- var _parser2;
697
+ var Ctx = useTraversal();
638
698
 
639
- result = [].concat(result, (_parser2 = parser('1', 'depth')) != null ? _parser2 : []);
640
- }
699
+ var _useCrudContext = useCrudContext(),
700
+ post = _useCrudContext.post,
701
+ loading = _useCrudContext.loading;
641
702
 
642
- if (objectPath !== '') {
643
- result = [].concat(result, parser(objectPath, 'path__wildcard'));
644
- }
703
+ var type = props.type;
704
+ var getForm = Ctx.registry.getForm;
705
+ var Form = getForm(type);
645
706
 
646
- return result;
707
+ var setActive = function setActive() {
708
+ Ctx.cancelAction();
647
709
  };
648
710
 
649
- _proto.getItemsColumn = function getItemsColumn() {
650
- var smallcss = {
651
- width: 25
652
- };
653
- var mediumcss = {
654
- width: 120
655
- };
656
- return [{
657
- label: '',
658
- child: function child(m) {
659
- return /*#__PURE__*/React__default['default'].createElement("td", {
660
- style: smallcss
661
- }, /*#__PURE__*/React__default['default'].createElement(Icon, {
662
- icon: m.icon
663
- }));
664
- }
665
- }, {
666
- label: 'type',
667
- child: function child(m) {
668
- return /*#__PURE__*/React__default['default'].createElement(TdLink, {
669
- style: smallcss,
670
- model: m
671
- }, /*#__PURE__*/React__default['default'].createElement("span", {
672
- className: "tag"
673
- }, m.type));
674
- }
675
- }, {
676
- label: 'id/name',
677
- child: function child(m, navigate, search) {
678
- return /*#__PURE__*/React__default['default'].createElement(TdLink, {
679
- model: m
680
- }, m.name, search && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement("br", null), /*#__PURE__*/React__default['default'].createElement("span", {
681
- className: "is-size-7 tag is-light"
682
- }, m.path)));
683
- }
684
- }, {
685
- label: 'created',
686
- child: function child(m) {
687
- return /*#__PURE__*/React__default['default'].createElement("td", {
688
- style: mediumcss,
689
- className: "is-size-7 is-vcentered"
690
- }, m.created);
691
- }
692
- }, {
693
- label: 'modified',
694
- child: function child(m) {
695
- return /*#__PURE__*/React__default['default'].createElement("td", {
696
- style: mediumcss,
697
- className: "is-size-7 is-vcentered"
698
- }, m.updated);
699
- }
700
- }];
701
- } // BBB API changes. Compat G5 and G6
702
- ;
711
+ return /*#__PURE__*/React__default['default'].createElement(Modal, {
712
+ isActive: true,
713
+ setActive: setActive
714
+ }, /*#__PURE__*/React__default['default'].createElement(Form, {
715
+ loading: loading,
716
+ onSubmit: doSubmit,
717
+ onError: function onError(err) {
718
+ return console.log(err);
719
+ },
720
+ actionName: 'Add ' + type,
721
+ title: 'Add ' + type,
722
+ type: type,
723
+ dataTest: "formAdd" + type + "Test"
724
+ }));
725
+ }
703
726
 
704
- _proto.applyCompat = function applyCompat(data) {
705
- data.member = data.items;
706
- data.items_count = data.items_total;
707
- return data;
708
- };
727
+ var Permissions = ['guillotina.AddContent', 'guillotina.ModifyContent', 'guillotina.ViewContent', 'guillotina.DeleteContent', 'guillotina.AccessContent', 'guillotina.SeePermissions', 'guillotina.ChangePermissions', 'guillotina.MoveContent', 'guillotina.DuplicateContent', 'guillotina.ReadConfiguration', 'guillotina.RegisterConfigurations', 'guillotina.WriteConfiguration', 'guillotina.ManageAddons', 'guillotina.swagger.View'];
728
+ var Config = {
729
+ DisabledTypes: ['UserManager', 'GroupManager'],
730
+ PageSize: 10,
731
+ DelayActions: 200,
732
+ Permissions: Permissions,
733
+ SearchEngine: 'PostreSQL',
734
+ // Elasticsearch
735
+ fieldHaveDeleteButton: function fieldHaveDeleteButton(schema) {
736
+ return (schema == null ? void 0 : schema.widget) === 'file' || (schema == null ? void 0 : schema.widget) === 'select' || (schema == null ? void 0 : schema.type) === 'array';
737
+ }
738
+ };
739
+ var calculated = Object.assign({}, Config);
709
740
 
710
- _proto.search = function search(path, params, container, prepare) {
711
- if (container === void 0) {
712
- container = false;
741
+ var addConfig = function addConfig(additional, original) {
742
+ var rest = Object.assign({}, original);
743
+ Object.keys(additional).forEach(function (item) {
744
+ if (typeof Config[item] === 'object' && Array.isArray(Config[item])) {
745
+ rest[item] = [].concat(Config[item], additional[item]);
746
+ } else if (typeof Config[item] === 'object') {
747
+ rest[item] = Object.assign({}, Config[item], additional[item]);
748
+ } else {
749
+ rest[item] = additional[item];
713
750
  }
751
+ });
752
+ return rest;
753
+ };
714
754
 
715
- if (prepare === void 0) {
716
- prepare = true;
717
- }
755
+ function useConfig(cfg) {
756
+ var ref = React__default['default'].useRef();
718
757
 
719
- try {
720
- var _this6 = this;
758
+ if (cfg && !ref.current) {
759
+ console.log('cfg', cfg);
760
+ calculated = addConfig(cfg, calculated);
761
+ ref.current = calculated;
762
+ } // if (cfg && !ref.current) {
763
+ // ref.current = addConfig(cfg, ref.current);
764
+ // calculated = ref.current
765
+ // console.log("Current config", cfg)
766
+ // }
721
767
 
722
- if (path.startsWith('/')) {
723
- path = path.slice(1);
724
- }
725
768
 
726
- if (container) {
727
- path = getContainerFromPath(path);
728
- }
769
+ return calculated;
770
+ }
729
771
 
730
- var query = prepare ? toQueryString(params) : params;
731
- var url = path + "@search?" + query;
732
- return Promise.resolve(_this6.rest.get(url)).then(function (res) {
733
- return Promise.resolve(res.json()).then(function (data) {
734
- return _this6.applyCompat(data);
735
- });
736
- });
737
- } catch (e) {
738
- return Promise.reject(e);
739
- }
740
- };
772
+ var getId = function getId(item) {
773
+ if (item['@id']) {
774
+ return item['@id'];
775
+ }
741
776
 
742
- _proto.canido = function canido(path, permissions) {
777
+ return item['@absolute_url'];
778
+ };
779
+
780
+ function RemoveItems(props) {
781
+ var removeItems = function removeItems() {
743
782
  try {
744
- var _this8 = this;
783
+ var errors = [];
784
+ setLoading(true);
785
+ var actions = items.map(function (item) {
786
+ try {
787
+ console.log(item);
788
+ return Promise.resolve(Ctx.client.delete(getId(item))).then(function (res) {
789
+ var _temp = function () {
790
+ if (!res.ok) {
791
+ return Promise.resolve(res.json()).then(function (err) {
792
+ errors.push(err);
793
+ });
794
+ }
795
+ }();
745
796
 
746
- if (path.startsWith('/')) {
747
- path = path.slice(1);
748
- }
797
+ if (_temp && _temp.then) return _temp.then(function () {});
798
+ });
799
+ } catch (e) {
800
+ return Promise.reject(e);
801
+ }
802
+ }); // this sleep is here, to let elasticsearch, wait for
803
+ // index our operations... (will work 99% of use cases)
749
804
 
750
- if (Array.isArray(permissions)) {
751
- permissions.join(',');
752
- }
805
+ actions.push(sleep(cfg.DelayActions));
806
+ return Promise.resolve(Promise.all(actions)).then(function () {
807
+ if (errors.length === 0) {
808
+ Ctx.flash("Items removed!", 'success');
809
+ Ctx.refresh();
810
+ } else {
811
+ var errorstr = errors.map(function (err) {
812
+ return JSON.stringify(err);
813
+ }).join('\n');
814
+ Ctx.flash("Something went wrong!! " + errorstr, 'danger');
815
+ }
753
816
 
754
- var url = path + "@canido?permissions=" + permissions;
755
- return Promise.resolve(_this8.rest.get(url));
817
+ setLoading(false);
818
+ Ctx.cancelAction();
819
+ });
756
820
  } catch (e) {
757
821
  return Promise.reject(e);
758
822
  }
759
823
  };
760
824
 
761
- _proto.createObject = function createObject(path, data) {
762
- try {
763
- var _this10 = this;
764
-
765
- return Promise.resolve(_this10.rest.post(path, data));
766
- } catch (e) {
767
- return Promise.reject(e);
768
- }
769
- };
825
+ var Ctx = useTraversal();
826
+ var cfg = useConfig();
770
827
 
771
- _proto.cleanPath = function cleanPath(path) {
772
- var url = path.split('/').slice(3);
773
- return "" + url.join('/');
774
- };
828
+ var _React$useState = React__default['default'].useState(false),
829
+ loading = _React$useState[0],
830
+ setLoading = _React$useState[1];
775
831
 
776
- _proto.delete = function _delete(path, data) {
777
- try {
778
- var _this12 = this;
832
+ var _props$items = props.items,
833
+ items = _props$items === void 0 ? [] : _props$items;
834
+ var last = items[items.length - 1]['@name'];
835
+ var itemsNames = items.map(function (item) {
836
+ return item['@name'];
837
+ }).join(', ').replace(", " + last, " and " + last);
838
+ return /*#__PURE__*/React__default['default'].createElement(Confirm, {
839
+ loading: loading,
840
+ onCancel: function onCancel() {
841
+ return Ctx.cancelAction();
842
+ },
843
+ onConfirm: removeItems,
844
+ message: "Are you sure to remove: " + itemsNames + "?"
845
+ });
846
+ }
779
847
 
780
- console.log('path', path, _this12.cleanPath(path));
781
- return Promise.resolve(_this12.rest.delete(_this12.cleanPath(path), data));
782
- } catch (e) {
783
- return Promise.reject(e);
784
- }
785
- };
848
+ var Checkbox = function Checkbox(_ref) {
849
+ var id = _ref.id,
850
+ className = _ref.className,
851
+ classNameInput = _ref.classNameInput,
852
+ loading = _ref.loading,
853
+ disabled = _ref.disabled,
854
+ _ref$indeterminate = _ref.indeterminate,
855
+ indeterminate = _ref$indeterminate === void 0 ? false : _ref$indeterminate,
856
+ _ref$value = _ref.value,
857
+ value = _ref$value === void 0 ? false : _ref$value,
858
+ children = _ref.children,
859
+ placeholder = _ref.placeholder,
860
+ onChange = _ref.onChange,
861
+ dataTest = _ref.dataTest,
862
+ rest = _objectWithoutPropertiesLoose(_ref, ["id", "className", "classNameInput", "loading", "disabled", "indeterminate", "value", "color", "backgroundColor", "borderColor", "children", "placeholder", "onChange", "dataTest"]);
786
863
 
787
- _proto.create = function create(path, data) {
788
- try {
789
- var _this14 = this;
864
+ var inputRef = React.useRef(null);
790
865
 
791
- if (path.startsWith('/')) {
792
- path = path.substring(1);
793
- }
866
+ var _React$useState = React__default['default'].useState(value),
867
+ state = _React$useState[0],
868
+ setState = _React$useState[1];
794
869
 
795
- return Promise.resolve(_this14.rest.post(path, data));
796
- } catch (e) {
797
- return Promise.reject(e);
870
+ React.useEffect(function () {
871
+ if (inputRef.current) {
872
+ inputRef.current.indeterminate = indeterminate;
798
873
  }
799
- };
800
-
801
- _proto.post = function post(path, data) {
802
- try {
803
- var _this16 = this;
874
+ }, [indeterminate]);
804
875
 
805
- return Promise.resolve(_this16.create(path, data));
806
- } catch (e) {
807
- return Promise.reject(e);
808
- }
876
+ var updateState = function updateState(ev) {
877
+ setState(ev.target.checked);
878
+ onChange(ev.target.checked);
809
879
  };
810
880
 
811
- _proto.patch = function patch(path, data) {
812
- try {
813
- var _this18 = this;
881
+ return /*#__PURE__*/React__default['default'].createElement("div", {
882
+ className: "field"
883
+ }, /*#__PURE__*/React__default['default'].createElement("label", {
884
+ htmlFor: id,
885
+ className: classnames(['checkbox', className])
886
+ }, /*#__PURE__*/React__default['default'].createElement("input", _extends({
887
+ ref: inputRef,
888
+ disabled: disabled || loading,
889
+ id: id,
890
+ type: "checkbox",
891
+ className: classnames(['checkbox', classNameInput]),
892
+ checked: state,
893
+ onChange: updateState,
894
+ "data-test": dataTest
895
+ }, rest)), children || placeholder));
896
+ };
814
897
 
815
- if (path.startsWith('/')) {
816
- path = path.substring(1);
817
- }
898
+ var ErrorZone = function ErrorZone(_ref) {
899
+ var children = _ref.children,
900
+ id = _ref.id,
901
+ className = _ref.className;
902
+ return /*#__PURE__*/React__default['default'].createElement("p", {
903
+ className: classnames(['help is-danger', className]),
904
+ id: id
905
+ }, children);
906
+ };
818
907
 
819
- return Promise.resolve(_this18.rest.patch(path, data));
820
- } catch (e) {
821
- return Promise.reject(e);
822
- }
823
- };
908
+ ErrorZone.propTypes = {
909
+ children: PropTypes__default['default'].node,
910
+ id: PropTypes__default['default'].string,
911
+ className: PropTypes__default['default'].string
912
+ };
824
913
 
825
- _proto.upload = function upload(path, file) {
826
- try {
827
- var _this20 = this;
914
+ var applyValidators = function applyValidators(value, validators) {
915
+ var validation = Array.isArray(validators) ? validators : [validators];
916
+ var result = true;
917
+ validation.forEach(function (func) {
918
+ if (func(value) === false) {
919
+ result = false;
920
+ }
921
+ });
922
+ return result;
923
+ };
828
924
 
829
- if (path.startsWith('/')) {
830
- path = path.substring(1);
831
- }
925
+ var useInput = function useInput(onChange, value, validator) {
926
+ var _React$useState = React__default['default'].useState({
927
+ hasError: false,
928
+ value: value
929
+ }),
930
+ state = _React$useState[0],
931
+ setState = _React$useState[1];
832
932
 
833
- return Promise.resolve(_this20.rest.upload(path, file));
834
- } catch (e) {
835
- return Promise.reject(e);
836
- }
933
+ var onUpdate = function onUpdate(ev) {
934
+ var value = ev && ev.target ? ev.target.value : ev ? ev : '';
935
+ setState({
936
+ value: value,
937
+ hasError: false
938
+ });
939
+ if (onChange) onChange(value);
837
940
  };
838
941
 
839
- _proto.download = function download(path) {
840
- try {
841
- var _this22 = this;
842
-
843
- if (path.startsWith('/')) {
844
- path = path.substring(1);
845
- }
942
+ var onBlur = function onBlur() {
943
+ var hasError = applyValidators(state.value, validator) === false;
944
+ if (hasError) setState({
945
+ value: state.value,
946
+ hasError: hasError
947
+ });
948
+ };
846
949
 
847
- return Promise.resolve(_this22.rest.get(path));
848
- } catch (e) {
849
- return Promise.reject(e);
950
+ var onFocus = function onFocus() {
951
+ if (state.hasError) {
952
+ setState({
953
+ value: state.value,
954
+ hasError: false
955
+ });
850
956
  }
851
957
  };
852
958
 
853
- _proto.getTypeSchema = function getTypeSchema(path, name) {
854
- try {
855
- var _this24 = this;
959
+ React__default['default'].useEffect(function () {
960
+ setState({
961
+ value: value,
962
+ hasError: false
963
+ });
964
+ }, [value]);
965
+ return {
966
+ onChange: onUpdate,
967
+ onFocus: onFocus,
968
+ onBlur: onBlur,
969
+ state: state
970
+ };
971
+ };
856
972
 
857
- var _temp3 = function _temp3() {
858
- return cacheSchemas[name];
859
- };
973
+ // From github.com/protonmail/proton-shared
860
974
 
861
- var _temp4 = function () {
862
- if (!cacheSchemas[name]) {
863
- var url = getContainerFromPath(path); // todo: handle db case (only addable containers)
975
+ /* eslint-disable no-useless-escape */
976
+ var REGEX_EMAIL = /(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/i;
977
+ var REGEX_URL = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/;
978
+ var REGEX_HEX_COLOR = /^#([a-f0-9]{3,4}|[a-f0-9]{4}(?:[a-f0-9]{2}){1,2})\b$/i;
979
+ var REGEX_NUMBER = /^\d+$/;
980
+ var isEmpty = function isEmpty(value) {
981
+ if (value === void 0) {
982
+ value = '';
983
+ }
864
984
 
865
- return Promise.resolve(_this24.rest.get(url + "@types/" + name)).then(function (res) {
866
- return Promise.resolve(res.json()).then(function (_res$json) {
867
- cacheSchemas[name] = _res$json;
868
- });
869
- });
870
- }
871
- }();
985
+ return !value.length;
986
+ };
987
+ var maxLength = function maxLength(value, limit) {
988
+ if (value === void 0) {
989
+ value = '';
990
+ }
872
991
 
873
- return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp3) : _temp3(_temp4));
874
- } catch (e) {
875
- return Promise.reject(e);
876
- }
877
- };
992
+ if (limit === void 0) {
993
+ limit = 0;
994
+ }
878
995
 
879
- _proto.getAddons = function getAddons(path) {
880
- try {
881
- var _this26 = this;
996
+ return value.length <= limit;
997
+ };
998
+ var minLength = function minLength(value, limit) {
999
+ if (value === void 0) {
1000
+ value = '';
1001
+ }
882
1002
 
883
- return Promise.resolve(_this26.rest.get(path + "@addons"));
884
- } catch (e) {
885
- return Promise.reject(e);
886
- }
887
- };
1003
+ if (limit === void 0) {
1004
+ limit = 0;
1005
+ }
888
1006
 
889
- _proto.installAddon = function installAddon(path, key) {
890
- try {
891
- var _this28 = this;
1007
+ return value.length >= limit;
1008
+ };
1009
+ var isEmail = function isEmail(value) {
1010
+ if (value === void 0) {
1011
+ value = '';
1012
+ }
892
1013
 
893
- return Promise.resolve(_this28.rest.post(path + "@addons", {
894
- id: key
895
- }));
896
- } catch (e) {
897
- return Promise.reject(e);
898
- }
899
- };
1014
+ return REGEX_EMAIL.test(value);
1015
+ };
1016
+ var isURL = function isURL(value) {
1017
+ if (value === void 0) {
1018
+ value = '';
1019
+ }
900
1020
 
901
- _proto.removeAddon = function removeAddon(path, key) {
902
- try {
903
- var _this30 = this;
1021
+ return REGEX_URL.test(value);
1022
+ };
1023
+ var isHexColor = function isHexColor(value) {
1024
+ if (value === void 0) {
1025
+ value = '';
1026
+ }
904
1027
 
905
- return Promise.resolve(_this30.rest.delete(path + "@addons", {
906
- id: key
907
- }));
908
- } catch (e) {
909
- return Promise.reject(e);
910
- }
911
- };
912
-
913
- _proto.getGroups = function getGroups(path) {
914
- try {
915
- var _this32 = this;
1028
+ return REGEX_HEX_COLOR.test(value);
1029
+ };
1030
+ var isNumber = function isNumber(value) {
1031
+ if (value === void 0) {
1032
+ value = '';
1033
+ }
916
1034
 
917
- var endpoint = getContainerFromPath(path) + "@groups";
918
- return Promise.resolve(_this32.rest.get(endpoint));
919
- } catch (e) {
920
- return Promise.reject(e);
921
- }
922
- };
1035
+ return REGEX_NUMBER.test(value);
1036
+ };
1037
+ var notEmpty = function notEmpty(value) {
1038
+ return !!value.length;
1039
+ };
923
1040
 
924
- _proto.getUsers = function getUsers(path) {
925
- try {
926
- var _this34 = this;
1041
+ var noop$2 = function noop() {
1042
+ return true;
1043
+ };
1044
+ /** @type any */
927
1045
 
928
- var endpoint = getContainerFromPath(path) + "@users";
929
- return Promise.resolve(_this34.rest.get(endpoint));
930
- } catch (e) {
931
- return Promise.reject(e);
932
- }
933
- };
934
1046
 
935
- _proto.getPrincipals = function getPrincipals(path) {
936
- try {
937
- var _this36 = this;
1047
+ var Input = React__default['default'].forwardRef(function (_ref, ref) {
1048
+ var icon = _ref.icon,
1049
+ _ref$iconPosition = _ref.iconPosition,
1050
+ iconPosition = _ref$iconPosition === void 0 ? 'has-icons-right' : _ref$iconPosition,
1051
+ error = _ref.error,
1052
+ errorZoneClassName = _ref.errorZoneClassName,
1053
+ _ref$autoComplete = _ref.autoComplete,
1054
+ autoComplete = _ref$autoComplete === void 0 ? 'off' : _ref$autoComplete,
1055
+ _ref$className = _ref.className,
1056
+ className = _ref$className === void 0 ? '' : _ref$className,
1057
+ _ref$widget = _ref.widget,
1058
+ widget = _ref$widget === void 0 ? 'input' : _ref$widget,
1059
+ _ref$type = _ref.type,
1060
+ type = _ref$type === void 0 ? 'text' : _ref$type,
1061
+ _ref$loading = _ref.loading,
1062
+ loading = _ref$loading === void 0 ? false : _ref$loading,
1063
+ _ref$required = _ref.required,
1064
+ required = _ref$required === void 0 ? false : _ref$required,
1065
+ id = _ref.id,
1066
+ placeholder = _ref.placeholder,
1067
+ value = _ref.value,
1068
+ _ref$autofocus = _ref.autofocus,
1069
+ autofocus = _ref$autofocus === void 0 ? false : _ref$autofocus,
1070
+ onChange = _ref.onChange,
1071
+ _ref$validator = _ref.validator,
1072
+ validator = _ref$validator === void 0 ? noop$2 : _ref$validator,
1073
+ errorMessage = _ref.errorMessage,
1074
+ _ref$dataTest = _ref.dataTest,
1075
+ dataTest = _ref$dataTest === void 0 ? 'testInput' : _ref$dataTest,
1076
+ rest = _objectWithoutPropertiesLoose(_ref, ["icon", "iconPosition", "error", "errorZoneClassName", "autoComplete", "className", "widget", "type", "onPressEnter", "isSubmitted", "loading", "required", "id", "placeholder", "value", "autofocus", "onChange", "validator", "errorMessage", "dataTest"]);
938
1077
 
939
- var groups = _this36.getGroups(path);
1078
+ if (required) {
1079
+ validator = Array.isArray(validator) ? validator.push(notEmpty) : [validator, notEmpty];
1080
+ }
940
1081
 
941
- var users = _this36.getUsers(path);
1082
+ var _useInput = useInput(onChange, value != null ? value : '', validator),
1083
+ state = _useInput.state,
1084
+ handlers = _objectWithoutPropertiesLoose(_useInput, ["state"]);
942
1085
 
943
- return Promise.resolve(Promise.all([groups, users])).then(function (_ref3) {
944
- var gr = _ref3[0],
945
- usr = _ref3[1];
1086
+ var _useState = React.useState(generateUID('input')),
1087
+ uid = _useState[0];
946
1088
 
947
- function _temp6(_gr$json) {
948
- function _temp5(_usr$json) {
949
- return {
950
- groups: _gr$json,
951
- users: _usr$json
952
- };
953
- }
1089
+ var _useState2 = React.useState(false),
1090
+ mounted = _useState2[0],
1091
+ setMounted = _useState2[1]; // eslint-disable-next-line
954
1092
 
955
- var _usr$ok = usr.ok;
956
- return _usr$ok ? Promise.resolve(usr.json()).then(_temp5) : _temp5([]);
957
- }
958
1093
 
959
- var _gr$ok = gr.ok;
960
- return _gr$ok ? Promise.resolve(gr.json()).then(_temp6) : _temp6([]);
961
- });
962
- } catch (e) {
963
- return Promise.reject(e);
1094
+ ref = ref || React__default['default'].useRef();
1095
+ React.useEffect(function () {
1096
+ setMounted(true);
1097
+ }, []);
1098
+ React.useEffect(function () {
1099
+ if (autofocus && !error) {
1100
+ ref.current.focus();
964
1101
  }
1102
+ }, [mounted, autofocus, ref, error]);
1103
+ var theError = state.hasError ? errorMessage || 'invalid field' : '';
1104
+ var statusClasses = state.hasError ? 'is-danger' : '';
1105
+
1106
+ var cssControl = function cssControl() {
1107
+ return icon ? ['control', iconPosition] : ['control'];
965
1108
  };
966
1109
 
967
- _proto.getRoles = function getRoles(path) {
968
- try {
969
- var _this38 = this;
1110
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1111
+ className: "field"
1112
+ }, id && placeholder ? /*#__PURE__*/React__default['default'].createElement("label", {
1113
+ className: "label",
1114
+ htmlFor: id
1115
+ }, placeholder) : null, /*#__PURE__*/React__default['default'].createElement("div", {
1116
+ className: classnames(cssControl())
1117
+ }, /*#__PURE__*/React__default['default'].createElement("input", _extends({
1118
+ className: classnames([widget, className, statusClasses]),
1119
+ "aria-invalid": theError,
1120
+ "aria-describedby": uid,
1121
+ id: id,
1122
+ ref: ref,
1123
+ type: type,
1124
+ value: state.value,
1125
+ placeholder: placeholder,
1126
+ autoComplete: autoComplete,
1127
+ disabled: loading || rest.disabled,
1128
+ required: required,
1129
+ "data-test": dataTest
1130
+ }, handlers, rest)), icon && icon), /*#__PURE__*/React__default['default'].createElement(ErrorZone, {
1131
+ className: errorZoneClassName,
1132
+ id: uid
1133
+ }, state.hasError ? theError : ''));
1134
+ });
1135
+ Input.propTypes = {
1136
+ icon: PropTypes__default['default'].node,
1137
+ iconPosition: PropTypes__default['default'].arrayOf(PropTypes__default['default'].oneOf(['has-icons-left', 'has-icons-right', ''])),
1138
+ error: PropTypes__default['default'].string,
1139
+ errorZoneClassName: PropTypes__default['default'].string,
1140
+ autoComplete: PropTypes__default['default'].string,
1141
+ autoFocus: PropTypes__default['default'].bool,
1142
+ className: PropTypes__default['default'].string,
1143
+ disabled: PropTypes__default['default'].bool,
1144
+ loading: PropTypes__default['default'].bool,
1145
+ isSubmitted: PropTypes__default['default'].bool,
1146
+ id: PropTypes__default['default'].string,
1147
+ name: PropTypes__default['default'].string,
1148
+ onChange: PropTypes__default['default'].func,
1149
+ onKeyDown: PropTypes__default['default'].func,
1150
+ onKeyUp: PropTypes__default['default'].func,
1151
+ onPressEnter: PropTypes__default['default'].func,
1152
+ placeholder: PropTypes__default['default'].string,
1153
+ readOnly: PropTypes__default['default'].bool,
1154
+ required: PropTypes__default['default'].bool,
1155
+ type: PropTypes__default['default'].string,
1156
+ value: PropTypes__default['default'].oneOfType([PropTypes__default['default'].string, PropTypes__default['default'].number, PropTypes__default['default'].bool])
1157
+ };
970
1158
 
971
- var endpoint = getContainerFromPath(path) + "@available-roles";
972
- return Promise.resolve(_this38.rest.get(endpoint));
973
- } catch (e) {
974
- return Promise.reject(e);
975
- }
976
- };
1159
+ var Icon = function Icon(_ref) {
1160
+ var icon = _ref.icon,
1161
+ className = _ref.className,
1162
+ align = _ref.align;
1163
+ var addClass = className ? className.split(' ') : [className];
1164
+ align = align || 'is-right';
1165
+ return /*#__PURE__*/React__default['default'].createElement("span", {
1166
+ className: classnames(['icon', align].concat(addClass))
1167
+ }, /*#__PURE__*/React__default['default'].createElement("i", {
1168
+ className: icon
1169
+ }));
1170
+ };
977
1171
 
978
- _proto.getAllPermissions = function getAllPermissions(path) {
979
- try {
980
- var _this40 = this;
1172
+ var EmailInput = function EmailInput(_ref) {
1173
+ var _ref$value = _ref.value,
1174
+ value = _ref$value === void 0 ? '' : _ref$value,
1175
+ dataTest = _ref.dataTest,
1176
+ rest = _objectWithoutPropertiesLoose(_ref, ["value", "dataTest"]);
981
1177
 
982
- // paths used to query the API always has to start without a "/"
983
- if (path.startsWith('/')) {
984
- path = path.slice(1);
985
- }
1178
+ return /*#__PURE__*/React__default['default'].createElement(Input, _extends({
1179
+ type: "email",
1180
+ validator: isEmail,
1181
+ errorMessage: "Email address invalid",
1182
+ value: value,
1183
+ "data-test": dataTest,
1184
+ icon: /*#__PURE__*/React__default['default'].createElement(Icon, {
1185
+ icon: "fas fa-envelope"
1186
+ })
1187
+ }, rest));
1188
+ };
986
1189
 
987
- if (!path.endsWith('/')) {
988
- path = path + "/";
989
- }
1190
+ var Form = function Form(_ref) {
1191
+ var children = _ref.children,
1192
+ _ref$className = _ref.className,
1193
+ className = _ref$className === void 0 ? '' : _ref$className,
1194
+ _ref$onSubmit = _ref.onSubmit,
1195
+ onSubmit = _ref$onSubmit === void 0 ? noop : _ref$onSubmit,
1196
+ _ref$onReset = _ref.onReset,
1197
+ onReset = _ref$onReset === void 0 ? noop : _ref$onReset,
1198
+ _ref$autoComplete = _ref.autoComplete,
1199
+ autoComplete = _ref$autoComplete === void 0 ? 'off' : _ref$autoComplete,
1200
+ title = _ref.title,
1201
+ error = _ref.error,
1202
+ dataTest = _ref.dataTest,
1203
+ rest = _objectWithoutPropertiesLoose(_ref, ["children", "className", "onSubmit", "onReset", "autoComplete", "title", "error", "dataTest"]);
990
1204
 
991
- return Promise.resolve(_this40.rest.get(path + '@all_permissions')).then(function (req) {
992
- return Promise.resolve(req.json()).then(function (resp) {
993
- var permissions = Array.from(new Set(extractPermissions(resp)));
994
- return permissions;
995
- });
996
- });
997
- } catch (e) {
998
- return Promise.reject(e);
999
- }
1205
+ var handleSubmit = function handleSubmit(event) {
1206
+ event.preventDefault();
1207
+ onSubmit(event);
1000
1208
  };
1001
1209
 
1002
- _proto.getTypes = function getTypes(path) {
1003
- try {
1004
- var _this42 = this;
1005
-
1006
- var _temp10 = function _temp10() {
1007
- return cacheTypes[path];
1008
- };
1210
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1211
+ "data-test": dataTest
1212
+ }, title && /*#__PURE__*/React__default['default'].createElement("div", {
1213
+ className: "level"
1214
+ }, /*#__PURE__*/React__default['default'].createElement("h1", {
1215
+ className: "title is-size-4"
1216
+ }, title)), error && /*#__PURE__*/React__default['default'].createElement("div", {
1217
+ className: "notification is-danger"
1218
+ }, error), /*#__PURE__*/React__default['default'].createElement("form", _extends({
1219
+ onSubmit: handleSubmit,
1220
+ onReset: onReset,
1221
+ autoComplete: autoComplete,
1222
+ className: classnames(['form', className])
1223
+ }, rest), children));
1224
+ };
1225
+ Form.propTypes = {
1226
+ children: PropTypes__default['default'].node.isRequired,
1227
+ className: PropTypes__default['default'].string,
1228
+ onSubmit: PropTypes__default['default'].func,
1229
+ onReset: PropTypes__default['default'].func,
1230
+ autoComplete: PropTypes__default['default'].string
1231
+ };
1009
1232
 
1010
- if (path.startsWith('/')) {
1011
- path = path.slice(1);
1012
- }
1233
+ var PasswordInput = function PasswordInput(_ref) {
1234
+ var _ref$value = _ref.value,
1235
+ value = _ref$value === void 0 ? '' : _ref$value,
1236
+ rest = _objectWithoutPropertiesLoose(_ref, ["value"]);
1013
1237
 
1014
- var _temp11 = function () {
1015
- if (!cacheTypes[path]) {
1016
- return Promise.resolve(_this42.rest.get(path + '@addable-types')).then(function (types) {
1017
- var _temp7 = function () {
1018
- if (types.status === 401 || types.status === 404) {
1019
- cacheTypes[path] = [];
1020
- } else {
1021
- return Promise.resolve(types.json()).then(function (res) {
1022
- cacheTypes[path] = res;
1023
- });
1024
- }
1025
- }();
1026
-
1027
- if (_temp7 && _temp7.then) return _temp7.then(function () {});
1028
- });
1029
- }
1030
- }();
1031
-
1032
- return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(_temp10) : _temp10(_temp11));
1033
- } catch (e) {
1034
- return Promise.reject(e);
1035
- }
1036
- };
1037
-
1038
- return GuillotinaClient;
1039
- }();
1040
- function getClient(url, auth, isContainer) {
1041
- if (isContainer === void 0) {
1042
- isContainer = false;
1043
- }
1044
-
1045
- return new GuillotinaClient(new RestClient(url, auth), isContainer);
1046
- }
1047
- var getContainerFromPath = function getContainerFromPath(path) {
1048
- if (path.startsWith('/')) {
1049
- path = path.substring(1);
1050
- }
1051
-
1052
- var parts = path.split('/');
1053
- return parts[0] + "/" + parts[1] + "/";
1054
- };
1055
- var lightFileReader = function lightFileReader(file) {
1056
- try {
1057
- return Promise.resolve(new Promise(function (resolve) {
1058
- var reader = new FileReader();
1059
- reader.readAsArrayBuffer(file);
1060
-
1061
- reader.onloadend = function (e) {
1062
- var fileData = e.target.result;
1063
- resolve({
1064
- filename: file.name.normalize('NFD').replace(/[\u0300-\u036f]/g, ''),
1065
- data: fileData,
1066
- 'content-type': file.type
1067
- });
1068
- };
1069
- }));
1070
- } catch (e) {
1071
- return Promise.reject(e);
1072
- }
1238
+ return /*#__PURE__*/React__default['default'].createElement(Input, _extends({
1239
+ value: value,
1240
+ type: "password"
1241
+ }, rest));
1073
1242
  };
1074
1243
 
1075
- var extractPermissions = function extractPermissions(data) {
1076
- var result = [];
1077
-
1078
- if (typeof data !== 'object') ; else if (!Array.isArray(data) && data.permission) {
1079
- result = result.concat([data.permission]);
1080
- } else if (!Array.isArray(data)) {
1081
- Object.keys(data).map(function (key) {
1082
- return result = result.concat(extractPermissions(data[key]));
1083
- });
1084
- } else if (Array.isArray(data)) {
1085
- data.map(function (item) {
1086
- return result = result.concat(extractPermissions(item));
1087
- });
1088
- }
1089
-
1090
- return result;
1244
+ var formComponents = {
1245
+ string: Input,
1246
+ password: PasswordInput,
1247
+ boolean: Checkbox,
1248
+ email: EmailInput
1091
1249
  };
1250
+ function FormBuilder(_ref) {
1251
+ var schema = _ref.schema,
1252
+ formData = _ref.formData,
1253
+ onSubmit = _ref.onSubmit,
1254
+ actionName = _ref.actionName,
1255
+ children = _ref.children,
1256
+ _ref$exclude = _ref.exclude,
1257
+ exclude = _ref$exclude === void 0 ? [] : _ref$exclude,
1258
+ _ref$remotes = _ref.remotes,
1259
+ remotes = _ref$remotes === void 0 ? [] : _ref$remotes,
1260
+ _ref$submitButton = _ref.submitButton,
1261
+ submitButton = _ref$submitButton === void 0 ? true : _ref$submitButton,
1262
+ rest = _objectWithoutPropertiesLoose(_ref, ["schema", "formData", "title", "onSubmit", "actionName", "children", "exclude", "remotes", "submitButton"]);
1092
1263
 
1093
- var AuthContext = React.createContext({});
1094
- var ClientContext = React.createContext({});
1095
- var TraversalContext = React.createContext({});
1096
-
1097
- var Traversal = /*#__PURE__*/function () {
1098
- function Traversal(_ref) {
1099
- var flash = _ref.flash,
1100
- props = _objectWithoutPropertiesLoose(_ref, ["flash"]);
1101
-
1102
- Object.assign(this, props);
1103
- if (typeof flash === 'function') this.flash = flash;
1104
- }
1105
-
1106
- var _proto = Traversal.prototype;
1107
-
1108
- _proto.refresh = function refresh(_temp) {
1109
- var _ref2 = _temp === void 0 ? {} : _temp,
1110
- _ref2$transparent = _ref2.transparent,
1111
- transparent = _ref2$transparent === void 0 ? false : _ref2$transparent;
1112
-
1113
- this.dispatch({
1114
- type: 'REFRESH',
1115
- payload: {
1116
- transparent: transparent
1117
- }
1118
- });
1119
- };
1120
-
1121
- _proto.apply = function apply(data) {
1122
- // apply a optimistic update to context
1123
- this.dispatch({
1124
- type: 'APPLY',
1125
- payload: data
1126
- });
1127
- };
1128
-
1129
- _proto.flash = function flash(message, type) {
1130
- this.dispatch({
1131
- type: 'SET_FLASH',
1132
- payload: {
1133
- flash: {
1134
- message: message,
1135
- type: type
1136
- }
1137
- }
1138
- });
1139
- window.scrollTo({
1140
- top: 0,
1141
- left: 0,
1142
- behavior: 'smooth'
1143
- });
1144
- };
1145
-
1146
- _proto.clearFlash = function clearFlash() {
1147
- this.dispatch({
1148
- type: 'CLEAR_FLASH'
1149
- });
1150
- };
1264
+ var ref = React__default['default'].useRef();
1265
+ var properties = schema.properties,
1266
+ required = schema.required;
1267
+ var values = Object.assign({}, formData || {}); // build initial state
1151
1268
 
1152
- _proto.doAction = function doAction(action, params) {
1153
- this.dispatch({
1154
- type: 'SET_ACTION',
1155
- payload: {
1156
- action: action,
1157
- params: params
1158
- }
1159
- });
1160
- };
1269
+ var initialState = {};
1270
+ var fields = Object.keys(properties).filter(function (x) {
1271
+ return !exclude.includes(x);
1272
+ });
1273
+ fields.forEach(function (element) {
1274
+ initialState[element] = values[element] || undefined;
1275
+ }); // Register remotes
1161
1276
 
1162
- _proto.cancelAction = function cancelAction() {
1163
- this.dispatch({
1164
- type: 'CLEAR_ACTION'
1277
+ if (!ref.current) {
1278
+ ref.current = {};
1279
+ Object.keys(remotes).forEach(function (item) {
1280
+ return ref.current[item] = remotes[item];
1165
1281
  });
1166
- };
1167
-
1168
- _proto.hasPerm = function hasPerm(permission) {
1169
- return this.state.permissions[permission] === true;
1170
- };
1171
-
1172
- _proto.filterTabs = function filterTabs(tabs, tabsPermissions) {
1173
- var _this = this;
1174
-
1175
- var result = {};
1176
- Object.keys(tabs).forEach(function (item) {
1177
- var perm = tabsPermissions[item];
1178
-
1179
- if (perm && _this.hasPerm(perm)) {
1180
- result[item] = tabs[item];
1181
- } else if (!perm) {
1182
- result[item] = tabs[item];
1282
+ } else {
1283
+ // apply remote changes
1284
+ Object.keys(remotes).forEach(function (key) {
1285
+ if (JSON.stringify(ref.current[key]) !== JSON.stringify(remotes[key])) {
1286
+ ref.current[key] = remotes[key];
1183
1287
  }
1184
1288
  });
1185
- return result;
1186
- };
1187
-
1188
- _createClass(Traversal, [{
1189
- key: "path",
1190
- get: function get() {
1191
- return this.state.path;
1192
- }
1193
- }, {
1194
- key: "pathPrefix",
1195
- get: function get() {
1196
- return this.state.path.slice(1);
1197
- }
1198
- }, {
1199
- key: "context",
1200
- get: function get() {
1201
- return this.state.context;
1202
- }
1203
- }, {
1204
- key: "containerPath",
1205
- get: function get() {
1206
- return getContainerFromPath(this.path);
1207
- }
1208
- }]);
1209
-
1210
- return Traversal;
1211
- }();
1212
-
1213
- function TraversalProvider(_ref3) {
1214
- var children = _ref3.children,
1215
- props = _objectWithoutPropertiesLoose(_ref3, ["children"]);
1216
-
1217
- return /*#__PURE__*/React__default['default'].createElement(TraversalContext.Provider, {
1218
- value: new Traversal(props)
1219
- }, children);
1220
- }
1221
- function useTraversal() {
1222
- return React__default['default'].useContext(TraversalContext);
1223
- }
1224
- function ClientProvider(_ref4) {
1225
- var children = _ref4.children,
1226
- client = _ref4.client;
1227
- return /*#__PURE__*/React__default['default'].createElement(ClientContext.Provider, {
1228
- value: client
1229
- }, children);
1230
- }
1231
- function useGuillotinaClient() {
1232
- return React__default['default'].useContext(ClientContext);
1233
- }
1234
-
1235
- var noop$1 = function noop() {};
1236
-
1237
- var Button = function Button(_ref) {
1238
- var _ref2;
1239
-
1240
- var children = _ref.children,
1241
- _ref$className = _ref.className,
1242
- className = _ref$className === void 0 ? 'is-primary' : _ref$className,
1243
- onClick = _ref.onClick,
1244
- _ref$type = _ref.type,
1245
- type = _ref$type === void 0 ? 'submit' : _ref$type,
1246
- _ref$loading = _ref.loading,
1247
- loading = _ref$loading === void 0 ? false : _ref$loading,
1248
- _ref$disabled = _ref.disabled,
1249
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1250
- dataTest = _ref.dataTest,
1251
- rest = _objectWithoutPropertiesLoose(_ref, ["children", "className", "onClick", "type", "loading", "disabled", "dataTest"]);
1252
-
1253
- var css = (_ref2 = []).concat.apply(_ref2, ['button'].concat(className.split(' ')));
1254
-
1255
- if (loading) css = css.concat('is-loading');
1256
- if (disabled) onClick = noop$1;
1257
- return /*#__PURE__*/React__default['default'].createElement("p", {
1258
- className: "control"
1259
- }, /*#__PURE__*/React__default['default'].createElement("button", _extends({
1260
- type: type,
1261
- className: classnames(css),
1262
- onClick: onClick,
1263
- disabled: disabled
1264
- }, rest, {
1265
- "data-test": dataTest
1266
- }), children));
1267
- };
1268
-
1269
- function Modal(props) {
1270
- var isActive = props.isActive,
1271
- setActive = props.setActive,
1272
- children = props.children;
1273
-
1274
- var _usePortal = usePortal__default['default'](),
1275
- Portal = _usePortal.Portal;
1289
+ }
1276
1290
 
1277
- var css = 'modal ' + (isActive ? 'is-active ' : '') + props.className;
1278
- return /*#__PURE__*/React__default['default'].createElement(Portal, null, /*#__PURE__*/React__default['default'].createElement("div", {
1279
- className: css
1280
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1281
- className: "modal-background",
1282
- onClick: function onClick() {
1283
- return setActive(false);
1284
- }
1285
- }), /*#__PURE__*/React__default['default'].createElement("div", {
1286
- className: "modal-content"
1287
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1288
- className: "box"
1289
- }, children)), /*#__PURE__*/React__default['default'].createElement("button", {
1290
- className: "modal-close is-large",
1291
- "aria-label": "close",
1292
- onClick: function onClick() {
1293
- return setActive(false);
1294
- }
1295
- })));
1296
- }
1297
- function Confirm(_ref) {
1298
- var message = _ref.message,
1299
- onCancel = _ref.onCancel,
1300
- onConfirm = _ref.onConfirm,
1301
- loading = _ref.loading;
1291
+ ref.current = ref.current || {};
1302
1292
 
1303
- var setActive = function setActive() {
1304
- return onCancel();
1293
+ var onUpdate = function onUpdate(field) {
1294
+ return function (ev) {
1295
+ ref.current[field] = ev.target ? ev.target.value : ev.value || ev;
1296
+ };
1305
1297
  };
1306
1298
 
1307
- return /*#__PURE__*/React__default['default'].createElement(Modal, {
1308
- isActive: true,
1309
- setActive: setActive,
1310
- className: "confirm"
1311
- }, /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement("h1", {
1312
- className: "title is-size-5"
1313
- }, message || 'Are you Sure?'), /*#__PURE__*/React__default['default'].createElement("div", {
1314
- className: "level",
1315
- style: {
1316
- marginTop: 50
1317
- }
1318
- }, /*#__PURE__*/React__default['default'].createElement("div", {
1319
- className: "level-left"
1320
- }), /*#__PURE__*/React__default['default'].createElement("div", {
1321
- className: "level-right"
1322
- }, /*#__PURE__*/React__default['default'].createElement("button", {
1323
- className: "button is-danger",
1324
- onClick: function onClick() {
1325
- return onCancel();
1326
- }
1327
- }, "Cancel"), "\xA0\xA0", /*#__PURE__*/React__default['default'].createElement(Button, {
1328
- loading: loading,
1329
- className: "is-success",
1330
- onClick: function onClick() {
1331
- return onConfirm();
1332
- },
1333
- dataTest: "btnConfirmModalTest"
1334
- }, "Confirm")))));
1335
- } // @todo Improve it... Replacing the inputText to a tree
1299
+ var GetTag = function GetTag(_ref2) {
1300
+ var field = _ref2.field;
1301
+ var Tag = formComponents[properties[field].widget || properties[field].type];
1302
+ var props = {
1303
+ label: properties[field].title,
1304
+ value: initialState[field],
1305
+ onChange: onUpdate(field),
1306
+ placeholder: properties[field].title || '',
1307
+ id: generateUID(),
1308
+ dataTest: field + "TestInput"
1309
+ };
1336
1310
 
1337
- function PathTree(_ref2) {
1338
- var title = _ref2.title,
1339
- defaultPath = _ref2.defaultPath,
1340
- children = _ref2.children,
1341
- onConfirm = _ref2.onConfirm,
1342
- onCancel = _ref2.onCancel;
1343
- return /*#__PURE__*/React__default['default'].createElement(Modal, {
1344
- isActive: true,
1345
- setActive: onCancel
1346
- }, /*#__PURE__*/React__default['default'].createElement("h1", null, title), /*#__PURE__*/React__default['default'].createElement("form", {
1347
- onSubmit: function onSubmit(e) {
1348
- e.preventDefault();
1349
- onConfirm(e.target[0].value, e.target);
1311
+ if (required.includes(field)) {
1312
+ props.required = true;
1313
+ props.placeholder += ' *';
1350
1314
  }
1351
- }, /*#__PURE__*/React__default['default'].createElement("input", {
1352
- className: "input",
1353
- placeholder: "/folder (without /db/container on front)",
1354
- style: {
1355
- margin: '20px 0'
1356
- },
1357
- defaultValue: defaultPath,
1358
- type: "text"
1359
- }), children, /*#__PURE__*/React__default['default'].createElement("div", {
1360
- className: "level-right"
1361
- }, /*#__PURE__*/React__default['default'].createElement("button", {
1362
- type: "button",
1363
- className: "button is-danger",
1364
- onClick: onCancel
1365
- }, "Cancel"), "\xA0\xA0", /*#__PURE__*/React__default['default'].createElement("button", {
1366
- type: "submit",
1367
- className: "button is-success"
1368
- }, "Confirm"))));
1369
- }
1370
1315
 
1371
- function useSetState(initialState) {
1372
- var _useState = React.useState(initialState),
1373
- state = _useState[0],
1374
- set = _useState[1];
1316
+ Tag.displayName = field + "Field";
1317
+ return /*#__PURE__*/React__default['default'].createElement(Tag, props);
1318
+ };
1375
1319
 
1376
- var setState = React.useCallback(function (patch) {
1377
- set(function (prevState) {
1378
- return Object.assign({}, prevState, patch instanceof Function ? patch(prevState) : patch);
1320
+ var children_ = React__default['default'].Children.map(children, function (child) {
1321
+ return React__default['default'].cloneElement(child, {
1322
+ onChange: onUpdate
1379
1323
  });
1380
- }, [set]);
1381
- return [state, setState];
1324
+ });
1325
+
1326
+ var changes = function changes() {
1327
+ onSubmit(ref.current, values);
1328
+ };
1329
+
1330
+ return /*#__PURE__*/React__default['default'].createElement(Form, _extends({
1331
+ onSubmit: changes
1332
+ }, rest), fields.map(function (field) {
1333
+ return /*#__PURE__*/React__default['default'].createElement(GetTag, {
1334
+ field: field,
1335
+ key: field
1336
+ });
1337
+ }), children_, submitButton && /*#__PURE__*/React__default['default'].createElement(Button, null, actionName));
1382
1338
  }
1383
1339
 
1384
- function _catch(body, recover) {
1385
- try {
1386
- var result = body();
1387
- } catch (e) {
1388
- return recover(e);
1389
- }
1340
+ /** @type any */
1390
1341
 
1391
- if (result && result.then) {
1392
- return result.then(void 0, recover);
1393
- }
1342
+ var Select = React__default['default'].forwardRef(function (_ref, ref) {
1343
+ var options = _ref.options,
1344
+ error = _ref.error,
1345
+ errorZoneClassName = _ref.errorZoneClassName,
1346
+ _ref$size = _ref.size,
1347
+ size = _ref$size === void 0 ? 1 : _ref$size,
1348
+ placeholder = _ref.placeholder,
1349
+ id = _ref.id,
1350
+ _ref$className = _ref.className,
1351
+ className = _ref$className === void 0 ? '' : _ref$className,
1352
+ _ref$classWrap = _ref.classWrap,
1353
+ classWrap = _ref$classWrap === void 0 ? '' : _ref$classWrap,
1354
+ _ref$multiple = _ref.multiple,
1355
+ multiple = _ref$multiple === void 0 ? false : _ref$multiple,
1356
+ _ref$loading = _ref.loading,
1357
+ loading = _ref$loading === void 0 ? false : _ref$loading,
1358
+ onChange = _ref.onChange,
1359
+ _ref$appendDefault = _ref.appendDefault,
1360
+ appendDefault = _ref$appendDefault === void 0 ? false : _ref$appendDefault,
1361
+ _ref$style = _ref.style,
1362
+ style = _ref$style === void 0 ? {} : _ref$style,
1363
+ dataTest = _ref.dataTest,
1364
+ rest = _objectWithoutPropertiesLoose(_ref, ["options", "error", "errorZoneClassName", "size", "placeholder", "id", "className", "classWrap", "multiple", "loading", "isSubmitted", "onChange", "appendDefault", "style", "dataTest"]);
1394
1365
 
1395
- return result;
1396
- }
1366
+ var _useState = React.useState(generateUID('select')),
1367
+ uid = _useState[0];
1397
1368
 
1398
- var initial = {
1399
- loading: undefined,
1400
- isError: false,
1401
- errorMessage: undefined,
1402
- result: undefined,
1403
- response: undefined
1404
- };
1369
+ var onUpdate = function onUpdate(ev) {
1370
+ if (ev.target.value === '') {
1371
+ onChange({
1372
+ target: {
1373
+ value: undefined
1374
+ }
1375
+ });
1376
+ } else {
1377
+ onChange(ev);
1378
+ }
1379
+ };
1405
1380
 
1406
- var getErrorMessage = function getErrorMessage(dataError, defaultValue) {
1407
- if (dataError && dataError.details) {
1408
- return dataError.details;
1409
- } else if (dataError && dataError.reason) {
1410
- return dataError.reason;
1381
+ if (appendDefault) {
1382
+ options = [{
1383
+ text: 'Choose..',
1384
+ value: ''
1385
+ }].concat(options);
1411
1386
  }
1412
1387
 
1413
- return defaultValue;
1388
+ var statusClasses = error ? 'is-danger' : '';
1389
+ var cssWrap = ['select', statusClasses, multiple ? 'is-multiple' : '', classWrap];
1390
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1391
+ className: "field"
1392
+ }, id && placeholder ? /*#__PURE__*/React__default['default'].createElement("label", {
1393
+ className: "label",
1394
+ htmlFor: id
1395
+ }, placeholder) : null, /*#__PURE__*/React__default['default'].createElement("div", {
1396
+ className: classnames(cssWrap)
1397
+ }, /*#__PURE__*/React__default['default'].createElement("select", _extends({
1398
+ className: classnames(['', className]),
1399
+ size: size,
1400
+ multiple: multiple,
1401
+ disabled: loading || rest.disabled,
1402
+ onChange: onUpdate
1403
+ }, rest, {
1404
+ ref: ref,
1405
+ style: style,
1406
+ "data-test": dataTest
1407
+ }), options.map(function (_ref2, index) {
1408
+ var text = _ref2.text,
1409
+ rest = _objectWithoutPropertiesLoose(_ref2, ["text"]);
1410
+
1411
+ return /*#__PURE__*/React__default['default'].createElement("option", _extends({
1412
+ key: index.toString()
1413
+ }, rest), text);
1414
+ }))), error && /*#__PURE__*/React__default['default'].createElement(ErrorZone, {
1415
+ className: errorZoneClassName,
1416
+ id: uid
1417
+ }, error ? error : ''));
1418
+ });
1419
+ Select.propTypes = {
1420
+ error: PropTypes__default['default'].string,
1421
+ disabled: PropTypes__default['default'].bool,
1422
+ loading: PropTypes__default['default'].bool,
1423
+ isSubmitted: PropTypes__default['default'].bool,
1424
+ size: PropTypes__default['default'].number,
1425
+ onChange: PropTypes__default['default'].func,
1426
+ options: PropTypes__default['default'].arrayOf(PropTypes__default['default'].object),
1427
+ multiple: PropTypes__default['default'].bool,
1428
+ className: PropTypes__default['default'].string
1414
1429
  };
1415
1430
 
1416
- var processResponse = function processResponse(res, ready_body) {
1417
- if (ready_body === void 0) {
1418
- ready_body = true;
1431
+ var RestClient = /*#__PURE__*/function () {
1432
+ function RestClient(url, container, auth) {
1433
+ this.auth = auth;
1434
+ this.url = url;
1435
+ this.container = container;
1419
1436
  }
1420
1437
 
1421
- try {
1422
- var _temp2 = function _temp2(_res$json) {
1423
- return {
1424
- isError: false,
1425
- loading: false,
1426
- result: _res$json,
1427
- response: res
1428
- };
1438
+ var _proto = RestClient.prototype;
1439
+
1440
+ _proto.request = function request(path, data, headers) {
1441
+ try {
1442
+ var _this2 = this;
1443
+
1444
+ if (path.indexOf(_this2.url) !== -1) {
1445
+ path = path.replace(_this2.url, '');
1446
+ }
1447
+
1448
+ if (_this2.container !== '/' && path.indexOf(_this2.container) === -1) {
1449
+ path = "" + _this2.container + path;
1450
+ }
1451
+
1452
+ if (!path.startsWith('/')) {
1453
+ path = "/" + path;
1454
+ }
1455
+
1456
+ data = data || {};
1457
+ data.headers = headers || _this2.getHeaders();
1458
+ return Promise.resolve(fetch("" + _this2.url + path, data));
1459
+ } catch (e) {
1460
+ return Promise.reject(e);
1461
+ }
1462
+ };
1463
+
1464
+ _proto.getHeaders = function getHeaders() {
1465
+ var authToken = this.auth.getToken();
1466
+ if (!authToken) return {};
1467
+ return {
1468
+ Accept: 'application/json',
1469
+ 'Content-Type': 'application/json',
1470
+ Authorization: 'Bearer ' + authToken
1429
1471
  };
1472
+ };
1430
1473
 
1431
- if (res.status < 400) return Promise.resolve(ready_body ? Promise.resolve(res.json()).then(_temp2) : _temp2(res.status));else return Promise.resolve(res.json()).then(function (_res$json2) {
1432
- return {
1433
- isError: true,
1434
- loading: false,
1435
- errorMessage: getErrorMessage(_res$json2, res.status),
1436
- response: res
1437
- };
1438
- });
1439
- } catch (e) {
1440
- return Promise.reject(e);
1441
- }
1442
- };
1474
+ _proto.post = function post(path, data) {
1475
+ try {
1476
+ var _this4 = this;
1443
1477
 
1444
- var patch = function patch(setState, Ctx) {
1445
- return function (data, endpoint, body) {
1446
- if (body === void 0) {
1447
- body = false;
1478
+ return Promise.resolve(_this4.request(path, {
1479
+ method: 'post',
1480
+ body: JSON.stringify(data)
1481
+ }));
1482
+ } catch (e) {
1483
+ return Promise.reject(e);
1448
1484
  }
1485
+ };
1449
1486
 
1487
+ _proto.get = function get(path) {
1450
1488
  try {
1451
- var _temp5 = function _temp5() {
1452
- setState(newState);
1453
- return newState;
1454
- };
1489
+ var _this6 = this;
1455
1490
 
1456
- setState({
1457
- loading: true
1458
- });
1459
- var newState = {};
1491
+ return Promise.resolve(_this6.request(path, {}));
1492
+ } catch (e) {
1493
+ return Promise.reject(e);
1494
+ }
1495
+ };
1460
1496
 
1461
- var _temp6 = _catch(function () {
1462
- var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
1463
- return Promise.resolve(Ctx.client.patch(path, data)).then(function (res) {
1464
- return Promise.resolve(processResponse(res, body)).then(function (_processResponse) {
1465
- newState = _processResponse;
1466
- });
1467
- });
1468
- }, function (e) {
1469
- console.error('Error', e);
1470
- newState = {
1471
- isError: true,
1472
- errorMessage: 'unhandled exception'
1473
- };
1474
- });
1497
+ _proto.put = function put(path, data) {
1498
+ try {
1499
+ var _this8 = this;
1475
1500
 
1476
- return Promise.resolve(_temp6 && _temp6.then ? _temp6.then(_temp5) : _temp5(_temp6));
1501
+ return Promise.resolve(_this8.request(path, {
1502
+ method: 'put',
1503
+ body: JSON.stringify(data)
1504
+ }));
1477
1505
  } catch (e) {
1478
1506
  return Promise.reject(e);
1479
1507
  }
1480
1508
  };
1481
- };
1482
1509
 
1483
- var del = function del(setState, Ctx) {
1484
- return function (data, endpoint, body) {
1485
- if (body === void 0) {
1486
- body = false;
1510
+ _proto.patch = function patch(path, data) {
1511
+ try {
1512
+ var _this10 = this;
1513
+
1514
+ return Promise.resolve(_this10.request(path, {
1515
+ method: 'PATCH',
1516
+ body: JSON.stringify(data)
1517
+ }));
1518
+ } catch (e) {
1519
+ return Promise.reject(e);
1487
1520
  }
1521
+ };
1488
1522
 
1523
+ _proto.upload = function upload(path, data) {
1489
1524
  try {
1490
- var _temp9 = function _temp9() {
1491
- setState(newState);
1492
- return newState;
1493
- };
1494
-
1495
- setState({
1496
- loading: true
1497
- });
1498
- var newState = {};
1525
+ var _this12 = this;
1499
1526
 
1500
- var _temp10 = _catch(function () {
1501
- var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
1502
- return Promise.resolve(Ctx.client.delete(path, data)).then(function (res) {
1503
- return Promise.resolve(processResponse(res, body)).then(function (_processResponse2) {
1504
- newState = _processResponse2;
1505
- });
1506
- });
1507
- }, function (e) {
1508
- console.error('Error', e);
1509
- newState = {
1510
- isError: true,
1511
- errorMessage: 'unhandled exception'
1512
- };
1513
- });
1527
+ var headers = _this12.getHeaders();
1514
1528
 
1515
- return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(_temp9) : _temp9(_temp10));
1529
+ delete headers['Content-Type'];
1530
+ headers['Content-Type'] = data['content-type'];
1531
+ headers['X-UPLOAD-FILENAME'] = data.filename;
1532
+ headers['Content-Encoding'] = 'base64';
1533
+ return Promise.resolve(_this12.request(path, {
1534
+ method: 'PATCH',
1535
+ body: data.data
1536
+ }, headers));
1516
1537
  } catch (e) {
1517
1538
  return Promise.reject(e);
1518
1539
  }
1519
1540
  };
1520
- };
1521
1541
 
1522
- var post = function post(setState, Ctx) {
1523
- return function (data, endpoint, body) {
1524
- if (body === void 0) {
1525
- body = true;
1542
+ _proto.delete = function _delete(path, data) {
1543
+ if (data === void 0) {
1544
+ data = undefined;
1526
1545
  }
1527
1546
 
1528
1547
  try {
1529
- var _temp13 = function _temp13() {
1530
- setState(newState);
1531
- return newState;
1532
- };
1533
-
1534
- setState({
1535
- loading: true
1536
- });
1537
- var newState = {};
1538
-
1539
- var _temp14 = _catch(function () {
1540
- var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
1541
- return Promise.resolve(Ctx.client.post(path, data)).then(function (res) {
1542
- return Promise.resolve(processResponse(res, body)).then(function (_processResponse3) {
1543
- newState = _processResponse3;
1544
- });
1545
- });
1546
- }, function (e) {
1547
- console.error('Error', e);
1548
- newState = {
1549
- isError: true,
1550
- errorMessage: 'unhandled exception'
1551
- };
1552
- });
1548
+ var _this14 = this;
1553
1549
 
1554
- return Promise.resolve(_temp14 && _temp14.then ? _temp14.then(_temp13) : _temp13(_temp14));
1550
+ return Promise.resolve(_this14.request(path, {
1551
+ method: 'delete',
1552
+ body: JSON.stringify(data)
1553
+ }));
1555
1554
  } catch (e) {
1556
1555
  return Promise.reject(e);
1557
1556
  }
1558
1557
  };
1558
+
1559
+ return RestClient;
1560
+ }();
1561
+
1562
+ var Loading = function Loading(_ref) {
1563
+ var rest = _extends({}, _ref);
1564
+
1565
+ return /*#__PURE__*/React__default['default'].createElement("div", _extends({
1566
+ className: "progress-line"
1567
+ }, rest));
1559
1568
  };
1560
1569
 
1561
- var get = function get(setState, Ctx) {
1562
- return function (endpoint) {
1563
- try {
1564
- setState({
1565
- loading: true
1566
- });
1567
- var path = endpoint ? "" + Ctx.path + endpoint : Ctx.path;
1568
- return Promise.resolve(Ctx.client.get(path)).then(function (req) {
1569
- return Promise.resolve(req.json()).then(function (data) {
1570
- setState({
1571
- loading: false,
1572
- result: data,
1573
- response: req
1574
- });
1575
- return data;
1576
- });
1570
+ var Tag = function Tag(_ref) {
1571
+ var name = _ref.name,
1572
+ onRemove = _ref.onRemove,
1573
+ _ref$size = _ref.size,
1574
+ size = _ref$size === void 0 ? 'is-medium' : _ref$size,
1575
+ _ref$color = _ref.color,
1576
+ color = _ref$color === void 0 ? 'is-warning' : _ref$color;
1577
+ return /*#__PURE__*/React__default['default'].createElement("span", {
1578
+ className: classnames(['tag', color, size])
1579
+ }, name, onRemove !== undefined && /*#__PURE__*/React__default['default'].createElement("button", {
1580
+ className: "delete is-small",
1581
+ onClick: function onClick() {
1582
+ return onRemove();
1583
+ }
1584
+ }));
1585
+ };
1586
+
1587
+ function Delete(_ref) {
1588
+ var onClick = _ref.onClick,
1589
+ className = _ref.className,
1590
+ children = _ref.children;
1591
+ return /*#__PURE__*/React__default['default'].createElement("button", {
1592
+ type: "button",
1593
+ onClick: onClick,
1594
+ className: "delete " + className,
1595
+ "data-test": "btnDeleteTest"
1596
+ }, children);
1597
+ }
1598
+
1599
+ function Table(_ref) {
1600
+ var headers = _ref.headers,
1601
+ children = _ref.children,
1602
+ className = _ref.className;
1603
+ className = className ? className.split(' ') : ' is-full is-fullwidth is-narrow'.split(' ');
1604
+ return /*#__PURE__*/React__default['default'].createElement("table", {
1605
+ className: classnames(['table'].concat(className))
1606
+ }, /*#__PURE__*/React__default['default'].createElement("thead", null, /*#__PURE__*/React__default['default'].createElement("tr", null, headers && headers.map(function (item, idx) {
1607
+ return /*#__PURE__*/React__default['default'].createElement("th", {
1608
+ key: item + idx
1609
+ }, item);
1610
+ }))), /*#__PURE__*/React__default['default'].createElement("tbody", null, children));
1611
+ }
1612
+
1613
+ function Notification(_ref) {
1614
+ var _ref$isColor = _ref.isColor,
1615
+ isColor = _ref$isColor === void 0 ? '' : _ref$isColor,
1616
+ children = _ref.children;
1617
+ return /*#__PURE__*/React__default['default'].createElement("div", {
1618
+ className: 'notification is-' + isColor,
1619
+ "data-test": "notificationTest"
1620
+ }, children);
1621
+ }
1622
+
1623
+ // https://github.com/molefrog/wouter
1624
+
1625
+ var setURLParams = function setURLParams(p) {
1626
+ return window.history['pushState'](0, 0, (window.history.pathname || '') + '?' + p.toString().replace(/%2F/g, '/'));
1627
+ };
1628
+
1629
+ var clean = function clean(to) {
1630
+ var current = new URLSearchParams();
1631
+ Object.keys(to).forEach(function (_key) {
1632
+ return current.set(_key, to[_key]);
1633
+ });
1634
+ setURLParams(current);
1635
+ };
1636
+
1637
+ var useLocation = function useLocation() {
1638
+ var _useState = React.useState(currentSearchParams()),
1639
+ path = _useState[0],
1640
+ update = _useState[1];
1641
+
1642
+ var prevPath = React.useRef(path);
1643
+ React.useEffect(function () {
1644
+ patchHistoryEvents(); // this function checks if the location has been changed since the
1645
+ // last render and updates the state only when needed.
1646
+ // unfortunately, we can't rely on `path` value here, since it can be stale,
1647
+ // that's why we store the last pathname in a ref.
1648
+
1649
+ var checkForUpdates = function checkForUpdates() {
1650
+ var pathname = currentSearchParams();
1651
+ prevPath.current !== pathname && update(prevPath.current = pathname);
1652
+ };
1653
+
1654
+ var events = ['popstate', 'pushState', 'replaceState'];
1655
+ events.map(function (e) {
1656
+ return window.addEventListener(e, checkForUpdates);
1657
+ }); // it's possible that an update has occurred between render and the effect handler,
1658
+ // so we run additional check on mount to catch these updates. Based on:
1659
+ // https://gist.github.com/bvaughn/e25397f70e8c65b0ae0d7c90b731b189
1660
+
1661
+ checkForUpdates();
1662
+ return function () {
1663
+ return events.map(function (e) {
1664
+ return window.removeEventListener(e, checkForUpdates);
1577
1665
  });
1578
- } catch (e) {
1579
- return Promise.reject(e);
1666
+ };
1667
+ }, []); // the 2nd argument of the `useLocation` return value is a function
1668
+ // that allows to perform a navigation.
1669
+ //
1670
+ // the function reference should stay the same between re-renders, so that
1671
+ // it can be passed down as an element prop without any performance concerns.
1672
+
1673
+ var navigate = React.useCallback(function (to, replace) {
1674
+ if (replace) {
1675
+ clean(to);
1676
+ return;
1580
1677
  }
1581
- };
1678
+
1679
+ var current = new URLSearchParams(path.toString());
1680
+ Object.keys(to).forEach(function (_key) {
1681
+ return current.set(_key, to[_key]);
1682
+ });
1683
+ setURLParams(current);
1684
+ }, [path]);
1685
+ var remove = React.useCallback(function (param) {
1686
+ var current = new URLSearchParams(path.toString());
1687
+ current.delete(param);
1688
+ setURLParams(current);
1689
+ }, [path]);
1690
+ return [path, navigate, remove];
1691
+ }; // While History API does have `popstate` event, the only
1692
+ // proper way to listen to changes via `push/replaceState`
1693
+ // is to monkey-patch these methods.
1694
+ //
1695
+ // See https://stackoverflow.com/a/4585031
1696
+
1697
+ var patched = 0;
1698
+
1699
+ var patchHistoryEvents = function patchHistoryEvents() {
1700
+ if (patched) return;
1701
+ ['pushState', 'replaceState'].map(function (type) {
1702
+ var original = window.history[type];
1703
+
1704
+ window.history[type] = function () {
1705
+ var result = original.apply(this, arguments);
1706
+ var event = new Event(type);
1707
+ event.arguments = arguments;
1708
+ dispatchEvent(event);
1709
+ return result;
1710
+ };
1711
+ });
1712
+ return patched = 1;
1582
1713
  };
1583
1714
 
1584
- function useCrudContext() {
1585
- var Ctx = useTraversal();
1586
-
1587
- var _useSetState = useSetState(initial),
1588
- state = _useSetState[0],
1589
- setState = _useSetState[1];
1715
+ var currentSearchParams = function currentSearchParams(path) {
1716
+ if (path === void 0) {
1717
+ path = window.location.search;
1718
+ }
1590
1719
 
1591
- return _extends({}, state, {
1592
- Ctx: Ctx,
1593
- patch: patch(setState, Ctx),
1594
- del: del(setState, Ctx),
1595
- post: post(setState, Ctx),
1596
- get: get(setState, Ctx)
1597
- });
1598
- }
1720
+ return new URLSearchParams(path);
1721
+ };
1599
1722
 
1600
- function AddItem(props) {
1601
- var doSubmit = function doSubmit(data) {
1602
- try {
1603
- var form = Object.assign({}, {
1604
- '@type': type
1605
- }, data.formData ? data.formData : data);
1606
- return Promise.resolve(post(form)).then(function (_ref) {
1607
- var isError = _ref.isError,
1608
- errorMessage = _ref.errorMessage;
1723
+ function Link(_ref) {
1724
+ var aRef = _ref.aRef,
1725
+ model = _ref.model,
1726
+ children = _ref.children,
1727
+ props = _objectWithoutPropertiesLoose(_ref, ["aRef", "model", "children"]);
1609
1728
 
1610
- if (!isError) {
1611
- Ctx.flash('Content created!', 'success');
1612
- } else {
1613
- Ctx.flash("An error has ocurred: " + errorMessage, 'danger');
1614
- }
1729
+ var _useLocation = useLocation(),
1730
+ path = _useLocation[0],
1731
+ navigate = _useLocation[1];
1615
1732
 
1616
- Ctx.cancelAction();
1617
- Ctx.refresh();
1618
- });
1619
- } catch (e) {
1620
- return Promise.reject(e);
1621
- }
1733
+ var aStyle = {
1734
+ textDecoration: 'none',
1735
+ color: 'currentColor'
1622
1736
  };
1623
1737
 
1624
- var Ctx = useTraversal();
1738
+ function onClick(e) {
1739
+ e.stopPropagation();
1740
+ if (actAsLink(e)) return;
1741
+ e.preventDefault();
1742
+ navigate({
1743
+ path: model.path
1744
+ }, true);
1745
+ if (props.onClick) props.onClick(e);
1746
+ }
1625
1747
 
1626
- var _useCrudContext = useCrudContext(),
1627
- post = _useCrudContext.post,
1628
- loading = _useCrudContext.loading;
1748
+ return /*#__PURE__*/React__default['default'].createElement("a", _extends({}, props, {
1749
+ ref: aRef,
1750
+ href: "?" + path + model.id + "/",
1751
+ style: aStyle,
1752
+ onClick: onClick
1753
+ }), children);
1754
+ }
1629
1755
 
1630
- var type = props.type;
1631
- var getForm = Ctx.registry.getForm;
1632
- var Form = getForm(type);
1756
+ function actAsLink(e) {
1757
+ return e.ctrlKey || e.metaKey || e.altKey || e.shiftKey || e.button !== 0;
1758
+ }
1633
1759
 
1634
- var setActive = function setActive() {
1635
- Ctx.cancelAction();
1636
- };
1760
+ function TdLink(_ref) {
1761
+ var model = _ref.model,
1762
+ children = _ref.children,
1763
+ props = _objectWithoutPropertiesLoose(_ref, ["model", "children"]);
1637
1764
 
1638
- return /*#__PURE__*/React__default['default'].createElement(Modal, {
1639
- isActive: true,
1640
- setActive: setActive
1641
- }, /*#__PURE__*/React__default['default'].createElement(Form, {
1642
- loading: loading,
1643
- onSubmit: doSubmit,
1644
- onError: function onError(err) {
1645
- return console.log(err);
1646
- },
1647
- actionName: 'Add ' + type,
1648
- title: 'Add ' + type,
1649
- type: type,
1650
- dataTest: "formAdd" + type + "Test"
1651
- }));
1765
+ var link = React.useRef();
1766
+
1767
+ function onClick() {
1768
+ link.current.click();
1769
+ }
1770
+
1771
+ return /*#__PURE__*/React__default['default'].createElement("td", _extends({}, props, {
1772
+ onClick: onClick
1773
+ }), /*#__PURE__*/React__default['default'].createElement(Link, {
1774
+ model: model,
1775
+ aRef: link
1776
+ }, children));
1652
1777
  }
1653
1778
 
1654
- var Permissions = ['guillotina.AddContent', 'guillotina.ModifyContent', 'guillotina.ViewContent', 'guillotina.DeleteContent', 'guillotina.AccessContent', 'guillotina.SeePermissions', 'guillotina.ChangePermissions', 'guillotina.MoveContent', 'guillotina.DuplicateContent', 'guillotina.ReadConfiguration', 'guillotina.RegisterConfigurations', 'guillotina.WriteConfiguration', 'guillotina.ManageAddons', 'guillotina.swagger.View'];
1655
- var Config = {
1656
- DisabledTypes: ['UserManager', 'GroupManager'],
1657
- PageSize: 10,
1658
- DelayActions: 200,
1659
- Permissions: Permissions,
1660
- SearchEngine: 'PostreSQL' // Elasticsearch
1779
+ var SEP = '=';
1780
+ var DEFAULT_FIELD = 'title__in';
1781
+ var CLEANER = '||';
1782
+ function parser(qs, defaultField) {
1783
+ if (defaultField === void 0) {
1784
+ defaultField = DEFAULT_FIELD;
1785
+ }
1661
1786
 
1662
- };
1663
- var calculated = Object.assign({}, Config);
1787
+ var lastKey = undefined;
1788
+ qs.trim();
1664
1789
 
1665
- var addConfig = function addConfig(additional, original) {
1666
- var rest = Object.assign({}, original);
1667
- Object.keys(additional).forEach(function (item) {
1668
- if (typeof Config[item] === 'object' && Array.isArray(Config[item])) {
1669
- rest[item] = [].concat(Config[item], additional[item]);
1670
- } else if (typeof Config[item] === 'object') {
1671
- rest[item] = Object.assign({}, Config[item], additional[item]);
1672
- } else {
1673
- rest[item] = additional[item];
1790
+ if (qs.includes('"')) {
1791
+ qs = qs.replace(/"(\w+) (\w+)"/, "$1" + CLEANER + "$2");
1792
+ }
1793
+
1794
+ qs = qs.split(' ');
1795
+ return qs.map(function (part) {
1796
+ if (part.includes(CLEANER)) {
1797
+ part = part.replace('||', ' ');
1798
+ }
1799
+
1800
+ if (!part.includes(SEP)) {
1801
+ return !lastKey ? [defaultField, part] : [lastKey, part];
1674
1802
  }
1803
+
1804
+ var _part$split = part.split(SEP),
1805
+ key = _part$split[0],
1806
+ val = _part$split[1];
1807
+
1808
+ lastKey = key;
1809
+ return [key, val];
1675
1810
  });
1676
- return rest;
1677
- };
1811
+ }
1812
+ function buildQs(parsedQuery) {
1813
+ return parsedQuery.map(function (_ref) {
1814
+ var key = _ref[0],
1815
+ val = _ref[1];
1816
+ return encodeURIComponent(key) + "=" + encodeURIComponent(val);
1817
+ }).join('&');
1818
+ }
1678
1819
 
1679
- function useConfig(cfg) {
1680
- var ref = React__default['default'].useRef();
1820
+ var cacheTypes = {};
1821
+ var cacheSchemas = {};
1822
+ var GuillotinaClient = /*#__PURE__*/function () {
1823
+ function GuillotinaClient(rest, pathContainsContainer) {
1824
+ var _this = this;
1681
1825
 
1682
- if (cfg && !ref.current) {
1683
- console.log('cfg', cfg);
1684
- calculated = addConfig(cfg, calculated);
1685
- ref.current = calculated;
1686
- } // if (cfg && !ref.current) {
1687
- // ref.current = addConfig(cfg, ref.current);
1688
- // calculated = ref.current
1689
- // console.log("Current config", cfg)
1690
- // }
1826
+ this.getContainerFromPath = function (path) {
1827
+ if (_this.pathContainsContainer) {
1828
+ if (path.startsWith('/')) {
1829
+ path = path.substring(1);
1830
+ }
1691
1831
 
1832
+ var parts = path.split('/');
1833
+ return parts[0] + "/" + parts[1] + "/";
1834
+ }
1692
1835
 
1693
- return calculated;
1694
- }
1836
+ return '';
1837
+ };
1695
1838
 
1696
- var getId = function getId(item) {
1697
- if (item['@id']) {
1698
- return item['@id'];
1839
+ this.clearContainerFromPath = function (path) {
1840
+ if (_this.pathContainsContainer) {
1841
+ return "/" + _this.cleanPath(path);
1842
+ }
1843
+
1844
+ return path;
1845
+ };
1846
+
1847
+ this.rest = rest;
1848
+ this.pathContainsContainer = pathContainsContainer;
1699
1849
  }
1700
1850
 
1701
- return item['@absolute_url'];
1702
- };
1851
+ var _proto = GuillotinaClient.prototype;
1703
1852
 
1704
- function RemoveItems(props) {
1705
- var removeItems = function removeItems() {
1853
+ _proto.getContext = function getContext(path) {
1706
1854
  try {
1707
- var errors = [];
1708
- setLoading(true);
1709
- var actions = items.map(function (item) {
1710
- try {
1711
- console.log(item);
1712
- return Promise.resolve(Ctx.client.delete(getId(item))).then(function (res) {
1713
- var _temp = function () {
1714
- if (!res.ok) {
1715
- return Promise.resolve(res.json()).then(function (err) {
1716
- errors.push(err);
1717
- });
1718
- }
1719
- }();
1855
+ var _this3 = this;
1720
1856
 
1721
- if (_temp && _temp.then) return _temp.then(function () {});
1722
- });
1723
- } catch (e) {
1724
- return Promise.reject(e);
1725
- }
1726
- }); // this sleep is here, to let elasticsearch, wait for
1727
- // index our operations... (will work 99% of use cases)
1857
+ switch (path) {
1858
+ case '/':
1859
+ return Promise.resolve(_this3.rest.get(''));
1728
1860
 
1729
- actions.push(sleep(cfg.DelayActions));
1730
- return Promise.resolve(Promise.all(actions)).then(function () {
1731
- if (errors.length === 0) {
1732
- Ctx.flash("Items removed!", 'success');
1733
- Ctx.refresh();
1734
- } else {
1735
- var errorstr = errors.map(function (err) {
1736
- return JSON.stringify(err);
1737
- }).join('\n');
1738
- Ctx.flash("Something went wrong!! " + errorstr, 'danger');
1739
- }
1861
+ default:
1862
+ if (path.startsWith('/')) {
1863
+ path = path.substring(1);
1864
+ }
1740
1865
 
1741
- setLoading(false);
1742
- Ctx.cancelAction();
1743
- });
1866
+ return Promise.resolve(_this3.rest.get(path));
1867
+ }
1868
+ } catch (e) {
1869
+ return Promise.reject(e);
1870
+ }
1871
+ };
1872
+
1873
+ _proto.get = function get(path) {
1874
+ try {
1875
+ var _this5 = this;
1876
+
1877
+ if (path.startsWith('/')) {
1878
+ path = path.slice(1);
1879
+ }
1880
+
1881
+ return Promise.resolve(_this5.rest.get(path));
1744
1882
  } catch (e) {
1745
1883
  return Promise.reject(e);
1746
1884
  }
1747
1885
  };
1748
1886
 
1749
- var Ctx = useTraversal();
1750
- var cfg = useConfig();
1887
+ _proto.getQueryParamsPostresql = function getQueryParamsPostresql(_ref) {
1888
+ var _ref$start = _ref.start,
1889
+ start = _ref$start === void 0 ? 0 : _ref$start,
1890
+ _ref$pageSize = _ref.pageSize,
1891
+ pageSize = _ref$pageSize === void 0 ? 10 : _ref$pageSize,
1892
+ _ref$withDepth = _ref.withDepth,
1893
+ withDepth = _ref$withDepth === void 0 ? true : _ref$withDepth;
1894
+ var result = [];
1895
+ result = [].concat(parser(start.toString(), 'b_start'), parser(pageSize.toString(), 'b_size'));
1751
1896
 
1752
- var _React$useState = React__default['default'].useState(false),
1753
- loading = _React$useState[0],
1754
- setLoading = _React$useState[1];
1897
+ if (withDepth) {
1898
+ var _parser;
1755
1899
 
1756
- var _props$items = props.items,
1757
- items = _props$items === void 0 ? [] : _props$items;
1758
- var last = items[items.length - 1]['@name'];
1759
- var itemsNames = items.map(function (item) {
1760
- return item['@name'];
1761
- }).join(', ').replace(", " + last, " and " + last);
1762
- return /*#__PURE__*/React__default['default'].createElement(Confirm, {
1763
- loading: loading,
1764
- onCancel: function onCancel() {
1765
- return Ctx.cancelAction();
1766
- },
1767
- onConfirm: removeItems,
1768
- message: "Are you sure to remove: " + itemsNames + "?"
1769
- });
1770
- }
1900
+ result = [].concat(result, (_parser = parser('1', 'depth')) != null ? _parser : []);
1901
+ }
1771
1902
 
1772
- var Checkbox = function Checkbox(_ref) {
1773
- var id = _ref.id,
1774
- className = _ref.className,
1775
- classNameInput = _ref.classNameInput,
1776
- loading = _ref.loading,
1777
- disabled = _ref.disabled,
1778
- _ref$indeterminate = _ref.indeterminate,
1779
- indeterminate = _ref$indeterminate === void 0 ? false : _ref$indeterminate,
1780
- _ref$value = _ref.value,
1781
- value = _ref$value === void 0 ? false : _ref$value,
1782
- children = _ref.children,
1783
- placeholder = _ref.placeholder,
1784
- onChange = _ref.onChange,
1785
- dataTest = _ref.dataTest,
1786
- rest = _objectWithoutPropertiesLoose(_ref, ["id", "className", "classNameInput", "loading", "disabled", "indeterminate", "value", "color", "backgroundColor", "borderColor", "children", "placeholder", "onChange", "dataTest"]);
1903
+ return result;
1904
+ };
1787
1905
 
1788
- var inputRef = React.useRef(null);
1906
+ _proto.getQueryParamsElasticsearch = function getQueryParamsElasticsearch(_ref2) {
1907
+ var _ref2$start = _ref2.start,
1908
+ start = _ref2$start === void 0 ? 0 : _ref2$start,
1909
+ _ref2$pageSize = _ref2.pageSize,
1910
+ pageSize = _ref2$pageSize === void 0 ? 10 : _ref2$pageSize,
1911
+ path = _ref2.path,
1912
+ _ref2$withDepth = _ref2.withDepth,
1913
+ withDepth = _ref2$withDepth === void 0 ? true : _ref2$withDepth;
1914
+ var result = [];
1915
+ var containerPath = this.getContainerFromPath(path);
1789
1916
 
1790
- var _React$useState = React__default['default'].useState(value),
1791
- state = _React$useState[0],
1792
- setState = _React$useState[1];
1917
+ if (containerPath.startsWith('/')) {
1918
+ containerPath = containerPath.slice(1);
1919
+ }
1793
1920
 
1794
- React.useEffect(function () {
1795
- if (inputRef.current) {
1796
- inputRef.current.indeterminate = indeterminate;
1921
+ var objectPath = path.replace(containerPath, '');
1922
+
1923
+ if (objectPath.endsWith('/')) {
1924
+ objectPath = objectPath.slice(0, -1);
1797
1925
  }
1798
- }, [indeterminate]);
1799
1926
 
1800
- var updateState = function updateState(ev) {
1801
- setState(ev.target.checked);
1802
- onChange(ev.target.checked);
1927
+ result = [].concat(parser(start.toString(), '_from'), parser(pageSize.toString(), 'size'));
1928
+
1929
+ if (withDepth) {
1930
+ var _parser2;
1931
+
1932
+ result = [].concat(result, (_parser2 = parser('1', 'depth')) != null ? _parser2 : []);
1933
+ }
1934
+
1935
+ if (objectPath !== '') {
1936
+ result = [].concat(result, parser(objectPath, 'path__wildcard'));
1937
+ }
1938
+
1939
+ return result;
1803
1940
  };
1804
1941
 
1805
- return /*#__PURE__*/React__default['default'].createElement("div", {
1806
- className: "field"
1807
- }, /*#__PURE__*/React__default['default'].createElement("label", {
1808
- htmlFor: id,
1809
- className: classnames(['checkbox', className])
1810
- }, /*#__PURE__*/React__default['default'].createElement("input", _extends({
1811
- ref: inputRef,
1812
- disabled: disabled || loading,
1813
- id: id,
1814
- type: "checkbox",
1815
- className: classnames(['checkbox', classNameInput]),
1816
- checked: state,
1817
- onChange: updateState,
1818
- "data-test": dataTest
1819
- }, rest)), children || placeholder));
1820
- };
1942
+ _proto.getItemsColumn = function getItemsColumn() {
1943
+ var smallcss = {
1944
+ width: 25
1945
+ };
1946
+ var mediumcss = {
1947
+ width: 120
1948
+ };
1949
+ return [{
1950
+ label: '',
1951
+ child: function child(m) {
1952
+ return /*#__PURE__*/React__default['default'].createElement("td", {
1953
+ style: smallcss
1954
+ }, /*#__PURE__*/React__default['default'].createElement(Icon, {
1955
+ icon: m.icon
1956
+ }));
1957
+ }
1958
+ }, {
1959
+ label: 'type',
1960
+ child: function child(m) {
1961
+ return /*#__PURE__*/React__default['default'].createElement(TdLink, {
1962
+ style: smallcss,
1963
+ model: m
1964
+ }, /*#__PURE__*/React__default['default'].createElement("span", {
1965
+ className: "tag"
1966
+ }, m.type));
1967
+ }
1968
+ }, {
1969
+ label: 'id/name',
1970
+ child: function child(m, navigate, search) {
1971
+ return /*#__PURE__*/React__default['default'].createElement(TdLink, {
1972
+ model: m
1973
+ }, m.name, search && /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement("br", null), /*#__PURE__*/React__default['default'].createElement("span", {
1974
+ className: "is-size-7 tag is-light"
1975
+ }, m.path)));
1976
+ }
1977
+ }, {
1978
+ label: 'created',
1979
+ child: function child(m) {
1980
+ return /*#__PURE__*/React__default['default'].createElement("td", {
1981
+ style: mediumcss,
1982
+ className: "is-size-7 is-vcentered"
1983
+ }, m.created);
1984
+ }
1985
+ }, {
1986
+ label: 'modified',
1987
+ child: function child(m) {
1988
+ return /*#__PURE__*/React__default['default'].createElement("td", {
1989
+ style: mediumcss,
1990
+ className: "is-size-7 is-vcentered"
1991
+ }, m.updated);
1992
+ }
1993
+ }];
1994
+ } // BBB API changes. Compat G5 and G6
1995
+ ;
1821
1996
 
1822
- var ErrorZone = function ErrorZone(_ref) {
1823
- var children = _ref.children,
1824
- id = _ref.id,
1825
- className = _ref.className;
1826
- return /*#__PURE__*/React__default['default'].createElement("p", {
1827
- className: classnames(['help is-danger', className]),
1828
- id: id
1829
- }, children);
1830
- };
1997
+ _proto.applyCompat = function applyCompat(data) {
1998
+ data.member = data.items;
1999
+ data.items_count = data.items_total;
2000
+ return data;
2001
+ };
1831
2002
 
1832
- ErrorZone.propTypes = {
1833
- children: PropTypes__default['default'].node,
1834
- id: PropTypes__default['default'].string,
1835
- className: PropTypes__default['default'].string
1836
- };
2003
+ _proto.search = function search(path, params, container, prepare) {
2004
+ if (container === void 0) {
2005
+ container = false;
2006
+ }
1837
2007
 
1838
- var applyValidators = function applyValidators(value, validators) {
1839
- var validation = Array.isArray(validators) ? validators : [validators];
1840
- var result = true;
1841
- validation.forEach(function (func) {
1842
- if (func(value) === false) {
1843
- result = false;
2008
+ if (prepare === void 0) {
2009
+ prepare = true;
1844
2010
  }
1845
- });
1846
- return result;
1847
- };
1848
2011
 
1849
- var useInput = function useInput(onChange, value, validator) {
1850
- var _React$useState = React__default['default'].useState({
1851
- hasError: false,
1852
- value: value
1853
- }),
1854
- state = _React$useState[0],
1855
- setState = _React$useState[1];
2012
+ try {
2013
+ var _this7 = this;
1856
2014
 
1857
- var onUpdate = function onUpdate(ev) {
1858
- var value = ev && ev.target ? ev.target.value : ev ? ev : '';
1859
- setState({
1860
- value: value,
1861
- hasError: false
1862
- });
1863
- if (onChange) onChange(value);
2015
+ if (path.startsWith('/')) {
2016
+ path = path.slice(1);
2017
+ }
2018
+
2019
+ if (container) {
2020
+ path = _this7.getContainerFromPath(path);
2021
+ }
2022
+
2023
+ var query = prepare ? toQueryString(params) : params;
2024
+ var url = path + "@search?" + query;
2025
+ return Promise.resolve(_this7.rest.get(url)).then(function (res) {
2026
+ return Promise.resolve(res.json()).then(function (data) {
2027
+ return _this7.applyCompat(data);
2028
+ });
2029
+ });
2030
+ } catch (e) {
2031
+ return Promise.reject(e);
2032
+ }
1864
2033
  };
1865
2034
 
1866
- var onBlur = function onBlur() {
1867
- var hasError = applyValidators(state.value, validator) === false;
1868
- if (hasError) setState({
1869
- value: state.value,
1870
- hasError: hasError
1871
- });
2035
+ _proto.canido = function canido(path, permissions) {
2036
+ try {
2037
+ var _this9 = this;
2038
+
2039
+ if (path.startsWith('/')) {
2040
+ path = path.slice(1);
2041
+ }
2042
+
2043
+ if (Array.isArray(permissions)) {
2044
+ permissions.join(',');
2045
+ }
2046
+
2047
+ var url = path + "@canido?permissions=" + permissions;
2048
+ return Promise.resolve(_this9.rest.get(url));
2049
+ } catch (e) {
2050
+ return Promise.reject(e);
2051
+ }
1872
2052
  };
1873
2053
 
1874
- var onFocus = function onFocus() {
1875
- if (state.hasError) {
1876
- setState({
1877
- value: state.value,
1878
- hasError: false
1879
- });
2054
+ _proto.createObject = function createObject(path, data) {
2055
+ try {
2056
+ var _this11 = this;
2057
+
2058
+ return Promise.resolve(_this11.rest.post(path, data));
2059
+ } catch (e) {
2060
+ return Promise.reject(e);
1880
2061
  }
1881
2062
  };
1882
2063
 
1883
- React__default['default'].useEffect(function () {
1884
- setState({
1885
- value: value,
1886
- hasError: false
1887
- });
1888
- }, [value]);
1889
- return {
1890
- onChange: onUpdate,
1891
- onFocus: onFocus,
1892
- onBlur: onBlur,
1893
- state: state
2064
+ _proto.cleanPath = function cleanPath(path) {
2065
+ var url = path.split('/').slice(3);
2066
+ return "" + url.join('/');
1894
2067
  };
1895
- };
1896
2068
 
1897
- // From github.com/protonmail/proton-shared
2069
+ _proto.delete = function _delete(path, data) {
2070
+ try {
2071
+ var _this13 = this;
1898
2072
 
1899
- /* eslint-disable no-useless-escape */
1900
- var REGEX_EMAIL = /(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/i;
1901
- var REGEX_URL = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/;
1902
- var REGEX_HEX_COLOR = /^#([a-f0-9]{3,4}|[a-f0-9]{4}(?:[a-f0-9]{2}){1,2})\b$/i;
1903
- var REGEX_NUMBER = /^\d+$/;
1904
- var isEmpty = function isEmpty(value) {
1905
- if (value === void 0) {
1906
- value = '';
1907
- }
2073
+ return Promise.resolve(_this13.rest.delete(path, data));
2074
+ } catch (e) {
2075
+ return Promise.reject(e);
2076
+ }
2077
+ };
1908
2078
 
1909
- return !value.length;
1910
- };
1911
- var maxLength = function maxLength(value, limit) {
1912
- if (value === void 0) {
1913
- value = '';
1914
- }
2079
+ _proto.create = function create(path, data) {
2080
+ try {
2081
+ var _this15 = this;
1915
2082
 
1916
- if (limit === void 0) {
1917
- limit = 0;
1918
- }
2083
+ if (path.startsWith('/')) {
2084
+ path = path.substring(1);
2085
+ }
1919
2086
 
1920
- return value.length <= limit;
1921
- };
1922
- var minLength = function minLength(value, limit) {
1923
- if (value === void 0) {
1924
- value = '';
1925
- }
2087
+ return Promise.resolve(_this15.rest.post(path, data));
2088
+ } catch (e) {
2089
+ return Promise.reject(e);
2090
+ }
2091
+ };
1926
2092
 
1927
- if (limit === void 0) {
1928
- limit = 0;
1929
- }
2093
+ _proto.post = function post(path, data) {
2094
+ try {
2095
+ var _this17 = this;
1930
2096
 
1931
- return value.length >= limit;
1932
- };
1933
- var isEmail = function isEmail(value) {
1934
- if (value === void 0) {
1935
- value = '';
1936
- }
2097
+ return Promise.resolve(_this17.create(path, data));
2098
+ } catch (e) {
2099
+ return Promise.reject(e);
2100
+ }
2101
+ };
1937
2102
 
1938
- return REGEX_EMAIL.test(value);
1939
- };
1940
- var isURL = function isURL(value) {
1941
- if (value === void 0) {
1942
- value = '';
1943
- }
2103
+ _proto.patch = function patch(path, data) {
2104
+ try {
2105
+ var _this19 = this;
1944
2106
 
1945
- return REGEX_URL.test(value);
1946
- };
1947
- var isHexColor = function isHexColor(value) {
1948
- if (value === void 0) {
1949
- value = '';
1950
- }
2107
+ if (path.startsWith('/')) {
2108
+ path = path.substring(1);
2109
+ }
1951
2110
 
1952
- return REGEX_HEX_COLOR.test(value);
1953
- };
1954
- var isNumber = function isNumber(value) {
1955
- if (value === void 0) {
1956
- value = '';
1957
- }
2111
+ return Promise.resolve(_this19.rest.patch(path, data));
2112
+ } catch (e) {
2113
+ return Promise.reject(e);
2114
+ }
2115
+ };
1958
2116
 
1959
- return REGEX_NUMBER.test(value);
1960
- };
1961
- var notEmpty = function notEmpty(value) {
1962
- return !!value.length;
1963
- };
2117
+ _proto.upload = function upload(path, file) {
2118
+ try {
2119
+ var _this21 = this;
1964
2120
 
1965
- var noop$2 = function noop() {
1966
- return true;
1967
- };
1968
- /** @type any */
2121
+ if (path.startsWith('/')) {
2122
+ path = path.substring(1);
2123
+ }
1969
2124
 
2125
+ return Promise.resolve(_this21.rest.upload(path, file));
2126
+ } catch (e) {
2127
+ return Promise.reject(e);
2128
+ }
2129
+ };
1970
2130
 
1971
- var Input = React__default['default'].forwardRef(function (_ref, ref) {
1972
- var icon = _ref.icon,
1973
- _ref$iconPosition = _ref.iconPosition,
1974
- iconPosition = _ref$iconPosition === void 0 ? 'has-icons-right' : _ref$iconPosition,
1975
- error = _ref.error,
1976
- errorZoneClassName = _ref.errorZoneClassName,
1977
- _ref$autoComplete = _ref.autoComplete,
1978
- autoComplete = _ref$autoComplete === void 0 ? 'off' : _ref$autoComplete,
1979
- _ref$className = _ref.className,
1980
- className = _ref$className === void 0 ? '' : _ref$className,
1981
- _ref$widget = _ref.widget,
1982
- widget = _ref$widget === void 0 ? 'input' : _ref$widget,
1983
- _ref$type = _ref.type,
1984
- type = _ref$type === void 0 ? 'text' : _ref$type,
1985
- _ref$loading = _ref.loading,
1986
- loading = _ref$loading === void 0 ? false : _ref$loading,
1987
- _ref$required = _ref.required,
1988
- required = _ref$required === void 0 ? false : _ref$required,
1989
- id = _ref.id,
1990
- placeholder = _ref.placeholder,
1991
- value = _ref.value,
1992
- _ref$autofocus = _ref.autofocus,
1993
- autofocus = _ref$autofocus === void 0 ? false : _ref$autofocus,
1994
- onChange = _ref.onChange,
1995
- _ref$validator = _ref.validator,
1996
- validator = _ref$validator === void 0 ? noop$2 : _ref$validator,
1997
- errorMessage = _ref.errorMessage,
1998
- _ref$dataTest = _ref.dataTest,
1999
- dataTest = _ref$dataTest === void 0 ? 'testInput' : _ref$dataTest,
2000
- rest = _objectWithoutPropertiesLoose(_ref, ["icon", "iconPosition", "error", "errorZoneClassName", "autoComplete", "className", "widget", "type", "onPressEnter", "isSubmitted", "loading", "required", "id", "placeholder", "value", "autofocus", "onChange", "validator", "errorMessage", "dataTest"]);
2131
+ _proto.download = function download(path) {
2132
+ try {
2133
+ var _this23 = this;
2001
2134
 
2002
- if (required) {
2003
- validator = Array.isArray(validator) ? validator.push(notEmpty) : [validator, notEmpty];
2004
- }
2135
+ if (path.startsWith('/')) {
2136
+ path = path.substring(1);
2137
+ }
2005
2138
 
2006
- var _useInput = useInput(onChange, value != null ? value : '', validator),
2007
- state = _useInput.state,
2008
- handlers = _objectWithoutPropertiesLoose(_useInput, ["state"]);
2139
+ return Promise.resolve(_this23.rest.get(path));
2140
+ } catch (e) {
2141
+ return Promise.reject(e);
2142
+ }
2143
+ };
2009
2144
 
2010
- var _useState = React.useState(generateUID('input')),
2011
- uid = _useState[0];
2145
+ _proto.getTypeSchema = function getTypeSchema(path, name) {
2146
+ try {
2147
+ var _this25 = this;
2012
2148
 
2013
- var _useState2 = React.useState(false),
2014
- mounted = _useState2[0],
2015
- setMounted = _useState2[1]; // eslint-disable-next-line
2149
+ var _temp3 = function _temp3() {
2150
+ return cacheSchemas[name];
2151
+ };
2016
2152
 
2153
+ var _temp4 = function () {
2154
+ if (!cacheSchemas[name]) {
2155
+ var url = _this25.getContainerFromPath(path); // todo: handle db case (only addable containers)
2017
2156
 
2018
- ref = ref || React__default['default'].useRef();
2019
- React.useEffect(function () {
2020
- setMounted(true);
2021
- }, []);
2022
- React.useEffect(function () {
2023
- if (autofocus && !error) {
2024
- ref.current.focus();
2157
+
2158
+ return Promise.resolve(_this25.rest.get(url + "@types/" + name)).then(function (res) {
2159
+ return Promise.resolve(res.json()).then(function (_res$json) {
2160
+ cacheSchemas[name] = _res$json;
2161
+ });
2162
+ });
2163
+ }
2164
+ }();
2165
+
2166
+ return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp3) : _temp3(_temp4));
2167
+ } catch (e) {
2168
+ return Promise.reject(e);
2025
2169
  }
2026
- }, [mounted, autofocus, ref, error]);
2027
- var theError = state.hasError ? errorMessage || 'invalid field' : '';
2028
- var statusClasses = state.hasError ? 'is-danger' : '';
2170
+ };
2029
2171
 
2030
- var cssControl = function cssControl() {
2031
- return icon ? ['control', iconPosition] : ['control'];
2172
+ _proto.getAddons = function getAddons(path) {
2173
+ try {
2174
+ var _this27 = this;
2175
+
2176
+ return Promise.resolve(_this27.rest.get(path + "@addons"));
2177
+ } catch (e) {
2178
+ return Promise.reject(e);
2179
+ }
2032
2180
  };
2033
2181
 
2034
- return /*#__PURE__*/React__default['default'].createElement("div", {
2035
- className: "field"
2036
- }, id && placeholder ? /*#__PURE__*/React__default['default'].createElement("label", {
2037
- className: "label",
2038
- htmlFor: id
2039
- }, placeholder) : null, /*#__PURE__*/React__default['default'].createElement("div", {
2040
- className: classnames(cssControl())
2041
- }, /*#__PURE__*/React__default['default'].createElement("input", _extends({
2042
- className: classnames([widget, className, statusClasses]),
2043
- "aria-invalid": theError,
2044
- "aria-describedby": uid,
2045
- id: id,
2046
- ref: ref,
2047
- type: type,
2048
- value: state.value,
2049
- placeholder: placeholder,
2050
- autoComplete: autoComplete,
2051
- disabled: loading || rest.disabled,
2052
- required: required,
2053
- "data-test": dataTest
2054
- }, handlers, rest)), icon && icon), /*#__PURE__*/React__default['default'].createElement(ErrorZone, {
2055
- className: errorZoneClassName,
2056
- id: uid
2057
- }, state.hasError ? theError : ''));
2058
- });
2059
- Input.propTypes = {
2060
- icon: PropTypes__default['default'].node,
2061
- iconPosition: PropTypes__default['default'].arrayOf(PropTypes__default['default'].oneOf(['has-icons-left', 'has-icons-right', ''])),
2062
- error: PropTypes__default['default'].string,
2063
- errorZoneClassName: PropTypes__default['default'].string,
2064
- autoComplete: PropTypes__default['default'].string,
2065
- autoFocus: PropTypes__default['default'].bool,
2066
- className: PropTypes__default['default'].string,
2067
- disabled: PropTypes__default['default'].bool,
2068
- loading: PropTypes__default['default'].bool,
2069
- isSubmitted: PropTypes__default['default'].bool,
2070
- id: PropTypes__default['default'].string,
2071
- name: PropTypes__default['default'].string,
2072
- onChange: PropTypes__default['default'].func,
2073
- onKeyDown: PropTypes__default['default'].func,
2074
- onKeyUp: PropTypes__default['default'].func,
2075
- onPressEnter: PropTypes__default['default'].func,
2076
- placeholder: PropTypes__default['default'].string,
2077
- readOnly: PropTypes__default['default'].bool,
2078
- required: PropTypes__default['default'].bool,
2079
- type: PropTypes__default['default'].string,
2080
- value: PropTypes__default['default'].oneOfType([PropTypes__default['default'].string, PropTypes__default['default'].number, PropTypes__default['default'].bool])
2081
- };
2182
+ _proto.installAddon = function installAddon(path, key) {
2183
+ try {
2184
+ var _this29 = this;
2185
+
2186
+ return Promise.resolve(_this29.rest.post(path + "@addons", {
2187
+ id: key
2188
+ }));
2189
+ } catch (e) {
2190
+ return Promise.reject(e);
2191
+ }
2192
+ };
2082
2193
 
2083
- var EmailInput = function EmailInput(_ref) {
2084
- var _ref$value = _ref.value,
2085
- value = _ref$value === void 0 ? '' : _ref$value,
2086
- dataTest = _ref.dataTest,
2087
- rest = _objectWithoutPropertiesLoose(_ref, ["value", "dataTest"]);
2194
+ _proto.removeAddon = function removeAddon(path, key) {
2195
+ try {
2196
+ var _this31 = this;
2088
2197
 
2089
- return /*#__PURE__*/React__default['default'].createElement(Input, _extends({
2090
- type: "email",
2091
- validator: isEmail,
2092
- errorMessage: "Email address invalid",
2093
- value: value,
2094
- "data-test": dataTest,
2095
- icon: /*#__PURE__*/React__default['default'].createElement(Icon, {
2096
- icon: "fas fa-envelope"
2097
- })
2098
- }, rest));
2099
- };
2198
+ return Promise.resolve(_this31.rest.delete(path + "@addons", {
2199
+ id: key
2200
+ }));
2201
+ } catch (e) {
2202
+ return Promise.reject(e);
2203
+ }
2204
+ };
2100
2205
 
2101
- var Form = function Form(_ref) {
2102
- var children = _ref.children,
2103
- _ref$className = _ref.className,
2104
- className = _ref$className === void 0 ? '' : _ref$className,
2105
- _ref$onSubmit = _ref.onSubmit,
2106
- onSubmit = _ref$onSubmit === void 0 ? noop : _ref$onSubmit,
2107
- _ref$onReset = _ref.onReset,
2108
- onReset = _ref$onReset === void 0 ? noop : _ref$onReset,
2109
- _ref$autoComplete = _ref.autoComplete,
2110
- autoComplete = _ref$autoComplete === void 0 ? 'off' : _ref$autoComplete,
2111
- title = _ref.title,
2112
- error = _ref.error,
2113
- dataTest = _ref.dataTest,
2114
- rest = _objectWithoutPropertiesLoose(_ref, ["children", "className", "onSubmit", "onReset", "autoComplete", "title", "error", "dataTest"]);
2206
+ _proto.getGroups = function getGroups(path) {
2207
+ try {
2208
+ var _this33 = this;
2115
2209
 
2116
- var handleSubmit = function handleSubmit(event) {
2117
- event.preventDefault();
2118
- onSubmit(event);
2210
+ var endpoint = _this33.getContainerFromPath(path) + "@groups";
2211
+ return Promise.resolve(_this33.rest.get(endpoint));
2212
+ } catch (e) {
2213
+ return Promise.reject(e);
2214
+ }
2119
2215
  };
2120
2216
 
2121
- return /*#__PURE__*/React__default['default'].createElement("div", {
2122
- "data-test": dataTest
2123
- }, title && /*#__PURE__*/React__default['default'].createElement("div", {
2124
- className: "level"
2125
- }, /*#__PURE__*/React__default['default'].createElement("h1", {
2126
- className: "title is-size-4"
2127
- }, title)), error && /*#__PURE__*/React__default['default'].createElement("div", {
2128
- className: "notification is-danger"
2129
- }, error), /*#__PURE__*/React__default['default'].createElement("form", _extends({
2130
- onSubmit: handleSubmit,
2131
- onReset: onReset,
2132
- autoComplete: autoComplete,
2133
- className: classnames(['form', className])
2134
- }, rest), children));
2135
- };
2136
- Form.propTypes = {
2137
- children: PropTypes__default['default'].node.isRequired,
2138
- className: PropTypes__default['default'].string,
2139
- onSubmit: PropTypes__default['default'].func,
2140
- onReset: PropTypes__default['default'].func,
2141
- autoComplete: PropTypes__default['default'].string
2142
- };
2217
+ _proto.getUsers = function getUsers(path) {
2218
+ try {
2219
+ var _this35 = this;
2143
2220
 
2144
- var PasswordInput = function PasswordInput(_ref) {
2145
- var _ref$value = _ref.value,
2146
- value = _ref$value === void 0 ? '' : _ref$value,
2147
- rest = _objectWithoutPropertiesLoose(_ref, ["value"]);
2221
+ var endpoint = _this35.getContainerFromPath(path) + "@users";
2222
+ return Promise.resolve(_this35.rest.get(endpoint));
2223
+ } catch (e) {
2224
+ return Promise.reject(e);
2225
+ }
2226
+ };
2148
2227
 
2149
- return /*#__PURE__*/React__default['default'].createElement(Input, _extends({
2150
- value: value,
2151
- type: "password"
2152
- }, rest));
2153
- };
2228
+ _proto.getPrincipals = function getPrincipals(path) {
2229
+ try {
2230
+ var _this37 = this;
2154
2231
 
2155
- var formComponents = {
2156
- string: Input,
2157
- password: PasswordInput,
2158
- boolean: Checkbox,
2159
- email: EmailInput
2160
- };
2161
- function FormBuilder(_ref) {
2162
- var schema = _ref.schema,
2163
- formData = _ref.formData,
2164
- onSubmit = _ref.onSubmit,
2165
- actionName = _ref.actionName,
2166
- children = _ref.children,
2167
- _ref$exclude = _ref.exclude,
2168
- exclude = _ref$exclude === void 0 ? [] : _ref$exclude,
2169
- _ref$remotes = _ref.remotes,
2170
- remotes = _ref$remotes === void 0 ? [] : _ref$remotes,
2171
- _ref$submitButton = _ref.submitButton,
2172
- submitButton = _ref$submitButton === void 0 ? true : _ref$submitButton,
2173
- rest = _objectWithoutPropertiesLoose(_ref, ["schema", "formData", "title", "onSubmit", "actionName", "children", "exclude", "remotes", "submitButton"]);
2232
+ var groups = _this37.getGroups(path);
2174
2233
 
2175
- var ref = React__default['default'].useRef();
2176
- var properties = schema.properties,
2177
- required = schema.required;
2178
- var values = Object.assign({}, formData || {}); // build initial state
2234
+ var users = _this37.getUsers(path);
2179
2235
 
2180
- var initialState = {};
2181
- var fields = Object.keys(properties).filter(function (x) {
2182
- return !exclude.includes(x);
2183
- });
2184
- fields.forEach(function (element) {
2185
- initialState[element] = values[element] || undefined;
2186
- }); // Register remotes
2236
+ return Promise.resolve(Promise.all([groups, users])).then(function (_ref3) {
2237
+ var gr = _ref3[0],
2238
+ usr = _ref3[1];
2187
2239
 
2188
- if (!ref.current) {
2189
- ref.current = {};
2190
- Object.keys(remotes).forEach(function (item) {
2191
- return ref.current[item] = remotes[item];
2192
- });
2193
- } else {
2194
- // apply remote changes
2195
- Object.keys(remotes).forEach(function (key) {
2196
- if (JSON.stringify(ref.current[key]) !== JSON.stringify(remotes[key])) {
2197
- ref.current[key] = remotes[key];
2198
- }
2199
- });
2200
- }
2240
+ function _temp6(_gr$json) {
2241
+ function _temp5(_usr$json) {
2242
+ return {
2243
+ groups: _gr$json,
2244
+ users: _usr$json
2245
+ };
2246
+ }
2201
2247
 
2202
- ref.current = ref.current || {};
2248
+ var _usr$ok = usr.ok;
2249
+ return _usr$ok ? Promise.resolve(usr.json()).then(_temp5) : _temp5([]);
2250
+ }
2203
2251
 
2204
- var onUpdate = function onUpdate(field) {
2205
- return function (ev) {
2206
- ref.current[field] = ev.target ? ev.target.value : ev.value || ev;
2207
- };
2252
+ var _gr$ok = gr.ok;
2253
+ return _gr$ok ? Promise.resolve(gr.json()).then(_temp6) : _temp6([]);
2254
+ });
2255
+ } catch (e) {
2256
+ return Promise.reject(e);
2257
+ }
2208
2258
  };
2209
2259
 
2210
- var GetTag = function GetTag(_ref2) {
2211
- var field = _ref2.field;
2212
- var Tag = formComponents[properties[field].widget || properties[field].type];
2213
- var props = {
2214
- label: properties[field].title,
2215
- value: initialState[field],
2216
- onChange: onUpdate(field),
2217
- placeholder: properties[field].title || '',
2218
- id: generateUID(),
2219
- dataTest: field + "TestInput"
2220
- };
2260
+ _proto.getRoles = function getRoles(path) {
2261
+ try {
2262
+ var _this39 = this;
2221
2263
 
2222
- if (required.includes(field)) {
2223
- props.required = true;
2224
- props.placeholder += ' *';
2264
+ var endpoint = _this39.getContainerFromPath(path) + "@available-roles";
2265
+ return Promise.resolve(_this39.rest.get(endpoint));
2266
+ } catch (e) {
2267
+ return Promise.reject(e);
2225
2268
  }
2226
-
2227
- Tag.displayName = field + "Field";
2228
- return /*#__PURE__*/React__default['default'].createElement(Tag, props);
2229
2269
  };
2230
2270
 
2231
- var children_ = React__default['default'].Children.map(children, function (child) {
2232
- return React__default['default'].cloneElement(child, {
2233
- onChange: onUpdate
2234
- });
2235
- });
2271
+ _proto.getAllPermissions = function getAllPermissions(path) {
2272
+ try {
2273
+ var _this41 = this;
2236
2274
 
2237
- var changes = function changes() {
2238
- onSubmit(ref.current, values);
2239
- };
2275
+ // paths used to query the API always has to start without a "/"
2276
+ if (path.startsWith('/')) {
2277
+ path = path.slice(1);
2278
+ }
2240
2279
 
2241
- return /*#__PURE__*/React__default['default'].createElement(Form, _extends({
2242
- onSubmit: changes
2243
- }, rest), fields.map(function (field) {
2244
- return /*#__PURE__*/React__default['default'].createElement(GetTag, {
2245
- field: field,
2246
- key: field
2247
- });
2248
- }), children_, submitButton && /*#__PURE__*/React__default['default'].createElement(Button, null, actionName));
2249
- }
2280
+ return Promise.resolve(_this41.rest.get(path + '@all_permissions')).then(function (req) {
2281
+ return Promise.resolve(req.json()).then(function (resp) {
2282
+ var permissions = Array.from(new Set(extractPermissions(resp)));
2283
+ return permissions;
2284
+ });
2285
+ });
2286
+ } catch (e) {
2287
+ return Promise.reject(e);
2288
+ }
2289
+ };
2250
2290
 
2251
- /** @type any */
2291
+ _proto.getTypes = function getTypes(path) {
2292
+ try {
2293
+ var _this43 = this;
2252
2294
 
2253
- var Select = React__default['default'].forwardRef(function (_ref, ref) {
2254
- var options = _ref.options,
2255
- error = _ref.error,
2256
- errorZoneClassName = _ref.errorZoneClassName,
2257
- _ref$size = _ref.size,
2258
- size = _ref$size === void 0 ? 1 : _ref$size,
2259
- placeholder = _ref.placeholder,
2260
- id = _ref.id,
2261
- _ref$className = _ref.className,
2262
- className = _ref$className === void 0 ? '' : _ref$className,
2263
- _ref$classWrap = _ref.classWrap,
2264
- classWrap = _ref$classWrap === void 0 ? '' : _ref$classWrap,
2265
- _ref$multiple = _ref.multiple,
2266
- multiple = _ref$multiple === void 0 ? false : _ref$multiple,
2267
- _ref$loading = _ref.loading,
2268
- loading = _ref$loading === void 0 ? false : _ref$loading,
2269
- onChange = _ref.onChange,
2270
- _ref$appendDefault = _ref.appendDefault,
2271
- appendDefault = _ref$appendDefault === void 0 ? false : _ref$appendDefault,
2272
- _ref$style = _ref.style,
2273
- style = _ref$style === void 0 ? {} : _ref$style,
2274
- dataTest = _ref.dataTest,
2275
- rest = _objectWithoutPropertiesLoose(_ref, ["options", "error", "errorZoneClassName", "size", "placeholder", "id", "className", "classWrap", "multiple", "loading", "isSubmitted", "onChange", "appendDefault", "style", "dataTest"]);
2295
+ var _temp10 = function _temp10() {
2296
+ return cacheTypes[path];
2297
+ };
2276
2298
 
2277
- var _useState = React.useState(generateUID('select')),
2278
- uid = _useState[0];
2299
+ if (path.startsWith('/')) {
2300
+ path = path.slice(1);
2301
+ }
2279
2302
 
2280
- var onUpdate = function onUpdate(ev) {
2281
- if (ev.target.value === '') {
2282
- onChange({
2283
- target: {
2284
- value: undefined
2303
+ var _temp11 = function () {
2304
+ if (!cacheTypes[path]) {
2305
+ return Promise.resolve(_this43.rest.get(path + '@addable-types')).then(function (types) {
2306
+ var _temp7 = function () {
2307
+ if (types.status === 401 || types.status === 404) {
2308
+ cacheTypes[path] = [];
2309
+ } else {
2310
+ return Promise.resolve(types.json()).then(function (res) {
2311
+ cacheTypes[path] = res;
2312
+ });
2313
+ }
2314
+ }();
2315
+
2316
+ if (_temp7 && _temp7.then) return _temp7.then(function () {});
2317
+ });
2285
2318
  }
2286
- });
2287
- } else {
2288
- onChange(ev);
2319
+ }();
2320
+
2321
+ return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(_temp10) : _temp10(_temp11));
2322
+ } catch (e) {
2323
+ return Promise.reject(e);
2289
2324
  }
2290
2325
  };
2291
2326
 
2292
- if (appendDefault) {
2293
- options = [{
2294
- text: 'Choose..',
2295
- value: ''
2296
- }].concat(options);
2327
+ return GuillotinaClient;
2328
+ }();
2329
+ function getClient(url, container, auth) {
2330
+ return new GuillotinaClient(new RestClient(url, container, auth), container === '/');
2331
+ }
2332
+ var lightFileReader = function lightFileReader(file) {
2333
+ try {
2334
+ return Promise.resolve(new Promise(function (resolve) {
2335
+ var reader = new FileReader();
2336
+ reader.readAsArrayBuffer(file);
2337
+
2338
+ reader.onloadend = function (e) {
2339
+ var fileData = e.target.result;
2340
+ resolve({
2341
+ filename: file.name.normalize('NFD').replace(/[\u0300-\u036f]/g, ''),
2342
+ data: fileData,
2343
+ 'content-type': file.type
2344
+ });
2345
+ };
2346
+ }));
2347
+ } catch (e) {
2348
+ return Promise.reject(e);
2297
2349
  }
2350
+ };
2298
2351
 
2299
- var statusClasses = error ? 'is-danger' : '';
2300
- var cssWrap = ['select', statusClasses, multiple ? 'is-multiple' : '', classWrap];
2301
- return /*#__PURE__*/React__default['default'].createElement("div", {
2302
- className: "field"
2303
- }, id && placeholder ? /*#__PURE__*/React__default['default'].createElement("label", {
2304
- className: "label",
2305
- htmlFor: id
2306
- }, placeholder) : null, /*#__PURE__*/React__default['default'].createElement("div", {
2307
- className: classnames(cssWrap)
2308
- }, /*#__PURE__*/React__default['default'].createElement("select", _extends({
2309
- className: classnames(['', className]),
2310
- size: size,
2311
- multiple: multiple,
2312
- disabled: loading || rest.disabled,
2313
- onChange: onUpdate
2314
- }, rest, {
2315
- ref: ref,
2316
- style: style,
2317
- "data-test": dataTest
2318
- }), options.map(function (_ref2, index) {
2319
- var text = _ref2.text,
2320
- rest = _objectWithoutPropertiesLoose(_ref2, ["text"]);
2352
+ var extractPermissions = function extractPermissions(data) {
2353
+ var result = [];
2321
2354
 
2322
- return /*#__PURE__*/React__default['default'].createElement("option", _extends({
2323
- key: index.toString()
2324
- }, rest), text);
2325
- }))), error && /*#__PURE__*/React__default['default'].createElement(ErrorZone, {
2326
- className: errorZoneClassName,
2327
- id: uid
2328
- }, error ? error : ''));
2329
- });
2330
- Select.propTypes = {
2331
- error: PropTypes__default['default'].string,
2332
- disabled: PropTypes__default['default'].bool,
2333
- loading: PropTypes__default['default'].bool,
2334
- isSubmitted: PropTypes__default['default'].bool,
2335
- size: PropTypes__default['default'].number,
2336
- onChange: PropTypes__default['default'].func,
2337
- options: PropTypes__default['default'].arrayOf(PropTypes__default['default'].object),
2338
- multiple: PropTypes__default['default'].bool,
2339
- className: PropTypes__default['default'].string
2355
+ if (typeof data !== 'object') ; else if (!Array.isArray(data) && data.permission) {
2356
+ result = result.concat([data.permission]);
2357
+ } else if (!Array.isArray(data)) {
2358
+ Object.keys(data).map(function (key) {
2359
+ return result = result.concat(extractPermissions(data[key]));
2360
+ });
2361
+ } else if (Array.isArray(data)) {
2362
+ data.map(function (item) {
2363
+ return result = result.concat(extractPermissions(item));
2364
+ });
2365
+ }
2366
+
2367
+ return result;
2340
2368
  };
2341
2369
 
2342
2370
  function FileUpload(_ref) {
@@ -2799,7 +2827,7 @@ function Dropdown(_ref) {
2799
2827
  // eslint-disable-next-line jsx-a11y/anchor-is-valid
2800
2828
  React__default['default'].createElement("a", {
2801
2829
  className: disabled ? 'dropdown-item is-active' : 'dropdown-item',
2802
- "data-test": "dropdownItemTest-" + option.text.toLowerCase(),
2830
+ "data-test": "dropdownItemTest-" + option.value.toLowerCase(),
2803
2831
  key: option.text,
2804
2832
  onClick: disabled ? undefined : function () {
2805
2833
  return onChange(option.value);
@@ -2815,61 +2843,6 @@ function Dropdown(_ref) {
2815
2843
  }))));
2816
2844
  }
2817
2845
 
2818
- var plain = ['string', 'number', 'boolean'];
2819
- function RenderField(_ref) {
2820
- var value = _ref.value,
2821
- Widget = _ref.Widget;
2822
- if (value === null || value === undefined) return '';
2823
-
2824
- if (Widget) {
2825
- return /*#__PURE__*/React__default['default'].createElement(Widget, {
2826
- value: value
2827
- });
2828
- }
2829
-
2830
- var type = typeof value;
2831
-
2832
- if (plain.includes(type)) {
2833
- return value;
2834
- }
2835
-
2836
- if (type === 'object') {
2837
- if (Array.isArray(value)) {
2838
- return value.map(function (item) {
2839
- return /*#__PURE__*/React__default['default'].createElement("div", {
2840
- key: item
2841
- }, /*#__PURE__*/React__default['default'].createElement(RenderField, {
2842
- value: item
2843
- }));
2844
- });
2845
- }
2846
-
2847
- return Object.keys(value).map(function (key) {
2848
- return /*#__PURE__*/React__default['default'].createElement(FieldValue, {
2849
- field: key,
2850
- value: value[key],
2851
- key: key
2852
- });
2853
- });
2854
- }
2855
-
2856
- return /*#__PURE__*/React__default['default'].createElement("p", null, "No render for ", JSON.stringify(value));
2857
- }
2858
-
2859
- var FieldValue = function FieldValue(_ref2) {
2860
- var field = _ref2.field,
2861
- value = _ref2.value;
2862
- return /*#__PURE__*/React__default['default'].createElement("div", {
2863
- className: "field"
2864
- }, /*#__PURE__*/React__default['default'].createElement("div", {
2865
- className: "label"
2866
- }, field), /*#__PURE__*/React__default['default'].createElement("div", {
2867
- className: "value"
2868
- }, /*#__PURE__*/React__default['default'].createElement(RenderField, {
2869
- value: value
2870
- })));
2871
- };
2872
-
2873
2846
  var formatDate = function formatDate(str) {
2874
2847
  var d = new Date(str);
2875
2848
  var minutes = d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes();
@@ -2899,86 +2872,6 @@ function getNewId(id) {
2899
2872
  });
2900
2873
  }
2901
2874
 
2902
- var DownloadField = function DownloadField(_ref) {
2903
- var value = _ref.value;
2904
- var Ctx = useTraversal();
2905
- var data = value.data,
2906
- field = value.field;
2907
-
2908
- var getField = function getField(downloadFile) {
2909
- try {
2910
- var endpoint = Ctx.path + "@download/" + field;
2911
- return Promise.resolve(Ctx.client.download(endpoint)).then(function (res) {
2912
- return Promise.resolve(res.blob()).then(function (text) {
2913
- var blob = new Blob([text], {
2914
- type: data.content_type
2915
- });
2916
- var url = window.URL.createObjectURL(blob); // Create blob link to download
2917
-
2918
- var link = document.createElement('a');
2919
- link.href = url;
2920
-
2921
- if (downloadFile) {
2922
- link.setAttribute('download', "" + data.filename);
2923
- } else {
2924
- link.setAttribute('target', "_blank");
2925
- }
2926
-
2927
- document.body.appendChild(link);
2928
- link.click();
2929
- setTimeout(function () {
2930
- var _link$parentNode;
2931
-
2932
- // For Firefox it is necessary to delay revoking the ObjectURL
2933
- window.URL.revokeObjectURL(url);
2934
- (_link$parentNode = link.parentNode) == null ? void 0 : _link$parentNode.removeChild(link);
2935
- }, 100);
2936
- });
2937
- });
2938
- } catch (e) {
2939
- return Promise.reject(e);
2940
- }
2941
- };
2942
-
2943
- return /*#__PURE__*/React.createElement("div", {
2944
- className: "field"
2945
- }, /*#__PURE__*/React.createElement("div", {
2946
- className: "label"
2947
- }, data.filename), /*#__PURE__*/React.createElement("div", {
2948
- className: "columns"
2949
- }, /*#__PURE__*/React.createElement("div", {
2950
- className: "column"
2951
- }, /*#__PURE__*/React.createElement("button", {
2952
- className: "button is-small is-primary level-left",
2953
- onClick: function onClick(event) {
2954
- try {
2955
- event.preventDefault();
2956
- event.stopPropagation();
2957
- getField(false);
2958
- return Promise.resolve();
2959
- } catch (e) {
2960
- return Promise.reject(e);
2961
- }
2962
- }
2963
- }, "Open")), /*#__PURE__*/React.createElement("div", {
2964
- className: "column"
2965
- }, /*#__PURE__*/React.createElement("button", {
2966
- className: "button is-small is-primary level-right",
2967
- onClick: function onClick(event) {
2968
- try {
2969
- event.preventDefault();
2970
- event.stopPropagation();
2971
- getField(true);
2972
- return Promise.resolve();
2973
- } catch (e) {
2974
- return Promise.reject(e);
2975
- }
2976
- }
2977
- }, "Download"))));
2978
- };
2979
-
2980
- var DEFAULT_VALUE_EDITABLE_FIELD = 'Click to edit';
2981
- var DEFAULT_VALUE_NO_EDITABLE_FIELD = ' -- ';
2982
2875
  function EditableField(_ref) {
2983
2876
  var field = _ref.field,
2984
2877
  value = _ref.value,
@@ -3002,36 +2895,17 @@ function EditableField(_ref) {
3002
2895
  loading = _useCrudContext.loading,
3003
2896
  Ctx = _useCrudContext.Ctx;
3004
2897
 
2898
+ var _useConfig = useConfig(),
2899
+ fieldHaveDeleteButton = _useConfig.fieldHaveDeleteButton;
2900
+
3005
2901
  var EditComponent = Ctx.registry.get('components', 'EditComponent');
2902
+ var RenderFieldComponent = Ctx.registry.get('components', 'RenderFieldComponent');
3006
2903
  React.useEffect(function () {
3007
2904
  if (isEdit && ref.current) {
3008
2905
  ref.current.focus();
3009
2906
  }
3010
- });
3011
- var canModified = modifyContent && !get$1(schema, 'readonly', false);
3012
- var haveDeleteBtn = (schema == null ? void 0 : schema.widget) === 'file' || (schema == null ? void 0 : schema.widget) === 'select' || (schema == null ? void 0 : schema.type) === 'array';
3013
-
3014
- var getRenderProps = function getRenderProps() {
3015
- var renderProps = {
3016
- value: val != null ? val : modifyContent ? DEFAULT_VALUE_EDITABLE_FIELD : DEFAULT_VALUE_NO_EDITABLE_FIELD
3017
- };
3018
-
3019
- if (val && (schema == null ? void 0 : schema.widget) === 'file') {
3020
- renderProps['value'] = {
3021
- data: val,
3022
- field: field
3023
- };
3024
- renderProps['Widget'] = DownloadField;
3025
- } else if ((schema == null ? void 0 : schema.type) === 'boolean') {
3026
- var _val$toString;
3027
-
3028
- renderProps['value'] = (_val$toString = val == null ? void 0 : val.toString()) != null ? _val$toString : renderProps['value'];
3029
- } else if (val && (schema == null ? void 0 : schema.type) === 'datetime') {
3030
- renderProps['value'] = new Date(val).toLocaleString();
3031
- }
3032
-
3033
- return renderProps;
3034
- };
2907
+ });
2908
+ var canModified = modifyContent && !get$1(schema, 'readonly', false);
3035
2909
 
3036
2910
  var saveField = function saveField(ev) {
3037
2911
  try {
@@ -3128,7 +3002,12 @@ function EditableField(_ref) {
3128
3002
  setEdit(!!canModified);
3129
3003
  },
3130
3004
  "data-test": "editableFieldTest-" + field
3131
- }, /*#__PURE__*/React__default['default'].createElement(RenderField, getRenderProps()), canModified && /*#__PURE__*/React__default['default'].createElement(Icon, {
3005
+ }, /*#__PURE__*/React__default['default'].createElement(RenderFieldComponent, {
3006
+ schema: schema,
3007
+ field: field,
3008
+ val: val,
3009
+ modifyContent: modifyContent
3010
+ }), canModified && /*#__PURE__*/React__default['default'].createElement(Icon, {
3132
3011
  icon: "fas fa-edit"
3133
3012
  })), isEdit && /*#__PURE__*/React__default['default'].createElement("div", {
3134
3013
  className: "field",
@@ -3158,7 +3037,7 @@ function EditableField(_ref) {
3158
3037
  return setEdit(false);
3159
3038
  },
3160
3039
  dataTest: "editableFieldBtnCancelTest"
3161
- }, "Cancel")), !required && haveDeleteBtn && /*#__PURE__*/React__default['default'].createElement("div", {
3040
+ }, "Cancel")), !required && fieldHaveDeleteButton(schema) && /*#__PURE__*/React__default['default'].createElement("div", {
3162
3041
  className: "control"
3163
3042
  }, /*#__PURE__*/React__default['default'].createElement(Button, {
3164
3043
  className: "is-small is-danger",
@@ -3167,6 +3046,172 @@ function EditableField(_ref) {
3167
3046
  }, "Delete")))));
3168
3047
  }
3169
3048
 
3049
+ var DownloadField = function DownloadField(_ref) {
3050
+ var value = _ref.value;
3051
+ var Ctx = useTraversal();
3052
+ var data = value.data,
3053
+ field = value.field;
3054
+
3055
+ var getField = function getField(downloadFile) {
3056
+ try {
3057
+ var endpoint = Ctx.path + "@download/" + field;
3058
+ return Promise.resolve(Ctx.client.download(endpoint)).then(function (res) {
3059
+ return Promise.resolve(res.blob()).then(function (text) {
3060
+ var blob = new Blob([text], {
3061
+ type: data.content_type
3062
+ });
3063
+ var url = window.URL.createObjectURL(blob); // Create blob link to download
3064
+
3065
+ var link = document.createElement('a');
3066
+ link.href = url;
3067
+
3068
+ if (downloadFile) {
3069
+ link.setAttribute('download', "" + data.filename);
3070
+ } else {
3071
+ link.setAttribute('target', "_blank");
3072
+ }
3073
+
3074
+ document.body.appendChild(link);
3075
+ link.click();
3076
+ setTimeout(function () {
3077
+ var _link$parentNode;
3078
+
3079
+ // For Firefox it is necessary to delay revoking the ObjectURL
3080
+ window.URL.revokeObjectURL(url);
3081
+ (_link$parentNode = link.parentNode) == null ? void 0 : _link$parentNode.removeChild(link);
3082
+ }, 100);
3083
+ });
3084
+ });
3085
+ } catch (e) {
3086
+ return Promise.reject(e);
3087
+ }
3088
+ };
3089
+
3090
+ return /*#__PURE__*/React.createElement("div", {
3091
+ className: "field"
3092
+ }, /*#__PURE__*/React.createElement("div", {
3093
+ className: "label"
3094
+ }, data.filename), /*#__PURE__*/React.createElement("div", {
3095
+ className: "columns"
3096
+ }, /*#__PURE__*/React.createElement("div", {
3097
+ className: "column"
3098
+ }, /*#__PURE__*/React.createElement("button", {
3099
+ className: "button is-small is-primary level-left",
3100
+ onClick: function onClick(event) {
3101
+ try {
3102
+ event.preventDefault();
3103
+ event.stopPropagation();
3104
+ getField(false);
3105
+ return Promise.resolve();
3106
+ } catch (e) {
3107
+ return Promise.reject(e);
3108
+ }
3109
+ }
3110
+ }, "Open")), /*#__PURE__*/React.createElement("div", {
3111
+ className: "column"
3112
+ }, /*#__PURE__*/React.createElement("button", {
3113
+ className: "button is-small is-primary level-right",
3114
+ onClick: function onClick(event) {
3115
+ try {
3116
+ event.preventDefault();
3117
+ event.stopPropagation();
3118
+ getField(true);
3119
+ return Promise.resolve();
3120
+ } catch (e) {
3121
+ return Promise.reject(e);
3122
+ }
3123
+ }
3124
+ }, "Download"))));
3125
+ };
3126
+
3127
+ var plain = ['string', 'number', 'boolean'];
3128
+ function RenderField(_ref) {
3129
+ var value = _ref.value,
3130
+ Widget = _ref.Widget;
3131
+ if (value === null || value === undefined) return '';
3132
+
3133
+ if (Widget) {
3134
+ return /*#__PURE__*/React__default['default'].createElement(Widget, {
3135
+ value: value
3136
+ });
3137
+ }
3138
+
3139
+ var type = typeof value;
3140
+
3141
+ if (plain.includes(type)) {
3142
+ return value;
3143
+ }
3144
+
3145
+ if (type === 'object') {
3146
+ if (Array.isArray(value)) {
3147
+ return value.map(function (item) {
3148
+ return /*#__PURE__*/React__default['default'].createElement("div", {
3149
+ key: item
3150
+ }, /*#__PURE__*/React__default['default'].createElement(RenderField, {
3151
+ value: item
3152
+ }));
3153
+ });
3154
+ }
3155
+
3156
+ return Object.keys(value).map(function (key) {
3157
+ return /*#__PURE__*/React__default['default'].createElement(FieldValue, {
3158
+ field: key,
3159
+ value: value[key],
3160
+ key: key
3161
+ });
3162
+ });
3163
+ }
3164
+
3165
+ return /*#__PURE__*/React__default['default'].createElement("p", null, "No render for ", JSON.stringify(value));
3166
+ }
3167
+
3168
+ var FieldValue = function FieldValue(_ref2) {
3169
+ var field = _ref2.field,
3170
+ value = _ref2.value;
3171
+ return /*#__PURE__*/React__default['default'].createElement("div", {
3172
+ className: "field"
3173
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
3174
+ className: "label"
3175
+ }, field), /*#__PURE__*/React__default['default'].createElement("div", {
3176
+ className: "value"
3177
+ }, /*#__PURE__*/React__default['default'].createElement(RenderField, {
3178
+ value: value
3179
+ })));
3180
+ };
3181
+
3182
+ var DEFAULT_VALUE_EDITABLE_FIELD = 'Click to edit';
3183
+ var DEFAULT_VALUE_NO_EDITABLE_FIELD = ' -- ';
3184
+ function RenderFieldComponent(_ref3) {
3185
+ var schema = _ref3.schema,
3186
+ field = _ref3.field,
3187
+ val = _ref3.val,
3188
+ modifyContent = _ref3.modifyContent;
3189
+
3190
+ var getRenderProps = function getRenderProps() {
3191
+ var renderProps = {
3192
+ value: val != null ? val : modifyContent ? DEFAULT_VALUE_EDITABLE_FIELD : DEFAULT_VALUE_NO_EDITABLE_FIELD
3193
+ };
3194
+
3195
+ if (val && (schema == null ? void 0 : schema.widget) === 'file') {
3196
+ renderProps['value'] = {
3197
+ data: val,
3198
+ field: field
3199
+ };
3200
+ renderProps['Widget'] = DownloadField;
3201
+ } else if ((schema == null ? void 0 : schema.type) === 'boolean') {
3202
+ var _val$toString;
3203
+
3204
+ renderProps['value'] = (_val$toString = val == null ? void 0 : val.toString()) != null ? _val$toString : renderProps['value'];
3205
+ } else if (val && (schema == null ? void 0 : schema.type) === 'datetime') {
3206
+ renderProps['value'] = new Date(val).toLocaleString();
3207
+ }
3208
+
3209
+ return renderProps;
3210
+ };
3211
+
3212
+ return /*#__PURE__*/React__default['default'].createElement(RenderField, getRenderProps());
3213
+ }
3214
+
3170
3215
  function IAttachment(_ref) {
3171
3216
  var properties = _ref.properties,
3172
3217
  values = _ref.values;
@@ -3730,7 +3775,9 @@ function ItemsActionsProvider(_ref) {
3730
3775
  * and it select/unselect all items of the page.
3731
3776
  */
3732
3777
 
3733
- function AllItemsCheckbox() {
3778
+ function AllItemsCheckbox(_ref2) {
3779
+ var dataTest = _ref2.dataTest;
3780
+
3734
3781
  var _useContext = React.useContext(ItemsActionsCtx),
3735
3782
  onSelectAllItems = _useContext.onSelectAllItems,
3736
3783
  selected = _useContext.selected;
@@ -3741,15 +3788,17 @@ function AllItemsCheckbox() {
3741
3788
  style: {
3742
3789
  marginLeft: 2
3743
3790
  },
3744
- value: selected.all
3791
+ value: selected.all,
3792
+ dataTest: dataTest
3745
3793
  });
3746
3794
  }
3747
3795
  /**
3748
3796
  * Checkbox component to select ONE item.
3749
3797
  */
3750
3798
 
3751
- function ItemCheckbox(_ref2) {
3752
- var item = _ref2.item;
3799
+ function ItemCheckbox(_ref3) {
3800
+ var item = _ref3.item,
3801
+ dataTest = _ref3.dataTest;
3753
3802
 
3754
3803
  var _useContext2 = React.useContext(ItemsActionsCtx),
3755
3804
  selected = _useContext2.selected,
@@ -3762,7 +3811,8 @@ function ItemCheckbox(_ref2) {
3762
3811
  onChange: function onChange() {
3763
3812
  return onSelectOneItem(item);
3764
3813
  },
3765
- value: value
3814
+ value: value,
3815
+ dataTest: dataTest
3766
3816
  });
3767
3817
  }
3768
3818
  /**
@@ -3795,7 +3845,9 @@ function ItemsActionsDropdown() {
3795
3845
  });
3796
3846
  },
3797
3847
  options: options
3798
- }, "Choose action...");
3848
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
3849
+ "data-test": "btnChooseActionTest"
3850
+ }, "Choose action..."));
3799
3851
  }
3800
3852
 
3801
3853
  /* eslint jsx-a11y/anchor-is-valid: "off" */
@@ -4046,7 +4098,8 @@ function RItem(_ref2) {
4046
4098
  }, /*#__PURE__*/React__default['default'].createElement("td", {
4047
4099
  style: smallcss
4048
4100
  }, /*#__PURE__*/React__default['default'].createElement(ItemCheckbox, {
4049
- item: item
4101
+ item: item,
4102
+ dataTest: "itemCheckboxRowTest"
4050
4103
  })), columns.map(function (i) {
4051
4104
  return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, {
4052
4105
  key: i.label
@@ -5844,7 +5897,7 @@ function CopyItems(props) {
5844
5897
  items = _props$items === void 0 ? [] : _props$items;
5845
5898
  return /*#__PURE__*/React__default['default'].createElement(PathTree, {
5846
5899
  title: "Copy to...",
5847
- defaultPath: "/" + Ctx.path.split(getContainerFromPath(Ctx.path))[1],
5900
+ defaultPath: Ctx.client.clearContainerFromPath(Ctx.path),
5848
5901
  onConfirm: copyItems,
5849
5902
  onCancel: function onCancel() {
5850
5903
  return Ctx.cancelAction();
@@ -5860,12 +5913,15 @@ function CopyItems(props) {
5860
5913
  }, "New id for \"" + item.id + "\" copy"), /*#__PURE__*/React__default['default'].createElement("input", {
5861
5914
  type: "text",
5862
5915
  className: "input",
5916
+ "data-test": "inputCopyIdTest-" + item['@name'],
5863
5917
  defaultValue: getNewId(item.id)
5864
5918
  }));
5865
5919
  }), "\xA0");
5866
5920
  }
5867
5921
 
5868
5922
  function CopyItem(props) {
5923
+ var _item$parent$Name;
5924
+
5869
5925
  var copyItem = function copyItem(path, form) {
5870
5926
  try {
5871
5927
  var input = form[1] || {};
@@ -5898,7 +5954,7 @@ function CopyItem(props) {
5898
5954
  var item = props.item;
5899
5955
  return /*#__PURE__*/React__default['default'].createElement(PathTree, {
5900
5956
  title: "Copy to...",
5901
- defaultPath: "/" + item['parent']['@name'],
5957
+ defaultPath: "/" + ((_item$parent$Name = item['parent']['@name']) != null ? _item$parent$Name : '/'),
5902
5958
  onConfirm: copyItem,
5903
5959
  onCancel: function onCancel() {
5904
5960
  return Ctx.cancelAction();
@@ -5911,6 +5967,7 @@ function CopyItem(props) {
5911
5967
  }, "New id for \"" + item['@name'] + "\" copy"), /*#__PURE__*/React__default['default'].createElement("input", {
5912
5968
  type: "text",
5913
5969
  className: "input",
5970
+ "data-test": "inputCopyIdTest-" + item['@name'],
5914
5971
  defaultValue: getNewId(item['@name'])
5915
5972
  })));
5916
5973
  }
@@ -6406,7 +6463,7 @@ function GroupCtx() {
6406
6463
  }, /*#__PURE__*/React__default['default'].createElement("h3", {
6407
6464
  className: "title is-size-6"
6408
6465
  }, "Users"), /*#__PURE__*/React__default['default'].createElement("p", null, "Add a User"), /*#__PURE__*/React__default['default'].createElement(SearchInput, {
6409
- path: getContainerFromPath(Ctx.path),
6466
+ path: Ctx.containerPath,
6410
6467
  qs: [].concat(searchParsed, sortParsed),
6411
6468
  traversal: Ctx,
6412
6469
  onChange: addUser,
@@ -6539,7 +6596,8 @@ function Path() {
6539
6596
  key: indx
6540
6597
  }, /*#__PURE__*/React__default['default'].createElement("a", {
6541
6598
  href: path,
6542
- onClick: onClick
6599
+ onClick: onClick,
6600
+ "data-test": "breadcrumbItemTest-home"
6543
6601
  }, /*#__PURE__*/React__default['default'].createElement("span", {
6544
6602
  className: "icon"
6545
6603
  }, /*#__PURE__*/React__default['default'].createElement("i", {
@@ -6710,7 +6768,8 @@ var registry = {
6710
6768
  properties: {},
6711
6769
  components: {
6712
6770
  Path: Path,
6713
- EditComponent: EditComponent
6771
+ EditComponent: EditComponent,
6772
+ RenderFieldComponent: RenderFieldComponent
6714
6773
  },
6715
6774
  searchEngineQueryParamsFunction: {
6716
6775
  PostreSQL: 'getQueryParamsPostresql',
@@ -7065,148 +7124,126 @@ var ERRORS = {
7065
7124
  failed_to_fetch: 'Failed to fetch data: Backend not running?',
7066
7125
  invalid_credentials: 'Failed! Invalid credentials'
7067
7126
  };
7068
- var Login = /*#__PURE__*/function (_Component) {
7069
- _inheritsLoose(Login, _Component);
7070
-
7071
- function Login(props) {
7072
- var _this;
7073
-
7074
- _this = _Component.call(this, props) || this;
7075
- _this.state = {
7076
- username: '',
7077
- password: '',
7078
- loading: undefined,
7079
- schema: '',
7080
- errors: undefined
7081
- };
7082
- _this.ref = React__default['default'].createRef();
7127
+ var initialState$4 = {
7128
+ username: '',
7129
+ password: '',
7130
+ loading: undefined,
7131
+ errors: undefined
7132
+ };
7133
+ var Login = function Login(_ref) {
7134
+ var currentSchema = _ref.currentSchema,
7135
+ setCurrentSchema = _ref.setCurrentSchema,
7136
+ schemas = _ref.schemas,
7137
+ auth = _ref.auth,
7138
+ onLogin = _ref.onLogin;
7139
+
7140
+ var _useSetState = useSetState(initialState$4),
7141
+ state = _useSetState[0],
7142
+ setState = _useSetState[1];
7083
7143
 
7084
- _this.doLogin = function (ev) {
7085
- try {
7086
- ev.preventDefault();
7144
+ var inputRef = React.useRef(null);
7145
+ React.useEffect(function () {
7146
+ if (inputRef) {
7147
+ inputRef.current.focus();
7148
+ }
7149
+ }, [inputRef]);
7087
7150
 
7088
- _this.setState({
7089
- loading: true,
7090
- errors: undefined
7091
- });
7151
+ var doLogin = function doLogin(ev) {
7152
+ try {
7153
+ ev.preventDefault();
7154
+ setState({
7155
+ loading: true,
7156
+ errors: undefined
7157
+ });
7158
+ var username = state.username,
7159
+ password = state.password;
7092
7160
 
7093
- var _this$state = _this.state,
7094
- username = _this$state.username,
7095
- password = _this$state.password,
7096
- schema = _this$state.schema;
7161
+ if (currentSchema !== '') {
7162
+ auth.setAccount(currentSchema);
7163
+ }
7097
7164
 
7098
- if (schema !== '') {
7099
- _this.props.auth.setAccount(schema);
7165
+ return Promise.resolve(auth.login(username, password)).then(function (res) {
7166
+ if (!res) {
7167
+ setState({
7168
+ errors: auth.errors,
7169
+ loading: false
7170
+ });
7171
+ return;
7100
7172
  }
7101
7173
 
7102
- var auth = _this.props.auth;
7103
- return Promise.resolve(auth.login(username, password)).then(function (res) {
7104
- if (!res) {
7105
- _this.setState({
7106
- errors: auth.errors,
7107
- loading: false
7108
- });
7109
-
7110
- return;
7111
- }
7112
-
7113
- if (_this.props.onLogin) {
7114
- _this.props.onLogin();
7115
- }
7116
- });
7117
- } catch (e) {
7118
- return Promise.reject(e);
7119
- }
7120
- };
7121
-
7122
- if (props.schemas) {
7123
- _this.state.schema = props.schemas[0];
7174
+ if (onLogin) {
7175
+ onLogin();
7176
+ }
7177
+ });
7178
+ } catch (e) {
7179
+ return Promise.reject(e);
7124
7180
  }
7125
-
7126
- return _this;
7127
- }
7128
-
7129
- var _proto = Login.prototype;
7130
-
7131
- _proto.componentDidMount = function componentDidMount() {
7132
- this.ref.current.focus();
7133
7181
  };
7134
7182
 
7135
- _proto.render = function render() {
7136
- var _this2 = this;
7137
-
7138
- var _this$state2 = this.state,
7139
- password = _this$state2.password,
7140
- username = _this$state2.username,
7141
- errors = _this$state2.errors;
7142
- var schemas = this.props.schemas;
7143
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement("form", {
7144
- className: "login__form",
7145
- action: "",
7146
- onSubmit: this.doLogin,
7147
- "data-test": "formLoginTest"
7148
- }, /*#__PURE__*/React__default['default'].createElement("div", {
7149
- className: "field"
7150
- }, /*#__PURE__*/React__default['default'].createElement("label", {
7151
- className: "label"
7152
- }, "Username:"), /*#__PURE__*/React__default['default'].createElement("input", {
7153
- type: "text",
7154
- className: "input",
7155
- placeholder: "Username",
7156
- onChange: function onChange(e) {
7157
- return _this2.setState({
7158
- username: e.target.value
7159
- });
7160
- },
7161
- value: username,
7162
- ref: this.ref,
7163
- "data-test": "inputUsernameLoginTest"
7164
- })), /*#__PURE__*/React__default['default'].createElement("div", {
7165
- className: "field"
7166
- }, /*#__PURE__*/React__default['default'].createElement("label", {
7167
- className: "label"
7168
- }, "Password:"), /*#__PURE__*/React__default['default'].createElement("input", {
7169
- type: "password",
7170
- className: "input",
7171
- onChange: function onChange(e) {
7172
- return _this2.setState({
7173
- password: e.target.value
7174
- });
7175
- },
7176
- value: password,
7177
- "data-test": "inputPasswordLoginTest"
7178
- })), schemas && /*#__PURE__*/React__default['default'].createElement("div", {
7179
- className: "field"
7180
- }, /*#__PURE__*/React__default['default'].createElement("label", {
7181
- className: "label"
7182
- }, "Schema:"), /*#__PURE__*/React__default['default'].createElement("div", {
7183
- className: "select"
7184
- }, /*#__PURE__*/React__default['default'].createElement("select", {
7185
- onChange: function onChange(e) {
7186
- return _this2.setState({
7187
- schema: e.target.value
7188
- });
7189
- }
7190
- }, schemas.map(function (s) {
7191
- return /*#__PURE__*/React__default['default'].createElement("option", {
7192
- value: s,
7193
- key: s
7194
- }, s);
7195
- })))), /*#__PURE__*/React__default['default'].createElement("div", {
7196
- className: "field"
7197
- }, /*#__PURE__*/React__default['default'].createElement("button", {
7198
- className: "button is-warning",
7199
- type: "submit",
7200
- "data-test": "btnLoginTest"
7201
- }, "Login")), /*#__PURE__*/React__default['default'].createElement("div", {
7202
- className: "field"
7203
- }, errors && /*#__PURE__*/React__default['default'].createElement("p", {
7204
- className: "has-text-danger"
7205
- }, ERRORS[errors] || 'Generic error'))));
7206
- };
7207
-
7208
- return Login;
7209
- }(React.Component);
7183
+ return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement("form", {
7184
+ className: "login__form",
7185
+ action: "",
7186
+ onSubmit: doLogin,
7187
+ "data-test": "formLoginTest"
7188
+ }, /*#__PURE__*/React__default['default'].createElement("div", {
7189
+ className: "field"
7190
+ }, /*#__PURE__*/React__default['default'].createElement("label", {
7191
+ className: "label"
7192
+ }, "Username:"), /*#__PURE__*/React__default['default'].createElement("input", {
7193
+ type: "text",
7194
+ className: "input",
7195
+ placeholder: "Username",
7196
+ onChange: function onChange(e) {
7197
+ return setState({
7198
+ username: e.target.value
7199
+ });
7200
+ },
7201
+ value: state.username,
7202
+ ref: inputRef,
7203
+ "data-test": "inputUsernameLoginTest"
7204
+ })), /*#__PURE__*/React__default['default'].createElement("div", {
7205
+ className: "field"
7206
+ }, /*#__PURE__*/React__default['default'].createElement("label", {
7207
+ className: "label"
7208
+ }, "Password:"), /*#__PURE__*/React__default['default'].createElement("input", {
7209
+ type: "password",
7210
+ className: "input",
7211
+ placeholder: "Password",
7212
+ onChange: function onChange(e) {
7213
+ return setState({
7214
+ password: e.target.value
7215
+ });
7216
+ },
7217
+ value: state.password,
7218
+ "data-test": "inputPasswordLoginTest"
7219
+ })), schemas && schemas.length > 1 && /*#__PURE__*/React__default['default'].createElement("div", {
7220
+ className: "field"
7221
+ }, /*#__PURE__*/React__default['default'].createElement("label", {
7222
+ className: "label"
7223
+ }, "Schema:"), /*#__PURE__*/React__default['default'].createElement("div", {
7224
+ className: "select"
7225
+ }, /*#__PURE__*/React__default['default'].createElement("select", {
7226
+ "data-test": "selectSchemaTest",
7227
+ onChange: function onChange(e) {
7228
+ return setCurrentSchema(e.target.value);
7229
+ }
7230
+ }, schemas.map(function (s) {
7231
+ return /*#__PURE__*/React__default['default'].createElement("option", {
7232
+ value: s,
7233
+ key: s
7234
+ }, s);
7235
+ })))), /*#__PURE__*/React__default['default'].createElement("div", {
7236
+ className: "field"
7237
+ }, /*#__PURE__*/React__default['default'].createElement("button", {
7238
+ className: "button is-warning",
7239
+ type: "submit",
7240
+ "data-test": "btnLoginTest"
7241
+ }, "Login")), /*#__PURE__*/React__default['default'].createElement("div", {
7242
+ className: "field"
7243
+ }, state.errors && /*#__PURE__*/React__default['default'].createElement("p", {
7244
+ className: "has-text-danger"
7245
+ }, ERRORS[state.errors] || 'Generic error'))));
7246
+ };
7210
7247
 
7211
7248
  function _catch$3(body, recover) {
7212
7249
  try {
@@ -7661,6 +7698,7 @@ exports.REGEX_URL = REGEX_URL;
7661
7698
  exports.RItem = RItem;
7662
7699
  exports.RemoveItems = RemoveItems;
7663
7700
  exports.RenderField = RenderField;
7701
+ exports.RenderFieldComponent = RenderFieldComponent;
7664
7702
  exports.RequiredFieldsForm = RequiredFieldsForm;
7665
7703
  exports.RestClient = RestClient;
7666
7704
  exports.SearchInput = SearchInput;
@@ -7688,7 +7726,6 @@ exports.formatDate = formatDate;
7688
7726
  exports.generateUID = generateUID;
7689
7727
  exports.get = get$1;
7690
7728
  exports.getClient = getClient;
7691
- exports.getContainerFromPath = getContainerFromPath;
7692
7729
  exports.getNewId = getNewId;
7693
7730
  exports.isEmail = isEmail;
7694
7731
  exports.isEmpty = isEmpty;