mirror of https://github.com/keeweb/keeweb.git
fix #313: copy entries
This commit is contained in:
parent
9b97c248b1
commit
701c296ba7
|
@ -40,6 +40,7 @@ var AppModel = Backbone.Model.extend({
|
|||
this.listenTo(Backbone, 'add-filter', this.addFilter);
|
||||
this.listenTo(Backbone, 'set-sort', this.setSort);
|
||||
this.listenTo(Backbone, 'empty-trash', this.emptyTrash);
|
||||
this.listenTo(Backbone, 'select-entry', this.selectEntry);
|
||||
|
||||
this.appLogger = new Logger('app');
|
||||
|
||||
|
@ -199,13 +200,18 @@ var AppModel = Backbone.Model.extend({
|
|||
this.activeEntryId = firstEntry ? firstEntry.id : null;
|
||||
}
|
||||
Backbone.trigger('filter', { filter: this.filter, sort: this.sort, entries: entries });
|
||||
Backbone.trigger('select-entry', entries.get(this.activeEntryId));
|
||||
Backbone.trigger('entry-selected', entries.get(this.activeEntryId));
|
||||
},
|
||||
|
||||
refresh: function() {
|
||||
this.setFilter(this.filter);
|
||||
},
|
||||
|
||||
selectEntry: function(entry) {
|
||||
this.activeEntryId = entry.id;
|
||||
this.refresh();
|
||||
},
|
||||
|
||||
addFilter: function(filter) {
|
||||
this.setFilter(_.extend(this.filter, filter));
|
||||
},
|
||||
|
|
|
@ -608,6 +608,17 @@ var EntryModel = Backbone.Model.extend({
|
|||
group = group.parentGroup;
|
||||
}
|
||||
return groupPath;
|
||||
},
|
||||
|
||||
cloneEntry: function(nameSuffix) {
|
||||
let newEntry = EntryModel.newEntry(this.group, this.file);
|
||||
newEntry.entry.copyFrom(this.entry);
|
||||
newEntry.entry.uuid = kdbxweb.KdbxUuid.random();
|
||||
newEntry.entry.times.update();
|
||||
newEntry.entry.fields.Title = this.title + nameSuffix;
|
||||
newEntry._fillByEntry();
|
||||
this.file.reload();
|
||||
return newEntry;
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -243,6 +243,8 @@ var Locale = {
|
|||
detMenuCopyPassword: 'Copy password',
|
||||
detMenuCopyUser: 'Copy user',
|
||||
detSetupOtp: 'One-time passwords',
|
||||
detClone: 'Make a copy',
|
||||
detClonedName: 'Copy',
|
||||
detAutoType: 'Auto-type',
|
||||
detAutoTypeEnabled: 'Enable auto-type for this entry',
|
||||
detAutoTypeSequence: 'Keystrokes',
|
||||
|
|
|
@ -66,7 +66,7 @@ var DetailsView = Backbone.View.extend({
|
|||
this.fieldViews = [];
|
||||
this.views = {};
|
||||
this.initScroll();
|
||||
this.listenTo(Backbone, 'select-entry', this.showEntry);
|
||||
this.listenTo(Backbone, 'entry-selected', this.showEntry);
|
||||
this.listenTo(Backbone, 'copy-password', this.copyPassword);
|
||||
this.listenTo(Backbone, 'copy-user', this.copyUserName);
|
||||
this.listenTo(Backbone, 'copy-url', this.copyUrl);
|
||||
|
@ -252,6 +252,7 @@ var DetailsView = Backbone.View.extend({
|
|||
if (AutoType.enabled) {
|
||||
moreOptions.push({value: 'auto-type', icon: 'keyboard-o', text: Locale.detAutoType});
|
||||
}
|
||||
moreOptions.push({value: 'clone', icon: 'clone', text: Locale.detClone});
|
||||
var rect = this.moreView.labelEl[0].getBoundingClientRect();
|
||||
dropdownView.render({
|
||||
position: {top: rect.bottom, left: rect.left},
|
||||
|
@ -280,6 +281,9 @@ var DetailsView = Backbone.View.extend({
|
|||
case 'auto-type':
|
||||
this.toggleAutoType();
|
||||
break;
|
||||
case 'clone':
|
||||
this.clone();
|
||||
break;
|
||||
default:
|
||||
if (e.item.lastIndexOf('add:', 0) === 0) {
|
||||
var fieldName = e.item.substr(4);
|
||||
|
@ -486,7 +490,7 @@ var DetailsView = Backbone.View.extend({
|
|||
this.model.moveToFile(newFile);
|
||||
this.appModel.activeEntryId = this.model.id;
|
||||
this.entryUpdated();
|
||||
Backbone.trigger('select-entry', this.model);
|
||||
Backbone.trigger('entry-selected', this.model);
|
||||
return;
|
||||
} else if (fieldName) {
|
||||
this.model.setField(fieldName, e.val);
|
||||
|
@ -737,6 +741,11 @@ var DetailsView = Backbone.View.extend({
|
|||
Backbone.trigger('refresh');
|
||||
},
|
||||
|
||||
clone: function() {
|
||||
let newEntry = this.model.cloneEntry(' ' + Locale.detClonedName);
|
||||
Backbone.trigger('select-entry', newEntry);
|
||||
},
|
||||
|
||||
deleteFromTrash: function() {
|
||||
Alerts.yesno({
|
||||
header: Locale.detDelFromTrash,
|
||||
|
@ -761,6 +770,7 @@ var DetailsView = Backbone.View.extend({
|
|||
options.push({ value: 'det-copy-user', icon: 'clipboard', text: Locale.detMenuCopyUser });
|
||||
}
|
||||
options.push({ value: 'det-add-new', icon: 'plus', text: Locale.detMenuAddNewField });
|
||||
options.push({ value: 'det-clone', icon: 'clone', text: Locale.detClone });
|
||||
Backbone.trigger('show-context-menu', _.extend(e, { options }));
|
||||
},
|
||||
|
||||
|
@ -775,6 +785,9 @@ var DetailsView = Backbone.View.extend({
|
|||
case 'det-add-new':
|
||||
this.addNewField();
|
||||
break;
|
||||
case 'det-clone':
|
||||
this.clone();
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -162,7 +162,7 @@ var ListView = Backbone.View.extend({
|
|||
|
||||
selectItem: function(item) {
|
||||
this.model.activeEntryId = item.id;
|
||||
Backbone.trigger('select-entry', item);
|
||||
Backbone.trigger('entry-selected', item);
|
||||
this.itemsEl.find('.list__item--active').removeClass('list__item--active');
|
||||
var itemEl = document.getElementById(item.id);
|
||||
itemEl.classList.add('list__item--active');
|
||||
|
|
|
@ -15,6 +15,7 @@ Audit, generator presets, auto-type and ui improvements
|
|||
`+` confirmation in password change dialog
|
||||
`+` inline generator keyboard management
|
||||
`+` field references decoding
|
||||
`+` copy entries
|
||||
`-` fix app redraw in background
|
||||
`-` fix idle timer on computer sleep
|
||||
`-` fix storage popup when no action is required
|
||||
|
|
Loading…
Reference in New Issue