1
0
mirror of http://git.whoc.org.uk/git/password-manager.git synced 2025-10-30 02:47:36 +01:00

Implemented "Clone card" command.

This commit is contained in:
Giulio Cesare Solaroli
2014-08-26 17:31:24 +02:00
parent 3918a7bdfc
commit 316dff637f
9 changed files with 181 additions and 35 deletions

View File

@@ -55,6 +55,10 @@ Clipperz.PM.UI.Components.Cards.CommandToolbar = React.createClass({
// 'label': "share",
// 'broadcastEvent': 'shareCard'
// },
'clone': {
'label': "clone",
'broadcastEvent': 'cloneCard'
},
'edit': {
'label': "edit",
'broadcastEvent': 'editCard'
@@ -83,7 +87,7 @@ Clipperz.PM.UI.Components.Cards.CommandToolbar = React.createClass({
var commandHandler = this.selectCommandItem;
return React.DOM.ul({}, MochiKit.Base.map(function (aCommand) {
return React.DOM.li({'onClick':commandHandler, 'data-broadcast-event':aCommand['broadcastEvent']}, [React.DOM.span({}, aCommand['label'])]);
return React.DOM.li({'className':aCommand['broadcastEvent'], 'onClick':commandHandler, 'data-broadcast-event':aCommand['broadcastEvent']}, [React.DOM.span({}, aCommand['label'])]);
}, MochiKit.Base.values(this.commands())));
},

View File

@@ -72,11 +72,11 @@ Clipperz.PM.UI.Components.Cards.Edit = React.createClass({
//============================================================================
renderLabel: function (aLabel) {
return React.DOM.input({'className':'cardLabel', 'onChange':this.handleChange(this.record(), 'setLabel'), 'defaultValue':aLabel});
return React.DOM.input({'className':'cardLabel', 'onChange':this.handleChange(this.record(), 'setLabel'), 'defaultValue':aLabel, 'key':this.props['_reference'] + '_label'});
},
renderNotes: function (someNotes) {
return React.DOM.textarea({'className':'cardNotes', 'onChange':this.handleChange(this.record(), 'setNotes'), 'defaultValue':someNotes});
return React.DOM.textarea({'className':'cardNotes', 'onChange':this.handleChange(this.record(), 'setNotes'), 'defaultValue':someNotes, 'key':this.props['_reference'] + '_notes'});
},
//............................................................................
@@ -130,7 +130,7 @@ Clipperz.PM.UI.Components.Cards.Edit = React.createClass({
//............................................................................
renderDirectLogin: function (aDirectLogin) {
return React.DOM.div({'className':'cardDirectLogin'}, [
return React.DOM.div({'className':'cardDirectLogin', 'key':aDirectLogin['_reference']}, [
React.DOM.span({'className':'directLoginLabel'}, aDirectLogin['label']),
React.DOM.div({'className':'directLoginAction action'}, 'DIRECT LOGIN')
]);
@@ -147,7 +147,7 @@ Clipperz.PM.UI.Components.Cards.Edit = React.createClass({
'edit': true
}
console.log("RENDER CARD EDIT");
//console.log("RENDER CARD EDIT");
return React.DOM.div({'className':React.addons.classSet(classes)},[
Clipperz.PM.UI.Components.Cards.EditToolbar(this.props),
React.DOM.div({'className':'content'}, [

View File

@@ -59,7 +59,6 @@ Clipperz.PM.UI.Components.Cards.EditToolbar = React.createClass({
};
classes[style] = true;
console.log("EDIT TOOLBAR", this.props);
return React.DOM.div({'className':React.addons.classSet(classes)}, [
React.DOM.ul({}, [
React.DOM.li({'onClick':this.cancel, 'className':'cancel'}, [React.DOM.span({}, "cancel")]),

View File

@@ -38,16 +38,24 @@ Clipperz.PM.UI.Components.Cards.List = React.createClass({
},
renderItem: function (anItem) {
var classes = {
'selected': this.props['selectedCard'] ? this.props['selectedCard']['_reference'] == anItem['_reference'] : false,
'archived': anItem['_isArchived']
};
var result;
return React.DOM.li({'className':React.addons.classSet(classes), 'onClick': this.handleClick, 'key':anItem['_reference'], 'data-reference':anItem['_reference'], 'data-label':anItem['label']}, [
React.DOM.span({'className':'favicon'}, [ React.DOM.img({src:anItem['favicon']})]),
React.DOM.span({'className':'label'}, anItem['label']),
// React.DOM.span({'className':'action'}, 'show detail')
]);
if (anItem['_isBrandNew'] == true) {
result = null;
} else {
var classes = {
'selected': this.props['selectedCard'] ? this.props['selectedCard']['_reference'] == anItem['_reference'] : false,
'archived': anItem['_isArchived']
};
result = React.DOM.li({'className':React.addons.classSet(classes), 'onClick': this.handleClick, 'key':anItem['_reference'], 'data-reference':anItem['_reference'], 'data-label':anItem['label']}, [
React.DOM.span({'className':'favicon'}, [ React.DOM.img({src:anItem['favicon']})]),
React.DOM.span({'className':'label'}, anItem['label']),
// React.DOM.span({'className':'action'}, 'show detail')
]);
}
return result;
},
render: function () {

View File

@@ -82,6 +82,7 @@ Clipperz.PM.UI.MainController = function() {
'addCardClick',
'deleteCard',
'archiveCard',
'cloneCard',
'editCard',
'showArchivedCards',
@@ -429,7 +430,7 @@ console.log("SET USER", aUser);
collectRecordInfo: function (aRecord) {
var deferredResult;
deferredResult = new Clipperz.Async.Deferred('MainController.collectRecordInfo', {trace:false});
deferredResult.setValue('_record');
deferredResult.addMethod(aRecord, 'reference');
@@ -444,8 +445,6 @@ console.log("SET USER", aUser);
deferredResult.setValue('notes');
deferredResult.addMethod(aRecord, 'tags');
deferredResult.setValue('tags');
// deferredResult.addMethod(aRecord, 'isArchived');
// deferredResult.setValue('isArchived');
deferredResult.addMethod(aRecord, 'fields');
deferredResult.addCallback(MochiKit.Base.values);
@@ -971,15 +970,21 @@ console.log("SET USER", aUser);
// MochiKit.Base.method(self, 'updateSelectedCard', {'reference':aRecordReference}, false),
// MochiKit.Base.method(self, 'refreshUI'),
MochiKit.Base.method(this, 'refreshUI', aRecordReference)
], {trace:true});
], {trace:false});
},
cancelCardEdits_handler: function (aRecordReference) {
var currentPage = this.pages()[this.currentPage()];
var self = this;
var wasBrandNew;
return Clipperz.Async.callbacks("MainController.cancelCardEdits_handler", [
MochiKit.Base.method(this.user(), 'getRecord', aRecordReference),
MochiKit.Base.methodcaller('isBrandNew'),
function (aValue) { wasBrandNew = aValue },
MochiKit.Base.method(this.user(), 'hasPendingChanges'),
//function (aValue) { console.log("2- USER.hasPendingChanges()", aValue); return aValue; },
Clipperz.Async.deferredIf('HasPendingChanges',[
MochiKit.Base.method(self, 'ask', {
'question': "Lose pending changes?",
@@ -993,8 +998,18 @@ console.log("SET USER", aUser);
]),
MochiKit.Base.method(currentPage, 'setProps', {'mode':'view'}),
MochiKit.Base.method(this.user(), 'revertChanges'),
MochiKit.Base.method(self, 'updateSelectedCard', {'reference':aRecordReference}, false),
], {trace:true});
MochiKit.Base.bind(function () {
var info;
if (wasBrandNew == true) {
info = null;
} else {
info = {'reference': aRecordReference};
}
this.updateSelectedCard(info, false);
}, this)
], {trace:false});
},
//----------------------------------------------------------------------------
@@ -1027,7 +1042,14 @@ console.log("SET USER", aUser);
//----------------------------------------------------------------------------
addCardClick_handler: function () {
console.log("ADD CARD CLICK");
return Clipperz.Async.callbacks("MainController.addCardClick_handler", [
MochiKit.Base.method(this.user(), 'createNewRecord'),
MochiKit.Base.methodcaller('reference'),
MochiKit.Base.method(this, 'refreshUI'),
MochiKit.Base.bind(function () {
this.pages()[this.currentPage()].setProps({'mode': 'edit'});
}, this),
], {trace:false});
},
deleteCard_handler: function (anEvent) {
@@ -1057,6 +1079,19 @@ console.log("ADD CARD CLICK");
], {trace:false});
},
cloneCard_handler: function (anEvent) {
//console.log("CLONE CARD", anEvent['reference']);
return Clipperz.Async.callbacks("MainController.cloneCard_handler", [
MochiKit.Base.method(this.user(), 'getRecord', anEvent['reference']),
MochiKit.Base.method(this.user(), 'cloneRecord'),
MochiKit.Base.methodcaller('reference'),
MochiKit.Base.method(this, 'refreshUI'),
// MochiKit.Base.bind(function () {
// this.pages()[this.currentPage()].setProps({'mode': 'edit'});
// }, this),
], {trace:false});
},
editCard_handler: function (anEvent) {
//console.log("EDIT CARD", anEvent['reference']);
this.pages()[this.currentPage()].setProps({'mode': 'edit'});