Skip to content

[attachments] inline images support - #45

Open
capcom6 wants to merge 5 commits into
masterfrom
attachments/inline-images-support
Open

[attachments] inline images support#45
capcom6 wants to merge 5 commits into
masterfrom
attachments/inline-images-support

Conversation

@capcom6

@capcom6 capcom6 commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Upload images directly while creating or editing tasks and comments.
    • Add images by selecting files, pasting from the clipboard, or dragging and dropping.
    • View upload progress and receive success or error notifications.
    • Uploaded images display correctly in task descriptions and comments.
  • Bug Fixes
    • Improved image sizing and presentation in formatted content.
    • Unsupported file types and images over 100 MB are rejected.
    • Attachment references now resolve correctly when content is displayed.

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@capcom6, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 23 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5342afa7-97a8-4f04-9b2c-f757ba5fe1d6

📥 Commits

Reviewing files that changed from the base of the PR and between 3d23479 and 7946bf7.

📒 Files selected for processing (6)
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/components/CommentList.svelte
  • frontend/src/lib/components/TaskForm.svelte
  • frontend/src/lib/inline-image-editor.svelte.ts
  • internal/attachments/service.go
  • internal/storage/service.go
📝 Walkthrough

Walkthrough

The frontend adds inline image uploads for task descriptions and comments. Uploaded images become attachment Markdown. Task and comment rendering resolves attachment references to download URLs before Markdown parsing. Prose images receive constrained, rounded styling.

Changes

Inline image attachments

Layer / File(s) Summary
Attachment service access
internal/attachments/service.go, internal/storage/service.go
The services expose attachment lookup and presigned-link expiry accessors.
Inline image upload transport
frontend/src/lib/upload-image.ts
Image uploads validate type and size, report progress, enforce bounded timeouts, transfer through XMLHttpRequest, and confirm the attachment.
Task and comment upload integration
frontend/src/lib/inline-image-editor.svelte.ts, frontend/src/lib/components/InlineImageButton.svelte, frontend/src/lib/components/CommentForm.svelte, frontend/src/lib/components/CommentList.svelte, frontend/src/lib/components/TaskForm.svelte, frontend/src/lib/pages/task-edit.svelte
The forms accept task IDs and support image picker, paste, and drag-and-drop uploads. Confirmed attachments are inserted as Markdown with upload-state feedback.
Attachment reference rendering
frontend/src/lib/resolve-attachment-refs.ts, frontend/src/lib/components/CommentList.svelte, frontend/src/lib/pages/task-detail.svelte, frontend/src/app.css
Task and comment content resolves attachment references before Markdown parsing. Task refetches refresh comments and attachments after comment changes. Rendered prose images are constrained and rounded.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Author
  participant CommentForm
  participant uploadInlineImage
  participant AttachmentUploadAPI
  participant TaskDetail
  participant CommentList
  Author->>CommentForm: Select, paste, or drop an image
  CommentForm->>uploadInlineImage: Upload image for task
  uploadInlineImage->>AttachmentUploadAPI: Initialize, transfer, and confirm upload
  AttachmentUploadAPI-->>uploadInlineImage: Return attachment metadata
  uploadInlineImage-->>CommentForm: Return upload result
  CommentForm->>TaskDetail: Submit comment with attachment reference
  TaskDetail->>TaskDetail: Refetch task and attachment URLs
  TaskDetail->>CommentList: Pass attachment URL map
  CommentList->>CommentList: Resolve attachment reference before Markdown parsing
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: support for inline images through attachments.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (2)
frontend/src/lib/components/TaskForm.svelte (1)

106-111: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove the unused ext binding and the no-op onProgress callback.

♻️ Cleanup
-      const result = await uploadInlineImage(taskId, file, {
-        onProgress: (_pct) => {},
-      });
-      const ext = result.fileName.replace(/^.*\./, "");
+      const result = await uploadInlineImage(taskId, file);
       const name = result.fileName.replace(/\.[^.]+$/, "");
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/lib/components/TaskForm.svelte` around lines 106 - 111, In the
TaskForm upload flow, remove the unused ext binding derived from result.fileName
and omit the no-op onProgress callback when calling uploadInlineImage; preserve
the existing filename handling and insertAtCursor behavior.
frontend/src/lib/components/CommentForm.svelte (1)

21-93: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

This block is a near-verbatim copy of TaskForm.svelte lines 85-159.

Cursor insertion, upload gating, pick/paste/drop/dragover handlers, and the button+hidden-input markup are duplicated. Extracting a shared helper (e.g. createInlineImageUploader(taskId, getText, setText, getEl)) plus a small InlineImageButton.svelte would keep the two forms from diverging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/lib/components/CommentForm.svelte` around lines 21 - 93, The
inline-image functionality in CommentForm, including insertAtCursor, upload
gating, pick/paste/drop/dragover handlers, and related button/input markup,
duplicates TaskForm. Extract the shared behavior into a reusable inline-image
uploader helper and the shared controls into an InlineImageButton component,
then update both forms to use them while preserving their existing task ID,
text, textarea, upload, and toast behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/lib/components/TaskForm.svelte`:
- Around line 141-154: Update handleImageDrop in
frontend/src/lib/components/TaskForm.svelte (lines 141-154) and the
corresponding drop handler in frontend/src/lib/components/CommentForm.svelte
(lines 75-88) to be async and await uploadAndInsert(file) for each image,
preserving sequential processing and existing non-image toast behavior.

In `@frontend/src/lib/resolve-attachment-refs.ts`:
- Around line 17-22: Update the attachment URL replacement in
resolveAttachmentRefs so it no longer appends accessToken or any bearer JWT as a
query parameter. Use the existing same-origin cookie authentication,
authenticated fetch/blob flow, or a short-lived attachment-scoped token
mechanism while preserving the current task and attachment path generation.

In `@frontend/src/lib/upload-image.ts`:
- Around line 36-50: Update the XMLHttpRequest timeout in the upload flow around
the xhr.timeout assignment so supported image uploads, including 100 MiB files
below roughly 14 Mbps, are not aborted after 60 seconds. Use a size-aware or
multi-minute timeout based on the upload size, while ensuring it remains bounded
by the presigned URL’s expiry.

In `@internal/server/middlewares/jwtauth/jwtauth.go`:
- Around line 30-33: The image-route bypass in jwtauth.Next must apply only when
the request has no Authorization header; update the predicate so
header-authenticated requests reach jwtauth.GetUser. In
internal/server/middlewares/jwtauth/jwtauth.go lines 30-33, make this
conditional change. In internal/server/tasks/handler_attachments.go lines
119-139, preserve the query-token branch as the fallback for requests without
middleware-provided authentication; consider issuing a short-lived
attachment-scoped token instead of embedding the access token in URLs.

In `@internal/server/tasks/handler_attachments.go`:
- Around line 164-169: Update the attachment download flow around
PresignedGetObject so validated image extensions determine the headers on the
actual MinIO GET response, not only the redirect. Either stream the validated
image through the handler or pass response content-type and disposition
overrides when generating the presigned URL, and set X-Content-Type-Options to
nosniff while preserving the allowed MIME type.

---

Nitpick comments:
In `@frontend/src/lib/components/CommentForm.svelte`:
- Around line 21-93: The inline-image functionality in CommentForm, including
insertAtCursor, upload gating, pick/paste/drop/dragover handlers, and related
button/input markup, duplicates TaskForm. Extract the shared behavior into a
reusable inline-image uploader helper and the shared controls into an
InlineImageButton component, then update both forms to use them while preserving
their existing task ID, text, textarea, upload, and toast behavior.

In `@frontend/src/lib/components/TaskForm.svelte`:
- Around line 106-111: In the TaskForm upload flow, remove the unused ext
binding derived from result.fileName and omit the no-op onProgress callback when
calling uploadInlineImage; preserve the existing filename handling and
insertAtCursor behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 41c1995d-fd76-4b2a-9d96-62adf8461d11

📥 Commits

Reviewing files that changed from the base of the PR and between c257ad5 and e226dd7.

📒 Files selected for processing (13)
  • frontend/src/app.css
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/components/CommentList.svelte
  • frontend/src/lib/components/TaskForm.svelte
  • frontend/src/lib/pages/task-detail.svelte
  • frontend/src/lib/pages/task-edit.svelte
  • frontend/src/lib/resolve-attachment-refs.ts
  • frontend/src/lib/upload-image.ts
  • internal/attachments/service.go
  • internal/server/middlewares/jwtauth/jwtauth.go
  • internal/server/tasks/handler.go
  • internal/server/tasks/handler_attachments.go
  • internal/storage/service.go

Comment thread frontend/src/lib/components/TaskForm.svelte Outdated
Comment thread frontend/src/lib/resolve-attachment-refs.ts Outdated
Comment thread frontend/src/lib/upload-image.ts
Comment thread internal/server/middlewares/jwtauth/jwtauth.go Outdated
Comment thread internal/server/tasks/handler_attachments.go Outdated
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown

🤖 Pull request artifacts

Platform File
🐳 Docker GitHub Container Registry
🍎 Darwin arm64 backend_Darwin_arm64.tar.gz
🍎 Darwin x86_64 backend_Darwin_x86_64.tar.gz
🐧 Linux arm64 backend_Linux_arm64.tar.gz
🐧 Linux i386 backend_Linux_i386.tar.gz
🐧 Linux x86_64 backend_Linux_x86_64.tar.gz
🪟 Windows arm64 backend_Windows_arm64.zip
🪟 Windows i386 backend_Windows_i386.zip
🪟 Windows x86_64 backend_Windows_x86_64.zip

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/lib/pages/task-detail.svelte`:
- Around line 55-57: Update uploadInlineImage so the successful upload
confirmation refreshes the local task attachment data used by the attachmentUrls
derived map. Either merge the confirmed attachment into task.attachments or
refetch the task after createComment completes, ensuring newly uploaded comment
images resolve immediately without requiring a page refresh.

In `@frontend/src/lib/resolve-attachment-refs.ts`:
- Around line 2-5: The attachment reference replacement in the resolver should
emit resolved URLs using Markdown angle-bracket destinations. Update the image
rendering in the relevant resolve-attachment function to produce
`![alt](<url>)`, preserving the existing alt text and URL, and add coverage for
a presigned URL containing whitespace or a Markdown delimiter.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2215660a-f4e6-4948-8fe7-8813d93c351c

📥 Commits

Reviewing files that changed from the base of the PR and between e226dd7 and 7c22a81.

📒 Files selected for processing (6)
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/components/CommentList.svelte
  • frontend/src/lib/components/TaskForm.svelte
  • frontend/src/lib/pages/task-detail.svelte
  • frontend/src/lib/resolve-attachment-refs.ts
  • frontend/src/lib/upload-image.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/upload-image.ts
  • frontend/src/lib/components/TaskForm.svelte

Comment thread frontend/src/lib/pages/task-detail.svelte
Comment thread frontend/src/lib/resolve-attachment-refs.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/lib/pages/task-detail.svelte`:
- Around line 146-162: Update addAttachment and each upload caller
(AttachmentUpload, CommentForm, and uploadInlineImage) to capture the current
task ID before starting an upload, pass that captured ID with the confirmation,
and ignore confirmations when it differs from the task that initiated the
upload. Ensure addAttachment uses the captured task context rather than the
mutable taskId/task values, preventing stale confirmations from dereferencing
reset task data or mutating another task.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d8b87a3a-0e9f-49d6-9e17-bf04a4ee268f

📥 Commits

Reviewing files that changed from the base of the PR and between 7c22a81 and 5f09995.

📒 Files selected for processing (4)
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/pages/task-detail.svelte
  • frontend/src/lib/resolve-attachment-refs.ts
  • frontend/src/lib/upload-image.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • frontend/src/lib/upload-image.ts
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/resolve-attachment-refs.ts

Comment thread frontend/src/lib/pages/task-detail.svelte Outdated
@capcom6
capcom6 force-pushed the attachments/inline-images-support branch from 70bc9f1 to ee45d5e Compare August 3, 2026 05:03

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/lib/components/CommentForm.svelte`:
- Around line 122-131: Update the Insert image button in CommentForm so its
disabled state also includes a falsy taskId, alongside uploading; preserve the
existing click behavior and upload handling for valid task IDs.
- Around line 37-50: Update uploadAndInsert to sanitize the filename-derived
name before passing it to insertAtCursor: strip or escape backslashes, [
characters, and ] characters so the generated Markdown alt text remains valid
for resolveAttachmentRefs. Keep the existing filename extension removal and
attachment insertion behavior unchanged.

In `@frontend/src/lib/upload-image.ts`:
- Around line 56-58: Update the xhr.onerror handler in the upload flow to use a
generic upload-failure error rather than asserting S3 dev-mode unavailability;
keep the existing timeout handling unchanged and only use dev-specific wording
from an explicit dev-only path if one exists.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 56d0535e-5d13-43e8-b05a-f979b2ab4cc5

📥 Commits

Reviewing files that changed from the base of the PR and between 5f09995 and ee45d5e.

📒 Files selected for processing (10)
  • frontend/src/app.css
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/components/CommentList.svelte
  • frontend/src/lib/components/TaskForm.svelte
  • frontend/src/lib/pages/task-detail.svelte
  • frontend/src/lib/pages/task-edit.svelte
  • frontend/src/lib/resolve-attachment-refs.ts
  • frontend/src/lib/upload-image.ts
  • internal/attachments/service.go
  • internal/storage/service.go
🚧 Files skipped from review as they are similar to previous changes (7)
  • frontend/src/lib/pages/task-edit.svelte
  • frontend/src/app.css
  • frontend/src/lib/resolve-attachment-refs.ts
  • internal/storage/service.go
  • internal/attachments/service.go
  • frontend/src/lib/components/CommentList.svelte
  • frontend/src/lib/components/TaskForm.svelte

Comment thread frontend/src/lib/components/CommentForm.svelte Outdated
Comment thread frontend/src/lib/components/CommentForm.svelte Outdated
Comment thread frontend/src/lib/upload-image.ts
@capcom6
capcom6 force-pushed the attachments/inline-images-support branch from ae19cbb to afac4d1 Compare August 4, 2026 01:09
@capcom6
capcom6 marked this pull request as ready for review August 4, 2026 07:42
@capcom6 capcom6 added the ready PR is ready to merge label Aug 4, 2026
@github-actions github-actions Bot removed the ready PR is ready to merge label Aug 4, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
frontend/src/lib/components/CommentForm.svelte (1)

21-41: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Block persistence while attachment Markdown is pending.

Both forms can persist their content before the active image upload updates the bound text.

  • frontend/src/lib/components/CommentForm.svelte#L21-L41: reject submission while images.uploading is true.
  • frontend/src/lib/components/CommentForm.svelte#L59-L72: disable the submit button while images.uploading is true.
  • frontend/src/lib/components/TaskForm.svelte#L84-L105: reject saving and disable the save control while images.uploading is true.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/lib/components/CommentForm.svelte` around lines 21 - 41, Block
CommentForm.handleSubmit and the corresponding submit button while
images.uploading is true, and apply the same guard and disabled state to
TaskForm’s save flow and control. Update
frontend/src/lib/components/CommentForm.svelte lines 21-41 to reject submission,
lines 59-72 to disable submission, and
frontend/src/lib/components/TaskForm.svelte lines 84-105 to reject saving and
disable saving until the active image upload completes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/lib/components/CommentList.svelte`:
- Around line 40-47: Update the InlineImageEditor setup in startEdit to capture
the comment’s original editingId and verify it is still active before applying
upload results through setValue; prevent the upload callback from mutating
editText when cancelEdit or switching to another comment has changed editingId.
Apply the same guard to the related edit/cancel flow referenced in the
additional ranges, preserving normal updates when the original comment remains
active.

---

Outside diff comments:
In `@frontend/src/lib/components/CommentForm.svelte`:
- Around line 21-41: Block CommentForm.handleSubmit and the corresponding submit
button while images.uploading is true, and apply the same guard and disabled
state to TaskForm’s save flow and control. Update
frontend/src/lib/components/CommentForm.svelte lines 21-41 to reject submission,
lines 59-72 to disable submission, and
frontend/src/lib/components/TaskForm.svelte lines 84-105 to reject saving and
disable saving until the active image upload completes.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a0e1fbba-3ec1-4ee4-b615-26518649fb29

📥 Commits

Reviewing files that changed from the base of the PR and between afac4d1 and 3d23479.

📒 Files selected for processing (6)
  • frontend/src/lib/components/CommentForm.svelte
  • frontend/src/lib/components/CommentList.svelte
  • frontend/src/lib/components/InlineImageButton.svelte
  • frontend/src/lib/components/TaskForm.svelte
  • frontend/src/lib/inline-image-editor.svelte.ts
  • frontend/src/lib/pages/task-detail.svelte
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/lib/pages/task-detail.svelte

Comment thread frontend/src/lib/components/CommentList.svelte
@capcom6

capcom6 commented Aug 5, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant