mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 10:53:59 +00:00
style: format camera panel component modules
This commit is contained in:
1 parent
f45f399c31
commit
1a7e4d51d9
7 files changed
+736
-506
No files matched your search
@@ -5,24 +5,43 @@ import { CctvControls } from './cctvControls.js';
|
||||
function element() {
|
||||
const classes = new Set();
|
||||
return {
|
||||
dataset: {}, src: '',
|
||||
removeAttribute(name) { if (name === 'src') this.src = ''; },
|
||||
dataset: {},
|
||||
src: '',
|
||||
removeAttribute(name) {
|
||||
if (name === 'src') this.src = '';
|
||||
},
|
||||
classList: {
|
||||
add(...values) { values.forEach(value => classes.add(value)); },
|
||||
remove(...values) { values.forEach(value => classes.delete(value)); },
|
||||
contains(value) { return classes.has(value); },
|
||||
toggle(value, enabled) { if (enabled) classes.add(value); else classes.delete(value); },
|
||||
add(...values) {
|
||||
values.forEach((value) => classes.add(value));
|
||||
},
|
||||
remove(...values) {
|
||||
values.forEach((value) => classes.delete(value));
|
||||
},
|
||||
contains(value) {
|
||||
return classes.has(value);
|
||||
},
|
||||
toggle(value, enabled) {
|
||||
if (enabled) classes.add(value);
|
||||
else classes.delete(value);
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
function fixture(t) {
|
||||
const prior = globalThis.Image;
|
||||
const requests = [];
|
||||
globalThis.Image = class { constructor() { requests.push(this); } };
|
||||
t.after(() => { globalThis.Image = prior; });
|
||||
globalThis.Image = class {
|
||||
constructor() {
|
||||
requests.push(this);
|
||||
}
|
||||
};
|
||||
t.after(() => {
|
||||
globalThis.Image = prior;
|
||||
});
|
||||
const controls = new CctvControls({
|
||||
elements: { _cctvFrame: element(), _cctvFrameWrap: element() },
|
||||
cctv: {}, actions: { isEnabled: () => true },
|
||||
cctv: {},
|
||||
actions: { isEnabled: () => true },
|
||||
});
|
||||
t.after(() => controls.destroy());
|
||||
return { controls, requests };
|
||||
@@ -56,7 +75,9 @@ test('failed refresh preserves settled pixels, but changing cameras clears them'
|
||||
test('destroy invalidates image callbacks and releases each subscription once', (t) => {
|
||||
const { controls, requests } = fixture(t);
|
||||
let unsubscribed = 0;
|
||||
controls.cctv.subscribe = () => () => { unsubscribed++; };
|
||||
controls.cctv.subscribe = () => () => {
|
||||
unsubscribed++;
|
||||
};
|
||||
controls.connect();
|
||||
controls.connect();
|
||||
assert.equal(unsubscribed, 1);
|
||||
@@ -78,27 +99,46 @@ function calibrationFixture(t) {
|
||||
const { controls } = fixture(t);
|
||||
const prior = globalThis.document;
|
||||
const inputs = [];
|
||||
globalThis.document = { createElement() {
|
||||
const input = new EventTarget();
|
||||
Object.assign(input, { focus() {}, select() {}, remove() { this.parent.input = null; } });
|
||||
inputs.push(input);
|
||||
return input;
|
||||
} };
|
||||
t.after(() => { globalThis.document = prior; });
|
||||
globalThis.document = {
|
||||
createElement() {
|
||||
const input = new EventTarget();
|
||||
Object.assign(input, {
|
||||
focus() {},
|
||||
select() {},
|
||||
remove() {
|
||||
this.parent.input = null;
|
||||
},
|
||||
});
|
||||
inputs.push(input);
|
||||
return input;
|
||||
},
|
||||
};
|
||||
t.after(() => {
|
||||
globalThis.document = prior;
|
||||
});
|
||||
const chip = {
|
||||
dataset: { calField: 'heading' }, textContent: '', input: null,
|
||||
appendChild(input) { this.input = input; input.parent = this; },
|
||||
querySelector() { return this.input; },
|
||||
dataset: { calField: 'heading' },
|
||||
textContent: '',
|
||||
input: null,
|
||||
appendChild(input) {
|
||||
this.input = input;
|
||||
input.parent = this;
|
||||
},
|
||||
querySelector() {
|
||||
return this.input;
|
||||
},
|
||||
};
|
||||
const patches = [];
|
||||
controls.actions.setParams = (params) => patches.push(params);
|
||||
controls.actions.setPanelCollapsed = () => {};
|
||||
controls._cctvCalReadout = { querySelectorAll: () => [chip] };
|
||||
controls._cctvState = {
|
||||
enabled: true, activeCameraId: 'a',
|
||||
enabled: true,
|
||||
activeCameraId: 'a',
|
||||
activeCamera: { id: 'a', headingDeg: 30, basePose: { headingDeg: 20 } },
|
||||
};
|
||||
const key = (name) => Object.assign(new Event('keydown', { cancelable: true }), { key: name });
|
||||
const key = (name) =>
|
||||
Object.assign(new Event('keydown', { cancelable: true }), { key: name });
|
||||
return { controls, chip, inputs, patches, key };
|
||||
}
|
||||
|
||||
@@ -109,7 +149,12 @@ test('calibration commits against the captured camera base and releases its edit
|
||||
controls._cctvState.activeCamera.basePose.headingDeg = 60;
|
||||
inputs[0].dispatchEvent(key('Enter'));
|
||||
inputs[0].dispatchEvent(new Event('blur'));
|
||||
assert.deepEqual(patches, [{ selectedCameraId: 'a', calibration: { cameraId: 'a', patch: { headingDeg: 80 } } }]);
|
||||
assert.deepEqual(patches, [
|
||||
{
|
||||
selectedCameraId: 'a',
|
||||
calibration: { cameraId: 'a', patch: { headingDeg: 80 } },
|
||||
},
|
||||
]);
|
||||
assert.equal(controls._calibrationEdit, null);
|
||||
});
|
||||
|
||||
@@ -117,7 +162,11 @@ test('a camera switch cancels calibration before old blur can change the new cam
|
||||
const { controls, chip, inputs, patches } = calibrationFixture(t);
|
||||
controls._beginCctvCalValueEdit(chip);
|
||||
inputs[0].value = '100';
|
||||
controls._renderCctvState({ enabled: true, activeCameraId: 'b', activeCamera: { id: 'b', headingDeg: 200, basePose: { headingDeg: 190 } } });
|
||||
controls._renderCctvState({
|
||||
enabled: true,
|
||||
activeCameraId: 'b',
|
||||
activeCamera: { id: 'b', headingDeg: 200, basePose: { headingDeg: 190 } },
|
||||
});
|
||||
inputs[0].dispatchEvent(new Event('blur'));
|
||||
assert.deepEqual(patches, []);
|
||||
assert.equal(chip.input, null);
|
||||
@@ -145,17 +194,26 @@ test('disposing during camera enable prevents the delayed focus and future click
|
||||
let enables = 0;
|
||||
let focuses = 0;
|
||||
const controls = new CctvControls({
|
||||
elements: { _cctvPanel: {}, _cctvNextBtn: button }, cctv: {},
|
||||
elements: { _cctvPanel: {}, _cctvNextBtn: button },
|
||||
cctv: {},
|
||||
actions: {
|
||||
isEnabled: () => true, syncViewport() {},
|
||||
toggleEnabled() { enables++; return new Promise(resolve => { resolveEnable = resolve; }); },
|
||||
runExplicitFocus() { focuses++; },
|
||||
isEnabled: () => true,
|
||||
syncViewport() {},
|
||||
toggleEnabled() {
|
||||
enables++;
|
||||
return new Promise((resolve) => {
|
||||
resolveEnable = resolve;
|
||||
});
|
||||
},
|
||||
runExplicitFocus() {
|
||||
focuses++;
|
||||
},
|
||||
},
|
||||
});
|
||||
button.dispatchEvent(new Event('click'));
|
||||
controls.destroy();
|
||||
resolveEnable(true);
|
||||
await new Promise(resolve => setImmediate(resolve));
|
||||
await new Promise((resolve) => setImmediate(resolve));
|
||||
button.dispatchEvent(new Event('click'));
|
||||
assert.equal(enables, 1);
|
||||
assert.equal(focuses, 0);
|
||||
|
||||
Reference in new issue
Block a user