@iobroker/adapter-react-v5 4.13.1 → 4.13.3

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.
Files changed (462) hide show
  1. package/AdminConnection.js.map +1 -1
  2. package/Components/404.js +13 -13
  3. package/Components/404.js.map +1 -0
  4. package/Components/ColorPicker.js +54 -54
  5. package/Components/ColorPicker.js.map +1 -1
  6. package/Components/ComplexCron.js.map +1 -1
  7. package/Components/CustomModal.js.map +1 -0
  8. package/Components/FileBrowser.js +5 -1
  9. package/Components/FileBrowser.js.map +1 -0
  10. package/Components/FileViewer.js.map +1 -0
  11. package/Components/Icon.js.map +1 -0
  12. package/Components/IconPicker.js.map +1 -0
  13. package/Components/IconSelector.js.map +1 -0
  14. package/Components/Image.js.map +1 -0
  15. package/Components/JsonConfigComponent/ChipInput.d.ts +12 -0
  16. package/Components/JsonConfigComponent/ChipInput.js +763 -0
  17. package/Components/JsonConfigComponent/ChipInput.js.map +1 -0
  18. package/Components/JsonConfigComponent/ConfigAccordion.d.ts +15 -0
  19. package/Components/JsonConfigComponent/ConfigAccordion.js +348 -0
  20. package/Components/JsonConfigComponent/ConfigAccordion.js.map +1 -0
  21. package/Components/JsonConfigComponent/ConfigAlive.d.ts +10 -0
  22. package/Components/JsonConfigComponent/ConfigAlive.js +105 -0
  23. package/Components/JsonConfigComponent/ConfigAlive.js.map +1 -0
  24. package/Components/JsonConfigComponent/ConfigAutocomplete.d.ts +37 -0
  25. package/Components/JsonConfigComponent/ConfigAutocomplete.js +73 -0
  26. package/Components/JsonConfigComponent/ConfigAutocomplete.js.map +1 -0
  27. package/Components/JsonConfigComponent/ConfigAutocompleteSendTo.d.ts +17 -0
  28. package/Components/JsonConfigComponent/ConfigAutocompleteSendTo.js +131 -0
  29. package/Components/JsonConfigComponent/ConfigAutocompleteSendTo.js.map +1 -0
  30. package/Components/JsonConfigComponent/ConfigCRON.d.ts +15 -0
  31. package/Components/JsonConfigComponent/ConfigCRON.js +157 -0
  32. package/Components/JsonConfigComponent/ConfigCRON.js.map +1 -0
  33. package/Components/JsonConfigComponent/ConfigCertCollection.d.ts +14 -0
  34. package/Components/JsonConfigComponent/ConfigCertCollection.js +128 -0
  35. package/Components/JsonConfigComponent/ConfigCertCollection.js.map +1 -0
  36. package/Components/JsonConfigComponent/ConfigCertificateSelect.d.ts +14 -0
  37. package/Components/JsonConfigComponent/ConfigCertificateSelect.js +149 -0
  38. package/Components/JsonConfigComponent/ConfigCertificateSelect.js.map +1 -0
  39. package/Components/JsonConfigComponent/ConfigCertificates.d.ts +14 -0
  40. package/Components/JsonConfigComponent/ConfigCertificates.js +284 -0
  41. package/Components/JsonConfigComponent/ConfigCertificates.js.map +1 -0
  42. package/Components/JsonConfigComponent/ConfigCheckLicense.d.ts +3 -0
  43. package/Components/JsonConfigComponent/ConfigCheckLicense.js +821 -0
  44. package/Components/JsonConfigComponent/ConfigCheckLicense.js.map +1 -0
  45. package/Components/JsonConfigComponent/ConfigCheckbox.d.ts +15 -0
  46. package/Components/JsonConfigComponent/ConfigCheckbox.js +40 -0
  47. package/Components/JsonConfigComponent/ConfigCheckbox.js.map +1 -0
  48. package/Components/JsonConfigComponent/ConfigChip.d.ts +14 -0
  49. package/Components/JsonConfigComponent/ConfigChip.js +120 -0
  50. package/Components/JsonConfigComponent/ConfigChip.js.map +1 -0
  51. package/Components/JsonConfigComponent/ConfigColor.d.ts +22 -0
  52. package/Components/JsonConfigComponent/ConfigColor.js +120 -0
  53. package/Components/JsonConfigComponent/ConfigColor.js.map +1 -0
  54. package/Components/JsonConfigComponent/ConfigCoordinates.d.ts +14 -0
  55. package/Components/JsonConfigComponent/ConfigCoordinates.js +265 -0
  56. package/Components/JsonConfigComponent/ConfigCoordinates.js.map +1 -0
  57. package/Components/JsonConfigComponent/ConfigCustom.d.ts +26 -0
  58. package/Components/JsonConfigComponent/ConfigCustom.js +316 -0
  59. package/Components/JsonConfigComponent/ConfigCustom.js.map +1 -0
  60. package/Components/JsonConfigComponent/ConfigDatePicker.d.ts +14 -0
  61. package/Components/JsonConfigComponent/ConfigDatePicker.js +91 -0
  62. package/Components/JsonConfigComponent/ConfigDatePicker.js.map +1 -0
  63. package/Components/JsonConfigComponent/ConfigDeviceManager.d.ts +6 -0
  64. package/Components/JsonConfigComponent/ConfigDeviceManager.js +18 -0
  65. package/Components/JsonConfigComponent/ConfigFile.d.ts +15 -0
  66. package/Components/JsonConfigComponent/ConfigFile.js +228 -0
  67. package/Components/JsonConfigComponent/ConfigFile.js.map +1 -0
  68. package/Components/JsonConfigComponent/ConfigFileSelector.d.ts +3 -0
  69. package/Components/JsonConfigComponent/ConfigFileSelector.js +625 -0
  70. package/Components/JsonConfigComponent/ConfigFileSelector.js.map +1 -0
  71. package/Components/JsonConfigComponent/ConfigFunc.d.ts +14 -0
  72. package/Components/JsonConfigComponent/ConfigFunc.js +124 -0
  73. package/Components/JsonConfigComponent/ConfigFunc.js.map +1 -0
  74. package/Components/JsonConfigComponent/ConfigGeneric.d.ts +95 -0
  75. package/Components/JsonConfigComponent/ConfigGeneric.js +646 -0
  76. package/Components/JsonConfigComponent/ConfigIP.d.ts +14 -0
  77. package/Components/JsonConfigComponent/ConfigIP.js +130 -0
  78. package/Components/JsonConfigComponent/ConfigIP.js.map +1 -0
  79. package/Components/JsonConfigComponent/ConfigImageSendTo.d.ts +10 -0
  80. package/Components/JsonConfigComponent/ConfigImageSendTo.js +114 -0
  81. package/Components/JsonConfigComponent/ConfigImageSendTo.js.map +1 -0
  82. package/Components/JsonConfigComponent/ConfigImageUpload.d.ts +14 -0
  83. package/Components/JsonConfigComponent/ConfigImageUpload.js +166 -0
  84. package/Components/JsonConfigComponent/ConfigImageUpload.js.map +1 -0
  85. package/Components/JsonConfigComponent/ConfigInstanceSelect.d.ts +14 -0
  86. package/Components/JsonConfigComponent/ConfigInstanceSelect.js +264 -0
  87. package/Components/JsonConfigComponent/ConfigInstanceSelect.js.map +1 -0
  88. package/Components/JsonConfigComponent/ConfigInterface.d.ts +14 -0
  89. package/Components/JsonConfigComponent/ConfigInterface.js +146 -0
  90. package/Components/JsonConfigComponent/ConfigInterface.js.map +1 -0
  91. package/Components/JsonConfigComponent/ConfigJsonEditor.d.ts +13 -0
  92. package/Components/JsonConfigComponent/ConfigJsonEditor.js +145 -0
  93. package/Components/JsonConfigComponent/ConfigJsonEditor.js.map +1 -0
  94. package/Components/JsonConfigComponent/ConfigLanguage.d.ts +7 -0
  95. package/Components/JsonConfigComponent/ConfigLanguage.js +110 -0
  96. package/Components/JsonConfigComponent/ConfigLanguage.js.map +1 -0
  97. package/Components/JsonConfigComponent/ConfigLicense.d.ts +24 -0
  98. package/Components/JsonConfigComponent/ConfigLicense.js +183 -0
  99. package/Components/JsonConfigComponent/ConfigLicense.js.map +1 -0
  100. package/Components/JsonConfigComponent/ConfigNumber.d.ts +17 -0
  101. package/Components/JsonConfigComponent/ConfigNumber.js +117 -0
  102. package/Components/JsonConfigComponent/ConfigObjectId.d.ts +17 -0
  103. package/Components/JsonConfigComponent/ConfigObjectId.js +167 -0
  104. package/Components/JsonConfigComponent/ConfigObjectId.js.map +1 -0
  105. package/Components/JsonConfigComponent/ConfigPanel.d.ts +3 -0
  106. package/Components/JsonConfigComponent/ConfigPanel.js +396 -0
  107. package/Components/JsonConfigComponent/ConfigPanel.js.map +1 -0
  108. package/Components/JsonConfigComponent/ConfigPassword.d.ts +14 -0
  109. package/Components/JsonConfigComponent/ConfigPassword.js +193 -0
  110. package/Components/JsonConfigComponent/ConfigPassword.js.map +1 -0
  111. package/Components/JsonConfigComponent/ConfigPattern.d.ts +21 -0
  112. package/Components/JsonConfigComponent/ConfigPattern.js +65 -0
  113. package/Components/JsonConfigComponent/ConfigPattern.js.map +1 -0
  114. package/Components/JsonConfigComponent/ConfigPort.d.ts +3 -0
  115. package/Components/JsonConfigComponent/ConfigPort.js +176 -0
  116. package/Components/JsonConfigComponent/ConfigRoom.d.ts +14 -0
  117. package/Components/JsonConfigComponent/ConfigRoom.js +124 -0
  118. package/Components/JsonConfigComponent/ConfigRoom.js.map +1 -0
  119. package/Components/JsonConfigComponent/ConfigSelect.d.ts +14 -0
  120. package/Components/JsonConfigComponent/ConfigSelect.js +159 -0
  121. package/Components/JsonConfigComponent/ConfigSelect.js.map +1 -0
  122. package/Components/JsonConfigComponent/ConfigSelectSendTo.d.ts +17 -0
  123. package/Components/JsonConfigComponent/ConfigSelectSendTo.js +272 -0
  124. package/Components/JsonConfigComponent/ConfigSelectSendTo.js.map +1 -0
  125. package/Components/JsonConfigComponent/ConfigSendto.d.ts +24 -0
  126. package/Components/JsonConfigComponent/ConfigSendto.js +294 -0
  127. package/Components/JsonConfigComponent/ConfigSendto.js.map +1 -0
  128. package/Components/JsonConfigComponent/ConfigSetState.d.ts +18 -0
  129. package/Components/JsonConfigComponent/ConfigSetState.js +185 -0
  130. package/Components/JsonConfigComponent/ConfigSetState.js.map +1 -0
  131. package/Components/JsonConfigComponent/ConfigSlider.d.ts +14 -0
  132. package/Components/JsonConfigComponent/ConfigSlider.js +119 -0
  133. package/Components/JsonConfigComponent/ConfigSlider.js.map +1 -0
  134. package/Components/JsonConfigComponent/ConfigStaticDivider.d.ts +14 -0
  135. package/Components/JsonConfigComponent/ConfigStaticDivider.js +68 -0
  136. package/Components/JsonConfigComponent/ConfigStaticDivider.js.map +1 -0
  137. package/Components/JsonConfigComponent/ConfigStaticHeader.d.ts +14 -0
  138. package/Components/JsonConfigComponent/ConfigStaticHeader.js +81 -0
  139. package/Components/JsonConfigComponent/ConfigStaticHeader.js.map +1 -0
  140. package/Components/JsonConfigComponent/ConfigStaticImage.d.ts +14 -0
  141. package/Components/JsonConfigComponent/ConfigStaticImage.js +71 -0
  142. package/Components/JsonConfigComponent/ConfigStaticImage.js.map +1 -0
  143. package/Components/JsonConfigComponent/ConfigStaticText.d.ts +14 -0
  144. package/Components/JsonConfigComponent/ConfigStaticText.js +88 -0
  145. package/Components/JsonConfigComponent/ConfigStaticText.js.map +1 -0
  146. package/Components/JsonConfigComponent/ConfigTable.d.ts +3 -0
  147. package/Components/JsonConfigComponent/ConfigTable.js +1064 -0
  148. package/Components/JsonConfigComponent/ConfigTable.js.map +1 -0
  149. package/Components/JsonConfigComponent/ConfigTabs.d.ts +34 -0
  150. package/Components/JsonConfigComponent/ConfigTabs.js +162 -0
  151. package/Components/JsonConfigComponent/ConfigTabs.js.map +1 -0
  152. package/Components/JsonConfigComponent/ConfigText.d.ts +14 -0
  153. package/Components/JsonConfigComponent/ConfigText.js +226 -0
  154. package/Components/JsonConfigComponent/ConfigText.js.map +1 -0
  155. package/Components/JsonConfigComponent/ConfigTextSendTo.d.ts +10 -0
  156. package/Components/JsonConfigComponent/ConfigTextSendTo.js +129 -0
  157. package/Components/JsonConfigComponent/ConfigTextSendTo.js.map +1 -0
  158. package/Components/JsonConfigComponent/ConfigTimePicker.d.ts +14 -0
  159. package/Components/JsonConfigComponent/ConfigTimePicker.js +85 -0
  160. package/Components/JsonConfigComponent/ConfigTimePicker.js.map +1 -0
  161. package/Components/JsonConfigComponent/ConfigTopic.d.ts +17 -0
  162. package/Components/JsonConfigComponent/ConfigTopic.js +110 -0
  163. package/Components/JsonConfigComponent/ConfigTopic.js.map +1 -0
  164. package/Components/JsonConfigComponent/ConfigUUID.d.ts +15 -0
  165. package/Components/JsonConfigComponent/ConfigUUID.js +95 -0
  166. package/Components/JsonConfigComponent/ConfigUUID.js.map +1 -0
  167. package/Components/JsonConfigComponent/ConfigUser.d.ts +14 -0
  168. package/Components/JsonConfigComponent/ConfigUser.js +142 -0
  169. package/Components/JsonConfigComponent/ConfigUser.js.map +1 -0
  170. package/Components/JsonConfigComponent/DeviceManager/Communication.d.ts +63 -0
  171. package/Components/JsonConfigComponent/DeviceManager/Communication.js +268 -0
  172. package/Components/JsonConfigComponent/DeviceManager/DeviceActionButton.d.ts +11 -0
  173. package/Components/JsonConfigComponent/DeviceManager/DeviceActionButton.js +15 -0
  174. package/Components/JsonConfigComponent/DeviceManager/DeviceCard.d.ts +53 -0
  175. package/Components/JsonConfigComponent/DeviceManager/DeviceCard.js +340 -0
  176. package/Components/JsonConfigComponent/DeviceManager/DeviceControl.d.ts +45 -0
  177. package/Components/JsonConfigComponent/DeviceManager/DeviceControl.js +146 -0
  178. package/Components/JsonConfigComponent/DeviceManager/DeviceImageUpload.d.ts +12 -0
  179. package/Components/JsonConfigComponent/DeviceManager/DeviceImageUpload.js +69 -0
  180. package/Components/JsonConfigComponent/DeviceManager/DeviceList.d.ts +51 -0
  181. package/Components/JsonConfigComponent/DeviceManager/DeviceList.js +226 -0
  182. package/Components/JsonConfigComponent/DeviceManager/DeviceStatus.d.ts +13 -0
  183. package/Components/JsonConfigComponent/DeviceManager/DeviceStatus.js +111 -0
  184. package/Components/JsonConfigComponent/DeviceManager/InstanceActionButton.d.ts +7 -0
  185. package/Components/JsonConfigComponent/DeviceManager/InstanceActionButton.js +16 -0
  186. package/Components/JsonConfigComponent/DeviceManager/JsonConfig.d.ts +11 -0
  187. package/Components/JsonConfigComponent/DeviceManager/JsonConfig.js +94 -0
  188. package/Components/JsonConfigComponent/DeviceManager/TooltipButton.d.ts +10 -0
  189. package/Components/JsonConfigComponent/DeviceManager/TooltipButton.js +22 -0
  190. package/Components/JsonConfigComponent/DeviceManager/Utils.d.ts +12 -0
  191. package/Components/JsonConfigComponent/DeviceManager/Utils.js +158 -0
  192. package/Components/JsonConfigComponent/DeviceManager/i18n/de.json +21 -0
  193. package/Components/JsonConfigComponent/DeviceManager/i18n/en.json +21 -0
  194. package/Components/JsonConfigComponent/DeviceManager/i18n/es.json +21 -0
  195. package/Components/JsonConfigComponent/DeviceManager/i18n/fr.json +21 -0
  196. package/Components/JsonConfigComponent/DeviceManager/i18n/i18n.d.ts +26 -0
  197. package/Components/JsonConfigComponent/DeviceManager/i18n/it.json +21 -0
  198. package/Components/JsonConfigComponent/DeviceManager/i18n/nl.json +21 -0
  199. package/Components/JsonConfigComponent/DeviceManager/i18n/pl.json +21 -0
  200. package/Components/JsonConfigComponent/DeviceManager/i18n/pt.json +21 -0
  201. package/Components/JsonConfigComponent/DeviceManager/i18n/ru.json +21 -0
  202. package/Components/JsonConfigComponent/DeviceManager/i18n/uk.json +21 -0
  203. package/Components/JsonConfigComponent/DeviceManager/i18n/zh-cn.json +21 -0
  204. package/Components/JsonConfigComponent/DeviceManager/index.d.ts +2 -0
  205. package/Components/JsonConfigComponent/DeviceManager/index.js +10 -0
  206. package/Components/JsonConfigComponent/DeviceManager/index.js.map +1 -0
  207. package/Components/JsonConfigComponent/Utils.d.ts +9 -0
  208. package/Components/JsonConfigComponent/Utils.js +13 -0
  209. package/Components/JsonConfigComponent/index.d.ts +26 -0
  210. package/Components/JsonConfigComponent/index.js +520 -0
  211. package/Components/JsonConfigComponent/index.js.map +1 -0
  212. package/Components/JsonConfigComponent/wrapper/AdminConnection.d.ts +2 -0
  213. package/Components/JsonConfigComponent/wrapper/AdminConnection.js +7 -0
  214. package/Components/JsonConfigComponent/wrapper/Components/ColorPicker.d.ts +2 -0
  215. package/Components/JsonConfigComponent/wrapper/Components/ColorPicker.js +10 -0
  216. package/Components/JsonConfigComponent/wrapper/Components/ColorPicker.js.map +1 -0
  217. package/Components/JsonConfigComponent/wrapper/Components/Icon.d.ts +2 -0
  218. package/Components/JsonConfigComponent/wrapper/Components/Icon.js +10 -0
  219. package/Components/JsonConfigComponent/wrapper/Components/Icon.js.map +1 -0
  220. package/Components/JsonConfigComponent/wrapper/Components/TextWithIcon.d.ts +2 -0
  221. package/Components/JsonConfigComponent/wrapper/Components/TextWithIcon.js +10 -0
  222. package/Components/JsonConfigComponent/wrapper/Components/TextWithIcon.js.map +1 -0
  223. package/Components/JsonConfigComponent/wrapper/Components/UploadImage.d.ts +2 -0
  224. package/Components/JsonConfigComponent/wrapper/Components/UploadImage.js +10 -0
  225. package/Components/JsonConfigComponent/wrapper/Components/UploadImage.js.map +1 -0
  226. package/Components/JsonConfigComponent/wrapper/Components/Utils.d.ts +2 -0
  227. package/Components/JsonConfigComponent/wrapper/Components/Utils.js +10 -0
  228. package/Components/JsonConfigComponent/wrapper/Components/Utils.js.map +1 -0
  229. package/Components/JsonConfigComponent/wrapper/Dialogs/Confirm.d.ts +2 -0
  230. package/Components/JsonConfigComponent/wrapper/Dialogs/Confirm.js +10 -0
  231. package/Components/JsonConfigComponent/wrapper/Dialogs/Confirm.js.map +1 -0
  232. package/Components/JsonConfigComponent/wrapper/Dialogs/Cron.d.ts +2 -0
  233. package/Components/JsonConfigComponent/wrapper/Dialogs/Cron.js +10 -0
  234. package/Components/JsonConfigComponent/wrapper/Dialogs/Cron.js.map +1 -0
  235. package/Components/JsonConfigComponent/wrapper/Dialogs/Error.d.ts +2 -0
  236. package/Components/JsonConfigComponent/wrapper/Dialogs/Error.js +10 -0
  237. package/Components/JsonConfigComponent/wrapper/Dialogs/Error.js.map +1 -0
  238. package/Components/JsonConfigComponent/wrapper/Dialogs/Message.d.ts +2 -0
  239. package/Components/JsonConfigComponent/wrapper/Dialogs/Message.js +10 -0
  240. package/Components/JsonConfigComponent/wrapper/Dialogs/Message.js.map +1 -0
  241. package/Components/JsonConfigComponent/wrapper/Dialogs/SelectFile.d.ts +2 -0
  242. package/Components/JsonConfigComponent/wrapper/Dialogs/SelectFile.js +10 -0
  243. package/Components/JsonConfigComponent/wrapper/Dialogs/SelectFile.js.map +1 -0
  244. package/Components/JsonConfigComponent/wrapper/Dialogs/SelectID.d.ts +2 -0
  245. package/Components/JsonConfigComponent/wrapper/Dialogs/SelectID.js +10 -0
  246. package/Components/JsonConfigComponent/wrapper/Dialogs/SelectID.js.map +1 -0
  247. package/Components/JsonConfigComponent/wrapper/i18n.d.ts +2 -0
  248. package/Components/JsonConfigComponent/wrapper/i18n.js +10 -0
  249. package/Components/JsonConfigComponent/wrapper/i18n.js.map +1 -0
  250. package/Components/JsonConfigComponent/wrapper/icons/IconCopy.d.ts +2 -0
  251. package/Components/JsonConfigComponent/wrapper/icons/IconCopy.js +10 -0
  252. package/Components/JsonConfigComponent/wrapper/icons/IconCopy.js.map +1 -0
  253. package/Components/Loader.js +223 -223
  254. package/Components/Loader.js.map +1 -0
  255. package/Components/Loaders/PT.css +108 -108
  256. package/Components/Loaders/PT.js +103 -103
  257. package/Components/Loaders/PT.js.map +1 -0
  258. package/Components/Loaders/Vendor.css +13 -13
  259. package/Components/Loaders/Vendor.js +7 -7
  260. package/Components/Loaders/Vendor.js.map +1 -0
  261. package/Components/Logo.js.map +1 -0
  262. package/Components/MDUtils.js.map +1 -0
  263. package/Components/ObjectBrowser.js +344 -344
  264. package/Components/ObjectBrowser.js.map +1 -1
  265. package/Components/Router.js.map +1 -0
  266. package/Components/SaveCloseButtons.js.map +1 -0
  267. package/Components/Schedule.js.map +1 -0
  268. package/Components/SelectWithIcon.js.map +1 -0
  269. package/Components/SimpleCron/cron2text.js.map +1 -0
  270. package/Components/SimpleCron/cronText.js.map +1 -0
  271. package/Components/SimpleCron/index.js.map +1 -0
  272. package/Components/SimpleCron/jquery.cron.locale.js.map +1 -0
  273. package/Components/TabContainer.js.map +1 -0
  274. package/Components/TabContent.js.map +1 -0
  275. package/Components/TabHeader.js.map +1 -0
  276. package/Components/TableResize.js +5 -5
  277. package/Components/TableResize.js.map +1 -1
  278. package/Components/TextWithIcon.js.map +1 -0
  279. package/Components/ToggleThemeMenu.js.map +1 -0
  280. package/Components/TreeTable.js +70 -70
  281. package/Components/TreeTable.js.map +1 -1
  282. package/Components/UploadImage.js +305 -305
  283. package/Components/UploadImage.js.map +1 -0
  284. package/Components/Utils.js.map +1 -0
  285. package/Components/copy-to-clipboard.d.ts +13 -0
  286. package/Components/copy-to-clipboard.js +156 -0
  287. package/Components/copy-to-clipboard.js.map +1 -0
  288. package/Components/loader.css +221 -221
  289. package/Components/types.d.ts +82 -82
  290. package/Components/withWidth.js.map +1 -1
  291. package/Connection.js.map +1 -1
  292. package/Dialogs/ComplexCron.js.map +1 -0
  293. package/Dialogs/Confirm.js.map +1 -0
  294. package/Dialogs/Cron.js.map +1 -0
  295. package/Dialogs/Error.js.map +1 -0
  296. package/Dialogs/Message.js.map +1 -0
  297. package/Dialogs/SelectFile.js.map +1 -0
  298. package/Dialogs/SelectID.js.map +1 -0
  299. package/Dialogs/SimpleCron.js.map +1 -0
  300. package/Dialogs/TextInput.js.map +1 -0
  301. package/GenericApp.d.ts +2 -2
  302. package/GenericApp.js +49 -49
  303. package/GenericApp.js.map +1 -0
  304. package/LICENSE +22 -22
  305. package/LegacyConnection.js.map +1 -0
  306. package/Prompt.js +7 -7
  307. package/Prompt.js.map +1 -0
  308. package/README.md +841 -841
  309. package/Theme.js.map +1 -0
  310. package/assets/devices/Alarm Systems.svg +18 -18
  311. package/assets/devices/Amplifier.svg +21 -21
  312. package/assets/devices/Awnings.svg +4 -4
  313. package/assets/devices/Battery Status.svg +4 -4
  314. package/assets/devices/Ceiling Spotlights.svg +15 -15
  315. package/assets/devices/Chandelier.svg +6 -6
  316. package/assets/devices/Climate.svg +11 -11
  317. package/assets/devices/Coffee Makers.svg +5 -5
  318. package/assets/devices/Cold Water.svg +31 -31
  319. package/assets/devices/Computer.svg +21 -21
  320. package/assets/devices/Consumption.svg +7 -7
  321. package/assets/devices/Curtains.svg +43 -43
  322. package/assets/devices/Dishwashers.svg +11 -11
  323. package/assets/devices/Doors.svg +5 -5
  324. package/assets/devices/Doorstep.svg +35 -35
  325. package/assets/devices/Dryer.svg +13 -13
  326. package/assets/devices/Fan.svg +20 -20
  327. package/assets/devices/Floor Lamps.svg +4 -4
  328. package/assets/devices/Garage Doors.svg +9 -9
  329. package/assets/devices/Gates.svg +32 -32
  330. package/assets/devices/Hairdryer.svg +23 -23
  331. package/assets/devices/Handle.svg +6 -6
  332. package/assets/devices/Hanging Lamps.svg +8 -8
  333. package/assets/devices/Heater.svg +44 -44
  334. package/assets/devices/Hoods.svg +11 -11
  335. package/assets/devices/Hot Water.svg +9 -9
  336. package/assets/devices/Humidity.svg +41 -41
  337. package/assets/devices/Iron.svg +4 -4
  338. package/assets/devices/Irrigation.svg +22 -22
  339. package/assets/devices/Led Strip.svg +30 -30
  340. package/assets/devices/Light.svg +29 -29
  341. package/assets/devices/Lightings.svg +46 -46
  342. package/assets/devices/Lock.svg +19 -19
  343. package/assets/devices/Louvre.svg +6 -6
  344. package/assets/devices/Mowing Machine.svg +8 -8
  345. package/assets/devices/Music.svg +12 -12
  346. package/assets/devices/Outdoor Blinds.svg +6 -6
  347. package/assets/devices/People.svg +19 -19
  348. package/assets/devices/Pool.svg +7 -7
  349. package/assets/devices/Power Consumption.svg +12 -12
  350. package/assets/devices/Printer.svg +9 -9
  351. package/assets/devices/Pump.svg +9 -9
  352. package/assets/devices/Receiver.svg +18 -18
  353. package/assets/devices/Sconces.svg +9 -9
  354. package/assets/devices/Security.svg +34 -34
  355. package/assets/devices/Shading.svg +4 -4
  356. package/assets/devices/Shutters.svg +10 -10
  357. package/assets/devices/SmokeDetector.svg +12 -12
  358. package/assets/devices/Sockets.svg +13 -13
  359. package/assets/devices/Speaker.svg +35 -35
  360. package/assets/devices/Stove.svg +11 -11
  361. package/assets/devices/Table Lamps.svg +11 -11
  362. package/assets/devices/Temperature Sensors.svg +28 -28
  363. package/assets/devices/Tv.svg +7 -7
  364. package/assets/devices/Vacuum Cleaner.svg +15 -15
  365. package/assets/devices/Ventilation.svg +12 -12
  366. package/assets/devices/Washing Machines.svg +15 -15
  367. package/assets/devices/Water Consumption.svg +5 -5
  368. package/assets/devices/Water Heater.svg +8 -8
  369. package/assets/devices/Water.svg +40 -40
  370. package/assets/devices/Weather.svg +28 -28
  371. package/assets/devices/Window.svg +7 -7
  372. package/assets/devices/list.json +993 -993
  373. package/assets/devices/names.txt +62 -62
  374. package/assets/devices/parseNames.js +34 -34
  375. package/assets/lamp_ceiling.svg +8 -8
  376. package/assets/lamp_table.svg +7 -7
  377. package/assets/no_icon.svg +9 -9
  378. package/assets/rooms/Anteroom.svg +52 -52
  379. package/assets/rooms/Attic.svg +21 -21
  380. package/assets/rooms/Balcony.svg +12 -12
  381. package/assets/rooms/Barn.svg +5 -5
  382. package/assets/rooms/Basement.svg +4 -4
  383. package/assets/rooms/Bathroom.svg +38 -38
  384. package/assets/rooms/Bedroom.svg +5 -5
  385. package/assets/rooms/Boiler Room.svg +12 -12
  386. package/assets/rooms/Carport.svg +17 -17
  387. package/assets/rooms/Cellar.svg +89 -89
  388. package/assets/rooms/Chamber.svg +9 -9
  389. package/assets/rooms/Corridor.svg +52 -52
  390. package/assets/rooms/Dining Area.svg +37 -37
  391. package/assets/rooms/Dining Room.svg +37 -37
  392. package/assets/rooms/Dining.svg +37 -37
  393. package/assets/rooms/Dressing Room.svg +4 -4
  394. package/assets/rooms/Driveway.svg +14 -14
  395. package/assets/rooms/Entrance.svg +44 -44
  396. package/assets/rooms/Equipment Room.svg +14 -14
  397. package/assets/rooms/Front Yard.svg +64 -64
  398. package/assets/rooms/Gallery.svg +13 -13
  399. package/assets/rooms/Garage.svg +20 -20
  400. package/assets/rooms/Garden.svg +12 -12
  401. package/assets/rooms/Ground Floor.svg +95 -95
  402. package/assets/rooms/Guest Bathroom.svg +32 -32
  403. package/assets/rooms/Guest Room.svg +5 -5
  404. package/assets/rooms/Gym.svg +4 -4
  405. package/assets/rooms/Hall.svg +19 -19
  406. package/assets/rooms/Home Theater.svg +7 -7
  407. package/assets/rooms/Kitchen.svg +17 -17
  408. package/assets/rooms/Laundry Room.svg +11 -11
  409. package/assets/rooms/Living Area.svg +10 -10
  410. package/assets/rooms/Living Room.svg +10 -10
  411. package/assets/rooms/Locker Room.svg +16 -16
  412. package/assets/rooms/Nursery.svg +4 -4
  413. package/assets/rooms/Office.svg +8 -8
  414. package/assets/rooms/Outdoors.svg +7 -7
  415. package/assets/rooms/Playroom.svg +5 -5
  416. package/assets/rooms/Pool.svg +7 -7
  417. package/assets/rooms/Rear Wall.svg +30 -30
  418. package/assets/rooms/Second Floor.svg +95 -95
  419. package/assets/rooms/Shed.svg +16 -16
  420. package/assets/rooms/Sleeping Area.svg +22 -22
  421. package/assets/rooms/Stairway.svg +4 -4
  422. package/assets/rooms/Stairwell.svg +15 -15
  423. package/assets/rooms/Storeroom.svg +4 -4
  424. package/assets/rooms/Summer House.svg +27 -27
  425. package/assets/rooms/Swimming Pool.svg +21 -21
  426. package/assets/rooms/Terrace.svg +6 -6
  427. package/assets/rooms/Toilet.svg +10 -10
  428. package/assets/rooms/Upstairs.svg +5 -5
  429. package/assets/rooms/Wardrobe.svg +60 -60
  430. package/assets/rooms/Washroom.svg +19 -19
  431. package/assets/rooms/Wc.svg +10 -10
  432. package/assets/rooms/Windscreen.svg +60 -60
  433. package/assets/rooms/Workshop.svg +22 -22
  434. package/assets/rooms/Workspace.svg +8 -8
  435. package/assets/rooms/list.json +945 -945
  436. package/assets/rooms/names.txt +59 -59
  437. package/assets/rooms/parseNames.js +34 -34
  438. package/craco-module-federation.js +69 -69
  439. package/i18n.js.map +1 -0
  440. package/icons/IconAdapter.js.map +1 -1
  441. package/icons/IconAlias.js.map +1 -1
  442. package/icons/IconChannel.js.map +1 -1
  443. package/icons/IconClearFilter.js.map +1 -1
  444. package/icons/IconClosed.js.map +1 -1
  445. package/icons/IconCopy.js +8 -8
  446. package/icons/IconCopy.js.map +1 -1
  447. package/icons/IconDevice.js.map +1 -1
  448. package/icons/IconDocument.js.map +1 -1
  449. package/icons/IconDocumentReadOnly.js.map +1 -1
  450. package/icons/IconExpert.js.map +1 -0
  451. package/icons/IconFx.js +1 -1
  452. package/icons/IconFx.js.map +1 -1
  453. package/icons/IconInstance.js.map +1 -1
  454. package/icons/IconLogout.js +9 -9
  455. package/icons/IconLogout.js.map +1 -1
  456. package/icons/IconNoIcon.js +8 -8
  457. package/icons/IconNoIcon.js.map +1 -1
  458. package/icons/IconOpen.js.map +1 -1
  459. package/icons/IconState.js.map +1 -1
  460. package/index.css +54 -54
  461. package/package.json +2 -2
  462. package/types.d.ts +94 -94
package/README.md CHANGED
@@ -1,1101 +1,1101 @@
1
- # Help ReactJS classes for adapter config
2
- You can find demo on https://github.com/ioBroker/adapter-react-demo
3
-
4
- ## Getting started
5
- If you want to create the configuration page with ReactJS:
6
- 1. Create github repo for adapter.
7
- 2. execute `npx create-react-app src` . It will take a while.
8
- 3. `cd src`
9
- 4. Modify package.json file in src directory:
10
- - Change `name` from `src` to `ADAPTERNAME-admin` (Of course replace `ADAPTERNAME` with yours)
11
- - Add to devDependencies:
12
- ```
13
- "@iobroker/adapter-react": "^4.0.10",
14
- ```
15
- Versions can be higher.
16
- So your src/package.json should look like:
17
- ```
18
- {
19
- "name": "ADAPTERNAME-admin",
20
- "version": "0.1.0",
21
- "private": true,
22
- "dependencies": {
23
- "react": "^18.2.0",
24
- "react-dom": "^18.2.0",
25
- "react-icons": "^4.6.0",
26
- "react-scripts": "^5.0.1",
27
- "@iobroker/adapter-react-v5": "^3.2.7",
28
- "del": "^6.1.1",
29
- "gulp": "^4.0.2"
30
- },
31
- "scripts": {
32
- "start": "react-scripts start",
33
- "build": "react-scripts build",
34
- "test": "react-scripts test",
35
- "eject": "react-scripts eject"
36
- },
37
- "eslintConfig": {
38
- "extends": "react-app"
39
- },
40
- "homepage": ".",
41
- "browserslist": [
42
- ">0.2%",
43
- "not dead",
44
- "not ie <= 11",
45
- "not op_mini all"
46
- ]
47
- }
48
- ```
49
- 5. Call in `src`: `npm install`
50
- 6. Copy gulpfile.js into `src`: `cp node_modules/@iobroker/adapter-react/gulpfile.js gulpfile.js`
51
- 7. Start your dummy application `npm run start` for developing or build with `npm run build` and
52
- copy files in `build` directory to `www` or to `admin`. In the admin you must rename `index.html` to `index_m.html`.
53
- 8. You can do that with `gulp` tasks: `gulp build`, `gulp copy`, `gulp renameIndex` or `gulp renameTab`
54
-
55
- ## Development
56
- 1. Add `socket.io` to `public/index.html`.
57
- After
58
-
59
- ```
60
- <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
61
- ```
62
-
63
- insert
64
-
65
- ```
66
- <script>
67
- var script = document.createElement('script');
68
- window.registerSocketOnLoad = function (cb) {
69
- window.socketLoadedHandler = cb;
70
- };
71
- const parts = (window.location.search || '').replace(/^\?/, '').split('&');
72
- const query = {};
73
- parts.forEach(item => {
74
- const [name, val] = item.split('=');
75
- query[decodeURIComponent(name)] = val !== undefined ? decodeURIComponent(val) : true;
76
- });
77
- script.onload = function () { typeof window.socketLoadedHandler === 'function' && window.socketLoadedHandler(); };
78
- script.src = window.location.port === '3000' ? window.location.protocol + '//' + (query.host || window.location.hostname) + ':' + (query.port || 8081) + '/lib/js/socket.io.js' : '%PUBLIC_URL%/../../lib/js/socket.io.js';
79
-
80
- document.head.appendChild(script);
81
- </script>
82
- ```
83
-
84
- 3. Add to App.js constructor initialization for I18n:
85
- ```
86
- class App extends GenericApp {
87
- constructor(props) {
88
- const extendedProps = {...props};
89
- extendedProps.encryptedFields = ['pass']; // this parameter will be encrypted and decrypted automatically
90
- extendedProps.translations = {
91
- 'en': require('./i18n/en'),
92
- 'de': require('./i18n/de'),
93
- 'ru': require('./i18n/ru'),
94
- 'pt': require('./i18n/pt'),
95
- 'nl': require('./i18n/nl'),
96
- 'fr': require('./i18n/fr'),
97
- 'it': require('./i18n/it'),
98
- 'es': require('./i18n/es'),
99
- 'pl': require('./i18n/pl'),
100
- 'uk': require('./i18n/uk'),
101
- 'zh-cn': require('./i18n/zh-cn'),
102
- };
103
- // get actual admin port
104
- extendedProps.socket = {port: parseInt(window.location.port, 10)};
105
-
106
- // Only if close, save buttons are not required at the bottom (e.g. if admin tab)
107
- // extendedProps.bottomButtons = false;
108
-
109
- // only for debug purposes
110
- if (extendedProps.socket.port === 3000) {
111
- extendedProps.socket.port = 8081;
112
- }
113
-
114
- // allow to manage GenericApp the sentry initialisation or do not set the sentryDSN if no sentry available
115
- extendedProps.sentryDSN = 'https://yyy@sentry.iobroker.net/xx';
116
-
117
- super(extendedProps);
118
- }
119
- ...
120
- }
121
- ```
122
-
123
- 4. Replace `index.js` with the following code to support themes:
124
- ```
125
- import React from 'react';
126
- import ReactDOM from 'react-dom';
127
- import { MuiThemeProvider} from '@material-ui/core/styles';
128
- import * as serviceWorker from './serviceWorker';
129
-
130
- import './index.css';
131
- import App from './App';
132
- import { version } from '../package.json';
133
-
134
- import theme from '@iobroker/adapter-react/Theme';
135
-
136
- console.log('iobroker.scenes@' + version);
137
- let themeName = window.localStorage ? window.localStorage.getItem('App.theme') || 'light' : 'light';
138
-
139
- function build() {
140
- return ReactDOM.render(<MuiThemeProvider theme={ theme(themeName) }>
141
- <App onThemeChange={_theme => {
142
- themeName = _theme;
143
- build();
144
- }}/>
145
- </MuiThemeProvider>, document.getElementById('root'));
146
- }
147
-
148
- build();
149
-
150
- // If you want your app to work offline and load faster, you can change
151
- // unregister() to register() below. Note this comes with some pitfalls.
152
- // Learn more about service workers: http://bit.ly/CRA-PWA
153
- serviceWorker.unregister();
154
- ```
155
-
156
- 5. Add to App.js encoding and decoding of values:
157
- ```
158
- class App extend GenericApp {
159
- ...
160
- onPrepareLoad(settings) {
161
- settings.pass = this.decode(settings.pass);
162
- }
163
- onPrepareSave(settings) {
164
- settings.pass = this.encode(settings.pass);
165
- }
166
- }
167
- ```
168
-
169
- 6. The optional step is to validate the data to be saved:
170
- ```
171
- onPrepareSave(settings) {
172
- super.onPrepareSave(settings);
173
- if (DATA_INVALID) {
174
- return false; // configuration will not be saved
175
- } else {
176
- return true;
177
- }
178
- }
179
- ```
180
-
181
- ## Components
182
-
183
- ### Connection.js
184
- This is a non-react class to provide the communication for socket connection with the server.
185
-
186
- ### GenericApp.tsx
187
-
188
- ### i18n.ts
189
-
190
- ### Theme.tsx
191
-
192
- ### Dialogs
193
- Some dialogs are predefined and could be used out of the box.
194
-
195
- #### Confirm.tsx
196
- <!-- TODO: Provide screenshot here -->
197
-
198
- Usage:
199
- ```
200
- import React from 'react';
201
- import ConfirmDialog from '@iobroker/adapter-react/Dialogs/Confirm'
202
- import I18n from '@iobroker/adapter-react/i18n';
203
-
204
- class ExportImportDialog extends React.Component {
205
- constructor(props) {
206
- super(props);
207
-
208
- this.state = {
209
- confirmDialog: false,
210
- };
211
- }
212
-
213
- renderConfirmDialog() {
214
- if (!this.state.confirmDialog) {
215
- return null;
216
- }
217
- return <ConfirmDialog
218
- title={ I18n.t('Scene will be overwritten.') }
219
- text={ I18n.t('All data will be lost. Confirm?') }
220
- ok={ I18n.t('Yes') }
221
- cancel={ I18n.t('Cancel') }
222
- suppressQuestionMinutes={5}
223
- dialogName="myConfirmDialogThatCouldBeSuppressed"
224
- suppressText={I18n.t('Suppress question for next %s minutes', 5)}
225
- onClose={isYes => {
226
- this.setState({ confirmDialog: false} );
227
- }}
228
- />;
229
- }
230
- render() {
231
- return <div>
232
- <Button onClick={ () => this.setState({confirmDialog: true}) }>Click</Button>
233
- { this.renderConfirmDialog() }
234
- </div>
235
- }
236
- }
237
-
238
- export default ExportImportDialog;
239
- ```
240
-
241
- #### Error.tsx
242
- <!-- TODO: Provide screenshot here -->
243
-
244
- #### Message.tsx
245
- <!-- TODO: Provide screenshot here -->
246
- ```
247
- renderMessage() {
248
- if (this.state.showMessage) {
249
- return <Message
250
- text={this.state.showMessage}
251
- onClose={() => this.setState({showMessage: false})}
252
- />;
253
- } else {
254
- return null;
255
- }
256
- }
257
- ```
258
-
259
- #### SelectID.tsx
260
- ![Logo](img/selectID.png)
261
- ```
262
- import DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';
263
-
264
- class MyComponent extends Component {
265
- constructor(props) {
266
- super(props);
267
- this.state = {
268
- showSelectId: false,
269
- };
270
- }
271
-
272
- renderSelectIdDialog() {
273
- if (this.state.showSelectId) {
274
- return <DialogSelectID
275
- key="tableSelect"
276
- imagePrefix="../.."
277
- dialogName={this.props.adapterName}
278
- themeType={this.props.themeType}
279
- socket={this.props.socket}
280
- statesOnly={true}
281
- selected={this.state.selectIdValue}
282
- onClose={() => this.setState({showSelectId: false})}
283
- onOk={(selected, name) => {
284
- this.setState({showSelectId: false, selectIdValue: selected});
285
- }}
286
- />;
287
- } else {
288
- return null;
289
- }
290
- }
291
- render() {
292
- return renderSelectIdDialog();
293
- }
294
- }
295
- ```
296
-
297
- #### Cron
298
- Include `"react-text-mask": "^5.4.3",` in package.json.
299
-
300
- <!-- TODO: Provide screenshot here -->
301
-
302
- ```
303
- function renderCron() {
304
- if (!showCron) {
305
- return null;
306
- } else {
307
- return <DialogCron
308
- key="dialogCron1"
309
- cron={this.state.cronValue || '* * * * *'}
310
- onClose={() => this.setState({ showCron: false })}
311
- onOk={cronValue => {
312
- this.setState({ cronValue })
313
- }}
314
- />;
315
- }
316
- }
317
- ```
318
-
319
- ### Components
320
-
321
- #### Utils.tsx
322
- ##### getObjectNameFromObj
323
- `getObjectNameFromObj(obj, settings, options, isDesc)`
324
-
325
- Get object name from a single object.
326
-
327
- Usage: `Utils.getObjectNameFromObj(this.objects[id], null, {language: I18n.getLanguage()})`
328
-
329
- ##### getObjectIcon
330
- `getObjectIcon(id, obj)`
331
-
332
- Get icon from the object.
333
-
334
- Usage:
335
- ```
336
- const icon = Utils.getObjectIcon(id, this.objects[id]);
337
- return (<img src={icon}/>);
338
- ```
339
-
340
- ##### isUseBright
341
- `isUseBright(color, defaultValue)`
342
-
343
- Usage: `
344
-
345
- #### Loader.tsx
346
- ![Logo](img/loader.png)
347
-
348
- ```
349
- render() {
350
- if (!this.state.loaded) {
351
- return <MuiThemeProvider theme={this.state.theme}>
352
- <Loader theme={this.state.themeType}/>
353
- </MuiThemeProvider>;
354
- }
355
- // render loaded data
356
- }
357
-
358
- ```
359
-
360
- #### Logo.tsx
361
- ![Logo](img/logo.png)
362
-
363
- ```
364
- render() {
365
- return <form className={this.props.classes.tab}>
366
- <Logo
367
- instance={this.props.instance}
368
- common={this.props.common}
369
- native={this.props.native}
370
- onError={text => this.setState({errorText: text})}
371
- onLoad={this.props.onLoad}
372
- />
373
- ...
374
- </form>;
375
- }
376
- ```
377
-
378
- #### Router.tsx
379
-
380
- #### ObjectBrowser.js
381
- It is better to use `Dialog/SelectID`, but if you want:
382
-
383
- ![Logo](img/objectBrowser.png)
384
-
385
- ```
386
- <ObjectBrowser
387
- foldersFirst={this.props.foldersFirst}
388
- imagePrefix={this.props.imagePrefix || this.props.prefix} // prefix is for back compatibility
389
- defaultFilters={this.filters}
390
- dialogName={this.dialogName}
391
- showExpertButton={this.props.showExpertButton !== undefined ? this.props.showExpertButton : true}
392
- style={{ width: '100%', height: '100%' }}
393
- columns={this.props.columns || ['name', 'type', 'role', 'room', 'func', 'val']}
394
- types={this.props.types || ['state']}
395
- t={I18n.t}
396
- lang={this.props.lang || I18n.getLanguage()}
397
- socket={this.props.socket}
398
- selected={this.state.selected}
399
- multiSelect={this.props.multiSelect}
400
- notEditable={this.props.notEditable === undefined ? true : this.props.notEditable}
401
- name={this.state.name}
402
- themeName={this.props.themeName}
403
- themeType={this.props.themeType}
404
- customFilter={this.props.customFilter}
405
- onFilterChanged={filterConfig => {
406
- this.filters = filterConfig;
407
- window.localStorage.setItem(this.dialogName, JSON.stringify(filterConfig));
408
- }}
409
- onSelect={(selected, name, isDouble) => {
410
- if (JSON.stringify(selected) !== JSON.stringify(this.state.selected)) {
411
- this.setState({selected, name}, () =>
412
- isDouble && this.handleOk());
413
- } else if (isDouble) {
414
- this.handleOk();
415
- }
416
- }}
417
- />
418
- ```
419
-
420
- #### TreeTable.js
421
- ![Logo](img/tableTree.png)
422
-
423
- ```
424
- // STYLES
425
- const styles = theme => ({
426
- tableDiv: {
427
- width: '100%',
428
- overflow: 'hidden',
429
- height: 'calc(100% - 48px)',
430
- },
431
- });
432
- class MyComponent extends Component {
433
- constructor(props) {
434
- super(props);
435
-
436
- this.state = {
437
- data: [
438
- {
439
- id: 'UniqueID1' // required
440
- fieldIdInData: 'Name1',
441
- myType: 'number',
442
- },
443
- {
444
- id: 'UniqueID2' // required
445
- fieldIdInData: 'Name12',
446
- myType: 'string',
447
- },
448
- ],
449
- };
450
-
451
- this.columns = [
452
- {
453
- title: 'Name of field', // required, else it will be "field"
454
- field: 'fieldIdInData', // required
455
- editable: false, // or true [default - true]
456
- cellStyle: { // CSS style - // optional
457
- maxWidth: '12rem',
458
- overflow: 'hidden',
459
- wordBreak: 'break-word',
460
- },
461
- lookup: { // optional => edit will be automatically "SELECT"
462
- 'value1': 'text1',
463
- 'value2': 'text2',
464
- }
465
- },
466
- {
467
- title: 'Type', // required, else it will be "field"
468
- field: 'myType', // required
469
- editable: true, // or true [default - true]
470
- lookup: { // optional => edit will be automatically "SELECT"
471
- 'number': 'Number',
472
- 'string': 'String',
473
- 'boolean': 'Boolean',
474
- },
475
- type: 'number/string/color/oid/icon/boolean', // oid=ObjectID,icon=base64-icon
476
- editComponent: props =>
477
- <div>Prefix&#123; <br/>
478
- <textarea
479
- rows={4}
480
- style={{width: '100%', resize: 'vertical'}}
481
- value={props.value}
482
- onChange={e => props.onChange(e.target.value)}
483
- />
484
- Suffix
485
- </div>,
486
- },
487
- ];
488
- }
489
- // renderTable
490
- render() {
491
- return <div className={this.props.classes.tableDiv}>
492
- <TreeTable
493
- columns={this.columns}
494
- data={this.state.data}
495
- onUpdate={(newData, oldData) => {
496
- const data = JSON.parse(JSON.stringify(this.state.data));
497
-
498
- // Added new line
499
- if (newData === true) {
500
- // find unique ID
501
- let i = 1;
502
- let id = 'line_' + i;
503
-
504
- // eslint-disable-next-line
505
- while(this.state.data.find(item => item.id === id)) {
506
- i++;
507
- id = 'line_' + i;
508
- }
509
-
510
- data.push({
511
- id,
512
- name: I18n.t('New resource') + '_' + i,
513
- color: '',
514
- icon: '',
515
- unit: '',
516
- price: 0,
517
- });
518
- } else {
519
- // existing line was modifed
520
- const pos = this.state.data.indexOf(oldData);
521
- if (pos !== -1) {
522
- Object.keys(newData).forEach(attr => data[pos][attr] = newData[attr]);
523
- }
524
- }
525
-
526
- this.setState({data});
527
- }}
528
- onDelete={oldData => {
529
- console.log('Delete: ' + JSON.stringify(oldData));
530
- const pos = this.state.data.indexOf(oldData);
531
- if (pos !== -1) {
532
- const data = JSON.parse(JSON.stringify(this.state.data));
533
- data.splice(pos, 1);
534
- this.setState({data});
535
- }
536
- }}
537
- />
538
- </div>;
539
- }
540
- }
541
- ```
542
-
543
- #### Toast
544
- <!-- TODO: Provide screenshot here -->
545
-
546
- Toast is not a part of `adapter-react` but it is an example how to use toast in application:
547
-
548
- ```
549
- import Snackbar from '@material-ui/core/Snackbar';
550
-
551
- class MyComponent {
552
- constructor(props) {
553
- super(props);
554
- this.state = {
555
- // ....
556
- toast: '',
557
- };
558
- }
559
- // ...
560
- renderToast() {
561
- if (!this.state.toast) {
562
- return null;
563
- }
564
- return <Snackbar
565
- anchorOrigin={{
566
- vertical: 'bottom',
567
- horizontal: 'left',
568
- }}
569
- open={true}
570
- autoHideDuration={6000}
571
- onClose={() => this.setState({toast: ''})}
572
- ContentProps={{'aria-describedby': 'message-id'}}
573
- message={<span id="message-id">{this.state.toast}</span>}
574
- action={[
575
- <IconButton
576
- key="close"
577
- aria-label="Close"
578
- color="inherit"
579
- className={this.props.classes.close}
580
- onClick={() => this.setState({toast: ''})}
581
- >
582
- <IconClose />
583
- </IconButton>,
584
- ]}
585
- />;
586
- }
587
- render() {
588
- return <div>
589
- {this.renderToast()}
590
- </div>;
591
- }
592
- }
593
- ```
594
-
595
- ## List of adapters that use adapter-react
596
- - Admin
597
- - iot
598
- - echarts
599
- - text2command
600
- - scenes
601
- - javascript
602
- - devices
603
- - eventlist
604
- - cameras
605
- - web
606
- - vis-2
607
- - vis-2-widgets-xxx
608
- - fullcalendar
609
- - openweathermap
610
-
611
- ## Usability
612
- In dialogs, the OK button is first (on the left) and the cancel button is last (on the right)
613
-
614
- ## Used icons
615
- This project uses icons from [Flaticon](https://www.flaticon.com/).
616
-
617
- ioBroker GmbH has a valid license for all the used icons.
618
- The icons may not be reused in other projects without the proper flaticon license or flaticon subscription.
619
-
620
- ## Migration from adapter-react to adapter-react-v5
621
- ### In src/package.json => dependencies
622
- - `"@iobroker/adapter-react": "^2.0.22",` => `"@iobroker/adapter-react-v5": "^3.1.34",`
623
- - `"@material-ui/core": "^4.12.3",` => `"@mui/material": "^5.10.9",`
624
- - `"@material-ui/icons": "^4.11.2",` => `"@mui/icons-material": "^5.10.9",`
625
- - Add `"@mui/styles": "^5.10.9",`
626
- - Add `"babel-eslint": "^10.1.0",`
627
-
628
- ### In Source files
629
- - All `@iobroker/adapter-react/...` => `@iobroker/adapter-react-v5/...`
630
- - All `@material-ui/icons/...` => `@mui/icons-material/...`
631
- - Change `import { withStyles } from '@material-ui/core/styles';` => `import { withStyles } from '@mui/styles';`
632
- - Change `import { makeStyles } from '@mui/material/styles';` => `import { makeStyles } from '@mui/styles';`
633
- - Change `import withWidth from '@material-ui/core/withWidth';` => `import { withWidth } from '@iobroker/adapter-react-v5';`
634
- - All `@material-ui/core...` => `@mui/material...`
635
- - Change `import { MuiThemeProvider } from '@material-ui/core/styles';` => `import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles';`
636
- - Change all `<MuiThemeProvider theme={this.state.theme}>` to `<StyledEngineProvider injectFirst><ThemeProvider theme={this.state.theme}>`
637
- - Rename in styles `theme.palette.type` => `theme.palette.mode`
638
- - Add to all `TextField`, `Select`, `FormControl` the property `variant="standard"`
639
- - Add to all `Button` that do not have `color` property: `color="grey"`
640
- - Replace by `TextField` the `readOnly` attribute (if exists) with `InputProps={{readOnly: true}}`
641
- - Remove px by all `theme.spacing`: `calc(100% - ${theme.spacing(4)}px)` => `calc(100% - ${theme.spacing(4)})`
642
- - Replace `this.selectTab(e.target.parentNode.dataset.name, index)` => `this.selectTab(e.target.dataset.name, index)`
643
-
644
- If you still have questions, try to find an answer [here](https://mui.com/guides/migration-v4/).
645
-
646
- ## Migration from adapter-react-v5@3.x to adapter-react-v5@4.x
647
- - Look for getObjectView socket requests and replace `socket.getObjectView('startKey', 'endKey', 'instance')` to `socket.getObjectViewSystem('instance', 'startKey', 'endKey')`
648
- - Look for calls of custom like
649
- ```
650
- this.props.socket._socket.emit('getObjectView', 'system', 'custom', {startKey: '', endKey:'\u9999'}, (err, objs) => {
651
- (objs?.rows || [])
652
- .forEach(item => console.log(item.id, item.value));
653
- });
654
- ```
655
- to
656
- ```
657
- socket.getObjectViewCustom('custom', 'state', 'startKey', 'endKey')
658
- .then(objects => {
659
- Object.keys(objects).forEach(obj => console.log(obj._id));
660
- });
661
- ```
662
- - Replace all `socket.log.error('text')` to `socket.log('text', 'error')`
663
- - Add to App.js `import { AdminConnection } from '@iobroker/adapter-react-v5';` and `super(props, { Connection: AdminConnection });` if run in admin
664
-
665
- ## Warning
666
- `react-inlinesvg@4.0.5` cannot be used. Use `react-inlinesvg@4.0.3` instead.
667
- <!--
668
- Placeholder for the next version (at the beginning of the line):
669
- ### **WORK IN PROGRESS**
670
- -->
671
-
1
+ # Help ReactJS classes for adapter config
2
+ You can find demo on https://github.com/ioBroker/adapter-react-demo
3
+
4
+ ## Getting started
5
+ If you want to create the configuration page with ReactJS:
6
+ 1. Create github repo for adapter.
7
+ 2. execute `npx create-react-app src` . It will take a while.
8
+ 3. `cd src`
9
+ 4. Modify package.json file in src directory:
10
+ - Change `name` from `src` to `ADAPTERNAME-admin` (Of course replace `ADAPTERNAME` with yours)
11
+ - Add to devDependencies:
12
+ ```
13
+ "@iobroker/adapter-react": "^4.0.10",
14
+ ```
15
+ Versions can be higher.
16
+ So your src/package.json should look like:
17
+ ```
18
+ {
19
+ "name": "ADAPTERNAME-admin",
20
+ "version": "0.1.0",
21
+ "private": true,
22
+ "dependencies": {
23
+ "react": "^18.2.0",
24
+ "react-dom": "^18.2.0",
25
+ "react-icons": "^4.6.0",
26
+ "react-scripts": "^5.0.1",
27
+ "@iobroker/adapter-react-v5": "^3.2.7",
28
+ "del": "^6.1.1",
29
+ "gulp": "^4.0.2"
30
+ },
31
+ "scripts": {
32
+ "start": "react-scripts start",
33
+ "build": "react-scripts build",
34
+ "test": "react-scripts test",
35
+ "eject": "react-scripts eject"
36
+ },
37
+ "eslintConfig": {
38
+ "extends": "react-app"
39
+ },
40
+ "homepage": ".",
41
+ "browserslist": [
42
+ ">0.2%",
43
+ "not dead",
44
+ "not ie <= 11",
45
+ "not op_mini all"
46
+ ]
47
+ }
48
+ ```
49
+ 5. Call in `src`: `npm install`
50
+ 6. Copy gulpfile.js into `src`: `cp node_modules/@iobroker/adapter-react/gulpfile.js gulpfile.js`
51
+ 7. Start your dummy application `npm run start` for developing or build with `npm run build` and
52
+ copy files in `build` directory to `www` or to `admin`. In the admin you must rename `index.html` to `index_m.html`.
53
+ 8. You can do that with `gulp` tasks: `gulp build`, `gulp copy`, `gulp renameIndex` or `gulp renameTab`
54
+
55
+ ## Development
56
+ 1. Add `socket.io` to `public/index.html`.
57
+ After
58
+
59
+ ```
60
+ <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
61
+ ```
62
+
63
+ insert
64
+
65
+ ```
66
+ <script>
67
+ var script = document.createElement('script');
68
+ window.registerSocketOnLoad = function (cb) {
69
+ window.socketLoadedHandler = cb;
70
+ };
71
+ const parts = (window.location.search || '').replace(/^\?/, '').split('&');
72
+ const query = {};
73
+ parts.forEach(item => {
74
+ const [name, val] = item.split('=');
75
+ query[decodeURIComponent(name)] = val !== undefined ? decodeURIComponent(val) : true;
76
+ });
77
+ script.onload = function () { typeof window.socketLoadedHandler === 'function' && window.socketLoadedHandler(); };
78
+ script.src = window.location.port === '3000' ? window.location.protocol + '//' + (query.host || window.location.hostname) + ':' + (query.port || 8081) + '/lib/js/socket.io.js' : '%PUBLIC_URL%/../../lib/js/socket.io.js';
79
+
80
+ document.head.appendChild(script);
81
+ </script>
82
+ ```
83
+
84
+ 3. Add to App.js constructor initialization for I18n:
85
+ ```
86
+ class App extends GenericApp {
87
+ constructor(props) {
88
+ const extendedProps = {...props};
89
+ extendedProps.encryptedFields = ['pass']; // this parameter will be encrypted and decrypted automatically
90
+ extendedProps.translations = {
91
+ 'en': require('./i18n/en'),
92
+ 'de': require('./i18n/de'),
93
+ 'ru': require('./i18n/ru'),
94
+ 'pt': require('./i18n/pt'),
95
+ 'nl': require('./i18n/nl'),
96
+ 'fr': require('./i18n/fr'),
97
+ 'it': require('./i18n/it'),
98
+ 'es': require('./i18n/es'),
99
+ 'pl': require('./i18n/pl'),
100
+ 'uk': require('./i18n/uk'),
101
+ 'zh-cn': require('./i18n/zh-cn'),
102
+ };
103
+ // get actual admin port
104
+ extendedProps.socket = {port: parseInt(window.location.port, 10)};
105
+
106
+ // Only if close, save buttons are not required at the bottom (e.g. if admin tab)
107
+ // extendedProps.bottomButtons = false;
108
+
109
+ // only for debug purposes
110
+ if (extendedProps.socket.port === 3000) {
111
+ extendedProps.socket.port = 8081;
112
+ }
113
+
114
+ // allow to manage GenericApp the sentry initialisation or do not set the sentryDSN if no sentry available
115
+ extendedProps.sentryDSN = 'https://yyy@sentry.iobroker.net/xx';
116
+
117
+ super(extendedProps);
118
+ }
119
+ ...
120
+ }
121
+ ```
122
+
123
+ 4. Replace `index.js` with the following code to support themes:
124
+ ```
125
+ import React from 'react';
126
+ import ReactDOM from 'react-dom';
127
+ import { MuiThemeProvider} from '@material-ui/core/styles';
128
+ import * as serviceWorker from './serviceWorker';
129
+
130
+ import './index.css';
131
+ import App from './App';
132
+ import { version } from '../package.json';
133
+
134
+ import theme from '@iobroker/adapter-react/Theme';
135
+
136
+ console.log('iobroker.scenes@' + version);
137
+ let themeName = window.localStorage ? window.localStorage.getItem('App.theme') || 'light' : 'light';
138
+
139
+ function build() {
140
+ return ReactDOM.render(<MuiThemeProvider theme={ theme(themeName) }>
141
+ <App onThemeChange={_theme => {
142
+ themeName = _theme;
143
+ build();
144
+ }}/>
145
+ </MuiThemeProvider>, document.getElementById('root'));
146
+ }
147
+
148
+ build();
149
+
150
+ // If you want your app to work offline and load faster, you can change
151
+ // unregister() to register() below. Note this comes with some pitfalls.
152
+ // Learn more about service workers: http://bit.ly/CRA-PWA
153
+ serviceWorker.unregister();
154
+ ```
155
+
156
+ 5. Add to App.js encoding and decoding of values:
157
+ ```
158
+ class App extend GenericApp {
159
+ ...
160
+ onPrepareLoad(settings) {
161
+ settings.pass = this.decode(settings.pass);
162
+ }
163
+ onPrepareSave(settings) {
164
+ settings.pass = this.encode(settings.pass);
165
+ }
166
+ }
167
+ ```
168
+
169
+ 6. The optional step is to validate the data to be saved:
170
+ ```
171
+ onPrepareSave(settings) {
172
+ super.onPrepareSave(settings);
173
+ if (DATA_INVALID) {
174
+ return false; // configuration will not be saved
175
+ } else {
176
+ return true;
177
+ }
178
+ }
179
+ ```
180
+
181
+ ## Components
182
+
183
+ ### Connection.js
184
+ This is a non-react class to provide the communication for socket connection with the server.
185
+
186
+ ### GenericApp.tsx
187
+
188
+ ### i18n.ts
189
+
190
+ ### Theme.tsx
191
+
192
+ ### Dialogs
193
+ Some dialogs are predefined and could be used out of the box.
194
+
195
+ #### Confirm.tsx
196
+ <!-- TODO: Provide screenshot here -->
197
+
198
+ Usage:
199
+ ```
200
+ import React from 'react';
201
+ import ConfirmDialog from '@iobroker/adapter-react/Dialogs/Confirm'
202
+ import I18n from '@iobroker/adapter-react/i18n';
203
+
204
+ class ExportImportDialog extends React.Component {
205
+ constructor(props) {
206
+ super(props);
207
+
208
+ this.state = {
209
+ confirmDialog: false,
210
+ };
211
+ }
212
+
213
+ renderConfirmDialog() {
214
+ if (!this.state.confirmDialog) {
215
+ return null;
216
+ }
217
+ return <ConfirmDialog
218
+ title={ I18n.t('Scene will be overwritten.') }
219
+ text={ I18n.t('All data will be lost. Confirm?') }
220
+ ok={ I18n.t('Yes') }
221
+ cancel={ I18n.t('Cancel') }
222
+ suppressQuestionMinutes={5}
223
+ dialogName="myConfirmDialogThatCouldBeSuppressed"
224
+ suppressText={I18n.t('Suppress question for next %s minutes', 5)}
225
+ onClose={isYes => {
226
+ this.setState({ confirmDialog: false} );
227
+ }}
228
+ />;
229
+ }
230
+ render() {
231
+ return <div>
232
+ <Button onClick={ () => this.setState({confirmDialog: true}) }>Click</Button>
233
+ { this.renderConfirmDialog() }
234
+ </div>
235
+ }
236
+ }
237
+
238
+ export default ExportImportDialog;
239
+ ```
240
+
241
+ #### Error.tsx
242
+ <!-- TODO: Provide screenshot here -->
243
+
244
+ #### Message.tsx
245
+ <!-- TODO: Provide screenshot here -->
246
+ ```
247
+ renderMessage() {
248
+ if (this.state.showMessage) {
249
+ return <Message
250
+ text={this.state.showMessage}
251
+ onClose={() => this.setState({showMessage: false})}
252
+ />;
253
+ } else {
254
+ return null;
255
+ }
256
+ }
257
+ ```
258
+
259
+ #### SelectID.tsx
260
+ ![Logo](img/selectID.png)
261
+ ```
262
+ import DialogSelectID from '@iobroker/adapter-react/Dialogs/SelectID';
263
+
264
+ class MyComponent extends Component {
265
+ constructor(props) {
266
+ super(props);
267
+ this.state = {
268
+ showSelectId: false,
269
+ };
270
+ }
271
+
272
+ renderSelectIdDialog() {
273
+ if (this.state.showSelectId) {
274
+ return <DialogSelectID
275
+ key="tableSelect"
276
+ imagePrefix="../.."
277
+ dialogName={this.props.adapterName}
278
+ themeType={this.props.themeType}
279
+ socket={this.props.socket}
280
+ statesOnly={true}
281
+ selected={this.state.selectIdValue}
282
+ onClose={() => this.setState({showSelectId: false})}
283
+ onOk={(selected, name) => {
284
+ this.setState({showSelectId: false, selectIdValue: selected});
285
+ }}
286
+ />;
287
+ } else {
288
+ return null;
289
+ }
290
+ }
291
+ render() {
292
+ return renderSelectIdDialog();
293
+ }
294
+ }
295
+ ```
296
+
297
+ #### Cron
298
+ Include `"react-text-mask": "^5.4.3",` in package.json.
299
+
300
+ <!-- TODO: Provide screenshot here -->
301
+
302
+ ```
303
+ function renderCron() {
304
+ if (!showCron) {
305
+ return null;
306
+ } else {
307
+ return <DialogCron
308
+ key="dialogCron1"
309
+ cron={this.state.cronValue || '* * * * *'}
310
+ onClose={() => this.setState({ showCron: false })}
311
+ onOk={cronValue => {
312
+ this.setState({ cronValue })
313
+ }}
314
+ />;
315
+ }
316
+ }
317
+ ```
318
+
319
+ ### Components
320
+
321
+ #### Utils.tsx
322
+ ##### getObjectNameFromObj
323
+ `getObjectNameFromObj(obj, settings, options, isDesc)`
324
+
325
+ Get object name from a single object.
326
+
327
+ Usage: `Utils.getObjectNameFromObj(this.objects[id], null, {language: I18n.getLanguage()})`
328
+
329
+ ##### getObjectIcon
330
+ `getObjectIcon(id, obj)`
331
+
332
+ Get icon from the object.
333
+
334
+ Usage:
335
+ ```
336
+ const icon = Utils.getObjectIcon(id, this.objects[id]);
337
+ return (<img src={icon}/>);
338
+ ```
339
+
340
+ ##### isUseBright
341
+ `isUseBright(color, defaultValue)`
342
+
343
+ Usage: `
344
+
345
+ #### Loader.tsx
346
+ ![Logo](img/loader.png)
347
+
348
+ ```
349
+ render() {
350
+ if (!this.state.loaded) {
351
+ return <MuiThemeProvider theme={this.state.theme}>
352
+ <Loader theme={this.state.themeType}/>
353
+ </MuiThemeProvider>;
354
+ }
355
+ // render loaded data
356
+ }
357
+
358
+ ```
359
+
360
+ #### Logo.tsx
361
+ ![Logo](img/logo.png)
362
+
363
+ ```
364
+ render() {
365
+ return <form className={this.props.classes.tab}>
366
+ <Logo
367
+ instance={this.props.instance}
368
+ common={this.props.common}
369
+ native={this.props.native}
370
+ onError={text => this.setState({errorText: text})}
371
+ onLoad={this.props.onLoad}
372
+ />
373
+ ...
374
+ </form>;
375
+ }
376
+ ```
377
+
378
+ #### Router.tsx
379
+
380
+ #### ObjectBrowser.js
381
+ It is better to use `Dialog/SelectID`, but if you want:
382
+
383
+ ![Logo](img/objectBrowser.png)
384
+
385
+ ```
386
+ <ObjectBrowser
387
+ foldersFirst={this.props.foldersFirst}
388
+ imagePrefix={this.props.imagePrefix || this.props.prefix} // prefix is for back compatibility
389
+ defaultFilters={this.filters}
390
+ dialogName={this.dialogName}
391
+ showExpertButton={this.props.showExpertButton !== undefined ? this.props.showExpertButton : true}
392
+ style={{ width: '100%', height: '100%' }}
393
+ columns={this.props.columns || ['name', 'type', 'role', 'room', 'func', 'val']}
394
+ types={this.props.types || ['state']}
395
+ t={I18n.t}
396
+ lang={this.props.lang || I18n.getLanguage()}
397
+ socket={this.props.socket}
398
+ selected={this.state.selected}
399
+ multiSelect={this.props.multiSelect}
400
+ notEditable={this.props.notEditable === undefined ? true : this.props.notEditable}
401
+ name={this.state.name}
402
+ themeName={this.props.themeName}
403
+ themeType={this.props.themeType}
404
+ customFilter={this.props.customFilter}
405
+ onFilterChanged={filterConfig => {
406
+ this.filters = filterConfig;
407
+ window.localStorage.setItem(this.dialogName, JSON.stringify(filterConfig));
408
+ }}
409
+ onSelect={(selected, name, isDouble) => {
410
+ if (JSON.stringify(selected) !== JSON.stringify(this.state.selected)) {
411
+ this.setState({selected, name}, () =>
412
+ isDouble && this.handleOk());
413
+ } else if (isDouble) {
414
+ this.handleOk();
415
+ }
416
+ }}
417
+ />
418
+ ```
419
+
420
+ #### TreeTable.js
421
+ ![Logo](img/tableTree.png)
422
+
423
+ ```
424
+ // STYLES
425
+ const styles = theme => ({
426
+ tableDiv: {
427
+ width: '100%',
428
+ overflow: 'hidden',
429
+ height: 'calc(100% - 48px)',
430
+ },
431
+ });
432
+ class MyComponent extends Component {
433
+ constructor(props) {
434
+ super(props);
435
+
436
+ this.state = {
437
+ data: [
438
+ {
439
+ id: 'UniqueID1' // required
440
+ fieldIdInData: 'Name1',
441
+ myType: 'number',
442
+ },
443
+ {
444
+ id: 'UniqueID2' // required
445
+ fieldIdInData: 'Name12',
446
+ myType: 'string',
447
+ },
448
+ ],
449
+ };
450
+
451
+ this.columns = [
452
+ {
453
+ title: 'Name of field', // required, else it will be "field"
454
+ field: 'fieldIdInData', // required
455
+ editable: false, // or true [default - true]
456
+ cellStyle: { // CSS style - // optional
457
+ maxWidth: '12rem',
458
+ overflow: 'hidden',
459
+ wordBreak: 'break-word',
460
+ },
461
+ lookup: { // optional => edit will be automatically "SELECT"
462
+ 'value1': 'text1',
463
+ 'value2': 'text2',
464
+ }
465
+ },
466
+ {
467
+ title: 'Type', // required, else it will be "field"
468
+ field: 'myType', // required
469
+ editable: true, // or true [default - true]
470
+ lookup: { // optional => edit will be automatically "SELECT"
471
+ 'number': 'Number',
472
+ 'string': 'String',
473
+ 'boolean': 'Boolean',
474
+ },
475
+ type: 'number/string/color/oid/icon/boolean', // oid=ObjectID,icon=base64-icon
476
+ editComponent: props =>
477
+ <div>Prefix&#123; <br/>
478
+ <textarea
479
+ rows={4}
480
+ style={{width: '100%', resize: 'vertical'}}
481
+ value={props.value}
482
+ onChange={e => props.onChange(e.target.value)}
483
+ />
484
+ Suffix
485
+ </div>,
486
+ },
487
+ ];
488
+ }
489
+ // renderTable
490
+ render() {
491
+ return <div className={this.props.classes.tableDiv}>
492
+ <TreeTable
493
+ columns={this.columns}
494
+ data={this.state.data}
495
+ onUpdate={(newData, oldData) => {
496
+ const data = JSON.parse(JSON.stringify(this.state.data));
497
+
498
+ // Added new line
499
+ if (newData === true) {
500
+ // find unique ID
501
+ let i = 1;
502
+ let id = 'line_' + i;
503
+
504
+ // eslint-disable-next-line
505
+ while(this.state.data.find(item => item.id === id)) {
506
+ i++;
507
+ id = 'line_' + i;
508
+ }
509
+
510
+ data.push({
511
+ id,
512
+ name: I18n.t('New resource') + '_' + i,
513
+ color: '',
514
+ icon: '',
515
+ unit: '',
516
+ price: 0,
517
+ });
518
+ } else {
519
+ // existing line was modifed
520
+ const pos = this.state.data.indexOf(oldData);
521
+ if (pos !== -1) {
522
+ Object.keys(newData).forEach(attr => data[pos][attr] = newData[attr]);
523
+ }
524
+ }
525
+
526
+ this.setState({data});
527
+ }}
528
+ onDelete={oldData => {
529
+ console.log('Delete: ' + JSON.stringify(oldData));
530
+ const pos = this.state.data.indexOf(oldData);
531
+ if (pos !== -1) {
532
+ const data = JSON.parse(JSON.stringify(this.state.data));
533
+ data.splice(pos, 1);
534
+ this.setState({data});
535
+ }
536
+ }}
537
+ />
538
+ </div>;
539
+ }
540
+ }
541
+ ```
542
+
543
+ #### Toast
544
+ <!-- TODO: Provide screenshot here -->
545
+
546
+ Toast is not a part of `adapter-react` but it is an example how to use toast in application:
547
+
548
+ ```
549
+ import Snackbar from '@material-ui/core/Snackbar';
550
+
551
+ class MyComponent {
552
+ constructor(props) {
553
+ super(props);
554
+ this.state = {
555
+ // ....
556
+ toast: '',
557
+ };
558
+ }
559
+ // ...
560
+ renderToast() {
561
+ if (!this.state.toast) {
562
+ return null;
563
+ }
564
+ return <Snackbar
565
+ anchorOrigin={{
566
+ vertical: 'bottom',
567
+ horizontal: 'left',
568
+ }}
569
+ open={true}
570
+ autoHideDuration={6000}
571
+ onClose={() => this.setState({toast: ''})}
572
+ ContentProps={{'aria-describedby': 'message-id'}}
573
+ message={<span id="message-id">{this.state.toast}</span>}
574
+ action={[
575
+ <IconButton
576
+ key="close"
577
+ aria-label="Close"
578
+ color="inherit"
579
+ className={this.props.classes.close}
580
+ onClick={() => this.setState({toast: ''})}
581
+ >
582
+ <IconClose />
583
+ </IconButton>,
584
+ ]}
585
+ />;
586
+ }
587
+ render() {
588
+ return <div>
589
+ {this.renderToast()}
590
+ </div>;
591
+ }
592
+ }
593
+ ```
594
+
595
+ ## List of adapters that use adapter-react
596
+ - Admin
597
+ - iot
598
+ - echarts
599
+ - text2command
600
+ - scenes
601
+ - javascript
602
+ - devices
603
+ - eventlist
604
+ - cameras
605
+ - web
606
+ - vis-2
607
+ - vis-2-widgets-xxx
608
+ - fullcalendar
609
+ - openweathermap
610
+
611
+ ## Usability
612
+ In dialogs, the OK button is first (on the left) and the cancel button is last (on the right)
613
+
614
+ ## Used icons
615
+ This project uses icons from [Flaticon](https://www.flaticon.com/).
616
+
617
+ ioBroker GmbH has a valid license for all the used icons.
618
+ The icons may not be reused in other projects without the proper flaticon license or flaticon subscription.
619
+
620
+ ## Migration from adapter-react to adapter-react-v5
621
+ ### In src/package.json => dependencies
622
+ - `"@iobroker/adapter-react": "^2.0.22",` => `"@iobroker/adapter-react-v5": "^3.1.34",`
623
+ - `"@material-ui/core": "^4.12.3",` => `"@mui/material": "^5.10.9",`
624
+ - `"@material-ui/icons": "^4.11.2",` => `"@mui/icons-material": "^5.10.9",`
625
+ - Add `"@mui/styles": "^5.10.9",`
626
+ - Add `"babel-eslint": "^10.1.0",`
627
+
628
+ ### In Source files
629
+ - All `@iobroker/adapter-react/...` => `@iobroker/adapter-react-v5/...`
630
+ - All `@material-ui/icons/...` => `@mui/icons-material/...`
631
+ - Change `import { withStyles } from '@material-ui/core/styles';` => `import { withStyles } from '@mui/styles';`
632
+ - Change `import { makeStyles } from '@mui/material/styles';` => `import { makeStyles } from '@mui/styles';`
633
+ - Change `import withWidth from '@material-ui/core/withWidth';` => `import { withWidth } from '@iobroker/adapter-react-v5';`
634
+ - All `@material-ui/core...` => `@mui/material...`
635
+ - Change `import { MuiThemeProvider } from '@material-ui/core/styles';` => `import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles';`
636
+ - Change all `<MuiThemeProvider theme={this.state.theme}>` to `<StyledEngineProvider injectFirst><ThemeProvider theme={this.state.theme}>`
637
+ - Rename in styles `theme.palette.type` => `theme.palette.mode`
638
+ - Add to all `TextField`, `Select`, `FormControl` the property `variant="standard"`
639
+ - Add to all `Button` that do not have `color` property: `color="grey"`
640
+ - Replace by `TextField` the `readOnly` attribute (if exists) with `InputProps={{readOnly: true}}`
641
+ - Remove px by all `theme.spacing`: `calc(100% - ${theme.spacing(4)}px)` => `calc(100% - ${theme.spacing(4)})`
642
+ - Replace `this.selectTab(e.target.parentNode.dataset.name, index)` => `this.selectTab(e.target.dataset.name, index)`
643
+
644
+ If you still have questions, try to find an answer [here](https://mui.com/guides/migration-v4/).
645
+
646
+ ## Migration from adapter-react-v5@3.x to adapter-react-v5@4.x
647
+ - Look for getObjectView socket requests and replace `socket.getObjectView('startKey', 'endKey', 'instance')` to `socket.getObjectViewSystem('instance', 'startKey', 'endKey')`
648
+ - Look for calls of custom like
649
+ ```
650
+ this.props.socket._socket.emit('getObjectView', 'system', 'custom', {startKey: '', endKey:'\u9999'}, (err, objs) => {
651
+ (objs?.rows || [])
652
+ .forEach(item => console.log(item.id, item.value));
653
+ });
654
+ ```
655
+ to
656
+ ```
657
+ socket.getObjectViewCustom('custom', 'state', 'startKey', 'endKey')
658
+ .then(objects => {
659
+ Object.keys(objects).forEach(obj => console.log(obj._id));
660
+ });
661
+ ```
662
+ - Replace all `socket.log.error('text')` to `socket.log('text', 'error')`
663
+ - Add to App.js `import { AdminConnection } from '@iobroker/adapter-react-v5';` and `super(props, { Connection: AdminConnection });` if run in admin
664
+
665
+ ## Warning
666
+ `react-inlinesvg@4.0.5` cannot be used. Use `react-inlinesvg@4.0.3` instead.
667
+ <!--
668
+ Placeholder for the next version (at the beginning of the line):
669
+ ### **WORK IN PROGRESS**
670
+ -->
671
+
672
672
  ## Changelog
673
- ### 4.13.1 (2024-03-30)
673
+ ### 4.13.3 (2024-04-01)
674
674
  * (bluefox) used new connection classes
675
675
 
676
- ### 4.12.3 (2024-03-30)
676
+ ### 4.12.3 (2024-03-30)
677
677
  * (bluefox) Migrated legacy connection to typescript
678
678
 
679
- ### 4.12.2 (2024-03-25)
679
+ ### 4.12.2 (2024-03-25)
680
680
  * (bluefox) Added support for remote cloud
681
681
 
682
- ### 4.11.6 (2024-03-19)
682
+ ### 4.11.6 (2024-03-19)
683
683
  * (bluefox) Corrected rendering of LoaderMV
684
684
 
685
- ### 4.11.4 (2024-03-18)
685
+ ### 4.11.4 (2024-03-18)
686
686
  * (bluefox) Corrected types of IconPicker
687
687
 
688
- ### 4.11.3 (2024-03-17)
688
+ ### 4.11.3 (2024-03-17)
689
689
  * (bluefox) Made filters for the file selector dialog optional
690
690
 
691
- ### 4.11.2 (2024-03-16)
691
+ ### 4.11.2 (2024-03-16)
692
692
  * (bluefox) Migrated GenericApp to typescript
693
693
 
694
- ### 4.10.4 (2024-03-16)
694
+ ### 4.10.4 (2024-03-16)
695
695
  * (bluefox) Migrated some components to typescript
696
696
 
697
- ### 4.10.1 (2024-03-11)
697
+ ### 4.10.1 (2024-03-11)
698
698
  * (bluefox) Migrated some components to typescript
699
699
 
700
- ### 4.9.11 (2024-03-08)
700
+ ### 4.9.11 (2024-03-08)
701
701
  * (foxriver76) type GenericApp socket correctly
702
702
 
703
- ### 4.9.10 (2024-02-21)
704
- * (bluefox) translations
703
+ ### 4.9.10 (2024-02-21)
704
+ * (bluefox) translations
705
705
  * (bluefox) updated json config
706
706
 
707
- ### 4.9.9 (2024-02-16)
707
+ ### 4.9.9 (2024-02-16)
708
708
  * (foxriver76) also check plugin state of instance to see if Sentry is explicitly disabled
709
709
 
710
- ### 4.9.8 (2024-02-13)
710
+ ### 4.9.8 (2024-02-13)
711
711
  * (bluefox) allowed hiding wizard in cron dialog
712
712
 
713
- ### 4.9.7 (2024-02-03)
713
+ ### 4.9.7 (2024-02-03)
714
714
  * (foxriver76) allow passing down the instance number do avoid determining from url
715
715
 
716
- ### 4.9.5 (2024-01-01)
716
+ ### 4.9.5 (2024-01-01)
717
717
  * (foxriver76) make `copyToClipboard` event parameter optional
718
718
 
719
- ### 4.9.4 (2024-01-01)
719
+ ### 4.9.4 (2024-01-01)
720
720
  * (foxriver76) try to fix `SelectID` scrolling
721
721
 
722
- ### 4.9.2 (2023-12-30)
722
+ ### 4.9.2 (2023-12-30)
723
723
  * (foxriver76) bump version of `@iobroker/json-config`
724
724
 
725
- ### 4.9.1 (2023-12-22)
725
+ ### 4.9.1 (2023-12-22)
726
726
  * (foxriver76) `@iobroker/json-config` moved to real dependencies
727
727
 
728
- ### 4.9.0 (2023-12-22)
729
- * (foxriver76) migrate to `@iobroker/json-config` module to have a single point of truth
728
+ ### 4.9.0 (2023-12-22)
729
+ * (foxriver76) migrate to `@iobroker/json-config` module to have a single point of truth
730
730
  * (bluefox) Allowed using of `filterFunc` as string
731
731
 
732
- ### 4.8.1 (2023-12-14)
732
+ ### 4.8.1 (2023-12-14)
733
733
  * (bluefox) Added Device manager to JSON Config
734
734
 
735
- ### 4.7.15 (2023-12-12)
735
+ ### 4.7.15 (2023-12-12)
736
736
  * (bluefox) Corrected parsing of a text
737
737
 
738
- ### 4.7.13 (2023-12-10)
738
+ ### 4.7.13 (2023-12-10)
739
739
  * (bluefox) Added possibility to define the root style and embedded property
740
740
 
741
- ### 4.7.11 (2023-12-06)
741
+ ### 4.7.11 (2023-12-06)
742
742
  * (bluefox) Extended color picker with "noInputField" option
743
743
 
744
- ### 4.7.9 (2023-12-04)
744
+ ### 4.7.9 (2023-12-04)
745
745
  * (bluefox) Corrected the icon picker
746
746
 
747
- ### 4.7.8 (2023-12-04)
747
+ ### 4.7.8 (2023-12-04)
748
748
  * (foxriver76) port to `@iobroker/types`
749
749
 
750
- ### 4.7.6 (2023-11-29)
750
+ ### 4.7.6 (2023-11-29)
751
751
  * (bluefox) Added translations
752
752
 
753
- ### 4.7.5 (2023-11-28)
753
+ ### 4.7.5 (2023-11-28)
754
754
  * (bluefox) Corrected subscribe on objects in the legacy connection
755
755
 
756
- ### 4.7.4 (2023-11-23)
757
- * (bluefox) Updated packages
756
+ ### 4.7.4 (2023-11-23)
757
+ * (bluefox) Updated packages
758
758
  * (bluefox) Made getStates method in legacy connection compatible with new one
759
759
 
760
- ### 4.7.3 (2023-11-08)
760
+ ### 4.7.3 (2023-11-08)
761
761
  * (bluefox) Updated packages
762
762
 
763
- ### 4.7.2 (2023-11-03)
764
- * (foxriver76) fixed problem with color picker, where editing TextField was buggy
763
+ ### 4.7.2 (2023-11-03)
764
+ * (foxriver76) fixed problem with color picker, where editing TextField was buggy
765
765
  * (foxriver76) fixed light mode color of a path in FileBrowser
766
766
 
767
- ### 4.7.0 (2023-10-31)
768
- * (bluefox) Synced with admin
767
+ ### 4.7.0 (2023-10-31)
768
+ * (bluefox) Synced with admin
769
769
  * (bluefox) Added GIF to image files
770
770
 
771
- ### 4.6.7 (2023-10-19)
771
+ ### 4.6.7 (2023-10-19)
772
772
  * (bluefox) Added return value for `subscribeOnInstance` for Connection class
773
773
 
774
- ### 4.6.6 (2023-10-13)
774
+ ### 4.6.6 (2023-10-13)
775
775
  * (bluefox) Fixed the legacy connection
776
776
 
777
- ### 4.6.5 (2023-10-12)
777
+ ### 4.6.5 (2023-10-12)
778
778
  * (foxriver76) fixed object browser with date
779
779
 
780
- ### 4.6.4 (2023-10-11)
780
+ ### 4.6.4 (2023-10-11)
781
781
  * (bluefox) Updated the packages
782
782
 
783
- ### 4.6.3 (2023-10-09)
784
- * (bluefox) Just updated the packages
783
+ ### 4.6.3 (2023-10-09)
784
+ * (bluefox) Just updated the packages
785
785
  * (bluefox) Synced with admin
786
786
 
787
- ### 4.6.2 (2023-09-29)
787
+ ### 4.6.2 (2023-09-29)
788
788
  * (bluefox) Experimental feature added: update states on re-subscribe
789
789
 
790
- ### 4.5.5 (2023-09-27)
790
+ ### 4.5.5 (2023-09-27)
791
791
  * (bluefox) Added export for IconNoIcon
792
792
 
793
- ### 4.5.4 (2023-09-17)
793
+ ### 4.5.4 (2023-09-17)
794
794
  * (bluefox) Added the restricting to folder property for select file dialog
795
795
 
796
- ### 4.5.3 (2023-08-20)
796
+ ### 4.5.3 (2023-08-20)
797
797
  * (foxriver76) fixed css classes of TableResize, see https://github.com/ioBroker/ioBroker.admin/issues/1860
798
798
 
799
- ### 4.5.2 (2023-08-20)
799
+ ### 4.5.2 (2023-08-20)
800
800
  * (foxriver76) added missing export of TableResize
801
801
 
802
- ### 4.5.1 (2023-08-19)
802
+ ### 4.5.1 (2023-08-19)
803
803
  * (foxriver76) fix dialog TextInput
804
804
 
805
- ### 4.5.0 (2023-08-18)
805
+ ### 4.5.0 (2023-08-18)
806
806
  * (bluefox) Synchronize components with admin
807
807
 
808
- ### 4.4.8 (2023-08-17)
808
+ ### 4.4.8 (2023-08-17)
809
809
  * (bluefox) Added translations
810
810
 
811
- ### 4.4.7 (2023-08-10)
812
- * (bluefox) Added `subscribeStateAsync` method to wait for answer
811
+ ### 4.4.7 (2023-08-10)
812
+ * (bluefox) Added `subscribeStateAsync` method to wait for answer
813
813
  * (bluefox) Added support for arrays for un/subscriptions
814
814
 
815
- ### 4.4.5 (2023-08-01)
815
+ ### 4.4.5 (2023-08-01)
816
816
  * (bluefox) Updated packages
817
817
 
818
- ### 4.3.3 (2023-07-28)
818
+ ### 4.3.3 (2023-07-28)
819
819
  * (bluefox) Added translations
820
820
 
821
- ### 4.3.0 (2023-07-19)
822
- * (bluefox) Updated packages
823
- * (bluefox) Added translations
824
- * (bluefox) Synced object browser
821
+ ### 4.3.0 (2023-07-19)
822
+ * (bluefox) Updated packages
823
+ * (bluefox) Added translations
824
+ * (bluefox) Synced object browser
825
825
  * (bluefox) formatting
826
826
 
827
- ### 4.2.1 (2023-07-17)
828
- * (bluefox) Updated packages
827
+ ### 4.2.1 (2023-07-17)
828
+ * (bluefox) Updated packages
829
829
  * (bluefox) Added translations
830
830
 
831
- ### 4.2.0 (2023-07-07)
832
- * (bluefox) Updated packages
831
+ ### 4.2.0 (2023-07-07)
832
+ * (bluefox) Updated packages
833
833
  * (bluefox) Added new method `getObjectsById` to the socket communication
834
834
 
835
- ### 4.1.2 (2023-06-20)
835
+ ### 4.1.2 (2023-06-20)
836
836
  * (bluefox) Allowed setting theme name directly by theme toggle
837
837
 
838
- ### 4.1.0 (2023-05-10)
838
+ ### 4.1.0 (2023-05-10)
839
839
  * (bluefox) `craco-module-federation.js` was added. For node 16
840
840
 
841
- ### 4.0.27 (2023-05-09)
841
+ ### 4.0.27 (2023-05-09)
842
842
  * (bluefox) Allowed showing only specific root in SelectIDDialog
843
843
 
844
- ### 4.0.26 (2023-05-08)
844
+ ### 4.0.26 (2023-05-08)
845
845
  * (bluefox) Added IDs to the buttons in the dialog for GUI tests
846
846
 
847
- ### 4.0.25 (2023-04-23)
847
+ ### 4.0.25 (2023-04-23)
848
848
  * (bluefox) Extended `TextWithIcon` with defined color and icon
849
849
 
850
- ### 4.0.24 (2023-04-03)
850
+ ### 4.0.24 (2023-04-03)
851
851
  * (bluefox) Updated the file selector in tile mode
852
852
 
853
- ### 4.0.23 (2023-03-27)
853
+ ### 4.0.23 (2023-03-27)
854
854
  * (bluefox) Added translations
855
855
 
856
- ### 4.0.22 (2023-03-22)
856
+ ### 4.0.22 (2023-03-22)
857
857
  * (bluefox) Re-Activate legacy connection
858
858
 
859
- ### 4.0.21 (2023-03-22)
859
+ ### 4.0.21 (2023-03-22)
860
860
  * (bluefox) Added translations
861
861
 
862
- ### 4.0.20 (2023-03-21)
862
+ ### 4.0.20 (2023-03-21)
863
863
  * (bluefox) Color picker was improved
864
864
 
865
- ### 4.0.19 (2023-03-20)
866
- * (bluefox) Packages were updated
865
+ ### 4.0.19 (2023-03-20)
866
+ * (bluefox) Packages were updated
867
867
  * (bluefox) Added new translations
868
868
 
869
- ### 4.0.18 (2023-03-16)
869
+ ### 4.0.18 (2023-03-16)
870
870
  * (bluefox) Packages were updated
871
871
 
872
- ### 4.0.17 (2023-03-15)
873
- * (bluefox) Added translations
872
+ ### 4.0.17 (2023-03-15)
873
+ * (bluefox) Added translations
874
874
  * (bluefox) Added port controller to JSON config
875
875
 
876
- ### 4.0.15 (2023-03-12)
876
+ ### 4.0.15 (2023-03-12)
877
877
  * (bluefox) Updated the object browser and file browser
878
878
 
879
- ### 4.0.14 (2023-03-03)
879
+ ### 4.0.14 (2023-03-03)
880
880
  * (bluefox) added handler of alert messages
881
881
 
882
- ### 4.0.13 (2023-02-15)
882
+ ### 4.0.13 (2023-02-15)
883
883
  * (bluefox) Corrected the theme button
884
884
 
885
- ### 4.0.12 (2023-02-15)
885
+ ### 4.0.12 (2023-02-15)
886
886
  * (bluefox) made the fix for `echarts`
887
887
 
888
- ### 4.0.11 (2023-02-14)
889
- * (bluefox) Updated packages
888
+ ### 4.0.11 (2023-02-14)
889
+ * (bluefox) Updated packages
890
890
  * (bluefox) The `chartReady` event was omitted
891
891
 
892
- ### 4.0.10 (2023-02-10)
893
- * (bluefox) Updated packages
892
+ ### 4.0.10 (2023-02-10)
893
+ * (bluefox) Updated packages
894
894
  * (bluefox) made the fix for `material`
895
895
 
896
- ### 4.0.9 (2023-02-02)
896
+ ### 4.0.9 (2023-02-02)
897
897
  * (bluefox) Updated packages
898
898
 
899
- ### 4.0.8 (2022-12-19)
899
+ ### 4.0.8 (2022-12-19)
900
900
  * (bluefox) Extended socket with `log` command
901
901
 
902
- ### 4.0.6 (2022-12-19)
902
+ ### 4.0.6 (2022-12-19)
903
903
  * (bluefox) Corrected URL for the connection
904
904
 
905
- ### 4.0.5 (2022-12-14)
905
+ ### 4.0.5 (2022-12-14)
906
906
  * (bluefox) Added support of custom palette for color picker
907
907
 
908
- ### 4.0.2 (2022-12-01)
908
+ ### 4.0.2 (2022-12-01)
909
909
  * (bluefox) use `@iobroker/socket-client` instead of `Connection.js`
910
910
 
911
- ### 3.5.3 (2022-11-30)
911
+ ### 3.5.3 (2022-11-30)
912
912
  * (bluefox) Improved `renderTextWithA` function to support `<b>` and `<i>` tags
913
913
 
914
- ### 3.5.2 (2022-11-30)
914
+ ### 3.5.2 (2022-11-30)
915
915
  * (bluefox) updated json config component
916
916
 
917
- ### 3.4.1 (2022-11-29)
917
+ ### 3.4.1 (2022-11-29)
918
918
  * (bluefox) Added button text for message dialog
919
919
 
920
- ### 3.4.0 (2022-11-29)
920
+ ### 3.4.0 (2022-11-29)
921
921
  * (bluefox) Added file selector
922
922
 
923
- ### 3.3.0 (2022-11-26)
923
+ ### 3.3.0 (2022-11-26)
924
924
  * (bluefox) Added subscribe on files
925
925
 
926
- ### 3.2.7 (2022-11-13)
926
+ ### 3.2.7 (2022-11-13)
927
927
  * (bluefox) Added `fullWidth` property to `Dialog`
928
928
 
929
- ### 3.2.6 (2022-11-08)
929
+ ### 3.2.6 (2022-11-08)
930
930
  * (xXBJXx) Improved TreeTable component
931
931
 
932
- ### 3.2.5 (2022-11-08)
932
+ ### 3.2.5 (2022-11-08)
933
933
  * (bluefox) Added the role filter for the object browser
934
934
 
935
- ### 3.2.4 (2022-11-03)
935
+ ### 3.2.4 (2022-11-03)
936
936
  * (bluefox) Added support for alfa channel for `invertColor`
937
937
 
938
- ### 3.2.3 (2022-10-26)
938
+ ### 3.2.3 (2022-10-26)
939
939
  * (bluefox) Corrected expert mode for object browser
940
940
 
941
- ### 3.2.2 (2022-10-25)
941
+ ### 3.2.2 (2022-10-25)
942
942
  * (bluefox) Added support for prefixes for translations
943
943
 
944
- ### 3.2.1 (2022-10-24)
944
+ ### 3.2.1 (2022-10-24)
945
945
  * (bluefox) Corrected color inversion
946
946
 
947
- ### 3.2.0 (2022-10-19)
947
+ ### 3.2.0 (2022-10-19)
948
948
  * (bluefox) Added ukrainian translation
949
949
 
950
- ### 3.1.35 (2022-10-17)
950
+ ### 3.1.35 (2022-10-17)
951
951
  * (bluefox) small changes for material
952
952
 
953
- ### 3.1.34 (2022-08-24)
953
+ ### 3.1.34 (2022-08-24)
954
954
  * (bluefox) Implemented fallback to english by translations
955
955
 
956
- ### 3.1.33 (2022-08-24)
956
+ ### 3.1.33 (2022-08-24)
957
957
  * (bluefox) Added support for onchange flag
958
958
 
959
- ### 3.1.30 (2022-08-23)
960
- * (bluefox) Added method `getCompactSystemRepositories`
959
+ ### 3.1.30 (2022-08-23)
960
+ * (bluefox) Added method `getCompactSystemRepositories`
961
961
  * (bluefox) corrected error in `ObjectBrowser`
962
962
 
963
- ### 3.1.27 (2022-08-01)
963
+ ### 3.1.27 (2022-08-01)
964
964
  * (bluefox) Disable file editing in FileViewer
965
965
 
966
- ### 3.1.26 (2022-08-01)
967
- * (bluefox) Added translations
966
+ ### 3.1.26 (2022-08-01)
967
+ * (bluefox) Added translations
968
968
  * (bluefox) JSON schema was extended with missing definitions
969
969
 
970
- ### 3.1.24 (2022-07-28)
970
+ ### 3.1.24 (2022-07-28)
971
971
  * (bluefox) Updated file browser and object browser
972
972
 
973
- ### 3.1.23 (2022-07-25)
973
+ ### 3.1.23 (2022-07-25)
974
974
  * (bluefox) Extend custom filter for object selector
975
975
 
976
- ### 3.1.22 (2022-07-22)
976
+ ### 3.1.22 (2022-07-22)
977
977
  * (bluefox) Added i18n tools for development
978
978
 
979
- ### 3.1.20 (2022-07-14)
979
+ ### 3.1.20 (2022-07-14)
980
980
  * (bluefox) Allowed to show select dialog with the expert mode enabled
981
981
 
982
- ### 3.1.19 (2022-07-08)
982
+ ### 3.1.19 (2022-07-08)
983
983
  * (bluefox) Allowed extending translations for all languages together
984
984
 
985
- ### 3.1.18 (2022-07-06)
985
+ ### 3.1.18 (2022-07-06)
986
986
  * (bluefox) Added translation
987
987
 
988
- ### 3.1.17 (2022-07-05)
988
+ ### 3.1.17 (2022-07-05)
989
989
  * (bluefox) Deactivate JSON editor for JSONConfig because of space
990
990
 
991
- ### 3.1.16 (2022-06-27)
991
+ ### 3.1.16 (2022-06-27)
992
992
  * (bluefox) Update object browser
993
993
 
994
- ### 3.1.15 (2022-06-27)
994
+ ### 3.1.15 (2022-06-27)
995
995
  * (bluefox) Allowed using of spaces in name
996
996
 
997
- ### 3.1.14 (2022-06-23)
997
+ ### 3.1.14 (2022-06-23)
998
998
  * (bluefox) Added translations
999
999
 
1000
- ### 3.1.11 (2022-06-22)
1000
+ ### 3.1.11 (2022-06-22)
1001
1001
  * (bluefox) Added preparations for iobroker cloud
1002
1002
 
1003
- ### 3.1.10 (2022-06-22)
1003
+ ### 3.1.10 (2022-06-22)
1004
1004
  * (bluefox) Added translations
1005
1005
 
1006
- ### 3.1.9 (2022-06-20)
1006
+ ### 3.1.9 (2022-06-20)
1007
1007
  * (bluefox) Allowed working behind reverse proxy
1008
1008
 
1009
- ### 3.1.7 (2022-06-19)
1009
+ ### 3.1.7 (2022-06-19)
1010
1010
  * (bluefox) Added file select dialog
1011
1011
 
1012
- ### 3.1.3 (2022-06-13)
1012
+ ### 3.1.3 (2022-06-13)
1013
1013
  * (bluefox) Added table with resized headers
1014
1014
 
1015
- ### 3.1.2 (2022-06-09)
1015
+ ### 3.1.2 (2022-06-09)
1016
1016
  * (bluefox) Added new document icon (read only)
1017
1017
 
1018
- ### 3.1.1 (2022-06-09)
1018
+ ### 3.1.1 (2022-06-09)
1019
1019
  * (bluefox) Allowed working behind reverse proxy
1020
1020
 
1021
- ### 3.1.0 (2022-06-07)
1021
+ ### 3.1.0 (2022-06-07)
1022
1022
  * (bluefox) Some german texts were corrected
1023
1023
 
1024
- ### 3.0.17 (2022-06-03)
1024
+ ### 3.0.17 (2022-06-03)
1025
1025
  * (bluefox) Allowed calling getAdapterInstances not for admin too
1026
1026
 
1027
- ### 3.0.15 (2022-06-01)
1027
+ ### 3.0.15 (2022-06-01)
1028
1028
  * (bluefox) Updated JsonConfigComponent: password, table
1029
1029
 
1030
- ### 3.0.14 (2022-05-25)
1030
+ ### 3.0.14 (2022-05-25)
1031
1031
  * (bluefox) Added ConfigGeneric to import
1032
1032
 
1033
- ### 3.0.7 (2022-05-25)
1033
+ ### 3.0.7 (2022-05-25)
1034
1034
  * (bluefox) Made the module definitions
1035
1035
 
1036
- ### 3.0.6 (2022-05-25)
1036
+ ### 3.0.6 (2022-05-25)
1037
1037
  * (bluefox) Added JsonConfigComponent
1038
1038
 
1039
- ### 2.1.11 (2022-05-24)
1039
+ ### 2.1.11 (2022-05-24)
1040
1040
  * (bluefox) Update file browser. It supports now the file changed events.
1041
1041
 
1042
- ### 2.1.10 (2022-05-24)
1042
+ ### 2.1.10 (2022-05-24)
1043
1043
  * (bluefox) Corrected object browser
1044
1044
 
1045
- ### 2.1.9 (2022-05-16)
1045
+ ### 2.1.9 (2022-05-16)
1046
1046
  * (bluefox) Corrected expert mode in object browser
1047
1047
 
1048
- ### 2.1.7 (2022-05-09)
1049
- * (bluefox) Changes were synchronized with adapter-react-v5
1048
+ ### 2.1.7 (2022-05-09)
1049
+ * (bluefox) Changes were synchronized with adapter-react-v5
1050
1050
  * (bluefox) Added `I18n.disableWarning` method
1051
1051
 
1052
- ### 2.1.6 (2022-03-28)
1053
- * (bluefox) Added `log` method to connection
1052
+ ### 2.1.6 (2022-03-28)
1053
+ * (bluefox) Added `log` method to connection
1054
1054
  * (bluefox) Corrected translations
1055
1055
 
1056
- ### 2.1.1 (2022-03-27)
1056
+ ### 2.1.1 (2022-03-27)
1057
1057
  * (bluefox) Corrected error in TreeTable
1058
1058
 
1059
- ### 2.1.0 (2022-03-26)
1059
+ ### 2.1.0 (2022-03-26)
1060
1060
  * (bluefox) BREAKING_CHANGE: Corrected error with readFile(base64=false)
1061
1061
 
1062
- ### 2.0.0 (2022-03-26)
1062
+ ### 2.0.0 (2022-03-26)
1063
1063
  * (bluefox) Initial version
1064
1064
 
1065
- ### 0.1.0 (2022-03-23)
1065
+ ### 0.1.0 (2022-03-23)
1066
1066
  * (bluefox) Fixed theme errors
1067
1067
 
1068
- ### 0.0.4 (2022-03-22)
1068
+ ### 0.0.4 (2022-03-22)
1069
1069
  * (bluefox) Fixed eslint warnings
1070
1070
 
1071
- ### 0.0.3 (2022-03-19)
1071
+ ### 0.0.3 (2022-03-19)
1072
1072
  * (bluefox) beta version
1073
1073
 
1074
- ### 0.0.2 (2022-02-24)
1074
+ ### 0.0.2 (2022-02-24)
1075
1075
  * (bluefox) try to publish a first version
1076
1076
 
1077
- ### 0.0.1 (2022-02-24)
1077
+ ### 0.0.1 (2022-02-24)
1078
1078
  * initial commit
1079
1079
 
1080
- ## License
1081
- The MIT License (MIT)
1082
-
1083
- Copyright (c) 2019-2024 bluefox <dogafox@gmail.com>
1084
-
1085
- Permission is hereby granted, free of charge, to any person obtaining a copy
1086
- of this software and associated documentation files (the "Software"), to deal
1087
- in the Software without restriction, including without limitation the rights
1088
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1089
- copies of the Software, and to permit persons to whom the Software is
1090
- furnished to do so, subject to the following conditions:
1091
-
1092
- The above copyright notice and this permission notice shall be included in all
1093
- copies or substantial portions of the Software.
1094
-
1095
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1096
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1097
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1098
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1099
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1100
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1080
+ ## License
1081
+ The MIT License (MIT)
1082
+
1083
+ Copyright (c) 2019-2024 bluefox <dogafox@gmail.com>
1084
+
1085
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1086
+ of this software and associated documentation files (the "Software"), to deal
1087
+ in the Software without restriction, including without limitation the rights
1088
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1089
+ copies of the Software, and to permit persons to whom the Software is
1090
+ furnished to do so, subject to the following conditions:
1091
+
1092
+ The above copyright notice and this permission notice shall be included in all
1093
+ copies or substantial portions of the Software.
1094
+
1095
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1096
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1097
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1098
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1099
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1100
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1101
1101
  SOFTWARE.