From 8c4b2c199c5f44bffede581e22307b9669a85066 Mon Sep 17 00:00:00 2001 From: Atharva Kale Date: Wed, 15 Jan 2025 19:21:57 +0530 Subject: [PATCH 1/6] empty commit From f7e848a1e7a7cdb827339f0bd2242864f10124d6 Mon Sep 17 00:00:00 2001 From: Atharva Kale Date: Wed, 15 Jan 2025 21:52:53 +0530 Subject: [PATCH 2/6] Copy over the new openapi.yaml --- src/shared/openapi.yaml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/shared/openapi.yaml b/src/shared/openapi.yaml index 294e5bf..dfe909a 100644 --- a/src/shared/openapi.yaml +++ b/src/shared/openapi.yaml @@ -231,10 +231,11 @@ components: - $ref: '#/components/schemas/TextParameterDescriptor' - $ref: '#/components/schemas/RangedIntParameterDescriptor' - $ref: '#/components/schemas/IntParameterDescriptor' + - $ref: '#/components/schemas/BoolParameterDescriptor' ParameterType: type: string - enum: ["ranged_float", "float", "enum", "text", "ranged_int", "int"] + enum: ["ranged_float", "float", "enum", "text", "ranged_int", "int", "boolean"] RangedFloatParameterDescriptor: type: object @@ -349,6 +350,19 @@ components: max: type: number + BoolParameterDescriptor: + type: object + required: [parameterType, default] + discriminator: + propertyName: parameterType + properties: + parameterType: + type: string + $ref: "#/components/schemas/ParameterType" + default: "boolean" + default: + type: boolean + # Request Models RequestBody: type: object From 5d0b14554921274758bb2acd3bb132bb112fe8f9 Mon Sep 17 00:00:00 2001 From: Atharva Kale Date: Wed, 15 Jan 2025 21:53:20 +0530 Subject: [PATCH 3/6] regenerate the models and fix issues in generated file --- src/shared/generated_models.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/shared/generated_models.ts b/src/shared/generated_models.ts index 768352f..f6018f0 100644 --- a/src/shared/generated_models.ts +++ b/src/shared/generated_models.ts @@ -42,6 +42,10 @@ declare namespace Components { output_type: 'batchtext'; texts: TextResponse[]; } + export interface BoolParameterDescriptor { + parameterType: ParameterType; + default: boolean; + } export interface DirectoryInput { path: string; } @@ -118,7 +122,7 @@ declare namespace Components { output_type: 'markdown'; value: string; title?: string | null; - subtitle?: string; + subtitle?: string | null; } export interface NewFileInputType { /** @@ -161,7 +165,8 @@ declare namespace Components { | EnumParameterDescriptor | TextParameterDescriptor | RangedIntParameterDescriptor - | IntParameterDescriptor; + | IntParameterDescriptor + | BoolParameterDescriptor; } export type ParameterType = | 'ranged_float' @@ -169,7 +174,8 @@ declare namespace Components { | 'enum' | 'text' | 'ranged_int' - | 'int'; + | 'int' + | 'boolean'; export interface RangedFloatParameterDescriptor { parameterType: ParameterType; range: FloatRangeDescriptor; @@ -243,7 +249,7 @@ declare namespace Components { output_type: 'text'; value: string; title?: string | null; - subtitle?: string; + subtitle?: string | null; } } } @@ -256,6 +262,8 @@ export type BatchFileInput = Components.Schemas.BatchFileInput; export type BatchFileResponse = Components.Schemas.BatchFileResponse; export type BatchTextInput = Components.Schemas.BatchTextInput; export type BatchTextResponse = Components.Schemas.BatchTextResponse; +export type BoolParameterDescriptor = + Components.Schemas.BoolParameterDescriptor; export type DirectoryInput = Components.Schemas.DirectoryInput; export type DirectoryResponse = Components.Schemas.DirectoryResponse; export type EnumParameterDescriptor = From 42ebf87d4a2e245e5c22b6e37e51fd575825c55c Mon Sep 17 00:00:00 2001 From: Atharva Kale Date: Wed, 15 Jan 2025 21:54:21 +0530 Subject: [PATCH 4/6] Compiler Assisted Refactoring --- package-lock.json | 132 ++++++++++++++++++ package.json | 8 +- src/renderer/components/ParameterField.tsx | 11 ++ .../parameter_fields/BooleanField.tsx | 42 ++++++ src/renderer/components/ui/checkbox.tsx | 34 +++++ src/renderer/models/ModelRunTask.tsx | 7 +- 6 files changed, 230 insertions(+), 4 deletions(-) create mode 100644 src/renderer/components/parameter_fields/BooleanField.tsx create mode 100644 src/renderer/components/ui/checkbox.tsx diff --git a/package-lock.json b/package-lock.json index 73afdb4..26cbdba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@electron/remote": "^2.1.2", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", + "@radix-ui/react-checkbox": "^1.1.3", "@radix-ui/react-collapsible": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.2", @@ -3995,6 +3996,137 @@ } } }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.3.tgz", + "integrity": "sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collapsible": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz", diff --git a/package.json b/package.json index 1f17913..e71e6c6 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", "build:models": "npx openapicmd typegen ./src/shared/openapi.yaml > ./src/shared/generated_models.ts", + "tsc": "tsc", "postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && npm run build:dll", "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", "lint-fix-models": "eslint src/shared/generated-models.ts --fix --ext .js,.jsx,.ts,.tsx", @@ -109,6 +110,7 @@ "@electron/remote": "^2.1.2", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", + "@radix-ui/react-checkbox": "^1.1.3", "@radix-ui/react-collapsible": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.2", @@ -247,7 +249,9 @@ "universal" ] }, - "additionalArguments": ["-s -"], + "additionalArguments": [ + "-s -" + ], "type": "distribution", "hardenedRuntime": true, "entitlements": "assets/entitlements.mac.plist", @@ -313,4 +317,4 @@ ], "logLevel": "quiet" } -} \ No newline at end of file +} diff --git a/src/renderer/components/ParameterField.tsx b/src/renderer/components/ParameterField.tsx index e2a60e6..c8f36f9 100644 --- a/src/renderer/components/ParameterField.tsx +++ b/src/renderer/components/ParameterField.tsx @@ -8,6 +8,7 @@ import FloatField from './parameter_fields/FloatField'; import EnumField from './parameter_fields/EnumField'; import RangedIntField from './parameter_fields/RangedIntField'; import RangedFloatField from './parameter_fields/RangedFloatField'; +import BooleanField from './parameter_fields/BooleanField'; function LabelAndSubtitle({ children, @@ -125,6 +126,16 @@ function getFieldByParameterSchema( ); }) + .with({ parameterType: 'boolean' }, () => { + return ( + + ); + }) .exhaustive(); } catch (e) { if (e instanceof NonExhaustiveError) { diff --git a/src/renderer/components/parameter_fields/BooleanField.tsx b/src/renderer/components/parameter_fields/BooleanField.tsx new file mode 100644 index 0000000..9546be2 --- /dev/null +++ b/src/renderer/components/parameter_fields/BooleanField.tsx @@ -0,0 +1,42 @@ +/* eslint-disable jsx-a11y/label-has-associated-control */ +import { ParameterSchema } from 'src/shared/generated_models'; +import { Checkbox } from '@shadcn/checkbox'; + +export default function BooleanField({ + parameterSchema, + value, + onChange, + disabled, +}: { + parameterSchema: ParameterSchema; + value: boolean; + onChange: (value: boolean) => void; + disabled: boolean; +}) { + const defaultChecked = disabled + ? value + : Boolean(parameterSchema.value.default); + return ( +
+
+ onChange(state as boolean)} + disabled={disabled} + /> +
+ +

+ {parameterSchema.subtitle || ''} +

+
+
+
+ ); +} diff --git a/src/renderer/components/ui/checkbox.tsx b/src/renderer/components/ui/checkbox.tsx new file mode 100644 index 0000000..6d1db2f --- /dev/null +++ b/src/renderer/components/ui/checkbox.tsx @@ -0,0 +1,34 @@ +/* eslint-disable import/prefer-default-export */ +/* eslint-disable react/jsx-props-no-spreading */ +/* eslint-disable react/prop-types */ + +'use client'; + +import * as React from 'react'; +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; +import { Check } from 'lucide-react'; + +import { cn } from 'src/renderer/lib/utils'; + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; + +export { Checkbox }; diff --git a/src/renderer/models/ModelRunTask.tsx b/src/renderer/models/ModelRunTask.tsx index 6633c46..e91bfa5 100644 --- a/src/renderer/models/ModelRunTask.tsx +++ b/src/renderer/models/ModelRunTask.tsx @@ -123,7 +123,10 @@ export default function ModelRunTask() { name={parameterSchema.key} control={control} rules={{ - required: `Field is required.`, + required: + parameterSchema.value.parameterType !== 'boolean' + ? `Field is required.` + : undefined, validate: { validInt: (v) => (parameterSchema.value.parameterType === 'int' @@ -135,7 +138,7 @@ export default function ModelRunTask() { : true) || `Value must be a float.`, }, }} - defaultValue={parameterSchema.value.default || ''} + defaultValue={parameterSchema.value.default ?? ''} render={({ field }) => ( Date: Wed, 15 Jan 2025 21:54:27 +0530 Subject: [PATCH 5/6] Manual Testing --- src/shared/dummy_data/task_schema4.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/shared/dummy_data/task_schema4.ts b/src/shared/dummy_data/task_schema4.ts index e75a4c7..e04d76b 100644 --- a/src/shared/dummy_data/task_schema4.ts +++ b/src/shared/dummy_data/task_schema4.ts @@ -134,6 +134,15 @@ const taskSchema4: TaskSchema = { }, }, }, + { + key: 'sample_checkbox', + label: 'Sample Checkbox', + subtitle: 'This is a sample checkbox', + value: { + parameterType: 'boolean', + default: false, + }, + }, ], }; From d8baad6a3ba685a06609d27dd2f37c5464883db5 Mon Sep 17 00:00:00 2001 From: Atharva Kale Date: Wed, 15 Jan 2025 22:00:29 +0530 Subject: [PATCH 6/6] dummy mode false --- src/shared/dummy_data/set_dummy_mode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/dummy_data/set_dummy_mode.ts b/src/shared/dummy_data/set_dummy_mode.ts index 48bc3a1..f34696a 100644 --- a/src/shared/dummy_data/set_dummy_mode.ts +++ b/src/shared/dummy_data/set_dummy_mode.ts @@ -1,3 +1,3 @@ -const isDummyMode = true; +const isDummyMode = false; export default isDummyMode;