summaryrefslogtreecommitdiff
path: root/doc/_extensions/odoo_ext/static/doc.js
diff options
context:
space:
mode:
Diffstat (limited to 'doc/_extensions/odoo_ext/static/doc.js')
-rw-r--r--doc/_extensions/odoo_ext/static/doc.js392
1 files changed, 227 insertions, 165 deletions
diff --git a/doc/_extensions/odoo_ext/static/doc.js b/doc/_extensions/odoo_ext/static/doc.js
index 7d86eded5c0..0424d8e0963 100644
--- a/doc/_extensions/odoo_ext/static/doc.js
+++ b/doc/_extensions/odoo_ext/static/doc.js
@@ -2,6 +2,15 @@
$(document).ready(function () {
+ // -- Initialize fallbacks for requestAnimationFrame
+ window.requestAnimationFrame = window.requestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || window.oRequestAnimationFrame
+ || function (callback) { setTimeout(callback, 10); };
+
+
// ======= Define variables =======
// =================================
// -- Screen resolutions
@@ -12,14 +21,33 @@
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');
+ var $body = $('body'),
+ $header = $body.find('> header'),
+ $sub_nav = $header.find(".o_sub_nav"),
+ $wrap = $body.find('> #wrap'),
+ $main = $wrap.find('main'),
+ $footer = $body.find('> footer');
+
+ // -- Detect page type
+ var page_type = (function () {
+ if ($wrap.hasClass('index')) {
+ return 'index';
+ } else if ($main.find('article').hasClass('doc-tocindex-category')){
+ return 'category-index';
+ } else {
+ return 'article';
+ }
+ })();
+
+ // -- CP > "Card Top"
+ var $cp = $wrap.find('> .card.top'),
+ $cp_image = $cp.find('> .card-img'),
+ $cp_text = $cp.find('> .container'),
+
+ cp_h = $cp.outerHeight(),
+ has_cp_image = $cp_image.length > 0,
+ cp_image_alpha = has_cp_image ? $cp_image.css('opacity') : undefined,
+ cp_end_point = has_cp_image ? cp_h/2 : undefined;
// -- Floating action
var $mask = $body.find('#mask'),
@@ -27,37 +55,34 @@
$float_menu = $body.find("#floating_action_menu");
// -- Elements' heights
- var body_h = $body.height(),
- header_h = $header.outerHeight(),
- sub_nav_h = $sub_nav.height();
+ var body_h = $body.height(),
+ header_h = $header.outerHeight(),
+ main_h = $main.height(),
+ sub_nav_h = $sub_nav.height();
// -- Aside
var $aside = $main.find('aside'),
has_aside = $aside.length > 0,
- $aside_nav = undefined;
- aside_links = undefined;
+ $aside_nav = has_aside ? $aside.find('> .navbar-aside') : undefined,
+ aside_links = has_aside ? $aside_nav.find("li > a") : 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,
+ function set_affix() {
+ var aside_offset_top = $aside.offset().top - sub_nav_h,
+ aside_offset_bot = parseInt($wrap.css('padding-bottom')),
+ aside_width = $aside.width();
+
+ $aside.css('height', main_h);
+ $aside_nav.css('width', aside_width).affix({
offset: {
- top : aside_offset,
- bottom : main_bottom
+ top : aside_offset_top,
+ bottom : aside_offset_bot,
}
});
- };
+ }
// ======= Footer animations =====
// ===============================
@@ -67,22 +92,22 @@
if (!footer_effect) {
footer_stop();
return;
- };
+ }
$footer.toggleClass('o_footer_effect', footer_effect);
$body.css('padding-bottom', $footer.outerHeight());
- var checkIfSearch = function(e) {
+ var checkIfSearch = function (e) {
if ((e.ctrlKey || e.metaKey) && String.fromCharCode(e.which).toLowerCase() === 'f') {
footer_stop();
}
};
- $win.on('keydown.footer', function(e) {
+ $win.on('keydown.footer', function (e) {
checkIfSearch(e);
});
};
- var footer_stop = function() {
+ var footer_stop = function () {
$footer.removeClass('o_footer_effect');
$body.css('padding-bottom', 0);
$win.off('keydown.footer');
@@ -92,24 +117,59 @@
// ======= 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");
+ var init = function () {
+ var $floating_container = $body.find("> .floating_action_container");
+
+ // Adapt Title font size according to its length
+ $cp_text
+ .toggleClass('o_short_title', $cp_text.text().trim().length < 15)
+ .toggleClass('o_long_title', $cp_text.text().trim().length > 45);
+
+ if (page_type == 'index') {
+ var half_cols_selector = '.tutorials,.api';
+
+ $main.find("#index .index-tree").find(half_cols_selector)
+ .wrap('<div class="o_half_col col-sm-6"/>')
+ .find('.col-md-3').removeClass('col-md-3 col-sm-6').addClass('col-sm-12 col-md-6');
+
+ var half_cols_els = $main.find(".o_half_col");
+ for(var i = 0; i < half_cols_els.length; i+=2) {
+ half_cols_els.slice(i, i+2).wrapAll("<div class='row'></div>");
+ }
+ }
+
+ if (page_type == 'index' || page_type == 'category-index') {
+ $floating_container.add($mask).remove();
+ $main.toggleClass('o_slim_page', page_type == 'category-index');
+ }
+
+ if (page_type == 'article') {
+ attach_permalink_markers();
+
+ // Hide empty-permalink first sections
+ var $f_s = $main.find('article.doc-body > section:first-child');
+ $f_s.toggleClass('hidden', $f_s[0].childElementCount == 1 && $f_s.children().is('i:empty'));
+
+ if (has_aside) {
+ if (aside_links.length < 2) {
+ has_aside = false;
+ $main.addClass("o_aside_removed");
+ $floating_container.add($mask).add($aside).remove();
+ return;
}
- })
- $(".floating_action_container").remove();
+
+ floating_menu_layout();
+ set_scroll_to(aside_links);
+ ripple_animation(aside_links);
+ $aside_nav.find("li").has("ul").addClass("parent");
+ }
}
- if (has_aside) { $aside_nav.find("li").has("ul").addClass("parent"); };
- }
+
+ bind_window_events();
+ };
// -- Float action menu
- var floating_menu_layout = function() {
+ var floating_menu_layout = function () {
var lis = $aside_nav.find("> ul > li").clone(true)
.addClass("ripple")
.css({
@@ -117,53 +177,46 @@
overflow: 'hidden'
});
lis.find("ul").remove().end()
- .find("a").removeClass("ripple").on("click", function() {
- floating_menu_toggle();
+ .find("a").removeClass("ripple").on("click", function () {
+ _toggle_float();
});
$float_menu.find(".content").empty().append(lis);
$float.add($mask).on("click", function () {
- floating_menu_toggle();
+ _toggle_float();
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);
+ var set_scroll_to = function (el_list) {
+ el_list.each(function () {
+ var $link = $(this),
+ target_id = $link.attr("href");
+
+ $link.on("click", function () {
$aside_nav.find("li").removeClass("active");
$link.parents("li").addClass("active");
- window.location.hash = $link.prop('hash');
+ _scroll_and_set_hash(target_id);
return false;
- })
- })
- }
+ });
+ });
+
+ $body.scrollspy({
+ target: 'aside',
+ offset: 200,
+ });
+ };
// -- Ripple buttons
- var ripple_animation = function(el_list) {
- el_list.each(function() {
+ var ripple_animation = function (el_list) {
+ el_list.each(function () {
var btn = $(this);
btn
.css({
position: 'relative',
overflow: 'hidden'
})
- .bind('mousedown', function(e) {
+ .bind('mousedown', function (e) {
var ripple;
if (btn.find('.inner-ripple').length === 0) {
ripple = $('<span class="inner-ripple"/>');
@@ -186,43 +239,17 @@
top: y + 'px',
left: x + 'px'
}).addClass('inner-ripple-animated');
- setTimeout(function() {
+ 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) {
+ $header.on('click', '.o_primary_nav .dropdown-toggle', function (e) {
e.preventDefault();
var $a = $(this);
@@ -233,12 +260,12 @@
if ($a.closest('.o_primary_nav').children('.open').length > 0) {
$header.addClass("o_sub_opened");
} else {
- timer = setTimeout(function() {
+ timer = setTimeout(function () {
$header.removeClass("o_sub_opened");
}, 200);
}
});
- $header.on('click', '.o_primary_nav .o_secondary_nav', function(e) {
+ $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');
@@ -246,28 +273,53 @@
});
// -- Mobile menu opening
- $header.on('click', '.o_mobile_menu_toggle', function(e) {
+ $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
+ // -- Attach permalink markers to sections' title
+ var attach_permalink_markers = function () {
+ $main.find('article.doc-body > section').each( function () {
+ var $section = $(this),
+ $title = $section.find('> h2, > h3, > h4, > h5, > h6'),
+ target_id = $section.attr('id'),
+ $icon = $('<i/>').addClass('mdi-content-link');
+
+ if ($title.length <= 0) {
+ return;
+ }
+
+ $title.addClass('o_has_permalink_marker').append($icon);
+
+ $icon.on('click', function () {
+ _scroll_and_set_hash("#" + target_id);
+
+ $title.addClass('o_marked').delay(1000).queue(function (){
+ $title.removeClass('o_marked').dequeue();
+ });
+ return false;
+ });
+ });
+ };
+
+ var cp_animation = function (win_top, cp_end_point){
+ var top = Math.min(win_top, cp_h);
+
+ $cp_image.css({
+ 'opacity' : cp_image_alpha - (top * (cp_image_alpha/cp_end_point)),
+ 'transform' : 'scale(' + (1 + (top * (0.1/cp_end_point))) +')'
});
- }
- $(".content-switcher").each(function(index, switcher) {
+ $cp_text.css({
+ 'transform' : 'translateY(' + (top/4) + 'px)',
+ 'opacity' : 1 - (top/cp_h)
+ });
+ };
+
+ $(".content-switcher").each(function (index, switcher) {
var $switcher = $(switcher),
$links = $switcher.find('> ul > li'),
$tabs = $switcher.find('> .tabs > *'),
@@ -278,66 +330,76 @@
$links.eq(index).add($tabs.eq(index)).addClass('active');
}
select(0);
- $switcher.on('click', '> ul > li', function() {
+ $switcher.on('click', '> ul > li', function () {
select($(this).index());
return false;
});
});
+
+ // ======= Utils ==================
+ // =================================
+ var _scroll_and_set_hash = function (target_id) {
+ $('html, body').animate({
+ scrollTop: $(target_id).offset().top - 60
+ }, 100);
+ window.location.hash = target_id;
+ };
+
+ var _toggle_float = function () {
+ $float.toggleClass("active");
+ setTimeout(function () {
+ $float_menu.toggleClass("active");
+ $mask.toggleClass("active");
+ }, 300);
+ };
+
+
+ var bind_window_events = function () {
+ // ======= On resize ==============
+ // Update properties and conditionally call functions according to resolution
+ $win.on('resize', function () {
+ // Update size variables
+ win_w = $win.width();
+ body_h = $body.height();
+ cp_h = $cp.outerHeight();
+ main_h = $main.height();
+ cp_end_point = has_cp_image ? cp_h/2 : undefined;
+
+ if (win_w >= screen_md){
+ footer_animation();
+ (has_aside)? set_affix(): '';
+ } else {
+ footer_stop();
+ }
+ });
+
+ // ======= On scroll ==============
+ $win.on('scroll', function () {
+ var win_top = $win.scrollTop();
+
+ $win[0].requestAnimationFrame(function () {
+ cp_animation(win_top, cp_end_point);
+ });
+
+ if (win_w >= screen_md) {
+ $header.toggleClass('o_scrolled', win_top > header_h);
+ }
+ });
+ };
+
+
// ======= Onload ==================
// =================================
// -- Call default functions
- layouting();
- cards_animate();
+ init();
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', '');
- }
- });
+ (has_aside)? set_affix(): '';
+ }
});
})(jQuery);