_includes/resources/topic/TopicModels.ts (43 lines of code) (raw):
import { Static, Type } from "@sinclair/typebox";
import { EleventyPage } from "../../../src/models";
import { IconField, LabelField } from "../commonModels";
import { Resource, ResourceFrontmatter } from "../../../src/ResourceModels";
import { TOPIC_RESOURCE_TYPE } from "../../../src/resourceType";
import path from "upath";
export const TopicFrontmatter = Type.Intersect([
ResourceFrontmatter,
LabelField,
IconField,
]);
export type TopicFrontmatter = Static<typeof TopicFrontmatter>;
export class Topic
extends Resource<TOPIC_RESOURCE_TYPE>
implements TopicFrontmatter
{
accent?: string;
icon?: string;
label: string;
logo?: string;
topicType?: string;
thumbnail?: string;
static frontmatterSchema = TopicFrontmatter;
static joinKey = "topics"; // What field on resource? Used in label namespace.
constructor({ data, page }: { data: TopicFrontmatter; page: EleventyPage }) {
super({
data,
page,
});
this.label = data.label ? data.label : page.fileSlug;
this.topicType = data.topicType;
this.logo = data.logo;
this.accent = data.accent;
// font-awesome string
this.icon = data.icon;
if (data.logo) {
this.logo = path.join(page.url, data.logo);
this.thumbnail = this.logo;
}
}
getThumbnail(): string {
return this.logo ? this.logo! : this.icon!;
}
}