@seamapi/react 1.46.3 → 1.47.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 +15 -4
- package/dist/elements.js +3269 -3231
- package/dist/elements.js.map +1 -1
- package/dist/index.css +79 -79
- package/dist/index.css.map +1 -1
- package/dist/index.min.css +1 -1
- package/dist/index.min.css.map +1 -1
- package/lib/seam/components/AccessCodeDetails/AccessCodeDevice.js +1 -1
- package/lib/seam/components/AccessCodeDetails/AccessCodeDevice.js.map +1 -1
- package/lib/seam/components/AccessCodeTable/AccessCodeMenu.js +1 -1
- package/lib/seam/components/AccessCodeTable/AccessCodeMenu.js.map +1 -1
- package/lib/seam/components/AccessCodeTable/AccessCodeRow.js +1 -1
- package/lib/seam/components/AccessCodeTable/AccessCodeRow.js.map +1 -1
- package/lib/seam/components/AccessCodeTable/AccessCodeTable.js +6 -5
- package/lib/seam/components/AccessCodeTable/AccessCodeTable.js.map +1 -1
- package/lib/seam/components/AccessCodeTable/CodeDetails.js +1 -1
- package/lib/seam/components/AccessCodeTable/CodeDetails.js.map +1 -1
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleDetails.d.ts +5 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleDetails.js +30 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleDetails.js.map +1 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.d.ts +8 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.js +10 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.js.map +1 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.d.ts +7 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js +38 -0
- package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js.map +1 -0
- package/lib/seam/components/DeviceDetails/DeviceModel.js +2 -2
- package/lib/seam/components/DeviceDetails/DeviceModel.js.map +1 -1
- package/lib/seam/components/DeviceTable/DeviceRow.js +2 -2
- package/lib/seam/components/DeviceTable/DeviceRow.js.map +1 -1
- package/lib/seam/components/DeviceTable/DeviceTable.js +1 -1
- package/lib/seam/components/DeviceTable/DeviceTable.js.map +1 -1
- package/lib/ui/thermostat/ClimateSettingStatus.d.ts +1 -1
- package/lib/ui/thermostat/ClimateSettingStatus.js +5 -1
- package/lib/ui/thermostat/ClimateSettingStatus.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +4 -4
- package/src/lib/seam/components/AccessCodeDetails/AccessCodeDevice.tsx +4 -1
- package/src/lib/seam/components/AccessCodeTable/AccessCodeMenu.tsx +1 -1
- package/src/lib/seam/components/AccessCodeTable/AccessCodeRow.tsx +2 -2
- package/src/lib/seam/components/AccessCodeTable/AccessCodeTable.tsx +7 -6
- package/src/lib/seam/components/AccessCodeTable/CodeDetails.tsx +1 -1
- package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleDetails.tsx +61 -0
- package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.tsx +35 -0
- package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.element.ts +13 -0
- package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.tsx +93 -0
- package/src/lib/seam/components/DeviceDetails/DeviceModel.tsx +1 -0
- package/src/lib/seam/components/DeviceTable/DeviceRow.tsx +1 -0
- package/src/lib/seam/components/DeviceTable/DeviceTable.tsx +1 -1
- package/src/lib/ui/thermostat/ClimateSettingStatus.tsx +11 -3
- package/src/lib/version.ts +1 -1
- package/src/styles/_main.scss +2 -2
- package/src/styles/{_access-code-table.scss → _seam-table.scss} +5 -5
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { UseClimateSettingSchedulesData } from '../../../../lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js';
|
|
3
|
+
interface ClimateSettingScheduleRowProps {
|
|
4
|
+
climateSettingSchedule: UseClimateSettingSchedulesData[number];
|
|
5
|
+
onClick: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function ClimateSettingScheduleRow({ climateSettingSchedule, onClick, }: ClimateSettingScheduleRowProps): JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ClimateSettingScheduleIcon } from '../../../../lib/icons/ClimateSettingSchedule.js';
|
|
3
|
+
import { TableCell } from '../../../../lib/ui/Table/TableCell.js';
|
|
4
|
+
import { TableRow } from '../../../../lib/ui/Table/TableRow.js';
|
|
5
|
+
import { Title } from '../../../../lib/ui/typography/Title.js';
|
|
6
|
+
import { ClimateSettingScheduleDetails } from './ClimateSettingScheduleDetails.js';
|
|
7
|
+
export function ClimateSettingScheduleRow({ climateSettingSchedule, onClick, }) {
|
|
8
|
+
return (_jsxs(TableRow, { onClick: onClick, children: [_jsx(TableCell, { className: 'seam-icon-cell', children: _jsx("div", { children: _jsx(ClimateSettingScheduleIcon, {}) }) }), _jsxs(TableCell, { className: 'seam-name-cell', children: [_jsx(Title, { className: 'seam-truncated-text', children: climateSettingSchedule.name }), _jsx(ClimateSettingScheduleDetails, { climateSettingSchedule: climateSettingSchedule })] })] }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ClimateSettingScheduleRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClimateSettingScheduleRow.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAA;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAOlF,MAAM,UAAU,yBAAyB,CAAC,EACxC,sBAAsB,EACtB,OAAO,GACwB;IAC/B,OAAO,CACL,MAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,aACxB,KAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,YACnC,wBACE,KAAC,0BAA0B,KAAG,GAC1B,GACI,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,IAAC,SAAS,EAAC,qBAAqB,YACnC,sBAAsB,CAAC,IAAI,GACtB,EACR,KAAC,6BAA6B,IAC5B,sBAAsB,EAAE,sBAAsB,GAC9C,IACQ,IACH,CACZ,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface ClimateSettingScheduleTableProps {
|
|
3
|
+
deviceId: string;
|
|
4
|
+
onBack?: () => void;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function ClimateSettingScheduleTable({ deviceId, onBack, className, }: ClimateSettingScheduleTableProps): JSX.Element;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
import { useClimateSettingSchedules, } from '../../../../lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js';
|
|
4
|
+
import { ContentHeader } from '../../../../lib/ui/layout/ContentHeader.js';
|
|
5
|
+
import { EmptyPlaceholder } from '../../../../lib/ui/Table/EmptyPlaceholder.js';
|
|
6
|
+
import { TableBody } from '../../../../lib/ui/Table/TableBody.js';
|
|
7
|
+
import { TableHeader } from '../../../../lib/ui/Table/TableHeader.js';
|
|
8
|
+
import { TableTitle } from '../../../../lib/ui/Table/TableTitle.js';
|
|
9
|
+
import { Caption } from '../../../../lib/ui/typography/Caption.js';
|
|
10
|
+
import { ClimateSettingScheduleRow } from './ClimateSettingScheduleRow.js';
|
|
11
|
+
export function ClimateSettingScheduleTable({ deviceId, onBack, className, }) {
|
|
12
|
+
const { climateSettingSchedules, isLoading, isError, error } = useClimateSettingSchedules({
|
|
13
|
+
device_id: deviceId,
|
|
14
|
+
});
|
|
15
|
+
// TODO filtering
|
|
16
|
+
const filteredClimateSettingSchedules = climateSettingSchedules ?? [];
|
|
17
|
+
if (isLoading) {
|
|
18
|
+
return _jsx("p", { className: className, children: "..." });
|
|
19
|
+
}
|
|
20
|
+
if (isError) {
|
|
21
|
+
return _jsx("p", { className: className, children: error?.message });
|
|
22
|
+
}
|
|
23
|
+
return (_jsxs("div", { className: classNames('seam-table', className), children: [_jsx(ContentHeader, { onBack: onBack }), _jsx(TableHeader, { children: _jsxs(TableTitle, { children: [t.climateSettingSchedules, ' ', _jsxs(Caption, { children: ["(", filteredClimateSettingSchedules.length, ")"] })] }) }), _jsx(TableBody, { children: _jsx(Content, { climateSettingSchedules: filteredClimateSettingSchedules, onClimateSettingScheduleClick: () => { } }) })] }));
|
|
24
|
+
}
|
|
25
|
+
function Content(props) {
|
|
26
|
+
const { climateSettingSchedules, onClimateSettingScheduleClick } = props;
|
|
27
|
+
if (climateSettingSchedules.length === 0) {
|
|
28
|
+
return (_jsx(EmptyPlaceholder, { children: t.noClimateSettingSchedulesMessage }));
|
|
29
|
+
}
|
|
30
|
+
return (_jsx(_Fragment, { children: climateSettingSchedules.map((schedule) => (_jsx(ClimateSettingScheduleRow, { climateSettingSchedule: schedule, onClick: () => {
|
|
31
|
+
onClimateSettingScheduleClick(schedule.climate_setting_schedule_id);
|
|
32
|
+
} }, schedule.climate_setting_schedule_id))) }));
|
|
33
|
+
}
|
|
34
|
+
const t = {
|
|
35
|
+
climateSettingSchedules: 'Climate setting schedules',
|
|
36
|
+
noClimateSettingSchedulesMessage: 'Sorry, no climate setting schedules were found',
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=ClimateSettingScheduleTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClimateSettingScheduleTable.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAEnC,OAAO,EACL,0BAA0B,GAE3B,MAAM,iFAAiF,CAAA;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAEtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAQ1E,MAAM,UAAU,2BAA2B,CAAC,EAC1C,QAAQ,EACR,MAAM,EACN,SAAS,GACwB;IACjC,MAAM,EAAE,uBAAuB,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,GAC1D,0BAA0B,CAAC;QACzB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;IAEJ,iBAAiB;IACjB,MAAM,+BAA+B,GAAG,uBAAuB,IAAI,EAAE,CAAA;IAErE,IAAI,SAAS,EAAE;QACb,OAAO,YAAG,SAAS,EAAE,SAAS,oBAAS,CAAA;KACxC;IAED,IAAI,OAAO,EAAE;QACX,OAAO,YAAG,SAAS,EAAE,SAAS,YAAG,KAAK,EAAE,OAAO,GAAK,CAAA;KACrD;IAED,OAAO,CACL,eAAK,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,aACjD,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,cACV,MAAC,UAAU,eACR,CAAC,CAAC,uBAAuB,EAAE,GAAG,EAC/B,MAAC,OAAO,oBAAG,+BAA+B,CAAC,MAAM,SAAY,IAClD,GACD,EACd,KAAC,SAAS,cACR,KAAC,OAAO,IACN,uBAAuB,EAAE,+BAA+B,EACxD,6BAA6B,EAAE,GAAG,EAAE,GAAE,CAAC,GACvC,GACQ,IACR,CACP,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAGhB;IACC,MAAM,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,GAAG,KAAK,CAAA;IAExE,IAAI,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE;QACxC,OAAO,CACL,KAAC,gBAAgB,cAAE,CAAC,CAAC,gCAAgC,GAAoB,CAC1E,CAAA;KACF;IAED,OAAO,CACL,4BACG,uBAAuB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACzC,KAAC,yBAAyB,IACxB,sBAAsB,EAAE,QAAQ,EAEhC,OAAO,EAAE,GAAG,EAAE;gBACZ,6BAA6B,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAA;YACrE,CAAC,IAHI,QAAQ,CAAC,2BAA2B,CAIzC,CACH,CAAC,GACD,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,uBAAuB,EAAE,2BAA2B;IACpD,gCAAgC,EAC9B,gDAAgD;CACnD,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { jsxs as _jsxs,
|
|
1
|
+
import { jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
export function DeviceModel({ device }) {
|
|
3
|
-
return (_jsxs(_Fragment, { children: [_jsxs("span", { className: 'seam-label', children: [t.model, ":"] }), ' ',
|
|
3
|
+
return (_jsxs(_Fragment, { children: [_jsxs("span", { className: 'seam-label', children: [t.model, ":"] }), ' ', _jsxs("div", { className: 'seam-device-model', children: [device.properties.model.manufacturer_display_name, ' ', device.properties.model.display_name] })] }));
|
|
4
4
|
}
|
|
5
5
|
const t = {
|
|
6
6
|
model: 'Model',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceModel.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceDetails/DeviceModel.tsx"],"names":[],"mappings":";AAMA,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAoB;IACtD,OAAO,CACL,8BACE,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,KAAK,SAAS,EAAC,GAAG,EAClD,
|
|
1
|
+
{"version":3,"file":"DeviceModel.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceDetails/DeviceModel.tsx"],"names":[],"mappings":";AAMA,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAoB;IACtD,OAAO,CACL,8BACE,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,KAAK,SAAS,EAAC,GAAG,EAClD,eAAK,SAAS,EAAC,mBAAmB,aAC/B,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,EACtD,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,IACjC,IACL,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,KAAK,EAAE,OAAO;CACf,CAAA"}
|
|
@@ -15,8 +15,8 @@ export function DeviceRow({ device, onClick, }) {
|
|
|
15
15
|
'seam-offline-fade': isDisconnected,
|
|
16
16
|
}), children: _jsx(DeviceImage, { device: device }) }), _jsxs(TableCell, { className: 'seam-body-cell', children: [_jsx(Title, { className: classNames('seam-truncated-text', {
|
|
17
17
|
'seam-offline-fade': isDisconnected,
|
|
18
|
-
}), children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [
|
|
18
|
+
}), children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [_jsxs("span", { className: classNames('seam-device-model', {
|
|
19
19
|
'seam-offline-fade': isDisconnected,
|
|
20
|
-
}), children: device.properties.model.display_name }), _jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), isConnected && _jsx(BatteryStatus, { device: device }), isConnected && _jsx(LockStatus, { device: device })] })] })] })] }));
|
|
20
|
+
}), children: [device.properties.model.manufacturer_display_name, ' ', device.properties.model.display_name] }), _jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), isConnected && _jsx(BatteryStatus, { device: device }), isConnected && _jsx(LockStatus, { device: device })] })] })] })] }));
|
|
21
21
|
}
|
|
22
22
|
//# sourceMappingURL=DeviceRow.js.map
|
|
@@ -1 +1 @@
|
|
|
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,EACL,sBAAsB,EACtB,YAAY,GACb,MAAM,+BAA+B,CAAA;AACtC,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,eAAe,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAA;IACjD,MAAM,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,eAAe,CAAA;IACxE,MAAM,WAAW,GAAG,CAAC,cAAc,CAAA;IAEnC,OAAO,CACL,MAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,aACxB,KAAC,SAAS,IACR,SAAS,EAAE,UAAU,CAAC,iBAAiB,EAAE;oBACvC,mBAAmB,EAAE,cAAc;iBACpC,CAAC,YAEF,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GACrB,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,IACJ,SAAS,EAAE,UAAU,CAAC,qBAAqB,EAAE;4BAC3C,mBAAmB,EAAE,cAAc;yBACpC,CAAC,YAED,MAAM,CAAC,UAAU,CAAC,IAAI,GACjB,EACR,eAAK,SAAS,EAAC,aAAa,aAC1B,
|
|
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,EACL,sBAAsB,EACtB,YAAY,GACb,MAAM,+BAA+B,CAAA;AACtC,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,eAAe,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAA;IACjD,MAAM,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,eAAe,CAAA;IACxE,MAAM,WAAW,GAAG,CAAC,cAAc,CAAA;IAEnC,OAAO,CACL,MAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,aACxB,KAAC,SAAS,IACR,SAAS,EAAE,UAAU,CAAC,iBAAiB,EAAE;oBACvC,mBAAmB,EAAE,cAAc;iBACpC,CAAC,YAEF,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GACrB,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,IACJ,SAAS,EAAE,UAAU,CAAC,qBAAqB,EAAE;4BAC3C,mBAAmB,EAAE,cAAc;yBACpC,CAAC,YAED,MAAM,CAAC,UAAU,CAAC,IAAI,GACjB,EACR,eAAK,SAAS,EAAC,aAAa,aAC1B,gBACE,SAAS,EAAE,UAAU,CAAC,mBAAmB,EAAE;oCACzC,mBAAmB,EAAE,cAAc;iCACpC,CAAC,aAED,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,EACtD,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,IAChC,EACP,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAC/B,WAAW,IAAI,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EAChD,WAAW,IAAI,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,IAC1C,IACF,IACI,IACH,CACZ,CAAA;AACH,CAAC"}
|
|
@@ -18,7 +18,7 @@ const defaultDeviceFilter = (device, searchInputValue) => {
|
|
|
18
18
|
const value = searchInputValue.trim();
|
|
19
19
|
if (value === '')
|
|
20
20
|
return true;
|
|
21
|
-
return
|
|
21
|
+
return device.properties.name.toLowerCase().includes(value);
|
|
22
22
|
};
|
|
23
23
|
export function DeviceTable({ deviceIds, connectedAccountIds, disableLockUnlock = false, disableSearch = false, onDeviceClick = () => { }, preventDefaultOnDeviceClick = false, onBack, deviceFilter = defaultDeviceFilter, deviceComparator = compareByCreatedAtDesc, heading = t.devices, title = t.devices, className, } = {}) {
|
|
24
24
|
const { devices, isLoading, isError, error } = useDevices({
|
|
@@ -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,EAGL,eAAe,GAChB,MAAM,oDAAoD,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAA;AACxE,OAAO,EACL,UAAU,GAEX,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAsBtD,MAAM,mBAAmB,GAAG,CAC1B,MAAc,EACd,gBAAwB,EACf,EAAE;IACX,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAA;IACrC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,
|
|
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,EAGL,eAAe,GAChB,MAAM,oDAAoD,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAA;AACxE,OAAO,EACL,UAAU,GAEX,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAsBtD,MAAM,mBAAmB,GAAG,CAC1B,MAAc,EACd,gBAAwB,EACf,EAAE;IACX,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAA;IACrC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,SAAS,EACT,mBAAmB,EACnB,iBAAiB,GAAG,KAAK,EACzB,aAAa,GAAG,KAAK,EACrB,aAAa,GAAG,GAAG,EAAE,GAAE,CAAC,EACxB,2BAA2B,GAAG,KAAK,EACnC,MAAM,EACN,YAAY,GAAG,mBAAmB,EAClC,gBAAgB,GAAG,sBAAsB,EACzC,OAAO,GAAG,CAAC,CAAC,OAAO,EACnB,KAAK,GAAG,CAAC,CAAC,OAAO,EACjB,SAAS,MACW,EAAE;IACtB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;QACxD,UAAU,EAAE,SAAS;QACrB,qBAAqB,EAAE,mBAAmB;KAC3C,CAAC,CAAA;IAEF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAC7E,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE5D,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CACH,OAAO;QACL,EAAE,MAAM,CAAC,YAAY,CAAC;QACtB,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC5D,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAClC,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAC5D,CAAA;IAED,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,QAAgB,EAAQ,EAAE;QACzB,aAAa,CAAC,QAAQ,CAAC,CAAA;QACvB,IAAI,2BAA2B;YAAE,OAAM;QACvC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC,EACD,CAAC,aAAa,EAAE,2BAA2B,EAAE,mBAAmB,CAAC,CAClE,CAAA;IAED,IAAI,gBAAgB,IAAI,IAAI,EAAE;QAC5B,OAAO,CACL,KAAC,aAAa,IACZ,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,GAAG,EAAE;gBACX,mBAAmB,CAAC,IAAI,CAAC,CAAA;YAC3B,CAAC,EACD,iBAAiB,EAAE,iBAAiB,GACpC,CACH,CAAA;KACF;IAED,IAAI,SAAS,EAAE;QACb,OAAO,YAAG,SAAS,EAAE,SAAS,oBAAS,CAAA;KACxC;IAED,IAAI,OAAO,EAAE;QACX,OAAO,YAAG,SAAS,EAAE,SAAS,YAAG,KAAK,EAAE,OAAO,GAAK,CAAA;KACrD;IAED,OAAO,CACL,eAAK,SAAS,EAAE,UAAU,CAAC,mBAAmB,EAAE,SAAS,CAAC,aACxD,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,MAAC,WAAW,eACT,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CACf,MAAC,UAAU,eACR,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,EACnC,MAAC,OAAO,oBAAG,eAAe,CAAC,MAAM,SAAY,IAClC,CACd,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,eAAe,GAAG,CAClC,EACA,CAAC,aAAa,IAAI,CACjB,KAAC,eAAe,IACd,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,GACtC,CACH,IACW,EACd,KAAC,SAAS,cACR,KAAC,OAAO,IAAC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,GAAI,GAC7D,IACR,CACP,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAGhB;IACC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAClC,IAAI,CACL,CAAA;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,KAAC,gBAAgB,cAAE,CAAC,CAAC,gBAAgB,GAAoB,CAAA;KACjE;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAChD,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,MAAM,KAAK,gBAAgB,EAAE;YAC/B,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,4BAA4B,IAAI,KAAK,CAAC;iBACnE,MAAM,GAAG,CAAC,CACd,CAAA;SACF;QAED,IAAI,MAAM,KAAK,eAAe,EAAE;YAC9B,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CACvE,CAAA;SACF;QAED,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,OAAO,CACL,8BACE,KAAC,eAAe,IACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,SAAS,GACzB,EACD,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC/B,KAAC,SAAS,IACR,MAAM,EAAE,MAAM,EAEd,OAAO,EAAE,GAAG,EAAE;oBACZ,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;gBACjC,CAAC,IAHI,MAAM,CAAC,SAAS,CAIrB,CACH,CAAC,IACD,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,8BAA8B;CACjD,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import type { ClimateSetting } from 'seamapi';
|
|
3
3
|
interface ClimateSettingStatusProps {
|
|
4
|
-
climateSetting: ClimateSetting
|
|
4
|
+
climateSetting: Partial<ClimateSetting>;
|
|
5
5
|
temperatureUnit?: 'fahrenheit' | 'celsius';
|
|
6
6
|
iconPlacement?: 'left' | 'right';
|
|
7
7
|
}
|
|
@@ -4,7 +4,11 @@ import { ThermostatHeatIcon } from '../../../lib/icons/ThermostatHeat.js';
|
|
|
4
4
|
import { ThermostatHeatCoolIcon } from '../../../lib/icons/ThermostatHeatCool.js';
|
|
5
5
|
import { ThermostatOffIcon } from '../../../lib/icons/ThermostatOff.js';
|
|
6
6
|
export function ClimateSettingStatus({ climateSetting, temperatureUnit = 'fahrenheit', iconPlacement = 'left', }) {
|
|
7
|
-
return (_jsxs("div", { className: 'seam-climate-setting-status', children: [iconPlacement === 'left' && (_jsx(ClimateSettingIcon, { mode: climateSetting.hvac_mode_setting })), _jsx(Content, { mode: climateSetting.hvac_mode_setting, coolingSetPoint:
|
|
7
|
+
return (_jsxs("div", { className: 'seam-climate-setting-status', children: [iconPlacement === 'left' && (_jsx(ClimateSettingIcon, { mode: climateSetting.hvac_mode_setting })), _jsx(Content, { mode: climateSetting.hvac_mode_setting, coolingSetPoint: temperatureUnit === 'fahrenheit'
|
|
8
|
+
? climateSetting.cooling_set_point_fahrenheit
|
|
9
|
+
: climateSetting.cooling_set_point_celsius, heatingSetPoint: temperatureUnit === 'fahrenheit'
|
|
10
|
+
? climateSetting.heating_set_point_fahrenheit
|
|
11
|
+
: climateSetting.heating_set_point_celsius, temperatureUnit: temperatureUnit }), iconPlacement === 'right' && (_jsx(ClimateSettingIcon, { mode: climateSetting.hvac_mode_setting }))] }));
|
|
8
12
|
}
|
|
9
13
|
function ClimateSettingIcon(props) {
|
|
10
14
|
const { mode } = props;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClimateSettingStatus.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/ClimateSettingStatus.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAQ9D,MAAM,UAAU,oBAAoB,CAAC,EACnC,cAAc,EACd,eAAe,GAAG,YAAY,EAC9B,aAAa,GAAG,MAAM,GACI;IAC1B,OAAO,CACL,eAAK,SAAS,EAAC,6BAA6B,aACzC,aAAa,KAAK,MAAM,IAAI,CAC3B,KAAC,kBAAkB,IAAC,IAAI,EAAE,cAAc,CAAC,iBAAiB,GAAI,CAC/D,EACD,KAAC,OAAO,IACN,IAAI,EAAE,cAAc,CAAC,iBAAiB,EACtC,eAAe,
|
|
1
|
+
{"version":3,"file":"ClimateSettingStatus.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/ClimateSettingStatus.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAQ9D,MAAM,UAAU,oBAAoB,CAAC,EACnC,cAAc,EACd,eAAe,GAAG,YAAY,EAC9B,aAAa,GAAG,MAAM,GACI;IAC1B,OAAO,CACL,eAAK,SAAS,EAAC,6BAA6B,aACzC,aAAa,KAAK,MAAM,IAAI,CAC3B,KAAC,kBAAkB,IAAC,IAAI,EAAE,cAAc,CAAC,iBAAiB,GAAI,CAC/D,EACD,KAAC,OAAO,IACN,IAAI,EAAE,cAAc,CAAC,iBAAiB,EACtC,eAAe,EACb,eAAe,KAAK,YAAY;oBAC9B,CAAC,CAAC,cAAc,CAAC,4BAA4B;oBAC7C,CAAC,CAAC,cAAc,CAAC,yBAAyB,EAE9C,eAAe,EACb,eAAe,KAAK,YAAY;oBAC9B,CAAC,CAAC,cAAc,CAAC,4BAA4B;oBAC7C,CAAC,CAAC,cAAc,CAAC,yBAAyB,EAE9C,eAAe,EAAE,eAAe,GAChC,EACD,aAAa,KAAK,OAAO,IAAI,CAC5B,KAAC,kBAAkB,IAAC,IAAI,EAAE,cAAc,CAAC,iBAAiB,GAAI,CAC/D,IACG,CACP,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAE3B;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IAEtB,OAAO,CACL,eAAK,SAAS,EAAC,kCAAkC,aAC9C,IAAI,KAAK,MAAM,IAAI,KAAC,kBAAkB,KAAG,EACzC,IAAI,KAAK,MAAM,IAAI,KAAC,kBAAkB,KAAG,EACzC,IAAI,KAAK,UAAU,IAAI,KAAC,sBAAsB,KAAG,EACjD,IAAI,KAAK,KAAK,IAAI,KAAC,iBAAiB,KAAG,IACpC,CACP,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAShB;IACC,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,KAAK,CAAA;IACzE,MAAM,kBAAkB,GAAG,eAAe,KAAK,SAAS,CAAA;IACxD,MAAM,kBAAkB,GAAG,eAAe,KAAK,SAAS,CAAA;IACxD,MAAM,IAAI,GACR,eAAe,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAA;IAEzE,IAAI,IAAI,KAAK,MAAM,IAAI,kBAAkB;QACvC,OAAO,yBAAO,GAAG,eAAe,GAAG,IAAI,EAAE,GAAQ,CAAA;IAEnD,IAAI,IAAI,KAAK,MAAM,IAAI,kBAAkB;QACvC,OAAO,yBAAO,GAAG,eAAe,GAAG,IAAI,EAAE,GAAQ,CAAA;IAEnD,IAAI,IAAI,KAAK,UAAU,IAAI,kBAAkB,IAAI,kBAAkB;QACjE,OAAO,CACL,yBAAO,GAAG,eAAe,GAAG,IAAI,MAAM,eAAe,GAAG,IAAI,EAAE,GAAQ,CACvE,CAAA;IAEH,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,yBAAO,CAAC,CAAC,GAAG,GAAQ,CAAA;IAE/C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,GAAG;IACR,gBAAgB,EAAE,IAAI;IACtB,aAAa,EAAE,IAAI;IACnB,GAAG,EAAE,KAAK;CACX,CAAA"}
|
package/lib/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const seamapiReactVersion = "1.
|
|
1
|
+
declare const seamapiReactVersion = "1.47.0";
|
|
2
2
|
export default seamapiReactVersion;
|
package/lib/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seamapi/react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.47.0",
|
|
4
4
|
"description": "Seam Components.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"@tanstack/react-query": "^4.28.0",
|
|
123
123
|
"classnames": "^2.3.2",
|
|
124
124
|
"luxon": "^3.3.0",
|
|
125
|
-
"seamapi": "^8.
|
|
125
|
+
"seamapi": "^8.6.0",
|
|
126
126
|
"uuid": "^9.0.0"
|
|
127
127
|
},
|
|
128
128
|
"devDependencies": {
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
"@mui/icons-material": "^5.11.16",
|
|
134
134
|
"@mui/material": "^5.12.2",
|
|
135
135
|
"@rxfork/r2wc-react-to-web-component": "^2.3.0",
|
|
136
|
-
"@seamapi/fake-seam-connect": "^1.
|
|
136
|
+
"@seamapi/fake-seam-connect": "^1.6.0",
|
|
137
137
|
"@storybook/addon-designs": "^7.0.1",
|
|
138
138
|
"@storybook/addon-essentials": "^7.0.2",
|
|
139
139
|
"@storybook/addon-links": "^7.0.2",
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
"copy-webpack-plugin": "^11.0.0",
|
|
156
156
|
"del-cli": "^5.0.0",
|
|
157
157
|
"eslint": "^8.9.0",
|
|
158
|
-
"eslint-config-prettier": "^
|
|
158
|
+
"eslint-config-prettier": "^9.0.0",
|
|
159
159
|
"eslint-config-standard": "^17.1.0",
|
|
160
160
|
"eslint-config-standard-jsx": "^11.0.0",
|
|
161
161
|
"eslint-config-standard-react": "^13.0.0",
|
|
@@ -56,7 +56,10 @@ function Content(props: {
|
|
|
56
56
|
<DeviceImage device={device} />
|
|
57
57
|
</div>
|
|
58
58
|
<div className='seam-body'>
|
|
59
|
-
<div className='seam-model'>
|
|
59
|
+
<div className='seam-model'>
|
|
60
|
+
{device.properties.model.manufacturer_display_name}{' '}
|
|
61
|
+
{device.properties.model.display_name}
|
|
62
|
+
</div>
|
|
60
63
|
<TextButton
|
|
61
64
|
onClick={() => {
|
|
62
65
|
onSelectDevice(device.device_id)
|
|
@@ -46,12 +46,12 @@ export function AccessCodeRow({
|
|
|
46
46
|
</TableCell>
|
|
47
47
|
<TableCell className='seam-action-cell'>
|
|
48
48
|
{errorCount > 0 && (
|
|
49
|
-
<div className='seam-
|
|
49
|
+
<div className='seam-issue-icon-wrap' title={errorIconTitle}>
|
|
50
50
|
<ExclamationCircleOutlineIcon />
|
|
51
51
|
</div>
|
|
52
52
|
)}
|
|
53
53
|
{errorCount === 0 && warningCount > 0 && (
|
|
54
|
-
<div className='seam-
|
|
54
|
+
<div className='seam-issue-icon-wrap' title={warningIconTitle}>
|
|
55
55
|
<TriangleWarningOutlineIcon />
|
|
56
56
|
</div>
|
|
57
57
|
)}
|
|
@@ -58,12 +58,13 @@ const defaultAccessCodeFilter = (
|
|
|
58
58
|
accessCode: AccessCode,
|
|
59
59
|
searchInputValue: string
|
|
60
60
|
): boolean => {
|
|
61
|
-
const value = searchInputValue.trim()
|
|
61
|
+
const value = searchInputValue.trim().toLowerCase()
|
|
62
62
|
if (value === '') return true
|
|
63
|
-
const
|
|
63
|
+
const name = accessCode.name ?? ''
|
|
64
|
+
const code = accessCode.code ?? ''
|
|
64
65
|
return (
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
name.trim().toLowerCase().includes(value) ||
|
|
67
|
+
code.trim().toLowerCase().includes(value)
|
|
67
68
|
)
|
|
68
69
|
}
|
|
69
70
|
|
|
@@ -163,7 +164,7 @@ export function AccessCodeTable({
|
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
return (
|
|
166
|
-
<div className={classNames('seam-
|
|
167
|
+
<div className={classNames('seam-table', className)}>
|
|
167
168
|
<ContentHeader onBack={onBack} />
|
|
168
169
|
<TableHeader>
|
|
169
170
|
<div className='seam-left'>
|
|
@@ -178,7 +179,7 @@ export function AccessCodeTable({
|
|
|
178
179
|
{!disableCreateAccessCode && (
|
|
179
180
|
<IconButton
|
|
180
181
|
onClick={toggleAddAccessCodeForm}
|
|
181
|
-
className='seam-add-
|
|
182
|
+
className='seam-add-button'
|
|
182
183
|
>
|
|
183
184
|
<AddIcon />
|
|
184
185
|
</IconButton>
|
|
@@ -10,7 +10,7 @@ export function CodeDetails(props: { accessCode: AccessCode }): JSX.Element {
|
|
|
10
10
|
const { device } = useDevice({ device_id: accessCode.device_id })
|
|
11
11
|
|
|
12
12
|
return (
|
|
13
|
-
<div className='seam-
|
|
13
|
+
<div className='seam-details'>
|
|
14
14
|
<span className='seam-device-name seam-truncated-text'>
|
|
15
15
|
{device?.properties.name}
|
|
16
16
|
</span>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { DateTime } from 'luxon'
|
|
2
|
+
import type { ClimateSettingSchedule } from 'seamapi'
|
|
3
|
+
|
|
4
|
+
import { useDevice } from 'lib/seam/devices/use-device.js'
|
|
5
|
+
import { DotDivider } from 'lib/ui/layout/DotDivider.js'
|
|
6
|
+
import { ClimateSettingStatus } from 'lib/ui/thermostat/ClimateSettingStatus.js'
|
|
7
|
+
import { useIsDateInPast } from 'lib/ui/use-is-date-in-past.js'
|
|
8
|
+
|
|
9
|
+
export function ClimateSettingScheduleDetails(props: {
|
|
10
|
+
climateSettingSchedule: ClimateSettingSchedule
|
|
11
|
+
}): JSX.Element {
|
|
12
|
+
const { climateSettingSchedule } = props
|
|
13
|
+
const { device } = useDevice({ device_id: climateSettingSchedule.device_id })
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<div className='seam-details'>
|
|
17
|
+
<span className='seam-device-name seam-truncated-text'>
|
|
18
|
+
{device?.properties.name}
|
|
19
|
+
</span>
|
|
20
|
+
<DotDivider />
|
|
21
|
+
<Duration climateSettingSchedule={climateSettingSchedule} />
|
|
22
|
+
<DotDivider />
|
|
23
|
+
<ClimateSettingStatus climateSetting={climateSettingSchedule} />
|
|
24
|
+
</div>
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function Duration(props: {
|
|
29
|
+
climateSettingSchedule: ClimateSettingSchedule
|
|
30
|
+
}): JSX.Element {
|
|
31
|
+
const { climateSettingSchedule } = props
|
|
32
|
+
|
|
33
|
+
const hasStarted =
|
|
34
|
+
useIsDateInPast(climateSettingSchedule.schedule_starts_at) ?? false
|
|
35
|
+
|
|
36
|
+
if (hasStarted) {
|
|
37
|
+
return (
|
|
38
|
+
<span>
|
|
39
|
+
{t.ends} {formatDate(climateSettingSchedule.schedule_ends_at)}{' '}
|
|
40
|
+
</span>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<span>
|
|
46
|
+
{t.starts} {formatDate(climateSettingSchedule.schedule_starts_at)}
|
|
47
|
+
</span>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function formatDate(date: string): string {
|
|
52
|
+
return DateTime.fromISO(date).toLocaleString({
|
|
53
|
+
month: 'long',
|
|
54
|
+
day: 'numeric',
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const t = {
|
|
59
|
+
starts: 'Starts',
|
|
60
|
+
ends: 'Ends',
|
|
61
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ClimateSettingScheduleIcon } from 'lib/icons/ClimateSettingSchedule.js'
|
|
2
|
+
import type { UseClimateSettingSchedulesData } from 'lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js'
|
|
3
|
+
import { TableCell } from 'lib/ui/Table/TableCell.js'
|
|
4
|
+
import { TableRow } from 'lib/ui/Table/TableRow.js'
|
|
5
|
+
import { Title } from 'lib/ui/typography/Title.js'
|
|
6
|
+
|
|
7
|
+
import { ClimateSettingScheduleDetails } from './ClimateSettingScheduleDetails.js'
|
|
8
|
+
|
|
9
|
+
interface ClimateSettingScheduleRowProps {
|
|
10
|
+
climateSettingSchedule: UseClimateSettingSchedulesData[number]
|
|
11
|
+
onClick: () => void
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function ClimateSettingScheduleRow({
|
|
15
|
+
climateSettingSchedule,
|
|
16
|
+
onClick,
|
|
17
|
+
}: ClimateSettingScheduleRowProps): JSX.Element {
|
|
18
|
+
return (
|
|
19
|
+
<TableRow onClick={onClick}>
|
|
20
|
+
<TableCell className='seam-icon-cell'>
|
|
21
|
+
<div>
|
|
22
|
+
<ClimateSettingScheduleIcon />
|
|
23
|
+
</div>
|
|
24
|
+
</TableCell>
|
|
25
|
+
<TableCell className='seam-name-cell'>
|
|
26
|
+
<Title className='seam-truncated-text'>
|
|
27
|
+
{climateSettingSchedule.name}
|
|
28
|
+
</Title>
|
|
29
|
+
<ClimateSettingScheduleDetails
|
|
30
|
+
climateSettingSchedule={climateSettingSchedule}
|
|
31
|
+
/>
|
|
32
|
+
</TableCell>
|
|
33
|
+
</TableRow>
|
|
34
|
+
)
|
|
35
|
+
}
|
package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.element.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ElementProps } from 'lib/element.js'
|
|
2
|
+
|
|
3
|
+
import type { ClimateSettingScheduleTableProps } from './ClimateSettingScheduleTable.js'
|
|
4
|
+
|
|
5
|
+
export const name = 'seam-climate-setting-schedule-table'
|
|
6
|
+
|
|
7
|
+
export const props: ElementProps<ClimateSettingScheduleTableProps> = {
|
|
8
|
+
deviceId: 'string',
|
|
9
|
+
onBack: 'object',
|
|
10
|
+
className: 'string',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { ClimateSettingScheduleTable as Component } from './ClimateSettingScheduleTable.js'
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import classNames from 'classnames'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
useClimateSettingSchedules,
|
|
5
|
+
type UseClimateSettingSchedulesData,
|
|
6
|
+
} from 'lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js'
|
|
7
|
+
import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
|
|
8
|
+
import { EmptyPlaceholder } from 'lib/ui/Table/EmptyPlaceholder.js'
|
|
9
|
+
import { TableBody } from 'lib/ui/Table/TableBody.js'
|
|
10
|
+
import { TableHeader } from 'lib/ui/Table/TableHeader.js'
|
|
11
|
+
import { TableTitle } from 'lib/ui/Table/TableTitle.js'
|
|
12
|
+
import { Caption } from 'lib/ui/typography/Caption.js'
|
|
13
|
+
|
|
14
|
+
import { ClimateSettingScheduleRow } from './ClimateSettingScheduleRow.js'
|
|
15
|
+
|
|
16
|
+
export interface ClimateSettingScheduleTableProps {
|
|
17
|
+
deviceId: string
|
|
18
|
+
onBack?: () => void
|
|
19
|
+
className?: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function ClimateSettingScheduleTable({
|
|
23
|
+
deviceId,
|
|
24
|
+
onBack,
|
|
25
|
+
className,
|
|
26
|
+
}: ClimateSettingScheduleTableProps): JSX.Element {
|
|
27
|
+
const { climateSettingSchedules, isLoading, isError, error } =
|
|
28
|
+
useClimateSettingSchedules({
|
|
29
|
+
device_id: deviceId,
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
// TODO filtering
|
|
33
|
+
const filteredClimateSettingSchedules = climateSettingSchedules ?? []
|
|
34
|
+
|
|
35
|
+
if (isLoading) {
|
|
36
|
+
return <p className={className}>...</p>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (isError) {
|
|
40
|
+
return <p className={className}>{error?.message}</p>
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<div className={classNames('seam-table', className)}>
|
|
45
|
+
<ContentHeader onBack={onBack} />
|
|
46
|
+
<TableHeader>
|
|
47
|
+
<TableTitle>
|
|
48
|
+
{t.climateSettingSchedules}{' '}
|
|
49
|
+
<Caption>({filteredClimateSettingSchedules.length})</Caption>
|
|
50
|
+
</TableTitle>
|
|
51
|
+
</TableHeader>
|
|
52
|
+
<TableBody>
|
|
53
|
+
<Content
|
|
54
|
+
climateSettingSchedules={filteredClimateSettingSchedules}
|
|
55
|
+
onClimateSettingScheduleClick={() => {}}
|
|
56
|
+
/>
|
|
57
|
+
</TableBody>
|
|
58
|
+
</div>
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function Content(props: {
|
|
63
|
+
climateSettingSchedules: Array<UseClimateSettingSchedulesData[number]>
|
|
64
|
+
onClimateSettingScheduleClick: (climateSettingScheduleId: string) => void
|
|
65
|
+
}): JSX.Element {
|
|
66
|
+
const { climateSettingSchedules, onClimateSettingScheduleClick } = props
|
|
67
|
+
|
|
68
|
+
if (climateSettingSchedules.length === 0) {
|
|
69
|
+
return (
|
|
70
|
+
<EmptyPlaceholder>{t.noClimateSettingSchedulesMessage}</EmptyPlaceholder>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<>
|
|
76
|
+
{climateSettingSchedules.map((schedule) => (
|
|
77
|
+
<ClimateSettingScheduleRow
|
|
78
|
+
climateSettingSchedule={schedule}
|
|
79
|
+
key={schedule.climate_setting_schedule_id}
|
|
80
|
+
onClick={() => {
|
|
81
|
+
onClimateSettingScheduleClick(schedule.climate_setting_schedule_id)
|
|
82
|
+
}}
|
|
83
|
+
/>
|
|
84
|
+
))}
|
|
85
|
+
</>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const t = {
|
|
90
|
+
climateSettingSchedules: 'Climate setting schedules',
|
|
91
|
+
noClimateSettingSchedulesMessage:
|
|
92
|
+
'Sorry, no climate setting schedules were found',
|
|
93
|
+
}
|
|
@@ -9,6 +9,7 @@ export function DeviceModel({ device }: DeviceModelProps): JSX.Element | null {
|
|
|
9
9
|
<>
|
|
10
10
|
<span className='seam-label'>{t.model}:</span>{' '}
|
|
11
11
|
<div className='seam-device-model'>
|
|
12
|
+
{device.properties.model.manufacturer_display_name}{' '}
|
|
12
13
|
{device.properties.model.display_name}
|
|
13
14
|
</div>
|
|
14
15
|
</>
|
|
@@ -48,7 +48,7 @@ const defaultDeviceFilter = (
|
|
|
48
48
|
): boolean => {
|
|
49
49
|
const value = searchInputValue.trim()
|
|
50
50
|
if (value === '') return true
|
|
51
|
-
return
|
|
51
|
+
return device.properties.name.toLowerCase().includes(value)
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
export function DeviceTable({
|
|
@@ -6,7 +6,7 @@ import { ThermostatHeatCoolIcon } from 'lib/icons/ThermostatHeatCool.js'
|
|
|
6
6
|
import { ThermostatOffIcon } from 'lib/icons/ThermostatOff.js'
|
|
7
7
|
|
|
8
8
|
interface ClimateSettingStatusProps {
|
|
9
|
-
climateSetting: ClimateSetting
|
|
9
|
+
climateSetting: Partial<ClimateSetting>
|
|
10
10
|
temperatureUnit?: 'fahrenheit' | 'celsius'
|
|
11
11
|
iconPlacement?: 'left' | 'right'
|
|
12
12
|
}
|
|
@@ -23,8 +23,16 @@ export function ClimateSettingStatus({
|
|
|
23
23
|
)}
|
|
24
24
|
<Content
|
|
25
25
|
mode={climateSetting.hvac_mode_setting}
|
|
26
|
-
coolingSetPoint={
|
|
27
|
-
|
|
26
|
+
coolingSetPoint={
|
|
27
|
+
temperatureUnit === 'fahrenheit'
|
|
28
|
+
? climateSetting.cooling_set_point_fahrenheit
|
|
29
|
+
: climateSetting.cooling_set_point_celsius
|
|
30
|
+
}
|
|
31
|
+
heatingSetPoint={
|
|
32
|
+
temperatureUnit === 'fahrenheit'
|
|
33
|
+
? climateSetting.heating_set_point_fahrenheit
|
|
34
|
+
: climateSetting.heating_set_point_celsius
|
|
35
|
+
}
|
|
28
36
|
temperatureUnit={temperatureUnit}
|
|
29
37
|
/>
|
|
30
38
|
{iconPlacement === 'right' && (
|
package/src/lib/version.ts
CHANGED
package/src/styles/_main.scss
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
@use './alert';
|
|
6
6
|
@use './buttons';
|
|
7
7
|
@use './layout';
|
|
8
|
-
@use './access-code-table';
|
|
9
8
|
@use './colors';
|
|
10
9
|
@use './icons';
|
|
11
10
|
@use './menus';
|
|
@@ -19,6 +18,7 @@
|
|
|
19
18
|
@use './radio-field';
|
|
20
19
|
@use './checkbox';
|
|
21
20
|
@use './thermostat';
|
|
21
|
+
@use './seam-table';
|
|
22
22
|
|
|
23
23
|
.seam-components {
|
|
24
24
|
// Reset
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
// Components
|
|
41
41
|
@include device-details.all;
|
|
42
42
|
@include device-table.all;
|
|
43
|
-
@include access-code-table.all;
|
|
44
43
|
@include access-code-details.all;
|
|
45
44
|
@include access-code-form.all;
|
|
46
45
|
@include alert.all;
|
|
47
46
|
@include supported-device-table.all;
|
|
48
47
|
@include thermostat.all;
|
|
48
|
+
@include seam-table.all;
|
|
49
49
|
}
|