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
13957472
Unverified
Commit
13957472
authored
Aug 05, 2025
by
boojack
Committed by
GitHub
Aug 05, 2025
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: merge visibility selector into save button
Signed-off-by:
boojack
<
stevenlgtm@gmail.com
>
parent
a5e441b6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
30 additions
and
22 deletions
+30
-22
index.tsx
web/src/components/MemoEditor/index.tsx
+30
-22
No files found.
web/src/components/MemoEditor/index.tsx
View file @
13957472
import
copy
from
"copy-to-clipboard"
;
import
{
isEqual
}
from
"lodash-es"
;
import
{
LoaderIcon
,
SendIcon
}
from
"lucide-react"
;
import
{
LoaderIcon
}
from
"lucide-react"
;
import
{
observer
}
from
"mobx-react-lite"
;
import
React
,
{
useEffect
,
useMemo
,
useRef
,
useState
}
from
"react"
;
import
{
toast
}
from
"react-hot-toast"
;
import
{
useTranslation
}
from
"react-i18next"
;
import
useLocalStorage
from
"react-use/lib/useLocalStorage"
;
import
VisibilityIcon
from
"@/components/VisibilityIcon"
;
import
{
Button
}
from
"@/components/ui/button"
;
import
{
DropdownMenu
,
DropdownMenuContent
,
DropdownMenuItem
,
DropdownMenuTrigger
}
from
"@/components/ui/dropdown-menu"
;
import
{
memoServiceClient
}
from
"@/grpcweb"
;
import
{
TAB_SPACE_WIDTH
}
from
"@/helpers/consts"
;
import
{
isValidUrl
}
from
"@/helpers/utils"
;
...
...
@@ -25,7 +27,6 @@ import LocationSelector from "./ActionButton/LocationSelector";
import
MarkdownMenu
from
"./ActionButton/MarkdownMenu"
;
import
TagSelector
from
"./ActionButton/TagSelector"
;
import
UploadAttachmentButton
from
"./ActionButton/UploadAttachmentButton"
;
import
VisibilitySelector
from
"./ActionButton/VisibilitySelector"
;
import
AttachmentListView
from
"./AttachmentListView"
;
import
Editor
,
{
EditorRefActions
}
from
"./Editor"
;
import
RelationListView
from
"./RelationListView"
;
...
...
@@ -74,7 +75,6 @@ const MemoEditor = observer((props: Props) => {
const
[
createTime
,
setCreateTime
]
=
useState
<
Date
|
undefined
>
();
const
[
updateTime
,
setUpdateTime
]
=
useState
<
Date
|
undefined
>
();
const
[
hasContent
,
setHasContent
]
=
useState
<
boolean
>
(
false
);
const
[
isVisibilitySelectorOpen
,
setIsVisibilitySelectorOpen
]
=
useState
(
false
);
const
editorRef
=
useRef
<
EditorRefActions
>
(
null
);
const
userGeneralSetting
=
userStore
.
state
.
userGeneralSetting
;
const
contentCacheKey
=
`
${
currentUser
.
name
}
-
${
cacheKey
||
""
}
`
;
...
...
@@ -515,34 +515,42 @@ const MemoEditor = observer((props: Props) => {
}
/>
</
div
>
<
div
className=
"shrink-0 flex flex-row justify-end items-center gap-1"
>
<
div
className=
"shrink-0
-mr-1
flex flex-row justify-end items-center gap-1"
>
{
props
.
onCancel
&&
(
<
Button
variant=
"ghost"
className=
"opacity-60"
disabled=
{
state
.
isRequesting
}
onClick=
{
handleCancelBtnClick
}
>
{
t
(
"common.cancel"
)
}
</
Button
>
)
}
<
Button
color=
"primary"
disabled=
{
!
allowSave
||
state
.
isRequesting
}
onClick=
{
handleSaveBtnClick
}
>
<
Button
disabled=
{
!
allowSave
||
state
.
isRequesting
}
onClick=
{
handleSaveBtnClick
}
>
{
t
(
"editor.save"
)
}
{
!
state
.
isRequesting
?
<
SendIcon
className=
"w-4 h-auto ml-1"
/>
:
<
LoaderIcon
className=
"w-4 h-auto ml-1 animate-spin"
/>
}
{
!
state
.
isRequesting
?
(
<
DropdownMenu
>
<
DropdownMenuTrigger
asChild
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
>
<
span
className=
"pointer-events-auto"
>
<
VisibilityIcon
visibility=
{
state
.
memoVisibility
}
className=
"w-4 h-auto ml-1 text-primary-foreground opacity-80"
/>
</
span
>
</
DropdownMenuTrigger
>
<
DropdownMenuContent
align=
"end"
alignOffset=
{
-
12
}
sideOffset=
{
12
}
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
>
<
DropdownMenuItem
onClick=
{
()
=>
handleMemoVisibilityChange
(
Visibility
.
PRIVATE
)
}
>
<
VisibilityIcon
visibility=
{
Visibility
.
PRIVATE
}
className=
"w-4 h-4"
/>
{
t
(
"memo.visibility.private"
)
}
</
DropdownMenuItem
>
<
DropdownMenuItem
onClick=
{
()
=>
handleMemoVisibilityChange
(
Visibility
.
PROTECTED
)
}
>
<
VisibilityIcon
visibility=
{
Visibility
.
PROTECTED
}
className=
"w-4 h-4"
/>
{
t
(
"memo.visibility.protected"
)
}
</
DropdownMenuItem
>
<
DropdownMenuItem
onClick=
{
()
=>
handleMemoVisibilityChange
(
Visibility
.
PUBLIC
)
}
>
<
VisibilityIcon
visibility=
{
Visibility
.
PUBLIC
}
className=
"w-4 h-4"
/>
{
t
(
"memo.visibility.public"
)
}
</
DropdownMenuItem
>
</
DropdownMenuContent
>
</
DropdownMenu
>
)
:
(
<
LoaderIcon
className=
"w-4 h-auto ml-1 animate-spin"
/>
)
}
</
Button
>
</
div
>
</
div
>
<
div
className=
{
cn
(
"absolute right-1 top-1"
,
"flex flex-row justify-end items-center gap-1"
,
"invisible group-focus-within:visible group-hover:visible hover:visible focus-within:visible"
,
(
isVisibilitySelectorOpen
||
memoName
)
&&
"visible"
,
)
}
onFocus=
{
(
e
)
=>
e
.
stopPropagation
()
}
onMouseDown=
{
(
e
)
=>
e
.
stopPropagation
()
}
>
<
VisibilitySelector
value=
{
state
.
memoVisibility
}
onChange=
{
handleMemoVisibilityChange
}
onOpenChange=
{
setIsVisibilitySelectorOpen
}
/>
</
div
>
</
div
>
{
/* Show memo metadata if memoName is provided */
}
...
...
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