Skip to content

Commit 4930101

Browse files
committed
feat: Refactor advanced search components and implement dropdown toggle for facets
1 parent 9315493 commit 4930101

9 files changed

Lines changed: 203 additions & 98 deletions

File tree

projects/website-angular/src/app/community/resources/resources.component.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export class ResourcesComponent {
2828
next: (html) => {
2929
this.entries = this.parseHtml(html);
3030
this.loading = false;
31-
console.log(this.entries);
3231
},
3332
error: () => {
3433
this.error = true;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<div class="facet-section">
2+
<button class="facet-title" (click)="toggle()">
3+
<span>{{ name }}</span>
4+
<span class="facet-toggle">{{
5+
open ? "-" : "+"
6+
}}</span>
7+
</button>
8+
@if (open) {
9+
<div class="facet-options">
10+
<ng-content></ng-content>
11+
</div>
12+
}
13+
</div>
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
$spacing: 24px;
2+
$border-radius: 8px;
3+
4+
.facet-section {
5+
background: white;
6+
border-radius: $border-radius;
7+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
8+
margin-bottom: 16px;
9+
overflow: hidden;
10+
11+
:host-context(.dark) & {
12+
background-color: var(--surface);
13+
box-shadow: 0 2px 8px rgba(255, 255, 255, 0.08);
14+
}
15+
}
16+
17+
.facet-title {
18+
display: flex;
19+
align-items: center;
20+
justify-content: space-between;
21+
width: 100%;
22+
padding: 12px 16px;
23+
border: none;
24+
background: var(--primary);
25+
color: var(--on-primary);
26+
font-size: 0.95rem;
27+
font-weight: 600;
28+
cursor: pointer;
29+
text-align: left;
30+
}
31+
32+
.facet-toggle {
33+
font-size: 1.2rem;
34+
line-height: 1;
35+
}
36+
37+
.facet-options {
38+
padding: 8px 0;
39+
max-height: 300px;
40+
overflow-y: auto;
41+
}
42+
43+
.facet-option {
44+
display: flex;
45+
align-items: center;
46+
gap: 8px;
47+
padding: 4px 16px;
48+
cursor: pointer;
49+
font-size: 0.85rem;
50+
line-height: 1.4;
51+
52+
&:hover {
53+
background: rgba(0, 0, 0, 0.04);
54+
55+
:host-context(.dark) & {
56+
background: rgba(255, 255, 255, 0.04);
57+
}
58+
}
59+
60+
input[type='checkbox'] {
61+
flex-shrink: 0;
62+
accent-color: var(--primary);
63+
}
64+
}
65+
66+
.facet-name {
67+
flex: 1;
68+
min-width: 0;
69+
overflow: hidden;
70+
text-overflow: ellipsis;
71+
white-space: nowrap;
72+
}
73+
74+
.facet-count {
75+
color: var(--on-surface-variant);
76+
flex-shrink: 0;
77+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { DropdownToggleComponent } from './dropdown-toggle.component';
4+
5+
describe('DropdownToggleComponent', () => {
6+
let component: DropdownToggleComponent;
7+
let fixture: ComponentFixture<DropdownToggleComponent>;
8+
9+
beforeEach(async () => {
10+
await TestBed.configureTestingModule({
11+
imports: [DropdownToggleComponent]
12+
})
13+
.compileComponents();
14+
15+
fixture = TestBed.createComponent(DropdownToggleComponent);
16+
component = fixture.componentInstance;
17+
fixture.detectChanges();
18+
});
19+
20+
it('should create', () => {
21+
expect(component).toBeTruthy();
22+
});
23+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Component, EventEmitter, Input, Output } from '@angular/core';
2+
3+
@Component({
4+
selector: 'app-dropdown-toggle',
5+
imports: [],
6+
templateUrl: './dropdown-toggle.component.html',
7+
styleUrl: './dropdown-toggle.component.scss'
8+
})
9+
export class DropdownToggleComponent {
10+
@Input() name: string = '';
11+
@Output() toggleEvent = new EventEmitter<boolean>();
12+
13+
open = true;
14+
15+
toggle() {
16+
this.open = !this.open;
17+
this.toggleEvent.emit(this.open);
18+
}
19+
}

projects/website-angular/src/app/search/search-bar/search-bar.component.html

Lines changed: 29 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
></textarea>
2929
<button type="submit" class="search-button">Go!</button>
3030
</form>
31-
}
32-
33-
@if (query && suggestions.length > 0 && showSuggestions) {
31+
} @if (query && suggestions.length > 0 && showSuggestions) {
3432
<div class="suggestions-container">
3533
<ul class="suggestions-list">
3634
@for (s of suggestions; track s; let i = $index) {
@@ -49,19 +47,15 @@
4947
}
5048
</ul>
5149
</div>
52-
}
53-
54-
@if (advancedMode) {
55-
<button class="syntax-help-toggle" (click)="syntaxHelpOpen = !syntaxHelpOpen">
50+
} @if (advancedMode) {
51+
<button class="syntax-help-toggle" (click)="syntaxHelpOpen = !syntaxHelpOpen">
5652
<span class="material-symbols-rounded">help_outline</span>
5753
Syntax Help
5854
<span class="material-symbols-rounded">{{
5955
syntaxHelpOpen ? "expand_less" : "expand_more"
6056
}}</span>
6157
</button>
62-
}
63-
64-
@if (syntaxHelpOpen) {
58+
} @if (syntaxHelpOpen) {
6559
<div class="syntax-help">
6660
<table class="syntax-table">
6761
<thead>
@@ -124,34 +118,31 @@
124118
>.
125119
</p>
126120
</div>
127-
}
128-
129-
@if (filters && allFacets) {
121+
} @if (filters && allFacets) {
130122
<div class="advanced-facets">
131123
<h3 class="advanced-facets-title">Filter by</h3>
132-
<div class="advanced-facet-grid">
124+
<div class="">
133125
@if (getFacetItems(allFacets.speciesFacet); as items) { @if (items.length) {
134-
<div class="advanced-facet-column">
135-
<h4>Species</h4>
136-
<div class="advanced-facet-list">
137-
@for (item of items; track item.name) {
138-
<label class="facet-option">
139-
<input
140-
type="checkbox"
141-
[checked]="isAdvancedFacetSelected('species', item.name)"
142-
(change)="toggleAdvancedFacet('species', item.name)"
143-
/>
144-
<span class="facet-name">{{ item.name }}</span>
145-
<span class="facet-count">({{ item.count }})</span>
146-
</label>
147-
}
148-
</div>
149-
</div>
126+
<app-dropdown-toggle
127+
name="Species"
128+
(toggleEvent)="toggleAdvancedFacet('species')"
129+
>
130+
@for (item of items; track item.name) {
131+
<label class="facet-option">
132+
<input
133+
type="checkbox"
134+
[checked]="isAdvancedFacetSelected('species', item.name)"
135+
(change)="toggleAdvancedFacet('species', item.name)"
136+
/>
137+
<span class="facet-name">{{ item.name }}</span>
138+
<span class="facet-count">({{ item.count }})</span>
139+
</label>
140+
}
141+
</app-dropdown-toggle>
150142
} } @if (getFacetItems(allFacets.typeFacet); as items) { @if (items.length)
151143
{
152-
<div class="advanced-facet-column">
153-
<h4>Types</h4>
154-
<div class="advanced-facet-list">
144+
145+
<app-dropdown-toggle name="Types" class="advanced-facet-list">
155146
@for (item of items; track item.name) {
156147
<label class="facet-option">
157148
<input
@@ -163,13 +154,10 @@ <h4>Types</h4>
163154
<span class="facet-count">({{ item.count }})</span>
164155
</label>
165156
}
166-
</div>
167-
</div>
157+
</app-dropdown-toggle>
168158
} } @if (getFacetItems(allFacets.compartmentFacet); as items) { @if
169159
(items.length) {
170-
<div class="advanced-facet-column">
171-
<h4>Compartments</h4>
172-
<div class="advanced-facet-list">
160+
<app-dropdown-toggle name="Compartments" class="advanced-facet-list">
173161
@for (item of items; track item.name) {
174162
<label class="facet-option">
175163
<input
@@ -181,13 +169,10 @@ <h4>Compartments</h4>
181169
<span class="facet-count">({{ item.count }})</span>
182170
</label>
183171
}
184-
</div>
185-
</div>
172+
</app-dropdown-toggle>
186173
} } @if (getFacetItems(allFacets.keywordFacet); as items) { @if
187174
(items.length) {
188-
<div class="advanced-facet-column">
189-
<h4>Keywords</h4>
190-
<div class="advanced-facet-list">
175+
<app-dropdown-toggle name="Keywords" class="advanced-facet-list">
191176
@for (item of items; track item.name) {
192177
<label class="facet-option">
193178
<input
@@ -199,12 +184,9 @@ <h4>Keywords</h4>
199184
<span class="facet-count">({{ item.count }})</span>
200185
</label>
201186
}
202-
</div>
203-
</div>
187+
</app-dropdown-toggle>
204188
} }
205189
</div>
206190
</div>
207191

208192
}
209-
210-

projects/website-angular/src/app/search/search-bar/search-bar.component.scss

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,43 @@ $border-radius: 8px;
192192
font-size: 0.85em;
193193
}
194194
}
195+
196+
.advanced-facets-title {
197+
text-align: left;
198+
}
199+
200+
.facet-option {
201+
display: flex;
202+
align-items: center;
203+
gap: 8px;
204+
padding: 4px 16px;
205+
cursor: pointer;
206+
font-size: 0.85rem;
207+
line-height: 1.4;
208+
209+
&:hover {
210+
background: rgba(0, 0, 0, 0.04);
211+
212+
:host-context(.dark) & {
213+
background: rgba(255, 255, 255, 0.04);
214+
}
215+
}
216+
217+
input[type='checkbox'] {
218+
flex-shrink: 0;
219+
accent-color: var(--primary);
220+
}
221+
}
222+
223+
.facet-name {
224+
flex: 1;
225+
min-width: 0;
226+
overflow: hidden;
227+
text-overflow: ellipsis;
228+
white-space: nowrap;
229+
}
230+
231+
.facet-count {
232+
color: var(--on-surface-variant);
233+
flex-shrink: 0;
234+
}

projects/website-angular/src/app/search/search-bar/search-bar.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ import {
1515
SearchFilters,
1616
SearchService,
1717
} from 'projects/website-angular/src/services/search.service';
18+
import { DropdownToggleComponent } from "../../reactome-components/dropdown-toggle/dropdown-toggle.component";
1819

1920
@Component({
2021
selector: 'app-search-bar',
2122
standalone: true,
22-
imports: [],
23+
imports: [DropdownToggleComponent],
2324
templateUrl: './search-bar.component.html',
2425
styleUrl: './search-bar.component.scss',
2526
})

0 commit comments

Comments
 (0)