diff --git a/apps/web/package.json b/apps/web/package.json index 958f0d540d..bed8262eb9 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -23,9 +23,11 @@ "vite": "catalog:" }, "dependencies": { + "@rails/actioncable": "^7.2.100", "@sentry/sveltekit": "^8.9.2", "highlight.js": "^11.10.0", "marked": "^10.0.0", - "moment": "^2.30.1" + "moment": "^2.30.1", + "svelte-gravatar": "^1.0.3" } } diff --git a/apps/web/src/lib/components/DiffPatch.svelte b/apps/web/src/lib/components/DiffPatch.svelte new file mode 100644 index 0000000000..11f08a29b6 --- /dev/null +++ b/apps/web/src/lib/components/DiffPatch.svelte @@ -0,0 +1,304 @@ + + +
+ +
+ {#each parsedLines as line} + {#if line.type !== 'header'} + + +
handleLineNumberClick(line, event)} + > + {line.leftLineNumber !== null ? line.leftLineNumber : ' '} +
+ {/if} + {/each} +
+ +
+ {#each parsedLines as line} + {#if line.type !== 'header'} + + +
handleLineNumberClick(line, event)} + > + {line.rightLineNumber !== null ? line.rightLineNumber : ' '} +
+ {/if} + {/each} +
+ + +
+ {#each parsedLines as line} + {#if line.type !== 'header'} +
+ ͏{line.content} +
+ {/if} + {/each} +
+
+ + diff --git a/apps/web/src/lib/components/DiffPatchArray.svelte b/apps/web/src/lib/components/DiffPatchArray.svelte new file mode 100644 index 0000000000..94b1f6d291 --- /dev/null +++ b/apps/web/src/lib/components/DiffPatchArray.svelte @@ -0,0 +1,46 @@ + + +
+
+ {#each diffArray as line} +
{line.right}
+ {/each} +
+
+ {#each diffArray as line} +
{line.line}
+ {/each} +
+
+ + diff --git a/apps/web/src/lib/components/Navigation.svelte b/apps/web/src/lib/components/Navigation.svelte index 9e5757e14e..1110628825 100644 --- a/apps/web/src/lib/components/Navigation.svelte +++ b/apps/web/src/lib/components/Navigation.svelte @@ -19,8 +19,8 @@
- github -

GitButler

+ gitbutler +
GitButler
Downloads @@ -45,13 +45,18 @@ diff --git a/apps/web/src/routes/projects/[projectId]/+page.svelte b/apps/web/src/routes/projects/[projectId]/+page.svelte index 9ff60573ea..670e7e3666 100644 --- a/apps/web/src/routes/projects/[projectId]/+page.svelte +++ b/apps/web/src/routes/projects/[projectId]/+page.svelte @@ -94,7 +94,7 @@
{project.name}
-

Patch Stacks

+

Patch Stacks

{#each patchStacks as stack}
{stack.title}
diff --git a/apps/web/src/routes/projects/[projectId]/branches/[branchId]/stack/+page.svelte b/apps/web/src/routes/projects/[projectId]/branches/[branchId]/stack/+page.svelte index 58a7585f0e..d3fae94529 100644 --- a/apps/web/src/routes/projects/[projectId]/branches/[branchId]/stack/+page.svelte +++ b/apps/web/src/routes/projects/[projectId]/branches/[branchId]/stack/+page.svelte @@ -1,7 +1,9 @@ {#if state === 'loading'} @@ -221,58 +406,103 @@ {:else if state === 'unauthorized'}

Unauthorized

{:else} -

Patch Stack: {stack.title}

- {#each stack.patches as stackPatch} -
- {stackPatch.change_id.substr(0, 8)}: - {#if patch.change_id === stackPatch.change_id} - {stackPatch.title} - {:else} - {stackPatch.title} - {/if} -
- {/each} -
- -

Patch

-
-
-
Title: {patch.title}
- {#if patch.description} -
Desc: {patch.description}
- {/if} -
Change Id: {patch.change_id}
-
Commit: {patch.commit_sha}
-
-
-
Patch Version: {patch.version}
-
Stack Position: {patch.position + 1}/{stack.stack_size}
-
Contributors: {patch.contributors}
-
- Additions: {patch.statistics.lines - patch.statistics.deletions}, Deletions: {patch - .statistics.deletions}, Files: {patch.statistics.file_count} -
-
-
-
-
-

Outline

-
- {#each patch.sections as section} - {#if section.section_type === 'diff'} - +
+

Patch Series: {stack.title}

+ {#each stack.patches as stackPatch} +
+ {stackPatch.change_id.substr(0, 8)}: + {#if patch.change_id === stackPatch.change_id} + {stackPatch.title} {:else} - + {stackPatch.title} {/if} - {/each} +
+ {/each} +
+ +

Patch

+
+
+
Title: {patch.title}
+ {#if patch.description} +
Desc: {patch.description}
+ {/if} +
Change Id: {patch.change_id.substr(0, 13)}
+
Commit SHA: {patch.commit_sha.substr(0, 10)}
+
Patch Version: {patch.version}
+
Series Position: {patch.position + 1}/{stack.stack_size}
+
+ Contributors: + {#each patch.contributors as email} + + {/each} +
+
+ Additions: {patch.statistics.lines - patch.statistics.deletions}, Deletions: {patch + .statistics.deletions}, Files: {patch.statistics.file_count} +
+
+
+ {#if patch.review.viewed.length > 0} +
+
Viewed:
+ {#each patch.review.viewed as email} + + {/each} +
+ {/if} + + {#if patch.review.signed_off.length > 0} +
+
Signed Off:
+ {#each patch.review.signed_off as email} + + {/each} +
+ {/if} + + {#if patch.review.length > 0} +
+
Rejected:
+ {#each patch.review.rejected as email} + + {/each} +
+ {/if} + +

Your sign off status

+ {#if status[data.changeId]} + {#if status[data.changeId].last_signoff} +
You signed off on this patch
+ {/if} + {#if !status[data.changeId].last_reviewed} +
You have not reviewed this patch
+ {:else if !status[data.changeId].last_signoff} +
You have rejected this patch
+ {/if} + {/if} +
+ {#if status[data.changeId]} + {#if !status[data.changeId].last_signoff} + + {/if} + {#if status[data.changeId].last_signoff || !status[data.changeId].last_reviewed} + + {/if} + {/if} +
+
-
-
+ +
+
{#each patch.sections as section}
@@ -286,10 +516,18 @@ >down]
+
+ {section.new_path} +
- {section.new_path} + + rangeSelect(range, diff_path, diff_sha)} + diffPath={section.new_path} + diffSha={section.diff_sha} + diff={section.diff_patch} + />
-
{section.diff_patch}
{:else}
@@ -316,14 +554,168 @@
+
+

Chat

+
+ {#each events as event} + {#if event.event_type === 'chat'} +
+
+
+ +
+
{event.object.created_at}
+
+ {#if event.object.diff_patch_array} +
+
{event.object.diff_path}
+ + +
+ {/if} +
{event.object.comment}
+ {#if event.object.issue} + {#if event.object.resolved} +
resolved
+ {:else} + + {/if} + {/if} +
+ {/if} + {#if event.event_type === 'issue_status'} + {#if event.data.resolution} +
+
+ {event.user.email} resolved issue {event.object.uuid.substr(0, 8)} +
+
+ {event.created_at} +
+
+ {/if} + {/if} + + {#if event.event_type === 'patch_status'} + {#if event.data.status} +
+
+ {event.user.email} + signed off +
+
+ {event.created_at} +
+
+ {:else} +
+
+ {event.user.email} + requested changes +
+
+ {event.created_at} +
+
+ {/if} + {/if} + + {#if event.event_type === 'patch_version'} +
+
+ new patch version: v{event.object.version} +
+
+ {event.created_at} +
+
+ {/if} + {/each} +
+
+
+
+ +
+
+
+ +
issue
+
+ +
+
+
+
{/if} - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1ed1846ac..d43ed08a55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,28 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -catalogs: - default: - vite: - specifier: 5.2.13 - version: 5.2.13 - svelte: - '@sveltejs/adapter-static': - specifier: 3.0.4 - version: 3.0.4 - '@sveltejs/kit': - specifier: 2.5.25 - version: 2.5.25 - '@sveltejs/vite-plugin-svelte': - specifier: 4.0.0-next.6 - version: 4.0.0-next.6 - svelte: - specifier: 5.0.0-next.243 - version: 5.0.0-next.243 - svelte-check: - specifier: 4.0.1 - version: 4.0.1 - importers: .: @@ -295,6 +273,9 @@ importers: apps/web: dependencies: + '@rails/actioncable': + specifier: ^7.2.100 + version: 7.2.100 '@sentry/sveltekit': specifier: ^8.9.2 version: 8.9.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.0)(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.243)(vite@5.2.13(@types/node@22.3.0)))(svelte@5.0.0-next.243)(vite@5.2.13(@types/node@22.3.0)))(svelte@5.0.0-next.243) @@ -307,6 +288,9 @@ importers: moment: specifier: ^2.30.1 version: 2.30.1 + svelte-gravatar: + specifier: ^1.0.3 + version: 1.0.3(svelte@5.0.0-next.243) devDependencies: '@fontsource/fira-mono': specifier: ^4.5.10 @@ -1219,6 +1203,9 @@ packages: engines: {node: '>=16.3.0'} hasBin: true + '@rails/actioncable@7.2.100': + resolution: {integrity: sha512-7xtIENf0Yw59AFDM3+xqxPCZxev3QVAqjPmUzmgsB9eL8S/zTpB0IU9srNc7XknzJI4e09XKNnCaJRx3gfYzXA==} + '@replit/codemirror-lang-svelte@6.0.0': resolution: {integrity: sha512-U2OqqgMM6jKelL0GNWbAmqlu1S078zZNoBqlJBW+retTc5M4Mha6/Y2cf4SVg6ddgloJvmcSpt4hHrVoM4ePRA==} peerDependencies: @@ -2525,6 +2512,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -2666,6 +2656,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + css-shorthand-properties@1.1.1: resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==} @@ -3752,6 +3745,9 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -4164,6 +4160,9 @@ packages: engines: {node: '>= 18'} hasBin: true + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -5312,6 +5311,11 @@ packages: peerDependencies: svelte: ^3.57.0 || ^4.0.0 + svelte-gravatar@1.0.3: + resolution: {integrity: sha512-CNxIV2lAuiqwdaPrGAM/BFj5U1dNNQXzeyh+HVi/48BODFXoDy0L1CMqYyvM+aKiF4ideZUBwT0S9/C1BeL5oA==} + peerDependencies: + svelte: '*' + svelte-preprocess@5.1.3: resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} engines: {node: '>= 16.0.0', pnpm: ^8.0.0} @@ -5349,6 +5353,9 @@ packages: typescript: optional: true + svelte-waypoint@0.1.4: + resolution: {integrity: sha512-UEqoXZjJeKj2sWlAIsBOFjxjMn+KP8aFCc/zjdmZi1cCOE59z6T2C+I6ZaAf8EmNQqNzfZVB/Lci4Ci9spzXAw==} + svelte-writable-derived@3.1.0: resolution: {integrity: sha512-cTvaVFNIJ036vSDIyPxJYivKC7ZLtcFOPm1Iq6qWBDo1fOHzfk6ZSbwaKrxhjgy52Rbl5IHzRcWgos6Zqn9/rg==} peerDependencies: @@ -5975,6 +5982,28 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} +catalogs: + default: + vite: + specifier: 5.2.13 + version: 5.2.13 + svelte: + '@sveltejs/adapter-static': + specifier: 3.0.4 + version: 3.0.4 + '@sveltejs/kit': + specifier: 2.5.25 + version: 2.5.25 + '@sveltejs/vite-plugin-svelte': + specifier: 4.0.0-next.6 + version: 4.0.0-next.6 + svelte: + specifier: 5.0.0-next.243 + version: 5.0.0-next.243 + svelte-check: + specifier: 4.0.1 + version: 4.0.1 + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -6959,6 +6988,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@rails/actioncable@7.2.100': {} + '@replit/codemirror-lang-svelte@6.0.0(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3))(@codemirror/lang-html@6.4.9)(@codemirror/lang-javascript@6.2.2)(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.1)': dependencies: '@codemirror/autocomplete': 6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) @@ -8639,6 +8670,8 @@ snapshots: chardet@0.7.0: {} + charenc@0.0.2: {} + check-error@2.1.1: {} chokidar@3.6.0: @@ -8782,6 +8815,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypt@0.0.2: {} + css-shorthand-properties@1.1.1: {} css-value@0.0.1: {} @@ -10152,6 +10187,8 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-buffer@1.1.6: {} + is-callable@1.2.7: {} is-core-module@2.13.1: @@ -10531,6 +10568,12 @@ snapshots: marked@10.0.0: {} + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + media-typer@0.3.0: {} memoizerific@1.11.3: @@ -11738,6 +11781,12 @@ snapshots: svelte: 5.0.0-next.243 svelte-writable-derived: 3.1.0(svelte@5.0.0-next.243) + svelte-gravatar@1.0.3(svelte@5.0.0-next.243): + dependencies: + md5: 2.3.0 + svelte: 5.0.0-next.243 + svelte-waypoint: 0.1.4 + svelte-preprocess@5.1.3(@babel/core@7.24.7)(postcss-load-config@5.1.0(postcss@8.4.39))(postcss@8.4.39)(svelte@5.0.0-next.243)(typescript@5.4.5): dependencies: '@types/pug': 2.0.6 @@ -11752,6 +11801,8 @@ snapshots: postcss-load-config: 5.1.0(postcss@8.4.39) typescript: 5.4.5 + svelte-waypoint@0.1.4: {} + svelte-writable-derived@3.1.0(svelte@5.0.0-next.243): dependencies: svelte: 5.0.0-next.243