@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.
- package/index.css +140 -0
- package/index.css.map +1 -1
- package/index.min.css +1 -1
- package/index.min.css.map +1 -1
- package/lib/icons/ArrowRestart.d.ts +2 -0
- package/lib/icons/ArrowRestart.js +5 -0
- package/lib/icons/ArrowRestart.js.map +1 -0
- package/lib/icons/Check.d.ts +2 -0
- package/lib/icons/Check.js +3 -0
- package/lib/icons/Check.js.map +1 -0
- package/lib/icons/ExclamationCircle.d.ts +2 -0
- package/lib/icons/ExclamationCircle.js +5 -0
- package/lib/icons/ExclamationCircle.js.map +1 -0
- package/lib/icons/ExclamationCircleOutline.d.ts +2 -0
- package/lib/icons/ExclamationCircleOutline.js +5 -0
- package/lib/icons/ExclamationCircleOutline.js.map +1 -0
- package/lib/icons/TriangleWarning.d.ts +2 -0
- package/lib/icons/TriangleWarning.js +5 -0
- package/lib/icons/TriangleWarning.js.map +1 -0
- package/lib/ui/AccessCodeTable/AccessCodeTable.js +24 -11
- package/lib/ui/AccessCodeTable/AccessCodeTable.js.map +1 -1
- package/lib/ui/Alert/Alert.d.ts +11 -0
- package/lib/ui/Alert/Alert.js +12 -0
- package/lib/ui/Alert/Alert.js.map +1 -0
- package/lib/ui/Alert/Alerts.d.ts +8 -0
- package/lib/ui/Alert/Alerts.js +8 -0
- package/lib/ui/Alert/Alerts.js.map +1 -0
- package/lib/ui/DeviceDetails/DeviceDetails.js +23 -1
- package/lib/ui/DeviceDetails/DeviceDetails.js.map +1 -1
- package/lib/ui/DeviceTable/DeviceHealthBar.d.ts +9 -0
- package/lib/ui/DeviceTable/DeviceHealthBar.js +29 -0
- package/lib/ui/DeviceTable/DeviceHealthBar.js.map +1 -0
- package/lib/ui/DeviceTable/DeviceRow.d.ts +11 -0
- package/lib/ui/DeviceTable/DeviceRow.js +24 -0
- package/lib/ui/DeviceTable/DeviceRow.js.map +1 -0
- package/lib/ui/DeviceTable/DeviceTable.js +23 -19
- package/lib/ui/DeviceTable/DeviceTable.js.map +1 -1
- package/lib/ui/IconButton.d.ts +1 -1
- package/lib/ui/IconButton.js +3 -2
- package/lib/ui/IconButton.js.map +1 -1
- package/lib/ui/SupportedDevices/SupportedDevices.d.ts +1 -1
- package/lib/ui/SupportedDevices/SupportedDevices.js +1 -1
- package/lib/ui/SupportedDevices/SupportedDevices.js.map +1 -1
- package/lib/ui/Table/EmptyPlaceholder.d.ts +2 -0
- package/lib/ui/Table/EmptyPlaceholder.js +5 -0
- package/lib/ui/Table/EmptyPlaceholder.js.map +1 -0
- package/lib/ui/Table/TableFilterBar/TableFilterBar.d.ts +6 -0
- package/lib/ui/Table/TableFilterBar/TableFilterBar.js +11 -0
- package/lib/ui/Table/TableFilterBar/TableFilterBar.js.map +1 -0
- package/lib/ui/Table/TableFilterBar/TableFilterItem.d.ts +5 -0
- package/lib/ui/Table/TableFilterBar/TableFilterItem.js +9 -0
- package/lib/ui/Table/TableFilterBar/TableFilterItem.js.map +1 -0
- package/lib/ui/index.d.ts +1 -0
- package/lib/ui/index.js +1 -0
- package/lib/ui/index.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/icons/ArrowRestart.tsx +32 -0
- package/src/lib/icons/Check.tsx +15 -0
- package/src/lib/icons/ExclamationCircle.tsx +32 -0
- package/src/lib/icons/ExclamationCircleOutline.tsx +32 -0
- package/src/lib/icons/TriangleWarning.tsx +32 -0
- package/src/lib/ui/AccessCodeTable/AccessCodeTable.tsx +73 -40
- package/src/lib/ui/Alert/Alert.tsx +52 -0
- package/src/lib/ui/Alert/Alerts.tsx +22 -0
- package/src/lib/ui/DeviceDetails/DeviceDetails.tsx +37 -0
- package/src/lib/ui/DeviceTable/DeviceHealthBar.tsx +66 -0
- package/src/lib/ui/DeviceTable/DeviceRow.tsx +60 -0
- package/src/lib/ui/DeviceTable/DeviceTable.tsx +43 -42
- package/src/lib/ui/IconButton.tsx +6 -2
- package/src/lib/ui/SupportedDevices/SupportedDevices.tsx +1 -1
- package/src/lib/ui/Table/EmptyPlaceholder.tsx +12 -0
- package/src/lib/ui/Table/TableFilterBar/TableFilterBar.tsx +31 -0
- package/src/lib/ui/Table/TableFilterBar/TableFilterItem.tsx +24 -0
- package/src/lib/ui/index.ts +1 -0
- package/src/styles/_alert.scss +115 -0
- package/src/styles/_main.scss +2 -0
- 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 {
|
|
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:
|
|
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
|
|
42
|
-
const {
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
47
|
-
|
|
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":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,
|
|
1
|
+
{"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":"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"}
|
package/lib/ui/IconButton.d.ts
CHANGED
|
@@ -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;
|
package/lib/ui/IconButton.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
|
|
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
|
package/lib/ui/IconButton.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/lib/ui/IconButton.tsx"],"names":[],"mappings":";
|
|
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
|
|
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
|
|
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,
|
|
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 @@
|
|
|
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
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
|
package/lib/ui/index.js.map
CHANGED
|
@@ -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
|
@@ -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 {
|
|
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
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
123
|
+
void copy(accessCode.code ?? '')
|
|
67
124
|
}}
|
|
68
125
|
>
|
|
69
|
-
<
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
</
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
}
|