Skip to content

Commit 4e1266f

Browse files
authored
Merge pull request #2846 from XeroAlpha/feat-signature-filter
Default theme: Tag-based visibilityFilter supports signatures
2 parents f1a9a1c + 13dab4c commit 4e1266f

File tree

5 files changed

+41
-37
lines changed

5 files changed

+41
-37
lines changed

src/lib/output/themes/default/DefaultTheme.tsx

+22-13
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class DefaultTheme extends Theme {
9999
return this.getRenderContext(pageEvent).defaultLayout(template, pageEvent);
100100
};
101101

102-
getReflectionClasses(reflection: DeclarationReflection | DocumentReflection) {
102+
getReflectionClasses(reflection: Reflection) {
103103
const filters = this.application.options.getValue("visibilityFilters") as Record<string, boolean>;
104104
return getReflectionClasses(reflection, filters);
105105
}
@@ -502,46 +502,55 @@ export class DefaultTheme extends Theme {
502502
}
503503
}
504504

505-
function getReflectionClasses(
506-
reflection: DeclarationReflection | DocumentReflection,
507-
filters: Record<string, boolean>,
508-
) {
509-
const classes: string[] = [];
505+
function getReflectionClasses(reflection: Reflection, filters: Record<string, boolean>) {
506+
const classes = new Set<string>();
510507

511508
// Filter classes should match up with the settings function in
512509
// partials/navigation.tsx.
513510
for (const key of Object.keys(filters)) {
514511
if (key === "inherited") {
515512
if (reflection.flags.isInherited) {
516-
classes.push("tsd-is-inherited");
513+
classes.add("tsd-is-inherited");
517514
}
518515
} else if (key === "protected") {
519516
if (reflection.flags.isProtected) {
520-
classes.push("tsd-is-protected");
517+
classes.add("tsd-is-protected");
521518
}
522519
} else if (key === "private") {
523520
if (reflection.flags.isPrivate) {
524-
classes.push("tsd-is-private");
521+
classes.add("tsd-is-private");
525522
}
526523
} else if (key === "external") {
527524
if (reflection.flags.isExternal) {
528-
classes.push("tsd-is-external");
525+
classes.add("tsd-is-external");
529526
}
530527
} else if (key.startsWith("@")) {
531528
if (key === "@deprecated") {
532529
if (reflection.isDeprecated()) {
533-
classes.push(toStyleClass(`tsd-is-${key.substring(1)}`));
530+
classes.add(toStyleClass(`tsd-is-${key.substring(1)}`));
534531
}
535532
} else if (
536533
reflection.comment?.hasModifier(key as `@${string}`) ||
537534
reflection.comment?.getTag(key as `@${string}`)
538535
) {
539-
classes.push(toStyleClass(`tsd-is-${key.substring(1)}`));
536+
classes.add(toStyleClass(`tsd-is-${key.substring(1)}`));
537+
} else if (reflection.isDeclaration()) {
538+
const ownSignatures = reflection.getNonIndexSignatures();
539+
// Check methods and accessors, find common tags, elevate
540+
if (
541+
ownSignatures.length &&
542+
ownSignatures.every(
543+
(refl) =>
544+
refl.comment?.hasModifier(key as `@${string}`) || refl.comment?.getTag(key as `@${string}`),
545+
)
546+
) {
547+
classes.add(toStyleClass(`tsd-is-${key.substring(1)}`));
548+
}
540549
}
541550
}
542551
}
543552

544-
return classes.join(" ");
553+
return Array.from(classes).join(" ");
545554
}
546555

547556
function shouldShowCategories(reflection: Reflection, opts: { includeCategories: boolean; includeGroups: boolean }) {

src/lib/output/themes/default/DefaultThemeRenderContext.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@ import type {
33
Internationalization,
44
TranslationProxy,
55
} from "../../../internationalization/internationalization.js";
6-
import type {
7-
DocumentReflection,
8-
CommentDisplayPart,
9-
DeclarationReflection,
10-
Reflection,
11-
} from "../../../models/index.js";
6+
import type { CommentDisplayPart, Reflection } from "../../../models/index.js";
127
import { type NeverIfInternal, type Options } from "../../../utils/index.js";
138
import type { DefaultTheme } from "./DefaultTheme.js";
149
import { defaultLayout } from "./layouts/default.js";
@@ -123,7 +118,7 @@ export class DefaultThemeRenderContext {
123118

124119
getNavigation = () => this.theme.getNavigation(this.page.project);
125120

126-
getReflectionClasses = (refl: DeclarationReflection | DocumentReflection) =>
121+
getReflectionClasses = (refl: Reflection) =>
127122
this.theme.getReflectionClasses(refl);
128123

129124
documentTemplate = bind(documentTemplate, this);

src/lib/output/themes/default/partials/member.getterSetter.tsx

+10-10
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@ export const memberGetterSetter = (context: DefaultThemeRenderContext, props: De
1414
)}
1515
>
1616
{!!props.getSignature && (
17-
<>
18-
<li class="tsd-signature" id={props.getSignature.anchor}>
17+
<li class={context.getReflectionClasses(props.getSignature)}>
18+
<div class="tsd-signature" id={props.getSignature.anchor}>
1919
{context.memberSignatureTitle(props.getSignature)}
20-
</li>
21-
<li class="tsd-description">{context.memberSignatureBody(props.getSignature)}</li>
22-
</>
20+
</div>
21+
<div class="tsd-description">{context.memberSignatureBody(props.getSignature)}</div>
22+
</li>
2323
)}
2424
{!!props.setSignature && (
25-
<>
26-
<li class="tsd-signature" id={props.setSignature.anchor}>
25+
<li class={context.getReflectionClasses(props.setSignature)}>
26+
<div class="tsd-signature" id={props.setSignature.anchor}>
2727
{context.memberSignatureTitle(props.setSignature)}
28-
</li>
29-
<li class="tsd-description">{context.memberSignatureBody(props.setSignature)}</li>
30-
</>
28+
</div>
29+
<div class="tsd-description">{context.memberSignatureBody(props.setSignature)}</div>
30+
</li>
3131
)}
3232
</ul>
3333
</>

src/lib/output/themes/default/partials/member.signatures.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ export const memberSignatures = (context: DefaultThemeRenderContext, props: Decl
88
<>
99
<ul class={classNames({ "tsd-signatures": true }, context.getReflectionClasses(props))}>
1010
{props.signatures?.map((item) => (
11-
<>
12-
<li class="tsd-signature tsd-anchor-link">
11+
<li class={context.getReflectionClasses(item)}>
12+
<div class="tsd-signature tsd-anchor-link">
1313
{item.anchor && <a id={item.anchor} class="tsd-anchor"></a>}
1414
{context.memberSignatureTitle(item)}
1515
{anchorIcon(context, item.anchor)}
16-
</li>
17-
<li class="tsd-description">{context.memberSignatureBody(item)}</li>
18-
</>
16+
</div>
17+
<div class="tsd-description">{context.memberSignatureBody(item)}</div>
18+
</li>
1919
))}
2020
</ul>
2121
</>

src/lib/output/themes/default/templates/reflection.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function reflectionTemplate(context: DefaultThemeRenderContext, props: Pa
6464
<section class="tsd-panel">{context.memberSignatures(props.model)}</section>
6565
)}
6666
{!!props.model.indexSignatures?.length && (
67-
<section class={classNames({ "tsd-panel": true }, context.getReflectionClasses(props.model))}>
67+
<section class="tsd-panel">
6868
<h4 class="tsd-before-signature">{context.i18n.theme_indexable()}</h4>
6969
<ul class="tsd-signatures">
7070
{props.model.indexSignatures.map((index) => renderIndexSignature(context, index))}
@@ -82,7 +82,7 @@ export function reflectionTemplate(context: DefaultThemeRenderContext, props: Pa
8282

8383
function renderIndexSignature(context: DefaultThemeRenderContext, index: SignatureReflection) {
8484
return (
85-
<li class="tsd-index-signature">
85+
<li class={classNames({ "tsd-index-signature": true }, context.getReflectionClasses(index))}>
8686
<div class="tsd-signature">
8787
{index.flags.isReadonly && <span class="tsd-signature-keyword">readonly </span>}
8888
<span class="tsd-signature-symbol">[</span>

0 commit comments

Comments
 (0)