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.
Files changed (239) hide show
  1. package/.prettierignore +0 -3
  2. package/dist/cjs/Admin.js +15 -16
  3. package/dist/cjs/Admin.js.map +1 -1
  4. package/dist/cjs/App.js.map +1 -1
  5. package/dist/cjs/api.js +13 -0
  6. package/dist/cjs/api.js.map +1 -1
  7. package/dist/cjs/components/Link.js.map +1 -1
  8. package/dist/cjs/components/Logo.js.map +1 -1
  9. package/dist/cjs/components/NavBar.js +2 -1
  10. package/dist/cjs/components/NavBar.js.map +1 -1
  11. package/dist/cjs/components/NavBarRoutes.js +1 -1
  12. package/dist/cjs/components/NavBarRoutes.js.map +1 -1
  13. package/dist/cjs/components/TitleBar/index.js.map +1 -1
  14. package/dist/cjs/containers/ComponentLoader.js.map +1 -1
  15. package/dist/cjs/containers/LoadingScreen.js.map +1 -1
  16. package/dist/cjs/containers/PageErrorBoundary.js.map +1 -1
  17. package/dist/cjs/containers/PageLoader.js.map +1 -1
  18. package/dist/cjs/contexts/ApiContext.js +13 -14
  19. package/dist/cjs/contexts/ApiContext.js.map +1 -1
  20. package/dist/cjs/contexts/DialogContext.js.map +1 -1
  21. package/dist/cjs/contexts/I18nContext.js.map +1 -1
  22. package/dist/cjs/contexts/RouterContext.js.map +1 -1
  23. package/dist/cjs/contexts/UserContext.js.map +1 -1
  24. package/dist/cjs/extensions/bananas/index.js.map +1 -1
  25. package/dist/cjs/extensions/fulfillment/components/AddressInfo.js +7 -5
  26. package/dist/cjs/extensions/fulfillment/components/AddressInfo.js.map +1 -1
  27. package/dist/cjs/extensions/fulfillment/components/RecipientCard.js +18 -15
  28. package/dist/cjs/extensions/fulfillment/components/RecipientCard.js.map +1 -1
  29. package/dist/cjs/extensions/fulfillment/components/ReturnOrderItemProspectCard.js +1 -1
  30. package/dist/cjs/extensions/fulfillment/components/ReturnOrderItemProspectCard.js.map +1 -1
  31. package/dist/cjs/extensions/fulfillment/components/ShipmentCard.js +22 -37
  32. package/dist/cjs/extensions/fulfillment/components/ShipmentCard.js.map +1 -1
  33. package/dist/cjs/extensions/fulfillment/components/ShipmentDestinationButtons.js.map +1 -1
  34. package/dist/cjs/extensions/fulfillment/components/contrib/PurchaseOrderList.js +9 -10
  35. package/dist/cjs/extensions/fulfillment/components/contrib/PurchaseOrderList.js.map +1 -1
  36. package/dist/cjs/extensions/fulfillment/components/contrib/ReturnProspectList.js +1 -1
  37. package/dist/cjs/extensions/fulfillment/components/contrib/ReturnProspectList.js.map +1 -1
  38. package/dist/cjs/extensions/fulfillment/components/order/OrderAccordion.js.map +1 -1
  39. package/dist/cjs/extensions/fulfillment/components/order/OrderDestinationCard.js +38 -0
  40. package/dist/cjs/extensions/fulfillment/components/order/OrderDestinationCard.js.map +1 -0
  41. package/dist/cjs/extensions/fulfillment/components/order/OrderDetail.js +276 -0
  42. package/dist/cjs/extensions/fulfillment/components/order/OrderDetail.js.map +1 -0
  43. package/dist/cjs/extensions/fulfillment/components/order/OrderItemsTable.js.map +1 -1
  44. package/dist/cjs/extensions/fulfillment/components/order/OrderStateChip.js +1 -2
  45. package/dist/cjs/extensions/fulfillment/components/order/OrderStateChip.js.map +1 -1
  46. package/dist/cjs/extensions/fulfillment/index.js +21 -25
  47. package/dist/cjs/extensions/fulfillment/index.js.map +1 -1
  48. package/dist/cjs/extensions/fulfillment/pages/order/list.js.map +1 -1
  49. package/dist/cjs/extensions/pos/components/CustomerCard.js.map +1 -1
  50. package/dist/cjs/extensions/pos/components/ReceiptCard.js.map +1 -1
  51. package/dist/cjs/extensions/pos/components/ReceiptTable.js.map +1 -1
  52. package/dist/cjs/extensions/pos/components/SearchBar.js +1 -1
  53. package/dist/cjs/extensions/pos/components/SearchBar.js.map +1 -1
  54. package/dist/cjs/extensions/pos/index.js.map +1 -1
  55. package/dist/cjs/extensions/pos/pages/purchase/detail.js +6 -21
  56. package/dist/cjs/extensions/pos/pages/purchase/detail.js.map +1 -1
  57. package/dist/cjs/extensions/pos/pages/purchase/list.js.map +1 -1
  58. package/dist/cjs/extensions/pos/types/receipt.js +1 -1
  59. package/dist/cjs/extensions/pos/types/receipt.js.map +1 -1
  60. package/dist/cjs/extensions/report/components/PurchaseCard.js.map +1 -1
  61. package/dist/cjs/forms/LoginForm.js.map +1 -1
  62. package/dist/cjs/hooks/useLocalStorage.js.map +1 -1
  63. package/dist/cjs/pages/DashboardPage.js +1 -5
  64. package/dist/cjs/pages/DashboardPage.js.map +1 -1
  65. package/dist/cjs/router/Router.js.map +1 -1
  66. package/dist/cjs/router/routes.js.map +1 -1
  67. package/dist/cjs/util/format_purchase_number.js.map +1 -1
  68. package/dist/cjs/util/index.js.map +1 -1
  69. package/dist/cjs/util/is_positive_integer.js.map +1 -1
  70. package/dist/cjs/util/select_styles.js.map +1 -1
  71. package/dist/esm/Admin.js +15 -16
  72. package/dist/esm/Admin.js.map +1 -1
  73. package/dist/esm/App.js.map +1 -1
  74. package/dist/esm/api.js +13 -0
  75. package/dist/esm/api.js.map +1 -1
  76. package/dist/esm/components/Link.js.map +1 -1
  77. package/dist/esm/components/Logo.js.map +1 -1
  78. package/dist/esm/components/NavBar.js +2 -1
  79. package/dist/esm/components/NavBar.js.map +1 -1
  80. package/dist/esm/components/NavBarRoutes.js +1 -1
  81. package/dist/esm/components/NavBarRoutes.js.map +1 -1
  82. package/dist/esm/components/TitleBar/index.js.map +1 -1
  83. package/dist/esm/containers/ComponentLoader.js.map +1 -1
  84. package/dist/esm/containers/LoadingScreen.js.map +1 -1
  85. package/dist/esm/containers/PageErrorBoundary.js.map +1 -1
  86. package/dist/esm/containers/PageLoader.js.map +1 -1
  87. package/dist/esm/contexts/ApiContext.js +13 -14
  88. package/dist/esm/contexts/ApiContext.js.map +1 -1
  89. package/dist/esm/contexts/DialogContext.js.map +1 -1
  90. package/dist/esm/contexts/I18nContext.js.map +1 -1
  91. package/dist/esm/contexts/RouterContext.js.map +1 -1
  92. package/dist/esm/contexts/UserContext.js.map +1 -1
  93. package/dist/esm/extensions/bananas/index.js.map +1 -1
  94. package/dist/esm/extensions/fulfillment/components/AddressInfo.js +7 -5
  95. package/dist/esm/extensions/fulfillment/components/AddressInfo.js.map +1 -1
  96. package/dist/esm/extensions/fulfillment/components/RecipientCard.js +18 -15
  97. package/dist/esm/extensions/fulfillment/components/RecipientCard.js.map +1 -1
  98. package/dist/esm/extensions/fulfillment/components/ReturnOrderItemProspectCard.js +1 -1
  99. package/dist/esm/extensions/fulfillment/components/ReturnOrderItemProspectCard.js.map +1 -1
  100. package/dist/esm/extensions/fulfillment/components/ShipmentCard.js +22 -37
  101. package/dist/esm/extensions/fulfillment/components/ShipmentCard.js.map +1 -1
  102. package/dist/esm/extensions/fulfillment/components/ShipmentDestinationButtons.js.map +1 -1
  103. package/dist/esm/extensions/fulfillment/components/contrib/PurchaseOrderList.js +9 -10
  104. package/dist/esm/extensions/fulfillment/components/contrib/PurchaseOrderList.js.map +1 -1
  105. package/dist/esm/extensions/fulfillment/components/contrib/ReturnProspectList.js +1 -1
  106. package/dist/esm/extensions/fulfillment/components/contrib/ReturnProspectList.js.map +1 -1
  107. package/dist/esm/extensions/fulfillment/components/order/OrderAccordion.js.map +1 -1
  108. package/dist/esm/extensions/fulfillment/components/order/OrderDestinationCard.js +31 -0
  109. package/dist/esm/extensions/fulfillment/components/order/OrderDestinationCard.js.map +1 -0
  110. package/dist/esm/extensions/fulfillment/components/order/OrderDetail.js +248 -0
  111. package/dist/esm/extensions/fulfillment/components/order/OrderDetail.js.map +1 -0
  112. package/dist/esm/extensions/fulfillment/components/order/OrderItemsTable.js.map +1 -1
  113. package/dist/esm/extensions/fulfillment/components/order/OrderStateChip.js +1 -2
  114. package/dist/esm/extensions/fulfillment/components/order/OrderStateChip.js.map +1 -1
  115. package/dist/esm/extensions/fulfillment/index.js +21 -25
  116. package/dist/esm/extensions/fulfillment/index.js.map +1 -1
  117. package/dist/esm/extensions/fulfillment/pages/order/list.js.map +1 -1
  118. package/dist/esm/extensions/pos/components/CustomerCard.js.map +1 -1
  119. package/dist/esm/extensions/pos/components/ReceiptCard.js.map +1 -1
  120. package/dist/esm/extensions/pos/components/ReceiptTable.js.map +1 -1
  121. package/dist/esm/extensions/pos/components/SearchBar.js +1 -1
  122. package/dist/esm/extensions/pos/components/SearchBar.js.map +1 -1
  123. package/dist/esm/extensions/pos/index.js.map +1 -1
  124. package/dist/esm/extensions/pos/pages/purchase/detail.js +6 -21
  125. package/dist/esm/extensions/pos/pages/purchase/detail.js.map +1 -1
  126. package/dist/esm/extensions/pos/pages/purchase/list.js.map +1 -1
  127. package/dist/esm/extensions/report/components/PurchaseCard.js.map +1 -1
  128. package/dist/esm/forms/LoginForm.js.map +1 -1
  129. package/dist/esm/hooks/useLocalStorage.js.map +1 -1
  130. package/dist/esm/pages/DashboardPage.js +1 -2
  131. package/dist/esm/pages/DashboardPage.js.map +1 -1
  132. package/dist/esm/router/Router.js.map +1 -1
  133. package/dist/esm/router/routes.js.map +1 -1
  134. package/dist/esm/util/format_purchase_number.js.map +1 -1
  135. package/dist/esm/util/index.js.map +1 -1
  136. package/dist/esm/util/is_positive_integer.js.map +1 -1
  137. package/dist/esm/util/select_styles.js.map +1 -1
  138. package/dist/types/App.d.ts +2 -2
  139. package/dist/types/api.d.ts +1 -0
  140. package/dist/types/components/User.d.ts +34 -17
  141. package/dist/types/containers/PageErrorBoundary.d.ts +1 -1
  142. package/dist/types/contexts/ApiContext.d.ts +2 -2
  143. package/dist/types/contexts/DialogContext.d.ts +2 -2
  144. package/dist/types/extensions/fulfillment/components/AddressInfo.d.ts +1 -0
  145. package/dist/types/extensions/fulfillment/components/RecipientCard.d.ts +3 -1
  146. package/dist/types/extensions/fulfillment/components/ShipmentCard.d.ts +3 -2
  147. package/dist/types/extensions/fulfillment/components/order/OrderDestinationCard.d.ts +7 -0
  148. package/dist/types/extensions/fulfillment/components/order/OrderDetail.d.ts +7 -0
  149. package/dist/types/extensions/fulfillment/components/order/OrderStateChip.d.ts +2 -2
  150. package/dist/types/extensions/fulfillment/index.d.ts +2 -2
  151. package/dist/types/extensions/fulfillment/types/order.d.ts +6 -5
  152. package/dist/types/extensions/fulfillment/types/recipient.d.ts +1 -5
  153. package/dist/types/extensions/fulfillment/types/shipment.d.ts +2 -57
  154. package/dist/types/extensions/pos/types/purchase.d.ts +1 -0
  155. package/dist/types/types/index.d.ts +4 -4
  156. package/package.json +25 -47
  157. package/src/Admin.tsx +36 -38
  158. package/src/App.tsx +2 -2
  159. package/src/api.ts +19 -5
  160. package/src/components/Branding.tsx +1 -1
  161. package/src/components/NavBar.tsx +17 -14
  162. package/src/components/NavBarRoutes.tsx +4 -4
  163. package/src/components/User.tsx +1 -1
  164. package/src/containers/ComponentLoader.tsx +2 -2
  165. package/src/containers/ErrorScreen.tsx +1 -1
  166. package/src/containers/LoadingScreen.tsx +2 -2
  167. package/src/containers/PageLoader.tsx +3 -3
  168. package/src/contexts/ApiContext.tsx +12 -10
  169. package/src/contexts/DialogContext.tsx +1 -1
  170. package/src/contexts/I18nContext.tsx +2 -2
  171. package/src/contexts/RouterContext.tsx +5 -5
  172. package/src/contexts/UserContext.tsx +2 -2
  173. package/src/extensions/bananas/components/PasswordChangeForm.tsx +1 -1
  174. package/src/extensions/fulfillment/components/AddressInfo.tsx +9 -5
  175. package/src/extensions/fulfillment/components/RecipientCard.tsx +47 -22
  176. package/src/extensions/fulfillment/components/ReturnOrderItemProspectCard.tsx +3 -1
  177. package/src/extensions/fulfillment/components/ShipmentCard.tsx +57 -63
  178. package/src/extensions/fulfillment/components/ShipmentDestinationButtons.tsx +2 -2
  179. package/src/extensions/fulfillment/components/contrib/PurchaseOrderList.tsx +21 -23
  180. package/src/extensions/fulfillment/components/contrib/ReturnProspectList.tsx +4 -3
  181. package/src/extensions/fulfillment/components/order/OrderAccordion.tsx +2 -2
  182. package/src/extensions/fulfillment/components/order/OrderDestinationCard.tsx +68 -0
  183. package/src/extensions/fulfillment/components/order/OrderDetail.tsx +262 -0
  184. package/src/extensions/fulfillment/components/order/OrderStateChip.tsx +1 -1
  185. package/src/extensions/fulfillment/index.tsx +13 -35
  186. package/src/extensions/fulfillment/types/order.ts +7 -5
  187. package/src/extensions/fulfillment/types/recipient.ts +1 -6
  188. package/src/extensions/fulfillment/types/shipment.ts +2 -60
  189. package/src/extensions/pos/components/ReceiptCard.tsx +1 -1
  190. package/src/extensions/pos/components/ReceiptTable.tsx +4 -4
  191. package/src/extensions/pos/components/SearchBar.tsx +2 -2
  192. package/src/extensions/pos/pages/purchase/detail.tsx +8 -12
  193. package/src/extensions/pos/pages/purchase/list.tsx +1 -1
  194. package/src/extensions/pos/types/purchase.ts +1 -0
  195. package/src/hooks/useAsyncError.ts +1 -1
  196. package/src/pages/DashboardPage.tsx +1 -1
  197. package/src/router/routes.ts +2 -2
  198. package/src/types/index.ts +8 -4
  199. package/src/util/select_styles.ts +1 -1
  200. package/tsconfig.json +2 -2
  201. package/.eslintignore +0 -5
  202. package/.eslintrc +0 -36
  203. package/.prettierrc +0 -6
  204. package/README.md +0 -52
  205. package/dist/cjs/extensions/fulfillment/components/ContactInfo.js +0 -21
  206. package/dist/cjs/extensions/fulfillment/components/ContactInfo.js.map +0 -1
  207. package/dist/cjs/extensions/fulfillment/components/ShipmentAccordion.js +0 -215
  208. package/dist/cjs/extensions/fulfillment/components/ShipmentAccordion.js.map +0 -1
  209. package/dist/cjs/extensions/fulfillment/components/ShipmentItemsCard.js +0 -131
  210. package/dist/cjs/extensions/fulfillment/components/ShipmentItemsCard.js.map +0 -1
  211. package/dist/cjs/extensions/fulfillment/components/ShipmentItemsTable.js +0 -85
  212. package/dist/cjs/extensions/fulfillment/components/ShipmentItemsTable.js.map +0 -1
  213. package/dist/cjs/extensions/fulfillment/components/ShipmentRow.js +0 -29
  214. package/dist/cjs/extensions/fulfillment/components/ShipmentRow.js.map +0 -1
  215. package/dist/esm/extensions/fulfillment/components/ContactInfo.js +0 -14
  216. package/dist/esm/extensions/fulfillment/components/ContactInfo.js.map +0 -1
  217. package/dist/esm/extensions/fulfillment/components/ShipmentAccordion.js +0 -208
  218. package/dist/esm/extensions/fulfillment/components/ShipmentAccordion.js.map +0 -1
  219. package/dist/esm/extensions/fulfillment/components/ShipmentItemsCard.js +0 -124
  220. package/dist/esm/extensions/fulfillment/components/ShipmentItemsCard.js.map +0 -1
  221. package/dist/esm/extensions/fulfillment/components/ShipmentItemsTable.js +0 -78
  222. package/dist/esm/extensions/fulfillment/components/ShipmentItemsTable.js.map +0 -1
  223. package/dist/esm/extensions/fulfillment/components/ShipmentRow.js +0 -22
  224. package/dist/esm/extensions/fulfillment/components/ShipmentRow.js.map +0 -1
  225. package/dist/types/extensions/fulfillment/components/ContactInfo.d.ts +0 -7
  226. package/dist/types/extensions/fulfillment/components/ShipmentAccordion.d.ts +0 -7
  227. package/dist/types/extensions/fulfillment/components/ShipmentItemsCard.d.ts +0 -6
  228. package/dist/types/extensions/fulfillment/components/ShipmentItemsTable.d.ts +0 -8
  229. package/dist/types/extensions/fulfillment/components/ShipmentRow.d.ts +0 -7
  230. package/example/index.tsx +0 -31
  231. package/example/package-lock.json +0 -8813
  232. package/example/package.json +0 -50
  233. package/example/scripts/build.js +0 -4
  234. package/example/scripts/options.js +0 -74
  235. package/src/extensions/fulfillment/components/ContactInfo.tsx +0 -33
  236. package/src/extensions/fulfillment/components/ShipmentAccordion.tsx +0 -209
  237. package/src/extensions/fulfillment/components/ShipmentItemsCard.tsx +0 -170
  238. package/src/extensions/fulfillment/components/ShipmentItemsTable.tsx +0 -116
  239. 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
- date_confirmed?: string;
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
  }
@@ -11,6 +11,7 @@ export interface PurchaseDetail {
11
11
  country_code: string;
12
12
  given_name?: string;
13
13
  family_name?: string;
14
+ company_name?: string;
14
15
  email: string;
15
16
  phone?: string;
16
17
  total_debit_amount?: string;
@@ -19,7 +19,7 @@ export interface PageContribComponent {
19
19
  title?: string;
20
20
  component: ContribComponent | Promise<ContribComponent>;
21
21
  }
22
- export interface ContribComponents {
23
- app: string;
24
- component: (tag: string) => PageContribComponent | undefined;
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.21",
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": "eslint .",
36
- "lint:fix": "eslint --fix .",
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
- "@apidevtools/swagger-parser": "^10.1.0",
42
- "@babel/core": "^7.21.3",
43
- "@babel/preset-typescript": "^7.21.0",
44
- "@emotion/react": "^11.10.6",
45
- "@emotion/styled": "^11.10.6",
46
- "@mui/icons-material": "^5.11.16",
47
- "@mui/lab": "^5.0.0-alpha.131",
48
- "@mui/material": "^5.13.2",
49
- "@mui/system": "^5.13.2",
50
- "@mui/x-date-pickers": "^6.5.0",
51
- "@storybook/addon-actions": "^7.0.0-rc.7",
52
- "@storybook/addon-essentials": "^7.0.0-rc.7",
53
- "@storybook/addon-interactions": "^7.0.0-rc.7",
54
- "@storybook/addon-links": "^7.0.0-rc.7",
55
- "@storybook/react": "^7.0.0-rc.7",
56
- "@storybook/react-webpack5": "^7.0.0-rc.7",
57
- "@storybook/testing-library": "^0.0.14-next.1",
58
- "@types/luxon": "^3.3.0",
59
- "@types/node": "^18.15.5",
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.24",
99
- "luxon": "^3.3.0"
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
- <Box
58
- sx={{
59
- display: "flex",
60
- position: "fixed",
61
- top: 0,
62
- left: 0,
63
- width: "100%",
64
- height: "100%",
65
- flexDirection: "column",
66
- }}
67
- >
68
- {loaded ? (
69
- user !== null ? (
70
- <BrowserRouter basename={basename}>
71
- <RouterContextProvider stripPathPrefix={basepath}>
72
- <DialogContextProvider>
73
- <BcomDialog />
74
- <Box sx={{ display: "flex" }}>
75
- <NavBar
76
- navigation={navigation}
77
- logo={logo}
78
- title={title}
79
- subtitle={subtitle}
80
- version={version}
81
- />
82
- <Router extensions={extensions} dashboard={dashboard} />
83
- </Box>
84
- </DialogContextProvider>
85
- </RouterContextProvider>
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
- <LoadingScreen logo={logo} loading={!loaded} />
92
- )}
93
- </Box>
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 { ContribComponents } from "./types";
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?: ContribComponents[];
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
  }
@@ -38,7 +38,7 @@ const Branding: React.FC<BrandingProps> = ({
38
38
  flexGrow: 1,
39
39
  },
40
40
  [{ width: "100%" }, fullWidth ?? false],
41
- sx
41
+ sx,
42
42
  )}
43
43
  >
44
44
  <ButtonBase
@@ -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
- width: drawerWidth,
60
- flexShrink: 0,
61
- whiteSpace: "nowrap",
62
- boxSizing: "border-box",
63
- ...(open && {
64
- ...openedMixin(theme),
65
- "& .MuiDrawer-paper": openedMixin(theme),
66
- }),
67
- ...(!open && {
68
- ...closedMixin(theme),
69
- "& .MuiDrawer-paper": closedMixin(theme),
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 <>{navItems}</>;
86
+ return navItems;
87
87
  };
88
88
 
89
89
  export default NavBarRoutes;
@@ -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 { ContribComponents } from "../types";
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?: ContribComponents[];
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
- ? ApiClient.load(init)
42
- : ApiClient.load(init.schema, init.server)
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 [app, operation] of Object.entries(operations)) {
48
- const hit = contribMap.get(app)?.(tag);
49
- operation.component = hit;
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
 
@@ -14,7 +14,7 @@ const DialogContext = React.createContext<{
14
14
  makeOpen: (
15
15
  title: string,
16
16
  children: React.ReactNode,
17
- options?: { ok?: string; cancel?: string }
17
+ options?: { ok?: string; cancel?: string },
18
18
  ) => Promise<boolean>;
19
19
  ok: string;
20
20
  cancel: string;
@@ -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: {