From a41dc719650bbf0be69fc08a3dfa95a47cb03306 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 4 Mar 2023 19:14:25 +0100 Subject: [PATCH 01/15] test --- interface/index.html | 2 +- interface/package.json | 8 +- interface/src/project/SettingsScheduler.tsx | 202 +++++++++++++++----- interface/src/project/types.ts | 8 +- interface/src/project/validators.ts | 11 +- interface/yarn.lock | 164 ++++++++++++++-- mock-api/server.js | 22 +-- pio_local.ini_example | 17 +- src/system.cpp | 2 +- src/version.h | 2 +- src/web/WebSchedulerService.cpp | 67 ++++--- src/web/WebSchedulerService.h | 4 +- 12 files changed, 373 insertions(+), 136 deletions(-) diff --git a/interface/index.html b/interface/index.html index 4f115b0e6..602add36a 100644 --- a/interface/index.html +++ b/interface/index.html @@ -2,7 +2,7 @@ - + EMS-ESP diff --git a/interface/package.json b/interface/package.json index 1a9a3caea..779215c71 100644 --- a/interface/package.json +++ b/interface/package.json @@ -27,7 +27,7 @@ "@remix-run/router": "^1.3.3", "@table-library/react-table-library": "4.0.29", "@types/lodash-es": "^4.17.6", - "@types/node": "^18.14.5", + "@types/node": "^18.14.6", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-router-dom": "^5.3.3", @@ -38,17 +38,19 @@ "lodash-es": "^4.17.21", "mime-types": "^2.1.35", "notistack": "^2.0.8", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "latest", + "react-dom": "latest", "react-dropzone": "^14.2.3", "react-icons": "^4.8.0", "react-router-dom": "^6.8.2", "sockette": "^2.0.6", + "styled-components": "^5.3.8", "typesafe-i18n": "^5.24.2", "typescript": "^4.9.5" }, "devDependencies": { "@types/mime-types": "^2", + "@types/styled-components": "^5", "@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/parser": "^5.54.0", "@vitejs/plugin-react-swc": "^3.2.0", diff --git a/interface/src/project/SettingsScheduler.tsx b/interface/src/project/SettingsScheduler.tsx index ddf0e740c..31d2ce41d 100644 --- a/interface/src/project/SettingsScheduler.tsx +++ b/interface/src/project/SettingsScheduler.tsx @@ -5,6 +5,8 @@ import { Button, Typography, Box, + Stack, + Paper, Dialog, DialogActions, DialogContent, @@ -19,6 +21,11 @@ import { FormControlLabel } from '@mui/material'; +// import { styled } from '@mui/material/styles'; + +import styled from 'styled-components'; + + import { useTheme } from '@table-library/react-table-library/theme'; import { Table, Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; @@ -52,6 +59,31 @@ import { useI18nContext } from 'i18n/i18n-react'; import * as EMSESP from './api'; +interface ItemProps { + enabled: boolean; +} + +const Item = styled(Paper)(({ color, theme }) => ({ + // backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', + ...theme.typography.body2, + textAlign: 'center', + // color: ${({enabled}) => enabled ? 'red' : 'green'}; + fontSize: 10, + padding: '6px 12px', + border: '1px solid', + lineHeight: 1.5, + backgroundColor: '#1A2027', + borderColor: '#1A2027', + // color: theme.palette.text.secondary, +})); + +const Item2 = styled.paper` +fontSize: 10; +color: ${props => props.enabled ? 'red' : 'green'}; +`; + + + const SettingsScheduler: FC = () => { const { LL, locale } = useI18nContext(); @@ -68,8 +100,8 @@ const SettingsScheduler: FC = () => { time: '12:00', cmd: '', value: '', - description: '', - o_id: '' + name: '', + o_name: '' }; const [schedule, setSchedule] = useState([emptySchedule]); const [scheduleItem, setScheduleItem] = useState(); @@ -97,7 +129,7 @@ const SettingsScheduler: FC = () => { const schedule_theme = useTheme({ Table: ` - --data-table-library_grid-template-columns: 152px 36px 324px 72px 240px repeat(1, minmax(100px, 1fr)); + --data-table-library_grid-template-columns: 36px 324px 72px 240px repeat(1, minmax(100px, 1fr)) 152px; `, BaseRow: ` font-size: 14px; @@ -106,12 +138,12 @@ const SettingsScheduler: FC = () => { } `, BaseCell: ` - &:nth-of-type(1) { - padding: 8px; - } &:nth-of-type(2) { text-align: center; } + &:nth-of-type(1) { + text-align: center; + } `, HeaderRow: ` text-transform: uppercase; @@ -171,7 +203,7 @@ const SettingsScheduler: FC = () => { o_time: si.time, o_cmd: si.cmd, o_value: si.value, - o_description: si.description + o_name: si.name })) ); }; @@ -216,7 +248,7 @@ const SettingsScheduler: FC = () => { function hasScheduleChanged(si: ScheduleItem) { return ( si.id !== si.o_id || - (si?.description || '') !== (si?.o_description || '') || + (si?.name || '') !== (si?.o_name || '') || si.active !== si.o_active || si.deleted !== si.o_deleted || si.flags !== si.o_flags || @@ -247,7 +279,7 @@ const SettingsScheduler: FC = () => { time: condensed_si.time, cmd: condensed_si.cmd, value: condensed_si.value, - description: condensed_si.description + name: condensed_si.name }; }) }); @@ -263,6 +295,35 @@ const SettingsScheduler: FC = () => { } }; + function getFlagName(si: ScheduleItem, flag: number) { + let text = ''; + if ((flag & ScheduleFlag.SCHEDULE_MON) === ScheduleFlag.SCHEDULE_MON) { + return dow[1]; + } + if ((flag & ScheduleFlag.SCHEDULE_TUE) === ScheduleFlag.SCHEDULE_TUE) { + return dow[2]; + } + if ((flag & ScheduleFlag.SCHEDULE_WED) === ScheduleFlag.SCHEDULE_WED) { + return dow[3]; + } + if ((flag & ScheduleFlag.SCHEDULE_THU) === ScheduleFlag.SCHEDULE_THU) { + return dow[4]; + } + if ((flag & ScheduleFlag.SCHEDULE_FRI) === ScheduleFlag.SCHEDULE_FRI) { + return dow[5]; + } + if ((flag & ScheduleFlag.SCHEDULE_SAT) === ScheduleFlag.SCHEDULE_SAT) { + return dow[6]; + } + if ((flag & ScheduleFlag.SCHEDULE_SUN) === ScheduleFlag.SCHEDULE_SUN) { + return dow[0]; + } + if ((flag & ScheduleFlag.SCHEDULE_TIMER) === ScheduleFlag.SCHEDULE_TIMER) { + return LL.TIMER(); + } + return ""; + } + function showFlag(si: ScheduleItem, flag: number) { let text = ''; if ((flag & ScheduleFlag.SCHEDULE_MON) === ScheduleFlag.SCHEDULE_MON) { @@ -291,15 +352,24 @@ const SettingsScheduler: FC = () => { } return ( + <> + + {/* */} + + {text} + + ); } const editScheduleItem = (si: ScheduleItem) => { - if (si.description === undefined) { - si.description = ''; + if (si.name === undefined) { + si.name = ''; } setCreating(false); setScheduleItem(si); @@ -315,7 +385,7 @@ const SettingsScheduler: FC = () => { time: '12:00', cmd: '', value: '', - description: '' + name: '' }); }; @@ -339,20 +409,19 @@ const SettingsScheduler: FC = () => { <>
- {LL.NAME()} {LL.SCHEDULE()} {LL.TIME()} {LL.COMMAND()} - {LL.VALUE(0)} + {LL.VALUE(0)} + {LL.NAME()}
{tableList.map((si: ScheduleItem) => ( editScheduleItem(si)}> - {si.id} { /> - { - si.flags = getFlagNumber(flag); - if (si.flags & ScheduleFlag.SCHEDULE_TIMER) { - si.flags = ScheduleFlag.SCHEDULE_TIMER; - } - setFlags(['']); // forces refresh - }} - > - {showFlag(si, ScheduleFlag.SCHEDULE_MON)} - {showFlag(si, ScheduleFlag.SCHEDULE_TUE)} - {showFlag(si, ScheduleFlag.SCHEDULE_WED)} - {showFlag(si, ScheduleFlag.SCHEDULE_THU)} - {showFlag(si, ScheduleFlag.SCHEDULE_FRI)} - {showFlag(si, ScheduleFlag.SCHEDULE_SAT)} - {showFlag(si, ScheduleFlag.SCHEDULE_SUN)} - {showFlag(si, ScheduleFlag.SCHEDULE_TIMER)} - + + + + {getFlagName(si, ScheduleFlag.SCHEDULE_MON)} + + {getFlagName(si, ScheduleFlag.SCHEDULE_TUE)} + + + + + + + {/* {showFlag(si, ScheduleFlag.SCHEDULE_MON)} + {showFlag(si, ScheduleFlag.SCHEDULE_TUE)} + {showFlag(si, ScheduleFlag.SCHEDULE_WED)} + {showFlag(si, ScheduleFlag.SCHEDULE_THU)} + {showFlag(si, ScheduleFlag.SCHEDULE_FRI)} + {showFlag(si, ScheduleFlag.SCHEDULE_SAT)} + {showFlag(si, ScheduleFlag.SCHEDULE_SUN)} + {showFlag(si, ScheduleFlag.SCHEDULE_TIMER)} */} + + {si.time} {si.cmd} {si.value} + {si.name} ))} @@ -426,19 +506,38 @@ const SettingsScheduler: FC = () => { return ( closeDialog()}> - {creating ? LL.ADD(0) + ' ' + LL.NEW() + ' ' + LL.SCHEDULE() : LL.EDIT() + " '" + scheduleItem.id + "'"} + {creating ? LL.ADD(0) : LL.EDIT()} {LL.SCHEDULE()} - + + { + const flags = getFlagNumber(flag); + if (flags & ScheduleFlag.SCHEDULE_TIMER) { + console.log('timer'); + scheduleItem.flags = ScheduleFlag.SCHEDULE_TIMER; + } else { + console.log("daily"); + scheduleItem.flags = getFlagNumber(flag) & 127; + console.log( scheduleItem.flags); + } + setFlags(['']); // forces refresh + }} + > + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_MON)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_TUE)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_WED)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_THU)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_FRI)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_SAT)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_SUN)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_TIMER)} + + + {creating ? ( { {LL.TYPE()}: {scheduleItem.flags & ScheduleFlag.SCHEDULE_TIMER ? LL.TIMER() : LL.WEEKLY()} )} - export const schedulerItemValidation = (schedule: ScheduleItem[], o_id: string) => new Schema({ - id: [ - { required: true, message: 'Name is required' }, + name: [ { type: 'string', pattern: /^[a-zA-Z0-9_\\.]{1,15}$/, message: "Must be 1-15 characters: alpha numeric, '_' or '.'" }, - ...[uniqueIDValidator(schedule, o_id)] + ...[uniqueNameValidator(schedule, o_id)] ], cmd: [ { required: true, message: 'Command is required' }, @@ -102,9 +101,9 @@ export const schedulerItemValidation = (schedule: ScheduleItem[], o_id: string) ] }); -export const uniqueIDValidator = (schedule: ScheduleItem[], o_id: string) => ({ - validator(rule: InternalRuleItem, id: string, callback: (error?: string) => void) { - if (id && o_id !== id && schedule.find((si) => si.id === id)) { +export const uniqueNameValidator = (schedule: ScheduleItem[], o_name: string) => ({ + validator(rule: InternalRuleItem, name: string, callback: (error?: string) => void) { + if (name && o_name !== name && schedule.find((si) => si.name === name)) { callback('Name already in use'); } else { callback(); diff --git a/interface/yarn.lock b/interface/yarn.lock index a6d505958..9c621ea3a 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -66,6 +66,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.16.0": + version: 7.18.6 + resolution: "@babel/helper-annotate-as-pure@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: 88ccd15ced475ef2243fdd3b2916a29ea54c5db3cd0cfabf9d1d29ff6e63b7f7cd1c27264137d7a40ac2e978b9b9a542c332e78f40eb72abe737a7400788fc1b + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.20.7": version: 7.20.7 resolution: "@babel/helper-compilation-targets@npm:7.20.7" @@ -107,7 +116,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.18.6": +"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.16.0, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-module-imports@npm:7.18.6" dependencies: @@ -222,7 +231,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2": +"@babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.4.5": version: 7.21.2 resolution: "@babel/traverse@npm:7.21.2" dependencies: @@ -290,7 +299,7 @@ __metadata: languageName: node linkType: hard -"@emotion/is-prop-valid@npm:^1.2.0": +"@emotion/is-prop-valid@npm:^1.1.0, @emotion/is-prop-valid@npm:^1.2.0": version: 1.2.0 resolution: "@emotion/is-prop-valid@npm:1.2.0" dependencies: @@ -367,6 +376,20 @@ __metadata: languageName: node linkType: hard +"@emotion/stylis@npm:^0.8.4": + version: 0.8.5 + resolution: "@emotion/stylis@npm:0.8.5" + checksum: 67ff5958449b2374b329fb96e83cb9025775ffe1e79153b499537c6c8b2eb64b77f32d7b5d004d646973662356ceb646afd9269001b97c54439fceea3203ce65 + languageName: node + linkType: hard + +"@emotion/unitless@npm:^0.7.4": + version: 0.7.5 + resolution: "@emotion/unitless@npm:0.7.5" + checksum: f976e5345b53fae9414a7b2e7a949aa6b52f8bdbcc84458b1ddc0729e77ba1d1dfdff9960e0da60183877873d3a631fa24d9695dd714ed94bcd3ba5196586a6b + languageName: node + linkType: hard + "@emotion/unitless@npm:^0.8.0": version: 0.8.0 resolution: "@emotion/unitless@npm:0.8.0" @@ -1201,6 +1224,16 @@ __metadata: languageName: node linkType: hard +"@types/hoist-non-react-statics@npm:*": + version: 3.3.1 + resolution: "@types/hoist-non-react-statics@npm:3.3.1" + dependencies: + "@types/react": "*" + hoist-non-react-statics: ^3.3.0 + checksum: 2c0778570d9a01d05afabc781b32163f28409bb98f7245c38d5eaf082416fdb73034003f5825eb5e21313044e8d2d9e1f3fe2831e345d3d1b1d20bcd12270719 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -1238,10 +1271,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.14.5": - version: 18.14.5 - resolution: "@types/node@npm:18.14.5" - checksum: 415fb0edc132baa9580f1b7a381a3f10b662f5d7a7d11641917fa0961788ccede3272badc414aadc47306e9fc35c5f6c59159ac470b46d3f3a15fb0446224c8c +"@types/node@npm:^18.14.6": + version: 18.14.6 + resolution: "@types/node@npm:18.14.6" + checksum: 2f88f482cabadc6dbddd627a1674239e68c3c9beab56eb4ae2309fb96fd17fc3a509d99b0309bafe13b58529574f49ecf3a583f2ebe2896dd32fe4be436dc96e languageName: node linkType: hard @@ -1332,6 +1365,17 @@ __metadata: languageName: node linkType: hard +"@types/styled-components@npm:^5": + version: 5.1.26 + resolution: "@types/styled-components@npm:5.1.26" + dependencies: + "@types/hoist-non-react-statics": "*" + "@types/react": "*" + csstype: ^3.0.2 + checksum: 84f53b3101739b20d1731554fb7735bc2f3f5d050a8b392e9845403c8c8bbd729737d033978649f9195a97b557875b010d46e35a4538564a2d0dbcce661dbf76 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.54.0": version: 5.54.0 resolution: "@typescript-eslint/eslint-plugin@npm:5.54.0" @@ -1488,10 +1532,11 @@ __metadata: "@table-library/react-table-library": 4.0.29 "@types/lodash-es": ^4.17.6 "@types/mime-types": ^2 - "@types/node": ^18.14.5 + "@types/node": ^18.14.6 "@types/react": ^18.0.28 "@types/react-dom": ^18.0.11 "@types/react-router-dom": ^5.3.3 + "@types/styled-components": ^5 "@typescript-eslint/eslint-plugin": ^5.54.0 "@typescript-eslint/parser": ^5.54.0 "@vitejs/plugin-react-swc": ^3.2.0 @@ -1512,13 +1557,14 @@ __metadata: notistack: ^2.0.8 npm-run-all: ^4.1.5 prettier: ^2.8.4 - react: ^18.2.0 - react-dom: ^18.2.0 + react: latest + react-dom: latest react-dropzone: ^14.2.3 react-icons: ^4.8.0 react-router-dom: ^6.8.2 rollup-plugin-visualizer: ^5.9.0 sockette: ^2.0.6 + styled-components: ^5.3.8 typesafe-i18n: ^5.24.2 typescript: ^4.9.5 vite: ^4.1.4 @@ -1792,6 +1838,28 @@ __metadata: languageName: node linkType: hard +"babel-plugin-styled-components@npm:>= 1.12.0": + version: 2.0.7 + resolution: "babel-plugin-styled-components@npm:2.0.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.16.0 + "@babel/helper-module-imports": ^7.16.0 + babel-plugin-syntax-jsx: ^6.18.0 + lodash: ^4.17.11 + picomatch: ^2.3.0 + peerDependencies: + styled-components: ">= 2" + checksum: 80b06b10db02d749432a0ac43a5feedd686f6b648628d7433a39b1844260b2b7c72431f6e705c82636ee025fcfd4f6c32fc05677e44033b8a39ddcd4488b3147 + languageName: node + linkType: hard + +"babel-plugin-syntax-jsx@npm:^6.18.0": + version: 6.18.0 + resolution: "babel-plugin-syntax-jsx@npm:6.18.0" + checksum: 0c7ce5b81d6cfc01a7dd7a76a9a8f090ee02ba5c890310f51217ef1a7e6163fb7848994bbc14fd560117892e82240df9c7157ad0764da67ca5f2afafb73a7d27 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -1898,6 +1966,13 @@ __metadata: languageName: node linkType: hard +"camelize@npm:^1.0.0": + version: 1.0.1 + resolution: "camelize@npm:1.0.1" + checksum: 91d8611d09af725e422a23993890d22b2b72b4cabf7239651856950c76b4bf53fe0d0da7c5e4db05180e898e4e647220e78c9fbc976113bd96d603d1fcbfcb99 + languageName: node + linkType: hard + "caniuse-lite@npm:^1.0.30001449": version: 1.0.30001458 resolution: "caniuse-lite@npm:1.0.30001458" @@ -2092,6 +2167,24 @@ __metadata: languageName: node linkType: hard +"css-color-keywords@npm:^1.0.0": + version: 1.0.0 + resolution: "css-color-keywords@npm:1.0.0" + checksum: 8f125e3ad477bd03c77b533044bd9e8a6f7c0da52d49bbc0bbe38327b3829d6ba04d368ca49dd9ff3b667d2fc8f1698d891c198bbf8feade1a5501bf5a296408 + languageName: node + linkType: hard + +"css-to-react-native@npm:^3.0.0": + version: 3.2.0 + resolution: "css-to-react-native@npm:3.2.0" + dependencies: + camelize: ^1.0.0 + css-color-keywords: ^1.0.0 + postcss-value-parser: ^4.0.2 + checksum: 263be65e805aef02c3f20c064665c998a8c35293e1505dbe6e3054fb186b01a9897ac6cf121f9840e5a9dfe3fb3994f6fcd0af84a865f1df78ba5bf89e77adce + languageName: node + linkType: hard + "csstype@npm:^3.0.2, csstype@npm:^3.1.1": version: 3.1.1 resolution: "csstype@npm:3.1.1" @@ -3250,7 +3343,7 @@ __metadata: languageName: node linkType: hard -"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": +"hoist-non-react-statics@npm:^3.0.0, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: @@ -3822,6 +3915,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.11": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + "loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -4469,7 +4569,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.0, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf @@ -4492,6 +4592,13 @@ __metadata: languageName: node linkType: hard +"postcss-value-parser@npm:^4.0.2": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f + languageName: node + linkType: hard + "postcss@npm:^8.4.21": version: 8.4.21 resolution: "postcss@npm:8.4.21" @@ -4575,7 +4682,7 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^18.2.0": +"react-dom@npm:latest": version: 18.2.0 resolution: "react-dom@npm:18.2.0" dependencies: @@ -4685,7 +4792,7 @@ __metadata: languageName: node linkType: hard -"react@npm:^18.2.0": +"react@npm:latest": version: 18.2.0 resolution: "react@npm:18.2.0" dependencies: @@ -4962,6 +5069,13 @@ __metadata: languageName: node linkType: hard +"shallowequal@npm:^1.1.0": + version: 1.1.0 + resolution: "shallowequal@npm:1.1.0" + checksum: f4c1de0837f106d2dbbfd5d0720a5d059d1c66b42b580965c8f06bb1db684be8783538b684092648c981294bf817869f743a066538771dbecb293df78f765e00 + languageName: node + linkType: hard + "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0" @@ -5242,6 +5356,28 @@ __metadata: languageName: node linkType: hard +"styled-components@npm:^5.3.8": + version: 5.3.8 + resolution: "styled-components@npm:5.3.8" + dependencies: + "@babel/helper-module-imports": ^7.0.0 + "@babel/traverse": ^7.4.5 + "@emotion/is-prop-valid": ^1.1.0 + "@emotion/stylis": ^0.8.4 + "@emotion/unitless": ^0.7.4 + babel-plugin-styled-components: ">= 1.12.0" + css-to-react-native: ^3.0.0 + hoist-non-react-statics: ^3.0.0 + shallowequal: ^1.1.0 + supports-color: ^5.5.0 + peerDependencies: + react: ">= 16.8.0" + react-dom: ">= 16.8.0" + react-is: ">= 16.8.0" + checksum: 60148083f4057cd0dd4ad555e82800ec4ec4b8822fd81645f084e9beebf91420f4c9c75875b44933755d32ec97c46be6b79ca0c23578e5a731e3399e6ea0d901 + languageName: node + linkType: hard + "stylis@npm:4.1.3": version: 4.1.3 resolution: "stylis@npm:4.1.3" diff --git a/mock-api/server.js b/mock-api/server.js index 09e1a9adf..f3e964276 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -603,40 +603,40 @@ const emsesp_devicedata_4 = { let emsesp_schedule = { schedule: [ { - id: 'hc1_on', + id: '1', active: true, - flags: 31, + flags: 6, time: '07:30', cmd: 'hc1/mode', value: 'day', - description: 'Turn on central heating in morning' + name: 'day_mode' }, { - id: 'hc1_off', + id: '2', active: true, flags: 31, time: '23:00', cmd: 'hc1/mode', value: 'night', - description: 'Turn off central heating for the night' + name: 'night_mode' }, { - id: 'set_roomtemp', + id: '3', active: true, - flags: 128, - time: '00:01', + flags: 10, + time: '00:00', cmd: 'thermostat/hc2/seltemp', value: '20', - description: 'Force thermostat temperature to 20 degrees every minute' + name: 'temp_20' }, { - id: 'restart', + id: '4', active: false, flags: 1, time: '04:00', cmd: 'system/restart', value: '', - description: 'auto restart EMS-EPS at 4am every Sunday' + name: 'auto_restart' } ] }; diff --git a/pio_local.ini_example b/pio_local.ini_example index fe1a5e9c4..6e919359e 100644 --- a/pio_local.ini_example +++ b/pio_local.ini_example @@ -1,12 +1,15 @@ ; example custom platformio.ini file for EMS-ESP [common] -; custom build flags -; options are: EMSESP_DEBUG, EMSESP_UART_DEBUG, EMSESP_DEBUG_SENSOR, EMSESP_WIFI_TWEAK, EMSESP_DEFAULT_BOARD_PROFILE, EMSESP_TEST -; my_build_flags = -DEMSESP_DEBUG -DEMSESP_DEFAULT_BOARD_PROFILE=\"NODEMCU\" ; hard code the default board name -; my_build_flags = -DEMSESP_DEBUG_SENSOR ; additional debug for the dallas sensors -; my_build_flags = -DEMSESP_DEBUG -DCORE_DEBUG_LEVEL=5 ; verbose debugging 5=verbose, 4=debug, 3=info -; my_build_flags = -DEMSESP_DEBUG ; enables DEBUG to the log. Will generate a lot of traffic on Console and Syslog +; custom build flags: +; -DEMSESP_WIFI_TWEAK ; experimental WiFi tweaks for stability +; -DEMSESP_UART_DEBUG ; debugging UART +; -DEMSESP_DEBUG ; enables DEBUG to the log. Will generate a lot of extra traffic on Console and Syslog +; -DEMSESP_DEFAULT_BOARD_PROFILE=\"NODEMCU\" ; hard code the default board name +; -DEMSESP_DEBUG_SENSOR ; additional debug for the dallas sensors +; -DCORE_DEBUG_LEVEL=5 ; verbose core level debugging 5=verbose, 4=debug, 3=info +; -DEMSESP_TEST ; enable the tests. EN language only +; my_build_flags = -DEMSESP_DEBUG [env:esp32_4M] ; if using OTA enter your details below @@ -21,8 +24,6 @@ upload_port = /dev/ttyUSB* ; override arduino espressif core ; platform = espressif32 ; take latest -; platform = espressif32@6.0.1 -; platform = espressif32@5.3.0 ; platform = espressif32@5.2.0 extra_scripts = diff --git a/src/system.cpp b/src/system.cpp index 232ceeaee..c0d363e0c 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1071,7 +1071,7 @@ bool System::check_upgrade(bool factory_settings) { // if we're coming from 3.4.4 or 3.5.0b14 then we need to apply new settings if (missing_version) { - LOG_DEBUG("Setting MQTT ID Entity to v3.4 format"); + LOG_DEBUG("Setting MQTT Entity ID format to v3.4 format"); EMSESP::esp8266React.getMqttSettingsService()->update( [&](MqttSettings & mqttSettings) { mqttSettings.entity_format = 0; // use old Entity ID format from v3.4 diff --git a/src/version.h b/src/version.h index 360172889..806e4b356 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.0-dev.2" +#define EMSESP_APP_VERSION "3.6.0-dev.3" diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 52306e0a9..475a8de2f 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -37,14 +37,14 @@ void WebSchedulerService::begin() { void WebScheduler::read(WebScheduler & webScheduler, JsonObject & root) { JsonArray schedule = root.createNestedArray("schedule"); for (const ScheduleItem & scheduleItem : webScheduler.scheduleItems) { - JsonObject si = schedule.createNestedObject(); - si["id"] = scheduleItem.id; // name, is unqiue - si["active"] = scheduleItem.active; - si["flags"] = scheduleItem.flags; - si["time"] = scheduleItem.time; - si["cmd"] = scheduleItem.cmd; - si["value"] = scheduleItem.value; - si["description"] = scheduleItem.description; + JsonObject si = schedule.createNestedObject(); + si["id"] = scheduleItem.id; // name, is unqiue + si["active"] = scheduleItem.active; + si["flags"] = scheduleItem.flags; + si["time"] = scheduleItem.time; + si["cmd"] = scheduleItem.cmd; + si["value"] = scheduleItem.value; + si["name"] = scheduleItem.name; } } @@ -53,8 +53,8 @@ void WebScheduler::read(WebScheduler & webScheduler, JsonObject & root) { StateUpdateResult WebScheduler::update(JsonObject & root, WebScheduler & webScheduler) { #ifdef EMSESP_STANDALONE // invoke some fake data for testing - const char * json = "{[{\"id\":\"test1\",\"active\":true,\"flags\":31,\"time\": \"07:30\",\"cmd\": \"hc1/mode\",\"value\": \"day\",\"description\": \"turn " - "on central heating\"}]}"; + const char * json = + "{[{\"id\":\"01\",\"active\":true,\"flags\":31,\"time\": \"07:30\",\"cmd\": \"hc1/mode\",\"value\": \"day\",\"name\": \"turn on central heating\"}]}"; StaticJsonDocument<500> doc; deserializeJson(doc, json); root = doc.as(); @@ -65,7 +65,7 @@ StateUpdateResult WebScheduler::update(JsonObject & root, WebScheduler & webSche #endif for (ScheduleItem & scheduleItem : webScheduler.scheduleItems) { - Command::erase_command(EMSdevice::DeviceType::SCHEDULER, scheduleItem.description.c_str()); + Command::erase_command(EMSdevice::DeviceType::SCHEDULER, scheduleItem.name.c_str()); } webScheduler.scheduleItems.clear(); @@ -73,26 +73,25 @@ StateUpdateResult WebScheduler::update(JsonObject & root, WebScheduler & webSche for (const JsonObject schedule : root["schedule"].as()) { // create each schedule item, overwriting any previous settings // ignore the id (as this is only used in the web for table rendering) - auto si = ScheduleItem(); - si.id = schedule["id"].as(); - si.active = schedule["active"]; - si.flags = schedule["flags"]; - si.time = schedule["time"].as(); - si.cmd = schedule["cmd"].as(); - si.value = schedule["value"].as(); - si.description = schedule["description"].as(); + auto si = ScheduleItem(); + si.active = schedule["active"]; + si.flags = schedule["flags"]; + si.time = schedule["time"].as(); + si.cmd = schedule["cmd"].as(); + si.value = schedule["value"].as(); + si.name = schedule["name"].as(); // calculated elapsed minutes si.elapsed_min = Helpers::string2minutes(si.time); si.retry_cnt = 0xFF; // no starup retries webScheduler.scheduleItems.push_back(si); // add to list - if (!webScheduler.scheduleItems.back().description.empty()) { + if (!webScheduler.scheduleItems.back().name.empty()) { Command::add( EMSdevice::DeviceType::SCHEDULER, - webScheduler.scheduleItems.back().description.c_str(), + webScheduler.scheduleItems.back().name.c_str(), [webScheduler](const char * value, const int8_t id) { - return EMSESP::webSchedulerService.command_setvalue(value, webScheduler.scheduleItems.back().description); + return EMSESP::webSchedulerService.command_setvalue(value, webScheduler.scheduleItems.back().name); }, FL_(schedule_cmd), CommandFlag::ADMIN_ONLY); @@ -111,7 +110,7 @@ bool WebSchedulerService::command_setvalue(const char * value, const std::string } EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); for (ScheduleItem & scheduleItem : *scheduleItems) { - if (scheduleItem.description == name) { + if (scheduleItem.name == name) { if (scheduleItem.active == v) { return true; } @@ -148,20 +147,20 @@ void WebSchedulerService::publish(const bool force) { } if (Mqtt::publish_single() && force) { for (const ScheduleItem & scheduleItem : *scheduleItems) { - publish_single(scheduleItem.description.c_str(), scheduleItem.active); + publish_single(scheduleItem.name.c_str(), scheduleItem.active); } } DynamicJsonDocument doc(EMSESP_JSON_SIZE_XLARGE); for (const ScheduleItem & scheduleItem : *scheduleItems) { - if (!scheduleItem.description.empty() && !doc.containsKey(scheduleItem.description)) { + if (!scheduleItem.name.empty() && !doc.containsKey(scheduleItem.name)) { if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { - doc[scheduleItem.description] = scheduleItem.active; + doc[scheduleItem.name] = scheduleItem.active; } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { - doc[scheduleItem.description] = scheduleItem.active ? 1 : 0; + doc[scheduleItem.name] = scheduleItem.active ? 1 : 0; } else { char result[12]; - doc[scheduleItem.description] = Helpers::render_boolean(result, scheduleItem.active); + doc[scheduleItem.name] = Helpers::render_boolean(result, scheduleItem.active); } // create HA config @@ -173,21 +172,21 @@ void WebSchedulerService::publish(const bool force) { char val_obj[50]; char val_cond[65]; - snprintf(val_obj, sizeof(val_obj), "value_json['%s']", scheduleItem.description.c_str()); + snprintf(val_obj, sizeof(val_obj), "value_json['%s']", scheduleItem.name.c_str()); snprintf(val_cond, sizeof(val_cond), "%s is defined", val_obj); config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + "}}"; char uniq_s[70]; - snprintf(uniq_s, sizeof(uniq_s), "scheduler_%s", scheduleItem.description.c_str()); + snprintf(uniq_s, sizeof(uniq_s), "scheduler_%s", scheduleItem.name.c_str()); config["obj_id"] = uniq_s; config["uniq_id"] = uniq_s; // same as object_id - config["name"] = scheduleItem.description.c_str(); + config["name"] = scheduleItem.name.c_str(); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "switch/%s/scheduler_%s/config", Mqtt::basename().c_str(), scheduleItem.description.c_str()); - snprintf(command_topic, sizeof(command_topic), "%s/scheduler/%s", Mqtt::basename().c_str(), scheduleItem.description.c_str()); + snprintf(topic, sizeof(topic), "switch/%s/scheduler_%s/config", Mqtt::basename().c_str(), scheduleItem.name.c_str()); + snprintf(command_topic, sizeof(command_topic), "%s/scheduler/%s", Mqtt::basename().c_str(), scheduleItem.name.c_str()); config["cmd_t"] = command_topic; if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { config["pl_on"] = true; @@ -220,7 +219,7 @@ bool WebSchedulerService::has_commands() { return false; } for (const ScheduleItem & scheduleItem : *scheduleItems) { - if (!scheduleItem.description.empty()) { + if (!scheduleItem.name.empty()) { return true; } } diff --git a/src/web/WebSchedulerService.h b/src/web/WebSchedulerService.h index 696ea8d99..c2c1b7f3d 100644 --- a/src/web/WebSchedulerService.h +++ b/src/web/WebSchedulerService.h @@ -29,14 +29,14 @@ namespace emsesp { class ScheduleItem { public: - std::string id; // unqiue id, is the name + std::string id; // unqiue id boolean active; uint8_t flags; uint16_t elapsed_min; // total mins from 00:00 std::string time; // HH:MM std::string cmd; std::string value; - std::string description; + std::string name; uint8_t retry_cnt; }; From e6f9d9b3c8ed08d3030c77b7dab2321ba2df20ff Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 4 Mar 2023 22:16:10 +0100 Subject: [PATCH 02/15] scheduler dialog changes --- interface/package.json | 1 - interface/src/i18n/de/index.ts | 2 +- interface/src/i18n/en/index.ts | 2 +- interface/src/i18n/fr/index.ts | 2 +- interface/src/i18n/nl/index.ts | 2 +- interface/src/i18n/no/index.ts | 2 +- interface/src/i18n/pl/index.ts | 2 +- interface/src/i18n/sv/index.ts | 2 +- interface/src/i18n/tr/index.ts | 2 +- interface/src/project/SettingsScheduler.tsx | 303 +++++++------------- interface/yarn.lock | 124 +------- 11 files changed, 116 insertions(+), 328 deletions(-) diff --git a/interface/package.json b/interface/package.json index 779215c71..67039aa61 100644 --- a/interface/package.json +++ b/interface/package.json @@ -44,7 +44,6 @@ "react-icons": "^4.8.0", "react-router-dom": "^6.8.2", "sockette": "^2.0.6", - "styled-components": "^5.3.8", "typesafe-i18n": "^5.24.2", "typescript": "^4.9.5" }, diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index 73a54d5b3..c3140937b 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -311,10 +311,10 @@ const de: Translation = { LEAVE: 'Verlassen', SCHEDULER: 'Planer', SCHEDULER_HELP_1: 'Fügen Sie eigene, geplante Befehle zur Automatisierung hinzu. Vergeben Sie einen Entitätsnamen um die Aktivierung über API/Mqtt zu steuern', + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate SCHEDULE: 'Zeitplan', TIME: 'Zeit', TIMER: 'Timer', - WEEKLY: 'Wöchentlich', SCHEDULE_SAVED: 'Plan gespeichert', SCHEDULE_TIMER_1: 'beim Start', SCHEDULE_TIMER_2: 'jede Minute', diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index 6daa59ad8..7b9d37afa 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -311,10 +311,10 @@ const en: Translation = { LEAVE: 'Leave', SCHEDULER: 'Scheduler', SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', SCHEDULE: 'Schedule', TIME: 'Time', TIMER: 'Timer', - WEEKLY: 'Weekly', SCHEDULE_SAVED: 'Schedule updated', SCHEDULE_TIMER_1: 'on startup', SCHEDULE_TIMER_2: 'every minute', diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 001b8d880..560624f7a 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -311,10 +311,10 @@ const fr: Translation = { LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate - WEEKLY: 'Weekly', // TODO translate SCHEDULE_SAVED: 'Schedule updated', // TODO translate SCHEDULE_TIMER_1: 'on startup', // TODO translate SCHEDULE_TIMER_2: 'every minute', // TODO translate diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index e24c33c63..8b5ff209f 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -311,10 +311,10 @@ const nl: Translation = { LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate - WEEKLY: 'Weekly', // TODO translate SCHEDULE_SAVED: 'Schedule updated', // TODO translate SCHEDULE_TIMER_1: 'on startup', // TODO translate SCHEDULE_TIMER_2: 'every minute', // TODO translate diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index aeee08059..81bfa7a9b 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -311,10 +311,10 @@ const no: Translation = { LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate - WEEKLY: 'Weekly', // TODO translate SCHEDULE_SAVED: 'Schedule updated', // TODO translate SCHEDULE_TIMER_1: 'on startup', // TODO translate SCHEDULE_TIMER_2: 'every minute', // TODO translate diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index b963a93ef..529b3d536 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -311,10 +311,10 @@ const pl: BaseTranslation = { LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate SCHEDULE: 'Schedule', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate - WEEKLY: 'Weekly', // TODO translate SCHEDULE_SAVED: 'Schedule updated', // TODO translate SCHEDULE_TIMER_1: 'on startup', // TODO translate SCHEDULE_TIMER_2: 'every minute', // TODO translate diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index 23ecddf6c..88914c749 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -311,10 +311,10 @@ const sv: Translation = { LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate - WEEKLY: 'Weekly', // TODO translate SCHEDULE_SAVED: 'Schedule updated', // TODO translate SCHEDULE_TIMER_1: 'on startup', // TODO translate SCHEDULE_TIMER_2: 'every minute', // TODO translate diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index 35ea50a16..5b69acfad 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -311,10 +311,10 @@ const tr: Translation = { LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate - WEEKLY: 'Weekly', // TODO translate SCHEDULE_SAVED: 'Schedule updated', // TODO translate SCHEDULE_TIMER_1: 'on startup', // TODO translate SCHEDULE_TIMER_2: 'every minute', // TODO translate diff --git a/interface/src/project/SettingsScheduler.tsx b/interface/src/project/SettingsScheduler.tsx index 31d2ce41d..a3e05211b 100644 --- a/interface/src/project/SettingsScheduler.tsx +++ b/interface/src/project/SettingsScheduler.tsx @@ -6,26 +6,17 @@ import { Typography, Box, Stack, - Paper, Dialog, DialogActions, DialogContent, DialogTitle, ToggleButton, - MenuItem, ToggleButtonGroup, Checkbox, TextField, - Radio, - RadioGroup, - FormControlLabel + Divider } from '@mui/material'; -// import { styled } from '@mui/material/styles'; - -import styled from 'styled-components'; - - import { useTheme } from '@table-library/react-table-library/theme'; import { Table, Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-library/react-table-library/table'; @@ -59,31 +50,18 @@ import { useI18nContext } from 'i18n/i18n-react'; import * as EMSESP from './api'; -interface ItemProps { - enabled: boolean; +function makeid() { // TODO finish this! + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + let counter = 0; + while (counter < 4) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + counter += 1; + } + return result; } -const Item = styled(Paper)(({ color, theme }) => ({ - // backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', - ...theme.typography.body2, - textAlign: 'center', - // color: ${({enabled}) => enabled ? 'red' : 'green'}; - fontSize: 10, - padding: '6px 12px', - border: '1px solid', - lineHeight: 1.5, - backgroundColor: '#1A2027', - borderColor: '#1A2027', - // color: theme.palette.text.secondary, -})); - -const Item2 = styled.paper` -fontSize: 10; -color: ${props => props.enabled ? 'red' : 'green'}; -`; - - - const SettingsScheduler: FC = () => { const { LL, locale } = useI18nContext(); @@ -295,8 +273,7 @@ const SettingsScheduler: FC = () => { } }; - function getFlagName(si: ScheduleItem, flag: number) { - let text = ''; + function getFlagName(flag: number) { if ((flag & ScheduleFlag.SCHEDULE_MON) === ScheduleFlag.SCHEDULE_MON) { return dow[1]; } @@ -321,51 +298,25 @@ const SettingsScheduler: FC = () => { if ((flag & ScheduleFlag.SCHEDULE_TIMER) === ScheduleFlag.SCHEDULE_TIMER) { return LL.TIMER(); } - return ""; + return ''; } - function showFlag(si: ScheduleItem, flag: number) { - let text = ''; - if ((flag & ScheduleFlag.SCHEDULE_MON) === ScheduleFlag.SCHEDULE_MON) { - text = dow[1]; - } - if ((flag & ScheduleFlag.SCHEDULE_TUE) === ScheduleFlag.SCHEDULE_TUE) { - text = dow[2]; - } - if ((flag & ScheduleFlag.SCHEDULE_WED) === ScheduleFlag.SCHEDULE_WED) { - text = dow[3]; - } - if ((flag & ScheduleFlag.SCHEDULE_THU) === ScheduleFlag.SCHEDULE_THU) { - text = dow[4]; - } - if ((flag & ScheduleFlag.SCHEDULE_FRI) === ScheduleFlag.SCHEDULE_FRI) { - text = dow[5]; - } - if ((flag & ScheduleFlag.SCHEDULE_SAT) === ScheduleFlag.SCHEDULE_SAT) { - text = dow[6]; - } - if ((flag & ScheduleFlag.SCHEDULE_SUN) === ScheduleFlag.SCHEDULE_SUN) { - text = dow[0]; - } - if ((flag & ScheduleFlag.SCHEDULE_TIMER) === ScheduleFlag.SCHEDULE_TIMER) { - text = LL.TIMER(); - } + const dayBox = (si: ScheduleItem, flag: number) => ( + <> + + + {getFlagName(flag)} + + + + + ); - return ( - <> - - {/* */} - - - - {text} - - - - ); - } + const showFlag = (si: ScheduleItem, flag: number) => ( + + {getFlagName(flag)} + + ); const editScheduleItem = (si: ScheduleItem) => { if (si.name === undefined) { @@ -409,9 +360,7 @@ const SettingsScheduler: FC = () => { <>
- - - + {LL.SCHEDULE()} {LL.TIME()} {LL.COMMAND()} @@ -422,48 +371,19 @@ const SettingsScheduler: FC = () => { {tableList.map((si: ScheduleItem) => ( editScheduleItem(si)}> + {si.active && } - { - si.active = !si.active; - setFlags(['']); // forces refresh - }} - /> - - - - - - {getFlagName(si, ScheduleFlag.SCHEDULE_MON)} - - {getFlagName(si, ScheduleFlag.SCHEDULE_TUE)} - - - - - - - {/* {showFlag(si, ScheduleFlag.SCHEDULE_MON)} - {showFlag(si, ScheduleFlag.SCHEDULE_TUE)} - {showFlag(si, ScheduleFlag.SCHEDULE_WED)} - {showFlag(si, ScheduleFlag.SCHEDULE_THU)} - {showFlag(si, ScheduleFlag.SCHEDULE_FRI)} - {showFlag(si, ScheduleFlag.SCHEDULE_SAT)} - {showFlag(si, ScheduleFlag.SCHEDULE_SUN)} - {showFlag(si, ScheduleFlag.SCHEDULE_TIMER)} */} - - + + + {dayBox(si, ScheduleFlag.SCHEDULE_MON)} + {dayBox(si, ScheduleFlag.SCHEDULE_TUE)} + {dayBox(si, ScheduleFlag.SCHEDULE_WED)} + {dayBox(si, ScheduleFlag.SCHEDULE_THU)} + {dayBox(si, ScheduleFlag.SCHEDULE_FRI)} + {dayBox(si, ScheduleFlag.SCHEDULE_SAT)} + {dayBox(si, ScheduleFlag.SCHEDULE_SUN)} + {dayBox(si, ScheduleFlag.SCHEDULE_TIMER)} + {si.time} {si.cmd} @@ -503,65 +423,61 @@ const SettingsScheduler: FC = () => { const renderEditSchedule = () => { if (scheduleItem) { + const isTimer = scheduleItem.flags === ScheduleFlag.SCHEDULE_TIMER; return ( closeDialog()}> - {creating ? LL.ADD(0) : LL.EDIT()} {LL.SCHEDULE()} + {creating ? (LL.ADD(0)+" "+LL.NEW()) : LL.EDIT()} {LL.SCHEDULE()} - - { - const flags = getFlagNumber(flag); - if (flags & ScheduleFlag.SCHEDULE_TIMER) { - console.log('timer'); - scheduleItem.flags = ScheduleFlag.SCHEDULE_TIMER; - } else { - console.log("daily"); - scheduleItem.flags = getFlagNumber(flag) & 127; - console.log( scheduleItem.flags); - } - setFlags(['']); // forces refresh - }} - > - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_MON)} - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_TUE)} - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_WED)} - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_THU)} - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_FRI)} - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_SAT)} - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_SUN)} - {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_TIMER)} - - - - {creating ? ( - { - if ((event.target as HTMLInputElement).value === 't') { - scheduleItem.flags = ScheduleFlag.SCHEDULE_TIMER; - scheduleItem.time = '01:00'; - } else { - scheduleItem.flags = 0; - } - updateValue(setScheduleItem); - setFlags(['']); // refresh screen - }} - > - } label={LL.WEEKLY()} /> - } label={LL.TIMER()} /> - - ) : ( - - {LL.TYPE()}: {scheduleItem.flags & ScheduleFlag.SCHEDULE_TIMER ? LL.TIMER() : LL.WEEKLY()} - - )} - + + { + scheduleItem.flags = getFlagNumber(flag) & 127; + setFlags(['']); // forces refresh + }} + > + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_MON)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_TUE)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_WED)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_THU)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_FRI)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_SAT)} + {showFlag(scheduleItem, ScheduleFlag.SCHEDULE_SUN)} + + + + {isTimer ? ( + + ) : ( + + )} + + + { control={} label={LL.ACTIVE()} /> - - {(scheduleItem.flags & ScheduleFlag.SCHEDULE_TIMER) === ScheduleFlag.SCHEDULE_TIMER ? ( - - {LL.SCHEDULE_TIMER_1()} - {LL.SCHEDULE_TIMER_2()} - {LL.SCHEDULE_TIMER_3()} - - ) : ( - + + {isTimer && ( + + {LL.SCHEDULER_HELP_2()} + )} = 1.12.0": - version: 2.0.7 - resolution: "babel-plugin-styled-components@npm:2.0.7" - dependencies: - "@babel/helper-annotate-as-pure": ^7.16.0 - "@babel/helper-module-imports": ^7.16.0 - babel-plugin-syntax-jsx: ^6.18.0 - lodash: ^4.17.11 - picomatch: ^2.3.0 - peerDependencies: - styled-components: ">= 2" - checksum: 80b06b10db02d749432a0ac43a5feedd686f6b648628d7433a39b1844260b2b7c72431f6e705c82636ee025fcfd4f6c32fc05677e44033b8a39ddcd4488b3147 - languageName: node - linkType: hard - -"babel-plugin-syntax-jsx@npm:^6.18.0": - version: 6.18.0 - resolution: "babel-plugin-syntax-jsx@npm:6.18.0" - checksum: 0c7ce5b81d6cfc01a7dd7a76a9a8f090ee02ba5c890310f51217ef1a7e6163fb7848994bbc14fd560117892e82240df9c7157ad0764da67ca5f2afafb73a7d27 - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -1966,13 +1920,6 @@ __metadata: languageName: node linkType: hard -"camelize@npm:^1.0.0": - version: 1.0.1 - resolution: "camelize@npm:1.0.1" - checksum: 91d8611d09af725e422a23993890d22b2b72b4cabf7239651856950c76b4bf53fe0d0da7c5e4db05180e898e4e647220e78c9fbc976113bd96d603d1fcbfcb99 - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001449": version: 1.0.30001458 resolution: "caniuse-lite@npm:1.0.30001458" @@ -2167,24 +2114,6 @@ __metadata: languageName: node linkType: hard -"css-color-keywords@npm:^1.0.0": - version: 1.0.0 - resolution: "css-color-keywords@npm:1.0.0" - checksum: 8f125e3ad477bd03c77b533044bd9e8a6f7c0da52d49bbc0bbe38327b3829d6ba04d368ca49dd9ff3b667d2fc8f1698d891c198bbf8feade1a5501bf5a296408 - languageName: node - linkType: hard - -"css-to-react-native@npm:^3.0.0": - version: 3.2.0 - resolution: "css-to-react-native@npm:3.2.0" - dependencies: - camelize: ^1.0.0 - css-color-keywords: ^1.0.0 - postcss-value-parser: ^4.0.2 - checksum: 263be65e805aef02c3f20c064665c998a8c35293e1505dbe6e3054fb186b01a9897ac6cf121f9840e5a9dfe3fb3994f6fcd0af84a865f1df78ba5bf89e77adce - languageName: node - linkType: hard - "csstype@npm:^3.0.2, csstype@npm:^3.1.1": version: 3.1.1 resolution: "csstype@npm:3.1.1" @@ -3343,7 +3272,7 @@ __metadata: languageName: node linkType: hard -"hoist-non-react-statics@npm:^3.0.0, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": +"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: @@ -3915,13 +3844,6 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.11": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - "loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -4569,7 +4491,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.0, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf @@ -4592,13 +4514,6 @@ __metadata: languageName: node linkType: hard -"postcss-value-parser@npm:^4.0.2": - version: 4.2.0 - resolution: "postcss-value-parser@npm:4.2.0" - checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f - languageName: node - linkType: hard - "postcss@npm:^8.4.21": version: 8.4.21 resolution: "postcss@npm:8.4.21" @@ -5069,13 +4984,6 @@ __metadata: languageName: node linkType: hard -"shallowequal@npm:^1.1.0": - version: 1.1.0 - resolution: "shallowequal@npm:1.1.0" - checksum: f4c1de0837f106d2dbbfd5d0720a5d059d1c66b42b580965c8f06bb1db684be8783538b684092648c981294bf817869f743a066538771dbecb293df78f765e00 - languageName: node - linkType: hard - "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0" @@ -5356,28 +5264,6 @@ __metadata: languageName: node linkType: hard -"styled-components@npm:^5.3.8": - version: 5.3.8 - resolution: "styled-components@npm:5.3.8" - dependencies: - "@babel/helper-module-imports": ^7.0.0 - "@babel/traverse": ^7.4.5 - "@emotion/is-prop-valid": ^1.1.0 - "@emotion/stylis": ^0.8.4 - "@emotion/unitless": ^0.7.4 - babel-plugin-styled-components: ">= 1.12.0" - css-to-react-native: ^3.0.0 - hoist-non-react-statics: ^3.0.0 - shallowequal: ^1.1.0 - supports-color: ^5.5.0 - peerDependencies: - react: ">= 16.8.0" - react-dom: ">= 16.8.0" - react-is: ">= 16.8.0" - checksum: 60148083f4057cd0dd4ad555e82800ec4ec4b8822fd81645f084e9beebf91420f4c9c75875b44933755d32ec97c46be6b79ca0c23578e5a731e3399e6ea0d901 - languageName: node - linkType: hard - "stylis@npm:4.1.3": version: 4.1.3 resolution: "stylis@npm:4.1.3" From de59434d95e22fce574b05a6eb07da6c5effca51 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 09:44:50 +0100 Subject: [PATCH 03/15] vscode setup --- .gitignore | 4 +- .vscode/extensions.json | 9 + .vscode/settings.json | 10 + .vscode/tasks.json | 2 +- interface/.yarn/sdks/eslint/package.json | 2 +- interface/package.json | 1 + interface/src/project/SettingsScheduler.tsx | 5 +- interface/yarn.lock | 545 +++++++++++++++++++- 8 files changed, 552 insertions(+), 26 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 8332b7eb9..a4d5706dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ # vscode .vscode/c_cpp_properties.json -.vscode/extensions.json +# .vscode/extensions.json .vscode/launch.json -.vscode/settings.json +# .vscode/settings.json # c++ compiling .clang_complete diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..869be2399 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "platformio.platformio-ide", + "arcanis.vscode-zipfs", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ], + "unwantedRecommendations": ["ms-vscode.cpptools-extension-pack"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..65809f694 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "eslint.nodePath": "interface/.yarn/sdks", + "prettier.prettierPath": "interface/.yarn/sdks/prettier/index.js", + "typescript.tsdk": "interface/.yarn/sdks/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json index c60c56f64..1e14f946b 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -10,7 +10,7 @@ "linux": { "options": { "env": { - // Workaroung for sdl2 `-m32` crash + // Workaround for sdl2 `-m32` crash // https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7 "DBUS_FATAL_WARNINGS": "0" } diff --git a/interface/.yarn/sdks/eslint/package.json b/interface/.yarn/sdks/eslint/package.json index a29ed491e..1393f7747 100644 --- a/interface/.yarn/sdks/eslint/package.json +++ b/interface/.yarn/sdks/eslint/package.json @@ -1,6 +1,6 @@ { "name": "eslint", - "version": "8.34.0-sdk", + "version": "8.35.0-sdk", "main": "./lib/api.js", "type": "commonjs" } diff --git a/interface/package.json b/interface/package.json index 67039aa61..d4a08813e 100644 --- a/interface/package.json +++ b/interface/package.json @@ -31,6 +31,7 @@ "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-router-dom": "^5.3.3", + "@yarnpkg/pnpify": "^4.0.0-rc.39", "async-validator": "^4.2.5", "axios": "^1.3.4", "history": "^5.3.0", diff --git a/interface/src/project/SettingsScheduler.tsx b/interface/src/project/SettingsScheduler.tsx index a3e05211b..f73cac661 100644 --- a/interface/src/project/SettingsScheduler.tsx +++ b/interface/src/project/SettingsScheduler.tsx @@ -50,7 +50,8 @@ import { useI18nContext } from 'i18n/i18n-react'; import * as EMSESP from './api'; -function makeid() { // TODO finish this! +function makeid() { + // TODO finish this! let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const charactersLength = characters.length; @@ -427,7 +428,7 @@ const SettingsScheduler: FC = () => { return ( closeDialog()}> - {creating ? (LL.ADD(0)+" "+LL.NEW()) : LL.EDIT()} {LL.SCHEDULE()} + {creating ? LL.ADD(0) + ' ' + LL.NEW() : LL.EDIT()} {LL.SCHEDULE()} diff --git a/interface/yarn.lock b/interface/yarn.lock index 52ad7d6e4..0c036749e 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -15,6 +15,15 @@ __metadata: languageName: node linkType: hard +"@arcanis/slice-ansi@npm:^1.1.1": + version: 1.1.1 + resolution: "@arcanis/slice-ansi@npm:1.1.1" + dependencies: + grapheme-splitter: ^1.0.4 + checksum: 14ed60cb45750d386c64229ac7bab20e10eedc193503fa4decff764162d329d6d3363ed2cd3debec833186ee54affe4f824f6e8eff531295117fd1ebda200270 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.18.6": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -929,6 +938,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 + languageName: node + linkType: hard + "@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1": version: 6.5.1 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1" @@ -1165,6 +1181,15 @@ __metadata: languageName: node linkType: hard +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: ^2.0.0 + checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 + languageName: node + linkType: hard + "@table-library/react-table-library@npm:4.0.29": version: 4.0.29 resolution: "@table-library/react-table-library@npm:4.0.29" @@ -1187,6 +1212,25 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "*" + "@types/keyv": ^3.1.4 + "@types/node": "*" + "@types/responselike": ^1.0.0 + checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 + languageName: node + linkType: hard + +"@types/emscripten@npm:^1.39.6": + version: 1.39.6 + resolution: "@types/emscripten@npm:1.39.6" + checksum: 437f2f9cdfd9057255662508fa9a415fe704ba484c6198f3549c5b05feebcdcd612b1ec7b10026d2566935d05d3c36f9366087cb42bc90bd25772a88fcfc9343 + languageName: node + linkType: hard + "@types/estree@npm:^1.0.0": version: 1.0.0 resolution: "@types/estree@npm:1.0.0" @@ -1211,6 +1255,13 @@ __metadata: languageName: node linkType: hard +"@types/http-cache-semantics@npm:*": + version: 4.0.1 + resolution: "@types/http-cache-semantics@npm:4.0.1" + checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -1225,6 +1276,15 @@ __metadata: languageName: node linkType: hard +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "*" + checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d + languageName: node + linkType: hard + "@types/lodash-es@npm:^4.17.6": version: 4.17.6 resolution: "@types/lodash-es@npm:4.17.6" @@ -1248,7 +1308,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.14.6": +"@types/node@npm:*, @types/node@npm:^18.11.11, @types/node@npm:^18.14.6": version: 18.14.6 resolution: "@types/node@npm:18.14.6" checksum: 2f88f482cabadc6dbddd627a1674239e68c3c9beab56eb4ae2309fb96fd17fc3a509d99b0309bafe13b58529574f49ecf3a583f2ebe2896dd32fe4be436dc96e @@ -1328,6 +1388,15 @@ __metadata: languageName: node linkType: hard +"@types/responselike@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/responselike@npm:1.0.0" + dependencies: + "@types/node": "*" + checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0 + languageName: node + linkType: hard + "@types/scheduler@npm:*": version: 0.16.2 resolution: "@types/scheduler@npm:0.16.2" @@ -1335,7 +1404,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": +"@types/semver@npm:^7.1.0, @types/semver@npm:^7.3.12": version: 7.3.13 resolution: "@types/semver@npm:7.3.13" checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 @@ -1353,6 +1422,13 @@ __metadata: languageName: node linkType: hard +"@types/treeify@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/treeify@npm:1.0.0" + checksum: 1b2397030d13beee7f82b878ca80feeddb0d550a6b00d8be30082a370c0ac5985ecf7b9378cf93ea278ff00c3e900b416ae8d9379f2c7e8caecdece1dfc77380 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.54.0": version: 5.54.0 resolution: "@typescript-eslint/eslint-plugin@npm:5.54.0" @@ -1496,6 +1572,125 @@ __metadata: languageName: node linkType: hard +"@yarnpkg/core@npm:^4.0.0-rc.39": + version: 4.0.0-rc.39 + resolution: "@yarnpkg/core@npm:4.0.0-rc.39" + dependencies: + "@arcanis/slice-ansi": ^1.1.1 + "@types/semver": ^7.1.0 + "@types/treeify": ^1.0.0 + "@yarnpkg/fslib": ^3.0.0-rc.39 + "@yarnpkg/libzip": ^3.0.0-rc.39 + "@yarnpkg/parsers": ^3.0.0-rc.39 + "@yarnpkg/shell": ^4.0.0-rc.39 + camelcase: ^5.3.1 + chalk: ^3.0.0 + ci-info: ^3.2.0 + clipanion: ^3.2.0-rc.10 + cross-spawn: 7.0.3 + diff: ^5.1.0 + globby: ^11.0.1 + got: ^11.7.0 + lodash: ^4.17.15 + micromatch: ^4.0.2 + p-limit: ^2.2.0 + semver: ^7.1.2 + strip-ansi: ^6.0.0 + tar: ^6.0.5 + tinylogic: ^2.0.0 + treeify: ^1.1.0 + tslib: ^2.4.0 + tunnel: ^0.0.6 + checksum: 673bbc5945b5cba7e9c23d88801d01be5a0f773e0d31f9ffd947b32587cfc75ac180272d2dc60f01c5d77c21c86196ee73ff439bf010ff7f8faf7ac8bbd612e5 + languageName: node + linkType: hard + +"@yarnpkg/fslib@npm:^3.0.0-rc.39": + version: 3.0.0-rc.39 + resolution: "@yarnpkg/fslib@npm:3.0.0-rc.39" + dependencies: + tslib: ^2.4.0 + checksum: 5f5912e931066ca273af46639c0a494aa4eea55ebff0110e326cddd4dd18ae3e59d08d3df3827db67420dbd1492094a7f359248883179964a2e07ca3465df905 + languageName: node + linkType: hard + +"@yarnpkg/libzip@npm:^3.0.0-rc.39": + version: 3.0.0-rc.39 + resolution: "@yarnpkg/libzip@npm:3.0.0-rc.39" + dependencies: + "@types/emscripten": ^1.39.6 + "@yarnpkg/fslib": ^3.0.0-rc.39 + tslib: ^2.4.0 + peerDependencies: + "@yarnpkg/fslib": ^3.0.0-rc.39 + checksum: 25306ba2f0714a2a7de9b3b67dc6845cd5d3fab6f9e388dcc084b4ea359e845736e44037d3e6326391398ce3b2323929dad6106fb9ae96f0fd9407c806848c22 + languageName: node + linkType: hard + +"@yarnpkg/nm@npm:^4.0.0-rc.39": + version: 4.0.0-rc.39 + resolution: "@yarnpkg/nm@npm:4.0.0-rc.39" + dependencies: + "@yarnpkg/core": ^4.0.0-rc.39 + "@yarnpkg/fslib": ^3.0.0-rc.39 + "@yarnpkg/pnp": ^4.0.0-rc.39 + checksum: b406a35ffa5c0818af8e66a531f53ba13beba43d4058b2ed24b6e79216d016d2f2d51ccab6e7cdcc29b217bcbbacd8c85addc905b7cc86200f22f89cf4cb4683 + languageName: node + linkType: hard + +"@yarnpkg/parsers@npm:^3.0.0-rc.39": + version: 3.0.0-rc.39 + resolution: "@yarnpkg/parsers@npm:3.0.0-rc.39" + dependencies: + js-yaml: ^3.10.0 + tslib: ^2.4.0 + checksum: b54fb3694bd09e09142d5a8d607240a8389ce3ccf44a70808ac770c178bb527948c3805a230b6fa55753f95574c93773a853a37ece978e323c9f2d229fd82252 + languageName: node + linkType: hard + +"@yarnpkg/pnp@npm:^4.0.0-rc.39": + version: 4.0.0-rc.39 + resolution: "@yarnpkg/pnp@npm:4.0.0-rc.39" + dependencies: + "@types/node": ^18.11.11 + "@yarnpkg/fslib": ^3.0.0-rc.39 + checksum: 35e2b2b30ce17b74413d3cff91ff69698392c9e5a46061fd5c8c1754f78ed77133d7c18ac49a3a2eb3d4997b3d235e02e2309b6d240e8504171e9274fa2ea8ea + languageName: node + linkType: hard + +"@yarnpkg/pnpify@npm:^4.0.0-rc.39": + version: 4.0.0-rc.39 + resolution: "@yarnpkg/pnpify@npm:4.0.0-rc.39" + dependencies: + "@yarnpkg/core": ^4.0.0-rc.39 + "@yarnpkg/fslib": ^3.0.0-rc.39 + "@yarnpkg/nm": ^4.0.0-rc.39 + clipanion: ^3.2.0-rc.10 + tslib: ^2.4.0 + bin: + pnpify: ./lib/cli.js + checksum: 5a949e2b1a39ff633dd839cc2d9bc246e7861a8ff6d3ce81ec63c527f114cc006d3f3ca72102c88f65f65c98738d3c9d9872dc2fe2b3f3b6ccaa406bb9f08d3d + languageName: node + linkType: hard + +"@yarnpkg/shell@npm:^4.0.0-rc.39": + version: 4.0.0-rc.39 + resolution: "@yarnpkg/shell@npm:4.0.0-rc.39" + dependencies: + "@yarnpkg/fslib": ^3.0.0-rc.39 + "@yarnpkg/parsers": ^3.0.0-rc.39 + chalk: ^3.0.0 + clipanion: ^3.2.0-rc.10 + cross-spawn: 7.0.3 + fast-glob: ^3.2.2 + micromatch: ^4.0.2 + tslib: ^2.4.0 + bin: + shell: ./lib/cli.js + checksum: 0b553155fafed194c3f954325afa7fe10389e4296c326e6ad9abd6238eb68e0282b5abdf1608e229d1c484b65d148a9157c1334caf830375cdd595110055da99 + languageName: node + linkType: hard + "EMS-ESP@workspace:.": version: 0.0.0-use.local resolution: "EMS-ESP@workspace:." @@ -1517,6 +1712,7 @@ __metadata: "@typescript-eslint/eslint-plugin": ^5.54.0 "@typescript-eslint/parser": ^5.54.0 "@vitejs/plugin-react-swc": ^3.2.0 + "@yarnpkg/pnpify": ^4.0.0-rc.39 async-validator: ^4.2.5 axios: ^1.3.4 eslint: ^8.35.0 @@ -1668,6 +1864,15 @@ __metadata: languageName: node linkType: hard +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -1896,6 +2101,28 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.2 + resolution: "cacheable-request@npm:7.0.2" + dependencies: + clone-response: ^1.0.2 + get-stream: ^5.1.0 + http-cache-semantics: ^4.0.0 + keyv: ^4.0.0 + lowercase-keys: ^2.0.0 + normalize-url: ^6.0.1 + responselike: ^2.0.0 + checksum: 6152813982945a5c9989cb457a6c499f12edcc7ade323d2fbfd759abc860bdbd1306e08096916bb413c3c47e812f8e4c0a0cc1e112c8ce94381a960f115bc77f + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -1913,6 +2140,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + "camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" @@ -1938,6 +2172,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 + languageName: node + linkType: hard + "chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -1974,6 +2218,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.2.0": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -1981,6 +2232,17 @@ __metadata: languageName: node linkType: hard +"clipanion@npm:^3.2.0-rc.10": + version: 3.2.0 + resolution: "clipanion@npm:3.2.0" + dependencies: + typanion: ^3.8.0 + peerDependencies: + typanion: "*" + checksum: e28e6f0d48aecff86097823c604aa486082d76d2a5d3abc71069a0d9f3338af769fd7c6634b2f444c5b1aac0743b503325cc0b30552c094c01ebc602631b273d + languageName: node + linkType: hard + "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -1992,6 +2254,15 @@ __metadata: languageName: node linkType: hard +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: ^1.0.0 + checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e + languageName: node + linkType: hard + "clsx@npm:1.1.1": version: 1.1.1 resolution: "clsx@npm:1.1.1" @@ -2090,6 +2361,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:7.0.3, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + "cross-spawn@npm:^6.0.5": version: 6.0.5 resolution: "cross-spawn@npm:6.0.5" @@ -2103,17 +2385,6 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - "csstype@npm:^3.0.2, csstype@npm:^3.1.1": version: 3.1.1 resolution: "csstype@npm:3.1.1" @@ -2149,6 +2420,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: ^3.1.0 + checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 + languageName: node + linkType: hard + "deep-equal@npm:^2.0.5": version: 2.2.0 resolution: "deep-equal@npm:2.2.0" @@ -2181,6 +2461,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -2219,6 +2506,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.1.0": + version: 5.1.0 + resolution: "diff@npm:5.1.0" + checksum: c7bf0df7c9bfbe1cf8a678fd1b2137c4fb11be117a67bc18a0e03ae75105e8533dbfb1cda6b46beb3586ef5aed22143ef9d70713977d5fb1f9114e21455fba90 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -2286,6 +2580,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.10.0": version: 5.12.0 resolution: "enhanced-resolve@npm:5.12.0" @@ -2761,6 +3064,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + "esquery@npm:^1.4.2": version: 1.4.2 resolution: "esquery@npm:1.4.2" @@ -2814,7 +3127,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.9": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" dependencies: @@ -3043,6 +3356,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: ^3.0.0 + checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 + languageName: node + linkType: hard + "get-symbol-description@npm:^1.0.0": version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" @@ -3137,7 +3459,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": +"globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -3180,6 +3502,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^11.7.0": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": ^4.0.0 + "@szmarczak/http-timer": ^4.0.5 + "@types/cacheable-request": ^6.0.1 + "@types/responselike": ^1.0.0 + cacheable-lookup: ^5.0.3 + cacheable-request: ^7.0.2 + decompress-response: ^6.0.0 + http2-wrapper: ^1.0.0-beta.5.2 + lowercase-keys: ^2.0.0 + p-cancelable: ^2.0.0 + responselike: ^2.0.0 + checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" @@ -3288,7 +3629,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 @@ -3306,6 +3647,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.0.0 + checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e + languageName: node + linkType: hard + "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -3691,6 +4042,18 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^3.10.0": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -3711,6 +4074,13 @@ __metadata: languageName: node linkType: hard +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + "json-parse-better-errors@npm:^1.0.1": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" @@ -3776,6 +4146,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.0.0": + version: 4.5.2 + resolution: "keyv@npm:4.5.2" + dependencies: + json-buffer: 3.0.1 + checksum: 13ad58303acd2261c0d4831b4658451603fd159e61daea2121fcb15feb623e75ee328cded0572da9ca76b7b3ceaf8e614f1806c6b3af5db73c9c35a345259651 + languageName: node + linkType: hard + "language-subtag-registry@npm:~0.3.2": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -3844,6 +4223,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.15": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + "loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -3855,6 +4241,13 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -3925,7 +4318,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: @@ -3951,6 +4344,20 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -4201,6 +4608,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 + languageName: node + linkType: hard + "notistack@npm:^2.0.8": version: 2.0.8 resolution: "notistack@npm:2.0.8" @@ -4341,7 +4755,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -4375,6 +4789,22 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -4402,6 +4832,13 @@ __metadata: languageName: node linkType: hard +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -4583,6 +5020,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.0 resolution: "punycode@npm:2.3.0" @@ -4597,6 +5044,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + languageName: node + linkType: hard + "react-dom@npm:latest": version: 18.2.0 resolution: "react-dom@npm:18.2.0" @@ -4779,6 +5233,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -4838,6 +5299,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: ^2.0.0 + checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -4957,7 +5427,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.3.7": +"semver@npm:^7.1.2, semver@npm:^7.3.5, semver@npm:^7.3.7": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -5154,6 +5624,13 @@ __metadata: languageName: node linkType: hard +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + "ssri@npm:^9.0.0": version: 9.0.1 resolution: "ssri@npm:9.0.1" @@ -5320,7 +5797,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": +"tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.13 resolution: "tar@npm:6.1.13" dependencies: @@ -5351,6 +5828,13 @@ __metadata: languageName: node linkType: hard +"tinylogic@npm:^2.0.0": + version: 2.0.0 + resolution: "tinylogic@npm:2.0.0" + checksum: b966cbb41241a048095fb9e685d5e2020475fdea2c65b4ae51e5dee48964860a4505d987503c004b8a76e96b64c7da2f49954dd36c691d559c315d878ce7da29 + languageName: node + linkType: hard + "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -5378,6 +5862,13 @@ __metadata: languageName: node linkType: hard +"treeify@npm:^1.1.0": + version: 1.1.0 + resolution: "treeify@npm:1.1.0" + checksum: aa00dded220c1dd052573bd6fc2c52862f09870851a284f0d3650d72bf913ba9b4f6b824f4f1ab81899bae29375f4266b07fe47cbf82343a1efa13cc09ce87af + languageName: node + linkType: hard + "tsconfck@npm:^2.0.1": version: 2.0.3 resolution: "tsconfck@npm:2.0.3" @@ -5429,6 +5920,20 @@ __metadata: languageName: node linkType: hard +"tunnel@npm:^0.0.6": + version: 0.0.6 + resolution: "tunnel@npm:0.0.6" + checksum: c362948df9ad34b649b5585e54ce2838fa583aa3037091aaed66793c65b423a264e5229f0d7e9a95513a795ac2bd4cb72cda7e89a74313f182c1e9ae0b0994fa + languageName: node + linkType: hard + +"typanion@npm:^3.8.0": + version: 3.12.1 + resolution: "typanion@npm:3.12.1" + checksum: a2e26fa216f8a1dbd2ffbaacb75b1e2dc042a0356e9702fba05a968cad95d9f661b24e37f6c6d8c3adad2c8582c99fca4826ff26a2d07cd2ae617ea87e6187eb + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" From 8ee8998381d0434971512284d8b4e35691dea302 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 10:08:26 +0100 Subject: [PATCH 04/15] Scheduler #701 updates to dialog --- interface/src/project/SettingsScheduler.tsx | 55 +++++++++++---------- interface/src/project/validators.ts | 8 +-- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/interface/src/project/SettingsScheduler.tsx b/interface/src/project/SettingsScheduler.tsx index f73cac661..4aec15e25 100644 --- a/interface/src/project/SettingsScheduler.tsx +++ b/interface/src/project/SettingsScheduler.tsx @@ -13,6 +13,7 @@ import { ToggleButton, ToggleButtonGroup, Checkbox, + Grid, TextField, Divider } from '@mui/material'; @@ -51,7 +52,6 @@ import { useI18nContext } from 'i18n/i18n-react'; import * as EMSESP from './api'; function makeid() { - // TODO finish this! let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const charactersLength = characters.length; @@ -330,7 +330,7 @@ const SettingsScheduler: FC = () => { const addScheduleItem = () => { setCreating(true); setScheduleItem({ - id: '', + id: makeid(), active: false, deleted: false, flags: 0, @@ -342,7 +342,9 @@ const SettingsScheduler: FC = () => { }; const updateScheduleItem = () => { - setSchedule([...schedule.filter((si) => creating || si.o_id !== scheduleItem.o_id), scheduleItem]); + if (scheduleItem) { + setSchedule([...schedule.filter((si) => creating || si.o_id !== scheduleItem.o_id), scheduleItem]); + } setScheduleItem(undefined); }; @@ -366,7 +368,7 @@ const SettingsScheduler: FC = () => { {LL.TIME()} {LL.COMMAND()} {LL.VALUE(0)} - {LL.NAME()} + {LL.NAME(0)}
@@ -409,7 +411,7 @@ const SettingsScheduler: FC = () => { if (scheduleItem) { try { setFieldErrors(undefined); - await validate(schedulerItemValidation(schedule, scheduleItem.o_id), scheduleItem); + await validate(schedulerItemValidation(schedule, scheduleItem), scheduleItem); updateScheduleItem(); } catch (errors: any) { setFieldErrors(errors); @@ -419,7 +421,7 @@ const SettingsScheduler: FC = () => { const closeDialog = () => { setScheduleItem(undefined); - setFieldErrors(); + setFieldErrors(undefined); }; const renderEditSchedule = () => { @@ -431,7 +433,7 @@ const SettingsScheduler: FC = () => { {creating ? LL.ADD(0) + ' ' + LL.NEW() : LL.EDIT()} {LL.SCHEDULE()} - + { )} + } + label={LL.ACTIVE()} + /> - } - label={LL.ACTIVE()} - /> - - {isTimer && ( - - {LL.SCHEDULER_HELP_2()} - - )} + + + + {isTimer && ( + + {LL.SCHEDULER_HELP_2()} + + )} + }) }); -export const schedulerItemValidation = (schedule: ScheduleItem[], o_id: string) => +export const schedulerItemValidation = (schedule: ScheduleItem[], scheduleItem: ScheduleItem) => new Schema({ name: [ { @@ -93,7 +93,7 @@ export const schedulerItemValidation = (schedule: ScheduleItem[], o_id: string) pattern: /^[a-zA-Z0-9_\\.]{1,15}$/, message: "Must be 1-15 characters: alpha numeric, '_' or '.'" }, - ...[uniqueNameValidator(schedule, o_id)] + ...[uniqueNameValidator(schedule, scheduleItem.o_name)] ], cmd: [ { required: true, message: 'Command is required' }, @@ -101,9 +101,9 @@ export const schedulerItemValidation = (schedule: ScheduleItem[], o_id: string) ] }); -export const uniqueNameValidator = (schedule: ScheduleItem[], o_name: string) => ({ +export const uniqueNameValidator = (schedule: ScheduleItem[], o_name?: string) => ({ validator(rule: InternalRuleItem, name: string, callback: (error?: string) => void) { - if (name && o_name !== name && schedule.find((si) => si.name === name)) { + if (name && o_name && o_name !== name && schedule.find((si) => si.name === name)) { callback('Name already in use'); } else { callback(); From 9b3b758be7343d778f9c1bdf70b1a502101d43a1 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:31:14 +0100 Subject: [PATCH 05/15] update TODOs --- .../MsgPack/MsgPackDeserializer.hpp | 1006 ++++++++--------- lib/uuid-console/src/shell.cpp | 3 - lib/uuid-syslog/src/syslog.cpp | 2 +- 3 files changed, 483 insertions(+), 528 deletions(-) diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 5013d2e29..e0ac818d8 100644 --- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -15,648 +15,606 @@ namespace ARDUINOJSON_NAMESPACE { template class MsgPackDeserializer { - public: - MsgPackDeserializer(MemoryPool* pool, TReader reader, - TStringStorage stringStorage) - : _pool(pool), - _reader(reader), - _stringStorage(stringStorage), - _foundSomething(false) {} - - template - DeserializationError parse(VariantData& variant, TFilter filter, - NestingLimit nestingLimit) { - DeserializationError::Code err; - err = parseVariant(&variant, filter, nestingLimit); - return _foundSomething ? err : DeserializationError::EmptyInput; - } - - private: - template - DeserializationError::Code parseVariant(VariantData* variant, TFilter filter, - NestingLimit nestingLimit) { - DeserializationError::Code err; - - uint8_t code = 0; // TODO: why do we need to initialize this variable? - err = readByte(code); - if (err) - return err; - - _foundSomething = true; - - bool allowValue = filter.allowValue(); - - if (allowValue) { - // callers pass a null pointer only when value must be ignored - ARDUINOJSON_ASSERT(variant != 0); + public: + MsgPackDeserializer(MemoryPool * pool, TReader reader, TStringStorage stringStorage) + : _pool(pool) + , _reader(reader) + , _stringStorage(stringStorage) + , _foundSomething(false) { } - switch (code) { - case 0xc0: - // already null - return DeserializationError::Ok; + template + DeserializationError parse(VariantData & variant, TFilter filter, NestingLimit nestingLimit) { + DeserializationError::Code err; + err = parseVariant(&variant, filter, nestingLimit); + return _foundSomething ? err : DeserializationError::EmptyInput; + } - case 0xc1: - return DeserializationError::InvalidInput; + private: + template + DeserializationError::Code parseVariant(VariantData * variant, TFilter filter, NestingLimit nestingLimit) { + DeserializationError::Code err; - case 0xc2: - if (allowValue) - variant->setBoolean(false); - return DeserializationError::Ok; + uint8_t code = 0; + err = readByte(code); + if (err) + return err; - case 0xc3: - if (allowValue) - variant->setBoolean(true); - return DeserializationError::Ok; + _foundSomething = true; - case 0xc4: // bin 8 (not supported) - return skipString(); + bool allowValue = filter.allowValue(); - case 0xc5: // bin 16 (not supported) - return skipString(); + if (allowValue) { + // callers pass a null pointer only when value must be ignored + ARDUINOJSON_ASSERT(variant != 0); + } - case 0xc6: // bin 32 (not supported) - return skipString(); + switch (code) { + case 0xc0: + // already null + return DeserializationError::Ok; - case 0xc7: // ext 8 (not supported) - return skipExt(); + case 0xc1: + return DeserializationError::InvalidInput; - case 0xc8: // ext 16 (not supported) - return skipExt(); + case 0xc2: + if (allowValue) + variant->setBoolean(false); + return DeserializationError::Ok; - case 0xc9: // ext 32 (not supported) - return skipExt(); + case 0xc3: + if (allowValue) + variant->setBoolean(true); + return DeserializationError::Ok; - case 0xca: - if (allowValue) - return readFloat(variant); - else - return skipBytes(4); + case 0xc4: // bin 8 (not supported) + return skipString(); - case 0xcb: - if (allowValue) - return readDouble(variant); - else - return skipBytes(8); + case 0xc5: // bin 16 (not supported) + return skipString(); - case 0xcc: - if (allowValue) - return readInteger(variant); - else - return skipBytes(1); + case 0xc6: // bin 32 (not supported) + return skipString(); - case 0xcd: - if (allowValue) - return readInteger(variant); - else - return skipBytes(2); + case 0xc7: // ext 8 (not supported) + return skipExt(); - case 0xce: - if (allowValue) - return readInteger(variant); - else - return skipBytes(4); + case 0xc8: // ext 16 (not supported) + return skipExt(); - case 0xcf: + case 0xc9: // ext 32 (not supported) + return skipExt(); + + case 0xca: + if (allowValue) + return readFloat(variant); + else + return skipBytes(4); + + case 0xcb: + if (allowValue) + return readDouble(variant); + else + return skipBytes(8); + + case 0xcc: + if (allowValue) + return readInteger(variant); + else + return skipBytes(1); + + case 0xcd: + if (allowValue) + return readInteger(variant); + else + return skipBytes(2); + + case 0xce: + if (allowValue) + return readInteger(variant); + else + return skipBytes(4); + + case 0xcf: #if ARDUINOJSON_USE_LONG_LONG - if (allowValue) - return readInteger(variant); - else - return skipBytes(8); + if (allowValue) + return readInteger(variant); + else + return skipBytes(8); #else - return skipBytes(8); // not supported + return skipBytes(8); // not supported #endif - case 0xd0: - if (allowValue) - return readInteger(variant); - else - return skipBytes(1); + case 0xd0: + if (allowValue) + return readInteger(variant); + else + return skipBytes(1); - case 0xd1: - if (allowValue) - return readInteger(variant); - else - return skipBytes(2); + case 0xd1: + if (allowValue) + return readInteger(variant); + else + return skipBytes(2); - case 0xd2: - if (allowValue) - return readInteger(variant); - else - return skipBytes(4); + case 0xd2: + if (allowValue) + return readInteger(variant); + else + return skipBytes(4); - case 0xd3: + case 0xd3: #if ARDUINOJSON_USE_LONG_LONG - if (allowValue) - return readInteger(variant); - else - return skipBytes(8); // not supported + if (allowValue) + return readInteger(variant); + else + return skipBytes(8); // not supported #else - return skipBytes(8); + return skipBytes(8); #endif - case 0xd4: // fixext 1 (not supported) - return skipBytes(2); + case 0xd4: // fixext 1 (not supported) + return skipBytes(2); - case 0xd5: // fixext 2 (not supported) - return skipBytes(3); + case 0xd5: // fixext 2 (not supported) + return skipBytes(3); - case 0xd6: // fixext 4 (not supported) - return skipBytes(5); + case 0xd6: // fixext 4 (not supported) + return skipBytes(5); - case 0xd7: // fixext 8 (not supported) - return skipBytes(9); + case 0xd7: // fixext 8 (not supported) + return skipBytes(9); - case 0xd8: // fixext 16 (not supported) - return skipBytes(17); + case 0xd8: // fixext 16 (not supported) + return skipBytes(17); + + case 0xd9: + if (allowValue) + return readString(variant); + else + return skipString(); + + case 0xda: + if (allowValue) + return readString(variant); + else + return skipString(); + + case 0xdb: + if (allowValue) + return readString(variant); + else + return skipString(); + + case 0xdc: + return readArray(variant, filter, nestingLimit); + + case 0xdd: + return readArray(variant, filter, nestingLimit); + + case 0xde: + return readObject(variant, filter, nestingLimit); + + case 0xdf: + return readObject(variant, filter, nestingLimit); + } + + switch (code & 0xf0) { + case 0x80: + return readObject(variant, code & 0x0F, filter, nestingLimit); + + case 0x90: + return readArray(variant, code & 0x0F, filter, nestingLimit); + } + + if ((code & 0xe0) == 0xa0) { + if (allowValue) + return readString(variant, code & 0x1f); + else + return skipBytes(code & 0x1f); + } - case 0xd9: if (allowValue) - return readString(variant); - else - return skipString(); + variant->setInteger(static_cast(code)); - case 0xda: - if (allowValue) - return readString(variant); - else - return skipString(); - - case 0xdb: - if (allowValue) - return readString(variant); - else - return skipString(); - - case 0xdc: - return readArray(variant, filter, nestingLimit); - - case 0xdd: - return readArray(variant, filter, nestingLimit); - - case 0xde: - return readObject(variant, filter, nestingLimit); - - case 0xdf: - return readObject(variant, filter, nestingLimit); + return DeserializationError::Ok; } - switch (code & 0xf0) { - case 0x80: - return readObject(variant, code & 0x0F, filter, nestingLimit); - - case 0x90: - return readArray(variant, code & 0x0F, filter, nestingLimit); + DeserializationError::Code readByte(uint8_t & value) { + int c = _reader.read(); + if (c < 0) + return DeserializationError::IncompleteInput; + value = static_cast(c); + return DeserializationError::Ok; } - if ((code & 0xe0) == 0xa0) { - if (allowValue) - return readString(variant, code & 0x1f); - else - return skipBytes(code & 0x1f); - } - - if (allowValue) - variant->setInteger(static_cast(code)); - - return DeserializationError::Ok; - } - - DeserializationError::Code readByte(uint8_t& value) { - int c = _reader.read(); - if (c < 0) - return DeserializationError::IncompleteInput; - value = static_cast(c); - return DeserializationError::Ok; - } - - DeserializationError::Code readBytes(uint8_t* p, size_t n) { - if (_reader.readBytes(reinterpret_cast(p), n) == n) - return DeserializationError::Ok; - return DeserializationError::IncompleteInput; - } - - template - DeserializationError::Code readBytes(T& value) { - return readBytes(reinterpret_cast(&value), sizeof(value)); - } - - DeserializationError::Code skipBytes(size_t n) { - for (; n; --n) { - if (_reader.read() < 0) + DeserializationError::Code readBytes(uint8_t * p, size_t n) { + if (_reader.readBytes(reinterpret_cast(p), n) == n) + return DeserializationError::Ok; return DeserializationError::IncompleteInput; } - return DeserializationError::Ok; - } - template - DeserializationError::Code readInteger(T& value) { - DeserializationError::Code err; - - err = readBytes(value); - if (err) - return err; - - fixEndianess(value); - - return DeserializationError::Ok; - } - - template - DeserializationError::Code readInteger(VariantData* variant) { - DeserializationError::Code err; - T value; - - err = readInteger(value); - if (err) - return err; - - variant->setInteger(value); - - return DeserializationError::Ok; - } - - template - typename enable_if::type - readFloat(VariantData* variant) { - DeserializationError::Code err; - T value; - - err = readBytes(value); - if (err) - return err; - - fixEndianess(value); - variant->setFloat(value); - - return DeserializationError::Ok; - } - - template - typename enable_if::type - readDouble(VariantData* variant) { - DeserializationError::Code err; - T value; - - err = readBytes(value); - if (err) - return err; - - fixEndianess(value); - variant->setFloat(value); - - return DeserializationError::Ok; - } - - template - typename enable_if::type - readDouble(VariantData* variant) { - DeserializationError::Code err; - uint8_t i[8]; // input is 8 bytes - T value; // output is 4 bytes - uint8_t* o = reinterpret_cast(&value); - - err = readBytes(i, 8); - if (err) - return err; - - doubleToFloat(i, o); - fixEndianess(value); - variant->setFloat(value); - - return DeserializationError::Ok; - } - - template - DeserializationError::Code readString(VariantData* variant) { - DeserializationError::Code err; - T size; - - err = readInteger(size); - if (err) - return err; - - return readString(variant, size); - } - - template - DeserializationError::Code readString() { - DeserializationError::Code err; - T size; - - err = readInteger(size); - if (err) - return err; - - return readString(size); - } - - template - DeserializationError::Code skipString() { - DeserializationError::Code err; - T size; - - err = readInteger(size); - if (err) - return err; - - return skipBytes(size); - } - - DeserializationError::Code readString(VariantData* variant, size_t n) { - DeserializationError::Code err; - - err = readString(n); - if (err) - return err; - - variant->setString(_stringStorage.save()); - return DeserializationError::Ok; - } - - DeserializationError::Code readString(size_t n) { - DeserializationError::Code err; - - _stringStorage.startString(); - for (; n; --n) { - uint8_t c; - - err = readBytes(c); - if (err) - return err; - - _stringStorage.append(static_cast(c)); + template + DeserializationError::Code readBytes(T & value) { + return readBytes(reinterpret_cast(&value), sizeof(value)); } - if (!_stringStorage.isValid()) - return DeserializationError::NoMemory; - - return DeserializationError::Ok; - } - - template - DeserializationError::Code readArray(VariantData* variant, TFilter filter, - NestingLimit nestingLimit) { - DeserializationError::Code err; - TSize size; - - err = readInteger(size); - if (err) - return err; - - return readArray(variant, size, filter, nestingLimit); - } - - template - DeserializationError::Code readArray(VariantData* variant, size_t n, - TFilter filter, - NestingLimit nestingLimit) { - DeserializationError::Code err; - - if (nestingLimit.reached()) - return DeserializationError::TooDeep; - - bool allowArray = filter.allowArray(); - - CollectionData* array = allowArray ? &variant->toArray() : 0; - - TFilter memberFilter = filter[0U]; - - for (; n; --n) { - VariantData* value; - - if (memberFilter.allow()) { - value = array->addElement(_pool); - if (!value) - return DeserializationError::NoMemory; - } else { - value = 0; - } - - err = parseVariant(value, memberFilter, nestingLimit.decrement()); - if (err) - return err; + DeserializationError::Code skipBytes(size_t n) { + for (; n; --n) { + if (_reader.read() < 0) + return DeserializationError::IncompleteInput; + } + return DeserializationError::Ok; } - return DeserializationError::Ok; - } + template + DeserializationError::Code readInteger(T & value) { + DeserializationError::Code err; - template - DeserializationError::Code readObject(VariantData* variant, TFilter filter, - NestingLimit nestingLimit) { - DeserializationError::Code err; - TSize size; + err = readBytes(value); + if (err) + return err; - err = readInteger(size); - if (err) - return err; + fixEndianess(value); - return readObject(variant, size, filter, nestingLimit); - } - - template - DeserializationError::Code readObject(VariantData* variant, size_t n, - TFilter filter, - NestingLimit nestingLimit) { - DeserializationError::Code err; - - if (nestingLimit.reached()) - return DeserializationError::TooDeep; - - CollectionData* object = filter.allowObject() ? &variant->toObject() : 0; - - for (; n; --n) { - err = readKey(); - if (err) - return err; - - JsonString key = _stringStorage.str(); - TFilter memberFilter = filter[key.c_str()]; - VariantData* member; - - if (memberFilter.allow()) { - ARDUINOJSON_ASSERT(object); - - // Save key in memory pool. - // This MUST be done before adding the slot. - key = _stringStorage.save(); - - VariantSlot* slot = object->addSlot(_pool); - if (!slot) - return DeserializationError::NoMemory; - - slot->setKey(key); - - member = slot->data(); - } else { - member = 0; - } - - err = parseVariant(member, memberFilter, nestingLimit.decrement()); - if (err) - return err; + return DeserializationError::Ok; } - return DeserializationError::Ok; - } + template + DeserializationError::Code readInteger(VariantData * variant) { + DeserializationError::Code err; + T value; - DeserializationError::Code readKey() { - DeserializationError::Code err; - uint8_t code; + err = readInteger(value); + if (err) + return err; - err = readByte(code); - if (err) - return err; + variant->setInteger(value); - if ((code & 0xe0) == 0xa0) - return readString(code & 0x1f); - - switch (code) { - case 0xd9: - return readString(); - - case 0xda: - return readString(); - - case 0xdb: - return readString(); - - default: - return DeserializationError::InvalidInput; + return DeserializationError::Ok; } - } - template - DeserializationError::Code skipExt() { - DeserializationError::Code err; - T size; + template + typename enable_if::type readFloat(VariantData * variant) { + DeserializationError::Code err; + T value; - err = readInteger(size); - if (err) - return err; + err = readBytes(value); + if (err) + return err; - return skipBytes(size + 1U); - } + fixEndianess(value); + variant->setFloat(value); - MemoryPool* _pool; - TReader _reader; - TStringStorage _stringStorage; - bool _foundSomething; + return DeserializationError::Ok; + } + + template + typename enable_if::type readDouble(VariantData * variant) { + DeserializationError::Code err; + T value; + + err = readBytes(value); + if (err) + return err; + + fixEndianess(value); + variant->setFloat(value); + + return DeserializationError::Ok; + } + + template + typename enable_if::type readDouble(VariantData * variant) { + DeserializationError::Code err; + uint8_t i[8]; // input is 8 bytes + T value; // output is 4 bytes + uint8_t * o = reinterpret_cast(&value); + + err = readBytes(i, 8); + if (err) + return err; + + doubleToFloat(i, o); + fixEndianess(value); + variant->setFloat(value); + + return DeserializationError::Ok; + } + + template + DeserializationError::Code readString(VariantData * variant) { + DeserializationError::Code err; + T size; + + err = readInteger(size); + if (err) + return err; + + return readString(variant, size); + } + + template + DeserializationError::Code readString() { + DeserializationError::Code err; + T size; + + err = readInteger(size); + if (err) + return err; + + return readString(size); + } + + template + DeserializationError::Code skipString() { + DeserializationError::Code err; + T size; + + err = readInteger(size); + if (err) + return err; + + return skipBytes(size); + } + + DeserializationError::Code readString(VariantData * variant, size_t n) { + DeserializationError::Code err; + + err = readString(n); + if (err) + return err; + + variant->setString(_stringStorage.save()); + return DeserializationError::Ok; + } + + DeserializationError::Code readString(size_t n) { + DeserializationError::Code err; + + _stringStorage.startString(); + for (; n; --n) { + uint8_t c; + + err = readBytes(c); + if (err) + return err; + + _stringStorage.append(static_cast(c)); + } + + if (!_stringStorage.isValid()) + return DeserializationError::NoMemory; + + return DeserializationError::Ok; + } + + template + DeserializationError::Code readArray(VariantData * variant, TFilter filter, NestingLimit nestingLimit) { + DeserializationError::Code err; + TSize size; + + err = readInteger(size); + if (err) + return err; + + return readArray(variant, size, filter, nestingLimit); + } + + template + DeserializationError::Code readArray(VariantData * variant, size_t n, TFilter filter, NestingLimit nestingLimit) { + DeserializationError::Code err; + + if (nestingLimit.reached()) + return DeserializationError::TooDeep; + + bool allowArray = filter.allowArray(); + + CollectionData * array = allowArray ? &variant->toArray() : 0; + + TFilter memberFilter = filter[0U]; + + for (; n; --n) { + VariantData * value; + + if (memberFilter.allow()) { + value = array->addElement(_pool); + if (!value) + return DeserializationError::NoMemory; + } else { + value = 0; + } + + err = parseVariant(value, memberFilter, nestingLimit.decrement()); + if (err) + return err; + } + + return DeserializationError::Ok; + } + + template + DeserializationError::Code readObject(VariantData * variant, TFilter filter, NestingLimit nestingLimit) { + DeserializationError::Code err; + TSize size; + + err = readInteger(size); + if (err) + return err; + + return readObject(variant, size, filter, nestingLimit); + } + + template + DeserializationError::Code readObject(VariantData * variant, size_t n, TFilter filter, NestingLimit nestingLimit) { + DeserializationError::Code err; + + if (nestingLimit.reached()) + return DeserializationError::TooDeep; + + CollectionData * object = filter.allowObject() ? &variant->toObject() : 0; + + for (; n; --n) { + err = readKey(); + if (err) + return err; + + JsonString key = _stringStorage.str(); + TFilter memberFilter = filter[key.c_str()]; + VariantData * member; + + if (memberFilter.allow()) { + ARDUINOJSON_ASSERT(object); + + // Save key in memory pool. + // This MUST be done before adding the slot. + key = _stringStorage.save(); + + VariantSlot * slot = object->addSlot(_pool); + if (!slot) + return DeserializationError::NoMemory; + + slot->setKey(key); + + member = slot->data(); + } else { + member = 0; + } + + err = parseVariant(member, memberFilter, nestingLimit.decrement()); + if (err) + return err; + } + + return DeserializationError::Ok; + } + + DeserializationError::Code readKey() { + DeserializationError::Code err; + uint8_t code; + + err = readByte(code); + if (err) + return err; + + if ((code & 0xe0) == 0xa0) + return readString(code & 0x1f); + + switch (code) { + case 0xd9: + return readString(); + + case 0xda: + return readString(); + + case 0xdb: + return readString(); + + default: + return DeserializationError::InvalidInput; + } + } + + template + DeserializationError::Code skipExt() { + DeserializationError::Code err; + T size; + + err = readInteger(size); + if (err) + return err; + + return skipBytes(size + 1U); + } + + MemoryPool * _pool; + TReader _reader; + TStringStorage _stringStorage; + bool _foundSomething; }; // Parses a MessagePack input and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, const TString& input, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, nestingLimit, - AllowAllFilter()); +DeserializationError deserializeMsgPack(JsonDocument & doc, const TString & input, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, nestingLimit, AllowAllFilter()); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, const TString& input, Filter filter, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, nestingLimit, filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, const TString & input, Filter filter, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, nestingLimit, filter); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack(JsonDocument& doc, const TString& input, - NestingLimit nestingLimit, - Filter filter) { - return deserialize(doc, input, nestingLimit, filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, const TString & input, NestingLimit nestingLimit, Filter filter) { + return deserialize(doc, input, nestingLimit, filter); } // Parses a MessagePack input and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, TStream& input, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, nestingLimit, - AllowAllFilter()); +DeserializationError deserializeMsgPack(JsonDocument & doc, TStream & input, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, nestingLimit, AllowAllFilter()); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, TStream& input, Filter filter, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, nestingLimit, filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, TStream & input, Filter filter, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, nestingLimit, filter); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack(JsonDocument& doc, TStream& input, - NestingLimit nestingLimit, - Filter filter) { - return deserialize(doc, input, nestingLimit, filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, TStream & input, NestingLimit nestingLimit, Filter filter) { + return deserialize(doc, input, nestingLimit, filter); } // Parses a MessagePack input and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, TChar* input, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, nestingLimit, - AllowAllFilter()); +DeserializationError deserializeMsgPack(JsonDocument & doc, TChar * input, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, nestingLimit, AllowAllFilter()); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, TChar* input, Filter filter, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, nestingLimit, filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, TChar * input, Filter filter, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, nestingLimit, filter); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack(JsonDocument& doc, TChar* input, - NestingLimit nestingLimit, - Filter filter) { - return deserialize(doc, input, nestingLimit, filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, TChar * input, NestingLimit nestingLimit, Filter filter) { + return deserialize(doc, input, nestingLimit, filter); } // Parses a MessagePack input and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, TChar* input, size_t inputSize, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, inputSize, nestingLimit, - AllowAllFilter()); +DeserializationError deserializeMsgPack(JsonDocument & doc, TChar * input, size_t inputSize, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, inputSize, nestingLimit, AllowAllFilter()); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack( - JsonDocument& doc, TChar* input, size_t inputSize, Filter filter, - NestingLimit nestingLimit = NestingLimit()) { - return deserialize(doc, input, inputSize, nestingLimit, - filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, TChar * input, size_t inputSize, Filter filter, NestingLimit nestingLimit = NestingLimit()) { + return deserialize(doc, input, inputSize, nestingLimit, filter); } // Parses a MessagePack input, filters, and puts the result in a JsonDocument. // https://arduinojson.org/v6/api/msgpack/deserializemsgpack/ template -DeserializationError deserializeMsgPack(JsonDocument& doc, TChar* input, - size_t inputSize, - NestingLimit nestingLimit, - Filter filter) { - return deserialize(doc, input, inputSize, nestingLimit, - filter); +DeserializationError deserializeMsgPack(JsonDocument & doc, TChar * input, size_t inputSize, NestingLimit nestingLimit, Filter filter) { + return deserialize(doc, input, inputSize, nestingLimit, filter); } -} // namespace ARDUINOJSON_NAMESPACE +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/uuid-console/src/shell.cpp b/lib/uuid-console/src/shell.cpp index 6b488e0b1..9571821a9 100644 --- a/lib/uuid-console/src/shell.cpp +++ b/lib/uuid-console/src/shell.cpp @@ -417,7 +417,6 @@ void Shell::loop_delay() { function_copy(*this); - // TODO comment this block out like we had < v3.5? if (running()) { display_prompt(); } @@ -448,7 +447,6 @@ void Shell::loop_blocking() { stop(); } - // TODO comment this block out like we had < v3.5? if (running()) { display_prompt(); } @@ -561,7 +559,6 @@ void Shell::process_command() { } } - // TODO comment this block out like we had < v3.5? if (running()) { display_prompt(); } diff --git a/lib/uuid-syslog/src/syslog.cpp b/lib/uuid-syslog/src/syslog.cpp index 0c07da065..d97ca7540 100644 --- a/lib/uuid-syslog/src/syslog.cpp +++ b/lib/uuid-syslog/src/syslog.cpp @@ -349,7 +349,7 @@ void SyslogService::loop() { } bool SyslogService::can_transmit() { - // TODO this should be checked for Eth + // TODO this should be checked also for Eth if (!host_.empty() && (uint32_t)ip_ == 0) { WiFi.hostByName(host_.c_str(), ip_); } From d3d2270f80f00d73aa9c6182eeeec8b04d92f7d2 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:31:27 +0100 Subject: [PATCH 06/15] typo --- src/web/WebSchedulerService.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/WebSchedulerService.h b/src/web/WebSchedulerService.h index c2c1b7f3d..52341d8e4 100644 --- a/src/web/WebSchedulerService.h +++ b/src/web/WebSchedulerService.h @@ -23,7 +23,7 @@ #define EMSESP_SCHEDULER_SERVICE_PATH "/rest/schedule" // GET and POST #define SCHEDULEFLAG_SCHEDULE_TIMER 0x80 // 7th bit for Timer -#define MAX_STARTUP_RETRIES 3 // retry the statup commands x times +#define MAX_STARTUP_RETRIES 3 // retry the start-up commands x times namespace emsesp { From cab93b16b61049fd4db20715539609add53f28f2 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:31:38 +0100 Subject: [PATCH 07/15] id uses counter --- src/web/WebSchedulerService.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 475a8de2f..201ffcaff 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -34,11 +34,14 @@ void WebSchedulerService::begin() { } // this creates the scheduler file, saving it to the FS +// and also calls when the Scheduler web page is refreshed void WebScheduler::read(WebScheduler & webScheduler, JsonObject & root) { JsonArray schedule = root.createNestedArray("schedule"); + uint8_t counter = 0; + char s[3]; for (const ScheduleItem & scheduleItem : webScheduler.scheduleItems) { JsonObject si = schedule.createNestedObject(); - si["id"] = scheduleItem.id; // name, is unqiue + si["id"] = Helpers::smallitoa(s, ++counter); // id is only used to render the table and must be unique si["active"] = scheduleItem.active; si["flags"] = scheduleItem.flags; si["time"] = scheduleItem.time; @@ -48,7 +51,7 @@ void WebScheduler::read(WebScheduler & webScheduler, JsonObject & root) { } } -// call on initialization and also when the page is saved via web UI +// call on initialization and also when the Scheduile web page is updated // this loads the data into the internal class StateUpdateResult WebScheduler::update(JsonObject & root, WebScheduler & webScheduler) { #ifdef EMSESP_STANDALONE @@ -83,7 +86,7 @@ StateUpdateResult WebScheduler::update(JsonObject & root, WebScheduler & webSche // calculated elapsed minutes si.elapsed_min = Helpers::string2minutes(si.time); - si.retry_cnt = 0xFF; // no starup retries + si.retry_cnt = 0xFF; // no startup retries webScheduler.scheduleItems.push_back(si); // add to list if (!webScheduler.scheduleItems.back().name.empty()) { @@ -266,7 +269,7 @@ bool WebSchedulerService::command(const char * cmd, const char * data) { } // process any scheduled jobs -// checks on the minute +// checks on the minute and at startup void WebSchedulerService::loop() { // initialize static value on startup static int8_t last_tm_min = -1; // invalid value also used for startup commands From 3c10d750f0d90670bb42cac8839df18e3df14749 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:31:48 +0100 Subject: [PATCH 08/15] add TODO for translations --- src/locale_translations.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/locale_translations.h b/src/locale_translations.h index 0d2b9bbec..f93bcc3b7 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -50,6 +50,7 @@ MAKE_TRANSLATION(sensors_device, "Sensors", "Sensoren", "Sensoren", "Sensorer", MAKE_TRANSLATION(unknown_device, "Unknown", "Unbekannt", "Onbekend", "Okänt", "Nieznane urządzenie", "Ukjent", "Inconnu") // commands +// TODO translate MAKE_TRANSLATION(info_cmd, "lists all values", "Liste aller Werte", "", "", "", "", "", "Tüm değerleri listele") MAKE_TRANSLATION(commands_cmd, "lists all commands", "Liste aller Kommandos", "", "", "", "", "", "Tüm komutları listele") MAKE_TRANSLATION(entities_cmd, "lists all entities", "Liste aller Entitäten", "", "", "", "", "", "Tüm varlıkları listele") From 50d489d3c102db5519e7f671912213e1b8c75446 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:32:20 +0100 Subject: [PATCH 09/15] use safer strcmp() instead of comparing pointers --- src/emsdevice.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 5302d3f37..c525f7297 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1050,8 +1050,7 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { void EMSdevice::set_climate_minmax(uint8_t tag, int16_t min, uint16_t max) { for (auto & dv : devicevalues_) { - // TODO check if pointer reference is safe. strcpy better? - if (dv.tag == tag && dv.short_name == FL_(haclimate[0])) { + if (dv.tag == tag && (strcmp(dv.short_name, FL_(haclimate[0])) == 0)) { if (dv.min != min || dv.max != max) { dv.min = min; dv.max = max; From ef602ca70b7c3484cbb25b826ac7594f85a712eb Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:32:27 +0100 Subject: [PATCH 10/15] remove TODO --- .../ArduinoJson/Variant/VariantCompare.hpp | 288 +++++++++--------- 1 file changed, 149 insertions(+), 139 deletions(-) diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp index b6e7ea8c9..35ba67b5e 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantCompare.hpp @@ -20,190 +20,200 @@ template struct Comparer; template -struct Comparer::value>::type> - : ComparerBase { - T rhs; // TODO: store adapted string? +struct Comparer::value>::type> : ComparerBase { + T rhs; - explicit Comparer(T value) : rhs(value) {} + explicit Comparer(T value) + : rhs(value) { + } - CompareResult visitString(const char* lhs, size_t n) { - int i = stringCompare(adaptString(rhs), adaptString(lhs, n)); - if (i < 0) - return COMPARE_RESULT_GREATER; - else if (i > 0) - return COMPARE_RESULT_LESS; - else - return COMPARE_RESULT_EQUAL; - } + CompareResult visitString(const char * lhs, size_t n) { + int i = stringCompare(adaptString(rhs), adaptString(lhs, n)); + if (i < 0) + return COMPARE_RESULT_GREATER; + else if (i > 0) + return COMPARE_RESULT_LESS; + else + return COMPARE_RESULT_EQUAL; + } - CompareResult visitNull() { - if (adaptString(rhs).isNull()) - return COMPARE_RESULT_EQUAL; - else - return COMPARE_RESULT_DIFFER; - } + CompareResult visitNull() { + if (adaptString(rhs).isNull()) + return COMPARE_RESULT_EQUAL; + else + return COMPARE_RESULT_DIFFER; + } }; template -struct Comparer::value || - is_floating_point::value>::type> - : ComparerBase { - T rhs; +struct Comparer::value || is_floating_point::value>::type> : ComparerBase { + T rhs; - explicit Comparer(T value) : rhs(value) {} + explicit Comparer(T value) + : rhs(value) { + } - CompareResult visitFloat(JsonFloat lhs) { - return arithmeticCompare(lhs, rhs); - } + CompareResult visitFloat(JsonFloat lhs) { + return arithmeticCompare(lhs, rhs); + } - CompareResult visitSignedInteger(JsonInteger lhs) { - return arithmeticCompare(lhs, rhs); - } + CompareResult visitSignedInteger(JsonInteger lhs) { + return arithmeticCompare(lhs, rhs); + } - CompareResult visitUnsignedInteger(JsonUInt lhs) { - return arithmeticCompare(lhs, rhs); - } + CompareResult visitUnsignedInteger(JsonUInt lhs) { + return arithmeticCompare(lhs, rhs); + } - CompareResult visitBoolean(bool lhs) { - return visitUnsignedInteger(static_cast(lhs)); - } + CompareResult visitBoolean(bool lhs) { + return visitUnsignedInteger(static_cast(lhs)); + } }; struct NullComparer : ComparerBase { - CompareResult visitNull() { - return COMPARE_RESULT_EQUAL; - } + CompareResult visitNull() { + return COMPARE_RESULT_EQUAL; + } }; #if ARDUINOJSON_HAS_NULLPTR template <> struct Comparer : NullComparer { - explicit Comparer(decltype(nullptr)) : NullComparer() {} + explicit Comparer(decltype(nullptr)) + : NullComparer() { + } }; #endif struct ArrayComparer : ComparerBase { - const CollectionData* _rhs; + const CollectionData * _rhs; - explicit ArrayComparer(const CollectionData& rhs) : _rhs(&rhs) {} + explicit ArrayComparer(const CollectionData & rhs) + : _rhs(&rhs) { + } - CompareResult visitArray(const CollectionData& lhs) { - if (JsonArrayConst(&lhs) == JsonArrayConst(_rhs)) - return COMPARE_RESULT_EQUAL; - else - return COMPARE_RESULT_DIFFER; - } + CompareResult visitArray(const CollectionData & lhs) { + if (JsonArrayConst(&lhs) == JsonArrayConst(_rhs)) + return COMPARE_RESULT_EQUAL; + else + return COMPARE_RESULT_DIFFER; + } }; struct ObjectComparer : ComparerBase { - const CollectionData* _rhs; + const CollectionData * _rhs; - explicit ObjectComparer(const CollectionData& rhs) : _rhs(&rhs) {} + explicit ObjectComparer(const CollectionData & rhs) + : _rhs(&rhs) { + } - CompareResult visitObject(const CollectionData& lhs) { - if (JsonObjectConst(&lhs) == JsonObjectConst(_rhs)) - return COMPARE_RESULT_EQUAL; - else - return COMPARE_RESULT_DIFFER; - } + CompareResult visitObject(const CollectionData & lhs) { + if (JsonObjectConst(&lhs) == JsonObjectConst(_rhs)) + return COMPARE_RESULT_EQUAL; + else + return COMPARE_RESULT_DIFFER; + } }; struct RawComparer : ComparerBase { - const char* _rhsData; - size_t _rhsSize; + const char * _rhsData; + size_t _rhsSize; - explicit RawComparer(const char* rhsData, size_t rhsSize) - : _rhsData(rhsData), _rhsSize(rhsSize) {} + explicit RawComparer(const char * rhsData, size_t rhsSize) + : _rhsData(rhsData) + , _rhsSize(rhsSize) { + } - CompareResult visitRawJson(const char* lhsData, size_t lhsSize) { - size_t size = _rhsSize < lhsSize ? _rhsSize : lhsSize; - int n = memcmp(lhsData, _rhsData, size); - if (n < 0) - return COMPARE_RESULT_LESS; - else if (n > 0) - return COMPARE_RESULT_GREATER; - else - return COMPARE_RESULT_EQUAL; - } + CompareResult visitRawJson(const char * lhsData, size_t lhsSize) { + size_t size = _rhsSize < lhsSize ? _rhsSize : lhsSize; + int n = memcmp(lhsData, _rhsData, size); + if (n < 0) + return COMPARE_RESULT_LESS; + else if (n > 0) + return COMPARE_RESULT_GREATER; + else + return COMPARE_RESULT_EQUAL; + } }; struct VariantComparer : ComparerBase { - const VariantData* rhs; + const VariantData * rhs; - explicit VariantComparer(const VariantData* value) : rhs(value) {} - - CompareResult visitArray(const CollectionData& lhs) { - ArrayComparer comparer(lhs); - return accept(comparer); - } - - CompareResult visitObject(const CollectionData& lhs) { - ObjectComparer comparer(lhs); - return accept(comparer); - } - - CompareResult visitFloat(JsonFloat lhs) { - Comparer comparer(lhs); - return accept(comparer); - } - - CompareResult visitString(const char* lhs, size_t) { - Comparer comparer(lhs); - return accept(comparer); - } - - CompareResult visitRawJson(const char* lhsData, size_t lhsSize) { - RawComparer comparer(lhsData, lhsSize); - return accept(comparer); - } - - CompareResult visitSignedInteger(JsonInteger lhs) { - Comparer comparer(lhs); - return accept(comparer); - } - - CompareResult visitUnsignedInteger(JsonUInt lhs) { - Comparer comparer(lhs); - return accept(comparer); - } - - CompareResult visitBoolean(bool lhs) { - Comparer comparer(lhs); - return accept(comparer); - } - - CompareResult visitNull() { - NullComparer comparer; - return accept(comparer); - } - - private: - template - CompareResult accept(TComparer& comparer) { - CompareResult reversedResult = variantAccept(rhs, comparer); - switch (reversedResult) { - case COMPARE_RESULT_GREATER: - return COMPARE_RESULT_LESS; - case COMPARE_RESULT_LESS: - return COMPARE_RESULT_GREATER; - default: - return reversedResult; + explicit VariantComparer(const VariantData * value) + : rhs(value) { + } + + CompareResult visitArray(const CollectionData & lhs) { + ArrayComparer comparer(lhs); + return accept(comparer); + } + + CompareResult visitObject(const CollectionData & lhs) { + ObjectComparer comparer(lhs); + return accept(comparer); + } + + CompareResult visitFloat(JsonFloat lhs) { + Comparer comparer(lhs); + return accept(comparer); + } + + CompareResult visitString(const char * lhs, size_t) { + Comparer comparer(lhs); + return accept(comparer); + } + + CompareResult visitRawJson(const char * lhsData, size_t lhsSize) { + RawComparer comparer(lhsData, lhsSize); + return accept(comparer); + } + + CompareResult visitSignedInteger(JsonInteger lhs) { + Comparer comparer(lhs); + return accept(comparer); + } + + CompareResult visitUnsignedInteger(JsonUInt lhs) { + Comparer comparer(lhs); + return accept(comparer); + } + + CompareResult visitBoolean(bool lhs) { + Comparer comparer(lhs); + return accept(comparer); + } + + CompareResult visitNull() { + NullComparer comparer; + return accept(comparer); + } + + private: + template + CompareResult accept(TComparer & comparer) { + CompareResult reversedResult = variantAccept(rhs, comparer); + switch (reversedResult) { + case COMPARE_RESULT_GREATER: + return COMPARE_RESULT_LESS; + case COMPARE_RESULT_LESS: + return COMPARE_RESULT_GREATER; + default: + return reversedResult; + } } - } }; template -struct Comparer< - T, typename enable_if::value>::type> - : VariantComparer { - explicit Comparer(const T& value) - : VariantComparer(VariantAttorney::getData(value)) {} +struct Comparer::value>::type> : VariantComparer { + explicit Comparer(const T & value) + : VariantComparer(VariantAttorney::getData(value)) { + } }; template -CompareResult compare(JsonVariantConst lhs, const T& rhs) { - Comparer comparer(rhs); - return variantAccept(VariantAttorney::getData(lhs), comparer); +CompareResult compare(JsonVariantConst lhs, const T & rhs) { + Comparer comparer(rhs); + return variantAccept(VariantAttorney::getData(lhs), comparer); } -} // namespace ARDUINOJSON_NAMESPACE +} // namespace ARDUINOJSON_NAMESPACE From 607a7253959ac8740b4d94f895e302c8773960c9 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:33:01 +0100 Subject: [PATCH 11/15] add type cast so compiles standalone --- interface/src/i18n/en/index.ts | 4 ++-- interface/src/i18n/fr/index.ts | 4 ++-- interface/src/i18n/nl/index.ts | 4 ++-- interface/src/i18n/no/index.ts | 4 ++-- interface/src/i18n/pl/index.ts | 6 +++--- interface/src/i18n/sv/index.ts | 4 ++-- interface/src/i18n/tr/index.ts | 4 ++-- src/command.cpp | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index 7b9d37afa..0cd8899b9 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -310,8 +310,8 @@ const en: Translation = { STAY: 'Stay', LEAVE: 'Leave', SCHEDULER: 'Scheduler', - SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', - SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', + SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.', + SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', SCHEDULE: 'Schedule', TIME: 'Time', TIMER: 'Timer', diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 560624f7a..8a4b9a8a6 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -310,8 +310,8 @@ const fr: Translation = { STAY: 'Stay', // TODO translate LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate + SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index 8b5ff209f..e3c46292f 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -310,8 +310,8 @@ const nl: Translation = { STAY: 'Stay', // TODO translate LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate + SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 81bfa7a9b..ffbc15a9d 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -310,8 +310,8 @@ const no: Translation = { STAY: 'Stay', // TODO translate LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate + SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index 529b3d536..fa783c82a 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -310,9 +310,9 @@ const pl: BaseTranslation = { STAY: 'Stay', // TODO translate LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate - SCHEDULE: 'Schedule', // TODO translate SCHEDULE: 'Schedule', // TODO translate + SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate + SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate SCHEDULE_SAVED: 'Schedule updated', // TODO translate diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index 88914c749..5fa2ee34e 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -310,8 +310,8 @@ const sv: Translation = { STAY: 'Stay', // TODO translate LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate + SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index 5b69acfad..6947c2983 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -310,8 +310,8 @@ const tr: Translation = { STAY: 'Stay', // TODO translate LEAVE: 'Leave', // TODO translate SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Add custom scheduled commands to automate EMS-ESP. Add entity name to control activation by api/mqtt', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger on boot', // TODO translate + SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.', // TODO translate + SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate SCHEDULE: 'Schedule', // TODO translate TIME: 'Time', // TODO translate TIMER: 'Timer', // TODO translate diff --git a/src/command.cpp b/src/command.cpp index 26123341f..c997fddb1 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -149,7 +149,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec if (data.is()) { const char * d = data.as(); if (strlen(d)) { - char * device_end = strchr(d, '/'); + char * device_end = (char *)strchr(d, '/'); if (device_end != nullptr) { char device_s[15] = {'\0'}; const char * device_p = device_s; From 55af79dfeb2d93355d4903d73b8ae481c3d86cc7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:33:37 +0100 Subject: [PATCH 12/15] name message updated --- interface/src/project/validators.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/project/validators.ts b/interface/src/project/validators.ts index f007d27ef..7c2900572 100644 --- a/interface/src/project/validators.ts +++ b/interface/src/project/validators.ts @@ -90,8 +90,8 @@ export const schedulerItemValidation = (schedule: ScheduleItem[], scheduleItem: name: [ { type: 'string', - pattern: /^[a-zA-Z0-9_\\.]{1,15}$/, - message: "Must be 1-15 characters: alpha numeric, '_' or '.'" + pattern: /^[a-zA-Z0-9_\\.]{0,15}$/, + message: "Must be <15 characters: alpha numeric, '_' or '.'" }, ...[uniqueNameValidator(schedule, scheduleItem.o_name)] ], From 501f4a856abc1dab84ab1444b36f8e8a56ec0656 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 14:34:35 +0100 Subject: [PATCH 13/15] minor updates --- interface/src/project/SettingsScheduler.tsx | 30 ++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/interface/src/project/SettingsScheduler.tsx b/interface/src/project/SettingsScheduler.tsx index 4aec15e25..881f4b3a1 100644 --- a/interface/src/project/SettingsScheduler.tsx +++ b/interface/src/project/SettingsScheduler.tsx @@ -24,11 +24,11 @@ import { Table, Header, HeaderRow, HeaderCell, Body, Row, Cell } from '@table-li import { useSnackbar } from 'notistack'; import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; -import CheckIcon from '@mui/icons-material/Check'; import WarningIcon from '@mui/icons-material/Warning'; import CancelIcon from '@mui/icons-material/Cancel'; import DoneIcon from '@mui/icons-material/Done'; import AddIcon from '@mui/icons-material/Add'; +import CircleIcon from '@mui/icons-material/Circle'; import { ValidatedTextField, @@ -108,7 +108,7 @@ const SettingsScheduler: FC = () => { const schedule_theme = useTheme({ Table: ` - --data-table-library_grid-template-columns: 36px 324px 72px 240px repeat(1, minmax(100px, 1fr)) 152px; + --data-table-library_grid-template-columns: 36px 324px 50px 192px repeat(1, minmax(100px, 1fr)) 160px; `, BaseRow: ` font-size: 14px; @@ -374,7 +374,9 @@ const SettingsScheduler: FC = () => { {tableList.map((si: ScheduleItem) => ( editScheduleItem(si)}> - {si.active && } + + + @@ -484,18 +486,7 @@ const SettingsScheduler: FC = () => { control={} label={LL.ACTIVE()} /> - - - + { value={scheduleItem.value} onChange={updateValue(setScheduleItem)} /> + {!creating && ( From bcbfc09bf4257a61e7ad3353a55d17acdc66da1d Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 18:27:51 +0100 Subject: [PATCH 14/15] yet another package update --- .vscode/extensions.json | 18 +++++--- interface/package.json | 2 +- interface/yarn.lock | 96 ++++++++++++++++++++--------------------- 3 files changed, 60 insertions(+), 56 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 869be2399..3afe24493 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,9 +1,13 @@ { - "recommendations": [ - "platformio.platformio-ide", - "arcanis.vscode-zipfs", - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode" - ], - "unwantedRecommendations": ["ms-vscode.cpptools-extension-pack"] + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "arcanis.vscode-zipfs", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] } diff --git a/interface/package.json b/interface/package.json index d4a08813e..9812700bc 100644 --- a/interface/package.json +++ b/interface/package.json @@ -31,7 +31,7 @@ "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-router-dom": "^5.3.3", - "@yarnpkg/pnpify": "^4.0.0-rc.39", + "@yarnpkg/pnpify": "^4.0.0-rc.40", "async-validator": "^4.2.5", "axios": "^1.3.4", "history": "^5.3.0", diff --git a/interface/yarn.lock b/interface/yarn.lock index 0c036749e..9afa3274b 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -1572,17 +1572,17 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/core@npm:^4.0.0-rc.39": - version: 4.0.0-rc.39 - resolution: "@yarnpkg/core@npm:4.0.0-rc.39" +"@yarnpkg/core@npm:^4.0.0-rc.40": + version: 4.0.0-rc.40 + resolution: "@yarnpkg/core@npm:4.0.0-rc.40" dependencies: "@arcanis/slice-ansi": ^1.1.1 "@types/semver": ^7.1.0 "@types/treeify": ^1.0.0 - "@yarnpkg/fslib": ^3.0.0-rc.39 - "@yarnpkg/libzip": ^3.0.0-rc.39 - "@yarnpkg/parsers": ^3.0.0-rc.39 - "@yarnpkg/shell": ^4.0.0-rc.39 + "@yarnpkg/fslib": ^3.0.0-rc.40 + "@yarnpkg/libzip": ^3.0.0-rc.40 + "@yarnpkg/parsers": ^3.0.0-rc.40 + "@yarnpkg/shell": ^4.0.0-rc.40 camelcase: ^5.3.1 chalk: ^3.0.0 ci-info: ^3.2.0 @@ -1601,84 +1601,84 @@ __metadata: treeify: ^1.1.0 tslib: ^2.4.0 tunnel: ^0.0.6 - checksum: 673bbc5945b5cba7e9c23d88801d01be5a0f773e0d31f9ffd947b32587cfc75ac180272d2dc60f01c5d77c21c86196ee73ff439bf010ff7f8faf7ac8bbd612e5 + checksum: 38a141f5e26355fd75e23c2a3afbe6bb79693ad914d263a75a2d212185ad2f987c740aea2e9f61fe360fcee666e9c56b961ffe57444e367acb7cc2ed77327127 languageName: node linkType: hard -"@yarnpkg/fslib@npm:^3.0.0-rc.39": - version: 3.0.0-rc.39 - resolution: "@yarnpkg/fslib@npm:3.0.0-rc.39" +"@yarnpkg/fslib@npm:^3.0.0-rc.40": + version: 3.0.0-rc.40 + resolution: "@yarnpkg/fslib@npm:3.0.0-rc.40" dependencies: tslib: ^2.4.0 - checksum: 5f5912e931066ca273af46639c0a494aa4eea55ebff0110e326cddd4dd18ae3e59d08d3df3827db67420dbd1492094a7f359248883179964a2e07ca3465df905 + checksum: 8f36ade258a21ee9bec8621367dce68dab5d4e318863bd6b7585595f3697268f76fee5dd855c357ced31213d8ddbf2a2ab7a931d91699b295d60aa02433cc442 languageName: node linkType: hard -"@yarnpkg/libzip@npm:^3.0.0-rc.39": - version: 3.0.0-rc.39 - resolution: "@yarnpkg/libzip@npm:3.0.0-rc.39" +"@yarnpkg/libzip@npm:^3.0.0-rc.40": + version: 3.0.0-rc.40 + resolution: "@yarnpkg/libzip@npm:3.0.0-rc.40" dependencies: "@types/emscripten": ^1.39.6 - "@yarnpkg/fslib": ^3.0.0-rc.39 + "@yarnpkg/fslib": ^3.0.0-rc.40 tslib: ^2.4.0 peerDependencies: - "@yarnpkg/fslib": ^3.0.0-rc.39 - checksum: 25306ba2f0714a2a7de9b3b67dc6845cd5d3fab6f9e388dcc084b4ea359e845736e44037d3e6326391398ce3b2323929dad6106fb9ae96f0fd9407c806848c22 + "@yarnpkg/fslib": ^3.0.0-rc.40 + checksum: eca50e5f56709a98111a77bede2e25da573668ad9bc98be01326c0ef1b7e47aac4de19896cc8f2a59f4f4175dfc6e9e307ee18c25facc32353d1209ab43b1c2e languageName: node linkType: hard -"@yarnpkg/nm@npm:^4.0.0-rc.39": - version: 4.0.0-rc.39 - resolution: "@yarnpkg/nm@npm:4.0.0-rc.39" +"@yarnpkg/nm@npm:^4.0.0-rc.40": + version: 4.0.0-rc.40 + resolution: "@yarnpkg/nm@npm:4.0.0-rc.40" dependencies: - "@yarnpkg/core": ^4.0.0-rc.39 - "@yarnpkg/fslib": ^3.0.0-rc.39 - "@yarnpkg/pnp": ^4.0.0-rc.39 - checksum: b406a35ffa5c0818af8e66a531f53ba13beba43d4058b2ed24b6e79216d016d2f2d51ccab6e7cdcc29b217bcbbacd8c85addc905b7cc86200f22f89cf4cb4683 + "@yarnpkg/core": ^4.0.0-rc.40 + "@yarnpkg/fslib": ^3.0.0-rc.40 + "@yarnpkg/pnp": ^4.0.0-rc.40 + checksum: d575264238be9dbd7c5dc435227e830f2d4a1a61c82292a3d6e1dd1f966d552e1acc02aa0f7a2fa60ffa551a3b0862fde320428d6fea20dd110fec4dd1394c7d languageName: node linkType: hard -"@yarnpkg/parsers@npm:^3.0.0-rc.39": - version: 3.0.0-rc.39 - resolution: "@yarnpkg/parsers@npm:3.0.0-rc.39" +"@yarnpkg/parsers@npm:^3.0.0-rc.40": + version: 3.0.0-rc.40 + resolution: "@yarnpkg/parsers@npm:3.0.0-rc.40" dependencies: js-yaml: ^3.10.0 tslib: ^2.4.0 - checksum: b54fb3694bd09e09142d5a8d607240a8389ce3ccf44a70808ac770c178bb527948c3805a230b6fa55753f95574c93773a853a37ece978e323c9f2d229fd82252 + checksum: 64df0d8dad4cd43af5fcff758b0cfc47e7dc56e00eed87e3bd6ce8a9ea265c41fe758c1e01607e630bae46c9f8324ca853bced58be3d1c93492e125757ab7f30 languageName: node linkType: hard -"@yarnpkg/pnp@npm:^4.0.0-rc.39": - version: 4.0.0-rc.39 - resolution: "@yarnpkg/pnp@npm:4.0.0-rc.39" +"@yarnpkg/pnp@npm:^4.0.0-rc.40": + version: 4.0.0-rc.40 + resolution: "@yarnpkg/pnp@npm:4.0.0-rc.40" dependencies: "@types/node": ^18.11.11 - "@yarnpkg/fslib": ^3.0.0-rc.39 - checksum: 35e2b2b30ce17b74413d3cff91ff69698392c9e5a46061fd5c8c1754f78ed77133d7c18ac49a3a2eb3d4997b3d235e02e2309b6d240e8504171e9274fa2ea8ea + "@yarnpkg/fslib": ^3.0.0-rc.40 + checksum: ae680b0131027025cf22d35d41c9a72783aab0b4765fd73558834226a62154276da884a93bf7877d29dc5a696642c4d3999944dbb3d0743b4e3c6a4c71dc9855 languageName: node linkType: hard -"@yarnpkg/pnpify@npm:^4.0.0-rc.39": - version: 4.0.0-rc.39 - resolution: "@yarnpkg/pnpify@npm:4.0.0-rc.39" +"@yarnpkg/pnpify@npm:^4.0.0-rc.40": + version: 4.0.0-rc.40 + resolution: "@yarnpkg/pnpify@npm:4.0.0-rc.40" dependencies: - "@yarnpkg/core": ^4.0.0-rc.39 - "@yarnpkg/fslib": ^3.0.0-rc.39 - "@yarnpkg/nm": ^4.0.0-rc.39 + "@yarnpkg/core": ^4.0.0-rc.40 + "@yarnpkg/fslib": ^3.0.0-rc.40 + "@yarnpkg/nm": ^4.0.0-rc.40 clipanion: ^3.2.0-rc.10 tslib: ^2.4.0 bin: pnpify: ./lib/cli.js - checksum: 5a949e2b1a39ff633dd839cc2d9bc246e7861a8ff6d3ce81ec63c527f114cc006d3f3ca72102c88f65f65c98738d3c9d9872dc2fe2b3f3b6ccaa406bb9f08d3d + checksum: 51ef0c5db61faedb0b35dd9d19e2ce539d3dcf4e2d17080c0c3f3bcc4570c4ea644c98b989872da275b9b68b04afb9541676433d1a2838774878b659f896bc72 languageName: node linkType: hard -"@yarnpkg/shell@npm:^4.0.0-rc.39": - version: 4.0.0-rc.39 - resolution: "@yarnpkg/shell@npm:4.0.0-rc.39" +"@yarnpkg/shell@npm:^4.0.0-rc.40": + version: 4.0.0-rc.40 + resolution: "@yarnpkg/shell@npm:4.0.0-rc.40" dependencies: - "@yarnpkg/fslib": ^3.0.0-rc.39 - "@yarnpkg/parsers": ^3.0.0-rc.39 + "@yarnpkg/fslib": ^3.0.0-rc.40 + "@yarnpkg/parsers": ^3.0.0-rc.40 chalk: ^3.0.0 clipanion: ^3.2.0-rc.10 cross-spawn: 7.0.3 @@ -1687,7 +1687,7 @@ __metadata: tslib: ^2.4.0 bin: shell: ./lib/cli.js - checksum: 0b553155fafed194c3f954325afa7fe10389e4296c326e6ad9abd6238eb68e0282b5abdf1608e229d1c484b65d148a9157c1334caf830375cdd595110055da99 + checksum: 0e136522ce5f157b38bdbb9633b9860cdfa06846cb6eafa5b04a64b790381cf4d946037669d4e975d4c4c9b5264f7f89e206dac5c82f01673ca5e479235d3c63 languageName: node linkType: hard @@ -1712,7 +1712,7 @@ __metadata: "@typescript-eslint/eslint-plugin": ^5.54.0 "@typescript-eslint/parser": ^5.54.0 "@vitejs/plugin-react-swc": ^3.2.0 - "@yarnpkg/pnpify": ^4.0.0-rc.39 + "@yarnpkg/pnpify": ^4.0.0-rc.40 async-validator: ^4.2.5 axios: ^1.3.4 eslint: ^8.35.0 From fd7cbdbdc4f9dbdbf98f904bc71e21d12ee6da8e Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Mar 2023 18:28:01 +0100 Subject: [PATCH 15/15] green ticky circle thingy --- interface/src/project/SettingsScheduler.tsx | 22 +++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/interface/src/project/SettingsScheduler.tsx b/interface/src/project/SettingsScheduler.tsx index 881f4b3a1..5be09f33e 100644 --- a/interface/src/project/SettingsScheduler.tsx +++ b/interface/src/project/SettingsScheduler.tsx @@ -28,7 +28,7 @@ import WarningIcon from '@mui/icons-material/Warning'; import CancelIcon from '@mui/icons-material/Cancel'; import DoneIcon from '@mui/icons-material/Done'; import AddIcon from '@mui/icons-material/Add'; -import CircleIcon from '@mui/icons-material/Circle'; +import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import { ValidatedTextField, @@ -375,7 +375,7 @@ const SettingsScheduler: FC = () => { {tableList.map((si: ScheduleItem) => ( editScheduleItem(si)}> - + {si.active && } @@ -482,10 +482,20 @@ const SettingsScheduler: FC = () => { )} - } - label={LL.ACTIVE()} - /> + + + } + label={LL.ACTIVE()} + /> + {scheduleItem.active && ( + + + + )} + +