Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement "Copy from standard mode" #417

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
440 changes: 334 additions & 106 deletions graphql.schema.json

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions src/api/src/graphql/inputs/BuildUserDefinesTxtInput.ts
Original file line number Diff line number Diff line change
@@ -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 = [];
}
}
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
11 changes: 11 additions & 0 deletions src/api/src/graphql/objects/BuilduserDefinesTxtResult.ts
Original file line number Diff line number Diff line change
@@ -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;
}
}
18 changes: 15 additions & 3 deletions src/api/src/graphql/resolvers/Firmware.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,24 @@ 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,
} from '../../services/Firmware';
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()
Expand Down Expand Up @@ -64,6 +66,16 @@ export default class FirmwareResolver {
);
}

@Mutation(() => BuildUserDefinesTxtResult)
async buildUserDefinesTxt(
@Arg('input') input: BuildUserDefinesTxtInput
): Promise<BuildUserDefinesTxtResult> {
const userDefinesTxt = await this.firmwareService.buildUserDefinesTxt(
input.userDefines
);
return new BuildUserDefinesTxtResult(userDefinesTxt);
}

@Mutation(() => ClearPlatformioCoreDirResult)
async clearPlatformioCoreDir(): Promise<ClearPlatformioCoreDirResult> {
try {
Expand Down
4 changes: 2 additions & 2 deletions src/api/src/graphql/resolvers/SerialMonitor.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
6 changes: 3 additions & 3 deletions src/api/src/models/UserDefine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[];
Expand All @@ -33,7 +33,7 @@ export default class UserDefine {
value = '',
enumValues?: string[],
optionGroup?: UserDefineOptionGroup,
sensitive?: boolean
sensitive = false
) {
this.type = type;

Expand Down
7 changes: 6 additions & 1 deletion src/api/src/services/Firmware/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -174,6 +174,11 @@ export default class FirmwareService {
return false;
}

async buildUserDefinesTxt(userDefines: UserDefine[]): Promise<string> {
const userDefinesBuilder = new UserDefinesTxtFactory();
return userDefinesBuilder.build(this.processUserDefines(userDefines));
}

async buildFlashFirmware(
params: BuildFlashFirmwareParams,
gitRepositoryUrl: string,
Expand Down
84 changes: 74 additions & 10 deletions src/ui/components/DeviceOptionsForm/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
Button,
FormControl,
FormControlLabel,
Grid,
Expand All @@ -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<string, SxProps<Theme>> = {
categoryTitle: {
Expand Down Expand Up @@ -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<DeviceOptionsFormProps> = (
props
) => {
Expand Down Expand Up @@ -209,6 +223,45 @@ const DeviceOptionsForm: FunctionComponent<DeviceOptionsFormProps> = (
});
};

const userDefinesTxtRef = useRef<HTMLInputElement>();
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 (
<>
<FormControl component="fieldset" sx={styles.userDefinesMode}>
Expand All @@ -233,15 +286,26 @@ const DeviceOptionsForm: FunctionComponent<DeviceOptionsFormProps> = (
</RadioGroup>
</FormControl>
{deviceOptions.userDefinesMode === UserDefinesMode.Manual && (
<TextField
sx={styles.textarea}
multiline
label="user_defines.txt"
onBlur={onUserDefinesTxt}
defaultValue={deviceOptions.userDefinesTxt}
fullWidth
rows={10}
/>
<Grid container spacing={3}>
<Grid item xs>
<TextField
sx={styles.textarea}
multiline
InputLabelProps={{ shrink: true }}
inputRef={userDefinesTxtRef}
label="user_defines.txt"
onBlur={onUserDefinesTxt}
defaultValue={deviceOptions.userDefinesTxt}
fullWidth
rows={10}
/>
<Loader loading={buildLoading} />
<ShowAlerts severity="error" messages={buildError} />
<Button onClick={onCopyFromStandardMode} size="small">
Copy from Standard mode
</Button>
</Grid>
</Grid>
)}
{target !== null &&
categories !== null &&
Expand Down
Loading