keeweb/app/scripts/views/grp-view.js

153 lines
4.6 KiB
JavaScript

const Backbone = require('backbone');
const Scrollable = require('../mixins/scrollable');
const IconSelectView = require('./icon-select-view');
const AutoTypeHintView = require('./auto-type-hint-view');
const AutoType = require('../auto-type');
const GrpView = Backbone.View.extend({
template: require('templates/grp.hbs'),
events: {
'click .grp__icon': 'showIconsSelect',
'click .grp__buttons-trash': 'moveToTrash',
'click .back-button': 'returnToApp',
'input #grp__field-title': 'changeTitle',
'focus #grp__field-auto-type-seq': 'focusAutoTypeSeq',
'input #grp__field-auto-type-seq': 'changeAutoTypeSeq',
'change #grp__check-search': 'setEnableSearching',
'change #grp__check-auto-type': 'setEnableAutoType'
},
initialize: function() {
this.views = {};
},
render: function() {
this.removeSubView();
if (this.model) {
this.renderTemplate(
{
title: this.model.get('title'),
icon: this.model.get('icon') || 'folder',
customIcon: this.model.get('customIcon'),
enableSearching: this.model.getEffectiveEnableSearching(),
readonly: this.model.get('top'),
canAutoType: AutoType.enabled,
autoTypeSeq: this.model.get('autoTypeSeq'),
autoTypeEnabled: this.model.getEffectiveEnableAutoType(),
defaultAutoTypeSeq: this.model.getParentEffectiveAutoTypeSeq()
},
true
);
if (!this.model.get('title')) {
this.$el.find('#grp__field-title').focus();
}
}
this.createScroll({
root: this.$el.find('.grp')[0],
scroller: this.$el.find('.scroller')[0],
bar: this.$el.find('.scroller__bar')[0]
});
this.pageResized();
return this;
},
removeSubView: function() {
if (this.views.sub) {
this.views.sub.remove();
delete this.views.sub;
}
},
showGroup: function(group) {
this.model = group;
this.render();
},
changeTitle: function(e) {
const title = $.trim(e.target.value);
if (title) {
if (!this.model.get('top') && title !== this.model.get('title')) {
this.model.setName(title);
}
} else {
if (this.model.isJustCreated) {
this.model.removeWithoutHistory();
Backbone.trigger('edit-group');
}
}
},
changeAutoTypeSeq: function(e) {
const el = e.target;
const seq = $.trim(el.value);
AutoType.validate(null, seq, err => {
$(e.target).toggleClass('input--error', !!err);
if (!err) {
this.model.setAutoTypeSeq(seq);
}
});
},
focusAutoTypeSeq: function(e) {
if (!this.views.hint) {
this.views.hint = new AutoTypeHintView({ input: e.target }).render();
this.views.hint.on('remove', () => {
delete this.views.hint;
});
}
},
showIconsSelect: function() {
if (this.views.sub) {
this.removeSubView();
} else {
const subView = new IconSelectView({
el: this.$el.find('.grp__icons'),
model: {
iconId: this.model.get('customIconId') || this.model.get('iconId'),
file: this.model.file
}
});
this.listenTo(subView, 'select', this.iconSelected);
subView.render();
this.views.sub = subView;
}
this.pageResized();
},
iconSelected: function(sel) {
if (sel.custom) {
if (sel.id !== this.model.get('customIconId')) {
this.model.setCustomIcon(sel.id);
}
} else if (sel.id !== this.model.get('iconId')) {
this.model.setIcon(+sel.id);
}
this.render();
},
moveToTrash: function() {
this.model.moveToTrash();
Backbone.trigger('select-all');
},
setEnableSearching: function(e) {
const enabled = e.target.checked;
this.model.setEnableSearching(enabled);
},
setEnableAutoType: function(e) {
const enabled = e.target.checked;
this.model.setEnableAutoType(enabled);
},
returnToApp: function() {
Backbone.trigger('edit-group');
}
});
_.extend(GrpView.prototype, Scrollable);
module.exports = GrpView;