diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css
index 04338820881..e048b7564ac 100644
--- a/apps/files_sharing/css/sharetabview.css
+++ b/apps/files_sharing/css/sharetabview.css
@@ -10,8 +10,9 @@
top: 2px;
}
-.shareTabView .shareWithRemoteInfo {
- padding: 11px 20px;
+.shareTabView .shareWithRemoteInfo,
+.shareTabView .clipboardButton {
+ padding-left: 10px;
}
.shareTabView label {
@@ -28,7 +29,9 @@
width: 94%;
margin-left: 0;
}
-.shareTabView input[type="text"].shareWithField {
+.shareTabView input[type="text"].shareWithField,
+.shareTabView input[type="text"].emailField,
+.shareTabView input[type="text"].linkText {
width: 80%;
}
diff --git a/bower.json b/bower.json
index 74c4be96a21..3aa2cd4b3b2 100644
--- a/bower.json
+++ b/bower.json
@@ -30,6 +30,7 @@
"backbone": "~1.2.3",
"davclient.js": "https://github.com/evert/davclient.js.git",
"es6-promise": "https://github.com/jakearchibald/es6-promise.git#~2.3.0",
- "base64": "~0.3.0"
+ "base64": "~0.3.0",
+ "clipboard": "^1.5.12"
}
}
diff --git a/core/css/icons.css b/core/css/icons.css
index 22b699b97ec..1a632fdd58b 100644
--- a/core/css/icons.css
+++ b/core/css/icons.css
@@ -204,6 +204,10 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading-
background-image: url('../img/actions/mail.svg');
}
+.icon-mail-grey {
+ background-image: url('../img/actions/mail-grey.svg');
+}
+
.icon-menu {
background-image: url('../img/actions/menu.svg');
}
@@ -372,3 +376,7 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading-
.icon-picture {
background-image: url('../img/places/picture.svg');
}
+
+.icon-clippy {
+ background-image: url('../img/actions/clippy.svg');
+}
diff --git a/core/img/actions/clippy.svg b/core/img/actions/clippy.svg
new file mode 100644
index 00000000000..8fa5c89c349
--- /dev/null
+++ b/core/img/actions/clippy.svg
@@ -0,0 +1,3 @@
+
diff --git a/core/js/core.json b/core/js/core.json
index 03c72e9b3ff..5254e7b3d03 100644
--- a/core/js/core.json
+++ b/core/js/core.json
@@ -10,7 +10,8 @@
"bootstrap/js/tooltip.js",
"backbone/backbone.js",
"es6-promise/dist/es6-promise.js",
- "davclient.js/lib/client.js"
+ "davclient.js/lib/client.js",
+ "clipboard/dist/clipboard.js"
],
"libraries": [
"jquery-showpassword.js",
diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js
index 457a788d589..8ad2e270099 100644
--- a/core/js/sharedialoglinkshareview.js
+++ b/core/js/sharedialoglinkshareview.js
@@ -22,8 +22,11 @@
'' +
'' +
'
' +
+ '
' +
'
' +
'
' +
+ '
' +
+ '
' +
' {{#if publicUpload}}' +
'' +
'
' +
@@ -125,6 +128,38 @@
'onHideFileListChange',
'onAllowPublicUploadChange'
);
+
+ var clipboard = new Clipboard('.clipboardButton');
+ clipboard.on('success', function(e) {
+ $input = $(e.trigger);
+ $input.tooltip({placement: 'bottom', trigger: 'manual', title: t('core', 'Copied!')});
+ $input.tooltip('show');
+ _.delay(function() {
+ $input.tooltip('hide');
+ }, 3000);
+ });
+ clipboard.on('error', function (e) {
+ $input = $(e.trigger);
+ var actionMsg = '';
+ if (/iPhone|iPad/i.test(navigator.userAgent)) {
+ actionMsg = t('core', 'Not supported!');
+ } else if (/Mac/i.test(navigator.userAgent)) {
+ actionMsg = t('core', 'Press ⌘-C to copy.');
+ } else {
+ actionMsg = t('core', 'Press Ctrl-C to copy.');
+ }
+
+ $input.tooltip({
+ placement: 'bottom',
+ trigger: 'manual',
+ title: actionMsg
+ });
+ $input.tooltip('show');
+ _.delay(function () {
+ $input.tooltip('hide');
+ }, 3000);
+ });
+
},
onLinkCheckBoxChange: function() {
diff --git a/core/js/sharedialogmailview.js b/core/js/sharedialogmailview.js
index 84e3f3242ad..79741e92ac5 100644
--- a/core/js/sharedialogmailview.js
+++ b/core/js/sharedialogmailview.js
@@ -16,9 +16,9 @@
var TEMPLATE =
'{{#if shareAllowed}}' +
' {{#if mailPublicNotificationEnabled}}' +
- '
' +
' {{/if}}' +
'{{/if}}'
@@ -48,7 +48,7 @@
showLink: true,
events: {
- 'submit .emailPrivateLinkForm': '_onEmailPrivateLink'
+ 'click #emailButton': '_onEmailPrivateLink'
},
initialize: function(options) {
@@ -173,4 +173,4 @@
OC.Share.ShareDialogMailView = ShareDialogMailView;
-})();
\ No newline at end of file
+})();
diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js
index c17da94bab3..5637ffc3a0a 100644
--- a/core/js/sharedialogview.js
+++ b/core/js/sharedialogview.js
@@ -30,7 +30,7 @@
'
';
var TEMPLATE_REMOTE_SHARE_INFO =
- '
';
/**
diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js
index 23214a7fe86..f0e027d9fb9 100644
--- a/core/js/tests/specs/sharedialogviewSpec.js
+++ b/core/js/tests/specs/sharedialogviewSpec.js
@@ -444,7 +444,7 @@ describe('OC.Share.ShareDialogView', function() {
dialog.render();
dialog.$el.find('.emailPrivateLinkForm .emailField').val('a@b.c');
- dialog.$el.find('.emailPrivateLinkForm').trigger('submit');
+ dialog.$el.find('#emailButton').trigger('click');
expect(sendEmailPrivateLinkStub.callCount).toEqual(1);
expect(dialog.$el.find('.emailPrivateLinkForm .emailField').val()).toEqual('Sending ...');
@@ -463,7 +463,7 @@ describe('OC.Share.ShareDialogView', function() {
dialog.render();
dialog.$el.find('.emailPrivateLinkForm .emailField').val('a@b.c');
- dialog.$el.find('.emailPrivateLinkForm').trigger('submit');
+ dialog.$el.find('#emailButton').trigger('click');
expect(sendEmailPrivateLinkStub.callCount).toEqual(1);
expect(dialog.$el.find('.emailPrivateLinkForm .emailField').val()).toEqual('Sending ...');
diff --git a/core/vendor/.gitignore b/core/vendor/.gitignore
index 58a231c4bb4..5160c2a7f97 100644
--- a/core/vendor/.gitignore
+++ b/core/vendor/.gitignore
@@ -137,3 +137,7 @@ es6-promise/dist/*
# base64
base64/*min.js
+
+# clipboard
+clipboard/**
+!clipboard/dist/clipboard.js
diff --git a/core/vendor/clipboard/dist/clipboard.js b/core/vendor/clipboard/dist/clipboard.js
new file mode 100644
index 00000000000..040c5e005c3
--- /dev/null
+++ b/core/vendor/clipboard/dist/clipboard.js
@@ -0,0 +1,742 @@
+/*!
+ * clipboard.js v1.5.12
+ * https://zenorocha.github.io/clipboard.js
+ *
+ * Licensed MIT © Zeno Rocha
+ */
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Clipboard = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o