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
3394380f
Unverified
Commit
3394380f
authored
Feb 14, 2023
by
boojack
Committed by
GitHub
Feb 14, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: update storage components (#1091)
parent
2493bb0f
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
45 additions
and
231 deletions
+45
-231
CreateStorageServiceDialog.tsx
web/src/components/CreateStorageServiceDialog.tsx
+27
-8
SettingDialog.tsx
web/src/components/SettingDialog.tsx
+6
-6
StorageSection.tsx
web/src/components/Settings/StorageSection.tsx
+12
-14
UpdateStorageServiceDialog.tsx
web/src/components/UpdateStorageServiceDialog.tsx
+0
-189
storage-section.less
web/src/less/settings/storage-section.less
+0
-14
No files found.
web/src/components/CreateStorageServiceDialog.tsx
View file @
3394380f
...
@@ -2,14 +2,16 @@ import { useTranslation } from "react-i18next";
...
@@ -2,14 +2,16 @@ import { useTranslation } from "react-i18next";
import
Icon
from
"./Icon"
;
import
Icon
from
"./Icon"
;
import
{
generateDialog
}
from
"./Dialog"
;
import
{
generateDialog
}
from
"./Dialog"
;
import
{
Button
,
Input
,
Typography
}
from
"@mui/joy"
;
import
{
Button
,
Input
,
Typography
}
from
"@mui/joy"
;
import
{
useState
}
from
"react"
;
import
{
use
Effect
,
use
State
}
from
"react"
;
import
{
useStorageStore
}
from
"../store/module"
;
import
{
useStorageStore
}
from
"../store/module"
;
import
toastHelper
from
"./Toast"
;
import
toastHelper
from
"./Toast"
;
type
Props
=
DialogProps
;
interface
Props
extends
DialogProps
{
storage
?:
Storage
;
}
const
CreateStorageServiceDialog
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
CreateStorageServiceDialog
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
{
destroy
}
=
props
;
const
{
destroy
,
storage
}
=
props
;
const
{
t
}
=
useTranslation
();
const
{
t
}
=
useTranslation
();
const
storageStore
=
useStorageStore
();
const
storageStore
=
useStorageStore
();
const
[
storageCreate
,
setStorageCreate
]
=
useState
<
StorageCreate
>
({
const
[
storageCreate
,
setStorageCreate
]
=
useState
<
StorageCreate
>
({
...
@@ -21,6 +23,13 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
...
@@ -21,6 +23,13 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
bucket
:
""
,
bucket
:
""
,
urlPrefix
:
""
,
urlPrefix
:
""
,
});
});
const
isCreating
=
storage
===
undefined
;
useEffect
(()
=>
{
if
(
storage
)
{
setStorageCreate
({
...
storage
});
}
},
[]);
const
handleCloseBtnClick
=
()
=>
{
const
handleCloseBtnClick
=
()
=>
{
destroy
();
destroy
();
...
@@ -42,7 +51,14 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
...
@@ -42,7 +51,14 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
const
handleConfirmBtnClick
=
async
()
=>
{
const
handleConfirmBtnClick
=
async
()
=>
{
try
{
try
{
if
(
isCreating
)
{
await
storageStore
.
createStorage
(
storageCreate
);
await
storageStore
.
createStorage
(
storageCreate
);
}
else
{
await
storageStore
.
patchStorage
({
id
:
storage
.
id
,
...
storageCreate
,
});
}
}
catch
(
error
:
any
)
{
}
catch
(
error
:
any
)
{
console
.
error
(
error
);
console
.
error
(
error
);
toastHelper
.
error
(
error
.
response
.
data
.
message
);
toastHelper
.
error
(
error
.
response
.
data
.
message
);
...
@@ -109,7 +125,9 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
...
@@ -109,7 +125,9 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
return
(
return
(
<>
<>
<
div
className=
"dialog-header-container !w-64"
>
<
div
className=
"dialog-header-container !w-64"
>
<
p
className=
"title-text"
>
{
t
(
"setting.storage-section.create-a-service"
)
}
</
p
>
<
p
className=
"title-text"
>
{
isCreating
?
t
(
"setting.storage-section.create-a-service"
)
:
t
(
"setting.storage-section.update-a-service"
)
}
</
p
>
<
button
className=
"btn close-btn"
onClick=
{
handleCloseBtnClick
}
>
<
button
className=
"btn close-btn"
onClick=
{
handleCloseBtnClick
}
>
<
Icon
.
X
/>
<
Icon
.
X
/>
</
button
>
</
button
>
...
@@ -148,7 +166,7 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
...
@@ -148,7 +166,7 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
Cancel
Cancel
</
Button
>
</
Button
>
<
Button
onClick=
{
handleConfirmBtnClick
}
disabled=
{
!
allowConfirmAction
()
}
>
<
Button
onClick=
{
handleConfirmBtnClick
}
disabled=
{
!
allowConfirmAction
()
}
>
Create
{
isCreating
?
"Create"
:
"Update"
}
</
Button
>
</
Button
>
</
div
>
</
div
>
</
div
>
</
div
>
...
@@ -156,13 +174,14 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
...
@@ -156,13 +174,14 @@ const CreateStorageServiceDialog: React.FC<Props> = (props: Props) => {
);
);
};
};
function
showCreateStorageServiceDialog
()
{
function
showCreateStorageServiceDialog
(
storage
?:
Storage
)
{
generateDialog
(
generateDialog
(
{
{
className
:
"create-storage-service-dialog"
,
className
:
"create-storage-service-dialog"
,
dialogName
:
"create-storage-service-dialog"
,
dialogName
:
"create-storage-service-dialog"
,
},
},
CreateStorageServiceDialog
CreateStorageServiceDialog
,
{
storage
}
);
);
}
}
...
...
web/src/components/SettingDialog.tsx
View file @
3394380f
...
@@ -58,12 +58,6 @@ const SettingDialog: React.FC<Props> = (props: Props) => {
...
@@ -58,12 +58,6 @@ const SettingDialog: React.FC<Props> = (props: Props) => {
<>
<>
<
span
className=
"section-title"
>
{
t
(
"common.admin"
)
}
</
span
>
<
span
className=
"section-title"
>
{
t
(
"common.admin"
)
}
</
span
>
<
div
className=
"section-items-container"
>
<
div
className=
"section-items-container"
>
<
span
onClick=
{
()
=>
handleSectionSelectorItemClick
(
"storage"
)
}
className=
{
`section-item ${state.selectedSection === "storage" ? "selected" : ""}`
}
>
<
span
className=
"icon-text"
>
🗃️
</
span
>
{
t
(
"setting.storage"
)
}
</
span
>
<
span
<
span
onClick=
{
()
=>
handleSectionSelectorItemClick
(
"member"
)
}
onClick=
{
()
=>
handleSectionSelectorItemClick
(
"member"
)
}
className=
{
`section-item ${state.selectedSection === "member" ? "selected" : ""}`
}
className=
{
`section-item ${state.selectedSection === "member" ? "selected" : ""}`
}
...
@@ -76,6 +70,12 @@ const SettingDialog: React.FC<Props> = (props: Props) => {
...
@@ -76,6 +70,12 @@ const SettingDialog: React.FC<Props> = (props: Props) => {
>
>
<
span
className=
"icon-text"
>
🛠️
</
span
>
{
t
(
"setting.system"
)
}
<
span
className=
"icon-text"
>
🛠️
</
span
>
{
t
(
"setting.system"
)
}
</
span
>
</
span
>
<
span
onClick=
{
()
=>
handleSectionSelectorItemClick
(
"storage"
)
}
className=
{
`section-item ${state.selectedSection === "storage" ? "selected" : ""}`
}
>
<
span
className=
"icon-text"
>
💾
</
span
>
{
t
(
"setting.storage"
)
}
</
span
>
</
div
>
</
div
>
</>
</>
)
:
null
}
)
:
null
}
...
...
web/src/components/Settings/StorageSection.tsx
View file @
3394380f
...
@@ -4,8 +4,6 @@ import { useTranslation } from "react-i18next";
...
@@ -4,8 +4,6 @@ import { useTranslation } from "react-i18next";
import
{
useGlobalStore
,
useStorageStore
}
from
"../../store/module"
;
import
{
useGlobalStore
,
useStorageStore
}
from
"../../store/module"
;
import
*
as
api
from
"../../helpers/api"
;
import
*
as
api
from
"../../helpers/api"
;
import
showCreateStorageServiceDialog
from
"../CreateStorageServiceDialog"
;
import
showCreateStorageServiceDialog
from
"../CreateStorageServiceDialog"
;
import
showUpdateStorageServiceDialog
from
"../UpdateStorageServiceDialog"
;
import
"../../less/settings/storage-section.less"
;
const
StorageSection
=
()
=>
{
const
StorageSection
=
()
=>
{
const
{
t
}
=
useTranslation
();
const
{
t
}
=
useTranslation
();
...
@@ -35,29 +33,29 @@ const StorageSection = () => {
...
@@ -35,29 +33,29 @@ const StorageSection = () => {
const
handleStorageServiceUpdate
=
async
(
event
:
React
.
MouseEvent
,
storage
:
Storage
)
=>
{
const
handleStorageServiceUpdate
=
async
(
event
:
React
.
MouseEvent
,
storage
:
Storage
)
=>
{
event
.
preventDefault
();
event
.
preventDefault
();
show
Upd
ateStorageServiceDialog
(
storage
);
show
Cre
ateStorageServiceDialog
(
storage
);
};
};
return
(
return
(
<
div
className=
"section-container storage-section-container"
>
<
div
className=
"section-container"
>
<
p
className=
"title-text"
>
{
t
(
"setting.storage-section.storage-services-list"
)
}
</
p
>
<
div
className=
"mt-4 mb-2 w-full flex flex-row justify-start items-center"
>
<
span
className=
"font-mono text-sm text-gray-400 mr-2"
>
{
t
(
"setting.storage-section.storage-services-list"
)
}
</
span
>
<
button
className=
"btn-normal px-2 py-0 leading-7"
onClick=
{
()
=>
showCreateStorageServiceDialog
()
}
>
{
t
(
"common.create"
)
}
</
button
>
</
div
>
{
storages
.
map
((
storage
)
=>
(
{
storages
.
map
((
storage
)
=>
(
<
label
className=
"
form-label selecto
r"
key=
{
storage
.
id
}
>
<
label
className=
"
w-full my-2 flex flex-row justify-between items-cente
r"
key=
{
storage
.
id
}
>
<
span
className=
"
normal-text
underline cursor-pointer"
onClick=
{
(
event
)
=>
handleStorageServiceUpdate
(
event
,
storage
)
}
>
<
span
className=
"
mr-2 text-sm
underline cursor-pointer"
onClick=
{
(
event
)
=>
handleStorageServiceUpdate
(
event
,
storage
)
}
>
{
storage
.
name
}
{
storage
.
name
}
</
span
>
</
span
>
<
Radio
value=
{
storage
.
id
}
checked=
{
storageServiceId
===
storage
.
id
}
onChange=
{
handleActiveStorageServiceChanged
}
/>
<
Radio
value=
{
storage
.
id
}
checked=
{
storageServiceId
===
storage
.
id
}
onChange=
{
handleActiveStorageServiceChanged
}
/>
</
label
>
</
label
>
))
}
))
}
<
label
className=
"
form-label selecto
r"
>
<
label
className=
"
w-full my-2 flex flex-row justify-between items-cente
r"
>
<
span
className=
"
normal-text
"
>
{
t
(
"common.database"
)
}
</
span
>
<
span
className=
"
mr-2 text-sm
"
>
{
t
(
"common.database"
)
}
</
span
>
<
Radio
value=
{
0
}
checked=
{
storageServiceId
===
0
}
onChange=
{
handleActiveStorageServiceChanged
}
/>
<
Radio
value=
{
0
}
checked=
{
storageServiceId
===
0
}
onChange=
{
handleActiveStorageServiceChanged
}
/>
</
label
>
</
label
>
<
div
className=
"w-full flex flex-row justify-end items-center mt-2 space-x-2"
>
<
button
className=
"btn-normal"
onClick=
{
showCreateStorageServiceDialog
}
>
{
t
(
"setting.storage-section.create-a-service"
)
}
</
button
>
</
div
>
</
div
>
</
div
>
);
);
};
};
...
...
web/src/components/UpdateStorageServiceDialog.tsx
deleted
100644 → 0
View file @
2493bb0f
import
{
Button
,
Input
,
Typography
}
from
"@mui/joy"
;
import
{
useTranslation
}
from
"react-i18next"
;
import
{
useState
}
from
"react"
;
import
Icon
from
"./Icon"
;
import
{
generateDialog
}
from
"./Dialog"
;
import
{
showCommonDialog
}
from
"./Dialog/CommonDialog"
;
import
{
useStorageStore
}
from
"../store/module"
;
import
toastHelper
from
"./Toast"
;
interface
Props
extends
DialogProps
{
storage
:
StoragePatch
;
}
const
UpdateStorageServiceDialog
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
{
storage
,
destroy
}
=
props
;
const
{
t
}
=
useTranslation
();
const
storageStore
=
useStorageStore
();
const
[
storagePatch
,
setStoragePatch
]
=
useState
<
StoragePatch
>
(
storage
);
const
handleCloseBtnClick
=
()
=>
{
destroy
();
};
const
allowConfirmAction
=
()
=>
{
if
(
storagePatch
.
name
===
""
||
storagePatch
.
endPoint
===
""
||
storagePatch
.
region
===
""
||
storagePatch
.
accessKey
===
""
||
storagePatch
.
bucket
===
""
||
storagePatch
.
bucket
===
""
)
{
return
false
;
}
return
true
;
};
const
handleConfirmBtnClick
=
async
()
=>
{
try
{
await
storageStore
.
patchStorage
(
storagePatch
);
}
catch
(
error
:
any
)
{
console
.
error
(
error
);
toastHelper
.
error
(
error
.
response
.
data
.
message
);
}
destroy
();
};
const
handleDeleteBtnClick
=
async
()
=>
{
const
warningText
=
t
(
"setting.storage-section.warning-text"
);
showCommonDialog
({
title
:
t
(
"setting.storage-section.delete-storage"
),
content
:
warningText
,
style
:
"warning"
,
dialogName
:
"delete-storage-dialog"
,
onConfirm
:
async
()
=>
{
try
{
await
storageStore
.
deleteStorageById
(
storagePatch
.
id
);
}
catch
(
error
:
any
)
{
console
.
error
(
error
);
toastHelper
.
error
(
error
.
response
.
data
.
message
);
}
destroy
();
},
});
};
const
handleNameChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
name
=
event
.
target
.
value
;
setStoragePatch
({
...
storagePatch
,
name
,
});
};
const
handleEndPointChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
endPoint
=
event
.
target
.
value
;
setStoragePatch
({
...
storagePatch
,
endPoint
,
});
};
const
handleRegionChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
region
=
event
.
target
.
value
;
setStoragePatch
({
...
storagePatch
,
region
,
});
};
const
handleAccessKeyChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
accessKey
=
event
.
target
.
value
;
setStoragePatch
({
...
storagePatch
,
accessKey
,
});
};
const
handleSecretKeyChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
secretKey
=
event
.
target
.
value
;
setStoragePatch
({
...
storagePatch
,
secretKey
,
});
};
const
handleBucketChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
bucket
=
event
.
target
.
value
;
setStoragePatch
({
...
storagePatch
,
bucket
,
});
};
const
handleURLPrefixChange
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
urlPrefix
=
event
.
target
.
value
;
setStoragePatch
({
...
storagePatch
,
urlPrefix
,
});
};
return
(
<>
<
div
className=
"dialog-header-container !w-64"
>
<
p
className=
"title-text"
>
{
t
(
"setting.storage-section.update-a-service"
)
}
</
p
>
<
button
className=
"btn close-btn"
onClick=
{
handleCloseBtnClick
}
>
<
Icon
.
X
/>
</
button
>
</
div
>
<
div
className=
"dialog-content-container"
>
<
Typography
className=
"!mb-1"
level=
"body2"
>
Name
</
Typography
>
<
Input
className=
"mb-2"
placeholder=
"Name"
value=
{
storagePatch
.
name
}
onChange=
{
handleNameChange
}
fullWidth
/>
<
Typography
className=
"!mb-1"
level=
"body2"
>
EndPoint
</
Typography
>
<
Input
className=
"mb-2"
placeholder=
"EndPoint"
value=
{
storagePatch
.
endPoint
}
onChange=
{
handleEndPointChange
}
fullWidth
/>
<
Typography
className=
"!mb-1"
level=
"body2"
>
Region
</
Typography
>
<
Input
className=
"mb-2"
placeholder=
"Region"
value=
{
storagePatch
.
region
}
onChange=
{
handleRegionChange
}
fullWidth
/>
<
Typography
className=
"!mb-1"
level=
"body2"
>
AccessKey
</
Typography
>
<
Input
className=
"mb-2"
placeholder=
"AccessKey"
value=
{
storagePatch
.
accessKey
}
onChange=
{
handleAccessKeyChange
}
fullWidth
/>
<
Typography
className=
"!mb-1"
level=
"body2"
>
SecretKey
</
Typography
>
<
Input
className=
"mb-2"
placeholder=
"SecretKey"
value=
{
storagePatch
.
secretKey
}
onChange=
{
handleSecretKeyChange
}
fullWidth
/>
<
Typography
className=
"!mb-1"
level=
"body2"
>
Bucket
</
Typography
>
<
Input
className=
"mb-2"
placeholder=
"Bucket"
value=
{
storagePatch
.
bucket
}
onChange=
{
handleBucketChange
}
fullWidth
/>
<
Typography
className=
"!mb-1"
level=
"body2"
>
URLPrefix
</
Typography
>
<
Input
className=
"mb-2"
placeholder=
"URLPrefix"
value=
{
storagePatch
.
urlPrefix
}
onChange=
{
handleURLPrefixChange
}
fullWidth
/>
<
div
className=
"mt-2 w-full flex flex-row justify-between items-center space-x-1"
>
<
Button
color=
"danger"
onClick=
{
handleDeleteBtnClick
}
>
Delete
</
Button
>
<
div
className=
"flex justify-end"
>
<
Button
variant=
"plain"
color=
"neutral"
onClick=
{
handleCloseBtnClick
}
>
Cancel
</
Button
>
<
Button
onClick=
{
handleConfirmBtnClick
}
disabled=
{
!
allowConfirmAction
()
}
>
Update
</
Button
>
</
div
>
</
div
>
</
div
>
</>
);
};
function
showUpdateStorageServiceDialog
(
storage
:
Storage
)
{
generateDialog
(
{
className
:
"update-storage-service-dialog"
,
dialogName
:
"update-storage-service-dialog"
,
},
UpdateStorageServiceDialog
,
{
storage
}
);
}
export
default
showUpdateStorageServiceDialog
;
web/src/less/settings/storage-section.less
deleted
100644 → 0
View file @
2493bb0f
.storage-section-container {
> .title-text {
@apply mt-4 first:mt-1;
}
> .form-label.selector {
@apply mb-2 flex flex-row justify-between items-center;
> .normal-text {
@apply mr-2 text-sm;
}
}
}
\ No newline at end of file
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