keeweb/app/scripts/views/generator-presets-view.js

200 lines
6.4 KiB
JavaScript
Raw Normal View History

2019-09-16 22:57:56 +02:00
import { Events } from 'framework/events';
2019-09-16 20:42:33 +02:00
import { View } from 'framework/views/view';
2019-09-15 14:16:32 +02:00
import { GeneratorPresets } from 'comp/app/generator-presets';
2020-03-15 11:20:01 +01:00
import { PasswordGenerator, CharRanges } from 'util/generators/password-generator';
2019-09-15 14:16:32 +02:00
import { Locale } from 'util/locale';
2019-09-16 20:42:33 +02:00
import { Scrollable } from 'framework/views/scrollable';
2019-09-15 18:33:45 +02:00
import template from 'templates/generator-presets.hbs';
2016-08-13 21:13:16 +02:00
2019-09-15 18:33:45 +02:00
class GeneratorPresetsView extends View {
parent = '.app__panel';
2016-08-13 21:13:16 +02:00
2019-09-15 18:33:45 +02:00
template = template;
events = {
2016-08-13 22:19:15 +02:00
'click .back-button': 'returnToApp',
'change .gen-ps__list': 'changePreset',
'click .gen-ps__btn-create': 'createPreset',
'click .gen-ps__btn-delete': 'deletePreset',
2020-03-15 11:20:01 +01:00
'click .info-btn--pattern': 'togglePatternHelp',
2016-08-14 18:18:51 +02:00
'input #gen-ps__field-title': 'changeTitle',
'change #gen-ps__check-enabled': 'changeEnabled',
'change #gen-ps__check-default': 'changeDefault',
'input #gen-ps__field-length': 'changeLength',
'change .gen-ps__check-range': 'changeRange',
2020-03-15 11:20:01 +01:00
'input #gen-ps__field-include': 'changeInclude',
'input #gen-ps__field-pattern': 'changePattern'
2019-09-15 18:33:45 +02:00
};
2016-08-13 22:19:15 +02:00
2019-09-15 18:33:45 +02:00
selected = null;
2016-08-14 18:18:51 +02:00
2019-09-15 18:33:45 +02:00
reservedTitles = [Locale.genPresetDerived];
2016-08-13 21:13:16 +02:00
2019-08-18 10:17:09 +02:00
render() {
2016-08-14 18:18:51 +02:00
this.presets = GeneratorPresets.all;
2020-06-01 16:53:51 +02:00
if (!this.selected || !this.presets.some((p) => p.name === this.selected)) {
this.selected = (this.presets.filter((p) => p.default)[0] || this.presets[0]).name;
2016-08-13 22:19:15 +02:00
}
2019-09-15 18:33:45 +02:00
super.render({
presets: this.presets,
selected: this.getPreset(this.selected),
ranges: this.getSelectedRanges()
});
2016-08-14 18:18:51 +02:00
this.createScroll({
root: this.$el.find('.gen-ps')[0],
scroller: this.$el.find('.scroller')[0],
bar: this.$el.find('.scroller__bar')[0]
});
this.renderExample();
2019-09-15 18:33:45 +02:00
}
2016-08-13 21:13:16 +02:00
2019-08-18 10:17:09 +02:00
renderExample() {
2017-01-31 07:50:28 +01:00
const selectedPreset = this.getPreset(this.selected);
const example = PasswordGenerator.generate(selectedPreset);
2016-08-14 18:18:51 +02:00
this.$el.find('.gen-ps__example').text(example);
this.pageResized();
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
getSelectedRanges() {
2017-01-31 07:50:28 +01:00
const sel = this.getPreset(this.selected);
const rangeOverride = {
2016-08-14 18:18:51 +02:00
high: '¡¢£¤¥¦§©ª«¬®¯°±¹²´µ¶»¼÷¿ÀÖîü...'
};
2019-08-18 08:05:38 +02:00
return ['Upper', 'Lower', 'Digits', 'Special', 'Brackets', 'High', 'Ambiguous'].map(
2020-06-01 16:53:51 +02:00
(name) => {
2019-08-18 08:05:38 +02:00
const nameLower = name.toLowerCase();
return {
name: nameLower,
title: Locale['genPs' + name],
enabled: sel[nameLower],
2020-03-15 11:20:01 +01:00
sample: rangeOverride[nameLower] || CharRanges[nameLower]
2019-08-18 08:05:38 +02:00
};
}
);
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
getPreset(name) {
2020-06-01 16:53:51 +02:00
return this.presets.filter((p) => p.name === name)[0];
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
returnToApp() {
2019-09-16 22:57:56 +02:00
Events.emit('edit-generator-presets');
2019-09-15 18:33:45 +02:00
}
2016-08-13 22:19:15 +02:00
2019-08-18 10:17:09 +02:00
changePreset(e) {
2016-08-14 18:18:51 +02:00
this.selected = e.target.value;
2016-08-13 22:19:15 +02:00
this.render();
2019-09-15 18:33:45 +02:00
}
2016-08-13 22:19:15 +02:00
2019-08-18 10:17:09 +02:00
createPreset() {
2016-08-13 22:19:15 +02:00
let name;
2016-08-14 18:18:51 +02:00
let title;
2016-08-13 22:19:15 +02:00
for (let i = 1; ; i++) {
2017-01-31 07:50:28 +01:00
const newName = 'Custom' + i;
const newTitle = Locale.genPsNew + ' ' + i;
2020-06-01 16:53:51 +02:00
if (!this.presets.filter((p) => p.name === newName || p.title === newTitle).length) {
2016-08-13 22:19:15 +02:00
name = newName;
2016-08-14 18:18:51 +02:00
title = newTitle;
2016-08-13 22:19:15 +02:00
break;
}
}
2017-01-31 07:50:28 +01:00
const selected = this.getPreset(this.selected);
const preset = {
2019-08-16 23:05:39 +02:00
name,
title,
2016-08-14 18:18:51 +02:00
length: selected.length,
2019-08-16 23:05:39 +02:00
upper: selected.upper,
lower: selected.lower,
digits: selected.digits,
special: selected.special,
brackets: selected.brackets,
ambiguous: selected.ambiguous,
2016-08-14 18:18:51 +02:00
include: selected.include
};
GeneratorPresets.add(preset);
this.selected = name;
2016-08-13 22:19:15 +02:00
this.render();
2019-09-15 18:33:45 +02:00
}
2016-08-13 22:19:15 +02:00
2019-08-18 10:17:09 +02:00
deletePreset() {
2016-08-14 18:18:51 +02:00
GeneratorPresets.remove(this.selected);
2016-08-13 22:19:15 +02:00
this.render();
2019-09-15 18:33:45 +02:00
}
2016-08-13 22:19:15 +02:00
2020-03-15 11:20:01 +01:00
togglePatternHelp() {
this.$el.find('.gen-ps__pattern-help').toggleClass('hide');
}
2019-08-18 10:17:09 +02:00
changeTitle(e) {
2017-01-31 07:50:28 +01:00
const title = $.trim(e.target.value);
2016-08-14 18:18:51 +02:00
if (title && title !== this.getPreset(this.selected).title) {
2020-06-01 16:53:51 +02:00
let duplicate = this.presets.some((p) => p.title.toLowerCase() === title.toLowerCase());
2016-08-14 18:18:51 +02:00
if (!duplicate) {
2020-06-01 16:53:51 +02:00
duplicate = this.reservedTitles.some(
(p) => p.toLowerCase() === title.toLowerCase()
);
2016-08-14 18:18:51 +02:00
}
if (duplicate) {
2016-08-13 22:19:15 +02:00
$(e.target).addClass('input--error');
return;
} else {
$(e.target).removeClass('input--error');
}
2016-08-14 18:18:51 +02:00
GeneratorPresets.setPreset(this.selected, { title });
this.$el.find('.gen-ps__list option[selected]').text(title);
2016-08-13 22:19:15 +02:00
}
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
changeEnabled(e) {
2017-01-31 07:50:28 +01:00
const enabled = e.target.checked;
2016-08-14 18:18:51 +02:00
GeneratorPresets.setDisabled(this.selected, !enabled);
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
changeDefault(e) {
2017-01-31 07:50:28 +01:00
const isDefault = e.target.checked;
2016-08-14 18:18:51 +02:00
GeneratorPresets.setDefault(isDefault ? this.selected : null);
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
changeLength(e) {
2017-01-31 07:50:28 +01:00
const length = +e.target.value;
2016-08-14 18:18:51 +02:00
if (length > 0) {
GeneratorPresets.setPreset(this.selected, { length });
$(e.target).removeClass('input--error');
} else {
$(e.target).addClass('input--error');
}
this.presets = GeneratorPresets.all;
this.renderExample();
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
changeRange(e) {
2017-01-31 07:50:28 +01:00
const enabled = e.target.checked;
const range = e.target.dataset.range;
2016-08-14 18:18:51 +02:00
GeneratorPresets.setPreset(this.selected, { [range]: enabled });
this.presets = GeneratorPresets.all;
this.renderExample();
2019-09-15 18:33:45 +02:00
}
2016-08-14 18:18:51 +02:00
2019-08-18 10:17:09 +02:00
changeInclude(e) {
2017-01-31 07:50:28 +01:00
const include = e.target.value;
2016-08-14 18:18:51 +02:00
if (include !== this.getPreset(this.selected).include) {
2019-08-18 10:17:09 +02:00
GeneratorPresets.setPreset(this.selected, { include });
2016-08-14 18:18:51 +02:00
}
this.presets = GeneratorPresets.all;
this.renderExample();
2016-08-13 21:13:16 +02:00
}
2020-03-15 11:20:01 +01:00
changePattern(e) {
const pattern = e.target.value;
if (pattern !== this.getPreset(this.selected).pattern) {
GeneratorPresets.setPreset(this.selected, { pattern });
}
this.presets = GeneratorPresets.all;
this.renderExample();
}
2019-09-15 18:33:45 +02:00
}
2016-08-13 21:13:16 +02:00
2019-09-15 18:33:45 +02:00
Object.assign(GeneratorPresetsView.prototype, Scrollable);
2016-08-14 18:18:51 +02:00
2019-09-15 14:16:32 +02:00
export { GeneratorPresetsView };