Commit 37b104a3 by tungnq

TODO: Bổ sung chức năng văn bản đi

parent ee8ff61c
import React, {useState} from 'react'; import React, {useState} from 'react';
import {Text, View, StyleSheet} from 'react-native'; import {Text, View, StyleSheet, Alert} from 'react-native';
import DetailIncomingDocumentView from './view'; import DetailIncomingDocumentView from './view';
const DetailIncomingDocument = props => { const DetailIncomingDocument = props => {
// Document data
const [icomingDocument, setIncomingDocument] = useState({ const [icomingDocument, setIncomingDocument] = useState({
id: 102934, id: 102934,
title: 'Văn bản thông báo lịch nộp thời khoá biểu của học kỳ 2 năm 2025', title: 'Văn bản thông báo lịch nộp thời khoá biểu của học kỳ 2 năm 2025',
...@@ -67,11 +68,14 @@ const DetailIncomingDocument = props => { ...@@ -67,11 +68,14 @@ const DetailIncomingDocument = props => {
create_task_label: 'Tạo công việc', create_task_label: 'Tạo công việc',
}, },
}); });
// Dropdown data
const items = [ const items = [
{id: 1, label: 'Option 1'}, {id: 1, label: 'Option 1'},
{id: 2, label: 'Option 2'}, {id: 2, label: 'Option 2'},
{id: 3, label: 'Option 3'}, {id: 3, label: 'Option 3'},
]; ];
const [dataList, setDataList] = useState([ const [dataList, setDataList] = useState([
{id: 1, name: 'Nguyễn Minh Đức'}, {id: 1, name: 'Nguyễn Minh Đức'},
{id: 2, name: 'Trần Văn Hùng'}, {id: 2, name: 'Trần Văn Hùng'},
...@@ -94,11 +98,177 @@ const DetailIncomingDocument = props => { ...@@ -94,11 +98,177 @@ const DetailIncomingDocument = props => {
{id: 19, name: 'Nguyễn Hữu Tài'}, {id: 19, name: 'Nguyễn Hữu Tài'},
{id: 20, name: 'Phạm Thị Kim'}, {id: 20, name: 'Phạm Thị Kim'},
]); ]);
// Modal states
const [showModal, setShowModal] = useState(false);
const [showTaskModal, setShowTaskModal] = useState(false);
// Annotation form states
const [annotationContent, setAnnotationContent] = useState('');
// Task form states
const [taskTitle, setTaskTitle] = useState('');
const [taskDescription, setTaskDescription] = useState('');
const [taskCategory, setTaskCategory] = useState('Công việc theo văn bản');
const [taskDeadline, setTaskDeadline] = useState('');
const [taskFollower, setTaskFollower] = useState('859256, Nguyễn Minh Đức');
const [taskExecutor, setTaskExecutor] = useState('859256, Nguyễn Minh Đức');
const [selectedTags, setSelectedTags] = useState([]);
const [selectedFollowers, setSelectedFollowers] = useState([]);
const [selectedExecutors, setSelectedExecutors] = useState([]);
const [errors, setErrors] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
// Form validation function
const validateForm = () => {
const newErrors = {};
if (!taskTitle.trim()) {
newErrors.taskTitle = 'Tiêu đề không được để trống';
}
if (!taskDescription.trim()) {
newErrors.taskDescription = 'Mô tả không được để trống';
}
if (!taskDeadline.trim()) {
newErrors.taskDeadline = 'Ngày đến hạn không được để trống';
}
setErrors(newErrors);
return Object.keys(newErrors).length === 0;
};
// Annotation handlers
const handleAddAnnotation = () => {
if (annotationContent.trim()) {
Alert.alert('Thành công', 'Đã thêm bút phê thành công!');
setAnnotationContent('');
setShowModal(false);
} else {
Alert.alert('Lỗi', 'Vui lòng nhập nội dung bút phê!');
}
};
// Task handlers
const handleCreateTask = () => {
if (!validateForm()) {
Alert.alert('Lỗi', 'Vui lòng nhập đầy đủ thông tin!');
return;
}
setIsSubmitting(true);
try {
const taskData = {
title: taskTitle,
description: taskDescription,
category: taskCategory,
deadline: taskDeadline,
tags: selectedTags,
followers: selectedFollowers,
executors: selectedExecutors,
};
console.log('Creating task:', taskData);
Alert.alert('Thành công', 'Đã tạo công việc thành công!');
// Reset form after successful creation
setTaskTitle('');
setTaskDescription('');
setTaskDeadline('');
setSelectedTags([]);
setSelectedFollowers([]);
setSelectedExecutors([]);
setErrors({});
setShowTaskModal(false);
} catch (error) {
Alert.alert('Lỗi', 'Có lỗi xảy ra khi tạo công việc!');
console.error('Error creating task:', error);
} finally {
setIsSubmitting(false);
}
};
// Tag selection handlers
const handleAddTag = item => {
if (!selectedTags.find(t => t.id === item.id)) {
setSelectedTags([...selectedTags, item]);
}
};
const handleRemoveTag = id => {
setSelectedTags(selectedTags.filter(item => item.id !== id));
};
// Follower selection handlers
const handleAddFollower = item => {
if (!selectedFollowers.find(f => f.id === item.id)) {
setSelectedFollowers([...selectedFollowers, item]);
}
};
const handleRemoveFollower = id => {
setSelectedFollowers(selectedFollowers.filter(item => item.id !== id));
};
// Executor selection handlers
const handleAddExecutor = item => {
if (!selectedExecutors.find(e => e.id === item.id)) {
setSelectedExecutors([...selectedExecutors, item]);
}
};
const handleRemoveExecutor = id => {
setSelectedExecutors(selectedExecutors.filter(item => item.id !== id));
};
return ( return (
<DetailIncomingDocumentView <DetailIncomingDocumentView
// Data props
items={items} items={items}
icomingDocument={icomingDocument} icomingDocument={icomingDocument}
dataList={dataList} dataList={dataList}
// Modal states
showModal={showModal}
setShowModal={setShowModal}
showTaskModal={showTaskModal}
setShowTaskModal={setShowTaskModal}
// Annotation states
annotationContent={annotationContent}
setAnnotationContent={setAnnotationContent}
// Task form states
taskTitle={taskTitle}
setTaskTitle={setTaskTitle}
taskDescription={taskDescription}
setTaskDescription={setTaskDescription}
taskCategory={taskCategory}
setTaskCategory={setTaskCategory}
taskDeadline={taskDeadline}
setTaskDeadline={setTaskDeadline}
taskFollower={taskFollower}
setTaskFollower={setTaskFollower}
taskExecutor={taskExecutor}
setTaskExecutor={setTaskExecutor}
// Selection states
selectedTags={selectedTags}
selectedFollowers={selectedFollowers}
selectedExecutors={selectedExecutors}
// Form validation
errors={errors}
isSubmitting={isSubmitting}
// Handlers
handleAddAnnotation={handleAddAnnotation}
handleCreateTask={handleCreateTask}
handleAddTag={handleAddTag}
handleRemoveTag={handleRemoveTag}
handleAddFollower={handleAddFollower}
handleRemoveFollower={handleRemoveFollower}
handleAddExecutor={handleAddExecutor}
handleRemoveExecutor={handleRemoveExecutor}
/> />
); );
}; };
......
...@@ -60,8 +60,10 @@ const styles = StyleSheet.create({ ...@@ -60,8 +60,10 @@ const styles = StyleSheet.create({
borderWidth: 1, borderWidth: 1,
borderColor: R.colors.grayBorderInputTextHeader, borderColor: R.colors.grayBorderInputTextHeader,
borderRadius: 100, borderRadius: 100,
padding: 10, height: 30,
justifyContent: 'center',
alignSelf: 'flex-start', alignSelf: 'flex-start',
paddingHorizontal: 10,
backgroundColor: R.colors.orange, backgroundColor: R.colors.orange,
marginHorizontal: 5, marginHorizontal: 5,
}, },
...@@ -75,6 +77,77 @@ const styles = StyleSheet.create({ ...@@ -75,6 +77,77 @@ const styles = StyleSheet.create({
padding: 10, padding: 10,
width: 300, width: 300,
}, },
// New styles for inline replacements
marginTop5: {
marginTop: 5,
},
headerRow: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
marginBottom: 5,
},
statusText: {
fontWeight: '600',
fontFamily: R.fonts.fontMedium,
fontSize: R.fontsize.fontSizeContent,
},
infoRow: {
flexDirection: 'row',
justifyContent: 'space-between',
marginBottom: 5,
},
textWithMargin: {
marginBottom: 5,
},
signerContainer: {
justifyContent: 'space-between',
marginBottom: 5,
},
departmentRow: {
flexDirection: 'row',
flexWrap: 'wrap',
alignItems: 'center',
marginBottom: 5,
},
cardText: {
color: R.colors.white,
fontSize: R.fontsize.fontSizeContent,
},
downloadIcon: {
width: 20,
height: 20,
},
flex1: {
flex: 1,
},
marginHorizontal15: {
marginHorizontal: 15,
},
renderItemContainer: {
marginVertical: 7.5,
},
renderItemHeader: {
flexDirection: 'row',
marginBottom: 5,
},
modalContainerLarge: {
maxHeight: '90%',
},
dropdownLabel: {
marginBottom: 3,
fontSize: R.fontsize.fontSizeLabel,
fontFamily: R.fonts.fontMedium,
fontWeight: '600',
color: R.colors.black,
},
flatListContainer: {
maxHeight: 150,
marginBottom: 10,
},
redText: {
color: R.colors.red,
},
//MODAL Thêm Bút Phê //MODAL Thêm Bút Phê
modalOverlay: { modalOverlay: {
flex: 1, flex: 1,
......
import React, {useState} from 'react'; import React from 'react';
import { import {
Text, Text,
View, View,
...@@ -6,8 +6,8 @@ import { ...@@ -6,8 +6,8 @@ import {
Image, Image,
ScrollView, ScrollView,
FlatList, FlatList,
Alert,
Modal, Modal,
LogBox,
TextInput, TextInput,
} from 'react-native'; } from 'react-native';
import R from '../../../assets/R'; import R from '../../../assets/R';
...@@ -20,17 +20,45 @@ import TextField from '../../../components/Input/TextField'; ...@@ -20,17 +20,45 @@ import TextField from '../../../components/Input/TextField';
import Dropdown from '../../../components/DropdownAlert/Dropdown'; import Dropdown from '../../../components/DropdownAlert/Dropdown';
const DetailIncomingDocumentView = props => { const DetailIncomingDocumentView = props => {
const {icomingDocument, items, dataList} = props; const {
const [showModal, setShowModal] = useState(false); icomingDocument,
const [showTaskModal, setShowTaskModal] = useState(false); items,
const [annotationContent, setAnnotationContent] = useState(''); dataList,
const [taskTitle, setTaskTitle] = useState(''); showModal,
const [taskDescription, setTaskDescription] = useState(''); setShowModal,
const [taskCategory, setTaskCategory] = useState('Công việc theo văn bản'); showTaskModal,
const [taskDeadline, setTaskDeadline] = useState(''); setShowTaskModal,
const [taskFollower, setTaskFollower] = useState('859256, Nguyễn Minh Đức'); annotationContent,
const [taskExecutor, setTaskExecutor] = useState('859256, Nguyễn Minh Đức'); setAnnotationContent,
console.log(props); taskTitle,
setTaskTitle,
taskDescription,
setTaskDescription,
taskCategory,
setTaskCategory,
taskDeadline,
setTaskDeadline,
taskFollower,
setTaskFollower,
taskExecutor,
setTaskExecutor,
selectedTags,
selectedFollowers,
selectedExecutors,
errors,
isSubmitting,
handleAddAnnotation,
handleCreateTask,
handleAddTag,
handleRemoveTag,
handleAddFollower,
handleRemoveFollower,
handleAddExecutor,
handleRemoveExecutor,
} = props;
LogBox.ignoreLogs(['VirtualizedLists should never be nested']);
const getColor = status => { const getColor = status => {
switch (status) { switch (status) {
case 'Hạn chế': case 'Hạn chế':
...@@ -39,21 +67,12 @@ const DetailIncomingDocumentView = props => { ...@@ -39,21 +67,12 @@ const DetailIncomingDocumentView = props => {
return R.colors.blue; return R.colors.blue;
} }
}; };
const handleAddAnnotation = () => {
if (annotationContent.trim()) {
// Here you would typically call an API to save the annotation
Alert.alert('Thành công', 'Đã thêm bút phê thành công!');
setAnnotationContent('');
setShowModal(false);
} else {
Alert.alert('Lỗi', 'Vui lòng nhập nội dung bút phê!');
}
};
const renderItem = ({item}) => { const renderItem = ({item}) => {
console.log(item); console.log(item);
return ( return (
<View style={{marginVertical: 7.5}}> <View style={styles.renderItemContainer}>
<View style={{flexDirection: 'row', marginBottom: 5}}> <View style={styles.renderItemHeader}>
<Text style={styles.text}>{item.author} - </Text> <Text style={styles.text}>{item.author} - </Text>
<Text style={styles.text}>{item.code} </Text> <Text style={styles.text}>{item.code} </Text>
<Text style={styles.text}>{item.time} </Text> <Text style={styles.text}>{item.time} </Text>
...@@ -65,19 +84,14 @@ const DetailIncomingDocumentView = props => { ...@@ -65,19 +84,14 @@ const DetailIncomingDocumentView = props => {
</View> </View>
); );
}; };
const body = () => { const body = () => {
return ( return (
<ScrollView showsVerticalScrollIndicator={false}> <ScrollView showsVerticalScrollIndicator={false}>
<View style={styles.body}> <View style={styles.body}>
<Text style={styles.textSubTitle}>{icomingDocument.title}</Text> <Text style={styles.textSubTitle}>{icomingDocument.title}</Text>
<View style={{marginTop: 5}}></View> <View style={styles.marginTop5}></View>
<View <View style={styles.headerRow}>
style={{
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
marginBottom: 5,
}}>
<Text style={styles.text_1}> <Text style={styles.text_1}>
Văn bn hin có {icomingDocument.total_head_of_work} công vic Văn bn hin có {icomingDocument.total_head_of_work} công vic
liên {'\n'}quan liên {'\n'}quan
...@@ -85,123 +99,84 @@ const DetailIncomingDocumentView = props => { ...@@ -85,123 +99,84 @@ const DetailIncomingDocumentView = props => {
<Text style={styles.text}> <Text style={styles.text}>
Chế độ: Chế độ:
<Text <Text
style={{ style={[
fontWeight: '600', styles.statusText,
fontFamily: R.fonts.fontMedium, {color: getColor(icomingDocument.status)},
fontSize: R.fontsize.fontSizeContent, ]}>
color: getColor(icomingDocument.status),
}}>
{icomingDocument.status} {icomingDocument.status}
</Text> </Text>
</Text> </Text>
</View> </View>
<View <View style={styles.infoRow}>
style={{
flexDirection: 'row',
justifyContent: 'space-between',
marginBottom: 5,
}}>
<Text style={styles.text}> <Text style={styles.text}>
S ký hiu: S ký hiu:{' '}
<Text style={styles.text_2}>{icomingDocument.symbol_number}</Text> <Text style={styles.text_2}>{icomingDocument.symbol_number}</Text>
</Text> </Text>
<Text style={styles.text}> <Text style={styles.text}>
S vào s: S vào s:{' '}
<Text style={styles.text_2}> <Text style={styles.text_2}>
{icomingDocument.number_entry_book} {icomingDocument.number_entry_book}
</Text> </Text>
</Text> </Text>
</View> </View>
<View <View style={styles.infoRow}>
style={{
flexDirection: 'row',
justifyContent: 'space-between',
marginBottom: 5,
}}>
<Text style={styles.text}> <Text style={styles.text}>
Ngày đến: Ngày đến:{' '}
<Text style={styles.text_2}>{icomingDocument.term}</Text> <Text style={styles.text_2}>{icomingDocument.term}</Text>
</Text> </Text>
<Text style={styles.text}> <Text style={styles.text}>
Ngày văn bn: Ngày văn bn:{' '}
<Text style={styles.text_2}>{icomingDocument.term_display}</Text> <Text style={styles.text_2}>{icomingDocument.term_display}</Text>
</Text> </Text>
</View> </View>
<Text style={[styles.text, {marginBottom: 5}]}> <Text style={[styles.text, styles.textWithMargin]}>
Loi văn bn: Loi văn bn:
<Text style={styles.text_2}>{icomingDocument.document_type}</Text> <Text style={styles.text_2}>{icomingDocument.document_type}</Text>
</Text> </Text>
<Text style={[styles.text, {marginBottom: 5}]}> <Text style={[styles.text, styles.textWithMargin]}>
Lĩnh vc văn bn: Lĩnh vc văn bn:
<Text style={styles.text_2}>{icomingDocument.field}</Text> <Text style={styles.text_2}>{icomingDocument.field}</Text>
</Text> </Text>
<View <View style={styles.signerContainer}>
style={{
flexDirection: 'row',
justifyContent: 'space-between',
marginBottom: 5,
}}>
<Text style={styles.text}> <Text style={styles.text}>
Người ký: Người ký:{' '}
<Text style={styles.text_2}>{icomingDocument.signer_name}</Text> <Text style={styles.text_2}>{icomingDocument.signer_name}</Text>
</Text> </Text>
<Text style={styles.text}> <Text style={styles.text}>
Đối tác gi: Đối tác gi:{' '}
<Text style={styles.text_2}> <Text style={styles.text_2}>
{icomingDocument.sender_partner} {icomingDocument.sender_partner}
</Text> </Text>
</Text> </Text>
</View> </View>
<TextMulti title="Ghi chú" /> <TextMulti title="Ghi chú" />
<View style={{marginTop: 5}}></View> <View style={styles.marginTop5}></View>
<Text style={[styles.text, {marginBottom: 3}]}>Ni dung</Text> <Text style={[styles.text, styles.textWithMargin]}>Ni dung</Text>
<View style={[styles.containerContent, {marginBottom: 5}]}> <View style={[styles.containerContent, styles.textWithMargin]}>
<Text style={styles.text_2}>{icomingDocument.content}</Text> <Text style={styles.text_2}>{icomingDocument.content}</Text>
</View> </View>
<Text style={[styles.text, {marginBottom: 5}]}> <Text style={[styles.text, styles.textWithMargin]}>
Ý kiến ca BGH: Ý kiến ca BGH:
<Text style={styles.text_2}>{icomingDocument.opinion_bgh}</Text> <Text style={styles.text_2}>{icomingDocument.opinion_bgh}</Text>
</Text> </Text>
<View <View style={styles.departmentRow}>
style={{
flexDirection: 'row',
flexWrap: 'wrap',
alignItems: 'center',
marginBottom: 5,
}}>
<Text style={styles.text}>Phòng ban nhn :</Text> <Text style={styles.text}>Phòng ban nhn :</Text>
{icomingDocument.received_departments.map((item, index) => { {icomingDocument.received_departments.map((item, index) => {
return ( return (
<View style={styles.card}> <View style={styles.card}>
<Text <Text style={styles.cardText} key={index}>
style={{
color: R.colors.white,
fontSize: R.fontsize.fontSizeContent,
}}
key={index}>
{item.name} {item.name}
</Text> </Text>
</View> </View>
); );
})} })}
</View> </View>
<View <View style={styles.departmentRow}>
style={{
flexDirection: 'row',
flexWrap: 'wrap',
alignItems: 'center',
marginBottom: 5,
}}>
<Text style={styles.text}>Nhóm nhn :</Text> <Text style={styles.text}>Nhóm nhn :</Text>
{icomingDocument.received_group.map((item, index) => { {icomingDocument.received_group.map((item, index) => {
return ( return (
<View style={[styles.card, {backgroundColor: R.colors.blue}]}> <View style={[styles.card, {backgroundColor: R.colors.blue}]}>
<Text <Text style={styles.cardText} key={index}>
style={{
color: R.colors.white,
fontSize: R.fontsize.fontSizeContent,
}}
key={index}>
{item.name} {item.name}
</Text> </Text>
</View> </View>
...@@ -209,23 +184,12 @@ const DetailIncomingDocumentView = props => { ...@@ -209,23 +184,12 @@ const DetailIncomingDocumentView = props => {
})} })}
</View> </View>
<View <View style={styles.departmentRow}>
style={{
flexDirection: 'row',
flexWrap: 'wrap',
alignItems: 'center',
marginBottom: 5,
}}>
<Text style={styles.text}>Người nhn :</Text> <Text style={styles.text}>Người nhn :</Text>
{icomingDocument.receiver.map((item, index) => { {icomingDocument.receiver.map((item, index) => {
return ( return (
<View style={[styles.card, {backgroundColor: R.colors.blue}]}> <View style={[styles.card, {backgroundColor: R.colors.blue}]}>
<Text <Text style={styles.cardText} key={index}>
style={{
color: R.colors.white,
fontSize: R.fontsize.fontSizeContent,
}}
key={index}>
{item.name} {item.name}
</Text> </Text>
</View> </View>
...@@ -243,7 +207,7 @@ const DetailIncomingDocumentView = props => { ...@@ -243,7 +207,7 @@ const DetailIncomingDocumentView = props => {
</Text> </Text>
<Image <Image
source={R.images.icDownload} source={R.images.icDownload}
style={{width: 20, height: 20}} style={styles.downloadIcon}
resizeMode="contain" resizeMode="contain"
tintColor={R.colors.blue} tintColor={R.colors.blue}
/> />
...@@ -262,17 +226,7 @@ const DetailIncomingDocumentView = props => { ...@@ -262,17 +226,7 @@ const DetailIncomingDocumentView = props => {
</ScrollView> </ScrollView>
); );
}; };
const handleCreateTask = () => {
if (taskTitle.trim() && taskDescription.trim()) {
Alert.alert('Thành công', 'Đã tạo công việc thành công!');
setTaskTitle('');
setTaskDescription('');
setTaskDeadline('');
setShowTaskModal(false);
} else {
Alert.alert('Lỗi', 'Vui lòng nhập đầy đủ thông tin!');
}
};
const renderItem_1 = ({item, onPress}) => { const renderItem_1 = ({item, onPress}) => {
return ( return (
<View style={styles.chip}> <View style={styles.chip}>
...@@ -288,6 +242,7 @@ const DetailIncomingDocumentView = props => { ...@@ -288,6 +242,7 @@ const DetailIncomingDocumentView = props => {
</View> </View>
); );
}; };
const openModal = () => { const openModal = () => {
return ( return (
<Modal <Modal
...@@ -331,6 +286,7 @@ const DetailIncomingDocumentView = props => { ...@@ -331,6 +286,7 @@ const DetailIncomingDocumentView = props => {
</Modal> </Modal>
); );
}; };
const openTaskModal = () => { const openTaskModal = () => {
return ( return (
<Modal <Modal
...@@ -339,7 +295,7 @@ const DetailIncomingDocumentView = props => { ...@@ -339,7 +295,7 @@ const DetailIncomingDocumentView = props => {
visible={showTaskModal} visible={showTaskModal}
onRequestClose={() => setShowTaskModal(false)}> onRequestClose={() => setShowTaskModal(false)}>
<View style={styles.modalOverlay}> <View style={styles.modalOverlay}>
<View style={[styles.modalContainer, {maxHeight: '90%'}]}> <View style={[styles.modalContainer, styles.modalContainerLarge]}>
<View style={styles.modalHeader}> <View style={styles.modalHeader}>
<Text style={styles.modalTitle}>Thêm công vic</Text> <Text style={styles.modalTitle}>Thêm công vic</Text>
</View> </View>
...@@ -350,66 +306,48 @@ const DetailIncomingDocumentView = props => { ...@@ -350,66 +306,48 @@ const DetailIncomingDocumentView = props => {
title="Tiêu đề" title="Tiêu đề"
fontSizeTitle={R.fontsize.fontSizeLabel} fontSizeTitle={R.fontsize.fontSizeLabel}
required required
placeholder="HS" placeholder="Nhập tiêu đề công việc"
placeholderTextColor={R.colors.gray} placeholderTextColor={R.colors.gray}
value={taskTitle} value={taskTitle}
onChangeText={setTaskTitle} onChangeText={setTaskTitle}
containerMarginBottom={10} containerMarginBottom={10}
error={errors.taskTitle}
/> />
<TextMulti <TextMulti
title="Mô tả" title="Mô tả"
titleFontSize={R.fontsize.fontSizeLabel} titleFontSize={R.fontsize.fontSizeLabel}
placeholder="Nhập mô tả..." placeholder="Nhập mô tả công việc..."
placeholderTextColor={R.colors.gray} placeholderTextColor={R.colors.gray}
multiline={true} multiline={true}
numberOfLines={3} numberOfLines={3}
required required
value={taskDescription} value={taskDescription}
onChangeText={setTaskDescription} onChangeText={setTaskDescription}
error={errors.taskDescription}
/> />
<View style={styles.containerDropdown}> <View style={styles.containerDropdown}>
<Text <Text style={[styles.text, styles.dropdownLabel]}>Th</Text>
style={[
styles.text,
{
marginBottom: 3,
fontSize: R.fontsize.fontSizeLabel,
fontFamily: R.fonts.fontMedium,
fontWeight: '600',
color: R.colors.black,
},
]}>
Th
</Text>
<Dropdown <Dropdown
height={35} height={35}
items={items} items={items}
placeholder="Chọn tùy chọn" placeholder="Chọn thẻ"
onSelect={item => console.log('Bạn đã chọn:', item)} onSelect={handleAddTag}
/> />
</View> </View>
<Text <Text style={[styles.text_2, styles.dropdownLabel]}>
style={[
styles.text_2,
{
marginBottom: 3,
fontSize: R.fontsize.fontSizeLabel,
fontFamily: R.fonts.fontMedium,
fontWeight: '600',
color: R.colors.black,
},
]}>
Danh sách th đã chn : Danh sách th đã chn :
</Text> </Text>
<FlatList <FlatList
data={dataList} data={selectedTags}
renderItem={({item}) => renderItem_1({item, onPress: () => {}})} renderItem={({item}) =>
renderItem_1({item, onPress: () => handleRemoveTag(item.id)})
}
keyExtractor={(item, index) => keyExtractor={(item, index) =>
item.id?.toString() || index.toString() item.id?.toString() || index.toString()
} }
numColumns={2} numColumns={2}
style={{maxHeight: 150, marginBottom: 10}} style={styles.flatListContainer}
showsVerticalScrollIndicator={true} showsVerticalScrollIndicator={true}
columnWrapperStyle={styles.flatListSelect} columnWrapperStyle={styles.flatListSelect}
nestedScrollEnabled={true} nestedScrollEnabled={true}
...@@ -419,101 +357,73 @@ const DetailIncomingDocumentView = props => { ...@@ -419,101 +357,73 @@ const DetailIncomingDocumentView = props => {
title="Ngày đến hạn" title="Ngày đến hạn"
required required
fontSizeTitle={R.fontsize.fontSizeLabel} fontSizeTitle={R.fontsize.fontSizeLabel}
placeholder="DD/MM/YYYY"
value={taskDeadline} value={taskDeadline}
onChangeText={setTaskDeadline} onChangeText={setTaskDeadline}
error={errors.taskDeadline}
/> />
<View style={styles.containerDropdown}> <View style={styles.containerDropdown}>
<Text <Text style={[styles.text, styles.dropdownLabel]}>
style={[
styles.text,
{
marginBottom: 3,
fontSize: R.fontsize.fontSizeLabel,
fontFamily: R.fonts.fontMedium,
fontWeight: '600',
color: R.colors.black,
},
]}>
Người theo dõi {''} Người theo dõi {''}
<Text style={{color: R.colors.red}}>*</Text> <Text style={styles.redText}>*</Text>
</Text> </Text>
<Dropdown <Dropdown
height={35} height={35}
items={items} items={items}
placeholder="Chọn tùy chọn" placeholder="Chọn người theo dõi"
onSelect={item => console.log('Bạn đã chọn:', item)} onSelect={handleAddFollower}
/> />
</View> </View>
<Text <Text style={[styles.text_2, styles.dropdownLabel]}>
style={[
styles.text_2,
{
marginBottom: 3,
fontSize: R.fontsize.fontSizeLabel,
fontFamily: R.fonts.fontMedium,
fontWeight: '600',
color: R.colors.black,
},
]}>
Danh sách người theo dõi đã chn : Danh sách người theo dõi đã chn :
</Text> </Text>
<FlatList <FlatList
data={dataList} data={selectedFollowers}
renderItem={({item}) => renderItem_1({item, onPress: () => {}})} renderItem={({item}) =>
renderItem_1({
item,
onPress: () => handleRemoveFollower(item.id),
})
}
keyExtractor={(item, index) => keyExtractor={(item, index) =>
item.id?.toString() || index.toString() item.id?.toString() || index.toString()
} }
numColumns={2} numColumns={2}
style={{maxHeight: 150, marginBottom: 10}} style={styles.flatListContainer}
showsVerticalScrollIndicator={true} showsVerticalScrollIndicator={true}
columnWrapperStyle={styles.flatListSelect} columnWrapperStyle={styles.flatListSelect}
nestedScrollEnabled={true} nestedScrollEnabled={true}
scrollEnabled={true} scrollEnabled={true}
/> />
<View style={styles.containerDropdown}> <View style={styles.containerDropdown}>
<Text <Text style={[styles.text, styles.dropdownLabel]}>
style={[
styles.text,
{
marginBottom: 3,
fontSize: R.fontsize.fontSizeLabel,
fontFamily: R.fonts.fontMedium,
fontWeight: '600',
color: R.colors.black,
},
]}>
Người thc hin công vic{' '} Người thc hin công vic{' '}
<Text style={{color: R.colors.red}}>*</Text> <Text style={styles.redText}>*</Text>
</Text> </Text>
<Dropdown <Dropdown
height={35} height={35}
items={items} items={items}
placeholder="Chọn tùy chọn" placeholder="Chọn người thực hiện"
onSelect={item => console.log('Bạn đã chọn:', item)} onSelect={handleAddExecutor}
/> />
</View> </View>
<Text <Text style={[styles.text_2, styles.dropdownLabel]}>
style={[
styles.text_2,
{
marginBottom: 3,
fontSize: R.fontsize.fontSizeLabel,
fontFamily: R.fonts.fontMedium,
fontWeight: '600',
color: R.colors.black,
},
]}>
Danh sách người thc hin công vic đã chn : Danh sách người thc hin công vic đã chn :
</Text> </Text>
<FlatList <FlatList
data={dataList} data={selectedExecutors}
renderItem={({item}) => renderItem_1({item, onPress: () => {}})} renderItem={({item}) =>
renderItem_1({
item,
onPress: () => handleRemoveExecutor(item.id),
})
}
keyExtractor={(item, index) => keyExtractor={(item, index) =>
item.id?.toString() || index.toString() item.id?.toString() || index.toString()
} }
numColumns={2} numColumns={2}
style={{maxHeight: 150, marginBottom: 10}} style={styles.flatListContainer}
showsVerticalScrollIndicator={true} showsVerticalScrollIndicator={true}
columnWrapperStyle={styles.flatListSelect} columnWrapperStyle={styles.flatListSelect}
nestedScrollEnabled={true} nestedScrollEnabled={true}
...@@ -524,13 +434,22 @@ const DetailIncomingDocumentView = props => { ...@@ -524,13 +434,22 @@ const DetailIncomingDocumentView = props => {
<View style={styles.modalFooter}> <View style={styles.modalFooter}>
<TouchableOpacity <TouchableOpacity
style={[styles.button, styles.cancelButton]} style={[styles.button, styles.cancelButton]}
onPress={() => setShowTaskModal(false)}> onPress={() => {
setShowTaskModal(false);
}}>
<Text style={styles.cancelButtonText}>Hy</Text> <Text style={styles.cancelButtonText}>Hy</Text>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity <TouchableOpacity
style={[styles.button, styles.submitButton]} style={[
onPress={handleCreateTask}> styles.button,
<Text style={styles.submitButtonText}>Thêm mi</Text> styles.submitButton,
isSubmitting && {opacity: 0.6},
]}
onPress={handleCreateTask}
disabled={isSubmitting}>
<Text style={styles.submitButtonText}>
{isSubmitting ? 'Đang tạo...' : 'Thêm mới'}
</Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
</View> </View>
...@@ -542,9 +461,9 @@ const DetailIncomingDocumentView = props => { ...@@ -542,9 +461,9 @@ const DetailIncomingDocumentView = props => {
return ( return (
<View style={styles.container}> <View style={styles.container}>
<Header title={'Văn bản 2038475'} isBack /> <Header title={'Văn bản 2038475'} isBack />
<View style={{flex: 1}}> <View style={styles.flex1}>
{body()} {body()}
<View style={{marginHorizontal: 15}}> <View style={styles.marginHorizontal15}>
<FAB> <FAB>
<SubButton <SubButton
onPress={() => setShowModal(true)} onPress={() => setShowModal(true)}
......
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