From 65f96ac37d95c93b1477700ed5d31a3649d3bb30 Mon Sep 17 00:00:00 2001 From: Mattias Granlund Date: Fri, 24 Jan 2025 01:17:41 +0100 Subject: [PATCH] Render uncommitted file list - distinguish old FileList items from new with ChangeList name - rewritten id selection mechanism - no "ownership" support yet for committing --- .../src/components/ChangeContextMenu.svelte | 170 +++++++++++++ apps/desktop/src/components/ChangeList.svelte | 74 ++++++ .../components/ChangeListItemWrapper.svelte | 112 +++++++++ .../src/components/FileContextMenu.svelte | 1 + .../src/components/WorktreeChanges.svelte | 24 +- apps/desktop/src/lib/dragging/draggable.ts | 14 +- apps/desktop/src/lib/dragging/draggables.ts | 33 ++- apps/desktop/src/lib/files/utils.ts | 9 + .../worktreeTypes.ts => hunks/change.ts} | 57 +---- apps/desktop/src/lib/hunks/hunk.ts | 36 +++ .../src/lib/selection/idSelection.svelte.ts | 98 ++++++++ .../src/lib/selection/idSelectionUtils.ts | 234 ++++++++++++++++++ apps/desktop/src/lib/selection/key.ts | 17 ++ apps/desktop/src/lib/utils/fileStatus.ts | 14 ++ apps/desktop/src/lib/utils/selection.ts | 2 + apps/desktop/src/lib/worktree/changeTree.ts | 72 ++++++ .../lib/worktree/worktreeService.svelte.ts | 2 +- apps/desktop/src/routes/+layout.svelte | 9 +- packages/ui/src/lib/file/FileListItem.svelte | 1 - packages/ui/src/styles/core/reset.css | 1 - 20 files changed, 919 insertions(+), 61 deletions(-) create mode 100644 apps/desktop/src/components/ChangeContextMenu.svelte create mode 100644 apps/desktop/src/components/ChangeList.svelte create mode 100644 apps/desktop/src/components/ChangeListItemWrapper.svelte create mode 100644 apps/desktop/src/lib/files/utils.ts rename apps/desktop/src/lib/{worktree/worktreeTypes.ts => hunks/change.ts} (73%) create mode 100644 apps/desktop/src/lib/selection/idSelection.svelte.ts create mode 100644 apps/desktop/src/lib/selection/idSelectionUtils.ts create mode 100644 apps/desktop/src/lib/selection/key.ts create mode 100644 apps/desktop/src/lib/worktree/changeTree.ts diff --git a/apps/desktop/src/components/ChangeContextMenu.svelte b/apps/desktop/src/components/ChangeContextMenu.svelte new file mode 100644 index 0000000000..6b5092f703 --- /dev/null +++ b/apps/desktop/src/components/ChangeContextMenu.svelte @@ -0,0 +1,170 @@ + + + + + {#snippet children(item)} + + {#if item.files && item.files.length > 0} + {@const files = item.files} + {#if files[0] instanceof LocalFile && !isUnapplied && !isBinary} + { + confirmationModal?.show(item); + contextMenu.close(); + }} + /> + {/if} + {#if files.length === 1} + { + try { + if (!project) return; + const absPath = await join(project.path, item.files[0].path); + navigator.clipboard.writeText(absPath); + contextMenu.close(); + // dismiss(); + } catch (err) { + console.error('Failed to copy path', err); + toasts.error('Failed to copy path'); + } + }} + /> + { + try { + if (!project) return; + navigator.clipboard.writeText(item.files[0].path); + contextMenu.close(); + } catch (err) { + console.error('Failed to copy relative path', err); + toasts.error('Failed to copy relative path'); + } + }} + /> + {/if} + { + try { + if (!project) return; + for (let file of item.files) { + const path = getEditorUri({ + schemeId: $userSettings.defaultCodeEditor.schemeIdentifer, + path: [project.vscodePath, file.path] + }); + openExternalUrl(path); + } + contextMenu.close(); + } catch { + console.error('Failed to open in editor'); + toasts.error('Failed to open in editor'); + } + }} + /> + {/if} + + {/snippet} + + + + {#snippet children(item)} + {#if item.files.length < 10} +

+ Are you sure you want to discard the changes
to the following files: +

+ + {:else} + Discard the changes to all + {item.files.length} files + ? + {/if} + {/snippet} + {#snippet controls(close, item)} + + + {/snippet} +
+ + diff --git a/apps/desktop/src/components/ChangeList.svelte b/apps/desktop/src/components/ChangeList.svelte new file mode 100644 index 0000000000..1f0a763f2b --- /dev/null +++ b/apps/desktop/src/components/ChangeList.svelte @@ -0,0 +1,74 @@ + + + +{#if visibleFiles.length > 0} + + { + console.log('loading more files...'); + loadMore(); + }} + role="listbox" + onkeydown={handleKeyDown} + > + {#each visibleFiles as change (change.path)} + { + selectFilesInList(e, change, visibleFiles, idSelection, true, commitId); + }} + /> + {/each} + +{/if} + + diff --git a/apps/desktop/src/components/ChangeListItemWrapper.svelte b/apps/desktop/src/components/ChangeListItemWrapper.svelte new file mode 100644 index 0000000000..23b5bce461 --- /dev/null +++ b/apps/desktop/src/components/ChangeListItemWrapper.svelte @@ -0,0 +1,112 @@ + + + + + + { + const changes = idSelection.treeChanges(projectId); + if (idSelection.has(change.path, commitId)) { + contextMenu?.open(e, { files: changes }); + } else { + contextMenu?.open(e, { files: [change] }); + } + }} +/> + + diff --git a/apps/desktop/src/components/FileContextMenu.svelte b/apps/desktop/src/components/FileContextMenu.svelte index 677091fbfb..1c1732181e 100644 --- a/apps/desktop/src/components/FileContextMenu.svelte +++ b/apps/desktop/src/components/FileContextMenu.svelte @@ -1,3 +1,4 @@ + @@ -20,12 +28,10 @@