@iobroker/dm-gui-components 8.0.8 → 8.0.9
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 +3 -0
- package/build/Communication.d.ts +2 -2
- package/build/Communication.js +1 -2
- package/build/Communication.js.map +1 -1
- package/build/DeviceList.d.ts +1 -0
- package/build/DeviceList.js +7 -6
- package/build/DeviceList.js.map +1 -1
- package/build/i18n/de.json +1 -0
- package/build/i18n/en.json +1 -0
- package/build/i18n/es.json +1 -0
- package/build/i18n/fr.json +1 -0
- package/build/i18n/it.json +1 -0
- package/build/i18n/nl.json +1 -0
- package/build/i18n/pl.json +1 -0
- package/build/i18n/pt.json +1 -0
- package/build/i18n/ru.json +1 -0
- package/build/i18n/uk.json +1 -0
- package/build/i18n/zh-cn.json +1 -0
- package/package.json +1 -2
package/README.md
CHANGED
|
@@ -23,6 +23,9 @@ render() {
|
|
|
23
23
|
-->
|
|
24
24
|
|
|
25
25
|
## Changelog
|
|
26
|
+
### 8.0.9 (2026-01-28)
|
|
27
|
+
- (@GermanBluefox) Analyze API version and do not show anything if version is higher than supported
|
|
28
|
+
|
|
26
29
|
### 8.0.8 (2026-01-27)
|
|
27
30
|
- (@GermanBluefox) Added support of instance selection if not provided
|
|
28
31
|
|
package/build/Communication.d.ts
CHANGED
|
@@ -78,7 +78,7 @@ interface Message {
|
|
|
78
78
|
/**
|
|
79
79
|
* Device List Component
|
|
80
80
|
*/
|
|
81
|
-
|
|
81
|
+
export default class Communication<P extends CommunicationProps, S extends CommunicationState> extends Component<P, S> {
|
|
82
82
|
private responseTimeout;
|
|
83
83
|
instanceHandler: (action: ActionBase) => () => void;
|
|
84
84
|
deviceHandler: (deviceId: string, action: ActionBase, refresh: () => void) => () => void;
|
|
@@ -109,4 +109,4 @@ declare class Communication<P extends CommunicationProps, S extends Communicatio
|
|
|
109
109
|
renderInputDialog(): React.JSX.Element | null;
|
|
110
110
|
render(): React.JSX.Element;
|
|
111
111
|
}
|
|
112
|
-
export
|
|
112
|
+
export {};
|
package/build/Communication.js
CHANGED
|
@@ -7,7 +7,7 @@ import JsonConfig from './JsonConfig';
|
|
|
7
7
|
/**
|
|
8
8
|
* Device List Component
|
|
9
9
|
*/
|
|
10
|
-
class Communication extends Component {
|
|
10
|
+
export default class Communication extends Component {
|
|
11
11
|
responseTimeout = null;
|
|
12
12
|
// eslint-disable-next-line react/no-unused-class-component-methods
|
|
13
13
|
instanceHandler;
|
|
@@ -531,5 +531,4 @@ class Communication extends Component {
|
|
|
531
531
|
this.renderSpinner()));
|
|
532
532
|
}
|
|
533
533
|
}
|
|
534
|
-
export default Communication;
|
|
535
534
|
//# sourceMappingURL=Communication.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Communication.js","sourceRoot":"./src/","sources":["Communication.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\n\nimport {\n Backdrop,\n Box,\n Button,\n Checkbox,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControl,\n FormControlLabel,\n Grid2,\n IconButton,\n Input,\n InputAdornment,\n InputLabel,\n LinearProgress,\n MenuItem,\n Select,\n Slider,\n Snackbar,\n TextField,\n Typography,\n} from '@mui/material';\n\nimport { Close, Check, ContentCopy } from '@mui/icons-material';\n\nimport {\n type Connection,\n type AdminConnection,\n type ThemeName,\n type ThemeType,\n type IobTheme,\n I18n,\n Icon,\n Utils,\n} from '@iobroker/adapter-react-v5';\nimport type {\n ActionBase,\n ControlBase,\n ControlState,\n DeviceInfo,\n DeviceRefresh,\n InstanceDetails,\n JsonFormSchema,\n ActionButton,\n} from '@iobroker/dm-utils';\nimport type { ConfigItemPanel, ConfigItemTabs } from '@iobroker/json-config';\n\nimport { getTranslation } from './Utils';\nimport JsonConfig from './JsonConfig';\n\ndeclare module '@mui/material/Button' {\n interface ButtonPropsColorOverrides {\n grey: true;\n }\n}\n\nexport type CommunicationProps = {\n /** Socket connection */\n socket: Connection;\n /** Instance to communicate with device-manager backend, like `adapterName.X` */\n selectedInstance?: string; // adapterName.X\n registerHandler?: (handler: null | ((command: string) => void)) => void;\n themeName: ThemeName;\n themeType: ThemeType;\n theme: IobTheme;\n isFloatComma: boolean;\n dateFormat: string;\n};\n\ninterface CommunicationForm {\n title?: ioBroker.StringOrTranslated | null | undefined;\n label?: ioBroker.StringOrTranslated | null | undefined; // same as title\n noTranslation?: boolean; // Do not translate title/label\n schema: JsonFormSchema;\n data?: Record<string, any>;\n buttons?: (ActionButton | 'apply' | 'cancel' | 'close')[];\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Minimal width of the dialog */\n minWidth?: number;\n /** Always allow the apply button. Even when nothing was changed */\n ignoreApplyDisabled?: boolean;\n}\n\ninterface CommunicationFormInState extends CommunicationForm {\n handleClose?: (data?: Record<string, any>) => void;\n originalData: string;\n changed: boolean;\n}\n\ninterface InputAction extends ActionBase {\n /** If it is a device action */\n deviceId?: string;\n /** Optional refresh function to execute */\n refresh?: () => void;\n}\n\nexport type CommunicationState = {\n showSpinner: boolean;\n showToast: string | null;\n message: {\n message: string;\n handleClose: () => void;\n } | null;\n confirm: {\n message: string;\n handleClose: (confirmation?: boolean) => void;\n } | null;\n form: CommunicationFormInState | null;\n progress:\n | {\n open: boolean;\n indeterminate: boolean;\n }\n | {\n open: boolean;\n progress: number;\n }\n | null;\n showConfirmation: InputAction | null;\n showInput: InputAction | null;\n inputValue: string | boolean | number | null;\n};\n\ninterface DmResponse {\n /* Type of message */\n type: 'message' | 'confirm' | 'progress' | 'result' | 'form';\n /* Origin */\n origin: string;\n}\n\ninterface DmControlResponse extends DmResponse {\n result: {\n error?: {\n code: number;\n message: string;\n };\n state?: ioBroker.State;\n deviceId: string;\n controlId: string;\n };\n}\n\ninterface Message {\n actionId?: string;\n deviceId?: string;\n value?: unknown;\n origin?: string;\n confirm?: boolean;\n data?: any;\n /** Inform backend, how long the frontend will wait for an answer */\n timeout?: number;\n}\n\ninterface DmActionResponse extends DmResponse {\n result: {\n refresh?: DeviceRefresh;\n error?: {\n code: number;\n message: string;\n };\n };\n message?: string;\n confirm?: string;\n form?: CommunicationForm;\n progress?:\n | {\n open: boolean;\n indeterminate: boolean;\n }\n | {\n open: boolean;\n progress: number;\n };\n}\n\n/**\n * Device List Component\n */\nclass Communication<P extends CommunicationProps, S extends CommunicationState> extends Component<P, S> {\n private responseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n instanceHandler: (action: ActionBase) => () => void;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n deviceHandler: (deviceId: string, action: ActionBase, refresh: () => void) => () => void;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n controlHandler: (\n deviceId: string,\n control: ControlBase,\n state: ControlState,\n ) => () => Promise<ioBroker.State | null>;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n controlStateHandler: (deviceId: string, control: ControlBase) => () => Promise<ioBroker.State | null>;\n\n constructor(props: P) {\n super(props);\n\n this.state = {\n showSpinner: false,\n showToast: null,\n message: null,\n confirm: null,\n form: null,\n progress: null,\n showConfirmation: null,\n showInput: null,\n inputValue: null,\n } as S;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.instanceHandler = action => () => {\n if (action.confirmation) {\n this.setState({ showConfirmation: action });\n return;\n }\n if (action.inputBefore) {\n this.setState({ showInput: action });\n return;\n }\n\n this.sendActionToInstance('dm:instanceAction', { actionId: action.id, timeout: action.timeout });\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.deviceHandler = (deviceId, action, refresh) => () => {\n if (action.confirmation) {\n this.setState({ showConfirmation: { ...action, deviceId, refresh } });\n return;\n }\n if (action.inputBefore) {\n this.setState({\n showInput: { ...action, deviceId, refresh },\n inputValue: action.inputBefore.defaultValue || '',\n });\n return;\n }\n\n this.sendActionToInstance(\n 'dm:deviceAction',\n { deviceId, actionId: action.id, timeout: action.timeout },\n refresh,\n );\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.controlHandler = (deviceId, control, state) => () =>\n this.sendControlToInstance('dm:deviceControl', { deviceId, controlId: control.id, state });\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.controlStateHandler = (deviceId, control) => () =>\n this.sendControlToInstance('dm:deviceControlState', { deviceId, controlId: control.id });\n\n this.props.registerHandler?.(() => this.loadData());\n }\n\n componentWillUnmount(): void {\n if (this.responseTimeout) {\n clearTimeout(this.responseTimeout);\n this.responseTimeout = null;\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n loadData(): void {\n console.error('loadData not implemented');\n }\n\n sendActionToInstance = (command: `dm:${string}`, messageToSend: Message, refresh?: () => void): void => {\n const send = async (): Promise<void> => {\n this.setState({ showSpinner: true });\n\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n\n this.responseTimeout = setTimeout(() => {\n this.setState({ showSpinner: false });\n window.alert(I18n.t('ra_No response from the backend'));\n }, messageToSend.timeout || 5000);\n\n const response: DmActionResponse = await this.props.socket.sendTo(\n this.props.selectedInstance,\n command,\n messageToSend,\n );\n\n if (this.responseTimeout) {\n clearTimeout(this.responseTimeout);\n this.responseTimeout = null;\n }\n\n const type: string = response.type;\n console.log(`Response: ${response.type}`);\n switch (type) {\n case 'message':\n console.log(`Message received: ${response.message}`);\n if (response.message) {\n this.setState({\n message: {\n message: response.message,\n handleClose: () =>\n this.setState({ message: null }, () =>\n this.sendActionToInstance(\n 'dm:actionProgress',\n { origin: response.origin },\n refresh,\n ),\n ),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'confirm':\n console.log(`Confirm received: ${response.confirm}`);\n if (response.confirm) {\n this.setState({\n confirm: {\n message: response.confirm,\n handleClose: (confirm?: boolean) =>\n this.setState({ confirm: null }, () =>\n this.sendActionToInstance(\n 'dm:actionProgress',\n {\n origin: response.origin,\n confirm,\n },\n refresh,\n ),\n ),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'form':\n console.log('Form received');\n if (response.form) {\n const data: Record<string, any> | undefined = response.form.data;\n const originalData: Record<string, any> = {};\n if (data) {\n Object.keys(data).forEach(key => {\n if (data[key] !== undefined) {\n originalData[key] = data[key];\n }\n });\n }\n response.form.data = JSON.parse(JSON.stringify(originalData)) as Record<string, any>;\n\n this.setState({\n form: {\n ...response.form,\n changed: false,\n originalData: JSON.stringify(originalData),\n handleClose: (data: any) =>\n this.setState({ form: null }, () => {\n console.log(`Form ${JSON.stringify(data)}`);\n this.sendActionToInstance(\n 'dm:actionProgress',\n {\n origin: response.origin,\n data,\n },\n refresh,\n );\n }),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'progress':\n if (response.progress) {\n if (this.state.progress) {\n const progress = { ...this.state.progress, ...response.progress };\n this.setState({ progress, showSpinner: false });\n } else {\n this.setState({ progress: response.progress, showSpinner: false });\n }\n }\n this.sendActionToInstance('dm:actionProgress', { origin: response.origin }, refresh);\n break;\n\n case 'result':\n console.log('Response content', response.result);\n if (response.result.refresh) {\n if (response.result.refresh === true) {\n console.log('Refreshing all');\n this.loadData();\n } else if (response.result.refresh === 'instance') {\n console.log(`Refreshing instance infos: ${this.props.selectedInstance}`);\n } else if (response.result.refresh === 'device') {\n if (!refresh) {\n console.log('No refresh function provided to refresh \"device\"');\n } else {\n console.log(`Refreshing device infos: ${this.props.selectedInstance}`);\n refresh();\n }\n } else {\n console.log('Not refreshing anything');\n }\n }\n if (response.result.error) {\n console.error(`Error: ${response.result.error.message}`);\n this.setState({ showToast: response.result.error.message, showSpinner: false });\n } else {\n this.setState({ showSpinner: false });\n }\n break;\n\n default:\n console.log(`Unknown response type: ${type}`);\n this.setState({ showSpinner: false });\n break;\n }\n };\n\n void send().catch(console.error);\n };\n\n sendControlToInstance = async (\n command: string,\n messageToSend: { deviceId: string; controlId: string; state?: ControlState },\n ): Promise<null | ioBroker.State> => {\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n const response: DmControlResponse = await this.props.socket.sendTo(\n this.props.selectedInstance,\n command,\n messageToSend,\n );\n const type = response.type;\n console.log(`Response: ${response.type}`);\n if (response.type === 'result') {\n console.log('Response content', response.result);\n if (response.result.error) {\n console.error(`Error: ${response.result.error.message}`);\n this.setState({ showToast: response.result.error.message });\n } else if (response.result.state !== undefined) {\n return response.result.state;\n }\n } else {\n console.warn('Unexpected response type', type);\n }\n\n return null;\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n loadDevices(): Promise<DeviceInfo[]> {\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n return this.props.socket.sendTo(this.props.selectedInstance, 'dm:listDevices');\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n loadInstanceInfos(): Promise<InstanceDetails> {\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n return this.props.socket.sendTo(this.props.selectedInstance, 'dm:instanceInfo');\n }\n\n renderMessageDialog(): React.JSX.Element | null {\n if (!this.state.message) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.message?.handleClose()}\n hideBackdrop\n aria-describedby=\"message-dialog-description\"\n >\n <DialogContent>\n <DialogContentText id=\"message-dialog-description\">{this.state.message?.message}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"primary\"\n onClick={() => this.state.message?.handleClose()}\n variant=\"contained\"\n autoFocus\n >\n {getTranslation('okButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderConfirmDialog(): React.JSX.Element | null {\n if (!this.state.confirm) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.confirm?.handleClose()}\n hideBackdrop\n aria-describedby=\"confirm-dialog-description\"\n >\n <DialogContent>\n <DialogContentText id=\"confirm-dialog-description\">\n {getTranslation(this.state.confirm?.message)}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => this.state.confirm?.handleClose(true)}\n autoFocus\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.state.confirm?.handleClose(false)}\n autoFocus\n >\n {getTranslation('noButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderSnackbar(): React.JSX.Element {\n return (\n <Snackbar\n open={!!this.state.showToast}\n autoHideDuration={6_000}\n onClose={() => this.setState({ showToast: null })}\n message={this.state.showToast}\n />\n );\n }\n\n getOkButton(button?: ActionButton | 'apply' | 'cancel' | 'close'): React.JSX.Element {\n if (typeof button === 'string') {\n button = undefined;\n }\n\n // TODO: detect if any input fields are present and if no one, do not disable the button\n\n return (\n <Button\n key=\"apply\"\n disabled={!this.state.form?.changed && !this.state.form?.ignoreApplyDisabled}\n variant={button?.variant || 'contained'}\n color={\n button?.color === 'primary' ? 'primary' : button?.color === 'secondary' ? 'secondary' : 'primary'\n }\n style={{\n backgroundColor:\n button?.color && button?.color !== 'primary' && button?.color !== 'secondary'\n ? button?.color\n : undefined,\n ...(button?.style || undefined),\n }}\n onClick={() => this.state.form?.handleClose && this.state.form.handleClose(this.state.form?.data)}\n startIcon={button?.icon ? <Icon src={button?.icon} /> : undefined}\n >\n {getTranslation(button?.label || 'okButtonText', button?.noTranslation)}\n </Button>\n );\n }\n\n getCancelButton(button?: ActionButton | 'apply' | 'cancel' | 'close'): React.JSX.Element {\n let isClose = false;\n if (typeof button === 'string') {\n isClose = button === 'close';\n button = undefined;\n }\n return (\n <Button\n key=\"cancel\"\n variant={button?.variant || 'contained'}\n color={button?.color === 'primary' ? 'primary' : button?.color === 'secondary' ? 'secondary' : 'grey'}\n style={{\n backgroundColor:\n button?.color && button?.color !== 'primary' && button?.color !== 'secondary'\n ? button?.color\n : undefined,\n ...(button?.style || undefined),\n }}\n onClick={() => this.state.form?.handleClose && this.state.form.handleClose()}\n startIcon={isClose ? <Close /> : button?.icon ? <Icon src={button?.icon} /> : undefined}\n >\n {getTranslation(button?.label || 'cancelButtonText', button?.noTranslation)}\n </Button>\n );\n }\n\n renderFormDialog(): React.JSX.Element | null {\n if (!this.state.form?.schema) {\n return null;\n }\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n let buttons: React.JSX.Element[];\n if (this.state.form.buttons) {\n buttons = [];\n this.state.form.buttons.forEach((button: ActionButton | 'apply' | 'cancel' | 'close'): void => {\n if (typeof button === 'object' && button.type === 'copyToClipboard') {\n buttons.push(\n <Button\n key=\"copyToClipboard\"\n variant={button.variant || 'outlined'}\n color={\n button.color === 'primary'\n ? 'primary'\n : button.color === 'secondary'\n ? 'secondary'\n : undefined\n }\n style={{\n backgroundColor:\n button.color && button.color !== 'primary' && button.color !== 'secondary'\n ? button.color\n : undefined,\n ...(button.style || undefined),\n }}\n onClick={() => {\n if (button.copyToClipboardAttr && this.state.form!.data) {\n const val = this.state.form!.data[button.copyToClipboardAttr];\n if (typeof val === 'string') {\n Utils.copyToClipboard(val);\n } else {\n Utils.copyToClipboard(JSON.stringify(val, null, 2));\n }\n window.alert(I18n.t('copied'));\n } else if (this.state.form?.data) {\n Utils.copyToClipboard(JSON.stringify(this.state.form.data, null, 2));\n window.alert(I18n.t('copied'));\n } else {\n window.alert(I18n.t('nothingToCopy'));\n }\n }}\n startIcon={button?.icon ? <Icon src={button?.icon} /> : <ContentCopy />}\n >\n {getTranslation(button?.label || 'ctcButtonText', button?.noTranslation)}\n </Button>,\n );\n } else if (button === 'apply' || (button as ActionButton).type === 'apply') {\n buttons.push(this.getOkButton(button));\n } else {\n buttons.push(this.getCancelButton(button));\n }\n });\n } else {\n buttons = [this.getOkButton(), this.getCancelButton()];\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.form!.handleClose?.()}\n hideBackdrop\n fullWidth\n sx={{\n '& .MuiDialog-paper': {\n minWidth: this.state.form.minWidth || undefined,\n },\n }}\n maxWidth={this.state.form.maxWidth || 'md'}\n >\n {this.state.form?.title ? (\n <DialogTitle>\n {getTranslation(\n this.state.form?.label || this.state.form?.title,\n this.state.form.noTranslation,\n )}\n </DialogTitle>\n ) : null}\n <DialogContent>\n <JsonConfig\n instanceId={this.props.selectedInstance}\n schema={this.state.form.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.state.form.data || {}}\n socket={this.props.socket as AdminConnection}\n onChange={(data: Record<string, any>) => {\n console.log('handleFormChange', { data });\n const form: CommunicationFormInState = {\n ...(this.state.form as CommunicationFormInState),\n };\n if (form) {\n form.data = data;\n form.changed = JSON.stringify(data) !== form.originalData;\n this.setState({ form });\n }\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 </DialogContent>\n <DialogActions>{buttons}</DialogActions>\n </Dialog>\n );\n }\n\n renderProgressDialog(): React.JSX.Element | null {\n if (!this.state.progress?.open) {\n return null;\n }\n return (\n <Dialog\n open={!0}\n onClose={() => {}}\n hideBackdrop\n >\n {(\n this.state.progress as {\n open: boolean;\n indeterminate: boolean;\n }\n ).indeterminate ? (\n <LinearProgress variant=\"indeterminate\" />\n ) : (\n <LinearProgress\n variant=\"determinate\"\n value={\n (\n this.state.progress as {\n open: boolean;\n progress: number;\n }\n ).progress || 0\n }\n />\n )}\n </Dialog>\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n renderContent(): React.JSX.Element | React.JSX.Element[] | null {\n return null;\n }\n\n renderSpinner(): React.JSX.Element | null {\n if (!this.state.showSpinner) {\n return null;\n }\n return (\n <Backdrop\n style={{ zIndex: 1000 }}\n open={!0}\n >\n <CircularProgress />\n </Backdrop>\n );\n }\n\n renderConfirmationDialog(): React.JSX.Element | null {\n if (!this.state.showConfirmation) {\n return null;\n }\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showConfirmation: null })}\n >\n <DialogTitle>\n {getTranslation(\n this.state.showConfirmation.confirmation === true\n ? getTranslation('areYouSureText')\n : getTranslation(this.state.showConfirmation.confirmation as ioBroker.StringOrTranslated),\n )}\n </DialogTitle>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (!this.state.showConfirmation) {\n return;\n }\n\n const showConfirmation = this.state.showConfirmation;\n this.setState({ showConfirmation: null }, () => {\n if (showConfirmation.deviceId) {\n this.sendActionToInstance(\n 'dm:deviceAction',\n {\n actionId: showConfirmation.id,\n deviceId: showConfirmation.deviceId,\n timeout: showConfirmation.timeout,\n },\n showConfirmation.refresh,\n );\n } else {\n this.sendActionToInstance('dm:instanceAction', {\n actionId: showConfirmation.id,\n timeout: showConfirmation.timeout,\n });\n }\n });\n }}\n autoFocus\n startIcon={<Check />}\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.setState({ showConfirmation: null })}\n startIcon={<Close />}\n >\n {getTranslation('cancelButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n onShowInputOk(): void {\n if (!this.state.showInput) {\n return;\n }\n\n const showInput = this.state.showInput;\n this.setState({ showInput: null }, () => {\n if (showInput.deviceId) {\n this.sendActionToInstance(\n 'dm:deviceAction',\n {\n actionId: showInput.id,\n deviceId: showInput.deviceId,\n timeout: showInput.timeout,\n value:\n showInput.inputBefore?.type === 'checkbox'\n ? !!this.state.inputValue\n : showInput.inputBefore?.type === 'number'\n ? parseFloat(this.state.inputValue as string) || 0\n : this.state.inputValue,\n },\n showInput.refresh,\n );\n } else {\n this.sendActionToInstance('dm:instanceAction', {\n actionId: showInput.id,\n timeout: showInput.timeout,\n value:\n showInput.inputBefore?.type === 'checkbox'\n ? !!this.state.inputValue\n : showInput.inputBefore?.type === 'number'\n ? parseFloat(this.state.inputValue as string) || 0\n : this.state.inputValue,\n });\n }\n });\n }\n\n renderInputDialog(): React.JSX.Element | null {\n if (!this.state.showInput || !this.state.showInput.inputBefore) {\n return null;\n }\n let okDisabled = false;\n if (!this.state.showInput.inputBefore.allowEmptyValue && this.state.showInput.inputBefore.type !== 'checkbox') {\n if (\n this.state.showInput.inputBefore.type === 'number' ||\n this.state.showInput.inputBefore.type === 'slider'\n ) {\n okDisabled =\n this.state.inputValue === '' ||\n this.state.inputValue === null ||\n !window.isFinite(this.state.inputValue as number);\n } else {\n okDisabled = !this.state.inputValue;\n }\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showInput: null })}\n >\n <DialogTitle>{getTranslation('pleaseEnterValueText')}</DialogTitle>\n <DialogContent>\n {this.state.showInput.inputBefore.type === 'text' ||\n this.state.showInput.inputBefore.type === 'number' ||\n !this.state.showInput.inputBefore.type ? (\n <TextField\n autoFocus\n margin=\"dense\"\n label={getTranslation(this.state.showInput.inputBefore.label)}\n slotProps={{\n htmlInput:\n this.state.showInput.inputBefore.type === 'number'\n ? {\n min: this.state.showInput.inputBefore.min,\n max: this.state.showInput.inputBefore.max,\n step: this.state.showInput.inputBefore.step,\n }\n : undefined,\n input: {\n endAdornment: this.state.inputValue ? (\n <InputAdornment position=\"end\">\n <IconButton\n tabIndex={-1}\n size=\"small\"\n onClick={() => this.setState({ inputValue: '' })}\n >\n <Close />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n type={this.state.showInput.inputBefore.type === 'number' ? 'number' : 'text'}\n fullWidth\n value={this.state.inputValue}\n onChange={e => this.setState({ inputValue: e.target.value })}\n onKeyUp={(e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n this.onShowInputOk();\n }\n }}\n />\n ) : null}\n {this.state.showInput.inputBefore.type === 'checkbox' ? (\n <FormControlLabel\n control={\n <Checkbox\n checked={!!this.state.inputValue}\n autoFocus\n onChange={e => this.setState({ inputValue: e.target.checked })}\n />\n }\n label={getTranslation(this.state.showInput.inputBefore.label)}\n />\n ) : null}\n {this.state.showInput.inputBefore.type === 'select' ? (\n <FormControl fullWidth>\n <InputLabel>{getTranslation(this.state.showInput.inputBefore.label)}</InputLabel>\n <Select\n variant=\"standard\"\n value={this.state.inputValue}\n onChange={e => this.setState({ inputValue: e.target.value })}\n >\n {this.state.showInput.inputBefore.options?.map(item => (\n <MenuItem\n key={item.value}\n value={item.value}\n >\n {getTranslation(item.label)}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n ) : null}\n {this.state.showInput.inputBefore.type === 'slider' ? (\n <Box sx={{ width: '100%' }}>\n <Typography gutterBottom>\n {getTranslation(this.state.showInput.inputBefore.label)}\n </Typography>\n <Grid2\n container\n spacing={2}\n alignItems=\"center\"\n >\n <Grid2>\n <Slider\n value={typeof this.state.inputValue === 'number' ? this.state.inputValue : 0}\n onChange={(_event: Event, newValue: number) =>\n this.setState({ inputValue: newValue })\n }\n />\n </Grid2>\n <Grid2>\n <Input\n value={this.state.inputValue}\n size=\"small\"\n onChange={e =>\n this.setState({\n inputValue: e.target.value === '' ? 0 : Number(e.target.value),\n })\n }\n onBlur={() => {\n if (!this.state.showInput) {\n return;\n }\n\n const min =\n this.state.showInput.inputBefore?.min === undefined\n ? 0\n : this.state.showInput.inputBefore.min;\n const max =\n this.state.showInput.inputBefore?.max === undefined\n ? 100\n : this.state.showInput.inputBefore.max;\n\n if ((this.state.inputValue as number) < min) {\n this.setState({ inputValue: min });\n } else if ((this.state.inputValue as number) > max) {\n this.setState({ inputValue: max });\n }\n }}\n inputProps={{\n step: this.state.showInput.inputBefore.step,\n min:\n this.state.showInput.inputBefore.min === undefined\n ? 0\n : this.state.showInput.inputBefore.min,\n max:\n this.state.showInput.inputBefore.max === undefined\n ? 100\n : this.state.showInput.inputBefore.max,\n type: 'number',\n }}\n />\n </Grid2>\n </Grid2>\n </Box>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n disabled={okDisabled}\n color=\"primary\"\n onClick={() => this.onShowInputOk()}\n startIcon={<Check />}\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.setState({ showInput: null })}\n startIcon={<Close />}\n >\n {getTranslation('cancelButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n render(): React.JSX.Element {\n return (\n <>\n {this.renderSnackbar()}\n {this.renderContent()}\n {this.renderConfirmDialog()}\n {this.renderMessageDialog()}\n {this.renderFormDialog()}\n {this.renderProgressDialog()}\n {this.renderConfirmationDialog()}\n {this.renderInputDialog()}\n {this.renderSpinner()}\n </>\n );\n }\n}\n\nexport default Communication;\n"]}
|
|
1
|
+
{"version":3,"file":"Communication.js","sourceRoot":"./src/","sources":["Communication.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\n\nimport {\n Backdrop,\n Box,\n Button,\n Checkbox,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControl,\n FormControlLabel,\n Grid2,\n IconButton,\n Input,\n InputAdornment,\n InputLabel,\n LinearProgress,\n MenuItem,\n Select,\n Slider,\n Snackbar,\n TextField,\n Typography,\n} from '@mui/material';\n\nimport { Close, Check, ContentCopy } from '@mui/icons-material';\n\nimport {\n type Connection,\n type AdminConnection,\n type ThemeName,\n type ThemeType,\n type IobTheme,\n I18n,\n Icon,\n Utils,\n} from '@iobroker/adapter-react-v5';\nimport type {\n ActionBase,\n ControlBase,\n ControlState,\n DeviceInfo,\n DeviceRefresh,\n InstanceDetails,\n JsonFormSchema,\n ActionButton,\n} from '@iobroker/dm-utils';\nimport type { ConfigItemPanel, ConfigItemTabs } from '@iobroker/json-config';\n\nimport { getTranslation } from './Utils';\nimport JsonConfig from './JsonConfig';\n\ndeclare module '@mui/material/Button' {\n interface ButtonPropsColorOverrides {\n grey: true;\n }\n}\n\nexport type CommunicationProps = {\n /** Socket connection */\n socket: Connection;\n /** Instance to communicate with device-manager backend, like `adapterName.X` */\n selectedInstance?: string; // adapterName.X\n registerHandler?: (handler: null | ((command: string) => void)) => void;\n themeName: ThemeName;\n themeType: ThemeType;\n theme: IobTheme;\n isFloatComma: boolean;\n dateFormat: string;\n};\n\ninterface CommunicationForm {\n title?: ioBroker.StringOrTranslated | null | undefined;\n label?: ioBroker.StringOrTranslated | null | undefined; // same as title\n noTranslation?: boolean; // Do not translate title/label\n schema: JsonFormSchema;\n data?: Record<string, any>;\n buttons?: (ActionButton | 'apply' | 'cancel' | 'close')[];\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Minimal width of the dialog */\n minWidth?: number;\n /** Always allow the apply button. Even when nothing was changed */\n ignoreApplyDisabled?: boolean;\n}\n\ninterface CommunicationFormInState extends CommunicationForm {\n handleClose?: (data?: Record<string, any>) => void;\n originalData: string;\n changed: boolean;\n}\n\ninterface InputAction extends ActionBase {\n /** If it is a device action */\n deviceId?: string;\n /** Optional refresh function to execute */\n refresh?: () => void;\n}\n\nexport type CommunicationState = {\n showSpinner: boolean;\n showToast: string | null;\n message: {\n message: string;\n handleClose: () => void;\n } | null;\n confirm: {\n message: string;\n handleClose: (confirmation?: boolean) => void;\n } | null;\n form: CommunicationFormInState | null;\n progress:\n | {\n open: boolean;\n indeterminate: boolean;\n }\n | {\n open: boolean;\n progress: number;\n }\n | null;\n showConfirmation: InputAction | null;\n showInput: InputAction | null;\n inputValue: string | boolean | number | null;\n};\n\ninterface DmResponse {\n /* Type of message */\n type: 'message' | 'confirm' | 'progress' | 'result' | 'form';\n /* Origin */\n origin: string;\n}\n\ninterface DmControlResponse extends DmResponse {\n result: {\n error?: {\n code: number;\n message: string;\n };\n state?: ioBroker.State;\n deviceId: string;\n controlId: string;\n };\n}\n\ninterface Message {\n actionId?: string;\n deviceId?: string;\n value?: unknown;\n origin?: string;\n confirm?: boolean;\n data?: any;\n /** Inform backend, how long the frontend will wait for an answer */\n timeout?: number;\n}\n\ninterface DmActionResponse extends DmResponse {\n result: {\n refresh?: DeviceRefresh;\n error?: {\n code: number;\n message: string;\n };\n };\n message?: string;\n confirm?: string;\n form?: CommunicationForm;\n progress?:\n | {\n open: boolean;\n indeterminate: boolean;\n }\n | {\n open: boolean;\n progress: number;\n };\n}\n\n/**\n * Device List Component\n */\nexport default class Communication<P extends CommunicationProps, S extends CommunicationState> extends Component<P, S> {\n private responseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n instanceHandler: (action: ActionBase) => () => void;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n deviceHandler: (deviceId: string, action: ActionBase, refresh: () => void) => () => void;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n controlHandler: (\n deviceId: string,\n control: ControlBase,\n state: ControlState,\n ) => () => Promise<ioBroker.State | null>;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n controlStateHandler: (deviceId: string, control: ControlBase) => () => Promise<ioBroker.State | null>;\n\n constructor(props: P) {\n super(props);\n\n this.state = {\n showSpinner: false,\n showToast: null,\n message: null,\n confirm: null,\n form: null,\n progress: null,\n showConfirmation: null,\n showInput: null,\n inputValue: null,\n } as S;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.instanceHandler = action => () => {\n if (action.confirmation) {\n this.setState({ showConfirmation: action });\n return;\n }\n if (action.inputBefore) {\n this.setState({ showInput: action });\n return;\n }\n\n this.sendActionToInstance('dm:instanceAction', { actionId: action.id, timeout: action.timeout });\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.deviceHandler = (deviceId, action, refresh) => () => {\n if (action.confirmation) {\n this.setState({ showConfirmation: { ...action, deviceId, refresh } });\n return;\n }\n if (action.inputBefore) {\n this.setState({\n showInput: { ...action, deviceId, refresh },\n inputValue: action.inputBefore.defaultValue || '',\n });\n return;\n }\n\n this.sendActionToInstance(\n 'dm:deviceAction',\n { deviceId, actionId: action.id, timeout: action.timeout },\n refresh,\n );\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.controlHandler = (deviceId, control, state) => () =>\n this.sendControlToInstance('dm:deviceControl', { deviceId, controlId: control.id, state });\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n this.controlStateHandler = (deviceId, control) => () =>\n this.sendControlToInstance('dm:deviceControlState', { deviceId, controlId: control.id });\n\n this.props.registerHandler?.(() => this.loadData());\n }\n\n componentWillUnmount(): void {\n if (this.responseTimeout) {\n clearTimeout(this.responseTimeout);\n this.responseTimeout = null;\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n loadData(): void {\n console.error('loadData not implemented');\n }\n\n sendActionToInstance = (command: `dm:${string}`, messageToSend: Message, refresh?: () => void): void => {\n const send = async (): Promise<void> => {\n this.setState({ showSpinner: true });\n\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n\n this.responseTimeout = setTimeout(() => {\n this.setState({ showSpinner: false });\n window.alert(I18n.t('ra_No response from the backend'));\n }, messageToSend.timeout || 5000);\n\n const response: DmActionResponse = await this.props.socket.sendTo(\n this.props.selectedInstance,\n command,\n messageToSend,\n );\n\n if (this.responseTimeout) {\n clearTimeout(this.responseTimeout);\n this.responseTimeout = null;\n }\n\n const type: string = response.type;\n console.log(`Response: ${response.type}`);\n switch (type) {\n case 'message':\n console.log(`Message received: ${response.message}`);\n if (response.message) {\n this.setState({\n message: {\n message: response.message,\n handleClose: () =>\n this.setState({ message: null }, () =>\n this.sendActionToInstance(\n 'dm:actionProgress',\n { origin: response.origin },\n refresh,\n ),\n ),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'confirm':\n console.log(`Confirm received: ${response.confirm}`);\n if (response.confirm) {\n this.setState({\n confirm: {\n message: response.confirm,\n handleClose: (confirm?: boolean) =>\n this.setState({ confirm: null }, () =>\n this.sendActionToInstance(\n 'dm:actionProgress',\n {\n origin: response.origin,\n confirm,\n },\n refresh,\n ),\n ),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'form':\n console.log('Form received');\n if (response.form) {\n const data: Record<string, any> | undefined = response.form.data;\n const originalData: Record<string, any> = {};\n if (data) {\n Object.keys(data).forEach(key => {\n if (data[key] !== undefined) {\n originalData[key] = data[key];\n }\n });\n }\n response.form.data = JSON.parse(JSON.stringify(originalData)) as Record<string, any>;\n\n this.setState({\n form: {\n ...response.form,\n changed: false,\n originalData: JSON.stringify(originalData),\n handleClose: (data: any) =>\n this.setState({ form: null }, () => {\n console.log(`Form ${JSON.stringify(data)}`);\n this.sendActionToInstance(\n 'dm:actionProgress',\n {\n origin: response.origin,\n data,\n },\n refresh,\n );\n }),\n },\n showSpinner: false,\n });\n }\n break;\n\n case 'progress':\n if (response.progress) {\n if (this.state.progress) {\n const progress = { ...this.state.progress, ...response.progress };\n this.setState({ progress, showSpinner: false });\n } else {\n this.setState({ progress: response.progress, showSpinner: false });\n }\n }\n this.sendActionToInstance('dm:actionProgress', { origin: response.origin }, refresh);\n break;\n\n case 'result':\n console.log('Response content', response.result);\n if (response.result.refresh) {\n if (response.result.refresh === true) {\n console.log('Refreshing all');\n this.loadData();\n } else if (response.result.refresh === 'instance') {\n console.log(`Refreshing instance infos: ${this.props.selectedInstance}`);\n } else if (response.result.refresh === 'device') {\n if (!refresh) {\n console.log('No refresh function provided to refresh \"device\"');\n } else {\n console.log(`Refreshing device infos: ${this.props.selectedInstance}`);\n refresh();\n }\n } else {\n console.log('Not refreshing anything');\n }\n }\n if (response.result.error) {\n console.error(`Error: ${response.result.error.message}`);\n this.setState({ showToast: response.result.error.message, showSpinner: false });\n } else {\n this.setState({ showSpinner: false });\n }\n break;\n\n default:\n console.log(`Unknown response type: ${type}`);\n this.setState({ showSpinner: false });\n break;\n }\n };\n\n void send().catch(console.error);\n };\n\n sendControlToInstance = async (\n command: string,\n messageToSend: { deviceId: string; controlId: string; state?: ControlState },\n ): Promise<null | ioBroker.State> => {\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n const response: DmControlResponse = await this.props.socket.sendTo(\n this.props.selectedInstance,\n command,\n messageToSend,\n );\n const type = response.type;\n console.log(`Response: ${response.type}`);\n if (response.type === 'result') {\n console.log('Response content', response.result);\n if (response.result.error) {\n console.error(`Error: ${response.result.error.message}`);\n this.setState({ showToast: response.result.error.message });\n } else if (response.result.state !== undefined) {\n return response.result.state;\n }\n } else {\n console.warn('Unexpected response type', type);\n }\n\n return null;\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n loadDevices(): Promise<DeviceInfo[]> {\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n return this.props.socket.sendTo(this.props.selectedInstance, 'dm:listDevices');\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n loadInstanceInfos(): Promise<InstanceDetails> {\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n return this.props.socket.sendTo(this.props.selectedInstance, 'dm:instanceInfo');\n }\n\n renderMessageDialog(): React.JSX.Element | null {\n if (!this.state.message) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.message?.handleClose()}\n hideBackdrop\n aria-describedby=\"message-dialog-description\"\n >\n <DialogContent>\n <DialogContentText id=\"message-dialog-description\">{this.state.message?.message}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"primary\"\n onClick={() => this.state.message?.handleClose()}\n variant=\"contained\"\n autoFocus\n >\n {getTranslation('okButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderConfirmDialog(): React.JSX.Element | null {\n if (!this.state.confirm) {\n return null;\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.confirm?.handleClose()}\n hideBackdrop\n aria-describedby=\"confirm-dialog-description\"\n >\n <DialogContent>\n <DialogContentText id=\"confirm-dialog-description\">\n {getTranslation(this.state.confirm?.message)}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => this.state.confirm?.handleClose(true)}\n autoFocus\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.state.confirm?.handleClose(false)}\n autoFocus\n >\n {getTranslation('noButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n renderSnackbar(): React.JSX.Element {\n return (\n <Snackbar\n open={!!this.state.showToast}\n autoHideDuration={6_000}\n onClose={() => this.setState({ showToast: null })}\n message={this.state.showToast}\n />\n );\n }\n\n getOkButton(button?: ActionButton | 'apply' | 'cancel' | 'close'): React.JSX.Element {\n if (typeof button === 'string') {\n button = undefined;\n }\n\n // TODO: detect if any input fields are present and if no one, do not disable the button\n\n return (\n <Button\n key=\"apply\"\n disabled={!this.state.form?.changed && !this.state.form?.ignoreApplyDisabled}\n variant={button?.variant || 'contained'}\n color={\n button?.color === 'primary' ? 'primary' : button?.color === 'secondary' ? 'secondary' : 'primary'\n }\n style={{\n backgroundColor:\n button?.color && button?.color !== 'primary' && button?.color !== 'secondary'\n ? button?.color\n : undefined,\n ...(button?.style || undefined),\n }}\n onClick={() => this.state.form?.handleClose && this.state.form.handleClose(this.state.form?.data)}\n startIcon={button?.icon ? <Icon src={button?.icon} /> : undefined}\n >\n {getTranslation(button?.label || 'okButtonText', button?.noTranslation)}\n </Button>\n );\n }\n\n getCancelButton(button?: ActionButton | 'apply' | 'cancel' | 'close'): React.JSX.Element {\n let isClose = false;\n if (typeof button === 'string') {\n isClose = button === 'close';\n button = undefined;\n }\n return (\n <Button\n key=\"cancel\"\n variant={button?.variant || 'contained'}\n color={button?.color === 'primary' ? 'primary' : button?.color === 'secondary' ? 'secondary' : 'grey'}\n style={{\n backgroundColor:\n button?.color && button?.color !== 'primary' && button?.color !== 'secondary'\n ? button?.color\n : undefined,\n ...(button?.style || undefined),\n }}\n onClick={() => this.state.form?.handleClose && this.state.form.handleClose()}\n startIcon={isClose ? <Close /> : button?.icon ? <Icon src={button?.icon} /> : undefined}\n >\n {getTranslation(button?.label || 'cancelButtonText', button?.noTranslation)}\n </Button>\n );\n }\n\n renderFormDialog(): React.JSX.Element | null {\n if (!this.state.form?.schema) {\n return null;\n }\n if (!this.props.selectedInstance) {\n throw new Error('No instance selected');\n }\n let buttons: React.JSX.Element[];\n if (this.state.form.buttons) {\n buttons = [];\n this.state.form.buttons.forEach((button: ActionButton | 'apply' | 'cancel' | 'close'): void => {\n if (typeof button === 'object' && button.type === 'copyToClipboard') {\n buttons.push(\n <Button\n key=\"copyToClipboard\"\n variant={button.variant || 'outlined'}\n color={\n button.color === 'primary'\n ? 'primary'\n : button.color === 'secondary'\n ? 'secondary'\n : undefined\n }\n style={{\n backgroundColor:\n button.color && button.color !== 'primary' && button.color !== 'secondary'\n ? button.color\n : undefined,\n ...(button.style || undefined),\n }}\n onClick={() => {\n if (button.copyToClipboardAttr && this.state.form!.data) {\n const val = this.state.form!.data[button.copyToClipboardAttr];\n if (typeof val === 'string') {\n Utils.copyToClipboard(val);\n } else {\n Utils.copyToClipboard(JSON.stringify(val, null, 2));\n }\n window.alert(I18n.t('copied'));\n } else if (this.state.form?.data) {\n Utils.copyToClipboard(JSON.stringify(this.state.form.data, null, 2));\n window.alert(I18n.t('copied'));\n } else {\n window.alert(I18n.t('nothingToCopy'));\n }\n }}\n startIcon={button?.icon ? <Icon src={button?.icon} /> : <ContentCopy />}\n >\n {getTranslation(button?.label || 'ctcButtonText', button?.noTranslation)}\n </Button>,\n );\n } else if (button === 'apply' || (button as ActionButton).type === 'apply') {\n buttons.push(this.getOkButton(button));\n } else {\n buttons.push(this.getCancelButton(button));\n }\n });\n } else {\n buttons = [this.getOkButton(), this.getCancelButton()];\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.state.form!.handleClose?.()}\n hideBackdrop\n fullWidth\n sx={{\n '& .MuiDialog-paper': {\n minWidth: this.state.form.minWidth || undefined,\n },\n }}\n maxWidth={this.state.form.maxWidth || 'md'}\n >\n {this.state.form?.title ? (\n <DialogTitle>\n {getTranslation(\n this.state.form?.label || this.state.form?.title,\n this.state.form.noTranslation,\n )}\n </DialogTitle>\n ) : null}\n <DialogContent>\n <JsonConfig\n instanceId={this.props.selectedInstance}\n schema={this.state.form.schema as ConfigItemPanel | ConfigItemTabs}\n data={this.state.form.data || {}}\n socket={this.props.socket as AdminConnection}\n onChange={(data: Record<string, any>) => {\n console.log('handleFormChange', { data });\n const form: CommunicationFormInState = {\n ...(this.state.form as CommunicationFormInState),\n };\n if (form) {\n form.data = data;\n form.changed = JSON.stringify(data) !== form.originalData;\n this.setState({ form });\n }\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 </DialogContent>\n <DialogActions>{buttons}</DialogActions>\n </Dialog>\n );\n }\n\n renderProgressDialog(): React.JSX.Element | null {\n if (!this.state.progress?.open) {\n return null;\n }\n return (\n <Dialog\n open={!0}\n onClose={() => {}}\n hideBackdrop\n >\n {(\n this.state.progress as {\n open: boolean;\n indeterminate: boolean;\n }\n ).indeterminate ? (\n <LinearProgress variant=\"indeterminate\" />\n ) : (\n <LinearProgress\n variant=\"determinate\"\n value={\n (\n this.state.progress as {\n open: boolean;\n progress: number;\n }\n ).progress || 0\n }\n />\n )}\n </Dialog>\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n renderContent(): React.JSX.Element | React.JSX.Element[] | null {\n return null;\n }\n\n renderSpinner(): React.JSX.Element | null {\n if (!this.state.showSpinner) {\n return null;\n }\n return (\n <Backdrop\n style={{ zIndex: 1000 }}\n open={!0}\n >\n <CircularProgress />\n </Backdrop>\n );\n }\n\n renderConfirmationDialog(): React.JSX.Element | null {\n if (!this.state.showConfirmation) {\n return null;\n }\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showConfirmation: null })}\n >\n <DialogTitle>\n {getTranslation(\n this.state.showConfirmation.confirmation === true\n ? getTranslation('areYouSureText')\n : getTranslation(this.state.showConfirmation.confirmation as ioBroker.StringOrTranslated),\n )}\n </DialogTitle>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (!this.state.showConfirmation) {\n return;\n }\n\n const showConfirmation = this.state.showConfirmation;\n this.setState({ showConfirmation: null }, () => {\n if (showConfirmation.deviceId) {\n this.sendActionToInstance(\n 'dm:deviceAction',\n {\n actionId: showConfirmation.id,\n deviceId: showConfirmation.deviceId,\n timeout: showConfirmation.timeout,\n },\n showConfirmation.refresh,\n );\n } else {\n this.sendActionToInstance('dm:instanceAction', {\n actionId: showConfirmation.id,\n timeout: showConfirmation.timeout,\n });\n }\n });\n }}\n autoFocus\n startIcon={<Check />}\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.setState({ showConfirmation: null })}\n startIcon={<Close />}\n >\n {getTranslation('cancelButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n onShowInputOk(): void {\n if (!this.state.showInput) {\n return;\n }\n\n const showInput = this.state.showInput;\n this.setState({ showInput: null }, () => {\n if (showInput.deviceId) {\n this.sendActionToInstance(\n 'dm:deviceAction',\n {\n actionId: showInput.id,\n deviceId: showInput.deviceId,\n timeout: showInput.timeout,\n value:\n showInput.inputBefore?.type === 'checkbox'\n ? !!this.state.inputValue\n : showInput.inputBefore?.type === 'number'\n ? parseFloat(this.state.inputValue as string) || 0\n : this.state.inputValue,\n },\n showInput.refresh,\n );\n } else {\n this.sendActionToInstance('dm:instanceAction', {\n actionId: showInput.id,\n timeout: showInput.timeout,\n value:\n showInput.inputBefore?.type === 'checkbox'\n ? !!this.state.inputValue\n : showInput.inputBefore?.type === 'number'\n ? parseFloat(this.state.inputValue as string) || 0\n : this.state.inputValue,\n });\n }\n });\n }\n\n renderInputDialog(): React.JSX.Element | null {\n if (!this.state.showInput || !this.state.showInput.inputBefore) {\n return null;\n }\n let okDisabled = false;\n if (!this.state.showInput.inputBefore.allowEmptyValue && this.state.showInput.inputBefore.type !== 'checkbox') {\n if (\n this.state.showInput.inputBefore.type === 'number' ||\n this.state.showInput.inputBefore.type === 'slider'\n ) {\n okDisabled =\n this.state.inputValue === '' ||\n this.state.inputValue === null ||\n !window.isFinite(this.state.inputValue as number);\n } else {\n okDisabled = !this.state.inputValue;\n }\n }\n\n return (\n <Dialog\n open={!0}\n onClose={() => this.setState({ showInput: null })}\n >\n <DialogTitle>{getTranslation('pleaseEnterValueText')}</DialogTitle>\n <DialogContent>\n {this.state.showInput.inputBefore.type === 'text' ||\n this.state.showInput.inputBefore.type === 'number' ||\n !this.state.showInput.inputBefore.type ? (\n <TextField\n autoFocus\n margin=\"dense\"\n label={getTranslation(this.state.showInput.inputBefore.label)}\n slotProps={{\n htmlInput:\n this.state.showInput.inputBefore.type === 'number'\n ? {\n min: this.state.showInput.inputBefore.min,\n max: this.state.showInput.inputBefore.max,\n step: this.state.showInput.inputBefore.step,\n }\n : undefined,\n input: {\n endAdornment: this.state.inputValue ? (\n <InputAdornment position=\"end\">\n <IconButton\n tabIndex={-1}\n size=\"small\"\n onClick={() => this.setState({ inputValue: '' })}\n >\n <Close />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n type={this.state.showInput.inputBefore.type === 'number' ? 'number' : 'text'}\n fullWidth\n value={this.state.inputValue}\n onChange={e => this.setState({ inputValue: e.target.value })}\n onKeyUp={(e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n this.onShowInputOk();\n }\n }}\n />\n ) : null}\n {this.state.showInput.inputBefore.type === 'checkbox' ? (\n <FormControlLabel\n control={\n <Checkbox\n checked={!!this.state.inputValue}\n autoFocus\n onChange={e => this.setState({ inputValue: e.target.checked })}\n />\n }\n label={getTranslation(this.state.showInput.inputBefore.label)}\n />\n ) : null}\n {this.state.showInput.inputBefore.type === 'select' ? (\n <FormControl fullWidth>\n <InputLabel>{getTranslation(this.state.showInput.inputBefore.label)}</InputLabel>\n <Select\n variant=\"standard\"\n value={this.state.inputValue}\n onChange={e => this.setState({ inputValue: e.target.value })}\n >\n {this.state.showInput.inputBefore.options?.map(item => (\n <MenuItem\n key={item.value}\n value={item.value}\n >\n {getTranslation(item.label)}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n ) : null}\n {this.state.showInput.inputBefore.type === 'slider' ? (\n <Box sx={{ width: '100%' }}>\n <Typography gutterBottom>\n {getTranslation(this.state.showInput.inputBefore.label)}\n </Typography>\n <Grid2\n container\n spacing={2}\n alignItems=\"center\"\n >\n <Grid2>\n <Slider\n value={typeof this.state.inputValue === 'number' ? this.state.inputValue : 0}\n onChange={(_event: Event, newValue: number) =>\n this.setState({ inputValue: newValue })\n }\n />\n </Grid2>\n <Grid2>\n <Input\n value={this.state.inputValue}\n size=\"small\"\n onChange={e =>\n this.setState({\n inputValue: e.target.value === '' ? 0 : Number(e.target.value),\n })\n }\n onBlur={() => {\n if (!this.state.showInput) {\n return;\n }\n\n const min =\n this.state.showInput.inputBefore?.min === undefined\n ? 0\n : this.state.showInput.inputBefore.min;\n const max =\n this.state.showInput.inputBefore?.max === undefined\n ? 100\n : this.state.showInput.inputBefore.max;\n\n if ((this.state.inputValue as number) < min) {\n this.setState({ inputValue: min });\n } else if ((this.state.inputValue as number) > max) {\n this.setState({ inputValue: max });\n }\n }}\n inputProps={{\n step: this.state.showInput.inputBefore.step,\n min:\n this.state.showInput.inputBefore.min === undefined\n ? 0\n : this.state.showInput.inputBefore.min,\n max:\n this.state.showInput.inputBefore.max === undefined\n ? 100\n : this.state.showInput.inputBefore.max,\n type: 'number',\n }}\n />\n </Grid2>\n </Grid2>\n </Box>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n disabled={okDisabled}\n color=\"primary\"\n onClick={() => this.onShowInputOk()}\n startIcon={<Check />}\n >\n {getTranslation('yesButtonText')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"grey\"\n onClick={() => this.setState({ showInput: null })}\n startIcon={<Close />}\n >\n {getTranslation('cancelButtonText')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n render(): React.JSX.Element {\n return (\n <>\n {this.renderSnackbar()}\n {this.renderContent()}\n {this.renderConfirmDialog()}\n {this.renderMessageDialog()}\n {this.renderFormDialog()}\n {this.renderProgressDialog()}\n {this.renderConfirmationDialog()}\n {this.renderInputDialog()}\n {this.renderSpinner()}\n </>\n );\n }\n}\n"]}
|
package/build/DeviceList.d.ts
CHANGED
package/build/DeviceList.js
CHANGED
|
@@ -62,6 +62,7 @@ export default class DeviceList extends Communication {
|
|
|
62
62
|
groupKey: '',
|
|
63
63
|
dmInstances: null,
|
|
64
64
|
selectedInstance,
|
|
65
|
+
apiVersionError: false,
|
|
65
66
|
});
|
|
66
67
|
this.lastPropsFilter = this.props.filter;
|
|
67
68
|
this.lastInstance = selectedInstance;
|
|
@@ -128,7 +129,7 @@ export default class DeviceList extends Communication {
|
|
|
128
129
|
if (!this.props.embedded && alive) {
|
|
129
130
|
try {
|
|
130
131
|
const instanceInfo = await this.loadInstanceInfos();
|
|
131
|
-
this.setState({ instanceInfo });
|
|
132
|
+
this.setState({ instanceInfo, apiVersionError: instanceInfo.apiVersion !== 'v1' });
|
|
132
133
|
}
|
|
133
134
|
catch (error) {
|
|
134
135
|
console.error(error);
|
|
@@ -327,12 +328,12 @@ export default class DeviceList extends Communication {
|
|
|
327
328
|
}, displayEmpty: true, variant: "standard", sx: { minWidth: 120 } }, Object.keys(this.state.dmInstances).map(([id]) => (React.createElement(MenuItem, { key: id, value: id }, id)))))) : null,
|
|
328
329
|
this.props.selectedInstance ? (React.createElement(Tooltip, { title: getTranslation('refreshTooltip'), slotProps: { popper: { sx: { pointerEvents: 'none' } } } },
|
|
329
330
|
React.createElement("span", null,
|
|
330
|
-
React.createElement(IconButton, { onClick: () => this.loadData(), disabled: !this.state.alive, size: "small" },
|
|
331
|
+
React.createElement(IconButton, { onClick: () => this.loadData(), disabled: !this.state.alive || this.state.apiVersionError, size: "small" },
|
|
331
332
|
React.createElement(Refresh, null))))) : null,
|
|
332
|
-
this.state.alive && this.state.instanceInfo?.actions?.length ? (React.createElement("div", { style: { marginLeft: 20 } }, this.state.instanceInfo.actions.map(action => (React.createElement(InstanceActionButton, { key: action.id, action: action, instanceHandler: this.instanceHandler }))))) : null,
|
|
333
|
+
!this.state.apiVersionError && this.state.alive && this.state.instanceInfo?.actions?.length ? (React.createElement("div", { style: { marginLeft: 20 } }, this.state.instanceInfo.actions.map(action => (React.createElement(InstanceActionButton, { key: action.id, action: action, instanceHandler: this.instanceHandler }))))) : null,
|
|
333
334
|
React.createElement("div", { style: { flexGrow: 1 } }),
|
|
334
|
-
this.renderGroups(deviceGroups),
|
|
335
|
-
this.state.alive ? (React.createElement(TextField, { variant: "standard", style: { width: 200 }, size: "small", label: getTranslation('filterLabelText'), onChange: e => this.handleFilterChange(e.target.value), value: this.state.filter, autoComplete: "off", slotProps: {
|
|
335
|
+
!this.state.apiVersionError && this.renderGroups(deviceGroups),
|
|
336
|
+
!this.state.apiVersionError && this.state.alive ? (React.createElement(TextField, { variant: "standard", style: { width: 200 }, size: "small", label: getTranslation('filterLabelText'), onChange: e => this.handleFilterChange(e.target.value), value: this.state.filter, autoComplete: "off", slotProps: {
|
|
336
337
|
input: {
|
|
337
338
|
autoComplete: 'new-password',
|
|
338
339
|
endAdornment: this.state.filter ? (React.createElement(InputAdornment, { position: "end" },
|
|
@@ -356,7 +357,7 @@ export default class DeviceList extends Communication {
|
|
|
356
357
|
...this.props.style,
|
|
357
358
|
} },
|
|
358
359
|
this.state.loading ? React.createElement(LinearProgress, { style: { width: '100%' } }) : null,
|
|
359
|
-
list)));
|
|
360
|
+
this.state.apiVersionError ? React.createElement("div", null, I18n.t('apiVersionError')) : list)));
|
|
360
361
|
}
|
|
361
362
|
}
|
|
362
363
|
//# sourceMappingURL=DeviceList.js.map
|
package/build/DeviceList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceList.js","sourceRoot":"./src/","sources":["DeviceList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\nimport {\n IconButton,\n InputAdornment,\n TextField,\n Toolbar,\n Tooltip,\n LinearProgress,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n} from '@mui/material';\n\nimport { Clear, QuestionMark, Refresh, FilterAltOff } from '@mui/icons-material';\n\nimport { I18n, DeviceTypeIcon } from '@iobroker/adapter-react-v5';\nimport type { DeviceInfo, InstanceDetails } from '@iobroker/dm-utils';\n\nimport DeviceCard from './DeviceCard';\nimport { getTranslation } from './Utils';\nimport Communication, { type CommunicationProps, type CommunicationState } from './Communication';\nimport InstanceActionButton from './InstanceActionButton';\n\nimport de from './i18n/de.json';\nimport en from './i18n/en.json';\nimport ru from './i18n/ru.json';\nimport pt from './i18n/pt.json';\nimport nl from './i18n/nl.json';\nimport fr from './i18n/fr.json';\nimport it from './i18n/it.json';\nimport es from './i18n/es.json';\nimport pl from './i18n/pl.json';\nimport uk from './i18n/uk.json';\nimport zhCn from './i18n/zh-cn.json';\n\ninterface DeviceListProps extends CommunicationProps {\n /** Instance to upload images to, like `adapterName.X` */\n uploadImagesToInstance?: string;\n /** Filter devices with this string */\n filter?: string;\n /** If this component is used in GUI with own toolbar. `false` if this list is used with multiple instances and true if only with one (in this case, it will monitor alive itself */\n embedded?: boolean;\n /** If embedded, this text is shown in the toolbar */\n title?: string;\n /** Style of a component that displays all devices */\n style?: React.CSSProperties;\n /** Use small cards for devices */\n smallCards?: boolean;\n /** To trigger the reload of devices, just change this variable */\n triggerLoad?: number;\n}\n\ninterface DeviceListState extends CommunicationState {\n devices: DeviceInfo[];\n filteredDevices: DeviceInfo[];\n filter: string;\n instanceInfo: InstanceDetails;\n loading: boolean;\n alive: boolean | null;\n triggerLoad: number;\n groupKey: string;\n dmInstances: { [instanceName: string]: { title: string; instance: number } } | null;\n selectedInstance: string;\n}\n\n/**\n * Device List Component\n */\nexport default class DeviceList extends Communication<DeviceListProps, DeviceListState> {\n static i18nInitialized = false;\n\n private lastPropsFilter: string | undefined;\n\n private lastInstance: string;\n\n private lastTriggerLoad = 0;\n\n private filterTimeout: ReturnType<typeof setTimeout> | null;\n\n private readonly language: ioBroker.Languages;\n\n constructor(props: DeviceListProps) {\n super(props);\n\n if (!DeviceList.i18nInitialized) {\n DeviceList.i18nInitialized = true;\n I18n.extendTranslations({\n en,\n de,\n ru,\n pt,\n nl,\n fr,\n it,\n es,\n pl,\n uk,\n 'zh-cn': zhCn,\n });\n }\n\n let selectedInstance: string;\n if (this.props.selectedInstance === undefined) {\n selectedInstance = window.localStorage.getItem('dmSelectedInstance') || '';\n } else {\n selectedInstance = this.props.selectedInstance;\n }\n\n Object.assign(this.state, {\n devices: [],\n filteredDevices: [],\n filter: '',\n instanceInfo: null,\n loading: null,\n alive: null,\n groupKey: '',\n dmInstances: null,\n selectedInstance,\n });\n\n this.lastPropsFilter = this.props.filter;\n this.lastInstance = selectedInstance;\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n this.filterTimeout = null;\n this.language = I18n.getLanguage();\n }\n\n private async loadAdapters(): Promise<void> {\n await this.props.socket.waitForFirstConnection();\n\n console.log('Loading adapters...');\n const res = await this.props.socket.getObjectViewSystem('instance', 'system.adapter.', 'system.adapter.\\u9999');\n const dmInstances: { [instanceName: string]: { title: string; instance: number } } = {};\n for (const id in res) {\n if (!res[id]?.common?.messagebox) {\n continue;\n }\n if (!res[id].common.supportedMessages?.deviceManager) {\n continue;\n }\n\n const instanceName = id.substring('system.adapter.'.length);\n try {\n // Check if the instance is alive by getting the state alive\n const alive = await this.props.socket.getState(`system.adapter.${instanceName}.alive`);\n if (!alive?.val) {\n continue;\n }\n\n const instance = parseInt(instanceName.split('.').pop() || '0') || 0;\n dmInstances[instanceName] = {\n title: '',\n instance,\n };\n } catch (error) {\n console.error(error);\n }\n }\n\n this.setState({ dmInstances });\n }\n\n async componentDidMount(): Promise<void> {\n let alive = false;\n if (this.props.selectedInstance === undefined) {\n // show instance selector\n await this.loadAdapters();\n }\n\n if (this.state.alive === null) {\n try {\n // check if the instance is alive\n const stateAlive = await this.props.socket.getState(\n `system.adapter.${this.props.selectedInstance}.alive`,\n );\n if (stateAlive?.val) {\n alive = true;\n }\n } catch (error) {\n console.error(error);\n }\n this.setState({ alive }, () =>\n this.props.socket.subscribeState(\n `system.adapter.${this.props.selectedInstance}.alive`,\n this.aliveHandler,\n ),\n );\n if (!alive) {\n return;\n }\n } else {\n alive = this.state.alive;\n }\n\n if (!this.props.embedded && alive) {\n try {\n const instanceInfo = await this.loadInstanceInfos();\n this.setState({ instanceInfo });\n } catch (error) {\n console.error(error);\n }\n }\n if (alive) {\n this.loadData();\n }\n }\n\n componentWillUnmount(): void {\n this.props.socket.unsubscribeState(`system.adapter.${this.props.selectedInstance}.alive`, this.aliveHandler);\n }\n\n aliveHandler: ioBroker.StateChangeHandler = (id: string, state: ioBroker.State | null | undefined): void => {\n if (id === `system.adapter.${this.props.selectedInstance}.alive`) {\n const alive = !!state?.val;\n if (alive !== this.state.alive) {\n this.setState({ alive }, () => {\n if (alive) {\n this.componentDidMount().catch(console.error);\n }\n });\n }\n }\n };\n\n /**\n * Load devices\n */\n override loadData(): void {\n this.setState({ loading: true }, async () => {\n console.log(`Loading devices for ${this.props.selectedInstance}...`);\n let devices: DeviceInfo[] = [];\n try {\n devices = await this.loadDevices();\n\n if (!devices || !Array.isArray(devices)) {\n console.error(\n `Message returned from sendTo() doesn't look like one from DeviceManagement, did you accidentally handle the message in your adapter? ${JSON.stringify(\n devices,\n )}`,\n );\n devices = [];\n }\n } catch (error) {\n console.error(error);\n devices = [];\n }\n\n this.setState({ devices, loading: false }, () => this.applyFilter());\n });\n }\n\n getText(text: ioBroker.StringOrTranslated): string {\n if (typeof text === 'object') {\n return text[this.language] || text.en;\n }\n\n return text;\n }\n\n applyFilter(): void {\n const filter = this.props.embedded ? this.props.filter : this.state.filter;\n\n // filter devices name\n if (filter) {\n const filteredDevices = this.state.devices.filter(device =>\n this.getText(device.name).toLowerCase().includes(filter.toLowerCase()),\n );\n this.setState({ filteredDevices });\n } else {\n this.setState({ filteredDevices: this.state.devices });\n }\n }\n\n handleFilterChange(filter: string): void {\n this.setState({ filter }, () => {\n if (this.filterTimeout) {\n clearTimeout(this.filterTimeout);\n }\n this.filterTimeout = setTimeout(() => {\n this.filterTimeout = null;\n this.applyFilter();\n }, 250);\n });\n }\n\n renderGroups(\n groups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] | undefined,\n ): React.JSX.Element | null {\n if (!groups?.length) {\n return null;\n }\n\n return (\n <Select\n style={{ minWidth: 120, marginRight: 8, marginTop: 12.5 }}\n variant=\"standard\"\n value={this.state.groupKey || '_'}\n renderValue={value => {\n if (value === '_') {\n value = '';\n }\n const g = groups.find(g => g.value === value);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {g?.icon || <div style={{ width: 24 }} />}\n {g?.name || value}\n </div>\n );\n }}\n onChange={e => this.setState({ groupKey: e.target.value === '_' ? '' : e.target.value })}\n >\n {groups.map(g => (\n <MenuItem\n value={g.value || '_'}\n key={g.value || '_'}\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n >\n {g.icon || <div style={{ width: 24 }} />}\n {g.name}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n renderContent(): JSX.Element | JSX.Element[] | null {\n const emptyStyle: React.CSSProperties = {\n padding: 25,\n };\n\n if ((this.props.triggerLoad || 0) !== this.lastTriggerLoad) {\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n setTimeout(() => this.loadData(), 50);\n }\n\n if (this.props.embedded && this.lastPropsFilter !== this.props.filter) {\n this.lastPropsFilter = this.props.filter;\n setTimeout(() => this.applyFilter(), 50);\n }\n // if instance changed\n if (this.props.embedded && this.lastInstance !== this.props.selectedInstance && this.props.selectedInstance) {\n this.lastInstance = this.props.selectedInstance;\n setTimeout(() => this.loadData(), 50);\n }\n const deviceGroups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] =\n [];\n let list: React.JSX.Element[] | undefined;\n if (!this.props.embedded && !this.state.alive) {\n list = [\n <div\n style={emptyStyle}\n key=\"notAlive\"\n >\n <span>{getTranslation('instanceNotAlive')}</span>\n </div>,\n ];\n } else if (!this.state.devices.length && this.props.selectedInstance) {\n list = [\n <div\n style={emptyStyle}\n key=\"notFound\"\n >\n <span>{getTranslation('noDevicesFoundText')}</span>\n </div>,\n ];\n } else if (this.state.devices.length && !this.state.filteredDevices.length) {\n list = [\n <div\n style={emptyStyle}\n key=\"filtered\"\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </div>,\n ];\n } else {\n // build a device types list\n let filteredDevices = this.state.filteredDevices;\n if (!this.props.embedded && filteredDevices.find(device => device.group)) {\n deviceGroups.push({\n name: I18n.t('All'),\n value: '',\n count: filteredDevices.length,\n icon: <FilterAltOff />,\n });\n filteredDevices.forEach(device => {\n if (device.group) {\n const type = deviceGroups.find(t => t.value === device.group?.key);\n if (type) {\n type.count++;\n } else {\n const icon = device.group.icon ? <DeviceTypeIcon src={device.group.icon} /> : null;\n\n deviceGroups.push({\n name: this.getText(device.group.name || device.group.key),\n value: device.group.key,\n count: 1,\n icon,\n });\n }\n }\n });\n const unknown = filteredDevices.filter(device => !device.group);\n if (unknown.length) {\n deviceGroups.push({\n name: I18n.t('Unknown'),\n value: '?',\n count: unknown.length,\n icon: <QuestionMark />,\n });\n }\n\n if (this.state.groupKey) {\n // filter out all devices belonging to this group\n if (this.state.groupKey === '?') {\n filteredDevices = filteredDevices.filter(device => !device.group?.key);\n } else {\n filteredDevices = filteredDevices.filter(device => device.group?.key === this.state.groupKey);\n }\n if (!filteredDevices.length) {\n list = [\n <div\n style={emptyStyle}\n key=\"filtered\"\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </div>,\n ];\n }\n }\n }\n\n if (filteredDevices.length && this.props.selectedInstance) {\n list = filteredDevices.map(device => (\n <DeviceCard\n alive={!!this.state.alive}\n key={device.id}\n id={device.id}\n title={this.getText(device.name)}\n device={device}\n instanceId={this.props.selectedInstance!}\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceHandler={this.deviceHandler}\n controlHandler={this.controlHandler}\n controlStateHandler={this.controlStateHandler}\n socket={this.props.socket}\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 ));\n }\n }\n\n if (this.props.embedded) {\n return (\n <>\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {list}\n </>\n );\n }\n\n return (\n <div style={{ width: '100%', height: '100%', overflow: 'hidden' }}>\n <Toolbar\n variant=\"dense\"\n style={{ backgroundColor: '#777', display: 'flex' }}\n >\n {this.props.title}\n {this.props.selectedInstance === null && this.state.dmInstances ? (\n <FormControl>\n <InputLabel id=\"instance-select-label\">{getTranslation('instanceLabelText')}</InputLabel>\n <Select\n labelId=\"instance-select-label\"\n id=\"instance-select\"\n value={this.state.selectedInstance}\n onChange={event => {\n window.localStorage.setItem('dmSelectedInstance', event.target.value);\n this.setState({ selectedInstance: event.target.value });\n }}\n displayEmpty\n variant=\"standard\"\n sx={{ minWidth: 120 }}\n >\n {Object.keys(this.state.dmInstances).map(([id]) => (\n <MenuItem\n key={id}\n value={id}\n >\n {id}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n ) : null}\n {this.props.selectedInstance ? (\n <Tooltip\n title={getTranslation('refreshTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={() => this.loadData()}\n disabled={!this.state.alive}\n size=\"small\"\n >\n <Refresh />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n {this.state.alive && this.state.instanceInfo?.actions?.length ? (\n <div style={{ marginLeft: 20 }}>\n {this.state.instanceInfo.actions.map(action => (\n <InstanceActionButton\n key={action.id}\n action={action}\n instanceHandler={this.instanceHandler}\n />\n ))}\n </div>\n ) : null}\n\n <div style={{ flexGrow: 1 }} />\n\n {this.renderGroups(deviceGroups)}\n {this.state.alive ? (\n <TextField\n variant=\"standard\"\n style={{ width: 200 }}\n size=\"small\"\n label={getTranslation('filterLabelText')}\n onChange={e => this.handleFilterChange(e.target.value)}\n value={this.state.filter}\n autoComplete=\"off\"\n slotProps={{\n input: {\n autoComplete: 'new-password',\n endAdornment: this.state.filter ? (\n <InputAdornment position=\"end\">\n <IconButton\n tabIndex={-1}\n onClick={() => this.handleFilterChange('')}\n edge=\"end\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n htmlInput: {\n autoComplete: 'off',\n },\n }}\n />\n ) : null}\n </Toolbar>\n <div\n style={{\n width: '100%',\n height: 'calc(100% - 56px)',\n marginTop: 8,\n overflow: 'auto',\n // justifyContent: 'center',\n // alignItems: 'stretch',\n // display: 'grid',\n // columnGap: 8,\n // rowGap: 8,\n ...this.props.style,\n }}\n >\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {list}\n </div>\n </div>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DeviceList.js","sourceRoot":"./src/","sources":["DeviceList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\nimport {\n IconButton,\n InputAdornment,\n TextField,\n Toolbar,\n Tooltip,\n LinearProgress,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n} from '@mui/material';\n\nimport { Clear, QuestionMark, Refresh, FilterAltOff } from '@mui/icons-material';\n\nimport { I18n, DeviceTypeIcon } from '@iobroker/adapter-react-v5';\nimport type { DeviceInfo, InstanceDetails } from '@iobroker/dm-utils';\n\nimport DeviceCard from './DeviceCard';\nimport { getTranslation } from './Utils';\nimport Communication, { type CommunicationProps, type CommunicationState } from './Communication';\nimport InstanceActionButton from './InstanceActionButton';\n\nimport de from './i18n/de.json';\nimport en from './i18n/en.json';\nimport ru from './i18n/ru.json';\nimport pt from './i18n/pt.json';\nimport nl from './i18n/nl.json';\nimport fr from './i18n/fr.json';\nimport it from './i18n/it.json';\nimport es from './i18n/es.json';\nimport pl from './i18n/pl.json';\nimport uk from './i18n/uk.json';\nimport zhCn from './i18n/zh-cn.json';\n\ninterface DeviceListProps extends CommunicationProps {\n /** Instance to upload images to, like `adapterName.X` */\n uploadImagesToInstance?: string;\n /** Filter devices with this string */\n filter?: string;\n /** If this component is used in GUI with own toolbar. `false` if this list is used with multiple instances and true if only with one (in this case, it will monitor alive itself */\n embedded?: boolean;\n /** If embedded, this text is shown in the toolbar */\n title?: string;\n /** Style of a component that displays all devices */\n style?: React.CSSProperties;\n /** Use small cards for devices */\n smallCards?: boolean;\n /** To trigger the reload of devices, just change this variable */\n triggerLoad?: number;\n}\n\ninterface DeviceListState extends CommunicationState {\n devices: DeviceInfo[];\n filteredDevices: DeviceInfo[];\n filter: string;\n instanceInfo: InstanceDetails;\n loading: boolean;\n alive: boolean | null;\n triggerLoad: number;\n groupKey: string;\n dmInstances: { [instanceName: string]: { title: string; instance: number } } | null;\n selectedInstance: string;\n apiVersionError: boolean;\n}\n\n/**\n * Device List Component\n */\nexport default class DeviceList extends Communication<DeviceListProps, DeviceListState> {\n static i18nInitialized = false;\n\n private lastPropsFilter: string | undefined;\n\n private lastInstance: string;\n\n private lastTriggerLoad = 0;\n\n private filterTimeout: ReturnType<typeof setTimeout> | null;\n\n private readonly language: ioBroker.Languages;\n\n constructor(props: DeviceListProps) {\n super(props);\n\n if (!DeviceList.i18nInitialized) {\n DeviceList.i18nInitialized = true;\n I18n.extendTranslations({\n en,\n de,\n ru,\n pt,\n nl,\n fr,\n it,\n es,\n pl,\n uk,\n 'zh-cn': zhCn,\n });\n }\n\n let selectedInstance: string;\n if (this.props.selectedInstance === undefined) {\n selectedInstance = window.localStorage.getItem('dmSelectedInstance') || '';\n } else {\n selectedInstance = this.props.selectedInstance;\n }\n\n Object.assign(this.state, {\n devices: [],\n filteredDevices: [],\n filter: '',\n instanceInfo: null,\n loading: null,\n alive: null,\n groupKey: '',\n dmInstances: null,\n selectedInstance,\n apiVersionError: false,\n });\n\n this.lastPropsFilter = this.props.filter;\n this.lastInstance = selectedInstance;\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n this.filterTimeout = null;\n this.language = I18n.getLanguage();\n }\n\n private async loadAdapters(): Promise<void> {\n await this.props.socket.waitForFirstConnection();\n\n console.log('Loading adapters...');\n const res = await this.props.socket.getObjectViewSystem('instance', 'system.adapter.', 'system.adapter.\\u9999');\n const dmInstances: { [instanceName: string]: { title: string; instance: number } } = {};\n for (const id in res) {\n if (!res[id]?.common?.messagebox) {\n continue;\n }\n if (!res[id].common.supportedMessages?.deviceManager) {\n continue;\n }\n\n const instanceName = id.substring('system.adapter.'.length);\n try {\n // Check if the instance is alive by getting the state alive\n const alive = await this.props.socket.getState(`system.adapter.${instanceName}.alive`);\n if (!alive?.val) {\n continue;\n }\n\n const instance = parseInt(instanceName.split('.').pop() || '0') || 0;\n dmInstances[instanceName] = {\n title: '',\n instance,\n };\n } catch (error) {\n console.error(error);\n }\n }\n\n this.setState({ dmInstances });\n }\n\n async componentDidMount(): Promise<void> {\n let alive = false;\n if (this.props.selectedInstance === undefined) {\n // show instance selector\n await this.loadAdapters();\n }\n\n if (this.state.alive === null) {\n try {\n // check if the instance is alive\n const stateAlive = await this.props.socket.getState(\n `system.adapter.${this.props.selectedInstance}.alive`,\n );\n if (stateAlive?.val) {\n alive = true;\n }\n } catch (error) {\n console.error(error);\n }\n this.setState({ alive }, () =>\n this.props.socket.subscribeState(\n `system.adapter.${this.props.selectedInstance}.alive`,\n this.aliveHandler,\n ),\n );\n if (!alive) {\n return;\n }\n } else {\n alive = this.state.alive;\n }\n\n if (!this.props.embedded && alive) {\n try {\n const instanceInfo = await this.loadInstanceInfos();\n this.setState({ instanceInfo, apiVersionError: instanceInfo.apiVersion !== 'v1' });\n } catch (error) {\n console.error(error);\n }\n }\n if (alive) {\n this.loadData();\n }\n }\n\n componentWillUnmount(): void {\n this.props.socket.unsubscribeState(`system.adapter.${this.props.selectedInstance}.alive`, this.aliveHandler);\n }\n\n aliveHandler: ioBroker.StateChangeHandler = (id: string, state: ioBroker.State | null | undefined): void => {\n if (id === `system.adapter.${this.props.selectedInstance}.alive`) {\n const alive = !!state?.val;\n if (alive !== this.state.alive) {\n this.setState({ alive }, () => {\n if (alive) {\n this.componentDidMount().catch(console.error);\n }\n });\n }\n }\n };\n\n /**\n * Load devices\n */\n override loadData(): void {\n this.setState({ loading: true }, async () => {\n console.log(`Loading devices for ${this.props.selectedInstance}...`);\n let devices: DeviceInfo[] = [];\n try {\n devices = await this.loadDevices();\n\n if (!devices || !Array.isArray(devices)) {\n console.error(\n `Message returned from sendTo() doesn't look like one from DeviceManagement, did you accidentally handle the message in your adapter? ${JSON.stringify(\n devices,\n )}`,\n );\n devices = [];\n }\n } catch (error) {\n console.error(error);\n devices = [];\n }\n\n this.setState({ devices, loading: false }, () => this.applyFilter());\n });\n }\n\n getText(text: ioBroker.StringOrTranslated): string {\n if (typeof text === 'object') {\n return text[this.language] || text.en;\n }\n\n return text;\n }\n\n applyFilter(): void {\n const filter = this.props.embedded ? this.props.filter : this.state.filter;\n\n // filter devices name\n if (filter) {\n const filteredDevices = this.state.devices.filter(device =>\n this.getText(device.name).toLowerCase().includes(filter.toLowerCase()),\n );\n this.setState({ filteredDevices });\n } else {\n this.setState({ filteredDevices: this.state.devices });\n }\n }\n\n handleFilterChange(filter: string): void {\n this.setState({ filter }, () => {\n if (this.filterTimeout) {\n clearTimeout(this.filterTimeout);\n }\n this.filterTimeout = setTimeout(() => {\n this.filterTimeout = null;\n this.applyFilter();\n }, 250);\n });\n }\n\n renderGroups(\n groups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] | undefined,\n ): React.JSX.Element | null {\n if (!groups?.length) {\n return null;\n }\n\n return (\n <Select\n style={{ minWidth: 120, marginRight: 8, marginTop: 12.5 }}\n variant=\"standard\"\n value={this.state.groupKey || '_'}\n renderValue={value => {\n if (value === '_') {\n value = '';\n }\n const g = groups.find(g => g.value === value);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {g?.icon || <div style={{ width: 24 }} />}\n {g?.name || value}\n </div>\n );\n }}\n onChange={e => this.setState({ groupKey: e.target.value === '_' ? '' : e.target.value })}\n >\n {groups.map(g => (\n <MenuItem\n value={g.value || '_'}\n key={g.value || '_'}\n style={{ display: 'flex', alignItems: 'center', gap: 8 }}\n >\n {g.icon || <div style={{ width: 24 }} />}\n {g.name}\n </MenuItem>\n ))}\n </Select>\n );\n }\n\n renderContent(): JSX.Element | JSX.Element[] | null {\n const emptyStyle: React.CSSProperties = {\n padding: 25,\n };\n\n if ((this.props.triggerLoad || 0) !== this.lastTriggerLoad) {\n this.lastTriggerLoad = this.props.triggerLoad || 0;\n setTimeout(() => this.loadData(), 50);\n }\n\n if (this.props.embedded && this.lastPropsFilter !== this.props.filter) {\n this.lastPropsFilter = this.props.filter;\n setTimeout(() => this.applyFilter(), 50);\n }\n // if instance changed\n if (this.props.embedded && this.lastInstance !== this.props.selectedInstance && this.props.selectedInstance) {\n this.lastInstance = this.props.selectedInstance;\n setTimeout(() => this.loadData(), 50);\n }\n const deviceGroups: { name: string; value: string; count: number; icon?: React.JSX.Element | string | null }[] =\n [];\n let list: React.JSX.Element[] | undefined;\n if (!this.props.embedded && !this.state.alive) {\n list = [\n <div\n style={emptyStyle}\n key=\"notAlive\"\n >\n <span>{getTranslation('instanceNotAlive')}</span>\n </div>,\n ];\n } else if (!this.state.devices.length && this.props.selectedInstance) {\n list = [\n <div\n style={emptyStyle}\n key=\"notFound\"\n >\n <span>{getTranslation('noDevicesFoundText')}</span>\n </div>,\n ];\n } else if (this.state.devices.length && !this.state.filteredDevices.length) {\n list = [\n <div\n style={emptyStyle}\n key=\"filtered\"\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </div>,\n ];\n } else {\n // build a device types list\n let filteredDevices = this.state.filteredDevices;\n if (!this.props.embedded && filteredDevices.find(device => device.group)) {\n deviceGroups.push({\n name: I18n.t('All'),\n value: '',\n count: filteredDevices.length,\n icon: <FilterAltOff />,\n });\n filteredDevices.forEach(device => {\n if (device.group) {\n const type = deviceGroups.find(t => t.value === device.group?.key);\n if (type) {\n type.count++;\n } else {\n const icon = device.group.icon ? <DeviceTypeIcon src={device.group.icon} /> : null;\n\n deviceGroups.push({\n name: this.getText(device.group.name || device.group.key),\n value: device.group.key,\n count: 1,\n icon,\n });\n }\n }\n });\n const unknown = filteredDevices.filter(device => !device.group);\n if (unknown.length) {\n deviceGroups.push({\n name: I18n.t('Unknown'),\n value: '?',\n count: unknown.length,\n icon: <QuestionMark />,\n });\n }\n\n if (this.state.groupKey) {\n // filter out all devices belonging to this group\n if (this.state.groupKey === '?') {\n filteredDevices = filteredDevices.filter(device => !device.group?.key);\n } else {\n filteredDevices = filteredDevices.filter(device => device.group?.key === this.state.groupKey);\n }\n if (!filteredDevices.length) {\n list = [\n <div\n style={emptyStyle}\n key=\"filtered\"\n >\n <span>{getTranslation('allDevicesFilteredOut')}</span>\n </div>,\n ];\n }\n }\n }\n\n if (filteredDevices.length && this.props.selectedInstance) {\n list = filteredDevices.map(device => (\n <DeviceCard\n alive={!!this.state.alive}\n key={device.id}\n id={device.id}\n title={this.getText(device.name)}\n device={device}\n instanceId={this.props.selectedInstance!}\n uploadImagesToInstance={this.props.uploadImagesToInstance}\n deviceHandler={this.deviceHandler}\n controlHandler={this.controlHandler}\n controlStateHandler={this.controlStateHandler}\n socket={this.props.socket}\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 ));\n }\n }\n\n if (this.props.embedded) {\n return (\n <>\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {list}\n </>\n );\n }\n\n return (\n <div style={{ width: '100%', height: '100%', overflow: 'hidden' }}>\n <Toolbar\n variant=\"dense\"\n style={{ backgroundColor: '#777', display: 'flex' }}\n >\n {this.props.title}\n {this.props.selectedInstance === null && this.state.dmInstances ? (\n <FormControl>\n <InputLabel id=\"instance-select-label\">{getTranslation('instanceLabelText')}</InputLabel>\n <Select\n labelId=\"instance-select-label\"\n id=\"instance-select\"\n value={this.state.selectedInstance}\n onChange={event => {\n window.localStorage.setItem('dmSelectedInstance', event.target.value);\n this.setState({ selectedInstance: event.target.value });\n }}\n displayEmpty\n variant=\"standard\"\n sx={{ minWidth: 120 }}\n >\n {Object.keys(this.state.dmInstances).map(([id]) => (\n <MenuItem\n key={id}\n value={id}\n >\n {id}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n ) : null}\n {this.props.selectedInstance ? (\n <Tooltip\n title={getTranslation('refreshTooltip')}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n onClick={() => this.loadData()}\n disabled={!this.state.alive || this.state.apiVersionError}\n size=\"small\"\n >\n <Refresh />\n </IconButton>\n </span>\n </Tooltip>\n ) : null}\n {!this.state.apiVersionError && this.state.alive && this.state.instanceInfo?.actions?.length ? (\n <div style={{ marginLeft: 20 }}>\n {this.state.instanceInfo.actions.map(action => (\n <InstanceActionButton\n key={action.id}\n action={action}\n instanceHandler={this.instanceHandler}\n />\n ))}\n </div>\n ) : null}\n\n <div style={{ flexGrow: 1 }} />\n\n {!this.state.apiVersionError && this.renderGroups(deviceGroups)}\n {!this.state.apiVersionError && this.state.alive ? (\n <TextField\n variant=\"standard\"\n style={{ width: 200 }}\n size=\"small\"\n label={getTranslation('filterLabelText')}\n onChange={e => this.handleFilterChange(e.target.value)}\n value={this.state.filter}\n autoComplete=\"off\"\n slotProps={{\n input: {\n autoComplete: 'new-password',\n endAdornment: this.state.filter ? (\n <InputAdornment position=\"end\">\n <IconButton\n tabIndex={-1}\n onClick={() => this.handleFilterChange('')}\n edge=\"end\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n htmlInput: {\n autoComplete: 'off',\n },\n }}\n />\n ) : null}\n </Toolbar>\n <div\n style={{\n width: '100%',\n height: 'calc(100% - 56px)',\n marginTop: 8,\n overflow: 'auto',\n // justifyContent: 'center',\n // alignItems: 'stretch',\n // display: 'grid',\n // columnGap: 8,\n // rowGap: 8,\n ...this.props.style,\n }}\n >\n {this.state.loading ? <LinearProgress style={{ width: '100%' }} /> : null}\n {this.state.apiVersionError ? <div>{I18n.t('apiVersionError')}</div> : list}\n </div>\n </div>\n );\n }\n}\n"]}
|
package/build/i18n/de.json
CHANGED
package/build/i18n/en.json
CHANGED
package/build/i18n/es.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"allDevicesFilteredOut": "Todos los dispositivos filtrados",
|
|
3
|
+
"apiVersionError": "El backend es más reciente que la interfaz gráfica de usuario. Por favor, actualice el administrador.",
|
|
3
4
|
"batteryTooltip": "Batería",
|
|
4
5
|
"cancelButtonText": "Cancelar",
|
|
5
6
|
"closeButtonText": "Cerca",
|
package/build/i18n/fr.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"allDevicesFilteredOut": "Tous les appareils filtrés",
|
|
3
|
+
"apiVersionError": "L'interface d'administration est plus récente que l'interface graphique. Veuillez mettre à jour l'interface d'administration.",
|
|
3
4
|
"batteryTooltip": "Batterie",
|
|
4
5
|
"cancelButtonText": "Annuler",
|
|
5
6
|
"closeButtonText": "Fermer",
|
package/build/i18n/it.json
CHANGED
package/build/i18n/nl.json
CHANGED
package/build/i18n/pl.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"allDevicesFilteredOut": "Wszystkie urządzenia zostały odfiltrowane",
|
|
3
|
+
"apiVersionError": "Zaplecze jest nowsze i ma interfejs graficzny. Proszę zaktualizować administratora.",
|
|
3
4
|
"batteryTooltip": "Bateria",
|
|
4
5
|
"cancelButtonText": "Anulować",
|
|
5
6
|
"closeButtonText": "Zamknąć",
|
package/build/i18n/pt.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"allDevicesFilteredOut": "Todos os dispositivos foram filtrados",
|
|
3
|
+
"apiVersionError": "O backend é mais recente que a GUI. Por favor, atualize o painel de administração.",
|
|
3
4
|
"batteryTooltip": "Bateria",
|
|
4
5
|
"cancelButtonText": "Cancelar",
|
|
5
6
|
"closeButtonText": "Fechar",
|
package/build/i18n/ru.json
CHANGED
package/build/i18n/uk.json
CHANGED
package/build/i18n/zh-cn.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iobroker/dm-gui-components",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.9",
|
|
4
4
|
"description": "ReactJS components to develop admin interface for ioBroker device manager.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jey Cee",
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
"scripts": {
|
|
19
19
|
"prepublishOnly": "npm run build",
|
|
20
20
|
"clean": "rimraf build",
|
|
21
|
-
"test:package": "node -e \"process.exit(0)\"",
|
|
22
21
|
"build": "tsc && tsc-alias",
|
|
23
22
|
"check-ts": "tsc --noEmit --checkJS false",
|
|
24
23
|
"lint": "eslint -c eslint.config.mjs src",
|