@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/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 Navbar from '@panneau/element-navbar';
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$5 = ["resource", "action", "previous", "status", "value", "onSubmit", "errors", "generalError", "className"];
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$5);
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$4 = ["component", "resource", "onSuccess", "item", "type", "isDelete"];
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$4);
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, user !== null ? /*#__PURE__*/React.createElement(ResourcesMenu, {
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
- setDropdownOpened(function (opened) {
712
- return !opened;
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
- setDropdownOpened(false);
725
- }, [setDropdownOpened]);
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$3 = ["component", "name", "groupLabel"];
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$3);
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$2 = ["component", "showPagination", "filters"],
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$2);
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$1 = ["id", "component"];
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
- history.replace(url);
1028
- }, [history, url]);
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$1);
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 _ref3 = resource || {},
1597
- resourceId = _ref3.id;
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)