summaryrefslogtreecommitdiff
path: root/addons/website_twitter/static/src/js
diff options
context:
space:
mode:
authorThibault Delavallée <tde@openerp.com>2014-04-11 15:40:52 +0200
committerThibault Delavallée <tde@openerp.com>2014-04-11 15:40:52 +0200
commite51049e8edcf34bfbbdf060145acffc82dc18a62 (patch)
treeb58244aa2b6ce7804c28d8f0b5ad3eba49cccbb8 /addons/website_twitter/static/src/js
parentcd4afee17e77d5d5de8dc27f7dbe56be6d8fe7a2 (diff)
parentd04ee666ccb0c35bd1c13d9814fdb52f1159e7e9 (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.js144
-rw-r--r--addons/website_twitter/static/src/js/website.twitter.editor.js51
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();
+ },
+ });
+
+})();