diff --git a/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/providers/github-trigger/components/labels-input-step.tsx b/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/providers/github-trigger/components/labels-input-step.tsx index c0fbfe5b27..314b2639fd 100644 --- a/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/providers/github-trigger/components/labels-input-step.tsx +++ b/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/providers/github-trigger/components/labels-input-step.tsx @@ -10,26 +10,41 @@ interface LabelsInputStepProps { eventId: GitHubTriggerEventId; owner: string; repo: string; + initialLabels?: string[]; onBack: () => void; onSubmit: ( e: FormEvent, rawLabels: { id: number; value: string }[], ) => void; + errorMessage?: string; isPending: boolean; - labelsError: string | null; + showBackButton?: boolean; } export function LabelsInputStep({ eventId, owner, repo, + initialLabels, onBack, onSubmit, + errorMessage, isPending, - labelsError, + showBackButton = true, }: LabelsInputStepProps) { - const [labels, setLabels] = useState([{ id: 1, value: "" }]); - const [nextId, setNextId] = useState(2); + const [labels, setLabels] = useState(() => + initialLabels !== undefined && initialLabels.length > 0 + ? initialLabels.map((value, index) => ({ + id: index + 1, + value, + })) + : [{ id: 1, value: "" }], + ); + const [nextId, setNextId] = useState( + initialLabels !== undefined && initialLabels.length > 0 + ? initialLabels.length + 1 + : 2, + ); return (
{labels.length > 1 && ( @@ -93,14 +108,15 @@ export function LabelsInputStep({ )} ))} - {labelsError ? ( -

{labelsError}

- ) : ( -

- Labels are required for issue labeled triggers. Examples: bug, - feature, urgent + {errorMessage !== undefined && ( +

+ {errorMessage}

)} +

+ Labels are required for issue labeled triggers. Examples: bug, + feature, urgent +

+ {showBackButton && ( + + )} + {!isReconfiguring && ( + + )} - {(data.trigger.configuration.event.id === - "github.issue_comment.created" || - data.trigger.configuration.event.id === - "github.pull_request_comment.created" || - data.trigger.configuration.event.id === - "github.pull_request_review_comment.created") && ( -
-
-

Call sign

-
- - /{data.trigger.configuration.event.conditions.callsign} - - + {hasCallsignCondition(data.trigger.configuration.event) && ( +
+

Call sign

+
+
+
+ + /{data.trigger.configuration.event.conditions.callsign} + + +
+

+ Use{" "} + + /{data.trigger.configuration.event.conditions.callsign} + {" "} + in GitHub comments to trigger this workflow. +

-

- Use{" "} - - /{data.trigger.configuration.event.conditions.callsign} - {" "} - in GitHub comments to trigger this workflow. -

+
)} - {(data.trigger.configuration.event.id === "github.issue.labeled" || - data.trigger.configuration.event.id === - "github.pull_request.labeled") && ( -
-
-

Labels

-
-
- {data.trigger.configuration.event.conditions.labels.map( - (label) => ( - - {label} - - ), - )} + {hasLabelsCondition(data.trigger.configuration.event) && ( +
+

Labels

+
+
+
+
+ {data.trigger.configuration.event.conditions.labels.map( + (label) => ( + + {label} + + ), + )} +
+

+ This workflow triggers when any of these labels are added to an + issue. +

-

- This workflow triggers when any of these labels are added to an - issue. -

+
)} diff --git a/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/ui/reconfiguring-views/github-trigger-reconfiguring-view.tsx b/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/ui/reconfiguring-views/github-trigger-reconfiguring-view.tsx index a203ae39bd..d7f95fc111 100644 --- a/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/ui/reconfiguring-views/github-trigger-reconfiguring-view.tsx +++ b/internal-packages/workflow-designer-ui/src/editor/properties-panel/trigger-node-properties-panel/ui/reconfiguring-views/github-trigger-reconfiguring-view.tsx @@ -2,17 +2,27 @@ import type { FlowTriggerId, TriggerNode } from "@giselle-sdk/data-type"; import type { GitHubIntegrationInstallation } from "@giselle-sdk/giselle"; import { useGitHubTrigger } from "../../../../lib/use-github-trigger"; import { Installed } from "../../providers/github-trigger/github-trigger-properties-panel"; +import type { GitHubTriggerSetupStep } from "../../providers/github-trigger/utils/resolve-next-step"; +import { + extractCallsign, + extractLabels, + isTriggerRequiringCallsign, + isTriggerRequiringLabels, +} from "../../providers/github-trigger/utils/trigger-configuration"; +import type { GitHubTriggerReconfigureMode } from "../configured-views/github-trigger-configured-view"; export function GitHubTriggerReconfiguringView({ installations, node, installationUrl, flowTriggerId, + reconfigureMode, }: { installations: GitHubIntegrationInstallation[]; node: TriggerNode; installationUrl: string; flowTriggerId: FlowTriggerId; + reconfigureMode?: GitHubTriggerReconfigureMode; }) { const { isLoading, data } = useGitHubTrigger(flowTriggerId); if (isLoading) { @@ -28,10 +38,49 @@ export function GitHubTriggerReconfiguringView({ return "Unexpected state"; } - const reconfigStep = { - state: "select-repository" as const, - eventId: data.trigger.configuration.event.id, + const event = data.trigger.configuration.event; + const repositoryInfo = { + installationId: data.trigger.configuration.installationId, + repoNodeId: data.trigger.configuration.repositoryNodeId, + owner: data.githubRepositoryFullname.owner, + repo: data.githubRepositoryFullname.repo, }; + const persistedCallsign = extractCallsign(event); + const persistedLabels = extractLabels(event); + + const reconfigStep: GitHubTriggerSetupStep = (() => { + if ( + reconfigureMode === "callsign" && + isTriggerRequiringCallsign(event.id) && + persistedCallsign + ) { + return { + state: "input-callsign", + eventId: event.id, + ...repositoryInfo, + callsign: persistedCallsign, + }; + } + if ( + reconfigureMode === "labels" && + isTriggerRequiringLabels(event.id) && + persistedLabels + ) { + return { + state: "input-labels", + eventId: event.id, + ...repositoryInfo, + labels: persistedLabels, + }; + } + return { + state: "select-repository", + eventId: event.id, + callsign: persistedCallsign, + labels: persistedLabels, + installationId: repositoryInfo.installationId, + }; + })(); return ( & { onSelectRepository: (value: SelectRepository) => void; + initialInstallationId?: number; }) { const [selectedInstallationId, setSelectedInstallationId] = useState< number | null - >(null); + >(() => initialInstallationId ?? null); const [isOrgDropdownOpen, setIsOrgDropdownOpen] = useState(false); const dropdownRef = useRef(null); diff --git a/packages/giselle/src/engine/index.ts b/packages/giselle/src/engine/index.ts index b9a257b849..dcc1e70ba0 100644 --- a/packages/giselle/src/engine/index.ts +++ b/packages/giselle/src/engine/index.ts @@ -3,6 +3,7 @@ import type { FileId, FlowTrigger, FlowTriggerId, + GitHubFlowTriggerEvent, NodeId, SecretId, Workspace, @@ -320,6 +321,7 @@ export function GiselleEngine(config: GiselleEngineConfig) { repositoryNodeId: string; installationId: number; useExperimentalStorage: boolean; + event?: GitHubFlowTriggerEvent; }) => { return await reconfigureGitHubTrigger({ ...args, context }); }, diff --git a/packages/giselle/src/engine/triggers/reconfigure-github-trigger.ts b/packages/giselle/src/engine/triggers/reconfigure-github-trigger.ts index d0097d3e3e..c590082d49 100644 --- a/packages/giselle/src/engine/triggers/reconfigure-github-trigger.ts +++ b/packages/giselle/src/engine/triggers/reconfigure-github-trigger.ts @@ -1,6 +1,7 @@ import { type FlowTrigger, type FlowTriggerId, + type GitHubFlowTriggerEvent, isTriggerNode, type TriggerNode, } from "@giselle-sdk/data-type"; @@ -18,6 +19,7 @@ export async function reconfigureGitHubTrigger(args: { repositoryNodeId: string; installationId: number; useExperimentalStorage: boolean; + event?: GitHubFlowTriggerEvent; }) { const currentTrigger = await getFlowTrigger({ storage: args.context.storage, @@ -59,7 +61,7 @@ export async function reconfigureGitHubTrigger(args: { provider: "github", repositoryNodeId: newRepositoryNodeId, installationId: args.installationId, - event: currentTrigger.configuration.event, + event: args.event ?? currentTrigger.configuration.event, }, } satisfies FlowTrigger; await setFlowTrigger({ diff --git a/packages/giselle/src/http/router.ts b/packages/giselle/src/http/router.ts index 1b12192edd..0b71a4523b 100644 --- a/packages/giselle/src/http/router.ts +++ b/packages/giselle/src/http/router.ts @@ -3,6 +3,7 @@ import { FileId, FlowTrigger, FlowTriggerId, + GitHubFlowTriggerEvent, NodeId, SecretId, Workspace, @@ -301,6 +302,7 @@ export const createJsonRouters = { repositoryNodeId: z.string(), installationId: z.number(), useExperimentalStorage: z.boolean(), + event: GitHubFlowTriggerEvent.optional(), }), handler: async ({ input }) => { return JsonResponse.json({