diff options
| author | Thibault Delavallée <tde@openerp.com> | 2014-04-11 15:40:52 +0200 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2014-04-11 15:40:52 +0200 |
| commit | e51049e8edcf34bfbbdf060145acffc82dc18a62 (patch) | |
| tree | b58244aa2b6ce7804c28d8f0b5ad3eba49cccbb8 /addons/website_twitter/static/src/js | |
| parent | cd4afee17e77d5d5de8dc27f7dbe56be6d8fe7a2 (diff) | |
| parent | d04ee666ccb0c35bd1c13d9814fdb52f1159e7e9 (diff) | |
[MERGE] Sync with upstream
bzr revid: tde@openerp.com-20140411134052-x74otuwuxoz20qab
Diffstat (limited to 'addons/website_twitter/static/src/js')
| -rw-r--r-- | addons/website_twitter/static/src/js/website.twitter.animation.js | 144 | ||||
| -rw-r--r-- | addons/website_twitter/static/src/js/website.twitter.editor.js | 51 |
2 files changed, 195 insertions, 0 deletions
diff --git a/addons/website_twitter/static/src/js/website.twitter.animation.js b/addons/website_twitter/static/src/js/website.twitter.animation.js new file mode 100644 index 00000000000..bb19fd5e66a --- /dev/null +++ b/addons/website_twitter/static/src/js/website.twitter.animation.js @@ -0,0 +1,144 @@ +(function () { + 'use strict'; + var website = openerp.website, + qweb = openerp.qweb; + + qweb.add_template('/website_twitter/static/src/xml/website.twitter.xml'); + if (!website.snippet) website.snippet = {}; + website.snippet.animationRegistry.twitter = website.snippet.Animation.extend({ + selector: ".twitter", + start: function () { + var self = this; + var timeline = this.$target.find(".twitter_timeline"); + + this.$target.on('click', '.twitter_timeline .tweet', function($event) { + if ($event.target.tagName.toLowerCase() !== "a") { + var url = $($event.currentTarget).data('url'); + if (url) { + window.open(url, '_blank'); + } + else { + debugger; + } + } + }); + $("<center><div><img src='/website_twitter/static/src/img/loadtweet.gif'></div></center>").appendTo(timeline); + openerp.jsonRpc('/get_favorites','call', {}).then(function(data) { + self.$target.find(".twitter_timeline").empty(); + if (data.error) { + self.error(data); + } + else { + self.render(data); + self.setupMouseEvents(); + } + }); + }, + stop: function() { + $(this).find('.scrollWrapper').each(function(index, el){ + self.stop_scrolling($(el)); + }); + this.clearMouseEvents(); + }, + error: function(data){ + var $error = $(qweb.render("website.Twitter.Error", {'data': data})); + $error.appendTo(this.$target.find(".twitter_timeline")); + }, + parse_tweet: function (tweet) { + var create_link = function (url, text) { + var c = $("<a>", { + text: text, + href: url, + target: "_blank" + }); + return c.prop("outerHTML"); + }; + return tweet.text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, + function (url) { return create_link(url, url) }) + .replace(/[@]+[A-Za-z0-9_]+/g, + function (screen_name) { return create_link("http://twitter.com/" + screen_name.replace("@",""), screen_name); }) + .replace(/[#]+[A-Za-z0-9_]+/g, + function (hashtag) { return create_link("http://twitter.com/search?q="+hashtag.replace("#",""), hashtag); }); + }, + parse_date: function(tweet) { + var d = new Date(tweet.created_at); + return d.toDateString(); + }, + setupMouseEvents: function() { + var self = this; + this.$scroller.mouseenter(function() { + $(this).find('.scrollWrapper').each(function(index, el){ + self.stop_scrolling($(el)); + }); + }).mouseleave(function() { + $(this).find('.scrollWrapper').each(function(index, el){ + self.start_scrolling($(el)); + }); + }); + }, + clearMouseEvents: function() { + if (this.$scroller) { + this.$scroller.off('mouseenter') + .off('mouseleave'); + } + }, + render: function(data){ + var self = this; + var timeline = this.$target.find(".twitter_timeline"); + var tweets = []; + $.each(data, function (e, tweet) { + tweet.created_at = self.parse_date(tweet); + tweet.text = self.parse_tweet(tweet); + tweets.push(qweb.render("website.Twitter.Tweet", {'tweet': tweet})); + }); + + var f = Math.floor(tweets.length / 3); + var tweet_slice = [tweets.slice(0, f).join(" "), tweets.slice(f, f * 2).join(" "), tweets.slice(f * 2, tweets.length).join(" ")]; + + this.$scroller = $(qweb.render("website.Twitter.Scroller")); + this.$scroller.appendTo(this.$target.find(".twitter_timeline")); + this.$scroller.find("div[id^='scroller']").each(function(index, element){ + var scrollWrapper = $('<div class="scrollWrapper"></div>'); + var scrollableArea = $('<div class="scrollableArea"></div>'); + scrollWrapper.append(scrollableArea) + .data('scrollableArea', scrollableArea); + scrollableArea.append(tweet_slice[index]); + $(element).append(scrollWrapper); + scrollableArea.width(self.get_wrapper_width(scrollableArea)); + scrollWrapper.scrollLeft(index*180); + self.start_scrolling(scrollWrapper); + }); + }, + get_wrapper_width: function(wrapper){ + var total_width = 0; + wrapper.children().each(function(){ + total_width += $(this).outerWidth(true); + }); + return total_width; + }, + start_scrolling: function(wrapper){ + var self = this; + wrapper.data("getNextElementWidth", true); + wrapper.data("autoScrollingInterval", setInterval(function () { + wrapper.scrollLeft(wrapper.scrollLeft() + 1); + self.swap_right(wrapper); + }, 20)); + }, + stop_scrolling: function(wrapper){ + clearInterval(wrapper.data('autoScrollingInterval')); + }, + swap_right: function(wrapper){ + if (wrapper.data("getNextElementWidth")) { + wrapper.data("swapAt", wrapper.data("scrollableArea").children(":first").outerWidth(true)); + wrapper.data("getNextElementWidth", false); + } + if (wrapper.data("swapAt") <= wrapper.scrollLeft()){ + var swap_el = wrapper.data("scrollableArea").children(":first").detach(); + wrapper.data("scrollableArea").append(swap_el); + wrapper.scrollLeft(wrapper.scrollLeft() - swap_el.outerWidth(true)); + wrapper.data("getNextElementWidth", true); + } + }, + }); + +})(); diff --git a/addons/website_twitter/static/src/js/website.twitter.editor.js b/addons/website_twitter/static/src/js/website.twitter.editor.js new file mode 100644 index 00000000000..69a1896695a --- /dev/null +++ b/addons/website_twitter/static/src/js/website.twitter.editor.js @@ -0,0 +1,51 @@ +(function () { + 'use strict'; + var website = openerp.website, + qweb = openerp.qweb; + + website.snippet.options["twitter"] = website.snippet.options.marginAndResize.extend({ + start: function(){ + this._super(); + this.make_hover_config(); + this.$target.find('.lnk_configure').click(function(e){ + window.location = e.target.href; + }); + if (this.$target.data("snippet-view")) { + this.$target.data("snippet-view").stop(); + } + }, + twitter_reload: function(){ + openerp.jsonRpc('/twitter_reload','call', {}); + }, + make_hover_config: function(){ + var self = this; + var $configuration = $(qweb.render("website.Twitter.Reload")).hide().appendTo(document.body).click(function (e) { + e.preventDefault(); + e.stopPropagation(); + self.twitter_reload(); + }); + this.$target.on('mouseover', '', function () { + var $selected = $(this); + var position = $selected.offset(); + $configuration.show().offset({ + top: $selected.outerHeight() / 2 + + position.top + - $configuration.outerHeight() / 2, + left: $selected.outerWidth() / 2 + + position.left + - $configuration.outerWidth() / 2, + }) + }).on('mouseleave', '', function (e) { + var current = document.elementFromPoint(e.clientX, e.clientY); + if (current === $configuration[0]) { + return; + } + $configuration.hide(); + }); + }, + clean_for_save: function () { + this.$target.find(".twitter_timeline").empty(); + }, + }); + +})(); |
