export const renderTabPanel = <I>(spec: TabPanelFoo<I>, backstage: UiFactoryBackstage): SketchSpec => {
const storedValue = Cell<TabData>({ });
const updateDataWithForm = (form: AlloyComponent): void => {
const formData = Representing.getValue(form);
const validData = toValidValues(formData).getOr({ });
const currentData = storedValue.get();
const newData = Merger.deepMerge(currentData, validData);
storedValue.set(newData);
};
const setDataOnForm = (form: AlloyComponent) => {
const tabData = storedValue.get();
Representing.setValue(form, tabData);
};
const oldTab = Cell(null);
const allTabs = Arr.map(spec.tabs, function (tab) {
return {
value: tab.title,
dom: {
tag: 'div',
classes: [ 'tox-dialog__body-nav-item' ],
innerHtml: backstage.shared.providers.translate(tab.title)
},
view () {
return [
// Dupe with SilverDialog
AlloyForm.sketch((parts) => {
return {
dom: {
tag: 'div',
classes: [ 'tox-form' ]
},
components: Arr.map(tab.items, (item) => interpretInForm(parts, item, backstage)),
formBehaviours: Behaviour.derive([
Keying.config({
mode: 'acyclic',
useTabstopAt: Fun.not(NavigableObject.isPseudoStop)
}),
AddEventsBehaviour.config('TabView.form.events', [
AlloyEvents.runOnAttached(setDataOnForm),
AlloyEvents.runOnDetached(updateDataWithForm)
]),
Receiving.config({
channels: Objects.wrapAll([
{
key: SendDataToSectionChannel,
value: {
onReceive: updateDataWithForm
}
},
{
key: SendDataToViewChannel,
value: {
onReceive: setDataOnForm
}
}
])
})
])
};
})
];
}
};
});
// Assign fixed height or variable height to the tabs
const tabMode = setMode(allTabs).smartTabHeight;
return AlloyTabSection.sketch({
dom: {
tag: 'div',
classes: [ 'tox-dialog__body' ]
},
onChangeTab: (section, button, _viewItems) => {
const title = Representing.getValue(button);
AlloyTriggers.emitWith(section, formTabChangeEvent, {
title,
oldTitle: oldTab.get()
});
oldTab.set(title);
},
tabs: allTabs,
components: [
AlloyTabSection.parts().tabbar({
dom: {
tag: 'div',
classes: [ 'tox-dialog__body-nav' ]
},
components: [
AlloyTabbar.parts().tabs({ })
],
markers: {
//.........这里部分代码省略.........
请发表评论