Files
nebula.js/test/rendering/listbox/listbox.js
2025-04-01 09:32:36 +02:00

108 lines
3.0 KiB
JavaScript

(async () => {
function getMocks(options) {
const { getMockData, getListboxLayout } = window.getFuncs();
const fixture = options?.fixtureFile;
const obj = {
id: `listbox-${+new Date()}`,
getListObjectData: async () => (fixture ? fixture.getListObjectData() : getMockData()),
getLayout: async () => (fixture ? fixture.getLayout() : getListboxLayout(options)),
beginSelections: async () => {},
selectListObjectValues: async () => true,
searchListObjectFor: () => {},
on() {},
once() {},
};
const app = {
id: `${+new Date()}`,
session: {},
evaluateEx: async () => (fixture ? fixture.evaluateEx() : null),
createSessionObject: async () => obj,
getObject: async () => obj,
getAppLayout: async () => ({ qTitle: '', qLocaleInfo: {} }),
};
return {
app,
};
}
const init = async (options = {}, theme = 'light') => {
const element = window.document.querySelector('#object');
if (options?.fixtureFile?.customRenderTestElementSize) {
element.style.width = options.fixtureFile.customRenderTestElementSize.width;
element.style.height = options.fixtureFile.customRenderTestElementSize.height;
}
const { app } = getMocks(options);
const { keyboardNavigation } = options;
const nebbie = window.stardust.embed(app, {
context: {
theme,
...(keyboardNavigation && { keyboardNavigation }),
},
});
const listboxOptions = {
...options,
};
const inst = await nebbie.field('Alpha');
inst.mount(element, listboxOptions);
return () => {
inst?.unmount(element);
};
};
const getOptions = () => {
const paramStrings = document.location.search.split('?').pop().split('&');
const paramsArr = paramStrings.map((stringPair) => {
const [key, val] = stringPair.split('=');
return [key, ['true', 'false'].includes(val) ? JSON.parse(val) : val];
});
const params = Object.fromEntries(paramsArr);
return params;
};
const getScenarioOptions = (s) => {
let sc = {};
switch (s) {
case 'standard':
sc = {};
break;
case 'dense':
sc = { dense: true };
break;
case 'autoConfirm':
sc = { autoConfirm: true };
break;
case 'checkboxes':
sc = { checkboxes: true };
break;
case 'noToolbar':
sc = { toolbar: false };
break;
case 'longTitle':
sc = { title: 'Alpha long title that needs more words' };
break;
default:
throw new Error('Invalid test scenario', s);
}
return sc;
};
const { scenario, fixture, theme, ...options } = getOptions() || {};
let fixtureFile;
if (fixture) {
fixtureFile = (await import(fixture)).default;
}
const scenarioOptions = fixtureFile ? fixtureFile.options || {} : getScenarioOptions(scenario);
return init(
{
fixtureFile,
...scenarioOptions,
...options,
},
theme
);
})();