mirror of https://github.com/keeweb/keeweb.git
Merge ab0ecd58c5
into cb17bbe87d
This commit is contained in:
commit
2219cc540c
|
@ -2,11 +2,64 @@ import { AppSettingsModel } from 'models/app-settings-model';
|
||||||
import { Locale } from 'util/locale';
|
import { Locale } from 'util/locale';
|
||||||
|
|
||||||
const GeneratorPresets = {
|
const GeneratorPresets = {
|
||||||
|
getBasicOptions() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
name: 'upper',
|
||||||
|
title: Locale.genPsUpper,
|
||||||
|
label: 'ABC',
|
||||||
|
type: 'checkbox'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'lower',
|
||||||
|
title: Locale.genPsLower,
|
||||||
|
label: 'abc',
|
||||||
|
type: 'checkbox'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'digits',
|
||||||
|
title: Locale.genPsDigits,
|
||||||
|
label: '123',
|
||||||
|
type: 'checkbox'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'special',
|
||||||
|
title: Locale.genPsSpecial,
|
||||||
|
label: '!@#',
|
||||||
|
type: 'checkbox'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'brackets',
|
||||||
|
title: Locale.genPsBrackets,
|
||||||
|
label: '({<',
|
||||||
|
type: 'checkbox'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'high',
|
||||||
|
title: Locale.genPsHigh,
|
||||||
|
label: 'äæ±',
|
||||||
|
type: 'checkbox'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'ambiguous',
|
||||||
|
title: Locale.genPsAmbiguous,
|
||||||
|
label: '0Oo',
|
||||||
|
type: 'checkbox'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'include',
|
||||||
|
title: Locale.genPsInclude,
|
||||||
|
type: 'text'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
get defaultPreset() {
|
get defaultPreset() {
|
||||||
return {
|
return {
|
||||||
name: 'Default',
|
name: 'Default',
|
||||||
title: Locale.genPresetDefault,
|
title: Locale.genPresetDefault,
|
||||||
length: 16,
|
length: 16,
|
||||||
|
options: this.getBasicOptions(),
|
||||||
upper: true,
|
upper: true,
|
||||||
lower: true,
|
lower: true,
|
||||||
digits: true
|
digits: true
|
||||||
|
@ -17,6 +70,7 @@ const GeneratorPresets = {
|
||||||
return {
|
return {
|
||||||
name: 'BrowserExtension',
|
name: 'BrowserExtension',
|
||||||
length: 20,
|
length: 20,
|
||||||
|
options: this.getBasicOptions(),
|
||||||
upper: true,
|
upper: true,
|
||||||
lower: true,
|
lower: true,
|
||||||
special: true,
|
special: true,
|
||||||
|
@ -32,6 +86,7 @@ const GeneratorPresets = {
|
||||||
name: 'Pronounceable',
|
name: 'Pronounceable',
|
||||||
title: Locale.genPresetPronounceable,
|
title: Locale.genPresetPronounceable,
|
||||||
length: 10,
|
length: 10,
|
||||||
|
options: this.getBasicOptions(),
|
||||||
lower: true,
|
lower: true,
|
||||||
upper: true
|
upper: true
|
||||||
},
|
},
|
||||||
|
@ -39,6 +94,7 @@ const GeneratorPresets = {
|
||||||
name: 'Med',
|
name: 'Med',
|
||||||
title: Locale.genPresetMed,
|
title: Locale.genPresetMed,
|
||||||
length: 16,
|
length: 16,
|
||||||
|
options: this.getBasicOptions(),
|
||||||
upper: true,
|
upper: true,
|
||||||
lower: true,
|
lower: true,
|
||||||
digits: true,
|
digits: true,
|
||||||
|
@ -50,15 +106,29 @@ const GeneratorPresets = {
|
||||||
name: 'Long',
|
name: 'Long',
|
||||||
title: Locale.genPresetLong,
|
title: Locale.genPresetLong,
|
||||||
length: 32,
|
length: 32,
|
||||||
|
options: this.getBasicOptions(),
|
||||||
upper: true,
|
upper: true,
|
||||||
lower: true,
|
lower: true,
|
||||||
digits: true
|
digits: true
|
||||||
},
|
},
|
||||||
{ name: 'Pin4', title: Locale.genPresetPin4, length: 4, digits: true },
|
{
|
||||||
|
name: 'Pin4',
|
||||||
|
title: Locale.genPresetPin4,
|
||||||
|
length: 4,
|
||||||
|
options: this.getBasicOptions(),
|
||||||
|
digits: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'Mac',
|
name: 'Mac',
|
||||||
title: Locale.genPresetMac,
|
title: Locale.genPresetMac,
|
||||||
length: 17,
|
length: 17,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'include',
|
||||||
|
title: Locale.genPsInclude,
|
||||||
|
type: 'text'
|
||||||
|
}
|
||||||
|
],
|
||||||
include: '0123456789ABCDEF',
|
include: '0123456789ABCDEF',
|
||||||
pattern: 'XX-'
|
pattern: 'XX-'
|
||||||
},
|
},
|
||||||
|
@ -66,12 +136,26 @@ const GeneratorPresets = {
|
||||||
name: 'Hash128',
|
name: 'Hash128',
|
||||||
title: Locale.genPresetHash128,
|
title: Locale.genPresetHash128,
|
||||||
length: 32,
|
length: 32,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'include',
|
||||||
|
title: Locale.genPsInclude,
|
||||||
|
type: 'text'
|
||||||
|
}
|
||||||
|
],
|
||||||
include: '0123456789abcdef'
|
include: '0123456789abcdef'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Hash256',
|
name: 'Hash256',
|
||||||
title: Locale.genPresetHash256,
|
title: Locale.genPresetHash256,
|
||||||
length: 64,
|
length: 64,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'include',
|
||||||
|
title: Locale.genPsInclude,
|
||||||
|
type: 'text'
|
||||||
|
}
|
||||||
|
],
|
||||||
include: '0123456789abcdef'
|
include: '0123456789abcdef'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
|
@ -3,4 +3,5 @@ import 'hbs-helpers/cmp';
|
||||||
import 'hbs-helpers/ifeq';
|
import 'hbs-helpers/ifeq';
|
||||||
import 'hbs-helpers/ifneq';
|
import 'hbs-helpers/ifneq';
|
||||||
import 'hbs-helpers/ifemptyoreq';
|
import 'hbs-helpers/ifemptyoreq';
|
||||||
|
import 'hbs-helpers/lookupfield';
|
||||||
import 'hbs-helpers/res';
|
import 'hbs-helpers/res';
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
import Handlebars from 'hbs';
|
||||||
|
|
||||||
|
Handlebars.registerHelper('lookupfield', (array, field, value) => {
|
||||||
|
return array.find((elem) => elem[field] === value);
|
||||||
|
});
|
|
@ -21,8 +21,8 @@ class GeneratorPresetsView extends View {
|
||||||
'change #gen-ps__check-enabled': 'changeEnabled',
|
'change #gen-ps__check-enabled': 'changeEnabled',
|
||||||
'change #gen-ps__check-default': 'changeDefault',
|
'change #gen-ps__check-default': 'changeDefault',
|
||||||
'input #gen-ps__field-length': 'changeLength',
|
'input #gen-ps__field-length': 'changeLength',
|
||||||
'change .gen-ps__check-range': 'changeRange',
|
'change .gen-ps__checkbox-option': 'changeCheckboxOption',
|
||||||
'input #gen-ps__field-include': 'changeInclude',
|
'input .gen-ps__text-option': 'changeTextOption',
|
||||||
'input #gen-ps__field-pattern': 'changePattern'
|
'input #gen-ps__field-pattern': 'changePattern'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ class GeneratorPresetsView extends View {
|
||||||
super.render({
|
super.render({
|
||||||
presets: this.presets,
|
presets: this.presets,
|
||||||
selected: this.getPreset(this.selected),
|
selected: this.getPreset(this.selected),
|
||||||
ranges: this.getSelectedRanges()
|
options: this.getSelectedOptions()
|
||||||
});
|
});
|
||||||
this.createScroll({
|
this.createScroll({
|
||||||
root: this.$el.find('.gen-ps')[0],
|
root: this.$el.find('.gen-ps')[0],
|
||||||
|
@ -55,22 +55,17 @@ class GeneratorPresetsView extends View {
|
||||||
this.pageResized();
|
this.pageResized();
|
||||||
}
|
}
|
||||||
|
|
||||||
getSelectedRanges() {
|
getSelectedOptions() {
|
||||||
const sel = this.getPreset(this.selected);
|
const sel = this.getPreset(this.selected);
|
||||||
const rangeOverride = {
|
const rangeOverride = {
|
||||||
high: '¡¢£¤¥¦§©ª«¬®¯°±¹²´µ¶»¼÷¿ÀÖîü...'
|
high: '¡¢£¤¥¦§©ª«¬®¯°±¹²´µ¶»¼÷¿ÀÖîü...'
|
||||||
};
|
};
|
||||||
return ['Upper', 'Lower', 'Digits', 'Special', 'Brackets', 'High', 'Ambiguous'].map(
|
return sel.options.map((option) => {
|
||||||
(name) => {
|
return {
|
||||||
const nameLower = name.toLowerCase();
|
sample: option.sample || rangeOverride[option.name] || CharRanges[option.name],
|
||||||
return {
|
...option
|
||||||
name: nameLower,
|
};
|
||||||
title: Locale['genPs' + name],
|
});
|
||||||
enabled: sel[nameLower],
|
|
||||||
sample: rangeOverride[nameLower] || CharRanges[nameLower]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getPreset(name) {
|
getPreset(name) {
|
||||||
|
@ -99,18 +94,10 @@ class GeneratorPresetsView extends View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const selected = this.getPreset(this.selected);
|
const selected = this.getPreset(this.selected);
|
||||||
const preset = {
|
const preset = { ...selected };
|
||||||
name,
|
delete preset.builtIn;
|
||||||
title,
|
preset.name = name;
|
||||||
length: selected.length,
|
preset.title = title;
|
||||||
upper: selected.upper,
|
|
||||||
lower: selected.lower,
|
|
||||||
digits: selected.digits,
|
|
||||||
special: selected.special,
|
|
||||||
brackets: selected.brackets,
|
|
||||||
ambiguous: selected.ambiguous,
|
|
||||||
include: selected.include
|
|
||||||
};
|
|
||||||
GeneratorPresets.add(preset);
|
GeneratorPresets.add(preset);
|
||||||
this.selected = name;
|
this.selected = name;
|
||||||
this.render();
|
this.render();
|
||||||
|
@ -167,18 +154,19 @@ class GeneratorPresetsView extends View {
|
||||||
this.renderExample();
|
this.renderExample();
|
||||||
}
|
}
|
||||||
|
|
||||||
changeRange(e) {
|
changeCheckboxOption(e) {
|
||||||
const enabled = e.target.checked;
|
const enabled = e.target.checked;
|
||||||
const range = e.target.dataset.range;
|
const option = e.target.dataset.option;
|
||||||
GeneratorPresets.setPreset(this.selected, { [range]: enabled });
|
GeneratorPresets.setPreset(this.selected, { [option]: enabled });
|
||||||
this.presets = GeneratorPresets.all;
|
this.presets = GeneratorPresets.all;
|
||||||
this.renderExample();
|
this.renderExample();
|
||||||
}
|
}
|
||||||
|
|
||||||
changeInclude(e) {
|
changeTextOption(e) {
|
||||||
const include = e.target.value;
|
const value = e.target.value;
|
||||||
if (include !== this.getPreset(this.selected).include) {
|
const option = e.target.dataset.option;
|
||||||
GeneratorPresets.setPreset(this.selected, { include });
|
if (value !== this.getPreset(this.selected)[option]) {
|
||||||
|
GeneratorPresets.setPreset(this.selected, { [option]: value });
|
||||||
}
|
}
|
||||||
this.presets = GeneratorPresets.all;
|
this.presets = GeneratorPresets.all;
|
||||||
this.renderExample();
|
this.renderExample();
|
||||||
|
|
|
@ -28,19 +28,21 @@
|
||||||
<input type="text" class="input-base" id="gen-ps__field-length" value="{{selected.length}}"
|
<input type="text" class="input-base" id="gen-ps__field-length" value="{{selected.length}}"
|
||||||
size="50" maxlength="3" required pattern="\d+" {{#if selected.builtIn}}readonly{{/if}} />
|
size="50" maxlength="3" required pattern="\d+" {{#if selected.builtIn}}readonly{{/if}} />
|
||||||
</div>
|
</div>
|
||||||
{{#each ranges as |range|}}
|
{{#each options as |option|}}
|
||||||
<div class="gen-ps__field">
|
<div class="gen-ps__field">
|
||||||
<input type="checkbox" class="input-base gen-ps__check-range" id="gen-ps__check-{{range.name}}"
|
{{#ifeq option.type "checkbox"}}
|
||||||
data-range="{{range.name}}"
|
<input type="checkbox" class="input-base gen-ps__checkbox-option" id="gen-ps__check-{{option.name}}"
|
||||||
{{#if range.enabled}}checked{{/if}} {{#if ../selected.builtIn}}disabled{{/if}} />
|
data-option="{{option.name}}"
|
||||||
<label for="gen-ps__check-{{range.name}}">{{range.title}}<span class="gen-ps__sample"> {{range.sample}}</span></label>
|
{{#if (lookup ../selected option.name)}}checked{{/if}} {{#if ../selected.builtIn}}disabled{{/if}} />
|
||||||
</div>
|
<label for="gen-ps__check-{{option.name}}">{{option.title}}<span class="gen-ps__sample"> {{option.sample}}</span></label>
|
||||||
|
{{/ifeq}}
|
||||||
|
{{#ifeq option.type "text"}}
|
||||||
|
<label for="gen-ps__field-{{option.name}}">{{option.title}}:</label>
|
||||||
|
<input type="text" class="input-base gen-ps__text-option" id="gen-ps__field-{{option.name}}" value="{{lookup ../selected option.name}}" data-option="{{option.name}}"
|
||||||
|
{{#if selected.builtIn}}readonly{{/if}} />
|
||||||
|
{{/ifeq}}
|
||||||
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
<div class="gen-ps__field">
|
|
||||||
<label for="gen-ps__field-include">{{res 'genPsInclude'}}:</label>
|
|
||||||
<input type="text" class="input-base" id="gen-ps__field-include" value="{{selected.include}}"
|
|
||||||
{{#if selected.builtIn}}readonly{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="gen-ps__field">
|
<div class="gen-ps__field">
|
||||||
<label for="gen-ps__field-pattern">{{res 'genPsPattern'}}: <i class="fa fa-info-circle info-btn info-btn--pattern"></i></label>
|
<label for="gen-ps__field-pattern">{{res 'genPsPattern'}}: <i class="fa fa-info-circle info-btn info-btn--pattern"></i></label>
|
||||||
<div class="gen-ps__pattern-help hide">
|
<div class="gen-ps__pattern-help hide">
|
||||||
|
|
|
@ -22,20 +22,14 @@
|
||||||
</select>
|
</select>
|
||||||
<input type="range" class="gen__length-range" value="{{opt.pseudoLength}}" min="0" max="25" />
|
<input type="range" class="gen__length-range" value="{{opt.pseudoLength}}" min="0" max="25" />
|
||||||
<div>
|
<div>
|
||||||
<div class="gen__check"><input type="checkbox" id="gen__check-upper"
|
{{#with (lookupfield presets "name" preset)}}
|
||||||
data-id="upper" {{#if opt.upper}}checked{{/if}}><label for="gen__check-upper">ABC</label></div>
|
{{#each options as |optn|}}
|
||||||
<div class="gen__check"><input type="checkbox" id="gen__check-lower"
|
{{#ifeq optn.type "checkbox"}}
|
||||||
data-id="lower" {{#if opt.lower}}checked{{/if}}><label for="gen__check-lower">abc</label></div>
|
<div class="gen__check"><input type="checkbox" id="gen__check-{{optn.name}}"
|
||||||
<div class="gen__check"><input type="checkbox" id="gen__check-digits"
|
data-id="{{optn.name}}" {{#if (lookup ../../opt optn.name)}}checked{{/if}}><label for="gen__check-{{optn.name}}">{{optn.label}}</label></div>
|
||||||
data-id="digits" {{#if opt.digits}}checked{{/if}}><label for="gen__check-digits">123</label></div>
|
{{/ifeq}}
|
||||||
<div class="gen__check"><input type="checkbox" id="gen__check-special"
|
{{/each}}
|
||||||
data-id="special" {{#if opt.special}}checked{{/if}}><label for="gen__check-special">!@#</label></div>
|
{{/with}}
|
||||||
<div class="gen__check"><input type="checkbox" id="gen__check-brackets"
|
|
||||||
data-id="brackets" {{#if opt.brackets}}checked{{/if}}><label for="gen__check-brackets">({<</label></div>
|
|
||||||
<div class="gen__check"><input type="checkbox" id="gen__check-high"
|
|
||||||
data-id="high" {{#if opt.high}}checked{{/if}}><label for="gen__check-high">äæ±</label></div>
|
|
||||||
<div class="gen__check"><input type="checkbox" id="gen__check-ambiguous"
|
|
||||||
data-id="ambiguous" {{#if opt.ambiguous}}checked{{/if}}><label for="gen__check-ambiguous">0Oo</label></div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="gen__result"></div>
|
<div class="gen__result"></div>
|
||||||
<div class="gen__btn-wrap"><button class="gen__btn-ok">{{btnTitle}}</button></div>
|
<div class="gen__btn-wrap"><button class="gen__btn-ok">{{btnTitle}}</button></div>
|
||||||
|
|
Loading…
Reference in New Issue