Enhance copy clipboardtags/v1.21.12.1
| @@ -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 | ||||
| @@ -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)) | |||||
| } | } | ||||
| } | } | ||||
| @@ -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", | |||||
| 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 $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') | |||||
| .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 | // api working | ||||
| @@ -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", | |||||
| 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 $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); | ||||
| @@ -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"/> | ||||