USA
Account created on 25 June 2007, about 18 years ago
#

Merge Requests

More

Recent comments

🇺🇸United States mradcliffe USA

Oh, there is no built version of the library. Yeah, that's problematic. I guess that's why there are a bunch of npm packages for various frameworks to use partytown.

I can't think of any thing good that doesn't also require a bunch of work

- gitlab job that builds and makes an extra commit.
- manually building the source and committing it based on a package.json (like a ckeditor plugin)

🇺🇸United States mradcliffe USA

The merge request applies to 2.2.x branch (2025.04.15), not to the 2.2.6 release (2024.08.09) which is several commits behind.

🇺🇸United States mradcliffe USA

Focus order has its own issue 🐛 Fix keyboard accessibility of advanced attribute fields Active .

Two behavior changes:

  1. When linkTitle is enabled, the CKEditor Display text field is rendered after the Advanced section. Otherwise the Display text field is rendered before the Advanced section. This is probably a side effect of fieldParent.children.add(extraFieldView, fieldParent === linkFormView ? 1 : 0). Maybe this can be fixed or addressed later if it is a problem?
  2. The target decorator remains as a separate interface per CKEditor UX changes (now requires extra clicks to use).
🇺🇸United States mradcliffe USA

I was not able to use FormRowView for backwards-compatibility. Instead I added a class selector to fix the styles.

Focus order still needs to be addressed. I have not been able to figure that out. Hopefully someone can update the merge request to fix focus order in a way that is backwards-compatible.

🇺🇸United States mradcliffe USA

Some screenshots of old vs new:

Old

New

Merge request

Patch in #21

In order to resolve the look and feel,

the extra form fields should be added as ckeditor form rows, or maybe adding a class selector ck-form__row_large-top-padding to each extra field. The title field being outside of advanced probably just needs to become a ckeditor form row.

Then the focus order needs to be fixed.

And probably some @deprecated comments added to styles that no longer apply.

🇺🇸United States mradcliffe USA

Thank you, @netsliver. Can you review the existing merge request and/or create a merge request with the source javascript changes in addition to the built javascript? It is hard to review the changes in the obfuscated built javascript.

The main changes in #21 based on an expanded diff (attached) are the following. If the _getGroup and _createExtraFormFields changes are necessary, then I think those can be applied to the merge request in source and built versions.

I think the other changes are basically equivalent to the changes in the merge request and probably has the same issues in the merge request that need to be addressed. The submit changes to check the keys may be a good thing to add as well.

  •              _handleExtraFormFieldSubmit(e) {
                     const {
                         editor: t
    -                } = this, i = t.plugins.get("LinkUI").formView, r = t.commands.get("link");
    -                this.listenTo(i, "submit", (() => {
    -                    const t = e.reduce(((e, t) => (e[t] = i[t].fieldView.element.value, e)), {});
    -                    r.once("execute", ((e, i) => {
    -                        if (i.length < 3) i.push(t);
    -                        else {
    -                            if (3 !== i.length) throw Error("The link command has more than 3 arguments.");
    -                            Object.assign(i[2], t)
    -                        }
    +                } = this, r = t.plugins.get("LinkUI").formView, i = t.commands.get("link");
    +                this.listenTo(r, "submit", (() => {
    +                    const allKeys = Object.keys(s);
    +                    const t = allKeys.reduce((acc, key) => {
    +                        if (r[key] ? .fieldView ? .element ? .value != null) {
    +                            acc[key] = String(r[key].fieldView.element.value)
    +                        }
    +                        return acc
    +                    }, {});
    +                    i.once("execute", ((e, r) => {
    +                        r[1] = Object.assign({}, t, r[1] || {})
                         }), {
                             priority: "highest"
                         })
    

    _handleExtraFormFieldSubmit: only handles the new ckeditor args (not compatible with older release, so would require a version bump). It also changes the mapping of keys.

  • @@ -247,22 +489,24 @@
                     const {
                         editor: e
                     } = this, t = e.plugins.get("LinkUI").formView;
    -                t.targetMoved || (t._manualDecoratorSwitches._items.forEach((e => {
    -                    e.label === Drupal.t("Open in new window") && this._getGroup("advanced").children.add(e)
    +                t.targetMoved || ((t._manualDecoratorSwitches && t._manualDecoratorSwitches._items || []).forEach((e => {
    +                    if (e.label === Drupal.t("Open in new window")) this._getGroup("advanced").children.add(e)
                     })), t.targetMoved = !0) 
                 }   
    
    

    The _manualDecoratorSwitches error is resloved by checking if that exists. This is in the merge request.

  •              _addGroupsToFormView() {
    @@ -228,18 +465,23 @@
                     Object.values(this.groups).reverse().forEach((e => {
                         e.added || (t.children.add(e, 2), e.parent = t, t._focusables.add(e, 2), t.focusTracker.add(e.element), e.added = !0)
                     }));
    -                [t.children.find((e => e.template.attributes.class.indexOf("ck-button-save") > -1)), t.children.find((e => e.template.attributes.class.indexOf("ck-button-cancel") > -1))].forEach(((e, i) => {
    -                    t.children.remove(e), t._focusables.remove(e), t.focusTracker.remove(e.element), t.children.add(e, 3 + i), t._focusables.add(e, 3 + i), t.focusTracker.add(e.element)
    -                }))
    +                const saveButton = t.children.find(e => e.template && e.template.attributes && e.template.attributes.class.includes("ck-button-save")),
    +                    cancelButton = t.children.find(e => e.template && e.template.attributes && e.template.attributes.class.includes("ck-button-cancel"));
    +                [saveButton, cancelButton].forEach((btn, r) => {
    +                    if (!btn) return;
    +                    t.children.remove(btn), t._focusables.remove(btn), t.focusTracker.remove(btn.element), t.children.add(btn, 3 + r), t._focusables.add(btn, 3 + r), t.focusTracker.add(btn.element)
    +                })
                 }
    
    

    Changes the button finding logic in _addGroupsToFormView

  •              _getGroup(e) {
                     if (!this.groups[e]) {
                         const {
                             editor: t
                         } = this, {
    -                        locale: i
    -                    } = t, r = new a.CollapsibleView(i);
    -                    r.label = n[e].label, r.set("isCollapsed", !0), this.groups[e] = r
    +                        locale: r
    +                    } = t;
    +                    this.groups[e] = new m(r, {
    +                        label: n[e].label
    +                    })
                     }
                     return this.groups[e]
                 } 
    

    Changes the _getGroup method logic. Is this necessary?

  • @@ -210,14 +447,14 @@
                 }
                 _createExtraFormField(e, t) {
                     const {
    -                    editor: i
    +                    editor: r
                     } = this, {
    -                    locale: r
    -                } = i, o = i.plugins.get("LinkUI").formView, n = i.commands.get("link");
    -                if (void 0 === o[e]) {
    -                    const i = t.group ? this._getGroup(t.group) : o,
    -                        s = new a.LabeledFieldView(r, a.createLabeledInputText);
    -                    s.label = t.label, i.children.add(s, i === o ? 1 : 0), t.group || (o._focusables.add(s, 1), o.focusTracker.add(s.element)), o[e] = s, o[e].fieldView.bind("value").to(n, e), o[e].fieldView.element.value = n[e] || ""
    +                    locale: i
    +                } = r, s = r.plugins.get("LinkUI").formView, n = r.commands.get("link");
    +                if (void 0 === s[e]) {
    +                    const r = t.group ? this._getGroup(t.group) : s,
    +                        o = new a.LabeledFieldView(i, a.createLabeledInputText);
    +                    o.label = t.label, r.children.add(o, 1), t.group || (s._focusables.add(o, 1), s.focusTracker.add(o.element)), s[e] = o, s[e].fieldView.bind("value").to(n, e), s[e].fieldView.element.value = n[e] || ""
                     }
                 }
    

    There's a change when adding children in _createExtraFormFields that removes a condition. Not sure why.

  • At the beginning of the file there's some webpack changes. But this may be due to yarn / npm changes that make me think there is an extra build process involved in the patch in #21 not present in the built javascript on drupal.org.
🇺🇸United States mradcliffe USA

I added the Needs issue summary update tag so that scope of the issue from #34 as well as site owner workarounds can be added to the issue summary.

🇺🇸United States mradcliffe USA

Okay, I understand the change in linkit @mark_fullmer mentioned a bit more now, which is necessary for saving the form values. The button and target changes would also need to be made to get things functional.

🇺🇸United States mradcliffe USA

As far as I can tell, I don't think the linkit change would apply here.

I think the entire formView changes need to be redone to comply with link properties/decorators.

🇺🇸United States mradcliffe USA

But then _manualDecoratorSwitches is undefined later on. Whatever that means.

🇺🇸United States mradcliffe USA

The buttons are not direct children of linkFormView, but seem to be one level deeper.

.ck-form__row_with-submit button.ck-button-action which is used for Update and Insert button labels.

ck-button-save and ck-button-cancel classes were removed in CKEditor 45 as part of 17230: Improved linking experience.

So adding another item to that array maybe?

    const buttons = [
      linkFormView.children.find((child) => child.template.attributes.class.indexOf('ck-button-save') > -1),
      linkFormView.children.find((child) => child.template.attributes.class.indexOf('ck-button-cancel') > -1),
      linkFormView.children.find((child) => child.template.attributes.class.indexOf('ck-form__row-with-submit') > -1)
         ?.find((child) => child.template.attributes.class.indexOf('ck-button-action') > -1),
    ].filter(item => undefined !== item);

That's looking kind of ugly, so maybe cleaning it up so it's not in the array instantiation?

🇺🇸United States mradcliffe USA

I am only using Editor Advanced Link and run into this issue on 11.2.0.

    const buttons = [
      linkFormView.children.find((child) => child.template.attributes.class.indexOf('ck-button-save') > -1),
      linkFormView.children.find((child) => child.template.attributes.class.indexOf('ck-button-cancel') > -1),
    ];
    buttons.forEach((item, i) => {

The buttons here are now an array of undefined so potentially ck-button-save and ck-button-cancel no longer are found at that point in time.

I don't know if adding buttons.filter(e => undefined !== e).forEach would simply mask the issue.

🇺🇸United States mradcliffe USA

Oh wait, sorry, I was on the wrong issue.

🇺🇸United States mradcliffe USA

Thank you for reporting the issue and creating the merge request.

I started reviewing and testing this locally yesterday, and it does seem to resolve the issue. I am curious why the fee is being added per line item when it displays as if it were an order adjustment, but if that's how commerce_fee works, then it does need to be added in the place we're adding it.

I'll try to finish my review and manual testing soon.

🇺🇸United States mradcliffe USA

This is what I run into with my comment in #8. If you don't want to edit composer.json, then

On a platform that meets the requirements,

composer require drupal/core-recommended:^11.2 drupal/core-composer-scaffold:^11.2 drupal/core-project-message:^11.2 --no-update
composer require --dev drupal/core-dev:^11 --no-update
rm composer.lock
composer install

Or if you prefer pinned versions in composer.json for less risk (this is what I did yesterday and it updated fine),

composer require drupal/core-recommended:11.2.0 drupal/core-composer-scaffold:11.2.0 drupal/core-project-message:11.2.0 --no-update
composer require --dev drupal/core-dev:^11 --no-update
rm composer.lock
composer install

Or if you want to use the composer.json you have above without running commands, change drupal/core-dev: 11.1.1 to drupal/core-dev: ^11, remove composer.lock, and run composer install.

🇺🇸United States mradcliffe USA

I was able to update to 11.2.0 from 11.1.8 yesterday, but ran into issues along the way because of my drupal/core-dev dev dependency being too strict (^11.1 rather than ^11).

Reviewing my shell history locally, I worked around the issue using --no-update with the require commands, removed the lock file, and then ran composer install again.

@johnwt, I don' find phpunit/phpunit in that composer.json. Maybe there is a mismatch between composer.json and composer.lock on your site? Or is that not the root composer.json for your site?

🇺🇸United States mradcliffe USA

Merging this so we can have GitLab pages started.

🇺🇸United States mradcliffe USA

I added unique speaker notes from the current canonical slides as well as from @ninelivesblackcat's midcamp slides into the deck.

I also added her Drupal Forge slide.

🇺🇸United States mradcliffe USA

I applied the theme to the FTCWS Themed slide deck in the Mentoring drive and fixed everything up so that existing content fit into placeholder content (with the exception of event logos). Some of the screenshot content is never going to be perfect for a theme due to how stylized the original image crop/masks were.

I also added the instructional slides back because these are really important for new presenters.

🇺🇸United States mradcliffe USA

I added a functional test to demonstrate the error. This passes with the current approach, but the current approach cannot be used because it breaks other metatag functionality.

I updated the issue summary and removed the Needs tests and Needs issue summary update tags.

🇺🇸United States mradcliffe USA

I forgot to set this to Needs review.

I think this is working now.

🇺🇸United States mradcliffe USA

I added a How-to audit section to the issue summary, but it Needs work for some of us that may not understand the audit process for documentation.

🇺🇸United States mradcliffe USA

Removed mentor ribbon that we used in Drupal Europe and were potentially going to continue using in lieu of t-shirts, but we ended up continuing to use shirts to identify mentors at all DrupalCon events.

🇺🇸United States mradcliffe USA

@xjm reminded us of mentoring resources and links from drupalmentoring.org . And I was thinking about a bibliography that I have been collecting of recent research in first time contribution.

🇺🇸United States mradcliffe USA

Adding a couple more custom named layouts would make it easier. I came up with the following and exported from Google slides (Format is pptx), and the next step is to import into the slide deck, apply a layout to a slide, consolidate the text because the existing slide decks do not use standard layout placeholders.

I had to tarball the pptx file in order to be able to upload it. So it needs a tar zxf Drupal-Mentoring.pptx.tar.gz in order to extract the Drupal-Mentoring.pptx. trying to File > Download the theme as ODP format failed for me on the slide deck.

🇺🇸United States mradcliffe USA

I think I can condense most of the Title (left-aligned) slide styles into "Title and two-columns" and "Title and body" (or "One column text") by having optional Sub-title and making the flair images consistent. That might also solve the "Picture with Caption" slides.

Then maybe we have a custom layout for "Title and three-columns".

Unused: Big number, Section header

🇺🇸United States mradcliffe USA

Some feedback on the branded slide deck that Chris is working on.

I looked at the standard layouts provided by themes in Google slides. And then went through each of the slides in the deck to document them, their use, and whether they could be mapped to a standard layout.

It seems to me there are too many variations at the moment and that's not including the random flair.

Also adding the Event logo on nearly every slide will make it harder to update for a speaker giving the session at an event.

Theme standard layouts

  • Title Slide
  • Section header
  • Title and body
  • Title and two-columns
  • Title only
  • One column text
  • Main point
  • Section title and description
  • Caption
  • Big number
  • Blank

New Branding slide styles

🇺🇸United States mradcliffe USA

An urgent opportunity came up the other day for the Drupal Contribution Day Japan, which is a precursor event for DrupalCon Nara 2025. To try to meet this deadline, Chris and I are going to collaborate on getting a new canonical slide deck started with standard slide layout names so that we can create a Mentoring theme using the Barcelona 2024 design.

🇺🇸United States mradcliffe USA

I created the follow-up documentation store issue and postponed it on this one.

🇺🇸United States mradcliffe USA

I added some manual testing scenarios for xdebug 3.3+ in develop mode.

🇺🇸United States mradcliffe USA

Current test failures are deprecations for

1) /builds/issue/drupal-3406985/core/lib/Drupal/Core/Test/HttpClientMiddleware/TestHttpClientMiddleware.php:52
Database commit by letting a Transaction object go out of scope is deprecated in drupal:11.3.0 and is removed from drupal:13.0.0. Commit explicitly via Transaction::commitOrRelease() instead. See https://www.drupal.org/node/3524461

1) /builds/issue/drupal-3406985/core/lib/Drupal/Core/Database/Transaction/TransactionManagerBase.php:364
Database commit by letting a Transaction object go out of scope is deprecated in drupal:11.3.0 and is removed from drupal:13.0.0. Commit explicitly via Transaction::commitOrRelease() instead. See https://www.drupal.org/node/3524461

Uploaded as a text file after parsing through Functional and FunctionalJavaScript test results. Summarized as

- locale
- config_translation
- AssetOptimizationUmamiTest
- help
- demo_umami
- core Installer tests

🇺🇸United States mradcliffe USA

The issue summary could also use an issue summary update with the template to improve readability of the issue.

🇺🇸United States mradcliffe USA

I resolved the coding standards issues introduced in the merge request. And then fixed the typo I made in the comment.

It seems like the merge request fails on MetatagIntegrationTest. The test goes to the login page and has the default title of "Log in | Drupal" rather than the one provided by metatag_test_integration module.

The tests did pass in 2.1.1's release so this is probably an issue with the implementation here. So the patch breaks hook_metatags_attachments_alter().

🇺🇸United States mradcliffe USA

The merge request had merge conflicts. I did a rebase locally to resolve conflicts.

🇺🇸United States mradcliffe USA

Oops, I sometimes forget I have dreditor still installed.

Is there also not a clone issue link in the sidebar? Or did dreditor also add that?

I moved the draft into the issue summary for better editing and fixed #6.

🇺🇸United States mradcliffe USA

Adding some Nara information about committee members

🇺🇸United States mradcliffe USA

Closing issue.

🇺🇸United States mradcliffe USA

I added some comments in the merge request. Mainly the last commit truncated the module file so it no longer is syntactically valid i.e. it errors out.

Edit: keeping the status at Needs work. Remember also to flip the status to Needs review if you think the merge request is ready for review again.

🇺🇸United States mradcliffe USA

I added review and manual testing instructions.

🇺🇸United States mradcliffe USA

Kuoni now maintains the DrupalCon EU mentor box along with mentoring banner.

There is also a community mentor supply box for other events.

Closing this old issue as fixed/resolved.

🇺🇸United States mradcliffe USA

We also need to add some instruction about pasting the issue link into the mentoring team channel to ask/invite people to add to the agenda including any success stories for mentors.

🇺🇸United States mradcliffe USA

We determined that we should ask Working Groups whether they want to be part of a Drupal Working Group calendar rather than the Drupal Core Calendar.

At MidCamp 2025, I asked @froboy of Event Organizers Working Group, @ultimike and @markie from Community Working Group with positive responses. I explained that the meeting events would not have any private information such as Zoom links or agenda contents. So the next step is to continue to reach out to other working groups so they bring it up for discussion at their next meeting.

Maybe the next step after that is to move this or create an issue in drupal infrastructure issue queue for calendar creation with recurring meeting times/dates for all interested working groups?

🇺🇸United States mradcliffe USA

Other than the dates, I copied the spreadsheet to plug in dates for Nara, and it worked well.

I guess the status should be Needs work.

🇺🇸United States mradcliffe USA

Adding meeting minutes from 2 weeks ago.

🇺🇸United States mradcliffe USA

Success!

I added a custom pages job to run mkdocs and generate docs based on the mkdocs.yml file. It needed to be a custom pages job so that I could copy the calendar job artifacts into place.

The trick here is that it needs to copy the files into the docs directory somewhere, which will then get published into the public directory on build.

I had to generate an initial Gitlab pages for testing, which will be wiped out on the first build / merge, but it is available here: https://project.pages.drupalcode.org/mentoring/

I added issue links to the documentation issues as we're not ready to do anything more with GitLab pages.

🇺🇸United States mradcliffe USA

I added some details about the information we collected on the spreadsheets of Awesomeness and about what we need to communicate.

🇺🇸United States mradcliffe USA

I reviewed the merge request, which has the logo. The file size looks like it is about as optimized as it can get and is not too big.

🇺🇸United States mradcliffe USA

It seems like the proposed resolution is in the steps to reproduce? Maybe providing a clearer steps to reproduce and have someone replicate this on a fresh install would help.

🇺🇸United States mradcliffe USA

From @mglaman, potential things that may need to be done as part of this:

  • Core should expose a way to do batch API over CLI. Basically what Drush has for it as a proper API
  • Extract command to a service that uses batch, command basically runs that batch
  • Allows recipe runner to use that batch for the theme generation
🇺🇸United States mradcliffe USA

I added an example of a module porting exercise using ChatGPT. The use of which is disclosed as part of the merge request (with prompts included in the merge request).

🇺🇸United States mradcliffe USA

That's disappointing. I don't think this module should be using an unsupported library, @acbramley.

🇺🇸United States mradcliffe USA

Thank you for making the changes and fixes, @brandonlira. I reviewed the merge request and confirmed the changes.

🇺🇸United States mradcliffe USA

That makes sense, @phernand42. I updated the version, and I realized I kept the strict version in the original merge request, but I think it should be relaxed to ^0.1.17 or even ^0.1.

🇺🇸United States mradcliffe USA

I think the YAML configuration would be something like this where a theme might want to make use of values provided by the InputConfigurator.

input:
  theme_name:
    data_type: string
    constraints:
      NotBlank: []
    prompt:
      method: ask
   default:
     source: value
     value: 'my_theme'

config:

theme:
  -
    name: my_theme
    #name: '${theme_name}'
    description: 'A description of your theme.'
    enable: true
    starterkit: 'starterkit_theme'
    path: 'themes/custom'

Much of theme generation is in GenerateTheme command, which may be better someplace else in core.

🇺🇸United States mradcliffe USA

For next month's agenda:

- Mentor Contribution Event Planning lead: rachel_norfolk volunteered so far
- Mentoring room lead:
- Mentor communications leads: igorgoncalves volunteered so far
- First-time contributor workshop lead:
- Mentoring booth leads:
- Community tools leads:
- Novice issue triage lead: rodrigoaguilera volunteered (if able to attend)
- Mentor Dinner Lead (ideally someone who knows the area?) - Scheduling, Guest list, Reservations

🇺🇸United States mradcliffe USA

Updated the agenda with some more items for Nara and midcamp.

🇺🇸United States mradcliffe USA

I updated the issue summary to include how to resolve and removed the tag. I left the Novice tag because I think we have some consensus on the issue.

🇺🇸United States mradcliffe USA

I don't think we need a new permission, "access site reports" permission fits because the report is already accessible by users who have access to dblog (or syslog, jsonlog) as MigrateController is a redirect.

If we added a new permission, then a non-admin user would need both that permission and "access site reports" to access a filtered list of migrate_drupal_ui.

🇺🇸United States mradcliffe USA

I came up with a rough outline for the change record after reviewing the changes.

  • Adds a new nullable argument to the base Connection __construct method that takes an IdentifierHandler.
  • Database drivers should implement IdentifierHandler (details) and pass this into Connection::parent::__construct().
    • Implement at least getMaxLength if extending IdentifierHandlerBase.
  • Method calls and properties that need to be changed:
    • getPrefix() should use identifiers->tablePrefix
    • $identifierQuotes should use identifiers->identifierQuotes
    • $prefix should use identiferies->tablePrefix
    • $escapedTables is no longer used
    • $tablePlaceholderReplacements should use ????
    • escapeDatabase() should use identifiers->database()
    • Any time need to use a table or prefix in code this should be identifiers->table
    • escapeTable() should be identifiers->table. escapeTable() is no longer needed when using connection->query()? A database drive may need to use schema()->quotedMachineName . $tableIdentifier->quotedMachineName?

It looks like this also applies to any usages of query that use escapeTable manually in addition to database driver modules.

Finally a question. If a site provided a prefix and used a non-core database driver would that site stop working because $prefix isn't set anywhere by that database driver (if it relied on the protected property)?

🇺🇸United States mradcliffe USA

Yes, but why do we even need it to have the special migrate access check?

If the point is to reduce the tests that depend on this special case, then maybe fixing migrate_drupal_ui.log route to use that permission instead would make sense because an administrative user with "access site reports" already has access to it?

🇺🇸United States mradcliffe USA

I think we should answer the question as to why this test needs super user access when the test is not asserting anything about migrations and why the reports needs the special migrate access check prior to reverting the commit.

🇺🇸United States mradcliffe USA

In my implementation, I am using status = 1, uid > 0, and access comparisons so I can get a quick query.

For activitypub module, I think that joining to the actor table by uid makes sense. I don't think it should include the non-person actors in "users".

Aside, the Drupal activitypub module listing is probably going to disappear again. aleixq's changes got removed in https://github.com/fedidb/communityDB/commit/ce23a1bd1956f0c2788d4755869...

🇺🇸United States mradcliffe USA

Thank you for running through what I had, rachel. Changing status to Needs work based on feedback.

🇺🇸United States mradcliffe USA

It seems to be working for me. I can search for you via acct:CWSmith@hybridized-concepts.com now on various fediverse applications including my own.

🇺🇸United States mradcliffe USA

Maybe try removing the location ~ /.well-known/webfinger { block entirely?

🇺🇸United States mradcliffe USA

It's what swentel mentioned. The server, nginx, is not allowing webfinger requests from .well-known/webfinger which is configured as a location served by nginx, not drupal.

🇺🇸United States mradcliffe USA

Also note that the site is detected already by FediDB, but probably not discoverable by actors without knowing the real actor id.

🇺🇸United States mradcliffe USA

There's some new phpcs issues introduced, but otherwise I think the changes make sense. I added needs tests based on #10.

🇺🇸United States mradcliffe USA

Success!

These files were created as artifacts that can be downloaded via from the GitLab pipeline artifacts download link. The latest artifacts shouldn't have an expiration as far as I know from reading the gitlab documentation, but I think the merge request ones will expire after the 1 week that I set in the job.

Production build 0.71.5 2024