Skip to content

Commit 9c8f605

Browse files
feat: Add TOC filtering
1 parent e6fffec commit 9c8f605

File tree

3 files changed

+288
-231
lines changed

3 files changed

+288
-231
lines changed

EssentialCSharp.Web/Views/Shared/_Layout.cshtml

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@
145145
<Transition name="slide-fade">
146146
<div v-cloak v-if="sidebarShown" :class="{sidebarSmall: smallScreen}" class="sidebar toc-padding" id="sidebar">
147147
<div v-cloak class="toc-menu">
148-
149148
<div style="display:grid; width:100%; margin-bottom:.75rem;">
150149
<button v-on:click="openSearch" type="button" class="DocSearch DocSearch-Button DocSearch-Style" aria-label="Search">
151150
<span class="DocSearch-Button-Container">
@@ -182,20 +181,23 @@
182181
<span class="fs-5">Announcements</span>
183182
</a>
184183
</div>
185-
<div>
186-
<h5>
184+
<div style="display: flex; align-items: center;">
185+
<h5 style="margin-right: 8px;">
187186
Contents
188187
</h5>
188+
<i class="fa-solid fa-filter" v-on:click="enableTocFilter = enableTocFilter === 'filter' ? 'none' : 'filter';"></i>
189+
</div>
190+
<div v-if="enableTocFilter === 'filter'" class="filter-input-container">
191+
<input type="text" class="filter-input" v-model="searchQuery" placeholder="Filter TOC..." />
192+
<button class="filter-btn">
193+
<i class="fa fa-search icon-light"></i>
194+
</button>
189195
</div>
190-
<button class="toc-label hide" v-on:click="sidebarTab = 'search'" id="search-btn">
191-
SEARCH
192-
<div v-if="sidebarTab == 'search'" class="bottom-border" id="search-border"></div>
193-
</button>
194196
</div>
195197

196198
<div v-cloak v-if="sidebarTab == 'toc'" class="toc-tree" id="toc">
197199
<ul class="tree">
198-
<toc-tree v-for="item in tocData" :item="item" :expanded-tocs="expandedTocs" :current-page="currentPage"></toc-tree>
200+
<toc-tree v-for="item in filteredTocData" :item="item" :expanded-tocs="expandedTocs" :current-page="currentPage"></toc-tree>
199201
</ul>
200202
</div>
201203
<div v-cloak>
@@ -206,14 +208,6 @@
206208
}
207209
</small>
208210
</div>
209-
<div v-cloak v-if="sidebarTab == 'search'" id="searchBar" class="search-window">
210-
<div class="input">
211-
<input type="text" />
212-
<button class="search-btn">
213-
<i class="fa fa-search icon-light"></i>
214-
</button>
215-
</div>
216-
</div>
217211
</div>
218212
</Transition>
219213
</div>
@@ -298,8 +292,8 @@
298292
}
299293
300294
PREVIOUS_PAGE = @Json.Serialize(ViewBag.PreviousPage)
301-
NEXT_PAGE = @Json.Serialize(ViewBag.NextPage)
302-
TOC_DATA = @Json.Serialize(tocData)
295+
NEXT_PAGE = @Json.Serialize(ViewBag.NextPage)
296+
TOC_DATA = @Json.Serialize(tocData)
303297
</script>
304298

305299
@* Recursive vue component template for rendering the table of contents. *@

EssentialCSharp.Web/wwwroot/css/styles.css

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,37 @@ a:hover {
385385
}
386386
}
387387

388+
.filter-input-container {
389+
display: flex;
390+
align-items: center;
391+
width: 100%;
392+
padding: 0.5rem;
393+
box-sizing: border-box;
394+
}
395+
396+
.filter-input {
397+
flex: 1;
398+
padding: 0.5rem;
399+
border: 1px solid #ccc;
400+
border-radius: 4px 0 0 4px;
401+
font-size: 1rem;
402+
}
403+
404+
.filter-btn {
405+
padding: 0.5rem;
406+
border: 1px solid #ccc;
407+
border-left: none;
408+
background-color: #007bff;
409+
color: white;
410+
border-radius: 0 4px 4px 0;
411+
cursor: pointer;
412+
}
413+
414+
.filter-btn .fa-search {
415+
font-size: 1rem;
416+
}
417+
418+
388419
/* Table of Contents For Chapters */
389420

390421
.toc-menu {

0 commit comments

Comments
 (0)