Skip to content

feat(collections): open multiple collections at once#8583

Open
gopu-bruno wants to merge 8 commits into
usebruno:release/v4.1.0from
gopu-bruno:feat/open-multiple-collections
Open

feat(collections): open multiple collections at once#8583
gopu-bruno wants to merge 8 commits into
usebruno:release/v4.1.0from
gopu-bruno:feat/open-multiple-collections

Conversation

@gopu-bruno

@gopu-bruno gopu-bruno commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

Description

Adds support for discovering nested Bruno collections when opening a folder. If multiple collections are found, Bruno presents them in a selection modal so users can choose which collections to open. The workflow mirrors the existing Git clone experience.

Ref: BRU-141

Changes

  1. The user selects one or more folders using the native directory picker.
  2. The app scans the selected folders for valid collections and then either:
    • Opens them directly if each selected folder is itself a Bruno collection (existing behavior is preserved).
    • Displays a selection modal when nested collections are found, allowing the user to choose which collections to open.

This gives users visibility and control when opening folders that contain multiple collections or nested collections.

Screen Recording

Screen.Recording.2026-07-13.at.6.14.26.PM.mov

Contribution Checklist:

  • I've used AI significantly to create this pull request
  • The pull request only addresses one issue or adds one feature.
  • The pull request does not introduce any breaking changes
  • I have added screenshots or gifs to help explain the change if applicable.
  • I have read the contribution guidelines.
  • Create an issue and link to the pull request.

Note: Keeping the PR small and focused helps make it easier to review and merge. If you have multiple changes you want to make, please consider submitting them as separate pull requests.

Publishing to New Package Managers

Please see here for more information.

Summary by CodeRabbit

Summary

  • New Features

    • Updated “Open Collection” flow to browse directories, discover collections, and show a searchable selection modal when deeper scanning is needed.
    • Modal supports per-item toggles, select-all, and clears/reset behavior on re-open.
  • Bug Fixes

    • Improved consistency across sidebar, workspace, and menu triggers, including cancellation handling and clearer “no collections found” and skipped/invalid messaging.
  • Tests

    • Added end-to-end coverage for discovery, selection, filtering/search, validation states, multi-open behavior, and modal reset.
    • Updated expected “no collections found” toast text.

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Open Collection now uses renderer-driven directory browsing, Redux-controlled opening state, and a collection selection modal. Electron forwards menu and renderer requests, while tests cover direct opening, nested collections, filtering, selection, cancellation, and invalid paths.

Changes

Open Collection Flow

Layer / File(s) Summary
IPC routing and directory browsing
packages/bruno-electron/src/app/..., packages/bruno-electron/src/ipc/..., packages/bruno-electron/src/utils/..., packages/bruno-app/src/components/AppTitleBar/AppMenu/index.js
Menu and renderer events are forwarded to the renderer, and Electron exposes multi-directory browsing through renderer:browse-directories.
Redux state and opening entry points
packages/bruno-app/src/providers/ReduxStore/..., packages/bruno-app/src/providers/App/useIpcEvents.js, packages/bruno-app/src/components/Sidebar/..., packages/bruno-app/src/components/WorkspaceHome/..., packages/bruno-app/src/pages/Bruno/index.js
Redux tracks opening state, entry points activate it, and obsolete direct-opening wrappers are removed.
Collection scanning and selection modal
packages/bruno-app/src/components/Sidebar/OpenCollection/*
Selected directories are scanned, direct opens bypass the modal, and collections can be searched, selected, and opened.
Directory and collection flow validation
packages/bruno-electron/src/utils/tests/filesystem/*, tests/collection/open/*
Unit and end-to-end tests cover picker behavior, collection selection, filtering, cancellation, reset behavior, and invalid collections.

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

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ElectronIPC
  participant ReduxAppState
  participant OpenCollection
  participant FilesystemIPC
  User->>ElectronIPC: Choose Open Collection
  ElectronIPC->>ReduxAppState: send main:open-collection
  ReduxAppState->>OpenCollection: setIsOpeningCollection(true)
  OpenCollection->>FilesystemIPC: invoke renderer:browse-directories
  FilesystemIPC-->>OpenCollection: return selected directories
  OpenCollection->>OpenCollection: scan and select collections
  OpenCollection->>ReduxAppState: dispatch openMultipleCollections
Loading

Possibly related PRs

  • usebruno/bruno#6574: Updates openCollectionEvent behavior for already-open or workspace collections.
  • usebruno/bruno#7813: Introduces the selection-list UI used by the collection modal.
  • usebruno/bruno#8121: Updates shared searchable and selectable modal UI used by the collection picker.

Suggested reviewers: helloanoop, lohit-bruno, bijin-bruno, naman-bruno

Poem

Folders bloom in a picker bright,
Collections gather into sight.
Redux guides the opening door,
Search and select, then open more.
IPC carries paths along.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.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
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately summarizes the main change: opening multiple collections from the collection picker.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The head commit changed during the review from a3d0502 to 871c259.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@gopu-bruno gopu-bruno force-pushed the feat/open-multiple-collections branch from a3d0502 to 871c259 Compare July 13, 2026 07:59

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (2)
tests/collection/open/open-collection-selection.spec.ts (2)

319-328: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use a stable selector for the "Open" link.

getByText('Open', { exact: true }) could match unintended elements. Add a data-testid to the "Open" link in CreateOrOpenCollection and use getByTestId here.

As per path instructions, replace brittle text/index selectors with role, label, test id, or stable user-facing selectors.

🔧 Proposed fix

In packages/bruno-app/src/components/Sidebar/Collections/CreateOrOpenCollection/index.js:

   const OpenLink = () => (
     <LinkStyle
       className="underline text-link cursor-pointer"
       theme={theme}
+      data-testid="open-collection-link"
       onClick={() => handleOpenCollection(true)}
     >

In the test:

-    await page.getByText('Open', { exact: true }).click();
+    await page.getByTestId('open-collection-link').click();
🤖 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 `@tests/collection/open/open-collection-selection.spec.ts` around lines 319 -
328, Replace the brittle exact-text lookup in the test with a dedicated test ID,
and add that data-testid to the “Open” link rendered by CreateOrOpenCollection.
Use the new stable selector via getByTestId while preserving the existing click
and picker assertions.

Source: Path instructions


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

Centralize raw selectors in page modules. Three raw CSS selectors are inlined in the spec instead of being centralized in page modules under tests/utils/page/*.

  • tests/collection/open/open-collection-selection.spec.ts#L51-L51: Move listTitles selector ([data-testid="selection-list"] .selection-item-title) to a page module method.
  • tests/collection/open/open-collection-selection.spec.ts#L172-L173: Move the [data-testid="selection-list"] li selector to a page module method (e.g., selectionList.item()).
  • tests/collection/open/open-collection-selection.spec.ts#L334-L334: Replace .titlebar-left .home-button with a getByTestId or getByRole locator centralized in buildCommonLocators.

As per path instructions, never inline raw selectors in a spec; centralize locators and actions in page modules under tests/utils/page/*.

🤖 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 `@tests/collection/open/open-collection-selection.spec.ts` at line 51, The spec
contains three raw selectors that must be centralized: in
tests/collection/open/open-collection-selection.spec.ts lines 51-51, add a
page-module method for listTitles; at lines 172-173, add or reuse
selectionList.item() for the selection-list li locator; and at lines 334-334,
replace .titlebar-left .home-button with a getByTestId or getByRole locator in
buildCommonLocators. Update the spec to use these page-module locators and leave
no raw CSS selectors inline.

Source: Path instructions

🤖 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 `@packages/bruno-app/src/components/Sidebar/OpenCollection/index.js`:
- Around line 80-83: Update the openMultipleCollections flow in OpenCollection
to await its resolved { opened, failed, invalid } result and report any failed
or invalid entries instead of handling only IPC rejection. Close the modal only
when at least one collection opens; keep it open when none open, while
preserving error handling for rejected dispatches.
- Around line 40-84: Update the scan-result handling around failedScans and
noNestedCollections so failed or empty selected folders are not silently
discarded. Show a warning when any selected folder fails to scan or produces no
collection, and require every picked folder to have a successful result
resolving to that exact folder before directly dispatching
openMultipleCollections; otherwise preserve the selection flow.

In `@tests/collection/open/open-collection-selection.spec.ts`:
- Around line 211-221: Update the test “cancelling the picker shows no modal and
no error toast” to remove the negative toast assertions for “An error occurred
while scanning for collections” and “No Bruno collections found”. Keep the
positive non-toast assertion that openCollectionModal(page) has count zero, and
retain the cancellation setup and openViaSidebar flow.

---

Nitpick comments:
In `@tests/collection/open/open-collection-selection.spec.ts`:
- Around line 319-328: Replace the brittle exact-text lookup in the test with a
dedicated test ID, and add that data-testid to the “Open” link rendered by
CreateOrOpenCollection. Use the new stable selector via getByTestId while
preserving the existing click and picker assertions.
- Line 51: The spec contains three raw selectors that must be centralized: in
tests/collection/open/open-collection-selection.spec.ts lines 51-51, add a
page-module method for listTitles; at lines 172-173, add or reuse
selectionList.item() for the selection-list li locator; and at lines 334-334,
replace .titlebar-left .home-button with a getByTestId or getByRole locator in
buildCommonLocators. Update the spec to use these page-module locators and leave
no raw CSS selectors inline.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 97f1c3c4-0916-4222-afa7-c2e18b7f3573

📥 Commits

Reviewing files that changed from the base of the PR and between 8f974da and 871c259.

📒 Files selected for processing (19)
  • packages/bruno-app/src/components/AppTitleBar/AppMenu/index.js
  • packages/bruno-app/src/components/Sidebar/Collections/CreateOrOpenCollection/index.js
  • packages/bruno-app/src/components/Sidebar/OpenCollection/StyledWrapper.js
  • packages/bruno-app/src/components/Sidebar/OpenCollection/index.js
  • packages/bruno-app/src/components/Sidebar/Sections/CollectionsSection/index.js
  • packages/bruno-app/src/components/WorkspaceHome/WorkspaceOverview/index.js
  • packages/bruno-app/src/pages/Bruno/index.js
  • packages/bruno-app/src/providers/App/useIpcEvents.js
  • packages/bruno-app/src/providers/ReduxStore/slices/app.js
  • packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
  • packages/bruno-app/src/providers/ReduxStore/slices/workspaces/actions.js
  • packages/bruno-electron/src/app/collections.js
  • packages/bruno-electron/src/app/menu-template.js
  • packages/bruno-electron/src/ipc/collection.js
  • packages/bruno-electron/src/ipc/filesystem.js
  • packages/bruno-electron/src/utils/filesystem.js
  • packages/bruno-electron/src/utils/tests/filesystem/browse-directories.spec.js
  • tests/collection/open/open-collection-selection.spec.ts
  • tests/collection/open/open-multiple-collections.spec.ts

Comment thread packages/bruno-app/src/components/Sidebar/OpenCollection/index.js
Comment thread packages/bruno-app/src/components/Sidebar/OpenCollection/index.js Outdated
Comment thread tests/collection/open/open-collection-selection.spec.ts Outdated
@helloanoop

Copy link
Copy Markdown
Contributor

@gopu-bruno Lets also add tests to scan for deeply nested collections, like collection nested under folders.

@gopu-bruno gopu-bruno force-pushed the feat/open-multiple-collections branch from a5c8e35 to e9f8ea5 Compare July 13, 2026 12:50

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
tests/collection/open/open-collection-selection.spec.ts (1)

198-215: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider wrapping test phases in test.step for clearer reports.

The path instructions promote test.step usage for readable reports. This test has distinct arrange/act/assert phases that would benefit from step boundaries. Applies to all tests in this file.

♻️ Example test.step wrapping for the deeply nested test
   test('scans for deeply nested collections', async ({ page, electronApp, createTmpDir }) => {
     const locators = buildCommonLocators(page);
-    const base = await createTmpDir('nested-collection');
-    writeCollection(path.join(base, 'api', 'v2', 'users'), 'Users API');
-
-    await mockPickerPaths(electronApp, [base]);
-    await openViaSidebar(page);
-
-    await expect(openCollectionModal(page)).toBeVisible();
-    await expect(listTitles(page)).toHaveText('Users API');
-    await expect(listDescriptions(page)).toContainText('api/v2/users');
-
-    await toggleCollection(page, 'Users API');
-    await locators.modal.button('Open').click();
-
-    await expect(locators.sidebar.collection('Users API')).toBeVisible();
+    await test.step('arrange nested collection fixture', async () => {
+      const base = await createTmpDir('nested-collection');
+      writeCollection(path.join(base, 'api', 'v2', 'users'), 'Users API');
+      await mockPickerPaths(electronApp, [base]);
+    });
+
+    await test.step('open via sidebar and verify modal', async () => {
+      await openViaSidebar(page);
+      await expect(openCollectionModal(page)).toBeVisible();
+      await expect(listTitles(page)).toHaveText('Users API');
+      await expect(listDescriptions(page)).toContainText('api/v2/users');
+    });
+
+    await test.step('toggle and open collection', async () => {
+      await toggleCollection(page, 'Users API');
+      await locators.modal.button('Open').click();
+      await expect(locators.sidebar.collection('Users API')).toBeVisible();
+    });
     await closeAllCollections(page);
   });
As per path instructions, promote the use of `test.step` as much as possible so the generated reports are easier to read.
🤖 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 `@tests/collection/open/open-collection-selection.spec.ts` around lines 198 -
215, Wrap the distinct arrange, act, and assert phases of the deeply nested
collection test around test('scans for deeply nested collections', ...) in
descriptive test.step blocks, covering setup and path mocking, opening and
selecting the collection, and verifying the sidebar result and cleanup. Apply
the same step-boundary pattern consistently to the other tests in this file.

Source: Path instructions

🤖 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 `@packages/bruno-app/src/components/Sidebar/OpenCollection/index.js`:
- Around line 137-147: Update handleConfirm so onClose is called only when at
least one collection opens successfully: preserve the selected collections and
keep the modal open when result.opened is empty or dispatch rejects, while
retaining existing notifications and error handling.

---

Nitpick comments:
In `@tests/collection/open/open-collection-selection.spec.ts`:
- Around line 198-215: Wrap the distinct arrange, act, and assert phases of the
deeply nested collection test around test('scans for deeply nested collections',
...) in descriptive test.step blocks, covering setup and path mocking, opening
and selecting the collection, and verifying the sidebar result and cleanup.
Apply the same step-boundary pattern consistently to the other tests in this
file.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c10f69ef-3212-4606-9892-daece163b4d5

📥 Commits

Reviewing files that changed from the base of the PR and between bd0f105 and a5c8e35.

📒 Files selected for processing (5)
  • packages/bruno-app/src/components/Sidebar/OpenCollection/index.js
  • packages/bruno-app/src/providers/App/useIpcEvents.js
  • packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
  • packages/bruno-electron/src/app/collections.js
  • tests/collection/open/open-collection-selection.spec.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/bruno-electron/src/app/collections.js
  • packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js

Comment thread packages/bruno-app/src/components/Sidebar/OpenCollection/index.js Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
tests/collection/open/open-collection-selection.spec.ts (1)

51-60: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

Move raw selectors into a page module.

listTitles, listDescriptions, and toggleCollection inline [data-testid="selection-list"] ... locators directly in the spec. The same applies to inline page.getByTestId('selection-count'/'selection-select-all-toggle'/'selection-search-input') and the .titlebar-left .home-button CSS selector further down. Centralize these in a tests/utils/page/* module (e.g. extend buildCommonLocators) so specs only consume named actions/locators.

As per coding guidelines: "Centralise locators and actions in page modules under tests/utils/page/* — never inline raw selectors in a spec." As per path instructions: "Centralize selectors/actions in tests/utils/page/* page modules; don't inline raw page.locator(...)/page.getByTestId(...) in specs."

🤖 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 `@tests/collection/open/open-collection-selection.spec.ts` around lines 51 -
60, Move the raw selection-list selectors and related actions out of the spec
into the appropriate page module under tests/utils/page, extending
buildCommonLocators or an equivalent module. Centralize listTitles,
listDescriptions, toggleCollection, the selection-count/select-all/search
locators, and the home-button selector there, then update the spec to consume
only the named page-module locators and actions.

Sources: Coding guidelines, Path instructions

🤖 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.

Nitpick comments:
In `@tests/collection/open/open-collection-selection.spec.ts`:
- Around line 51-60: Move the raw selection-list selectors and related actions
out of the spec into the appropriate page module under tests/utils/page,
extending buildCommonLocators or an equivalent module. Centralize listTitles,
listDescriptions, toggleCollection, the selection-count/select-all/search
locators, and the home-button selector there, then update the spec to consume
only the named page-module locators and actions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 1915607e-0681-4491-80fb-03894643c723

📥 Commits

Reviewing files that changed from the base of the PR and between a5c8e35 and e9f8ea5.

📒 Files selected for processing (19)
  • packages/bruno-app/src/components/AppTitleBar/AppMenu/index.js
  • packages/bruno-app/src/components/Sidebar/Collections/CreateOrOpenCollection/index.js
  • packages/bruno-app/src/components/Sidebar/OpenCollection/StyledWrapper.js
  • packages/bruno-app/src/components/Sidebar/OpenCollection/index.js
  • packages/bruno-app/src/components/Sidebar/Sections/CollectionsSection/index.js
  • packages/bruno-app/src/components/WorkspaceHome/WorkspaceOverview/index.js
  • packages/bruno-app/src/pages/Bruno/index.js
  • packages/bruno-app/src/providers/App/useIpcEvents.js
  • packages/bruno-app/src/providers/ReduxStore/slices/app.js
  • packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
  • packages/bruno-app/src/providers/ReduxStore/slices/workspaces/actions.js
  • packages/bruno-electron/src/app/collections.js
  • packages/bruno-electron/src/app/menu-template.js
  • packages/bruno-electron/src/ipc/collection.js
  • packages/bruno-electron/src/ipc/filesystem.js
  • packages/bruno-electron/src/utils/filesystem.js
  • packages/bruno-electron/src/utils/tests/filesystem/browse-directories.spec.js
  • tests/collection/open/open-collection-selection.spec.ts
  • tests/collection/open/open-multiple-collections.spec.ts
🚧 Files skipped from review as they are similar to previous changes (14)
  • tests/collection/open/open-multiple-collections.spec.ts
  • packages/bruno-app/src/components/AppTitleBar/AppMenu/index.js
  • packages/bruno-electron/src/app/menu-template.js
  • packages/bruno-app/src/providers/ReduxStore/slices/workspaces/actions.js
  • packages/bruno-electron/src/utils/filesystem.js
  • packages/bruno-app/src/providers/ReduxStore/slices/app.js
  • packages/bruno-electron/src/ipc/filesystem.js
  • packages/bruno-app/src/components/WorkspaceHome/WorkspaceOverview/index.js
  • packages/bruno-app/src/components/Sidebar/Collections/CreateOrOpenCollection/index.js
  • packages/bruno-app/src/providers/App/useIpcEvents.js
  • packages/bruno-electron/src/ipc/collection.js
  • packages/bruno-electron/src/app/collections.js
  • packages/bruno-app/src/components/Sidebar/Sections/CollectionsSection/index.js
  • packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js

@gopu-bruno gopu-bruno changed the base branch from main to release/v4.1.0 July 13, 2026 14:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants