@iobroker/json-config 8.1.1 → 8.1.2
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 +21 -6
- package/build/JsonConfigComponent/ConfigIFrame.js +2 -1
- package/build/JsonConfigComponent/ConfigIFrame.js.map +1 -1
- package/build/JsonConfigComponent/ConfigIFrameSendTo.js +2 -1
- package/build/JsonConfigComponent/ConfigIFrameSendTo.js.map +1 -1
- package/build/JsonConfigComponent/ConfigPanel.js +2 -0
- package/build/JsonConfigComponent/ConfigPanel.js.map +1 -1
- package/build/JsonConfigComponent/ConfigYamlEditor.d.ts +17 -0
- package/build/JsonConfigComponent/ConfigYamlEditor.js +81 -0
- package/build/JsonConfigComponent/ConfigYamlEditor.js.map +1 -0
- package/build/JsonConfigComponent/wrapper/Components/Editor.d.ts +2 -1
- package/build/JsonConfigComponent/wrapper/Components/Editor.js +1 -0
- package/build/JsonConfigComponent/wrapper/Components/Editor.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.js.map +1 -1
- package/build/types.d.ts +15 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -160,6 +160,7 @@ You can install it via GitHub icon in admin by entering `iobroker.jsonconfig-dem
|
|
|
160
160
|
- [**`interface`:**](#interface) Selects the interface from of the host, where the instance runs
|
|
161
161
|
- [**`ip`:**](#ip) Input field for IP addresses with advanced options
|
|
162
162
|
- [**`jsonEditor`:**](#jsoneditor) JSON editor for complex configuration data
|
|
163
|
+
- [**`yamlEditor`:**](#yamleditor) YAML editor for complex configuration data
|
|
163
164
|
- [**`language`:**](#language) Selects the user interface language
|
|
164
165
|
- [**`license`:**](#license) shows the license information if not already accepted.
|
|
165
166
|
- [**`number`:**](#number) Numeric input field with min/max values and step size
|
|
@@ -755,12 +756,23 @@ accordion with items that could be deleted, added, moved up, moved down (Admin 6
|
|
|
755
756
|
|
|
756
757
|
Button to open a JSON(5) editor. JSON5 is supported from admin version 5.7.3
|
|
757
758
|
|
|
758
|
-
| Property | Description
|
|
759
|
-
|
|
760
|
-
| `validateJson` | if false, the text will be not validated as JSON
|
|
761
|
-
| `allowEmpty` | if true, the JSON will be validated only if the value is not empty
|
|
762
|
-
| `json5` | if JSON5 format allowed (From 7.5.3)
|
|
763
|
-
| `doNotApplyWithError` | Do not allow to save the value if error in JSON or JSON5 (From 7.5.3)
|
|
759
|
+
| Property | Description |
|
|
760
|
+
|------------------------|-----------------------------------------------------------------------------------------|
|
|
761
|
+
| `validateJson` | if false, the text will be not validated as JSON |
|
|
762
|
+
| `allowEmpty` | if true, the JSON will be validated only if the value is not empty |
|
|
763
|
+
| `json5` | if JSON5 format allowed (From 7.5.3) |
|
|
764
|
+
| `doNotApplyWithError` | Do not allow to save the value if error in JSON or JSON5 (From 7.5.3) |
|
|
765
|
+
| `readOnly` | Open the editor in read-only mode - editor can be opened but content cannot be modified |
|
|
766
|
+
|
|
767
|
+
### `yamlEditor`
|
|
768
|
+
|
|
769
|
+
Button to open a YAML editor with syntax validation. (From admin version 7.7.30)
|
|
770
|
+
|
|
771
|
+
| Property | Description |
|
|
772
|
+
|------------------------|-----------------------------------------------------------------------------------------|
|
|
773
|
+
| `validateYaml` | if false, the text will be not validated as YAML |
|
|
774
|
+
| `allowEmpty` | if true, the YAML will be validated only if the value is not empty |
|
|
775
|
+
| `doNotApplyWithError` | Do not allow to save the value if error in YAML |
|
|
764
776
|
| `readOnly` | Open the editor in read-only mode - editor can be opened but content cannot be modified |
|
|
765
777
|
|
|
766
778
|
### `language`
|
|
@@ -1663,6 +1675,9 @@ The schema is used here: https://github.com/SchemaStore/schemastore/blob/6da29cd
|
|
|
1663
1675
|
### **WORK IN PROGRESS**
|
|
1664
1676
|
-->
|
|
1665
1677
|
## Changelog
|
|
1678
|
+
### 8.1.2 (2026-02-08)
|
|
1679
|
+
- (@GermanBluefox) Added component `yamlEditor` for editing yaml files in admin
|
|
1680
|
+
|
|
1666
1681
|
### 8.1.1 (2026-02-06)
|
|
1667
1682
|
- (@GermanBluefox) Added `iframe` and `iframeSendTo` components
|
|
1668
1683
|
|
|
@@ -7,7 +7,7 @@ export default class ConfigIFrame extends ConfigGeneric {
|
|
|
7
7
|
super.componentDidMount();
|
|
8
8
|
if (this.props.schema.reloadOnShow) {
|
|
9
9
|
this.observer = new IntersectionObserver(([entry]) => {
|
|
10
|
-
if (entry.isIntersecting && this.state.isVisible && this.iframeRef.current) {
|
|
10
|
+
if (entry.isIntersecting && this.state.isVisible === false && this.iframeRef.current) {
|
|
11
11
|
const currentSrc = this.iframeRef.current.src;
|
|
12
12
|
this.iframeRef.current.src = '';
|
|
13
13
|
setTimeout(() => {
|
|
@@ -33,6 +33,7 @@ export default class ConfigIFrame extends ConfigGeneric {
|
|
|
33
33
|
React.createElement("iframe", { style: {
|
|
34
34
|
width: '100%',
|
|
35
35
|
height: '100%',
|
|
36
|
+
borderWidth: this.props.schema.frameBorder ?? 0,
|
|
36
37
|
...this.props.schema.innerStyle,
|
|
37
38
|
border: error ? '1px solid red' : undefined,
|
|
38
39
|
}, ref: this.iframeRef, src: url, allowFullScreen: this.props.schema.allowFullscreen ?? false, sandbox: this.props.schema.sandbox, loading: this.props.schema.lazyLoad ?? 'lazy' }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigIFrame.js","sourceRoot":"./src/","sources":["JsonConfigComponent/ConfigIFrame.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,aAAmE,MAAM,iBAAiB,CAAC;AAUlG,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,aAAmD;IACjF,SAAS,GAAG,KAAK,CAAC,SAAS,EAAqB,CAAC;IACjD,QAAQ,GAAgC,IAAI,CAAC;IAErD,iBAAiB;QACb,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;gBACjD,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigIFrame.js","sourceRoot":"./src/","sources":["JsonConfigComponent/ConfigIFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\n\nimport type { ConfigItemIFrame } from '../types';\nimport ConfigGeneric, { type ConfigGenericProps, type ConfigGenericState } from './ConfigGeneric';\n\ninterface ConfigIFrameProps extends ConfigGenericProps {\n schema: ConfigItemIFrame;\n}\n\ninterface ConfigIFrameState extends ConfigGenericState {\n isVisible?: boolean;\n}\n\nexport default class ConfigIFrame extends ConfigGeneric<ConfigIFrameProps, ConfigIFrameState> {\n private iframeRef = React.createRef<HTMLIFrameElement>();\n private observer: IntersectionObserver | null = null;\n\n componentDidMount(): void {\n super.componentDidMount();\n\n if (this.props.schema.reloadOnShow) {\n this.observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && this.state.isVisible === false && this.iframeRef.current) {\n const currentSrc = this.iframeRef.current.src;\n this.iframeRef.current.src = '';\n setTimeout(() => {\n if (this.iframeRef.current) {\n this.iframeRef.current.src = currentSrc;\n }\n }, 0);\n }\n this.setState({ isVisible: entry.isIntersecting });\n });\n if (this.iframeRef.current) {\n this.observer.observe(this.iframeRef.current);\n }\n }\n }\n\n componentWillUnmount(): void {\n super.componentWillUnmount?.();\n this.observer?.disconnect();\n }\n\n renderItem(error: boolean, disabled: boolean /* , defaultValue */): JSX.Element {\n const url = this.props.schema.url || ConfigGeneric.getValue(this.props.data, this.props.attr);\n\n return (\n <div style={{ position: 'relative', width: '100%', height: '100%' }}>\n <iframe\n style={{\n width: '100%',\n height: '100%',\n borderWidth: this.props.schema.frameBorder ?? 0,\n ...this.props.schema.innerStyle,\n border: error ? '1px solid red' : undefined,\n }}\n ref={this.iframeRef}\n src={url}\n allowFullScreen={this.props.schema.allowFullscreen ?? false}\n sandbox={this.props.schema.sandbox}\n loading={this.props.schema.lazyLoad ?? 'lazy'}\n />\n {disabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n backgroundColor: 'rgba(255, 255, 255, 0.3)',\n cursor: 'not-allowed',\n zIndex: 1,\n }}\n />\n )}\n </div>\n );\n }\n}\n"]}
|
|
@@ -10,7 +10,7 @@ export default class ConfigIFrameSendTo extends ConfigGeneric {
|
|
|
10
10
|
this.askInstance();
|
|
11
11
|
if (this.props.schema.reloadOnShow) {
|
|
12
12
|
this.observer = new IntersectionObserver(([entry]) => {
|
|
13
|
-
if (entry.isIntersecting && this.state.isVisible && this.iframeRef.current) {
|
|
13
|
+
if (entry.isIntersecting && this.state.isVisible === false && this.iframeRef.current) {
|
|
14
14
|
const currentSrc = this.iframeRef.current.src;
|
|
15
15
|
this.iframeRef.current.src = '';
|
|
16
16
|
setTimeout(() => {
|
|
@@ -71,6 +71,7 @@ export default class ConfigIFrameSendTo extends ConfigGeneric {
|
|
|
71
71
|
React.createElement("iframe", { style: {
|
|
72
72
|
width: '100%',
|
|
73
73
|
height: '100%',
|
|
74
|
+
borderWidth: this.props.schema.frameBorder ?? 0,
|
|
74
75
|
...this.props.schema.innerStyle,
|
|
75
76
|
border: error ? '1px solid red' : undefined,
|
|
76
77
|
}, ref: this.iframeRef, src: this.state.url, allowFullScreen: this.props.schema.allowFullscreen ?? false, sandbox: this.props.schema.sandbox, loading: this.props.schema.lazyLoad ?? 'lazy' }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigIFrameSendTo.js","sourceRoot":"./src/","sources":["JsonConfigComponent/ConfigIFrameSendTo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,aAAmE,MAAM,iBAAiB,CAAC;AAWlG,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,aAA+D;IACnG,WAAW,GAAG,KAAK,CAAC;IAEpB,YAAY,CAAqB;IAEjC,SAAS,GAAG,KAAK,CAAC,SAAS,EAAqB,CAAC;IACjD,QAAQ,GAAgC,IAAI,CAAC;IAErD,iBAAiB;QACb,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;gBACjD,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigIFrameSendTo.js","sourceRoot":"./src/","sources":["JsonConfigComponent/ConfigIFrameSendTo.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\n\nimport type { ConfigItemIFrameSendTo } from '../types';\nimport ConfigGeneric, { type ConfigGenericProps, type ConfigGenericState } from './ConfigGeneric';\n\ninterface ConfigIFrameSendToProps extends ConfigGenericProps {\n schema: ConfigItemIFrameSendTo;\n}\n\ninterface ConfigIFrameSendToState extends ConfigGenericState {\n url?: string;\n isVisible?: boolean;\n}\n\nexport default class ConfigIFrameSendTo extends ConfigGeneric<ConfigIFrameSendToProps, ConfigIFrameSendToState> {\n private initialized = false;\n\n private localContext: string | undefined;\n\n private iframeRef = React.createRef<HTMLIFrameElement>();\n private observer: IntersectionObserver | null = null;\n\n componentDidMount(): void {\n super.componentDidMount();\n\n this.askInstance();\n\n if (this.props.schema.reloadOnShow) {\n this.observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && this.state.isVisible === false && this.iframeRef.current) {\n const currentSrc = this.iframeRef.current.src;\n this.iframeRef.current.src = '';\n setTimeout(() => {\n if (this.iframeRef.current) {\n this.iframeRef.current.src = currentSrc;\n }\n }, 0);\n }\n this.setState({ isVisible: entry.isIntersecting });\n });\n if (this.iframeRef.current) {\n this.observer.observe(this.iframeRef.current);\n }\n }\n }\n\n askInstance(): void {\n if (this.props.alive) {\n let data = this.props.schema.data;\n if (data === undefined && this.props.schema.jsonData) {\n const dataStr: string = this.getPattern(this.props.schema.jsonData, null, true);\n if (dataStr) {\n try {\n data = JSON.parse(dataStr);\n } catch {\n console.error(`Cannot parse json data: ${JSON.stringify(data)}`);\n }\n }\n }\n\n if (data === undefined) {\n data = null;\n }\n\n void this.props.oContext.socket\n .sendTo(\n `${this.props.oContext.adapterName}.${this.props.oContext.instance}`,\n this.props.schema.command || 'send',\n data,\n )\n .then(url => this.setState({ url: url || '' }));\n }\n }\n\n getContext(): string {\n const localContext: Record<string, any> = {};\n\n if (Array.isArray(this.props.schema.alsoDependsOn)) {\n this.props.schema.alsoDependsOn.forEach(\n attr => (localContext[attr] = ConfigGeneric.getValue(this.props.data, attr)),\n );\n }\n\n return JSON.stringify(localContext);\n }\n\n renderItem(error: boolean, disabled: boolean /*, defaultValue */): JSX.Element {\n if (this.props.alive) {\n const localContext = this.getContext();\n if (localContext !== this.localContext || !this.initialized) {\n this.localContext = localContext;\n setTimeout(() => this.askInstance(), this.initialized ? 300 : 50);\n this.initialized = true;\n }\n }\n\n if (this.state.url === undefined) {\n return null;\n }\n\n return (\n <div style={{ position: 'relative', width: '100%', height: '100%' }}>\n <iframe\n style={{\n width: '100%',\n height: '100%',\n borderWidth: this.props.schema.frameBorder ?? 0,\n ...this.props.schema.innerStyle,\n border: error ? '1px solid red' : undefined,\n }}\n ref={this.iframeRef}\n src={this.state.url}\n allowFullScreen={this.props.schema.allowFullscreen ?? false}\n sandbox={this.props.schema.sandbox}\n loading={this.props.schema.lazyLoad ?? 'lazy'}\n />\n {disabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n backgroundColor: 'rgba(255, 255, 255, 0.3)',\n cursor: 'not-allowed',\n zIndex: 1,\n }}\n />\n )}\n </div>\n );\n }\n}\n"]}
|
|
@@ -59,6 +59,7 @@ import ConfigTimePicker from './ConfigTimePicker';
|
|
|
59
59
|
import ConfigTopic from './ConfigTopic';
|
|
60
60
|
import ConfigUUID from './ConfigUUID';
|
|
61
61
|
import ConfigUser from './ConfigUser';
|
|
62
|
+
import ConfigYamlEditor from './ConfigYamlEditor';
|
|
62
63
|
import ConfigQrCode from './ConfigQrCode';
|
|
63
64
|
const components = {
|
|
64
65
|
accordion: ConfigAccordion,
|
|
@@ -122,6 +123,7 @@ const components = {
|
|
|
122
123
|
topic: ConfigTopic,
|
|
123
124
|
uuid: ConfigUUID,
|
|
124
125
|
user: ConfigUser,
|
|
126
|
+
yamlEditor: ConfigYamlEditor,
|
|
125
127
|
};
|
|
126
128
|
const styles = {
|
|
127
129
|
fullWidth: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigPanel.js","sourceRoot":"./src/","sources":["JsonConfigComponent/ConfigPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\n\nimport { Grid2, Accordion, AccordionSummary, AccordionDetails, Typography, Box } from '@mui/material';\n\nimport { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';\n\nimport { type AdminConnection, type IobTheme, Utils } from '@iobroker/adapter-react-v5';\nimport type { ConfigItemPanel } from '../types';\n\nimport ConfigGeneric, { type ConfigGenericState, type ConfigGenericProps } from './ConfigGeneric';\nimport ConfigAccordion from './ConfigAccordion';\nimport ConfigAlive from './ConfigAlive';\nimport ConfigAutocomplete from './ConfigAutocomplete';\nimport ConfigAutocompleteSendTo from './ConfigAutocompleteSendTo';\nimport ConfigCRON from './ConfigCRON';\nimport ConfigCertificateSelect from './ConfigCertificateSelect';\nimport ConfigCertificates from './ConfigCertificates';\nimport ConfigCertCollection from './ConfigCertCollection';\nimport ConfigCheckDocker from './ConfigCheckDocker';\nimport ConfigCheckLicense from './ConfigCheckLicense';\nimport ConfigCheckbox from './ConfigCheckbox';\nimport ConfigChip from './ConfigChip';\nimport ConfigColor from './ConfigColor';\nimport ConfigCoordinates from './ConfigCoordinates';\nimport ConfigCustom from './ConfigCustom';\nimport ConfigDatePicker from './ConfigDatePicker';\nimport ConfigDeviceManager from './ConfigDeviceManager';\nimport ConfigFile from './ConfigFile';\nimport ConfigFileSelector from './ConfigFileSelector';\nimport ConfigFunc from './ConfigFunc';\nimport ConfigIFrame from './ConfigIFrame';\nimport ConfigIFrameSendTo from './ConfigIFrameSendTo';\nimport ConfigIP from './ConfigIP';\nimport ConfigImageSendTo from './ConfigImageSendTo';\nimport ConfigImageUpload from './ConfigImageUpload';\nimport ConfigInfoBox from './ConfigInfoBox';\nimport ConfigInstanceSelect from './ConfigInstanceSelect';\nimport ConfigInterface from './ConfigInterface';\nimport ConfigJsonEditor from './ConfigJsonEditor';\nimport ConfigLanguage from './ConfigLanguage';\nimport ConfigLicense from './ConfigLicense';\nimport ConfigNumber from './ConfigNumber';\nimport ConfigOauth2 from './ConfigOAuth2';\nimport ConfigObjectId from './ConfigObjectId';\nimport ConfigPassword from './ConfigPassword';\nimport ConfigPattern from './ConfigPattern';\nimport ConfigPort from './ConfigPort';\nimport ConfigRoom from './ConfigRoom';\nimport ConfigSelect from './ConfigSelect';\nimport ConfigSelectSendTo from './ConfigSelectSendTo';\nimport ConfigSendTo from './ConfigSendto';\nimport ConfigSetState from './ConfigSetState';\nimport ConfigSlider from './ConfigSlider';\nimport ConfigState from './ConfigState';\nimport ConfigStaticDivider from './ConfigStaticDivider';\nimport ConfigStaticHeader from './ConfigStaticHeader';\nimport ConfigStaticImage from './ConfigStaticImage';\nimport ConfigStaticInfo from './ConfigStaticInfo';\nimport ConfigStaticText from './ConfigStaticText';\nimport ConfigTable from './ConfigTable';\nimport ConfigText from './ConfigText';\nimport ConfigTextSendTo from './ConfigTextSendTo';\nimport ConfigTimePicker from './ConfigTimePicker';\nimport ConfigTopic from './ConfigTopic';\nimport ConfigUUID from './ConfigUUID';\nimport ConfigUser from './ConfigUser';\nimport ConfigQrCode from './ConfigQrCode';\n\nconst components: Record<string, typeof ConfigGeneric<any, any>> = {\n accordion: ConfigAccordion,\n alive: ConfigAlive,\n autocomplete: ConfigAutocomplete,\n autocompleteSendTo: ConfigAutocompleteSendTo,\n certCollection: ConfigCertCollection,\n certificate: ConfigCertificateSelect,\n certificates: ConfigCertificates,\n checkbox: ConfigCheckbox,\n checkDocker: ConfigCheckDocker,\n checkLicense: ConfigCheckLicense,\n chip: ConfigChip, // deprecated. Use \"chips\"\n chips: ConfigChip,\n color: ConfigColor,\n coordinates: ConfigCoordinates,\n cron: ConfigCRON,\n custom: ConfigCustom,\n datePicker: ConfigDatePicker,\n deviceManager: ConfigDeviceManager,\n divider: ConfigStaticDivider,\n file: ConfigFile,\n fileSelector: ConfigFileSelector,\n func: ConfigFunc,\n header: ConfigStaticHeader,\n iframe: ConfigIFrame,\n iframeSendTo: ConfigIFrameSendTo,\n image: ConfigImageUpload,\n imageSendTo: ConfigImageSendTo,\n infoBox: ConfigInfoBox,\n instance: ConfigInstanceSelect,\n interface: ConfigInterface,\n ip: ConfigIP,\n jsonEditor: ConfigJsonEditor,\n language: ConfigLanguage,\n license: ConfigLicense,\n number: ConfigNumber,\n oauth2: ConfigOauth2,\n objectId: ConfigObjectId,\n password: ConfigPassword,\n pattern: ConfigPattern,\n port: ConfigPort,\n qrCode: ConfigQrCode,\n room: ConfigRoom,\n select: ConfigSelect,\n selectSendTo: ConfigSelectSendTo,\n // @deprecated Use \"sendTo\"\n sendto: ConfigSendTo,\n sendTo: ConfigSendTo,\n setState: ConfigSetState,\n slider: ConfigSlider,\n state: ConfigState,\n staticImage: ConfigStaticImage,\n staticInfo: ConfigStaticInfo,\n staticLink: ConfigStaticText,\n staticText: ConfigStaticText,\n table: ConfigTable,\n text: ConfigText,\n textSendTo: ConfigTextSendTo,\n timePicker: ConfigTimePicker,\n topic: ConfigTopic,\n uuid: ConfigUUID,\n user: ConfigUser,\n};\n\nconst styles: Record<string, any> = {\n fullWidth: {\n width: '100%',\n // height: '100%',\n },\n paper: {\n margin: 1,\n width: 'auto !important',\n overflowY: 'auto',\n paddingBottom: 1,\n },\n paperWithIcons: {\n height: 'calc(100vh - 259px) !important',\n },\n paperWithoutIcons: {\n height: 'calc(100vh - 235px) !important',\n },\n padding: {\n padding: '10px',\n },\n heading: {},\n primary: (theme: IobTheme): React.CSSProperties => ({\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.mode === 'dark' ? 'inherit' : '#FFF',\n }),\n secondary: (theme: IobTheme): React.CSSProperties => ({\n backgroundColor: theme.palette.secondary.main,\n }),\n};\n\ninterface ConfigPanelProps extends ConfigGenericProps {\n schema: ConfigItemPanel;\n withIcons?: boolean;\n withoutSaveButtons?: boolean;\n}\ninterface ConfigPanelState extends ConfigGenericState {\n expanded?: boolean;\n}\n\nexport default class ConfigPanel extends ConfigGeneric<ConfigPanelProps, ConfigPanelState> {\n componentDidMount(): void {\n super.componentDidMount();\n if (this.props.schema?.collapsable) {\n this.setState({\n expanded:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem(\n `${this.props.oContext.adapterName}.${this.props.attr}`,\n ) === 'true',\n });\n }\n }\n\n renderItems(items: Record<string, any>, disabled: boolean): JSX.Element[] | null {\n return items\n ? Object.keys(items).map(attr => {\n if (this.props.oContext.multiEdit && items[attr].noMultiEdit) {\n return null;\n }\n\n const type = items[attr].type || 'panel';\n let ItemComponent: typeof ConfigGeneric<ConfigGenericProps, any>;\n let socket: string | AdminConnection = 'Use this.props.oContext.socket!';\n if (type === 'custom') {\n // name\n // url\n if (items[attr].url) {\n ItemComponent = ConfigCustom;\n } else if (this.props.oContext.customs && this.props.oContext.customs[items[attr].component]) {\n ItemComponent = this.props.oContext.customs[items[attr].component];\n } else {\n console.error(`Cannot find custom component: ${items[attr].component}`);\n ItemComponent = ConfigGeneric;\n }\n socket = this.props.oContext.socket;\n } else if (type === 'panel') {\n ItemComponent = ConfigPanel;\n } else {\n ItemComponent = components[type] || ConfigGeneric;\n }\n\n return (\n <ItemComponent\n // @ts-expect-error Temporary work-around, till all custom components will not migrate to oContext\n socket={socket}\n globalData={this.props.globalData}\n oContext={this.props.oContext}\n key={`${attr}_${this.props.index === undefined ? '' : this.props.index}`}\n index={this.props.index}\n changed={this.props.changed}\n arrayIndex={this.props.arrayIndex}\n expertMode={this.props.expertMode}\n commandRunning={this.props.commandRunning}\n style={styles.panel}\n common={this.props.common}\n alive={this.props.alive}\n themeName={this.props.themeName}\n data={this.props.data}\n originalData={this.props.originalData}\n onError={this.props.onError}\n onChange={this.props.onChange}\n disabled={disabled}\n customObj={this.props.customObj}\n custom={this.props.custom}\n schema={items[attr]}\n attr={attr}\n table={this.props.table}\n />\n );\n })\n : null;\n }\n\n render(): JSX.Element | null {\n const schema = this.props.schema;\n\n if (!schema) {\n return null;\n }\n\n const { disabled, hidden } = this.calculate(schema);\n\n const items = this.props.schema.items;\n const schemaStyle = this.props.schema.style || {};\n\n if (hidden) {\n if (schema.hideOnlyControl) {\n const item = (\n <Grid2\n size={{\n xs: schema.xs || undefined,\n sm: schema.sm || undefined,\n md: schema.md || undefined,\n lg: schema.lg || undefined,\n xl: schema.xl || undefined,\n }}\n sx={Utils.getStyle(\n this.props.oContext.theme,\n { marginBottom: 0, textAlign: 'left' /* marginRight: 8, */ },\n schemaStyle,\n this.props.oContext.themeType === 'dark' && schema.darkStyle,\n )}\n />\n );\n\n if (schema.newLine) {\n return (\n <>\n <div style={{ flexBasis: '100%', height: 0 }} />\n {item}\n </>\n );\n }\n return item;\n }\n return null;\n }\n\n if (this.props.table) {\n return this.renderItems(items, disabled) as any as JSX.Element;\n }\n\n if (this.props.custom) {\n return (\n <Grid2\n key={`${this.props.attr}_${this.props.index}`}\n container\n style={styles.fullWidth}\n columnSpacing={2}\n rowSpacing={1}\n sx={schemaStyle}\n >\n {this.renderItems(items, disabled)}\n </Grid2>\n );\n }\n\n let content;\n if (schema.collapsable) {\n content = (\n <Accordion\n key={`${this.props.attr}_${this.props.index}`}\n style={styles.fullWidth}\n expanded={!!this.state.expanded}\n onChange={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n `${this.props.oContext.adapterName}.${this.props.attr}`,\n this.state.expanded ? 'false' : 'true',\n );\n this.setState({ expanded: !this.state.expanded });\n }}\n >\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n sx={Utils.getStyle(\n this.props.oContext.theme,\n schemaStyle,\n this.props.oContext.themeType && schema.darkStyle,\n schema.color === 'primary'\n ? styles.primary\n : schema.color === 'secondary' && styles.secondary,\n { width: '100%' },\n )}\n >\n <Typography style={styles.heading}>{this.getText(schema.label)}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Grid2\n container\n columnSpacing={2}\n rowSpacing={1}\n sx={{ ...schemaStyle, width: '100%', padding: '10px' }}\n >\n {this.renderItems(items, disabled)}\n </Grid2>\n </AccordionDetails>\n </Accordion>\n );\n } else {\n const sx = Utils.getStyle(\n this.props.oContext.theme,\n this.props.style,\n schemaStyle,\n { width: '100%' },\n this.props.isParentTab && styles.paper,\n this.props.isParentTab &&\n (this.props.withoutSaveButtons\n ? this.props.withIcons\n ? { height: 'calc(100% - 88px) !important' }\n : { height: 'calc(100% - 64px) !important' }\n : this.props.withIcons\n ? styles.paperWithIcons\n : styles.paperWithoutIcons),\n );\n\n content = (\n <Box\n component=\"div\"\n key={`${this.props.attr}_${this.props.index}`}\n className={this.props.className}\n sx={sx}\n >\n <Grid2\n container\n columnSpacing={2}\n rowSpacing={1}\n sx={Utils.getStyle(\n this.props.oContext.theme,\n { width: '100%' },\n this.props.isParentTab && styles.padding,\n this.props.schema.innerStyle,\n )}\n >\n {this.renderItems(items, disabled)}\n </Grid2>\n </Box>\n );\n }\n\n if (!this.props.isParentTab) {\n const item = (\n <Grid2\n title={this.getText(schema.tooltip)}\n size={{\n xs: schema.xs || undefined,\n sm: schema.sm || undefined,\n md: schema.md || undefined,\n lg: schema.lg || undefined,\n xl: schema.xl || undefined,\n }}\n sx={{ marginBottom: 0, /* marginRight: 8, */ textAlign: 'left', ...schemaStyle }}\n >\n {content}\n </Grid2>\n );\n\n if (schema.newLine) {\n return (\n <>\n <div style={{ flexBasis: '100%', height: 0 }} />\n {item}\n </>\n );\n }\n return item;\n }\n return content;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ConfigPanel.js","sourceRoot":"./src/","sources":["JsonConfigComponent/ConfigPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\n\nimport { Grid2, Accordion, AccordionSummary, AccordionDetails, Typography, Box } from '@mui/material';\n\nimport { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';\n\nimport { type AdminConnection, type IobTheme, Utils } from '@iobroker/adapter-react-v5';\nimport type { ConfigItemPanel } from '../types';\n\nimport ConfigGeneric, { type ConfigGenericState, type ConfigGenericProps } from './ConfigGeneric';\nimport ConfigAccordion from './ConfigAccordion';\nimport ConfigAlive from './ConfigAlive';\nimport ConfigAutocomplete from './ConfigAutocomplete';\nimport ConfigAutocompleteSendTo from './ConfigAutocompleteSendTo';\nimport ConfigCRON from './ConfigCRON';\nimport ConfigCertificateSelect from './ConfigCertificateSelect';\nimport ConfigCertificates from './ConfigCertificates';\nimport ConfigCertCollection from './ConfigCertCollection';\nimport ConfigCheckDocker from './ConfigCheckDocker';\nimport ConfigCheckLicense from './ConfigCheckLicense';\nimport ConfigCheckbox from './ConfigCheckbox';\nimport ConfigChip from './ConfigChip';\nimport ConfigColor from './ConfigColor';\nimport ConfigCoordinates from './ConfigCoordinates';\nimport ConfigCustom from './ConfigCustom';\nimport ConfigDatePicker from './ConfigDatePicker';\nimport ConfigDeviceManager from './ConfigDeviceManager';\nimport ConfigFile from './ConfigFile';\nimport ConfigFileSelector from './ConfigFileSelector';\nimport ConfigFunc from './ConfigFunc';\nimport ConfigIFrame from './ConfigIFrame';\nimport ConfigIFrameSendTo from './ConfigIFrameSendTo';\nimport ConfigIP from './ConfigIP';\nimport ConfigImageSendTo from './ConfigImageSendTo';\nimport ConfigImageUpload from './ConfigImageUpload';\nimport ConfigInfoBox from './ConfigInfoBox';\nimport ConfigInstanceSelect from './ConfigInstanceSelect';\nimport ConfigInterface from './ConfigInterface';\nimport ConfigJsonEditor from './ConfigJsonEditor';\nimport ConfigLanguage from './ConfigLanguage';\nimport ConfigLicense from './ConfigLicense';\nimport ConfigNumber from './ConfigNumber';\nimport ConfigOauth2 from './ConfigOAuth2';\nimport ConfigObjectId from './ConfigObjectId';\nimport ConfigPassword from './ConfigPassword';\nimport ConfigPattern from './ConfigPattern';\nimport ConfigPort from './ConfigPort';\nimport ConfigRoom from './ConfigRoom';\nimport ConfigSelect from './ConfigSelect';\nimport ConfigSelectSendTo from './ConfigSelectSendTo';\nimport ConfigSendTo from './ConfigSendto';\nimport ConfigSetState from './ConfigSetState';\nimport ConfigSlider from './ConfigSlider';\nimport ConfigState from './ConfigState';\nimport ConfigStaticDivider from './ConfigStaticDivider';\nimport ConfigStaticHeader from './ConfigStaticHeader';\nimport ConfigStaticImage from './ConfigStaticImage';\nimport ConfigStaticInfo from './ConfigStaticInfo';\nimport ConfigStaticText from './ConfigStaticText';\nimport ConfigTable from './ConfigTable';\nimport ConfigText from './ConfigText';\nimport ConfigTextSendTo from './ConfigTextSendTo';\nimport ConfigTimePicker from './ConfigTimePicker';\nimport ConfigTopic from './ConfigTopic';\nimport ConfigUUID from './ConfigUUID';\nimport ConfigUser from './ConfigUser';\nimport ConfigYamlEditor from './ConfigYamlEditor';\nimport ConfigQrCode from './ConfigQrCode';\n\nconst components: Record<string, typeof ConfigGeneric<any, any>> = {\n accordion: ConfigAccordion,\n alive: ConfigAlive,\n autocomplete: ConfigAutocomplete,\n autocompleteSendTo: ConfigAutocompleteSendTo,\n certCollection: ConfigCertCollection,\n certificate: ConfigCertificateSelect,\n certificates: ConfigCertificates,\n checkbox: ConfigCheckbox,\n checkDocker: ConfigCheckDocker,\n checkLicense: ConfigCheckLicense,\n chip: ConfigChip, // deprecated. Use \"chips\"\n chips: ConfigChip,\n color: ConfigColor,\n coordinates: ConfigCoordinates,\n cron: ConfigCRON,\n custom: ConfigCustom,\n datePicker: ConfigDatePicker,\n deviceManager: ConfigDeviceManager,\n divider: ConfigStaticDivider,\n file: ConfigFile,\n fileSelector: ConfigFileSelector,\n func: ConfigFunc,\n header: ConfigStaticHeader,\n iframe: ConfigIFrame,\n iframeSendTo: ConfigIFrameSendTo,\n image: ConfigImageUpload,\n imageSendTo: ConfigImageSendTo,\n infoBox: ConfigInfoBox,\n instance: ConfigInstanceSelect,\n interface: ConfigInterface,\n ip: ConfigIP,\n jsonEditor: ConfigJsonEditor,\n language: ConfigLanguage,\n license: ConfigLicense,\n number: ConfigNumber,\n oauth2: ConfigOauth2,\n objectId: ConfigObjectId,\n password: ConfigPassword,\n pattern: ConfigPattern,\n port: ConfigPort,\n qrCode: ConfigQrCode,\n room: ConfigRoom,\n select: ConfigSelect,\n selectSendTo: ConfigSelectSendTo,\n // @deprecated Use \"sendTo\"\n sendto: ConfigSendTo,\n sendTo: ConfigSendTo,\n setState: ConfigSetState,\n slider: ConfigSlider,\n state: ConfigState,\n staticImage: ConfigStaticImage,\n staticInfo: ConfigStaticInfo,\n staticLink: ConfigStaticText,\n staticText: ConfigStaticText,\n table: ConfigTable,\n text: ConfigText,\n textSendTo: ConfigTextSendTo,\n timePicker: ConfigTimePicker,\n topic: ConfigTopic,\n uuid: ConfigUUID,\n user: ConfigUser,\n yamlEditor: ConfigYamlEditor,\n};\n\nconst styles: Record<string, any> = {\n fullWidth: {\n width: '100%',\n // height: '100%',\n },\n paper: {\n margin: 1,\n width: 'auto !important',\n overflowY: 'auto',\n paddingBottom: 1,\n },\n paperWithIcons: {\n height: 'calc(100vh - 259px) !important',\n },\n paperWithoutIcons: {\n height: 'calc(100vh - 235px) !important',\n },\n padding: {\n padding: '10px',\n },\n heading: {},\n primary: (theme: IobTheme): React.CSSProperties => ({\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.mode === 'dark' ? 'inherit' : '#FFF',\n }),\n secondary: (theme: IobTheme): React.CSSProperties => ({\n backgroundColor: theme.palette.secondary.main,\n }),\n};\n\ninterface ConfigPanelProps extends ConfigGenericProps {\n schema: ConfigItemPanel;\n withIcons?: boolean;\n withoutSaveButtons?: boolean;\n}\ninterface ConfigPanelState extends ConfigGenericState {\n expanded?: boolean;\n}\n\nexport default class ConfigPanel extends ConfigGeneric<ConfigPanelProps, ConfigPanelState> {\n componentDidMount(): void {\n super.componentDidMount();\n if (this.props.schema?.collapsable) {\n this.setState({\n expanded:\n (((window as any)._localStorage as Storage) || window.localStorage).getItem(\n `${this.props.oContext.adapterName}.${this.props.attr}`,\n ) === 'true',\n });\n }\n }\n\n renderItems(items: Record<string, any>, disabled: boolean): JSX.Element[] | null {\n return items\n ? Object.keys(items).map(attr => {\n if (this.props.oContext.multiEdit && items[attr].noMultiEdit) {\n return null;\n }\n\n const type = items[attr].type || 'panel';\n let ItemComponent: typeof ConfigGeneric<ConfigGenericProps, any>;\n let socket: string | AdminConnection = 'Use this.props.oContext.socket!';\n if (type === 'custom') {\n // name\n // url\n if (items[attr].url) {\n ItemComponent = ConfigCustom;\n } else if (this.props.oContext.customs && this.props.oContext.customs[items[attr].component]) {\n ItemComponent = this.props.oContext.customs[items[attr].component];\n } else {\n console.error(`Cannot find custom component: ${items[attr].component}`);\n ItemComponent = ConfigGeneric;\n }\n socket = this.props.oContext.socket;\n } else if (type === 'panel') {\n ItemComponent = ConfigPanel;\n } else {\n ItemComponent = components[type] || ConfigGeneric;\n }\n\n return (\n <ItemComponent\n // @ts-expect-error Temporary work-around, till all custom components will not migrate to oContext\n socket={socket}\n globalData={this.props.globalData}\n oContext={this.props.oContext}\n key={`${attr}_${this.props.index === undefined ? '' : this.props.index}`}\n index={this.props.index}\n changed={this.props.changed}\n arrayIndex={this.props.arrayIndex}\n expertMode={this.props.expertMode}\n commandRunning={this.props.commandRunning}\n style={styles.panel}\n common={this.props.common}\n alive={this.props.alive}\n themeName={this.props.themeName}\n data={this.props.data}\n originalData={this.props.originalData}\n onError={this.props.onError}\n onChange={this.props.onChange}\n disabled={disabled}\n customObj={this.props.customObj}\n custom={this.props.custom}\n schema={items[attr]}\n attr={attr}\n table={this.props.table}\n />\n );\n })\n : null;\n }\n\n render(): JSX.Element | null {\n const schema = this.props.schema;\n\n if (!schema) {\n return null;\n }\n\n const { disabled, hidden } = this.calculate(schema);\n\n const items = this.props.schema.items;\n const schemaStyle = this.props.schema.style || {};\n\n if (hidden) {\n if (schema.hideOnlyControl) {\n const item = (\n <Grid2\n size={{\n xs: schema.xs || undefined,\n sm: schema.sm || undefined,\n md: schema.md || undefined,\n lg: schema.lg || undefined,\n xl: schema.xl || undefined,\n }}\n sx={Utils.getStyle(\n this.props.oContext.theme,\n { marginBottom: 0, textAlign: 'left' /* marginRight: 8, */ },\n schemaStyle,\n this.props.oContext.themeType === 'dark' && schema.darkStyle,\n )}\n />\n );\n\n if (schema.newLine) {\n return (\n <>\n <div style={{ flexBasis: '100%', height: 0 }} />\n {item}\n </>\n );\n }\n return item;\n }\n return null;\n }\n\n if (this.props.table) {\n return this.renderItems(items, disabled) as any as JSX.Element;\n }\n\n if (this.props.custom) {\n return (\n <Grid2\n key={`${this.props.attr}_${this.props.index}`}\n container\n style={styles.fullWidth}\n columnSpacing={2}\n rowSpacing={1}\n sx={schemaStyle}\n >\n {this.renderItems(items, disabled)}\n </Grid2>\n );\n }\n\n let content;\n if (schema.collapsable) {\n content = (\n <Accordion\n key={`${this.props.attr}_${this.props.index}`}\n style={styles.fullWidth}\n expanded={!!this.state.expanded}\n onChange={() => {\n (((window as any)._localStorage as Storage) || window.localStorage).setItem(\n `${this.props.oContext.adapterName}.${this.props.attr}`,\n this.state.expanded ? 'false' : 'true',\n );\n this.setState({ expanded: !this.state.expanded });\n }}\n >\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n sx={Utils.getStyle(\n this.props.oContext.theme,\n schemaStyle,\n this.props.oContext.themeType && schema.darkStyle,\n schema.color === 'primary'\n ? styles.primary\n : schema.color === 'secondary' && styles.secondary,\n { width: '100%' },\n )}\n >\n <Typography style={styles.heading}>{this.getText(schema.label)}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Grid2\n container\n columnSpacing={2}\n rowSpacing={1}\n sx={{ ...schemaStyle, width: '100%', padding: '10px' }}\n >\n {this.renderItems(items, disabled)}\n </Grid2>\n </AccordionDetails>\n </Accordion>\n );\n } else {\n const sx = Utils.getStyle(\n this.props.oContext.theme,\n this.props.style,\n schemaStyle,\n { width: '100%' },\n this.props.isParentTab && styles.paper,\n this.props.isParentTab &&\n (this.props.withoutSaveButtons\n ? this.props.withIcons\n ? { height: 'calc(100% - 88px) !important' }\n : { height: 'calc(100% - 64px) !important' }\n : this.props.withIcons\n ? styles.paperWithIcons\n : styles.paperWithoutIcons),\n );\n\n content = (\n <Box\n component=\"div\"\n key={`${this.props.attr}_${this.props.index}`}\n className={this.props.className}\n sx={sx}\n >\n <Grid2\n container\n columnSpacing={2}\n rowSpacing={1}\n sx={Utils.getStyle(\n this.props.oContext.theme,\n { width: '100%' },\n this.props.isParentTab && styles.padding,\n this.props.schema.innerStyle,\n )}\n >\n {this.renderItems(items, disabled)}\n </Grid2>\n </Box>\n );\n }\n\n if (!this.props.isParentTab) {\n const item = (\n <Grid2\n title={this.getText(schema.tooltip)}\n size={{\n xs: schema.xs || undefined,\n sm: schema.sm || undefined,\n md: schema.md || undefined,\n lg: schema.lg || undefined,\n xl: schema.xl || undefined,\n }}\n sx={{ marginBottom: 0, /* marginRight: 8, */ textAlign: 'left', ...schemaStyle }}\n >\n {content}\n </Grid2>\n );\n\n if (schema.newLine) {\n return (\n <>\n <div style={{ flexBasis: '100%', height: 0 }} />\n {item}\n </>\n );\n }\n return item;\n }\n return content;\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type JSX } from 'react';
|
|
2
|
+
import type { ConfigItemYamlEditor } from '../types';
|
|
3
|
+
import ConfigGeneric, { type ConfigGenericProps, type ConfigGenericState } from './ConfigGeneric';
|
|
4
|
+
interface ConfigYamlEditorProps extends ConfigGenericProps {
|
|
5
|
+
schema: ConfigItemYamlEditor;
|
|
6
|
+
}
|
|
7
|
+
interface ConfigYamlEditorState extends ConfigGenericState {
|
|
8
|
+
initialized?: boolean;
|
|
9
|
+
showSelectId?: boolean;
|
|
10
|
+
yamlError?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export default class ConfigYamlEditor extends ConfigGeneric<ConfigYamlEditorProps, ConfigYamlEditorState> {
|
|
13
|
+
componentDidMount(): void;
|
|
14
|
+
validateYaml(value: string | null | undefined): boolean;
|
|
15
|
+
renderItem(_error: string, disabled: boolean): JSX.Element | null;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { parse } from 'yaml';
|
|
3
|
+
import { FormHelperText, FormControl, Button } from '@mui/material';
|
|
4
|
+
import { I18n } from '@iobroker/adapter-react-v5';
|
|
5
|
+
import ConfigGeneric from './ConfigGeneric';
|
|
6
|
+
import CustomModal from './wrapper/Components/CustomModal';
|
|
7
|
+
import Editor from './wrapper/Components/Editor';
|
|
8
|
+
const styles = {
|
|
9
|
+
fullWidth: {
|
|
10
|
+
width: '100%',
|
|
11
|
+
},
|
|
12
|
+
flex: {
|
|
13
|
+
display: 'flex',
|
|
14
|
+
},
|
|
15
|
+
button: {
|
|
16
|
+
height: 48,
|
|
17
|
+
minWidth: 48,
|
|
18
|
+
},
|
|
19
|
+
wrapper: {
|
|
20
|
+
width: 'calc(100vw - 40px)',
|
|
21
|
+
height: 'calc(100vh - 188px)',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export default class ConfigYamlEditor extends ConfigGeneric {
|
|
25
|
+
componentDidMount() {
|
|
26
|
+
super.componentDidMount();
|
|
27
|
+
const { data, attr } = this.props;
|
|
28
|
+
const value = ConfigGeneric.getValue(data, attr) || '';
|
|
29
|
+
this.setState({ value, initialized: true, yamlError: this.validateYaml(value) });
|
|
30
|
+
}
|
|
31
|
+
validateYaml(value) {
|
|
32
|
+
let yamlError = false;
|
|
33
|
+
if (this.props.schema.validateYaml !== false) {
|
|
34
|
+
if (value || !this.props.schema.allowEmpty) {
|
|
35
|
+
try {
|
|
36
|
+
parse(value);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
console.log('Error in YAML', err);
|
|
40
|
+
yamlError = true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return yamlError;
|
|
45
|
+
}
|
|
46
|
+
renderItem(_error, disabled /* , defaultValue */) {
|
|
47
|
+
if (!this.state.initialized) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const { schema, data, attr } = this.props;
|
|
51
|
+
const { value, showSelectId } = this.state;
|
|
52
|
+
const isReadOnly = schema.readOnly === true || disabled;
|
|
53
|
+
return (React.createElement(FormControl, { fullWidth: true, variant: "standard" },
|
|
54
|
+
React.createElement("div", { style: styles.flex },
|
|
55
|
+
React.createElement(Button, { color: "grey", style: styles.button, size: "small", variant: "outlined", onClick: () => this.setState({ showSelectId: true }) }, I18n.t('ra_YAML editor'))),
|
|
56
|
+
showSelectId ? (React.createElement(CustomModal, { title: this.getText(schema.label), overflowHidden: true, applyDisabled: (this.state.yamlError && this.props.schema.doNotApplyWithError) || isReadOnly, onClose: () => {
|
|
57
|
+
if (isReadOnly) {
|
|
58
|
+
this.setState({ showSelectId: false });
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.setState({ showSelectId: false, value: ConfigGeneric.getValue(data, attr) || '' });
|
|
62
|
+
}
|
|
63
|
+
}, onApply: isReadOnly
|
|
64
|
+
? undefined
|
|
65
|
+
: () => this.setState({ showSelectId: false }, () => this.onChange(attr, value)) },
|
|
66
|
+
React.createElement("div", { style: {
|
|
67
|
+
...styles.wrapper,
|
|
68
|
+
border: this.state.yamlError ? '2px solid red' : '2px solid transparent',
|
|
69
|
+
} },
|
|
70
|
+
React.createElement(Editor, { mode: "yaml", value: typeof value === 'object' ? JSON.stringify(value) : value, onChange: isReadOnly
|
|
71
|
+
? undefined
|
|
72
|
+
: newValue => this.setState({
|
|
73
|
+
value: newValue,
|
|
74
|
+
yamlError: this.validateYaml(newValue),
|
|
75
|
+
}), name: "ConfigYamlEditor", themeType: this.props.oContext.themeType })))) : null,
|
|
76
|
+
schema.help || this.state.yamlError ? (React.createElement(FormHelperText, null, this.state.yamlError
|
|
77
|
+
? I18n.t('ra_Invalid YAML')
|
|
78
|
+
: this.renderHelp(this.props.schema.help, this.props.schema.helpLink, this.props.schema.noTranslation))) : null));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=ConfigYamlEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigYamlEditor.js","sourceRoot":"./src/","sources":["JsonConfigComponent/ConfigYamlEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type JSX } from 'react';\nimport { parse } from 'yaml';\n\nimport { FormHelperText, FormControl, Button } from '@mui/material';\n\nimport { I18n } from '@iobroker/adapter-react-v5';\nimport type { ConfigItemYamlEditor } from '../types';\nimport ConfigGeneric, { type ConfigGenericProps, type ConfigGenericState } from './ConfigGeneric';\nimport CustomModal from './wrapper/Components/CustomModal';\nimport Editor from './wrapper/Components/Editor';\n\nconst styles: Record<string, React.CSSProperties> = {\n fullWidth: {\n width: '100%',\n },\n flex: {\n display: 'flex',\n },\n button: {\n height: 48,\n minWidth: 48,\n },\n wrapper: {\n width: 'calc(100vw - 40px)',\n height: 'calc(100vh - 188px)',\n },\n};\n\ninterface ConfigYamlEditorProps extends ConfigGenericProps {\n schema: ConfigItemYamlEditor;\n}\n\ninterface ConfigYamlEditorState extends ConfigGenericState {\n initialized?: boolean;\n showSelectId?: boolean;\n yamlError?: boolean;\n}\n\nexport default class ConfigYamlEditor extends ConfigGeneric<ConfigYamlEditorProps, ConfigYamlEditorState> {\n componentDidMount(): void {\n super.componentDidMount();\n const { data, attr } = this.props;\n const value: string = ConfigGeneric.getValue(data, attr) || '';\n this.setState({ value, initialized: true, yamlError: this.validateYaml(value) });\n }\n\n validateYaml(value: string | null | undefined): boolean {\n let yamlError = false;\n if (this.props.schema.validateYaml !== false) {\n if (value || !this.props.schema.allowEmpty) {\n try {\n parse(value);\n } catch (err: unknown) {\n console.log('Error in YAML', err);\n yamlError = true;\n }\n }\n }\n\n return yamlError;\n }\n\n renderItem(_error: string, disabled: boolean /* , defaultValue */): JSX.Element | null {\n if (!this.state.initialized) {\n return null;\n }\n\n const { schema, data, attr } = this.props;\n const { value, showSelectId } = this.state;\n const isReadOnly = schema.readOnly === true || disabled;\n\n return (\n <FormControl\n fullWidth\n variant=\"standard\"\n >\n <div style={styles.flex}>\n <Button\n color=\"grey\"\n style={styles.button}\n size=\"small\"\n variant=\"outlined\"\n onClick={() => this.setState({ showSelectId: true })}\n >\n {I18n.t('ra_YAML editor')}\n </Button>\n </div>\n {showSelectId ? (\n <CustomModal\n title={this.getText(schema.label)}\n overflowHidden\n applyDisabled={(this.state.yamlError && this.props.schema.doNotApplyWithError) || isReadOnly}\n onClose={() => {\n if (isReadOnly) {\n this.setState({ showSelectId: false });\n } else {\n this.setState({ showSelectId: false, value: ConfigGeneric.getValue(data, attr) || '' });\n }\n }}\n onApply={\n isReadOnly\n ? undefined\n : () => this.setState({ showSelectId: false }, () => this.onChange(attr, value))\n }\n >\n <div\n style={{\n ...styles.wrapper,\n border: this.state.yamlError ? '2px solid red' : '2px solid transparent',\n }}\n >\n <Editor\n mode=\"yaml\"\n value={typeof value === 'object' ? JSON.stringify(value) : value}\n onChange={\n isReadOnly\n ? undefined\n : newValue =>\n this.setState({\n value: newValue,\n yamlError: this.validateYaml(newValue),\n })\n }\n name=\"ConfigYamlEditor\"\n themeType={this.props.oContext.themeType}\n />\n </div>\n </CustomModal>\n ) : null}\n {schema.help || this.state.yamlError ? (\n <FormHelperText>\n {this.state.yamlError\n ? I18n.t('ra_Invalid YAML')\n : this.renderHelp(\n this.props.schema.help,\n this.props.schema.helpLink,\n this.props.schema.noTranslation,\n )}\n </FormHelperText>\n ) : null}\n </FormControl>\n );\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type JSX } from 'react';
|
|
2
2
|
import 'ace-builds/src-min-noconflict/mode-json';
|
|
3
3
|
import 'ace-builds/src-min-noconflict/mode-json5';
|
|
4
|
+
import 'ace-builds/src-min-noconflict/mode-yaml';
|
|
4
5
|
import 'ace-builds/src-min-noconflict/worker-json';
|
|
5
6
|
import 'ace-builds/src-min-noconflict/theme-clouds_midnight';
|
|
6
7
|
import 'ace-builds/src-min-noconflict/theme-chrome';
|
|
@@ -9,7 +10,7 @@ interface EditorProps {
|
|
|
9
10
|
fontSize?: number;
|
|
10
11
|
value?: string;
|
|
11
12
|
defaultValue?: string;
|
|
12
|
-
mode?: 'json' | 'css' | 'html' | 'json5';
|
|
13
|
+
mode?: 'json' | 'css' | 'html' | 'json5' | 'yaml';
|
|
13
14
|
name: string;
|
|
14
15
|
onChange?: (newValue: string) => void;
|
|
15
16
|
themeType: string;
|
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import AceEditor from 'react-ace';
|
|
3
3
|
import 'ace-builds/src-min-noconflict/mode-json';
|
|
4
4
|
import 'ace-builds/src-min-noconflict/mode-json5';
|
|
5
|
+
import 'ace-builds/src-min-noconflict/mode-yaml';
|
|
5
6
|
import 'ace-builds/src-min-noconflict/worker-json';
|
|
6
7
|
import 'ace-builds/src-min-noconflict/theme-clouds_midnight';
|
|
7
8
|
import 'ace-builds/src-min-noconflict/theme-chrome';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.js","sourceRoot":"./src/","sources":["JsonConfigComponent/wrapper/Components/Editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,yCAAyC,CAAC;AACjD,OAAO,0CAA0C,CAAC;AAClD,OAAO,2CAA2C,CAAC;AACnD,OAAO,qDAAqD,CAAC;AAC7D,OAAO,4CAA4C,CAAC;AACpD,OAAO,kDAAkD,CAAC;AAE1D,MAAM,MAAM,GAAwC;IAChD,SAAS,EAAE;QACP,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,GAAG;KACjB;IACD,WAAW,EAAE;QACT,MAAM,EAAE,qBAAqB;QAC7B,SAAS,EAAE,GAAG;KACjB;CACJ,CAAC;AAcF,SAAS,MAAM,CAAC,KAAkB;IAC9B,OAAO,CACH,oBAAC,SAAS,IACN,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACvG,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,EAC1B,KAAK,EAAC,MAAM,EACZ,MAAM,EAAC,MAAM,EACb,eAAe,EAAE,KAAK,CAAC,aAAa,EACpC,UAAU,EAAE,KAAK,CAAC,aAAa,EAC/B,mBAAmB,EAAE,KAAK,CAAC,aAAa,EACxC,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,KAAK,EAAE,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAChE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EACzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAChD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,mBAAmB,EACvC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAC9B,UAAU,EAAE;YACR,yBAAyB,EAAE,IAAI;YAC/B,wBAAwB,EAAE,IAAI;YAC9B,cAAc,EAAE,IAAI;YAEpB,eAAe,EAAE,KAAK,CAAC,aAAa;YACpC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/C,EACD,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,GACxC,CACL,CAAC;AACN,CAAC;AAED,eAAe,MAAM,CAAC","sourcesContent":["import React, { type JSX } from 'react';\n\nimport AceEditor from 'react-ace';\nimport 'ace-builds/src-min-noconflict/mode-json';\nimport 'ace-builds/src-min-noconflict/mode-json5';\nimport 'ace-builds/src-min-noconflict/worker-json';\nimport 'ace-builds/src-min-noconflict/theme-clouds_midnight';\nimport 'ace-builds/src-min-noconflict/theme-chrome';\nimport 'ace-builds/src-min-noconflict/ext-language_tools';\n\nconst styles: Record<string, React.CSSProperties> = {\n jsonError: {\n border: '1px solid red',\n minHeight: 200,\n },\n jsonNoError: {\n border: '1px solid #00000000',\n minHeight: 200,\n },\n};\n\ninterface EditorProps {\n fontSize?: number;\n value?: string;\n defaultValue?: string;\n mode?: 'json' | 'css' | 'html' | 'json5';\n name: string;\n onChange?: (newValue: string) => void;\n themeType: string;\n editValueMode?: boolean; // flag that indicates the \"value edit mode\"\n error?: boolean;\n}\n\nfunction Editor(props: EditorProps): JSX.Element {\n return (\n <AceEditor\n style={props.error === true ? styles.jsonError : props.error === false ? styles.jsonNoError : undefined}\n mode={props.mode || 'json'}\n width=\"100%\"\n height=\"100%\"\n showPrintMargin={props.editValueMode}\n showGutter={props.editValueMode}\n highlightActiveLine={props.editValueMode}\n defaultValue={props.defaultValue}\n theme={props.themeType === 'dark' ? 'clouds_midnight' : 'chrome'}\n value={props.value}\n readOnly={!props.onChange}\n onChange={newValue => props.onChange?.(newValue)}\n name={props.name || 'UNIQUE_ID_OF_DIV1'}\n fontSize={props.fontSize || 14}\n setOptions={{\n enableBasicAutocompletion: true,\n enableLiveAutocompletion: true,\n enableSnippets: true,\n\n showLineNumbers: props.editValueMode,\n tabSize: props.editValueMode ? 2 : undefined,\n }}\n editorProps={{ $blockScrolling: true }}\n />\n );\n}\n\nexport default Editor;\n"]}
|
|
1
|
+
{"version":3,"file":"Editor.js","sourceRoot":"./src/","sources":["JsonConfigComponent/wrapper/Components/Editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,yCAAyC,CAAC;AACjD,OAAO,0CAA0C,CAAC;AAClD,OAAO,yCAAyC,CAAC;AACjD,OAAO,2CAA2C,CAAC;AACnD,OAAO,qDAAqD,CAAC;AAC7D,OAAO,4CAA4C,CAAC;AACpD,OAAO,kDAAkD,CAAC;AAE1D,MAAM,MAAM,GAAwC;IAChD,SAAS,EAAE;QACP,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,GAAG;KACjB;IACD,WAAW,EAAE;QACT,MAAM,EAAE,qBAAqB;QAC7B,SAAS,EAAE,GAAG;KACjB;CACJ,CAAC;AAcF,SAAS,MAAM,CAAC,KAAkB;IAC9B,OAAO,CACH,oBAAC,SAAS,IACN,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACvG,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,EAC1B,KAAK,EAAC,MAAM,EACZ,MAAM,EAAC,MAAM,EACb,eAAe,EAAE,KAAK,CAAC,aAAa,EACpC,UAAU,EAAE,KAAK,CAAC,aAAa,EAC/B,mBAAmB,EAAE,KAAK,CAAC,aAAa,EACxC,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,KAAK,EAAE,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAChE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EACzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAChD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,mBAAmB,EACvC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAC9B,UAAU,EAAE;YACR,yBAAyB,EAAE,IAAI;YAC/B,wBAAwB,EAAE,IAAI;YAC9B,cAAc,EAAE,IAAI;YAEpB,eAAe,EAAE,KAAK,CAAC,aAAa;YACpC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/C,EACD,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,GACxC,CACL,CAAC;AACN,CAAC;AAED,eAAe,MAAM,CAAC","sourcesContent":["import React, { type JSX } from 'react';\n\nimport AceEditor from 'react-ace';\nimport 'ace-builds/src-min-noconflict/mode-json';\nimport 'ace-builds/src-min-noconflict/mode-json5';\nimport 'ace-builds/src-min-noconflict/mode-yaml';\nimport 'ace-builds/src-min-noconflict/worker-json';\nimport 'ace-builds/src-min-noconflict/theme-clouds_midnight';\nimport 'ace-builds/src-min-noconflict/theme-chrome';\nimport 'ace-builds/src-min-noconflict/ext-language_tools';\n\nconst styles: Record<string, React.CSSProperties> = {\n jsonError: {\n border: '1px solid red',\n minHeight: 200,\n },\n jsonNoError: {\n border: '1px solid #00000000',\n minHeight: 200,\n },\n};\n\ninterface EditorProps {\n fontSize?: number;\n value?: string;\n defaultValue?: string;\n mode?: 'json' | 'css' | 'html' | 'json5' | 'yaml';\n name: string;\n onChange?: (newValue: string) => void;\n themeType: string;\n editValueMode?: boolean; // flag that indicates the \"value edit mode\"\n error?: boolean;\n}\n\nfunction Editor(props: EditorProps): JSX.Element {\n return (\n <AceEditor\n style={props.error === true ? styles.jsonError : props.error === false ? styles.jsonNoError : undefined}\n mode={props.mode || 'json'}\n width=\"100%\"\n height=\"100%\"\n showPrintMargin={props.editValueMode}\n showGutter={props.editValueMode}\n highlightActiveLine={props.editValueMode}\n defaultValue={props.defaultValue}\n theme={props.themeType === 'dark' ? 'clouds_midnight' : 'chrome'}\n value={props.value}\n readOnly={!props.onChange}\n onChange={newValue => props.onChange?.(newValue)}\n name={props.name || 'UNIQUE_ID_OF_DIV1'}\n fontSize={props.fontSize || 14}\n setOptions={{\n enableBasicAutocompletion: true,\n enableLiveAutocompletion: true,\n enableSnippets: true,\n\n showLineNumbers: props.editValueMode,\n tabSize: props.editValueMode ? 2 : undefined,\n }}\n editorProps={{ $blockScrolling: true }}\n />\n );\n}\n\nexport default Editor;\n"]}
|
package/build/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ import JsonConfigComponent from './JsonConfigComponent';
|
|
|
3
3
|
import ConfigPanel from './JsonConfigComponent/ConfigPanel';
|
|
4
4
|
import ConfigGeneric from './JsonConfigComponent/ConfigGeneric';
|
|
5
5
|
export type { DeviceManagerPropsProps, ConfigGenericProps, ConfigGenericState, } from './JsonConfigComponent/ConfigGeneric';
|
|
6
|
-
export type { ConfigItemType, ConfigItemConfirmData, ConfigItem, ConfigItemAlive, ConfigItemSelectOption, ConfigItemPanel, ConfigItemPattern, ConfigItemChip, ConfigItemTabs, ConfigItemText, ConfigItemColor, ConfigItemCheckbox, ConfigItemNumber, ConfigItemQrCode, ConfigItemPassword, ConfigItemObjectId, ConfigItemSlider, ConfigItemTopic, ConfigItemIP, ConfigItemUser, ConfigItemStaticDivider, ConfigItemStaticHeader, ConfigItemStaticImage, ConfigItemStaticText, ConfigItemRoom, ConfigItemFunc, ConfigItemSelect, ConfigItemAutocomplete, ConfigItemSetState, ConfigItemAutocompleteSendTo, ConfigItemAccordion, ConfigItemDivider, ConfigItemHeader, ConfigItemCoordinates, ConfigItemCustom, ConfigItemDatePicker, ConfigItemDeviceManager, ConfigItemLanguage, ConfigItemPort, ConfigItemImageSendTo, ConfigItemSendTo, ConfigItemState, ConfigItemTextSendTo, ConfigItemSelectSendTo, ConfigItemTable, ConfigItemTimePicker, ConfigItemCertCollection, ConfigItemCRON, ConfigItemCertificateSelect, ConfigItemLicense, ConfigItemCertificates, ConfigItemCheckLicense, ConfigItemUUID, ConfigItemJsonEditor, ConfigItemInterface, ConfigItemImageUpload, ConfigItemInstanceSelect, ConfigItemFile, ConfigItemFileSelector, ConfigItemAny, BackEndCommandType, BackEndCommandGeneric, BackEndCommandNoOperation, BackEndCommandRefresh, BackEndCommandOpenLink, BackEndCommandMessage, BackEndCommand, } from './types';
|
|
6
|
+
export type { ConfigItemType, ConfigItemConfirmData, ConfigItem, ConfigItemAlive, ConfigItemSelectOption, ConfigItemPanel, ConfigItemPattern, ConfigItemChip, ConfigItemTabs, ConfigItemText, ConfigItemColor, ConfigItemCheckbox, ConfigItemNumber, ConfigItemQrCode, ConfigItemPassword, ConfigItemObjectId, ConfigItemSlider, ConfigItemTopic, ConfigItemIP, ConfigItemUser, ConfigItemStaticDivider, ConfigItemStaticHeader, ConfigItemStaticImage, ConfigItemStaticText, ConfigItemRoom, ConfigItemFunc, ConfigItemSelect, ConfigItemAutocomplete, ConfigItemSetState, ConfigItemAutocompleteSendTo, ConfigItemAccordion, ConfigItemDivider, ConfigItemHeader, ConfigItemCoordinates, ConfigItemCustom, ConfigItemDatePicker, ConfigItemDeviceManager, ConfigItemLanguage, ConfigItemPort, ConfigItemImageSendTo, ConfigItemSendTo, ConfigItemState, ConfigItemTextSendTo, ConfigItemSelectSendTo, ConfigItemTable, ConfigItemTimePicker, ConfigItemCertCollection, ConfigItemCRON, ConfigItemCertificateSelect, ConfigItemLicense, ConfigItemCertificates, ConfigItemCheckLicense, ConfigItemUUID, ConfigItemJsonEditor, ConfigItemYamlEditor, ConfigItemInterface, ConfigItemImageUpload, ConfigItemInstanceSelect, ConfigItemFile, ConfigItemFileSelector, ConfigItemAny, BackEndCommandType, BackEndCommandGeneric, BackEndCommandNoOperation, BackEndCommandRefresh, BackEndCommandOpenLink, BackEndCommandMessage, BackEndCommand, } from './types';
|
|
7
7
|
export { JsonConfig, JsonConfigComponent, ConfigPanel, ConfigGeneric };
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"./src/","sources":["index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,WAAW,MAAM,mCAAmC,CAAC;AAC5D,OAAO,aAAa,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"./src/","sources":["index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,WAAW,MAAM,mCAAmC,CAAC;AAC5D,OAAO,aAAa,MAAM,qCAAqC,CAAC;AA+EhE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import JsonConfig from './JsonConfig';\nimport JsonConfigComponent from './JsonConfigComponent';\nimport ConfigPanel from './JsonConfigComponent/ConfigPanel';\nimport ConfigGeneric from './JsonConfigComponent/ConfigGeneric';\n\nexport type {\n DeviceManagerPropsProps,\n ConfigGenericProps,\n ConfigGenericState,\n} from './JsonConfigComponent/ConfigGeneric';\n\nexport type {\n ConfigItemType,\n ConfigItemConfirmData,\n ConfigItem,\n ConfigItemAlive,\n ConfigItemSelectOption,\n ConfigItemPanel,\n ConfigItemPattern,\n ConfigItemChip,\n ConfigItemTabs,\n ConfigItemText,\n ConfigItemColor,\n ConfigItemCheckbox,\n ConfigItemNumber,\n ConfigItemQrCode,\n ConfigItemPassword,\n ConfigItemObjectId,\n ConfigItemSlider,\n ConfigItemTopic,\n ConfigItemIP,\n ConfigItemUser,\n ConfigItemStaticDivider,\n ConfigItemStaticHeader,\n ConfigItemStaticImage,\n ConfigItemStaticText,\n ConfigItemRoom,\n ConfigItemFunc,\n ConfigItemSelect,\n ConfigItemAutocomplete,\n ConfigItemSetState,\n ConfigItemAutocompleteSendTo,\n ConfigItemAccordion,\n ConfigItemDivider,\n ConfigItemHeader,\n ConfigItemCoordinates,\n ConfigItemCustom,\n ConfigItemDatePicker,\n ConfigItemDeviceManager,\n ConfigItemLanguage,\n ConfigItemPort,\n ConfigItemImageSendTo,\n ConfigItemSendTo,\n ConfigItemState,\n ConfigItemTextSendTo,\n ConfigItemSelectSendTo,\n ConfigItemTable,\n ConfigItemTimePicker,\n ConfigItemCertCollection,\n ConfigItemCRON,\n ConfigItemCertificateSelect,\n ConfigItemLicense,\n ConfigItemCertificates,\n ConfigItemCheckLicense,\n ConfigItemUUID,\n ConfigItemJsonEditor,\n ConfigItemYamlEditor,\n ConfigItemInterface,\n ConfigItemImageUpload,\n ConfigItemInstanceSelect,\n ConfigItemFile,\n ConfigItemFileSelector,\n ConfigItemAny,\n BackEndCommandType,\n BackEndCommandGeneric,\n BackEndCommandNoOperation,\n BackEndCommandRefresh,\n BackEndCommandOpenLink,\n BackEndCommandMessage,\n BackEndCommand,\n} from './types';\n\nexport { JsonConfig, JsonConfigComponent, ConfigPanel, ConfigGeneric };\n"]}
|
package/build/types.d.ts
CHANGED
|
@@ -77,7 +77,8 @@ export type ConfigItemType =
|
|
|
77
77
|
| 'timePicker'
|
|
78
78
|
| 'topic'
|
|
79
79
|
| 'user'
|
|
80
|
-
| 'uuid'
|
|
80
|
+
| 'uuid'
|
|
81
|
+
| 'yamlEditor';
|
|
81
82
|
|
|
82
83
|
export type ConfigIconType =
|
|
83
84
|
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
@@ -967,6 +968,18 @@ export interface ConfigItemJsonEditor extends ConfigItem {
|
|
|
967
968
|
readOnly?: boolean;
|
|
968
969
|
}
|
|
969
970
|
|
|
971
|
+
export interface ConfigItemYamlEditor extends ConfigItem {
|
|
972
|
+
type: 'yamlEditor';
|
|
973
|
+
/** if false, the text will be not validated as YAML */
|
|
974
|
+
validateYaml?: boolean;
|
|
975
|
+
/** if true, the YAML will be validated only if the value is not empty */
|
|
976
|
+
allowEmpty?: boolean;
|
|
977
|
+
/** Do not allow saving the value if error in YAML */
|
|
978
|
+
doNotApplyWithError?: boolean;
|
|
979
|
+
/** Open the editor in read-only mode - editor can be opened but content cannot be modified */
|
|
980
|
+
readOnly?: boolean;
|
|
981
|
+
}
|
|
982
|
+
|
|
970
983
|
export interface ConfigItemInterface extends ConfigItem {
|
|
971
984
|
type: 'interface';
|
|
972
985
|
/** do not show loopback interface (127.0.0.1) */
|
|
@@ -1110,6 +1123,7 @@ export type ConfigItemAny =
|
|
|
1110
1123
|
| ConfigItemImageUpload
|
|
1111
1124
|
| ConfigItemInterface
|
|
1112
1125
|
| ConfigItemJsonEditor
|
|
1126
|
+
| ConfigItemYamlEditor
|
|
1113
1127
|
| ConfigItemLicense
|
|
1114
1128
|
| ConfigItemPassword
|
|
1115
1129
|
| ConfigItemSetState
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iobroker/json-config",
|
|
3
3
|
"description": "This package contains the ioBroker JSON config UI components",
|
|
4
|
-
"version": "8.1.
|
|
4
|
+
"version": "8.1.2",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "bluefox",
|
|
7
7
|
"email": "dogafox@gmail.com"
|
|
@@ -41,7 +41,8 @@
|
|
|
41
41
|
"crypto-js": "^4.2.0",
|
|
42
42
|
"json5": "^2.2.3",
|
|
43
43
|
"react-ace": "^14.0.1",
|
|
44
|
-
"react-qr-code": "^2.0.18"
|
|
44
|
+
"react-qr-code": "^2.0.18",
|
|
45
|
+
"yaml": "^2.8.2"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
48
|
"@alcalzone/release-script": "^5.0.0",
|