Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
5ebbed91
Commit
5ebbed91
authored
Jan 15, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: handle tag click
parent
7ae4299d
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
33 additions
and
21 deletions
+33
-21
Tag.tsx
web/src/components/MemoContent/Tag.tsx
+23
-1
index.tsx
web/src/components/MemoContent/index.tsx
+4
-4
MemoView.tsx
web/src/components/MemoView.tsx
+2
-12
MemoDetail.tsx
web/src/pages/MemoDetail.tsx
+4
-4
No files found.
web/src/components/MemoContent/Tag.tsx
View file @
5ebbed91
import
{
useContext
}
from
"react"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
RendererContext
}
from
"./types"
;
interface
Props
{
interface
Props
{
content
:
string
;
content
:
string
;
}
}
const
Tag
:
React
.
FC
<
Props
>
=
({
content
}:
Props
)
=>
{
const
Tag
:
React
.
FC
<
Props
>
=
({
content
}:
Props
)
=>
{
const
context
=
useContext
(
RendererContext
);
const
filterStore
=
useFilterStore
();
const
handleTagClick
=
()
=>
{
if
(
context
.
readonly
)
{
return
;
}
const
currTagQuery
=
filterStore
.
getState
().
tag
;
if
(
currTagQuery
===
content
)
{
filterStore
.
setTagFilter
(
undefined
);
}
else
{
filterStore
.
setTagFilter
(
content
);
}
};
return
(
return
(
<
span
className=
"tag-container cursor-pointer inline-block w-auto text-blue-600 dark:text-blue-400 hover:opacity-80"
>
#
{
content
}
</
span
>
<
span
className=
"cursor-pointer inline-block w-auto text-blue-600 dark:text-blue-400 hover:opacity-80"
onClick=
{
handleTagClick
}
>
#
{
content
}
</
span
>
);
);
};
};
...
...
web/src/components/MemoContent/index.tsx
View file @
5ebbed91
...
@@ -10,19 +10,19 @@ interface Props {
...
@@ -10,19 +10,19 @@ interface Props {
memoId
?:
number
;
memoId
?:
number
;
readonly
?:
boolean
;
readonly
?:
boolean
;
className
?:
string
;
className
?:
string
;
on
MemoContent
Click
?:
(
e
:
React
.
MouseEvent
)
=>
void
;
onClick
?:
(
e
:
React
.
MouseEvent
)
=>
void
;
}
}
const
MemoContent
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
MemoContent
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
{
className
,
memoId
,
nodes
,
on
MemoContent
Click
}
=
props
;
const
{
className
,
memoId
,
nodes
,
onClick
}
=
props
;
const
currentUser
=
useCurrentUser
();
const
currentUser
=
useCurrentUser
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
memoContentContainerRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
memoContentContainerRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
allowEdit
=
!
props
.
readonly
&&
memoId
&&
currentUser
?.
id
===
memoStore
.
getMemoById
(
memoId
)?.
creatorId
;
const
allowEdit
=
!
props
.
readonly
&&
memoId
&&
currentUser
?.
id
===
memoStore
.
getMemoById
(
memoId
)?.
creatorId
;
const
handleMemoContentClick
=
async
(
e
:
React
.
MouseEvent
)
=>
{
const
handleMemoContentClick
=
async
(
e
:
React
.
MouseEvent
)
=>
{
if
(
on
MemoContent
Click
)
{
if
(
onClick
)
{
on
MemoContent
Click
(
e
);
onClick
(
e
);
}
}
};
};
...
...
web/src/components/MemoView.tsx
View file @
5ebbed91
...
@@ -8,7 +8,6 @@ import { UNKNOWN_ID } from "@/helpers/consts";
...
@@ -8,7 +8,6 @@ import { UNKNOWN_ID } from "@/helpers/consts";
import
{
getRelativeTimeString
,
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
{
getRelativeTimeString
,
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useUserStore
,
extractUsernameFromName
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useUserStore
,
extractUsernameFromName
,
useMemoStore
}
from
"@/store/v1"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
...
@@ -41,7 +40,6 @@ const MemoView: React.FC<Props> = (props: Props) => {
...
@@ -41,7 +40,6 @@ const MemoView: React.FC<Props> = (props: Props) => {
const
t
=
useTranslate
();
const
t
=
useTranslate
();
const
navigateTo
=
useNavigateTo
();
const
navigateTo
=
useNavigateTo
();
const
{
i18n
}
=
useTranslation
();
const
{
i18n
}
=
useTranslation
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
userStore
=
useUserStore
();
const
userStore
=
useUserStore
();
const
user
=
useCurrentUser
();
const
user
=
useCurrentUser
();
...
@@ -157,15 +155,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
...
@@ -157,15 +155,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
const
handleMemoContentClick
=
async
(
e
:
React
.
MouseEvent
)
=>
{
const
handleMemoContentClick
=
async
(
e
:
React
.
MouseEvent
)
=>
{
const
targetEl
=
e
.
target
as
HTMLElement
;
const
targetEl
=
e
.
target
as
HTMLElement
;
if
(
targetEl
.
classList
.
contains
(
"tag-container"
))
{
if
(
targetEl
.
tagName
===
"IMG"
)
{
const
tagName
=
targetEl
.
innerText
.
slice
(
1
);
const
currTagQuery
=
filterStore
.
getState
().
tag
;
if
(
currTagQuery
===
tagName
)
{
filterStore
.
setTagFilter
(
undefined
);
}
else
{
filterStore
.
setTagFilter
(
tagName
);
}
}
else
if
(
targetEl
.
tagName
===
"IMG"
)
{
const
imgUrl
=
targetEl
.
getAttribute
(
"src"
);
const
imgUrl
=
targetEl
.
getAttribute
(
"src"
);
if
(
imgUrl
)
{
if
(
imgUrl
)
{
showPreviewImageDialog
([
imgUrl
],
0
);
showPreviewImageDialog
([
imgUrl
],
0
);
...
@@ -263,7 +253,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
...
@@ -263,7 +253,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
)
}
)
}
</
div
>
</
div
>
</
div
>
</
div
>
<
MemoContent
memoId=
{
memo
.
id
}
nodes=
{
memo
.
nodes
}
onMemoContent
Click=
{
handleMemoContentClick
}
/>
<
MemoContent
memoId=
{
memo
.
id
}
nodes=
{
memo
.
nodes
}
readonly=
{
readonly
}
on
Click=
{
handleMemoContentClick
}
/>
<
MemoResourceListView
resourceList=
{
memo
.
resources
}
/>
<
MemoResourceListView
resourceList=
{
memo
.
resources
}
/>
<
MemoRelationListView
memo=
{
memo
}
relationList=
{
referenceRelations
}
/>
<
MemoRelationListView
memo=
{
memo
}
relationList=
{
referenceRelations
}
/>
</
div
>
</
div
>
...
...
web/src/pages/MemoDetail.tsx
View file @
5ebbed91
...
@@ -35,12 +35,12 @@ const MemoDetail = () => {
...
@@ -35,12 +35,12 @@ const MemoDetail = () => {
const
[
creator
,
setCreator
]
=
useState
<
User
>
();
const
[
creator
,
setCreator
]
=
useState
<
User
>
();
const
memoId
=
Number
(
params
.
memoId
);
const
memoId
=
Number
(
params
.
memoId
);
const
memo
=
memoStore
.
getMemoById
(
memoId
);
const
memo
=
memoStore
.
getMemoById
(
memoId
);
const
allowEdit
=
memo
?.
creatorId
===
currentUser
?.
id
;
const
[
parentMemo
,
setParentMemo
]
=
useState
<
Memo
|
undefined
>
(
undefined
);
const
[
parentMemo
,
setParentMemo
]
=
useState
<
Memo
|
undefined
>
(
undefined
);
const
referenceRelations
=
memo
?.
relations
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
)
||
[];
const
referenceRelations
=
memo
?.
relations
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
)
||
[];
const
commentRelations
=
const
commentRelations
=
memo
?.
relations
.
filter
((
relation
)
=>
relation
.
relatedMemoId
===
memo
?.
id
&&
relation
.
type
===
MemoRelation_Type
.
COMMENT
)
||
[];
memo
?.
relations
.
filter
((
relation
)
=>
relation
.
relatedMemoId
===
memo
?.
id
&&
relation
.
type
===
MemoRelation_Type
.
COMMENT
)
||
[];
const
comments
=
commentRelations
.
map
((
relation
)
=>
memoStore
.
getMemoById
(
relation
.
memoId
)).
filter
((
memo
)
=>
memo
)
as
any
as
Memo
[];
const
comments
=
commentRelations
.
map
((
relation
)
=>
memoStore
.
getMemoById
(
relation
.
memoId
)).
filter
((
memo
)
=>
memo
)
as
any
as
Memo
[];
const
readonly
=
memo
?.
creatorId
!==
currentUser
?.
id
;
// Prepare memo.
// Prepare memo.
useEffect
(()
=>
{
useEffect
(()
=>
{
...
@@ -136,12 +136,12 @@ const MemoDetail = () => {
...
@@ -136,12 +136,12 @@ const MemoDetail = () => {
</
Link
>
</
Link
>
</
div
>
</
div
>
)
}
)
}
<
MemoContent
memoId=
{
memo
.
id
}
nodes=
{
memo
.
nodes
}
readonly=
{
true
}
/>
<
MemoContent
memoId=
{
memo
.
id
}
nodes=
{
memo
.
nodes
}
readonly=
{
readonly
}
/>
<
MemoResourceListView
resourceList=
{
memo
.
resources
}
/>
<
MemoResourceListView
resourceList=
{
memo
.
resources
}
/>
<
MemoRelationListView
memo=
{
memo
}
relationList=
{
referenceRelations
}
/>
<
MemoRelationListView
memo=
{
memo
}
relationList=
{
referenceRelations
}
/>
<
div
className=
"w-full mt-3 flex flex-row justify-between items-center gap-2"
>
<
div
className=
"w-full mt-3 flex flex-row justify-between items-center gap-2"
>
<
div
className=
"flex flex-row justify-start items-center"
>
<
div
className=
"flex flex-row justify-start items-center"
>
{
allowEdit
&&
(
{
!
readonly
&&
(
<
Select
<
Select
className=
"w-auto text-sm"
className=
"w-auto text-sm"
variant=
"plain"
variant=
"plain"
...
@@ -162,7 +162,7 @@ const MemoDetail = () => {
...
@@ -162,7 +162,7 @@ const MemoDetail = () => {
)
}
)
}
</
div
>
</
div
>
<
div
className=
"flex flex-row sm:justify-end items-center"
>
<
div
className=
"flex flex-row sm:justify-end items-center"
>
{
allowEdit
&&
(
{
!
readonly
&&
(
<
Tooltip
title=
{
"Edit"
}
placement=
"top"
>
<
Tooltip
title=
{
"Edit"
}
placement=
"top"
>
<
IconButton
size=
"sm"
onClick=
{
handleEditMemoClick
}
>
<
IconButton
size=
"sm"
onClick=
{
handleEditMemoClick
}
>
<
Icon
.
Edit3
className=
"w-4 h-auto text-gray-600 dark:text-gray-400"
/>
<
Icon
.
Edit3
className=
"w-4 h-auto text-gray-600 dark:text-gray-400"
/>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment