bananas-commerce-admin 0.18.4 → 0.18.6

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.
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { TableBody, TableCell, TableHead, TableRow } from "@mui/material";
3
+ import Card from "../../../components/Card";
4
+ import CardHeader from "../../../components/Card/CardHeader";
5
+ import Table from "../../../components/Table";
6
+ import TableHeading from "../../../components/Table/TableHeading";
7
+ import { useI18n } from "../../../contexts/I18nContext";
8
+ const ArticleInventoryCard = ({ data }) => {
9
+ const { t } = useI18n();
10
+ return (React.createElement(Card, null,
11
+ React.createElement(CardHeader, { title: "Inventory" }),
12
+ React.createElement(Table, { count: data.length },
13
+ React.createElement(TableHead, null,
14
+ React.createElement(TableRow, null,
15
+ React.createElement(TableHeading, null, t("Warehouse")),
16
+ React.createElement(TableHeading, { align: "right" }, t("On Hand")),
17
+ React.createElement(TableHeading, { align: "right" }, t("Allocated")),
18
+ React.createElement(TableHeading, { align: "right" }, t("Available")))),
19
+ React.createElement(TableBody, { sx: { ".MuiTableRow-root:last-child > .MuiTableCell-root": { borderBottom: "none" } } },
20
+ data.length === 0 && (React.createElement(TableRow, null,
21
+ React.createElement(TableCell, { align: "center", colSpan: 4, sx: { color: "GrayText" } }, t("No inventory")))),
22
+ data
23
+ .sort((a, b) => (a.warehouse_code < b.warehouse_code ? -1 : 1))
24
+ .map((stock) => (React.createElement(TableRow, { key: stock.warehouse_code, sx: { height: 56 } },
25
+ React.createElement(TableCell, { sx: { py: 0 } }, stock.warehouse_code),
26
+ React.createElement(TableCell, { align: "right", sx: { py: 0 } }, stock.quantity_on_hand),
27
+ React.createElement(TableCell, { align: "right", sx: { py: 0 } }, stock.allocated_quantity),
28
+ React.createElement(TableCell, { align: "right", sx: { py: 0 } }, stock.availability))))))));
29
+ };
30
+ export default ArticleInventoryCard;
31
+ //# sourceMappingURL=ArticleInventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleInventory.js","sourceRoot":"","sources":["../../../../../src/extensions/inventory/contrib/ArticleInventory.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,IAAI,MAAM,0BAA0B,CAAC;AAC5C,OAAO,UAAU,MAAM,qCAAqC,CAAC;AAC7D,OAAO,KAAK,MAAM,2BAA2B,CAAC;AAC9C,OAAO,YAAY,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAIxD,MAAM,oBAAoB,GAAqC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IAC1E,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAExB,OAAO,CACL,oBAAC,IAAI;QACH,oBAAC,UAAU,IAAC,KAAK,EAAC,WAAW,GAAG;QAChC,oBAAC,KAAK,IAAC,KAAK,EAAE,IAAI,CAAC,MAAM;YACvB,oBAAC,SAAS;gBACR,oBAAC,QAAQ;oBACP,oBAAC,YAAY,QAAE,CAAC,CAAC,WAAW,CAAC,CAAgB;oBAC7C,oBAAC,YAAY,IAAC,KAAK,EAAC,OAAO,IAAE,CAAC,CAAC,SAAS,CAAC,CAAgB;oBACzD,oBAAC,YAAY,IAAC,KAAK,EAAC,OAAO,IAAE,CAAC,CAAC,WAAW,CAAC,CAAgB;oBAC3D,oBAAC,YAAY,IAAC,KAAK,EAAC,OAAO,IAAE,CAAC,CAAC,WAAW,CAAC,CAAgB,CAClD,CACD;YAEZ,oBAAC,SAAS,IACR,EAAE,EAAE,EAAE,mDAAmD,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE;gBAEpF,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CACpB,oBAAC,QAAQ;oBACP,oBAAC,SAAS,IAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAC5D,CAAC,CAAC,cAAc,CAAC,CACR,CACH,CACZ;gBAEA,IAAI;qBACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC9D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACd,oBAAC,QAAQ,IAAC,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBACrD,oBAAC,SAAS,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAG,KAAK,CAAC,cAAc,CAAa;oBAC5D,oBAAC,SAAS,IAAC,KAAK,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IACnC,KAAK,CAAC,gBAAgB,CACb;oBACZ,oBAAC,SAAS,IAAC,KAAK,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IACnC,KAAK,CAAC,kBAAkB,CACf;oBACZ,oBAAC,SAAS,IAAC,KAAK,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IACnC,KAAK,CAAC,YAAY,CACT,CACH,CACZ,CAAC,CACM,CACN,CACH,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import InventoryOutlinedIcon from "@mui/icons-material/InventoryOutlined";
2
+ export const contrib = {
3
+ catalog: {
4
+ "catalog:article:detail:inventory": {
5
+ title: "Inventory",
6
+ icon: InventoryOutlinedIcon,
7
+ component: async () => (await import("./contrib/ArticleInventory")).default,
8
+ predicate: (article) => article.item_type == "SKU",
9
+ variant: "inline",
10
+ permission: "inventory.view_inventorytransaction",
11
+ },
12
+ },
13
+ };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extensions/inventory/index.tsx"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,uCAAuC,CAAC;AAK1E,MAAM,CAAC,MAAM,OAAO,GAAwC;IAC1D,OAAO,EAAE;QACP,kCAAkC,EAAE;YAClC,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC,OAAO;YAC3E,SAAS,EAAE,CAAC,OAAsB,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK;YACjE,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,qCAAqC;SAClD;KACF;CACO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contrib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrib.js","sourceRoot":"","sources":["../../../../../src/extensions/inventory/types/contrib.ts"],"names":[],"mappings":""}
@@ -1,10 +1,11 @@
1
1
  import React from "react";
2
2
  import { TableCell } from "../../../components/Table/TableCell";
3
3
  import { NavigatingTableRow } from "../../../components/Table/TableRow";
4
+ import { formatPurchaseName } from "../../../util/format_purchase_name";
4
5
  import { formatPurchaseNumber } from "../../../util/format_purchase_number";
5
6
  export const PurchaseRow = ({ purchase }) => (React.createElement(NavigatingTableRow, { route: "pos.purchase:detail", routeParams: { purchase_number: purchase.number } },
6
7
  React.createElement(TableCell, null, formatPurchaseNumber(purchase.number)),
7
- React.createElement(TableCell, null, purchase.given_name ? `${purchase.given_name} ${purchase.family_name}` : "—"),
8
+ React.createElement(TableCell, null, formatPurchaseName(purchase)),
8
9
  React.createElement(TableCell, null, purchase.email),
9
10
  React.createElement(TableCell, null, purchase.phone),
10
11
  React.createElement(TableCell, null, new Date(purchase.date_confirmed).toLocaleString("sv-SE", {
@@ -1 +1 @@
1
- {"version":3,"file":"PurchaseRow.js","sourceRoot":"","sources":["../../../../../src/extensions/pos/components/PurchaseRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAO5E,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACvE,oBAAC,kBAAkB,IACjB,KAAK,EAAC,qBAAqB,EAC3B,WAAW,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE;IAEjD,oBAAC,SAAS,QAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAa;IAC9D,oBAAC,SAAS,QACP,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CACnE;IACZ,oBAAC,SAAS,QAAE,QAAQ,CAAC,KAAK,CAAa;IACvC,oBAAC,SAAS,QAAE,QAAQ,CAAC,KAAK,CAAa;IACvC,oBAAC,SAAS,QACP,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QACzD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CACQ,CACO,CACtB,CAAC"}
1
+ {"version":3,"file":"PurchaseRow.js","sourceRoot":"","sources":["../../../../../src/extensions/pos/components/PurchaseRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAO5E,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACvE,oBAAC,kBAAkB,IACjB,KAAK,EAAC,qBAAqB,EAC3B,WAAW,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE;IAEjD,oBAAC,SAAS,QAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAa;IAC9D,oBAAC,SAAS,QAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAa;IACrD,oBAAC,SAAS,QAAE,QAAQ,CAAC,KAAK,CAAa;IACvC,oBAAC,SAAS,QAAE,QAAQ,CAAC,KAAK,CAAa;IACvC,oBAAC,SAAS,QACP,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QACzD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CACQ,CACO,CACtB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -63,6 +63,7 @@ export * from "./contexts/UserContext";
63
63
  export * as bananas from "./extensions/bananas";
64
64
  export * as catalog from "./extensions/catalog";
65
65
  export * as fulfillment from "./extensions/fulfillment";
66
+ export * as inventory from "./extensions/inventory";
66
67
  export * as member from "./extensions/member";
67
68
  export * as pos from "./extensions/pos";
68
69
  export * as pricing from "./extensions/pricing";
@@ -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,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,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":"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,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export function formatPurchaseName(purchase) {
2
+ if (purchase.company_name)
3
+ return purchase.company_name;
4
+ if (purchase.given_name && purchase.family_name) {
5
+ return `${purchase.given_name} ${purchase.family_name}`;
6
+ }
7
+ return purchase.given_name || purchase.family_name || "—";
8
+ }
9
+ //# sourceMappingURL=format_purchase_name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format_purchase_name.js","sourceRoot":"","sources":["../../../src/util/format_purchase_name.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,QAAwB;IACzD,IAAI,QAAQ,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC,YAAY,CAAC;IAExD,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QAChD,OAAO,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ContribComponent } from "../../../types";
2
+ import { ArticleStock } from "../types/contrib";
3
+ declare const ArticleInventoryCard: ContribComponent<ArticleStock[]>;
4
+ export default ArticleInventoryCard;
@@ -0,0 +1,2 @@
1
+ import { ContribComponentMap } from "../../types";
2
+ export declare const contrib: Record<string, ContribComponentMap>;
@@ -0,0 +1,7 @@
1
+ export interface ArticleStock {
2
+ warehouse_code: string;
3
+ article_code: string;
4
+ quantity_on_hand: number;
5
+ allocated_quantity: number;
6
+ availability: number;
7
+ }
@@ -63,6 +63,7 @@ export * from "./contexts/UserContext";
63
63
  export * as bananas from "./extensions/bananas";
64
64
  export * as catalog from "./extensions/catalog";
65
65
  export * as fulfillment from "./extensions/fulfillment";
66
+ export * as inventory from "./extensions/inventory";
66
67
  export * as member from "./extensions/member";
67
68
  export * as pos from "./extensions/pos";
68
69
  export * as pricing from "./extensions/pricing";
@@ -0,0 +1,2 @@
1
+ import { PurchaseDetail } from "../extensions/pos";
2
+ export declare function formatPurchaseName(purchase: PurchaseDetail): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bananas-commerce-admin",
3
- "version": "0.18.4",
3
+ "version": "0.18.6",
4
4
  "description": "What's this, an admin for apes?",
5
5
  "keywords": [
6
6
  "admin",
@@ -0,0 +1,62 @@
1
+ import React from "react";
2
+
3
+ import { TableBody, TableCell, TableHead, TableRow } from "@mui/material";
4
+
5
+ import Card from "../../../components/Card";
6
+ import CardHeader from "../../../components/Card/CardHeader";
7
+ import Table from "../../../components/Table";
8
+ import TableHeading from "../../../components/Table/TableHeading";
9
+ import { useI18n } from "../../../contexts/I18nContext";
10
+ import { ContribComponent } from "../../../types";
11
+ import { ArticleStock } from "../types/contrib";
12
+
13
+ const ArticleInventoryCard: ContribComponent<ArticleStock[]> = ({ data }) => {
14
+ const { t } = useI18n();
15
+
16
+ return (
17
+ <Card>
18
+ <CardHeader title="Inventory" />
19
+ <Table count={data.length}>
20
+ <TableHead>
21
+ <TableRow>
22
+ <TableHeading>{t("Warehouse")}</TableHeading>
23
+ <TableHeading align="right">{t("On Hand")}</TableHeading>
24
+ <TableHeading align="right">{t("Allocated")}</TableHeading>
25
+ <TableHeading align="right">{t("Available")}</TableHeading>
26
+ </TableRow>
27
+ </TableHead>
28
+
29
+ <TableBody
30
+ sx={{ ".MuiTableRow-root:last-child > .MuiTableCell-root": { borderBottom: "none" } }}
31
+ >
32
+ {data.length === 0 && (
33
+ <TableRow>
34
+ <TableCell align="center" colSpan={4} sx={{ color: "GrayText" }}>
35
+ {t("No inventory")}
36
+ </TableCell>
37
+ </TableRow>
38
+ )}
39
+
40
+ {data
41
+ .sort((a, b) => (a.warehouse_code < b.warehouse_code ? -1 : 1))
42
+ .map((stock) => (
43
+ <TableRow key={stock.warehouse_code} sx={{ height: 56 }}>
44
+ <TableCell sx={{ py: 0 }}>{stock.warehouse_code}</TableCell>
45
+ <TableCell align="right" sx={{ py: 0 }}>
46
+ {stock.quantity_on_hand}
47
+ </TableCell>
48
+ <TableCell align="right" sx={{ py: 0 }}>
49
+ {stock.allocated_quantity}
50
+ </TableCell>
51
+ <TableCell align="right" sx={{ py: 0 }}>
52
+ {stock.availability}
53
+ </TableCell>
54
+ </TableRow>
55
+ ))}
56
+ </TableBody>
57
+ </Table>
58
+ </Card>
59
+ );
60
+ };
61
+
62
+ export default ArticleInventoryCard;
@@ -0,0 +1,17 @@
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:inventory": {
9
+ title: "Inventory",
10
+ icon: InventoryOutlinedIcon,
11
+ component: async () => (await import("./contrib/ArticleInventory")).default,
12
+ predicate: (article: ArticleDetail) => article.item_type == "SKU",
13
+ variant: "inline",
14
+ permission: "inventory.view_inventorytransaction",
15
+ },
16
+ },
17
+ } as const;
@@ -0,0 +1,7 @@
1
+ export interface ArticleStock {
2
+ warehouse_code: string;
3
+ article_code: string;
4
+ quantity_on_hand: number;
5
+ allocated_quantity: number;
6
+ availability: number;
7
+ }
@@ -2,6 +2,7 @@ import React from "react";
2
2
 
3
3
  import { TableCell } from "../../../components/Table/TableCell";
4
4
  import { NavigatingTableRow } from "../../../components/Table/TableRow";
5
+ import { formatPurchaseName } from "../../../util/format_purchase_name";
5
6
  import { formatPurchaseNumber } from "../../../util/format_purchase_number";
6
7
  import { PurchaseDetail } from "../types/purchase";
7
8
 
@@ -15,9 +16,7 @@ export const PurchaseRow: React.FC<PurchaseRowProps> = ({ purchase }) => (
15
16
  routeParams={{ purchase_number: purchase.number }}
16
17
  >
17
18
  <TableCell>{formatPurchaseNumber(purchase.number)}</TableCell>
18
- <TableCell>
19
- {purchase.given_name ? `${purchase.given_name} ${purchase.family_name}` : "—"}
20
- </TableCell>
19
+ <TableCell>{formatPurchaseName(purchase)}</TableCell>
21
20
  <TableCell>{purchase.email}</TableCell>
22
21
  <TableCell>{purchase.phone}</TableCell>
23
22
  <TableCell>
package/src/index.ts CHANGED
@@ -63,6 +63,7 @@ export * from "./contexts/UserContext";
63
63
  export * as bananas from "./extensions/bananas";
64
64
  export * as catalog from "./extensions/catalog";
65
65
  export * as fulfillment from "./extensions/fulfillment";
66
+ export * as inventory from "./extensions/inventory";
66
67
  export * as member from "./extensions/member";
67
68
  export * as pos from "./extensions/pos";
68
69
  export * as pricing from "./extensions/pricing";
@@ -0,0 +1,11 @@
1
+ import { PurchaseDetail } from "../extensions/pos";
2
+
3
+ export function formatPurchaseName(purchase: PurchaseDetail): string {
4
+ if (purchase.company_name) return purchase.company_name;
5
+
6
+ if (purchase.given_name && purchase.family_name) {
7
+ return `${purchase.given_name} ${purchase.family_name}`;
8
+ }
9
+
10
+ return purchase.given_name || purchase.family_name || "—";
11
+ }