mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
Merge branch 'main' of github.com:learn-anything/learn-anything
This commit is contained in:
@@ -10,11 +10,13 @@ export const LinkCollection: React.FC = () => {
|
|||||||
topicsWantToLearn: [],
|
topicsWantToLearn: [],
|
||||||
topicsLearning: [],
|
topicsLearning: [],
|
||||||
topicsLearned: [],
|
topicsLearned: [],
|
||||||
|
tasks: [],
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const linkCount = me?.root.personalLinks?.length || 0
|
const linkCount = me?.root.personalLinks?.length || 0
|
||||||
const pageCount = me?.root.personalPages?.length || 0
|
const pageCount = me?.root.personalPages?.length || 0
|
||||||
|
const taskCount = me?.root.tasks?.length || 0
|
||||||
|
|
||||||
const topicCount =
|
const topicCount =
|
||||||
(me?.root.topicsWantToLearn?.length || 0) +
|
(me?.root.topicsWantToLearn?.length || 0) +
|
||||||
@@ -26,6 +28,12 @@ export const LinkCollection: React.FC = () => {
|
|||||||
<NavItem to="/links" title="Links" icon="Link" count={linkCount} />
|
<NavItem to="/links" title="Links" icon="Link" count={linkCount} />
|
||||||
<NavItem to="/topics" title="Topics" icon="Hash" count={topicCount} />
|
<NavItem to="/topics" title="Topics" icon="Hash" count={topicCount} />
|
||||||
<NavItem to="/pages" title="Pages" icon="Layers" count={pageCount} />
|
<NavItem to="/pages" title="Pages" icon="Layers" count={pageCount} />
|
||||||
|
<NavItem
|
||||||
|
to="/tasks"
|
||||||
|
title="Tasks"
|
||||||
|
icon="BookOpenCheck"
|
||||||
|
count={taskCount}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export const LinkSection: React.FC = () => {
|
|||||||
const linkCount = me.root.personalLinks?.length || 0
|
const linkCount = me.root.personalLinks?.length || 0
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-px py-2">
|
<div className="flex flex-col gap-px">
|
||||||
<LinkSectionHeader linkCount={linkCount} />
|
<LinkSectionHeader linkCount={linkCount} />
|
||||||
<LinkList personalLinks={me.root.personalLinks} />
|
<LinkList personalLinks={me.root.personalLinks} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -59,9 +59,13 @@ export const TaskSection: React.FC = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="group/tasks flex flex-col gap-px py-2">
|
<div className="group/tasks flex flex-col gap-px">
|
||||||
<TaskSectionHeader title="Tasks" count={taskCount} />
|
|
||||||
<TaskSectionHeader
|
<TaskSectionHeader
|
||||||
|
title="Tasks"
|
||||||
|
iconName="BookOpenCheck"
|
||||||
|
count={taskCount}
|
||||||
|
/>
|
||||||
|
{/* <TaskSectionHeader
|
||||||
title="Today"
|
title="Today"
|
||||||
iconName="BookOpenCheck"
|
iconName="BookOpenCheck"
|
||||||
filter="today"
|
filter="today"
|
||||||
@@ -72,7 +76,7 @@ export const TaskSection: React.FC = () => {
|
|||||||
iconName="History"
|
iconName="History"
|
||||||
filter="upcoming"
|
filter="upcoming"
|
||||||
count={upcomingTasks.length}
|
count={upcomingTasks.length}
|
||||||
/>
|
/> */}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -86,25 +90,24 @@ interface TaskSectionHeaderProps {
|
|||||||
|
|
||||||
const TaskSectionHeader: React.FC<TaskSectionHeaderProps> = ({
|
const TaskSectionHeader: React.FC<TaskSectionHeaderProps> = ({
|
||||||
title,
|
title,
|
||||||
filter,
|
|
||||||
count,
|
count,
|
||||||
iconName,
|
iconName,
|
||||||
}) => (
|
}) => (
|
||||||
<Link
|
<Link
|
||||||
to="/tasks"
|
to="/tasks"
|
||||||
className={cn(
|
className={cn(
|
||||||
"flex min-h-[30px] flex-1 items-center justify-start gap-px rounded-md px-2 py-1 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-0",
|
"flex min-h-[30px] flex-1 items-center justify-between gap-px rounded-md px-2 py-1 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-0",
|
||||||
)}
|
)}
|
||||||
search={{ filter }}
|
|
||||||
activeProps={{
|
activeProps={{
|
||||||
className: "bg-accent text-accent-foreground",
|
className: "bg-accent text-accent-foreground",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{iconName && <LaIcon className="size-13 shrink-0 pr-2" name={iconName} />}
|
<div className="flex items-center">
|
||||||
|
{iconName && (
|
||||||
<p className="text-sm">
|
<LaIcon className="size-13 shrink-0 pr-2 opacity-50" name={iconName} />
|
||||||
{title}
|
)}
|
||||||
{count > 0 && <span className="ml-1 text-muted-foreground">{count}</span>}
|
<p className="text-sm">{title}</p>
|
||||||
</p>
|
</div>
|
||||||
|
{count > 0 && <span className="text-muted-foreground">{count}</span>}
|
||||||
</Link>
|
</Link>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -129,12 +129,11 @@ const SidebarContent: React.FC = React.memo(() => {
|
|||||||
<div>
|
<div>
|
||||||
<LogoAndSearch />
|
<LogoAndSearch />
|
||||||
</div>
|
</div>
|
||||||
<div className="relative mb-0.5 mt-1.5 flex grow flex-col overflow-y-auto rounded-md px-3 outline-none">
|
<div className="relative mt-1.5 flex grow flex-col overflow-y-auto rounded-md px-3 outline-none">
|
||||||
<div className="h-2 shrink-0" />
|
<div className="h-2 shrink-0" />
|
||||||
{me._type === "Account" && <LinkCollection />}
|
{me._type === "Account" && <LinkCollection />}
|
||||||
{/* {me._type === "Account" && <LinkSection />} */}
|
|
||||||
{me._type === "Account" && <JournalSection />}
|
{me._type === "Account" && <JournalSection />}
|
||||||
{me._type === "Account" && <TaskSection />}
|
{/* {me._type === "Account" && <TaskSection />} */}
|
||||||
{me._type === "Account" && <PageSection />}
|
{me._type === "Account" && <PageSection />}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { createFileRoute } from "@tanstack/react-router"
|
import { createFileRoute, Link } from "@tanstack/react-router"
|
||||||
import { useAccount } from "@/lib/providers/jazz-provider"
|
import { useAccount } from "@/lib/providers/jazz-provider"
|
||||||
import { LaIcon } from "@/components/custom/la-icon"
|
import { LaIcon } from "@/components/custom/la-icon"
|
||||||
import { isToday, isFuture } from "date-fns"
|
import { isToday, isFuture } from "date-fns"
|
||||||
@@ -8,12 +8,59 @@ import { TaskForm } from "./-form"
|
|||||||
import { TaskList } from "./-list"
|
import { TaskList } from "./-list"
|
||||||
import { Task } from "~/lib/schema/task"
|
import { Task } from "~/lib/schema/task"
|
||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
|
import { cn } from "~/lib/utils"
|
||||||
// import { getFeatureFlag } from "~/actions"
|
// import { getFeatureFlag } from "~/actions"
|
||||||
|
|
||||||
const taskSearchSchema = z.object({
|
const taskSearchSchema = z.object({
|
||||||
filter: z.enum(["today", "upcoming"]).optional(),
|
filter: z.enum(["today", "upcoming"]).optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const TaskTabs: React.FC<{ filter?: string }> = ({ filter }) => {
|
||||||
|
return (
|
||||||
|
<div className="mb-4 flex items-center justify-center gap-2">
|
||||||
|
<Link
|
||||||
|
to="/tasks"
|
||||||
|
className={cn(
|
||||||
|
"flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors",
|
||||||
|
filter === undefined
|
||||||
|
? "bg-accent text-accent-foreground"
|
||||||
|
: "text-muted-foreground hover:bg-accent/50",
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<LaIcon name="ListTodo" className="size-4" />
|
||||||
|
All Tasks
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to="/tasks"
|
||||||
|
search={{ filter: "today" }}
|
||||||
|
className={cn(
|
||||||
|
"flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors",
|
||||||
|
filter === "today"
|
||||||
|
? "bg-accent text-accent-foreground"
|
||||||
|
: "text-muted-foreground hover:bg-accent/50",
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<LaIcon name="BookOpenCheck" className="size-4" />
|
||||||
|
Today
|
||||||
|
</Link>
|
||||||
|
|
||||||
|
<Link
|
||||||
|
to="/tasks"
|
||||||
|
search={{ filter: "upcoming" }}
|
||||||
|
className={cn(
|
||||||
|
"flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors",
|
||||||
|
filter === "upcoming"
|
||||||
|
? "bg-accent text-accent-foreground"
|
||||||
|
: "text-muted-foreground hover:bg-accent/50",
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<LaIcon name="History" className="size-4" />
|
||||||
|
Upcoming
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export const Route = createFileRoute("/_layout/_pages/_protected/tasks/")({
|
export const Route = createFileRoute("/_layout/_pages/_protected/tasks/")({
|
||||||
// beforeLoad: async ({ context }) => {
|
// beforeLoad: async ({ context }) => {
|
||||||
// if (!context.user.id) {
|
// if (!context.user.id) {
|
||||||
@@ -66,7 +113,8 @@ function TaskComponent() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col space-y-4 p-4">
|
<div className="flex flex-col space-y-4 p-4">
|
||||||
<div className="flex flex-row items-center gap-1">
|
<TaskTabs filter={filter} />
|
||||||
|
{/* <div className="flex flex-row items-center gap-1">
|
||||||
<LaIcon
|
<LaIcon
|
||||||
name={
|
name={
|
||||||
filter === "today"
|
filter === "today"
|
||||||
@@ -84,7 +132,7 @@ function TaskComponent() {
|
|||||||
? "Upcoming Tasks"
|
? "Upcoming Tasks"
|
||||||
: "All Tasks"}
|
: "All Tasks"}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div> */}
|
||||||
<TaskForm />
|
<TaskForm />
|
||||||
<TaskList
|
<TaskList
|
||||||
tasks={
|
tasks={
|
||||||
|
|||||||
Reference in New Issue
Block a user