blob: aa587035e64685d95292aae747338efc7ff0e8fb [file] [log] [blame]
class RepetitionTypeSelection extends ComponentBase {
#triggerableConfiguration;
#selectedRepetitionType;
#renderRepetitionTypeListLazily;
#disabled;
constructor()
{
super('repetition-type-selection');
this.#selectedRepetitionType = null;
this.#triggerableConfiguration = null;
this.#disabled = false;
this.#renderRepetitionTypeListLazily = new LazilyEvaluatedFunction(this._renderRepetitionTypeList.bind(this));
}
didConstructShadowTree()
{
const repetitionType = this.content('repetition-type');
repetitionType.onchange = () => this.#selectedRepetitionType = repetitionType.value;
}
get selectedRepetitionType() { return this.#selectedRepetitionType; }
set selectedRepetitionType(repetitionType)
{
console.assert(!this.#triggerableConfiguration || this.#triggerableConfiguration.isSupportedRepetitionType(repetitionType));
this.#selectedRepetitionType = repetitionType;
this.enqueueToRender();
}
set disabled(value)
{
console.assert(typeof value == 'boolean');
this.#disabled = value;
this.enqueueToRender();
}
setTestAndPlatform(test, platform)
{
this.#triggerableConfiguration = TriggerableConfiguration.findByTestAndPlatform(test, platform);
if (!this.#triggerableConfiguration)
this.#selectedRepetitionType = null;
else if (!this.#triggerableConfiguration.isSupportedRepetitionType(this.#selectedRepetitionType))
this.#selectedRepetitionType = this.#triggerableConfiguration.supportedRepetitionTypes[0];
this.enqueueToRender();
}
labelForRepetitionType(repetitionType)
{
return {
'alternating': 'alternating (ABAB)',
'sequential': 'sequential (AABB)',
'paired-parallel': 'parallel (paired A&B)',
}[repetitionType];
}
render()
{
super.render();
this.#renderRepetitionTypeListLazily.evaluate(this.#disabled, this.#selectedRepetitionType, ...(this.#triggerableConfiguration?.supportedRepetitionTypes || []));
}
_renderRepetitionTypeList(disabled, selectedRepetitionType, ...supportedRepetitionTypes)
{
this.renderReplace(this.content('repetition-type'), supportedRepetitionTypes.map((repetitionType) =>
this.createElement('option', {selected: repetitionType == selectedRepetitionType, value: repetitionType},
this.labelForRepetitionType(repetitionType))
));
this.content('repetition-type').disabled = disabled;
}
static htmlTemplate()
{
return `<select id="repetition-type"></select>`;
}
}
ComponentBase.defineElement('repetition-type-selection', RepetitionTypeSelection);