@iobroker/dm-gui-components 9.0.6 → 9.0.8
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 +69 -0
- package/build/DeviceCard.js +18 -9
- package/build/DeviceCard.js.map +1 -1
- package/build/Utils.js +4 -1
- package/build/Utils.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -17,12 +17,81 @@ render() {
|
|
|
17
17
|
}
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
+
## Icon names
|
|
21
|
+
|
|
22
|
+
You can use the following icon names for actions and controls.
|
|
23
|
+
Icons are resolved by the action/control `id` or by the `icon` property. You can also provide a `data:image/...` base64 string for custom icons.
|
|
24
|
+
|
|
25
|
+
### Action and control icons (by name)
|
|
26
|
+
|
|
27
|
+
| Name(s) | MUI Icon | Description |
|
|
28
|
+
|----------------------------|--------------------|--------------------------------------|
|
|
29
|
+
| `edit`, `rename` | Edit | Edit or rename an item |
|
|
30
|
+
| `delete` | Delete | Delete an item |
|
|
31
|
+
| `refresh` | Refresh | Refresh / reload |
|
|
32
|
+
| `newDevice`, `new`, `add` | Add | Add or create a new item |
|
|
33
|
+
| `discover`, `search` | Search | Discover or search for devices |
|
|
34
|
+
| `unpairDevice`, `unpair` | LinkOff | Unpair / unlink a device |
|
|
35
|
+
| `pairDevice`, `pair` | Link | Pair / link a device |
|
|
36
|
+
| `identify` | NotListedLocation | Identify / locate a device |
|
|
37
|
+
| `play` | PlayArrow | Start playback |
|
|
38
|
+
| `stop` | Stop | Stop playback |
|
|
39
|
+
| `pause` | Pause | Pause playback |
|
|
40
|
+
| `forward`, `next` | FastForward | Skip forward / next track |
|
|
41
|
+
| `rewind`, `previous` | FastRewind | Skip backward / previous track |
|
|
42
|
+
| `lamp`, `light` | Lightbulb | Light / lamp control |
|
|
43
|
+
| `backlight` | Fluorescent | Backlight control |
|
|
44
|
+
| `dimmer` | WbIncandescent | Dimmer control |
|
|
45
|
+
| `socket` | Power | Power socket control |
|
|
46
|
+
| `settings` | Settings | Settings / configuration |
|
|
47
|
+
| `users`, `group` | Group | User group |
|
|
48
|
+
| `user` | Person | Single user |
|
|
49
|
+
| `update` | Upgrade | Update / upgrade |
|
|
50
|
+
| `qrcode` | QrCode | QR code |
|
|
51
|
+
| `info` | Info | Information |
|
|
52
|
+
| `lines` | Article | Text lines / log |
|
|
53
|
+
| `web` | Launch | Open web link |
|
|
54
|
+
|
|
55
|
+
Any unrecognized name renders a **QuestionMark** icon as fallback.
|
|
56
|
+
|
|
57
|
+
### Legacy Font Awesome icons
|
|
58
|
+
|
|
59
|
+
These names are supported for backward compatibility. Prefer the names from the table above.
|
|
60
|
+
|
|
61
|
+
| Name(s) | MUI Icon | Description |
|
|
62
|
+
|--------------------------------|--------------------|--------------------------------|
|
|
63
|
+
| `fa-trash-can`, `fa-trash` | Delete | Delete |
|
|
64
|
+
| `fa-pen` | Edit | Edit |
|
|
65
|
+
| `fa-redo-alt` | Refresh | Refresh / redo |
|
|
66
|
+
| `fa-plus` | Add | Add |
|
|
67
|
+
| `fa-qrcode`, `qrcode` | QrCode | QR code |
|
|
68
|
+
| `fa-wifi` | Wifi | Wi-Fi enabled |
|
|
69
|
+
| `fa-wifi-slash` | WifiOff | Wi-Fi disabled |
|
|
70
|
+
| `fa-bluetooth` | Bluetooth | Bluetooth enabled |
|
|
71
|
+
| `fa-bluetooth-slash` | BluetoothDisabled | Bluetooth disabled |
|
|
72
|
+
| `fa-eye` | Visibility | View / visible |
|
|
73
|
+
| `fa-search` | Search | Search |
|
|
74
|
+
| `fa-unlink` | LinkOff | Unlink |
|
|
75
|
+
| `fa-link` | Link | Link |
|
|
76
|
+
| `fa-search-location` | NotListedLocation | Search location / identify |
|
|
77
|
+
| `fa-play` | PlayArrow | Play |
|
|
78
|
+
| `fa-stop` | Stop | Stop |
|
|
79
|
+
| `fa-pause` | Pause | Pause |
|
|
80
|
+
|
|
81
|
+
Font Awesome names can be prefixed with `fa-solid` (it is stripped automatically). Unrecognized FA names render a **QuestionMark** icon.
|
|
82
|
+
|
|
20
83
|
<!--
|
|
21
84
|
Placeholder for the next version (at the beginning of the line):
|
|
22
85
|
### **WORK IN PROGRESS**
|
|
23
86
|
-->
|
|
24
87
|
|
|
25
88
|
## Changelog
|
|
89
|
+
### 9.0.8 (2026-03-27)
|
|
90
|
+
- (@GermanBluefox) Layout improved
|
|
91
|
+
|
|
92
|
+
### 9.0.7 (2026-03-27)
|
|
93
|
+
- (@GermanBluefox) Added possibility to show custom information on Card
|
|
94
|
+
|
|
26
95
|
### 9.0.6 (2026-03-26)
|
|
27
96
|
|
|
28
97
|
- (@GermanBluefox) Small layout optimizations for controls
|
package/build/DeviceCard.js
CHANGED
|
@@ -26,7 +26,8 @@ const styles = {
|
|
|
26
26
|
minHeight: 280,
|
|
27
27
|
margin: 10,
|
|
28
28
|
overflow: 'hidden',
|
|
29
|
-
display: 'inline-
|
|
29
|
+
display: 'inline-flex',
|
|
30
|
+
flexDirection: 'column',
|
|
30
31
|
},
|
|
31
32
|
headerStyle: {
|
|
32
33
|
display: 'flex',
|
|
@@ -64,11 +65,12 @@ const styles = {
|
|
|
64
65
|
position: 'absolute',
|
|
65
66
|
},
|
|
66
67
|
bodyStyle: {
|
|
67
|
-
|
|
68
|
+
flex: 1,
|
|
69
|
+
display: 'flex',
|
|
70
|
+
flexDirection: 'column',
|
|
68
71
|
},
|
|
69
72
|
deviceInfoStyle: {
|
|
70
73
|
padding: '20px 16px 0 16px',
|
|
71
|
-
height: 133,
|
|
72
74
|
},
|
|
73
75
|
statusStyle: {
|
|
74
76
|
padding: '15px 25px 0 15px',
|
|
@@ -248,7 +250,7 @@ export default class DeviceCard extends Component {
|
|
|
248
250
|
: [this.props.device.status];
|
|
249
251
|
const icon = this.state.icon ? React.createElement(DeviceTypeIcon, { src: this.state.icon }) : React.createElement(NoImageIcon, null);
|
|
250
252
|
const headerStyle = this.getCardHeaderStyle(this.props.theme, 345);
|
|
251
|
-
return (React.createElement(Card, { sx: smallCardStyle },
|
|
253
|
+
return (React.createElement(Card, { sx: { ...smallCardStyle, display: 'flex', flexDirection: 'column' } },
|
|
252
254
|
React.createElement(CardHeader, { style: headerStyle, avatar: React.createElement("div", null,
|
|
253
255
|
this.props.uploadImagesToInstance ? (React.createElement(DeviceImageUpload, { uploadImagesToInstance: this.props.uploadImagesToInstance, deviceId: this.props.device.id, manufacturer: this.state.manufacturer, model: this.state.model, onImageSelect: (imageData) => {
|
|
254
256
|
if (imageData) {
|
|
@@ -266,7 +268,7 @@ export default class DeviceCard extends Component {
|
|
|
266
268
|
getTranslation('manufacturer'),
|
|
267
269
|
":"),
|
|
268
270
|
this.state.manufacturer)) : null }),
|
|
269
|
-
React.createElement(CardContent, { style: { position: 'relative' } },
|
|
271
|
+
React.createElement(CardContent, { style: { position: 'relative', flex: 1, display: 'flex', flexDirection: 'column' } },
|
|
270
272
|
status?.length ? (React.createElement("div", { style: {
|
|
271
273
|
display: 'flex',
|
|
272
274
|
position: 'absolute',
|
|
@@ -292,7 +294,11 @@ export default class DeviceCard extends Component {
|
|
|
292
294
|
React.createElement("b", { style: { marginRight: 4 } },
|
|
293
295
|
getTranslation('model'),
|
|
294
296
|
":"),
|
|
295
|
-
this.state.model)) : null))
|
|
297
|
+
this.state.model)) : null)),
|
|
298
|
+
this.props.device.customInfo ? (React.createElement("div", { style: { padding: '0 16px' } },
|
|
299
|
+
React.createElement(JsonConfig, { instanceId: this.props.instanceId, socket: this.props.socket, schema: this.props.device.customInfo.schema, data: this.props.device.customInfo.data || {}, onChange: (_data) => {
|
|
300
|
+
/* ignore */
|
|
301
|
+
}, themeName: this.props.themeName, themeType: this.props.themeType, theme: this.props.theme, isFloatComma: this.props.isFloatComma, dateFormat: this.props.dateFormat }))) : null),
|
|
296
302
|
React.createElement(CardActions, { disableSpacing: true },
|
|
297
303
|
this.renderActions(),
|
|
298
304
|
React.createElement("div", { style: { flexGrow: 1 } }),
|
|
@@ -379,13 +385,16 @@ export default class DeviceCard extends Component {
|
|
|
379
385
|
getTranslation('model'),
|
|
380
386
|
":"),
|
|
381
387
|
this.state.model)) : null),
|
|
388
|
+
this.props.device.customInfo ? (React.createElement("div", { style: { padding: '0 16px' } },
|
|
389
|
+
React.createElement(JsonConfig, { instanceId: this.props.instanceId, socket: this.props.socket, schema: this.props.device.customInfo.schema, data: this.props.device.customInfo.data || {}, onChange: (_data) => {
|
|
390
|
+
/* ignore */
|
|
391
|
+
}, themeName: this.props.themeName, themeType: this.props.themeType, theme: this.props.theme, isFloatComma: this.props.isFloatComma, dateFormat: this.props.dateFormat }))) : null,
|
|
382
392
|
!!(this.props.device.actions?.length || this.props.device.controls?.length) && (React.createElement("div", { style: {
|
|
383
|
-
|
|
384
|
-
position: 'relative',
|
|
393
|
+
marginTop: 'auto',
|
|
385
394
|
display: 'flex',
|
|
386
395
|
gap: 8,
|
|
387
396
|
paddingBottom: 5,
|
|
388
|
-
|
|
397
|
+
minHeight: 34,
|
|
389
398
|
paddingLeft: 10,
|
|
390
399
|
paddingRight: 10,
|
|
391
400
|
} },
|
package/build/DeviceCard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceCard.js","sourceRoot":"./src/","sources":["DeviceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DeviceTypeIcon,\n I18n,\n Utils,\n type Connection,\n type IobTheme,\n type ThemeName,\n type ThemeType,\n} from '@iobroker/adapter-react-v5';\nimport type { ConfigItemPanel, ConfigItemTabs } from '@iobroker/json-config';\nimport { Close as CloseIcon, VideogameAsset as ControlIcon, MoreVert as MoreVertIcon } from '@mui/icons-material';\nimport {\n Box,\n Button,\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Fab,\n IconButton,\n Paper,\n Skeleton,\n Typography,\n} from '@mui/material';\nimport React, { Component, type JSX } from 'react';\nimport DeviceActionButton from './DeviceActionButton';\nimport DeviceControlComponent from './DeviceControl';\nimport DeviceImageUpload from './DeviceImageUpload';\nimport DeviceStatusComponent from './DeviceStatus';\nimport JsonConfig from './JsonConfig';\nimport type {\n ActionBase,\n ControlBase,\n ControlState,\n DeviceDetails,\n DeviceInfo,\n DeviceId,\n ConfigConnectionType,\n} from './protocol/api';\nimport { getTranslation } from './Utils';\nimport { StateOrObjectHandler, type StateOrObjectSubscription } from './StateOrObjectHandler';\n\nconst smallCardStyle = {\n maxWidth: 345,\n minWidth: 200,\n} as const;\n\n/** Reserved action names (this is copied from https://github.com/ioBroker/dm-utils/blob/main/src/types/base.ts as we can only have type references to dm-utils) */\nconst ACTIONS = {\n /** This action will be called when the user clicks on the connection icon */\n STATUS: 'status',\n /** This action will be called when the user clicks on the enabled / disabled icon. The enabled/disabled icon will be shown only if the node status has the \"enabled\" flag set to false or true */\n ENABLE_DISABLE: 'enable/disable',\n};\n\nconst styles: Record<string, React.CSSProperties> = {\n cardStyle: {\n width: 300,\n minHeight: 280,\n margin: 10,\n overflow: 'hidden',\n display: 'inline-block',\n },\n headerStyle: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n paddingLeft: 8,\n paddingRight: 8,\n position: 'relative',\n minHeight: 60,\n color: '#000',\n },\n imgAreaStyle: {\n height: 45,\n width: 45,\n justifyContent: 'center',\n display: 'flex',\n alignItems: 'center',\n },\n imgStyle: {\n zIndex: 2,\n maxWidth: '100%',\n maxHeight: '100%',\n color: '#FFF',\n },\n titleStyle: {\n fontSize: 16,\n fontWeight: 'bold',\n // whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n detailsButtonStyle: {\n right: 20,\n bottom: -20,\n position: 'absolute',\n },\n bodyStyle: {\n height: 'calc(100% - 116px)',\n },\n deviceInfoStyle: {\n padding: '20px 16px 0 16px',\n height: 133,\n },\n statusStyle: {\n padding: '15px 25px 0 15px',\n height: 41,\n },\n};\n\nfunction NoImageIcon(props: { style?: React.CSSProperties; className?: string }): JSX.Element {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n style={props.style}\n className={props.className}\n >\n <path\n fill=\"currentColor\"\n d=\"M21.9,21.9l-8.49-8.49l0,0L3.59,3.59l0,0L2.1,2.1L0.69,3.51L3,5.83V19c0,1.1,0.9,2,2,2h13.17l2.31,2.31L21.9,21.9z M5,18 l3.5-4.5l2.5,3.01L12.17,15l3,3H5z M21,18.17L5.83,3H19c1.1,0,2,0.9,2,2V18.17z\"\n />\n </svg>\n );\n}\n\ninterface DeviceCardProps {\n filter?: string;\n /* Device ID */\n id: DeviceId;\n identifierLabel: ioBroker.StringOrTranslated;\n device: DeviceInfo;\n instanceId: string;\n socket: Connection;\n /* Instance, where the images should be uploaded to */\n uploadImagesToInstance?: string;\n deviceHandler: (deviceId: DeviceId, action: ActionBase) => () => void;\n controlHandler: (\n deviceId: DeviceId,\n control: ControlBase,\n state: ControlState,\n ) => () => Promise<ioBroker.State | null>;\n controlStateHandler: (deviceId: DeviceId, control: ControlBase) => () => Promise<ioBroker.State | null>;\n smallCards?: boolean;\n alive: boolean;\n themeName: ThemeName;\n themeType: ThemeType;\n theme: IobTheme;\n isFloatComma: boolean;\n dateFormat: string;\n}\n\nfunction getText(text: ioBroker.StringOrTranslated | undefined): string | undefined {\n if (typeof text === 'object') {\n return text[I18n.getLanguage()] || text.en;\n }\n\n return text;\n}\n\ninterface DeviceCardState {\n open: boolean;\n details: DeviceDetails | null;\n data: Record<string, any>;\n showControlDialog: boolean;\n\n // values possibly loaded from states/objects\n name?: string;\n identifier?: string;\n hasDetails?: boolean;\n icon?: string;\n backgroundColor?: string;\n color?: string;\n manufacturer?: string;\n model?: string;\n connectionType?: ConfigConnectionType;\n enabled?: boolean;\n}\n\n/**\n * Device Card Component\n */\nexport default class DeviceCard extends Component<DeviceCardProps, DeviceCardState> {\n private readonly stateOrObjectHandler: StateOrObjectHandler;\n private readonly subscriptions: Map<\n keyof DeviceInfo & keyof DeviceCardState,\n { subscription: StateOrObjectSubscription; transform?: (value: any) => any }\n > = new Map();\n\n constructor(props: DeviceCardProps) {\n super(props);\n\n this.state = {\n open: false,\n details: null,\n data: {},\n showControlDialog: false,\n };\n\n this.stateOrObjectHandler = new StateOrObjectHandler(this.props.socket);\n }\n\n async fetchIcon(): Promise<void> {\n if (!this.props.device.icon) {\n const manufacturer = this.state.manufacturer;\n const model = this.state.model;\n\n // try to load the icon from file storage\n const fileName = `${manufacturer ? `${manufacturer}_` : ''}${model || JSON.stringify(this.props.device.id)}`;\n\n try {\n const file = await this.props.socket.readFile(\n this.props.instanceId.replace('system.adapter.', ''),\n `${fileName}.webp`,\n true,\n );\n if (file) {\n this.setState({ icon: `data:${file.mimeType};base64,${file.file}` });\n } else {\n this.setState({ icon: '' });\n }\n // const response = await fetch(url);\n // if (response.ok) {\n // const blob = await response.blob();\n // const reader = new FileReader();\n // reader.onloadend = () => {\n // setIcon(reader.result);\n // };\n // reader.readAsDataURL(blob);\n // } else {\n // throw new Error('Response not ok');\n // }\n } catch {\n if (this.state.icon) {\n this.setState({ icon: '' });\n }\n }\n }\n }\n\n async componentDidMount(): Promise<void> {\n await this.addStateOrObjectListener('name', getText);\n await this.addStateOrObjectListener('identifier');\n await this.addStateOrObjectListener('hasDetails');\n await this.addStateOrObjectListener('icon');\n await this.addStateOrObjectListener('backgroundColor');\n await this.addStateOrObjectListener('color');\n await this.addStateOrObjectListener('manufacturer', getText);\n await this.addStateOrObjectListener('model', getText);\n await this.addStateOrObjectListener('connectionType');\n await this.addStateOrObjectListener('enabled');\n\n await this.fetchIcon().catch(e => console.error(e));\n }\n\n private async addStateOrObjectListener(\n key: keyof DeviceInfo & keyof DeviceCardState,\n transform?: (value: any) => any,\n ): Promise<void> {\n const sub = await this.stateOrObjectHandler.addListener(this.props.device[key], value =>\n this.setState<typeof key>({ [key]: transform ? transform(value) : value }),\n );\n this.subscriptions.set(key, { subscription: sub, transform });\n }\n\n async componentDidUpdate(prevProps: DeviceCardProps): Promise<void> {\n for (const [key, { subscription, transform }] of [...this.subscriptions]) {\n const newItem = this.props.device[key];\n const prevItem = prevProps.device[key];\n\n if (newItem !== prevItem) {\n console.log(`${key} of device ${JSON.stringify(this.props.device.id)} updated`, prevItem, newItem);\n this.subscriptions.delete(key);\n await this.addStateOrObjectListener(key, transform);\n await subscription.unsubscribe();\n }\n }\n }\n\n async componentWillUnmount(): Promise<void> {\n for (const [, { subscription }] of this.subscriptions) {\n await subscription.unsubscribe();\n }\n this.subscriptions.clear();\n }\n\n /**\n * Load the device details\n */\n async loadDetails(): Promise<void> {\n console.log(`Loading device details for`, this.props.device.id, `... from ${this.props.instanceId}`);\n const details: DeviceDetails | null = await this.props.socket.sendTo(\n this.props.instanceId,\n 'dm:deviceDetails',\n this.props.device.id,\n );\n console.log(`Got device details for`, this.props.device.id, details);\n this.setState({ details, data: details?.data || {} });\n }\n\n /**\n * Copy the device ID to the clipboard\n */\n copyToClipboard = (): void => {\n const textToCopy = this.state.identifier;\n if (!textToCopy) {\n return;\n }\n Utils.copyToClipboard(textToCopy);\n alert(`${getTranslation('copied')} ${textToCopy} ${getTranslation('toClipboard')}!`);\n };\n\n renderDialog(): JSX.Element | null {\n if (!this.state.open || !this.state.details) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n maxWidth=\"md\"\n onClose={() => this.setState({ open: false })}\n >\n <DialogContent>\n <JsonConfig\n instanceId={this.props.instanceId}\n socket={this.props.socket}\n schema={this.state.details.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.state.data}\n onChange={(data: Record<string, any>) => this.setState({ data })}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!this.props.alive}\n variant=\"contained\"\n color=\"primary\"\n onClick={() => this.setState({ open: false })}\n autoFocus\n >\n {getTranslation('closeButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderControlDialog(): JSX.Element | null {\n if (!this.state.showControlDialog || !this.props.alive) {\n return null;\n }\n const colors = { primary: '#111', secondary: '#888' };\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showControlDialog: false })}\n >\n <DialogTitle>\n {this.state.name}\n <IconButton\n style={{\n position: 'absolute',\n top: 5,\n right: 5,\n zIndex: 10,\n }}\n onClick={() => this.setState({ showControlDialog: false })}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent style={{ display: 'flex', flexDirection: 'column', overflow: 'visible' }}>\n {this.props.device.controls?.map(control => (\n <DeviceControlComponent\n disabled={false}\n key={control.id}\n control={control}\n socket={this.props.socket}\n colors={colors}\n deviceId={this.props.device.id}\n controlHandler={this.props.controlHandler}\n controlStateHandler={this.props.controlStateHandler}\n />\n ))}\n </DialogContent>\n </Dialog>\n );\n }\n\n renderControls(): JSX.Element | null {\n const colors = { primary: '#111', secondary: '#888' };\n const firstControl = this.props.device.controls?.[0];\n if (\n this.props.device.controls?.length === 1 &&\n firstControl &&\n (firstControl.type === 'icon' || firstControl.type === 'switch') &&\n !firstControl.label\n ) {\n // control can be placed in the button icon\n return (\n <DeviceControlComponent\n disabled={!this.props.alive}\n control={firstControl}\n colors={colors}\n socket={this.props.socket}\n deviceId={this.props.device.id}\n controlHandler={this.props.controlHandler}\n controlStateHandler={this.props.controlStateHandler}\n />\n );\n }\n\n if (this.props.device.controls?.length) {\n // place a button and show a controls dialog\n return (\n <Fab\n size=\"small\"\n style={{ width: 32, height: 32, minHeight: 32 }}\n disabled={!this.props.alive}\n onClick={() => this.setState({ showControlDialog: true })}\n >\n <ControlIcon />\n </Fab>\n );\n }\n return null;\n }\n\n renderActions(): JSX.Element[] | null {\n const actions = this.props.device.actions?.filter(\n a => a.id !== ACTIONS.STATUS && a.id !== ACTIONS.ENABLE_DISABLE,\n );\n\n return actions?.length\n ? actions.map(a => (\n <DeviceActionButton\n disabled={!this.props.alive}\n key={a.id}\n deviceId={this.props.device.id}\n action={a}\n deviceHandler={this.props.deviceHandler}\n />\n ))\n : null;\n }\n\n renderSmall(): JSX.Element {\n const hasDetails = this.state.hasDetails;\n const status = !this.props.device.status\n ? []\n : Array.isArray(this.props.device.status)\n ? this.props.device.status\n : [this.props.device.status];\n\n const icon = this.state.icon ? <DeviceTypeIcon src={this.state.icon} /> : <NoImageIcon />;\n\n const headerStyle = this.getCardHeaderStyle(this.props.theme, 345);\n\n return (\n <Card sx={smallCardStyle}>\n <CardHeader\n style={headerStyle}\n avatar={\n <div>\n {this.props.uploadImagesToInstance ? (\n <DeviceImageUpload\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceId={this.props.device.id}\n manufacturer={this.state.manufacturer}\n model={this.state.model}\n onImageSelect={(imageData: string): void => {\n if (imageData) {\n this.setState({ icon: imageData });\n }\n }}\n socket={this.props.socket}\n />\n ) : null}\n {icon}\n </div>\n }\n action={\n hasDetails ? (\n <IconButton\n aria-label=\"settings\"\n onClick={() => {\n if (!this.state.open) {\n this.loadDetails().catch(console.error);\n this.setState({ open: true });\n }\n }}\n >\n <MoreVertIcon />\n </IconButton>\n ) : null\n }\n title={this.state.name}\n subheader={\n this.state.manufacturer ? (\n <span>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {this.state.manufacturer}\n </span>\n ) : null\n }\n />\n <CardContent style={{ position: 'relative' }}>\n {status?.length ? (\n <div\n style={{\n display: 'flex',\n position: 'absolute',\n top: -11,\n background: '#88888880',\n padding: '0 8px',\n borderRadius: 5,\n width: 'calc(100% - 46px)',\n }}\n >\n {status.map((s, i) => (\n <DeviceStatusComponent\n key={i}\n socket={this.props.socket}\n status={s}\n connectionType={this.state.connectionType}\n enabled={this.state.enabled}\n deviceId={this.props.device.id}\n statusAction={this.props.device.actions?.find(a => a.id === ACTIONS.STATUS)}\n disableEnableAction={this.props.device.actions?.find(\n a => a.id === ACTIONS.ENABLE_DISABLE,\n )}\n deviceHandler={this.props.deviceHandler}\n theme={this.props.theme}\n stateOrObjectHandler={this.stateOrObjectHandler}\n />\n ))}\n </div>\n ) : null}\n <div>\n <Typography variant=\"body1\">\n {this.state.identifier ? (\n <div\n onClick={this.copyToClipboard}\n style={{ textOverflow: 'ellipsis', overflow: 'hidden' }}\n >\n <b>{getText(this.props.identifierLabel)}:</b>\n <span style={{ marginLeft: 4 }}>{this.state.identifier}</span>\n </div>\n ) : null}\n {this.state.manufacturer ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {this.state.manufacturer}\n </div>\n ) : null}\n {this.state.model ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('model')}:</b>\n {this.state.model}\n </div>\n ) : null}\n </Typography>\n </div>\n </CardContent>\n <CardActions disableSpacing>\n {this.renderActions()}\n <div style={{ flexGrow: 1 }} />\n {this.renderControls()}\n </CardActions>\n {this.renderDialog()}\n {this.renderControlDialog()}\n </Card>\n );\n }\n\n getCardHeaderStyle(theme: IobTheme, maxWidth?: number): React.CSSProperties {\n const backgroundColor =\n this.state.backgroundColor === 'primary'\n ? theme.palette.primary.main\n : this.state.backgroundColor === 'secondary'\n ? theme.palette.secondary.main\n : this.state.backgroundColor || theme.palette.secondary.main;\n\n let color;\n if (this.state.color && this.state.color !== 'primary' && this.state.color !== 'secondary') {\n // Color was directly defined\n color = this.state.color;\n } else if (this.state.color === 'primary') {\n color = theme.palette.primary.main;\n } else if (this.state.color === 'secondary') {\n color = theme.palette.secondary.main;\n } else {\n // Color was not defined\n if (this.state.backgroundColor === 'primary') {\n color = theme.palette.primary.contrastText;\n } else if (this.state.backgroundColor === 'secondary' || !this.state.backgroundColor) {\n color = theme.palette.secondary.contrastText;\n } else {\n color = Utils.invertColor(backgroundColor, true);\n }\n }\n\n return {\n backgroundColor,\n color,\n maxWidth,\n };\n }\n\n renderBig(): JSX.Element {\n const status = !this.props.device.status\n ? []\n : Array.isArray(this.props.device.status)\n ? this.props.device.status\n : [this.props.device.status];\n\n const icon = this.state.icon ? (\n <DeviceTypeIcon\n src={this.state.icon}\n style={styles.imgStyle}\n />\n ) : (\n <NoImageIcon style={styles.imgStyle} />\n );\n const headerStyle = this.getCardHeaderStyle(this.props.theme);\n\n const title: string = this.state.details?.data?.name || this.props.device.name || '';\n\n return (\n <Paper\n style={styles.cardStyle}\n key={JSON.stringify(this.props.id)}\n >\n <Box\n sx={headerStyle}\n style={styles.headerStyle}\n >\n <div style={styles.imgAreaStyle}>\n {this.props.uploadImagesToInstance ? (\n <DeviceImageUpload\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceId={this.props.device.id}\n manufacturer={this.state.manufacturer}\n model={this.state.model}\n onImageSelect={(imageData: string): void => {\n if (imageData) {\n this.setState({ icon: imageData });\n }\n }}\n socket={this.props.socket}\n />\n ) : null}\n {icon}\n </div>\n <Box\n style={styles.titleStyle}\n title={title.length > 20 ? title : undefined}\n sx={theme => ({ color: headerStyle.color || theme.palette.secondary.contrastText })}\n >\n {this.state.details?.data?.name || this.state.name}\n </Box>\n {this.state.hasDetails ? (\n <Fab\n disabled={!this.props.alive}\n size=\"small\"\n style={styles.detailsButtonStyle}\n onClick={() => {\n if (!this.state.open) {\n this.loadDetails().catch(console.error);\n this.setState({ open: true });\n }\n }}\n color=\"primary\"\n >\n <MoreVertIcon />\n </Fab>\n ) : null}\n </Box>\n <div style={styles.statusStyle}>\n {status.map((s, i) => (\n <DeviceStatusComponent\n key={i}\n socket={this.props.socket}\n deviceId={this.props.device.id}\n connectionType={this.state.connectionType}\n status={s}\n enabled={this.state.enabled}\n statusAction={this.props.device.actions?.find(a => a.id === ACTIONS.STATUS)}\n disableEnableAction={this.props.device.actions?.find(a => a.id === ACTIONS.ENABLE_DISABLE)}\n deviceHandler={this.props.deviceHandler}\n theme={this.props.theme}\n stateOrObjectHandler={this.stateOrObjectHandler}\n />\n ))}\n </div>\n <div style={styles.bodyStyle}>\n <Typography\n variant=\"body1\"\n style={styles.deviceInfoStyle}\n >\n {this.state.identifier ? (\n <div onClick={this.copyToClipboard}>\n <b style={{ marginRight: 4 }}>{getText(this.props.identifierLabel)}:</b>\n {this.state.identifier}\n </div>\n ) : null}\n {this.state.manufacturer ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {this.state.manufacturer}\n </div>\n ) : null}\n {this.state.model ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('model')}:</b>\n {this.state.model}\n </div>\n ) : null}\n </Typography>\n {!!(this.props.device.actions?.length || this.props.device.controls?.length) && (\n <div\n style={{\n flex: 1,\n position: 'relative',\n display: 'flex',\n gap: 8,\n paddingBottom: 5,\n height: 34,\n paddingLeft: 10,\n paddingRight: 10,\n }}\n >\n {this.renderActions()}\n <div style={{ flexGrow: 1 }} />\n {this.renderControls()}\n </div>\n )}\n </div>\n {this.renderDialog()}\n {this.renderControlDialog()}\n </Paper>\n );\n }\n\n render(): JSX.Element {\n const name = this.state.name?.toLowerCase() ?? '';\n if (this.props.filter && !name.includes(this.props.filter.toLowerCase())) {\n return <></>;\n }\n\n if (this.props.smallCards) {\n return this.renderSmall();\n }\n\n return this.renderBig();\n }\n}\n\ntype DeviceCardSkeletonProps = Pick<DeviceCardProps, 'smallCards' | 'theme'>;\n\nexport class DeviceCardSkeleton extends Component<DeviceCardSkeletonProps> {\n render(): JSX.Element {\n if (this.props.smallCards) {\n return this.renderSmall();\n }\n\n return this.renderBig();\n }\n\n renderSmall(): JSX.Element {\n const headerStyle = this.getCardHeaderStyle(this.props.theme, 345);\n\n return (\n <Card sx={smallCardStyle}>\n <CardHeader\n style={headerStyle}\n avatar={\n <div>\n <Skeleton\n variant=\"rounded\"\n width={24}\n height={24}\n />\n </div>\n }\n title={<Skeleton />}\n subheader={<Skeleton />}\n />\n <CardContent style={{ position: 'relative' }}>\n <div>\n <Typography variant=\"body1\">\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n </Typography>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n renderBig(): JSX.Element {\n const headerStyle = this.getCardHeaderStyle(this.props.theme);\n\n return (\n <Paper style={styles.cardStyle}>\n <Box\n sx={headerStyle}\n style={styles.headerStyle}\n >\n <div style={styles.imgAreaStyle}>\n <Skeleton\n variant=\"rounded\"\n width={24}\n height={24}\n />\n </div>\n <Box\n style={styles.titleStyle}\n sx={theme => ({\n color: headerStyle.color || theme.palette.secondary.contrastText,\n minWidth: '50%',\n })}\n >\n <Skeleton />\n </Box>\n </Box>\n <div style={styles.statusStyle}></div>\n <div style={styles.bodyStyle}>\n <Typography\n variant=\"body1\"\n style={styles.deviceInfoStyle}\n >\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n </Typography>\n </div>\n </Paper>\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n getCardHeaderStyle(theme: IobTheme, maxWidth?: number): React.CSSProperties {\n const backgroundColor = theme.palette.secondary.main;\n const color = theme.palette.secondary.contrastText;\n\n return {\n backgroundColor,\n color,\n maxWidth,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DeviceCard.js","sourceRoot":"./src/","sources":["DeviceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DeviceTypeIcon,\n I18n,\n Utils,\n type Connection,\n type IobTheme,\n type ThemeName,\n type ThemeType,\n} from '@iobroker/adapter-react-v5';\nimport type { ConfigItemPanel, ConfigItemTabs } from '@iobroker/json-config';\nimport { Close as CloseIcon, VideogameAsset as ControlIcon, MoreVert as MoreVertIcon } from '@mui/icons-material';\nimport {\n Box,\n Button,\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Fab,\n IconButton,\n Paper,\n Skeleton,\n Typography,\n} from '@mui/material';\nimport React, { Component, type JSX } from 'react';\nimport DeviceActionButton from './DeviceActionButton';\nimport DeviceControlComponent from './DeviceControl';\nimport DeviceImageUpload from './DeviceImageUpload';\nimport DeviceStatusComponent from './DeviceStatus';\nimport JsonConfig from './JsonConfig';\nimport type {\n ActionBase,\n ControlBase,\n ControlState,\n DeviceDetails,\n DeviceInfo,\n DeviceId,\n ConfigConnectionType,\n} from './protocol/api';\nimport { getTranslation } from './Utils';\nimport { StateOrObjectHandler, type StateOrObjectSubscription } from './StateOrObjectHandler';\n\nconst smallCardStyle = {\n maxWidth: 345,\n minWidth: 200,\n} as const;\n\n/** Reserved action names (this is copied from https://github.com/ioBroker/dm-utils/blob/main/src/types/base.ts as we can only have type references to dm-utils) */\nconst ACTIONS = {\n /** This action will be called when the user clicks on the connection icon */\n STATUS: 'status',\n /** This action will be called when the user clicks on the enabled / disabled icon. The enabled/disabled icon will be shown only if the node status has the \"enabled\" flag set to false or true */\n ENABLE_DISABLE: 'enable/disable',\n};\n\nconst styles: Record<string, React.CSSProperties> = {\n cardStyle: {\n width: 300,\n minHeight: 280,\n margin: 10,\n overflow: 'hidden',\n display: 'inline-flex',\n flexDirection: 'column',\n },\n headerStyle: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n paddingLeft: 8,\n paddingRight: 8,\n position: 'relative',\n minHeight: 60,\n color: '#000',\n },\n imgAreaStyle: {\n height: 45,\n width: 45,\n justifyContent: 'center',\n display: 'flex',\n alignItems: 'center',\n },\n imgStyle: {\n zIndex: 2,\n maxWidth: '100%',\n maxHeight: '100%',\n color: '#FFF',\n },\n titleStyle: {\n fontSize: 16,\n fontWeight: 'bold',\n // whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n detailsButtonStyle: {\n right: 20,\n bottom: -20,\n position: 'absolute',\n },\n bodyStyle: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n },\n deviceInfoStyle: {\n padding: '20px 16px 0 16px',\n },\n statusStyle: {\n padding: '15px 25px 0 15px',\n height: 41,\n },\n};\n\nfunction NoImageIcon(props: { style?: React.CSSProperties; className?: string }): JSX.Element {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n style={props.style}\n className={props.className}\n >\n <path\n fill=\"currentColor\"\n d=\"M21.9,21.9l-8.49-8.49l0,0L3.59,3.59l0,0L2.1,2.1L0.69,3.51L3,5.83V19c0,1.1,0.9,2,2,2h13.17l2.31,2.31L21.9,21.9z M5,18 l3.5-4.5l2.5,3.01L12.17,15l3,3H5z M21,18.17L5.83,3H19c1.1,0,2,0.9,2,2V18.17z\"\n />\n </svg>\n );\n}\n\ninterface DeviceCardProps {\n filter?: string;\n /* Device ID */\n id: DeviceId;\n identifierLabel: ioBroker.StringOrTranslated;\n device: DeviceInfo;\n instanceId: string;\n socket: Connection;\n /* Instance, where the images should be uploaded to */\n uploadImagesToInstance?: string;\n deviceHandler: (deviceId: DeviceId, action: ActionBase) => () => void;\n controlHandler: (\n deviceId: DeviceId,\n control: ControlBase,\n state: ControlState,\n ) => () => Promise<ioBroker.State | null>;\n controlStateHandler: (deviceId: DeviceId, control: ControlBase) => () => Promise<ioBroker.State | null>;\n smallCards?: boolean;\n alive: boolean;\n themeName: ThemeName;\n themeType: ThemeType;\n theme: IobTheme;\n isFloatComma: boolean;\n dateFormat: string;\n}\n\nfunction getText(text: ioBroker.StringOrTranslated | undefined): string | undefined {\n if (typeof text === 'object') {\n return text[I18n.getLanguage()] || text.en;\n }\n\n return text;\n}\n\ninterface DeviceCardState {\n open: boolean;\n details: DeviceDetails | null;\n data: Record<string, any>;\n showControlDialog: boolean;\n\n // values possibly loaded from states/objects\n name?: string;\n identifier?: string;\n hasDetails?: boolean;\n icon?: string;\n backgroundColor?: string;\n color?: string;\n manufacturer?: string;\n model?: string;\n connectionType?: ConfigConnectionType;\n enabled?: boolean;\n}\n\n/**\n * Device Card Component\n */\nexport default class DeviceCard extends Component<DeviceCardProps, DeviceCardState> {\n private readonly stateOrObjectHandler: StateOrObjectHandler;\n private readonly subscriptions: Map<\n keyof DeviceInfo & keyof DeviceCardState,\n { subscription: StateOrObjectSubscription; transform?: (value: any) => any }\n > = new Map();\n\n constructor(props: DeviceCardProps) {\n super(props);\n\n this.state = {\n open: false,\n details: null,\n data: {},\n showControlDialog: false,\n };\n\n this.stateOrObjectHandler = new StateOrObjectHandler(this.props.socket);\n }\n\n async fetchIcon(): Promise<void> {\n if (!this.props.device.icon) {\n const manufacturer = this.state.manufacturer;\n const model = this.state.model;\n\n // try to load the icon from file storage\n const fileName = `${manufacturer ? `${manufacturer}_` : ''}${model || JSON.stringify(this.props.device.id)}`;\n\n try {\n const file = await this.props.socket.readFile(\n this.props.instanceId.replace('system.adapter.', ''),\n `${fileName}.webp`,\n true,\n );\n if (file) {\n this.setState({ icon: `data:${file.mimeType};base64,${file.file}` });\n } else {\n this.setState({ icon: '' });\n }\n // const response = await fetch(url);\n // if (response.ok) {\n // const blob = await response.blob();\n // const reader = new FileReader();\n // reader.onloadend = () => {\n // setIcon(reader.result);\n // };\n // reader.readAsDataURL(blob);\n // } else {\n // throw new Error('Response not ok');\n // }\n } catch {\n if (this.state.icon) {\n this.setState({ icon: '' });\n }\n }\n }\n }\n\n async componentDidMount(): Promise<void> {\n await this.addStateOrObjectListener('name', getText);\n await this.addStateOrObjectListener('identifier');\n await this.addStateOrObjectListener('hasDetails');\n await this.addStateOrObjectListener('icon');\n await this.addStateOrObjectListener('backgroundColor');\n await this.addStateOrObjectListener('color');\n await this.addStateOrObjectListener('manufacturer', getText);\n await this.addStateOrObjectListener('model', getText);\n await this.addStateOrObjectListener('connectionType');\n await this.addStateOrObjectListener('enabled');\n\n await this.fetchIcon().catch(e => console.error(e));\n }\n\n private async addStateOrObjectListener(\n key: keyof DeviceInfo & keyof DeviceCardState,\n transform?: (value: any) => any,\n ): Promise<void> {\n const sub = await this.stateOrObjectHandler.addListener(this.props.device[key], value =>\n this.setState<typeof key>({ [key]: transform ? transform(value) : value }),\n );\n this.subscriptions.set(key, { subscription: sub, transform });\n }\n\n async componentDidUpdate(prevProps: DeviceCardProps): Promise<void> {\n for (const [key, { subscription, transform }] of [...this.subscriptions]) {\n const newItem = this.props.device[key];\n const prevItem = prevProps.device[key];\n\n if (newItem !== prevItem) {\n console.log(`${key} of device ${JSON.stringify(this.props.device.id)} updated`, prevItem, newItem);\n this.subscriptions.delete(key);\n await this.addStateOrObjectListener(key, transform);\n await subscription.unsubscribe();\n }\n }\n }\n\n async componentWillUnmount(): Promise<void> {\n for (const [, { subscription }] of this.subscriptions) {\n await subscription.unsubscribe();\n }\n this.subscriptions.clear();\n }\n\n /**\n * Load the device details\n */\n async loadDetails(): Promise<void> {\n console.log(`Loading device details for`, this.props.device.id, `... from ${this.props.instanceId}`);\n const details: DeviceDetails | null = await this.props.socket.sendTo(\n this.props.instanceId,\n 'dm:deviceDetails',\n this.props.device.id,\n );\n console.log(`Got device details for`, this.props.device.id, details);\n this.setState({ details, data: details?.data || {} });\n }\n\n /**\n * Copy the device ID to the clipboard\n */\n copyToClipboard = (): void => {\n const textToCopy = this.state.identifier;\n if (!textToCopy) {\n return;\n }\n Utils.copyToClipboard(textToCopy);\n alert(`${getTranslation('copied')} ${textToCopy} ${getTranslation('toClipboard')}!`);\n };\n\n renderDialog(): JSX.Element | null {\n if (!this.state.open || !this.state.details) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n maxWidth=\"md\"\n onClose={() => this.setState({ open: false })}\n >\n <DialogContent>\n <JsonConfig\n instanceId={this.props.instanceId}\n socket={this.props.socket}\n schema={this.state.details.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.state.data}\n onChange={(data: Record<string, any>) => this.setState({ data })}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!this.props.alive}\n variant=\"contained\"\n color=\"primary\"\n onClick={() => this.setState({ open: false })}\n autoFocus\n >\n {getTranslation('closeButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderControlDialog(): JSX.Element | null {\n if (!this.state.showControlDialog || !this.props.alive) {\n return null;\n }\n const colors = { primary: '#111', secondary: '#888' };\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showControlDialog: false })}\n >\n <DialogTitle>\n {this.state.name}\n <IconButton\n style={{\n position: 'absolute',\n top: 5,\n right: 5,\n zIndex: 10,\n }}\n onClick={() => this.setState({ showControlDialog: false })}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent style={{ display: 'flex', flexDirection: 'column', overflow: 'visible' }}>\n {this.props.device.controls?.map(control => (\n <DeviceControlComponent\n disabled={false}\n key={control.id}\n control={control}\n socket={this.props.socket}\n colors={colors}\n deviceId={this.props.device.id}\n controlHandler={this.props.controlHandler}\n controlStateHandler={this.props.controlStateHandler}\n />\n ))}\n </DialogContent>\n </Dialog>\n );\n }\n\n renderControls(): JSX.Element | null {\n const colors = { primary: '#111', secondary: '#888' };\n const firstControl = this.props.device.controls?.[0];\n if (\n this.props.device.controls?.length === 1 &&\n firstControl &&\n (firstControl.type === 'icon' || firstControl.type === 'switch') &&\n !firstControl.label\n ) {\n // control can be placed in the button icon\n return (\n <DeviceControlComponent\n disabled={!this.props.alive}\n control={firstControl}\n colors={colors}\n socket={this.props.socket}\n deviceId={this.props.device.id}\n controlHandler={this.props.controlHandler}\n controlStateHandler={this.props.controlStateHandler}\n />\n );\n }\n\n if (this.props.device.controls?.length) {\n // place a button and show a controls dialog\n return (\n <Fab\n size=\"small\"\n style={{ width: 32, height: 32, minHeight: 32 }}\n disabled={!this.props.alive}\n onClick={() => this.setState({ showControlDialog: true })}\n >\n <ControlIcon />\n </Fab>\n );\n }\n return null;\n }\n\n renderActions(): JSX.Element[] | null {\n const actions = this.props.device.actions?.filter(\n a => a.id !== ACTIONS.STATUS && a.id !== ACTIONS.ENABLE_DISABLE,\n );\n\n return actions?.length\n ? actions.map(a => (\n <DeviceActionButton\n disabled={!this.props.alive}\n key={a.id}\n deviceId={this.props.device.id}\n action={a}\n deviceHandler={this.props.deviceHandler}\n />\n ))\n : null;\n }\n\n renderSmall(): JSX.Element {\n const hasDetails = this.state.hasDetails;\n const status = !this.props.device.status\n ? []\n : Array.isArray(this.props.device.status)\n ? this.props.device.status\n : [this.props.device.status];\n\n const icon = this.state.icon ? <DeviceTypeIcon src={this.state.icon} /> : <NoImageIcon />;\n\n const headerStyle = this.getCardHeaderStyle(this.props.theme, 345);\n\n return (\n <Card sx={{ ...smallCardStyle, display: 'flex', flexDirection: 'column' }}>\n <CardHeader\n style={headerStyle}\n avatar={\n <div>\n {this.props.uploadImagesToInstance ? (\n <DeviceImageUpload\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceId={this.props.device.id}\n manufacturer={this.state.manufacturer}\n model={this.state.model}\n onImageSelect={(imageData: string): void => {\n if (imageData) {\n this.setState({ icon: imageData });\n }\n }}\n socket={this.props.socket}\n />\n ) : null}\n {icon}\n </div>\n }\n action={\n hasDetails ? (\n <IconButton\n aria-label=\"settings\"\n onClick={() => {\n if (!this.state.open) {\n this.loadDetails().catch(console.error);\n this.setState({ open: true });\n }\n }}\n >\n <MoreVertIcon />\n </IconButton>\n ) : null\n }\n title={this.state.name}\n subheader={\n this.state.manufacturer ? (\n <span>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {this.state.manufacturer}\n </span>\n ) : null\n }\n />\n <CardContent style={{ position: 'relative', flex: 1, display: 'flex', flexDirection: 'column' }}>\n {status?.length ? (\n <div\n style={{\n display: 'flex',\n position: 'absolute',\n top: -11,\n background: '#88888880',\n padding: '0 8px',\n borderRadius: 5,\n width: 'calc(100% - 46px)',\n }}\n >\n {status.map((s, i) => (\n <DeviceStatusComponent\n key={i}\n socket={this.props.socket}\n status={s}\n connectionType={this.state.connectionType}\n enabled={this.state.enabled}\n deviceId={this.props.device.id}\n statusAction={this.props.device.actions?.find(a => a.id === ACTIONS.STATUS)}\n disableEnableAction={this.props.device.actions?.find(\n a => a.id === ACTIONS.ENABLE_DISABLE,\n )}\n deviceHandler={this.props.deviceHandler}\n theme={this.props.theme}\n stateOrObjectHandler={this.stateOrObjectHandler}\n />\n ))}\n </div>\n ) : null}\n <div>\n <Typography variant=\"body1\">\n {this.state.identifier ? (\n <div\n onClick={this.copyToClipboard}\n style={{ textOverflow: 'ellipsis', overflow: 'hidden' }}\n >\n <b>{getText(this.props.identifierLabel)}:</b>\n <span style={{ marginLeft: 4 }}>{this.state.identifier}</span>\n </div>\n ) : null}\n {this.state.manufacturer ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {this.state.manufacturer}\n </div>\n ) : null}\n {this.state.model ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('model')}:</b>\n {this.state.model}\n </div>\n ) : null}\n </Typography>\n </div>\n {this.props.device.customInfo ? (\n <div style={{ padding: '0 16px' }}>\n <JsonConfig\n instanceId={this.props.instanceId}\n socket={this.props.socket}\n schema={this.props.device.customInfo.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.props.device.customInfo.data || {}}\n onChange={(_data: Record<string, any>) => {\n /* ignore */\n }}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n />\n </div>\n ) : null}\n </CardContent>\n <CardActions disableSpacing>\n {this.renderActions()}\n <div style={{ flexGrow: 1 }} />\n {this.renderControls()}\n </CardActions>\n {this.renderDialog()}\n {this.renderControlDialog()}\n </Card>\n );\n }\n\n getCardHeaderStyle(theme: IobTheme, maxWidth?: number): React.CSSProperties {\n const backgroundColor =\n this.state.backgroundColor === 'primary'\n ? theme.palette.primary.main\n : this.state.backgroundColor === 'secondary'\n ? theme.palette.secondary.main\n : this.state.backgroundColor || theme.palette.secondary.main;\n\n let color;\n if (this.state.color && this.state.color !== 'primary' && this.state.color !== 'secondary') {\n // Color was directly defined\n color = this.state.color;\n } else if (this.state.color === 'primary') {\n color = theme.palette.primary.main;\n } else if (this.state.color === 'secondary') {\n color = theme.palette.secondary.main;\n } else {\n // Color was not defined\n if (this.state.backgroundColor === 'primary') {\n color = theme.palette.primary.contrastText;\n } else if (this.state.backgroundColor === 'secondary' || !this.state.backgroundColor) {\n color = theme.palette.secondary.contrastText;\n } else {\n color = Utils.invertColor(backgroundColor, true);\n }\n }\n\n return {\n backgroundColor,\n color,\n maxWidth,\n };\n }\n\n renderBig(): JSX.Element {\n const status = !this.props.device.status\n ? []\n : Array.isArray(this.props.device.status)\n ? this.props.device.status\n : [this.props.device.status];\n\n const icon = this.state.icon ? (\n <DeviceTypeIcon\n src={this.state.icon}\n style={styles.imgStyle}\n />\n ) : (\n <NoImageIcon style={styles.imgStyle} />\n );\n const headerStyle = this.getCardHeaderStyle(this.props.theme);\n\n const title: string = this.state.details?.data?.name || this.props.device.name || '';\n\n return (\n <Paper\n style={styles.cardStyle}\n key={JSON.stringify(this.props.id)}\n >\n {/* Header */}\n <Box\n sx={headerStyle}\n style={styles.headerStyle}\n >\n <div style={styles.imgAreaStyle}>\n {this.props.uploadImagesToInstance ? (\n <DeviceImageUpload\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceId={this.props.device.id}\n manufacturer={this.state.manufacturer}\n model={this.state.model}\n onImageSelect={(imageData: string): void => {\n if (imageData) {\n this.setState({ icon: imageData });\n }\n }}\n socket={this.props.socket}\n />\n ) : null}\n {icon}\n </div>\n <Box\n style={styles.titleStyle}\n title={title.length > 20 ? title : undefined}\n sx={theme => ({ color: headerStyle.color || theme.palette.secondary.contrastText })}\n >\n {this.state.details?.data?.name || this.state.name}\n </Box>\n {this.state.hasDetails ? (\n <Fab\n disabled={!this.props.alive}\n size=\"small\"\n style={styles.detailsButtonStyle}\n onClick={() => {\n if (!this.state.open) {\n this.loadDetails().catch(console.error);\n this.setState({ open: true });\n }\n }}\n color=\"primary\"\n >\n <MoreVertIcon />\n </Fab>\n ) : null}\n </Box>\n {/* Body */}\n <div style={styles.statusStyle}>\n {status.map((s, i) => (\n <DeviceStatusComponent\n key={i}\n socket={this.props.socket}\n deviceId={this.props.device.id}\n connectionType={this.state.connectionType}\n status={s}\n enabled={this.state.enabled}\n statusAction={this.props.device.actions?.find(a => a.id === ACTIONS.STATUS)}\n disableEnableAction={this.props.device.actions?.find(a => a.id === ACTIONS.ENABLE_DISABLE)}\n deviceHandler={this.props.deviceHandler}\n theme={this.props.theme}\n stateOrObjectHandler={this.stateOrObjectHandler}\n />\n ))}\n </div>\n <div style={styles.bodyStyle}>\n <Typography\n variant=\"body1\"\n style={styles.deviceInfoStyle}\n >\n {this.state.identifier ? (\n <div onClick={this.copyToClipboard}>\n <b style={{ marginRight: 4 }}>{getText(this.props.identifierLabel)}:</b>\n {this.state.identifier}\n </div>\n ) : null}\n {this.state.manufacturer ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('manufacturer')}:</b>\n {this.state.manufacturer}\n </div>\n ) : null}\n {this.state.model ? (\n <div>\n <b style={{ marginRight: 4 }}>{getTranslation('model')}:</b>\n {this.state.model}\n </div>\n ) : null}\n </Typography>\n {this.props.device.customInfo ? (\n <div style={{ padding: '0 16px' }}>\n <JsonConfig\n instanceId={this.props.instanceId}\n socket={this.props.socket}\n schema={this.props.device.customInfo.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.props.device.customInfo.data || {}}\n onChange={(_data: Record<string, any>) => {\n /* ignore */\n }}\n themeName={this.props.themeName}\n themeType={this.props.themeType}\n theme={this.props.theme}\n isFloatComma={this.props.isFloatComma}\n dateFormat={this.props.dateFormat}\n />\n </div>\n ) : null}\n {/* Footer */}\n {!!(this.props.device.actions?.length || this.props.device.controls?.length) && (\n <div\n style={{\n marginTop: 'auto',\n display: 'flex',\n gap: 8,\n paddingBottom: 5,\n minHeight: 34,\n paddingLeft: 10,\n paddingRight: 10,\n }}\n >\n {this.renderActions()}\n <div style={{ flexGrow: 1 }} />\n {this.renderControls()}\n </div>\n )}\n </div>\n {this.renderDialog()}\n {this.renderControlDialog()}\n </Paper>\n );\n }\n\n render(): JSX.Element {\n const name = this.state.name?.toLowerCase() ?? '';\n if (this.props.filter && !name.includes(this.props.filter.toLowerCase())) {\n return <></>;\n }\n\n if (this.props.smallCards) {\n return this.renderSmall();\n }\n\n return this.renderBig();\n }\n}\n\ntype DeviceCardSkeletonProps = Pick<DeviceCardProps, 'smallCards' | 'theme'>;\n\nexport class DeviceCardSkeleton extends Component<DeviceCardSkeletonProps> {\n render(): JSX.Element {\n if (this.props.smallCards) {\n return this.renderSmall();\n }\n\n return this.renderBig();\n }\n\n renderSmall(): JSX.Element {\n const headerStyle = this.getCardHeaderStyle(this.props.theme, 345);\n\n return (\n <Card sx={smallCardStyle}>\n <CardHeader\n style={headerStyle}\n avatar={\n <div>\n <Skeleton\n variant=\"rounded\"\n width={24}\n height={24}\n />\n </div>\n }\n title={<Skeleton />}\n subheader={<Skeleton />}\n />\n <CardContent style={{ position: 'relative' }}>\n <div>\n <Typography variant=\"body1\">\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n </Typography>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n renderBig(): JSX.Element {\n const headerStyle = this.getCardHeaderStyle(this.props.theme);\n\n return (\n <Paper style={styles.cardStyle}>\n <Box\n sx={headerStyle}\n style={styles.headerStyle}\n >\n <div style={styles.imgAreaStyle}>\n <Skeleton\n variant=\"rounded\"\n width={24}\n height={24}\n />\n </div>\n <Box\n style={styles.titleStyle}\n sx={theme => ({\n color: headerStyle.color || theme.palette.secondary.contrastText,\n minWidth: '50%',\n })}\n >\n <Skeleton />\n </Box>\n </Box>\n <div style={styles.statusStyle}></div>\n <div style={styles.bodyStyle}>\n <Typography\n variant=\"body1\"\n style={styles.deviceInfoStyle}\n >\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n <div>\n <Skeleton />\n </div>\n </Typography>\n </div>\n </Paper>\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n getCardHeaderStyle(theme: IobTheme, maxWidth?: number): React.CSSProperties {\n const backgroundColor = theme.palette.secondary.main;\n const color = theme.palette.secondary.contrastText;\n\n return {\n backgroundColor,\n color,\n maxWidth,\n };\n }\n}\n"]}
|
package/build/Utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Add, Article, Bluetooth, BluetoothDisabled, Delete, Edit, FastForward, FastRewind, Fluorescent, Group, Info, Lightbulb, Link as LinkIcon, LinkOff, NotListedLocation, Pause, Person, PlayArrow, Power, QrCode, QuestionMark, Refresh, Search, Settings, Stop, Visibility, Upgrade, WbIncandescent, Wifi, WifiOff, } from '@mui/icons-material';
|
|
2
|
+
import { Add, Article, Bluetooth, BluetoothDisabled, Delete, Edit, FastForward, FastRewind, Fluorescent, Group, Info, Lightbulb, Link as LinkIcon, LinkOff, NotListedLocation, Pause, Person, PlayArrow, Power, QrCode, QuestionMark, Refresh, Search, Settings, Stop, Visibility, Upgrade, WbIncandescent, Wifi, WifiOff, Launch, } from '@mui/icons-material';
|
|
3
3
|
import { I18n, Icon } from '@iobroker/adapter-react-v5';
|
|
4
4
|
/**
|
|
5
5
|
* Get Icon by font-awesome name. Do not use these names, use names from getIconByName
|
|
@@ -193,6 +193,9 @@ function getIconByName(name, altName, color) {
|
|
|
193
193
|
if (name === 'lines' || altName === 'lines') {
|
|
194
194
|
return React.createElement(Article, { style: { color } });
|
|
195
195
|
}
|
|
196
|
+
if (name === 'web' || altName === 'web') {
|
|
197
|
+
return React.createElement(Launch, { style: { color } });
|
|
198
|
+
}
|
|
196
199
|
return React.createElement(QuestionMark, { style: { color } });
|
|
197
200
|
}
|
|
198
201
|
export function renderControlIcon(action, colors, value) {
|
package/build/Utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utils.js","sourceRoot":"./src/","sources":["Utils.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EACH,GAAG,EACH,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,MAAM,EACN,IAAI,EACJ,WAAW,EACX,UAAU,EACV,WAAW,EACX,KAAK,EACL,IAAI,EACJ,SAAS,EACT,IAAI,IAAI,QAAQ,EAChB,OAAO,EACP,iBAAiB,EACjB,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EACZ,OAAO,EACP,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,OAAO,EACP,cAAc,EACd,IAAI,EACJ,OAAO,GACV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,KAAc;IAC3C,MAAM,SAAS,GAAG,IAAI;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;IAEnC,IAAI,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACvE,OAAO,oBAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACxC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACtC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,OAAO,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACzC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,oBAAC,GAAG,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACrC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,OAAO,oBAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACxC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACtC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACtC,OAAO,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACzC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,OAAO,oBAAC,SAAS,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC3C,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3C,OAAO,oBAAC,iBAAiB,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACnD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,oBAAC,UAAU,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC5C,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,oBAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACxC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACzC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,oBAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC1C,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3C,OAAO,oBAAC,iBAAiB,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACnD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,oBAAC,SAAS,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC3C,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACtC,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,oBAAC,KAAK,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACvC,CAAC;IACD,OAAO,oBAAC,YAAY,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,SAAS,aAAa,CAAC,IAAY,EAAE,OAAgB,EAAE,KAAc;IACjE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrF,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,oBAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACzC,CAAC;IACD,IACI,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,KAAK;QACd,IAAI,KAAK,KAAK;QACd,OAAO,KAAK,WAAW;QACvB,OAAO,KAAK,KAAK;QACjB,OAAO,KAAK,KAAK,EACnB,CAAC;QACC,OAAO,oBAAC,GAAG,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7F,OAAO,oBAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,cAAc,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrG,OAAO,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC7F,OAAO,oBAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC1C,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAChD,OAAO,oBAAC,iBAAiB,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACnD,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,oBAAC,SAAS,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAC1C,OAAO,oBAAC,KAAK,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvF,OAAO,oBAAC,WAAW,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC7C,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC7F,OAAO,oBAAC,UAAU,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC5C,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACnF,OAAO,oBAAC,SAAS,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAClD,OAAO,oBAAC,WAAW,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC7C,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,oBAAC,cAAc,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,oBAAC,KAAK,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAChD,OAAO,oBAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IAC1C,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACrF,OAAO,oBAAC,KAAK,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,oBAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,oBAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,oBAAC,IAAI,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAC1C,OAAO,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;IACzC,CAAC;IACD,OAAO,oBAAC,YAAY,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC7B,MAAmB,EACnB,MAA+C,EAC/C,KAAwC;IAExC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEhG,IAAI,MAAM,EAAE,CAAC;QACT,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC;aAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnD,OAAO,CACH,oBAAC,IAAI,IACD,GAAG,EAAE,MAAM,CAAC,MAAM,EAClB,KAAK,EAAE,EAAE,KAAK,EAAE,GAClB,CACL,CAAC;IACN,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,OAAO,CACH,oBAAC,IAAI,IACD,GAAG,EAAE,MAAM,CAAC,IAAI,EAChB,KAAK,EAAE,EAAE,KAAK,EAAE,GAClB,CACL,CAAC;IACN,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,OAAO,CACH,oBAAC,IAAI,IACD,GAAG,EAAE,MAAM,CAAC,IAAI,EAChB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAChC,CACL,CAAC;IACN,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,IAAI,QAA4B,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,cAAc;AAC1B,wBAAwB;AACxB,IAAiC,EACjC,aAAuB;IAEvB,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;IAE1C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import React from 'react';\n\nimport type { ActionBase, ControlBase } from './protocol/api';\nimport {\n Add,\n Article,\n Bluetooth,\n BluetoothDisabled,\n Delete,\n Edit,\n FastForward,\n FastRewind,\n Fluorescent,\n Group,\n Info,\n Lightbulb,\n Link as LinkIcon,\n LinkOff,\n NotListedLocation,\n Pause,\n Person,\n PlayArrow,\n Power,\n QrCode,\n QuestionMark,\n Refresh,\n Search,\n Settings,\n Stop,\n Visibility,\n Upgrade,\n WbIncandescent,\n Wifi,\n WifiOff,\n} from '@mui/icons-material';\n\nimport { I18n, Icon } from '@iobroker/adapter-react-v5';\n\n/**\n * Get Icon by font-awesome name. Do not use these names, use names from getIconByName\n *\n * @param icon font-awesome icon name\n * Only following font-awesome icons are supported:\n * - fa-trash-can, fa-trash\n * - fa-pen\n * - fa-redo-alt\n * - fa-plus\n * - fa-qrcode, qrcode\n * - fa-wifi\n * - fa-wifi-slash\n * - fa-bluetooth\n * - fa-bluetooth-slash\n * - fa-eye\n * - fa-search\n * - fa-unlink\n * - fa-link\n * - fa-search-location\n * - fa-play\n * - fa-stop\n * - fa-pause\n * @param color color of the icon\n */\nfunction getFaIcon(icon: string, color?: string): React.JSX.Element | null {\n const iconStyle = icon\n .split(' ')\n .map(s => s.trim())\n .filter(s => s !== 'fa-solid');\n\n if (iconStyle.includes('fa-trash-can') || iconStyle.includes('fa-trash')) {\n return <Delete style={{ color }} />;\n }\n if (iconStyle.includes('fa-pen')) {\n return <Edit style={{ color }} />;\n }\n if (iconStyle.includes('fa-redo-alt')) {\n return <Refresh style={{ color }} />;\n }\n if (iconStyle.includes('fa-plus')) {\n return <Add style={{ color }} />;\n }\n if (iconStyle.includes('fa-qrcode') || iconStyle.includes('qrcode')) {\n return <QrCode style={{ color }} />;\n }\n if (iconStyle.includes('fa-wifi')) {\n return <Wifi style={{ color }} />;\n }\n if (iconStyle.includes('fa-wifi-slash')) {\n return <WifiOff style={{ color }} />;\n }\n if (iconStyle.includes('fa-bluetooth')) {\n return <Bluetooth style={{ color }} />;\n }\n if (iconStyle.includes('fa-bluetooth-slash')) {\n return <BluetoothDisabled style={{ color }} />;\n }\n if (iconStyle.includes('fa-eye')) {\n return <Visibility style={{ color }} />;\n }\n if (iconStyle.includes('fa-search')) {\n return <Search style={{ color }} />;\n }\n if (iconStyle.includes('fa-unlink')) {\n return <LinkOff style={{ color }} />;\n }\n if (iconStyle.includes('fa-link')) {\n return <LinkIcon style={{ color }} />;\n }\n if (iconStyle.includes('fa-search-location')) {\n return <NotListedLocation style={{ color }} />;\n }\n if (iconStyle.includes('fa-play')) {\n return <PlayArrow style={{ color }} />;\n }\n if (iconStyle.includes('fa-stop')) {\n return <Stop style={{ color }} />;\n }\n if (iconStyle.includes('fa-pause')) {\n return <Pause style={{ color }} />;\n }\n return <QuestionMark style={{ color }} />;\n}\n\n/**\n * Get Icon by name or by action\n *\n * @param name action name\n * possible action or icon names are\n * - edit, rename\n * - delete\n * - refresh\n * - newDevice, new, add\n * - discover, search\n * - unpairDevice, unpair\n * - pairDevice, pair\n * - identify\n * - play\n * - stop\n * - pause\n * - forward, next\n * - rewind, previous\n * - lamp, light\n * - backlight\n * - dimmer\n * - socket\n * - settings\n * - users, group\n * - user\n * - qrcode\n * - identify\n * - info\n * - lines\n * @param altName icon name\n * @param color color of the icon\n */\nfunction getIconByName(name: string, altName?: string, color?: string): React.JSX.Element | null {\n if (name === 'edit' || name === 'rename' || altName === 'edit' || altName === 'rename') {\n return <Edit style={{ color }} />;\n }\n if (name === 'delete' || altName === 'delete') {\n return <Delete style={{ color }} />;\n }\n if (name === 'refresh' || altName === 'refresh') {\n return <Refresh style={{ color }} />;\n }\n if (\n name === 'newDevice' ||\n name === 'new' ||\n name === 'add' ||\n altName === 'newDevice' ||\n altName === 'new' ||\n altName === 'add'\n ) {\n return <Add style={{ color }} />;\n }\n if (name === 'discover' || name === 'search' || altName === 'discover' || altName === 'search') {\n return <Search style={{ color }} />;\n }\n if (name === 'unpairDevice' || name === 'unpair' || altName === 'unpairDevice' || altName === 'unpair') {\n return <LinkOff style={{ color }} />;\n }\n if (name === 'pairDevice' || name === 'pair' || altName === 'pairDevice' || altName === 'pair') {\n return <LinkIcon style={{ color }} />;\n }\n if (name === 'identify' || altName === 'identify') {\n return <NotListedLocation style={{ color }} />;\n }\n if (name === 'play' || altName === 'play') {\n return <PlayArrow style={{ color }} />;\n }\n if (name === 'stop' || altName === 'stop') {\n return <Stop style={{ color }} />;\n }\n if (name === 'pause' || altName === 'pause') {\n return <Pause style={{ color }} />;\n }\n if (name === 'forward' || name === 'next' || altName === 'forward' || altName === 'next') {\n return <FastForward style={{ color }} />;\n }\n if (name === 'rewind' || name === 'previous' || altName === 'rewind' || altName === 'previous') {\n return <FastRewind style={{ color }} />;\n }\n if (name === 'lamp' || name === 'light' || altName === 'lamp' || altName === 'light') {\n return <Lightbulb style={{ color }} />;\n }\n if (name === 'backlight' || altName === 'backlight') {\n return <Fluorescent style={{ color }} />;\n }\n if (name === 'dimmer' || altName === 'dimmer') {\n return <WbIncandescent style={{ color }} />;\n }\n if (name === 'socket' || altName === 'socket') {\n return <Power style={{ color }} />;\n }\n if (name === 'settings' || altName === 'settings') {\n return <Settings style={{ color }} />;\n }\n if (name === 'users' || name === 'group' || altName === 'users' || altName === 'group') {\n return <Group style={{ color }} />;\n }\n if (name === 'user' || altName === 'user') {\n return <Person style={{ color }} />;\n }\n if (name === 'update' || altName === 'update') {\n return <Upgrade style={{ color }} />;\n }\n if (name === 'qrcode' || altName === 'qrcode') {\n return <QrCode style={{ color }} />;\n }\n if (name === 'info' || altName === 'info') {\n return <Info style={{ color }} />;\n }\n if (name === 'lines' || altName === 'lines') {\n return <Article style={{ color }} />;\n }\n return <QuestionMark style={{ color }} />;\n}\n\nexport function renderControlIcon(\n action: ControlBase,\n colors?: { primary: string; secondary: string },\n value?: string | number | boolean | null,\n): React.JSX.Element | null {\n if (!action) {\n return null;\n }\n\n let color = (value && action.colorOn) || action.color || (action.state ? 'primary' : 'inherit');\n\n if (colors) {\n if (color === 'primary') {\n color = colors.primary;\n } else if (color === 'secondary') {\n color = colors.secondary;\n }\n }\n\n if (action.icon?.startsWith('fa-') || action.icon?.startsWith('fas')) {\n return getFaIcon(action.icon, color);\n }\n if (value && action.iconOn?.startsWith('data:image')) {\n return (\n <Icon\n src={action.iconOn}\n style={{ color }}\n />\n );\n }\n if (action.icon?.startsWith('data:image')) {\n return (\n <Icon\n src={action.icon}\n style={{ color }}\n />\n );\n }\n return getIconByName(action.id, action.icon, color);\n}\n\nexport function renderActionIcon(action: ActionBase): React.JSX.Element | null {\n if (!action) {\n return null;\n }\n\n if (action.icon?.startsWith('fa-') || action.icon?.startsWith('fas')) {\n return getFaIcon(action.icon, action.color);\n }\n if (action.icon?.startsWith('data:image')) {\n return (\n <Icon\n src={action.icon}\n style={{ color: action.color }}\n />\n );\n }\n return getIconByName(action.id, action.icon, action.color);\n}\n\nlet language: ioBroker.Languages;\n\n/**\n * Get Translation\n */\nexport function getTranslation(\n /** Text to translate */\n text: ioBroker.StringOrTranslated,\n noTranslation?: boolean,\n): string {\n language = language || I18n.getLanguage();\n\n if (typeof text === 'object') {\n return text[language] || text.en;\n }\n\n return noTranslation ? text : I18n.t(text);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"./src/","sources":["Utils.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type { ActionBase, ControlBase } from './protocol/api';\nimport {\n Add,\n Article,\n Bluetooth,\n BluetoothDisabled,\n Delete,\n Edit,\n FastForward,\n FastRewind,\n Fluorescent,\n Group,\n Info,\n Lightbulb,\n Link as LinkIcon,\n LinkOff,\n NotListedLocation,\n Pause,\n Person,\n PlayArrow,\n Power,\n QrCode,\n QuestionMark,\n Refresh,\n Search,\n Settings,\n Stop,\n Visibility,\n Upgrade,\n WbIncandescent,\n Wifi,\n WifiOff,\n Launch,\n} from '@mui/icons-material';\n\nimport { I18n, Icon } from '@iobroker/adapter-react-v5';\n\n/**\n * Get Icon by font-awesome name. Do not use these names, use names from getIconByName\n *\n * @param icon font-awesome icon name\n * Only following font-awesome icons are supported:\n * - fa-trash-can, fa-trash\n * - fa-pen\n * - fa-redo-alt\n * - fa-plus\n * - fa-qrcode, qrcode\n * - fa-wifi\n * - fa-wifi-slash\n * - fa-bluetooth\n * - fa-bluetooth-slash\n * - fa-eye\n * - fa-search\n * - fa-unlink\n * - fa-link\n * - fa-search-location\n * - fa-play\n * - fa-stop\n * - fa-pause\n * @param color color of the icon\n */\nfunction getFaIcon(icon: string, color?: string): React.JSX.Element | null {\n const iconStyle = icon\n .split(' ')\n .map(s => s.trim())\n .filter(s => s !== 'fa-solid');\n\n if (iconStyle.includes('fa-trash-can') || iconStyle.includes('fa-trash')) {\n return <Delete style={{ color }} />;\n }\n if (iconStyle.includes('fa-pen')) {\n return <Edit style={{ color }} />;\n }\n if (iconStyle.includes('fa-redo-alt')) {\n return <Refresh style={{ color }} />;\n }\n if (iconStyle.includes('fa-plus')) {\n return <Add style={{ color }} />;\n }\n if (iconStyle.includes('fa-qrcode') || iconStyle.includes('qrcode')) {\n return <QrCode style={{ color }} />;\n }\n if (iconStyle.includes('fa-wifi')) {\n return <Wifi style={{ color }} />;\n }\n if (iconStyle.includes('fa-wifi-slash')) {\n return <WifiOff style={{ color }} />;\n }\n if (iconStyle.includes('fa-bluetooth')) {\n return <Bluetooth style={{ color }} />;\n }\n if (iconStyle.includes('fa-bluetooth-slash')) {\n return <BluetoothDisabled style={{ color }} />;\n }\n if (iconStyle.includes('fa-eye')) {\n return <Visibility style={{ color }} />;\n }\n if (iconStyle.includes('fa-search')) {\n return <Search style={{ color }} />;\n }\n if (iconStyle.includes('fa-unlink')) {\n return <LinkOff style={{ color }} />;\n }\n if (iconStyle.includes('fa-link')) {\n return <LinkIcon style={{ color }} />;\n }\n if (iconStyle.includes('fa-search-location')) {\n return <NotListedLocation style={{ color }} />;\n }\n if (iconStyle.includes('fa-play')) {\n return <PlayArrow style={{ color }} />;\n }\n if (iconStyle.includes('fa-stop')) {\n return <Stop style={{ color }} />;\n }\n if (iconStyle.includes('fa-pause')) {\n return <Pause style={{ color }} />;\n }\n return <QuestionMark style={{ color }} />;\n}\n\n/**\n * Get Icon by name or by action\n *\n * @param name action name\n * possible action or icon names are\n * - edit, rename\n * - delete\n * - refresh\n * - newDevice, new, add\n * - discover, search\n * - unpairDevice, unpair\n * - pairDevice, pair\n * - identify\n * - play\n * - stop\n * - pause\n * - forward, next\n * - rewind, previous\n * - lamp, light\n * - backlight\n * - dimmer\n * - socket\n * - settings\n * - users, group\n * - user\n * - qrcode\n * - identify\n * - info\n * - lines\n * @param altName icon name\n * @param color color of the icon\n */\nfunction getIconByName(name: string, altName?: string, color?: string): React.JSX.Element | null {\n if (name === 'edit' || name === 'rename' || altName === 'edit' || altName === 'rename') {\n return <Edit style={{ color }} />;\n }\n if (name === 'delete' || altName === 'delete') {\n return <Delete style={{ color }} />;\n }\n if (name === 'refresh' || altName === 'refresh') {\n return <Refresh style={{ color }} />;\n }\n if (\n name === 'newDevice' ||\n name === 'new' ||\n name === 'add' ||\n altName === 'newDevice' ||\n altName === 'new' ||\n altName === 'add'\n ) {\n return <Add style={{ color }} />;\n }\n if (name === 'discover' || name === 'search' || altName === 'discover' || altName === 'search') {\n return <Search style={{ color }} />;\n }\n if (name === 'unpairDevice' || name === 'unpair' || altName === 'unpairDevice' || altName === 'unpair') {\n return <LinkOff style={{ color }} />;\n }\n if (name === 'pairDevice' || name === 'pair' || altName === 'pairDevice' || altName === 'pair') {\n return <LinkIcon style={{ color }} />;\n }\n if (name === 'identify' || altName === 'identify') {\n return <NotListedLocation style={{ color }} />;\n }\n if (name === 'play' || altName === 'play') {\n return <PlayArrow style={{ color }} />;\n }\n if (name === 'stop' || altName === 'stop') {\n return <Stop style={{ color }} />;\n }\n if (name === 'pause' || altName === 'pause') {\n return <Pause style={{ color }} />;\n }\n if (name === 'forward' || name === 'next' || altName === 'forward' || altName === 'next') {\n return <FastForward style={{ color }} />;\n }\n if (name === 'rewind' || name === 'previous' || altName === 'rewind' || altName === 'previous') {\n return <FastRewind style={{ color }} />;\n }\n if (name === 'lamp' || name === 'light' || altName === 'lamp' || altName === 'light') {\n return <Lightbulb style={{ color }} />;\n }\n if (name === 'backlight' || altName === 'backlight') {\n return <Fluorescent style={{ color }} />;\n }\n if (name === 'dimmer' || altName === 'dimmer') {\n return <WbIncandescent style={{ color }} />;\n }\n if (name === 'socket' || altName === 'socket') {\n return <Power style={{ color }} />;\n }\n if (name === 'settings' || altName === 'settings') {\n return <Settings style={{ color }} />;\n }\n if (name === 'users' || name === 'group' || altName === 'users' || altName === 'group') {\n return <Group style={{ color }} />;\n }\n if (name === 'user' || altName === 'user') {\n return <Person style={{ color }} />;\n }\n if (name === 'update' || altName === 'update') {\n return <Upgrade style={{ color }} />;\n }\n if (name === 'qrcode' || altName === 'qrcode') {\n return <QrCode style={{ color }} />;\n }\n if (name === 'info' || altName === 'info') {\n return <Info style={{ color }} />;\n }\n if (name === 'lines' || altName === 'lines') {\n return <Article style={{ color }} />;\n }\n if (name === 'web' || altName === 'web') {\n return <Launch style={{ color }} />;\n }\n return <QuestionMark style={{ color }} />;\n}\n\nexport function renderControlIcon(\n action: ControlBase,\n colors?: { primary: string; secondary: string },\n value?: string | number | boolean | null,\n): React.JSX.Element | null {\n if (!action) {\n return null;\n }\n\n let color = (value && action.colorOn) || action.color || (action.state ? 'primary' : 'inherit');\n\n if (colors) {\n if (color === 'primary') {\n color = colors.primary;\n } else if (color === 'secondary') {\n color = colors.secondary;\n }\n }\n\n if (action.icon?.startsWith('fa-') || action.icon?.startsWith('fas')) {\n return getFaIcon(action.icon, color);\n }\n if (value && action.iconOn?.startsWith('data:image')) {\n return (\n <Icon\n src={action.iconOn}\n style={{ color }}\n />\n );\n }\n if (action.icon?.startsWith('data:image')) {\n return (\n <Icon\n src={action.icon}\n style={{ color }}\n />\n );\n }\n return getIconByName(action.id, action.icon, color);\n}\n\nexport function renderActionIcon(action: ActionBase): React.JSX.Element | null {\n if (!action) {\n return null;\n }\n\n if (action.icon?.startsWith('fa-') || action.icon?.startsWith('fas')) {\n return getFaIcon(action.icon, action.color);\n }\n if (action.icon?.startsWith('data:image')) {\n return (\n <Icon\n src={action.icon}\n style={{ color: action.color }}\n />\n );\n }\n return getIconByName(action.id, action.icon, action.color);\n}\n\nlet language: ioBroker.Languages;\n\n/**\n * Get Translation\n */\nexport function getTranslation(\n /** Text to translate */\n text: ioBroker.StringOrTranslated,\n noTranslation?: boolean,\n): string {\n language = language || I18n.getLanguage();\n\n if (typeof text === 'object') {\n return text[language] || text.en;\n }\n\n return noTranslation ? text : I18n.t(text);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iobroker/dm-gui-components",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.8",
|
|
4
4
|
"description": "ReactJS components to develop admin interface for ioBroker device manager.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jey Cee",
|
|
@@ -52,14 +52,14 @@
|
|
|
52
52
|
},
|
|
53
53
|
"homepage": "https://github.com/ioBroker/dm-gui-components#readme",
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@iobroker/adapter-react-v5": "^8.1.
|
|
56
|
-
"@iobroker/json-config": "^8.2.
|
|
55
|
+
"@iobroker/adapter-react-v5": "^8.1.6",
|
|
56
|
+
"@iobroker/json-config": "^8.2.18"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@alcalzone/release-script": "^5.1.1",
|
|
60
60
|
"@alcalzone/release-script-plugin-license": "^5.1.1",
|
|
61
61
|
"@iobroker/build-tools": "^3.0.1",
|
|
62
|
-
"@iobroker/dm-utils": "^3.0.
|
|
62
|
+
"@iobroker/dm-utils": "^3.0.5",
|
|
63
63
|
"@iobroker/dm-utils-v1": "npm:@iobroker/dm-utils@^1.0.16",
|
|
64
64
|
"@iobroker/eslint-config": "^2.2.0",
|
|
65
65
|
"tsc-alias": "^1.8.16",
|