@sqrzro/admin 1.0.0-beta.1 → 1.0.0-beta.4

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 (56) hide show
  1. package/__mocks__/{squarezero-utility.ts → @sqrzro/utility.ts} +0 -0
  2. package/dist/index.css +21 -2
  3. package/dist/index.js +106 -119
  4. package/dist/index.js.map +1 -1
  5. package/dist/types/components/App/index.d.ts +0 -1
  6. package/dist/types/components/ConnectedListScene/index.d.ts +7 -0
  7. package/dist/types/components/Document/index.d.ts +2 -5
  8. package/dist/types/components/FormRepeater/index.d.ts +2 -0
  9. package/dist/types/components/List/index.d.ts +2 -0
  10. package/dist/types/components/Scene/index.d.ts +1 -1
  11. package/dist/types/components/Table/index.d.ts +2 -0
  12. package/dist/types/core/ConnectedRepeater/index.d.ts +5 -5
  13. package/dist/types/core/EmptyMessage/index.d.ts +3 -1
  14. package/dist/types/core/ListItem/index.d.ts +2 -2
  15. package/dist/types/hooks/useAppContext.d.ts +4 -4
  16. package/dist/types/hooks/useConnectedList.d.ts +4 -4
  17. package/dist/types/hooks/useConnectedRepeater.d.ts +7 -0
  18. package/dist/types/hooks/useConnectedTable.d.ts +7 -0
  19. package/dist/types/hooks/useForm.d.ts +4 -11
  20. package/dist/types/index.d.ts +4 -3
  21. package/dist/types/services/OLD_ApiService.d.ts +19 -0
  22. package/docs/guides/02-configuration.story.mdx +2 -2
  23. package/package.json +8 -8
  24. package/src/components/App/App.spec.tsx +39 -2
  25. package/src/components/App/index.tsx +5 -12
  26. package/src/components/AutoSuggest/index.tsx +2 -2
  27. package/src/components/Button/Button.module.css +5 -0
  28. package/src/components/ConnectedDropdown/index.tsx +2 -4
  29. package/src/components/Document/index.tsx +10 -16
  30. package/src/components/FileInput/FileInput.spec.tsx +8 -2
  31. package/src/components/FileInput/index.tsx +7 -6
  32. package/src/components/FormRepeater/FormRepeater.module.css +4 -0
  33. package/src/components/FormRepeater/index.tsx +7 -4
  34. package/src/components/List/List.spec.tsx +22 -0
  35. package/src/components/List/index.tsx +4 -1
  36. package/src/components/LoginForm/LoginForm.spec.tsx +0 -7
  37. package/src/components/LoginForm/index.tsx +10 -3
  38. package/src/components/Scene/index.tsx +1 -1
  39. package/src/components/Table/index.tsx +4 -1
  40. package/src/core/ConnectedRepeater/index.tsx +21 -16
  41. package/src/core/EmptyMessage/index.tsx +19 -2
  42. package/src/core/FilterItem/index.tsx +2 -2
  43. package/src/core/Filters/Filters.spec.tsx +4 -2
  44. package/src/core/ListItem/index.tsx +2 -2
  45. package/src/hooks/useAppContext.ts +5 -3
  46. package/src/hooks/useConnectedList.ts +8 -19
  47. package/src/hooks/useConnectedRepeater.ts +29 -0
  48. package/src/hooks/useConnectedTable.ts +15 -0
  49. package/src/hooks/useForm.ts +7 -14
  50. package/src/index.ts +4 -3
  51. package/src/services/DateService.spec.ts +15 -0
  52. package/src/services/DateService.ts +41 -12
  53. package/src/utility/create-app.tsx +2 -2
  54. package/src/core/BuildModal/index.tsx +0 -119
  55. package/src/services/BuildService.spec.ts +0 -56
  56. package/src/services/BuildService.ts +0 -34
package/dist/index.css CHANGED
@@ -554,9 +554,16 @@
554
554
  border-color: #ee3768;
555
555
  border-color: var(--clr-danger);
556
556
  color: #ee3768;
557
- color: var(--clr-danger);
557
+ color: var(--clr-danger)
558
558
  }
559
559
 
560
+ .Button-module_rootBorderedDanger__fKfsW:hover {
561
+ background-color: #d3184a;
562
+ background-color: var(--clr-danger-dark);
563
+ border-color: #d3184a;
564
+ border-color: var(--clr-danger-dark);
565
+ }
566
+
560
567
  .Button-module_rootIsDisabled__sPT9k {
561
568
  background-color: #cbd5e0;
562
569
  background-color: var(--clr-grey400);
@@ -1372,10 +1379,15 @@ html {
1372
1379
  }
1373
1380
 
1374
1381
  body {
1382
+ background-color: #edf2f7;
1375
1383
  background-color: var(--clr-grey200);
1384
+ color: #2d3748;
1376
1385
  color: var(--clr-grey800);
1386
+ font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, "BlinkMacSystemFont", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
1377
1387
  font-family: var(--ff-body);
1388
+ font-size: 1.4rem;
1378
1389
  font-size: var(--fs-med);
1390
+ line-height: 1.5;
1379
1391
  line-height: var(--lh-body);
1380
1392
  overflow-y: scroll;
1381
1393
  }
@@ -1404,13 +1416,16 @@ dd {
1404
1416
  }
1405
1417
 
1406
1418
  a {
1419
+ color: #0074d9;
1407
1420
  color: var(--clr-link);
1408
1421
  cursor: pointer;
1422
+ font-weight: 600;
1409
1423
  font-weight: var(--fw-bold);
1410
1424
  text-decoration: none
1411
1425
  }
1412
1426
 
1413
1427
  a:hover {
1428
+ color: #1e40af;
1414
1429
  color: var(--clr-link-hover);
1415
1430
  }
1416
1431
 
@@ -1422,6 +1437,7 @@ fieldset {
1422
1437
 
1423
1438
  hr {
1424
1439
  border: 0;
1440
+ border-top: .1rem #e2e8f0 solid;
1425
1441
  border-top: .1rem var(--clr-grey300) solid;
1426
1442
  margin: 3rem 0;
1427
1443
  }
@@ -3103,8 +3119,11 @@ tr:nth-child(2n - 1) .TableCell-module_root__m8YZV {
3103
3119
  }
3104
3120
 
3105
3121
  .FormRepeater-module_root__Bh4KC {
3106
- margin-bottom: 3rem;
3122
+ margin-bottom: 3rem
3107
3123
  }
3124
+ .FormRepeater-module_root__Bh4KC:last-child {
3125
+ margin-bottom: .5rem;
3126
+ }
3108
3127
 
3109
3128
  .ImageInput-module_root__E-IKb {
3110
3129
  background-color: #fff;
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@sqrzro/utility'), require('classnames'), require('deepmerge'), require('prop-types'), require('next/link'), require('next/router'), require('date-fns'), require('use-deep-compare-effect'), require('next/head'), require('next/document')) :
3
3
  typeof define === 'function' && define.amd ? define(['exports', 'react', '@sqrzro/utility', 'classnames', 'deepmerge', 'prop-types', 'next/link', 'next/router', 'date-fns', 'use-deep-compare-effect', 'next/head', 'next/document'], factory) :
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["squarezero-admin"] = {}, global.React, global["@sqrzro/utility"], global.classNames, global.deepmerge, global.PropTypes, global.NextLink, global.NextRouter, global.dateFns, global.useDeepCompareEffect, global.NextHead, global.NextDocument));
5
- })(this, (function (exports, React, utility, classNames, merge, PropTypes, NextLink, router, dateFns, useDeepCompareEffect, Head, NextDocument) { 'use strict';
5
+ })(this, (function (exports, React, utility, classNames, merge, PropTypes, NextLink, router, dateFns, useDeepCompareEffect, Head, document$1) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -32,7 +32,6 @@
32
32
  var NextLink__default = /*#__PURE__*/_interopDefaultLegacy(NextLink);
33
33
  var useDeepCompareEffect__default = /*#__PURE__*/_interopDefaultLegacy(useDeepCompareEffect);
34
34
  var Head__default = /*#__PURE__*/_interopDefaultLegacy(Head);
35
- var NextDocument__default = /*#__PURE__*/_interopDefaultLegacy(NextDocument);
36
35
 
37
36
  /**
38
37
  * Copyright (c) 2014-present, Facebook, Inc.
@@ -927,7 +926,7 @@
927
926
  Logo: PropTypes__default["default"].func,
928
927
  me: PropTypes__default["default"].shape({
929
928
  name: PropTypes__default["default"].string.isRequired
930
- }).isRequired,
929
+ }),
931
930
  name: PropTypes__default["default"].string.isRequired,
932
931
  navigation: PropTypes__default["default"].arrayOf(PropTypes__default["default"].oneOfType([
933
932
  PropTypes__default["default"].shape({
@@ -1779,21 +1778,22 @@
1779
1778
  var AUTH_ROUTE$1 = '/auth/';
1780
1779
  /* eslint-disable @typescript-eslint/naming-convention */
1781
1780
  var App = function (_a) {
1782
- var Component = _a.Component, config = _a.config, Logo = _a.Logo, router = _a.router, pageProps = __rest(_a, ["Component", "config", "Logo", "router"]);
1781
+ var Component = _a.Component, config = _a.config, router = _a.router, pageProps = __rest(_a, ["Component", "config", "router"]);
1783
1782
  var _b = React.useState(), me = _b[0], setMe = _b[1];
1784
1783
  var getMe = function () { return __awaiter(void 0, void 0, void 0, function () {
1785
1784
  var response;
1786
- return __generator(this, function (_a) {
1787
- switch (_a.label) {
1785
+ var _a;
1786
+ return __generator(this, function (_b) {
1787
+ switch (_b.label) {
1788
1788
  case 0:
1789
- _a.trys.push([0, 2, , 3]);
1790
- return [4 /*yield*/, utility.ApiService.get('me')];
1789
+ _b.trys.push([0, 2, , 3]);
1790
+ return [4 /*yield*/, utility.ApiService.get(((_a = config === null || config === void 0 ? void 0 : config.auth) === null || _a === void 0 ? void 0 : _a.meUrl) || 'me')];
1791
1791
  case 1:
1792
- response = _a.sent();
1793
- setMe(__assign({ name: '' }, response.data));
1792
+ response = _b.sent();
1793
+ setMe(response.data);
1794
1794
  return [3 /*break*/, 3];
1795
1795
  case 2:
1796
- _a.sent();
1796
+ _b.sent();
1797
1797
  return [3 /*break*/, 3];
1798
1798
  case 3: return [2 /*return*/];
1799
1799
  }
@@ -1808,12 +1808,12 @@
1808
1808
  }
1809
1809
  var _c = config.style || {}, brand = _c.brand, layout = _c.layout;
1810
1810
  if (Component.hasLayout === false) {
1811
- return (React__default["default"].createElement(AppContextProvider, { value: __assign(__assign({}, config), { Logo: Logo, me: me }) },
1811
+ return (React__default["default"].createElement(AppContextProvider, { value: __assign(__assign({}, config), { me: me }) },
1812
1812
  typeof brand !== 'undefined' && (React__default["default"].createElement("style", { "data-testid": "app-brand" }, ":root { --clr-brand: ".concat(brand, " }"))),
1813
1813
  React__default["default"].createElement(Component, __assign({ router: router }, pageProps)),
1814
1814
  React__default["default"].createElement(Toast, null)));
1815
1815
  }
1816
- return (React__default["default"].createElement(AppContextProvider, { value: __assign(__assign({}, config), { Logo: Logo, me: me }) },
1816
+ return (React__default["default"].createElement(AppContextProvider, { value: __assign(__assign({}, config), { me: me }) },
1817
1817
  typeof brand !== 'undefined' && (React__default["default"].createElement("style", { "data-testid": "app-brand" }, ":root { --clr-brand: ".concat(brand, " }"))),
1818
1818
  React__default["default"].createElement("div", { className: styles$T.root },
1819
1819
  React__default["default"].createElement(Banner, null),
@@ -1831,8 +1831,8 @@
1831
1831
  utility.ApiService.registerConfig({ path: (_a = config.paths) === null || _a === void 0 ? void 0 : _a.api });
1832
1832
  /* eslint-disable @typescript-eslint/naming-convention */
1833
1833
  var AdminApp = function (_a) {
1834
- var Component = _a.Component, Logo = _a.Logo, router = _a.router;
1835
- return (React__default["default"].createElement(App, { Component: Component, Logo: Logo, config: config, router: router }));
1834
+ var Component = _a.Component, router = _a.router;
1835
+ return (React__default["default"].createElement(App, { Component: Component, config: config, router: router }));
1836
1836
  };
1837
1837
  /* eslint-enable */
1838
1838
  AdminApp.propTypes = AppPropTypes;
@@ -2166,7 +2166,7 @@
2166
2166
  })];
2167
2167
  case 2:
2168
2168
  response = _a.sent();
2169
- setSuggestions(response.data.data);
2169
+ setSuggestions(response.data);
2170
2170
  return [3 /*break*/, 4];
2171
2171
  case 3:
2172
2172
  _a.sent();
@@ -2340,21 +2340,43 @@
2340
2340
  return "".concat(formatted, ",").concat(formatted);
2341
2341
  };
2342
2342
  var getQuickDates = function () {
2343
- var dates = {
2344
- Today: getToday(),
2345
- Yesterday: getYesterday(),
2346
- 'Last 7 Days': getLast7Days(),
2347
- 'Last 30 Days': getLast30Days(),
2348
- 'This Month': getThisMonth(),
2349
- 'Last Month': getLastMonth()
2350
- };
2351
- return Object.entries(dates).map(function (_a) {
2352
- var key = _a[0], value = _a[1];
2353
- return ({
2354
- id: getQuickDateId(value),
2355
- name: key
2343
+ var today = new Date();
2344
+ var dates = [
2345
+ {
2346
+ id: getToday(),
2347
+ name: 'Today'
2348
+ },
2349
+ {
2350
+ id: getYesterday(),
2351
+ name: 'Yesterday'
2352
+ },
2353
+ {
2354
+ id: getLast7Days(),
2355
+ name: 'Last 7 Days'
2356
+ },
2357
+ {
2358
+ id: getLast30Days(),
2359
+ name: 'Last 30 Days'
2360
+ },
2361
+ ];
2362
+ /*
2363
+ * If the date is the 8th or 31st of the month, it matches up with last 7 days or last 30 days,
2364
+ * respectively, and causes duplicate key errors. So best just leave it out in these cases.
2365
+ */
2366
+ if (today.getDate() !== DAYS_IN_WEEK$2 + 1 && today.getDate() !== DAYS_IN_MONTH) {
2367
+ dates.push({
2368
+ id: getThisMonth(),
2369
+ name: 'This Month'
2356
2370
  });
2371
+ }
2372
+ dates.push({
2373
+ id: getLastMonth(),
2374
+ name: 'Last Month'
2357
2375
  });
2376
+ return dates.map(function (item) { return ({
2377
+ id: getQuickDateId(item.id),
2378
+ name: item.name
2379
+ }); });
2358
2380
  };
2359
2381
  var DateService = {
2360
2382
  addMonths: addMonths,
@@ -2883,7 +2905,7 @@
2883
2905
  return [4 /*yield*/, utility.ApiService.get(parseRemote$2(remote))];
2884
2906
  case 1:
2885
2907
  response = _a.sent();
2886
- setData(response.data.data);
2908
+ setData(response.data);
2887
2909
  return [3 /*break*/, 3];
2888
2910
  case 2:
2889
2911
  _a.sent();
@@ -2998,10 +3020,11 @@
2998
3020
  * component to be used for any situation where a standout message is required.
2999
3021
  */
3000
3022
  var EmptyMessage = function (_a) {
3001
- var description = _a.description, title = _a.title;
3023
+ var action = _a.action, description = _a.description, title = _a.title;
3002
3024
  return (React__default["default"].createElement("section", { className: styles$z.root },
3003
3025
  React__default["default"].createElement("h1", { className: styles$z.title }, title || DEFAULT_TITLE),
3004
- React__default["default"].createElement("p", { className: styles$z.description }, description || DEFAULT_DESCRIPTION)));
3026
+ React__default["default"].createElement("p", { className: styles$z.description }, description || DEFAULT_DESCRIPTION),
3027
+ action ? (React__default["default"].createElement(Button, { isDisabled: action.isDisabled, onClick: action.onClick, variant: action.variant }, action.label)) : null));
3005
3028
  };
3006
3029
  EmptyMessage.propTypes = {
3007
3030
  description: PropTypes__default["default"].string,
@@ -3070,7 +3093,7 @@
3070
3093
  return [4 /*yield*/, utility.ApiService.get(parseRemote$1(remote))];
3071
3094
  case 1:
3072
3095
  response = _a.sent();
3073
- setRemoteData(response.data.data);
3096
+ setRemoteData(response.data);
3074
3097
  setIsDisabled(false);
3075
3098
  return [2 /*return*/];
3076
3099
  }
@@ -3300,7 +3323,7 @@
3300
3323
  var _j = React.useState([]), remoteSummary = _j[0], setRemoteSummary = _j[1];
3301
3324
  var toggleIsSummaryOpen = function () { return setIsSummaryOpen(!isSummaryOpen); };
3302
3325
  var getData = function () { return __awaiter(void 0, void 0, void 0, function () {
3303
- var response, err_1;
3326
+ var response, meta, err_1;
3304
3327
  return __generator(this, function (_a) {
3305
3328
  switch (_a.label) {
3306
3329
  case 0:
@@ -3316,13 +3339,14 @@
3316
3339
  response = _a.sent();
3317
3340
  setIsLoading(false);
3318
3341
  setIsRefreshing(false);
3319
- setData(response.data.data);
3320
- setTotals(response.data.totals);
3321
- if (response.data.summary) {
3322
- setRemoteSummary(parseSummary(summary || [], response.data.summary));
3342
+ setData(response.data);
3343
+ meta = response.meta;
3344
+ setTotals(meta.totals);
3345
+ if (meta.summary) {
3346
+ setRemoteSummary(parseSummary(summary || [], meta.summary));
3323
3347
  }
3324
- if (response.data.meta) {
3325
- setPagination(transformPagination(response.data.meta));
3348
+ if (meta.page) {
3349
+ setPagination(transformPagination(meta.page));
3326
3350
  }
3327
3351
  return [3 /*break*/, 4];
3328
3352
  case 3:
@@ -3338,7 +3362,7 @@
3338
3362
  }); };
3339
3363
  React.useEffect(function () {
3340
3364
  if (setFunctions) {
3341
- var functions = { reloadList: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
3365
+ var functions = { reloadData: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
3342
3366
  return [2 /*return*/, getData()];
3343
3367
  }); }); } };
3344
3368
  setFunctions(functions);
@@ -3618,9 +3642,9 @@
3618
3642
  * If there is no data, an `EmptyMessage` is displayed.
3619
3643
  */
3620
3644
  var List = function (_a) {
3621
- var data = _a.data, pagination = _a.pagination, transformer = _a.transformer, isDisabled = _a.isDisabled;
3645
+ var data = _a.data, empty = _a.empty, pagination = _a.pagination, transformer = _a.transformer, isDisabled = _a.isDisabled;
3622
3646
  if (!data || !data.length) {
3623
- return React__default["default"].createElement(EmptyMessage, null);
3647
+ return React__default["default"].createElement(EmptyMessage, __assign({}, empty));
3624
3648
  }
3625
3649
  var transformed = transformData$1(data, transformer || DEFAULT_TRANSFORMER$1);
3626
3650
  return (React__default["default"].createElement(React.Fragment, null,
@@ -3925,9 +3949,9 @@
3925
3949
  };
3926
3950
  var Table = function (_a) {
3927
3951
  var _b;
3928
- var columns = _a.columns, data = _a.data, isDisabled = _a.isDisabled, pagination = _a.pagination, totals = _a.totals, transformer = _a.transformer;
3952
+ var columns = _a.columns, data = _a.data, empty = _a.empty, isDisabled = _a.isDisabled, pagination = _a.pagination, totals = _a.totals, transformer = _a.transformer;
3929
3953
  if (!data || !data.length) {
3930
- return React__default["default"].createElement(EmptyMessage, null);
3954
+ return React__default["default"].createElement(EmptyMessage, __assign({}, empty));
3931
3955
  }
3932
3956
  var transformedColumns = transformColumns(columns);
3933
3957
  var transformedData = transformData(data, transformer || DEFAULT_TRANSFORMER);
@@ -4042,21 +4066,11 @@
4042
4066
  onChange: PropTypes__default["default"].func
4043
4067
  };
4044
4068
 
4045
- var Document = /** @class */ (function (_super) {
4046
- __extends(Document, _super);
4047
- function Document() {
4048
- return _super !== null && _super.apply(this, arguments) || this;
4049
- }
4050
- /* eslint-disable class-methods-use-this */
4051
- Document.prototype.render = function () {
4052
- return (React__default["default"].createElement(NextDocument.Html, { lang: "en" },
4053
- React__default["default"].createElement(NextDocument.Head, null),
4054
- React__default["default"].createElement("body", null,
4055
- React__default["default"].createElement(NextDocument.Main, null),
4056
- React__default["default"].createElement(NextDocument.NextScript, null))));
4057
- };
4058
- return Document;
4059
- }(NextDocument__default["default"]));
4069
+ var Document = function () { return (React__default["default"].createElement(document$1.Html, { lang: "en" },
4070
+ React__default["default"].createElement(document$1.Head, null),
4071
+ React__default["default"].createElement("body", null,
4072
+ React__default["default"].createElement(document$1.Main, null),
4073
+ React__default["default"].createElement(document$1.NextScript, null)))); };
4060
4074
 
4061
4075
  var styles$i = {"root":"FormLegend-module_root__TK1a-"};
4062
4076
 
@@ -4087,20 +4101,20 @@
4087
4101
  var styles$h = {"root":"FileInput-module_root__UvQj-","input":"FileInput-module_input__dBre-"};
4088
4102
 
4089
4103
  var FileInput = function (_a) {
4090
- var id = _a.id, hasError = _a.hasError, isDisabled = _a.isDisabled, name = _a.name, onChange = _a.onChange;
4104
+ var id = _a.id, hasError = _a.hasError, isDisabled = _a.isDisabled, name = _a.name, onChange = _a.onChange, value = _a.value;
4091
4105
  var _b = React.useState(''), fileName = _b[0], setFileName = _b[1];
4092
4106
  var handleChange = function (event) {
4093
4107
  var target = event.target;
4094
- if (target.files.length) {
4095
- setFileName(target.files[0].name);
4096
- }
4097
4108
  var simpleEvent = {
4098
- target: { name: name, value: Array.from(target.files) }
4109
+ target: { name: name, value: target.files[0] }
4099
4110
  };
4100
4111
  if (onChange) {
4101
4112
  onChange(simpleEvent);
4102
4113
  }
4103
4114
  };
4115
+ React.useEffect(function () {
4116
+ setFileName(value instanceof File ? value.name : '');
4117
+ }, [value]);
4104
4118
  return (React__default["default"].createElement("div", { className: classNames__default["default"](styles$h.root, hasError && styles$h.rootHasError, isDisabled && styles$h.rootIsDisabled), "data-testid": "file-input-root" },
4105
4119
  React__default["default"].createElement(StaticTextInput, { icon: "upload", label: fileName, name: name, placeholder: "Choose file...", value: fileName }),
4106
4120
  React__default["default"].createElement("input", { className: styles$h.input, "data-testid": "file-input-input", id: id || "c_".concat(name), name: name, onChange: handleChange, type: "file" })));
@@ -4318,7 +4332,7 @@
4318
4332
  * Otherwise, return the existing array, and an empty string (for the new field, if the max is
4319
4333
  * Not reached).
4320
4334
  */
4321
- var stringifiedValue = value.map(function (item) { return (item || '').toString(); });
4335
+ var stringifiedValue = value.map(function (item) { return item || ''; });
4322
4336
  return max && value.length >= max ? __spreadArray([], stringifiedValue, true) : __spreadArray(__spreadArray([], stringifiedValue, true), [''], false);
4323
4337
  };
4324
4338
  var getAction = function (onClick, values, index, max) {
@@ -4332,7 +4346,7 @@
4332
4346
  };
4333
4347
  };
4334
4348
  var FormRepeater = function (_a) {
4335
- var label = _a.label, max = _a.max, name = _a.name, onChange = _a.onChange, value = _a.value;
4349
+ var label = _a.label, max = _a.max, name = _a.name, onChange = _a.onChange, render = _a.render, value = _a.value;
4336
4350
  var values = parseValues(value, max);
4337
4351
  var handleChange = function (event, index) {
4338
4352
  if (!onChange) {
@@ -4360,7 +4374,7 @@
4360
4374
  }
4361
4375
  });
4362
4376
  };
4363
- return (React__default["default"].createElement("div", { className: styles$b.root }, values.map(function (_item, index) { return (React__default["default"].createElement(FormField, { key: index, action: getAction(function () { return handleRemove(index); }, values, index, max), id: "c_".concat(name, "_").concat(index), label: index === 0 ? label : null, name: name, onChange: function (event) { return handleChange(event, index); }, value: values[index], isShallow: true })); })));
4377
+ return (React__default["default"].createElement("div", { className: styles$b.root }, values.map(function (_item, index) { return (React__default["default"].createElement(FormField, { key: index, action: getAction(function () { return handleRemove(index); }, values, index, max), id: "c_".concat(name, "_").concat(index), label: index === 0 ? label : null, name: name, onChange: function (event) { return handleChange(event, index); }, render: render, value: values[index], isShallow: true })); })));
4364
4378
  };
4365
4379
  FormRepeater.propTypes = {
4366
4380
  name: PropTypes__default["default"].string.isRequired,
@@ -4540,6 +4554,7 @@
4540
4554
  var AUTH_DEFAULTS = {
4541
4555
  identifier: 'username',
4542
4556
  identifierLabel: 'Username',
4557
+ loginUrl: 'tokens',
4543
4558
  tfa: false
4544
4559
  };
4545
4560
  var LoginForm = function (_a) {
@@ -4561,8 +4576,10 @@
4561
4576
  formData: formData,
4562
4577
  method: 'post',
4563
4578
  successMessage: false,
4564
- url: 'tokens',
4565
- onSubmitSuccess: function (response) { return utility.AuthService.login(response.data.token); }
4579
+ url: auth.loginUrl,
4580
+ onSubmitSuccess: function (response) {
4581
+ return utility.AuthService.login(response.data.token);
4582
+ }
4566
4583
  }), errors = _f.errors, isLoading = _f.isLoading, handleSubmit = _f.handleSubmit;
4567
4584
  var handleKeyDown = function (event) {
4568
4585
  if (event.key === 'Enter') {
@@ -4812,59 +4829,28 @@
4812
4829
  }).isRequired).isRequired
4813
4830
  };
4814
4831
 
4815
- var start = function () { return __awaiter(void 0, void 0, void 0, function () {
4816
- var response;
4817
- return __generator(this, function (_a) {
4818
- switch (_a.label) {
4819
- case 0:
4820
- utility.EventService.publish('@build/status', 'PENDING');
4821
- _a.label = 1;
4822
- case 1:
4823
- _a.trys.push([1, 3, , 4]);
4824
- return [4 /*yield*/, utility.ApiService.get('build')];
4825
- case 2:
4826
- response = _a.sent();
4827
- utility.StorageService.set('build_hash', response.data.hash);
4828
- return [3 /*break*/, 4];
4829
- case 3:
4830
- _a.sent();
4831
- utility.EventService.publish('@build/status', 'ERROR');
4832
- return [2 /*return*/];
4833
- case 4:
4834
- _a.trys.push([4, 6, , 7]);
4835
- return [4 /*yield*/, utility.ApiService.pollForResponse([
4836
- 'build/status',
4837
- {
4838
- hash: utility.StorageService.get('build_hash')
4839
- },
4840
- ])];
4841
- case 5:
4842
- _a.sent();
4843
- utility.EventService.publish('@build/status', 'SUCCESS');
4844
- return [3 /*break*/, 7];
4845
- case 6:
4846
- _a.sent();
4847
- utility.EventService.publish('@build/status', 'ERROR');
4848
- return [3 /*break*/, 7];
4849
- case 7:
4850
- utility.StorageService.remove('build_hash');
4851
- return [2 /*return*/];
4852
- }
4853
- });
4854
- }); };
4855
- var open = function () { return utility.EventService.publish('@build/open'); };
4856
- var BuildService = { start: start, open: open };
4857
-
4858
- var useConnectedList = function () {
4859
- var _a = React.useState({ reloadList: function () { return null; } }), listFunctions = _a[0], setListFunctions = _a[1];
4832
+ var useConnectedRepeater = function (component) {
4833
+ var _a = React.useState({
4834
+ reloadData: function () { return null; }
4835
+ }), RepeaterFunctions = _a[0], setRepeaterFunctions = _a[1];
4860
4836
  return {
4861
- ConnectedList: React.useCallback(function (props) {
4862
- return React.createElement(ConnectedList, __assign(__assign({}, props), { setFunctions: function (fnc) { return setListFunctions(fnc); } }));
4837
+ element: React.useCallback(function (props) {
4838
+ return React.createElement(component, __assign(__assign({}, props), { setFunctions: function (fnc) { return setRepeaterFunctions(fnc); } }));
4863
4839
  }, []),
4864
- reloadList: listFunctions.reloadList
4840
+ reloadData: RepeaterFunctions.reloadData
4865
4841
  };
4866
4842
  };
4867
4843
 
4844
+ var useConnectedList = function () {
4845
+ var _a = useConnectedRepeater(ConnectedList), element = _a.element, functions = __rest(_a, ["element"]);
4846
+ return __assign({ ConnectedList: element }, functions);
4847
+ };
4848
+
4849
+ var useConnectedTable = function () {
4850
+ var _a = useConnectedRepeater(ConnectedList), element = _a.element, functions = __rest(_a, ["element"]);
4851
+ return __assign({ ConnectedTable: element }, functions);
4852
+ };
4853
+
4868
4854
  var makeUrl = function (alias) {
4869
4855
  var query = FilterService.getUrlForFilters({ dl: '1', token: utility.AuthService.getToken() }, false);
4870
4856
  return "".concat(utility.ApiService.makeUrl(alias), "?").concat(query);
@@ -5028,7 +5014,6 @@
5028
5014
  exports.App = App;
5029
5015
  exports.AppContextProvider = AppContextProvider;
5030
5016
  exports.AutoSuggest = AutoSuggest;
5031
- exports.BuildService = BuildService;
5032
5017
  exports.Button = Button;
5033
5018
  exports.CalendarInput = CalendarInput;
5034
5019
  exports.CheckboxList = CheckboxList;
@@ -5086,6 +5071,8 @@
5086
5071
  exports.useAppContext = useAppContext;
5087
5072
  exports.useClickOutside = useClickOutside;
5088
5073
  exports.useConnectedList = useConnectedList;
5074
+ exports.useConnectedRepeater = useConnectedRepeater;
5075
+ exports.useConnectedTable = useConnectedTable;
5089
5076
  exports.useFilters = useFilters;
5090
5077
  exports.useForm = useForm;
5091
5078
  exports.useFormData = useFormData;