diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/website_twitter/static/src/js | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/website_twitter/static/src/js')
| -rw-r--r-- | addons/website_twitter/static/src/js/website.twitter.animation.js | 186 | ||||
| -rw-r--r-- | addons/website_twitter/static/src/js/website.twitter.editor.js | 68 |
2 files changed, 254 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 00000000..295ae199 --- /dev/null +++ b/addons/website_twitter/static/src/js/website.twitter.animation.js @@ -0,0 +1,186 @@ +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('<center><div><img src="/website_twitter/static/src/img/loadtweet.gif"></div></center>'); + 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 = $('<a/>', { + 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 = $('<div/>', {class: 'scrollWrapper'}); + var $scrollableArea = $('<div/>', {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'); + } + }, +}); +}); 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 00000000..bc9a38a4 --- /dev/null +++ b/addons/website_twitter/static/src/js/website.twitter.editor.js @@ -0,0 +1,68 @@ +odoo.define('website_twitter.editor', function (require) { +'use strict'; + +var core = require('web.core'); +var dom = require('web.dom'); +var sOptions = require('web_editor.snippets.options'); + +var _t = core._t; + +sOptions.registry.twitter = sOptions.Class.extend({ + /** + * @override + */ + start: function () { + var self = this; + var $configuration = dom.renderButton({ + attrs: { + class: 'btn-primary d-none', + contenteditable: 'false', + }, + text: _t("Reload"), + }); + $configuration.appendTo(document.body).on('click', function (ev) { + ev.preventDefault(); + ev.stopPropagation(); + self._rpc({route: '/website_twitter/reload'}); + }); + this.$target.on('mouseover.website_twitter', function () { + var $selected = $(this); + var position = $selected.offset(); + $configuration.removeClass('d-none').offset({ + top: $selected.outerHeight() / 2 + + position.top + - $configuration.outerHeight() / 2, + left: $selected.outerWidth() / 2 + + position.left + - $configuration.outerWidth() / 2, + }); + }).on('mouseleave.website_twitter', function (e) { + var current = document.elementFromPoint(e.clientX, e.clientY); + if (current === $configuration[0]) { + return; + } + $configuration.addClass('d-none'); + }); + this.$target.on('click.website_twitter', '.lnk_configure', function (e) { + window.location = e.currentTarget.href; + }); + this.trigger_up('widgets_stop_request', { + $target: this.$target, + }); + return this._super.apply(this, arguments); + }, + /** + * @override + */ + cleanForSave: function () { + this.$target.find('.twitter_timeline').empty(); + }, + /** + * @override + */ + destroy: function () { + this._super.apply(this, arguments); + this.$target.off('.website_twitter'); + }, +}); +}); |
