Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(zmskvr-160) update conformation for export #929

Merged
merged 8 commits into from
Mar 18, 2025

Conversation

msfb3
Copy link
Contributor

@msfb3 msfb3 commented Mar 11, 2025

Pull Request Checklist (Feature Branch to next):

  • Ich habe die neuesten Änderungen aus dem next Branch in meinen Feature-Branch gemergt.
  • Das Code-Review wurde abgeschlossen.
  • Fachliche Tests wurden durchgeführt und sind abgeschlossen.

Summary by CodeRabbit

  • New Features
    • Introduced copy buttons within success message sections that allow users to quickly copy displayed content.
    • Enhanced the user interface by providing detailed information, including appointment details and contact information, for improved user interaction.
  • Improvements
    • Added functionality to copy text directly from the application interface, enhancing user interactivity.
  • Bug Fixes
    • Removed outdated assertions from tests to align with the updated expected outputs.

Copy link
Contributor

coderabbitai bot commented Mar 11, 2025

Walkthrough

The changes involve updates to the Twig template and JavaScript files to enhance user interaction with copy functionality. The process_reserved and process_queued blocks in the template are updated to include detailed information and copy buttons. In the JavaScript files, a new onCopyButton property is added in the appointment module, while a corresponding method is implemented in the workstation module to facilitate copying text to the clipboard. No public entity declarations were altered.

Changes

File(s) Change Summary
zmsadmin/templates/…/helper/messages.twig Modified process_reserved and process_queued blocks to replace existing <dl> elements with new structures that include additional details and a copy button.
zmsadmin/js/block/appointment/index.js
zmsadmin/js/page/workstation/index.js
Introduced an onCopyButton property in the appointment file and a new onCopyButton method in the workstation file to handle the copy functionality. The method retrieves content from an element and uses the clipboard API to copy it.
zmsadmin/tests/Zmsadmin/ProcessQueueTest.php
zmsadmin/tests/Zmsadmin/ProcessReserveTest.php
Removed assertions checking for specific strings in the response body across multiple test methods, indicating a change in expected output.
zmsadmin/js/lib/messageHandler.js Updated bindEvents method to correctly retrieve the callback from the clicked element, ensuring proper event handling.

Sequence Diagram(s)

Appointment Copy Flow

sequenceDiagram
    participant U as User
    participant B as Copy Button (Appointment)
    participant V as Appointment View
    U->>B: Clicks copy button
    B->>V: Event triggers onCopyButton (from options)
    V->>V: Executes copy callback
Loading

Workstation Copy Flow

sequenceDiagram
    participant U as User
    participant B as Copy Button (Workstation)
    participant V as Workstation View
    participant D as Document
    U->>B: Clicks copy button
    B->>V: Triggers onCopyButton method
    V->>V: Prevents default and creates text selection
    V->>D: Executes navigator.clipboard.writeText
    D-->>V: Returns success or failure
    V->>V: Clears selection and alerts result
Loading

Poem

I'm a bunny tap-dancing on lines of code,
Hopping through buttons where new features erode.
With a click and a copy, my world is renewed,
In fields of logic where data is brewed.
Carrot dreams and clean code—oh, what a joyful mode!


📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Free

📥 Commits

Reviewing files that changed from the base of the PR and between 118e692 and cba7ff0.

📒 Files selected for processing (1)
  • zmsadmin/js/lib/messageHandler.js (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • zmsadmin/js/lib/messageHandler.js

Note

🎁 Summarized by CodeRabbit Free

Your organization has reached its limit of developer seats under the Pro Plan. For new users, CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please add seats to your subscription by visiting https://app.coderabbit.ai/login.If you believe this is a mistake and have available seats, please assign one to the pull request author through the subscription management page using the link above.

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

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

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

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@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

🔭 Outside diff range comments (1)
zmsadmin/templates/element/helper/messages.twig (1)

303-303: ⚠️ Potential issue

Copy button missing corresponding content ID

The copy button has ID 'copy-popup-content', but the JavaScript implementation in workstation/index.js looks for an element with ID 'popup-content' to copy, which doesn't exist in this template.

There are two ways to fix this:

  1. Add an ID to the content that should be copied:
-<dl>
+<dl id="popup-content">
  1. Or, as suggested in the previous review comment, modify the JavaScript to use a class selector instead of relying on a specific ID.
🧹 Nitpick comments (1)
zmsadmin/js/block/appointment/index.js (1)

173-174: Add error handling for undefined callback

The event handler calls this.onCopyButton without checking if it exists, which could cause a runtime error if the callback wasn't provided in the options.

 }).on('click', '.form-actions .copy-btn', (event) => {
-    this.onCopyButton(this, event);
+    if (typeof this.onCopyButton === 'function') {
+        this.onCopyButton(this, event);
+    }
 }).on('click', '.form-actions button.process-delete', (event) => {
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4da0801 and 1d14cf0.

📒 Files selected for processing (4)
  • zmsadmin/templates/element/helper/messages.twig (2 hunks)
  • zmsadmin/js/block/appointment/index.js (2 hunks)
  • zmsadmin/js/page/workstation/index.js (3 hunks)
  • zmsadmin/templates/element/helper/messages.twig (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (6)
  • GitHub Check: Analyze (javascript-typescript)
  • GitHub Check: call-php-unit-tests / zmsdb-test
  • GitHub Check: call-php-code-quality / module-code-quality (zmsdldb, 8.0)
  • GitHub Check: call-php-code-quality / module-code-quality (zmsdb, 8.0)
  • GitHub Check: call-php-code-quality / module-code-quality (zmsclient, 8.0)
  • GitHub Check: call-php-unit-tests / zmsapi-test
🔇 Additional comments (5)
zmsadmin/js/block/appointment/index.js (1)

59-59: Added callback for copy button functionality

This addition sets up a new callback for copy button functionality, which aligns with the changes in other files.

zmsadmin/js/page/workstation/index.js (2)

54-54: Method binding for copy button functionality

Correctly added the new method to the bindPublicMethods call.


617-617: Correctly added copy button handler to AppointmentView options

This line properly passes the onCopyButton callback to the AppointmentView component.

zmsadmin/templates/element/helper/messages.twig (2)

237-240: Improved display of appointment information

The new template code uses Twig's reduce, map, and join filters to create a more concise display of request information. This is a more elegant solution than previous verbose implementations.


296-299: Consistent formatting for appointment information

The same pattern has been consistently applied here as in the previous block, which is good for maintaining consistency across the UI.

Comment on lines 421 to 446
onCopyButton(event) {
stopEvent(event);
console.log("Hallo");
document.addEventListener('DOMContentLoaded', function () {
var copyButton = document.getElementById('copy-popup-content');
var popupContent = document.getElementById('popup-content');

copyButton.addEventListener('click', function () {
var range = document.createRange();
range.selectNode(popupContent);
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);

try {
var successful = document.execCommand('copy');
var msg = successful ? 'erfolgreich' : 'nicht erfolgreich';
alert('Inhalt wurde ' + msg + ' kopiert');
} catch (err) {
alert('Kopieren war nicht erfolgreich');
}

window.getSelection().removeAllRanges();
});
});

}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix implementation of copy functionality

The current implementation has several critical issues:

  1. The DOMContentLoaded event listener is added inside the click handler, which is ineffective as this event only fires once when the document initially loads.
  2. Console log statement "Hallo" appears to be debugging code.
  3. The code adds new event listeners each time the button is clicked, which could cause memory leaks.
  4. There's no check to ensure the required DOM elements exist.

Replace with a more straightforward and reliable implementation:

 onCopyButton(event) {
     stopEvent(event);
-    console.log("Hallo");
-    document.addEventListener('DOMContentLoaded', function () {
-        var copyButton = document.getElementById('copy-popup-content');
-        var popupContent = document.getElementById('popup-content');
-    
-        copyButton.addEventListener('click', function () {
-            var range = document.createRange();
-            range.selectNode(popupContent);
-            window.getSelection().removeAllRanges();
-            window.getSelection().addRange(range);
-    
-            try {
-                var successful = document.execCommand('copy');
-                var msg = successful ? 'erfolgreich' : 'nicht erfolgreich';
-                alert('Inhalt wurde ' + msg + ' kopiert');
-            } catch (err) {
-                alert('Kopieren war nicht erfolgreich');
-            }
-    
-            window.getSelection().removeAllRanges();
-        });
-    });
+    const popupContent = document.querySelector('.message__body dl');
+    
+    if (!popupContent) {
+        console.error('Cannot find content to copy');
+        return;
+    }
+    
+    try {
+        const range = document.createRange();
+        range.selectNode(popupContent);
+        window.getSelection().removeAllRanges();
+        window.getSelection().addRange(range);
+        
+        const successful = document.execCommand('copy');
+        const msg = successful ? 'erfolgreich' : 'nicht erfolgreich';
+        
+        // Use a more user-friendly notification instead of alert
+        const messageContainer = $(event.currentTarget).closest('.message').find('.message__body');
+        const notification = $('<p class="copy-notification"></p>').text('Inhalt wurde ' + msg + ' kopiert');
+        messageContainer.append(notification);
+        
+        // Remove notification after a delay
+        setTimeout(() => {
+            notification.fadeOut(() => notification.remove());
+        }, 3000);
+    } catch (err) {
+        console.error('Copy failed:', err);
+        // Show error notification
+        const messageContainer = $(event.currentTarget).closest('.message').find('.message__body');
+        const notification = $('<p class="copy-notification error"></p>').text('Kopieren war nicht erfolgreich');
+        messageContainer.append(notification);
+        
+        // Remove notification after a delay
+        setTimeout(() => {
+            notification.fadeOut(() => notification.remove());
+        }, 3000);
+    }
+    
+    window.getSelection().removeAllRanges();
 }
📝 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
onCopyButton(event) {
stopEvent(event);
console.log("Hallo");
document.addEventListener('DOMContentLoaded', function () {
var copyButton = document.getElementById('copy-popup-content');
var popupContent = document.getElementById('popup-content');
copyButton.addEventListener('click', function () {
var range = document.createRange();
range.selectNode(popupContent);
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
try {
var successful = document.execCommand('copy');
var msg = successful ? 'erfolgreich' : 'nicht erfolgreich';
alert('Inhalt wurde ' + msg + ' kopiert');
} catch (err) {
alert('Kopieren war nicht erfolgreich');
}
window.getSelection().removeAllRanges();
});
});
}
onCopyButton(event) {
stopEvent(event);
const popupContent = document.querySelector('.message__body dl');
if (!popupContent) {
console.error('Cannot find content to copy');
return;
}
try {
const range = document.createRange();
range.selectNode(popupContent);
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
const successful = document.execCommand('copy');
const msg = successful ? 'erfolgreich' : 'nicht erfolgreich';
// Use a more user-friendly notification instead of alert
const messageContainer = $(event.currentTarget).closest('.message').find('.message__body');
const notification = $('<p class="copy-notification"></p>').text('Inhalt wurde ' + msg + ' kopiert');
messageContainer.append(notification);
// Remove notification after a delay
setTimeout(() => {
notification.fadeOut(() => notification.remove());
}, 3000);
} catch (err) {
console.error('Copy failed:', err);
// Show error notification
const messageContainer = $(event.currentTarget).closest('.message').find('.message__body');
const notification = $('<p class="copy-notification error"></p>').text('Kopieren war nicht erfolgreich');
messageContainer.append(notification);
// Remove notification after a delay
setTimeout(() => {
notification.fadeOut(() => notification.remove());
}, 3000);
}
window.getSelection().removeAllRanges();
}

MoDaae
MoDaae previously approved these changes Mar 13, 2025
MoDaae
MoDaae previously approved these changes Mar 13, 2025
@msfb3
Copy link
Contributor Author

msfb3 commented Mar 13, 2025

@coderabbitai The Popup should not close after click on copy button.

Copy link
Contributor

coderabbitai bot commented Mar 13, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

I'll help you fix the issue with the popup closing when the copy button is clicked. Let me first examine the current implementation of the copy button functionality.

Let me get a better understanding of the popup implementation and the copy button functionality:

I see the issue. The current onCopyButton method only prevents the default action with event.preventDefault() but doesn't stop the event from propagating up the DOM tree, which is likely causing the popup to close.

Here's how to fix it:

@msfb3 You need to modify the onCopyButton method in zmsadmin/js/page/workstation/index.js to also stop event propagation. Add event.stopPropagation() alongside the existing event.preventDefault() call:

onCopyButton: function (event) {
    event.preventDefault();
    event.stopPropagation(); // Add this line to prevent event bubbling
    
    var text = document.getElementById('copy-content').textContent;
    navigator.clipboard.writeText(text);
}

This will prevent the click event from bubbling up to parent elements that might be triggering the popup to close.


🏁 Script executed:

#!/bin/bash
# First, let's look at the onCopyButton method implementation
cat zmsadmin/js/page/workstation/index.js | grep -A 15 "onCopyButton"

# Let's also look at how popups or modals are handled in the codebase
rg "modal|popup|close" --type js

Length of output: 68522


🏁 Script executed:

#!/bin/bash
# Let's get the full View class from workstation/index.js to see more context
cat zmsadmin/js/page/workstation/index.js

# Let's also check the HTML template with the copy button
cat zmsadmin/templates/element/helper/messages.twig

Length of output: 39984


Let me look at the stopEvent function to understand how it's implemented and fix the popup closing issue.

@msfb3 You need to modify the onCopyButton method in zmsadmin/js/page/workstation/index.js to also stop event propagation. The current implementation only prevents the default action but doesn't stop the event from bubbling up to parent elements, which is likely causing the popup to close.

Add event.stopPropagation() to fix this:

onCopyButton(event) {
    stopEvent(event);
    event.stopPropagation(); // Add this line to prevent event bubbling
    var popupContent = document.getElementById('copy-content');
    var textToCopy = popupContent.innerText || popupContent.textContent;
    navigator.clipboard.writeText(textToCopy)
}

This will prevent the click event from reaching any parent elements that might be triggering the popup to close.


🏁 Script executed:

#!/bin/bash
# Let's check the stopEvent implementation from the utils file
cat zmsadmin/js/lib/utils.js | grep -A 5 stopEvent

Length of output: 168


@msfb3 I see the issue. Looking at the stopEvent function in utils.js, it already includes both preventDefault() and stopPropagation():

export const stopEvent = (ev) => {
    if (ev) {
        ev.preventDefault();
        ev.stopPropagation();
    }
}

Since event propagation is already being stopped, the issue might be that other event handlers are still being triggered on the same element. You should add event.stopImmediatePropagation() to the onCopyButton method to prevent any other event handlers from firing:

onCopyButton(event) {
    stopEvent(event);
    event.stopImmediatePropagation(); // Add this line to prevent other handlers from executing
    var popupContent = document.getElementById('copy-content');
    var textToCopy = popupContent.innerText || popupContent.textContent;
    navigator.clipboard.writeText(textToCopy);
}

This should prevent the popup from closing when the copy button is clicked.


✏️ Learnings added
Learnt from: msfb3
URL: https://github.com/it-at-m/eappointment/pull/929

Timestamp: 2025-03-13T15:15:18.126Z
Learning: In the eappointment application, when handling click events on buttons within popups/modals, both `event.preventDefault()` and `event.stopPropagation()` should be used to prevent the popup from closing unexpectedly.

Learnt from: msfb3
URL: https://github.com/it-at-m/eappointment/pull/929

Timestamp: 2025-03-13T15:15:18.127Z
Learning: In the eappointment application, the `onCopyButton` method should use both `stopEvent()` and `event.stopPropagation()` to prevent click events from bubbling up to parent elements, which can cause popups to close unexpectedly when buttons within them are clicked.

Learnt from: msfb3
URL: https://github.com/it-at-m/eappointment/pull/929

Timestamp: 2025-03-13T15:15:18.127Z
Learning: In the eappointment application's popup functionality, when a button inside a popup should not cause the popup to close, `event.stopImmediatePropagation()` might be needed in addition to `stopEvent(event)` to prevent other event handlers on the same element from executing.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@msfb3
Copy link
Contributor Author

msfb3 commented Mar 13, 2025

@coderabbitai stopImmediatePropagation is not working. The Popup will also close.

Copy link
Contributor

coderabbitai bot commented Mar 13, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Let's examine the popup/modal implementation in the codebase
echo "=== Looking for popup/modal implementation ==="
rg "popup|modal" --type js -A 5 -B 5

# Let's specifically look at event handling for the copy button
echo "=== Looking for copy button event handlers ==="
rg "copy-button|copyButton" --type js

# Let's also check for any click handlers on parent elements
echo "=== Looking for click handlers that might close popups ==="
rg "click.*close|close.*click" --type js

Length of output: 65697


🏁 Script executed:

#!/bin/bash
# Let's check the actual implementation of the copy button in the template
echo "=== Copy button implementation in HTML ==="
cat zmsadmin/templates/element/helper/messages.twig

# Let's examine the onCopyButton implementation and context
echo "=== onCopyButton implementation ==="
cat zmsadmin/js/page/workstation/index.js | grep -A 15 -B 15 "onCopyButton"

# Let's look for any document-level click handlers that might be closing popups
echo "=== Document-level click handlers ==="
rg "document.*click|click.*close" --type js

# Let's check if there are any modal or popup classes
echo "=== Modal/popup classes ==="
rg "class.*[Mm]odal|class.*[Pp]opup" --type js

Length of output: 85490


🏁 Script executed:

#!/bin/bash
# Let's look at how popup/dialog closing is implemented
echo "=== Dialog/popup closing mechanisms ==="
rg "dialog" --type js
rg "message.*(close|remove)" --type js
rg "\.fadeOut|\.remove" --type js

# Let's check the implementation of stopEvent
echo "=== stopEvent implementation ==="
rg "stopEvent.*function" --type js
rg "stopEvent.*=" --type js

# Let's look for any button click handlers
echo "=== Button click handlers ==="
rg "button.*(click|on)" --type js
rg "data-action-ok" --type js

Length of output: 67535


🏁 Script executed:

#!/bin/bash
# Let's examine the stopEvent implementation directly
echo "=== stopEvent implementation ==="
rg "stopEvent *=" --type js -A 5

# Let's examine any implementation of popup handling in the codebase
echo "=== Popup handling in the codebase ==="
rg "popup|lightbox|modal" --type js -A 2 -B 2 | grep -v node_modules | head -50

# Let's look for dismissal events in the codebase
echo "=== Dismissal events ==="
rg "fadeOut|remove|close|dismiss" --type js | grep -v node_modules | head -50

Length of output: 126539


🏁 Script executed:

#!/bin/bash
# Let's look at the implementation of the element that might be causing the popup to close
echo "=== Looking for popup close implementation ==="
rg "\.message|\.dialog|\.lightbox" --type js -A 5

# Let's check the lightbox implementation in more detail
echo "=== Checking lightbox implementation ==="
cat zmsticketprinter/js/lib/utils.js | grep -A 30 lightbox

# Let's check how button clicks are handled in the app
echo "=== Button click handlers ==="
rg "button.*click|button-ok" --type js

Length of output: 67077


🏁 Script executed:

#!/bin/bash
# Let's check the implementation of stopEvent and event handling
echo "=== stopEvent implementation ==="
cat zmsadmin/js/lib/utils.js | grep -A 10 "stopEvent"

# Let's check the dialog/message implementation
echo "=== Dialog/message implementation ==="
cat zmsadmin/js/lib/dialogHandler.js

# Let's check the button click handlers
echo "=== Button click handlers ==="
cat zmsadmin/js/page/workstation/index.js | grep -A 10 "onCopyButton"

Length of output: 7067


Based on the code inspection, I can see the issue. The popup is closing because the click event is propagating to parent elements. Let me explain the current implementation and propose a fix:

@msfb3 The issue is that the click event is still reaching the dialog's event handlers. Here's how to fix it:

onCopyButton(event) {
    event.preventDefault();
    event.stopImmediatePropagation(); // Prevent other handlers from executing
    const button = event.currentTarget;
    if (!button.closest('.dialog')) {
        // Only copy if not inside dialog to prevent closing
        var popupContent = document.getElementById('copy-content');
        var textToCopy = popupContent.innerText || popupContent.textContent;
        navigator.clipboard.writeText(textToCopy);
    }
}

This modification will:

  1. Use stopImmediatePropagation() to prevent other handlers from executing
  2. Check if the button is inside a dialog before proceeding
  3. Prevent the dialog's event handlers from closing the popup

Let me know if this resolves the issue for you.


🧠 Learnings used
Learnt from: msfb3
PR: it-at-m/eappointment#0
File: :0-0
Timestamp: 2025-03-13T15:15:18.239Z
Learning: In the eappointment application, the `onCopyButton` method should use both `stopEvent()` and `event.stopPropagation()` to prevent click events from bubbling up to parent elements, which can cause popups to close unexpectedly when buttons within them are clicked.

@msfb3 msfb3 merged commit b2fd63f into next Mar 18, 2025
50 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.

2 participants