From 8d23c2f576620eaa83b638a2cfe303b2a7414e3d Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Tue, 29 Sep 2026 23:47:56 +0100 Subject: [PATCH 1/2] fix(acl): drag Everyone from the sharing chooser as an agent class --- src/acl/add-agent-buttons.ts | 6 ++- test/unit/acl/add-agent-buttons.test.ts | 61 ++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/acl/add-agent-buttons.ts b/src/acl/add-agent-buttons.ts index e31cb85ab..93e147cb5 100644 --- a/src/acl/add-agent-buttons.ts +++ b/src/acl/add-agent-buttons.ts @@ -108,13 +108,17 @@ export class AddAgentButtons { } private renderPublicButton (): HTMLElement { - return widgets.button( + const button = widgets.button( this.groupList.controller.dom, icons.iconBase + widgets.iconForClass['foaf:Agent'], 'Add Everyone', () => this.addAgent(ns.foaf('Agent').uri) .then(() => this.groupList.controller.renderTemporaryStatus('Adding the general public to those who can read. Drag the globe to a different level to give them more access.')) .then(() => this.renderCleanup())) + // Drag the ACL agent class, not the globe image's URL. + button.querySelector('img')?.setAttribute('draggable', 'false') + widgets.makeDraggable(button, ns.foaf('Agent')) + return button } private renderAuthenticatedAgentButton (): HTMLElement { diff --git a/test/unit/acl/add-agent-buttons.test.ts b/test/unit/acl/add-agent-buttons.test.ts index 712998e14..086f88869 100644 --- a/test/unit/acl/add-agent-buttons.test.ts +++ b/test/unit/acl/add-agent-buttons.test.ts @@ -1,9 +1,10 @@ -import { beforeEach, describe, expect, it } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { silenceDebugMessages } from '../helpers/debugger' import { AddAgentButtons } from '../../../src/acl/add-agent-buttons' import { instantiateAccessGroups } from '../helpers/instantiateAccessGroups' import { JSDOM } from 'jsdom' import { solidLogicSingleton } from 'solid-logic' +import ns from '../../../src/lib/ns' const store = solidLogicSingleton.store @@ -129,6 +130,64 @@ describe('When "Add Group" button is clicked', () => { }) }) +describe('Adding Everyone', () => { + let groupList: ReturnType + let groups: HTMLElement + let button: HTMLButtonElement + let image: HTMLImageElement + + beforeEach(() => { + groupList = instantiateAccessGroups(dom, store) + vi.spyOn(groupList.controller, 'isEditable', 'get').mockReturnValue(true) + vi.spyOn(groupList.controller, 'save').mockResolvedValue(undefined) + vi.spyOn(groupList.controller, 'render').mockReturnValue(dom.createElement('div')) + vi.spyOn(store.fetcher, 'load').mockRejectedValue(new Error('Unexpected RDF lookup')) + groups = groupList.render() + groups.querySelector('img[title="Add ..."]')!.click() + image = groups.querySelector('img[title="Add Everyone"]')! + button = image.parentElement as HTMLButtonElement + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + it.each(['text/uri-list', 'text/plain'])('drags Everyone directly to Editors using %s without fetching the icon', async format => { + const payload = new Map([[format, image.src]]) + const dataTransfer = { + types: [format], + setData: (type: string, value: string) => payload.set(type, value), + getData: (type: string) => payload.get(type) || '' + } + const dragStart = new dom.defaultView!.Event('dragstart', { bubbles: true }) + Object.defineProperty(dragStart, 'dataTransfer', { value: dataTransfer }) + button.dispatchEvent(dragStart) + + expect(dataTransfer.getData(format)).toBe(ns.foaf('Agent').uri) + expect(button.draggable).toBe(true) + expect(image.draggable).toBe(false) + + const editors = Array.from(groups.children).find(group => + (group.firstElementChild as HTMLElement)?.innerText === 'Editors')! + const drop = new dom.defaultView!.Event('drop', { bubbles: true, cancelable: true }) + Object.defineProperty(drop, 'dataTransfer', { value: dataTransfer }) + editors.dispatchEvent(drop) + + await vi.waitFor(() => expect(groupList.controller.save).toHaveBeenCalledOnce()) + const editorModes = [ns.acl('Read').uri, ns.acl('Write').uri].join('\n') + expect(groupList.byCombo[editorModes]).toEqual([['agentClass', ns.foaf('Agent').uri]]) + expect(store.fetcher.load).not.toHaveBeenCalled() + }) + + it('still adds Everyone as a Viewer when clicked', async () => { + button.click() + + await vi.waitFor(() => expect(groupList.controller.save).toHaveBeenCalledOnce()) + expect(groupList.byCombo[ns.acl('Read').uri]).toEqual([['agentClass', ns.foaf('Agent').uri]]) + expect(store.fetcher.load).not.toHaveBeenCalled() + }) +}) + describe('When "Add Bot" button is clicked', () => { let bar const buttonIndex = 4 From 8e5758a91b7f90f471fe4df3731a0e9a5d7be158 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 29 Sep 2026 22:50:24 +0000 Subject: [PATCH 2/2] chore: update solidos dependencies (latest: rdflib@2.4.1 solid-logic@6.0.0 pane-registry@5.0.1) --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0aa41dca0..80d12d307 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7513,9 +7513,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.440", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.440.tgz", - "integrity": "sha512-SghDzqdJokdz8zP8YNlvS74+CwLRoUPDGvP/gFA+HrKVw+pOshUAgx8pXR37xl/u16zGae746rFNWvZ/22kU2Q==", + "version": "1.5.441", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.441.tgz", + "integrity": "sha512-b84H5dyxtHtXYbJRJPLvbS+iud4ys2GVZ61BH7/9lJrfCcIL+Sk+Vh2AW6beaErTdstvjZLgEwkE2j0fZlmwRA==", "dev": true, "license": "ISC" },