bananas-commerce-admin 0.3.21 → 0.4.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/.prettierignore +0 -3
- package/dist/cjs/Admin.js +15 -16
- package/dist/cjs/Admin.js.map +1 -1
- package/dist/cjs/App.js.map +1 -1
- package/dist/cjs/api.js +13 -0
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/components/Link.js.map +1 -1
- package/dist/cjs/components/Logo.js.map +1 -1
- package/dist/cjs/components/NavBar.js +2 -1
- package/dist/cjs/components/NavBar.js.map +1 -1
- package/dist/cjs/components/NavBarRoutes.js +1 -1
- package/dist/cjs/components/NavBarRoutes.js.map +1 -1
- package/dist/cjs/components/TitleBar/index.js.map +1 -1
- package/dist/cjs/containers/ComponentLoader.js.map +1 -1
- package/dist/cjs/containers/LoadingScreen.js.map +1 -1
- package/dist/cjs/containers/PageErrorBoundary.js.map +1 -1
- package/dist/cjs/containers/PageLoader.js.map +1 -1
- package/dist/cjs/contexts/ApiContext.js +13 -14
- package/dist/cjs/contexts/ApiContext.js.map +1 -1
- package/dist/cjs/contexts/DialogContext.js.map +1 -1
- package/dist/cjs/contexts/I18nContext.js.map +1 -1
- package/dist/cjs/contexts/RouterContext.js.map +1 -1
- package/dist/cjs/contexts/UserContext.js.map +1 -1
- package/dist/cjs/extensions/bananas/index.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/AddressInfo.js +7 -5
- package/dist/cjs/extensions/fulfillment/components/AddressInfo.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/RecipientCard.js +18 -15
- package/dist/cjs/extensions/fulfillment/components/RecipientCard.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/ReturnOrderItemProspectCard.js +1 -1
- package/dist/cjs/extensions/fulfillment/components/ReturnOrderItemProspectCard.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/ShipmentCard.js +22 -37
- package/dist/cjs/extensions/fulfillment/components/ShipmentCard.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/ShipmentDestinationButtons.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/contrib/PurchaseOrderList.js +9 -10
- package/dist/cjs/extensions/fulfillment/components/contrib/PurchaseOrderList.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/contrib/ReturnProspectList.js +1 -1
- package/dist/cjs/extensions/fulfillment/components/contrib/ReturnProspectList.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/order/OrderAccordion.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/order/OrderDestinationCard.js +38 -0
- package/dist/cjs/extensions/fulfillment/components/order/OrderDestinationCard.js.map +1 -0
- package/dist/cjs/extensions/fulfillment/components/order/OrderDetail.js +276 -0
- package/dist/cjs/extensions/fulfillment/components/order/OrderDetail.js.map +1 -0
- package/dist/cjs/extensions/fulfillment/components/order/OrderItemsTable.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/components/order/OrderStateChip.js +1 -2
- package/dist/cjs/extensions/fulfillment/components/order/OrderStateChip.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/index.js +21 -25
- package/dist/cjs/extensions/fulfillment/index.js.map +1 -1
- package/dist/cjs/extensions/fulfillment/pages/order/list.js.map +1 -1
- package/dist/cjs/extensions/pos/components/CustomerCard.js.map +1 -1
- package/dist/cjs/extensions/pos/components/ReceiptCard.js.map +1 -1
- package/dist/cjs/extensions/pos/components/ReceiptTable.js.map +1 -1
- package/dist/cjs/extensions/pos/components/SearchBar.js +1 -1
- package/dist/cjs/extensions/pos/components/SearchBar.js.map +1 -1
- package/dist/cjs/extensions/pos/index.js.map +1 -1
- package/dist/cjs/extensions/pos/pages/purchase/detail.js +6 -21
- package/dist/cjs/extensions/pos/pages/purchase/detail.js.map +1 -1
- package/dist/cjs/extensions/pos/pages/purchase/list.js.map +1 -1
- package/dist/cjs/extensions/pos/types/receipt.js +1 -1
- package/dist/cjs/extensions/pos/types/receipt.js.map +1 -1
- package/dist/cjs/extensions/report/components/PurchaseCard.js.map +1 -1
- package/dist/cjs/forms/LoginForm.js.map +1 -1
- package/dist/cjs/hooks/useLocalStorage.js.map +1 -1
- package/dist/cjs/pages/DashboardPage.js +1 -5
- package/dist/cjs/pages/DashboardPage.js.map +1 -1
- package/dist/cjs/router/Router.js.map +1 -1
- package/dist/cjs/router/routes.js.map +1 -1
- package/dist/cjs/util/format_purchase_number.js.map +1 -1
- package/dist/cjs/util/index.js.map +1 -1
- package/dist/cjs/util/is_positive_integer.js.map +1 -1
- package/dist/cjs/util/select_styles.js.map +1 -1
- package/dist/esm/Admin.js +15 -16
- package/dist/esm/Admin.js.map +1 -1
- package/dist/esm/App.js.map +1 -1
- package/dist/esm/api.js +13 -0
- package/dist/esm/api.js.map +1 -1
- package/dist/esm/components/Link.js.map +1 -1
- package/dist/esm/components/Logo.js.map +1 -1
- package/dist/esm/components/NavBar.js +2 -1
- package/dist/esm/components/NavBar.js.map +1 -1
- package/dist/esm/components/NavBarRoutes.js +1 -1
- package/dist/esm/components/NavBarRoutes.js.map +1 -1
- package/dist/esm/components/TitleBar/index.js.map +1 -1
- package/dist/esm/containers/ComponentLoader.js.map +1 -1
- package/dist/esm/containers/LoadingScreen.js.map +1 -1
- package/dist/esm/containers/PageErrorBoundary.js.map +1 -1
- package/dist/esm/containers/PageLoader.js.map +1 -1
- package/dist/esm/contexts/ApiContext.js +13 -14
- package/dist/esm/contexts/ApiContext.js.map +1 -1
- package/dist/esm/contexts/DialogContext.js.map +1 -1
- package/dist/esm/contexts/I18nContext.js.map +1 -1
- package/dist/esm/contexts/RouterContext.js.map +1 -1
- package/dist/esm/contexts/UserContext.js.map +1 -1
- package/dist/esm/extensions/bananas/index.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/AddressInfo.js +7 -5
- package/dist/esm/extensions/fulfillment/components/AddressInfo.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/RecipientCard.js +18 -15
- package/dist/esm/extensions/fulfillment/components/RecipientCard.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/ReturnOrderItemProspectCard.js +1 -1
- package/dist/esm/extensions/fulfillment/components/ReturnOrderItemProspectCard.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/ShipmentCard.js +22 -37
- package/dist/esm/extensions/fulfillment/components/ShipmentCard.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/ShipmentDestinationButtons.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/contrib/PurchaseOrderList.js +9 -10
- package/dist/esm/extensions/fulfillment/components/contrib/PurchaseOrderList.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/contrib/ReturnProspectList.js +1 -1
- package/dist/esm/extensions/fulfillment/components/contrib/ReturnProspectList.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/order/OrderAccordion.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/order/OrderDestinationCard.js +31 -0
- package/dist/esm/extensions/fulfillment/components/order/OrderDestinationCard.js.map +1 -0
- package/dist/esm/extensions/fulfillment/components/order/OrderDetail.js +248 -0
- package/dist/esm/extensions/fulfillment/components/order/OrderDetail.js.map +1 -0
- package/dist/esm/extensions/fulfillment/components/order/OrderItemsTable.js.map +1 -1
- package/dist/esm/extensions/fulfillment/components/order/OrderStateChip.js +1 -2
- package/dist/esm/extensions/fulfillment/components/order/OrderStateChip.js.map +1 -1
- package/dist/esm/extensions/fulfillment/index.js +21 -25
- package/dist/esm/extensions/fulfillment/index.js.map +1 -1
- package/dist/esm/extensions/fulfillment/pages/order/list.js.map +1 -1
- package/dist/esm/extensions/pos/components/CustomerCard.js.map +1 -1
- package/dist/esm/extensions/pos/components/ReceiptCard.js.map +1 -1
- package/dist/esm/extensions/pos/components/ReceiptTable.js.map +1 -1
- package/dist/esm/extensions/pos/components/SearchBar.js +1 -1
- package/dist/esm/extensions/pos/components/SearchBar.js.map +1 -1
- package/dist/esm/extensions/pos/index.js.map +1 -1
- package/dist/esm/extensions/pos/pages/purchase/detail.js +6 -21
- package/dist/esm/extensions/pos/pages/purchase/detail.js.map +1 -1
- package/dist/esm/extensions/pos/pages/purchase/list.js.map +1 -1
- package/dist/esm/extensions/report/components/PurchaseCard.js.map +1 -1
- package/dist/esm/forms/LoginForm.js.map +1 -1
- package/dist/esm/hooks/useLocalStorage.js.map +1 -1
- package/dist/esm/pages/DashboardPage.js +1 -2
- package/dist/esm/pages/DashboardPage.js.map +1 -1
- package/dist/esm/router/Router.js.map +1 -1
- package/dist/esm/router/routes.js.map +1 -1
- package/dist/esm/util/format_purchase_number.js.map +1 -1
- package/dist/esm/util/index.js.map +1 -1
- package/dist/esm/util/is_positive_integer.js.map +1 -1
- package/dist/esm/util/select_styles.js.map +1 -1
- package/dist/types/App.d.ts +2 -2
- package/dist/types/api.d.ts +1 -0
- package/dist/types/components/User.d.ts +34 -17
- package/dist/types/containers/PageErrorBoundary.d.ts +1 -1
- package/dist/types/contexts/ApiContext.d.ts +2 -2
- package/dist/types/contexts/DialogContext.d.ts +2 -2
- package/dist/types/extensions/fulfillment/components/AddressInfo.d.ts +1 -0
- package/dist/types/extensions/fulfillment/components/RecipientCard.d.ts +3 -1
- package/dist/types/extensions/fulfillment/components/ShipmentCard.d.ts +3 -2
- package/dist/types/extensions/fulfillment/components/order/OrderDestinationCard.d.ts +7 -0
- package/dist/types/extensions/fulfillment/components/order/OrderDetail.d.ts +7 -0
- package/dist/types/extensions/fulfillment/components/order/OrderStateChip.d.ts +2 -2
- package/dist/types/extensions/fulfillment/index.d.ts +2 -2
- package/dist/types/extensions/fulfillment/types/order.d.ts +6 -5
- package/dist/types/extensions/fulfillment/types/recipient.d.ts +1 -5
- package/dist/types/extensions/fulfillment/types/shipment.d.ts +2 -57
- package/dist/types/extensions/pos/types/purchase.d.ts +1 -0
- package/dist/types/types/index.d.ts +4 -4
- package/package.json +25 -47
- package/src/Admin.tsx +36 -38
- package/src/App.tsx +2 -2
- package/src/api.ts +19 -5
- package/src/components/Branding.tsx +1 -1
- package/src/components/NavBar.tsx +17 -14
- package/src/components/NavBarRoutes.tsx +4 -4
- package/src/components/User.tsx +1 -1
- package/src/containers/ComponentLoader.tsx +2 -2
- package/src/containers/ErrorScreen.tsx +1 -1
- package/src/containers/LoadingScreen.tsx +2 -2
- package/src/containers/PageLoader.tsx +3 -3
- package/src/contexts/ApiContext.tsx +12 -10
- package/src/contexts/DialogContext.tsx +1 -1
- package/src/contexts/I18nContext.tsx +2 -2
- package/src/contexts/RouterContext.tsx +5 -5
- package/src/contexts/UserContext.tsx +2 -2
- package/src/extensions/bananas/components/PasswordChangeForm.tsx +1 -1
- package/src/extensions/fulfillment/components/AddressInfo.tsx +9 -5
- package/src/extensions/fulfillment/components/RecipientCard.tsx +47 -22
- package/src/extensions/fulfillment/components/ReturnOrderItemProspectCard.tsx +3 -1
- package/src/extensions/fulfillment/components/ShipmentCard.tsx +57 -63
- package/src/extensions/fulfillment/components/ShipmentDestinationButtons.tsx +2 -2
- package/src/extensions/fulfillment/components/contrib/PurchaseOrderList.tsx +21 -23
- package/src/extensions/fulfillment/components/contrib/ReturnProspectList.tsx +4 -3
- package/src/extensions/fulfillment/components/order/OrderAccordion.tsx +2 -2
- package/src/extensions/fulfillment/components/order/OrderDestinationCard.tsx +68 -0
- package/src/extensions/fulfillment/components/order/OrderDetail.tsx +262 -0
- package/src/extensions/fulfillment/components/order/OrderStateChip.tsx +1 -1
- package/src/extensions/fulfillment/index.tsx +13 -35
- package/src/extensions/fulfillment/types/order.ts +7 -5
- package/src/extensions/fulfillment/types/recipient.ts +1 -6
- package/src/extensions/fulfillment/types/shipment.ts +2 -60
- package/src/extensions/pos/components/ReceiptCard.tsx +1 -1
- package/src/extensions/pos/components/ReceiptTable.tsx +4 -4
- package/src/extensions/pos/components/SearchBar.tsx +2 -2
- package/src/extensions/pos/pages/purchase/detail.tsx +8 -12
- package/src/extensions/pos/pages/purchase/list.tsx +1 -1
- package/src/extensions/pos/types/purchase.ts +1 -0
- package/src/hooks/useAsyncError.ts +1 -1
- package/src/pages/DashboardPage.tsx +1 -1
- package/src/router/routes.ts +2 -2
- package/src/types/index.ts +8 -4
- package/src/util/select_styles.ts +1 -1
- package/tsconfig.json +2 -2
- package/.eslintignore +0 -5
- package/.eslintrc +0 -36
- package/.prettierrc +0 -6
- package/README.md +0 -52
- package/dist/cjs/extensions/fulfillment/components/ContactInfo.js +0 -21
- package/dist/cjs/extensions/fulfillment/components/ContactInfo.js.map +0 -1
- package/dist/cjs/extensions/fulfillment/components/ShipmentAccordion.js +0 -215
- package/dist/cjs/extensions/fulfillment/components/ShipmentAccordion.js.map +0 -1
- package/dist/cjs/extensions/fulfillment/components/ShipmentItemsCard.js +0 -131
- package/dist/cjs/extensions/fulfillment/components/ShipmentItemsCard.js.map +0 -1
- package/dist/cjs/extensions/fulfillment/components/ShipmentItemsTable.js +0 -85
- package/dist/cjs/extensions/fulfillment/components/ShipmentItemsTable.js.map +0 -1
- package/dist/cjs/extensions/fulfillment/components/ShipmentRow.js +0 -29
- package/dist/cjs/extensions/fulfillment/components/ShipmentRow.js.map +0 -1
- package/dist/esm/extensions/fulfillment/components/ContactInfo.js +0 -14
- package/dist/esm/extensions/fulfillment/components/ContactInfo.js.map +0 -1
- package/dist/esm/extensions/fulfillment/components/ShipmentAccordion.js +0 -208
- package/dist/esm/extensions/fulfillment/components/ShipmentAccordion.js.map +0 -1
- package/dist/esm/extensions/fulfillment/components/ShipmentItemsCard.js +0 -124
- package/dist/esm/extensions/fulfillment/components/ShipmentItemsCard.js.map +0 -1
- package/dist/esm/extensions/fulfillment/components/ShipmentItemsTable.js +0 -78
- package/dist/esm/extensions/fulfillment/components/ShipmentItemsTable.js.map +0 -1
- package/dist/esm/extensions/fulfillment/components/ShipmentRow.js +0 -22
- package/dist/esm/extensions/fulfillment/components/ShipmentRow.js.map +0 -1
- package/dist/types/extensions/fulfillment/components/ContactInfo.d.ts +0 -7
- package/dist/types/extensions/fulfillment/components/ShipmentAccordion.d.ts +0 -7
- package/dist/types/extensions/fulfillment/components/ShipmentItemsCard.d.ts +0 -6
- package/dist/types/extensions/fulfillment/components/ShipmentItemsTable.d.ts +0 -8
- package/dist/types/extensions/fulfillment/components/ShipmentRow.d.ts +0 -7
- package/example/index.tsx +0 -31
- package/example/package-lock.json +0 -8813
- package/example/package.json +0 -50
- package/example/scripts/build.js +0 -4
- package/example/scripts/options.js +0 -74
- package/src/extensions/fulfillment/components/ContactInfo.tsx +0 -33
- package/src/extensions/fulfillment/components/ShipmentAccordion.tsx +0 -209
- package/src/extensions/fulfillment/components/ShipmentItemsCard.tsx +0 -170
- package/src/extensions/fulfillment/components/ShipmentItemsTable.tsx +0 -116
- package/src/extensions/fulfillment/components/ShipmentRow.tsx +0 -32
|
@@ -1,64 +1,9 @@
|
|
|
1
1
|
export type ShipmentDestinationType = "HOME" | "STORE" | "SERVICE_POINT" | "LOCKER";
|
|
2
|
-
export interface ShipmentListItem {
|
|
3
|
-
shipment_reference: string;
|
|
4
|
-
purchase_number: number;
|
|
5
|
-
email: string;
|
|
6
|
-
phone?: string;
|
|
7
|
-
option_name: string;
|
|
8
|
-
carrier: string;
|
|
9
|
-
destination_type: ShipmentDestinationType;
|
|
10
|
-
name: string;
|
|
11
|
-
tracking_number: string;
|
|
12
|
-
date_confirmed?: string;
|
|
13
|
-
date_sent?: string;
|
|
14
|
-
date_cancelled?: string;
|
|
15
|
-
date_arrived_at_destination?: string;
|
|
16
|
-
date_delivered?: string;
|
|
17
|
-
}
|
|
18
2
|
export interface Shipment {
|
|
19
|
-
shipment_reference: string;
|
|
20
3
|
option_name: string;
|
|
21
4
|
carrier: string;
|
|
22
|
-
destination_type: ShipmentDestinationType;
|
|
23
|
-
destination_reference?: string;
|
|
24
|
-
name: string;
|
|
25
|
-
care_of: string;
|
|
26
|
-
street_address: string;
|
|
27
|
-
street_address2: string;
|
|
28
|
-
postal_code: string;
|
|
29
|
-
city: string;
|
|
30
|
-
country_code: string;
|
|
31
|
-
region: string;
|
|
32
5
|
tracking_number: string;
|
|
33
|
-
|
|
6
|
+
tracking_url: string;
|
|
7
|
+
date_commited?: string;
|
|
34
8
|
date_sent?: string;
|
|
35
|
-
date_cancelled?: string;
|
|
36
|
-
date_arrived_at_destination?: string;
|
|
37
|
-
date_delivered?: string;
|
|
38
|
-
items: ShipmentItem[];
|
|
39
|
-
}
|
|
40
|
-
export interface ShipmentDetail {
|
|
41
|
-
option_name: string;
|
|
42
|
-
carrier: string;
|
|
43
|
-
destination_type: ShipmentDestinationType;
|
|
44
|
-
destination_reference?: string;
|
|
45
|
-
name: string;
|
|
46
|
-
care_of: string;
|
|
47
|
-
street_address: string;
|
|
48
|
-
street_address2: string;
|
|
49
|
-
postal_code: string;
|
|
50
|
-
city: string;
|
|
51
|
-
country_code: string;
|
|
52
|
-
region: string;
|
|
53
|
-
tracking_number: string;
|
|
54
|
-
date_confirmed?: string;
|
|
55
|
-
date_sent?: string;
|
|
56
|
-
date_cancelled?: string;
|
|
57
|
-
date_arrived_at_destination?: string;
|
|
58
|
-
date_delivered?: string;
|
|
59
|
-
items: ShipmentItem[];
|
|
60
|
-
}
|
|
61
|
-
export interface ShipmentItem {
|
|
62
|
-
code: string;
|
|
63
|
-
quantity: number;
|
|
64
9
|
}
|
|
@@ -19,7 +19,7 @@ export interface PageContribComponent {
|
|
|
19
19
|
title?: string;
|
|
20
20
|
component: ContribComponent | Promise<ContribComponent>;
|
|
21
21
|
}
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
component: (
|
|
25
|
-
}
|
|
22
|
+
export type ContribComponentMap = Record<string, {
|
|
23
|
+
title?: string;
|
|
24
|
+
component: () => ContribComponent<any> | Promise<ContribComponent<any>>;
|
|
25
|
+
}>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bananas-commerce-admin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Bananas-commerce admin interface and building blocks",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"admin",
|
|
@@ -23,8 +23,6 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
|
-
"dev": "npm run build:esm:watch & npm run serve:watch --prefix ./example",
|
|
27
|
-
"dev:install": "npm i && npx npm-install-peers && npm i --prefix ./example",
|
|
28
26
|
"build": "npm run build:esm && npm run build:cjs",
|
|
29
27
|
"build:esm": "tsc",
|
|
30
28
|
"build:esm:watch": "npm run build:esm -- --watch",
|
|
@@ -32,52 +30,32 @@
|
|
|
32
30
|
"build:cjs:watch": "npm run build:cjs -- --watch",
|
|
33
31
|
"storybook": "storybook dev -p 6006",
|
|
34
32
|
"build:storybook": "storybook build",
|
|
35
|
-
"lint": "
|
|
36
|
-
"lint:
|
|
33
|
+
"lint": "npm run lint:ox && npm run lint:ts",
|
|
34
|
+
"lint:ox": "oxlint .",
|
|
35
|
+
"lint:ts": "tsc --noEmit --pretty false",
|
|
37
36
|
"fmt": "prettier --write .",
|
|
38
37
|
"fmt:check": "prettier --check ."
|
|
39
38
|
},
|
|
40
39
|
"devDependencies": {
|
|
41
|
-
"@
|
|
42
|
-
"@babel/
|
|
43
|
-
"@
|
|
44
|
-
"@
|
|
45
|
-
"@
|
|
46
|
-
"@
|
|
47
|
-
"@
|
|
48
|
-
"@
|
|
49
|
-
"@
|
|
50
|
-
"@
|
|
51
|
-
"@
|
|
52
|
-
"@
|
|
53
|
-
"@
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"@types/react": "^18.0.28",
|
|
61
|
-
"@types/react-dom": "^18.0.11",
|
|
62
|
-
"@typescript-eslint/eslint-plugin": "^5.56.0",
|
|
63
|
-
"@typescript-eslint/parser": "^5.56.0",
|
|
64
|
-
"babel-loader": "^8.3.0",
|
|
65
|
-
"eslint": "^8.36.0",
|
|
66
|
-
"eslint-config-prettier": "^8.8.0",
|
|
67
|
-
"eslint-plugin-import": "^2.27.5",
|
|
68
|
-
"eslint-plugin-prettier": "^4.2.1",
|
|
69
|
-
"eslint-plugin-simple-import-sort": "^10.0.0",
|
|
70
|
-
"eslint-plugin-storybook": "^0.6.11",
|
|
71
|
-
"eslint-prettier-config": "^1.0.1",
|
|
72
|
-
"mui-chips-input": "^2.0.1",
|
|
73
|
-
"notistack": "^3.0.1",
|
|
74
|
-
"openapi-types": "^12.1.0",
|
|
75
|
-
"prettier": "^2.8.7",
|
|
76
|
-
"react": "^18.2.0",
|
|
77
|
-
"react-dom": "^18.2.0",
|
|
78
|
-
"react-router-dom": "^6.9.0",
|
|
79
|
-
"storybook": "^7.0.0-rc.7",
|
|
80
|
-
"typescript": "^5.0.2"
|
|
40
|
+
"@babel/core": "^7.23.7",
|
|
41
|
+
"@babel/preset-typescript": "^7.23.3",
|
|
42
|
+
"@storybook/addon-actions": "^7.6.10",
|
|
43
|
+
"@storybook/addon-essentials": "^7.6.10",
|
|
44
|
+
"@storybook/addon-interactions": "^7.6.10",
|
|
45
|
+
"@storybook/addon-links": "^7.6.10",
|
|
46
|
+
"@storybook/react": "^7.6.10",
|
|
47
|
+
"@storybook/react-webpack5": "^7.6.10",
|
|
48
|
+
"@storybook/testing-library": "^0.2.2",
|
|
49
|
+
"@types/luxon": "^3.4.2",
|
|
50
|
+
"@types/node": "^20.11.5",
|
|
51
|
+
"@types/react": "^18.2.48",
|
|
52
|
+
"@types/react-dom": "^18.2.18",
|
|
53
|
+
"babel-loader": "^9.1.3",
|
|
54
|
+
"openapi-types": "^12.1.3",
|
|
55
|
+
"oxlint": "^0.2.3-alpha.0",
|
|
56
|
+
"prettier": "^3.2.4",
|
|
57
|
+
"storybook": "^7.6.10",
|
|
58
|
+
"typescript": "^5.3.3"
|
|
81
59
|
},
|
|
82
60
|
"peerDependencies": {
|
|
83
61
|
"@apidevtools/swagger-parser": "^10.1.0",
|
|
@@ -95,7 +73,7 @@
|
|
|
95
73
|
"react-router-dom": "^6.9.0"
|
|
96
74
|
},
|
|
97
75
|
"dependencies": {
|
|
98
|
-
"libphonenumber-js": "^1.10.
|
|
99
|
-
"luxon": "^3.
|
|
76
|
+
"libphonenumber-js": "^1.10.54",
|
|
77
|
+
"luxon": "^3.4.4"
|
|
100
78
|
}
|
|
101
79
|
}
|
package/src/Admin.tsx
CHANGED
|
@@ -53,45 +53,43 @@ const Admin: React.FC<AdminProps> = ({
|
|
|
53
53
|
}, [loaded, api, i18n, user]);
|
|
54
54
|
|
|
55
55
|
return (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<
|
|
71
|
-
<
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
<
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
</BrowserRouter>
|
|
87
|
-
) : (
|
|
88
|
-
<LoginPage logo={logo} title={title} />
|
|
89
|
-
)
|
|
56
|
+
<Box
|
|
57
|
+
sx={{
|
|
58
|
+
display: "flex",
|
|
59
|
+
position: "fixed",
|
|
60
|
+
top: 0,
|
|
61
|
+
left: 0,
|
|
62
|
+
width: "100%",
|
|
63
|
+
height: "100%",
|
|
64
|
+
flexDirection: "column",
|
|
65
|
+
}}
|
|
66
|
+
>
|
|
67
|
+
{loaded ? (
|
|
68
|
+
user !== null ? (
|
|
69
|
+
<BrowserRouter basename={basename}>
|
|
70
|
+
<RouterContextProvider stripPathPrefix={basepath}>
|
|
71
|
+
<DialogContextProvider>
|
|
72
|
+
<BcomDialog />
|
|
73
|
+
<Box sx={{ display: "flex" }}>
|
|
74
|
+
<NavBar
|
|
75
|
+
navigation={navigation}
|
|
76
|
+
logo={logo}
|
|
77
|
+
title={title}
|
|
78
|
+
subtitle={subtitle}
|
|
79
|
+
version={version}
|
|
80
|
+
/>
|
|
81
|
+
<Router extensions={extensions} dashboard={dashboard} />
|
|
82
|
+
</Box>
|
|
83
|
+
</DialogContextProvider>
|
|
84
|
+
</RouterContextProvider>
|
|
85
|
+
</BrowserRouter>
|
|
90
86
|
) : (
|
|
91
|
-
<
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
<LoginPage logo={logo} title={title} />
|
|
88
|
+
)
|
|
89
|
+
) : (
|
|
90
|
+
<LoadingScreen logo={logo} loading={!loaded} />
|
|
91
|
+
)}
|
|
92
|
+
</Box>
|
|
95
93
|
);
|
|
96
94
|
};
|
|
97
95
|
|
package/src/App.tsx
CHANGED
|
@@ -11,7 +11,7 @@ import { ApiContextProvider } from "./contexts/ApiContext";
|
|
|
11
11
|
import { I18nContextProvider } from "./contexts/I18nContext";
|
|
12
12
|
import { UserContextProvider } from "./contexts/UserContext";
|
|
13
13
|
import { parentPath } from "./router/routes";
|
|
14
|
-
import {
|
|
14
|
+
import { ContribComponentMap } from "./types";
|
|
15
15
|
|
|
16
16
|
type AppProps = {
|
|
17
17
|
api:
|
|
@@ -23,7 +23,7 @@ type AppProps = {
|
|
|
23
23
|
server?: string | URL;
|
|
24
24
|
};
|
|
25
25
|
theme?: Theme | Partial<Theme> | ((outerTheme: Theme) => Theme);
|
|
26
|
-
contrib?:
|
|
26
|
+
contrib?: ContribComponentMap;
|
|
27
27
|
} & AdminProps;
|
|
28
28
|
|
|
29
29
|
const App: React.FC<AppProps> = ({ theme, api, contrib, ...rest }) => {
|
package/src/api.ts
CHANGED
|
@@ -39,7 +39,7 @@ export class ApiOperation {
|
|
|
39
39
|
description?: string,
|
|
40
40
|
bodyType?: BodyApplicationType,
|
|
41
41
|
contribs?: string[],
|
|
42
|
-
component?: PageContribComponent
|
|
42
|
+
component?: PageContribComponent,
|
|
43
43
|
) {
|
|
44
44
|
this.id = id;
|
|
45
45
|
this.tags = tags;
|
|
@@ -112,7 +112,7 @@ export class ApiOperation {
|
|
|
112
112
|
break;
|
|
113
113
|
} else {
|
|
114
114
|
throw TypeError(
|
|
115
|
-
`Wrong type passed to ApiOperation.Call. Expected multipart/form-data as FormData or HTMLFormElement
|
|
115
|
+
`Wrong type passed to ApiOperation.Call. Expected multipart/form-data as FormData or HTMLFormElement.`,
|
|
116
116
|
);
|
|
117
117
|
}
|
|
118
118
|
default:
|
|
@@ -163,7 +163,7 @@ export class ApiClient {
|
|
|
163
163
|
// Build operations
|
|
164
164
|
for (const [path, definition] of Object.entries(this.document.paths ?? {}) as [
|
|
165
165
|
string,
|
|
166
|
-
Record<string, OpenAPI.Operation
|
|
166
|
+
Record<string, OpenAPI.Operation>,
|
|
167
167
|
][]) {
|
|
168
168
|
for (const [method, operation] of Object.entries(definition)) {
|
|
169
169
|
let appName: string | undefined;
|
|
@@ -230,7 +230,7 @@ export class ApiClient {
|
|
|
230
230
|
if ("requestBody" in operation && operation.requestBody !== undefined) {
|
|
231
231
|
if ("content" in operation.requestBody) {
|
|
232
232
|
const bodyTypes = Object.keys(operation.requestBody.content).map((bodyType) =>
|
|
233
|
-
bodyType.toLowerCase()
|
|
233
|
+
bodyType.toLowerCase(),
|
|
234
234
|
);
|
|
235
235
|
for (const type of bodyTypes) {
|
|
236
236
|
// @ts-expect-error this is actually totally fine
|
|
@@ -272,7 +272,7 @@ export class ApiClient {
|
|
|
272
272
|
operation.summary,
|
|
273
273
|
operation.description,
|
|
274
274
|
bodyType,
|
|
275
|
-
contribs
|
|
275
|
+
contribs,
|
|
276
276
|
);
|
|
277
277
|
|
|
278
278
|
for (const contribName of contribs) {
|
|
@@ -291,4 +291,18 @@ export class ApiClient {
|
|
|
291
291
|
return false;
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
|
+
|
|
295
|
+
findContrib(prefix: string) {
|
|
296
|
+
const results = [];
|
|
297
|
+
|
|
298
|
+
for (const [tag, operations] of Object.entries(this.contrib)) {
|
|
299
|
+
for (const [_, operation] of Object.entries(operations)) {
|
|
300
|
+
if (tag.startsWith(prefix) && operation.component !== undefined) {
|
|
301
|
+
results.push(operation);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return results;
|
|
307
|
+
}
|
|
294
308
|
}
|
|
@@ -55,20 +55,23 @@ const NavBar: React.FC<NavBarProps> = ({ navigation, logo, title, subtitle, vers
|
|
|
55
55
|
|
|
56
56
|
return (
|
|
57
57
|
<Drawer
|
|
58
|
-
sx={
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
...
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
58
|
+
sx={
|
|
59
|
+
{
|
|
60
|
+
width: drawerWidth,
|
|
61
|
+
flexShrink: 0,
|
|
62
|
+
whiteSpace: "nowrap",
|
|
63
|
+
boxSizing: "border-box",
|
|
64
|
+
...(open
|
|
65
|
+
? {
|
|
66
|
+
...openedMixin(theme),
|
|
67
|
+
"& .MuiDrawer-paper": openedMixin(theme),
|
|
68
|
+
}
|
|
69
|
+
: {
|
|
70
|
+
...closedMixin(theme),
|
|
71
|
+
"& .MuiDrawer-paper": closedMixin(theme),
|
|
72
|
+
}),
|
|
73
|
+
} as any
|
|
74
|
+
}
|
|
72
75
|
anchor="left"
|
|
73
76
|
variant="permanent"
|
|
74
77
|
open={open}
|
|
@@ -33,7 +33,7 @@ const NavBarRoutes: React.FC<NavBarRoutesProps> = ({ navigation, open }) => {
|
|
|
33
33
|
setCustomRoutes(
|
|
34
34
|
Object.values(navigation)
|
|
35
35
|
.filter((entry): entry is { route: RouteInfo } => Boolean(entry && entry?.route))
|
|
36
|
-
.map((entry) => entry.route)
|
|
36
|
+
.map((entry) => entry.route),
|
|
37
37
|
);
|
|
38
38
|
}, [navigation]);
|
|
39
39
|
|
|
@@ -68,7 +68,7 @@ const NavBarRoutes: React.FC<NavBarRoutesProps> = ({ navigation, open }) => {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
appItems.push(
|
|
71
|
-
<NavBarItem key={route.id} route={route} title={title} icon={icon} open={open}
|
|
71
|
+
<NavBarItem key={route.id} route={route} title={title} icon={icon} open={open} />,
|
|
72
72
|
);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
@@ -76,14 +76,14 @@ const NavBarRoutes: React.FC<NavBarRoutesProps> = ({ navigation, open }) => {
|
|
|
76
76
|
apps.push(
|
|
77
77
|
<List disablePadding key={app}>
|
|
78
78
|
{appItems}
|
|
79
|
-
</List
|
|
79
|
+
</List>,
|
|
80
80
|
);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
return apps;
|
|
84
84
|
}, [routes, navigation, open]);
|
|
85
85
|
|
|
86
|
-
return
|
|
86
|
+
return navItems;
|
|
87
87
|
};
|
|
88
88
|
|
|
89
89
|
export default NavBarRoutes;
|
package/src/components/User.tsx
CHANGED
|
@@ -56,7 +56,7 @@ const User: React.FC<UserProps> = ({ classes, open, icon }) => {
|
|
|
56
56
|
const UserIcon = icon ?? AccountCircleOutlinedIcon;
|
|
57
57
|
const [route, logoutText] = React.useMemo(
|
|
58
58
|
() => [getRoute("bananas.me:list"), getRoute("bananas.logout:create")!.title],
|
|
59
|
-
[routes]
|
|
59
|
+
[routes],
|
|
60
60
|
);
|
|
61
61
|
|
|
62
62
|
return user !== null && route !== undefined ? (
|
|
@@ -45,8 +45,8 @@ const ComponentLoader: React.FC<ComponentLoaderProps> = ({ operation, params, ..
|
|
|
45
45
|
throwError(
|
|
46
46
|
new DataLoadFailedError(
|
|
47
47
|
response,
|
|
48
|
-
`Data load failed with ${response.status} ${response.statusText}
|
|
49
|
-
)
|
|
48
|
+
`Data load failed with ${response.status} ${response.statusText}`,
|
|
49
|
+
),
|
|
50
50
|
);
|
|
51
51
|
}
|
|
52
52
|
})
|
|
@@ -39,7 +39,7 @@ const ErrorScreen: React.FC<ErrorScreenInnerProps> = ({ error }) => {
|
|
|
39
39
|
error.response.status >= 500
|
|
40
40
|
? "There's been an error. It's been reported to the site administrators via email and should be fixed shortly. Thanks for your patience."
|
|
41
41
|
: errorMessages[error.response.status] ?? "",
|
|
42
|
-
(user as unknown as Record<string, string>) ?? {}
|
|
42
|
+
(user as unknown as Record<string, string>) ?? {},
|
|
43
43
|
)}
|
|
44
44
|
</Typography>
|
|
45
45
|
) : null}
|
|
@@ -48,7 +48,7 @@ const styles = (theme: Theme) =>
|
|
|
48
48
|
margin: 0,
|
|
49
49
|
marginTop: theme.spacing(-36),
|
|
50
50
|
},
|
|
51
|
-
} as const
|
|
51
|
+
}) as const;
|
|
52
52
|
|
|
53
53
|
interface LoadingScreenInnerProps {
|
|
54
54
|
loading: boolean;
|
|
@@ -72,7 +72,7 @@ const LoadingScreenInner: React.FC<LoadingScreenInnerProps> = ({
|
|
|
72
72
|
[classes.backdrop, backdrop],
|
|
73
73
|
[classes.backdropPrimary, backdrop && color === "primary"],
|
|
74
74
|
[classes.backdropSecondary, backdrop && color === "secondary"],
|
|
75
|
-
[classes.backdropPaper, backdrop && color === "paper"]
|
|
75
|
+
[classes.backdropPaper, backdrop && color === "paper"],
|
|
76
76
|
)}
|
|
77
77
|
>
|
|
78
78
|
<Box sx={classes.logo}>{logo && <Logo src={logo} />}</Box>
|
|
@@ -67,7 +67,7 @@ const PageLoader: React.FC<PageLoaderProps> = ({
|
|
|
67
67
|
? request.query instanceof URLSearchParams
|
|
68
68
|
? request.query.entries()
|
|
69
69
|
: Object.entries(request.query)
|
|
70
|
-
: []
|
|
70
|
+
: [],
|
|
71
71
|
),
|
|
72
72
|
]),
|
|
73
73
|
})
|
|
@@ -78,8 +78,8 @@ const PageLoader: React.FC<PageLoaderProps> = ({
|
|
|
78
78
|
throwError(
|
|
79
79
|
new PageLoadFailedError(
|
|
80
80
|
response,
|
|
81
|
-
`Page data load failed with ${response.status} ${response.statusText}
|
|
82
|
-
)
|
|
81
|
+
`Page data load failed with ${response.status} ${response.statusText}`,
|
|
82
|
+
),
|
|
83
83
|
);
|
|
84
84
|
}
|
|
85
85
|
})
|
|
@@ -3,7 +3,7 @@ import React from "react";
|
|
|
3
3
|
import { useSnackbar } from "notistack";
|
|
4
4
|
|
|
5
5
|
import { ApiClient } from "../api";
|
|
6
|
-
import {
|
|
6
|
+
import { ContribComponentMap } from "../types";
|
|
7
7
|
import { getCookie } from "../util/get_cookie";
|
|
8
8
|
|
|
9
9
|
export interface ApiContextProviderProps {
|
|
@@ -16,7 +16,7 @@ export interface ApiContextProviderProps {
|
|
|
16
16
|
server?: string | URL;
|
|
17
17
|
prefix?: string;
|
|
18
18
|
};
|
|
19
|
-
contrib?:
|
|
19
|
+
contrib?: ContribComponentMap;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
const ApiContext = React.createContext<ApiClient>(undefined as unknown as ApiClient);
|
|
@@ -27,9 +27,6 @@ export const ApiContextProvider: React.FC<React.PropsWithChildren<ApiContextProv
|
|
|
27
27
|
api: init,
|
|
28
28
|
contrib,
|
|
29
29
|
}) => {
|
|
30
|
-
contrib ??= Array.isArray(contrib) ? contrib : [];
|
|
31
|
-
const contribMap = new Map(contrib.map(({ app, component }) => [app, component]));
|
|
32
|
-
|
|
33
30
|
const [api, setApi] = React.useState<ApiClient>();
|
|
34
31
|
const { enqueueSnackbar } = useSnackbar();
|
|
35
32
|
|
|
@@ -38,15 +35,20 @@ export const ApiContextProvider: React.FC<React.PropsWithChildren<ApiContextProv
|
|
|
38
35
|
(init instanceof ApiClient
|
|
39
36
|
? Promise.resolve(init)
|
|
40
37
|
: typeof init === "string" || init instanceof URL
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
? ApiClient.load(init)
|
|
39
|
+
: ApiClient.load(init.schema, init.server)
|
|
43
40
|
)
|
|
44
41
|
.then(async (api) => {
|
|
45
42
|
// Add a component for rendering the operation result if found.
|
|
46
43
|
for (const [tag, operations] of Object.entries(api.contrib)) {
|
|
47
|
-
for (const [
|
|
48
|
-
const hit =
|
|
49
|
-
|
|
44
|
+
for (const [_, operation] of Object.entries(operations)) {
|
|
45
|
+
const hit = contrib ? contrib[tag] : null;
|
|
46
|
+
if (hit != null) {
|
|
47
|
+
operation.component = {
|
|
48
|
+
title: hit.title,
|
|
49
|
+
component: hit.component(),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
54
|
|
|
@@ -5,13 +5,13 @@ import { useApi } from "./ApiContext";
|
|
|
5
5
|
|
|
6
6
|
export function interpolateString(
|
|
7
7
|
string: string,
|
|
8
|
-
params: Record<string, string> | string[]
|
|
8
|
+
params: Record<string, string> | string[],
|
|
9
9
|
): string {
|
|
10
10
|
return Array.isArray(params)
|
|
11
11
|
? params.reduce((s, value) => s.replace(/%[sd]|\{\}/, value), string)
|
|
12
12
|
: Object.entries(params).reduce(
|
|
13
13
|
(s, [key, value]) => s.replace(new RegExp(`%\\(${key}\\)[sd]|\\{${key}\\}`, "g"), value),
|
|
14
|
-
string
|
|
14
|
+
string,
|
|
15
15
|
);
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -38,7 +38,7 @@ interface RouterContext {
|
|
|
38
38
|
params?: RouterParams;
|
|
39
39
|
query?: RouterQuery;
|
|
40
40
|
replace?: boolean;
|
|
41
|
-
}
|
|
41
|
+
},
|
|
42
42
|
): void;
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -68,7 +68,7 @@ export const RouterContextProvider: React.FC<
|
|
|
68
68
|
const navigation = isNavigation(operation.tags);
|
|
69
69
|
const path = stripPathPrefix(
|
|
70
70
|
getPath(operation.endpoint, operation.method, action),
|
|
71
|
-
props.stripPathPrefix
|
|
71
|
+
props.stripPathPrefix,
|
|
72
72
|
);
|
|
73
73
|
const page = getPage(path, action);
|
|
74
74
|
routes.push({
|
|
@@ -86,7 +86,7 @@ export const RouterContextProvider: React.FC<
|
|
|
86
86
|
}, [api]);
|
|
87
87
|
const routes = useMemo<RouteInfo[]>(
|
|
88
88
|
() => customRoutes.concat(apiRoutes),
|
|
89
|
-
[customRoutes, apiRoutes]
|
|
89
|
+
[customRoutes, apiRoutes],
|
|
90
90
|
);
|
|
91
91
|
const routerNavigate = useNavigate();
|
|
92
92
|
const { enqueueSnackbar } = useSnackbar();
|
|
@@ -113,7 +113,7 @@ export const RouterContextProvider: React.FC<
|
|
|
113
113
|
params?: RouterParams;
|
|
114
114
|
query?: RouterQuery;
|
|
115
115
|
replace?: boolean;
|
|
116
|
-
}
|
|
116
|
+
},
|
|
117
117
|
) => {
|
|
118
118
|
// Relative history, e.g. go back or forward x steps
|
|
119
119
|
if (typeof route === "number") {
|
|
@@ -147,7 +147,7 @@ export const RouterContextProvider: React.FC<
|
|
|
147
147
|
pathname,
|
|
148
148
|
search: new URLSearchParams(options?.query).toString(),
|
|
149
149
|
},
|
|
150
|
-
{ replace: options?.replace }
|
|
150
|
+
{ replace: options?.replace },
|
|
151
151
|
);
|
|
152
152
|
};
|
|
153
153
|
|
|
@@ -20,7 +20,7 @@ interface UserContext {
|
|
|
20
20
|
changePassword: (
|
|
21
21
|
oldPassword: string,
|
|
22
22
|
newPassword1: string,
|
|
23
|
-
newPassword2: string
|
|
23
|
+
newPassword2: string,
|
|
24
24
|
) => Promise<void>;
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -59,7 +59,7 @@ export const UserContextProvider: React.FC<React.PropsWithChildren> = ({ childre
|
|
|
59
59
|
const changePassword = async (
|
|
60
60
|
oldPassword: string,
|
|
61
61
|
newPassword1: string,
|
|
62
|
-
newPassword2: string
|
|
62
|
+
newPassword2: string,
|
|
63
63
|
) => {
|
|
64
64
|
const response = await api?.operations["bananas.change_password:create"].call({
|
|
65
65
|
body: {
|