Skip to content

Conversation

@q16marvin
Copy link
Contributor

@q16marvin q16marvin commented May 5, 2025

Fixes #

Type

  • Bugfix
  • Feature
  • Documentation
  • Refactoring (e.g. Style updates, Test implementation, etc.)
  • Other (please describe):

Checklist

  • Code updated to current develop branch head
  • Passes CI checks
  • Is a part of an issue
  • Tests added for the bugfix or newly implemented feature, describe below why if not
  • Changelog is updated
  • Documentation of code and features exists

Changes

We have everyday on small meeting, if someone is on the road he must dialin via phone. Currently BBB create on every new Meeting a new random dialin pin. So for specified Meetings we need a fixed PIN that never changed.

This Change bringt a new Room Field:

grafik

Other information

Summary by CodeRabbit

  • New Features

    • Introduced dial-in PIN functionality for rooms, allowing generation, assignment, and validation of a unique 5-digit PIN.
    • Added support for dial-in PIN settings at both room and room type levels, including enforcement and default options.
    • New UI components and form fields for managing dial-in PINs in room and admin settings.
    • Dial-in PIN is now included in meeting creation parameters and room settings displays.
  • Localization

    • Added English and German translations for all new dial-in PIN related labels, messages, and validation attributes.
  • Bug Fixes

    • Ensured proper validation and uniqueness of dial-in PINs when creating or updating rooms.

@coderabbitai
Copy link

coderabbitai bot commented May 5, 2025

## Walkthrough

This change introduces a "dial-in PIN" feature for rooms, including backend support, validation, database schema updates, API resource adjustments, and frontend UI components. It adds new settings for room types and rooms, validation logic, translations, and UI elements for managing and displaying dial-in PINs, including enforcement and default behaviors.

## Changes

| Files / Group                                                                                                 | Change Summary |
|--------------------------------------------------------------------------------------------------------------|---------------|
| `database/migrations/2025_05_05_222245_add_dialin_pin_to_rooms_table.php`                                    | Adds `dialin_pin` column to `rooms` table and `has_dialin_pin_enforced`, `has_dialin_pin_default` columns to `room_types` table. |
| `app/Models/Room.php`<br>`app/Models/RoomType.php`                                                           | Adds attribute casting for `dialin_pin` (as integer) in Room and for `has_dialin_pin_default`/`has_dialin_pin_enforced` (as boolean) in RoomType. |
| `app/Http/Controllers/api/v1/RoomController.php`                                                             | Generates and updates `dialin_pin` in store and update methods based on room type settings. |
| `app/Http/Controllers/api/v1/RoomTypeController.php`                                                         | Handles `has_dialin_pin_default` and `has_dialin_pin_enforced` in store and update methods. |
| `app/Http/Requests/RoomTypeRequest.php`                                                                      | Adds validation rules and attribute names for `has_dialin_pin_default` and `has_dialin_pin_enforced`. |
| `app/Http/Requests/UpdateRoomSettings.php`                                                                   | Adds validation for `dialin_pin` with dynamic rules based on room type; new private method for rule generation. |
| `app/Http/Resources/RoomSettings.php`                                                                        | Adds `dialin_pin` to the resource output array. |
| `app/Http/Resources/RoomType.php`                                                                            | Adds `has_dialin_pin_default` and `has_dialin_pin_enforced` to default room settings output. |
| `app/Services/MeetingService.php`                                                                            | Sets `voiceBridge` parameter using room's `dialin_pin` when starting a meeting. |
| `resources/js/components/RoomTabSettings.vue`                                                                | Adds dial-in PIN input to advanced room settings form. |
| `resources/js/components/RoomTabSettingsDialinPinInput.vue`                                                  | New component for dial-in PIN input, generation, enforcement/prohibition display, and error handling. |
| `resources/js/composables/useRoomTypeSettings.js`                                                            | Adds dial-in PIN switch to advanced room type settings. |
| `resources/js/constants/roomSettings.js`                                                                     | Adds `dialin_pin` as an expert room setting. |
| `resources/js/views/AdminRoomTypesView.vue`                                                                  | Adds UI controls for `has_dialin_pin_default` and `has_dialin_pin_enforced` in room type admin view. |
| `lang/en/rooms.php`<br>`lang/de/rooms.php`                                                                   | Adds localization entries for dial-in PIN feature and related UI messages. |
| `lang/en/validation.php`<br>`lang/de/validation.php`                                                         | Adds attribute translations for `dialin_pin` and `has_dialin_pin`. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Admin as Admin User
    participant AdminUI as AdminRoomTypesView.vue
    participant API as RoomTypeController
    participant DB as Database

    Admin->>AdminUI: Toggle "Has Dialin PIN" / "Enforced" switches
    AdminUI->>API: POST/PUT room type with dialin PIN settings
    API->>DB: Update room_types (has_dialin_pin_default, has_dialin_pin_enforced)
    API-->>AdminUI: Confirmation/updated room type

    participant User as User
    participant RoomUI as RoomTabSettings.vue
    participant RoomAPI as RoomController
    participant RoomDB as Database

    User->>RoomUI: Set or generate dial-in PIN
    RoomUI->>RoomAPI: POST/PUT room with dialin_pin
    RoomAPI->>RoomDB: Store/Update room (dialin_pin)
    RoomAPI-->>RoomUI: Confirmation/updated room

    participant MeetingService as MeetingService
    participant BBB as BigBlueButton

    User->>MeetingService: Start meeting for room
    MeetingService->>BBB: Create meeting (voiceBridge = dialin_pin)
    BBB-->>MeetingService: Meeting started

Suggested labels

enhancement


<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 3f62eb61359b9e40253d6f55fbd70135ba0c1afa and b72ca718d9f789dcf343ff31dabb30f5f0b471d7.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `app/Http/Requests/UpdateRoomSettings.php` (2 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* app/Http/Requests/UpdateRoomSettings.php

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (2)</summary>

* GitHub Check: Docker Build
* GitHub Check: Backend

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

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.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=THM-Health/PILOS&utm_content=2116):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link

@coderabbitai coderabbitai bot left a comment

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 (3)
lang/de/rooms.php (1)

362-367: Minor inconsistency in German translations

There's a small inconsistency in how "Einwahl-PIN" (line 5) vs "Einwahl Pin" (lines 362-367) is written - with a hyphen in one place but not in others.

Consider standardizing the terminology for consistency:

-    'has_dialin_pin' => 'Einwahl PIN',
-    'dialin_pin_none_placeholder' => '-- Zufällig --',
-    'dialin_pin_enforced' => 'Die Raumart erzwingt, dass ein Einwahl Pin existiert',
-    'dialin_pin_prohibited' => 'Die Raumart erzwingt, dass kein Einwahl Pin existiert',
-    'generate_dialin_pin' => 'Neuen Einwahl Pin erstellen',
-    'delete_dialin_pin' => 'Einwahl Pin entfernen',
+    'has_dialin_pin' => 'Einwahl-PIN',
+    'dialin_pin_none_placeholder' => '-- Zufällig --',
+    'dialin_pin_enforced' => 'Die Raumart erzwingt, dass ein Einwahl-PIN existiert',
+    'dialin_pin_prohibited' => 'Die Raumart erzwingt, dass kein Einwahl-PIN existiert',
+    'generate_dialin_pin' => 'Neuen Einwahl-PIN erstellen',
+    'delete_dialin_pin' => 'Einwahl-PIN entfernen',
resources/js/components/RoomTabSettingsDialinPinInput.vue (2)

109-112: Small issue in random PIN generation logic

There's a minor issue in the random number generation formula that might lead to slightly uneven distribution.

-  model.value[props.setting] =
-    Math.floor(Math.random() * (99999 - 11112)) + 11111;
+  model.value[props.setting] =
+    Math.floor(Math.random() * (99999 - 11111 + 1)) + 11111;

The current formula subtracts 11112 from 99999, which results in 88887 possible values rather than 88889 (99999-11111+1). This would make the number 99999 slightly less likely to be generated.


1-113: Consider adding a validation method for dial-in PIN

While the backend validation will likely handle invalid PINs, it could be beneficial to add frontend validation to provide immediate feedback to users.

Consider adding a method to validate the PIN format (e.g., ensure it's a 5-digit number) before submitting to the server. This could be implemented as follows:

/**
 * Validate the dialin PIN format
 * @returns {boolean} True if valid, false otherwise
 */
function validateDialinPin() {
  if (!model.value[props.setting]) return true; // Empty is valid (handled by backend if required)
  const pin = model.value[props.setting];
  return Number.isInteger(pin) && pin >= 10000 && pin <= 99999;
}

// You could then watch for changes and validate
watch(() => model.value[props.setting], (newVal) => {
  if (newVal && !validateDialinPin()) {
    // Set a local validation error state or emit an event
  }
});
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b51dcf3 and 3f62eb6.

📒 Files selected for processing (19)
  • app/Http/Controllers/api/v1/RoomController.php (2 hunks)
  • app/Http/Controllers/api/v1/RoomTypeController.php (2 hunks)
  • app/Http/Requests/RoomTypeRequest.php (2 hunks)
  • app/Http/Requests/UpdateRoomSettings.php (2 hunks)
  • app/Http/Resources/RoomSettings.php (1 hunks)
  • app/Http/Resources/RoomType.php (1 hunks)
  • app/Models/Room.php (1 hunks)
  • app/Models/RoomType.php (1 hunks)
  • app/Services/MeetingService.php (1 hunks)
  • database/migrations/2025_05_05_222245_add_dialin_pin_to_rooms_table.php (1 hunks)
  • lang/de/rooms.php (2 hunks)
  • lang/de/validation.php (2 hunks)
  • lang/en/rooms.php (2 hunks)
  • lang/en/validation.php (2 hunks)
  • resources/js/components/RoomTabSettings.vue (2 hunks)
  • resources/js/components/RoomTabSettingsDialinPinInput.vue (1 hunks)
  • resources/js/composables/useRoomTypeSettings.js (1 hunks)
  • resources/js/constants/roomSettings.js (1 hunks)
  • resources/js/views/AdminRoomTypesView.vue (2 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (2)
app/Services/MeetingService.php (1)
app/Models/Room.php (1)
  • getRoomSetting (412-435)
app/Http/Controllers/api/v1/RoomController.php (1)
app/Models/Room.php (1)
  • roomType (255-258)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Docker Build
🔇 Additional comments (30)
resources/js/constants/roomSettings.js (1)

53-55: Correctly implemented static dial-in PIN setting.

The addition of the dialin_pin setting with the expert flag set to true is correct and follows the established pattern of the codebase.

app/Http/Resources/RoomSettings.php (1)

34-34: Correctly exposed the dialin_pin field in the API response.

The addition of the dialin_pin field to the resource's toArray method ensures it will be properly included in API responses.

app/Models/RoomType.php (1)

24-25: Appropriate boolean casts added for dial-in PIN room type settings.

The addition of boolean casts for has_dialin_pin_default and has_dialin_pin_enforced ensures proper type conversion between database values and PHP boolean values.

resources/js/composables/useRoomTypeSettings.js (1)

148-153: Correctly implemented dial-in PIN setting UI configuration.

The dial-in PIN setting is properly added to the advanced settings group with the appropriate key, label, and switch type. This implementation follows the established pattern of the codebase.

resources/js/components/RoomTabSettings.vue (2)

132-132: Well-structured import for dialin PIN component

The import of the new RoomTabSettingsDialinPinInput component follows the established pattern for other input components in this file.


338-343: Good implementation of the dial-in PIN input in advanced settings

The new dial-in PIN setting is correctly integrated into the "advanced" section of the form. The implementation follows the same structure as other form items, using translation keys for labels and placeholders.

app/Services/MeetingService.php (1)

101-102: Good integration of dialin_pin as voiceBridge parameter

The implementation correctly sets the voiceBridge parameter using the room's dialin_pin setting. This ensures that the static PIN from room settings is passed to BigBlueButton during meeting creation.

The use of getRoomSetting() is appropriate as it handles the logic for enforced/default values from room types.

app/Models/Room.php (1)

69-69: Appropriate casting for dialin_pin attribute

The dialin_pin is correctly cast as an integer, which is consistent with how other numeric identifiers like access_code are handled in this model.

app/Http/Resources/RoomType.php (1)

76-78: Correctly implemented room type settings for dialin PIN

The addition of has_dialin_pin_default and has_dialin_pin_enforced flags follows the established pattern for similar settings like access codes. These properties enable administrators to control whether the dialin PIN is enabled by default and whether it can be overridden at the room level.

lang/en/validation.php (2)

83-83: Consistent label added for has_dialin_pin attribute

The new validation attribute for the has_dialin_pin field is properly added and follows the established naming convention pattern.


168-168: Consistent label added for dialin_pin attribute

The new validation attribute for the dialin_pin field is properly added and follows the established naming convention pattern.

app/Http/Controllers/api/v1/RoomTypeController.php (2)

111-112: Properly added dialin PIN properties to the update method

The dialin PIN default and enforced settings are correctly added to the update method, following the same pattern as the existing access code settings.


148-149: Properly added dialin PIN properties to the store method

The dialin PIN default and enforced settings are correctly added to the store method, following the same pattern as the existing access code settings.

lang/de/validation.php (2)

83-83: Appropriate German translation for has_dialin_pin attribute

The translation for the has_dialin_pin field is properly added and uses an appropriate German term.


168-168: Appropriate German translation for dialin_pin attribute

The translation for the dialin_pin field is properly added and uses an appropriate German term.

app/Http/Requests/RoomTypeRequest.php (2)

28-29: Properly added validation rules for dialin PIN settings

The validation rules for the dialin PIN default and enforced settings are correctly added, following the same pattern as the existing access code settings.


55-56: Properly added attribute localization for dialin PIN settings

The attribute localization for the dialin PIN settings is correctly implemented, using the validation translation system in a consistent manner.

resources/js/views/AdminRoomTypesView.vue (2)

1407-1451: Good implementation of the dial-in PIN UI section

The implementation follows the established UI pattern used for other settings in the application, with proper toggle controls for both default and enforced states. The translation keys are correctly referenced for internationalization support.


1610-1611: LGTM: Model properties correctly initialized

The reactive properties for the dial-in PIN feature are correctly added to the model object and initialized to false by default, matching the database column defaults.

database/migrations/2025_05_05_222245_add_dialin_pin_to_rooms_table.php (2)

16-22: Sound database design for dial-in PIN functionality

The migration properly adds boolean columns to the room_types table for feature control and a unique integer column to the rooms table for storing the actual PIN. The unique constraint on dialin_pin is appropriate for a feature that requires distinct values for different rooms.


29-36: Properly implemented down migration

The down() method correctly drops all added columns in case of rollback, maintaining database integrity.

app/Http/Requests/UpdateRoomSettings.php (2)

20-20: LGTM: New validation rule properly added

The dial-in PIN validation rule is correctly added to the rules array, using a dedicated method for rule generation similar to the pattern used for access codes.


78-78: Good validation constraints for dial-in PIN

The validation ensures the PIN is a 5-digit integer between 10000-99999, which is a reasonable format for a dial-in PIN, and the uniqueness constraint prevents conflicts between different rooms.

lang/en/rooms.php (2)

5-5: LGTM: Top-level translation key added

The main translation key for "Dialin PIN" is properly added to the language file.


362-367: Complete localization entries for dial-in PIN UI elements

All necessary translation keys for the dial-in PIN feature UI elements have been added, following the existing pattern and terminology of the application.

app/Http/Controllers/api/v1/RoomController.php (2)

177-180: Implementation for dialog PIN generation looks good

The logic correctly generates a random 5-digit PIN (between 11111 and 99999) when the room type has the dialin_pin_default flag enabled. The approach aligns with the existing access code generation pattern.


281-281: LGTM! The room's dialin_pin update is properly handled

This change correctly adds support for updating the room's dialin_pin attribute from the request input, consistent with how other settings are handled.

lang/de/rooms.php (1)

5-5: LGTM! New translation for dialin_pin

The translation for "dialin_pin" is properly added, supporting the new feature in the German interface.

resources/js/components/RoomTabSettingsDialinPinInput.vue (2)

1-60: UI implementation looks clean and well-structured

The component follows best practices with clear organization, proper data binding, and conditional rendering. The tooltip usage and accessibility attributes are implemented correctly.


62-105: Props and model definitions are well organized

The component's script setup follows Vue 3 best practices with proper use of defineProps and defineModel. All props have appropriate types and default values where needed.

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@samuelwei
Copy link
Collaborator

Hello @q16marvin,

Thank you for your PR. Unfortunately, adding static dial-in PINs is not that easy to accomplish.
In order to have a predictable combination of dial-in number and PIN, we need to know not only the PIN, but also the number.
Since most users have not just one, but several BBB servers, they all use the same Freeswitch server with a common number.
All BBB servers must then use a central dial-in plan to resolve the pin for a meeting.

Scalelite can provide such a dial-in plan, but in PILOS you can also add the servers directly, so PILOS would also need to provide a dial-in plan. The combination of other load balancers and adding servers directly makes the whole thing even more complex, the dial in plans would have to be merged by something.

In the event that other frontends can also create meetings on the same BBB server, we also need to ensure that the same number is not assigned twice, which is particularly difficult as BBB creates these numbers when they are not explicitly set. So it can happen that a meeting without a fixed PIN is assigned the same PIN by BBB as a room with a static PIN.

If I am wrong somewhere, please correct me. It's been a few days since I last dealt with this complex issue.

@q16marvin
Copy link
Contributor Author

Hi @samuelwei,

you are absolutly right, in big enviroments with some BBB Servers and maybe other frontends to manage this BBB Servers it can happen colliding PINs :(

we have only one BBB Server and with a freeswitch dial in. Could we add this function with a .env setting called like "PILOS_DIALIN_PIN_ENABLE = true" and this stuff is only useable if this is true and document it with the "risky in big enviroments"?

Or other Idea: BBB Servers generate Random PINs from 10000 - 99999. Pilos could use Pins from 00001 - 09999, than there would never be a conflict.

thats the last "feature" why we cant move from our self developed stupid frontend to your extrem cool frontend for BBB. So i would be realy happy if we find any compromise :)

@samuelwei samuelwei force-pushed the develop branch 2 times, most recently from 88ee280 to bc9287a Compare October 20, 2025 15:17
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.

2 participants