@@ -15,9 +15,10 @@ interface Props {
1515}
1616
1717interface UserMemoStats {
18- links : number ;
19- todos : number ;
18+ link : number ;
19+ taskList : number ;
2020 code : number ;
21+ incompleteTasks : number ;
2122}
2223
2324const UserStatisticsView = ( props : Props ) => {
@@ -27,7 +28,7 @@ const UserStatisticsView = (props: Props) => {
2728 const filterStore = useFilterStore ( ) ;
2829 const [ memoAmount , setMemoAmount ] = useState ( 0 ) ;
2930 const [ isRequesting , setIsRequesting ] = useState ( false ) ;
30- const [ memoStats , setMemoStats ] = useState < UserMemoStats > ( { links : 0 , todos : 0 , code : 0 } ) ;
31+ const [ memoStats , setMemoStats ] = useState < UserMemoStats > ( { link : 0 , taskList : 0 , code : 0 , incompleteTasks : 0 } ) ;
3132 const days = Math . ceil ( ( Date . now ( ) - user . createTime ! . getTime ( ) ) / 86400000 ) ;
3233 const memos = Object . values ( memoStore . getState ( ) . memoMapByName ) ;
3334 const filter = filterStore . state ;
@@ -37,17 +38,20 @@ const UserStatisticsView = (props: Props) => {
3738 const { properties } = await memoServiceClient . listMemoProperties ( {
3839 name : `memos/-` ,
3940 } ) ;
40- const memoStats : UserMemoStats = { links : 0 , todos : 0 , code : 0 } ;
41+ const memoStats : UserMemoStats = { link : 0 , taskList : 0 , code : 0 , incompleteTasks : 0 } ;
4142 properties . forEach ( ( property ) => {
4243 if ( property . hasLink ) {
43- memoStats . links += 1 ;
44+ memoStats . link += 1 ;
4445 }
4546 if ( property . hasTaskList ) {
46- memoStats . todos += 1 ;
47+ memoStats . taskList += 1 ;
4748 }
4849 if ( property . hasCode ) {
4950 memoStats . code += 1 ;
5051 }
52+ if ( property . hasIncompleteTasks ) {
53+ memoStats . incompleteTasks += 1 ;
54+ }
5155 } ) ;
5256 setMemoStats ( memoStats ) ;
5357 setMemoAmount ( properties . length ) ;
@@ -94,7 +98,7 @@ const UserStatisticsView = (props: Props) => {
9498 < div className = "w-full mt-1 flex flex-row justify-start items-center gap-x-2 gap-y-1 flex-wrap" >
9599 < div
96100 className = { clsx (
97- "w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center cursor-pointer hover:opacity-80 " ,
101+ "w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center cursor-pointer hover:shadow " ,
98102 filter . memoPropertyFilter ?. hasLink ? "bg-blue-50 dark:bg-blue-900 shadow" : "" ,
99103 ) }
100104 onClick = { ( ) => filterStore . setMemoPropertyFilter ( { hasLink : ! filter . memoPropertyFilter ?. hasLink } ) }
@@ -103,11 +107,11 @@ const UserStatisticsView = (props: Props) => {
103107 < Icon . Link className = "w-4 h-auto mr-1" />
104108 < span className = "block text-sm" > { t ( "memo.links" ) } </ span >
105109 </ div >
106- < span className = "text-sm truncate" > { memoStats . links } </ span >
110+ < span className = "text-sm truncate" > { memoStats . link } </ span >
107111 </ div >
108112 < div
109113 className = { clsx (
110- "w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center cursor-pointer hover:opacity-80 " ,
114+ "w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center cursor-pointer hover:shadow " ,
111115 filter . memoPropertyFilter ?. hasTaskList ? "bg-blue-50 dark:bg-blue-900 shadow" : "" ,
112116 ) }
113117 onClick = { ( ) => filterStore . setMemoPropertyFilter ( { hasTaskList : ! filter . memoPropertyFilter ?. hasTaskList } ) }
@@ -116,11 +120,19 @@ const UserStatisticsView = (props: Props) => {
116120 < Icon . CheckCircle className = "w-4 h-auto mr-1" />
117121 < span className = "block text-sm" > { t ( "memo.to-do" ) } </ span >
118122 </ div >
119- < span className = "text-sm truncate" > { memoStats . todos } </ span >
123+ { memoStats . incompleteTasks > 0 && (
124+ < >
125+ < Tooltip title = { "Incomplete tasks" } placement = "top" arrow >
126+ < span className = "text-sm truncate" > { memoStats . taskList - memoStats . incompleteTasks } </ span >
127+ </ Tooltip >
128+ < span className = "text-sm font-mono opacity-50" > /</ span >
129+ </ >
130+ ) }
131+ < span className = "text-sm truncate" > { memoStats . taskList } </ span >
120132 </ div >
121133 < div
122134 className = { clsx (
123- "w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center cursor-pointer hover:opacity-80 " ,
135+ "w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center cursor-pointer hover:shadow " ,
124136 filter . memoPropertyFilter ?. hasCode ? "bg-blue-50 dark:bg-blue-900 shadow" : "" ,
125137 ) }
126138 onClick = { ( ) => filterStore . setMemoPropertyFilter ( { hasCode : ! filter . memoPropertyFilter ?. hasCode } ) }
0 commit comments