1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
odoo.define('sale.SalePortalSidebar', function (require) {
'use strict';
var publicWidget = require('web.public.widget');
var PortalSidebar = require('portal.PortalSidebar');
publicWidget.registry.SalePortalSidebar = PortalSidebar.extend({
selector: '.o_portal_sale_sidebar',
/**
* @constructor
*/
init: function (parent, options) {
this._super.apply(this, arguments);
this.authorizedTextTag = ['em', 'b', 'i', 'u'];
this.spyWatched = $('body[data-target=".navspy"]');
},
/**
* @override
*/
start: function () {
var def = this._super.apply(this, arguments);
var $spyWatcheElement = this.$el.find('[data-id="portal_sidebar"]');
this._setElementId($spyWatcheElement);
// Nav Menu ScrollSpy
this._generateMenu();
// After singature, automatically open the popup for payment
if ($.bbq.getState('allow_payment') === 'yes' && this.$('#o_sale_portal_paynow').length) {
this.$('#o_sale_portal_paynow').trigger('click');
$.bbq.removeState('allow_payment');
}
return def;
},
//--------------------------------------------------------------------------
// Private
//---------------------------------------------------------------------------
/**
* create an unique id and added as a attribute of spyWatched element
*
* @private
* @param {string} prefix
* @param {Object} $el
*
*/
_setElementId: function (prefix, $el) {
var id = _.uniqueId(prefix);
this.spyWatched.find($el).attr('id', id);
return id;
},
/**
* generate the new spy menu
*
* @private
*
*/
_generateMenu: function () {
var self = this,
lastLI = false,
lastUL = null,
$bsSidenav = this.$el.find('.bs-sidenav');
$("#quote_content [id^=quote_header_], #quote_content [id^=quote_]", this.spyWatched).attr("id", "");
_.each(this.spyWatched.find("#quote_content h2, #quote_content h3"), function (el) {
var id, text;
switch (el.tagName.toLowerCase()) {
case "h2":
id = self._setElementId('quote_header_', el);
text = self._extractText($(el));
if (!text) {
break;
}
lastLI = $("<li class='nav-item'>").append($('<a class="nav-link" style="max-width: 200px;" href="#' + id + '"/>').text(text)).appendTo($bsSidenav);
lastUL = false;
break;
case "h3":
id = self._setElementId('quote_', el);
text = self._extractText($(el));
if (!text) {
break;
}
if (lastLI) {
if (!lastUL) {
lastUL = $("<ul class='nav flex-column'>").appendTo(lastLI);
}
$("<li class='nav-item'>").append($('<a class="nav-link" style="max-width: 200px;" href="#' + id + '"/>').text(text)).appendTo(lastUL);
}
break;
}
el.setAttribute('data-anchor', true);
});
this.trigger_up('widgets_start_request', {$target: $bsSidenav});
},
/**
* extract text of menu title for sidebar
*
* @private
* @param {Object} $node
*
*/
_extractText: function ($node) {
var self = this;
var rawText = [];
_.each($node.contents(), function (el) {
var current = $(el);
if ($.trim(current.text())) {
var tagName = current.prop("tagName");
if (_.isUndefined(tagName) || (!_.isUndefined(tagName) && _.contains(self.authorizedTextTag, tagName.toLowerCase()))) {
rawText.push($.trim(current.text()));
}
}
});
return rawText.join(' ');
},
});
});
|