From 3dd84d73b21a2392afb432ecda40358447cf2666 Mon Sep 17 00:00:00 2001 From: Julius Jurgelenas Date: Sun, 30 Oct 2022 21:11:41 +0200 Subject: [PATCH] Implement "Copy from standard mode" --- graphql.schema.json | 440 +++++++++++++----- .../inputs/BuildUserDefinesTxtInput.ts | 12 + .../objects}/BuildFlashFirmwareResult.ts | 2 +- .../objects/BuilduserDefinesTxtResult.ts | 11 + .../objects/ClearFirmwareFilesResult.ts} | 0 .../objects}/ClearPlatformioCoreDirResult.ts | 0 .../objects}/SerialPortConnectResult.ts | 0 .../objects}/SerialPortDisconnectResult.ts | 0 .../graphql/resolvers/Firmware.resolver.ts | 18 +- .../resolvers/SerialMonitor.resolver.ts | 4 +- src/api/src/models/UserDefine.ts | 6 +- src/api/src/services/Firmware/index.ts | 7 +- src/ui/components/DeviceOptionsForm/index.tsx | 84 +++- src/ui/gql/generated/types.ts | 148 ++++-- .../gql/queries/buildUserDefinesTxt.graphql | 9 + src/ui/views/ConfiguratorView/index.tsx | 11 +- 16 files changed, 583 insertions(+), 169 deletions(-) create mode 100644 src/api/src/graphql/inputs/BuildUserDefinesTxtInput.ts rename src/api/src/{models => graphql/objects}/BuildFlashFirmwareResult.ts (89%) create mode 100644 src/api/src/graphql/objects/BuilduserDefinesTxtResult.ts rename src/api/src/{models/ClearFirmwareFiles.ts => graphql/objects/ClearFirmwareFilesResult.ts} (100%) rename src/api/src/{models => graphql/objects}/ClearPlatformioCoreDirResult.ts (100%) rename src/api/src/{models => graphql/objects}/SerialPortConnectResult.ts (100%) rename src/api/src/{models => graphql/objects}/SerialPortDisconnectResult.ts (100%) create mode 100644 src/ui/gql/queries/buildUserDefinesTxt.graphql diff --git a/graphql.schema.json b/graphql.schema.json index 8b0b96591..773a29ecd 100644 --- a/graphql.schema.json +++ b/graphql.schema.json @@ -124,9 +124,13 @@ "name": "firmware", "description": null, "type": { - "kind": "INPUT_OBJECT", - "name": "FirmwareVersionDataInput", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "FirmwareVersionDataInput", + "ofType": null + } }, "defaultValue": "{gitBranch: \"\", gitCommit: \"\", gitPullRequest: null, gitTag: \"\", localPath: \"\", source: GitBranch}", "isDeprecated": false, @@ -148,9 +152,13 @@ "name": "target", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"DIY_2400_TX_ESP32_SX1280_E28_via_UART\"", "isDeprecated": false, @@ -160,9 +168,13 @@ "name": "type", "description": null, "type": { - "kind": "ENUM", - "name": "BuildJobType", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "BuildJobType", + "ofType": null + } }, "defaultValue": "Build", "isDeprecated": false, @@ -172,15 +184,19 @@ "name": "userDefines", "description": null, "type": { - "kind": "LIST", + "kind": "NON_NULL", "name": null, "ofType": { - "kind": "NON_NULL", + "kind": "LIST", "name": null, "ofType": { - "kind": "INPUT_OBJECT", - "name": "UserDefineInput", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "UserDefineInput", + "ofType": null + } } } }, @@ -192,9 +208,13 @@ "name": "userDefinesMode", "description": null, "type": { - "kind": "ENUM", - "name": "UserDefinesMode", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "UserDefinesMode", + "ofType": null + } }, "defaultValue": "UserInterface", "isDeprecated": false, @@ -204,9 +224,13 @@ "name": "userDefinesTxt", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -416,6 +440,64 @@ ], "possibleTypes": null }, + { + "kind": "INPUT_OBJECT", + "name": "BuildUserDefinesTxtInput", + "description": null, + "fields": null, + "inputFields": [ + { + "name": "userDefines", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "UserDefineInput", + "ofType": null + } + } + } + }, + "defaultValue": "[]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "BuildUserDefinesTxtResult", + "description": null, + "fields": [ + { + "name": "userDefinesTxt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "ClearFirmwareFilesResult", @@ -743,9 +825,13 @@ "name": "gitBranch", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -755,9 +841,13 @@ "name": "gitCommit", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -779,9 +869,13 @@ "name": "gitTag", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -791,9 +885,13 @@ "name": "localPath", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -803,9 +901,13 @@ "name": "source", "description": null, "type": { - "kind": "ENUM", - "name": "FirmwareSource", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "FirmwareSource", + "ofType": null + } }, "defaultValue": "GitBranch", "isDeprecated": false, @@ -1310,6 +1412,39 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "buildUserDefinesTxt", + "description": null, + "args": [ + { + "name": "input", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "BuildUserDefinesTxtInput", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "BuildUserDefinesTxtResult", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "clearFirmwareFiles", "description": null, @@ -1584,9 +1719,13 @@ "name": "gitBranch", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1596,9 +1735,13 @@ "name": "gitCommit", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1636,9 +1779,13 @@ "name": "gitTag", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1648,9 +1795,13 @@ "name": "localPath", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1660,9 +1811,13 @@ "name": "source", "description": null, "type": { - "kind": "ENUM", - "name": "FirmwareSource", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "FirmwareSource", + "ofType": null + } }, "defaultValue": "GitBranch", "isDeprecated": false, @@ -1868,9 +2023,13 @@ "name": "gitBranch", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1880,9 +2039,13 @@ "name": "gitCommit", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1920,9 +2083,13 @@ "name": "gitTag", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1932,9 +2099,13 @@ "name": "localPath", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -1944,9 +2115,13 @@ "name": "source", "description": null, "type": { - "kind": "ENUM", - "name": "FirmwareSource", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "FirmwareSource", + "ofType": null + } }, "defaultValue": "GitBranch", "isDeprecated": false, @@ -2087,9 +2262,13 @@ "name": "gitBranch", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -2099,9 +2278,13 @@ "name": "gitCommit", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -2139,9 +2322,13 @@ "name": "gitTag", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -2151,9 +2338,13 @@ "name": "localPath", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -2163,9 +2354,13 @@ "name": "source", "description": null, "type": { - "kind": "ENUM", - "name": "FirmwareSource", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "FirmwareSource", + "ofType": null + } }, "defaultValue": "GitBranch", "isDeprecated": false, @@ -2175,9 +2370,13 @@ "name": "target", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"DIY_2400_TX_ESP32_SX1280_E28_via_UART\"", "isDeprecated": false, @@ -2263,9 +2462,13 @@ "name": "baudRate", "description": null, "type": { - "kind": "SCALAR", - "name": "Float", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } }, "defaultValue": "420000", "isDeprecated": false, @@ -2275,9 +2478,13 @@ "name": "port", "description": null, "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } }, "defaultValue": "\"\"", "isDeprecated": false, @@ -2791,13 +2998,9 @@ "description": null, "args": [], "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } + "kind": "SCALAR", + "name": "Boolean", + "ofType": null }, "isDeprecated": false, "deprecationReason": null @@ -2846,9 +3049,13 @@ "name": "enabled", "description": null, "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } }, "defaultValue": "false", "isDeprecated": false, @@ -2878,9 +3085,13 @@ "name": "key", "description": null, "type": { - "kind": "ENUM", - "name": "UserDefineKey", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "UserDefineKey", + "ofType": null + } }, "defaultValue": "FEATURE_OPENTX_SYNC", "isDeprecated": false, @@ -2890,9 +3101,13 @@ "name": "type", "description": null, "type": { - "kind": "ENUM", - "name": "UserDefineKind", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "UserDefineKind", + "ofType": null + } }, "defaultValue": "Boolean", "isDeprecated": false, @@ -3329,7 +3544,20 @@ { "name": "args", "description": null, - "args": [], + "args": [ + { + "name": "includeDeprecated", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false", + "isDeprecated": false, + "deprecationReason": null + } + ], "type": { "kind": "NON_NULL", "name": null, diff --git a/src/api/src/graphql/inputs/BuildUserDefinesTxtInput.ts b/src/api/src/graphql/inputs/BuildUserDefinesTxtInput.ts new file mode 100644 index 000000000..ebd3355a4 --- /dev/null +++ b/src/api/src/graphql/inputs/BuildUserDefinesTxtInput.ts @@ -0,0 +1,12 @@ +import { Field, InputType } from 'type-graphql'; +import UserDefineInput from './UserDefineInput'; + +@InputType('BuildUserDefinesTxtInput') +export default class BuildUserDefinesTxtInput { + @Field(() => [UserDefineInput]) + userDefines: UserDefineInput[]; + + constructor() { + this.userDefines = []; + } +} diff --git a/src/api/src/models/BuildFlashFirmwareResult.ts b/src/api/src/graphql/objects/BuildFlashFirmwareResult.ts similarity index 89% rename from src/api/src/models/BuildFlashFirmwareResult.ts rename to src/api/src/graphql/objects/BuildFlashFirmwareResult.ts index 097d78a96..88e26a1da 100644 --- a/src/api/src/models/BuildFlashFirmwareResult.ts +++ b/src/api/src/graphql/objects/BuildFlashFirmwareResult.ts @@ -1,5 +1,5 @@ import { Field, ObjectType } from 'type-graphql'; -import BuildFirmwareErrorType from './enum/BuildFirmwareErrorType'; +import BuildFirmwareErrorType from '../../models/enum/BuildFirmwareErrorType'; @ObjectType('BuildFlashFirmwareResult') export default class BuildFlashFirmwareResult { diff --git a/src/api/src/graphql/objects/BuilduserDefinesTxtResult.ts b/src/api/src/graphql/objects/BuilduserDefinesTxtResult.ts new file mode 100644 index 000000000..b103c8687 --- /dev/null +++ b/src/api/src/graphql/objects/BuilduserDefinesTxtResult.ts @@ -0,0 +1,11 @@ +import { Field, ObjectType } from 'type-graphql'; + +@ObjectType('BuildUserDefinesTxtResult') +export default class BuildUserDefinesTxtResult { + @Field({ nullable: true }) + userDefinesTxt: string; + + constructor(userDefinesTxt: string) { + this.userDefinesTxt = userDefinesTxt; + } +} diff --git a/src/api/src/models/ClearFirmwareFiles.ts b/src/api/src/graphql/objects/ClearFirmwareFilesResult.ts similarity index 100% rename from src/api/src/models/ClearFirmwareFiles.ts rename to src/api/src/graphql/objects/ClearFirmwareFilesResult.ts diff --git a/src/api/src/models/ClearPlatformioCoreDirResult.ts b/src/api/src/graphql/objects/ClearPlatformioCoreDirResult.ts similarity index 100% rename from src/api/src/models/ClearPlatformioCoreDirResult.ts rename to src/api/src/graphql/objects/ClearPlatformioCoreDirResult.ts diff --git a/src/api/src/models/SerialPortConnectResult.ts b/src/api/src/graphql/objects/SerialPortConnectResult.ts similarity index 100% rename from src/api/src/models/SerialPortConnectResult.ts rename to src/api/src/graphql/objects/SerialPortConnectResult.ts diff --git a/src/api/src/models/SerialPortDisconnectResult.ts b/src/api/src/graphql/objects/SerialPortDisconnectResult.ts similarity index 100% rename from src/api/src/models/SerialPortDisconnectResult.ts rename to src/api/src/graphql/objects/SerialPortDisconnectResult.ts diff --git a/src/api/src/graphql/resolvers/Firmware.resolver.ts b/src/api/src/graphql/resolvers/Firmware.resolver.ts index 647b8d692..58a301fcb 100644 --- a/src/api/src/graphql/resolvers/Firmware.resolver.ts +++ b/src/api/src/graphql/resolvers/Firmware.resolver.ts @@ -10,7 +10,7 @@ import { import { Service } from 'typedi'; import UserDefine from '../../models/UserDefine'; import BuildFlashFirmwareInput from '../inputs/BuildFlashFirmwareInput'; -import BuildFlashFirmwareResult from '../../models/BuildFlashFirmwareResult'; +import BuildFlashFirmwareResult from '../objects/BuildFlashFirmwareResult'; import FirmwareService, { BuildLogUpdatePayload, BuildProgressNotificationPayload, @@ -18,14 +18,16 @@ import FirmwareService, { import BuildProgressNotification from '../../models/BuildProgressNotification'; import PubSubTopic from '../../pubsub/enum/PubSubTopic'; import BuildLogUpdate from '../../models/BuildLogUpdate'; -import ClearPlatformioCoreDirResult from '../../models/ClearPlatformioCoreDirResult'; +import ClearPlatformioCoreDirResult from '../objects/ClearPlatformioCoreDirResult'; import TargetDeviceOptionsArgs from '../args/TargetDeviceOptions'; import UserDefinesBuilder from '../../services/UserDefinesBuilder'; -import ClearFirmwareFilesResult from '../../models/ClearFirmwareFiles'; +import ClearFirmwareFilesResult from '../objects/ClearFirmwareFilesResult'; import TargetsLoader from '../../services/TargetsLoader'; import TargetArgs from '../args/Target'; import Device from '../../models/Device'; import GitRepository from '../inputs/GitRepositoryInput'; +import BuildUserDefinesTxtInput from '../inputs/BuildUserDefinesTxtInput'; +import BuildUserDefinesTxtResult from '../objects/BuilduserDefinesTxtResult'; @Service() @Resolver() @@ -64,6 +66,16 @@ export default class FirmwareResolver { ); } + @Mutation(() => BuildUserDefinesTxtResult) + async buildUserDefinesTxt( + @Arg('input') input: BuildUserDefinesTxtInput + ): Promise { + const userDefinesTxt = await this.firmwareService.buildUserDefinesTxt( + input.userDefines + ); + return new BuildUserDefinesTxtResult(userDefinesTxt); + } + @Mutation(() => ClearPlatformioCoreDirResult) async clearPlatformioCoreDir(): Promise { try { diff --git a/src/api/src/graphql/resolvers/SerialMonitor.resolver.ts b/src/api/src/graphql/resolvers/SerialMonitor.resolver.ts index 53946cbd0..73e892a4d 100644 --- a/src/api/src/graphql/resolvers/SerialMonitor.resolver.ts +++ b/src/api/src/graphql/resolvers/SerialMonitor.resolver.ts @@ -12,9 +12,9 @@ import SerialMonitorService, { SerialMonitorLogUpdatePayload, } from '../../services/SerialMonitor'; import SerialPortInformation from '../../models/SerialPortInformation'; -import SerialPortConnectResult from '../../models/SerialPortConnectResult'; +import SerialPortConnectResult from '../objects/SerialPortConnectResult'; import SerialConnectionConfigInput from '../inputs/SerialConnectionConfigInput'; -import SerialPortDisconnectResult from '../../models/SerialPortDisconnectResult'; +import SerialPortDisconnectResult from '../objects/SerialPortDisconnectResult'; import PubSubTopic from '../../pubsub/enum/PubSubTopic'; import SerialMonitorLogUpdate from '../../models/SerialMonitorLogUpdate'; import SerialMonitorEvent from '../../models/SerialMonitorEvent'; diff --git a/src/api/src/models/UserDefine.ts b/src/api/src/models/UserDefine.ts index 6351fcfc1..83c9ff463 100644 --- a/src/api/src/models/UserDefine.ts +++ b/src/api/src/models/UserDefine.ts @@ -14,8 +14,8 @@ export default class UserDefine { @Field() enabled: boolean; - @Field() - sensitive: boolean; + @Field({ nullable: true }) + sensitive?: boolean; @Field(() => [String], { nullable: true }) enumValues?: string[]; @@ -33,7 +33,7 @@ export default class UserDefine { value = '', enumValues?: string[], optionGroup?: UserDefineOptionGroup, - sensitive?: boolean + sensitive = false ) { this.type = type; diff --git a/src/api/src/services/Firmware/index.ts b/src/api/src/services/Firmware/index.ts index 7061bb5f2..2660d5465 100644 --- a/src/api/src/services/Firmware/index.ts +++ b/src/api/src/services/Firmware/index.ts @@ -9,7 +9,7 @@ import BuildJobType from '../../models/enum/BuildJobType'; import UserDefinesMode from '../../models/enum/UserDefinesMode'; import UserDefine from '../../models/UserDefine'; import FirmwareSource from '../../models/enum/FirmwareSource'; -import BuildFlashFirmwareResult from '../../models/BuildFlashFirmwareResult'; +import BuildFlashFirmwareResult from '../../graphql/objects/BuildFlashFirmwareResult'; import Mutex from '../../library/Mutex'; import BuildFirmwareErrorType from '../../models/enum/BuildFirmwareErrorType'; import PubSubTopic from '../../pubsub/enum/PubSubTopic'; @@ -174,6 +174,11 @@ export default class FirmwareService { return false; } + async buildUserDefinesTxt(userDefines: UserDefine[]): Promise { + const userDefinesBuilder = new UserDefinesTxtFactory(); + return userDefinesBuilder.build(this.processUserDefines(userDefines)); + } + async buildFlashFirmware( params: BuildFlashFirmwareParams, gitRepositoryUrl: string, diff --git a/src/ui/components/DeviceOptionsForm/index.tsx b/src/ui/components/DeviceOptionsForm/index.tsx index e37c2b812..0f5b953fc 100644 --- a/src/ui/components/DeviceOptionsForm/index.tsx +++ b/src/ui/components/DeviceOptionsForm/index.tsx @@ -1,4 +1,5 @@ import { + Button, FormControl, FormControlLabel, Grid, @@ -7,15 +8,18 @@ import { TextField, Typography, } from '@mui/material'; -import React, { FunctionComponent } from 'react'; +import React, { FunctionComponent, useRef } from 'react'; import { SxProps, Theme } from '@mui/system'; import UserDefinesList from '../UserDefinesList'; import { FirmwareVersionDataInput, + useBuildUserDefinesTxtMutation, UserDefine, UserDefineKey, UserDefinesMode, } from '../../gql/generated/types'; +import ShowAlerts from '../ShowAlerts'; +import Loader from '../Loader'; const styles: Record> = { categoryTitle: { @@ -157,6 +161,16 @@ const userDefinesToCategories = ( return result; }; +export const cleanUserDefines = (userDefines: UserDefine[]): UserDefine[] => { + return userDefines.map((item) => ({ + key: item.key, + value: item.value, + enabled: item.enabled, + enumValues: item.enumValues, + type: item.type, + })); +}; + const DeviceOptionsForm: FunctionComponent = ( props ) => { @@ -209,6 +223,45 @@ const DeviceOptionsForm: FunctionComponent = ( }); }; + const userDefinesTxtRef = useRef(); + const [ + buildUserDefinesTxtMutation, + { error: buildError, loading: buildLoading }, + ] = useBuildUserDefinesTxtMutation(); + const onCopyFromStandardMode = () => { + buildUserDefinesTxtMutation({ + variables: { + input: { + userDefines: cleanUserDefines(deviceOptions.userDefineOptions), + }, + }, + }) + .then((result) => { + if ( + result.data?.buildUserDefinesTxt === undefined || + result.data?.buildUserDefinesTxt === null + ) { + return; + } + const userDefinesTxt = + result.data?.buildUserDefinesTxt.userDefinesTxt || ''; + onChange({ + ...deviceOptions, + userDefinesTxt, + }); + if ( + userDefinesTxtRef.current !== undefined && + userDefinesTxtRef.current.value !== undefined + ) { + userDefinesTxtRef.current.value = userDefinesTxt; + userDefinesTxtRef.current?.blur(); + } + }) + .catch((err) => { + console.error(err); + }); + }; + return ( <> @@ -233,15 +286,26 @@ const DeviceOptionsForm: FunctionComponent = ( {deviceOptions.userDefinesMode === UserDefinesMode.Manual && ( - + + + + + + + + )} {target !== null && categories !== null && diff --git a/src/ui/gql/generated/types.ts b/src/ui/gql/generated/types.ts index 372719ce0..f69a1d166 100644 --- a/src/ui/gql/generated/types.ts +++ b/src/ui/gql/generated/types.ts @@ -41,13 +41,13 @@ export enum BuildFirmwareStep { } export type BuildFlashFirmwareInput = { - readonly firmware?: InputMaybe; + readonly firmware?: FirmwareVersionDataInput; readonly serialDevice?: InputMaybe; - readonly target?: InputMaybe; - readonly type?: InputMaybe; - readonly userDefines?: InputMaybe>; - readonly userDefinesMode?: InputMaybe; - readonly userDefinesTxt?: InputMaybe; + readonly target?: Scalars['String']; + readonly type?: BuildJobType; + readonly userDefines?: ReadonlyArray; + readonly userDefinesMode?: UserDefinesMode; + readonly userDefinesTxt?: Scalars['String']; }; export type BuildFlashFirmwareResult = { @@ -82,6 +82,15 @@ export enum BuildProgressNotificationType { Success = 'Success', } +export type BuildUserDefinesTxtInput = { + readonly userDefines?: ReadonlyArray; +}; + +export type BuildUserDefinesTxtResult = { + readonly __typename?: 'BuildUserDefinesTxtResult'; + readonly userDefinesTxt?: Maybe; +}; + export type ClearFirmwareFilesResult = { readonly __typename?: 'ClearFirmwareFilesResult'; readonly message?: Maybe; @@ -122,12 +131,12 @@ export enum FirmwareSource { } export type FirmwareVersionDataInput = { - readonly gitBranch?: InputMaybe; - readonly gitCommit?: InputMaybe; + readonly gitBranch?: Scalars['String']; + readonly gitCommit?: Scalars['String']; readonly gitPullRequest?: InputMaybe; - readonly gitTag?: InputMaybe; - readonly localPath?: InputMaybe; - readonly source?: InputMaybe; + readonly gitTag?: Scalars['String']; + readonly localPath?: Scalars['String']; + readonly source?: FirmwareSource; }; export enum FlashingMethod { @@ -184,6 +193,7 @@ export type MulticastDnsMonitorUpdate = { export type Mutation = { readonly __typename?: 'Mutation'; readonly buildFlashFirmware: BuildFlashFirmwareResult; + readonly buildUserDefinesTxt: BuildUserDefinesTxtResult; readonly clearFirmwareFiles: ClearFirmwareFilesResult; readonly clearPlatformioCoreDir: ClearPlatformioCoreDirResult; readonly connectToSerialDevice: SerialPortConnectResult; @@ -195,6 +205,10 @@ export type MutationBuildFlashFirmwareArgs = { input: BuildFlashFirmwareInput; }; +export type MutationBuildUserDefinesTxtArgs = { + input: BuildUserDefinesTxtInput; +}; + export type MutationConnectToSerialDeviceArgs = { input: SerialConnectionConfigInput; }; @@ -229,13 +243,13 @@ export type Query = { }; export type QueryAvailableFirmwareTargetsArgs = { - gitBranch?: InputMaybe; - gitCommit?: InputMaybe; + gitBranch?: Scalars['String']; + gitCommit?: Scalars['String']; gitPullRequest?: InputMaybe; gitRepository: GitRepositoryInput; - gitTag?: InputMaybe; - localPath?: InputMaybe; - source?: InputMaybe; + gitTag?: Scalars['String']; + localPath?: Scalars['String']; + source?: FirmwareSource; }; export type QueryCheckForUpdatesArgs = { @@ -253,13 +267,13 @@ export type QueryGitTagsArgs = { }; export type QueryLuaScriptArgs = { - gitBranch?: InputMaybe; - gitCommit?: InputMaybe; + gitBranch?: Scalars['String']; + gitCommit?: Scalars['String']; gitPullRequest?: InputMaybe; gitRepository: GitRepositoryInput; - gitTag?: InputMaybe; - localPath?: InputMaybe; - source?: InputMaybe; + gitTag?: Scalars['String']; + localPath?: Scalars['String']; + source?: FirmwareSource; }; export type QueryPullRequestsArgs = { @@ -273,14 +287,14 @@ export type QueryReleasesArgs = { }; export type QueryTargetDeviceOptionsArgs = { - gitBranch?: InputMaybe; - gitCommit?: InputMaybe; + gitBranch?: Scalars['String']; + gitCommit?: Scalars['String']; gitPullRequest?: InputMaybe; gitRepository: GitRepositoryInput; - gitTag?: InputMaybe; - localPath?: InputMaybe; - source?: InputMaybe; - target?: InputMaybe; + gitTag?: Scalars['String']; + localPath?: Scalars['String']; + source?: FirmwareSource; + target?: Scalars['String']; }; export type Release = { @@ -290,8 +304,8 @@ export type Release = { }; export type SerialConnectionConfigInput = { - readonly baudRate?: InputMaybe; - readonly port?: InputMaybe; + readonly baudRate?: Scalars['Float']; + readonly port?: Scalars['String']; }; export type SerialMonitorEvent = { @@ -358,16 +372,16 @@ export type UserDefine = { readonly enumValues?: Maybe>; readonly key: UserDefineKey; readonly optionGroup?: Maybe; - readonly sensitive: Scalars['Boolean']; + readonly sensitive?: Maybe; readonly type: UserDefineKind; readonly value?: Maybe; }; export type UserDefineInput = { - readonly enabled?: InputMaybe; + readonly enabled?: Scalars['Boolean']; readonly enumValues?: InputMaybe>; - readonly key?: InputMaybe; - readonly type?: InputMaybe; + readonly key?: UserDefineKey; + readonly type?: UserDefineKind; readonly value?: InputMaybe; }; @@ -500,7 +514,7 @@ export type AvailableMulticastDnsDevicesListQuery = { readonly enabled: boolean; readonly enumValues?: ReadonlyArray | null; readonly value?: string | null; - readonly sensitive: boolean; + readonly sensitive?: boolean | null; }>; }>; }; @@ -547,6 +561,18 @@ export type BuildProgressNotificationsSubscription = { }; }; +export type BuildUserDefinesTxtMutationVariables = Exact<{ + input: BuildUserDefinesTxtInput; +}>; + +export type BuildUserDefinesTxtMutation = { + readonly __typename?: 'Mutation'; + readonly buildUserDefinesTxt: { + readonly __typename?: 'BuildUserDefinesTxtResult'; + readonly userDefinesTxt?: string | null; + }; +}; + export type CheckForUpdatesQueryVariables = Exact<{ currentVersion: Scalars['String']; }>; @@ -621,7 +647,7 @@ export type TargetDeviceOptionsQuery = { readonly enumValues?: ReadonlyArray | null; readonly value?: string | null; readonly optionGroup?: UserDefineOptionGroup | null; - readonly sensitive: boolean; + readonly sensitive?: boolean | null; }>; }; @@ -723,7 +749,7 @@ export type MulticastDnsMonitorUpdatesSubscription = { readonly enabled: boolean; readonly enumValues?: ReadonlyArray | null; readonly value?: string | null; - readonly sensitive: boolean; + readonly sensitive?: boolean | null; }>; }; }; @@ -1125,6 +1151,56 @@ export type BuildProgressNotificationsSubscriptionHookResult = ReturnType< >; export type BuildProgressNotificationsSubscriptionResult = Apollo.SubscriptionResult; +export const BuildUserDefinesTxtDocument = gql` + mutation buildUserDefinesTxt($input: BuildUserDefinesTxtInput!) { + buildUserDefinesTxt(input: $input) { + userDefinesTxt + } + } +`; +export type BuildUserDefinesTxtMutationFn = Apollo.MutationFunction< + BuildUserDefinesTxtMutation, + BuildUserDefinesTxtMutationVariables +>; + +/** + * __useBuildUserDefinesTxtMutation__ + * + * To run a mutation, you first call `useBuildUserDefinesTxtMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useBuildUserDefinesTxtMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [buildUserDefinesTxtMutation, { data, loading, error }] = useBuildUserDefinesTxtMutation({ + * variables: { + * input: // value for 'input' + * }, + * }); + */ +export function useBuildUserDefinesTxtMutation( + baseOptions?: Apollo.MutationHookOptions< + BuildUserDefinesTxtMutation, + BuildUserDefinesTxtMutationVariables + > +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useMutation< + BuildUserDefinesTxtMutation, + BuildUserDefinesTxtMutationVariables + >(BuildUserDefinesTxtDocument, options); +} +export type BuildUserDefinesTxtMutationHookResult = ReturnType< + typeof useBuildUserDefinesTxtMutation +>; +export type BuildUserDefinesTxtMutationResult = + Apollo.MutationResult; +export type BuildUserDefinesTxtMutationOptions = Apollo.BaseMutationOptions< + BuildUserDefinesTxtMutation, + BuildUserDefinesTxtMutationVariables +>; export const CheckForUpdatesDocument = gql` query checkForUpdates($currentVersion: String!) { checkForUpdates(currentVersion: $currentVersion) { diff --git a/src/ui/gql/queries/buildUserDefinesTxt.graphql b/src/ui/gql/queries/buildUserDefinesTxt.graphql new file mode 100644 index 000000000..8f9537fc0 --- /dev/null +++ b/src/ui/gql/queries/buildUserDefinesTxt.graphql @@ -0,0 +1,9 @@ +mutation buildUserDefinesTxt( + $input: BuildUserDefinesTxtInput! +) { + buildUserDefinesTxt( + input: $input + ) { + userDefinesTxt + } +} diff --git a/src/ui/views/ConfiguratorView/index.tsx b/src/ui/views/ConfiguratorView/index.tsx index b10c1188d..a6b5a933e 100644 --- a/src/ui/views/ConfiguratorView/index.tsx +++ b/src/ui/views/ConfiguratorView/index.tsx @@ -29,6 +29,7 @@ import { SxProps, Theme } from '@mui/system'; import FirmwareVersionForm from '../../components/FirmwareVersionForm'; import DeviceTargetForm from '../../components/DeviceTargetForm'; import DeviceOptionsForm, { + cleanUserDefines, DeviceOptionsFormData, } from '../../components/DeviceOptionsForm'; import ShowAlerts from '../../components/ShowAlerts'; @@ -566,13 +567,9 @@ const ConfiguratorView: FunctionComponent = (props) => { uploadPort = wifiDevice; } - const userDefines = deviceOptionsFormData.userDefineOptions.map((item) => ({ - key: item.key, - value: item.value, - enabled: item.enabled, - enumValues: item.enumValues, - type: item.type, - })); + const userDefines = cleanUserDefines( + deviceOptionsFormData.userDefineOptions + ); if (device?.parent && device?.name) { const deviceName = getAbbreviatedDeviceName(device);