Commit d983fc24 by tungnq

TODO: Thêm modal báo cáo công việc và chỉnh sửa báo cáo

Triển khai WorkReportModal để thêm báo cáo công việc với phần nhập nội dung và tuỳ chọn đính kèm.

Tạo EditReportModal để chỉnh sửa báo cáo hiện có với nội dung được điền sẵn và quản lý tệp đính kèm.

Tích hợp cả hai modal vào DetailListWorkDeliverToMeView để người dùng thao tác mượt mà.

Thêm quản lý state cho dữ liệu báo cáo và trạng thái hiển thị modal.

Cải thiện giao diện với các style phù hợp và yếu tố thiết kế responsive.

TODO: Phát triển màn hình chi tiết cho giám sát công việc

Tạo component DetailListWorkMonitoring để hiển thị chi tiết giám sát công việc.

Thiết lập cấu trúc ban đầu và style cho màn hình giám sát.

Chuẩn bị component cho các nâng cấp và tích hợp dữ liệu trong tương lai.
parent 7b119d30
...@@ -40,7 +40,8 @@ export const INCOMINGDOCUMENT = 'INCOMINGDOCUMENT' ; ...@@ -40,7 +40,8 @@ export const INCOMINGDOCUMENT = 'INCOMINGDOCUMENT' ;
export const DETAILINCOMINGDOCUMENT = 'DETAILINCOMINGDOCUMENT'; export const DETAILINCOMINGDOCUMENT = 'DETAILINCOMINGDOCUMENT';
export const LISTWORK = 'LISTWORK'; export const LISTWORK = 'LISTWORK';
export const DETAILWORK = 'DETAILWORK'; export const DETAILWORKDELIVERTOME = 'DETAILWORKDELIVERTOME';
export const DETAILWORKMONITORING = 'DETAILWORKMONITORING';
export const LISTSENDDOCUMENT = 'LISTSENDDOCUMENT'; export const LISTSENDDOCUMENT = 'LISTSENDDOCUMENT';
export const ADDSENDOCUMENT = 'ADDSENDDOCUMENT'; export const ADDSENDOCUMENT = 'ADDSENDDOCUMENT';
......
...@@ -28,7 +28,8 @@ import AddSendDocument from '../screens/list_send_document/add'; ...@@ -28,7 +28,8 @@ import AddSendDocument from '../screens/list_send_document/add';
import DetailSendDocument from '../screens/list_send_document/detail'; import DetailSendDocument from '../screens/list_send_document/detail';
import StatusSendDocument from '../screens/list_send_document/status'; import StatusSendDocument from '../screens/list_send_document/status';
import ListWork from '../screens/list_work'; import ListWork from '../screens/list_work';
import DetailListWork from '../screens/list_work/detail'; import DetailListWorkDeliverToMe from '../screens/list_work/deliver_to_me';
import DetailListWorkMonitoring from '../screens/list_work/monitoring';
import DrawerEmailView from '../routers/drawer_email/drawerView'; import DrawerEmailView from '../routers/drawer_email/drawerView';
import SendEmail from '../screens/email/send'; import SendEmail from '../screens/email/send';
import DetailEmail from '../screens/email/detail'; import DetailEmail from '../screens/email/detail';
...@@ -72,7 +73,8 @@ function MyStack(props) { ...@@ -72,7 +73,8 @@ function MyStack(props) {
<Stack.Screen name={ScreenName.DETAILSENDDOCUMENT} component={DetailSendDocument}/> <Stack.Screen name={ScreenName.DETAILSENDDOCUMENT} component={DetailSendDocument}/>
<Stack.Screen name={ScreenName.STATUSSENDDOCUMENT} component={StatusSendDocument}/> <Stack.Screen name={ScreenName.STATUSSENDDOCUMENT} component={StatusSendDocument}/>
<Stack.Screen name={ScreenName.LISTWORK} component={ListWork}/> <Stack.Screen name={ScreenName.LISTWORK} component={ListWork}/>
<Stack.Screen name={ScreenName.DETAILWORK} component={DetailListWork}/> <Stack.Screen name={ScreenName.DETAILWORKDELIVERTOME} component={DetailListWorkDeliverToMe}/>
<Stack.Screen name={ScreenName.DETAILWORKMONITORING} component={DetailListWorkMonitoring}/>
<Stack.Screen name={ScreenName.EMAIL} component={DrawerEmailView}/> <Stack.Screen name={ScreenName.EMAIL} component={DrawerEmailView}/>
<Stack.Screen name={ScreenName.SENDEMAIL} component={SendEmail}/> <Stack.Screen name={ScreenName.SENDEMAIL} component={SendEmail}/>
<Stack.Screen name={ScreenName.DETAILEMAIL} component={DetailEmail}/> <Stack.Screen name={ScreenName.DETAILEMAIL} component={DetailEmail}/>
......
import WorkReportModal from './view'; import WorkReportModal from '../../detail/modal_add_report/view';
export default WorkReportModal; export default WorkReportModal;
import { StyleSheet } from "react-native"; import { StyleSheet } from "react-native";
import R from "../../../../assets/R"; import R from "../../../../../assets/R";
const styles = StyleSheet.create({ const styles = StyleSheet.create({
overlay: { overlay: {
......
...@@ -3,14 +3,12 @@ import { ...@@ -3,14 +3,12 @@ import {
Modal, Modal,
View, View,
Text, Text,
TextInput,
TouchableOpacity, TouchableOpacity,
StyleSheet,
Image, Image,
} from 'react-native'; } from 'react-native';
import TextMulti from '../../../../components/Input/TextMulti'; import TextMulti from '../../../../../components/Input/TextMulti';
import R from '../../../../assets/R'; import R from '../../../../../assets/R';
import Button from '../../../../components/Button'; import Button from '../../../../../components/Button';
import styles from './style'; import styles from './style';
const WorkReportModal = ({visible, onClose, onSubmit}) => { const WorkReportModal = ({visible, onClose, onSubmit}) => {
......
import EditReportModal from './view'; import EditReportModal from '../../detail/modal_edit_report';
export default EditReportModal; export default EditReportModal;
...@@ -8,8 +8,8 @@ import { ...@@ -8,8 +8,8 @@ import {
StyleSheet, StyleSheet,
Image, Image,
} from 'react-native'; } from 'react-native';
import R from '../../../../assets/R'; import R from '../../../../../assets/R';
import Button from '../../../../components/Button'; import Button from '../../../../../components/Button';
const EditReportModal = ({visible, onClose, onSubmit, initialContent = ''}) => { const EditReportModal = ({visible, onClose, onSubmit, initialContent = ''}) => {
const [reportContent, setReportContent] = useState(initialContent); const [reportContent, setReportContent] = useState(initialContent);
......
import React, {useState} from 'react'; import React, {useState} from 'react';
import {Text, View, StyleSheet} from 'react-native'; import DetailListWorkDeliverToMeView from './view';
import DetailListWorkView from './view';
const DetailListWork = props => { const DetailListWorkDeliverToMe = props => {
const [data, setData] = useState({ const [data, setData] = useState({
id: 1, id: 1,
title: 'Tạo thời khóa biểu cho sinh viến khai giảng và học kỳ 2 năm 2025', title: 'Tạo thời khóa biểu cho sinh viến khai giảng và học kỳ 2 năm 2025',
...@@ -136,7 +135,7 @@ const DetailListWork = props => { ...@@ -136,7 +135,7 @@ const DetailListWork = props => {
]); ]);
return ( return (
<DetailListWorkView <DetailListWorkDeliverToMeView
data={data} data={data}
dataList={dataList} dataList={dataList}
dataReport={dataReport} dataReport={dataReport}
...@@ -144,4 +143,4 @@ const DetailListWork = props => { ...@@ -144,4 +143,4 @@ const DetailListWork = props => {
); );
}; };
export default DetailListWork; export default DetailListWorkDeliverToMe;
...@@ -14,9 +14,9 @@ import SubButton from '../../../components/FAB/sub_button'; ...@@ -14,9 +14,9 @@ import SubButton from '../../../components/FAB/sub_button';
import R from '../../../assets/R'; import R from '../../../assets/R';
import Header from '../../../components/Header/Header'; import Header from '../../../components/Header/Header';
import Dropdown from '../../../components/DropdownAlert/Dropdown'; import Dropdown from '../../../components/DropdownAlert/Dropdown';
import WorkReportModal from '../detail/modal_add_report'; import WorkReportModal from './detail/modal_add_report';
import EditReportModal from '../detail/modal_edit_report'; import EditReportModal from './detail/modal_edit_report';
const DetailListWorkView = props => { const DetailListWorkDeliverToMeView = props => {
const {data, dataList, dataReport} = props; const {data, dataList, dataReport} = props;
const [showWorkReportModal, setShowWorkReportModal] = useState(false); const [showWorkReportModal, setShowWorkReportModal] = useState(false);
const [showEditReportModal, setShowEditReportModal] = useState(false); const [showEditReportModal, setShowEditReportModal] = useState(false);
...@@ -293,4 +293,4 @@ const DetailListWorkView = props => { ...@@ -293,4 +293,4 @@ const DetailListWorkView = props => {
); );
}; };
export default DetailListWorkView; export default DetailListWorkDeliverToMeView;
...@@ -316,8 +316,8 @@ const ListWork = props => { ...@@ -316,8 +316,8 @@ const ListWork = props => {
// ==================== NAVIGATION HANDLERS ==================== // ==================== NAVIGATION HANDLERS ====================
// Điều hướng đến màn hình chi tiết công việc // Điều hướng đến màn hình chi tiết công việc
const handleViewDetail = item => { const handleViewDetailDeliverToMe = item => {
navigation.navigate(ScreenName.DETAILWORK, {workItem: item}); navigation.navigate(ScreenName.DETAILWORKDELIVERTOME, {workItem: item});
}; };
// ==================== ACTION HANDLERS ==================== // ==================== ACTION HANDLERS ====================
...@@ -484,7 +484,7 @@ const ListWork = props => { ...@@ -484,7 +484,7 @@ const ListWork = props => {
onAddWork={handleAddWork} onAddWork={handleAddWork}
onSaveWork={handleSaveWork} onSaveWork={handleSaveWork}
onCloseModal={handleCloseModal} onCloseModal={handleCloseModal}
onViewDetail={handleViewDetail} onViewDetailDeliverToMe={handleViewDetailDeliverToMe}
onReportAction={handleReportAction} onReportAction={handleReportAction}
onApprovalAction={handleApprovalAction} onApprovalAction={handleApprovalAction}
// Utils // Utils
......
import React from 'react';
import DetailListWorkMonitoringView from './view';
const DetailListWorkMonitoring = (props) => {
return (
<DetailListWorkMonitoringView />
);
};
export default DetailListWorkMonitoring;
import { StyleSheet, Text, View } from 'react-native'
const styles = StyleSheet.create({
container: {
},
body:{
}
})
export default styles
\ No newline at end of file
import React from 'react';
import {Text, View, TouchableOpacity, StyleSheet} from 'react-native';
style
const ComponentNameView = (props) => {
const { } = props;
return (
<View
style={{
flex: 1,
justifyContent: 'center',
alignItems: 'center',
}}>
<TouchableOpacity>
<Text>ComponentName</Text>
</TouchableOpacity>
</View>
);
};
export default ComponentNameView;
...@@ -14,7 +14,7 @@ import Header from '../../components/Header/Header'; ...@@ -14,7 +14,7 @@ import Header from '../../components/Header/Header';
import Dropdown from '../../components/DropdownAlert/Dropdown'; import Dropdown from '../../components/DropdownAlert/Dropdown';
import R from '../../assets/R'; import R from '../../assets/R';
import TabViewComponent from '../../components/TabView'; import TabViewComponent from '../../components/TabView';
import AddWorkModal from '../list_work/modal_add/index'; import AddWorkModal from './modal_add_deliver_to_me/index';
import Button from '../../components/Button'; import Button from '../../components/Button';
const ListWorkView = props => { const ListWorkView = props => {
...@@ -28,7 +28,7 @@ const ListWorkView = props => { ...@@ -28,7 +28,7 @@ const ListWorkView = props => {
onAddWork, onAddWork,
onSaveWork, onSaveWork,
onCloseModal, onCloseModal,
onViewDetail, onViewDetailDeliverToMe,
onReportAction, onReportAction,
onApprovalAction, onApprovalAction,
getStatusColor, getStatusColor,
...@@ -80,7 +80,7 @@ const ListWorkView = props => { ...@@ -80,7 +80,7 @@ const ListWorkView = props => {
return ( return (
<TouchableOpacity <TouchableOpacity
style={{marginHorizontal: 15, marginVertical: 10}} style={{marginHorizontal: 15, marginVertical: 10}}
onPress={() => onViewDetail(item)} onPress={() => onViewDetailDeliverToMe(item)}
activeOpacity={0.7}> activeOpacity={0.7}>
<View <View
style={{ style={{
......
...@@ -60,7 +60,6 @@ const Profile = (props) => { ...@@ -60,7 +60,6 @@ const Profile = (props) => {
const [salaryIncreaseMilestone, setSalaryIncreaseMilestone] = useState(''); const [salaryIncreaseMilestone, setSalaryIncreaseMilestone] = useState('');
const [lecturerTitle, setLecturerTitle] = useState(''); const [lecturerTitle, setLecturerTitle] = useState('');
// --- radio group ---
const [selectedValue2, setSelectedValue2] = useState('1'); const [selectedValue2, setSelectedValue2] = useState('1');
const options2 = [ const options2 = [
{label: 'Cơ chế', value: '1'}, {label: 'Cơ chế', value: '1'},
...@@ -80,7 +79,6 @@ const Profile = (props) => { ...@@ -80,7 +79,6 @@ const Profile = (props) => {
const device = useCameraDevice(useFront ? 'front' : 'back'); const device = useCameraDevice(useFront ? 'front' : 'back');
const {hasPermission, requestPermission} = useCameraPermission(); const {hasPermission, requestPermission} = useCameraPermission();
// Load recent photos for gallery preview
const loadRecentPhotos = async () => { const loadRecentPhotos = async () => {
try { try {
if (Platform.OS === 'android') { if (Platform.OS === 'android') {
...@@ -108,7 +106,6 @@ const Profile = (props) => { ...@@ -108,7 +106,6 @@ const Profile = (props) => {
}, []); }, []);
const openImageSourceModal = async () => { const openImageSourceModal = async () => {
// Go directly to camera instead of showing modal
if (!hasPermission) { if (!hasPermission) {
const ok = await requestPermission(); const ok = await requestPermission();
if (!ok) return; if (!ok) return;
...@@ -164,14 +161,12 @@ const Profile = (props) => { ...@@ -164,14 +161,12 @@ const Profile = (props) => {
setPreviewUri(uri); setPreviewUri(uri);
setShowCamera(false); setShowCamera(false);
setShowPreview(true); setShowPreview(true);
// Keep tabs hidden for preview
}; };
const onToggleCameraPosition = () => setUseFront(v => !v); const onToggleCameraPosition = () => setUseFront(v => !v);
const onCloseCamera = () => { const onCloseCamera = () => {
setShowCamera(false); setShowCamera(false);
// Show tab bar when camera closes
DeviceEventEmitter.emit('hideTabs', false); DeviceEventEmitter.emit('hideTabs', false);
}; };
...@@ -194,9 +189,8 @@ const Profile = (props) => { ...@@ -194,9 +189,8 @@ const Profile = (props) => {
DeviceEventEmitter.emit('hideTabs', false); DeviceEventEmitter.emit('hideTabs', false);
}; };
// --- save handler ---
const handleSave = () => { const handleSave = () => {
const formData = { const [formData, setFormData] = useState({
phoneNumber, phoneNumber,
oldTeacherCode, oldTeacherCode,
workPlace, workPlace,
...@@ -231,8 +225,8 @@ const Profile = (props) => { ...@@ -231,8 +225,8 @@ const Profile = (props) => {
salaryIncreaseMilestone, salaryIncreaseMilestone,
lecturerTitle, lecturerTitle,
avatarUri, avatarUri,
}; });
console.log('Profile Form Data:', formData); setFormData(formData);
// TODO: call API save // TODO: call API save
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment