diff options
Diffstat (limited to 'doc/_extensions/odoo_ext/static/doc.js')
| -rw-r--r-- | doc/_extensions/odoo_ext/static/doc.js | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/doc/_extensions/odoo_ext/static/doc.js b/doc/_extensions/odoo_ext/static/doc.js new file mode 100644 index 00000000000..7d86eded5c0 --- /dev/null +++ b/doc/_extensions/odoo_ext/static/doc.js @@ -0,0 +1,343 @@ +(function ($) { + + $(document).ready(function () { + + // ======= Define variables ======= + // ================================= + // -- Screen resolutions + var screen_md = 992; + + // -- Window, window's properties + var $win = $(window), + win_w = $win.width(); + + // -- Main elements + var $body = $('body'), + $header = $body.find('> header'), + $sub_nav = $header.find(".o_sub_nav"); + $wrap = $body.find('> #wrap'), + $card_top = $wrap.find('> .card.top'), + $card_top_t = $card_top.find('> .container'), + $main = $wrap.find('main'), + $footer = $body.find('> footer'); + + // -- Floating action + var $mask = $body.find('#mask'), + $float = $body.find("#floating_action"), + $float_menu = $body.find("#floating_action_menu"); + + // -- Elements' heights + var body_h = $body.height(), + header_h = $header.outerHeight(), + sub_nav_h = $sub_nav.height(); + + // -- Aside + var $aside = $main.find('aside'), + has_aside = $aside.length > 0, + $aside_nav = undefined; + aside_links = undefined; + + if (has_aside) { + $aside_nav = $aside.find('> .navbar-aside'); + aside_links = $aside_nav.find("li > a"); + } + + // ======= Affix ================= + // =============================== + function set_affix(body_h) { + var aside_offset = $aside.offset().top - sub_nav_h, + aside_width = $aside.width(), + main_bottom = 40; + + $aside_nav.css('width', aside_width); + $aside_nav.affix({ + target: window, + offset: { + top : aside_offset, + bottom : main_bottom + } + }); + }; + + // ======= Footer animations ===== + // =============================== + var footer_animation = function () { + var footer_effect = $main.outerHeight() >= $win.outerHeight(); + + if (!footer_effect) { + footer_stop(); + return; + }; + + $footer.toggleClass('o_footer_effect', footer_effect); + $body.css('padding-bottom', $footer.outerHeight()); + + var checkIfSearch = function(e) { + if ((e.ctrlKey || e.metaKey) && String.fromCharCode(e.which).toLowerCase() === 'f') { + footer_stop(); + } + }; + $win.on('keydown.footer', function(e) { + checkIfSearch(e); + }); + }; + + var footer_stop = function() { + $footer.removeClass('o_footer_effect'); + $body.css('padding-bottom', 0); + $win.off('keydown.footer'); + }; + + + // ======= Docs Functions ========== + // ================================= + // -- Layouting + var layouting = function () { + if ($main.hasClass("index")) { + $main.find("#index .index-tree > .row").each(function() { + var childs = $(this).find(".col-md-3"); + if (childs.length == 2) { + childs.removeClass("col-md-3").addClass("col-md-6"); + } + if (childs.length == 3) { + childs.removeClass("col-md-3").addClass("col-md-4"); + } + }) + $(".floating_action_container").remove(); + } + if (has_aside) { $aside_nav.find("li").has("ul").addClass("parent"); }; + } + + // -- Float action menu + var floating_menu_layout = function() { + var lis = $aside_nav.find("> ul > li").clone(true) + .addClass("ripple") + .css({ + position: 'relative', + overflow: 'hidden' + }); + lis.find("ul").remove().end() + .find("a").removeClass("ripple").on("click", function() { + floating_menu_toggle(); + }); + $float_menu.find(".content").empty().append(lis); + $float.add($mask).on("click", function () { + floating_menu_toggle(); + return false; + }); + } + var floating_menu_toggle = function() { + $float.toggleClass("active"); + setTimeout(function() { + $float_menu.toggleClass("active"); + $mask.toggleClass("active"); + }, 300); + }; + + // -- Scroll To + var scroll_to = function(el_list) { + var offset = 80; + el_list.each(function() { + var $link = $(this), + href = $link.attr("href"); + + $link.on("click", function() { + var val = $(href).offset().top - 60; + $('html, body').animate({ + scrollTop: val + }, 400); + $aside_nav.find("li").removeClass("active"); + $link.parents("li").addClass("active"); + window.location.hash = $link.prop('hash'); + return false; + }) + }) + } + + // -- Ripple buttons + var ripple_animation = function(el_list) { + el_list.each(function() { + var btn = $(this); + btn + .css({ + position: 'relative', + overflow: 'hidden' + }) + .bind('mousedown', function(e) { + var ripple; + if (btn.find('.inner-ripple').length === 0) { + ripple = $('<span class="inner-ripple"/>'); + btn.prepend(ripple); + } else { + ripple = btn.find('.inner-ripple'); + } + ripple.removeClass('inner-ripple-animated'); + + if (!ripple.height() && !ripple.width()) { + var diameter = Math.max(btn.outerWidth(), btn.outerHeight()); + ripple.css({ + height: diameter, + width: diameter + }); + } + var x = e.pageX - btn.offset().left - ripple.width() / 2; + var y = e.pageY - btn.offset().top - ripple.height() / 2; + ripple.css({ + top: y + 'px', + left: x + 'px' + }).addClass('inner-ripple-animated'); + setTimeout(function() { + ripple.removeClass('inner-ripple-animated'); + }, 351); + }); + }); + }; + + // -- Cards animation + var cards_animate = function(type, speed) { + type = type || 'in'; + speed = speed || 2000; + var $container = $("main.index"), + $cards = $container.find(".card"), + $titles = $container.find("h2"); + + $cards.each(function() { + var $card = $(this), + cardOffset = this.getBoundingClientRect(), + offset = cardOffset.left * 0.8 + cardOffset.top, + delay = parseFloat(offset / speed).toFixed(2); + $card.css("transition-delay", delay + "s"); + }); + + if (type === "in") { + $titles.fadeTo(0, 0); + $titles.fadeTo(1000, 1); + $container.addClass("animating"); + } else { + $titles.fadeTo(300, 0); + $container.removeClass("animating"); + } + }; + + // -- Header buttons + var header_buttons = function () { + var timer; + $header.on('click', '.o_primary_nav .dropdown-toggle', function(e) { + e.preventDefault(); + + var $a = $(this); + clearTimeout(timer); + + $a.parent().toggleClass('open'); + $a.closest('ul').toggleClass('o_sub_opened', $a.parent().hasClass('open')); + if ($a.closest('.o_primary_nav').children('.open').length > 0) { + $header.addClass("o_sub_opened"); + } else { + timer = setTimeout(function() { + $header.removeClass("o_sub_opened"); + }, 200); + } + }); + $header.on('click', '.o_primary_nav .o_secondary_nav', function(e) { + if (e.target === e.currentTarget) { + $header.find('.open').removeClass('open'); + $header.find('.o_sub_opened').andSelf().removeClass('o_sub_opened'); + } + }); + + // -- Mobile menu opening + $header.on('click', '.o_mobile_menu_toggle', function(e) { + e.preventDefault(); + $(this).find('i').toggleClass('fa-bars fa-times'); + $header.toggleClass('o_mobile_menu_opened'); + }); + }; + + var card_top_animation = function (win_top){ + var scrollFactor = 1.6, + bannerHeight = Math.max(450, $card_top.outerHeight(true) - 60), + top = Math.min(win_top, bannerHeight/scrollFactor), + base_value = top * (scrollFactor - 1), + opacity = top/bannerHeight * scrollFactor; + + $card_top.css('transform', 'translateY(' + base_value + 'px)'); + $card_top_t.css({ + 'transform' : 'translateY( -' + ( base_value - (top/2)) + 'px)', + 'opacity' : 1 - opacity + }); + } + + $(".content-switcher").each(function(index, switcher) { + var $switcher = $(switcher), + $links = $switcher.find('> ul > li'), + $tabs = $switcher.find('> .tabs > *'), + $all = $links.add($tabs); + + function select(index) { + $all.removeClass('active'); + $links.eq(index).add($tabs.eq(index)).addClass('active'); + } + select(0); + $switcher.on('click', '> ul > li', function() { + select($(this).index()); + return false; + }); + }); + + // ======= Onload ================== + // ================================= + // -- Call default functions + layouting(); + cards_animate(); + header_buttons(); + ripple_animation($(".ripple")); + + if (has_aside) { + floating_menu_layout(); + scroll_to(aside_links); + ripple_animation(aside_links); + } + + // -- Conditionally call specific functions according to resolution + if (win_w >= screen_md){ + footer_animation(); + + if (has_aside) { + $win.load(function (){ + // wait until page load before affix + body_h = $body.height(); + set_affix(body_h); + }) + } + }; + + // ======= On resize ============== + // ================================ + // Update properties and conditionally call functions according to resolution + $win.on('resize', function () { + win_w = $win.width(); + body_h = $body.height(); + + if (win_w >= screen_md){ + footer_animation(); + if (has_aside) { set_affix(body_h); }; + } else { + footer_stop(); + }; + }); + + // ======= On scroll ============== + // ================================ + $win.on('scroll', function () { + if (win_w >= screen_md) { + var win_top = $win.scrollTop(); + header_h = $header.outerHeight(); + + $header.toggleClass('o_scrolled', win_top > header_h); + card_top_animation(win_top); + } else { + $card_top.css('transform', ''); + } + }); + }); +})(jQuery); |
