bananas-commerce-admin 0.20.2 → 0.20.3
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/extensions/pim/contrib/ArticleProduct.js +98 -0
- package/dist/esm/extensions/pim/contrib/ArticleProduct.js.map +1 -0
- package/dist/esm/extensions/pim/index.js +13 -0
- package/dist/esm/extensions/pim/index.js.map +1 -0
- package/dist/esm/extensions/pim/types/contrib.js +2 -0
- package/dist/esm/extensions/pim/types/contrib.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/extensions/pim/contrib/ArticleProduct.d.ts +4 -0
- package/dist/types/extensions/pim/index.d.ts +2 -0
- package/dist/types/extensions/pim/types/contrib.d.ts +19 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +6 -1
- package/src/extensions/pim/contrib/ArticleProduct.tsx +191 -0
- package/src/extensions/pim/index.tsx +16 -0
- package/src/extensions/pim/types/contrib.ts +21 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { TableBody, TableHead, TableRow } from "@mui/material";
|
|
3
|
+
import Box from "@mui/material/Box";
|
|
4
|
+
import ImageList from "@mui/material/ImageList";
|
|
5
|
+
import ImageListItem from "@mui/material/ImageListItem";
|
|
6
|
+
import ImageListItemBar from "@mui/material/ImageListItemBar";
|
|
7
|
+
import Modal from "@mui/material/Modal";
|
|
8
|
+
import Card from "../../../components/Card";
|
|
9
|
+
import CardContent from "../../../components/Card/CardContent";
|
|
10
|
+
import CardFieldText from "../../../components/Card/CardFieldText";
|
|
11
|
+
import CardHeader from "../../../components/Card/CardHeader";
|
|
12
|
+
import CardRow from "../../../components/Card/CardRow";
|
|
13
|
+
import Table from "../../../components/Table";
|
|
14
|
+
import { TableCell } from "../../../components/Table/TableCell";
|
|
15
|
+
import TableHeading from "../../../components/Table/TableHeading";
|
|
16
|
+
import { useI18n } from "../../../contexts/I18nContext";
|
|
17
|
+
import { capitalize } from "../../../util";
|
|
18
|
+
const ArticleProductCard = ({ data, params }) => {
|
|
19
|
+
const { t } = useI18n();
|
|
20
|
+
const [selectedAsset, setSelectedAsset] = React.useState(null);
|
|
21
|
+
const { code: articleCode } = params;
|
|
22
|
+
const { product, assets } = data;
|
|
23
|
+
const articleAssets = assets.filter((asset) => asset.article_code == articleCode || asset.article_code == "");
|
|
24
|
+
const imageAssets = articleAssets.filter((asset) => asset.asset_type == "image");
|
|
25
|
+
const otherAssets = articleAssets.filter((asset) => asset.asset_type !== "image");
|
|
26
|
+
const productProperties = Object.entries(product.properties);
|
|
27
|
+
return (React.createElement(Card, { columns: 1, isEditable: false },
|
|
28
|
+
React.createElement(CardHeader, { title: "Product" }),
|
|
29
|
+
React.createElement(CardContent, null,
|
|
30
|
+
React.createElement(CardRow, null,
|
|
31
|
+
React.createElement(CardFieldText, { formName: "name", label: t("Name"), required: true, value: product.name })),
|
|
32
|
+
React.createElement(CardRow, null,
|
|
33
|
+
React.createElement(CardFieldText, { formName: "description", label: t("Description"), required: true, value: product.description }))),
|
|
34
|
+
productProperties.length > 0 && (React.createElement(React.Fragment, null,
|
|
35
|
+
React.createElement(CardHeader, { title: t("Properties") }),
|
|
36
|
+
React.createElement(Table, { count: productProperties.length },
|
|
37
|
+
React.createElement(TableBody, { sx: {
|
|
38
|
+
"& .MuiTableRow-root:first-of-type .MuiTableCell-root": (theme) => ({
|
|
39
|
+
borderTop: `1px solid ${theme.palette.divider}`,
|
|
40
|
+
}),
|
|
41
|
+
} }, productProperties
|
|
42
|
+
.sort((a, b) => (a[0] < b[0] ? -1 : 1))
|
|
43
|
+
.map((prop) => (React.createElement(TableRow, { key: prop[0] },
|
|
44
|
+
React.createElement(TableCell, null, capitalize(prop[0])),
|
|
45
|
+
React.createElement(TableCell, { typographyProps: {
|
|
46
|
+
variant: "caption",
|
|
47
|
+
color: "text.secondary",
|
|
48
|
+
} }, prop[1])))))))),
|
|
49
|
+
articleAssets.length > 0 && React.createElement(CardHeader, { title: t("Assets") }),
|
|
50
|
+
imageAssets.length > 0 && (React.createElement(React.Fragment, null,
|
|
51
|
+
React.createElement(Modal, { "aria-describedby": "modal-modal-description", "aria-labelledby": "modal-modal-title", open: selectedAsset !== null, onClose: () => setSelectedAsset(null) },
|
|
52
|
+
React.createElement(Box, { sx: {
|
|
53
|
+
position: "absolute",
|
|
54
|
+
top: "50%",
|
|
55
|
+
left: "50%",
|
|
56
|
+
transform: "translate(-50%, -50%)",
|
|
57
|
+
width: "100vw", // Set explicit width
|
|
58
|
+
height: "100vh", // Set explicit height
|
|
59
|
+
bgcolor: "rgba(0, 0, 0, 0.7)", // Dark overlay background
|
|
60
|
+
boxShadow: 24,
|
|
61
|
+
p: 2, // Reduced padding
|
|
62
|
+
display: "flex",
|
|
63
|
+
justifyContent: "center",
|
|
64
|
+
alignItems: "center",
|
|
65
|
+
overflow: "hidden", // Hide any overflowing content
|
|
66
|
+
outline: "none",
|
|
67
|
+
}, onClick: () => setSelectedAsset(null) }, selectedAsset !== null && (React.createElement("img", { alt: selectedAsset.caption, loading: "lazy", src: selectedAsset.url, style: {
|
|
68
|
+
maxWidth: "100%",
|
|
69
|
+
maxHeight: "100%",
|
|
70
|
+
objectFit: "contain",
|
|
71
|
+
borderRadius: "8px", // Subtle rounded corners for the image
|
|
72
|
+
} })))),
|
|
73
|
+
React.createElement(CardContent, { sx: {
|
|
74
|
+
width: "100%",
|
|
75
|
+
height: 400,
|
|
76
|
+
overflowY: "scroll",
|
|
77
|
+
paddingTop: 0,
|
|
78
|
+
paddingBottom: 0,
|
|
79
|
+
paddingLeft: 3,
|
|
80
|
+
paddingRight: 3,
|
|
81
|
+
} },
|
|
82
|
+
React.createElement(ImageList, { cols: 3, gap: 8, variant: "masonry" }, imageAssets.map((asset) => (React.createElement(ImageListItem, { key: asset.id, onClick: () => setSelectedAsset(asset) },
|
|
83
|
+
React.createElement("img", { alt: asset.caption, loading: "lazy", src: asset.url }),
|
|
84
|
+
React.createElement(ImageListItemBar, { subtitle: asset.caption })))))))),
|
|
85
|
+
otherAssets.length > 0 && (React.createElement(Table, { count: otherAssets.length },
|
|
86
|
+
React.createElement(TableHead, null,
|
|
87
|
+
React.createElement(TableRow, null,
|
|
88
|
+
React.createElement(TableHeading, null, t("Asset ID")),
|
|
89
|
+
React.createElement(TableHeading, { align: "right" }, t("Type")),
|
|
90
|
+
React.createElement(TableHeading, { align: "right" }, t("Caption")))),
|
|
91
|
+
React.createElement(TableBody, { sx: { ".MuiTableRow-root:last-child > .MuiTableCell-root": { borderBottom: "none" } } }, otherAssets.map((asset) => (React.createElement(TableRow, { key: asset.id, sx: { height: 56 } },
|
|
92
|
+
React.createElement(TableCell, { sx: { py: 0 } },
|
|
93
|
+
React.createElement("a", { href: asset.url, rel: "noreferrer", target: "_blank" }, asset.id)),
|
|
94
|
+
React.createElement(TableCell, { align: "right", sx: { py: 0 } }, asset.asset_type),
|
|
95
|
+
React.createElement(TableCell, { align: "right", sx: { py: 0 } }, asset.caption)))))))));
|
|
96
|
+
};
|
|
97
|
+
export default ArticleProductCard;
|
|
98
|
+
//# sourceMappingURL=ArticleProduct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArticleProduct.js","sourceRoot":"","sources":["../../../../../src/extensions/pim/contrib/ArticleProduct.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import InventoryOutlinedIcon from "@mui/icons-material/InventoryOutlined";
|
|
2
|
+
export const contrib = {
|
|
3
|
+
catalog: {
|
|
4
|
+
"catalog:article:detail:product": {
|
|
5
|
+
title: "Product",
|
|
6
|
+
icon: InventoryOutlinedIcon,
|
|
7
|
+
component: async () => (await import("./contrib/ArticleProduct")).default,
|
|
8
|
+
predicate: (article) => !!article.product_number,
|
|
9
|
+
variant: "inline",
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extensions/pim/index.tsx"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,uCAAuC,CAAC;AAK1E,MAAM,CAAC,MAAM,OAAO,GAAwC;IAC1D,OAAO,EAAE;QACP,gCAAgC,EAAE;YAChC,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO;YACzE,SAAS,EAAE,CAAC,OAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc;YAC/D,OAAO,EAAE,QAAQ;SAClB;KACF;CACO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contrib.js","sourceRoot":"","sources":["../../../../../src/extensions/pim/types/contrib.ts"],"names":[],"mappings":""}
|
package/dist/esm/index.js
CHANGED
|
@@ -65,6 +65,7 @@ export * as catalog from "./extensions/catalog";
|
|
|
65
65
|
export * as fulfillment from "./extensions/fulfillment";
|
|
66
66
|
export * as inventory from "./extensions/inventory";
|
|
67
67
|
export * as member from "./extensions/member";
|
|
68
|
+
export * as pim from "./extensions/pim";
|
|
68
69
|
export * as pos from "./extensions/pos";
|
|
69
70
|
export * as pricing from "./extensions/pricing";
|
|
70
71
|
export * as report from "./extensions/report";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,YAAY,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAE7B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ArticleProduct {
|
|
2
|
+
number: string;
|
|
3
|
+
item_type: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
properties: object;
|
|
7
|
+
is_active: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ArticleAsset {
|
|
10
|
+
id: string;
|
|
11
|
+
asset_type: string;
|
|
12
|
+
caption: string;
|
|
13
|
+
article_code: string;
|
|
14
|
+
url: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ArticleProductResponse {
|
|
17
|
+
product: ArticleProduct;
|
|
18
|
+
assets: ArticleAsset[];
|
|
19
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -65,6 +65,7 @@ export * as catalog from "./extensions/catalog";
|
|
|
65
65
|
export * as fulfillment from "./extensions/fulfillment";
|
|
66
66
|
export * as inventory from "./extensions/inventory";
|
|
67
67
|
export * as member from "./extensions/member";
|
|
68
|
+
export * as pim from "./extensions/pim";
|
|
68
69
|
export * as pos from "./extensions/pos";
|
|
69
70
|
export * as pricing from "./extensions/pricing";
|
|
70
71
|
export * as report from "./extensions/report";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bananas-commerce-admin",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.3",
|
|
4
4
|
"description": "What's this, an admin for apes?",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"admin",
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
"bananas-commerce-admin"
|
|
13
13
|
],
|
|
14
14
|
"author": "Elias Sjögreen",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/5m/bananas-commerce.git",
|
|
18
|
+
"directory": "admin/packages/bananas-commerce-admin"
|
|
19
|
+
},
|
|
15
20
|
"module": "./dist/esm/index.js",
|
|
16
21
|
"main": "./dist/cjs/index.js",
|
|
17
22
|
"types": "./dist/types/index.d.ts",
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
import { TableBody, TableHead, TableRow } from "@mui/material";
|
|
4
|
+
import Box from "@mui/material/Box";
|
|
5
|
+
import ImageList from "@mui/material/ImageList";
|
|
6
|
+
import ImageListItem from "@mui/material/ImageListItem";
|
|
7
|
+
import ImageListItemBar from "@mui/material/ImageListItemBar";
|
|
8
|
+
import Modal from "@mui/material/Modal";
|
|
9
|
+
|
|
10
|
+
import Card from "../../../components/Card";
|
|
11
|
+
import CardContent from "../../../components/Card/CardContent";
|
|
12
|
+
import CardFieldText from "../../../components/Card/CardFieldText";
|
|
13
|
+
import CardHeader from "../../../components/Card/CardHeader";
|
|
14
|
+
import CardRow from "../../../components/Card/CardRow";
|
|
15
|
+
import Table from "../../../components/Table";
|
|
16
|
+
import { TableCell } from "../../../components/Table/TableCell";
|
|
17
|
+
import TableHeading from "../../../components/Table/TableHeading";
|
|
18
|
+
import { useI18n } from "../../../contexts/I18nContext";
|
|
19
|
+
import { ContribComponent } from "../../../types";
|
|
20
|
+
import { capitalize } from "../../../util";
|
|
21
|
+
import { ArticleAsset, ArticleProductResponse } from "../types/contrib";
|
|
22
|
+
|
|
23
|
+
const ArticleProductCard: ContribComponent<ArticleProductResponse> = ({ data, params }) => {
|
|
24
|
+
const { t } = useI18n();
|
|
25
|
+
const [selectedAsset, setSelectedAsset] = React.useState<ArticleAsset | null>(null);
|
|
26
|
+
|
|
27
|
+
const { code: articleCode } = params as { code: string };
|
|
28
|
+
const { product, assets } = data;
|
|
29
|
+
|
|
30
|
+
const articleAssets = assets.filter(
|
|
31
|
+
(asset) => asset.article_code == articleCode || asset.article_code == "",
|
|
32
|
+
);
|
|
33
|
+
const imageAssets = articleAssets.filter((asset) => asset.asset_type == "image");
|
|
34
|
+
const otherAssets = articleAssets.filter((asset) => asset.asset_type !== "image");
|
|
35
|
+
|
|
36
|
+
const productProperties = Object.entries(product.properties);
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<Card columns={1} isEditable={false}>
|
|
40
|
+
<CardHeader title="Product" />
|
|
41
|
+
|
|
42
|
+
<CardContent>
|
|
43
|
+
<CardRow>
|
|
44
|
+
<CardFieldText formName="name" label={t("Name")} required={true} value={product.name} />
|
|
45
|
+
</CardRow>
|
|
46
|
+
<CardRow>
|
|
47
|
+
<CardFieldText
|
|
48
|
+
formName="description"
|
|
49
|
+
label={t("Description")}
|
|
50
|
+
required={true}
|
|
51
|
+
value={product.description}
|
|
52
|
+
/>
|
|
53
|
+
</CardRow>
|
|
54
|
+
</CardContent>
|
|
55
|
+
|
|
56
|
+
{productProperties.length > 0 && (
|
|
57
|
+
<>
|
|
58
|
+
<CardHeader title={t("Properties")} />
|
|
59
|
+
|
|
60
|
+
<Table count={productProperties.length}>
|
|
61
|
+
<TableBody
|
|
62
|
+
sx={{
|
|
63
|
+
"& .MuiTableRow-root:first-of-type .MuiTableCell-root": (theme) => ({
|
|
64
|
+
borderTop: `1px solid ${theme.palette.divider}`,
|
|
65
|
+
}),
|
|
66
|
+
}}
|
|
67
|
+
>
|
|
68
|
+
{productProperties
|
|
69
|
+
.sort((a, b) => (a[0] < b[0] ? -1 : 1))
|
|
70
|
+
.map((prop) => (
|
|
71
|
+
<TableRow key={prop[0]}>
|
|
72
|
+
<TableCell>{capitalize(prop[0])}</TableCell>
|
|
73
|
+
<TableCell
|
|
74
|
+
typographyProps={{
|
|
75
|
+
variant: "caption",
|
|
76
|
+
color: "text.secondary",
|
|
77
|
+
}}
|
|
78
|
+
>
|
|
79
|
+
{prop[1]}
|
|
80
|
+
</TableCell>
|
|
81
|
+
</TableRow>
|
|
82
|
+
))}
|
|
83
|
+
</TableBody>
|
|
84
|
+
</Table>
|
|
85
|
+
</>
|
|
86
|
+
)}
|
|
87
|
+
|
|
88
|
+
{articleAssets.length > 0 && <CardHeader title={t("Assets")} />}
|
|
89
|
+
|
|
90
|
+
{imageAssets.length > 0 && (
|
|
91
|
+
<>
|
|
92
|
+
<Modal
|
|
93
|
+
aria-describedby="modal-modal-description"
|
|
94
|
+
aria-labelledby="modal-modal-title"
|
|
95
|
+
open={selectedAsset !== null}
|
|
96
|
+
onClose={() => setSelectedAsset(null)}
|
|
97
|
+
>
|
|
98
|
+
<Box
|
|
99
|
+
sx={{
|
|
100
|
+
position: "absolute",
|
|
101
|
+
top: "50%",
|
|
102
|
+
left: "50%",
|
|
103
|
+
transform: "translate(-50%, -50%)",
|
|
104
|
+
width: "100vw", // Set explicit width
|
|
105
|
+
height: "100vh", // Set explicit height
|
|
106
|
+
bgcolor: "rgba(0, 0, 0, 0.7)", // Dark overlay background
|
|
107
|
+
boxShadow: 24,
|
|
108
|
+
p: 2, // Reduced padding
|
|
109
|
+
display: "flex",
|
|
110
|
+
justifyContent: "center",
|
|
111
|
+
alignItems: "center",
|
|
112
|
+
overflow: "hidden", // Hide any overflowing content
|
|
113
|
+
outline: "none",
|
|
114
|
+
}}
|
|
115
|
+
onClick={() => setSelectedAsset(null)}
|
|
116
|
+
>
|
|
117
|
+
{selectedAsset !== null && (
|
|
118
|
+
<img
|
|
119
|
+
alt={selectedAsset.caption}
|
|
120
|
+
loading="lazy"
|
|
121
|
+
src={selectedAsset.url}
|
|
122
|
+
style={{
|
|
123
|
+
maxWidth: "100%",
|
|
124
|
+
maxHeight: "100%",
|
|
125
|
+
objectFit: "contain",
|
|
126
|
+
borderRadius: "8px", // Subtle rounded corners for the image
|
|
127
|
+
}}
|
|
128
|
+
/>
|
|
129
|
+
)}
|
|
130
|
+
</Box>
|
|
131
|
+
</Modal>
|
|
132
|
+
|
|
133
|
+
<CardContent
|
|
134
|
+
sx={{
|
|
135
|
+
width: "100%",
|
|
136
|
+
height: 400,
|
|
137
|
+
overflowY: "scroll",
|
|
138
|
+
paddingTop: 0,
|
|
139
|
+
paddingBottom: 0,
|
|
140
|
+
paddingLeft: 3,
|
|
141
|
+
paddingRight: 3,
|
|
142
|
+
}}
|
|
143
|
+
>
|
|
144
|
+
<ImageList cols={3} gap={8} variant="masonry">
|
|
145
|
+
{imageAssets.map((asset) => (
|
|
146
|
+
<ImageListItem key={asset.id} onClick={() => setSelectedAsset(asset)}>
|
|
147
|
+
<img alt={asset.caption} loading="lazy" src={asset.url} />
|
|
148
|
+
<ImageListItemBar subtitle={asset.caption} />
|
|
149
|
+
</ImageListItem>
|
|
150
|
+
))}
|
|
151
|
+
</ImageList>
|
|
152
|
+
</CardContent>
|
|
153
|
+
</>
|
|
154
|
+
)}
|
|
155
|
+
|
|
156
|
+
{otherAssets.length > 0 && (
|
|
157
|
+
<Table count={otherAssets.length}>
|
|
158
|
+
<TableHead>
|
|
159
|
+
<TableRow>
|
|
160
|
+
<TableHeading>{t("Asset ID")}</TableHeading>
|
|
161
|
+
<TableHeading align="right">{t("Type")}</TableHeading>
|
|
162
|
+
<TableHeading align="right">{t("Caption")}</TableHeading>
|
|
163
|
+
</TableRow>
|
|
164
|
+
</TableHead>
|
|
165
|
+
|
|
166
|
+
<TableBody
|
|
167
|
+
sx={{ ".MuiTableRow-root:last-child > .MuiTableCell-root": { borderBottom: "none" } }}
|
|
168
|
+
>
|
|
169
|
+
{otherAssets.map((asset) => (
|
|
170
|
+
<TableRow key={asset.id} sx={{ height: 56 }}>
|
|
171
|
+
<TableCell sx={{ py: 0 }}>
|
|
172
|
+
<a href={asset.url} rel="noreferrer" target="_blank">
|
|
173
|
+
{asset.id}
|
|
174
|
+
</a>
|
|
175
|
+
</TableCell>
|
|
176
|
+
<TableCell align="right" sx={{ py: 0 }}>
|
|
177
|
+
{asset.asset_type}
|
|
178
|
+
</TableCell>
|
|
179
|
+
<TableCell align="right" sx={{ py: 0 }}>
|
|
180
|
+
{asset.caption}
|
|
181
|
+
</TableCell>
|
|
182
|
+
</TableRow>
|
|
183
|
+
))}
|
|
184
|
+
</TableBody>
|
|
185
|
+
</Table>
|
|
186
|
+
)}
|
|
187
|
+
</Card>
|
|
188
|
+
);
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
export default ArticleProductCard;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import InventoryOutlinedIcon from "@mui/icons-material/InventoryOutlined";
|
|
2
|
+
|
|
3
|
+
import { ArticleDetail } from "../../extensions/catalog";
|
|
4
|
+
import { ContribComponentMap } from "../../types";
|
|
5
|
+
|
|
6
|
+
export const contrib: Record<string, ContribComponentMap> = {
|
|
7
|
+
catalog: {
|
|
8
|
+
"catalog:article:detail:product": {
|
|
9
|
+
title: "Product",
|
|
10
|
+
icon: InventoryOutlinedIcon,
|
|
11
|
+
component: async () => (await import("./contrib/ArticleProduct")).default,
|
|
12
|
+
predicate: (article: ArticleDetail) => !!article.product_number,
|
|
13
|
+
variant: "inline",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
} as const;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ArticleProduct {
|
|
2
|
+
number: string;
|
|
3
|
+
item_type: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
properties: object;
|
|
7
|
+
is_active: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ArticleAsset {
|
|
11
|
+
id: string;
|
|
12
|
+
asset_type: string;
|
|
13
|
+
caption: string;
|
|
14
|
+
article_code: string;
|
|
15
|
+
url: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ArticleProductResponse {
|
|
19
|
+
product: ArticleProduct;
|
|
20
|
+
assets: ArticleAsset[];
|
|
21
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -65,6 +65,7 @@ export * as catalog from "./extensions/catalog";
|
|
|
65
65
|
export * as fulfillment from "./extensions/fulfillment";
|
|
66
66
|
export * as inventory from "./extensions/inventory";
|
|
67
67
|
export * as member from "./extensions/member";
|
|
68
|
+
export * as pim from "./extensions/pim";
|
|
68
69
|
export * as pos from "./extensions/pos";
|
|
69
70
|
export * as pricing from "./extensions/pricing";
|
|
70
71
|
export * as report from "./extensions/report";
|