@seamapi/react 0.23.0 → 0.25.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 (77) hide show
  1. package/index.css +140 -0
  2. package/index.css.map +1 -1
  3. package/index.min.css +1 -1
  4. package/index.min.css.map +1 -1
  5. package/lib/icons/ArrowRestart.d.ts +2 -0
  6. package/lib/icons/ArrowRestart.js +5 -0
  7. package/lib/icons/ArrowRestart.js.map +1 -0
  8. package/lib/icons/Check.d.ts +2 -0
  9. package/lib/icons/Check.js +3 -0
  10. package/lib/icons/Check.js.map +1 -0
  11. package/lib/icons/ExclamationCircle.d.ts +2 -0
  12. package/lib/icons/ExclamationCircle.js +5 -0
  13. package/lib/icons/ExclamationCircle.js.map +1 -0
  14. package/lib/icons/ExclamationCircleOutline.d.ts +2 -0
  15. package/lib/icons/ExclamationCircleOutline.js +5 -0
  16. package/lib/icons/ExclamationCircleOutline.js.map +1 -0
  17. package/lib/icons/TriangleWarning.d.ts +2 -0
  18. package/lib/icons/TriangleWarning.js +5 -0
  19. package/lib/icons/TriangleWarning.js.map +1 -0
  20. package/lib/ui/AccessCodeTable/AccessCodeTable.js +24 -11
  21. package/lib/ui/AccessCodeTable/AccessCodeTable.js.map +1 -1
  22. package/lib/ui/Alert/Alert.d.ts +11 -0
  23. package/lib/ui/Alert/Alert.js +12 -0
  24. package/lib/ui/Alert/Alert.js.map +1 -0
  25. package/lib/ui/Alert/Alerts.d.ts +8 -0
  26. package/lib/ui/Alert/Alerts.js +8 -0
  27. package/lib/ui/Alert/Alerts.js.map +1 -0
  28. package/lib/ui/DeviceDetails/DeviceDetails.js +23 -1
  29. package/lib/ui/DeviceDetails/DeviceDetails.js.map +1 -1
  30. package/lib/ui/DeviceTable/DeviceHealthBar.d.ts +9 -0
  31. package/lib/ui/DeviceTable/DeviceHealthBar.js +29 -0
  32. package/lib/ui/DeviceTable/DeviceHealthBar.js.map +1 -0
  33. package/lib/ui/DeviceTable/DeviceRow.d.ts +11 -0
  34. package/lib/ui/DeviceTable/DeviceRow.js +24 -0
  35. package/lib/ui/DeviceTable/DeviceRow.js.map +1 -0
  36. package/lib/ui/DeviceTable/DeviceTable.js +23 -19
  37. package/lib/ui/DeviceTable/DeviceTable.js.map +1 -1
  38. package/lib/ui/IconButton.d.ts +1 -1
  39. package/lib/ui/IconButton.js +3 -2
  40. package/lib/ui/IconButton.js.map +1 -1
  41. package/lib/ui/SupportedDevices/SupportedDevices.d.ts +1 -1
  42. package/lib/ui/SupportedDevices/SupportedDevices.js +1 -1
  43. package/lib/ui/SupportedDevices/SupportedDevices.js.map +1 -1
  44. package/lib/ui/Table/EmptyPlaceholder.d.ts +2 -0
  45. package/lib/ui/Table/EmptyPlaceholder.js +5 -0
  46. package/lib/ui/Table/EmptyPlaceholder.js.map +1 -0
  47. package/lib/ui/Table/TableFilterBar/TableFilterBar.d.ts +6 -0
  48. package/lib/ui/Table/TableFilterBar/TableFilterBar.js +11 -0
  49. package/lib/ui/Table/TableFilterBar/TableFilterBar.js.map +1 -0
  50. package/lib/ui/Table/TableFilterBar/TableFilterItem.d.ts +5 -0
  51. package/lib/ui/Table/TableFilterBar/TableFilterItem.js +9 -0
  52. package/lib/ui/Table/TableFilterBar/TableFilterItem.js.map +1 -0
  53. package/lib/ui/index.d.ts +1 -0
  54. package/lib/ui/index.js +1 -0
  55. package/lib/ui/index.js.map +1 -1
  56. package/package.json +1 -1
  57. package/src/lib/icons/ArrowRestart.tsx +32 -0
  58. package/src/lib/icons/Check.tsx +15 -0
  59. package/src/lib/icons/ExclamationCircle.tsx +32 -0
  60. package/src/lib/icons/ExclamationCircleOutline.tsx +32 -0
  61. package/src/lib/icons/TriangleWarning.tsx +32 -0
  62. package/src/lib/ui/AccessCodeTable/AccessCodeTable.tsx +73 -40
  63. package/src/lib/ui/Alert/Alert.tsx +52 -0
  64. package/src/lib/ui/Alert/Alerts.tsx +22 -0
  65. package/src/lib/ui/DeviceDetails/DeviceDetails.tsx +37 -0
  66. package/src/lib/ui/DeviceTable/DeviceHealthBar.tsx +66 -0
  67. package/src/lib/ui/DeviceTable/DeviceRow.tsx +60 -0
  68. package/src/lib/ui/DeviceTable/DeviceTable.tsx +43 -42
  69. package/src/lib/ui/IconButton.tsx +6 -2
  70. package/src/lib/ui/SupportedDevices/SupportedDevices.tsx +1 -1
  71. package/src/lib/ui/Table/EmptyPlaceholder.tsx +12 -0
  72. package/src/lib/ui/Table/TableFilterBar/TableFilterBar.tsx +31 -0
  73. package/src/lib/ui/Table/TableFilterBar/TableFilterItem.tsx +24 -0
  74. package/src/lib/ui/index.ts +1 -0
  75. package/src/styles/_alert.scss +115 -0
  76. package/src/styles/_main.scss +2 -0
  77. package/src/styles/_tables.scss +65 -0
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CheckIcon } from '../../../lib/icons/Check.js';
3
+ import { ExclamationCircleOutlineIcon } from '../../../lib/icons/ExclamationCircleOutline.js';
4
+ import { TableFilterBar } from '../../../lib/ui/Table/TableFilterBar/TableFilterBar.js';
5
+ import { TableFilterItem } from '../../../lib/ui/Table/TableFilterBar/TableFilterItem.js';
6
+ export function DeviceHealthBar({ devices, filter, onFilterSelect, }) {
7
+ const erroredDevices = devices.filter((device) => device.errors.length > 0);
8
+ const issueCount = erroredDevices.length;
9
+ const toggle = (target) => () => {
10
+ const newFilter = target === filter ? null : target;
11
+ onFilterSelect(newFilter);
12
+ };
13
+ const isPlural = issueCount === 0 || issueCount > 1;
14
+ const label = isPlural
15
+ ? `${issueCount} ${t.deviceIssues}`
16
+ : `${issueCount} ${t.deviceIssue}`;
17
+ if (issueCount === 0) {
18
+ return (_jsx(TableFilterBar, { children: _jsxs(TableFilterItem, { children: [_jsx(CheckIcon, {}), t.devicesOk] }) }));
19
+ }
20
+ return (_jsx(TableFilterBar, { isFilterCleared: filter == null, onFilterClear: () => {
21
+ onFilterSelect(null);
22
+ }, children: _jsxs(TableFilterItem, { onClick: toggle('device_issues'), selected: filter === 'device_issues', children: [_jsx(ExclamationCircleOutlineIcon, {}), label] }) }));
23
+ }
24
+ const t = {
25
+ devicesOk: 'Devices OK',
26
+ deviceIssue: 'device issue',
27
+ deviceIssues: 'device issues',
28
+ };
29
+ //# sourceMappingURL=DeviceHealthBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceHealthBar.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceHealthBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAA;AAEpF,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAA;AAUhF,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,MAAM,EACN,cAAc,GACO;IACrB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3E,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAA;IAExC,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,GAAG,EAAE;QAC5C,MAAM,SAAS,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QACnD,cAAc,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,QAAQ;QACpB,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,YAAY,EAAE;QACnC,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IAEpC,IAAI,UAAU,KAAK,CAAC,EAAE;QACpB,OAAO,CACL,KAAC,cAAc,cACb,MAAC,eAAe,eACd,KAAC,SAAS,KAAG,EACZ,CAAC,CAAC,SAAS,IACI,GACH,CAClB,CAAA;KACF;IAED,OAAO,CACL,KAAC,cAAc,IACb,eAAe,EAAE,MAAM,IAAI,IAAI,EAC/B,aAAa,EAAE,GAAG,EAAE;YAClB,cAAc,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC,YAED,MAAC,eAAe,IACd,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,EAChC,QAAQ,EAAE,MAAM,KAAK,eAAe,aAEpC,KAAC,4BAA4B,KAAG,EAC/B,KAAK,IACU,GACH,CAClB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,SAAS,EAAE,YAAY;IACvB,WAAW,EAAE,cAAc;IAC3B,YAAY,EAAE,eAAe;CAC9B,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { type UseDevicesData, type UseDevicesParams } from '../../../lib/seam/devices/use-devices.js';
2
+ export type DeviceTableProps = Props & UseDevicesParams;
3
+ interface Props {
4
+ onBack?: () => void;
5
+ }
6
+ export interface DeviceRowProps {
7
+ device: UseDevicesData[number];
8
+ onClick: () => void;
9
+ }
10
+ export declare function DeviceRow({ device, onClick, }: DeviceRowProps): JSX.Element | null;
11
+ export {};
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isLockDevice } from '../../../lib/seam/devices/types.js';
3
+ import {} from '../../../lib/seam/devices/use-devices.js';
4
+ import { BatteryStatus } from '../../../lib/ui/device/BatteryStatus.js';
5
+ import { DeviceImage } from '../../../lib/ui/device/DeviceImage.js';
6
+ import { LockStatus } from '../../../lib/ui/device/LockStatus.js';
7
+ import { OnlineStatus } from '../../../lib/ui/device/OnlineStatus.js';
8
+ import { getDeviceModel } from '../../../lib/ui/DeviceDetails/DeviceModel.js';
9
+ import { TableCell } from '../../../lib/ui/Table/TableCell.js';
10
+ import { TableRow } from '../../../lib/ui/Table/TableRow.js';
11
+ import { Title } from '../../../lib/ui/typography/Title.js';
12
+ export function DeviceRow({ device, onClick, }) {
13
+ if (!isLockDevice(device)) {
14
+ return null;
15
+ }
16
+ const deviceModel = getDeviceModel(device) ?? t.unknownLock;
17
+ return (_jsxs(TableRow, { onClick: onClick, children: [_jsx(TableCell, { className: 'seam-image-cell', children: _jsx(DeviceImage, { device: device }) }), _jsxs(TableCell, { className: 'seam-body-cell', children: [_jsx(Title, { children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [_jsx("span", { className: 'seam-device-model', children: deviceModel }), _jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), _jsx(BatteryStatus, { device: device }), _jsx(LockStatus, { device: device })] })] })] })] }, device.device_id));
18
+ }
19
+ const t = {
20
+ devices: 'Devices',
21
+ unknownLock: 'Unknown Lock',
22
+ noDevicesMessage: 'Sorry, no devices were found',
23
+ };
24
+ //# sourceMappingURL=DeviceRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceRow.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAGN,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAalD,MAAM,UAAU,SAAS,CAAC,EACxB,MAAM,EACN,OAAO,GACQ;IACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAA;IAE3D,OAAO,CACL,MAAC,QAAQ,IAAwB,OAAO,EAAE,OAAO,aAC/C,KAAC,SAAS,IAAC,SAAS,EAAC,iBAAiB,YACpC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GACrB,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,MAAM,CAAC,UAAU,CAAC,IAAI,GAAS,EACvC,eAAK,SAAS,EAAC,aAAa,aAC1B,eAAM,SAAS,EAAC,mBAAmB,YAAE,WAAW,GAAQ,EACxD,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAChC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,IAC1B,IACF,IACI,KAdC,MAAM,CAAC,SAAS,CAepB,CACZ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,8BAA8B;CACjD,CAAA"}
@@ -1,21 +1,15 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
- import { isLockDevice } from '../../../lib/seam/devices/types.js';
4
3
  import { useDevices, } from '../../../lib/seam/devices/use-devices.js';
5
- import { BatteryStatus } from '../../../lib/ui/device/BatteryStatus.js';
6
- import { DeviceImage } from '../../../lib/ui/device/DeviceImage.js';
7
- import { LockStatus } from '../../../lib/ui/device/LockStatus.js';
8
- import { OnlineStatus } from '../../../lib/ui/device/OnlineStatus.js';
9
4
  import { DeviceDetails } from '../../../lib/ui/DeviceDetails/DeviceDetails.js';
10
- import { getDeviceModel } from '../../../lib/ui/DeviceDetails/DeviceModel.js';
5
+ import { DeviceHealthBar, } from '../../../lib/ui/DeviceTable/DeviceHealthBar.js';
6
+ import { DeviceRow } from '../../../lib/ui/DeviceTable/DeviceRow.js';
11
7
  import { ContentHeader } from '../../../lib/ui/layout/ContentHeader.js';
8
+ import { EmptyPlaceholder } from '../../../lib/ui/Table/EmptyPlaceholder.js';
12
9
  import { TableBody } from '../../../lib/ui/Table/TableBody.js';
13
- import { TableCell } from '../../../lib/ui/Table/TableCell.js';
14
10
  import { TableHeader } from '../../../lib/ui/Table/TableHeader.js';
15
- import { TableRow } from '../../../lib/ui/Table/TableRow.js';
16
11
  import { TableTitle } from '../../../lib/ui/Table/TableTitle.js';
17
12
  import { Caption } from '../../../lib/ui/typography/Caption.js';
18
- import { Title } from '../../../lib/ui/typography/Title.js';
19
13
  export function DeviceTable({ onBack, ...props }) {
20
14
  const { devices, isLoading, isError, error } = useDevices(props);
21
15
  const [selectedDeviceId, selectDevice] = useState(null);
@@ -34,20 +28,30 @@ export function DeviceTable({ onBack, ...props }) {
34
28
  return null;
35
29
  }
36
30
  const deviceCount = devices.length;
37
- return (_jsxs("div", { className: 'seam-device-table', children: [_jsx(ContentHeader, { onBack: onBack }), _jsx(TableHeader, { children: _jsxs(TableTitle, { children: [t.devices, " ", _jsxs(Caption, { children: ["(", deviceCount, ")"] })] }) }), _jsx(TableBody, { children: devices.map((device) => (_jsx(DeviceRow, { device: device, onClick: () => {
38
- selectDevice(device.device_id);
39
- } }, device.device_id))) })] }));
31
+ return (_jsxs("div", { className: 'seam-device-table', children: [_jsx(ContentHeader, { onBack: onBack }), _jsx(TableHeader, { children: _jsxs(TableTitle, { children: [t.devices, " ", _jsxs(Caption, { children: ["(", deviceCount, ")"] })] }) }), _jsx(TableBody, { children: _jsx(Body, { devices: devices, selectDevice: selectDevice }) })] }));
40
32
  }
41
- function DeviceRow(props) {
42
- const { device, onClick } = props;
43
- if (!isLockDevice(device)) {
44
- return null;
33
+ function Body(props) {
34
+ const { devices, selectDevice } = props;
35
+ const [filter, setFilter] = useState(null);
36
+ if (devices.length === 0) {
37
+ return _jsx(EmptyPlaceholder, { children: t.noDevicesMessage });
45
38
  }
46
- const deviceModel = getDeviceModel(device) ?? t.unknownLock;
47
- return (_jsxs(TableRow, { onClick: onClick, children: [_jsx(TableCell, { className: 'seam-image-cell', children: _jsx(DeviceImage, { device: device }) }), _jsxs(TableCell, { className: 'seam-body-cell', children: [_jsx(Title, { children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [_jsx("span", { className: 'seam-device-model', children: deviceModel }), _jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), _jsx(BatteryStatus, { device: device }), _jsx(LockStatus, { device: device })] })] })] })] }, device.device_id));
39
+ const filteredDevices = devices.filter((device) => {
40
+ if (filter === null) {
41
+ return true;
42
+ }
43
+ if (filter === 'device_issues') {
44
+ return device.errors.length > 0;
45
+ }
46
+ return true;
47
+ });
48
+ return (_jsxs(_Fragment, { children: [_jsx(DeviceHealthBar, { devices: devices, filter: filter, onFilterSelect: setFilter }), filteredDevices.map((device) => (_jsx(DeviceRow, { device: device, onClick: () => {
49
+ selectDevice(device.device_id);
50
+ } }, device.device_id)))] }));
48
51
  }
49
52
  const t = {
50
53
  devices: 'Devices',
51
54
  unknownLock: 'Unknown Lock',
55
+ noDevicesMessage: 'Sorry, no devices were found',
52
56
  };
53
57
  //# sourceMappingURL=DeviceTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  import type { ButtonProps } from '../../lib/ui/types.js';
2
- export declare function IconButton(props: ButtonProps): JSX.Element;
2
+ export declare function IconButton({ className, ...props }: ButtonProps): JSX.Element;
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- export function IconButton(props) {
3
- return _jsx("button", { ...props, className: 'seam-icon-btn' });
2
+ import classNames from 'classnames';
3
+ export function IconButton({ className, ...props }) {
4
+ return (_jsx("button", { ...props, className: classNames('seam-icon-btn', className) }));
4
5
  }
5
6
  //# sourceMappingURL=IconButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/lib/ui/IconButton.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,OAAO,oBAAY,KAAK,EAAE,SAAS,EAAC,eAAe,GAAG,CAAA;AACxD,CAAC"}
1
+ {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/lib/ui/IconButton.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAInC,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAe;IAC7D,OAAO,CACL,oBAAY,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC,GAAI,CACzE,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- export default function SupportedDevices(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function SupportedDevices(): import("react/jsx-runtime").JSX.Element;
@@ -4,7 +4,7 @@ import axios from 'axios';
4
4
  import { Button } from '../../../lib/ui/Button.js';
5
5
  import SupportedDeviceRow from './SupportedDeviceRow.js';
6
6
  import SupportedDevicesHeader from './SupportedDevicesHeader.js';
7
- export default function SupportedDevices() {
7
+ export function SupportedDevices() {
8
8
  const { data, isLoading, isError, refetch } = useQuery({
9
9
  queryKey: ['supported_devices'],
10
10
  queryFn: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"SupportedDevices.js","sourceRoot":"","sources":["../../../src/lib/ui/SupportedDevices/SupportedDevices.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAGzC,OAAO,kBAAkB,MAAM,yBAAyB,CAAA;AACxD,OAAO,sBAAsB,MAAM,6BAA6B,CAAA;AAEhE,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACtC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,CAInD;QACD,QAAQ,EAAE,CAAC,mBAAmB,CAAC;QAC/B,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;QAC3E,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,CACL,4BACE,eAAK,SAAS,EAAC,mCAAmC,aAC/C,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,0CAA0C,YACvD,mDAA+B,GAC3B,CACP,EAEA,OAAO,IAAI,CACV,eAAK,SAAS,EAAC,0CAA0C,aACvD,qEAAiD,EACjD,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,GAAG,EAAE;gCACZ,KAAK,OAAO,EAAE,CAAA;4BAChB,CAAC,sBAGM,IACL,CACP,EAEA,CAAC,SAAS;oBACT,CAAC,OAAO;oBACR,IAAI,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI;oBAClC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAC1C,iBAAO,SAAS,EAAC,8BAA8B,aAC7C,KAAC,sBAAsB,KAAG,EAC1B,0BACG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAC5C,KAAC,kBAAkB,IAEjB,WAAW,EAAE,WAAW,IADnB,WAAW,CAAC,qBAAqB,CAEtC,CACH,CAAC,GACI,IACF,CACT,IACC,GACL,CACJ,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"SupportedDevices.js","sourceRoot":"","sources":["../../../src/lib/ui/SupportedDevices/SupportedDevices.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAGzC,OAAO,kBAAkB,MAAM,yBAAyB,CAAA;AACxD,OAAO,sBAAsB,MAAM,6BAA6B,CAAA;AAEhE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,CAInD;QACD,QAAQ,EAAE,CAAC,mBAAmB,CAAC;QAC/B,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;QAC3E,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,CACL,4BACE,eAAK,SAAS,EAAC,mCAAmC,aAC/C,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,0CAA0C,YACvD,mDAA+B,GAC3B,CACP,EAEA,OAAO,IAAI,CACV,eAAK,SAAS,EAAC,0CAA0C,aACvD,qEAAiD,EACjD,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,GAAG,EAAE;gCACZ,KAAK,OAAO,EAAE,CAAA;4BAChB,CAAC,sBAGM,IACL,CACP,EAEA,CAAC,SAAS;oBACT,CAAC,OAAO;oBACR,IAAI,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI;oBAClC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAC1C,iBAAO,SAAS,EAAC,8BAA8B,aAC7C,KAAC,sBAAsB,KAAG,EAC1B,0BACG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAC5C,KAAC,kBAAkB,IAEjB,WAAW,EAAE,WAAW,IADnB,WAAW,CAAC,qBAAqB,CAEtC,CACH,CAAC,GACI,IACF,CACT,IACC,GACL,CACJ,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { DivProps } from '../../../lib/ui/types.js';
2
+ export declare function EmptyPlaceholder({ children, ...props }: DivProps): JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export function EmptyPlaceholder({ children, ...props }) {
3
+ return (_jsx("div", { className: 'seam-table-empty-placeholder', ...props, children: children }));
4
+ }
5
+ //# sourceMappingURL=EmptyPlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyPlaceholder.js","sourceRoot":"","sources":["../../../src/lib/ui/Table/EmptyPlaceholder.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,GAAG,KAAK,EACC;IACT,OAAO,CACL,cAAK,SAAS,EAAC,8BAA8B,KAAK,KAAK,YACpD,QAAQ,GACL,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { DivProps } from '../../../../lib/ui/types.js';
2
+ export interface TableFiltersProps extends DivProps {
3
+ isFilterCleared?: boolean;
4
+ onFilterClear?: () => void;
5
+ }
6
+ export declare function TableFilterBar({ isFilterCleared, onFilterClear, children, ...props }: TableFiltersProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowRestartIcon } from '../../../../lib/icons/ArrowRestart.js';
3
+ import { IconButton } from '../../../../lib/ui/IconButton.js';
4
+ export function TableFilterBar({ isFilterCleared, onFilterClear, children, ...props }) {
5
+ const showClearFilterButton = isFilterCleared === false;
6
+ return (_jsxs("div", { className: 'seam-table-filter-bar', ...props, children: [children, ' ', showClearFilterButton && _jsx(ClearFiltersButton, { onClick: onFilterClear })] }));
7
+ }
8
+ function ClearFiltersButton(props) {
9
+ return (_jsx(IconButton, { ...props, className: 'seam-clear-filters-button', children: _jsx(ArrowRestartIcon, {}) }));
10
+ }
11
+ //# sourceMappingURL=TableFilterBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableFilterBar.js","sourceRoot":"","sources":["../../../../src/lib/ui/Table/TableFilterBar/TableFilterBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAQjD,MAAM,UAAU,cAAc,CAAC,EAC7B,eAAe,EACf,aAAa,EACb,QAAQ,EACR,GAAG,KAAK,EACU;IAClB,MAAM,qBAAqB,GAAG,eAAe,KAAK,KAAK,CAAA;IACvD,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,KAAK,KAAK,aAC7C,QAAQ,EAAE,GAAG,EACb,qBAAqB,IAAI,KAAC,kBAAkB,IAAC,OAAO,EAAE,aAAa,GAAI,IACpE,CACP,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAkB;IAC5C,OAAO,CACL,KAAC,UAAU,OAAK,KAAK,EAAE,SAAS,EAAC,2BAA2B,YAC1D,KAAC,gBAAgB,KAAG,GACT,CACd,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DivProps } from '../../../../lib/ui/types.js';
2
+ export interface TableFilterItemProps extends DivProps {
3
+ selected?: boolean;
4
+ }
5
+ export declare function TableFilterItem({ onClick, selected, ...props }: TableFilterItemProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ export function TableFilterItem({ onClick, selected, ...props }) {
4
+ return (_jsx("div", { onClick: onClick, className: classNames('seam-table-filter-item', {
5
+ 'seam-clickable': onClick !== undefined,
6
+ 'seam-selected': selected,
7
+ }), ...props }));
8
+ }
9
+ //# sourceMappingURL=TableFilterItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableFilterItem.js","sourceRoot":"","sources":["../../../../src/lib/ui/Table/TableFilterBar/TableFilterItem.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAQnC,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACa;IACrB,OAAO,CACL,cACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,UAAU,CAAC,wBAAwB,EAAE;YAC9C,gBAAgB,EAAE,OAAO,KAAK,SAAS;YACvC,eAAe,EAAE,QAAQ;SAC1B,CAAC,KACE,KAAK,GACT,CACH,CAAA;AACH,CAAC"}
package/lib/ui/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export * from './AccessCodeDetails/AccessCodeDetails.js';
2
2
  export * from './AccessCodeTable/AccessCodeTable.js';
3
3
  export * from './DeviceDetails/DeviceDetails.js';
4
4
  export * from './DeviceTable/DeviceTable.js';
5
+ export * from './SupportedDevices/SupportedDevices.js';
package/lib/ui/index.js CHANGED
@@ -2,4 +2,5 @@ export * from './AccessCodeDetails/AccessCodeDetails.js';
2
2
  export * from './AccessCodeTable/AccessCodeTable.js';
3
3
  export * from './DeviceDetails/DeviceDetails.js';
4
4
  export * from './DeviceTable/DeviceTable.js';
5
+ export * from './SupportedDevices/SupportedDevices.js';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,0CAA0C,CAAA;AACxD,cAAc,sCAAsC,CAAA;AACpD,cAAc,kCAAkC,CAAA;AAChD,cAAc,8BAA8B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,0CAA0C,CAAA;AACxD,cAAc,sCAAsC,CAAA;AACpD,cAAc,kCAAkC,CAAA;AAChD,cAAc,8BAA8B,CAAA;AAC5C,cAAc,wCAAwC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/react",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "description": "Seam React component library.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -0,0 +1,32 @@
1
+ import type { SVGProps } from 'react'
2
+ export const ArrowRestartIcon = (
3
+ props: SVGProps<SVGSVGElement>
4
+ ): JSX.Element => (
5
+ <svg
6
+ xmlns='http://www.w3.org/2000/svg'
7
+ width={24}
8
+ height={24}
9
+ fill='none'
10
+ {...props}
11
+ >
12
+ <mask
13
+ id='arrow-restart_svg__a'
14
+ width={24}
15
+ height={24}
16
+ x={0}
17
+ y={0}
18
+ maskUnits='userSpaceOnUse'
19
+ style={{
20
+ maskType: 'alpha',
21
+ }}
22
+ >
23
+ <path fill='#D9D9D9' d='M0 0h24v24H0z' />
24
+ </mask>
25
+ <g mask='url(#arrow-restart_svg__a)'>
26
+ <path
27
+ fill='#232B3A'
28
+ d='M12 20c2.233 0 4.125-.775 5.675-2.325C19.225 16.125 20 14.233 20 12c0-2.233-.775-4.125-2.325-5.675C16.125 4.775 14.233 4 12 4c-1.15 0-2.25.238-3.3.713A7.617 7.617 0 0 0 6 6.75V4H4v7h7V9H6.8a5.838 5.838 0 0 1 2.187-2.2A5.93 5.93 0 0 1 12 6c1.667 0 3.083.583 4.25 1.75C17.417 8.917 18 10.333 18 12c0 1.667-.583 3.083-1.75 4.25C15.083 17.417 13.667 18 12 18a5.863 5.863 0 0 1-3.475-1.1A5.809 5.809 0 0 1 6.35 14h-2.1c.467 1.767 1.417 3.208 2.85 4.325S10.167 20 12 20Z'
29
+ />
30
+ </g>
31
+ </svg>
32
+ )
@@ -0,0 +1,15 @@
1
+ import type { SVGProps } from 'react'
2
+ export const CheckIcon = (props: SVGProps<SVGSVGElement>): JSX.Element => (
3
+ <svg
4
+ xmlns='http://www.w3.org/2000/svg'
5
+ width={25}
6
+ height={24}
7
+ fill='none'
8
+ {...props}
9
+ >
10
+ <path
11
+ fill='#27AE60'
12
+ d='m9.5 15.73-3.936-4.038-1.895 1.872L9.5 19.476l12.765-12.92-1.82-1.87L9.5 15.73Z'
13
+ />
14
+ </svg>
15
+ )
@@ -0,0 +1,32 @@
1
+ import type { SVGProps } from 'react'
2
+ export const ExclamationCircleIcon = (
3
+ props: SVGProps<SVGSVGElement>
4
+ ): JSX.Element => (
5
+ <svg
6
+ xmlns='http://www.w3.org/2000/svg'
7
+ width={24}
8
+ height={24}
9
+ fill='none'
10
+ {...props}
11
+ >
12
+ <mask
13
+ id='exclamation-circle_svg__a'
14
+ width={24}
15
+ height={24}
16
+ x={0}
17
+ y={0}
18
+ maskUnits='userSpaceOnUse'
19
+ style={{
20
+ maskType: 'alpha',
21
+ }}
22
+ >
23
+ <path fill='#D9D9D9' d='M0 0h24v24H0z' />
24
+ </mask>
25
+ <g mask='url(#exclamation-circle_svg__a)'>
26
+ <path
27
+ fill='#E36857'
28
+ d='M12 17a.968.968 0 0 0 .713-.288A.967.967 0 0 0 13 16a.97.97 0 0 0-.287-.713A.97.97 0 0 0 12 15a.967.967 0 0 0-.712.287A.968.968 0 0 0 11 16c0 .283.096.52.288.712A.965.965 0 0 0 12 17Zm-1-4h2V7h-2v6Zm1 9a9.733 9.733 0 0 1-3.9-.788 10.092 10.092 0 0 1-3.175-2.137c-.9-.9-1.612-1.958-2.137-3.175A9.733 9.733 0 0 1 2 12c0-1.383.263-2.683.788-3.9a10.092 10.092 0 0 1 2.137-3.175c.9-.9 1.958-1.613 3.175-2.138A9.743 9.743 0 0 1 12 2c1.383 0 2.683.262 3.9.787a10.105 10.105 0 0 1 3.175 2.138c.9.9 1.612 1.958 2.137 3.175A9.733 9.733 0 0 1 22 12a9.733 9.733 0 0 1-.788 3.9 10.092 10.092 0 0 1-2.137 3.175c-.9.9-1.958 1.612-3.175 2.137A9.733 9.733 0 0 1 12 22Z'
29
+ />
30
+ </g>
31
+ </svg>
32
+ )
@@ -0,0 +1,32 @@
1
+ import type { SVGProps } from 'react'
2
+ export const ExclamationCircleOutlineIcon = (
3
+ props: SVGProps<SVGSVGElement>
4
+ ): JSX.Element => (
5
+ <svg
6
+ xmlns='http://www.w3.org/2000/svg'
7
+ width={24}
8
+ height={25}
9
+ fill='none'
10
+ {...props}
11
+ >
12
+ <mask
13
+ id='exclamation-circle-outline_svg__a'
14
+ width={24}
15
+ height={25}
16
+ x={0}
17
+ y={0}
18
+ maskUnits='userSpaceOnUse'
19
+ style={{
20
+ maskType: 'alpha',
21
+ }}
22
+ >
23
+ <path fill='#D9D9D9' d='M0 .018h24v24H0z' />
24
+ </mask>
25
+ <g mask='url(#exclamation-circle-outline_svg__a)'>
26
+ <path
27
+ fill='#E36857'
28
+ d='M12 17.018a.968.968 0 0 0 .713-.288.967.967 0 0 0 .287-.712.97.97 0 0 0-.287-.713.97.97 0 0 0-.713-.287.967.967 0 0 0-.712.287.968.968 0 0 0-.288.713c0 .283.096.52.288.712a.965.965 0 0 0 .712.288Zm-1-4h2v-6h-2v6Zm1 9a9.733 9.733 0 0 1-3.9-.788 10.092 10.092 0 0 1-3.175-2.137c-.9-.9-1.612-1.959-2.137-3.175a9.733 9.733 0 0 1-.788-3.9c0-1.384.263-2.684.788-3.9a10.092 10.092 0 0 1 2.137-3.175c.9-.9 1.958-1.613 3.175-2.138a9.743 9.743 0 0 1 3.9-.787c1.383 0 2.683.262 3.9.787a10.105 10.105 0 0 1 3.175 2.138c.9.9 1.612 1.958 2.137 3.175a9.733 9.733 0 0 1 .788 3.9 9.733 9.733 0 0 1-.788 3.9 10.093 10.093 0 0 1-2.137 3.175c-.9.9-1.958 1.612-3.175 2.137a9.733 9.733 0 0 1-3.9.788Zm0-2c2.233 0 4.125-.775 5.675-2.325C19.225 16.143 20 14.25 20 12.018c0-2.234-.775-4.125-2.325-5.675-1.55-1.55-3.442-2.325-5.675-2.325-2.233 0-4.125.775-5.675 2.325C4.775 7.893 4 9.784 4 12.018c0 2.233.775 4.125 2.325 5.675 1.55 1.55 3.442 2.325 5.675 2.325Z'
29
+ />
30
+ </g>
31
+ </svg>
32
+ )
@@ -0,0 +1,32 @@
1
+ import type { SVGProps } from 'react'
2
+ export const TriangleWarningIcon = (
3
+ props: SVGProps<SVGSVGElement>
4
+ ): JSX.Element => (
5
+ <svg
6
+ xmlns='http://www.w3.org/2000/svg'
7
+ width={24}
8
+ height={24}
9
+ fill='none'
10
+ {...props}
11
+ >
12
+ <mask
13
+ id='triangle-warning_svg__a'
14
+ width={24}
15
+ height={24}
16
+ x={0}
17
+ y={0}
18
+ maskUnits='userSpaceOnUse'
19
+ style={{
20
+ maskType: 'alpha',
21
+ }}
22
+ >
23
+ <path fill='#D9D9D9' d='M0 0h24v24H0z' />
24
+ </mask>
25
+ <g mask='url(#triangle-warning_svg__a)'>
26
+ <path
27
+ fill='#F3980F'
28
+ d='M1 21 12 2l11 19H1Zm11-3a.968.968 0 0 0 .713-.288A.967.967 0 0 0 13 17a.967.967 0 0 0-.287-.712A.968.968 0 0 0 12 16a.965.965 0 0 0-.712.288A.965.965 0 0 0 11 17c0 .283.096.52.288.712A.965.965 0 0 0 12 18Zm-1-3h2v-5h-2v5Z'
29
+ />
30
+ </g>
31
+ </svg>
32
+ )
@@ -4,12 +4,16 @@ import type { AccessCode } from 'seamapi'
4
4
  import { copy } from 'lib/copy.js'
5
5
  import { AccessCodeKeyIcon } from 'lib/icons/AccessCodeKey.js'
6
6
  import { CopyIcon } from 'lib/icons/Copy.js'
7
- import { useAccessCodes } from 'lib/seam/access-codes/use-access-codes.js'
7
+ import {
8
+ useAccessCodes,
9
+ type UseAccessCodesData,
10
+ } from 'lib/seam/access-codes/use-access-codes.js'
8
11
  import { AccessCodeDetails } from 'lib/ui/AccessCodeDetails/AccessCodeDetails.js'
9
12
  import { CodeDetails } from 'lib/ui/AccessCodeTable/CodeDetails.js'
10
13
  import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
11
14
  import { MenuItem } from 'lib/ui/Menu/MenuItem.js'
12
15
  import { MoreActionsMenu } from 'lib/ui/Menu/MoreActionsMenu.js'
16
+ import { EmptyPlaceholder } from 'lib/ui/Table/EmptyPlaceholder.js'
13
17
  import { TableBody } from 'lib/ui/Table/TableBody.js'
14
18
  import { TableCell } from 'lib/ui/Table/TableCell.js'
15
19
  import { TableHeader } from 'lib/ui/Table/TableHeader.js'
@@ -59,52 +63,81 @@ export function AccessCodeTable(
59
63
  </TableTitle>
60
64
  </TableHeader>
61
65
  <TableBody>
62
- {accessCodes.map((code) => (
63
- <TableRow
64
- key={code.access_code_id}
66
+ <Body accessCodes={accessCodes} selectAccessCode={selectAccessCode} />
67
+ </TableBody>
68
+ </div>
69
+ )
70
+ }
71
+
72
+ function Body(props: {
73
+ accessCodes: Array<UseAccessCodesData[number]>
74
+ selectAccessCode: (accessCode: AccessCode) => void
75
+ }) {
76
+ const { accessCodes, selectAccessCode } = props
77
+
78
+ if (accessCodes.length === 0) {
79
+ return <EmptyPlaceholder>{t.noAccessCodesMessage}</EmptyPlaceholder>
80
+ }
81
+
82
+ return (
83
+ <>
84
+ {accessCodes.map((accessCode) => (
85
+ <AccessCodeRow
86
+ key={accessCode.access_code_id}
87
+ accessCode={accessCode}
88
+ onClick={() => {
89
+ selectAccessCode(accessCode)
90
+ }}
91
+ />
92
+ ))}
93
+ </>
94
+ )
95
+ }
96
+
97
+ function AccessCodeRow(props: {
98
+ accessCode: UseAccessCodesData[number]
99
+ onClick: () => void
100
+ }) {
101
+ const { onClick, accessCode } = props
102
+ return (
103
+ <TableRow key={accessCode.access_code_id} onClick={onClick}>
104
+ <TableCell className='seam-icon-cell'>
105
+ <div>
106
+ <AccessCodeKeyIcon />
107
+ </div>
108
+ </TableCell>
109
+ <TableCell className='seam-name-cell'>
110
+ <Title>{accessCode.name}</Title>
111
+ <CodeDetails accessCode={accessCode} />
112
+ </TableCell>
113
+ <TableCell className='seam-action-cell'>
114
+ <MoreActionsMenu
115
+ MenuProps={{
116
+ BackgroundProps: {
117
+ className: 'seam-access-code-table-action-menu',
118
+ },
119
+ }}
120
+ >
121
+ <MenuItem
65
122
  onClick={() => {
66
- selectAccessCode(code)
123
+ void copy(accessCode.code ?? '')
67
124
  }}
68
125
  >
69
- <TableCell className='seam-icon-cell'>
70
- <div>
71
- <AccessCodeKeyIcon />
72
- </div>
73
- </TableCell>
74
- <TableCell className='seam-name-cell'>
75
- <Title>{code.name}</Title>
76
- <CodeDetails accessCode={code} />
77
- </TableCell>
78
- <TableCell className='seam-action-cell'>
79
- <MoreActionsMenu
80
- MenuProps={{
81
- BackgroundProps: {
82
- className: 'seam-access-code-table-action-menu',
83
- },
84
- }}
85
- >
86
- <MenuItem
87
- onClick={() => {
88
- void copy(code.code ?? '')
89
- }}
90
- >
91
- <div className='menu-item-copy'>
92
- <span>
93
- {t.copyCode} - {code.code}
94
- </span>
95
- <CopyIcon />
96
- </div>
97
- </MenuItem>
98
- </MoreActionsMenu>
99
- </TableCell>
100
- </TableRow>
101
- ))}
102
- </TableBody>
103
- </div>
126
+ <div className='menu-item-copy'>
127
+ <span>
128
+ {t.copyCode} - {accessCode.code}
129
+ </span>
130
+ <CopyIcon />
131
+ </div>
132
+ </MenuItem>
133
+ </MoreActionsMenu>
134
+ </TableCell>
135
+ </TableRow>
104
136
  )
105
137
  }
106
138
 
107
139
  const t = {
108
140
  accessCodes: 'Access Codes',
109
141
  copyCode: 'Copy code',
142
+ noAccessCodesMessage: 'Sorry, no access codes were found',
110
143
  }