@seamapi/react 1.22.0 → 1.24.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/README.md +1 -1
- package/dist/elements.js +4998 -4842
- package/dist/elements.js.map +1 -1
- package/dist/index.css +3 -0
- package/dist/index.css.map +1 -1
- package/dist/index.min.css +1 -1
- package/dist/index.min.css.map +1 -1
- package/lib/icons/TriangleWarningOutline.d.ts +2 -0
- package/lib/icons/TriangleWarningOutline.js +3 -0
- package/lib/icons/TriangleWarningOutline.js.map +1 -0
- package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.d.ts +2 -1
- package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js +3 -3
- package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js.map +1 -1
- package/lib/seam/components/AccessCodeDetails/AccessCodeDevice.d.ts +2 -1
- package/lib/seam/components/AccessCodeDetails/AccessCodeDevice.js +8 -6
- package/lib/seam/components/AccessCodeDetails/AccessCodeDevice.js.map +1 -1
- package/lib/seam/components/AccessCodeTable/AccessCodeHealthBar.d.ts +10 -0
- package/lib/seam/components/AccessCodeTable/AccessCodeHealthBar.js +29 -0
- package/lib/seam/components/AccessCodeTable/AccessCodeHealthBar.js.map +1 -0
- package/lib/seam/components/AccessCodeTable/AccessCodeTable.d.ts +2 -1
- package/lib/seam/components/AccessCodeTable/AccessCodeTable.js +30 -10
- package/lib/seam/components/AccessCodeTable/AccessCodeTable.js.map +1 -1
- package/lib/seam/components/DeviceDetails/DeviceDetails.d.ts +2 -1
- package/lib/seam/components/DeviceDetails/DeviceDetails.js +2 -2
- package/lib/seam/components/DeviceDetails/DeviceDetails.js.map +1 -1
- package/lib/seam/components/DeviceDetails/LockDeviceDetails.d.ts +1 -0
- package/lib/seam/components/DeviceDetails/LockDeviceDetails.js +4 -4
- package/lib/seam/components/DeviceDetails/LockDeviceDetails.js.map +1 -1
- package/lib/seam/components/DeviceTable/DeviceHealthBar.d.ts +3 -2
- package/lib/seam/components/DeviceTable/DeviceHealthBar.js +23 -11
- package/lib/seam/components/DeviceTable/DeviceHealthBar.js.map +1 -1
- package/lib/seam/components/DeviceTable/DeviceRow.js +19 -1
- package/lib/seam/components/DeviceTable/DeviceRow.js.map +1 -1
- package/lib/seam/components/DeviceTable/DeviceTable.d.ts +2 -1
- package/lib/seam/components/DeviceTable/DeviceTable.js +7 -3
- package/lib/seam/components/DeviceTable/DeviceTable.js.map +1 -1
- package/lib/ui/device/OnlineStatus.js +14 -4
- package/lib/ui/device/OnlineStatus.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +1 -1
- package/src/lib/icons/TriangleWarningOutline.tsx +18 -0
- package/src/lib/seam/components/AccessCodeDetails/AccessCodeDetails.element.ts +1 -0
- package/src/lib/seam/components/AccessCodeDetails/AccessCodeDetails.tsx +4 -0
- package/src/lib/seam/components/AccessCodeDetails/AccessCodeDevice.tsx +23 -10
- package/src/lib/seam/components/AccessCodeTable/AccessCodeHealthBar.tsx +68 -0
- package/src/lib/seam/components/AccessCodeTable/AccessCodeTable.element.ts +1 -0
- package/src/lib/seam/components/AccessCodeTable/AccessCodeTable.tsx +47 -6
- package/src/lib/seam/components/DeviceDetails/DeviceDetails.element.ts +1 -0
- package/src/lib/seam/components/DeviceDetails/DeviceDetails.tsx +3 -0
- package/src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx +14 -9
- package/src/lib/seam/components/DeviceTable/DeviceHealthBar.tsx +49 -19
- package/src/lib/seam/components/DeviceTable/DeviceRow.tsx +48 -9
- package/src/lib/seam/components/DeviceTable/DeviceTable.element.ts +1 -0
- package/src/lib/seam/components/DeviceTable/DeviceTable.tsx +17 -2
- package/src/lib/ui/device/OnlineStatus.tsx +23 -7
- package/src/lib/version.ts +1 -1
- package/src/styles/_device-table.scss +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LockDeviceDetails.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAA;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,wDAAwD,CAAA;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"LockDeviceDetails.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAA;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,wDAAwD,CAAA;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,MAAM,UAAU,iBAAiB,CAAC,KAKjC;IACC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAE9D,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC,GAAG,SAAS,EAAE,CAAA;IAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACxC,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IACnE,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEpE,MAAM,eAAe,GAAG,WAAW,EAAE,MAAM,CAAA;IAE3C,IAAI,WAAW,IAAI,IAAI,EAAE;QACvB,OAAO,IAAI,CAAA;KACZ;IAED,IAAI,eAAe,EAAE;QACnB,OAAO,CACL,KAAC,eAAe,IACd,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,CAAC,SAAS,EAC1B,MAAM,EAAE,qBAAqB,EAC7B,iBAAiB,EAAE,iBAAiB,GACpC,CACH,CAAA;KACF;IAED,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,EAAE,OAAgB;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,OAAO,EAAE,SAAkB;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;KACJ,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,UAAU,CAAC,qBAAqB,EAAE,SAAS,CAAC,aAC1D,KAAC,aAAa,IAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,GAAI,EAChD,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,cAAc,aAC3B,cAAK,SAAS,EAAC,YAAY,YACzB,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GAC3B,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,eAAM,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,MAAM,GAAQ,EAC9C,aAAI,SAAS,EAAC,kBAAkB,YAAE,MAAM,CAAC,UAAU,CAAC,IAAI,GAAM,EAC9D,eAAK,SAAS,EAAC,iBAAiB,aAC9B,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,MAAM,SAAS,EAAC,GAAG,EACnD,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAChC,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,KAAK,SAAS,EAAC,GAAG,EAClD,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,IAC3B,IACF,IACF,EACN,KAAC,MAAM,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAC,uBAAuB,GAAG,IACxD,EACN,cAAK,SAAS,EAAC,UAAU,YACvB,eACE,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAE,qBAAqB,aAE9B,gBAAM,SAAS,EAAC,YAAY,aACzB,eAAe,OAAG,CAAC,CAAC,WAAW,IAC3B,EACP,KAAC,gBAAgB,KAAG,IAChB,GACF,EAEN,eAAK,SAAS,EAAC,UAAU,aACvB,eAAK,SAAS,EAAC,+BAA+B,aAC5C,0BACE,eAAM,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,UAAU,GAAQ,EAClD,eAAM,SAAS,EAAC,YAAY,YAAE,UAAU,GAAQ,IAC5C,EACN,cAAK,SAAS,EAAC,YAAY,YACxB,CAAC,iBAAiB,IAAI,CACrB,KAAC,MAAM,IACL,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,GAAG,EAAE;gDACZ,UAAU,CAAC,MAAM,EAAE,CAAA;4CACrB,CAAC,YAEA,eAAe,GACT,CACV,GACG,IACF,EACN,KAAC,gBAAgB,IACf,oBAAoB,EAClB,MAAM,CAAC,UAAU,EAAE,sBAAsB,IAAI,EAAE,GAEjD,IACE,IACF,IACF,CACP,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAEzB;IACC,MAAM,EAAE,oBAAoB,EAAE,GAAG,KAAK,CAAA;IAEtC,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;QACrC,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAA;IAE7C,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;IAEjD,OAAO,CACL,eAAK,SAAS,EAAC,sCAAsC,aACnD,eAAM,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,UAAU,GAAQ,EAClD,gBAAM,SAAS,EAAC,YAAY,aACzB,KAAK,OAAG,CAAC,CAAC,MAAM,IACZ,IACH,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,cAAc;IAC3B,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACf,CAAA"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import type { UseDevicesData } from '../../../../lib/seam/devices/use-devices.js';
|
|
3
|
+
export type AccountFilter = 'account_issues';
|
|
3
4
|
export type DeviceFilter = 'device_issues';
|
|
4
5
|
interface DeviceHealthBarProps {
|
|
5
6
|
devices: Array<UseDevicesData[number]>;
|
|
6
|
-
filter: DeviceFilter | null;
|
|
7
|
-
onFilterSelect: (filter: DeviceFilter | null) => void;
|
|
7
|
+
filter: AccountFilter | DeviceFilter | null;
|
|
8
|
+
onFilterSelect: (filter: AccountFilter | DeviceFilter | null) => void;
|
|
8
9
|
}
|
|
9
10
|
export declare function DeviceHealthBar({ devices, filter, onFilterSelect, }: DeviceHealthBarProps): JSX.Element;
|
|
10
11
|
export {};
|
|
@@ -1,28 +1,40 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { CheckIcon } from '../../../../lib/icons/Check.js';
|
|
3
3
|
import { ExclamationCircleOutlineIcon } from '../../../../lib/icons/ExclamationCircleOutline.js';
|
|
4
|
+
import { OnlineStatusAccountOfflineIcon } from '../../../../lib/icons/OnlineStatusAccountOffline.js';
|
|
4
5
|
import { TableFilterBar } from '../../../../lib/ui/Table/TableFilterBar/TableFilterBar.js';
|
|
5
6
|
import { TableFilterItem } from '../../../../lib/ui/Table/TableFilterBar/TableFilterItem.js';
|
|
6
7
|
export function DeviceHealthBar({ devices, filter, onFilterSelect, }) {
|
|
7
|
-
const
|
|
8
|
-
|
|
8
|
+
const erroredAccounts = devices.filter((device) => {
|
|
9
|
+
return (device.errors.filter((error) => 'is_connected_account_error' in error)
|
|
10
|
+
.length > 0);
|
|
11
|
+
});
|
|
12
|
+
const erroredDevices = devices.filter((device) => {
|
|
13
|
+
return (device.errors.filter((error) => 'is_device_error' in error).length > 0);
|
|
14
|
+
});
|
|
15
|
+
const accountIssueCount = erroredAccounts.length;
|
|
16
|
+
const deviceIssueCount = erroredDevices.length;
|
|
9
17
|
const toggle = (target) => () => {
|
|
10
18
|
const newFilter = target === filter ? null : target;
|
|
11
19
|
onFilterSelect(newFilter);
|
|
12
20
|
};
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
const deviceLabel = deviceIssueCount > 0
|
|
22
|
+
? `${deviceIssueCount} ${t.deviceIssues}`
|
|
23
|
+
: `${deviceIssueCount} ${t.deviceIssue}`;
|
|
24
|
+
const accountLabel = accountIssueCount > 0
|
|
25
|
+
? `${accountIssueCount} ${t.accountIssues}`
|
|
26
|
+
: `${accountIssueCount} ${t.accountIssue}`;
|
|
27
|
+
if (accountIssueCount === 0 && deviceIssueCount === 0) {
|
|
28
|
+
return (_jsx(TableFilterBar, { filterCleared: true, children: _jsxs(TableFilterItem, { children: [_jsx(CheckIcon, {}), t.devicesAndAccountsOk] }) }));
|
|
19
29
|
}
|
|
20
|
-
return (
|
|
30
|
+
return (_jsxs(TableFilterBar, { filterCleared: filter == null, onFilterClear: () => {
|
|
21
31
|
onFilterSelect(null);
|
|
22
|
-
}, children: _jsxs(TableFilterItem, { onClick: toggle('device_issues'), selected: filter === 'device_issues', children: [_jsx(ExclamationCircleOutlineIcon, {}),
|
|
32
|
+
}, children: [deviceIssueCount > 0 && (_jsxs(TableFilterItem, { onClick: toggle('device_issues'), selected: filter === 'device_issues', children: [_jsx(ExclamationCircleOutlineIcon, {}), deviceLabel] })), accountIssueCount > 0 && (_jsxs(TableFilterItem, { onClick: toggle('account_issues'), selected: filter === 'account_issues', children: [_jsx(OnlineStatusAccountOfflineIcon, {}), accountLabel] }))] }));
|
|
23
33
|
}
|
|
24
34
|
const t = {
|
|
25
|
-
|
|
35
|
+
devicesAndAccountsOk: 'Devices & accounts OK',
|
|
36
|
+
accountIssue: 'account issue',
|
|
37
|
+
accountIssues: 'account issues',
|
|
26
38
|
deviceIssue: 'device issue',
|
|
27
39
|
deviceIssues: 'device issues',
|
|
28
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceHealthBar.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceTable/DeviceHealthBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"DeviceHealthBar.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceTable/DeviceHealthBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import classNames from 'classnames';
|
|
2
3
|
import { BatteryStatus } from '../../../../lib/ui/device/BatteryStatus.js';
|
|
3
4
|
import { DeviceImage } from '../../../../lib/ui/device/DeviceImage.js';
|
|
4
5
|
import { LockStatus } from '../../../../lib/ui/device/LockStatus.js';
|
|
@@ -7,6 +8,23 @@ import { TableCell } from '../../../../lib/ui/Table/TableCell.js';
|
|
|
7
8
|
import { TableRow } from '../../../../lib/ui/Table/TableRow.js';
|
|
8
9
|
import { Title } from '../../../../lib/ui/typography/Title.js';
|
|
9
10
|
export function DeviceRow({ device, onClick, }) {
|
|
10
|
-
|
|
11
|
+
const opacityClass = isAccountOffline(device) || isDeviceOffline(device)
|
|
12
|
+
? 'seam-offline-fade'
|
|
13
|
+
: undefined;
|
|
14
|
+
return (_jsxs(TableRow, { onClick: onClick, children: [_jsx(TableCell, { className: classNames('seam-image-cell', opacityClass), children: _jsx(DeviceImage, { device: device }) }), _jsxs(TableCell, { className: 'seam-body-cell', children: [_jsx(Title, { className: classNames('seam-truncated-text', opacityClass), children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [_jsx("span", { className: classNames('seam-device-model', opacityClass), children: device.properties.model.display_name }), _jsx(DeviceStatuses, { device: device })] })] })] }));
|
|
11
15
|
}
|
|
16
|
+
function DeviceStatuses({ device }) {
|
|
17
|
+
if (isAccountOffline(device) || isDeviceOffline(device)) {
|
|
18
|
+
return (_jsx("div", { className: 'seam-device-statuses', children: _jsx(OnlineStatus, { device: device }) }));
|
|
19
|
+
}
|
|
20
|
+
return (_jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), _jsx(BatteryStatus, { device: device }), _jsx(LockStatus, { device: device })] }));
|
|
21
|
+
}
|
|
22
|
+
const isAccountOffline = (device) => {
|
|
23
|
+
return (device.errors.filter((error) => error.error_code === 'account_disconnected')
|
|
24
|
+
.length > 0);
|
|
25
|
+
};
|
|
26
|
+
const isDeviceOffline = (device) => {
|
|
27
|
+
return (device.errors.filter((error) => error.error_code === 'device_disconnected')
|
|
28
|
+
.length > 0);
|
|
29
|
+
};
|
|
12
30
|
//# sourceMappingURL=DeviceRow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceRow.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceTable/DeviceRow.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"DeviceRow.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceTable/DeviceRow.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAMnC,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,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,MAAM,YAAY,GAChB,gBAAgB,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC;QACjD,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,SAAS,CAAA;IACf,OAAO,CACL,MAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,aACxB,KAAC,SAAS,IAAC,SAAS,EAAE,UAAU,CAAC,iBAAiB,EAAE,YAAY,CAAC,YAC/D,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GACrB,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,IAAC,SAAS,EAAE,UAAU,CAAC,qBAAqB,EAAE,YAAY,CAAC,YAC9D,MAAM,CAAC,UAAU,CAAC,IAAI,GACjB,EACR,eAAK,SAAS,EAAC,aAAa,aAC1B,eAAM,SAAS,EAAE,UAAU,CAAC,mBAAmB,EAAE,YAAY,CAAC,YAC3D,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,GAChC,EACP,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,GAAI,IAC9B,IACI,IACH,CACZ,CAAA;AACH,CAAC;AAMD,SAAS,cAAc,CAAC,EAAE,MAAM,EAAuB;IACrD,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE;QACvD,OAAO,CACL,cAAK,SAAS,EAAC,sBAAsB,YACnC,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,GAC5B,CACP,CAAA;KACF;IACD,OAAO,CACL,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,CACP,CAAA;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,MAA8B,EAAW,EAAE;IACnE,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,sBAAsB,CAAC;SACzE,MAAM,GAAG,CAAC,CACd,CAAA;AACH,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,MAA8B,EAAW,EAAE;IAClE,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,qBAAqB,CAAC;SACxE,MAAM,GAAG,CAAC,CACd,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -4,6 +4,7 @@ type Device = UseDevicesData[number];
|
|
|
4
4
|
export interface DeviceTableProps {
|
|
5
5
|
deviceIds?: string[];
|
|
6
6
|
connectedAccountIds?: string[];
|
|
7
|
+
disableLockUnlock?: boolean;
|
|
7
8
|
deviceFilter?: (device: Device, searchInputValue: string) => boolean;
|
|
8
9
|
deviceComparator?: (deviceA: Device, deviceB: Device) => number;
|
|
9
10
|
onDeviceClick?: (deviceId: string) => void;
|
|
@@ -11,5 +12,5 @@ export interface DeviceTableProps {
|
|
|
11
12
|
onBack?: () => void;
|
|
12
13
|
className?: string;
|
|
13
14
|
}
|
|
14
|
-
export declare function DeviceTable({ deviceIds, connectedAccountIds, onDeviceClick, preventDefaultOnDeviceClick, onBack, deviceFilter, deviceComparator, className, }?: DeviceTableProps): JSX.Element;
|
|
15
|
+
export declare function DeviceTable({ deviceIds, connectedAccountIds, disableLockUnlock, onDeviceClick, preventDefaultOnDeviceClick, onBack, deviceFilter, deviceComparator, className, }?: DeviceTableProps): JSX.Element;
|
|
15
16
|
export {};
|
|
@@ -20,7 +20,7 @@ const defaultDeviceFilter = (device, searchInputValue) => {
|
|
|
20
20
|
return true;
|
|
21
21
|
return new RegExp(value, 'i').test(device.properties.name ?? '');
|
|
22
22
|
};
|
|
23
|
-
export function DeviceTable({ deviceIds, connectedAccountIds, onDeviceClick = () => { }, preventDefaultOnDeviceClick = false, onBack, deviceFilter = defaultDeviceFilter, deviceComparator = compareByCreatedAtDesc, className, } = {}) {
|
|
23
|
+
export function DeviceTable({ deviceIds, connectedAccountIds, disableLockUnlock = false, onDeviceClick = () => { }, preventDefaultOnDeviceClick = false, onBack, deviceFilter = defaultDeviceFilter, deviceComparator = compareByCreatedAtDesc, className, } = {}) {
|
|
24
24
|
const { devices, isLoading, isError, error } = useDevices({
|
|
25
25
|
device_ids: deviceIds,
|
|
26
26
|
connected_account_ids: connectedAccountIds,
|
|
@@ -40,7 +40,7 @@ export function DeviceTable({ deviceIds, connectedAccountIds, onDeviceClick = ()
|
|
|
40
40
|
if (selectedDeviceId != null) {
|
|
41
41
|
return (_jsx(DeviceDetails, { className: className, deviceId: selectedDeviceId, onBack: () => {
|
|
42
42
|
setSelectedDeviceId(null);
|
|
43
|
-
} }));
|
|
43
|
+
}, disableLockUnlock: disableLockUnlock }));
|
|
44
44
|
}
|
|
45
45
|
if (isLoading) {
|
|
46
46
|
return _jsx("p", { className: className, children: "..." });
|
|
@@ -60,8 +60,12 @@ function Content(props) {
|
|
|
60
60
|
if (filter === null) {
|
|
61
61
|
return true;
|
|
62
62
|
}
|
|
63
|
+
if (filter === 'account_issues') {
|
|
64
|
+
return (device.errors.filter((error) => 'is_connected_account_error' in error)
|
|
65
|
+
.length > 0);
|
|
66
|
+
}
|
|
63
67
|
if (filter === 'device_issues') {
|
|
64
|
-
return device.errors.length > 0;
|
|
68
|
+
return (device.errors.filter((error) => 'is_device_error' in error).length > 0);
|
|
65
69
|
}
|
|
66
70
|
return true;
|
|
67
71
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAA;AAClF,OAAO,
|
|
1
|
+
{"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { OnlineStatusAccountOfflineIcon } from '../../../lib/icons/OnlineStatusAccountOffline.js';
|
|
2
3
|
import { OnlineStatusDeviceOfflineIcon } from '../../../lib/icons/OnlineStatusDeviceOffline.js';
|
|
3
4
|
import { OnlineStatusOnlineIcon } from '../../../lib/icons/OnlineStatusOnline.js';
|
|
4
5
|
export function OnlineStatus(props) {
|
|
5
|
-
const { device
|
|
6
|
-
|
|
6
|
+
const { device } = props;
|
|
7
|
+
const isAccountOffline = device.errors.filter((error) => error.error_code === 'account_disconnected')
|
|
8
|
+
.length > 0;
|
|
9
|
+
if (isAccountOffline) {
|
|
10
|
+
return _jsx(AccountOfflineContent, {});
|
|
11
|
+
}
|
|
12
|
+
return (_jsxs("div", { className: 'seam-online-status', children: [isAccountOffline && _jsx(OnlineStatusAccountOfflineIcon, {}), _jsx(DeviceOnlineContent, { isOnline: device.properties.online })] }));
|
|
13
|
+
}
|
|
14
|
+
function AccountOfflineContent() {
|
|
15
|
+
return (_jsxs("div", { className: 'seam-online-status', children: [_jsx(OnlineStatusAccountOfflineIcon, {}), _jsx("span", { className: 'seam-text-danger', children: t.accountOffline })] }));
|
|
7
16
|
}
|
|
8
|
-
function
|
|
17
|
+
function DeviceOnlineContent(props) {
|
|
9
18
|
const { isOnline } = props;
|
|
10
19
|
if (isOnline) {
|
|
11
20
|
return (_jsxs(_Fragment, { children: [_jsx(OnlineStatusOnlineIcon, {}), _jsx("span", { className: 'seam-status-text', children: t.online })] }));
|
|
@@ -14,6 +23,7 @@ function Content(props) {
|
|
|
14
23
|
}
|
|
15
24
|
const t = {
|
|
16
25
|
online: 'Online',
|
|
26
|
+
accountOffline: 'Account Offline',
|
|
17
27
|
deviceOffline: 'Device Offline',
|
|
18
28
|
};
|
|
19
29
|
//# sourceMappingURL=OnlineStatus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OnlineStatus.js","sourceRoot":"","sources":["../../../src/lib/ui/device/OnlineStatus.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAA;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAMxE,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,
|
|
1
|
+
{"version":3,"file":"OnlineStatus.js","sourceRoot":"","sources":["../../../src/lib/ui/device/OnlineStatus.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAA;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAA;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAMxE,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAExB,MAAM,gBAAgB,GACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,sBAAsB,CAAC;SACzE,MAAM,GAAG,CAAC,CAAA;IAEf,IAAI,gBAAgB,EAAE;QACpB,OAAO,KAAC,qBAAqB,KAAG,CAAA;KACjC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,oBAAoB,aAChC,gBAAgB,IAAI,KAAC,8BAA8B,KAAG,EACvD,KAAC,mBAAmB,IAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,GAAI,IACvD,CACP,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,CACL,eAAK,SAAS,EAAC,oBAAoB,aACjC,KAAC,8BAA8B,KAAG,EAClC,eAAM,SAAS,EAAC,kBAAkB,YAAE,CAAC,CAAC,cAAc,GAAQ,IACxD,CACP,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA4B;IACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAC1B,IAAI,QAAQ,EAAE;QACZ,OAAO,CACL,8BACE,KAAC,sBAAsB,KAAG,EAC1B,eAAM,SAAS,EAAC,kBAAkB,YAAE,CAAC,CAAC,MAAM,GAAQ,IACnD,CACJ,CAAA;KACF;IAED,OAAO,CACL,8BACE,KAAC,6BAA6B,KAAG,EACjC,eAAM,SAAS,EAAC,kBAAkB,YAAE,CAAC,CAAC,aAAa,GAAQ,IAC1D,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,MAAM,EAAE,QAAQ;IAChB,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,gBAAgB;CAChC,CAAA"}
|
package/lib/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const seamapiReactVersion = "1.
|
|
1
|
+
declare const seamapiReactVersion = "1.24.0";
|
|
2
2
|
export default seamapiReactVersion;
|
package/lib/version.js
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SVGProps } from 'react'
|
|
2
|
+
export const TriangleWarningOutlineIcon = (
|
|
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
|
+
<path
|
|
13
|
+
fill='#FF9800'
|
|
14
|
+
d='m12 6.49 7.53 13.01H4.47L12 6.49Zm0-3.99-11 19h22l-11-19Z'
|
|
15
|
+
/>
|
|
16
|
+
<path fill='#FF9800' d='M13 16.5h-2v2h2v-2ZM13 10.5h-2v5h2v-5Z' />
|
|
17
|
+
</svg>
|
|
18
|
+
)
|
|
@@ -18,12 +18,14 @@ import { useIsDateInPast } from 'lib/ui/use-is-date-in-past.js'
|
|
|
18
18
|
export interface AccessCodeDetailsProps {
|
|
19
19
|
accessCodeId: string
|
|
20
20
|
onBack?: () => void
|
|
21
|
+
disableLockUnlock?: boolean
|
|
21
22
|
className?: string
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
export function AccessCodeDetails({
|
|
25
26
|
accessCodeId,
|
|
26
27
|
onBack,
|
|
28
|
+
disableLockUnlock = false,
|
|
27
29
|
className,
|
|
28
30
|
}: AccessCodeDetailsProps): JSX.Element | null {
|
|
29
31
|
const { accessCode } = useAccessCode(accessCodeId)
|
|
@@ -43,6 +45,7 @@ export function AccessCodeDetails({
|
|
|
43
45
|
onBack={() => {
|
|
44
46
|
selectDevice(null)
|
|
45
47
|
}}
|
|
48
|
+
disableLockUnlock={disableLockUnlock}
|
|
46
49
|
/>
|
|
47
50
|
)
|
|
48
51
|
}
|
|
@@ -80,6 +83,7 @@ export function AccessCodeDetails({
|
|
|
80
83
|
|
|
81
84
|
<AccessCodeDevice
|
|
82
85
|
deviceId={accessCode.device_id}
|
|
86
|
+
disableLockUnlock={disableLockUnlock}
|
|
83
87
|
onSelectDevice={selectDevice}
|
|
84
88
|
/>
|
|
85
89
|
</div>
|
|
@@ -8,12 +8,16 @@ import { TextButton } from 'lib/ui/TextButton.js'
|
|
|
8
8
|
|
|
9
9
|
export function AccessCodeDevice({
|
|
10
10
|
deviceId,
|
|
11
|
+
disableLockUnlock,
|
|
11
12
|
onSelectDevice,
|
|
12
13
|
}: {
|
|
13
14
|
deviceId: string
|
|
15
|
+
disableLockUnlock: boolean
|
|
14
16
|
onSelectDevice: (deviceId: string) => void
|
|
15
17
|
}): JSX.Element | null {
|
|
16
|
-
const { isLoading, device } = useDevice({
|
|
18
|
+
const { isLoading, device } = useDevice({
|
|
19
|
+
device_id: deviceId,
|
|
20
|
+
})
|
|
17
21
|
|
|
18
22
|
if (isLoading) {
|
|
19
23
|
return null
|
|
@@ -27,14 +31,21 @@ export function AccessCodeDevice({
|
|
|
27
31
|
return null
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
return
|
|
34
|
+
return (
|
|
35
|
+
<Content
|
|
36
|
+
device={device}
|
|
37
|
+
disableLockUnlock={disableLockUnlock}
|
|
38
|
+
onSelectDevice={onSelectDevice}
|
|
39
|
+
/>
|
|
40
|
+
)
|
|
31
41
|
}
|
|
32
42
|
|
|
33
43
|
function Content(props: {
|
|
34
44
|
device: LockDevice
|
|
45
|
+
disableLockUnlock: boolean
|
|
35
46
|
onSelectDevice: (deviceId: string) => void
|
|
36
47
|
}): JSX.Element {
|
|
37
|
-
const { device, onSelectDevice } = props
|
|
48
|
+
const { device, disableLockUnlock, onSelectDevice } = props
|
|
38
49
|
const toggleLock = useToggleLock(device)
|
|
39
50
|
|
|
40
51
|
const toggleLockLabel = device.properties.locked ? t.unlock : t.lock
|
|
@@ -54,13 +65,15 @@ function Content(props: {
|
|
|
54
65
|
{t.deviceDetails}
|
|
55
66
|
</TextButton>
|
|
56
67
|
</div>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
68
|
+
{!disableLockUnlock && (
|
|
69
|
+
<Button
|
|
70
|
+
onClick={() => {
|
|
71
|
+
toggleLock.mutate()
|
|
72
|
+
}}
|
|
73
|
+
>
|
|
74
|
+
{toggleLockLabel}
|
|
75
|
+
</Button>
|
|
76
|
+
)}
|
|
64
77
|
</div>
|
|
65
78
|
)
|
|
66
79
|
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CheckIcon } from 'lib/icons/Check.js'
|
|
2
|
+
import { ExclamationCircleOutlineIcon } from 'lib/icons/ExclamationCircleOutline.js'
|
|
3
|
+
import type { UseAccessCodesData } from 'lib/seam/access-codes/use-access-codes.js'
|
|
4
|
+
import { TableFilterBar } from 'lib/ui/Table/TableFilterBar/TableFilterBar.js'
|
|
5
|
+
import { TableFilterItem } from 'lib/ui/Table/TableFilterBar/TableFilterItem.js'
|
|
6
|
+
|
|
7
|
+
export type AccessCodeFilter = 'access_code_issues'
|
|
8
|
+
|
|
9
|
+
interface AccessCodeHealthBarProps {
|
|
10
|
+
accessCodes: Array<UseAccessCodesData[number]>
|
|
11
|
+
filter: AccessCodeFilter | null
|
|
12
|
+
onFilterSelect: (filter: AccessCodeFilter | null) => void
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function AccessCodeHealthBar({
|
|
16
|
+
accessCodes,
|
|
17
|
+
filter,
|
|
18
|
+
onFilterSelect,
|
|
19
|
+
}: AccessCodeHealthBarProps): JSX.Element {
|
|
20
|
+
const codesWithIssues = accessCodes.filter(
|
|
21
|
+
({ errors, warnings }) => errors.length > 0 || warnings.length > 0
|
|
22
|
+
)
|
|
23
|
+
const issueCount = codesWithIssues.length
|
|
24
|
+
|
|
25
|
+
const toggle = (target: AccessCodeFilter) => () => {
|
|
26
|
+
const newFilter = target === filter ? null : target
|
|
27
|
+
onFilterSelect(newFilter)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const isPlural = issueCount === 0 || issueCount > 1
|
|
31
|
+
const label = isPlural
|
|
32
|
+
? `${issueCount} ${t.accessCodeIssues}`
|
|
33
|
+
: `${issueCount} ${t.accessCodeIssue}`
|
|
34
|
+
|
|
35
|
+
if (issueCount === 0) {
|
|
36
|
+
return (
|
|
37
|
+
<TableFilterBar filterCleared>
|
|
38
|
+
<TableFilterItem>
|
|
39
|
+
<CheckIcon />
|
|
40
|
+
{t.accessCodesOk}
|
|
41
|
+
</TableFilterItem>
|
|
42
|
+
</TableFilterBar>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<TableFilterBar
|
|
48
|
+
filterCleared={filter == null}
|
|
49
|
+
onFilterClear={() => {
|
|
50
|
+
onFilterSelect(null)
|
|
51
|
+
}}
|
|
52
|
+
>
|
|
53
|
+
<TableFilterItem
|
|
54
|
+
onClick={toggle('access_code_issues')}
|
|
55
|
+
selected={filter === 'access_code_issues'}
|
|
56
|
+
>
|
|
57
|
+
<ExclamationCircleOutlineIcon />
|
|
58
|
+
{label}
|
|
59
|
+
</TableFilterItem>
|
|
60
|
+
</TableFilterBar>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const t = {
|
|
65
|
+
accessCodesOk: 'Access codes OK',
|
|
66
|
+
accessCodeIssue: 'access code issue',
|
|
67
|
+
accessCodeIssues: 'access code issues',
|
|
68
|
+
}
|
|
@@ -5,11 +5,16 @@ import { compareByCreatedAtDesc } from 'lib/dates.js'
|
|
|
5
5
|
import { AccessCodeKeyIcon } from 'lib/icons/AccessCodeKey.js'
|
|
6
6
|
import { CopyIcon } from 'lib/icons/Copy.js'
|
|
7
7
|
import { ExclamationCircleOutlineIcon } from 'lib/icons/ExclamationCircleOutline.js'
|
|
8
|
+
import { TriangleWarningOutlineIcon } from 'lib/icons/TriangleWarningOutline.js'
|
|
8
9
|
import {
|
|
9
10
|
useAccessCodes,
|
|
10
11
|
type UseAccessCodesData,
|
|
11
12
|
} from 'lib/seam/access-codes/use-access-codes.js'
|
|
12
13
|
import { AccessCodeDetails } from 'lib/seam/components/AccessCodeDetails/AccessCodeDetails.js'
|
|
14
|
+
import {
|
|
15
|
+
type AccessCodeFilter,
|
|
16
|
+
AccessCodeHealthBar,
|
|
17
|
+
} from 'lib/seam/components/AccessCodeTable/AccessCodeHealthBar.js'
|
|
13
18
|
import { CodeDetails } from 'lib/seam/components/AccessCodeTable/CodeDetails.js'
|
|
14
19
|
import { copyToClipboard } from 'lib/ui/clipboard.js'
|
|
15
20
|
import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
|
|
@@ -27,6 +32,7 @@ import { Title } from 'lib/ui/typography/Title.js'
|
|
|
27
32
|
|
|
28
33
|
export interface AccessCodeTableProps {
|
|
29
34
|
deviceId: string
|
|
35
|
+
disableLockUnlock?: boolean
|
|
30
36
|
accessCodeFilter?: (
|
|
31
37
|
accessCode: AccessCode,
|
|
32
38
|
searchInputValue: string
|
|
@@ -49,11 +55,16 @@ const defaultAccessCodeFilter = (
|
|
|
49
55
|
): boolean => {
|
|
50
56
|
const value = searchInputValue.trim()
|
|
51
57
|
if (value === '') return true
|
|
52
|
-
|
|
58
|
+
const searchRegex = new RegExp(value, 'i')
|
|
59
|
+
return (
|
|
60
|
+
searchRegex.test(accessCode?.name ?? '') ||
|
|
61
|
+
searchRegex.test(accessCode?.code ?? '')
|
|
62
|
+
)
|
|
53
63
|
}
|
|
54
64
|
|
|
55
65
|
export function AccessCodeTable({
|
|
56
66
|
deviceId,
|
|
67
|
+
disableLockUnlock = false,
|
|
57
68
|
onAccessCodeClick = () => {},
|
|
58
69
|
preventDefaultOnAccessCodeClick = false,
|
|
59
70
|
onBack,
|
|
@@ -100,6 +111,7 @@ export function AccessCodeTable({
|
|
|
100
111
|
onBack={() => {
|
|
101
112
|
setSelectedAccessCodeId(null)
|
|
102
113
|
}}
|
|
114
|
+
disableLockUnlock={disableLockUnlock}
|
|
103
115
|
/>
|
|
104
116
|
)
|
|
105
117
|
}
|
|
@@ -132,6 +144,21 @@ function Content(props: {
|
|
|
132
144
|
onAccessCodeClick: (accessCodeId: string) => void
|
|
133
145
|
}): JSX.Element {
|
|
134
146
|
const { accessCodes, onAccessCodeClick } = props
|
|
147
|
+
const [filter, setFilter] = useState<AccessCodeFilter | null>(null)
|
|
148
|
+
|
|
149
|
+
const filteredAccessCodes = useMemo(() => {
|
|
150
|
+
if (filter === null) {
|
|
151
|
+
return accessCodes
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (filter === 'access_code_issues') {
|
|
155
|
+
return accessCodes.filter((accessCode) => {
|
|
156
|
+
return accessCode.errors.length > 0 || accessCode.warnings.length > 0
|
|
157
|
+
})
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return accessCodes
|
|
161
|
+
}, [accessCodes, filter])
|
|
135
162
|
|
|
136
163
|
if (accessCodes.length === 0) {
|
|
137
164
|
return <EmptyPlaceholder>{t.noAccessCodesMessage}</EmptyPlaceholder>
|
|
@@ -139,7 +166,12 @@ function Content(props: {
|
|
|
139
166
|
|
|
140
167
|
return (
|
|
141
168
|
<>
|
|
142
|
-
|
|
169
|
+
<AccessCodeHealthBar
|
|
170
|
+
accessCodes={accessCodes}
|
|
171
|
+
filter={filter}
|
|
172
|
+
onFilterSelect={setFilter}
|
|
173
|
+
/>
|
|
174
|
+
{filteredAccessCodes.map((accessCode) => (
|
|
143
175
|
<AccessCodeRow
|
|
144
176
|
key={accessCode.access_code_id}
|
|
145
177
|
accessCode={accessCode}
|
|
@@ -158,14 +190,18 @@ function AccessCodeRow(props: {
|
|
|
158
190
|
}): JSX.Element {
|
|
159
191
|
const { onClick, accessCode } = props
|
|
160
192
|
|
|
161
|
-
const errorCount = accessCode.errors
|
|
193
|
+
const errorCount = accessCode.errors.length
|
|
194
|
+
const warningCount = accessCode.warnings.length
|
|
162
195
|
const isPlural = errorCount === 0 || errorCount > 1
|
|
163
|
-
const
|
|
196
|
+
const errorIconTitle = isPlural
|
|
164
197
|
? `${errorCount} ${t.codeIssues}`
|
|
165
198
|
: `${errorCount} ${t.codeIssue}`
|
|
199
|
+
const warningIconTitle = isPlural
|
|
200
|
+
? `${warningCount} ${t.codeIssues}`
|
|
201
|
+
: `${warningCount} ${t.codeIssue}`
|
|
166
202
|
|
|
167
203
|
return (
|
|
168
|
-
<TableRow
|
|
204
|
+
<TableRow onClick={onClick}>
|
|
169
205
|
<TableCell className='seam-icon-cell'>
|
|
170
206
|
<div>
|
|
171
207
|
<AccessCodeKeyIcon />
|
|
@@ -177,10 +213,15 @@ function AccessCodeRow(props: {
|
|
|
177
213
|
</TableCell>
|
|
178
214
|
<TableCell className='seam-action-cell'>
|
|
179
215
|
{errorCount > 0 && (
|
|
180
|
-
<div className='seam-code-issue-icon-wrap' title={
|
|
216
|
+
<div className='seam-code-issue-icon-wrap' title={errorIconTitle}>
|
|
181
217
|
<ExclamationCircleOutlineIcon />
|
|
182
218
|
</div>
|
|
183
219
|
)}
|
|
220
|
+
{errorCount === 0 && warningCount > 0 && (
|
|
221
|
+
<div className='seam-code-issue-icon-wrap' title={warningIconTitle}>
|
|
222
|
+
<TriangleWarningOutlineIcon />
|
|
223
|
+
</div>
|
|
224
|
+
)}
|
|
184
225
|
<MoreActionsMenu
|
|
185
226
|
menuProps={{
|
|
186
227
|
backgroundProps: {
|
|
@@ -5,12 +5,14 @@ import { useDevice } from 'lib/seam/devices/use-device.js'
|
|
|
5
5
|
|
|
6
6
|
export interface DeviceDetailsProps {
|
|
7
7
|
deviceId: string
|
|
8
|
+
disableLockUnlock?: boolean
|
|
8
9
|
onBack?: () => void
|
|
9
10
|
className?: string
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
export function DeviceDetails({
|
|
13
14
|
deviceId,
|
|
15
|
+
disableLockUnlock = false,
|
|
14
16
|
onBack,
|
|
15
17
|
className,
|
|
16
18
|
}: DeviceDetailsProps): JSX.Element | null {
|
|
@@ -27,6 +29,7 @@ export function DeviceDetails({
|
|
|
27
29
|
<LockDeviceDetails
|
|
28
30
|
className={className}
|
|
29
31
|
device={device}
|
|
32
|
+
disableLockUnlock={disableLockUnlock}
|
|
30
33
|
onBack={onBack}
|
|
31
34
|
/>
|
|
32
35
|
)
|