Merge pull request #1432 from manfer/enhance-copy-clipboard

Enhance copy clipboard
release/v1.15
无闻 2015-08-04 08:51:06 +08:00
commit 96c1ce9606
5 changed files with 129 additions and 47 deletions

View File

@ -33,6 +33,8 @@ golang.org/x/net = commit:937a34c9de13
golang.org/x/text = commit:5b2527008a4c golang.org/x/text = commit:5b2527008a4c
gopkg.in/ini.v1 = commit:caf3f03ad9 gopkg.in/ini.v1 = commit:caf3f03ad9
gopkg.in/redis.v2 = commit:e617904962 gopkg.in/redis.v2 = commit:e617904962
github.com/hashicorp/go-version = commit:999359b6b7
github.com/mssola/user_agent = commit:f659b98638
[res] [res]
include = etc|public|scripts|templates include = etc|public|scripts|templates

View File

@ -16,6 +16,14 @@ import (
"github.com/gogits/gogs/modules/git" "github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting" "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 { func ApiRepoAssignment() macaron.Handler {
@ -345,6 +353,24 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
ctx.Data["BranchName"] = ctx.Repo.BranchName ctx.Data["BranchName"] = ctx.Repo.BranchName
ctx.Data["CommitId"] = ctx.Repo.CommitId 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))
} }
} }

View File

@ -269,36 +269,62 @@ var Gogits = {};
if ($(selector).hasClass('js-copy-bind')) { if ($(selector).hasClass('js-copy-bind')) {
return; return;
} }
$(selector).zclip({
path: "/js/ZeroClipboard.swf", if ( document.documentElement.classList.contains("is-copy-enabled") ) {
copy: function () {
var t = $(this).data("copy-val"); $(selector).click(function(event) {
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); 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 () { setTimeout(function () {
$this.tooltip("show"); $this.tipsy("show");
}, 200); }, 200);
setTimeout(function () { setTimeout(function () {
$this.tooltip('hide') $this.tipsy('hide').attr('original-title', $this.data('original-title'));
.attr('data-original-title', 'Copy to Clipboard'); }, 2000);
}, 3000);
} this.blur();
}).addClass("js-copy-bind"); 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 // api working

View File

@ -333,25 +333,17 @@ var Gogs = {};
if ($(selector).hasClass('js-copy-bind')) { if ($(selector).hasClass('js-copy-bind')) {
return; return;
} }
$(selector).zclip({
path: Gogs.AppSubUrl + "/js/ZeroClipboard.swf", if ( document.documentElement.classList.contains("is-copy-enabled") ) {
copy: function () {
var t = $(this).data("copy-val"); $(selector).click(function(event) {
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); 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')); $this.tipsy("hide").attr('original-title', $this.data('after-title'));
setTimeout(function () { setTimeout(function () {
$this.tipsy("show"); $this.tipsy("show");
@ -359,8 +351,44 @@ var Gogs = {};
setTimeout(function () { setTimeout(function () {
$this.tipsy('hide').attr('original-title', $this.data('original-title')); $this.tipsy('hide').attr('original-title', $this.data('original-title'));
}, 2000); }, 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); })(jQuery);

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html{{if .BrowserSupportsCopy}} class="is-copy-enabled"{{end}}>
<head data-suburl="{{AppSubUrl}}"> <head data-suburl="{{AppSubUrl}}">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/>