add eexiv whitepaper and recent documents list

This commit is contained in:
Youwen Wu 2024-02-13 22:36:13 -08:00
parent 53eba1cc38
commit 7c6785042d
6 changed files with 144 additions and 70 deletions

Binary file not shown.

View file

@ -0,0 +1,63 @@
import { epoch2datestring } from '@/app/utils/epoch2datestring'
import { documents, topics as topicsList } from '@/app/db/data'
import Link from 'next/link'
const RandomDocs = (): React.ReactNode[] => {
// Convert the object keys into an array
const keys = Object.keys(documents)
// Determine the number of keys to process (all if fewer than 10)
const numKeysToProcess = keys.length < 10 ? keys.length : 10
// Shuffle the keys array if there are more than 10 keys
if (keys.length > 10) {
for (let i = keys.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1))
;[keys[i], keys[j]] = [keys[j], keys[i]]
}
}
// Select keys based on numKeysToProcess
const selectedKeys = keys.slice(0, numKeysToProcess)
// Iterate over each of the selected keys
return selectedKeys.map((key, index) => {
const { title, dates, type, topics } = documents[key].manifest
let dateString = epoch2datestring(dates[dates.length - 1])
let typeString = ''
switch (type) {
case 'report':
typeString = 'report'
break
case 'presentation':
typeString = 'presentation'
break
case 'white paper':
typeString = 'white paper'
break
case 'datasheet':
typeString = 'datasheet'
break
case 'dwm':
typeString = 'DWM'
break
case 'guide':
typeString = 'guide'
break
case 'other':
typeString = 'document'
break
}
return (
<div key={key}>
<Link href={`/document/view/${key}`}>{title}</Link>, a {typeString}{' '}
about {topicsList[topics[0]]['name']} published on {dateString}
.
<br />
</div>
)
})
}
export default RandomDocs

View file

@ -0,0 +1,70 @@
import { epoch2datestring } from '@/app/utils/epoch2datestring'
import { documents, topics as topicsList, Document } from '@/app/db/data'
import Link from 'next/link'
function getThreeMostRecentDocuments(
docs: Readonly<{ [key: string]: Document }>
): { [key: string]: Document } {
return Object.entries(docs)
.filter(([_, document]) => document.manifest.status !== 'draft') // Exclude documents with status 'draft'
.map(([slug, document]) => ({
slug,
document,
latestDate: document.manifest.dates[document.manifest.dates.length - 1], // Get the last (latest) date
}))
.sort((a, b) => b.latestDate - a.latestDate) // Sort by the latest date, descending
.slice(0, 3) // Take the top 3
.reduce(
(acc, { slug, document }) => {
acc[slug] = document // Reconstruct the object with the top 3 documents
return acc
},
{} as { [key: string]: Document }
)
}
const RecentDocuments = (): React.ReactNode[] => {
// Convert the object keys into an array
const keys = Object.keys(getThreeMostRecentDocuments(documents))
// Iterate over each of the selected keys
return keys.map((key) => {
const { title, dates, type, topics } = documents[key].manifest
let dateString = epoch2datestring(dates[dates.length - 1])
let typeString = ''
switch (type) {
case 'report':
typeString = 'report'
break
case 'presentation':
typeString = 'presentation'
break
case 'white paper':
typeString = 'white paper'
break
case 'datasheet':
typeString = 'datasheet'
break
case 'dwm':
typeString = 'DWM'
break
case 'guide':
typeString = 'guide'
break
case 'other':
typeString = 'document'
break
}
return (
<div key={key}>
<Link href={`/document/view/${key}`}>{title}</Link>, a {typeString}{' '}
about {topicsList[topics[0]]['name']} published on {dateString}
.
<br />
</div>
)
})
}
export default RecentDocuments

View file

@ -285,10 +285,10 @@ On Day 1 we will discuss the ins and outs of the robot. The Electrical Sub team
title: 'eeXiv White Paper', title: 'eeXiv White Paper',
authors: ['ywu', 'avenkatesh'], authors: ['ywu', 'avenkatesh'],
topics: ['eecs', 'frc'], topics: ['eecs', 'frc'],
dates: [1707811359], dates: [1707811359, 1707891311],
type: 'white paper', type: 'white paper',
latest: 1, latest: 2,
status: 'draft', status: 'under review',
keywords: [ keywords: [
'eexiv', 'eexiv',
'white paper', 'white paper',

View file

@ -1,78 +1,16 @@
import Link from 'next/link' import Link from 'next/link'
import { import { documents, authors, affiliations } from './db/data'
documents,
authors,
topics as topicsList,
affiliations,
} from './db/data'
import { epoch2datestring } from './utils/epoch2datestring'
import News from './components/News' import News from './components/News'
import RandomDocs from './components/RandomDocs'
import RecentDocuments from './components/RecentDocuments'
export default function Home() { export default function Home() {
const RandomDocs = (): React.ReactNode[] => {
// Convert the object keys into an array
const keys = Object.keys(documents)
// Determine the number of keys to process (all if fewer than 10)
const numKeysToProcess = keys.length < 10 ? keys.length : 10
// Shuffle the keys array if there are more than 10 keys
if (keys.length > 10) {
for (let i = keys.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1))
;[keys[i], keys[j]] = [keys[j], keys[i]]
}
}
// Select keys based on numKeysToProcess
const selectedKeys = keys.slice(0, numKeysToProcess)
// Iterate over each of the selected keys
return selectedKeys.map((key, index) => {
const { title, dates, type, topics } = documents[key].manifest
let dateString = epoch2datestring(dates[dates.length - 1])
let typeString = ''
switch (type) {
case 'report':
typeString = 'report'
break
case 'presentation':
typeString = 'presentation'
break
case 'white paper':
typeString = 'white paper'
break
case 'datasheet':
typeString = 'datasheet'
break
case 'dwm':
typeString = 'DWM'
break
case 'guide':
typeString = 'guide'
break
case 'other':
typeString = 'document'
break
}
return (
<div key={index}>
<Link href={`/document/view/${key}`}>{title}</Link>, a {typeString}{' '}
about {topicsList[topics[0]]['name']} published on {dateString}
.
<br />
</div>
)
})
}
const AuthorDisplay = () => { const AuthorDisplay = () => {
return Object.entries(authors).map(([author, data], index) => { return Object.entries(authors).map(([author, data], index) => {
let affiliationSlug = data.affiliation[0].split('@')[1] let affiliationSlug = data.affiliation[0].split('@')[1]
let affiliation = affiliations[affiliationSlug] let affiliation = affiliations[affiliationSlug]
return ( return (
<div key={index}> <div key={author}>
<Link href={`/author/${author}`}> <Link href={`/author/${author}`}>
{data.name.first} {data.name.first}
{data.name.nickname ? ` "${data.name.nickname}" ` : ' '} {data.name.nickname ? ` "${data.name.nickname}" ` : ' '}
@ -106,6 +44,9 @@ export default function Home() {
</p> </p>
<News /> <News />
<div className='grid grid-cols-1 space-y-2 mt-4 basis-full'> <div className='grid grid-cols-1 space-y-2 mt-4 basis-full'>
<hr className='mx-auto w-full h-1 border-0 bg-slate-200 my-2 rounded-md' />
<span className='font-serif text-xl'>Recently released documents</span>
<RecentDocuments />
<hr className='mx-auto w-full h-1 border-0 bg-slate-200 my-2 rounded-md' /> <hr className='mx-auto w-full h-1 border-0 bg-slate-200 my-2 rounded-md' />
<span className='font-serif text-xl'> <span className='font-serif text-xl'>
Selected documents in various disciplines Selected documents in various disciplines

View file

@ -55,7 +55,7 @@ const miniSearch = new MiniSearch({
authors: 2, authors: 2,
abstract: 0.3, abstract: 0.3,
}, },
fuzzy: 2, fuzzy: 0.2,
prefix: true, prefix: true,
}, },
}) })