bananas-commerce-admin 0.17.13 → 0.17.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/App.js +0 -1
- package/dist/esm/App.js.map +1 -1
- package/dist/esm/components/ActionMenu/ActionMenuItem.js +15 -0
- package/dist/esm/components/ActionMenu/ActionMenuItem.js.map +1 -0
- package/dist/esm/components/ActionMenu/index.js +66 -0
- package/dist/esm/components/ActionMenu/index.js.map +1 -0
- package/dist/esm/components/LabeledValue.js +1 -1
- package/dist/esm/components/LabeledValue.js.map +1 -1
- package/dist/esm/components/TitleBar/index.js +7 -1
- package/dist/esm/components/TitleBar/index.js.map +1 -1
- package/dist/esm/containers/ComponentLoader.js +1 -1
- package/dist/esm/containers/ComponentLoader.js.map +1 -1
- package/dist/esm/contexts/ApiContext.js +1 -1
- package/dist/esm/contexts/ApiContext.js.map +1 -1
- package/dist/esm/extensions/fulfillment/index.js +8 -0
- package/dist/esm/extensions/fulfillment/index.js.map +1 -1
- package/dist/types/components/ActionMenu/ActionMenuItem.d.ts +9 -0
- package/dist/types/components/ActionMenu/index.d.ts +3 -0
- package/dist/types/types/index.d.ts +4 -4
- package/package.json +1 -1
- package/src/App.tsx +0 -1
- package/src/components/ActionMenu/ActionMenuItem.tsx +31 -0
- package/src/components/ActionMenu/index.tsx +103 -0
- package/src/components/LabeledValue.tsx +1 -1
- package/src/components/TitleBar/index.tsx +9 -0
- package/src/containers/ComponentLoader.tsx +1 -1
- package/src/contexts/ApiContext.tsx +1 -1
- package/src/extensions/fulfillment/index.tsx +9 -1
- package/src/types/index.ts +4 -4
package/dist/esm/App.js
CHANGED
|
@@ -27,7 +27,6 @@ const StyledSnackbarContent = styled(MaterialDesignContent)(({ theme }) => theme
|
|
|
27
27
|
},
|
|
28
28
|
}));
|
|
29
29
|
export const App = ({ theme: userTheme, api, contrib, ...rest }) => {
|
|
30
|
-
console.log("App:contrib", contrib);
|
|
31
30
|
const potentialSchema = typeof api === "object" && "schema" in api ? api.schema : api;
|
|
32
31
|
let schemaPath;
|
|
33
32
|
if (typeof potentialSchema === "string" || potentialSchema instanceof URL) {
|
package/dist/esm/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAExD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAqB,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAc,MAAM,UAAU,CAAC;AAgBvD,MAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACxE,KAAK,CAAC,WAAW,CAAC;IAChB,gCAAgC,EAAE;QAChC,OAAO,EAAE,cAAc;KACxB;IACD,8BAA8B,EAAE;QAC9B,OAAO,EAAE,YAAY;KACtB;IACD,gCAAgC,EAAE;QAChC,OAAO,EAAE,cAAc;KACxB;IACD,6BAA6B,EAAE;QAC7B,OAAO,EAAE,WAAW;KACrB;IACD,gCAAgC,EAAE;QAChC,OAAO,EAAE,cAAc;KACxB;CACF,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAuB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IACrF,
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { memo, useCallback } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { ListItemIcon, ListItemText, MenuItem } from "@mui/material";
|
|
4
|
+
import Logo from "../Logo";
|
|
5
|
+
export const ActionMenuItem = ({ operation, onAction }) => {
|
|
6
|
+
const handleClick = useCallback(() => {
|
|
7
|
+
onAction(operation.id);
|
|
8
|
+
}, [operation.id, onAction]);
|
|
9
|
+
return (React.createElement(MenuItem, { onClick: handleClick },
|
|
10
|
+
operation.component?.icon && (React.createElement(ListItemIcon, { sx: { width: 20 } },
|
|
11
|
+
React.createElement(Logo, { src: operation.component.icon }))),
|
|
12
|
+
React.createElement(ListItemText, null, operation.component?.title ?? operation.summary ?? operation.id)));
|
|
13
|
+
};
|
|
14
|
+
export default memo(ActionMenuItem);
|
|
15
|
+
//# sourceMappingURL=ActionMenuItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionMenuItem.js","sourceRoot":"","sources":["../../../../src/components/ActionMenu/ActionMenuItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGrE,OAAO,IAAI,MAAM,SAAS,CAAC;AAO3B,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IACvF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7B,OAAO,CACL,oBAAC,QAAQ,IAAC,OAAO,EAAE,WAAW;QAC3B,SAAS,CAAC,SAAS,EAAE,IAAI,IAAI,CAC5B,oBAAC,YAAY,IAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC7B,oBAAC,IAAI,IAAC,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,GAAI,CAC1B,CAChB;QACD,oBAAC,YAAY,QAAE,SAAS,CAAC,SAAS,EAAE,KAAK,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,EAAE,CAAgB,CACrF,CACZ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { useParams } from "react-router-dom";
|
|
4
|
+
import { KeyboardArrowDown as KeyboardArrowDownIcon } from "@mui/icons-material";
|
|
5
|
+
import { Button } from "@mui/material";
|
|
6
|
+
import Menu from "@mui/material/Menu";
|
|
7
|
+
import { enqueueSnackbar } from "notistack";
|
|
8
|
+
import { useApi } from "../../contexts/ApiContext";
|
|
9
|
+
import { useI18n } from "../../contexts/I18nContext";
|
|
10
|
+
import { usePage } from "../Page";
|
|
11
|
+
import ActionMenuItem from "./ActionMenuItem";
|
|
12
|
+
export const ActionMenu = () => {
|
|
13
|
+
const [anchorEl, setAnchorEl] = useState(null);
|
|
14
|
+
const params = useParams();
|
|
15
|
+
const page = usePage();
|
|
16
|
+
const api = useApi();
|
|
17
|
+
const { t } = useI18n();
|
|
18
|
+
const title = useCallback((operation) => t(operation.component?.title ?? operation.summary ?? operation.id), [t]);
|
|
19
|
+
const open = Boolean(anchorEl);
|
|
20
|
+
const handleClick = (event) => {
|
|
21
|
+
setAnchorEl(event.currentTarget);
|
|
22
|
+
};
|
|
23
|
+
const handleClose = () => {
|
|
24
|
+
setAnchorEl(null);
|
|
25
|
+
};
|
|
26
|
+
const handleAction = async (operation) => {
|
|
27
|
+
try {
|
|
28
|
+
const action = api.operations[operation];
|
|
29
|
+
const response = await action.call({ params });
|
|
30
|
+
if (response.ok) {
|
|
31
|
+
enqueueSnackbar(t(`Completed successfully: ${title(action)}`), {
|
|
32
|
+
variant: "success",
|
|
33
|
+
});
|
|
34
|
+
handleClose();
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
enqueueSnackbar(t(`Action failed: ${title(action)}`), {
|
|
38
|
+
variant: "error",
|
|
39
|
+
});
|
|
40
|
+
throw response;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
enqueueSnackbar(t("Action failed"), {
|
|
45
|
+
variant: "error",
|
|
46
|
+
});
|
|
47
|
+
console.error(error);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return (React.createElement(React.Fragment, null,
|
|
51
|
+
React.createElement(Menu, { anchorEl: anchorEl, open: open, slotProps: {
|
|
52
|
+
paper: {
|
|
53
|
+
style: {
|
|
54
|
+
width: "fit-content",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
}, onClose: handleClose }, page?.contrib
|
|
58
|
+
.filter((operation) => operation.component?.variant === "action")
|
|
59
|
+
.map((operation) => (React.createElement(ActionMenuItem, { key: operation.id, operation: operation, onAction: handleAction })))),
|
|
60
|
+
React.createElement(Button, { "aria-haspopup": true, disableElevation: true, "aria-expanded": open ? "true" : "false", endIcon: React.createElement(KeyboardArrowDownIcon, null), sx: {
|
|
61
|
+
borderRadius: 6,
|
|
62
|
+
height: 46,
|
|
63
|
+
}, variant: "outlined", onClick: handleClick }, "Actions")));
|
|
64
|
+
};
|
|
65
|
+
export default ActionMenu;
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ActionMenu/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ export const LabeledValue = ({ label, value, compact, multiline }) => {
|
|
|
4
4
|
// Use thinner font if compact and value is > 20 chars.
|
|
5
5
|
const xsFont = useMemo(() => value != null && typeof value === "string" && value.length > 20 ? '"wdth" 75' : '"wdth" 100', [value]);
|
|
6
6
|
return (React.createElement(Stack, { direction: compact ? "row" : "column", justifyContent: compact ? "space-between" : "flex-start" },
|
|
7
|
-
React.createElement(Typography, { color: "
|
|
7
|
+
React.createElement(Typography, { color: "text.secondary", fontWeight: 500, sx: { whiteSpace: "nowrap", fontVariationSettings: { sm: '"wdth" 100', xs: '"wdth" 75' } }, variant: "subtitle2" }, label),
|
|
8
8
|
typeof value === "string" ? (React.createElement(Typography, { sx: {
|
|
9
9
|
whiteSpace: multiline ? "break-spaces" : "pre-wrap",
|
|
10
10
|
wordBreak: "break-all",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LabeledValue.js","sourceRoot":"","sources":["../../../src/components/LabeledValue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AASvD,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IAChG,uDAAuD;IACvD,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CACH,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAC9F,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,CACL,oBAAC,KAAK,IACJ,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EACrC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;QAExD,oBAAC,UAAU,IACT,KAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"LabeledValue.js","sourceRoot":"","sources":["../../../src/components/LabeledValue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AASvD,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IAChG,uDAAuD;IACvD,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CACH,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAC9F,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,CACL,oBAAC,KAAK,IACJ,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EACrC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;QAExD,oBAAC,UAAU,IACT,KAAK,EAAC,gBAAgB,EACtB,UAAU,EAAE,GAAG,EACf,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAC1F,OAAO,EAAC,WAAW,IAElB,KAAK,CACK;QAEZ,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC3B,oBAAC,UAAU,IACT,EAAE,EAAE;gBACF,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU;gBACnD,SAAS,EAAE,WAAW;gBACtB,qBAAqB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE;aACvD,EACD,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAEnC,KAAK,CACK,CACd,CAAC,CAAC,CAAC,CACF,oBAAC,GAAG,QAAE,KAAK,CAAO,CACnB,CACK,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -5,10 +5,13 @@ import NavigateNextIcon from "@mui/icons-material/NavigateNext";
|
|
|
5
5
|
import { AppBar, Breadcrumbs, IconButton, Link, Stack, Toolbar, Typography, } from "@mui/material";
|
|
6
6
|
import { useI18n } from "../../contexts/I18nContext";
|
|
7
7
|
import { useRouter } from "../../contexts/RouterContext";
|
|
8
|
+
import ActionMenu from "../ActionMenu";
|
|
9
|
+
import { usePage } from "../Page";
|
|
8
10
|
export const TitleBar = ({ back = false, title, children, ...props }) => {
|
|
9
11
|
const { t } = useI18n();
|
|
10
12
|
const { navigate, getCurrent, routes } = useRouter();
|
|
11
13
|
const routerNavigate = useNavigate();
|
|
14
|
+
const page = usePage();
|
|
12
15
|
if (typeof back === "boolean" && back)
|
|
13
16
|
back = -1;
|
|
14
17
|
const { route: currentRoute } = getCurrent();
|
|
@@ -35,6 +38,9 @@ export const TitleBar = ({ back = false, title, children, ...props }) => {
|
|
|
35
38
|
} },
|
|
36
39
|
React.createElement(Link, { key: "home", color: "inherit", underline: "hover", onClick: () => routerNavigate("/", { replace: true }) }, t("Home")),
|
|
37
40
|
breadcrumbRoutes.map((route) => (React.createElement(Link, { key: route.id, color: "inherit", underline: "hover", onClick: () => navigate(route) }, route.title)))))),
|
|
38
|
-
children
|
|
41
|
+
children,
|
|
42
|
+
page?.contrib.filter((operation) => operation.component?.variant === "action").length >
|
|
43
|
+
0 && (React.createElement(Stack, { width: "fit-content" },
|
|
44
|
+
React.createElement(ActionMenu, null))))));
|
|
39
45
|
};
|
|
40
46
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/TitleBar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,aAAa,MAAM,+BAA+B,CAAC;AAC1D,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,EACL,MAAM,EAEN,WAAW,EACX,UAAU,EACV,IAAI,EACJ,KAAK,EACL,OAAO,EACP,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAa,SAAS,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/TitleBar/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ const ComponentLoaderInner = ({ operation, ...rest }) => {
|
|
|
42
42
|
// TODO: Find a suitable type
|
|
43
43
|
const [data, setData] = useState();
|
|
44
44
|
const initialLoad = useRef(true);
|
|
45
|
-
const component = operation.component.component;
|
|
45
|
+
const component = operation.component.component ?? (() => null);
|
|
46
46
|
const Component = useMemo(() => lazy(async () => ({ default: await Promise.resolve(component) })), [component]);
|
|
47
47
|
const refresh = useCallback(async () => {
|
|
48
48
|
const response = await operation.call(rest);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentLoader.js","sourceRoot":"","sources":["../../../src/containers/ComponentLoader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAOjC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,aAAa,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,QAAQ,CAAW;IAE5B,YAAY,QAAkB,EAAE,OAAgB;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAYD,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IACxF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAE3B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,+CAA+C,SAAS,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,6DAA6D,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;IACvC,6DAA6D;IAC7D,0DAA0D;IAC1D,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;IAC3C,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;IACzC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;IAE7C,OAAO,CACL,oBAAC,oBAAoB,IACnB,SAAS,EAAE,SAAqE,KAC5E,IAAI,GACR,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAwC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IAC3F,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,6BAA6B;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAW,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ComponentLoader.js","sourceRoot":"","sources":["../../../src/containers/ComponentLoader.tsx"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ export const ApiContextProvider = ({ children, api: init, contrib, }) => {
|
|
|
25
25
|
for (const operation of Object.values(operations)) {
|
|
26
26
|
operation.component = {
|
|
27
27
|
...hit,
|
|
28
|
-
component: hit.component(),
|
|
28
|
+
component: hit.component?.() ?? (() => null),
|
|
29
29
|
};
|
|
30
30
|
operation.order = i;
|
|
31
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiContext.js","sourceRoot":"","sources":["../../../src/contexts/ApiContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAsB,MAAM,QAAQ,CAAC;AACvD,OAAO,WAAW,MAAM,2BAA2B,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAe/C,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAY,SAAiC,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAA+D,CAAC,EAC7F,QAAQ,EACR,GAAG,EAAE,IAAI,EACT,OAAO,GACR,EAAE,EAAE;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAa,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA4B,IAAI,CAAC,CAAC;IAEpE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,CAAC,IAAI,YAAY,SAAS;gBACxB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;gBACvB,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,YAAY,GAAG;oBAC/C,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;oBACtB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAC7C;iBACE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAClB,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;wBACzC,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;oBAExE,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;wBAChE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACpC,IAAI,UAAU,EAAE,CAAC;4BACf,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gCAClD,SAAS,CAAC,SAAS,GAAG;oCACpB,GAAG,GAAG;oCACN,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"ApiContext.js","sourceRoot":"","sources":["../../../src/contexts/ApiContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import MailOutlineIcon from "@mui/icons-material/MailOutline";
|
|
1
2
|
import RotateLeftIcon from "../../assets/symbols/RotateLeft";
|
|
2
3
|
import ShoppingBagIcon from "../../assets/symbols/ShoppingBag";
|
|
3
4
|
import StorefrontIcon from "../../assets/symbols/Storefront";
|
|
@@ -62,5 +63,12 @@ export const contrib = {
|
|
|
62
63
|
permission: "fulfillment.view_order",
|
|
63
64
|
},
|
|
64
65
|
},
|
|
66
|
+
actions: {
|
|
67
|
+
"pos:purchase:detail:send-confirmation-email": {
|
|
68
|
+
title: "Send Purchase Receipt",
|
|
69
|
+
variant: "action",
|
|
70
|
+
icon: MailOutlineIcon,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
65
73
|
};
|
|
66
74
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extensions/fulfillment/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extensions/fulfillment/index.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAI9D,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAC7D,OAAO,eAAe,MAAM,kCAAkC,CAAC;AAC/D,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAG7D,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAEjC,MAAM,MAAM,GAWR;IACF,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO;YAC9D,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL,YAAY,EAAE,OAAO;oBACrB,gBAAgB,EAAE,OAAO;iBAC1B;aACF;YACD,cAAc,EAAE;gBACd,KAAK,EAAE;oBACL,KAAK,EAAE,SAAS;iBACjB;aACF;SACF;KACF;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC,GAAG,EAAE,aAAa;IAClB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE/C,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,cAAc,EAAE,GAAG,CAAC,cAAc;aACnC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAwB;IAC7C,wBAAwB,EAAE;QACxB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,wBAAwB;KACrC;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,OAAO,GAAwC;IAC1D,MAAM,EAAE;QACN,4BAA4B,EAAE;YAC5B,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC,OAAO;YACvF,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,wBAAwB;SACrC;KACF;IACD,OAAO,EAAE;QACP,6BAA6B,EAAE;YAC7B,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC,OAAO;YACxF,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,wBAAwB;SACrC;KACF;IACD,OAAO,EAAE;QACP,6CAA6C,EAAE;YAC7C,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,eAAe;SACtB;KACF;CACO,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ApiOperation } from "../../api";
|
|
3
|
+
export interface ActionMenuItemProps {
|
|
4
|
+
operation: ApiOperation;
|
|
5
|
+
onAction: (operationId: string) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare const ActionMenuItem: React.FC<ActionMenuItemProps>;
|
|
8
|
+
declare const _default: React.NamedExoticComponent<ActionMenuItemProps>;
|
|
9
|
+
export default _default;
|
|
@@ -53,10 +53,10 @@ export type ContribComponent<T = any> = React.ComponentType<PageProps<T> & OpenA
|
|
|
53
53
|
sx?: SxProps;
|
|
54
54
|
}>;
|
|
55
55
|
/**
|
|
56
|
-
* The variant of the component, either a tab or
|
|
56
|
+
* The variant of the component, either a tab, inline or action menu item.
|
|
57
57
|
* Still requires a `Page` that loads the contrib.
|
|
58
58
|
*/
|
|
59
|
-
export type ContribVariant = "tab" | "inline";
|
|
59
|
+
export type ContribVariant = "tab" | "inline" | "action";
|
|
60
60
|
export interface PageContribComponent<T = any> extends OpenAPI.Request {
|
|
61
61
|
/**
|
|
62
62
|
* The title shown in the NavRail.
|
|
@@ -69,7 +69,7 @@ export interface PageContribComponent<T = any> extends OpenAPI.Request {
|
|
|
69
69
|
/**
|
|
70
70
|
* The component to render, expected to be a Page, not a single `Card` or `Table`.
|
|
71
71
|
*/
|
|
72
|
-
component
|
|
72
|
+
component?: ContribComponent<T> | Promise<ContribComponent<T>>;
|
|
73
73
|
/**
|
|
74
74
|
* The variant of the component, either a tab or inline.
|
|
75
75
|
*/
|
|
@@ -91,7 +91,7 @@ export interface PageContribComponent<T = any> extends OpenAPI.Request {
|
|
|
91
91
|
group?: string;
|
|
92
92
|
}
|
|
93
93
|
export type ContribComponentMap = Record<string, Omit<PageContribComponent, "component"> & {
|
|
94
|
-
component
|
|
94
|
+
component?: () => PageContribComponent["component"];
|
|
95
95
|
}>;
|
|
96
96
|
export type ContribComponentListItem = {
|
|
97
97
|
tag: string;
|
package/package.json
CHANGED
package/src/App.tsx
CHANGED
|
@@ -49,7 +49,6 @@ const StyledSnackbarContent = styled(MaterialDesignContent)(({ theme }) =>
|
|
|
49
49
|
);
|
|
50
50
|
|
|
51
51
|
export const App: React.FC<AppProps> = ({ theme: userTheme, api, contrib, ...rest }) => {
|
|
52
|
-
console.log("App:contrib", contrib);
|
|
53
52
|
const potentialSchema = typeof api === "object" && "schema" in api ? api.schema : api;
|
|
54
53
|
let schemaPath: string | undefined;
|
|
55
54
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { memo, useCallback } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
import { ListItemIcon, ListItemText, MenuItem } from "@mui/material";
|
|
5
|
+
|
|
6
|
+
import { ApiOperation } from "../../api";
|
|
7
|
+
import Logo from "../Logo";
|
|
8
|
+
|
|
9
|
+
export interface ActionMenuItemProps {
|
|
10
|
+
operation: ApiOperation;
|
|
11
|
+
onAction: (operationId: string) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const ActionMenuItem: React.FC<ActionMenuItemProps> = ({ operation, onAction }) => {
|
|
15
|
+
const handleClick = useCallback(() => {
|
|
16
|
+
onAction(operation.id);
|
|
17
|
+
}, [operation.id, onAction]);
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<MenuItem onClick={handleClick}>
|
|
21
|
+
{operation.component?.icon && (
|
|
22
|
+
<ListItemIcon sx={{ width: 20 }}>
|
|
23
|
+
<Logo src={operation.component.icon} />
|
|
24
|
+
</ListItemIcon>
|
|
25
|
+
)}
|
|
26
|
+
<ListItemText>{operation.component?.title ?? operation.summary ?? operation.id}</ListItemText>
|
|
27
|
+
</MenuItem>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default memo(ActionMenuItem);
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { useParams } from "react-router-dom";
|
|
4
|
+
|
|
5
|
+
import { KeyboardArrowDown as KeyboardArrowDownIcon } from "@mui/icons-material";
|
|
6
|
+
import { Button } from "@mui/material";
|
|
7
|
+
import Menu from "@mui/material/Menu";
|
|
8
|
+
|
|
9
|
+
import { enqueueSnackbar } from "notistack";
|
|
10
|
+
|
|
11
|
+
import { ApiOperation } from "../../api";
|
|
12
|
+
import { useApi } from "../../contexts/ApiContext";
|
|
13
|
+
import { useI18n } from "../../contexts/I18nContext";
|
|
14
|
+
import { usePage } from "../Page";
|
|
15
|
+
|
|
16
|
+
import ActionMenuItem from "./ActionMenuItem";
|
|
17
|
+
|
|
18
|
+
export const ActionMenu: React.FC = () => {
|
|
19
|
+
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
|
|
20
|
+
const params = useParams();
|
|
21
|
+
const page = usePage();
|
|
22
|
+
const api = useApi();
|
|
23
|
+
const { t } = useI18n();
|
|
24
|
+
const title = useCallback(
|
|
25
|
+
(operation: ApiOperation) => t(operation.component?.title ?? operation.summary ?? operation.id),
|
|
26
|
+
[t],
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const open = Boolean(anchorEl);
|
|
30
|
+
|
|
31
|
+
const handleClick = (event: React.MouseEvent<HTMLElement>) => {
|
|
32
|
+
setAnchorEl(event.currentTarget);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const handleClose = () => {
|
|
36
|
+
setAnchorEl(null);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const handleAction = async (operation: string) => {
|
|
40
|
+
try {
|
|
41
|
+
const action = api.operations[operation];
|
|
42
|
+
|
|
43
|
+
const response = await action.call({ params });
|
|
44
|
+
|
|
45
|
+
if (response.ok) {
|
|
46
|
+
enqueueSnackbar(t(`Completed successfully: ${title(action)}`), {
|
|
47
|
+
variant: "success",
|
|
48
|
+
});
|
|
49
|
+
handleClose();
|
|
50
|
+
} else {
|
|
51
|
+
enqueueSnackbar(t(`Action failed: ${title(action)}`), {
|
|
52
|
+
variant: "error",
|
|
53
|
+
});
|
|
54
|
+
throw response;
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
enqueueSnackbar(t("Action failed"), {
|
|
58
|
+
variant: "error",
|
|
59
|
+
});
|
|
60
|
+
console.error(error);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<>
|
|
66
|
+
<Menu
|
|
67
|
+
anchorEl={anchorEl}
|
|
68
|
+
open={open}
|
|
69
|
+
slotProps={{
|
|
70
|
+
paper: {
|
|
71
|
+
style: {
|
|
72
|
+
width: "fit-content",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
}}
|
|
76
|
+
onClose={handleClose}
|
|
77
|
+
>
|
|
78
|
+
{page?.contrib
|
|
79
|
+
.filter((operation) => operation.component?.variant === "action")
|
|
80
|
+
.map((operation) => (
|
|
81
|
+
<ActionMenuItem key={operation.id} operation={operation} onAction={handleAction} />
|
|
82
|
+
))}
|
|
83
|
+
</Menu>
|
|
84
|
+
|
|
85
|
+
<Button
|
|
86
|
+
aria-haspopup
|
|
87
|
+
disableElevation
|
|
88
|
+
aria-expanded={open ? "true" : "false"}
|
|
89
|
+
endIcon={<KeyboardArrowDownIcon />}
|
|
90
|
+
sx={{
|
|
91
|
+
borderRadius: 6,
|
|
92
|
+
height: 46,
|
|
93
|
+
}}
|
|
94
|
+
variant="outlined"
|
|
95
|
+
onClick={handleClick}
|
|
96
|
+
>
|
|
97
|
+
Actions
|
|
98
|
+
</Button>
|
|
99
|
+
</>
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export default ActionMenu;
|
|
@@ -23,7 +23,7 @@ export const LabeledValue: React.FC<LabeledValueProps> = ({ label, value, compac
|
|
|
23
23
|
justifyContent={compact ? "space-between" : "flex-start"}
|
|
24
24
|
>
|
|
25
25
|
<Typography
|
|
26
|
-
color="
|
|
26
|
+
color="text.secondary"
|
|
27
27
|
fontWeight={500}
|
|
28
28
|
sx={{ whiteSpace: "nowrap", fontVariationSettings: { sm: '"wdth" 100', xs: '"wdth" 75' } }}
|
|
29
29
|
variant="subtitle2"
|
|
@@ -16,6 +16,8 @@ import {
|
|
|
16
16
|
|
|
17
17
|
import { useI18n } from "../../contexts/I18nContext";
|
|
18
18
|
import { RouteInfo, useRouter } from "../../contexts/RouterContext";
|
|
19
|
+
import ActionMenu from "../ActionMenu";
|
|
20
|
+
import { usePage } from "../Page";
|
|
19
21
|
|
|
20
22
|
export interface TitleBarProps extends React.PropsWithChildren<Omit<AppBarProps, "title">> {
|
|
21
23
|
back?: boolean | number | string | RouteInfo;
|
|
@@ -26,6 +28,7 @@ export const TitleBar: React.FC<TitleBarProps> = ({ back = false, title, childre
|
|
|
26
28
|
const { t } = useI18n();
|
|
27
29
|
const { navigate, getCurrent, routes } = useRouter();
|
|
28
30
|
const routerNavigate = useNavigate();
|
|
31
|
+
const page = usePage();
|
|
29
32
|
|
|
30
33
|
if (typeof back === "boolean" && back) back = -1;
|
|
31
34
|
|
|
@@ -102,6 +105,12 @@ export const TitleBar: React.FC<TitleBarProps> = ({ back = false, title, childre
|
|
|
102
105
|
</Stack>
|
|
103
106
|
</Stack>
|
|
104
107
|
{children}
|
|
108
|
+
{page?.contrib.filter((operation) => operation.component?.variant === "action").length >
|
|
109
|
+
0 && (
|
|
110
|
+
<Stack width="fit-content">
|
|
111
|
+
<ActionMenu />
|
|
112
|
+
</Stack>
|
|
113
|
+
)}
|
|
105
114
|
</Toolbar>
|
|
106
115
|
</AppBar>
|
|
107
116
|
);
|
|
@@ -76,7 +76,7 @@ const ComponentLoaderInner: React.FC<ComponentLoaderInnerProps> = ({ operation,
|
|
|
76
76
|
const [data, setData] = useState<unknown>();
|
|
77
77
|
const initialLoad = useRef(true);
|
|
78
78
|
|
|
79
|
-
const component = operation.component.component;
|
|
79
|
+
const component = operation.component.component ?? ((() => null) as React.FC);
|
|
80
80
|
const Component = useMemo(
|
|
81
81
|
() => lazy(async () => ({ default: await Promise.resolve(component) })),
|
|
82
82
|
[component],
|
|
@@ -49,7 +49,7 @@ export const ApiContextProvider: React.FC<React.PropsWithChildren<ApiContextProv
|
|
|
49
49
|
for (const operation of Object.values(operations)) {
|
|
50
50
|
operation.component = {
|
|
51
51
|
...hit,
|
|
52
|
-
component: hit.component(),
|
|
52
|
+
component: hit.component?.() ?? ((() => null) as React.FC),
|
|
53
53
|
};
|
|
54
54
|
operation.order = i;
|
|
55
55
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import MailOutlineIcon from "@mui/icons-material/MailOutline";
|
|
2
|
+
|
|
1
3
|
import { OpenAPI } from "openapi-types";
|
|
2
4
|
|
|
3
5
|
import RotateLeftIcon from "../../assets/symbols/RotateLeft";
|
|
@@ -5,7 +7,6 @@ import ShoppingBagIcon from "../../assets/symbols/ShoppingBag";
|
|
|
5
7
|
import StorefrontIcon from "../../assets/symbols/Storefront";
|
|
6
8
|
import { RouterExtension } from "../../router/Router";
|
|
7
9
|
import { ContribComponentMap, NavigationOverrides, PageComponent } from "../../types";
|
|
8
|
-
|
|
9
10
|
export * from "./types/order";
|
|
10
11
|
export * from "./types/recipient";
|
|
11
12
|
export * from "./types/shipment";
|
|
@@ -84,4 +85,11 @@ export const contrib: Record<string, ContribComponentMap> = {
|
|
|
84
85
|
permission: "fulfillment.view_order",
|
|
85
86
|
},
|
|
86
87
|
},
|
|
88
|
+
actions: {
|
|
89
|
+
"pos:purchase:detail:send-confirmation-email": {
|
|
90
|
+
title: "Send Purchase Receipt",
|
|
91
|
+
variant: "action",
|
|
92
|
+
icon: MailOutlineIcon,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
87
95
|
} as const;
|
package/src/types/index.ts
CHANGED
|
@@ -64,10 +64,10 @@ export type ContribComponent<T = any> = React.ComponentType<
|
|
|
64
64
|
>;
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
|
-
* The variant of the component, either a tab or
|
|
67
|
+
* The variant of the component, either a tab, inline or action menu item.
|
|
68
68
|
* Still requires a `Page` that loads the contrib.
|
|
69
69
|
*/
|
|
70
|
-
export type ContribVariant = "tab" | "inline";
|
|
70
|
+
export type ContribVariant = "tab" | "inline" | "action";
|
|
71
71
|
|
|
72
72
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
73
|
export interface PageContribComponent<T = any> extends OpenAPI.Request {
|
|
@@ -82,7 +82,7 @@ export interface PageContribComponent<T = any> extends OpenAPI.Request {
|
|
|
82
82
|
/**
|
|
83
83
|
* The component to render, expected to be a Page, not a single `Card` or `Table`.
|
|
84
84
|
*/
|
|
85
|
-
component
|
|
85
|
+
component?: ContribComponent<T> | Promise<ContribComponent<T>>;
|
|
86
86
|
/**
|
|
87
87
|
* The variant of the component, either a tab or inline.
|
|
88
88
|
*/
|
|
@@ -107,7 +107,7 @@ export interface PageContribComponent<T = any> extends OpenAPI.Request {
|
|
|
107
107
|
export type ContribComponentMap = Record<
|
|
108
108
|
string,
|
|
109
109
|
Omit<PageContribComponent, "component"> & {
|
|
110
|
-
component
|
|
110
|
+
component?: () => PageContribComponent["component"];
|
|
111
111
|
}
|
|
112
112
|
>;
|
|
113
113
|
|