@popmenu/dashboard 0.44.0 → 0.46.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.
@@ -1,4 +1,14 @@
1
1
  /// <reference types="react" />
2
+ import { MenuProps } from '@material-ui/core';
3
+ export interface LeaderboardFilterOptionProps {
4
+ label: string;
5
+ value: string;
6
+ }
7
+ export interface LeaderboardFilterProps extends MenuProps {
8
+ onChange: (event: any) => void;
9
+ options: LeaderboardFilterOptionProps[];
10
+ text: string;
11
+ }
2
12
  export interface LeaderboardListItemProps {
3
13
  /** The icon to be displayed. Should be an icon component from popmenu/web-icons */
4
14
  Icon?: string | React.FC<React.SVGProps<SVGSVGElement>>;
@@ -23,8 +33,12 @@ export interface LeaderboardProps {
23
33
  data: LeaderboardListItemProps[];
24
34
  /** Component to display when no data is present */
25
35
  EmptyState: React.ReactNode;
36
+ /** Optional props for filter after the title/subtitle */
37
+ filterProps: LeaderboardFilterProps;
26
38
  /** Optional link at bottom to redirect to another page. Intended as a link to more data within the leaderboard. */
27
39
  moreLink?: {
40
+ /** Will display regardless of overflow */
41
+ show?: boolean;
28
42
  /** Path to route to. */
29
43
  to: string;
30
44
  /** Text the link will have. */
@@ -36,6 +50,7 @@ export interface LeaderboardProps {
36
50
  title: string;
37
51
  }
38
52
  export interface MoreLinkProps {
53
+ show?: boolean;
39
54
  text: string;
40
55
  to: string;
41
56
  }
@@ -1,4 +1,5 @@
1
- import { LeaderboardProps, LeaderboardListItemProps, MoreLinkProps } from './LeaderboardProps';
1
+ import { LeaderboardProps, LeaderboardListItemProps, LeaderboardFilterProps, MoreLinkProps } from './LeaderboardProps';
2
2
  export declare const useLeaderboardStyles: (props: LeaderboardProps) => import("@material-ui/styles").ClassNameMap<string>;
3
3
  export declare const useLeaderboardListItemStyles: (props: LeaderboardListItemProps) => import("@material-ui/styles").ClassNameMap<string>;
4
+ export declare const useLeaderboardFilterStyles: (props: LeaderboardFilterProps) => import("@material-ui/styles").ClassNameMap<string>;
4
5
  export declare const useMoreLinkStyles: (props: MoreLinkProps) => import("@material-ui/styles").ClassNameMap<string>;
package/build/index.es.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
- import React__default, { createElement, forwardRef } from 'react';
2
+ import React__default, { createElement, forwardRef, useState } from 'react';
3
+ import { makeStyles, Typography as Typography$1, Link as Link$1, Paper as Paper$1, Box, Menu, MenuItem, Card as Card$1, CardActionArea, CardContent as CardContent$1 } from '@material-ui/core';
3
4
  import '@material-ui/lab/Alert';
4
- import { makeStyles, Typography as Typography$1, Link as Link$1, Paper as Paper$1, Box, Card as Card$1, CardActionArea, CardContent as CardContent$1 } from '@material-ui/core';
5
5
  import '@material-ui/core/AppBar';
6
6
  import MuiAvatar from '@material-ui/core/Avatar';
7
7
  import { makeStyles as makeStyles$1, useTheme } from '@material-ui/core/styles';
@@ -124,19 +124,19 @@ function __rest(s, e) {
124
124
  return t;
125
125
  }
126
126
 
127
- var _path$F;
127
+ var _path$D;
128
128
 
129
- function _extends$1s() { _extends$1s = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1s.apply(this, arguments); }
129
+ function _extends$1u() { _extends$1u = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1u.apply(this, arguments); }
130
130
 
131
131
  function SvgUser(props) {
132
- return /*#__PURE__*/React.createElement("svg", _extends$1s({
132
+ return /*#__PURE__*/React.createElement("svg", _extends$1u({
133
133
  viewBox: "0 0 16 16",
134
134
  fill: "none",
135
135
  strokeLinecap: "round",
136
136
  strokeLinejoin: "round",
137
137
  width: "1em",
138
138
  height: "1em"
139
- }, props), _path$F || (_path$F = /*#__PURE__*/React.createElement("path", {
139
+ }, props), _path$D || (_path$D = /*#__PURE__*/React.createElement("path", {
140
140
  d: "M13.333 14v-1.333A2.667 2.667 0 0010.667 10H5.333a2.667 2.667 0 00-2.666 2.667V14M8 7.333A2.667 2.667 0 108 2a2.667 2.667 0 000 5.333z",
141
141
  stroke: "currentColor"
142
142
  })));
@@ -779,6 +779,66 @@ makeStyles(function (theme) { return ({
779
779
  },
780
780
  }); });
781
781
 
782
+ var _path$15;
783
+
784
+ function _extends$2s() { _extends$2s = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2s.apply(this, arguments); }
785
+
786
+ function SvgChevronDown(props) {
787
+ return /*#__PURE__*/React.createElement("svg", _extends$2s({
788
+ viewBox: "0 0 16 16",
789
+ fill: "none",
790
+ strokeLinecap: "round",
791
+ strokeLinejoin: "round",
792
+ width: "1em",
793
+ height: "1em"
794
+ }, props), _path$15 || (_path$15 = /*#__PURE__*/React.createElement("path", {
795
+ d: "M4 6l4 4 4-4",
796
+ stroke: "currentColor"
797
+ })));
798
+ }
799
+
800
+ var _g$T;
801
+
802
+ function _extends$1w() { _extends$1w = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1w.apply(this, arguments); }
803
+
804
+ function SvgTrend(props) {
805
+ return /*#__PURE__*/React.createElement("svg", _extends$1w({
806
+ viewBox: "0 0 16 16",
807
+ fill: "none",
808
+ strokeLinecap: "round",
809
+ strokeLinejoin: "round",
810
+ width: "1em",
811
+ height: "1em"
812
+ }, props), _g$T || (_g$T = /*#__PURE__*/React.createElement("g", {
813
+ stroke: "currentColor"
814
+ }, /*#__PURE__*/React.createElement("path", {
815
+ d: "M15.333 4L9 10.333 5.667 7l-5 5"
816
+ }), /*#__PURE__*/React.createElement("path", {
817
+ d: "M11.333 4h4v4"
818
+ }))));
819
+ }
820
+
821
+ var _g$S;
822
+
823
+ function _extends$1v() { _extends$1v = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1v.apply(this, arguments); }
824
+
825
+ function SvgTrendDown(props) {
826
+ return /*#__PURE__*/React.createElement("svg", _extends$1v({
827
+ viewBox: "0 0 16 16",
828
+ fill: "none",
829
+ strokeLinecap: "round",
830
+ strokeLinejoin: "round",
831
+ width: "1em",
832
+ height: "1em"
833
+ }, props), _g$S || (_g$S = /*#__PURE__*/React.createElement("g", {
834
+ stroke: "currentColor"
835
+ }, /*#__PURE__*/React.createElement("path", {
836
+ d: "M15.333 12L9 5.667 5.667 9l-5-5"
837
+ }), /*#__PURE__*/React.createElement("path", {
838
+ d: "M11.333 12h4V8"
839
+ }))));
840
+ }
841
+
782
842
  var useLeaderboardStyles = makeStyles(function (theme) { return ({
783
843
  root: {
784
844
  '& >:nth-child(even) > li': {
@@ -792,6 +852,17 @@ var useLeaderboardListItemStyles = makeStyles(function (theme) { return ({
792
852
  textDecoration: 'none',
793
853
  },
794
854
  }); });
855
+ var useLeaderboardFilterStyles = makeStyles(function (theme) { return ({
856
+ filterWrapper: {
857
+ alignItems: 'center',
858
+ cursor: 'pointer',
859
+ display: 'flex',
860
+ },
861
+ text: {
862
+ fontSize: '12px',
863
+ paddingRight: theme.spacing(1),
864
+ },
865
+ }); });
795
866
  var useMoreLinkStyles = makeStyles(function (theme) { return ({
796
867
  link: {
797
868
  color: theme.palette.info.main,
@@ -800,16 +871,17 @@ var useMoreLinkStyles = makeStyles(function (theme) { return ({
800
871
  }); });
801
872
 
802
873
  var Leaderboard = function (props) {
803
- var data = props.data, EmptyState = props.EmptyState, title = props.title, moreLink = props.moreLink, subtitle = props.subtitle;
874
+ var data = props.data, EmptyState = props.EmptyState, filterProps = props.filterProps, title = props.title, moreLink = props.moreLink, subtitle = props.subtitle;
804
875
  var classes = useLeaderboardStyles(props);
805
876
  var isEmpty = data.length === 0;
806
877
  var slicedData = data.slice(0, 5);
807
878
  var isOverflow = data.length > 5;
808
- var showMoreButton = !isEmpty && isOverflow;
879
+ var showMoreButton = !isEmpty && ((moreLink === null || moreLink === void 0 ? void 0 : moreLink.show) || isOverflow);
809
880
  return (React__default.createElement(Box, { display: "flex", flexDirection: "column" },
810
881
  React__default.createElement(Box, { alignItems: "left" },
811
- React__default.createElement(Typography, { variant: "h4" }, title),
812
- React__default.createElement(Typography, { variant: "body2" }, subtitle)),
882
+ React__default.createElement(Typography, { variant: "h5" }, title),
883
+ React__default.createElement(Typography, { className: classes.text }, subtitle),
884
+ filterProps && React__default.createElement(LeaderboardFilter, __assign$1({}, filterProps))),
813
885
  !isEmpty ? (React__default.createElement(List, { classes: classes }, slicedData.map(function (itemProps, index) { return (React__default.createElement(LeaderboardListItem, __assign$1({ key: "tile-list-item-" + index }, itemProps))); }))) : (EmptyState),
814
886
  moreLink && showMoreButton && React__default.createElement(MoreLink, { text: moreLink.text, to: moreLink.to })));
815
887
  };
@@ -824,6 +896,38 @@ var LeaderboardListItem = function (props) {
824
896
  React__default.createElement(Avatar, __assign$1({}, image), ItemIcon && React__default.createElement(Icon, { icon: ItemIcon })))),
825
897
  React__default.createElement(ListItemText, { primary: title, secondary: subtitle }))));
826
898
  };
899
+ var LeaderboardFilter = function (props) {
900
+ var onChange = props.onChange, options = props.options, text = props.text;
901
+ var classes = useLeaderboardFilterStyles(props);
902
+ var _a = useState(false), open = _a[0], setOpen = _a[1];
903
+ var _b = useState(null), menuAnchor = _b[0], setMenuAnchor = _b[1];
904
+ var _c = useState(null), selection = _c[0], setSelection = _c[1];
905
+ var handleOpen = function (event) {
906
+ setMenuAnchor(event.currentTarget);
907
+ setOpen(true);
908
+ };
909
+ var handleClose = function () {
910
+ setMenuAnchor(null);
911
+ setOpen(false);
912
+ };
913
+ var handleSelection = function (label, value) {
914
+ if (typeof onChange === 'function') {
915
+ onChange(value);
916
+ }
917
+ setSelection(label);
918
+ handleClose();
919
+ };
920
+ if (options.length < 1)
921
+ return null;
922
+ return (React__default.createElement(React__default.Fragment, null,
923
+ React__default.createElement(Box, { className: classes.filterWrapper, pt: 1, onClick: handleOpen },
924
+ React__default.createElement(Typography, { className: classes.text }, selection || text),
925
+ React__default.createElement(Icon, { icon: SvgChevronDown })),
926
+ React__default.createElement(Menu, { anchorEl: menuAnchor, onClose: handleClose, open: open }, options.map(function (_a) {
927
+ var label = _a.label, value = _a.value;
928
+ return (React__default.createElement(MenuItem, { key: value, onClick: function () { return handleSelection(label, value); } }, label));
929
+ }))));
930
+ };
827
931
  var MoreLink = function (props) {
828
932
  var text = props.text, to = props.to;
829
933
  var classes = useMoreLinkStyles(props);
@@ -856,48 +960,6 @@ var LeaderboardTile = function (props) {
856
960
  React__default.createElement(Leaderboard, __assign$1({}, restProps))));
857
961
  };
858
962
 
859
- var _g$P;
860
-
861
- function _extends$1v() { _extends$1v = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1v.apply(this, arguments); }
862
-
863
- function SvgTrend(props) {
864
- return /*#__PURE__*/React.createElement("svg", _extends$1v({
865
- viewBox: "0 0 16 16",
866
- fill: "none",
867
- strokeLinecap: "round",
868
- strokeLinejoin: "round",
869
- width: "1em",
870
- height: "1em"
871
- }, props), _g$P || (_g$P = /*#__PURE__*/React.createElement("g", {
872
- stroke: "currentColor"
873
- }, /*#__PURE__*/React.createElement("path", {
874
- d: "M15.333 4L9 10.333 5.667 7l-5 5"
875
- }), /*#__PURE__*/React.createElement("path", {
876
- d: "M11.333 4h4v4"
877
- }))));
878
- }
879
-
880
- var _g$O;
881
-
882
- function _extends$1u() { _extends$1u = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1u.apply(this, arguments); }
883
-
884
- function SvgTrendDown(props) {
885
- return /*#__PURE__*/React.createElement("svg", _extends$1u({
886
- viewBox: "0 0 16 16",
887
- fill: "none",
888
- strokeLinecap: "round",
889
- strokeLinejoin: "round",
890
- width: "1em",
891
- height: "1em"
892
- }, props), _g$O || (_g$O = /*#__PURE__*/React.createElement("g", {
893
- stroke: "currentColor"
894
- }, /*#__PURE__*/React.createElement("path", {
895
- d: "M15.333 12L9 5.667 5.667 9l-5-5"
896
- }), /*#__PURE__*/React.createElement("path", {
897
- d: "M11.333 12h4V8"
898
- }))));
899
- }
900
-
901
963
  var useKpiMetricStyles = makeStyles(function (theme) { return ({
902
964
  iconContainer: {
903
965
  fontSize: theme.spacing(3),