Skip to content

Feature/docu fixes - #98

Merged
maliklesch merged 8 commits into
mainfrom
feature/docu_fixes
Jul 13, 2026
Merged

Feature/docu fixes#98
maliklesch merged 8 commits into
mainfrom
feature/docu_fixes

Conversation

@timn21

@timn21 timn21 commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

Closes #97

  • Refactor of the client
  • Updated and polished ReadMes
  • Updated diagrams

Summary by CodeRabbit

  • New Features

    • Added route-based navigation with protected pages and deep-link support.
    • Added dietary-aware ingredient substitutions and support for merging a single or multiple recipes.
    • Improved recipe generation, grocery-list management, profile updates, and authentication flows.
    • Added responsive mobile navigation and persistent dark-mode and provider preferences.
  • Bug Fixes

    • Improved session restoration, unauthorized handling, optimistic updates, and failed-request recovery.
  • Documentation

    • Expanded setup, deployment, API, testing, monitoring, and service documentation.

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

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

Next review available in: 48 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: f021f490-2bb3-405c-afc3-99371099013c

📥 Commits

Reviewing files that changed from the base of the PR and between d0b447b and 92685cb.

⛔ Files ignored due to path filters (1)
  • node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json is excluded by !**/node_modules/**
📒 Files selected for processing (3)
  • README.md
  • gen-ai/README.md
  • gen-ai/llm.py
📝 Walkthrough

Walkthrough

The client is refactored around React Router, shared authentication/API contexts, page components, and stateful hooks. Documentation, Helm configuration, service guides, deployment instructions, and architecture diagrams are updated to reflect current behavior and infrastructure.

Changes

Client application architecture

Layer / File(s) Summary
Routing and session architecture
client/src/App.tsx, client/src/main.tsx, client/src/contexts/*, client/src/components/layout/*
Adds routed protected pages, persisted session restoration, shared layout navigation, and centralized auth state.
API client and shared state hooks
client/src/lib/*, client/src/hooks/*
Centralizes typed requests and manages recipe, grocery-list, provider, theme, and dietary-substitution state.
Routed pages and recipe generation
client/src/pages/*, client/src/components/RecipeCard.tsx
Adds routed page components, shared API integration, single-recipe merging, and recipe generation through the API client.
Client integration and page validation
client/src/*.test.tsx, client/src/pages/*.test.tsx, client/README.md
Updates tests for router-aware workflows, authentication redirects, profile actions, grocery-list behavior, and documented client prerequisites.

Documentation and deployment documentation

Layer / File(s) Summary
Product and repository documentation
README.md
Documents local Compose startup, functionality, services, testing, monitoring, Helm deployment, and Azure VM deployment.
GenAI provider and endpoint documentation
gen-ai/README.md, gen-ai/main.py
Documents provider selection, local LLM setup, fallback behavior, endpoint payloads, tests, and the canned fallback note.
Helm deployment and ingress configuration
helm/bytebite/*
Updates provider keys, database and Grafana credentials, secret fallbacks, deployment parameters, and Swagger ingress routes.
Infrastructure and service guides
infra/*/README.md, server/*/README.md
Refreshes Azure deployment, gateway routing/authentication, service configuration, endpoints, prerequisites, and test instructions.
Architecture and data diagrams
documentation/*.drawio
Updates entity relationships, persistence boundaries, database fields, and use-case flows.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR also includes major client and backend refactors plus behavior changes that are unrelated to the documentation-only issue. Split the refactors and diet/substitution behavior changes into separate PRs or link the relevant implementation issues.
Docstring Coverage ⚠️ Warning Docstring coverage is 45.95% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is too generic and doesn't clearly state the main change beyond broad feature/documentation fixes. Use a specific title like 'Update documentation and diagrams for current app state'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed The README and diagram files were updated to reflect the app's current state, matching issue #97.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/docu_fixes

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

🤖 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 `@client/src/components/layout/AppLayout.tsx`:
- Around line 45-50: Add an accessible name to the icon-only button in
AppLayout’s mobile sidebar toggle by adding an aria-label, and expose its
current open state with aria-expanded tied to the sidebar state used by
setSidebarOpen. Keep the existing click behavior unchanged.

In `@client/src/contexts/AuthProvider.tsx`:
- Around line 54-57: Update the boot revalidation effect in AuthProvider’s
useEffect so only authentication failures trigger signOut; handle network, 5xx,
and other non-auth errors with a non-logout terminal state instead. Preserve the
existing /users/me request and rely on createApiClient’s 401-with-token behavior
for session expiry.

In `@documentation/ClassDiagram.drawio`:
- Line 64: Update the Recipe swimlane attribute cell identified by mxCell id
“nY0ySGFunX55FMxmfvSv-2” to use recipeId: UUID instead of listId: UUID, while
leaving the remaining attributes unchanged.

In `@documentation/ComponentDiagram.drawio`:
- Line 210: Update edge FCCcoOl_6RRor5Mku52d-8 to include
source="5VLlb7RSpZgbVUeRD6Xn-15", while preserving its existing target and
styling attributes so it remains attached to the Grocery Service.

In `@server/grocery-service/README.md`:
- Around line 54-56: Update the production authentication description in the
README to state that the api-gateway verifies the Authorization header and
injects trusted X-User-Id and X-User-Email headers, rather than claiming it
strips Authorization. Preserve the existing behavior description for requests
missing the trusted headers.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 366a1f97-8e79-4c6a-9bc0-96f918b1d44f

📥 Commits

Reviewing files that changed from the base of the PR and between 04f2f40 and d0b447b.

⛔ Files ignored due to path filters (7)
  • client/package-lock.json is excluded by !**/package-lock.json
  • documentation/ClassDiagram.png is excluded by !**/*.png
  • documentation/ComponentDiagram.png is excluded by !**/*.png
  • documentation/DBSchemaDiagram.jpg is excluded by !**/*.jpg
  • documentation/DBSchemaDiagram.png is excluded by !**/*.png
  • documentation/UseCaseDiagram.png is excluded by !**/*.png
  • node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json is excluded by !**/node_modules/**
📒 Files selected for processing (45)
  • README.md
  • client/README.md
  • client/package.json
  • client/src/App.integration.test.tsx
  • client/src/App.tsx
  • client/src/components/FeatureCards.tsx
  • client/src/components/HeroSection.tsx
  • client/src/components/RecipeCard.tsx
  • client/src/components/layout/AppLayout.tsx
  • client/src/components/layout/RequireAuth.tsx
  • client/src/components/layout/Sidebar.tsx
  • client/src/contexts/AuthProvider.tsx
  • client/src/contexts/authContext.ts
  • client/src/hooks/useDarkMode.ts
  • client/src/hooks/useGroceryLists.ts
  • client/src/hooks/useLlmProvider.ts
  • client/src/hooks/useRecipes.ts
  • client/src/lib/api.ts
  • client/src/lib/mappers.test.ts
  • client/src/lib/mappers.ts
  • client/src/main.tsx
  • client/src/pages/GroceryListsPage.test.tsx
  • client/src/pages/GroceryListsPage.tsx
  • client/src/pages/HomePage.tsx
  • client/src/pages/LoginPage.test.tsx
  • client/src/pages/LoginPage.tsx
  • client/src/pages/ProfilePage.test.tsx
  • client/src/pages/ProfilePage.tsx
  • client/src/pages/RecipesPage.tsx
  • client/src/types.ts
  • documentation/ClassDiagram.drawio
  • documentation/ComponentDiagram.drawio
  • documentation/DBSchemaDiagram.drawio
  • documentation/UseCaseDiagram.drawio
  • gen-ai/README.md
  • gen-ai/main.py
  • helm/bytebite/README.md
  • helm/bytebite/templates/ingress.yaml
  • helm/bytebite/templates/secret.yaml
  • helm/bytebite/values.yaml
  • infra/ansible/README.md
  • infra/terraform/README.md
  • server/api-gateway/README.md
  • server/grocery-service/README.md
  • server/user-service/README.md

Comment on lines +45 to +50
<button
onClick={() => setSidebarOpen(true)}
className="p-2 rounded-xl text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
>
<Menu size={18} />
</button>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Add an accessible name to the icon-only menu button.

The mobile top-bar button renders only the <Menu> icon, so assistive tech announces it as an unlabeled "button". Add an aria-label (and the sidebar toggle target has no aria-expanded either).

♿ Proposed fix
           <button
             onClick={() => setSidebarOpen(true)}
+            aria-label="Open navigation menu"
+            aria-expanded={sidebarOpen}
             className="p-2 rounded-xl text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
           >
             <Menu size={18} />
           </button>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<button
onClick={() => setSidebarOpen(true)}
className="p-2 rounded-xl text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
>
<Menu size={18} />
</button>
<button
onClick={() => setSidebarOpen(true)}
aria-label="Open navigation menu"
aria-expanded={sidebarOpen}
className="p-2 rounded-xl text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
>
<Menu size={18} />
</button>
🤖 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 `@client/src/components/layout/AppLayout.tsx` around lines 45 - 50, Add an
accessible name to the icon-only button in AppLayout’s mobile sidebar toggle by
adding an aria-label, and expose its current open state with aria-expanded tied
to the sidebar state used by setSidebarOpen. Keep the existing click behavior
unchanged.

Comment on lines +54 to +57
useEffect(() => {
if (status !== 'restoring') return
api.get<AuthPayload>('/users/me').then(signIn).catch(signOut)
}, [status, api, signIn, signOut])

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n## AuthProvider.tsx\n'
if [ -f client/src/contexts/AuthProvider.tsx ]; then
  wc -l client/src/contexts/AuthProvider.tsx
  sed -n '1,160p' client/src/contexts/AuthProvider.tsx | cat -n
else
  echo 'missing client/src/contexts/AuthProvider.tsx'
fi

printf '\n## api.ts\n'
if [ -f client/src/lib/api.ts ]; then
  wc -l client/src/lib/api.ts
  sed -n '1,220p' client/src/lib/api.ts | cat -n
else
  echo 'missing client/src/lib/api.ts'
fi

Repository: AET-DevOps26/team-bytebite

Length of output: 8388


Boot revalidation should not log out on transient errors client/src/contexts/AuthProvider.tsx:54-57catch(signOut) treats network/5xx failures from /users/me as a session expiry and sends a valid user back to login. createApiClient() already signs out on 401-with-token, so this path should handle only auth failures and use a non-logout terminal state for other errors.

🤖 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 `@client/src/contexts/AuthProvider.tsx` around lines 54 - 57, Update the boot
revalidation effect in AuthProvider’s useEffect so only authentication failures
trigger signOut; handle network, 5xx, and other non-auth errors with a
non-logout terminal state instead. Preserve the existing /users/me request and
rely on createApiClient’s 401-with-token behavior for session expiry.

<mxGeometry relative="1" x="1" as="geometry">
<mxPoint y="20" as="offset" />
</mxGeometry>
<mxCell id="nY0ySGFunX55FMxmfvSv-2" parent="nY0ySGFunX55FMxmfvSv-1" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" value="listId: UUID&lt;div&gt;name: String&lt;/div&gt;&lt;div&gt;createdAt: DateTime&lt;/div&gt;&lt;div&gt;updatedAt: DateTime&lt;/div&gt;" vertex="1">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Recipe entity uses listId instead of recipeId.

The Recipe swimlane's attribute cell (line 64) shows listId: UUID — identical to GroceryList's attributes. This is a copy-paste error; the DB schema diagram correctly uses recipeId: UUID for Recipe. The identifier should be recipeId to match.

🔧 Proposed fix
-        <mxCell id="nY0ySGFunX55FMxmfvSv-2" parent="nY0ySGFunX55FMxmfvSv-1" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" value="listId: UUID&lt;div&gt;name: String&lt;/div&gt;&lt;div&gt;createdAt: DateTime&lt;/div&gt;&lt;div&gt;updatedAt: DateTime&lt;/div&gt;" vertex="1">
+        <mxCell id="nY0ySGFunX55FMxmfvSv-2" parent="nY0ySGFunX55FMxmfvSv-1" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" value="recipeId: UUID&lt;div&gt;name: String&lt;/div&gt;&lt;div&gt;createdAt: DateTime&lt;/div&gt;&lt;div&gt;updatedAt: DateTime&lt;/div&gt;" vertex="1">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<mxCell id="nY0ySGFunX55FMxmfvSv-2" parent="nY0ySGFunX55FMxmfvSv-1" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" value="listId: UUID&lt;div&gt;name: String&lt;/div&gt;&lt;div&gt;createdAt: DateTime&lt;/div&gt;&lt;div&gt;updatedAt: DateTime&lt;/div&gt;" vertex="1">
<mxCell id="nY0ySGFunX55FMxmfvSv-2" parent="nY0ySGFunX55FMxmfvSv-1" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" value="recipeId: UUID&lt;div&gt;name: String&lt;/div&gt;&lt;div&gt;createdAt: DateTime&lt;/div&gt;&lt;div&gt;updatedAt: DateTime&lt;/div&gt;" vertex="1">
🤖 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 `@documentation/ClassDiagram.drawio` at line 64, Update the Recipe swimlane
attribute cell identified by mxCell id “nY0ySGFunX55FMxmfvSv-2” to use recipeId:
UUID instead of listId: UUID, while leaving the remaining attributes unchanged.

<mxPoint x="-27" y="7" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="FCCcoOl_6RRor5Mku52d-8" edge="1" parent="1" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="FCCcoOl_6RRor5Mku52d-10" value="">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Edge from Grocery Service to Grocery Data Persistence is missing its source attribute.

The edge FCCcoOl_6RRor5Mku52d-8 has a target but no source, making it a floating edge that won't stay attached to the Grocery Service component when the diagram is edited. The equivalent User DB edge (5VLlb7RSpZgbVUeRD6Xn-36 at line 183) correctly sets source="5VLlb7RSpZgbVUeRD6Xn-17" (User Service). This edge should set source="5VLlb7RSpZgbVUeRD6Xn-15" (Grocery Service).

🔧 Proposed fix
-        <mxCell id="FCCcoOl_6RRor5Mku52d-8" edge="1" parent="1" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="FCCcoOl_6RRor5Mku52d-10" value="">
+        <mxCell id="FCCcoOl_6RRor5Mku52d-8" edge="1" parent="1" source="5VLlb7RSpZgbVUeRD6Xn-15" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="FCCcoOl_6RRor5Mku52d-10" value="">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<mxCell id="FCCcoOl_6RRor5Mku52d-8" edge="1" parent="1" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="FCCcoOl_6RRor5Mku52d-10" value="">
<mxCell id="FCCcoOl_6RRor5Mku52d-8" edge="1" parent="1" source="5VLlb7RSpZgbVUeRD6Xn-15" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=halfCircle;endFill=0;endSize=6;strokeWidth=1;sketch=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="FCCcoOl_6RRor5Mku52d-10" value="">
🤖 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 `@documentation/ComponentDiagram.drawio` at line 210, Update edge
FCCcoOl_6RRor5Mku52d-8 to include source="5VLlb7RSpZgbVUeRD6Xn-15", while
preserving its existing target and styling attributes so it remains attached to
the Grocery Service.

Comment on lines +54 to +56
In production the service is reached through the api-gateway, which strips the `Authorization`
header and replaces it with trusted `X-User-Id` and `X-User-Email` headers. Requests that arrive
without those headers were not authenticated.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Gateway does not strip the Authorization header.

The README states the api-gateway "strips the Authorization header," but JwtAuthenticationFilter only calls headers.set("X-User-Id", ...) and headers.set("X-User-Email", ...) on the mutated request — it never removes the original Authorization header. The downstream service still receives the bearer token. Consider rewording to "verifies the Authorization header and injects trusted X-User-Id and X-User-Email headers" to match the actual behavior.

🤖 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 `@server/grocery-service/README.md` around lines 54 - 56, Update the production
authentication description in the README to state that the api-gateway verifies
the Authorization header and injects trusted X-User-Id and X-User-Email headers,
rather than claiming it strips Authorization. Preserve the existing behavior
description for requests missing the trusted headers.

@maliklesch maliklesch left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Looks good!

@maliklesch
maliklesch merged commit 4680466 into main Jul 13, 2026
14 checks passed
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.

Update documentation

2 participants