keeweb/app/scripts/views/auto-type/auto-type-select-view.js

134 lines
4.3 KiB
JavaScript
Raw Normal View History

2016-07-24 22:57:12 +02:00
'use strict';
const Backbone = require('backbone');
const Keys = require('../../const/keys');
const KeyHandler = require('../../comp/key-handler');
2016-07-25 20:27:22 +02:00
const Locale = require('../../util/locale');
const AppSettingsModel = require('../../models/app-settings-model');
const EntryPresenter = require('../../presenters/entry-presenter');
const Scrollable = require('../../mixins/scrollable');
2016-07-24 22:57:12 +02:00
let AutoTypePopupView = Backbone.View.extend({
el: 'body',
template: require('templates/auto-type/auto-type-select.hbs'),
2016-07-25 20:27:22 +02:00
itemTemplate: require('templates/auto-type/auto-type-select-item.hbs'),
2016-07-24 22:57:12 +02:00
events: {
2016-07-25 20:27:22 +02:00
'click .at-select__header-filter-clear': 'clearFilterText',
'click .at-select__message-clear-filter': 'clearFilterWindow'
2016-07-24 22:57:12 +02:00
},
result: null,
initialize() {
2016-07-25 20:27:22 +02:00
this.initScroll();
2016-07-24 23:10:03 +02:00
this.listenTo(Backbone, 'main-window-blur', this.mainWindowBlur);
2016-07-24 22:57:12 +02:00
KeyHandler.onKey(Keys.DOM_VK_ESCAPE, this.escPressed, this, false, true);
KeyHandler.onKey(Keys.DOM_VK_RETURN, this.enterPressed, this, false, true);
KeyHandler.onKey(Keys.DOM_VK_UP, this.upPressed, this, false, true);
KeyHandler.onKey(Keys.DOM_VK_DOWN, this.downPressed, this, false, true);
2016-07-24 23:53:42 +02:00
KeyHandler.onKey(Keys.DOM_VK_BACK_SPACE, this.backSpacePressed, this, false, true);
2016-07-24 22:57:12 +02:00
KeyHandler.on('keypress:auto-type', this.keyPressed.bind(this));
KeyHandler.setModal('auto-type');
},
render() {
2016-07-25 20:27:22 +02:00
let topMessage, topClearFilterVisible;
if (this.model.filter.title || this.model.filter.url) {
topMessage = Locale.autoTypeMsgMatchedByWindow.replace('{}',
this.model.filter.title || this.model.filter.url);
topClearFilterVisible = !this.model.filter.ignoreWindowInfo;
} else {
topMessage = Locale.autoTypeMsgNoWindow;
}
let noColor = AppSettingsModel.instance.get('colorfulIcons') ? '' : 'grayscale';
let presenter = new EntryPresenter(null, noColor);
let itemsHtml = '';
let itemTemplate = this.itemTemplate;
this.model.filter.getEntries().forEach(entry => {
presenter.present(entry);
itemsHtml += itemTemplate(presenter);
});
2016-07-24 23:53:42 +02:00
this.renderTemplate({
2016-07-25 20:27:22 +02:00
filterText: this.model.filter.text,
topMessage: topMessage,
topClearFilterVisible: topClearFilterVisible,
itemsHtml: itemsHtml
2016-07-24 23:53:42 +02:00
});
2016-07-24 22:57:12 +02:00
document.activeElement.blur();
2016-07-25 20:27:22 +02:00
this.createScroll({
root: this.$el.find('.at-select__items')[0],
scroller: this.$el.find('.scroller')[0],
bar: this.$el.find('.scroller__bar')[0]
});
2016-07-24 22:57:12 +02:00
return this;
},
remove() {
KeyHandler.offKey(Keys.DOM_VK_ESCAPE, this.escPressed, this);
KeyHandler.offKey(Keys.DOM_VK_RETURN, this.enterPressed, this);
KeyHandler.offKey(Keys.DOM_VK_UP, this.upPressed, this);
KeyHandler.offKey(Keys.DOM_VK_DOWN, this.downPressed, this);
2016-07-24 23:53:42 +02:00
KeyHandler.offKey(Keys.DOM_VK_BACK_SPACE, this.backSpacePressed, this);
2016-07-24 22:57:12 +02:00
KeyHandler.off('keypress:auto-type');
KeyHandler.setModal(null);
Backbone.View.prototype.remove.apply(this, arguments);
},
2016-07-24 23:10:03 +02:00
cancelAndClose() {
2016-07-24 22:57:12 +02:00
this.result = null;
this.trigger('result', this.result);
},
2016-07-24 23:10:03 +02:00
escPressed() {
2016-07-25 20:27:22 +02:00
if (this.model.filter.text) {
this.clearFilterText();
} else {
this.cancelAndClose();
}
2016-07-24 23:10:03 +02:00
},
2016-07-24 22:57:12 +02:00
enterPressed() {
this.trigger('result', this.result);
},
upPressed() {
},
downPressed() {
},
keyPressed(e) {
2016-07-24 23:53:42 +02:00
if (e.which) {
this.model.filter.text += String.fromCharCode(e.which);
this.render();
}
},
backSpacePressed() {
if (this.model.filter.text) {
this.model.filter.text = this.model.filter.text.substr(0, this.model.filter.text.length - 1);
this.render();
}
},
clearFilterText() {
this.model.filter.text = '';
this.render();
2016-07-24 23:10:03 +02:00
},
2016-07-25 20:27:22 +02:00
clearFilterWindow() {
this.model.filter.ignoreWindowInfo = true;
this.render();
},
2016-07-24 23:10:03 +02:00
mainWindowBlur() {
this.cancelAndClose();
2016-07-24 22:57:12 +02:00
}
});
2016-07-25 20:27:22 +02:00
_.extend(AutoTypePopupView.prototype, Scrollable);
2016-07-24 22:57:12 +02:00
module.exports = AutoTypePopupView;