Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit054a220

Browse files
committed
feat: create dynamic parameter component
1 parent6a6e1ec commit054a220

File tree

8 files changed

+832
-91
lines changed

8 files changed

+832
-91
lines changed

‎site/src/api/typesParameter.ts‎

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// Code generated by 'guts'. DO NOT EDIT.
2+
3+
// From types/diagnostics.go
4+
exporttypeDiagnosticSeverityString="error"|"warning";
5+
6+
exportconstDiagnosticSeverityStrings:DiagnosticSeverityString[]=[
7+
"error",
8+
"warning",
9+
];
10+
11+
// From types/diagnostics.go
12+
exporttypeDiagnostics=readonlyFriendlyDiagnostic[];
13+
14+
// From types/diagnostics.go
15+
exportinterfaceFriendlyDiagnostic{
16+
readonlyseverity:DiagnosticSeverityString;
17+
readonlysummary:string;
18+
readonlydetail:string;
19+
}
20+
21+
// From types/value.go
22+
exportinterfaceNullHCLString{
23+
readonlyvalue:string;
24+
readonlyvalid:boolean;
25+
}
26+
27+
// From types/parameter.go
28+
exportinterfaceParameterextendsParameterData{
29+
readonlyvalue:NullHCLString;
30+
readonlydiagnostics:Diagnostics;
31+
}
32+
33+
// From types/parameter.go
34+
exportinterfaceParameterData{
35+
readonlyname:string;
36+
readonlydisplay_name:string;
37+
readonlydescription:string;
38+
readonlytype:ParameterType;
39+
// this is likely an enum in an external package "github.com/coder/terraform-provider-coder/v2/provider.ParameterFormType"
40+
readonlyform_type:string;
41+
// empty interface{} type, falling back to unknown
42+
readonlystyling:unknown;
43+
readonlymutable:boolean;
44+
readonlydefault_value:NullHCLString;
45+
readonlyicon:string;
46+
readonlyoptions:readonlyParameterOption[];
47+
readonlyvalidations:readonlyParameterValidation[];
48+
readonlyrequired:boolean;
49+
readonlyorder:number;
50+
readonlyephemeral:boolean;
51+
}
52+
53+
// From types/parameter.go
54+
exportinterfaceParameterOption{
55+
readonlyname:string;
56+
readonlydescription:string;
57+
readonlyvalue:NullHCLString;
58+
readonlyicon:string;
59+
}
60+
61+
// From types/enum.go
62+
exporttypeParameterType="bool"|"list(string)"|"number"|"string";
63+
64+
exportconstParameterTypes:ParameterType[]=[
65+
"bool",
66+
"list(string)",
67+
"number",
68+
"string",
69+
];
70+
71+
// From types/parameter.go
72+
exportinterfaceParameterValidation{
73+
readonlyvalidation_error:string;
74+
readonlyvalidation_regex:string|null;
75+
readonlyvalidation_min:number|null;
76+
readonlyvalidation_max:number|null;
77+
readonlyvalidation_monotonic:string|null;
78+
readonlyvalidation_invalid:boolean|null;
79+
}
80+
81+
// From web/session.go
82+
exportinterfaceRequest{
83+
readonlyid:number;
84+
readonlyinputs:Record<string,string>;
85+
}
86+
87+
// From web/session.go
88+
exportinterfaceResponse{
89+
readonlyid:number;
90+
readonlydiagnostics:Diagnostics;
91+
readonlyparameters:readonlyParameter[];
92+
}
93+
94+
// From web/session.go
95+
exportinterfaceSessionInputs{
96+
readonlyPlanPath:string;
97+
readonlyUser:WorkspaceOwner;
98+
}
99+
100+
// From types/parameter.go
101+
exportconstValidationMonotonicDecreasing="decreasing";
102+
103+
// From types/parameter.go
104+
exportconstValidationMonotonicIncreasing="increasing";
105+
106+
// From types/owner.go
107+
exportinterfaceWorkspaceOwner{
108+
readonlyid:string;
109+
readonlyname:string;
110+
readonlyfull_name:string;
111+
readonlyemail:string;
112+
readonlyssh_public_key:string;
113+
readonlygroups:readonlystring[];
114+
readonlysession_token:string;
115+
readonlyoidc_access_token:string;
116+
readonlylogin_type:string;
117+
readonlyrbac_roles:readonlyWorkspaceOwnerRBACRole[];
118+
}
119+
120+
// From types/owner.go
121+
exportinterfaceWorkspaceOwnerRBACRole{
122+
readonlyname:string;
123+
readonlyorg_id:string;
124+
}

‎site/src/components/Checkbox/Checkbox.tsx‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import * as React from "react";
88

99
import{cn}from"utils/cn";
1010

11+
/**
12+
* To allow for an indeterminate state the checkbox must be controlled, otherwise the checked prop would remain undefined
13+
*/
1114
exportconstCheckbox=React.forwardRef<
1215
React.ElementRef<typeofCheckboxPrimitive.Root>,
1316
React.ComponentPropsWithoutRef<typeofCheckboxPrimitive.Root>

‎site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,18 @@ export const MultiSelectCombobox = forwardRef<
203203
const[open,setOpen]=useState(false);
204204
const[onScrollbar,setOnScrollbar]=useState(false);
205205
const[isLoading,setIsLoading]=useState(false);
206-
constdropdownRef=useRef<HTMLDivElement>(null);// Added this
206+
constdropdownRef=useRef<HTMLDivElement>(null);
207207

208-
const[selected,setSelected]=useState<Option[]>(value||[]);
208+
constgetInitialSelectedOptions=()=>{
209+
if(arrayDefaultOptions&&arrayDefaultOptions.length>0){
210+
returnarrayDefaultOptions;
211+
}
212+
return[];
213+
};
214+
215+
const[selected,setSelected]=useState<Option[]>(
216+
getInitialSelectedOptions,
217+
);
209218
const[options,setOptions]=useState<GroupOption>(
210219
transitionToGroupOption(arrayDefaultOptions,groupBy),
211220
);

‎site/src/components/RadioGroup/RadioGroup.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const RadioGroupItem = React.forwardRef<
3434
focus:outline-none focus-visible:ring-2 focus-visible:ring-content-link
3535
focus-visible:ring-offset-4 focus-visible:ring-offset-surface-primary
3636
disabled:cursor-not-allowed disabled:opacity-25 disabled:border-surface-invert-primary
37-
hover:border-border-hover`,
37+
hover:border-border-hover data-[state=checked]:border-border-hover`,
3838
className,
3939
)}
4040
{...props}

‎site/src/hooks/useWebsocket.ts‎

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// This file is temporary until we have a proper websocket implementation for dynamic parameters
2+
import{useCallback,useEffect,useRef,useState}from"react";
3+
4+
exportfunctionuseWebSocket<T>(
5+
url:string,
6+
testdata:string,
7+
user:string,
8+
plan:string,
9+
){
10+
const[message,setMessage]=useState<T|null>(null);
11+
const[connectionStatus,setConnectionStatus]=useState<
12+
"connecting"|"connected"|"disconnected"
13+
>("connecting");
14+
constwsRef=useRef<WebSocket|null>(null);
15+
consturlRef=useRef(url);
16+
17+
constconnectWebSocket=useCallback(()=>{
18+
try{
19+
constws=newWebSocket(urlRef.current);
20+
wsRef.current=ws;
21+
setConnectionStatus("connecting");
22+
23+
ws.onopen=()=>{
24+
// console.log("Connected to WebSocket");
25+
setConnectionStatus("connected");
26+
ws.send(JSON.stringify({}));
27+
};
28+
29+
ws.onmessage=(event)=>{
30+
try{
31+
constdata:T=JSON.parse(event.data);
32+
// console.log("Received message:", data);
33+
setMessage(data);
34+
}catch(err){
35+
console.error("Invalid JSON from server: ",event.data);
36+
console.error("Error: ",err);
37+
}
38+
};
39+
40+
ws.onerror=(event)=>{
41+
console.error("WebSocket error:",event);
42+
};
43+
44+
ws.onclose=(event)=>{
45+
// console.log(
46+
// `WebSocket closed with code ${event.code}. Reason: ${event.reason}`,
47+
// );
48+
setConnectionStatus("disconnected");
49+
};
50+
}catch(error){
51+
console.error("Failed to create WebSocket connection:",error);
52+
setConnectionStatus("disconnected");
53+
}
54+
},[]);
55+
56+
useEffect(()=>{
57+
if(!testdata){
58+
return;
59+
}
60+
61+
setMessage(null);
62+
setConnectionStatus("connecting");
63+
64+
constcreateConnection=()=>{
65+
urlRef.current=url;
66+
connectWebSocket();
67+
};
68+
69+
if(wsRef.current){
70+
wsRef.current.close();
71+
wsRef.current=null;
72+
}
73+
74+
consttimeoutId=setTimeout(createConnection,100);
75+
76+
return()=>{
77+
clearTimeout(timeoutId);
78+
if(wsRef.current){
79+
wsRef.current.close();
80+
wsRef.current=null;
81+
}
82+
};
83+
},[testdata,connectWebSocket,url]);
84+
85+
constsendMessage=(data:unknown)=>{
86+
if(wsRef.current&&wsRef.current.readyState===WebSocket.OPEN){
87+
wsRef.current.send(JSON.stringify(data));
88+
}else{
89+
console.warn("Cannot send message: WebSocket is not connected");
90+
}
91+
};
92+
93+
return{ message, sendMessage, connectionStatus};
94+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp