Skip to content

Commit 904e54f

Browse files
committed
feat(pat navigation): Support click-only markings.
Mark the navigation items also on clicks on anchors without pat-inject.
1 parent 16bc8a2 commit 904e54f

File tree

3 files changed

+135
-0
lines changed

3 files changed

+135
-0
lines changed

src/pat/navigation/index.html

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,28 @@ <h3>Example 2</h3>
9393
<div id="content-tab-2">Example 2 Content will appear here</div>
9494
</section>
9595

96+
<section>
97+
<header>
98+
<h3>Example 3 - nested nav, but no injection</h3>
99+
</header>
100+
<ul class="pat-navigation">
101+
<li>
102+
<a href="#10">Tab 1</a>
103+
<ul>
104+
<li>
105+
<a href="#11">Link 1.1</a>
106+
</li>
107+
<li>
108+
<a href="#12">Link 1.2</a>
109+
</li>
110+
</ul>
111+
</li>
112+
<li>
113+
<a href="#2">Tab 2</a>
114+
</li>
115+
</ul>
116+
</section>
117+
96118
<template id="inject-tab-1">Content for tab 1</template>
97119
<template id="inject-tab-2">Content for tab 2</template>
98120
<template id="inject-tab-1-1">Content for tab 1.1</template>

src/pat/navigation/navigation.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Base from "../../core/base";
22
import Parser from "../../core/parser";
33
import logging from "../../core/logging";
4+
import events from "../../core/events";
45

56
const log = logging.getLogger("navigation");
67

@@ -42,6 +43,17 @@ export default Base.extend({
4243
this.mark_current(ev.target);
4344
});
4445

46+
const items_non_inject = this.el.querySelectorAll("a:not(.pat-inject)");
47+
for (const it of items_non_inject) {
48+
events.add_event_listener(it, "click", "pat_nav_item_non_inject", (ev) => {
49+
// Remove all set current classes
50+
this.clear_items();
51+
52+
// Mark the current item
53+
this.mark_current(ev.target);
54+
});
55+
}
56+
4557
// Automatically and recursively load the ``.current`` item.
4658
if (this.el.classList.contains("navigation-load-current")) {
4759
// Check for current elements injected here.

src/pat/navigation/navigation.test.js

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,104 @@ describe("Navigation pattern tests - Mark items based on URL", () => {
352352
expect(document.querySelector(".current a")).toBe(it4);
353353
});
354354
});
355+
356+
describe("Navigation pattern tests - Mark items based based clicking without pat-inject.", () => {
357+
beforeEach(() => {
358+
document.body.innerHTML = "";
359+
});
360+
361+
afterEach(() => {
362+
document.body.innerHTML = "";
363+
});
364+
365+
it("navigation roundtrip", () => {
366+
document.body.innerHTML = `
367+
<nav class="pat-navigation"
368+
data-pat-navigation="in-path-class: inPath">
369+
<ul>
370+
<li class="current">
371+
<a class="current" href="/home">Home</a>
372+
</li>
373+
<li>
374+
<a href="/path1">p1</a>
375+
</li>
376+
<li>
377+
<a href="/path2">p2</a>
378+
<ul>
379+
<li>
380+
<a href="/path2/path2.1">p2.1</a>
381+
</li>
382+
<li>
383+
<a href="/path2/path2.2">p2.2</a>
384+
<ul>
385+
<li>
386+
<a href="/path2/path2.2/path2.2.1">p2.2.1</a>
387+
</li>
388+
<li>
389+
<a href="/path2/path2.2/path2.2.2">p2.2.2</a>
390+
</li>
391+
</ul>
392+
</li>
393+
</ul>
394+
</li>
395+
</ul>
396+
</nav>
397+
`;
398+
399+
const instance = new Pattern(document.querySelector(".pat-navigation"));
400+
401+
const it0 = document.querySelector("a[href='/home']");
402+
const it1 = document.querySelector("a[href='/path1']");
403+
const it2 = document.querySelector("a[href='/path2']");
404+
const it21 = document.querySelector("a[href='/path2/path2.1']");
405+
const it22 = document.querySelector("a[href='/path2/path2.2']");
406+
const it221 = document.querySelector("a[href='/path2/path2.2/path2.2.1']");
407+
const it222 = document.querySelector("a[href='/path2/path2.2/path2.2.2']");
408+
409+
expect(document.querySelectorAll(".current").length).toBe(2);
410+
expect(document.querySelectorAll(".inPath").length).toBe(0);
411+
expect(document.querySelector(".current a")).toBe(it0);
412+
413+
instance.clear_items();
414+
it1.click();
415+
416+
expect(document.querySelectorAll(".current").length).toBe(2);
417+
expect(document.querySelectorAll(".inPath").length).toBe(0);
418+
expect(document.querySelector(".current a")).toBe(it1);
419+
420+
instance.clear_items();
421+
it2.click();
422+
423+
expect(document.querySelectorAll(".current").length).toBe(2);
424+
expect(document.querySelectorAll(".inPath").length).toBe(0);
425+
expect(document.querySelector(".current a")).toBe(it2);
426+
427+
instance.clear_items();
428+
it21.click();
429+
430+
expect(document.querySelectorAll(".current").length).toBe(2);
431+
expect(document.querySelectorAll(".inPath").length).toBe(2);
432+
expect(document.querySelector(".current a")).toBe(it21);
433+
434+
instance.clear_items();
435+
it22.click();
436+
437+
expect(document.querySelectorAll(".current").length).toBe(2);
438+
expect(document.querySelectorAll(".inPath").length).toBe(2);
439+
expect(document.querySelector(".current a")).toBe(it22);
440+
441+
instance.clear_items();
442+
it221.click();
443+
444+
expect(document.querySelectorAll(".current").length).toBe(2);
445+
expect(document.querySelectorAll(".inPath").length).toBe(4);
446+
expect(document.querySelector(".current a")).toBe(it221);
447+
448+
instance.clear_items();
449+
it222.click();
450+
451+
expect(document.querySelectorAll(".current").length).toBe(2);
452+
expect(document.querySelectorAll(".inPath").length).toBe(4);
453+
expect(document.querySelector(".current a")).toBe(it222);
454+
});
455+
});

0 commit comments

Comments
 (0)