@panneau/app 1.0.0-alpha.25 → 1.0.0-alpha.252

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/es/index.js CHANGED
@@ -1,482 +1,303 @@
1
- import React, { useState, useCallback, useEffect, useContext, useMemo } from 'react';
2
- import { defineMessages, FormattedMessage, IntlProvider } from 'react-intl';
3
- import { useLocation, useHistory, Switch, Route, Redirect, MemoryRouter } from 'react-router';
4
- import { Link, BrowserRouter } from 'react-router-dom';
5
- import PropTypes from 'prop-types';
6
- import { PropTypes as PropTypes$1 } from '@panneau/core';
7
- import { usePanneauResources, useUrlGenerator, usePanneau, usePanneauColorScheme, useFormsComponents, FormProvider, ResourceProvider, useFiltersComponents, useListsComponents, useFieldComponent, useRoutes, PanneauProvider, LocalesProvider, RoutesProvider } from '@panneau/core/contexts';
8
- import { useApi, useResourceStore, useResourceUpdate, useResourceItem, useResourceItems, ApiProvider } from '@panneau/data';
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _objectSpread from '@babel/runtime/helpers/objectSpread2';
3
+ import { useUser, useLogout, useAuth, AuthProvider } from '@panneau/auth';
4
+ import { PropTypes } from '@panneau/core';
5
+ import { useLocales, useFormsComponents, FormProvider, useUrlGenerator, usePanneauResources, usePanneau, usePanneauColorScheme, ResourceProvider, useFiltersComponents, useListsComponents, useComponentsManager, useFormComponent, useRoutes, PanneauProvider, UppyProvider, RoutesProvider, ComponentsProvider } from '@panneau/core/contexts';
6
+ import { useResourceStore, useResourceUpdate, useResourceDestroy, useResourceItem, useResourceItems, ApiProvider } from '@panneau/data';
7
+ import DisplaysProvider from '@panneau/displays';
9
8
  import FieldsProvider from '@panneau/fields';
9
+ import FiltersProvider from '@panneau/filters';
10
10
  import FormsProvider from '@panneau/forms';
11
+ import { ResourceMessage, IntlProvider } from '@panneau/intl';
11
12
  import ListsProvider from '@panneau/lists';
12
- import DisplaysProvider from '@panneau/displays';
13
- import FiltersProvider from '@panneau/filters';
13
+ import PropTypes$1 from 'prop-types';
14
+ import React, { useMemo, useCallback, useState, useEffect } from 'react';
15
+ import { useLocation, useHistory, Switch, Route, Redirect, MemoryRouter } from 'react-router';
16
+ import { Link, BrowserRouter } from 'react-router-dom';
14
17
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
15
18
  import { getComponentFromName } from '@panneau/core/utils';
16
19
  import { useResourceUrlGenerator, useForm } from '@panneau/core/hooks';
17
- import _defineProperty from '@babel/runtime/helpers/defineProperty';
20
+ import { parse, stringify } from 'query-string';
21
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
22
+ import Button from '@panneau/element-button';
23
+ import Form from '@panneau/element-form';
18
24
  import classNames from 'classnames';
25
+ import { FormattedMessage, defineMessages } from 'react-intl';
19
26
  import Navbar from '@panneau/element-navbar';
20
27
  import Menu from '@panneau/element-menu';
21
28
  import Label from '@panneau/element-label';
22
- import _objectSpread from '@babel/runtime/helpers/objectSpread2';
23
- import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
24
- import { parse, stringify } from 'query-string';
25
29
  import Alert from '@panneau/element-alert';
26
- import Button from '@panneau/element-button';
30
+ import isString from 'lodash/isString';
27
31
  import Dropdown from '@panneau/element-dropdown';
32
+ import Pagination from '@panneau/element-pagination';
33
+ import { faUndo } from '@fortawesome/free-solid-svg-icons';
34
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
28
35
  import FormGroup from '@panneau/element-form-group';
29
36
 
30
- var useAuthCheck = function useAuthCheck() {
31
- var _useState = useState(false),
32
- _useState2 = _slicedToArray(_useState, 2),
33
- loading = _useState2[0],
34
- setLoading = _useState2[1];
35
-
36
- var api = useApi();
37
- var check = useCallback(function () {
38
- setLoading(true);
39
- return api.auth.check().then(function (response) {
40
- setLoading(false);
41
- return response;
42
- })["catch"](function (e) {
43
- setLoading(false);
44
- throw e;
45
- });
46
- }, [api, setLoading]);
47
- return {
48
- check: check,
49
- loading: loading
50
- };
37
+ var _excluded$5 = ["resource", "action", "previous", "status", "value", "onSubmit", "errors", "generalError", "className"];
38
+ var propTypes$n = {
39
+ resource: PropTypes.resource.isRequired,
40
+ action: PropTypes$1.string,
41
+ previous: PropTypes$1.string,
42
+ fields: PropTypes.fields.isRequired,
43
+ value: PropTypes$1.object,
44
+ // eslint-disable-line react/forbid-prop-types
45
+ onChange: PropTypes$1.func.isRequired,
46
+ onSubmit: PropTypes$1.func,
47
+ status: PropTypes.formStatus,
48
+ generalError: PropTypes$1.string,
49
+ errors: PropTypes$1.objectOf(PropTypes$1.arrayOf(PropTypes$1.string)),
50
+ className: PropTypes$1.string
51
51
  };
52
-
53
- var useAuthLogin = function useAuthLogin() {
54
- var _useState = useState(false),
55
- _useState2 = _slicedToArray(_useState, 2),
56
- loading = _useState2[0],
57
- setLoading = _useState2[1];
58
-
59
- var api = useApi();
60
- var login = useCallback(function (email, password) {
61
- setLoading(true);
62
- return api.auth.login(email, password).then(function (response) {
63
- setLoading(false);
64
- return response;
65
- })["catch"](function (e) {
66
- setLoading(false);
67
- throw e;
68
- });
69
- }, [api, setLoading]);
70
- return {
71
- login: login,
72
- loading: loading
73
- };
52
+ var defaultProps$n = {
53
+ action: null,
54
+ previous: null,
55
+ status: null,
56
+ value: null,
57
+ onSubmit: null,
58
+ generalError: null,
59
+ errors: null,
60
+ className: null
74
61
  };
75
62
 
76
- var useAuthLogout = function useAuthLogout() {
77
- var _useState = useState(false),
78
- _useState2 = _slicedToArray(_useState, 2),
79
- loading = _useState2[0],
80
- setLoading = _useState2[1];
81
-
82
- var api = useApi();
83
- var logout = useCallback(function () {
84
- setLoading(true);
85
- return api.auth.logout().then(function (response) {
86
- setLoading(false);
87
- return response;
88
- })["catch"](function (e) {
89
- setLoading(false);
90
- throw e;
91
- });
92
- }, [api, setLoading]);
93
- return {
94
- logout: logout,
95
- loading: loading
96
- };
97
- };
63
+ var DeleteForm = function DeleteForm(_ref) {
64
+ var resource = _ref.resource,
65
+ action = _ref.action,
66
+ previous = _ref.previous;
67
+ _ref.status;
68
+ var value = _ref.value,
69
+ onSubmit = _ref.onSubmit;
70
+ _ref.errors;
71
+ var generalError = _ref.generalError,
72
+ className = _ref.className,
73
+ props = _objectWithoutProperties(_ref, _excluded$5);
98
74
 
99
- var useAuthRegister = function useAuthRegister() {
100
- var _useState = useState(false),
101
- _useState2 = _slicedToArray(_useState, 2),
102
- loading = _useState2[0],
103
- setLoading = _useState2[1];
104
-
105
- var api = useApi();
106
- var register = useCallback(function (data) {
107
- setLoading(true);
108
- return api.auth.register(data).then(function (response) {
109
- setLoading(false);
110
- return response;
111
- })["catch"](function (e) {
112
- setLoading(false);
113
- throw e;
114
- });
115
- }, [api, setLoading]);
116
- return {
117
- register: register,
118
- loading: loading
119
- };
75
+ return /*#__PURE__*/React.createElement(Form, Object.assign({
76
+ className: classNames(['form', _defineProperty({
77
+ 'invalid-feedback': generalError !== null
78
+ }, className, className !== null)]),
79
+ action: action,
80
+ onSubmit: onSubmit,
81
+ withoutActions: true,
82
+ withoutErrors: true
83
+ }, props), /*#__PURE__*/React.createElement("div", {
84
+ className: "card"
85
+ }, /*#__PURE__*/React.createElement("div", {
86
+ className: "card-body"
87
+ }, /*#__PURE__*/React.createElement(ResourceMessage, {
88
+ resource: resource,
89
+ values: value,
90
+ id: "resources.confirm_delete",
91
+ defaultMessage: "Are you sure you want to delete {the_singular} #{id}?",
92
+ description: "Confirmation message"
93
+ }), generalError ? /*#__PURE__*/React.createElement("p", {
94
+ className: "text-danger"
95
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
96
+ id: "y9zauY",
97
+ defaultMessage: [{
98
+ "type": 0,
99
+ "value": "An error occured and we could not delete this item successfully."
100
+ }]
101
+ })) : null), /*#__PURE__*/React.createElement("div", {
102
+ className: "card-body d-flex"
103
+ }, previous !== null ? /*#__PURE__*/React.createElement(Button, {
104
+ href: previous,
105
+ className: "me-2",
106
+ theme: "secondary",
107
+ outline: true
108
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
109
+ id: "PyxZY2",
110
+ defaultMessage: [{
111
+ "type": 0,
112
+ "value": "Cancel"
113
+ }]
114
+ })) : null, /*#__PURE__*/React.createElement(Button, {
115
+ type: "submit",
116
+ className: "ms-auto",
117
+ theme: "danger"
118
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
119
+ id: "Bhu3B2",
120
+ defaultMessage: [{
121
+ "type": 0,
122
+ "value": "Delete"
123
+ }]
124
+ })))));
120
125
  };
121
126
 
122
- var useAuthRequestPassword = function useAuthRequestPassword() {
123
- var _useState = useState(false),
124
- _useState2 = _slicedToArray(_useState, 2),
125
- loading = _useState2[0],
126
- setLoading = _useState2[1];
127
-
128
- var api = useApi();
129
- var request = useCallback(function (email) {
130
- setLoading(true);
131
- return api.auth.requestPassword(email).then(function (response) {
132
- setLoading(false);
133
- return response;
134
- })["catch"](function (e) {
135
- setLoading(false);
136
- throw e;
137
- });
138
- }, [api, setLoading]);
139
- return {
140
- request: request,
141
- loading: loading
142
- };
143
- };
127
+ DeleteForm.propTypes = propTypes$n;
128
+ DeleteForm.defaultProps = defaultProps$n;
144
129
 
145
- var useAuthResetPassword = function useAuthResetPassword() {
146
- var _useState = useState(false),
147
- _useState2 = _slicedToArray(_useState, 2),
148
- loading = _useState2[0],
149
- setLoading = _useState2[1];
150
-
151
- var api = useApi();
152
- var reset = useCallback(function (data) {
153
- setLoading(true);
154
- return api.auth.resetPassword(data).then(function (response) {
155
- setLoading(false);
156
- return response;
157
- })["catch"](function (e) {
158
- setLoading(false);
159
- throw e;
160
- });
161
- }, [api, setLoading]);
162
- return {
163
- reset: reset,
164
- loading: loading
165
- };
130
+ var _excluded$4 = ["component", "resource", "onSuccess", "item", "type", "isDelete"];
131
+ var propTypes$m = {
132
+ component: PropTypes$1.string,
133
+ resource: PropTypes.resource.isRequired,
134
+ item: PropTypes$1.object,
135
+ // eslint-disable-line react/forbid-prop-types
136
+ type: PropTypes$1.string,
137
+ onSuccess: PropTypes$1.func,
138
+ isDelete: PropTypes$1.bool
166
139
  };
167
-
168
- var AuthContext = /*#__PURE__*/React.createContext(null);
169
- var useAuth = function useAuth() {
170
- return useContext(AuthContext);
140
+ var defaultProps$m = {
141
+ component: null,
142
+ item: null,
143
+ type: null,
144
+ onSuccess: null,
145
+ isDelete: false
171
146
  };
172
- var useUser = function useUser() {
173
- var _useAuth = useAuth(),
174
- user = _useAuth.user;
175
147
 
176
- return user;
177
- };
178
- var useLogout = function useLogout() {
179
- var _useAuth3 = useAuth(),
180
- logout = _useAuth3.logout;
148
+ var ResourceForm = function ResourceForm(_ref) {
149
+ var component = _ref.component,
150
+ resource = _ref.resource,
151
+ onSuccess = _ref.onSuccess,
152
+ item = _ref.item,
153
+ type = _ref.type,
154
+ isDelete = _ref.isDelete,
155
+ props = _objectWithoutProperties(_ref, _excluded$4);
181
156
 
182
- return logout;
183
- };
184
- var propTypes$o = {
185
- children: PropTypes.node.isRequired,
186
- user: PropTypes$1.user,
187
- checkOnMount: PropTypes.bool
188
- };
189
- var defaultProps$o = {
190
- user: null,
191
- checkOnMount: false
192
- };
193
- var AuthProvider = function AuthProvider(_ref) {
194
- var initialUser = _ref.user,
195
- checkOnMount = _ref.checkOnMount,
196
- children = _ref.children;
157
+ var locales = useLocales();
158
+ var FormComponents = useFormsComponents();
159
+ var _resource$fields = resource.fields,
160
+ resourceFields = _resource$fields === void 0 ? [] : _resource$fields,
161
+ _resource$types = resource.types,
162
+ resourceTypes = _resource$types === void 0 ? [] : _resource$types,
163
+ forms = resource.forms;
164
+ var resourceType = type !== null ? resourceTypes.find(function (it) {
165
+ return it.id === type;
166
+ }) || null : null;
167
+
168
+ var _ref2 = resourceType || {},
169
+ _ref2$fields = _ref2.fields,
170
+ resourceTypeFields = _ref2$fields === void 0 ? null : _ref2$fields;
197
171
 
198
- var _useState = useState(initialUser),
199
- _useState2 = _slicedToArray(_useState, 2),
200
- user = _useState2[0],
201
- setUser = _useState2[1];
172
+ var isCreate = item === null || !item.id; // Pick fields from resource root or form
202
173
 
203
- var _useAuthLogin = useAuthLogin(),
204
- authLogin = _useAuthLogin.login;
174
+ var _ref3 = forms || {},
175
+ _ref3$default = _ref3["default"],
176
+ defaultForm = _ref3$default === void 0 ? null : _ref3$default,
177
+ _ref3$create = _ref3.create,
178
+ createForm = _ref3$create === void 0 ? null : _ref3$create,
179
+ _ref3$edit = _ref3.edit,
180
+ editForm = _ref3$edit === void 0 ? null : _ref3$edit,
181
+ _ref3$delete = _ref3["delete"],
182
+ deleteForm = _ref3$delete === void 0 ? null : _ref3$delete;
205
183
 
206
- var _useAuthLogout = useAuthLogout(),
207
- authLogout = _useAuthLogout.logout;
184
+ var _ref4 = defaultForm || {},
185
+ _ref4$fields = _ref4.fields,
186
+ defaultFields = _ref4$fields === void 0 ? null : _ref4$fields,
187
+ defaultComponent = _ref4.component;
208
188
 
209
- var _useAuthCheck = useAuthCheck(),
210
- authCheck = _useAuthCheck.check;
189
+ var createOrEditSource = isCreate ? createForm || {} : editForm || {};
211
190
 
212
- var _useAuthRegister = useAuthRegister(),
213
- authRegister = _useAuthRegister.register;
191
+ var _ref5 = isDelete ? deleteForm || {} : createOrEditSource || {},
192
+ _ref5$fields = _ref5.fields,
193
+ formFields = _ref5$fields === void 0 ? null : _ref5$fields,
194
+ _ref5$component = _ref5.component,
195
+ formComponent = _ref5$component === void 0 ? null : _ref5$component;
214
196
 
215
- var _useAuthRequestPasswo = useAuthRequestPassword(),
216
- authRequestPassword = _useAuthRequestPasswo.request;
197
+ var finalFields = useMemo(function () {
198
+ return (formFields || defaultFields || resourceTypeFields || resourceFields).filter(function (_ref6) {
199
+ var _ref6$settings = _ref6.settings;
200
+ _ref6$settings = _ref6$settings === void 0 ? {} : _ref6$settings;
201
+ var _ref6$settings$hidden = _ref6$settings.hiddenInForm,
202
+ hiddenInForm = _ref6$settings$hidden === void 0 ? false : _ref6$settings$hidden;
203
+ return !hiddenInForm;
204
+ });
205
+ }, [formFields, defaultFields, resourceTypeFields, resourceFields]); // Form routes
217
206
 
218
- var _useAuthResetPassword = useAuthResetPassword(),
219
- authResetPassword = _useAuthResetPassword.reset;
207
+ var resourceRoute = useResourceUrlGenerator(resource);
220
208
 
221
- var login = useCallback(function (email, password) {
222
- return authLogin(email, password).then(function (newUser) {
223
- setUser(newUser);
224
- return newUser;
225
- });
226
- }, [authLogin, setUser]);
227
- var logout = useCallback(function () {
228
- return authLogout().then(function () {
229
- setUser(null);
230
- });
231
- }, [authLogout, setUser]);
232
- var register = useCallback(function (data) {
233
- return authRegister(data).then(function (newUser) {
234
- setUser(newUser);
235
- return newUser;
236
- });
237
- }, [authRegister, setUser]);
238
- var requestPassword = useCallback(function (email) {
239
- return authRequestPassword(email);
240
- }, [authRequestPassword]);
241
- var resetPassword = useCallback(function (data) {
242
- return authResetPassword(data);
243
- }, [authResetPassword]);
244
- useEffect(function () {
245
- if (checkOnMount) {
246
- authCheck().then(function () {
247
- var newUser = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
248
- setUser(newUser);
249
- })["catch"](function () {
250
- setUser(null);
251
- });
252
- }
253
- }, [authCheck, setUser, checkOnMount]);
254
- return /*#__PURE__*/React.createElement(AuthContext.Provider, {
255
- value: {
256
- user: user,
257
- setUser: setUser,
258
- loggedIn: user !== null,
259
- logout: logout,
260
- login: login,
261
- register: register,
262
- requestPassword: requestPassword,
263
- resetPassword: resetPassword
264
- }
265
- }, children);
266
- };
267
- AuthProvider.propTypes = propTypes$o;
268
- AuthProvider.defaultProps = defaultProps$o;
209
+ var _useResourceStore = useResourceStore(resource),
210
+ store = _useResourceStore.store;
269
211
 
270
- var propTypes$n = {
271
- className: PropTypes.string,
272
- itemClassName: PropTypes.string,
273
- linkClassName: PropTypes.string
274
- };
275
- var defaultProps$n = {
276
- className: null,
277
- itemClassName: null,
278
- linkClassName: null
279
- };
212
+ var _useResourceUpdate = useResourceUpdate(resource, item != null ? item.id : null),
213
+ update = _useResourceUpdate.update;
280
214
 
281
- var ResourcesMenu = function ResourcesMenu(_ref) {
282
- var className = _ref.className,
283
- itemClassName = _ref.itemClassName,
284
- linkClassName = _ref.linkClassName;
215
+ var _useResourceDestroy = useResourceDestroy(resource, item != null ? item.id : null),
216
+ destroy = _useResourceDestroy.destroy; // Post actions
285
217
 
286
- var _useLocation = useLocation(),
287
- pathname = _useLocation.pathname;
288
218
 
289
- var resources = usePanneauResources();
290
- var resourceRoute = useResourceUrlGenerator();
291
- var items = useMemo(function () {
292
- return resources.filter(function (_ref2) {
293
- var _ref2$settings = _ref2.settings;
294
- _ref2$settings = _ref2$settings === void 0 ? {} : _ref2$settings;
295
- var _ref2$settings$hideIn = _ref2$settings.hideInNavbar,
296
- hideInNavbar = _ref2$settings$hideIn === void 0 ? false : _ref2$settings$hideIn;
297
- return !hideInNavbar;
298
- }).map(function (it) {
299
- var url = resourceRoute(it, 'index');
300
- return {
301
- id: it.id,
302
- label: it.name,
303
- href: url,
304
- active: pathname.substr(0, url.length) === url
305
- };
306
- });
307
- }, [resources, pathname, resourceRoute]);
308
- return /*#__PURE__*/React.createElement(Menu, {
309
- items: items,
310
- className: className,
311
- itemClassName: itemClassName,
312
- linkClassName: linkClassName
219
+ var postAction = isCreate ? store : update;
220
+ var postForm = useCallback(function (action, data) {
221
+ return isDelete ? destroy() : postAction(data);
222
+ }, [postAction, isDelete, destroy, store, update]); // Form state
223
+
224
+ var getInitialValue = useCallback(function () {
225
+ return item !== null ? item : finalFields.reduce(function (defaultValues, _ref7) {
226
+ var name = _ref7.name,
227
+ _ref7$defaultValue = _ref7.defaultValue,
228
+ defaultValue = _ref7$defaultValue === void 0 ? null : _ref7$defaultValue;
229
+ return defaultValue !== null ? _objectSpread(_objectSpread({}, defaultValues), {}, _defineProperty({}, name, defaultValue)) : defaultValues;
230
+ }, type !== null ? {
231
+ type: type
232
+ } : null);
233
+ }, [item, type, finalFields]);
234
+
235
+ var _useState = useState(getInitialValue()),
236
+ _useState2 = _slicedToArray(_useState, 2),
237
+ value = _useState2[0],
238
+ setValueState = _useState2[1];
239
+
240
+ var setValue = useCallback(function (newValue) {
241
+ // console.log('new value in resource form', newValue); // eslint-disable-line
242
+ setValueState(newValue);
243
+ }, [setValueState]);
244
+
245
+ var _useForm = useForm({
246
+ fields: finalFields,
247
+ value: value,
248
+ postForm: postForm,
249
+ setValue: setValue,
250
+ onComplete: onSuccess,
251
+ locales: locales
252
+ }),
253
+ fields = _useForm.fields,
254
+ onSubmit = _useForm.onSubmit,
255
+ status = _useForm.status,
256
+ generalError = _useForm.generalError,
257
+ errors = _useForm.errors; // Form action
258
+
259
+
260
+ var modifyAction = isCreate ? resourceRoute('store') : resourceRoute('update', {
261
+ id: item.id
313
262
  });
314
- };
263
+ var action = isDelete ? resourceRoute('destroy', {
264
+ id: item.id
265
+ }) : modifyAction;
266
+ var defaultFormName = isDelete ? component || formComponent || null : component || formComponent || defaultComponent || 'normal'; // Form component
315
267
 
316
- ResourcesMenu.propTypes = propTypes$n;
317
- ResourcesMenu.defaultProps = defaultProps$n;
268
+ var FormComponent = getComponentFromName(defaultFormName, FormComponents, isDelete ? DeleteForm : component); // Lisen to item value change - this is important
318
269
 
319
- var messages$1 = defineMessages({
320
- // Resources
321
- index: {
322
- "id": "resources.index",
323
- "defaultMessage": [{
324
- "type": 0,
325
- "value": "View "
326
- }, {
327
- "type": 1,
328
- "value": "a_plural"
329
- }]
330
- },
331
- create: {
332
- "id": "resources.create",
333
- "defaultMessage": [{
334
- "type": 0,
335
- "value": "Create "
336
- }, {
337
- "type": 1,
338
- "value": "a_singular"
339
- }]
340
- },
341
- edit: {
342
- "id": "resources.edit",
343
- "defaultMessage": [{
344
- "type": 0,
345
- "value": "Edit "
346
- }, {
347
- "type": 1,
348
- "value": "a_singular"
349
- }]
350
- },
351
- "delete": {
352
- "id": "resources.delete",
353
- "defaultMessage": [{
354
- "type": 0,
355
- "value": "Delete "
356
- }, {
357
- "type": 1,
358
- "value": "a_singular"
359
- }]
360
- },
361
- created: {
362
- "id": "resources.created",
363
- "defaultMessage": [{
364
- "type": 1,
365
- "value": "the_singular"
366
- }, {
367
- "type": 0,
368
- "value": " has been created."
369
- }]
370
- },
371
- deleted: {
372
- "id": "resources.deleted",
373
- "defaultMessage": [{
374
- "type": 1,
375
- "value": "the_singular"
376
- }, {
377
- "type": 0,
378
- "value": " has been deleted."
379
- }]
380
- },
381
- loading: {
382
- "id": "resources.loading",
383
- "defaultMessage": [{
384
- "type": 0,
385
- "value": "Loading "
386
- }, {
387
- "type": 1,
388
- "value": "plural"
389
- }, {
390
- "type": 0,
391
- "value": "..."
392
- }]
393
- },
394
- // Forms
395
- confirm_delete: {
396
- "id": "form.confirm_delete",
397
- "defaultMessage": [{
398
- "type": 0,
399
- "value": "Are you sure you want to delete item #"
400
- }, {
401
- "type": 1,
402
- "value": "id"
403
- }, {
404
- "type": 0,
405
- "value": "?"
406
- }]
407
- },
408
- show_button: {
409
- "id": "form.show_button",
410
- "defaultMessage": [{
411
- "type": 0,
412
- "value": "Cancel"
413
- }]
414
- },
415
- edit_button: {
416
- "id": "form.edit_button",
417
- "defaultMessage": [{
418
- "type": 0,
419
- "value": "Edit"
420
- }]
421
- },
422
- cancel_button: {
423
- "id": "form.cancel_button",
424
- "defaultMessage": [{
425
- "type": 0,
426
- "value": "Cancel"
427
- }]
428
- },
429
- delete_button: {
430
- "id": "form.delete_button",
431
- "defaultMessage": [{
432
- "type": 0,
433
- "value": "Delete"
434
- }]
435
- },
436
- // Auth
437
- login_title: {
438
- "id": "auth.login.title",
439
- "defaultMessage": [{
440
- "type": 0,
441
- "value": "Login"
442
- }]
443
- },
444
- login: {
445
- "id": "auth.login",
446
- "defaultMessage": [{
447
- "type": 0,
448
- "value": "Login"
449
- }]
450
- },
451
- logout: {
452
- "id": "auth.logout",
453
- "defaultMessage": [{
454
- "type": 0,
455
- "value": "Logout"
456
- }]
457
- },
458
- account: {
459
- "id": "auth.account",
460
- "defaultMessage": [{
461
- "type": 0,
462
- "value": "Account"
463
- }]
464
- },
465
- updateAccount: {
466
- "id": "auth.update_account",
467
- "defaultMessage": [{
468
- "type": 0,
469
- "value": "Update account"
470
- }]
471
- }
472
- });
270
+ useEffect(function () {
271
+ // console.log('get initial value from the top'); // eslint-disable-line
272
+ setValue(getInitialValue());
273
+ }, [getInitialValue, setValue]);
274
+ return /*#__PURE__*/React.createElement(FormProvider, {
275
+ value: value,
276
+ setValue: setValue
277
+ }, /*#__PURE__*/React.createElement(FormComponent, Object.assign({}, props, {
278
+ status: status,
279
+ resource: resource,
280
+ item: item,
281
+ fields: fields,
282
+ generalError: generalError,
283
+ errors: errors,
284
+ action: action,
285
+ onSubmit: onSubmit,
286
+ isCreate: isCreate,
287
+ value: value,
288
+ onChange: setValue
289
+ })));
290
+ };
473
291
 
474
- var propTypes$m = {
475
- className: PropTypes.string,
476
- itemClassName: PropTypes.string,
477
- linkClassName: PropTypes.string
292
+ ResourceForm.propTypes = propTypes$m;
293
+ ResourceForm.defaultProps = defaultProps$m;
294
+
295
+ var propTypes$l = {
296
+ className: PropTypes$1.string,
297
+ itemClassName: PropTypes$1.string,
298
+ linkClassName: PropTypes$1.string
478
299
  };
479
- var defaultProps$m = {
300
+ var defaultProps$l = {
480
301
  className: null,
481
302
  itemClassName: null,
482
303
  linkClassName: null
@@ -492,22 +313,46 @@ var AccountMenu = function AccountMenu(_ref) {
492
313
  var onClickLogout = useCallback(function (e) {
493
314
  e.preventDefault();
494
315
  logout();
495
- }, [logout]);
316
+ }, [logout, route]);
496
317
  var items = useMemo(function () {
497
318
  return user !== null ? [{
498
319
  id: 'account',
499
- label: messages$1.account,
500
- href: route('auth.account'),
501
- dropdown: [{
502
- label: messages$1.updateAccount,
503
- href: route('auth.account')
504
- }, {
505
- label: messages$1.logout,
320
+ label: /*#__PURE__*/React.createElement(FormattedMessage, {
321
+ id: "IuqEHB",
322
+ defaultMessage: [{
323
+ "type": 0,
324
+ "value": "Account"
325
+ }]
326
+ }),
327
+ href: route('panneau.account'),
328
+ dropdown: [// {
329
+ // label: (
330
+ // <FormattedMessage
331
+ // defaultMessage="Update account"
332
+ // description="Menu label"
333
+ // />
334
+ // ),
335
+ // href: route('panneau.account'),
336
+ // },
337
+ {
338
+ label: /*#__PURE__*/React.createElement(FormattedMessage, {
339
+ id: "REIcPg",
340
+ defaultMessage: [{
341
+ "type": 0,
342
+ "value": "Logout"
343
+ }]
344
+ }),
506
345
  href: route('auth.logout'),
507
346
  onClick: onClickLogout
508
347
  }]
509
348
  }] : [{
510
- label: messages$1.login,
349
+ label: /*#__PURE__*/React.createElement(FormattedMessage, {
350
+ id: "d0g58T",
351
+ defaultMessage: [{
352
+ "type": 0,
353
+ "value": "Login"
354
+ }]
355
+ }),
511
356
  href: route('login')
512
357
  }];
513
358
  }, [user, route, onClickLogout]);
@@ -520,12 +365,61 @@ var AccountMenu = function AccountMenu(_ref) {
520
365
  }) : null;
521
366
  };
522
367
 
523
- AccountMenu.propTypes = propTypes$m;
524
- AccountMenu.defaultProps = defaultProps$m;
368
+ AccountMenu.propTypes = propTypes$l;
369
+ AccountMenu.defaultProps = defaultProps$l;
370
+
371
+ var propTypes$k = {
372
+ className: PropTypes$1.string,
373
+ itemClassName: PropTypes$1.string,
374
+ linkClassName: PropTypes$1.string
375
+ };
376
+ var defaultProps$k = {
377
+ className: null,
378
+ itemClassName: null,
379
+ linkClassName: null
380
+ };
381
+
382
+ var ResourcesMenu = function ResourcesMenu(_ref) {
383
+ var className = _ref.className,
384
+ itemClassName = _ref.itemClassName,
385
+ linkClassName = _ref.linkClassName;
386
+
387
+ var _useLocation = useLocation(),
388
+ pathname = _useLocation.pathname;
389
+
390
+ var resources = usePanneauResources();
391
+ var resourceRoute = useResourceUrlGenerator();
392
+ var items = useMemo(function () {
393
+ return resources.filter(function (_ref2) {
394
+ var _ref2$settings = _ref2.settings;
395
+ _ref2$settings = _ref2$settings === void 0 ? {} : _ref2$settings;
396
+ var _ref2$settings$hideIn = _ref2$settings.hideInNavbar,
397
+ hideInNavbar = _ref2$settings$hideIn === void 0 ? false : _ref2$settings$hideIn;
398
+ return !hideInNavbar;
399
+ }).map(function (it) {
400
+ var url = resourceRoute(it, 'index');
401
+ return {
402
+ id: it.id,
403
+ label: it.name,
404
+ href: url,
405
+ active: pathname.substr(0, url.length) === url
406
+ };
407
+ });
408
+ }, [resources, pathname, resourceRoute]);
409
+ return /*#__PURE__*/React.createElement(Menu, {
410
+ items: items,
411
+ className: className,
412
+ itemClassName: itemClassName,
413
+ linkClassName: linkClassName
414
+ });
415
+ };
416
+
417
+ ResourcesMenu.propTypes = propTypes$k;
418
+ ResourcesMenu.defaultProps = defaultProps$k;
525
419
 
526
420
  /* eslint-disable react/jsx-props-no-spreading */
527
- var propTypes$l = {};
528
- var defaultProps$l = {};
421
+ var propTypes$j = {};
422
+ var defaultProps$j = {};
529
423
 
530
424
  var MainNavbar = function MainNavbar(props) {
531
425
  var _usePanneau = usePanneau(),
@@ -552,19 +446,19 @@ var MainNavbar = function MainNavbar(props) {
552
446
  }));
553
447
  };
554
448
 
555
- MainNavbar.propTypes = propTypes$l;
556
- MainNavbar.defaultProps = defaultProps$l;
449
+ MainNavbar.propTypes = propTypes$j;
450
+ MainNavbar.defaultProps = defaultProps$j;
557
451
 
558
- var propTypes$k = {
559
- children: PropTypes.node.isRequired,
560
- fullscreen: PropTypes.bool
452
+ var propTypes$i = {
453
+ children: PropTypes$1.node.isRequired,
454
+ fullscreen: PropTypes$1.bool
561
455
  };
562
- var defaultProps$k = {
456
+ var defaultProps$i = {
563
457
  fullscreen: false
564
458
  };
565
459
 
566
460
  var MainLayout = function MainLayout(_ref) {
567
- var _classNames;
461
+ var _ref2;
568
462
 
569
463
  var children = _ref.children,
570
464
  fullscreen = _ref.fullscreen;
@@ -574,29 +468,27 @@ var MainLayout = function MainLayout(_ref) {
574
468
  text = _usePanneauColorSchem.text;
575
469
 
576
470
  return /*#__PURE__*/React.createElement("div", {
577
- className: classNames({
578
- 'd-flex flex-column min-vh-100': fullscreen
579
- })
471
+ className: classNames(['d-flex', 'flex-column', 'min-vh-100'])
580
472
  }, /*#__PURE__*/React.createElement(MainNavbar, {
581
473
  className: classNames(['border-bottom', 'sticky-top', 'px-3'])
582
474
  }), /*#__PURE__*/React.createElement("div", {
583
- className: classNames((_classNames = {
584
- 'd-flex flex-column flex-grow-1': fullscreen
585
- }, _defineProperty(_classNames, "bg-".concat(background), background !== null), _defineProperty(_classNames, "text-".concat(text), text !== null), _classNames))
475
+ className: classNames(['flex-grow-1', (_ref2 = {
476
+ 'd-flex flex-column': fullscreen
477
+ }, _defineProperty(_ref2, "bg-".concat(background), background !== null), _defineProperty(_ref2, "text-".concat(text), text !== null), _ref2)])
586
478
  }, children));
587
479
  };
588
480
 
589
- MainLayout.propTypes = propTypes$k;
590
- MainLayout.defaultProps = defaultProps$k;
481
+ MainLayout.propTypes = propTypes$i;
482
+ MainLayout.defaultProps = defaultProps$i;
591
483
 
592
- var propTypes$j = {
593
- title: PropTypes$1.label,
594
- actions: PropTypes.node,
595
- small: PropTypes.bool,
596
- className: PropTypes.string,
597
- children: PropTypes.node
484
+ var propTypes$h = {
485
+ title: PropTypes.label,
486
+ actions: PropTypes$1.node,
487
+ small: PropTypes$1.bool,
488
+ className: PropTypes$1.string,
489
+ children: PropTypes$1.node
598
490
  };
599
- var defaultProps$j = {
491
+ var defaultProps$h = {
600
492
  title: null,
601
493
  actions: null,
602
494
  small: false,
@@ -613,14 +505,13 @@ var PageHeader = function PageHeader(_ref) {
613
505
  className = _ref.className,
614
506
  children = _ref.children;
615
507
 
616
- var _usePanneau = usePanneau(),
617
- components = _usePanneau.components;
618
-
508
+ // TODO: fix page header components
509
+ // const { components } = usePanneau();
619
510
  var _usePanneauColorSchem = usePanneauColorScheme(),
620
511
  text = _usePanneauColorSchem.text,
621
- background = _usePanneauColorSchem.background;
512
+ background = _usePanneauColorSchem.background; // console.log('page-header', components); // eslint-disable-line
513
+
622
514
 
623
- console.log(components);
624
515
  var inner = /*#__PURE__*/React.createElement("div", {
625
516
  className: "d-flex align-items-center flex-wrap"
626
517
  }, title !== null ? /*#__PURE__*/React.createElement("h1", {
@@ -639,191 +530,40 @@ var PageHeader = function PageHeader(_ref) {
639
530
  }, inner)) : inner), children);
640
531
  };
641
532
 
642
- PageHeader.propTypes = propTypes$j;
643
- PageHeader.defaultProps = defaultProps$j;
644
-
645
- var propTypes$i = {
646
- resource: PropTypes$1.resource.isRequired,
647
- values: PropTypes.object,
648
- // eslint-disable-line react/forbid-prop-types,
649
- message: PropTypes$1.message.isRequired
650
- };
651
- var defaultProps$i = {
652
- values: null
653
- };
654
-
655
- var ResourceLabel = function ResourceLabel(_ref) {
656
- var resource = _ref.resource,
657
- values = _ref.values,
658
- message = _ref.message;
659
- var _resource$label = resource.label,
660
- label = _resource$label === void 0 ? null : _resource$label,
661
- _resource$intl = resource.intl,
662
- intl = _resource$intl === void 0 ? null : _resource$intl,
663
- _resource$localizatio = resource.localization,
664
- localization = _resource$localizatio === void 0 ? null : _resource$localizatio;
665
-
666
- var _ref2 = intl || localization || {},
667
- resourceValues = _ref2.values;
668
-
669
- return /*#__PURE__*/React.createElement(FormattedMessage, Object.assign({
670
- values: _objectSpread(_objectSpread({
671
- label: label
672
- }, resourceValues), values)
673
- }, message));
674
- };
675
-
676
- ResourceLabel.propTypes = propTypes$i;
677
- ResourceLabel.defaultProps = defaultProps$i;
678
-
679
- var propTypes$h = {
680
- component: PropTypes.string,
681
- resource: PropTypes$1.resource.isRequired,
682
- messages: PropTypes.object,
683
- // eslint-disable-line react/forbid-prop-types
684
- item: PropTypes.object,
685
- // eslint-disable-line react/forbid-prop-types
686
- onSuccess: PropTypes.func,
687
- isDelete: PropTypes.bool
688
- };
689
- var defaultProps$h = {
690
- component: null,
691
- item: null,
692
- messages: null,
693
- onSuccess: null,
694
- isDelete: false
695
- };
696
-
697
- var ResourceForm = function ResourceForm(_ref) {
698
- var component = _ref.component,
699
- resource = _ref.resource,
700
- messages = _ref.messages,
701
- onSuccess = _ref.onSuccess,
702
- item = _ref.item,
703
- isDelete = _ref.isDelete,
704
- props = _objectWithoutProperties(_ref, ["component", "resource", "messages", "onSuccess", "item", "isDelete"]);
705
-
706
- var FormComponents = useFormsComponents();
707
-
708
- var _ref2 = resource || {},
709
- baseFields = _ref2.fields,
710
- _ref2$forms = _ref2.forms,
711
- forms = _ref2$forms === void 0 ? {} : _ref2$forms;
712
-
713
- var isCreate = item === null || !item.id; // Pick fields from resource root or form
714
-
715
- var _ref3 = forms || {},
716
- _ref3$default = _ref3["default"],
717
- defaultForm = _ref3$default === void 0 ? null : _ref3$default,
718
- _ref3$create = _ref3.create,
719
- createForm = _ref3$create === void 0 ? null : _ref3$create,
720
- _ref3$edit = _ref3.edit,
721
- editForm = _ref3$edit === void 0 ? null : _ref3$edit;
722
-
723
- var _ref4 = defaultForm || {},
724
- defaultFields = _ref4.fields,
725
- defaultComponent = _ref4.component;
726
-
727
- var _ref5 = isCreate ? createForm || {} : editForm || {},
728
- _ref5$fields = _ref5.fields,
729
- formFields = _ref5$fields === void 0 ? null : _ref5$fields,
730
- _ref5$component = _ref5.component,
731
- formComponent = _ref5$component === void 0 ? null : _ref5$component;
732
-
733
- var resourceFields = formFields || defaultFields || baseFields; // Form routes
734
-
735
- var resourceRoute = useResourceUrlGenerator(resource);
736
-
737
- var _useResourceStore = useResourceStore(resource),
738
- store = _useResourceStore.store;
739
-
740
- var _useResourceUpdate = useResourceUpdate(resource, item != null ? item.id : null),
741
- update = _useResourceUpdate.update;
742
-
743
- var postForm = useCallback(function (action, data) {
744
- return isCreate ? store(data) : update(data);
745
- }, [isCreate, store, update]); // Form state
746
-
747
- var getInitialValue = useCallback(function () {
748
- return item !== null ? item : resourceFields.reduce(function (defaultValues, _ref6) {
749
- var name = _ref6.name,
750
- _ref6$default_value = _ref6.default_value,
751
- defaultValue = _ref6$default_value === void 0 ? null : _ref6$default_value;
752
- return defaultValue !== null ? _objectSpread(_objectSpread({}, defaultValues), {}, _defineProperty({}, name, defaultValue)) : defaultValues;
753
- }, null);
754
- }, [item, resourceFields]);
755
-
756
- var _useState = useState(getInitialValue()),
757
- _useState2 = _slicedToArray(_useState, 2),
758
- value = _useState2[0],
759
- setValue = _useState2[1];
760
-
761
- var _useForm = useForm({
762
- fields: resourceFields,
763
- value: value,
764
- postForm: postForm,
765
- setValue: setValue,
766
- onComplete: onSuccess
767
- }),
768
- fields = _useForm.fields,
769
- onSubmit = _useForm.onSubmit,
770
- status = _useForm.status,
771
- generalError = _useForm.generalError,
772
- errors = _useForm.errors; // Form action
773
-
774
-
775
- var modifyAction = isCreate ? resourceRoute('store') : resourceRoute('update', {
776
- id: item.id
777
- });
778
- var action = isDelete ? resourceRoute('destroy', {
779
- id: item.id
780
- }) : modifyAction; // Form component
781
-
782
- var FormComponent = getComponentFromName(component || formComponent || defaultComponent || 'normal', FormComponents, component); // Lisen to item value change
783
-
784
- useEffect(function () {
785
- setValue(getInitialValue());
786
- }, [getInitialValue, setValue]);
787
- return /*#__PURE__*/React.createElement(FormProvider, {
788
- value: value,
789
- setValue: setValue
790
- }, /*#__PURE__*/React.createElement(FormComponent, Object.assign({}, props, {
791
- status: status,
792
- resource: resource,
793
- item: item,
794
- fields: fields,
795
- generalError: generalError,
796
- errors: errors,
797
- action: action,
798
- onSubmit: onSubmit,
799
- isCreate: isCreate,
800
- value: value,
801
- messages: messages,
802
- onChange: setValue
803
- })));
804
- };
805
-
806
- ResourceForm.propTypes = propTypes$h;
807
- ResourceForm.defaultProps = defaultProps$h;
533
+ PageHeader.propTypes = propTypes$h;
534
+ PageHeader.defaultProps = defaultProps$h;
808
535
 
809
536
  var propTypes$g = {
810
- resource: PropTypes$1.resource.isRequired
537
+ resource: PropTypes.resource.isRequired
811
538
  };
812
539
  var defaultProps$g = {};
813
540
 
814
541
  var ResourceCreatePage = function ResourceCreatePage(_ref) {
815
542
  var resource = _ref.resource;
816
543
  var history = useHistory();
544
+
545
+ var _useLocation = useLocation(),
546
+ search = _useLocation.search;
547
+
817
548
  var resourceRoute = useResourceUrlGenerator(resource);
818
549
  var onSuccess = useCallback(function () {
819
550
  history.push("".concat(resourceRoute('index'), "?created=true"));
820
551
  }, [history, resourceRoute]);
552
+
553
+ var _useMemo = useMemo(function () {
554
+ return parse(search);
555
+ }, [search]),
556
+ _useMemo$type = _useMemo.type,
557
+ type = _useMemo$type === void 0 ? null : _useMemo$type;
558
+
821
559
  return /*#__PURE__*/React.createElement(ResourceProvider, {
822
560
  resource: resource
823
561
  }, /*#__PURE__*/React.createElement(MainLayout, null, /*#__PURE__*/React.createElement(PageHeader, {
824
- title: /*#__PURE__*/React.createElement(ResourceLabel, {
562
+ title: /*#__PURE__*/React.createElement(ResourceMessage, {
825
563
  resource: resource,
826
- message: messages$1.create
564
+ id: "resources.create",
565
+ defaultMessage: "Create {a_singular}",
566
+ description: "Page title"
827
567
  }),
828
568
  small: true
829
569
  }), /*#__PURE__*/React.createElement("div", {
@@ -834,7 +574,7 @@ var ResourceCreatePage = function ResourceCreatePage(_ref) {
834
574
  className: "col-12 col-md-8 col-lg-7"
835
575
  }, /*#__PURE__*/React.createElement(ResourceForm, {
836
576
  resource: resource,
837
- messages: messages$1,
577
+ type: type,
838
578
  onSuccess: onSuccess
839
579
  }))))));
840
580
  };
@@ -843,8 +583,8 @@ ResourceCreatePage.propTypes = propTypes$g;
843
583
  ResourceCreatePage.defaultProps = defaultProps$g;
844
584
 
845
585
  var propTypes$f = {
846
- resource: PropTypes$1.resource.isRequired,
847
- itemId: PropTypes.string.isRequired
586
+ resource: PropTypes.resource.isRequired,
587
+ itemId: PropTypes$1.string.isRequired
848
588
  };
849
589
  var defaultProps$f = {};
850
590
 
@@ -861,18 +601,20 @@ var ResourceDeletePage = function ResourceDeletePage(_ref) {
861
601
  return history.push("".concat(resourceRoute('index'), "?deleted=true"));
862
602
  }, [history, resourceRoute]); // Navigate back
863
603
 
864
- var _ref2 = history || [],
865
- entries = _ref2.entries,
866
- length = _ref2.length;
604
+ var _ref2 = history || {},
605
+ _ref2$entries = _ref2.entries,
606
+ entries = _ref2$entries === void 0 ? [] : _ref2$entries;
867
607
 
868
- var previousEntry = length > 1 ? entries[length - 2] : null;
608
+ var previousEntry = entries !== null && entries.length > 1 ? entries[entries.length - 2] : null;
869
609
  var previous = (previousEntry === null || previousEntry === void 0 ? void 0 : previousEntry.pathname) || null;
870
610
  return /*#__PURE__*/React.createElement(ResourceProvider, {
871
611
  resource: resource
872
612
  }, /*#__PURE__*/React.createElement(MainLayout, null, /*#__PURE__*/React.createElement(PageHeader, {
873
- title: /*#__PURE__*/React.createElement(ResourceLabel, {
613
+ title: /*#__PURE__*/React.createElement(ResourceMessage, {
874
614
  resource: resource,
875
- message: messages$1["delete"]
615
+ id: "resources.delete",
616
+ defaultMessage: "Delete {a_singular}",
617
+ description: "Page title"
876
618
  }),
877
619
  small: true
878
620
  }), /*#__PURE__*/React.createElement("div", {
@@ -882,9 +624,8 @@ var ResourceDeletePage = function ResourceDeletePage(_ref) {
882
624
  }, /*#__PURE__*/React.createElement("div", {
883
625
  className: "col-12 col-md-8 col-lg-7"
884
626
  }, item !== null ? /*#__PURE__*/React.createElement(ResourceForm, {
885
- component: "delete",
627
+ component: "",
886
628
  resource: resource,
887
- messages: messages$1,
888
629
  item: item,
889
630
  onSuccess: onSuccess,
890
631
  previous: previous,
@@ -896,8 +637,8 @@ ResourceDeletePage.propTypes = propTypes$f;
896
637
  ResourceDeletePage.defaultProps = defaultProps$f;
897
638
 
898
639
  var propTypes$e = {
899
- resource: PropTypes$1.resource.isRequired,
900
- itemId: PropTypes.string.isRequired
640
+ resource: PropTypes.resource.isRequired,
641
+ itemId: PropTypes$1.string.isRequired
901
642
  };
902
643
  var defaultProps$e = {};
903
644
 
@@ -905,11 +646,13 @@ var ResourceEditPage = function ResourceEditPage(_ref) {
905
646
  var resource = _ref.resource,
906
647
  itemId = _ref.itemId;
907
648
 
908
- // console.log(itemId);
909
- // const resourceRoute = useResourceUrlGenerator(resource);
910
649
  var _useResourceItem = useResourceItem(resource, itemId),
911
650
  item = _useResourceItem.item;
912
651
 
652
+ var _ref2 = item || {},
653
+ _ref2$type = _ref2.type,
654
+ type = _ref2$type === void 0 ? null : _ref2$type;
655
+
913
656
  var _useState = useState(item),
914
657
  _useState2 = _slicedToArray(_useState, 2),
915
658
  editItem = _useState2[0],
@@ -924,9 +667,11 @@ var ResourceEditPage = function ResourceEditPage(_ref) {
924
667
  return /*#__PURE__*/React.createElement(ResourceProvider, {
925
668
  resource: resource
926
669
  }, /*#__PURE__*/React.createElement(MainLayout, null, /*#__PURE__*/React.createElement(PageHeader, {
927
- title: /*#__PURE__*/React.createElement(ResourceLabel, {
670
+ title: /*#__PURE__*/React.createElement(ResourceMessage, {
928
671
  resource: resource,
929
- message: messages$1.edit
672
+ id: "resources.edit",
673
+ defaultMessage: "Edit {a_singular}",
674
+ description: "Page title"
930
675
  }),
931
676
  small: true
932
677
  }), /*#__PURE__*/React.createElement("div", {
@@ -937,8 +682,8 @@ var ResourceEditPage = function ResourceEditPage(_ref) {
937
682
  className: "col-12 col-md-8 col-lg-7"
938
683
  }, editItem !== null ? /*#__PURE__*/React.createElement(ResourceForm, {
939
684
  resource: resource,
940
- messages: messages$1,
941
685
  item: editItem,
686
+ type: type,
942
687
  onSuccess: onSuccess
943
688
  }) : null)))));
944
689
  };
@@ -947,8 +692,8 @@ ResourceEditPage.propTypes = propTypes$e;
947
692
  ResourceEditPage.defaultProps = defaultProps$e;
948
693
 
949
694
  var propTypes$d = {
950
- resource: PropTypes$1.resource.isRequired,
951
- className: PropTypes.string
695
+ resource: PropTypes.resource.isRequired,
696
+ className: PropTypes$1.string
952
697
  };
953
698
  var defaultProps$d = {
954
699
  className: null
@@ -968,32 +713,41 @@ var ResourceCreateButtom = function ResourceCreateButtom(_ref) {
968
713
 
969
714
  var onClickDropdown = useCallback(function (e) {
970
715
  e.preventDefault();
971
- setDropdownOpened(!dropdownOpened);
972
- }, [dropdownOpened, setDropdownOpened]);
716
+ setDropdownOpened(function (opened) {
717
+ return !opened;
718
+ });
719
+ }, [setDropdownOpened]);
720
+ var finalTypes = types !== null ? types.filter(function (_ref2) {
721
+ var _ref2$settings = _ref2.settings;
722
+ _ref2$settings = _ref2$settings === void 0 ? {} : _ref2$settings;
723
+ var _ref2$settings$canCre = _ref2$settings.canCreate,
724
+ canCreate = _ref2$settings$canCre === void 0 ? true : _ref2$settings$canCre;
725
+ return canCreate;
726
+ }) : null;
727
+ var hasMultipleTypes = finalTypes !== null && finalTypes.length > 1;
728
+ var onDropdownClickOutside = useCallback(function () {
729
+ setDropdownOpened(false);
730
+ }, [setDropdownOpened]);
973
731
  var button = /*#__PURE__*/React.createElement(Button, {
974
- href: types === null ? resourceRoute('create') : '#',
732
+ href: !hasMultipleTypes ? "".concat(resourceRoute('create')).concat(finalTypes !== null && finalTypes.length === 1 ? "?type=".concat(finalTypes[0].id) : '') : '#',
975
733
  size: "lg",
976
734
  theme: "primary",
977
735
  className: classNames([_defineProperty({
978
- 'dropdown-toggle': types !== null
736
+ 'dropdown-toggle': hasMultipleTypes
979
737
  }, className, className !== null)]),
980
- onClick: types !== null ? onClickDropdown : null
981
- }, /*#__PURE__*/React.createElement(ResourceLabel, {
738
+ onClick: hasMultipleTypes ? onClickDropdown : null
739
+ }, /*#__PURE__*/React.createElement(ResourceMessage, {
982
740
  resource: resource,
983
- message: messages$1.create
741
+ id: "resources.create_btn",
742
+ defaultMessage: "Create {a_singular}",
743
+ description: "Button label"
984
744
  }));
985
- return types !== null ? /*#__PURE__*/React.createElement("div", {
745
+ return hasMultipleTypes ? /*#__PURE__*/React.createElement("div", {
986
746
  className: classNames(['dropdown', {
987
747
  show: dropdownOpened
988
748
  }])
989
749
  }, button, /*#__PURE__*/React.createElement(Dropdown, {
990
- items: types.filter(function (_ref3) {
991
- var _ref3$settings = _ref3.settings;
992
- _ref3$settings = _ref3$settings === void 0 ? {} : _ref3$settings;
993
- var _ref3$settings$can_cr = _ref3$settings.can_create,
994
- canCreate = _ref3$settings$can_cr === void 0 ? true : _ref3$settings$can_cr;
995
- return canCreate;
996
- }).map(function (it) {
750
+ items: finalTypes.map(function (it) {
997
751
  return {
998
752
  id: it.id,
999
753
  label: it.name,
@@ -1001,135 +755,143 @@ var ResourceCreateButtom = function ResourceCreateButtom(_ref) {
1001
755
  };
1002
756
  }),
1003
757
  visible: dropdownOpened,
1004
- align: "right"
758
+ align: "end",
759
+ onClickOutside: onDropdownClickOutside
1005
760
  })) : button;
1006
761
  };
1007
762
 
1008
763
  ResourceCreateButtom.propTypes = propTypes$d;
1009
764
  ResourceCreateButtom.defaultProps = defaultProps$d;
1010
765
 
1011
- var getValueWithout = function getValueWithout(value, withoutKey) {
1012
- return value !== null ? _objectSpread({}, Object.keys(value).reduce(function (newValueMap, key) {
1013
- return key !== withoutKey ? _objectSpread(_objectSpread({}, newValueMap), {}, _defineProperty({}, key, value[key])) : newValueMap;
1014
- }, {})) : null;
1015
- };
1016
-
766
+ var _excluded$3 = ["component", "name", "groupLabel"];
1017
767
  var propTypes$c = {
1018
- filters: PropTypes.arrayOf(PropTypes.oneOf([''])),
1019
- value: PropTypes.object,
768
+ filters: PropTypes$1.arrayOf(PropTypes$1.shape({
769
+ id: PropTypes$1.string.isRequired,
770
+ component: PropTypes$1.string.isRequired
771
+ })),
772
+ value: PropTypes$1.object,
1020
773
  // eslint-disable-line react/forbid-prop-types
1021
- onChange: PropTypes.func,
1022
- onSubmit: PropTypes.func,
1023
- withContainer: PropTypes.bool,
1024
- withReset: PropTypes.bool,
1025
- className: PropTypes.string
774
+ onChange: PropTypes$1.func,
775
+ onReset: PropTypes$1.func,
776
+ withContainer: PropTypes$1.bool,
777
+ withReset: PropTypes$1.bool,
778
+ className: PropTypes$1.string
1026
779
  };
1027
780
  var defaultProps$c = {
1028
781
  filters: [],
1029
782
  value: null,
1030
783
  onChange: null,
1031
- onSubmit: null,
784
+ onReset: null,
1032
785
  withContainer: false,
1033
- withReset: false,
786
+ withReset: true,
1034
787
  className: null
1035
788
  };
1036
789
 
1037
790
  var ResourceFilters = function ResourceFilters(_ref) {
1038
791
  var filters = _ref.filters,
1039
- initialValue = _ref.value,
792
+ value = _ref.value,
1040
793
  onChange = _ref.onChange,
1041
- onSubmit = _ref.onSubmit,
794
+ onReset = _ref.onReset,
1042
795
  withContainer = _ref.withContainer,
1043
796
  withReset = _ref.withReset,
1044
797
  className = _ref.className;
1045
798
  var FilterComponents = useFiltersComponents();
1046
799
 
1047
- var _useState = useState(initialValue),
1048
- _useState2 = _slicedToArray(_useState, 2),
1049
- value = _useState2[0],
1050
- setValue = _useState2[1];
1051
-
1052
- var onFormChange = useCallback(function (newFieldValue, key) {
1053
- var newValue = newFieldValue !== null ? _objectSpread(_objectSpread({}, value), {}, _defineProperty({}, key, newFieldValue)) : getValueWithout(value, key);
1054
- setValue(newValue);
800
+ var _usePanneauColorSchem = usePanneauColorScheme(),
801
+ background = _usePanneauColorSchem.background;
1055
802
 
1056
- if (onChange !== null) {
1057
- onChange(newValue);
803
+ var currentFilters = filters || [];
804
+ var onFiltersReset = useCallback(function () {
805
+ if (onReset !== null) {
806
+ onReset(null);
1058
807
  }
1059
- }, [value, setValue, onChange]);
1060
- var onReset = useCallback(function () {
1061
- setValue(initialValue);
1062
- onChange(initialValue);
1063
- }, [onChange, setValue, initialValue]);
1064
- var filterItems = (filters || []).filter(function (f) {
1065
- return f !== null;
1066
- });
808
+ }, [onReset]);
809
+ var hasActiveFilter = (currentFilters || []).reduce(function (isActive, item) {
810
+ if (value !== null && value[item.name]) {
811
+ return true;
812
+ }
813
+
814
+ return isActive;
815
+ }, false);
1067
816
  return /*#__PURE__*/React.createElement(Navbar, {
1068
817
  className: classNames([_defineProperty({
1069
818
  'navbar-expand-md': withContainer
1070
- }, className, className !== null)]),
819
+ }, className, className !== null), 'justify-content-start', 'align-items-start', 'flex-column', 'flex-md-row']),
820
+ theme: background,
1071
821
  withoutCollapse: true
1072
- }, filterItems.map(function (_ref3, index) {
1073
- var id = _ref3.id,
1074
- component = _ref3.component;
822
+ }, currentFilters.map(function (_ref3, index) {
823
+ var component = _ref3.component,
824
+ name = _ref3.name,
825
+ groupLabel = _ref3.groupLabel,
826
+ filterProps = _objectWithoutProperties(_ref3, _excluded$3);
827
+
1075
828
  var FilterComponent = getComponentFromName(component, FilterComponents, null);
1076
- return FilterComponent !== null ? /*#__PURE__*/React.createElement(FilterComponent, {
1077
- key: "filter-".concat(id, "-").concat(index + 1),
1078
- onChange: onFormChange
1079
- }) : null;
1080
- }), filterItems.length > 0 && onSubmit !== null ? /*#__PURE__*/React.createElement(Button, {
1081
- theme: "primary",
1082
- onClick: onSubmit
1083
- }, /*#__PURE__*/React.createElement(FormattedMessage, {
1084
- id: "lists.filters.submit",
1085
- defaultMessage: [{
1086
- "type": 0,
1087
- "value": "Submit"
1088
- }]
1089
- })) : null, filterItems.length > 0 && withReset ? /*#__PURE__*/React.createElement(Button, {
829
+ var filterValue = value !== null && value[name] ? value[name] : null;
830
+ var onFilterChange = useCallback(function (newFilterValue) {
831
+ if (name !== null && onChange !== null) {
832
+ onChange(_objectSpread(_objectSpread({}, value), {}, _defineProperty({}, name, newFilterValue)));
833
+ }
834
+ }, [onChange, name]);
835
+ return FilterComponent !== null ? /*#__PURE__*/React.createElement(FormGroup, {
836
+ key: "filter-".concat(name, "-").concat(index + 1),
837
+ label: groupLabel,
838
+ className: "me-4"
839
+ }, /*#__PURE__*/React.createElement(FilterComponent, Object.assign({}, filterProps, {
840
+ value: filterValue,
841
+ onChange: onFilterChange
842
+ }))) : null;
843
+ }), withReset && hasActiveFilter && currentFilters.length > 1 ? /*#__PURE__*/React.createElement(Button, {
1090
844
  theme: "primary",
1091
- onClick: onReset
1092
- }, /*#__PURE__*/React.createElement(FormattedMessage, {
1093
- id: "lists.filters.reset",
1094
- defaultMessage: [{
1095
- "type": 0,
1096
- "value": "Reset"
1097
- }]
845
+ onClick: onFiltersReset
846
+ }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
847
+ icon: faUndo
1098
848
  })) : null);
1099
849
  };
1100
850
 
1101
851
  ResourceFilters.propTypes = propTypes$c;
1102
852
  ResourceFilters.defaultProps = defaultProps$c;
1103
853
 
854
+ var _excluded$2 = ["component", "showPagination", "filters"],
855
+ _excluded2$1 = ["page"];
1104
856
  var propTypes$b = {
1105
- resource: PropTypes$1.resource.isRequired,
1106
- query: PropTypes.object,
857
+ resource: PropTypes.resource.isRequired,
858
+ query: PropTypes$1.object,
1107
859
  // eslint-disable-line react/forbid-prop-types
1108
- paginated: PropTypes.bool,
1109
- component: PropTypes.oneOfType([PropTypes.elementType, PropTypes.string]),
1110
- componentProps: PropTypes.object,
860
+ paginated: PropTypes$1.bool,
861
+ baseUrl: PropTypes$1.string,
862
+ component: PropTypes$1.oneOfType([PropTypes$1.elementType, PropTypes$1.string]),
863
+ componentProps: PropTypes$1.object,
1111
864
  // eslint-disable-line react/forbid-prop-types
1112
- withoutFilters: PropTypes.bool,
1113
- onQueryChange: PropTypes.func
865
+ onQueryChange: PropTypes$1.func,
866
+ onQueryReset: PropTypes$1.func
1114
867
  };
1115
868
  var defaultProps$b = {
1116
869
  query: null,
1117
870
  paginated: true,
1118
871
  component: null,
872
+ baseUrl: null,
1119
873
  componentProps: null,
1120
- withoutFilters: true,
1121
- onQueryChange: null
874
+ onQueryChange: null,
875
+ onQueryReset: null
1122
876
  };
1123
877
 
1124
878
  var ResourceItemsList = function ResourceItemsList(_ref) {
1125
879
  var resource = _ref.resource,
1126
- component = _ref.component,
1127
- componentProps = _ref.componentProps,
1128
880
  query = _ref.query,
881
+ baseUrl = _ref.baseUrl,
1129
882
  onQueryChange = _ref.onQueryChange,
1130
- paginated = _ref.paginated,
1131
- withoutFilters = _ref.withoutFilters,
1132
- props = _objectWithoutProperties(_ref, ["resource", "component", "componentProps", "query", "onQueryChange", "paginated", "withoutFilters"]);
883
+ onQueryReset = _ref.onQueryReset,
884
+ paginated = _ref.paginated;
885
+ var _resource$index = resource.index;
886
+ _resource$index = _resource$index === void 0 ? {} : _resource$index;
887
+
888
+ var _resource$index$compo = _resource$index.component,
889
+ listComponent = _resource$index$compo === void 0 ? null : _resource$index$compo,
890
+ _resource$index$showP = _resource$index.showPagination,
891
+ showPagination = _resource$index$showP === void 0 ? true : _resource$index$showP,
892
+ _resource$index$filte = _resource$index.filters,
893
+ filters = _resource$index$filte === void 0 ? null : _resource$index$filte,
894
+ listProps = _objectWithoutProperties(_resource$index, _excluded$2);
1133
895
 
1134
896
  var _usePanneauColorSchem = usePanneauColorScheme(),
1135
897
  _usePanneauColorSchem2 = _usePanneauColorSchem.background,
@@ -1137,48 +899,76 @@ var ResourceItemsList = function ResourceItemsList(_ref) {
1137
899
 
1138
900
  var ListComponents = useListsComponents();
1139
901
 
1140
- var _ref2 = query || {},
1141
- _ref2$page = _ref2.page,
1142
- page = _ref2$page === void 0 ? 1 : _ref2$page;
1143
-
1144
- var items = useResourceItems(resource, query, paginated ? parseInt(page, 10) : null);
1145
- var onListQueryChange = useCallback(function (newQuery) {
1146
- if (onQueryChange !== null) {
1147
- onQueryChange(newQuery);
1148
- }
1149
- }, [onQueryChange]);
1150
- var ListComponent = getComponentFromName(component || 'table', ListComponents, component || null);
1151
- return /*#__PURE__*/React.createElement(React.Fragment, null, !withoutFilters ? /*#__PURE__*/React.createElement(ResourceFilters, {
1152
- filters: [],
902
+ var _useMemo = useMemo(function () {
903
+ var _ref2 = query || {},
904
+ _ref2$page = _ref2.page,
905
+ currentPage = _ref2$page === void 0 ? 1 : _ref2$page,
906
+ rest = _objectWithoutProperties(_ref2, _excluded2$1);
907
+
908
+ return [currentPage, rest];
909
+ }, [query]),
910
+ _useMemo2 = _slicedToArray(_useMemo, 2),
911
+ page = _useMemo2[0],
912
+ queryWithoutPage = _useMemo2[1];
913
+
914
+ var itemsProps = useResourceItems(resource, queryWithoutPage, paginated ? parseInt(page, 10) : null);
915
+
916
+ var _ref3 = itemsProps || {},
917
+ _ref3$lastPage = _ref3.lastPage,
918
+ lastPage = _ref3$lastPage === void 0 ? 0 : _ref3$lastPage,
919
+ _ref3$total = _ref3.total,
920
+ total = _ref3$total === void 0 ? 0 : _ref3$total;
921
+
922
+ var ListComponent = getComponentFromName(listComponent || 'table', ListComponents);
923
+ return /*#__PURE__*/React.createElement(React.Fragment, null, filters !== null ? /*#__PURE__*/React.createElement(ResourceFilters, {
924
+ filters: filters,
1153
925
  value: query,
1154
- onSubmit: onQueryChange,
1155
- className: "mb-4"
1156
- }) : null, ListComponent !== null ? /*#__PURE__*/React.createElement(ListComponent, Object.assign({}, props, items, componentProps, {
1157
- page: paginated ? parseInt(page, 10) : null,
926
+ onChange: onQueryChange,
927
+ onReset: onQueryReset
928
+ }) : null, paginated && showPagination ? /*#__PURE__*/React.createElement(Pagination, {
929
+ page: page,
930
+ lastPage: lastPage,
931
+ total: total,
932
+ url: baseUrl,
933
+ query: query,
934
+ className: "mt-1 mb-1"
935
+ }) : null, ListComponent !== null ? /*#__PURE__*/React.createElement(ListComponent, Object.assign({}, itemsProps, listProps, {
1158
936
  resource: resource,
937
+ baseUrl: baseUrl,
1159
938
  query: query,
1160
- onQueryChange: onListQueryChange,
939
+ onQueryChange: onQueryChange,
940
+ onQueryReset: onQueryReset,
1161
941
  theme: theme
1162
- })) : null);
942
+ })) : null, paginated && showPagination ? /*#__PURE__*/React.createElement(Pagination, {
943
+ page: page,
944
+ lastPage: lastPage,
945
+ total: total,
946
+ url: baseUrl,
947
+ query: query,
948
+ className: "mt-4 mb-1"
949
+ }) : null);
1163
950
  };
1164
951
 
1165
952
  ResourceItemsList.propTypes = propTypes$b;
1166
953
  ResourceItemsList.defaultProps = defaultProps$b;
1167
954
 
955
+ var _excluded$1 = ["id", "component"];
1168
956
  var propTypes$a = {
1169
- resource: PropTypes$1.resource.isRequired
957
+ resource: PropTypes.resource.isRequired,
958
+ defaultActions: PropTypes$1.arrayOf(PropTypes$1.object)
959
+ };
960
+ var defaultProps$a = {
961
+ defaultActions: ['create']
1170
962
  };
1171
- var defaultProps$a = {};
1172
963
 
1173
964
  var ResourceIndexPage = function ResourceIndexPage(_ref) {
1174
- var resource = _ref.resource;
965
+ var resource = _ref.resource,
966
+ defaultActions = _ref.defaultActions;
1175
967
  var name = resource.name,
1176
968
  _resource$settings = resource.settings,
1177
969
  settings = _resource$settings === void 0 ? {} : _resource$settings,
1178
- _resource$components = resource.components;
1179
- _resource$components = _resource$components === void 0 ? {} : _resource$components;
1180
- var _resource$components$ = _resource$components.index,
1181
- index = _resource$components$ === void 0 ? {} : _resource$components$;
970
+ _resource$index = resource.index,
971
+ index = _resource$index === void 0 ? {} : _resource$index;
1182
972
 
1183
973
  var _ref2 = settings || {},
1184
974
  _ref2$canCreate = _ref2.canCreate,
@@ -1187,10 +977,22 @@ var ResourceIndexPage = function ResourceIndexPage(_ref) {
1187
977
  paginated = _ref2$indexIsPaginate === void 0 ? false : _ref2$indexIsPaginate;
1188
978
 
1189
979
  var _ref3 = index || {},
1190
- _ref3$component = _ref3.component,
1191
- indexComponent = _ref3$component === void 0 ? null : _ref3$component,
1192
- _ref3$props = _ref3.props,
1193
- indexProps = _ref3$props === void 0 ? null : _ref3$props;
980
+ _ref3$actions = _ref3.actions,
981
+ actions = _ref3$actions === void 0 ? null : _ref3$actions;
982
+
983
+ var finalActions = useMemo(function () {
984
+ return (actions || defaultActions.filter(function (it) {
985
+ return it !== 'create' || canCreate;
986
+ })).map(function (it) {
987
+ return it === 'create' ? {
988
+ id: 'create',
989
+ component: ResourceCreateButtom,
990
+ size: 'lg',
991
+ theme: 'primary'
992
+ } : it;
993
+ });
994
+ }, [canCreate, actions]);
995
+ var componentsManager = useComponentsManager();
1194
996
 
1195
997
  var _useLocation = useLocation(),
1196
998
  search = _useLocation.search;
@@ -1212,10 +1014,20 @@ var ResourceIndexPage = function ResourceIndexPage(_ref) {
1212
1014
  var resourceRoute = useResourceUrlGenerator(resource);
1213
1015
  var url = resourceRoute('index');
1214
1016
  var onQueryChange = useCallback(function (submitQuery) {
1215
- history.push("".concat(url, "?").concat(stringify(submitQuery, {
1017
+ var newQuery = submitQuery !== null ? Object.keys(submitQuery).reduce(function (currentQuery, key) {
1018
+ var value = submitQuery[key];
1019
+ return value !== null ? _objectSpread(_objectSpread({}, currentQuery), {}, _defineProperty({}, key, value)) : currentQuery;
1020
+ }, null) : null;
1021
+ history.push("".concat(url).concat(newQuery !== null ? "?".concat(stringify(newQuery, {
1216
1022
  arrayFormat: 'bracket'
1217
- })));
1218
- }, [history, url]);
1023
+ })) : ''));
1024
+ }, [history, url, query, paginated]);
1025
+ var onQueryReset = useCallback(function () {
1026
+ var queryString = stringify(null, {
1027
+ arrayFormat: 'bracket'
1028
+ });
1029
+ history.push("".concat(url, "?").concat(queryString));
1030
+ }, [history, url, paginated]);
1219
1031
  var onClickCloseAlert = useCallback(function () {
1220
1032
  history.replace(url);
1221
1033
  }, [history, url]);
@@ -1223,34 +1035,48 @@ var ResourceIndexPage = function ResourceIndexPage(_ref) {
1223
1035
  resource: resource
1224
1036
  }, /*#__PURE__*/React.createElement(MainLayout, null, /*#__PURE__*/React.createElement(PageHeader, {
1225
1037
  title: name,
1226
- actions: canCreate ? /*#__PURE__*/React.createElement(ResourceCreateButtom, {
1227
- resource: resource,
1228
- size: "lg",
1229
- theme: "primary"
1230
- }) : null
1038
+ actions: finalActions.length > 0 ? /*#__PURE__*/React.createElement("div", {
1039
+ className: "d-flex align-items-center"
1040
+ }, finalActions.map(function (_ref5) {
1041
+ var id = _ref5.id,
1042
+ _ref5$component = _ref5.component,
1043
+ component = _ref5$component === void 0 ? Button : _ref5$component,
1044
+ actionProps = _objectWithoutProperties(_ref5, _excluded$1);
1045
+
1046
+ var ActionComponent = isString(component) ? componentsManager.getComponent(component) : component;
1047
+ return ActionComponent !== null ? /*#__PURE__*/React.createElement(ActionComponent, Object.assign({
1048
+ key: "action-".concat(id)
1049
+ }, actionProps, ActionComponent !== Button ? {
1050
+ resource: resource,
1051
+ query: query,
1052
+ onQueryChange: onQueryChange
1053
+ } : {})) : null;
1054
+ })) : null
1231
1055
  }), /*#__PURE__*/React.createElement("div", {
1232
1056
  className: classNames(['container-sm py-4'])
1233
1057
  }, created ? /*#__PURE__*/React.createElement(Alert, {
1234
1058
  className: "mb-4",
1235
1059
  onClose: onClickCloseAlert
1236
- }, /*#__PURE__*/React.createElement(ResourceLabel, {
1060
+ }, /*#__PURE__*/React.createElement(ResourceMessage, {
1237
1061
  resource: resource,
1238
- message: messages$1.created
1062
+ id: "resources.created",
1063
+ defaultMessage: "{the_singular} has been created.",
1064
+ description: "Alert message"
1239
1065
  })) : null, deleted ? /*#__PURE__*/React.createElement(Alert, {
1240
1066
  className: "mb-4",
1241
1067
  onClose: onClickCloseAlert
1242
- }, /*#__PURE__*/React.createElement(ResourceLabel, {
1068
+ }, /*#__PURE__*/React.createElement(ResourceMessage, {
1243
1069
  resource: resource,
1244
- message: messages$1.deleted
1070
+ id: "resources.deleted",
1071
+ defaultMessage: "{the_singular} has been deleted.",
1072
+ description: "Alert message"
1245
1073
  })) : null, /*#__PURE__*/React.createElement(ResourceItemsList, {
1246
1074
  resource: resource,
1247
- messages: messages$1,
1248
1075
  baseUrl: url,
1249
1076
  query: listQuery,
1250
1077
  paginated: paginated,
1251
- component: indexComponent,
1252
- componentProps: indexProps,
1253
- onQueryChange: onQueryChange
1078
+ onQueryChange: onQueryChange,
1079
+ onQueryReset: onQueryReset
1254
1080
  }))));
1255
1081
  };
1256
1082
 
@@ -1258,7 +1084,7 @@ ResourceIndexPage.propTypes = propTypes$a;
1258
1084
  ResourceIndexPage.defaultProps = defaultProps$a;
1259
1085
 
1260
1086
  var propTypes$9 = {
1261
- resource: PropTypes$1.resource.isRequired
1087
+ resource: PropTypes.resource.isRequired
1262
1088
  };
1263
1089
  var defaultProps$9 = {};
1264
1090
 
@@ -1283,23 +1109,30 @@ var defaultProps$8 = {};
1283
1109
  var HomePage = function HomePage() {
1284
1110
  var route = useUrlGenerator();
1285
1111
  var resources = usePanneauResources();
1112
+ var visibleResources = resources.filter(function (_ref) {
1113
+ var _ref$settings = _ref.settings;
1114
+ _ref$settings = _ref$settings === void 0 ? {} : _ref$settings;
1115
+ var _ref$settings$hideInN = _ref$settings.hideInNavbar,
1116
+ hideInNavbar = _ref$settings$hideInN === void 0 ? false : _ref$settings$hideInN;
1117
+ return !hideInNavbar;
1118
+ });
1286
1119
  return /*#__PURE__*/React.createElement(MainLayout, null, /*#__PURE__*/React.createElement("div", {
1287
1120
  className: "container-sm py-4"
1288
- }, resources.map(function (resource) {
1289
- var _ref = resource || {},
1290
- resourceId = _ref.id,
1291
- hasRoutes = _ref.has_routes;
1121
+ }, visibleResources.map(function (resource) {
1122
+ var _ref2 = resource || {},
1123
+ resourceId = _ref2.id;
1292
1124
 
1293
- var routeName = hasRoutes ? "resources.".concat(resourceId, ".index") : 'resources.index';
1294
1125
  return /*#__PURE__*/React.createElement(Link, {
1295
1126
  className: "d-block my-2",
1296
1127
  key: "resource-link-".concat(resourceId),
1297
- to: route("".concat(routeName), {
1128
+ to: route('resources.index', {
1298
1129
  resource: resourceId
1299
1130
  })
1300
- }, /*#__PURE__*/React.createElement(ResourceLabel, {
1131
+ }, /*#__PURE__*/React.createElement(ResourceMessage, {
1301
1132
  resource: resource,
1302
- message: messages$1.index
1133
+ id: "resources.view",
1134
+ defaultMessage: "View {the_plural}",
1135
+ description: "Button label"
1303
1136
  }));
1304
1137
  })));
1305
1138
  };
@@ -1320,8 +1153,8 @@ AccountPage.propTypes = propTypes$7;
1320
1153
  AccountPage.defaultProps = defaultProps$7;
1321
1154
 
1322
1155
  var propTypes$6 = {
1323
- children: PropTypes.node.isRequired,
1324
- fullscreen: PropTypes.bool
1156
+ children: PropTypes$1.node.isRequired,
1157
+ fullscreen: PropTypes$1.bool
1325
1158
  };
1326
1159
  var defaultProps$6 = {
1327
1160
  fullscreen: false
@@ -1357,104 +1190,88 @@ var GuestLayout = function GuestLayout(_ref) {
1357
1190
  GuestLayout.propTypes = propTypes$6;
1358
1191
  GuestLayout.defaultProps = defaultProps$6;
1359
1192
 
1193
+ /* eslint-disable react/jsx-props-no-spreading */
1360
1194
  var propTypes$5 = {
1361
- className: PropTypes.string,
1362
- onSuccess: PropTypes.func
1195
+ fields: PropTypes.fields,
1196
+ className: PropTypes$1.string,
1197
+ onSuccess: PropTypes$1.func
1363
1198
  };
1364
1199
  var defaultProps$5 = {
1200
+ fields: [{
1201
+ name: 'email',
1202
+ type: 'email',
1203
+ size: 'lg',
1204
+ label: /*#__PURE__*/React.createElement(FormattedMessage, {
1205
+ id: "LI0Gz4",
1206
+ defaultMessage: [{
1207
+ "type": 0,
1208
+ "value": "Email"
1209
+ }]
1210
+ })
1211
+ }, {
1212
+ name: 'password',
1213
+ type: 'password',
1214
+ size: 'lg',
1215
+ label: /*#__PURE__*/React.createElement(FormattedMessage, {
1216
+ id: "4yfet+",
1217
+ defaultMessage: [{
1218
+ "type": 0,
1219
+ "value": "Password"
1220
+ }]
1221
+ })
1222
+ }],
1365
1223
  className: null,
1366
1224
  onSuccess: null
1367
1225
  };
1368
1226
 
1369
1227
  var LoginForm = function LoginForm(_ref) {
1370
- var className = _ref.className,
1228
+ var formFields = _ref.fields,
1229
+ className = _ref.className,
1371
1230
  onSuccess = _ref.onSuccess;
1231
+ var url = useUrlGenerator();
1372
1232
 
1373
- // const url = useUrlGenerator();
1374
1233
  var _useAuth = useAuth(),
1375
1234
  login = _useAuth.login;
1376
1235
 
1377
- var TextField = useFieldComponent('text');
1236
+ var postForm = useCallback(function (action, _ref2) {
1237
+ var email = _ref2.email,
1238
+ password = _ref2.password;
1239
+ return login(email, password);
1240
+ }, [login]);
1378
1241
 
1379
- var _useState = useState(''),
1380
- _useState2 = _slicedToArray(_useState, 2),
1381
- email = _useState2[0],
1382
- setEmail = _useState2[1];
1383
-
1384
- var _useState3 = useState(''),
1385
- _useState4 = _slicedToArray(_useState3, 2),
1386
- password = _useState4[0],
1387
- setPassword = _useState4[1];
1388
-
1389
- var _useState5 = useState(null),
1390
- _useState6 = _slicedToArray(_useState5, 2),
1391
- error = _useState6[0],
1392
- setError = _useState6[1];
1393
-
1394
- var postForm = useCallback(function () {
1395
- return login(email, password).then(function () {
1396
- return onSuccess();
1397
- })["catch"](function (e) {
1398
- console.error(e);
1399
-
1400
- if (e.message) {
1401
- setError(e.message);
1402
- }
1403
- });
1404
- }, [login, email, password, setError]);
1405
- var onChangeEmail = useCallback(function (value) {
1406
- setEmail(value);
1407
- }, [setEmail]);
1408
- var onChangePassword = useCallback(function (value) {
1409
- setPassword(value);
1410
- }, [setPassword]);
1411
- return /*#__PURE__*/React.createElement("form", {
1242
+ var _useForm = useForm({
1243
+ fields: formFields,
1244
+ postForm: postForm,
1245
+ onComplete: onSuccess
1246
+ }),
1247
+ value = _useForm.value,
1248
+ setValue = _useForm.setValue,
1249
+ fields = _useForm.fields,
1250
+ onSubmit = _useForm.onSubmit,
1251
+ status = _useForm.status,
1252
+ generalError = _useForm.generalError,
1253
+ errors = _useForm.errors;
1254
+
1255
+ var NormalForm = useFormComponent('normal');
1256
+ return /*#__PURE__*/React.createElement(NormalForm, {
1257
+ action: url('auth.login'),
1412
1258
  method: "post",
1413
- className: className
1414
- }, error !== null ? /*#__PURE__*/React.createElement("div", {
1415
- className: "alert alert-danger mt-2"
1416
- }, error) : null, /*#__PURE__*/React.createElement(FormGroup, {
1417
- label: /*#__PURE__*/React.createElement(FormattedMessage, {
1418
- id: "form.email",
1419
- defaultMessage: [{
1420
- "type": 0,
1421
- "value": "Email"
1422
- }]
1423
- })
1424
- }, /*#__PURE__*/React.createElement(TextField, {
1425
- type: "email",
1426
- size: "lg",
1427
- value: email,
1428
- onChange: onChangeEmail
1429
- })), /*#__PURE__*/React.createElement(FormGroup, {
1430
- label: /*#__PURE__*/React.createElement(FormattedMessage, {
1431
- id: "form.password",
1259
+ fields: fields,
1260
+ onSubmit: onSubmit,
1261
+ className: className,
1262
+ status: status,
1263
+ generalError: generalError,
1264
+ errors: errors,
1265
+ value: value,
1266
+ onChange: setValue,
1267
+ submitButtonLabel: /*#__PURE__*/React.createElement(FormattedMessage, {
1268
+ id: "g6qbbX",
1432
1269
  defaultMessage: [{
1433
1270
  "type": 0,
1434
- "value": "Password"
1271
+ "value": "Log in"
1435
1272
  }]
1436
1273
  })
1437
- }, /*#__PURE__*/React.createElement(TextField, {
1438
- type: "password",
1439
- size: "lg",
1440
- value: password,
1441
- onChange: onChangePassword
1442
- })), /*#__PURE__*/React.createElement("div", {
1443
- className: "mt4 d-flex"
1444
- }, /*#__PURE__*/React.createElement(Button, {
1445
- onClick: postForm,
1446
- type: "button",
1447
- theme: "primary",
1448
- size: "lg",
1449
- className: "ms-auto",
1450
- disabled: email === '' || password === ''
1451
- }, /*#__PURE__*/React.createElement(FormattedMessage, {
1452
- id: "login",
1453
- defaultMessage: [{
1454
- "type": 0,
1455
- "value": "Log in"
1456
- }]
1457
- }))));
1274
+ });
1458
1275
  };
1459
1276
 
1460
1277
  LoginForm.propTypes = propTypes$5;
@@ -1465,10 +1282,6 @@ var propTypes$4 = {};
1465
1282
  var defaultProps$4 = {};
1466
1283
 
1467
1284
  var LoginPage = function LoginPage() {
1468
- var _ref = messages$1 || {},
1469
- _ref$login_title = _ref.login_title,
1470
- loginMessage = _ref$login_title === void 0 ? null : _ref$login_title;
1471
-
1472
1285
  var route = useUrlGenerator();
1473
1286
  var onSuccess = useCallback(function () {
1474
1287
  window.location.href = route('home');
@@ -1483,7 +1296,13 @@ var LoginPage = function LoginPage() {
1483
1296
  className: "col-12 col-sm-8 col-md-6"
1484
1297
  }, /*#__PURE__*/React.createElement("h1", {
1485
1298
  className: "mb-4"
1486
- }, /*#__PURE__*/React.createElement(FormattedMessage, loginMessage)), /*#__PURE__*/React.createElement(LoginForm, {
1299
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
1300
+ id: "AeOZq+",
1301
+ defaultMessage: [{
1302
+ "type": 0,
1303
+ "value": "Login"
1304
+ }]
1305
+ })), /*#__PURE__*/React.createElement(LoginForm, {
1487
1306
  onSuccess: onSuccess
1488
1307
  })))));
1489
1308
  };
@@ -1493,91 +1312,91 @@ LoginPage.defaultProps = defaultProps$4;
1493
1312
 
1494
1313
  var messages = defineMessages({
1495
1314
  metaTitle401: {
1496
- "id": "meta.title_401",
1315
+ "id": "HOobY2",
1497
1316
  "defaultMessage": [{
1498
1317
  "type": 0,
1499
1318
  "value": "Error 401"
1500
1319
  }]
1501
1320
  },
1502
1321
  title401: {
1503
- "id": "errors.title_401",
1322
+ "id": "6nwWPR",
1504
1323
  "defaultMessage": [{
1505
1324
  "type": 0,
1506
1325
  "value": "Error 401"
1507
1326
  }]
1508
1327
  },
1509
1328
  description401: {
1510
- "id": "errors.description_401",
1329
+ "id": "82P2dS",
1511
1330
  "defaultMessage": [{
1512
1331
  "type": 0,
1513
1332
  "value": "You are not authorized to access this page."
1514
1333
  }]
1515
1334
  },
1516
1335
  metaTitle403: {
1517
- "id": "meta.title_403",
1336
+ "id": "+6cCPF",
1518
1337
  "defaultMessage": [{
1519
1338
  "type": 0,
1520
1339
  "value": "Error 403"
1521
1340
  }]
1522
1341
  },
1523
1342
  title403: {
1524
- "id": "errors.title_403",
1343
+ "id": "Pih2UO",
1525
1344
  "defaultMessage": [{
1526
1345
  "type": 0,
1527
1346
  "value": "Error 403"
1528
1347
  }]
1529
1348
  },
1530
1349
  description403: {
1531
- "id": "errors.description_403",
1350
+ "id": "8HFiMs",
1532
1351
  "defaultMessage": [{
1533
1352
  "type": 0,
1534
1353
  "value": "Access to this page is forbidden"
1535
1354
  }]
1536
1355
  },
1537
1356
  metaTitle404: {
1538
- "id": "meta.title_404",
1357
+ "id": "US/AMe",
1539
1358
  "defaultMessage": [{
1540
1359
  "type": 0,
1541
1360
  "value": "Error 404"
1542
1361
  }]
1543
1362
  },
1544
1363
  title404: {
1545
- "id": "errors.title_404",
1364
+ "id": "6Ie+vL",
1546
1365
  "defaultMessage": [{
1547
1366
  "type": 0,
1548
1367
  "value": "Error 404"
1549
1368
  }]
1550
1369
  },
1551
1370
  description404: {
1552
- "id": "errors.description_404",
1371
+ "id": "wKPI1y",
1553
1372
  "defaultMessage": [{
1554
1373
  "type": 0,
1555
1374
  "value": "This page doesn’t exist"
1556
1375
  }]
1557
1376
  },
1558
1377
  metaTitle500: {
1559
- "id": "meta.title_500",
1378
+ "id": "ejwBSw",
1560
1379
  "defaultMessage": [{
1561
1380
  "type": 0,
1562
1381
  "value": "Error 500"
1563
1382
  }]
1564
1383
  },
1565
1384
  title500: {
1566
- "id": "errors.title_500",
1385
+ "id": "owrRHV",
1567
1386
  "defaultMessage": [{
1568
1387
  "type": 0,
1569
1388
  "value": "Error 500"
1570
1389
  }]
1571
1390
  },
1572
1391
  description500: {
1573
- "id": "errors.description_500",
1392
+ "id": "yALN2p",
1574
1393
  "defaultMessage": [{
1575
1394
  "type": 0,
1576
1395
  "value": "There was an error"
1577
1396
  }]
1578
1397
  },
1579
1398
  gotoHome: {
1580
- "id": "errors.goto_home",
1399
+ "id": "hezcGl",
1581
1400
  "defaultMessage": [{
1582
1401
  "type": 0,
1583
1402
  "value": "Go to home page"
@@ -1585,7 +1404,7 @@ var messages = defineMessages({
1585
1404
  }
1586
1405
  });
1587
1406
  var propTypes$3 = {
1588
- statusCode: PropTypes$1.statusCode
1407
+ statusCode: PropTypes.statusCode
1589
1408
  };
1590
1409
  var defaultProps$3 = {
1591
1410
  statusCode: null
@@ -1620,19 +1439,22 @@ var basePages = /*#__PURE__*/Object.freeze({
1620
1439
  Error: ErrorPage
1621
1440
  });
1622
1441
 
1442
+ var _excluded = ["path", "component", "exact"],
1443
+ _excluded2 = ["id"];
1623
1444
  var propTypes$2 = {
1624
- resource: PropTypes$1.resource.isRequired
1445
+ resource: PropTypes.resource.isRequired
1625
1446
  };
1626
1447
  var defaultProps$2 = {};
1627
1448
 
1628
1449
  var ResourceRoutes = function ResourceRoutes(_ref) {
1629
1450
  var resource = _ref.resource;
1630
1451
  var resourceId = resource.id,
1631
- hasRoutes = resource.has_routes,
1632
1452
  _resource$pages = resource.pages,
1633
- pages = _resource$pages === void 0 ? {} : _resource$pages;
1453
+ pages = _resource$pages === void 0 ? {} : _resource$pages,
1454
+ _resource$extraRoutes = resource.extraRoutes,
1455
+ extraRoutes = _resource$extraRoutes === void 0 ? [] : _resource$extraRoutes;
1634
1456
  var route = useUrlGenerator();
1635
- var routeName = hasRoutes ? "resources.".concat(resourceId) : 'resources'; // Load custom pages from resource
1457
+ var componentsManager = useComponentsManager(); // Load custom pages from resource
1636
1458
 
1637
1459
  var _ref2 = pages || {},
1638
1460
  _ref2$index = _ref2.index,
@@ -1646,13 +1468,36 @@ var ResourceRoutes = function ResourceRoutes(_ref) {
1646
1468
  _ref2$delete = _ref2["delete"],
1647
1469
  deletePage = _ref2$delete === void 0 ? null : _ref2$delete;
1648
1470
 
1649
- var ResourceIndexComponent = getComponentFromName((indexPage === null || indexPage === void 0 ? void 0 : indexPage.component) || 'resource-index', basePages, indexPage === null || indexPage === void 0 ? void 0 : indexPage.component);
1650
- var ResourceShowComponent = getComponentFromName((showPage === null || showPage === void 0 ? void 0 : showPage.component) || 'resource-show', basePages, showPage === null || showPage === void 0 ? void 0 : showPage.component);
1651
- var ResourceCreateComponent = getComponentFromName((createPage === null || createPage === void 0 ? void 0 : createPage.component) || 'resource-create', basePages, createPage === null || createPage === void 0 ? void 0 : createPage.component);
1652
- var ResourceEditComponent = getComponentFromName((editPage === null || editPage === void 0 ? void 0 : editPage.component) || 'resource-edit', basePages, editPage === null || editPage === void 0 ? void 0 : editPage.component);
1653
- var ResourceDeleteComponent = getComponentFromName((deletePage === null || deletePage === void 0 ? void 0 : deletePage.component) || 'resource-delete', basePages, deletePage === null || deletePage === void 0 ? void 0 : deletePage.component);
1654
- return /*#__PURE__*/React.createElement(Switch, null, /*#__PURE__*/React.createElement(Route, {
1655
- path: route("".concat(routeName, ".index"), {
1471
+ var ResourceIndexComponent = indexPage !== null && typeof indexPage.component !== 'undefined' ? componentsManager.getComponent(indexPage.component) : ResourceIndexPage;
1472
+ var ResourceShowComponent = showPage !== null && typeof showPage.component !== 'undefined' ? componentsManager.getComponent(showPage.component) : ResourceShowPage;
1473
+ var ResourceCreateComponent = createPage !== null && typeof createPage.component !== 'undefined' ? componentsManager.getComponent(createPage.component) : ResourceCreatePage;
1474
+ var ResourceEditComponent = editPage !== null && typeof editPage.component !== 'undefined' ? componentsManager.getComponent(editPage.component) : ResourceEditPage;
1475
+ var ResourceDeleteComponent = deletePage !== null && typeof deletePage.component !== 'undefined' ? componentsManager.getComponent(deletePage.component) : ResourceDeletePage;
1476
+ return /*#__PURE__*/React.createElement(Switch, null, extraRoutes.map(function (_ref3) {
1477
+ var path = _ref3.path,
1478
+ component = _ref3.component,
1479
+ _ref3$exact = _ref3.exact,
1480
+ exact = _ref3$exact === void 0 ? true : _ref3$exact,
1481
+ pageProps = _objectWithoutProperties(_ref3, _excluded);
1482
+
1483
+ var RouteComponent = componentsManager.getComponent(component);
1484
+ return RouteComponent !== null ? /*#__PURE__*/React.createElement(Route, {
1485
+ key: "route-".concat(path),
1486
+ path: path,
1487
+ exact: exact,
1488
+ render: function render(_ref4) {
1489
+ var _ref4$match$params = _ref4.match.params,
1490
+ id = _ref4$match$params.id,
1491
+ params = _objectWithoutProperties(_ref4$match$params, _excluded2);
1492
+
1493
+ return /*#__PURE__*/React.createElement(RouteComponent, Object.assign({
1494
+ resource: resource,
1495
+ itemId: id
1496
+ }, pageProps, params));
1497
+ }
1498
+ }) : null;
1499
+ }), /*#__PURE__*/React.createElement(Route, {
1500
+ path: route('resources.index', {
1656
1501
  resource: resourceId
1657
1502
  }),
1658
1503
  exact: true,
@@ -1662,7 +1507,7 @@ var ResourceRoutes = function ResourceRoutes(_ref) {
1662
1507
  });
1663
1508
  }
1664
1509
  }), /*#__PURE__*/React.createElement(Route, {
1665
- path: route("".concat(routeName, ".create"), {
1510
+ path: route('resources.create', {
1666
1511
  resource: resourceId
1667
1512
  }),
1668
1513
  exact: true,
@@ -1672,39 +1517,39 @@ var ResourceRoutes = function ResourceRoutes(_ref) {
1672
1517
  });
1673
1518
  }
1674
1519
  }), /*#__PURE__*/React.createElement(Route, {
1675
- path: route("".concat(routeName, ".show"), {
1520
+ path: route('resources.show', {
1676
1521
  resource: resourceId,
1677
1522
  id: ':id'
1678
1523
  }),
1679
1524
  exact: true,
1680
- render: function render(_ref3) {
1681
- var id = _ref3.match.params.id;
1525
+ render: function render(_ref5) {
1526
+ var id = _ref5.match.params.id;
1682
1527
  return /*#__PURE__*/React.createElement(ResourceShowComponent, {
1683
1528
  resource: resource,
1684
1529
  itemId: id
1685
1530
  });
1686
1531
  }
1687
1532
  }), /*#__PURE__*/React.createElement(Route, {
1688
- path: route("".concat(routeName, ".edit"), {
1533
+ path: route('resources.edit', {
1689
1534
  resource: resourceId,
1690
1535
  id: ':id'
1691
1536
  }),
1692
1537
  exact: true,
1693
- render: function render(_ref4) {
1694
- var id = _ref4.match.params.id;
1538
+ render: function render(_ref6) {
1539
+ var id = _ref6.match.params.id;
1695
1540
  return /*#__PURE__*/React.createElement(ResourceEditComponent, {
1696
1541
  resource: resource,
1697
1542
  itemId: id
1698
1543
  });
1699
1544
  }
1700
1545
  }), /*#__PURE__*/React.createElement(Route, {
1701
- path: route("".concat(routeName, ".delete"), {
1546
+ path: route('resources.delete', {
1702
1547
  resource: resourceId,
1703
1548
  id: ':id'
1704
1549
  }),
1705
1550
  exact: true,
1706
- render: function render(_ref5) {
1707
- var id = _ref5.match.params.id;
1551
+ render: function render(_ref7) {
1552
+ var id = _ref7.match.params.id;
1708
1553
  return /*#__PURE__*/React.createElement(ResourceDeleteComponent, {
1709
1554
  resource: resource,
1710
1555
  itemId: id
@@ -1717,7 +1562,7 @@ ResourceRoutes.propTypes = propTypes$2;
1717
1562
  ResourceRoutes.defaultProps = defaultProps$2;
1718
1563
 
1719
1564
  var propTypes$1 = {
1720
- statusCode: PropTypes$1.statusCode
1565
+ statusCode: PropTypes.statusCode
1721
1566
  };
1722
1567
  var defaultProps$1 = {
1723
1568
  statusCode: null
@@ -1734,7 +1579,6 @@ var PanneauRoutes = function PanneauRoutes(_ref) {
1734
1579
 
1735
1580
  var _useLocation = useLocation(),
1736
1581
  pathname = _useLocation.pathname; // search
1737
- // console.log('PATHNAME', pathname); // eslint-disable-line
1738
1582
 
1739
1583
 
1740
1584
  var _useState = useState({
@@ -1798,13 +1642,11 @@ var PanneauRoutes = function PanneauRoutes(_ref) {
1798
1642
  to: route('login')
1799
1643
  }), resources.map(function (resource) {
1800
1644
  var _ref3 = resource || {},
1801
- resourceId = _ref3.id,
1802
- hasRoutes = _ref3.has_routes;
1645
+ resourceId = _ref3.id;
1803
1646
 
1804
- var routeName = hasRoutes ? "resources.".concat(resourceId) : 'resources.index';
1805
1647
  return user !== null ? /*#__PURE__*/React.createElement(Route, {
1806
1648
  key: "resource-".concat(resourceId),
1807
- path: route("".concat(routeName), {
1649
+ path: route('resources.index', {
1808
1650
  resource: resourceId
1809
1651
  }),
1810
1652
  render: function render() {
@@ -1814,7 +1656,7 @@ var PanneauRoutes = function PanneauRoutes(_ref) {
1814
1656
  }
1815
1657
  }) : /*#__PURE__*/React.createElement(Redirect, {
1816
1658
  key: "resource-".concat(resourceId),
1817
- from: route("".concat(routeName, ".index"), {
1659
+ from: route('resources.index', {
1818
1660
  resource: resourceId
1819
1661
  }),
1820
1662
  to: "".concat(route('login'), "?next=").concat(encodeURIComponent(pathname))
@@ -1832,65 +1674,90 @@ PanneauRoutes.propTypes = propTypes$1;
1832
1674
  PanneauRoutes.defaultProps = defaultProps$1;
1833
1675
 
1834
1676
  var propTypes = {
1835
- definition: PropTypes$1.panneauDefinition.isRequired,
1836
- user: PropTypes$1.user,
1837
- memoryRouter: PropTypes.bool,
1838
- baseUrl: PropTypes.string,
1839
- statusCode: PropTypes$1.statusCode
1677
+ definition: PropTypes.panneauDefinition.isRequired,
1678
+ components: PropTypes$1.oneOfType([PropTypes$1.objectOf(PropTypes$1.elementType), PropTypes$1.objectOf(PropTypes$1.objectOf(PropTypes$1.elementType))]),
1679
+ user: PropTypes.user,
1680
+ memoryRouter: PropTypes$1.bool,
1681
+ baseUrl: PropTypes$1.string,
1682
+ uppy: PropTypes.uppy,
1683
+ statusCode: PropTypes.statusCode
1840
1684
  };
1841
1685
  var defaultProps = {
1686
+ components: null,
1842
1687
  user: null,
1843
1688
  memoryRouter: false,
1844
1689
  baseUrl: null,
1690
+ uppy: null,
1845
1691
  statusCode: null
1846
1692
  };
1847
1693
 
1848
1694
  var Container = function Container(_ref) {
1849
1695
  var definition = _ref.definition,
1696
+ components = _ref.components,
1850
1697
  user = _ref.user,
1851
1698
  memoryRouter = _ref.memoryRouter,
1852
1699
  baseUrl = _ref.baseUrl,
1700
+ uppy = _ref.uppy,
1853
1701
  statusCode = _ref.statusCode;
1854
1702
  var _definition$intl = definition.intl;
1855
1703
  _definition$intl = _definition$intl === void 0 ? {} : _definition$intl;
1856
1704
  var _definition$intl$loca = _definition$intl.locale,
1857
1705
  locale = _definition$intl$loca === void 0 ? 'en' : _definition$intl$loca,
1858
- locales = _definition$intl.locales,
1859
- _definition$intl$mess = _definition$intl.messages,
1860
- translations = _definition$intl$mess === void 0 ? {} : _definition$intl$mess,
1706
+ _definition$intl$loca2 = _definition$intl.locales,
1707
+ locales = _definition$intl$loca2 === void 0 ? [] : _definition$intl$loca2,
1861
1708
  _definition$routes = definition.routes,
1862
1709
  routes = _definition$routes === void 0 ? {} : _definition$routes,
1863
- _definition$settings = definition.settings,
1864
- settings = _definition$settings === void 0 ? {} : _definition$settings;
1865
-
1866
- var _ref2 = settings || {},
1867
- _ref2$memoryRouter = _ref2.memoryRouter,
1868
- usesMemoryRouter = _ref2$memoryRouter === void 0 ? false : _ref2$memoryRouter;
1869
-
1870
- var Router = memoryRouter || usesMemoryRouter ? MemoryRouter : BrowserRouter; // For storybook: auto load page with: initialEntries={['/pages/1/edit']} initialIndex={0}
1871
-
1872
- console.log('definition', definition); // eslint-disable-line
1873
-
1874
- return /*#__PURE__*/React.createElement(Router, null, /*#__PURE__*/React.createElement(PanneauProvider, {
1875
- definition: definition
1876
- }, /*#__PURE__*/React.createElement(IntlProvider, {
1877
- locale: locale,
1878
- messages: translations[locale] || translations
1879
- }, /*#__PURE__*/React.createElement(LocalesProvider, {
1710
+ _definition$settings = definition.settings;
1711
+ _definition$settings = _definition$settings === void 0 ? {} : _definition$settings;
1712
+ var _definition$settings$ = _definition$settings.memoryRouter,
1713
+ usesMemoryRouter = _definition$settings$ === void 0 ? false : _definition$settings$;
1714
+ var Router = memoryRouter || usesMemoryRouter ? MemoryRouter : BrowserRouter;
1715
+ var extraMessages = useMemo(function () {
1716
+ var _definition$intl2 = definition.intl;
1717
+ _definition$intl2 = _definition$intl2 === void 0 ? {} : _definition$intl2;
1718
+ var _definition$intl2$mes = _definition$intl2.messages,
1719
+ messages = _definition$intl2$mes === void 0 ? null : _definition$intl2$mes,
1720
+ _definition$resources = definition.resources,
1721
+ resources = _definition$resources === void 0 ? [] : _definition$resources;
1722
+ return _objectSpread(_objectSpread({}, messages), resources.reduce(function (allMessages, _ref2) {
1723
+ var id = _ref2.id,
1724
+ _ref2$intl = _ref2.intl;
1725
+ _ref2$intl = _ref2$intl === void 0 ? {} : _ref2$intl;
1726
+ var _ref2$intl$messages = _ref2$intl.messages,
1727
+ resourceMessages = _ref2$intl$messages === void 0 ? {} : _ref2$intl$messages;
1728
+ return _objectSpread(_objectSpread({}, allMessages), Object.keys(resourceMessages).reduce(function (allResourceMessages, key) {
1729
+ return _objectSpread(_objectSpread({}, allResourceMessages), {}, _defineProperty({}, "resources.".concat(id, ".").concat(key), resourceMessages[key]));
1730
+ }, {}));
1731
+ }, {}));
1732
+ }, [definition]);
1733
+ var onUnauthorized = useCallback(function () {
1734
+ window.location.href = baseUrl;
1735
+ }, [baseUrl]);
1736
+ var onLogout = useCallback(function () {
1737
+ window.location.reload();
1738
+ }, [baseUrl]);
1739
+ return /*#__PURE__*/React.createElement(Router, null, /*#__PURE__*/React.createElement(IntlProvider, {
1880
1740
  locale: locale,
1881
- locales: locales
1882
- }, /*#__PURE__*/React.createElement(RoutesProvider, {
1741
+ locales: locales,
1742
+ extraMessages: extraMessages
1743
+ }, /*#__PURE__*/React.createElement(PanneauProvider, {
1744
+ definition: definition
1745
+ }, /*#__PURE__*/React.createElement(UppyProvider, uppy, /*#__PURE__*/React.createElement(RoutesProvider, {
1883
1746
  routes: routes
1884
1747
  }, /*#__PURE__*/React.createElement(FieldsProvider, null, /*#__PURE__*/React.createElement(FormsProvider, null, /*#__PURE__*/React.createElement(ListsProvider, null, /*#__PURE__*/React.createElement(DisplaysProvider, null, /*#__PURE__*/React.createElement(FiltersProvider, null, /*#__PURE__*/React.createElement(ApiProvider, {
1885
- baseUrl: baseUrl
1748
+ baseUrl: baseUrl,
1749
+ onUnauthorized: onUnauthorized
1886
1750
  }, /*#__PURE__*/React.createElement(AuthProvider, {
1887
- user: user
1751
+ user: user,
1752
+ onLogout: onLogout
1753
+ }, /*#__PURE__*/React.createElement(ComponentsProvider, {
1754
+ components: components
1888
1755
  }, /*#__PURE__*/React.createElement(PanneauRoutes, {
1889
1756
  statusCode: statusCode
1890
- })))))))))))));
1757
+ }))))))))))))));
1891
1758
  };
1892
1759
 
1893
1760
  Container.propTypes = propTypes;
1894
1761
  Container.defaultProps = defaultProps;
1895
1762
 
1896
- export default Container;
1763
+ export { GuestLayout, MainLayout, PageHeader, ResourceFilters, ResourceForm, ResourceItemsList, Container as default };