Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
AppUms_Student
Overview
Overview
Details
Activity
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
tungnq
AppUms_Student
Commits
ff461bcc
Commit
ff461bcc
authored
Sep 26, 2025
by
tungnq
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
TODO: Đã hoàn thiện giao diện điểm danh
parent
5159efcf
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
141 additions
and
95 deletions
+141
-95
index.js
src/screens/exam_schedule/index.js
+33
-37
item_view.js
src/screens/exam_schedule/item_view.js
+30
-20
style.js
src/screens/exam_schedule/style.js
+17
-1
view.js
src/screens/exam_schedule/view.js
+36
-19
view.js
src/screens/roll_call/detail/view.js
+3
-10
item.js
src/screens/roll_call/item.js
+19
-5
item_calendar.js
src/screens/roll_call/item_calendar.js
+2
-3
view.js
src/screens/roll_call/view.js
+1
-0
No files found.
src/screens/exam_schedule/index.js
View file @
ff461bcc
import
React
,
{
useState
}
from
'react'
;
import
React
,
{
useState
}
from
'react'
;
import
{
Text
,
View
,
StyleSheet
}
from
'react-native'
;
import
{
Text
,
View
,
StyleSheet
}
from
'react-native'
;
import
ExamScheduleView
from
'./view'
;
import
ExamScheduleView
from
'./view'
;
const
ExamSchedule
=
(
props
)
=>
{
const
ExamSchedule
=
props
=>
{
const
[
dataExamSchedule
,
setDataExamSchedule
]
=
useState
([
const
[
dataExamSchedule
,
setDataExamSchedule
]
=
useState
([
{
{
id
:
1
,
id
:
1
,
code_exam
:
'MD001'
,
code_exam
:
'MD001'
,
code_class
:
'MD0081'
,
code_class
:
'MD0081'
,
poetry
:
'123 (7:30 - 10:30)'
,
poetry
:
'123 (7:30 - 10:30)'
,
time_exam
:
'2025-08-05'
,
time_exam
:
'2025-08-05'
,
class_exam
:
'A98'
,
class_exam
:
'A98'
,
day_exam
:
'Thứ 3'
,
day_exam
:
'Thứ 3'
,
description
:
'Bảo vệ/ DA'
,
description
:
'Bảo vệ/ DA'
,
},
},
{
{
id
:
2
,
id
:
2
,
code_exam
:
'MD001'
,
code_exam
:
'MD001'
,
code_class
:
'MD0081'
,
code_class
:
'MD0081'
,
poetry
:
'123 (7:30 - 10:30)'
,
poetry
:
'123 (7:30 - 10:30)'
,
time_exam
:
'2025-08-05'
,
time_exam
:
'2025-08-05'
,
class_exam
:
'A98'
,
class_exam
:
'A98'
,
day_exam
:
'Thứ 3'
,
day_exam
:
'Thứ 3'
,
description
:
'Bảo vệ/ DA'
,
description
:
'Bảo vệ/ DA'
,
},
},
{
{
id
:
3
,
id
:
3
,
code_exam
:
'MD001'
,
code_exam
:
'MD001'
,
code_class
:
'MD0081'
,
code_class
:
'MD0081'
,
poetry
:
'123 (7:30 - 10:30)'
,
poetry
:
'123 (7:30 - 10:30)'
,
time_exam
:
'2025-08-05'
,
time_exam
:
'2025-08-05'
,
class_exam
:
'A98'
,
class_exam
:
'A98'
,
day_exam
:
'Thứ 3'
,
day_exam
:
'Thứ 3'
,
description
:
'Bảo vệ/ DA'
,
description
:
'Bảo vệ/ DA'
,
},
},
{
{
id
:
4
,
id
:
4
,
code_exam
:
'MD001'
,
code_exam
:
'MD001'
,
code_class
:
'MD0081'
,
code_class
:
'MD0081'
,
poetry
:
'123 (7:30 - 10:30)'
,
poetry
:
'123 (7:30 - 10:30)'
,
time_exam
:
'2025-08-05'
,
time_exam
:
'2025-08-05'
,
class_exam
:
'A98'
,
class_exam
:
'A98'
,
day_exam
:
'Thứ 3'
,
day_exam
:
'Thứ 3'
,
description
:
'Bảo vệ/ DA'
,
description
:
'Bảo vệ/ DA'
,
},
},
{
{
id
:
5
,
id
:
5
,
code_exam
:
'MD001'
,
code_exam
:
'MD001'
,
code_class
:
'MD0081'
,
code_class
:
'MD0081'
,
poetry
:
'123 (7:30 - 10:30)'
,
poetry
:
'123 (7:30 - 10:30)'
,
time_exam
:
'2025-08-05'
,
time_exam
:
'2025-08-05'
,
class_exam
:
'A98'
,
class_exam
:
'A98'
,
day_exam
:
'Thứ 3'
,
day_exam
:
'Thứ 3'
,
description
:
'Bảo vệ/ DA'
,
description
:
'Bảo vệ/ DA'
,
},
},
{
{
id
:
6
,
id
:
6
,
code_exam
:
'MD001'
,
code_exam
:
'MD001'
,
code_class
:
'MD0081'
,
code_class
:
'MD0081'
,
poetry
:
'123 (7:30 - 10:30)'
,
poetry
:
'123 (7:30 - 10:30)'
,
time_exam
:
'2025-08-05'
,
time_exam
:
'2025-08-05'
,
class_exam
:
'A98'
,
class_exam
:
'A98'
,
day_exam
:
'Thứ 3'
,
day_exam
:
'Thứ 3'
,
description
:
'Bảo vệ/ DA'
,
description
:
'Bảo vệ/ DA'
,
},
},
]);
]);
return
<
ExamScheduleView
dataExamSchedule
=
{
dataExamSchedule
}
/>
;
return
(
<
ExamScheduleView
dataExamSchedule
=
{
dataExamSchedule
}
/
>
);
};
};
export
default
ExamSchedule
;
export
default
ExamSchedule
;
src/screens/exam_schedule/item_view.js
View file @
ff461bcc
...
@@ -5,18 +5,32 @@ import { Text, View, TouchableOpacity, StyleSheet, Image } from 'react-native';
...
@@ -5,18 +5,32 @@ import { Text, View, TouchableOpacity, StyleSheet, Image } from 'react-native';
const
ItemView
=
({
item
})
=>
{
const
ItemView
=
({
item
})
=>
{
return
(
return
(
<
TouchableOpacity
style
=
{
styles
.
container
}
>
<
TouchableOpacity
style
=
{
styles
.
container
}
>
<
Text
style
=
{
styles
.
text_title
}
>
M
ã
m
ô
n
h
ọ
c
:
{
item
.
code_exam
}
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
M
ã
m
ô
n
h
ọ
c
:
<
Text
style
=
{
styles
.
text_title
}
>
M
ã
l
ớ
p
:
{
item
.
code_class
}
<
/Text
>
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
code_exam
}
<
/Text
>
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
M
ã
l
ớ
p
:
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
code_class
}
<
/Text
>
<
/Text
>
<
View
style
=
{
styles
.
content
}
>
<
View
style
=
{
styles
.
content
}
>
<
Text
style
=
{
styles
.
text_content
}
>
Ca
/
Ti
ế
t
thi
:
{
item
.
poetry
}
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
Ca
/
Ti
ế
t
thi
:
<
Text
style
=
{
styles
.
text_content
}
>
Th
ứ
thi
:
{
item
.
day_exam
}
<
/Text
>
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
poetry
}
<
/Text
>
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
Th
ứ
thi
:
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
day_exam
}
<
/Text
>
<
/Text
>
<
/View
>
<
/View
>
<
View
style
=
{
styles
.
content
}
>
<
View
style
=
{
styles
.
content
}
>
<
Text
style
=
{
styles
.
text_content
}
>
Ng
à
y
thi
:
{
item
.
time_exam
}
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
Ng
à
y
thi
:
<
Text
style
=
{
styles
.
text_content
}
>
Ph
ò
ng
thi
:
{
item
.
class_exam
}
<
/Text
>
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
time_exam
}
<
/Text
>
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
Ph
ò
ng
thi
:
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
class_exam
}
<
/Text
>
<
/Text
>
<
/View
>
<
/View
>
<
Text
style
=
{
styles
.
text_content
}
>
Ghi
ch
ú
/
h
ì
nh
th
ứ
c
thi
:
{
item
.
description
}
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
Ghi
ch
ú
/
h
ì
nh
th
ứ
c
thi
:
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
description
}
<
/Text
>
<
/Text
>
<
/TouchableOpacity
>
<
/TouchableOpacity
>
);
);
...
@@ -28,18 +42,14 @@ const styles = StyleSheet.create({
...
@@ -28,18 +42,14 @@ const styles = StyleSheet.create({
borderRadius
:
10
,
borderRadius
:
10
,
paddingHorizontal
:
14
,
paddingHorizontal
:
14
,
paddingVertical
:
10
,
paddingVertical
:
10
,
marginBottom
:
10
,
shadowColor
:
R
.
colors
.
black
,
shadowColor
:
R
.
colors
.
black
,
shadowOffset
:
{
shadowOffset
:
{
width
:
0
,
height
:
2
},
width
:
0
,
shadowOpacity
:
Platform
.
OS
===
'ios'
?
0.25
:
1
,
height
:
2
shadowRadius
:
1
,
},
elevation
:
Platform
.
OS
===
'ios'
?
1
:
2
,
shadowOpacity
:
0.5
,
shadowRadius
:
2
,
elevation
:
1
,
backgroundColor
:
R
.
colors
.
white
,
backgroundColor
:
R
.
colors
.
white
,
margin
Vertical
:
5
,
margin
Horizontal
:
10
,
margin
Horizontal
:
10
margin
Vertical
:
7.5
},
},
content
:
{
content
:
{
flexDirection
:
'row'
,
flexDirection
:
'row'
,
...
@@ -48,9 +58,9 @@ const styles = StyleSheet.create({
...
@@ -48,9 +58,9 @@ const styles = StyleSheet.create({
},
},
text_title
:
{
text_title
:
{
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontWeight
:
'
5
00'
,
fontWeight
:
'
6
00'
,
color
:
R
.
colors
.
bl
ue500
,
color
:
R
.
colors
.
bl
ack
,
fontFamily
:
R
.
fonts
.
Inter
SemiBold
,
fontFamily
:
R
.
fonts
.
Inter
Medium
,
},
},
text_content
:
{
text_content
:
{
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontSize
:
R
.
fontsize
.
fontsSize12
,
...
...
src/screens/exam_schedule/style.js
View file @
ff461bcc
...
@@ -14,6 +14,14 @@ const styles = StyleSheet.create({
...
@@ -14,6 +14,14 @@ const styles = StyleSheet.create({
borderBottomWidth
:
1
,
borderBottomWidth
:
1
,
borderBottomColor
:
R
.
colors
.
grey_200
,
borderBottomColor
:
R
.
colors
.
grey_200
,
},
},
body
:
{
flex
:
1
,
backgroundColor
:
R
.
colors
.
white
,
},
content_container
:
{
flexGrow
:
1
,
justifyContent
:
'center'
,
},
title
:
{
title
:
{
fontSize
:
R
.
fontsize
.
fontsSize16
,
fontSize
:
R
.
fontsize
.
fontsSize16
,
fontWeight
:
'700'
,
fontWeight
:
'700'
,
...
@@ -22,7 +30,14 @@ const styles = StyleSheet.create({
...
@@ -22,7 +30,14 @@ const styles = StyleSheet.create({
},
},
flatlist
:
{
flatlist
:
{
flex
:
1
,
flex
:
1
,
marginHorizontal
:
5
,
},
text_empty
:
{
fontSize
:
R
.
fontsize
.
fontsSize14
,
fontWeight
:
'400'
,
fontFamily
:
R
.
fonts
.
InterRegular
,
color
:
R
.
colors
.
black
,
textAlign
:
'center'
,
marginHorizontal
:
15
},
},
});
});
export
default
styles
;
export
default
styles
;
\ No newline at end of file
src/screens/exam_schedule/view.js
View file @
ff461bcc
import
React
from
'react'
;
import
React
from
'react'
;
import
{
View
,
FlatList
,
SafeAreaView
}
from
'react-native'
;
import
{
import
Header
from
"../../components/Header/Header"
;
View
,
import
R
from
"../../assets/R"
;
FlatList
,
import
I18n
from
"../../helper/i18/i18n"
;
SafeAreaView
,
import
ItemView
from
"./item_view"
;
Text
,
ActivityIndicator
,
}
from
'react-native'
;
import
Header
from
'../../components/Header/Header'
;
import
R
from
'../../assets/R'
;
import
I18n
from
'../../helper/i18/i18n'
;
import
ItemView
from
'./item_view'
;
import
styles
from
'./style'
;
import
styles
from
'./style'
;
import
ItemCalendar
from
'../roll_call/item_calendar'
;
import
ItemCalendar
from
'../roll_call/item_calendar'
;
const
ExamScheduleView
=
(
props
)
=>
{
const
ExamScheduleView
=
props
=>
{
const
{
dataExamSchedule
}
=
props
;
const
{
dataExamSchedule
}
=
props
;
const
renderContent
=
({
item
})
=>
{
const
renderContent
=
({
item
})
=>
{
return
(
return
<
ItemView
item
=
{
item
}
/>
;
<
ItemView
item
=
{
item
}
/
>
);
};
};
return
(
<
View
style
=
{
styles
.
container
}
>
<
Header
isBack
title
=
{
I18n
.
t
(
"ExamSchedule"
)}
/
>
<
View
style
=
{
styles
.
container
}
>
<
ItemCalendar
/>
const
renderBody
=
()
=>
{
return
(
<
View
style
=
{
styles
.
body
}
>
<
ItemCalendar
/>
<
View
style
=
{
styles
.
flatlist
}
>
<
View
style
=
{
styles
.
flatlist
}
>
<
FlatList
<
FlatList
data
=
{
dataExamSchedule
}
data
=
{
dataExamSchedule
}
renderItem
=
{
renderContent
}
renderItem
=
{
renderContent
}
keyExtractor
=
{(
item
)
=>
item
.
id
}
keyExtractor
=
{
item
=>
item
.
id
}
contentContainerStyle
=
{
styles
.
content_container
}
showsVerticalScrollIndicator
=
{
false
}
showsVerticalScrollIndicator
=
{
false
}
ListEmptyComponent
=
{()
=>
(
<
View
style
=
{
styles
.
content_container
}
>
<
ActivityIndicator
size
=
"large"
color
=
{
R
.
colors
.
main
}
animating
/>
/>
<
Text
style
=
{
styles
.
text_empty
}
>
Kh
ô
ng
c
ó
d
ữ
li
ệ
u
<
/Text
>
<
/View
>
<
/View
>
)}
/
>
<
/View
>
<
/View
>
<
/View
>
<
/View
>
);
);
};
return
(
<
View
style
=
{
styles
.
container
}
>
<
Header
isBack
title
=
{
I18n
.
t
(
'ExamSchedule'
)}
/
>
{
renderBody
()}
<
/View
>
);
};
};
export
default
ExamScheduleView
;
export
default
ExamScheduleView
;
src/screens/roll_call/detail/view.js
View file @
ff461bcc
...
@@ -3,16 +3,9 @@ import {
...
@@ -3,16 +3,9 @@ import {
Text
,
Text
,
View
,
View
,
StyleSheet
,
StyleSheet
,
SafeAreaView
,
ScrollView
,
ScrollView
,
Dimensions
,
}
from
"react-native"
;
}
from
"react-native"
;
import
{
Table
,
TableWrapper
,
Row
,
Cell
,
}
from
'react-native-reanimated-table'
;
import
Header
from
"../../../components/Header/Header"
;
import
Header
from
"../../../components/Header/Header"
;
import
R
from
"../../../assets/R"
;
import
R
from
"../../../assets/R"
;
...
@@ -200,9 +193,9 @@ const styles = StyleSheet.create({
...
@@ -200,9 +193,9 @@ const styles = StyleSheet.create({
},
},
headerText
:
{
headerText
:
{
fontFamily
:
R
.
fonts
.
Inter
Regular
,
fontFamily
:
R
.
fonts
.
Inter
Medium
,
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontWeight
:
'
4
00'
,
fontWeight
:
'
6
00'
,
color
:
R
.
colors
.
black
,
color
:
R
.
colors
.
black
,
textAlign
:
'center'
,
textAlign
:
'center'
,
},
},
...
...
src/screens/roll_call/item.js
View file @
ff461bcc
...
@@ -12,11 +12,19 @@ const ItemList = ({ item }) => {
...
@@ -12,11 +12,19 @@ const ItemList = ({ item }) => {
style
=
{
styles
.
card_item
}
style
=
{
styles
.
card_item
}
>
>
<
View
style
=
{
styles
.
content
}
>
<
View
style
=
{
styles
.
content
}
>
<
Text
style
=
{
styles
.
text
}
>
M
ã
l
ớ
p
:{
item
.
class_code
}
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
M
ã
l
ớ
p
:{
' '
}
<
Text
style
=
{
styles
.
text
}
>
T
ê
n
m
ô
n
:
{
item
.
subject_name
}
<
/Text
>
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
class_code
}
<
/Text
>
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
T
ê
n
m
ô
n
:{
' '
}
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
subject_name
}
<
/Text
>
<
/Text
>
<
View
style
=
{
styles
.
footer
}
>
<
View
style
=
{
styles
.
footer
}
>
<
Text
style
=
{
styles
.
text
}
>
T
ổ
ng
ti
ế
t
:
{
item
.
total_lessons
}
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
T
ổ
ng
ti
ế
t
:{
' '
}
<
Text
style
=
{
styles
.
text
}
>
S
ố
bu
ổ
i
v
ắ
ng
:{
item
.
absent_count
}
<
/Text
>
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
total_lessons
}
<
/Text
>
<
/Text
>
<
Text
style
=
{
styles
.
text_title
}
>
S
ố
bu
ổ
i
v
ắ
ng
:{
' '
}
<
Text
style
=
{
styles
.
text_content
}
>
{
item
.
absent_count
}
<
/Text
>
<
/Text
>
<
/View
>
<
/View
>
<
/View
>
<
/View
>
<
IconNext
width
=
{
15
}
height
=
{
15
}
/
>
<
IconNext
width
=
{
15
}
height
=
{
15
}
/
>
...
@@ -56,7 +64,13 @@ const styles = StyleSheet.create({
...
@@ -56,7 +64,13 @@ const styles = StyleSheet.create({
marginRight
:
15
marginRight
:
15
},
},
text
:{
text_title
:{
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontWeight
:
'600'
,
fontFamily
:
R
.
fonts
.
InterMedium
,
color
:
R
.
colors
.
black
,
},
text_content
:
{
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontSize
:
R
.
fontsize
.
fontsSize12
,
fontWeight
:
'400'
,
fontWeight
:
'400'
,
fontFamily
:
R
.
fonts
.
InterRegular
,
fontFamily
:
R
.
fonts
.
InterRegular
,
...
...
src/screens/roll_call/item_calendar.js
View file @
ff461bcc
...
@@ -24,9 +24,8 @@ const styles = StyleSheet.create({
...
@@ -24,9 +24,8 @@ const styles = StyleSheet.create({
width
:
0
,
width
:
0
,
height
:
2
,
height
:
2
,
},
},
shadowOpacity
:
0.22
,
shadowOpacity
:
0.25
,
shadowRadius
:
2.22
,
elevation
:
5
,
elevation
:
3
,
borderRadius
:
10
,
borderRadius
:
10
,
},
},
container_schedule_item
:
{
container_schedule_item
:
{
...
...
src/screens/roll_call/view.js
View file @
ff461bcc
...
@@ -28,6 +28,7 @@ const RollCallView = (props) => {
...
@@ -28,6 +28,7 @@ const RollCallView = (props) => {
keyExtractor
=
{(
item
)
=>
item
.
id
.
toString
()}
keyExtractor
=
{(
item
)
=>
item
.
id
.
toString
()}
scrollEnabled
=
{
true
}
scrollEnabled
=
{
true
}
showsVerticalScrollIndicator
=
{
false
}
showsVerticalScrollIndicator
=
{
false
}
/
>
/
>
<
/View
>
<
/View
>
...
...
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