Skip to content

Commit b797c96

Browse files
committed
fix: various search fixes
1 parent 1ff2bd8 commit b797c96

File tree

10 files changed

+43
-20
lines changed

10 files changed

+43
-20
lines changed

src/common-elements/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export * from './dropdown';
88
export * from './mixins';
99
export * from './tabs';
1010
export * from './samples';
11+
export * from './perfect-scrollbar';

src/components/Endpoint/styled.elements.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import styled, { withProps } from '../../styled-components';
33
export const OperationEndpointWrap = styled.div`
44
cursor: pointer;
55
position: relative;
6+
margin-bottom: 5px;
67
`;
78

89
export const ServerRelativeURL = styled.span`

src/components/Redoc/Redoc.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class Redoc extends React.Component<RedocProps> {
2424
};
2525

2626
componentDidMount() {
27-
this.props.store.menu.updateOnHash();
27+
this.props.store.onDidMount();
2828
}
2929

3030
componentWillUnmount() {

src/components/SearchBox/SearchBox.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,20 @@ export interface SearchBoxProps {
8282
marker: MarkerService;
8383
getItemById: (id: string) => IMenuItem | undefined;
8484
onActivate: (item: IMenuItem) => void;
85+
86+
className?: string;
8587
}
8688

8789
export interface SearchBoxState {
8890
results: any;
8991
term: string;
9092
}
9193

94+
interface SearchResult {
95+
item: IMenuItem;
96+
score: number;
97+
}
98+
9299
export class SearchBox extends React.PureComponent<SearchBoxProps, SearchBoxState> {
93100
constructor(props) {
94101
super(props);
@@ -145,8 +152,14 @@ export class SearchBox extends React.PureComponent<SearchBoxProps, SearchBoxStat
145152
};
146153

147154
render() {
148-
const items: IMenuItem[] = this.state.results.map(res => this.props.getItemById(res.id));
149-
items.sort((a, b) => (a.depth > b.depth ? 1 : a.depth < b.depth ? -1 : 0));
155+
const results: SearchResult[] = this.state.results.map(res => ({
156+
item: this.props.getItemById(res.id),
157+
score: res.score,
158+
}));
159+
results.sort(
160+
(a, b) =>
161+
a.item.depth > b.item.depth ? 1 : a.item.depth < b.item.depth ? -1 : b.score - a.score,
162+
);
150163

151164
return (
152165
<div>
@@ -158,14 +171,14 @@ export class SearchBox extends React.PureComponent<SearchBoxProps, SearchBoxStat
158171
type="text"
159172
onChange={this.search}
160173
/>
161-
{items.length > 0 && (
174+
{results.length > 0 && (
162175
<SearchResultsBox>
163-
{items.map(item => (
176+
{results.map(res => (
164177
<MenuItem
165-
item={item}
178+
item={res.item}
166179
onActivate={this.props.onActivate}
167180
withoutChildren={true}
168-
key={item.id}
181+
key={res.item.id}
169182
/>
170183
))}
171184
</SearchResultsBox>

src/components/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export * from './RedocStandalone';
22
export * from './Redoc/Redoc';
33
// export * from './Redoc/elements';
44
export * from './Schema/';
5+
export * from './SearchBox/SearchBox';
56
export * from './Operation/Operation';
67
export * from './RedocStandalone';
78

src/services/AppStore.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,21 @@ export class AppStore {
5959
this.spec = new SpecStore(spec, specUrl, this.options);
6060
this.menu = new MenuStore(this.spec, this.scroll);
6161

62-
this.search = new SearchStore(this.spec);
62+
this.search = new SearchStore();
63+
this.search.indexItems(this.menu.items);
64+
this.search.done();
6365

6466
this.disposer = observe(this.menu, 'activeItemIdx', change => {
6567
this.updateMarkOnMenu(change.newValue as number);
6668
});
6769
}
6870

71+
onDidMount() {
72+
this.menu.updateOnHash();
73+
this.updateMarkOnMenu(this.menu.activeItemIdx);
74+
}
75+
6976
updateMarkOnMenu(idx: number) {
70-
console.log('update marker');
7177
const start = Math.max(0, idx);
7278
const end = Math.min(this.menu.flatItems.length, start + 5);
7379

src/services/MarkerService.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export class MarkerService {
3434
}
3535

3636
mark(term?: string) {
37-
console.log('mark', term);
3837
if (!term && !this.prevTerm) return;
3938
this.map.forEach(val => {
4039
val.unmark();

src/services/MenuStore.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export interface IMenuItem {
1616
id: string;
1717
absoluteIdx?: number;
1818
name: string;
19+
description?: string;
1920
depth: number;
2021
active: boolean;
2122
items: IMenuItem[];

src/services/SearchStore.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
1-
import { SpecStore } from '../index';
2-
import { GroupModel, OperationModel } from './models';
1+
import { OperationModel } from './models';
32
import worker from './SearchWorker.worker';
3+
import { IMenuItem } from './MenuStore';
44

55
export class SearchStore {
66
searchWorker = new worker();
77

8-
constructor(private spec: SpecStore) {
9-
this.indexGroups(this.spec.operationGroups);
10-
this.done();
11-
}
8+
constructor() {}
129

13-
indexGroups(groups: Array<GroupModel | OperationModel>) {
10+
indexItems(groups: Array<IMenuItem | OperationModel>) {
1411
groups.forEach(group => {
1512
if (group.type !== 'group') {
1613
this.add(group.name, group.description || '', group.id);
1714
}
18-
this.indexGroups(group.items);
15+
this.indexItems(group.items);
1916
});
2017
}
2118

src/services/SearchWorker.worker.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ export interface SearchDocument {
1313
id: string;
1414
}
1515

16+
export interface SearchResult extends SearchDocument {
17+
score: number;
18+
}
19+
1620
const store: { [id: string]: SearchDocument } = {};
1721

1822
let resolveIndex: (v: lunr.Index) => void;
@@ -39,7 +43,7 @@ export async function done() {
3943
resolveIndex(builder.build());
4044
}
4145

42-
export async function search(q: string): Promise<SearchDocument[]> {
46+
export async function search(q: string): Promise<SearchResult[]> {
4347
if (q.trim().length === 0) {
4448
return [];
4549
}
@@ -54,5 +58,5 @@ export async function search(q: string): Promise<SearchDocument[]> {
5458
t.term(exp, {});
5559
});
5660
})
57-
.map(res => store[res.ref]);
61+
.map(res => ({ ...store[res.ref], score: res.score }));
5862
}

0 commit comments

Comments
 (0)