Skip to content

Commit ae8105b

Browse files
authored
Merge pull request jsonwebtoken#557 from panva/feat-556
feat: preselect a language on libraries page
2 parents 40741b9 + d881cc4 commit ae8105b

File tree

4 files changed

+68
-18
lines changed

4 files changed

+68
-18
lines changed

src/website/index.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ import queryString from "querystring";
1616
/* For initialization, look at the end of this file */
1717

1818
function parseLocationQuery() {
19-
const locSearch = queryString.parse(document.location.search.substr(1));
20-
const locHash = queryString.parse(document.location.hash.substr(1));
19+
const source = {
20+
...queryString.parse(document.location.search.substr(1)),
21+
...queryString.parse(document.location.hash.substr(1))
22+
}
2123

2224
const keys = [
2325
"id_token",
@@ -27,11 +29,11 @@ function parseLocationQuery() {
2729
"debugger-io?token"
2830
];
2931
for (const key of keys) {
30-
const token = locSearch[key] || locHash[key];
32+
const token = source[key];
3133

3234
if (token) {
33-
if (locSearch.publicKey || locHash.publicKey) {
34-
publicKeyTextArea.value = locSearch.publicKey || locHash.publicKey;
35+
if (source.publicKey) {
36+
publicKeyTextArea.value = source.publicKey;
3537
}
3638

3739
setTokenEditorValue(token);

src/website/libraries/libraries.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { librariesElement, librariesSelect } from "./dom-elements.js";
22

3+
import queryString from "querystring";
34
import Isotope from "isotope-layout";
45

56
const librariesGrid = new Isotope(librariesElement, {
7+
initLayout: false,
68
layoutMode: "fitRows",
79
itemSelector: "article",
810
percentPosition: true,
@@ -11,10 +13,44 @@ const librariesGrid = new Isotope(librariesElement, {
1113
},
1214
});
1315

16+
function setQueryStringParameter(name, value) {
17+
if (value) {
18+
const params = new URLSearchParams(window.location.search);
19+
params.set(name, value);
20+
window.history.replaceState({}, '', decodeURIComponent(`${window.location.pathname}?${params}`));
21+
} else {
22+
window.history.replaceState({}, '', decodeURIComponent(window.location.pathname));
23+
}
24+
}
25+
1426
export function setupLibraries() {
1527
librariesSelect.addEventListener("change", (event) => {
1628
librariesGrid.arrange({
1729
filter: event.target.value,
1830
});
31+
if (event.target.value === '*') {
32+
setQueryStringParameter('language', '')
33+
} else {
34+
setQueryStringParameter('language', document.querySelector(`#libraries-select > option[value="${event.target.value}"]`).innerHTML)
35+
}
1936
});
20-
}
37+
38+
const { language: preselect } = {
39+
...queryString.parse(document.location.search.substr(1)),
40+
...queryString.parse(document.location.hash.substr(1))
41+
}
42+
43+
let select;
44+
45+
if (preselect) {
46+
try {
47+
select = document.querySelector(`#libraries-select > option[value=".${preselect}"]`)
48+
|| [...document.querySelectorAll('#libraries-select > option')].find((el) => preselect === el.innerHTML)
49+
} catch (err) {}
50+
}
51+
52+
select || (select = document.querySelector('#libraries-select > option[value="*"]'))
53+
54+
librariesGrid.arrange({ filter: select.value });
55+
select.selected = 'selected';
56+
}

test/functional/libraries.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,18 @@ describe('Libraries', function() {
169169
return result;
170170
})).to.be.empty;
171171
});
172-
});
172+
173+
it('Can pre-select a language with a name', async function () {
174+
await this.page.goto(`http://localhost:8000/libraries?language=Node.js`);
175+
expect(await this.page.$eval('.net', isVisible)).to.be.false;
176+
expect(await this.page.$eval('.php', isVisible)).to.be.false;
177+
expect(await this.page.$eval('.node', isVisible)).to.be.true;
178+
});
179+
180+
it('Can pre-select a language with a class', async function () {
181+
await this.page.goto(`http://localhost:8000/libraries?language=node`);
182+
expect(await this.page.$eval('.net', isVisible)).to.be.false;
183+
expect(await this.page.$eval('.php', isVisible)).to.be.false;
184+
expect(await this.page.$eval('.node', isVisible)).to.be.true;
185+
});
186+
});

test/unit/libraries.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,19 @@ describe('Libraries', function() {
1717

1818
it('Each language has a unique name', function() {
1919
const names = new Set();
20-
21-
for(const lang of languages) {
22-
names.has(lang.name).should.be.false;
23-
names.add(lang.name);
24-
}
20+
languages
21+
.map(({ name }) => name)
22+
.forEach(Set.prototype.add.bind(names))
23+
names.size.should.equal(languages.length);
2524
});
2625

2726
it('uniqueClass is unique for each language', function() {
2827
const classes = new Set();
29-
30-
for(const lang of languages) {
31-
classes.has(lang.uniqueClass).should.be.false;
32-
classes.add(lang.uniqueClass);
33-
}
34-
});
28+
languages
29+
.map(({ uniqueClass }) => uniqueClass)
30+
.forEach(Set.prototype.add.bind(classes))
31+
classes.size.should.equal(languages.length);
32+
});
3533

3634
it('Have a correct schema', function() {
3735
for(const lang of languages) {

0 commit comments

Comments
 (0)