@paperbits/core
Version:
Paperbits core components.
52 lines (42 loc) • 1.93 kB
text/typescript
import { ViewModelBinder } from "@paperbits/common/widgets";
import { NavigationItemModel } from "@paperbits/common/navigation";
import { NavigationItemViewModel } from ".";
export class NavigationViewModelBinder implements ViewModelBinder<NavigationItemModel, NavigationItemViewModel> {
public async modelToViewModel(model: NavigationItemModel): Promise<NavigationItemViewModel> {
if (!model) {
throw new Error(`Parameter "model" not specified.`);
}
const viewModel = new NavigationItemViewModel(model);
viewModel.key = model.key;
viewModel.label(model.label);
viewModel.targetKey(model.targetKey);
viewModel.targetUrl(model.targetUrl);
viewModel.anchor(model.anchor);
if (model.nodes) {
const tasks = [];
model.nodes.forEach(child => tasks.push(this.modelToViewModel(child)));
const childViewModels = await Promise.all<NavigationItemViewModel>(tasks);
childViewModels.forEach(childViewModel => {
viewModel.nodes.push(childViewModel);
childViewModel.parent = viewModel;
});
}
return viewModel;
}
public viewModelToModel(viewModel: NavigationItemViewModel): NavigationItemModel {
const model: NavigationItemModel = {
key: viewModel.key,
label: viewModel.label(),
targetKey: viewModel.targetKey(),
targetUrl: viewModel.targetUrl(),
targetWindow: viewModel.targetWindow(),
triggerEvent: viewModel.triggerEvent(),
anchor: viewModel.anchor(),
nodes: viewModel.nodes().map(x => this.viewModelToModel(x))
};
return model;
}
public canHandleModel(model: NavigationItemModel): boolean {
return model instanceof NavigationItemModel;
}
}