bananas-commerce-admin 0.1.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 (188) hide show
  1. package/README.md +25 -0
  2. package/dist/cjs/Admin.js +47 -0
  3. package/dist/cjs/App.js +49 -0
  4. package/dist/cjs/api.js +225 -0
  5. package/dist/cjs/components/Branding.js +41 -0
  6. package/dist/cjs/components/Hamburger.js +40 -0
  7. package/dist/cjs/components/Link.js +21 -0
  8. package/dist/cjs/components/Logo.js +25 -0
  9. package/dist/cjs/components/NavBar.js +101 -0
  10. package/dist/cjs/components/NavBarItem.js +42 -0
  11. package/dist/cjs/components/NavBarRoutes.js +47 -0
  12. package/dist/cjs/components/ProgressBar.js +14 -0
  13. package/dist/cjs/components/User.js +71 -0
  14. package/dist/cjs/containers/Content.js +16 -0
  15. package/dist/cjs/containers/ErrorScreen.js +35 -0
  16. package/dist/cjs/containers/LoadingScreen.js +84 -0
  17. package/dist/cjs/containers/PageErrorBoundary.js +43 -0
  18. package/dist/cjs/containers/PageLoader.js +123 -0
  19. package/dist/cjs/contexts/ApiContext.js +105 -0
  20. package/dist/cjs/contexts/I18nContext.js +109 -0
  21. package/dist/cjs/contexts/RouterContext.js +99 -0
  22. package/dist/cjs/contexts/UserContext.js +144 -0
  23. package/dist/cjs/extensions/bananas/components/PasswordChangeForm.js +85 -0
  24. package/dist/cjs/extensions/bananas/index.js +54 -0
  25. package/dist/cjs/extensions/bananas/pages/me/list.js +20 -0
  26. package/dist/cjs/extensions/pos/components/PurchaseRow.js +32 -0
  27. package/dist/cjs/extensions/pos/components/ReceiptCard.js +86 -0
  28. package/dist/cjs/extensions/pos/components/ReceiptLine.js +29 -0
  29. package/dist/cjs/extensions/pos/index.js +22 -0
  30. package/dist/cjs/extensions/pos/pages/purchase/detail.js +13 -0
  31. package/dist/cjs/extensions/pos/pages/purchase/list.js +34 -0
  32. package/dist/cjs/extensions/pos/types/purchase.js +2 -0
  33. package/dist/cjs/extensions/pos/types/receipt.js +2 -0
  34. package/dist/cjs/forms/LoginForm.js +63 -0
  35. package/dist/cjs/hooks/useAsyncError.js +15 -0
  36. package/dist/cjs/hooks/useLocalStorage.js +47 -0
  37. package/dist/cjs/index.js +40 -0
  38. package/dist/cjs/pages/DashboardPage.js +10 -0
  39. package/dist/cjs/pages/LoginPage.js +31 -0
  40. package/dist/cjs/router/Router.js +35 -0
  41. package/dist/cjs/router/routes.js +57 -0
  42. package/dist/cjs/types/index.js +2 -0
  43. package/dist/cjs/util/get_cookie.js +10 -0
  44. package/dist/cjs/util/index.js +62 -0
  45. package/dist/cjs/util/select_styles.js +38 -0
  46. package/dist/esm/Admin.js +42 -0
  47. package/dist/esm/App.js +44 -0
  48. package/dist/esm/api.js +219 -0
  49. package/dist/esm/components/Branding.js +36 -0
  50. package/dist/esm/components/Hamburger.js +35 -0
  51. package/dist/esm/components/Link.js +16 -0
  52. package/dist/esm/components/Logo.js +20 -0
  53. package/dist/esm/components/NavBar.js +73 -0
  54. package/dist/esm/components/NavBarItem.js +37 -0
  55. package/dist/esm/components/NavBarRoutes.js +42 -0
  56. package/dist/esm/components/ProgressBar.js +9 -0
  57. package/dist/esm/components/User.js +66 -0
  58. package/dist/esm/containers/Content.js +11 -0
  59. package/dist/esm/containers/ErrorScreen.js +30 -0
  60. package/dist/esm/containers/LoadingScreen.js +79 -0
  61. package/dist/esm/containers/PageErrorBoundary.js +38 -0
  62. package/dist/esm/containers/PageLoader.js +117 -0
  63. package/dist/esm/contexts/ApiContext.js +77 -0
  64. package/dist/esm/contexts/I18nContext.js +77 -0
  65. package/dist/esm/contexts/RouterContext.js +71 -0
  66. package/dist/esm/contexts/UserContext.js +113 -0
  67. package/dist/esm/extensions/bananas/components/PasswordChangeForm.js +80 -0
  68. package/dist/esm/extensions/bananas/index.js +48 -0
  69. package/dist/esm/extensions/bananas/pages/me/list.js +15 -0
  70. package/dist/esm/extensions/pos/components/PurchaseRow.js +25 -0
  71. package/dist/esm/extensions/pos/components/ReceiptCard.js +56 -0
  72. package/dist/esm/extensions/pos/components/ReceiptLine.js +22 -0
  73. package/dist/esm/extensions/pos/index.js +16 -0
  74. package/dist/esm/extensions/pos/pages/purchase/detail.js +8 -0
  75. package/dist/esm/extensions/pos/pages/purchase/list.js +29 -0
  76. package/dist/esm/extensions/pos/types/purchase.js +1 -0
  77. package/dist/esm/extensions/pos/types/receipt.js +1 -0
  78. package/dist/esm/forms/LoginForm.js +58 -0
  79. package/dist/esm/hooks/useAsyncError.js +9 -0
  80. package/dist/esm/hooks/useLocalStorage.js +41 -0
  81. package/dist/esm/index.js +14 -0
  82. package/dist/esm/pages/DashboardPage.js +5 -0
  83. package/dist/esm/pages/LoginPage.js +26 -0
  84. package/dist/esm/router/Router.js +28 -0
  85. package/dist/esm/router/routes.js +49 -0
  86. package/dist/esm/types/index.js +1 -0
  87. package/dist/esm/util/get_cookie.js +6 -0
  88. package/dist/esm/util/index.js +54 -0
  89. package/dist/esm/util/select_styles.js +34 -0
  90. package/dist/types/Admin.d.ts +13 -0
  91. package/dist/types/App.d.ts +13 -0
  92. package/dist/types/api.d.ts +20 -0
  93. package/dist/types/components/Branding.d.ts +14 -0
  94. package/dist/types/components/Hamburger.d.ts +8 -0
  95. package/dist/types/components/Link.d.ts +9 -0
  96. package/dist/types/components/Logo.d.ts +7 -0
  97. package/dist/types/components/NavBar.d.ts +11 -0
  98. package/dist/types/components/NavBarItem.d.ts +12 -0
  99. package/dist/types/components/NavBarRoutes.d.ts +7 -0
  100. package/dist/types/components/ProgressBar.d.ts +7 -0
  101. package/dist/types/components/User.d.ts +824 -0
  102. package/dist/types/containers/Content.d.ts +3 -0
  103. package/dist/types/containers/ErrorScreen.d.ts +7 -0
  104. package/dist/types/containers/LoadingScreen.d.ts +50 -0
  105. package/dist/types/containers/PageErrorBoundary.d.ts +16 -0
  106. package/dist/types/containers/PageLoader.d.ts +13 -0
  107. package/dist/types/contexts/ApiContext.d.ts +12 -0
  108. package/dist/types/contexts/I18nContext.d.ts +10 -0
  109. package/dist/types/contexts/RouterContext.d.ts +24 -0
  110. package/dist/types/contexts/UserContext.d.ts +20 -0
  111. package/dist/types/extensions/bananas/components/PasswordChangeForm.d.ts +3 -0
  112. package/dist/types/extensions/bananas/index.d.ts +2 -0
  113. package/dist/types/extensions/bananas/pages/me/list.d.ts +6 -0
  114. package/dist/types/extensions/pos/components/PurchaseRow.d.ts +7 -0
  115. package/dist/types/extensions/pos/components/ReceiptCard.d.ts +7 -0
  116. package/dist/types/extensions/pos/components/ReceiptLine.d.ts +7 -0
  117. package/dist/types/extensions/pos/index.d.ts +2 -0
  118. package/dist/types/extensions/pos/pages/purchase/detail.d.ts +7 -0
  119. package/dist/types/extensions/pos/pages/purchase/list.d.ts +9 -0
  120. package/dist/types/extensions/pos/types/purchase.d.ts +18 -0
  121. package/dist/types/extensions/pos/types/receipt.d.ts +34 -0
  122. package/dist/types/forms/LoginForm.d.ts +3 -0
  123. package/dist/types/hooks/useAsyncError.d.ts +1 -0
  124. package/dist/types/hooks/useLocalStorage.d.ts +2 -0
  125. package/dist/types/index.d.ts +14 -0
  126. package/dist/types/pages/DashboardPage.d.ts +5 -0
  127. package/dist/types/pages/LoginPage.d.ts +9 -0
  128. package/dist/types/router/Router.d.ts +13 -0
  129. package/dist/types/router/routes.d.ts +20 -0
  130. package/dist/types/types/index.d.ts +6 -0
  131. package/dist/types/util/get_cookie.d.ts +1 -0
  132. package/dist/types/util/index.d.ts +8 -0
  133. package/dist/types/util/select_styles.d.ts +3 -0
  134. package/example/Dockerfile +27 -0
  135. package/example/docker-compose.yml +7 -0
  136. package/example/index.html +13 -0
  137. package/example/index.tsx +21 -0
  138. package/example/package-lock.json +13167 -0
  139. package/example/package.json +52 -0
  140. package/example/pages/.gitkeep +0 -0
  141. package/example/webpack.config.js +67 -0
  142. package/package.json +52 -0
  143. package/src/Admin.tsx +94 -0
  144. package/src/App.tsx +43 -0
  145. package/src/api.ts +202 -0
  146. package/src/components/Branding.tsx +79 -0
  147. package/src/components/Hamburger.tsx +41 -0
  148. package/src/components/Link.tsx +23 -0
  149. package/src/components/Logo.tsx +57 -0
  150. package/src/components/NavBar.tsx +115 -0
  151. package/src/components/NavBarItem.tsx +73 -0
  152. package/src/components/NavBarRoutes.tsx +67 -0
  153. package/src/components/ProgressBar.tsx +30 -0
  154. package/src/components/User.tsx +97 -0
  155. package/src/containers/Content.tsx +18 -0
  156. package/src/containers/ErrorScreen.tsx +64 -0
  157. package/src/containers/LoadingScreen.tsx +135 -0
  158. package/src/containers/PageErrorBoundary.tsx +32 -0
  159. package/src/containers/PageLoader.tsx +64 -0
  160. package/src/contexts/ApiContext.tsx +55 -0
  161. package/src/contexts/I18nContext.tsx +55 -0
  162. package/src/contexts/RouterContext.tsx +127 -0
  163. package/src/contexts/UserContext.tsx +99 -0
  164. package/src/extensions/bananas/components/PasswordChangeForm.tsx +138 -0
  165. package/src/extensions/bananas/index.ts +14 -0
  166. package/src/extensions/bananas/pages/me/list.tsx +31 -0
  167. package/src/extensions/pos/components/PurchaseRow.tsx +42 -0
  168. package/src/extensions/pos/components/ReceiptCard.tsx +101 -0
  169. package/src/extensions/pos/components/ReceiptLine.tsx +51 -0
  170. package/src/extensions/pos/index.tsx +20 -0
  171. package/src/extensions/pos/pages/purchase/detail.tsx +22 -0
  172. package/src/extensions/pos/pages/purchase/list.tsx +56 -0
  173. package/src/extensions/pos/types/purchase.ts +20 -0
  174. package/src/extensions/pos/types/receipt.ts +36 -0
  175. package/src/forms/LoginForm.tsx +99 -0
  176. package/src/hooks/useAsyncError.ts +13 -0
  177. package/src/hooks/useLocalStorage.ts +42 -0
  178. package/src/index.ts +18 -0
  179. package/src/pages/DashboardPage.tsx +9 -0
  180. package/src/pages/LoginPage.tsx +50 -0
  181. package/src/router/Router.tsx +63 -0
  182. package/src/router/routes.ts +67 -0
  183. package/src/types/index.ts +4 -0
  184. package/src/types/swagger-client.d.ts +1 -0
  185. package/src/util/get_cookie.ts +6 -0
  186. package/src/util/index.ts +63 -0
  187. package/src/util/select_styles.ts +29 -0
  188. package/tsconfig.json +38 -0
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Bananas-commerce-admin
2
+
3
+ Bananas-commerce-admin is an new and updated version of
4
+ [django-bananas.js](https://github.com/5monkeys/django-bananas.js) operating
5
+ with the same routing and apis, but updated to use typescript and react hooks as
6
+ much as possible. It still contains some legacy code and logic from the old
7
+ admin but is much more user friendly and looks just about the same.
8
+
9
+ ## Development
10
+
11
+ In the tld run:
12
+
13
+ ```sh
14
+ $ npm ci && npm run build:esm:watch
15
+ ```
16
+
17
+ And in the example project run:
18
+
19
+ ```sh
20
+ $ npm ci && npm link ../node_modules/react && npm run start
21
+ ```
22
+
23
+ Due to npm being weird and duplicating dependencies, you need to run:
24
+ `npm link ../node_modules/react` for it to work properly with the example app,
25
+ although this is only as long as it is during local development.
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var react_router_dom_1 = require("react-router-dom");
8
+ var Box_1 = __importDefault(require("@mui/material/Box"));
9
+ var NavBar_1 = __importDefault(require("./components/NavBar"));
10
+ var LoadingScreen_1 = __importDefault(require("./containers/LoadingScreen"));
11
+ var ApiContext_1 = require("./contexts/ApiContext");
12
+ var I18nContext_1 = require("./contexts/I18nContext");
13
+ var RouterContext_1 = require("./contexts/RouterContext");
14
+ var UserContext_1 = require("./contexts/UserContext");
15
+ var LoginPage_1 = __importDefault(require("./pages/LoginPage"));
16
+ var Router_1 = require("./router/Router");
17
+ var Admin = function (_a) {
18
+ var logo = _a.logo, title = _a.title, subtitle = _a.subtitle, version = _a.version, nav = _a.nav, pages = _a.pages, extensions = _a.extensions, dashboard = _a.dashboard, basename = _a.basename;
19
+ var _b = react_1.default.useState(false), loaded = _b[0], setLoaded = _b[1];
20
+ var api = (0, ApiContext_1.useApi)();
21
+ var i18n = (0, I18nContext_1.useI18n)();
22
+ var user = (0, UserContext_1.useUser)().user;
23
+ react_1.default.useEffect(function () {
24
+ if (!loaded && api !== undefined && i18n !== undefined && user !== undefined) {
25
+ setLoaded(true);
26
+ }
27
+ }, [loaded, api, i18n, user]);
28
+ return (react_1.default.createElement(react_1.default.Fragment, null,
29
+ react_1.default.createElement(Box_1.default, { sx: {
30
+ display: "flex",
31
+ position: "fixed",
32
+ top: 0,
33
+ left: 0,
34
+ width: "100%",
35
+ height: "100%",
36
+ flexDirection: "column",
37
+ } }, loaded
38
+ ? user !== null
39
+ ? (react_1.default.createElement(react_router_dom_1.BrowserRouter, { basename: basename },
40
+ react_1.default.createElement(RouterContext_1.RouterContextProvider, null,
41
+ react_1.default.createElement(Box_1.default, { sx: { display: "flex" } },
42
+ react_1.default.createElement(NavBar_1.default, { nav: nav, logo: logo, title: title, subtitle: subtitle, version: version }),
43
+ react_1.default.createElement(Router_1.Router, { pages: pages, extensions: extensions, dashboard: dashboard })))))
44
+ : react_1.default.createElement(LoginPage_1.default, { logo: logo, title: title })
45
+ : react_1.default.createElement(LoadingScreen_1.default, { logo: logo, loading: !loaded }))));
46
+ };
47
+ exports.default = Admin;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ var react_1 = __importDefault(require("react"));
29
+ var CssBaseline_1 = __importDefault(require("@mui/material/CssBaseline"));
30
+ var styles_1 = require("@mui/material/styles");
31
+ var Admin_1 = __importDefault(require("./Admin"));
32
+ var ApiContext_1 = require("./contexts/ApiContext");
33
+ var UserContext_1 = require("./contexts/UserContext");
34
+ var I18nContext_1 = require("./contexts/I18nContext");
35
+ var notistack_1 = require("notistack");
36
+ var App = function (_a) {
37
+ var theme = _a.theme, api = _a.api, rest = __rest(_a, ["theme", "api"]);
38
+ return (react_1.default.createElement(styles_1.ThemeProvider, { theme: theme !== null && theme !== void 0 ? theme : (0, styles_1.createTheme)() },
39
+ react_1.default.createElement(CssBaseline_1.default, null),
40
+ react_1.default.createElement(notistack_1.SnackbarProvider, { maxSnack: 4, anchorOrigin: {
41
+ vertical: "bottom",
42
+ horizontal: "right",
43
+ } },
44
+ react_1.default.createElement(ApiContext_1.ApiContextProvider, { api: api },
45
+ react_1.default.createElement(I18nContext_1.I18nContextProvider, null,
46
+ react_1.default.createElement(UserContext_1.UserContextProvider, null,
47
+ react_1.default.createElement(Admin_1.default, __assign({}, rest))))))));
48
+ };
49
+ exports.default = App;
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.ApiClient = exports.ApiOperation = void 0;
43
+ var swagger_parser_1 = __importDefault(require("@apidevtools/swagger-parser"));
44
+ var get_cookie_1 = require("./util/get_cookie");
45
+ var ApiOperation = /** @class */ (function () {
46
+ function ApiOperation(id, tags, server, endpoint, method, request, summary, description) {
47
+ this.id = id;
48
+ this.tags = tags;
49
+ this.server = server;
50
+ this.endpoint = endpoint;
51
+ this.method = method;
52
+ this.request = request;
53
+ this.summary = summary;
54
+ this.description = description;
55
+ }
56
+ ApiOperation.prototype.call = function (request, init) {
57
+ var _a, _b;
58
+ return __awaiter(this, void 0, void 0, function () {
59
+ var endpoint, csrftoken, _i, _c, _d, name_1, value, url, _e, _f, _g, name_2, value;
60
+ return __generator(this, function (_h) {
61
+ switch (_h.label) {
62
+ case 0:
63
+ endpoint = this.endpoint;
64
+ csrftoken = (0, get_cookie_1.getCookie)("csrftoken");
65
+ init !== null && init !== void 0 ? init : (init = {});
66
+ (_a = init.method) !== null && _a !== void 0 ? _a : (init.method = this.method);
67
+ init.headers = new Headers(init.headers);
68
+ if (csrftoken !== undefined)
69
+ init.headers.append("X-CSRFToken", csrftoken);
70
+ init.credentials = "include";
71
+ // Add body to request
72
+ if ((request === null || request === void 0 ? void 0 : request.body) !== undefined) {
73
+ (_b = init.body) !== null && _b !== void 0 ? _b : (init.body = JSON.stringify(request === null || request === void 0 ? void 0 : request.body));
74
+ }
75
+ // Add params to url
76
+ if ((request === null || request === void 0 ? void 0 : request.params) !== undefined) {
77
+ for (_i = 0, _c = Object.entries(request.params); _i < _c.length; _i++) {
78
+ _d = _c[_i], name_1 = _d[0], value = _d[1];
79
+ endpoint = endpoint.replace("{".concat(name_1, "}"), value);
80
+ }
81
+ }
82
+ url = new URL(this.server + endpoint);
83
+ // Add query to url
84
+ if ((request === null || request === void 0 ? void 0 : request.query) !== undefined) {
85
+ for (_e = 0, _f = Object.entries(request.query); _e < _f.length; _e++) {
86
+ _g = _f[_e], name_2 = _g[0], value = _g[1];
87
+ url.searchParams.append(name_2, value);
88
+ }
89
+ }
90
+ return [4 /*yield*/, fetch(url, init)];
91
+ case 1: return [2 /*return*/, _h.sent()];
92
+ }
93
+ });
94
+ });
95
+ };
96
+ return ApiOperation;
97
+ }());
98
+ exports.ApiOperation = ApiOperation;
99
+ var ApiClient = /** @class */ (function () {
100
+ function ApiClient(document, server) {
101
+ var _a, _b, _c, _d, _e, _f, _g, _h;
102
+ this.operations = {};
103
+ this.document = document;
104
+ // If the document uses servers and it is not manually set this will be prepended to path later
105
+ if ("servers" in this.document && this.document.servers !== undefined &&
106
+ this.document.servers.length >= 1) {
107
+ server !== null && server !== void 0 ? server : (server = this.document.servers.pop().url);
108
+ }
109
+ // Make sure the server variable is an URL
110
+ if (server !== undefined && !(server instanceof URL)) {
111
+ server = new URL(server);
112
+ }
113
+ // Build operations
114
+ for (var _i = 0, _j = Object.entries((_a = this.document.paths) !== null && _a !== void 0 ? _a : {}); _i < _j.length; _i++) {
115
+ var _k = _j[_i], path = _k[0], definition = _k[1];
116
+ for (var _l = 0, _m = Object.entries(definition); _l < _m.length; _l++) {
117
+ var _o = _m[_l], method = _o[0], operation = _o[1];
118
+ // All operations require an operation id
119
+ if (!operation.operationId) {
120
+ break;
121
+ }
122
+ // Check if an tag starting with `app:` exists on the operation
123
+ if (!((_b = operation.tags) === null || _b === void 0 ? void 0 : _b.some(function (tag) { return tag.startsWith("app:"); }))) {
124
+ break;
125
+ }
126
+ var request = {};
127
+ // Fill the request object with `path`, `query` and `body` data which may be provided
128
+ for (var _p = 0, _q = (_c = operation.parameters) !== null && _c !== void 0 ? _c : []; _p < _q.length; _p++) {
129
+ var parameter = _q[_p];
130
+ if ("in" in parameter) {
131
+ switch (parameter.in) {
132
+ case "body": {
133
+ request["body"] = {
134
+ required: (_d = parameter.required) !== null && _d !== void 0 ? _d : false,
135
+ schema: parameter.schema,
136
+ };
137
+ break;
138
+ }
139
+ case "path": {
140
+ (_e = request["params"]) !== null && _e !== void 0 ? _e : (request["params"] = {});
141
+ request["params"][parameter.name] = {
142
+ // Path parameters are always required: https://swagger.io/docs/specification/describing-parameters/#path-parameters
143
+ required: true,
144
+ schema: parameter.schema,
145
+ };
146
+ break;
147
+ }
148
+ case "query": {
149
+ (_f = request["query"]) !== null && _f !== void 0 ? _f : (request["query"] = {});
150
+ request["query"][parameter.name] = {
151
+ required: (_g = parameter.required) !== null && _g !== void 0 ? _g : false,
152
+ schema: parameter.schema,
153
+ };
154
+ }
155
+ }
156
+ }
157
+ }
158
+ // If `requestBody` exists then add it to the request objects body object
159
+ if ("requestBody" in operation && operation.requestBody !== undefined) {
160
+ if ("content" in operation.requestBody) {
161
+ var schema = operation.requestBody.content["application/json"].schema;
162
+ var required = (_h = operation.requestBody.required) !== null && _h !== void 0 ? _h : false;
163
+ request["body"] = {
164
+ schema: schema,
165
+ required: required,
166
+ };
167
+ }
168
+ }
169
+ // Combine base url and path
170
+ server = server ? server.toString() : "";
171
+ if (server.endsWith("/")) {
172
+ server = server.slice(0, -1);
173
+ }
174
+ var endpoint = path.startsWith("/") ? path : "/" + path;
175
+ // Create a new `ApiOperation` with the relevant information
176
+ this.operations[operation.operationId] = new ApiOperation(operation.operationId, operation.tags, server, endpoint, method, request, operation.summary, operation.description);
177
+ }
178
+ }
179
+ }
180
+ ApiClient.load = function (source, server) {
181
+ return __awaiter(this, void 0, void 0, function () {
182
+ var response, schema, document;
183
+ return __generator(this, function (_a) {
184
+ switch (_a.label) {
185
+ case 0: return [4 /*yield*/, fetch(source)];
186
+ case 1:
187
+ response = _a.sent();
188
+ if (!response.ok) {
189
+ throw new Error("Could not load schema from ".concat(source));
190
+ }
191
+ return [4 /*yield*/, response.json().catch(function (e) {
192
+ throw e;
193
+ })];
194
+ case 2:
195
+ schema = _a.sent();
196
+ return [4 /*yield*/, swagger_parser_1.default.dereference(schema)];
197
+ case 3:
198
+ document = _a.sent();
199
+ return [2 /*return*/, new ApiClient(document, server)];
200
+ }
201
+ });
202
+ });
203
+ };
204
+ ApiClient.prototype.isAuthenticated = function () {
205
+ return __awaiter(this, void 0, void 0, function () {
206
+ var response, _a;
207
+ return __generator(this, function (_b) {
208
+ switch (_b.label) {
209
+ case 0:
210
+ _b.trys.push([0, 2, , 3]);
211
+ return [4 /*yield*/, this.operations["bananas.me:list"].call()];
212
+ case 1:
213
+ response = _b.sent();
214
+ return [2 /*return*/, response.ok];
215
+ case 2:
216
+ _a = _b.sent();
217
+ return [2 /*return*/, false];
218
+ case 3: return [2 /*return*/];
219
+ }
220
+ });
221
+ });
222
+ };
223
+ return ApiClient;
224
+ }());
225
+ exports.ApiClient = ApiClient;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var Box_1 = __importDefault(require("@mui/material/Box"));
8
+ var ButtonBase_1 = __importDefault(require("@mui/material/ButtonBase"));
9
+ var Typography_1 = __importDefault(require("@mui/material/Typography"));
10
+ var select_styles_1 = require("../util/select_styles");
11
+ var Logo_1 = __importDefault(require("./Logo"));
12
+ var Branding = function (_a) {
13
+ var logo = _a.logo, title = _a.title, subtitle = _a.subtitle, version = _a.version, onClick = _a.onClick, fullWidth = _a.fullWidth, sx = _a.sx;
14
+ return (react_1.default.createElement(Box_1.default, { sx: (0, select_styles_1.ss)({
15
+ display: "flex",
16
+ flexDirection: "row",
17
+ alignItems: "center",
18
+ flexGrow: 1,
19
+ }, [{ width: "100%" }, fullWidth !== null && fullWidth !== void 0 ? fullWidth : false], sx) },
20
+ react_1.default.createElement(ButtonBase_1.default, { sx: {
21
+ justifyContent: "flex-start",
22
+ width: "100%",
23
+ height: "100%",
24
+ padding: 0,
25
+ }, color: "inherit", onClick: onClick },
26
+ logo ? react_1.default.createElement(Logo_1.default, { src: logo }) : (react_1.default.createElement(Typography_1.default, { sx: {
27
+ fontWeight: "bold",
28
+ }, color: "inherit", variant: "h4" }, title)),
29
+ react_1.default.createElement(Box_1.default, { sx: {
30
+ marginLeft: 10,
31
+ "& > *": {
32
+ textAlign: "left",
33
+ fontSize: "0.75rem",
34
+ display: "block",
35
+ lineHeight: "1em",
36
+ },
37
+ } },
38
+ react_1.default.createElement(Typography_1.default, { color: "inherit" }, subtitle),
39
+ react_1.default.createElement(Typography_1.default, { color: "inherit" }, version)))));
40
+ };
41
+ exports.default = Branding;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ var react_1 = __importDefault(require("react"));
29
+ var ChevronLeft_1 = __importDefault(require("@mui/icons-material/ChevronLeft"));
30
+ var Menu_1 = __importDefault(require("@mui/icons-material/Menu"));
31
+ var Box_1 = __importDefault(require("@mui/material/Box"));
32
+ var IconButton_1 = __importDefault(require("@mui/material/IconButton"));
33
+ var styles_1 = require("@mui/material/styles");
34
+ var Hamburger = function (_a) {
35
+ var open = _a.open, onToggle = _a.onToggle, rest = __rest(_a, ["open", "onToggle"]);
36
+ var theme = (0, styles_1.useTheme)();
37
+ return (react_1.default.createElement(Box_1.default, { sx: __assign({ display: "flex", alignItems: "center", justifyContent: "flex-start", padding: theme.spacing(0, 1), flexShrink: 1 }, theme.mixins.toolbar) },
38
+ react_1.default.createElement(IconButton_1.default, __assign({ "aria-label": open ? "Close drawer" : "Open drawer", color: "inherit", onClick: onToggle }, rest, { size: "large" }), open ? react_1.default.createElement(ChevronLeft_1.default, null) : react_1.default.createElement(Menu_1.default, null))));
39
+ };
40
+ exports.default = Hamburger;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var RouterContext_1 = require("../contexts/RouterContext");
7
+ var react_router_dom_1 = require("react-router-dom");
8
+ var react_1 = __importDefault(require("react"));
9
+ var Link = function (_a) {
10
+ var route = _a.route;
11
+ var getRoute = (0, RouterContext_1.useRouter)().getRoute;
12
+ if (typeof route === "string") {
13
+ var routeInfo = getRoute(route);
14
+ if (routeInfo === undefined) {
15
+ throw new Error("Could not find route with reverse: ".concat(route));
16
+ }
17
+ route = routeInfo;
18
+ }
19
+ return react_1.default.createElement(react_router_dom_1.Link, { to: route.path });
20
+ };
21
+ exports.default = Link;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var Logo = function (_a) {
8
+ var src = _a.src;
9
+ if (src === true) {
10
+ return (react_1.default.createElement("svg", { version: "1.1", id: "bananas", x: "0px", y: "0px", width: "32px", height: "32px", viewBox: "0 0 927.611 927.611", xmlSpace: "preserve", xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink" },
11
+ react_1.default.createElement("g", { fill: "#FFFFFF" },
12
+ react_1.default.createElement("path", { d: "M158.56,618.97l2.4-0.7c97-26.199,181.6-59.8,251.2-99.8c94.5-54.3,159.4-119.5,193-193.799l16-35.4l-28.699,26.2\n\t\t\tc-57,52.1-134.801,91-231.4,115.8c-81.9,21-176,31.7-279.8,31.7c-5.4,0-17.4-0.1-24.6-0.2l-16.9-0.8c-13.3-0.6-25.4,7.6-29.8,20.2\n\t\t\tl-6.6,19.1c-3.9,11.301-0.7,23.9,8.2,32c7.4,6.7,14.9,13.2,14.9,13.2s56,48.5,129.6,71.7L158.56,618.97z" }),
13
+ react_1.default.createElement("path", { d: "M811.86,163.17c-29.1-13.4-56.899-15.4-70.899-15.4c-1.801,0-3.5,0-4.9,0.1c-3.2-11.2-19.4-78.1-30.7-124.9\n\t\t\tc-5.2-21.5-31.1-30.2-48.2-16.1l-53.6,44.2c-14,11.5-16.9,31.7-6.7,46.7c22.4,32.9,59.5,91.7,77.7,144.8\n\t\t\tc17.2,50.3,18.7,102.9,10.5,154.6c-13.4,83.7-57.6,168.2-131.4,251.2c-40.199,45.2-84.699,86.399-132.199,123.7\n\t\t\tc-23.801,18.699-48.4,36.399-73.7,53c-2.601,1.699-32.7,19.399-53.601,30.199c-11.699,6-18.1,19-15.8,31.9l2.5,14\n\t\t\tc2.4,13.4,13.5,23.5,27,24.6c34.3,2.9,105.101,4.801,199.7-13.899c51.8-10.2,101.8-34.5,148.2-62.101\n\t\t\tc78.1-46.6,182.8-131.399,238.1-271c24.7-62.3,35.2-126.699,31.2-191.599c-3.9-63.8-20.7-112.4-34.1-142\n\t\t\tC873.66,206.771,847.06,179.271,811.86,163.17z" }),
14
+ react_1.default.createElement("path", { d: "M109.46,744.97c13.1,8.101,34.4,19.8,60.3,28.4c44.5,14.8,91.8,21.2,138.5,22.7l2.6,0.1l2.101-1.4\n\t\t\tc34.5-23.1,67.3-47.3,97.6-71.899c37.7-30.7,71.5-62.2,100.5-93.601c26.3-28.5,50.6-58.899,71.4-91.6\n\t\t\tc18.199-28.6,33.699-59.1,44.8-91.2c5.2-15,9.5-30.399,12.399-46.1c3-15.9,4.4-32.1,6.5-48.2c0.4-3.2,0.801-6.3,1.2-9.5\n\t\t\tl-19.899,33.9c-41.7,71.199-110.5,133.699-204.601,186c-61.2,34.1-126.8,60.1-193.6,81.199c-36.4,11.5-71.6,21.601-108.6,27.301\n\t\t\tc-14.6,2.199-25.3,14.8-25.3,29.6c0,6.4,0,13.1,0,18.9C95.36,729.87,100.66,739.47,109.46,744.97z" }))));
15
+ }
16
+ if (typeof src === "string") {
17
+ return react_1.default.createElement("img", { src: src });
18
+ }
19
+ if (src) {
20
+ var Src = src;
21
+ return react_1.default.createElement(Src, null);
22
+ }
23
+ return null;
24
+ };
25
+ exports.default = Logo;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ var React = __importStar(require("react"));
41
+ var styles_1 = require("@mui/material/styles");
42
+ var Box_1 = __importDefault(require("@mui/material/Box"));
43
+ var Drawer_1 = __importDefault(require("@mui/material/Drawer"));
44
+ var Divider_1 = __importDefault(require("@mui/material/Divider"));
45
+ var User_1 = __importDefault(require("./User"));
46
+ var Hamburger_1 = __importDefault(require("./Hamburger"));
47
+ var NavBarRoutes_1 = __importDefault(require("./NavBarRoutes"));
48
+ var Branding_1 = __importDefault(require("./Branding"));
49
+ var react_router_dom_1 = require("react-router-dom");
50
+ var drawerWidth = 240;
51
+ var openedMixin = function (theme) { return ({
52
+ width: drawerWidth,
53
+ transition: theme.transitions.create("width", {
54
+ easing: theme.transitions.easing.sharp,
55
+ duration: theme.transitions.duration.enteringScreen,
56
+ }),
57
+ overflowX: "hidden",
58
+ }); };
59
+ var closedMixin = function (theme) {
60
+ var _a;
61
+ return (_a = {
62
+ transition: theme.transitions.create("width", {
63
+ easing: theme.transitions.easing.sharp,
64
+ duration: theme.transitions.duration.leavingScreen,
65
+ }),
66
+ overflowX: "hidden",
67
+ width: "calc(".concat(theme.spacing(7), " + 1px)")
68
+ },
69
+ _a[theme.breakpoints.up("sm")] = {
70
+ width: "calc(".concat(theme.spacing(8), " + 1px)"),
71
+ },
72
+ _a);
73
+ };
74
+ var NavBar = function (_a) {
75
+ var nav = _a.nav, logo = _a.logo, title = _a.title, subtitle = _a.subtitle, version = _a.version;
76
+ var theme = (0, styles_1.useTheme)();
77
+ var navigate = (0, react_router_dom_1.useNavigate)();
78
+ var _b = React.useState(true), open = _b[0], setOpen = _b[1];
79
+ var toggleDrawerOpen = function () {
80
+ setOpen(!open);
81
+ };
82
+ var onClick = function () {
83
+ navigate("/", { replace: true });
84
+ };
85
+ return (React.createElement(Drawer_1.default, { sx: __assign(__assign({ width: drawerWidth, flexShrink: 0, whiteSpace: "nowrap", boxSizing: "border-box" }, (open && __assign(__assign({}, openedMixin(theme)), { "& .MuiDrawer-paper": openedMixin(theme) }))), (!open && __assign(__assign({}, closedMixin(theme)), { "& .MuiDrawer-paper": closedMixin(theme) }))), anchor: "left", variant: "permanent", open: open },
86
+ React.createElement(Box_1.default, { sx: { display: "flex", padding: theme.spacing(2, 0, 2) } },
87
+ React.createElement(Hamburger_1.default, { open: open, onClick: toggleDrawerOpen }),
88
+ React.createElement(Branding_1.default, { sx: { opacity: open ? 1 : 0 }, logo: logo, title: title, subtitle: subtitle, version: version, onClick: onClick, fullWidth: open })),
89
+ React.createElement(Box_1.default, { sx: {
90
+ flexGrow: 1,
91
+ flexShrink: 0,
92
+ } },
93
+ React.createElement(NavBarRoutes_1.default, { nav: nav, open: open })),
94
+ React.createElement(Box_1.default, { sx: {
95
+ flexGrow: 0,
96
+ flexShrink: 0,
97
+ } },
98
+ React.createElement(Divider_1.default, null),
99
+ React.createElement(User_1.default, { open: open }))));
100
+ };
101
+ exports.default = NavBar;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var styles_1 = require("@mui/material/styles");
7
+ var ListItem_1 = __importDefault(require("@mui/material/ListItem"));
8
+ var ListItemButton_1 = __importDefault(require("@mui/material/ListItemButton"));
9
+ var ListItemIcon_1 = __importDefault(require("@mui/material/ListItemIcon"));
10
+ var ListItemText_1 = __importDefault(require("@mui/material/ListItemText"));
11
+ var react_1 = __importDefault(require("react"));
12
+ var react_router_dom_1 = require("react-router-dom");
13
+ var RouterContext_1 = require("../contexts/RouterContext");
14
+ var Logo_1 = __importDefault(require("./Logo"));
15
+ var NavBarItem = function (_a) {
16
+ var route = _a.route, title = _a.title, subtitle = _a.subtitle, icon = _a.icon, children = _a.children, open = _a.open;
17
+ var Icon = icon;
18
+ var _b = react_1.default.useState(false), selected = _b[0], setSelected = _b[1];
19
+ var location = (0, react_router_dom_1.useLocation)();
20
+ var navigate = (0, RouterContext_1.useRouter)().navigate;
21
+ var theme = (0, styles_1.useTheme)();
22
+ var onClick = function () {
23
+ navigate(route);
24
+ };
25
+ react_1.default.useEffect(function () {
26
+ setSelected(location.pathname === route.path);
27
+ }, [location]);
28
+ return (react_1.default.createElement(ListItem_1.default, { onClick: onClick, key: route.id, disablePadding: true, sx: { display: "block" } },
29
+ react_1.default.createElement(ListItemButton_1.default, { selected: selected, sx: {
30
+ minHeight: 48,
31
+ justifyContent: open ? "initial" : "center",
32
+ px: 2.5,
33
+ } },
34
+ react_1.default.createElement(ListItemIcon_1.default, { sx: {
35
+ minWidth: 0,
36
+ justifyContent: "center",
37
+ padding: theme.spacing(1, 1),
38
+ } }, Icon !== undefined ? react_1.default.createElement(Logo_1.default, { src: Icon }) : title.substring(0, 1)),
39
+ react_1.default.createElement(ListItemText_1.default, { sx: { opacity: open ? 1 : 0 }, primary: title, secondary: subtitle }),
40
+ children)));
41
+ };
42
+ exports.default = NavBarItem;