Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
VCCI-News
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ăn Hoàng
VCCI-News
Commits
8e5ee519
Commit
8e5ee519
authored
Jun 23, 2026
by
Vũ Đình Nguyên
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix(layout-all-page
parent
ac83cae9
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
59 additions
and
7 deletions
+59
-7
pnpm-workspace.yaml
pnpm-workspace.yaml
+4
-0
AboutVcciHcmPage.tsx
......slug]/templates/information-pages/AboutVcciHcmPage.tsx
+2
-2
DefaultInformationPage.tsx
...g]/templates/information-pages/DefaultInformationPage.tsx
+2
-2
ServicePage.tsx
...in)/[...slug]/templates/information-pages/ServicePage.tsx
+1
-1
rich-text-editor.tsx
src/components/admin/rich-text-editor.tsx
+50
-2
No files found.
pnpm-workspace.yaml
0 → 100644
View file @
8e5ee519
allowBuilds
:
esbuild
:
true
sharp
:
true
unrs-resolver
:
true
src/app/(main)/[...slug]/templates/information-pages/AboutVcciHcmPage.tsx
View file @
8e5ee519
...
...
@@ -39,8 +39,8 @@ const ABOUT_HIGHLIGHTS = [
const
ACTIVITY_AREAS
=
[
"TP. Hồ Chí Minh"
,
"Bình Dương"
,
"Bình Phước"
,
//
"Bình Dương",
//
"Bình Phước",
"Đồng Nai"
,
"Lâm Đồng"
,
"Tây Ninh"
,
...
...
src/app/(main)/[...slug]/templates/information-pages/DefaultInformationPage.tsx
View file @
8e5ee519
...
...
@@ -2,7 +2,7 @@
import
StructuredPostContent
from
"../StructuredPostContent"
;
import
type
{
DynamicPostItem
}
from
"../types"
;
import
parse
from
"html-react-parser"
;
type
DefaultInformationPageProps
=
{
post
:
DynamicPostItem
;
};
...
...
@@ -20,7 +20,7 @@ export default function DefaultInformationPage({
{
post
.
summary
?
(
<
p
className=
"mt-5 max-w-6xl text-base font-semibold leading-7 text-[#374151] md:text-lg md:leading-8"
>
{
p
ost
.
summary
}
{
p
arse
(
post
.
summary
)
}
</
p
>
)
:
null
}
...
...
src/app/(main)/[...slug]/templates/information-pages/ServicePage.tsx
View file @
8e5ee519
...
...
@@ -47,7 +47,7 @@ const SERVICE_SUPPORT_ITEMS = [
},
{
key
:
"certificate"
,
title
:
"
Cấp C/O và xác nhận các chứng từ thương mại
"
,
title
:
"
Xác nhận các chứng từ thương mại (Bỏ cấp C/O)
"
,
icon
:
FileBadge2
,
},
{
...
...
src/components/admin/rich-text-editor.tsx
View file @
8e5ee519
...
...
@@ -3,6 +3,8 @@
import
dynamic
from
"next/dynamic"
;
import
{
useMemo
,
useRef
}
from
"react"
;
import
type
{
JoditEditorProps
}
from
"jodit-react"
;
import
useAuthStore
from
"@/store/useAuthStore"
;
import
links
from
"@/links"
;
const
JoditEditor
=
dynamic
(()
=>
import
(
"jodit-react"
).
then
((
mod
)
=>
mod
.
default
),
{
ssr
:
false
,
...
...
@@ -104,6 +106,7 @@ export function AdminRichTextEditor({
readOnly
=
false
,
}:
AdminRichTextEditorProps
)
{
const
editor
=
useRef
(
null
);
const
accessToken
=
useAuthStore
((
state
)
=>
state
.
appAccessToken
);
const
config
:
JoditEditorProps
[
"config"
]
=
useMemo
(
()
=>
({
...
...
@@ -113,7 +116,52 @@ export function AdminRichTextEditor({
language
:
"vi"
,
toolbarButtonSize
:
"middle"
,
uploader
:
{
insertImageAsBase64URI
:
true
,
url
:
`
${
links
.
apiEndpoint
}
/files`
,
method
:
"POST"
,
headers
:
{
...(
accessToken
?
{
Authorization
:
`Bearer
${
accessToken
}
`
}
:
{}),
},
format
:
"json"
,
buildData
:
(
data
:
FormData
)
=>
{
const
next
=
new
FormData
();
data
.
forEach
((
value
,
key
)
=>
{
if
(
key
===
"files[]"
&&
value
instanceof
File
)
{
next
.
append
(
"file"
,
value
);
}
else
{
next
.
append
(
key
,
value
);
}
});
return
next
;
},
isSuccess
:
(
resp
:
unknown
)
=>
{
if
(
typeof
resp
!==
"object"
||
resp
===
null
)
return
false
;
const
r
=
resp
as
Record
<
string
,
unknown
>
;
return
(
r
.
status
===
"success"
||
r
.
status
===
"200"
||
(
!
r
.
violation
&&
!!
r
.
responseData
)
);
},
process
:
(
resp
:
unknown
)
=>
{
if
(
typeof
resp
!==
"object"
||
resp
===
null
)
{
return
{
files
:
[],
error
:
"Invalid response"
};
}
const
r
=
resp
as
Record
<
string
,
unknown
>
;
const
responseData
=
r
.
responseData
as
Record
<
string
,
unknown
>
|
undefined
;
const
url
=
(
typeof
responseData
?.
url
===
"string"
&&
responseData
.
url
)
||
(
typeof
responseData
?.
fileUrl
===
"string"
&&
responseData
.
fileUrl
)
||
(
typeof
responseData
?.
path
===
"string"
&&
responseData
.
path
)
||
(
typeof
responseData
?.
link
===
"string"
&&
responseData
.
link
)
||
(
typeof
responseData
?.
src
===
"string"
&&
responseData
.
src
)
||
""
;
return
{
files
:
url
?
[
url
]
:
[],
baseurl
:
""
,
error
:
url
?
undefined
:
(
r
.
message
as
string
)
||
"Upload failed"
,
msg
:
(
r
.
message
as
string
)
||
""
,
};
},
},
buttons
:
[
"bold"
,
...
...
@@ -182,7 +230,7 @@ export function AdminRichTextEditor({
},
},
}),
[
minHeight
,
placeholder
,
readOnly
],
[
minHeight
,
placeholder
,
readOnly
,
accessToken
],
);
return
(
...
...
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