keeweb/app/scripts/views/menu/menu-section-view.js

88 lines
2.5 KiB
JavaScript

import { View } from 'framework/views/view';
import { AppSettingsModel } from 'models/app-settings-model';
import { Resizable } from 'framework/views/resizable';
import { Scrollable } from 'framework/views/scrollable';
import { MenuItemView } from 'views/menu/menu-item-view';
import throttle from 'lodash/throttle';
import template from 'templates/menu/menu-section.hbs';
class MenuSectionView extends View {
template = template;
events = {};
itemViews = [];
minHeight = 55;
autoHeight = 'auto';
constructor(model, options) {
super(model, options);
this.listenTo(this.model, 'change-items', this.itemsChanged);
this.listenTo(this, 'view-resize', this.viewResized);
this.once('remove', () => {
if (this.scroll) {
this.scroll.dispose();
}
this.removeInnerViews();
});
}
render() {
if (!this.itemsEl) {
super.render(this.model);
this.itemsEl = this.model.scrollable ? this.$el.find('.scroller') : this.$el;
if (this.model.scrollable) {
this.initScroll();
this.createScroll({
root: this.$el[0],
scroller: this.$el.find('.scroller')[0],
bar: this.$el.find('.scroller__bar')[0]
});
}
} else {
this.removeInnerViews();
}
this.model.items.forEach(item => {
const itemView = new MenuItemView(item, { parent: this.itemsEl[0] });
itemView.render();
this.itemViews.push(itemView);
});
if (this.model.drag) {
const height = AppSettingsModel.tagsViewHeight;
if (typeof height === 'number') {
this.$el.height();
this.$el.css('flex', '0 0 ' + height + 'px');
}
}
this.pageResized();
}
maxHeight() {
return this.$el.parent().height() - 116;
}
removeInnerViews() {
this.itemViews.forEach(itemView => itemView.remove());
this.itemViews = [];
}
itemsChanged() {
this.render();
}
viewResized(size) {
this.$el.css('flex', '0 0 ' + (size ? size + 'px' : 'auto'));
this.saveViewHeight(size);
}
saveViewHeight = throttle(size => {
AppSettingsModel.tagsViewHeight = size;
}, 1000);
}
Object.assign(MenuSectionView.prototype, Resizable);
Object.assign(MenuSectionView.prototype, Scrollable);
export { MenuSectionView };