Skip to content

Commit 5ea8e4f

Browse files
committed
remove all direct uses of jQuery uses from cpan.js
The remaining uses are to access bootstrap functions.
1 parent 4e8ab17 commit 5ea8e4f

File tree

2 files changed

+59
-54
lines changed

2 files changed

+59
-54
lines changed

root/static/js/cpan.js

Lines changed: 59 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
'use strict';
22

3-
const $ = require('jquery');
43
const relatizeDate = require('./relatize_date.js');
54
const storage = require('./storage.js');
65
const Mousetrap = require('mousetrap');
@@ -9,6 +8,11 @@ const {
98
createAnchors
109
} = require('./document-ui.mjs');
1110

11+
const jQuery = require('jquery');
12+
require('bootstrap/js/dropdown.js');
13+
require('bootstrap/js/modal.js');
14+
require('bootstrap/js/tooltip.js');
15+
1216
function setFavTitle(button) {
1317
button.setAttribute('title', button.classList.contains('active') ? 'Remove from favorites' : 'Add to favorites');
1418
}
@@ -64,25 +68,25 @@ async function processUserData() {
6468
}
6569

6670
function set_page_size(selector, storage_name) {
67-
$(selector).each(function() {
68-
var url = this.href;
69-
var result = /[&;?]size=(\d+)(?:$|[&;])/.exec(url);
70-
var size;
71+
for (const el of document.querySelectorAll(selector)) {
72+
const result = el.href.match(/[&;?]size=(\d+)(?:$|[&;])/);
7173
if (result && result[1]) {
72-
size = result[1];
73-
$(this).click(function() {
74+
const size = result[1];
75+
el.addEventListener('click', () => {
7476
storage.setItem(storage_name, size);
75-
return true;
7677
});
77-
} else if (size = storage.getItem(storage_name)) {
78-
if (/\?/.exec(url)) {
79-
this.href += '&size=' + size;
80-
} else {
81-
this.href += '?size=' + size;
78+
return;
79+
}
80+
const storage_size = storage.getItem(storage_name);
81+
if (storage_size) {
82+
if (el.href.match(/\?/)) {
83+
el.href += '&size=' + storage_size;
84+
}
85+
else {
86+
el.href += '?size=' + storage_size;
8287
}
8388
}
84-
return true;
85-
});
89+
}
8690
}
8791

8892
// poor man's RFC-6570 formatter
@@ -99,32 +103,32 @@ function format_string(input_string, replacements) {
99103
// User customisations
100104
processUserData();
101105

102-
$(".ttip").tooltip();
106+
jQuery(".ttip").tooltip(); // bootstrap
103107

104-
$('.keyboard-shortcuts').each(function() {
105-
$(this).click(function(event) {
106-
$('#metacpan_keyboard-shortcuts').modal();
107-
event.preventDefault();
108-
})
109-
});
108+
for (const el of document.querySelectorAll('.keyboard-shortcuts')) {
109+
el.addEventListener('click', e => {
110+
e.preventDefault();
111+
jQuery('#metacpan_keyboard-shortcuts').modal(); // bootstrap
112+
});
113+
}
110114

111115
// Global keyboard shortcuts
112116
Mousetrap.bind('?', function() {
113-
$('#metacpan_keyboard-shortcuts').modal();
117+
jQuery('#metacpan_keyboard-shortcuts').modal(); // bootstrap
114118
});
115119
Mousetrap.bind('s', function(e) {
116-
$('#metacpan_search-input').focus();
117120
e.preventDefault();
121+
document.querySelector('#metacpan_search-input').focus();
118122
});
119123

120124
// install a default handler for 'g s' for non pod pages
121125
Mousetrap.bind('g s', function(e) {});
122126

123-
$('a[data-keyboard-shortcut]').each(function(index, element) {
124-
Mousetrap.bind($(element).data('keyboard-shortcut'), function() {
125-
window.location = $(element).attr('href');
127+
for (const el of document.querySelectorAll('a[data-keyboard-shortcut]')) {
128+
Mousetrap.bind(el.dataset.keyboardShortcut, e => {
129+
window.location = el.href;
126130
});
127-
});
131+
}
128132

129133
for (const logout of document.querySelectorAll('.logout-button')) {
130134
logout.addEventListener('click', e => {
@@ -139,30 +143,30 @@ for (const logout of document.querySelectorAll('.logout-button')) {
139143

140144
relatizeDate(document.querySelectorAll('.relatize'));
141145

142-
var items = $('.ellipsis');
143-
for (var i = 0; i < items.length; i++) {
144-
var element = items[i];
145-
var text = element.textContent;
146+
for (const el of document.querySelectorAll('.ellipsis')) {
147+
const text = el.textContent;
146148

147149
// try to find a reasonable place to cut to allow mid-abbreviation.
148150
// we want to cut "near" the middle, but prefer on a boundary.
149-
var cut = Math.floor(text.length / 5 * 3);
150-
var start_text = text.substr(0, cut);
151-
var end_text = text.substr(cut);
152-
var res = start_text.match(/^(.*[- :])(.*?)$/);
151+
const initial_cut = Math.floor(text.length / 5 * 3);
152+
let start_text = text.substr(0, initial_cut);
153+
let end_text = text.substr(initial_cut);
154+
const res = start_text.match(/^(.*[- :])(.*?)$/);
153155
if (res && res[1].length > text.length / 4) {
154156
start_text = res[1];
155157
end_text = res[2] + end_text;
156158
}
157159

158-
var start = document.createElement('span');
159-
start.appendChild(document.createTextNode(start_text));
160-
var end = document.createElement('span');
161-
end.appendChild(document.createTextNode(end_text));
162-
$(element).empty();
163-
element.appendChild(end);
160+
const start = document.createElement('span');
161+
start.append(start_text);
162+
const end = document.createElement('span');
163+
end.append(end_text);
164+
165+
el.replaceChildren();
166+
167+
el.append(end);
164168
start.style.maxWidth = 'calc(100% - ' + end.clientWidth + 'px)';
165-
element.insertBefore(start, end);
169+
el.prepend(start);
166170
}
167171

168172
createAnchors(document.querySelectorAll('.anchors'));
@@ -171,23 +175,25 @@ for (const favButton of document.querySelectorAll('.breadcrumbs .favorite')) {
171175
setFavTitle(favButton);
172176
}
173177

174-
$('.dropdown-toggle').dropdown();
178+
jQuery('.dropdown-toggle').dropdown(); // bootstrap
175179

176180
const toc = document.querySelector(".content .toc")
177181
if (toc) {
178182
formatTOC(toc);
179183
}
180184

181-
$('a[href*="/search?"]').on('click', function() {
182-
var url = $(this).attr('href');
183-
var result = /size=(\d+)/.exec(url);
184-
if (result && result[1]) {
185-
storage.setItem('search_size', result[1]);
186-
}
187-
});
188-
var size = storage.getItem('search_size');
185+
for (const link of document.querySelectorAll('a[href*="/search?"]')) {
186+
link.addEventListener('click', e => {
187+
const result = link.href.match(/size=(\d+)/);
188+
if (result && result[1]) {
189+
storage.setItem('search_size', result[1]);
190+
}
191+
});
192+
}
193+
194+
const size = storage.getItem('search_size');
189195
if (size) {
190-
$('#metacpan_search-size').val(size);
196+
document.querySelector('#metacpan_search-size').value = size;
191197
}
192198

193199
// TODO use a more specific locator for /author/PAUSID/release ?

root/static/js/main.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import 'jquery';
21
import './autocomplete.js';
32
import './tablesorter.js';
43
import './cpan.js';

0 commit comments

Comments
 (0)