@panneau/app 1.0.3 → 1.1.0
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/assets/css/styles.css +2 -2
- package/es/index.js +121 -39
- package/lib/index.js +126 -42
- package/package.json +26 -26
- package/scss/styles.scss +8 -1
package/es/index.js
CHANGED
@@ -14,9 +14,10 @@ import FiltersProvider from '@panneau/filters';
|
|
14
14
|
import FormsProvider from '@panneau/forms';
|
15
15
|
import { useResourceValues, IntlProvider } from '@panneau/intl';
|
16
16
|
import ListsProvider from '@panneau/lists';
|
17
|
-
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
18
|
-
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
|
19
17
|
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
18
|
+
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
|
19
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
20
|
+
import isObject from 'lodash/isObject';
|
20
21
|
import { parse, stringify } from 'query-string';
|
21
22
|
import { FormattedMessage, defineMessages } from 'react-intl';
|
22
23
|
import { useResourceUrlGenerator, useForm } from '@panneau/core/hooks';
|
@@ -24,8 +25,9 @@ import { getComponentFromName } from '@panneau/core/utils';
|
|
24
25
|
import classNames from 'classnames';
|
25
26
|
import Button from '@panneau/element-button';
|
26
27
|
import Form from '@panneau/element-form';
|
27
|
-
import
|
28
|
+
import isArray from 'lodash/isArray';
|
28
29
|
import Menu from '@panneau/element-menu';
|
30
|
+
import Navbar from '@panneau/element-navbar';
|
29
31
|
import Label from '@panneau/element-label';
|
30
32
|
import isString from 'lodash/isString';
|
31
33
|
import Alert from '@panneau/element-alert';
|
@@ -36,7 +38,7 @@ import { faUndo } from '@fortawesome/free-solid-svg-icons';
|
|
36
38
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
37
39
|
import FormGroup from '@panneau/element-form-group';
|
38
40
|
|
39
|
-
var _excluded$
|
41
|
+
var _excluded$6 = ["resource", "action", "previous", "status", "value", "onSubmit", "errors", "generalError", "className"];
|
40
42
|
var propTypes$m = {
|
41
43
|
resource: PropTypes.resource.isRequired,
|
42
44
|
action: PropTypes$1.string,
|
@@ -71,7 +73,7 @@ var DeleteForm = function DeleteForm(_ref) {
|
|
71
73
|
_ref.errors;
|
72
74
|
var generalError = _ref.generalError,
|
73
75
|
className = _ref.className,
|
74
|
-
props = _objectWithoutProperties(_ref, _excluded$
|
76
|
+
props = _objectWithoutProperties(_ref, _excluded$6);
|
75
77
|
var _ref2 = value || {},
|
76
78
|
_ref2$id = _ref2.id,
|
77
79
|
id = _ref2$id === void 0 ? null : _ref2$id;
|
@@ -145,7 +147,7 @@ var DeleteForm = function DeleteForm(_ref) {
|
|
145
147
|
DeleteForm.propTypes = propTypes$m;
|
146
148
|
DeleteForm.defaultProps = defaultProps$m;
|
147
149
|
|
148
|
-
var _excluded$
|
150
|
+
var _excluded$5 = ["component", "resource", "onSuccess", "item", "type", "isDelete"];
|
149
151
|
var propTypes$l = {
|
150
152
|
component: PropTypes$1.string,
|
151
153
|
resource: PropTypes.resource.isRequired,
|
@@ -169,7 +171,7 @@ var ResourceForm = function ResourceForm(_ref) {
|
|
169
171
|
item = _ref.item,
|
170
172
|
type = _ref.type,
|
171
173
|
isDelete = _ref.isDelete,
|
172
|
-
props = _objectWithoutProperties(_ref, _excluded$
|
174
|
+
props = _objectWithoutProperties(_ref, _excluded$5);
|
173
175
|
var locales = useLocales();
|
174
176
|
var FormComponents = useFormsComponents();
|
175
177
|
var _resource$fields = resource.fields,
|
@@ -420,30 +422,65 @@ var ResourcesMenu = function ResourcesMenu(_ref) {
|
|
420
422
|
ResourcesMenu.propTypes = propTypes$j;
|
421
423
|
ResourcesMenu.defaultProps = defaultProps$j;
|
422
424
|
|
423
|
-
/* eslint-disable react/jsx-props-no-spreading */
|
424
425
|
var propTypes$i = {};
|
425
426
|
var defaultProps$i = {};
|
426
427
|
var MainNavbar = function MainNavbar(props) {
|
427
428
|
var _usePanneau = usePanneau(),
|
428
|
-
name = _usePanneau.name
|
429
|
+
name = _usePanneau.name,
|
430
|
+
_usePanneau$menus = _usePanneau.menus,
|
431
|
+
menus = _usePanneau$menus === void 0 ? null : _usePanneau$menus;
|
432
|
+
var _ref = menus || {},
|
433
|
+
_ref$main = _ref.main,
|
434
|
+
main = _ref$main === void 0 ? null : _ref$main,
|
435
|
+
_ref$guest = _ref.guest,
|
436
|
+
guest = _ref$guest === void 0 ? null : _ref$guest;
|
429
437
|
var _usePanneauColorSchem = usePanneauColorScheme(),
|
430
438
|
background = _usePanneauColorSchem.background;
|
431
439
|
var route = useUrlGenerator();
|
432
440
|
var user = useUser();
|
441
|
+
var items = useMemo(function () {
|
442
|
+
var menuItems = (user !== null ? main : guest) || [];
|
443
|
+
var hasResources = menuItems.indexOf('resources') !== -1;
|
444
|
+
var hasAccount = menuItems.indexOf('account') !== -1;
|
445
|
+
return [!hasResources && user !== null ? 'resources' : null].concat(_toConsumableArray(menuItems), [!hasAccount && menuItems.indexOf('separator') === -1 ? 'separator' : null, !hasAccount ? 'account' : null]).filter(function (it) {
|
446
|
+
return it !== null;
|
447
|
+
}).reduce(function (currentItems, item) {
|
448
|
+
if (item === 'resources') {
|
449
|
+
return [].concat(_toConsumableArray(currentItems), [/*#__PURE__*/React.createElement(ResourcesMenu, {
|
450
|
+
className: "navbar-nav",
|
451
|
+
itemClassName: "nav-item",
|
452
|
+
linkClassName: "nav-link"
|
453
|
+
})]);
|
454
|
+
}
|
455
|
+
if (item === 'account') {
|
456
|
+
return [].concat(_toConsumableArray(currentItems), [/*#__PURE__*/React.createElement(AccountMenu, {
|
457
|
+
className: "navbar-nav",
|
458
|
+
itemClassName: "nav-item",
|
459
|
+
linkClassName: "nav-link"
|
460
|
+
})]);
|
461
|
+
}
|
462
|
+
if (item === 'separator') {
|
463
|
+
return [].concat(_toConsumableArray(currentItems), [/*#__PURE__*/React.createElement("span", {
|
464
|
+
className: "ms-auto"
|
465
|
+
})]);
|
466
|
+
}
|
467
|
+
var lastItem = currentItems.length > 0 ? currentItems[currentItems.length - 1] : null;
|
468
|
+
return isArray(lastItem) ? [].concat(_toConsumableArray(currentItems.slice(0, currentItems.length - 1)), [[].concat(_toConsumableArray(lastItem), [item])]) : [].concat(_toConsumableArray(currentItems), [[item]]);
|
469
|
+
}, []).map(function (it) {
|
470
|
+
return isArray(it) ? /*#__PURE__*/React.createElement(Menu, {
|
471
|
+
items: it,
|
472
|
+
className: "navbar-nav",
|
473
|
+
itemClassName: "nav-item",
|
474
|
+
linkClassName: "nav-link"
|
475
|
+
}) : it;
|
476
|
+
});
|
477
|
+
}, [main]);
|
433
478
|
return /*#__PURE__*/React.createElement(Navbar, Object.assign({
|
434
479
|
theme: background
|
435
480
|
}, props), name !== null ? /*#__PURE__*/React.createElement(Link, {
|
436
481
|
to: route('home'),
|
437
482
|
className: "navbar-brand"
|
438
|
-
}, name) : null,
|
439
|
-
className: "navbar-nav ml-4",
|
440
|
-
itemClassName: "nav-item",
|
441
|
-
linkClassName: "nav-link"
|
442
|
-
}) : null, /*#__PURE__*/React.createElement(AccountMenu, {
|
443
|
-
className: "navbar-nav ms-auto",
|
444
|
-
itemClassName: "nav-item",
|
445
|
-
linkClassName: "nav-link"
|
446
|
-
}));
|
483
|
+
}, name) : null, items);
|
447
484
|
};
|
448
485
|
MainNavbar.propTypes = propTypes$i;
|
449
486
|
MainNavbar.defaultProps = defaultProps$i;
|
@@ -708,10 +745,9 @@ var ResourceCreateButtom = function ResourceCreateButtom(_ref) {
|
|
708
745
|
setDropdownOpened = _useState2[1];
|
709
746
|
var onClickDropdown = useCallback(function (e) {
|
710
747
|
e.preventDefault();
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
}, [setDropdownOpened]);
|
748
|
+
e.stopPropagation();
|
749
|
+
setDropdownOpened(!dropdownOpened);
|
750
|
+
}, [setDropdownOpened, dropdownOpened]);
|
715
751
|
var finalTypes = types !== null ? types.filter(function (_ref2) {
|
716
752
|
var _ref2$settings = _ref2.settings,
|
717
753
|
_ref2$settings2 = _ref2$settings === void 0 ? {} : _ref2$settings,
|
@@ -721,8 +757,10 @@ var ResourceCreateButtom = function ResourceCreateButtom(_ref) {
|
|
721
757
|
}) : null;
|
722
758
|
var hasMultipleTypes = finalTypes !== null && finalTypes.length > 1;
|
723
759
|
var onDropdownClickOutside = useCallback(function () {
|
724
|
-
|
725
|
-
|
760
|
+
if (dropdownOpened) {
|
761
|
+
setDropdownOpened(false);
|
762
|
+
}
|
763
|
+
}, [setDropdownOpened, dropdownOpened]);
|
726
764
|
var button = /*#__PURE__*/React.createElement(Button, {
|
727
765
|
href: !hasMultipleTypes ? "".concat(resourceRoute('create')).concat(finalTypes !== null && finalTypes.length === 1 ? "?type=".concat(finalTypes[0].id) : '') : '#',
|
728
766
|
size: "lg",
|
@@ -762,7 +800,7 @@ var ResourceCreateButtom = function ResourceCreateButtom(_ref) {
|
|
762
800
|
ResourceCreateButtom.propTypes = propTypes$c;
|
763
801
|
ResourceCreateButtom.defaultProps = defaultProps$c;
|
764
802
|
|
765
|
-
var _excluded$
|
803
|
+
var _excluded$4 = ["component", "name", "groupLabel"];
|
766
804
|
var propTypes$b = {
|
767
805
|
filters: PropTypes$1.arrayOf(PropTypes$1.shape({
|
768
806
|
id: PropTypes$1.string.isRequired,
|
@@ -827,7 +865,7 @@ var ResourceFilters = function ResourceFilters(_ref) {
|
|
827
865
|
var component = _ref3.component,
|
828
866
|
name = _ref3.name,
|
829
867
|
groupLabel = _ref3.groupLabel,
|
830
|
-
filterProps = _objectWithoutProperties(_ref3, _excluded$
|
868
|
+
filterProps = _objectWithoutProperties(_ref3, _excluded$4);
|
831
869
|
var FilterComponent = getComponentFromName(component, FilterComponents, null);
|
832
870
|
var filterValue = value !== null && value[name] ? value[name] : null;
|
833
871
|
var onFilterChange = useCallback(function (newFilterValue) {
|
@@ -862,8 +900,8 @@ var ResourceFilters = function ResourceFilters(_ref) {
|
|
862
900
|
ResourceFilters.propTypes = propTypes$b;
|
863
901
|
ResourceFilters.defaultProps = defaultProps$b;
|
864
902
|
|
865
|
-
var _excluded$
|
866
|
-
_excluded2 = ["page"];
|
903
|
+
var _excluded$3 = ["component", "showPagination", "filters"],
|
904
|
+
_excluded2$1 = ["page"];
|
867
905
|
var propTypes$a = {
|
868
906
|
resource: PropTypes.resource.isRequired,
|
869
907
|
query: PropTypes$1.object,
|
@@ -900,7 +938,7 @@ var ResourceItemsList = function ResourceItemsList(_ref) {
|
|
900
938
|
showPagination = _resource$index2$show === void 0 ? true : _resource$index2$show,
|
901
939
|
_resource$index2$filt = _resource$index2.filters,
|
902
940
|
filters = _resource$index2$filt === void 0 ? null : _resource$index2$filt,
|
903
|
-
listProps = _objectWithoutProperties(_resource$index2, _excluded$
|
941
|
+
listProps = _objectWithoutProperties(_resource$index2, _excluded$3);
|
904
942
|
var _usePanneauColorSchem = usePanneauColorScheme(),
|
905
943
|
_usePanneauColorSchem2 = _usePanneauColorSchem.background,
|
906
944
|
theme = _usePanneauColorSchem2 === void 0 ? null : _usePanneauColorSchem2;
|
@@ -909,7 +947,7 @@ var ResourceItemsList = function ResourceItemsList(_ref) {
|
|
909
947
|
var _ref2 = query || {},
|
910
948
|
_ref2$page = _ref2.page,
|
911
949
|
currentPage = _ref2$page === void 0 ? 1 : _ref2$page,
|
912
|
-
rest = _objectWithoutProperties(_ref2, _excluded2);
|
950
|
+
rest = _objectWithoutProperties(_ref2, _excluded2$1);
|
913
951
|
return [currentPage, rest];
|
914
952
|
}, [query]),
|
915
953
|
_useMemo2 = _slicedToArray(_useMemo, 2),
|
@@ -953,7 +991,7 @@ var ResourceItemsList = function ResourceItemsList(_ref) {
|
|
953
991
|
ResourceItemsList.propTypes = propTypes$a;
|
954
992
|
ResourceItemsList.defaultProps = defaultProps$a;
|
955
993
|
|
956
|
-
var _excluded$
|
994
|
+
var _excluded$2 = ["id", "component"];
|
957
995
|
var propTypes$9 = {
|
958
996
|
resource: PropTypes.resource.isRequired,
|
959
997
|
defaultActions: PropTypes$1.arrayOf(PropTypes$1.object) // eslint-disable-line react/forbid-prop-types
|
@@ -1024,8 +1062,10 @@ var ResourceIndexPage = function ResourceIndexPage(_ref) {
|
|
1024
1062
|
navigate("".concat(url, "?").concat(queryString));
|
1025
1063
|
}, [navigate, url, paginated]);
|
1026
1064
|
var onClickCloseAlert = useCallback(function () {
|
1027
|
-
|
1028
|
-
|
1065
|
+
navigate(url, {
|
1066
|
+
replace: true
|
1067
|
+
});
|
1068
|
+
}, [navigate, url]);
|
1029
1069
|
return /*#__PURE__*/React.createElement(ResourceProvider, {
|
1030
1070
|
resource: resource
|
1031
1071
|
}, /*#__PURE__*/React.createElement(MainLayout, null, /*#__PURE__*/React.createElement(PageHeader, {
|
@@ -1036,7 +1076,7 @@ var ResourceIndexPage = function ResourceIndexPage(_ref) {
|
|
1036
1076
|
var id = _ref5.id,
|
1037
1077
|
_ref5$component = _ref5.component,
|
1038
1078
|
component = _ref5$component === void 0 ? Button : _ref5$component,
|
1039
|
-
actionProps = _objectWithoutProperties(_ref5, _excluded$
|
1079
|
+
actionProps = _objectWithoutProperties(_ref5, _excluded$2);
|
1040
1080
|
var ActionComponent = isString(component) ? componentsManager.getComponent(component) : component;
|
1041
1081
|
return ActionComponent !== null ? /*#__PURE__*/React.createElement(ActionComponent, Object.assign({
|
1042
1082
|
key: "action-".concat(id)
|
@@ -1413,7 +1453,7 @@ var ErrorPage = function ErrorPage(_ref) {
|
|
1413
1453
|
ErrorPage.propTypes = propTypes$2;
|
1414
1454
|
ErrorPage.defaultProps = defaultProps$2;
|
1415
1455
|
|
1416
|
-
var _excluded = ["path", "component", "exact"];
|
1456
|
+
var _excluded$1 = ["path", "component", "exact"];
|
1417
1457
|
var createResourceRoutes = function createResourceRoutes(resource, _ref) {
|
1418
1458
|
var route = _ref.route,
|
1419
1459
|
componentsManager = _ref.componentsManager,
|
@@ -1501,7 +1541,7 @@ var createResourceRoutes = function createResourceRoutes(resource, _ref) {
|
|
1501
1541
|
component = _ref4.component,
|
1502
1542
|
_ref4$exact = _ref4.exact,
|
1503
1543
|
exact = _ref4$exact === void 0 ? true : _ref4$exact,
|
1504
|
-
pageProps = _objectWithoutProperties(_ref4, _excluded);
|
1544
|
+
pageProps = _objectWithoutProperties(_ref4, _excluded$1);
|
1505
1545
|
var RouteComponent = componentsManager.getComponent(component);
|
1506
1546
|
return RouteComponent !== null ? /*#__PURE__*/React.createElement(Route, {
|
1507
1547
|
key: "route-".concat(path),
|
@@ -1514,6 +1554,8 @@ var createResourceRoutes = function createResourceRoutes(resource, _ref) {
|
|
1514
1554
|
})));
|
1515
1555
|
};
|
1516
1556
|
|
1557
|
+
var _excluded = ["home", "login", "account", "error", "index", "show", "create", "edit", "delete"],
|
1558
|
+
_excluded2 = ["path", "route", "component", "exact"];
|
1517
1559
|
var propTypes$1 = {
|
1518
1560
|
statusCode: PropTypes.statusCode
|
1519
1561
|
};
|
@@ -1550,7 +1592,8 @@ var PanneauRoutes = function PanneauRoutes(_ref) {
|
|
1550
1592
|
// Custom Pages
|
1551
1593
|
var _usePanneau = usePanneau(),
|
1552
1594
|
_usePanneau$pages = _usePanneau.pages,
|
1553
|
-
pages = _usePanneau$pages === void 0 ? null : _usePanneau$pages
|
1595
|
+
pages = _usePanneau$pages === void 0 ? null : _usePanneau$pages,
|
1596
|
+
routesDefinition = _usePanneau.routes;
|
1554
1597
|
var _ref2 = pages || {},
|
1555
1598
|
_ref2$home = _ref2.home,
|
1556
1599
|
homePage = _ref2$home === void 0 ? null : _ref2$home,
|
@@ -1560,6 +1603,30 @@ var PanneauRoutes = function PanneauRoutes(_ref) {
|
|
1560
1603
|
accountPage = _ref2$account === void 0 ? null : _ref2$account,
|
1561
1604
|
_ref2$error = _ref2.error,
|
1562
1605
|
errorPage = _ref2$error === void 0 ? null : _ref2$error;
|
1606
|
+
_ref2.index;
|
1607
|
+
_ref2.show;
|
1608
|
+
_ref2.create;
|
1609
|
+
_ref2.edit;
|
1610
|
+
_ref2["delete"];
|
1611
|
+
var otherPages = _objectWithoutProperties(_ref2, _excluded);
|
1612
|
+
var customRoutes = useMemo(function () {
|
1613
|
+
return [].concat(_toConsumableArray(Object.keys(routesDefinition).filter(function (key) {
|
1614
|
+
return key.match(/^(resources\.|auth\.)/) === null && key !== 'home' && key !== 'account';
|
1615
|
+
}).filter(function (key) {
|
1616
|
+
var routeDef = routesDefinition[key];
|
1617
|
+
return isObject(routeDef) && typeof routeDef.component !== 'undefined' && typeof routeDef.path !== 'undefined';
|
1618
|
+
}).map(function (key) {
|
1619
|
+
return routesDefinition[key];
|
1620
|
+
})), _toConsumableArray(Object.keys(otherPages).map(function (key) {
|
1621
|
+
return otherPages[key];
|
1622
|
+
}).filter(function (_ref3) {
|
1623
|
+
var _ref3$path = _ref3.path,
|
1624
|
+
path = _ref3$path === void 0 ? null : _ref3$path,
|
1625
|
+
_ref3$route = _ref3.route,
|
1626
|
+
pageRoute = _ref3$route === void 0 ? null : _ref3$route;
|
1627
|
+
return path !== null || pageRoute !== null;
|
1628
|
+
})));
|
1629
|
+
}, [routesDefinition, otherPages]);
|
1563
1630
|
var HomeComponent = componentsManager.getComponent(homePage === null || homePage === void 0 ? void 0 : homePage.component) || HomePage;
|
1564
1631
|
var LoginComponent = componentsManager.getComponent(loginPage === null || loginPage === void 0 ? void 0 : loginPage.component) || LoginPage;
|
1565
1632
|
var AccountComponent = componentsManager.getComponent(accountPage === null || accountPage === void 0 ? void 0 : accountPage.component) || AccountPage;
|
@@ -1593,8 +1660,8 @@ var PanneauRoutes = function PanneauRoutes(_ref) {
|
|
1593
1660
|
exact: true,
|
1594
1661
|
element: /*#__PURE__*/React.createElement(HomeComponent, null)
|
1595
1662
|
}), resources.map(function (resource) {
|
1596
|
-
var
|
1597
|
-
resourceId =
|
1663
|
+
var _ref4 = resource || {},
|
1664
|
+
resourceId = _ref4.id;
|
1598
1665
|
return /*#__PURE__*/React.createElement(Fragment, {
|
1599
1666
|
key: "resource-".concat(resourceId)
|
1600
1667
|
}, createResourceRoutes(resource, {
|
@@ -1606,6 +1673,21 @@ var PanneauRoutes = function PanneauRoutes(_ref) {
|
|
1606
1673
|
path: routes.account,
|
1607
1674
|
exact: true,
|
1608
1675
|
element: /*#__PURE__*/React.createElement(AccountComponent, null)
|
1676
|
+
}), customRoutes.map(function (_ref5) {
|
1677
|
+
var _ref5$path = _ref5.path,
|
1678
|
+
path = _ref5$path === void 0 ? null : _ref5$path,
|
1679
|
+
_ref5$route = _ref5.route,
|
1680
|
+
pageRoute = _ref5$route === void 0 ? null : _ref5$route,
|
1681
|
+
component = _ref5.component,
|
1682
|
+
_ref5$exact = _ref5.exact,
|
1683
|
+
exact = _ref5$exact === void 0 ? true : _ref5$exact,
|
1684
|
+
props = _objectWithoutProperties(_ref5, _excluded2);
|
1685
|
+
var PageComponent = componentsManager.getComponent(component);
|
1686
|
+
return PageComponent !== null ? /*#__PURE__*/React.createElement(Route, {
|
1687
|
+
path: path || routes[pageRoute],
|
1688
|
+
exact: exact,
|
1689
|
+
element: /*#__PURE__*/React.createElement(PageComponent, props)
|
1690
|
+
}) : null;
|
1609
1691
|
}), /*#__PURE__*/React.createElement(Route, {
|
1610
1692
|
path: "*",
|
1611
1693
|
element: /*#__PURE__*/React.createElement(ErrorComponent, null)
|