site/dotnet/index.11ty.tsx (190 lines of code) (raw):
import { LayoutContext } from "../../src/models";
import ListingSection from "../../_includes/pageelements/ListingSection.11ty";
import HeroSection from "../../_includes/pageelements/HeroSection.11ty";
import {
Channel,
ChannelFrontmatter,
ChannelHomepageData,
} from "../../_includes/resources/channel/ChannelModels";
import { BaseLayout } from "../../_includes/layouts/BaseLayout.11ty";
import MultiColumnSection from "../../_includes/pageelements/MultiColumnSection";
import {
PLAYLIST_RESOURCE,
TIP_RESOURCE,
TUTORIAL_RESOURCE,
TUTORIAL_STEP_RESOURCE,
} from "../../src/resourceType";
const frontmatter: ChannelFrontmatter = {
title: ".NET",
subtitle:
"A learning journey into .NET\nand tools like ReSharper, Rider and more.",
resourceType: "channel",
date: new Date(Date.UTC(2023, 10, 3)),
author: "maartenba",
logo: "thumbnail.png",
hero: "/assets/splashes/dotnet.svg",
subnav: [
{ title: "Downloads", url: "https://www.jetbrains.com/dotnet/" },
{ title: "Blog", url: "https://blog.jetbrains.com/dotnet/" },
{ title: "Docs", url: "https://www.jetbrains.com/help/" },
],
};
export default class DotNetHomepage {
data() {
return {
layout: "",
...frontmatter,
};
}
render(this: LayoutContext, data: ChannelHomepageData): JSX.Element {
const channel: Channel = this.getResource(data.page.url) as Channel;
const topics = this.getResources({
resourceTypes: "topic",
channel: channel.url,
limit: 6,
customFilter: (r) =>
r.label != undefined &&
(r.label.indexOf("blazor") >= 0 ||
r.label.indexOf("csharp") >= 0 ||
r.label.indexOf("fsharp") >= 0 ||
r.label.indexOf(".net") >= 0 ||
r.label.indexOf("asp.net") >= 0),
});
const tips = this.getResources({
resourceTypes: [TIP_RESOURCE],
channel: channel.url,
limit: 4,
});
const tutorials = this.getResources({
resourceTypes: [TUTORIAL_RESOURCE],
channel: channel.url,
limit: 4,
});
const refactoringTips = this.getResources({
resourceTypes: [TIP_RESOURCE],
channel: channel.url,
limit: 4,
customFilter: (r) => r.topics?.includes("refactoring") == true,
});
const aspNetTutorials = this.getResources({
resourceTypes: [TUTORIAL_RESOURCE],
channel: channel.url,
limit: 4,
customFilter: (r) =>
r.topics?.includes("asp.net") == true &&
r.topics?.includes("docker") == false,
sorter: (a, b) => (a.date > b.date ? 1 : -1),
});
const profilingContent = this.getResources({
resourceTypes: [TIP_RESOURCE, TUTORIAL_RESOURCE, TUTORIAL_STEP_RESOURCE],
limit: 4,
customFilter: (r) =>
r.topics?.includes(".net") == true &&
r.topics?.includes("profiling") == true,
sorter: (a, b) =>
a.slug.indexOf("rider-profiling") >= 0 || a.date > b.date ? -1 : 1,
});
const eventPlaylists = this.getResources({
resourceTypes: [PLAYLIST_RESOURCE],
channel: channel.url,
limit: 4,
customFilter: (r) =>
r.slug.indexOf("day-online") >= 0 || r.slug.indexOf("days-online") >= 0,
});
return (
<BaseLayout {...data}>
<HeroSection
title={channel.title}
subtitle={channel.subtitle!}
image={channel.hero!}
titleExtraClass={"has-text-white"}
subtitleExtraClass={"has-text-white"}
/>
<MultiColumnSection>
<div class="columns is-multiline is-centered">
{topics.map((topic) => {
let figure: JSX.Element;
if (topic.icon) {
figure = (
<i class={`${topic.icon} has-text-${topic.accent} fa-2x`} />
);
} else if (topic.logo) {
figure = <img src={topic.logo} alt={topic.title} />;
} else {
figure = (
<i class={`fas fa-file has-text-${topic.accent} fa-2x`} />
);
}
return (
<div class="column mb-1 is-6 is-2-desktop py-5 has-box-hover has-text-centered has-position-relative">
<a
href={topic.url}
aria-label={`Topic`}
class="is-size-5 has-text-weight-bold title is-stretched-link"
>
<figure class="image is-48x48 mb-1 mx-auto">
{figure}
</figure>
{topic.title}
</a>
</div>
);
})}
</div>
</MultiColumnSection>
{aspNetTutorials && (
<ListingSection
title={`Learn ASP.NET Core`}
subtitle={`Tutorials that help you build amazing web experiences with .NET.`}
resources={aspNetTutorials}
moreLink={`${channel.url}technologies/asp.net/`}
separator={false}
includeCardFooter={false}
/>
)}
{refactoringTips && (
<ListingSection
title={`Learn about refactoring`}
resources={refactoringTips}
moreLink={`/tags/refactoring/`}
separator={true}
includeCardFooter={false}
/>
)}
{profilingContent && (
<ListingSection
title={`Make your .NET apps faster!`}
resources={profilingContent}
moreLink={`/tags/profiling/`}
separator={false}
includeCardFooter={false}
includeContentType={true}
sectionExtraClass={"has-background-grey-lighter"}
/>
)}
{tutorials && (
<ListingSection
title={`Latest tutorials`}
resources={tutorials}
moreLink={`${channel.url}tutorials/`}
separator={false}
/>
)}
{tips && (
<ListingSection
title={`Latest tips`}
resources={tips}
moreLink={`${channel.url}tips/`}
separator={false}
/>
)}
{eventPlaylists && (
<ListingSection
title={`Event recordings`}
resources={eventPlaylists}
separator={false}
includeCardFooter={false}
sectionExtraClass={"has-background-grey-lighter"}
/>
)}
</BaseLayout>
);
}
}