|
|
@@ -1611,97 +1611,100 @@ ToolRegistry.register({
|
|
|
})
|
|
|
|
|
|
return (
|
|
|
- <BasicTool
|
|
|
- {...props}
|
|
|
- icon="code-lines"
|
|
|
- defer
|
|
|
- trigger={{
|
|
|
- title: i18n.t("ui.tool.patch"),
|
|
|
- subtitle: subtitle(),
|
|
|
- }}
|
|
|
- >
|
|
|
- <Show when={files().length > 0}>
|
|
|
- <Accordion
|
|
|
- multiple
|
|
|
- data-scope="apply-patch"
|
|
|
- value={expanded()}
|
|
|
- onChange={(value) => setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
|
|
|
- >
|
|
|
- <For each={files()}>
|
|
|
- {(file) => {
|
|
|
- const active = createMemo(() => expanded().includes(file.filePath))
|
|
|
- const [visible, setVisible] = createSignal(false)
|
|
|
-
|
|
|
- createEffect(() => {
|
|
|
- if (!active()) {
|
|
|
- setVisible(false)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- requestAnimationFrame(() => {
|
|
|
- if (!active()) return
|
|
|
- setVisible(true)
|
|
|
+ <div data-component="apply-patch-tool">
|
|
|
+ <BasicTool
|
|
|
+ {...props}
|
|
|
+ icon="code-lines"
|
|
|
+ defer
|
|
|
+ trigger={{
|
|
|
+ title: i18n.t("ui.tool.patch"),
|
|
|
+ subtitle: subtitle(),
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Show when={files().length > 0}>
|
|
|
+ <Accordion
|
|
|
+ multiple
|
|
|
+ data-scope="apply-patch"
|
|
|
+ style={{ "--sticky-accordion-offset": "40px" }}
|
|
|
+ value={expanded()}
|
|
|
+ onChange={(value) => setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
|
|
|
+ >
|
|
|
+ <For each={files()}>
|
|
|
+ {(file) => {
|
|
|
+ const active = createMemo(() => expanded().includes(file.filePath))
|
|
|
+ const [visible, setVisible] = createSignal(false)
|
|
|
+
|
|
|
+ createEffect(() => {
|
|
|
+ if (!active()) {
|
|
|
+ setVisible(false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ requestAnimationFrame(() => {
|
|
|
+ if (!active()) return
|
|
|
+ setVisible(true)
|
|
|
+ })
|
|
|
})
|
|
|
- })
|
|
|
|
|
|
- return (
|
|
|
- <Accordion.Item value={file.filePath} data-type={file.type}>
|
|
|
- <StickyAccordionHeader>
|
|
|
- <Accordion.Trigger>
|
|
|
- <div data-slot="apply-patch-trigger-content">
|
|
|
- <div data-slot="apply-patch-file-info">
|
|
|
- <FileIcon node={{ path: file.relativePath, type: "file" }} />
|
|
|
- <div data-slot="apply-patch-file-name-container">
|
|
|
- <Show when={file.relativePath.includes("/")}>
|
|
|
- <span data-slot="apply-patch-directory">{`\u202A${getDirectory(file.relativePath)}\u202C`}</span>
|
|
|
- </Show>
|
|
|
- <span data-slot="apply-patch-filename">{getFilename(file.relativePath)}</span>
|
|
|
+ return (
|
|
|
+ <Accordion.Item value={file.filePath} data-type={file.type}>
|
|
|
+ <StickyAccordionHeader>
|
|
|
+ <Accordion.Trigger>
|
|
|
+ <div data-slot="apply-patch-trigger-content">
|
|
|
+ <div data-slot="apply-patch-file-info">
|
|
|
+ <FileIcon node={{ path: file.relativePath, type: "file" }} />
|
|
|
+ <div data-slot="apply-patch-file-name-container">
|
|
|
+ <Show when={file.relativePath.includes("/")}>
|
|
|
+ <span data-slot="apply-patch-directory">{`\u202A${getDirectory(file.relativePath)}\u202C`}</span>
|
|
|
+ </Show>
|
|
|
+ <span data-slot="apply-patch-filename">{getFilename(file.relativePath)}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div data-slot="apply-patch-trigger-actions">
|
|
|
+ <Switch>
|
|
|
+ <Match when={file.type === "add"}>
|
|
|
+ <span data-slot="apply-patch-change" data-type="added">
|
|
|
+ {i18n.t("ui.patch.action.created")}
|
|
|
+ </span>
|
|
|
+ </Match>
|
|
|
+ <Match when={file.type === "delete"}>
|
|
|
+ <span data-slot="apply-patch-change" data-type="removed">
|
|
|
+ {i18n.t("ui.patch.action.deleted")}
|
|
|
+ </span>
|
|
|
+ </Match>
|
|
|
+ <Match when={file.type === "move"}>
|
|
|
+ <span data-slot="apply-patch-change" data-type="modified">
|
|
|
+ {i18n.t("ui.patch.action.moved")}
|
|
|
+ </span>
|
|
|
+ </Match>
|
|
|
+ <Match when={true}>
|
|
|
+ <DiffChanges changes={{ additions: file.additions, deletions: file.deletions }} />
|
|
|
+ </Match>
|
|
|
+ </Switch>
|
|
|
+ <Icon name="chevron-grabber-vertical" size="small" />
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div data-slot="apply-patch-trigger-actions">
|
|
|
- <Switch>
|
|
|
- <Match when={file.type === "add"}>
|
|
|
- <span data-slot="apply-patch-change" data-type="added">
|
|
|
- {i18n.t("ui.patch.action.created")}
|
|
|
- </span>
|
|
|
- </Match>
|
|
|
- <Match when={file.type === "delete"}>
|
|
|
- <span data-slot="apply-patch-change" data-type="removed">
|
|
|
- {i18n.t("ui.patch.action.deleted")}
|
|
|
- </span>
|
|
|
- </Match>
|
|
|
- <Match when={file.type === "move"}>
|
|
|
- <span data-slot="apply-patch-change" data-type="modified">
|
|
|
- {i18n.t("ui.patch.action.moved")}
|
|
|
- </span>
|
|
|
- </Match>
|
|
|
- <Match when={true}>
|
|
|
- <DiffChanges changes={{ additions: file.additions, deletions: file.deletions }} />
|
|
|
- </Match>
|
|
|
- </Switch>
|
|
|
- <Icon name="chevron-grabber-vertical" size="small" />
|
|
|
+ </Accordion.Trigger>
|
|
|
+ </StickyAccordionHeader>
|
|
|
+ <Accordion.Content>
|
|
|
+ <Show when={visible()}>
|
|
|
+ <div data-component="apply-patch-file-diff">
|
|
|
+ <Dynamic
|
|
|
+ component={diffComponent}
|
|
|
+ before={{ name: file.filePath, contents: file.before }}
|
|
|
+ after={{ name: file.movePath ?? file.filePath, contents: file.after }}
|
|
|
+ />
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </Accordion.Trigger>
|
|
|
- </StickyAccordionHeader>
|
|
|
- <Accordion.Content>
|
|
|
- <Show when={visible()}>
|
|
|
- <div data-component="apply-patch-file-diff">
|
|
|
- <Dynamic
|
|
|
- component={diffComponent}
|
|
|
- before={{ name: file.filePath, contents: file.before }}
|
|
|
- after={{ name: file.movePath ?? file.filePath, contents: file.after }}
|
|
|
- />
|
|
|
- </div>
|
|
|
- </Show>
|
|
|
- </Accordion.Content>
|
|
|
- </Accordion.Item>
|
|
|
- )
|
|
|
- }}
|
|
|
- </For>
|
|
|
- </Accordion>
|
|
|
- </Show>
|
|
|
- </BasicTool>
|
|
|
+ </Show>
|
|
|
+ </Accordion.Content>
|
|
|
+ </Accordion.Item>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </For>
|
|
|
+ </Accordion>
|
|
|
+ </Show>
|
|
|
+ </BasicTool>
|
|
|
+ </div>
|
|
|
)
|
|
|
},
|
|
|
})
|