Skip to content

Commit 2f44677

Browse files
authored
Merge pull request #70 from AegisJSProject/feature/command-invokers
Add fullscreen, details, and command event support
2 parents c7512e1 + 76b2f94 commit 2f44677

7 files changed

Lines changed: 152 additions & 12 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [v1.0.3] - 2025-09-29
11+
12+
### Added
13+
- Add `onCommand` to handle `CommandEvent`s
14+
- Add `FUNCS.ui.open` and `FUNCS.ui.close` for `<details>` elements
15+
- Add `FUNCS.ui.reques*tFullscreen` for requesting, exiting, and toggling fullscreen
16+
1017
## [v1.0.2] - 2024-11-22
1118

1219
### Added

callbackRegistry.test.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import '@shgysk8zer0/polyfills';
12
import './shims.js';
23
import { createCallback, unregisterCallback, hasCallback, callCallback, closeRegistration } from '@aegisjsproject/callback-registry/callbacks.js';
34
import { describe, test } from 'node:test';
45
import assert from 'node:assert';
56

6-
const signal = AbortSignal.timeout(500);
7+
const signal = AbortSignal.timeout(1000);
78
const sum = createCallback((...nums) => nums.reduce((sum, num) => sum + num));
89

910
describe('Test callback registry', () => {
@@ -16,16 +17,16 @@ describe('Test callback registry', () => {
1617
});
1718

1819
test('Callback can be called correctly.', { signal }, () => {
19-
assert.equal(callCallback(sum, 1, 2 ,3), 6, 'Sum should be 6 when called with `1, 2, 3`.');
20+
assert.strictEqual(callCallback(sum, 1, 2 ,3), 6, 'Sum should be 6 when called with `1, 2, 3`.');
2021
});
2122

2223
test('Callbacks unregister', { signal }, () => {
2324
unregisterCallback(sum);
24-
assert.notEqual(hasCallback(sum), 'Callbacks should be removed from registry.');
25+
assert.strictEqual(hasCallback(sum), false, 'Callbacks should be removed from registry.');
2526
});
2627

27-
test('Cannot register new callbacks after closing registry', ({ signal }, () => {
28+
test('Cannot register new callbacks after closing registry', { signal }, () => {
2829
closeRegistration();
2930
assert.throws(() => createCallback(() => 'test'), 'Creating callbacks should throw if registry is closed.');
30-
}));
31+
});
3132
});

callbacks.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ const $$ = (selector, base = document) => base.querySelectorAll(selector);
99

1010
const $ = (selector, base = document) => base.querySelector(selector);
1111

12+
export const requestFullscreen = { attr: 'data-request-fullscreen-selector', data: 'requestFullscreenSelector' };
13+
export const toggleFullsceen = { attr: 'data-toggle-fullscreen-selector', data: 'toggleFullscreenSelector' };
14+
1215
export const FUNCS = {
1316
debug: {
1417
log: 'aegis:debug:log',
@@ -25,6 +28,7 @@ export const FUNCS = {
2528
popup: 'aegis:navigate:popup',
2629
},
2730
ui: {
31+
command: 'aegis:ui:command',
2832
print: 'aegis:ui:print',
2933
remove: 'aegis:ui:remove',
3034
hide: 'aegis:ui:hide',
@@ -40,6 +44,11 @@ export const FUNCS = {
4044
prevent: 'aegis:ui:prevent',
4145
revokeObjectURL: 'aegis:ui:revokeObjectURL',
4246
cancelAnimationFrame: 'aegis:ui:cancelAnimationFrame',
47+
requestFullscreen: 'aegis:ui:requestFullscreen',
48+
toggleFullscreen: 'aegis:ui:toggleFullsceen',
49+
exitFullsceen: 'aegis:ui:exitFullscreen',
50+
open: 'aegis:ui:open',
51+
close: 'aegis:ui:close',
4352
abortController: 'aegis:ui:controller:abort',
4453
},
4554
};
@@ -96,6 +105,8 @@ const registry = new Map([
96105
[FUNCS.ui.clearInterval, ({ currentTarget }) => clearInterval(parseInt(currentTarget.dataset.clearInterval))],
97106
[FUNCS.ui.clearTimeout, ({ currentTarget }) => clearTimeout(parseInt(currentTarget.dataset.timeout))],
98107
[FUNCS.ui.abortController, ({ currentTarget }) => abortController(currentTarget.dataset.aegisEventController, currentTarget.dataset.aegisControllerReason)],
108+
[FUNCS.ui.open, ({ currentTarget }) => document.querySelector(currentTarget.dataset.openSelector).open = true],
109+
[FUNCS.ui.close, ({ currentTarget }) => document.querySelector(currentTarget.dataset.closeSelector).open = false],
99110
[FUNCS.ui.showModal, ({ currentTarget }) => {
100111
const target = $(currentTarget.dataset.showModalSelector);
101112

@@ -133,6 +144,25 @@ const registry = new Map([
133144
}],
134145
[FUNCS.ui.print, () => globalThis.print()],
135146
[FUNCS.ui.prevent, event => event.preventDefault()],
147+
[FUNCS.ui.requestFullscreen, ({ currentTarget}) => {
148+
if (currentTarget.dataset.hasOwnProperty(requestFullscreen.data)) {
149+
document.getElementById(currentTarget.dataset[requestFullscreen.data]).requestFullscreen();
150+
} else {
151+
currentTarget.requestFullscreen();
152+
}
153+
}],
154+
[FUNCS.ui.toggleFullscreen, ({ currentTarget }) => {
155+
const target = currentTarget.dataset.hasOwnProperty(toggleFullsceen.data)
156+
? document.getElementById(currentTarget.dataset[toggleFullsceen.data])
157+
: currentTarget;
158+
159+
if (target.isSameNode(document.fullscreenElement)) {
160+
document.exitFullscreen();
161+
} else {
162+
target.requestFullscreen();
163+
}
164+
}],
165+
[FUNCS.ui.exitFullsceen, () => document.exitFullscreen()],
136166
]);
137167

138168
/**

events.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const onCanplaythrough = EVENT_PREFIX + 'canplaythrough';
2727
export const onChange = EVENT_PREFIX + 'change';
2828
export const onClick = EVENT_PREFIX + 'click';
2929
export const onClose = EVENT_PREFIX + 'close';
30+
export const onCommand = EVENT_PREFIX + 'command';
3031
export const onContextmenu = EVENT_PREFIX + 'contextmenu';
3132
export const onCopy = EVENT_PREFIX + 'copy';
3233
export const onCuechange = EVENT_PREFIX + 'cuechange';
@@ -124,6 +125,7 @@ export const eventAttrs = [
124125
onChange,
125126
onClick,
126127
onClose,
128+
onCommand,
127129
onContextmenu,
128130
onCopy,
129131
onCuechange,
@@ -293,6 +295,7 @@ export const EVENTS = {
293295
onChange,
294296
onClick,
295297
onClose,
298+
onCommand,
296299
onContextmenu,
297300
onCopy,
298301
onCuechange,

package-lock.json

Lines changed: 84 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@aegisjsproject/callback-registry",
3-
"version": "1.0.2",
3+
"version": "1.0.3",
44
"description": " A callback registry for AegisJSProject",
55
"keywords": [
66
"aegis",
@@ -78,6 +78,7 @@
7878
"devDependencies": {
7979
"@rollup/plugin-terser": "^0.4.4",
8080
"@shgysk8zer0/eslint-config": "^1.0.1",
81+
"@shgysk8zer0/polyfills": "^0.4.13",
8182
"eslint": "^9.15.0",
8283
"http-server": "^14.1.1",
8384
"rollup": "^4.27.2"

test/index.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { onClick, onClose, observeEvents, onLoad, onError, registerSignal, signal as signalAttr, controller as controllerAttr, registerController } from '@aegisjsproject/callback-registry/events.js';
2-
import { createCallback, FUNCS, on } from '@aegisjsproject/callback-registry/callbacks.js';
1+
import { onClick, onClose, onCommand, observeEvents, onLoad, onError, registerSignal, signal as signalAttr, controller as controllerAttr, registerController, onDblclick } from '@aegisjsproject/callback-registry/events.js';
2+
import { createCallback, FUNCS, on, toggleFullsceen, requestFullscreen } from '@aegisjsproject/callback-registry/callbacks.js';
33

44
const controller = new AbortController();
55
const signal = registerSignal(controller.signal);
@@ -58,9 +58,15 @@ document.body.append(html`
5858
<button type="button" ${onClick}="${FUNCS.navigate.reload}" ${signalAttr}="${signal}">Reload</button>
5959
<button type="button" ${onClick}="${FUNCS.navigate.close}" ${signalAttr}="${signal}">Close</button>
6060
<button type="button" ${onClick}="${FUNCS.ui.print}" ${signalAttr}="${signal}">Print</button>
61+
<button type="button" ${onClick}="${FUNCS.ui.requestFullscreen}" ${signalAttr}="${signal}" ${requestFullscreen.attr}="container">Fullscreen</button>
62+
<button type="button" ${onClick}="${FUNCS.ui.open}" ${signalAttr}="${signal}" data-open-selector="details">Open Details</button>
63+
<button type="button" ${onClick}="${FUNCS.ui.close}" ${signalAttr}="${signal}" data-close-selector="details">Close Details</button>
6164
<button type="button" ${onClick}="${FUNCS.ui.showModal}" data-show-modal-selector="#dialog" ${signalAttr}="${signal}">Show Dialog</button>
6265
<button type="button" id="caf" ${onClick}="${FUNCS.ui.abortController}" ${controllerAttr}="${animController}" ${signalAttr}="${animSignal}">Cancel Animation</button>
6366
<button type="button" ${onClick}="${() => alert('Hello, World!')}">Alert</button>
67+
<button type="button" command="show-modal" commandfor="dialog">Show Dialog (command)</button>
68+
<button type="button" command="show-popover" commandfor="popover">Show Popover</button>
69+
<button type="button" command="--foo" commandfor="main">Dispatch <code>--foo</code></button>
6470
<button type="button" ${on('click', event => {
6571
const li = document.createElement('li');
6672
li.textContent = `${event.type} @ ${event.timeStamp}`;
@@ -69,10 +75,12 @@ document.body.append(html`
6975
<button type="button" ${on('click', () => controller.abort(), { signal })}>Abort</button>
7076
<button type="button" ${on('click', event => event.target.parentElement.dispatchEvent(new CustomEvent('my:foo', { detail: event })), { signal })}>Foo</button>
7177
</nav>
72-
<main>
73-
<div id="container">
78+
<main id="main" ${onCommand}="${FUNCS.debug.log}">
79+
<div id="container" ${onDblclick}="${FUNCS.ui.requestFullscreen}">
7480
<template shadowrootmode="open">
7581
<div part="container">
82+
<button type="button" ${onClick}="${FUNCS.ui.toggleFullscreen}" ${toggleFullsceen.attr}="container">Toggle Fullscreen</button>
83+
<br />
7684
<slot name="list"></slot>
7785
<pre part="events">[<slot name="events">No Events</slot>]</pre>
7886
<img src="${URL.createObjectURL(getSvg())}"
@@ -85,11 +93,19 @@ document.body.append(html`
8593
</template>
8694
<ul id="list" slot="list"></ul>
8795
</div>
96+
<details id="details">
97+
<summary>A &lt;details&gt;</summary>
98+
<p> And here is the content.</p>
99+
</details>
88100
</main>
89101
<footer></footer>
90102
<dialog id="dialog" ${onClose}="${FUNCS.debug.log}" ${signalAttr}="${signal}">
91103
<button type="button" ${onClick}="${FUNCS.ui.closeModal}" data-close-modal-selector="#dialog">Close</button>
104+
<button type="button" command="request-close" commandfor="dialog">Close (command)</button>
92105
</dialog>
106+
<div popover="maual" id="popover">
107+
<button type="button" command="hide-popover" commandfor="popover">Hide Popover</button>
108+
</div>
93109
`);
94110

95111
observeEvents(document.body);

0 commit comments

Comments
 (0)