mirror of
				http://git.whoc.org.uk/git/password-manager.git
				synced 2025-10-31 03:17:35 +01:00 
			
		
		
		
	Added automatic copying of field values to clipboard
This commit is contained in:
		
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -85,6 +85,7 @@ Clipperz_normalizedNewLine = '\x0d\x0a'; | ||||
| 	</div> | ||||
| 	<span class="icon done"   style="display:none">done</span> | ||||
| 	<span class="icon failed" style="display:none">failed</span> | ||||
| 	<span class="icon custom" style="display:none"></span> | ||||
| 	<span class="progressBar" style="display:none"><span class="progress"></span></span> | ||||
| 	<span class="title">loading</span> | ||||
| 	<div class="mask hidden"></div> | ||||
| @@ -100,11 +101,11 @@ Clipperz_normalizedNewLine = '\x0d\x0a'; | ||||
| </script> | ||||
|  | ||||
|  | ||||
| <!-- div class="testBlock"> | ||||
| <div class="testBlock"> | ||||
| 	<script> | ||||
| 		Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); | ||||
| 	</script> | ||||
| <!- - - -> | ||||
| <!-- --> | ||||
| 	<script type="text/javascript" src="./js/TestData/User.data.js" charset="utf-8"></script> | ||||
| 	<script> | ||||
| 		var	dataStore = new Clipperz.PM.Proxy.Offline.DataStore({ | ||||
| @@ -120,12 +121,12 @@ Clipperz_normalizedNewLine = '\x0d\x0a'; | ||||
| 	<script> | ||||
| 		NETWORK = npm.bitcoin.networks.testnet; | ||||
| 	</script> | ||||
| <!- - - -> | ||||
| <!-- --> | ||||
| 	<script> | ||||
| 		//	Live Reload hoock | ||||
| 		document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>') | ||||
| 	</script> | ||||
| </div --> | ||||
| </div> | ||||
|  | ||||
| </body> | ||||
| </html> | ||||
|   | ||||
| @@ -306,6 +306,33 @@ Clipperz.PM.UI.Components.Cards.ViewClass = React.createClass({ | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	onClickOnFieldValue: function (event) { | ||||
| 		var	succeeded; | ||||
| 		var	element; | ||||
|  | ||||
| 		element = event.target; | ||||
|  | ||||
| //		event.target.focus(); | ||||
| //		event.target.select(); | ||||
| //		event.target.selectionStart = 0; | ||||
| //		event.target.selectionEnd = event.target.value.length; | ||||
| //		event.stopPropagation(); | ||||
| //		event.preventDefault(); | ||||
|  | ||||
| 		element.focus(); | ||||
| 		element.setSelectionRange(0, element.value.length); | ||||
| 		event.stopPropagation(); | ||||
| 		event.preventDefault(); | ||||
|  | ||||
| //		selectedText = element.value; | ||||
|  | ||||
| 		succeeded = document.execCommand('copy'); | ||||
| 		if (succeeded === true) { | ||||
| 			window.getSelection().removeAllRanges(); | ||||
| 			MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'copyFieldValueFeedback'); | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	//............................................................................ | ||||
|  | ||||
| 	renderField: function (aField) { | ||||
| @@ -331,10 +358,10 @@ Clipperz.PM.UI.Components.Cards.ViewClass = React.createClass({ | ||||
| 			React.DOM.div({'className':'fieldValues'}, [ | ||||
| 				React.DOM.div({'className':'fieldLabel'}, aField['label']), | ||||
| 				Clipperz.PM.UI.Components.Cards.TextArea({ | ||||
| //				React.DOM.textarea({ | ||||
| 					'readOnly': true, | ||||
| 					// 'onMouseUp': function(e) { e.target.focus(); e.target.select(); e.stopPropagation(); e.preventDefault();}, | ||||
| 					'onClick': function(e) { e.target.focus(); e.target.select(); e.target.selectionStart = 0; e.target.selectionEnd = e.target.value.length; e.stopPropagation(); e.preventDefault(); }, | ||||
| //					'onClick': function(e) { e.target.focus(); e.target.select(); e.target.selectionStart = 0; e.target.selectionEnd = e.target.value.length; e.stopPropagation(); e.preventDefault(); }, | ||||
| 					'onClick': this.onClickOnFieldValue, | ||||
| 					'className':Clipperz.PM.UI.Components.classNames(cardFieldValueClasses), | ||||
| 					'value': aField['value'], | ||||
| 					'rows': 1 | ||||
|   | ||||
| @@ -88,6 +88,17 @@ Clipperz.Base.extend(Clipperz.PM.UI.Components.Overlay, Object, { | ||||
| 		this.completed(this.showDoneIcon, aMessage, aDelayBeforeHiding); | ||||
| 	}, | ||||
| 	 | ||||
| 	'setCustomResultIcon': function (anIcon) { | ||||
| 		this.getElement('custom').innerHTML = anIcon; | ||||
| 		MochiKit.Style.showElement(this.getElement('custom')); | ||||
| 	}, | ||||
|  | ||||
| 	'customResult': function (anIcon, aMessage, aDelayBeforeHiding) { | ||||
| 		this.hideMask(); | ||||
| 		this.hideProgressBar(); | ||||
| 		this.completed(MochiKit.Base.method(this, 'setCustomResultIcon', anIcon), aMessage, aDelayBeforeHiding); | ||||
| 	}, | ||||
| 	 | ||||
| 	'failed': function (aMessage, aDelayBeforeHiding) { | ||||
| 		this.completed(this.showFailIcon, aMessage, aDelayBeforeHiding); | ||||
| 	}, | ||||
| @@ -139,10 +150,20 @@ Clipperz.Base.extend(Clipperz.PM.UI.Components.Overlay, Object, { | ||||
| 	'hide': function (withoutAnimationTime) { | ||||
| 		var secondsBeforeHiding = withoutAnimationTime ? 0 : 1; | ||||
| 		var element = this.element(); | ||||
|  | ||||
| //		this.getElement('custom').innerHTML = ''; | ||||
| //		MochiKit.Style.hideElement(this.getElement('custom')); | ||||
|  | ||||
| 		this.hideProgressBar(); | ||||
| 		MochiKit.DOM.removeElementClass(element, 'ios-overlay-show'); | ||||
| 		MochiKit.DOM.addElementClass(element, 'ios-overlay-hide'); | ||||
| 		return MochiKit.Async.callLater(secondsBeforeHiding, MochiKit.Style.hideElement, element); | ||||
| //		return MochiKit.Async.callLater(secondsBeforeHiding, MochiKit.Style.hideElement, element); | ||||
| 		return MochiKit.Async.callLater(secondsBeforeHiding, MochiKit.Base.method(this, 'hideElement')); | ||||
| 	}, | ||||
|  | ||||
| 	'hideElement': function () { | ||||
| 		this.getElement('custom').innerHTML = ''; | ||||
| 		MochiKit.Style.hideElement(this.element()) | ||||
| 	}, | ||||
|  | ||||
| 	'hideSpinner': function () { | ||||
|   | ||||
| @@ -83,7 +83,7 @@ Clipperz.PM.UI.MainController = function() { | ||||
| 		'matchMediaQuery', 'unmatchMediaQuery', | ||||
| 		'selectAllCards', 'selectRecentCards', 'selectCardsWithCertificate', 'selectCardsWithAttachments', 'selectUntaggedCards', 'tagSelected', 'search', | ||||
| 		'refreshCardEditDetail', | ||||
| 		'saveCardEdits', 'cancelCardEdits', | ||||
| 		'saveCardEdits', 'cancelCardEdits', 'copyFieldValueFeedback', | ||||
| 		'selectCard', | ||||
| 		'addCardClick', | ||||
| 		'deleteCard', 'toggleArchiveCard', 'cloneCard', 'editCard',	//	'createCertificate', | ||||
| @@ -2620,6 +2620,13 @@ console.log("showCertificateCard_handler"); | ||||
| 		return deferredResult; | ||||
| 	}, | ||||
|  | ||||
| 	copyFieldValueFeedback_handler: function () { | ||||
| //		this.overlay().show("copy", true); | ||||
| //		MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.overlay(), 'hide', true)); | ||||
| 		this.overlay().show("copying …", true); | ||||
| 		this.overlay().customResult('copy', "copied", 0.5); | ||||
| 	}, | ||||
|  | ||||
| 	uploadMessageCallback: function (someArguments, aProgressCallback) { | ||||
| 		var deferredResult; | ||||
|  | ||||
|   | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -101,6 +101,10 @@ div.overlay { | ||||
| 		font-size: 96pt; | ||||
| 		color: white; | ||||
| 		text-shadow: none; | ||||
| 		 | ||||
| 		&.custom { | ||||
| 			font-size: 80pt; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	&.ios-overlay-show { | ||||
|   | ||||
| @@ -436,6 +436,7 @@ $cardViewBasePadding: 10px; | ||||
| //				line-height: 1em; | ||||
| //				height: 1.3em; | ||||
| 				outline: none; | ||||
| 				cursor: pointer; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Giulio Cesare Solaroli
					Giulio Cesare Solaroli