odoo.define('website_twitter.animation', function (require) { 'use strict'; var core = require('web.core'); var publicWidget = require('web.public.widget'); var qweb = core.qweb; publicWidget.registry.twitter = publicWidget.Widget.extend({ selector: '.twitter', xmlDependencies: ['/website_twitter/static/src/xml/website.twitter.xml'], disabledInEditableMode: false, events: { 'mouseenter .wrap-row': '_onEnterRow', 'mouseleave .wrap-row': '_onLeaveRow', 'click .twitter_timeline .tweet': '_onTweetClick', }, /** * @override */ start: function () { var self = this; var $timeline = this.$('.twitter_timeline'); $timeline.append('
'); var def = this._rpc({route: '/website_twitter/get_favorites'}).then(function (data) { $timeline.empty(); if (data.error) { $timeline.append(qweb.render('website.Twitter.Error', {data: data})); return; } if (_.isEmpty(data)) { return; } var tweets = _.map(data, function (tweet) { // Parse tweet date if (_.isEmpty(tweet.created_at)) { tweet.created_at = ''; } else { var v = tweet.created_at.split(' '); var d = new Date(Date.parse(v[1]+' '+v[2]+', '+v[5]+' '+v[3]+' UTC')); tweet.created_at = d.toDateString(); } // Parse tweet text tweet.text = tweet.text .replace( /[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, function (url) { return _makeLink(url, url); } ) .replace( /[@]+[A-Za-z0-9_]+/g, function (screen_name) { return _makeLink('http://twitter.com/' + screen_name.replace('@', ''), screen_name); } ) .replace( /[#]+[A-Za-z0-9_]+/g, function (hashtag) { return _makeLink('http://twitter.com/search?q='+hashtag.replace('#',''), hashtag); } ); return qweb.render('website.Twitter.Tweet', {tweet: tweet}); function _makeLink(url, text) { var c = $('', { text: text, href: url, target: '_blank', rel: 'noreferrer noopener', }); return c.prop('outerHTML'); } }); var f = Math.floor(tweets.length / 3); var tweetSlices = [tweets.slice(0, f).join(' '), tweets.slice(f, f * 2).join(' '), tweets.slice(f * 2, tweets.length).join(' ')]; self.$scroller = $(qweb.render('website.Twitter.Scroller')).appendTo($timeline); _.each(self.$scroller.find('div[id^="scroller"]'), function (element, index) { var $scrollWrapper = $('
', {class: 'scrollWrapper'}); var $scrollableArea = $('
', {class: 'scrollableArea'}); $scrollWrapper.append($scrollableArea) .data('scrollableArea', $scrollableArea); $scrollableArea.append(tweetSlices[index]); $(element).append($scrollWrapper); var totalWidth = 0; _.each($scrollableArea.children(), function (area) { totalWidth += $(area).outerWidth(true); }); $scrollableArea.width(totalWidth); $scrollWrapper.scrollLeft(index*180); }); self._startScrolling(); }); return Promise.all([this._super.apply(this, arguments), def]); }, /** * @override */ destroy: function () { this._stopScrolling(); this._super.apply(this, arguments); }, //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- /** * @private */ _startScrolling: function () { if (!this.$scroller) { return; } _.each(this.$scroller.find('.scrollWrapper'), function (el) { var $wrapper = $(el); $wrapper.data('getNextElementWidth', true); $wrapper.data('autoScrollingInterval', setInterval(function () { $wrapper.scrollLeft($wrapper.scrollLeft() + 1); 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); } }, 20)); }); }, /** * @private */ _stopScrolling: function (wrapper) { if (!this.$scroller) { return; } _.each(this.$scroller.find('.scrollWrapper'), function (el) { var $wrapper = $(el); clearInterval($wrapper.data('autoScrollingInterval')); }); }, //-------------------------------------------------------------------------- // Handlers //-------------------------------------------------------------------------- /** * @private */ _onEnterRow: function () { this._stopScrolling(); }, /** * @private */ _onLeaveRow: function () { this._startScrolling(); }, /** * @private * @param {Event} ev */ _onTweetClick: function (ev) { if (ev.target.tagName === 'A') { return; } var url = $(ev.currentTarget).data('url'); if (url) { window.open(url, '_blank'); } }, }); });