aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author无闻 <u@gogs.io>2015-08-04 08:51:06 +0800
committer无闻 <u@gogs.io>2015-08-04 08:51:06 +0800
commit96c1ce960602d65252fbb038e10db629f235936d (patch)
tree8970c3fe3c95ec93562b1b3ff6e51b6b27fe2fe6
parent8e8d535e233966acd1510df78c01e11dc8156514 (diff)
parenteebcbf9d3438a9910dee56fd76ab624726eb207c (diff)
downloadgitea-96c1ce960602d65252fbb038e10db629f235936d.tar.gz
gitea-96c1ce960602d65252fbb038e10db629f235936d.zip
Merge pull request #1432 from manfer/enhance-copy-clipboard
Enhance copy clipboard
-rw-r--r--.gopmfile2
-rw-r--r--modules/middleware/repo.go26
-rw-r--r--public/js/app.js78
-rw-r--r--public/ng/js/gogs.js68
-rw-r--r--templates/ng/base/head.tmpl2
5 files changed, 129 insertions, 47 deletions
diff --git a/.gopmfile b/.gopmfile
index 0a70ccceee..d4cd970179 100644
--- a/.gopmfile
+++ b/.gopmfile
@@ -33,6 +33,8 @@ golang.org/x/net = commit:937a34c9de13
golang.org/x/text = commit:5b2527008a4c
gopkg.in/ini.v1 = commit:caf3f03ad9
gopkg.in/redis.v2 = commit:e617904962
+github.com/hashicorp/go-version = commit:999359b6b7
+github.com/mssola/user_agent = commit:f659b98638
[res]
include = etc|public|scripts|templates
diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go
index a200d6d66f..e8a362bd4d 100644
--- a/modules/middleware/repo.go
+++ b/modules/middleware/repo.go
@@ -16,6 +16,14 @@ import (
"github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
+
+ "github.com/hashicorp/go-version"
+ "github.com/mssola/user_agent"
+)
+
+const (
+ FIREFOX_COPY_SUPPORT = "41.0"
+ CHROME_COPY_SUPPORT = "43.0.2356"
)
func ApiRepoAssignment() macaron.Handler {
@@ -345,6 +353,24 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
ctx.Data["BranchName"] = ctx.Repo.BranchName
ctx.Data["CommitId"] = ctx.Repo.CommitId
+
+ userAgent := ctx.Req.Header.Get("User-Agent")
+ ua := user_agent.New(userAgent);
+ browserName, browserVer := ua.Browser()
+
+ sliceVer := strings.Split(browserVer, ".")
+ var max int
+ if max = len(sliceVer); 3 < max {
+ max = 3
+ }
+ browserVer = strings.Join(sliceVer[:max], ".")
+
+ browserVersion, err := version.NewVersion(browserVer)
+ chromeConstraint, err := version.NewConstraint(">= " + CHROME_COPY_SUPPORT)
+ firefoxConstraint, err := version.NewConstraint(">= " + FIREFOX_COPY_SUPPORT)
+
+ ctx.Data["BrowserSupportsCopy"] = (browserName == "Chrome" && chromeConstraint.Check(browserVersion)) || (browserName == "Firefox" && firefoxConstraint.Check(browserVersion))
+
}
}
diff --git a/public/js/app.js b/public/js/app.js
index 6208dbedc8..3dbf29c144 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -269,36 +269,62 @@ var Gogits = {};
if ($(selector).hasClass('js-copy-bind')) {
return;
}
- $(selector).zclip({
- path: "/js/ZeroClipboard.swf",
- copy: function () {
- var t = $(this).data("copy-val");
- var to = $($(this).data("copy-from"));
- var str = "";
- if (t == "txt") {
- str = to.text();
- }
- if (t == 'val') {
- str = to.val();
- }
- if (t == 'html') {
- str = to.html();
- }
- return str;
- },
- afterCopy: function () {
+
+ if ( document.documentElement.classList.contains("is-copy-enabled") ) {
+
+ $(selector).click(function(event) {
var $this = $(this);
- $this.tooltip('hide')
- .attr('data-original-title', 'Copied OK');
+
+ var cfrom = $this.attr('data-copy-from');
+ $(cfrom).select();
+ document.execCommand('copy');
+ getSelection().removeAllRanges();
+
+ $this.tipsy("hide").attr('original-title', $this.data('after-title'));
setTimeout(function () {
- $this.tooltip("show");
+ $this.tipsy("show");
}, 200);
setTimeout(function () {
- $this.tooltip('hide')
- .attr('data-original-title', 'Copy to Clipboard');
- }, 3000);
- }
- }).addClass("js-copy-bind");
+ $this.tipsy('hide').attr('original-title', $this.data('original-title'));
+ }, 2000);
+
+ this.blur();
+ return;
+ });
+
+ $(selector).addClass("js-copy-bind");
+
+ } else {
+
+ $(selector).zclip({
+ path: Gogs.AppSubUrl + "/js/ZeroClipboard.swf",
+ copy: function () {
+ var t = $(this).data("copy-val");
+ var to = $($(this).data("copy-from"));
+ var str = "";
+ if (t == "txt") {
+ str = to.text();
+ }
+ if (t == 'val') {
+ str = to.val();
+ }
+ if (t == 'html') {
+ str = to.html();
+ }
+ return str;
+ },
+ afterCopy: function () {
+ var $this = $(this);
+ $this.tipsy("hide").attr('original-title', $this.data('after-title'));
+ setTimeout(function () {
+ $this.tipsy("show");
+ }, 200);
+ setTimeout(function () {
+ $this.tipsy('hide').attr('original-title', $this.data('original-title'));
+ }, 2000);
+ }
+ }).addClass("js-copy-bind");
+ }
}
// api working
diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js
index 7ffef8af8b..38b34c6152 100644
--- a/public/ng/js/gogs.js
+++ b/public/ng/js/gogs.js
@@ -333,25 +333,17 @@ var Gogs = {};
if ($(selector).hasClass('js-copy-bind')) {
return;
}
- $(selector).zclip({
- path: Gogs.AppSubUrl + "/js/ZeroClipboard.swf",
- copy: function () {
- var t = $(this).data("copy-val");
- var to = $($(this).data("copy-from"));
- var str = "";
- if (t == "txt") {
- str = to.text();
- }
- if (t == 'val') {
- str = to.val();
- }
- if (t == 'html') {
- str = to.html();
- }
- return str;
- },
- afterCopy: function () {
+
+ if ( document.documentElement.classList.contains("is-copy-enabled") ) {
+
+ $(selector).click(function(event) {
var $this = $(this);
+
+ var cfrom = $this.attr('data-copy-from');
+ $(cfrom).select();
+ document.execCommand('copy');
+ getSelection().removeAllRanges();
+
$this.tipsy("hide").attr('original-title', $this.data('after-title'));
setTimeout(function () {
$this.tipsy("show");
@@ -359,8 +351,44 @@ var Gogs = {};
setTimeout(function () {
$this.tipsy('hide').attr('original-title', $this.data('original-title'));
}, 2000);
- }
- }).addClass("js-copy-bind");
+
+ this.blur();
+ return;
+ });
+
+ $(selector).addClass("js-copy-bind");
+
+ } else {
+
+ $(selector).zclip({
+ path: Gogs.AppSubUrl + "/js/ZeroClipboard.swf",
+ copy: function () {
+ var t = $(this).data("copy-val");
+ var to = $($(this).data("copy-from"));
+ var str = "";
+ if (t == "txt") {
+ str = to.text();
+ }
+ if (t == 'val') {
+ str = to.val();
+ }
+ if (t == 'html') {
+ str = to.html();
+ }
+ return str;
+ },
+ afterCopy: function () {
+ var $this = $(this);
+ $this.tipsy("hide").attr('original-title', $this.data('after-title'));
+ setTimeout(function () {
+ $this.tipsy("show");
+ }, 200);
+ setTimeout(function () {
+ $this.tipsy('hide').attr('original-title', $this.data('original-title'));
+ }, 2000);
+ }
+ }).addClass("js-copy-bind");
+ }
}
})(jQuery);
diff --git a/templates/ng/base/head.tmpl b/templates/ng/base/head.tmpl
index 6d5001a9cb..faafef563a 100644
--- a/templates/ng/base/head.tmpl
+++ b/templates/ng/base/head.tmpl
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html>
+<html{{if .BrowserSupportsCopy}} class="is-copy-enabled"{{end}}>
<head data-suburl="{{AppSubUrl}}">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>