Skip to content

Commit f11aab1

Browse files
authored
Merge pull request #327 from GSM-MSG/feature/314_marking_fillout_project_required_data
🔀 :: (314) - 정보기입 프로젝트 필수값 마킹
2 parents a203e13 + 9aaf9f5 commit f11aab1

11 files changed

+216
-63
lines changed

.idea/gradle.xml

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

presentation/src/main/java/com/sms/presentation/main/ui/fill_out_information/FillOutInformationActivity.kt

+62-18
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.activity.compose.setContent
66
import androidx.activity.viewModels
77
import androidx.compose.foundation.background
88
import androidx.compose.foundation.layout.*
9+
import androidx.compose.foundation.lazy.rememberLazyListState
910
import androidx.compose.foundation.shape.RoundedCornerShape
1011
import androidx.compose.material.*
1112
import androidx.compose.runtime.*
@@ -35,6 +36,7 @@ import com.sms.presentation.main.ui.fill_out_information.component.bottomsheet.M
3536
import com.sms.presentation.main.ui.fill_out_information.component.bottomsheet.PhotoPickBottomSheet
3637
import com.sms.presentation.main.ui.fill_out_information.data.AwardData
3738
import com.sms.presentation.main.ui.fill_out_information.data.ProjectInfo
39+
import com.sms.presentation.main.ui.fill_out_information.data.ProjectRequiredDataInfo
3840
import com.sms.presentation.main.ui.fill_out_information.screen.*
3941
import com.sms.presentation.main.ui.login.LoginActivity
4042
import com.sms.presentation.main.ui.main.MainActivity
@@ -91,6 +93,7 @@ class FillOutInformationActivity : BaseActivity() {
9193
val focusManager = LocalFocusManager.current
9294
val scope = rememberCoroutineScope()
9395
val navController = rememberNavController()
96+
val projectListState = rememberLazyListState()
9497
val bottomSheetState =
9598
rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden)
9699
val bottomSheetValues = remember {
@@ -444,35 +447,76 @@ class FillOutInformationActivity : BaseActivity() {
444447
setSoftInputMode("PAN")
445448
ProjectsScreen(
446449
navController = navController,
450+
listState = projectListState,
447451
projects = projectList,
448452
detailStacks = projectsDetailTechStack,
453+
projectRequiredDataInfoList = fillOutViewModel.projectsRequiredInfoData.value,
449454
onAddButtonClick = {
450455
projectList.add(ProjectInfo())
451456
projectsDetailTechStack.add(emptyList())
457+
fillOutViewModel.addProjectRequiredDataInformaion()
452458
},
453459
onNextButtonClick = {
454-
fillOutViewModel.setEnteredProjectsInformation(
455-
projectList.filter { project ->
456-
project.name.isNotEmpty() ||
457-
project.icon != Uri.EMPTY ||
458-
project.preview.isNotEmpty() ||
459-
project.technologyOfUse.isNotEmpty() ||
460-
project.description.isNotEmpty() ||
461-
project.keyTask.isNotEmpty() ||
462-
project.endDate.isNotEmpty() ||
463-
project.startDate.isNotEmpty() ||
464-
project.relatedLinkList.first() != Pair(
465-
"",
466-
""
460+
projectList.forEachIndexed { index, projectInfo ->
461+
fillOutViewModel.setProjectRequiredDataInformation(
462+
index = index,
463+
data = ProjectRequiredDataInfo(
464+
isNameEmpty = projectInfo.name.isEmpty(),
465+
isIconEmpty = projectInfo.icon == Uri.EMPTY,
466+
isTechStackEmpty = projectsDetailTechStack[index].isEmpty(),
467+
isDescriptionEmpty = projectInfo.description.isEmpty(),
468+
isStartDateEmpty = projectInfo.startDate.isEmpty(),
469+
isEndDateEmpty = projectInfo.endDate.isEmpty()
467470
)
471+
)
472+
}
473+
474+
if (
475+
fillOutViewModel.projectsRequiredInfoData.value.all {
476+
!it.isNameEmpty &&
477+
!it.isIconEmpty &&
478+
!it.isDescriptionEmpty &&
479+
!it.isTechStackEmpty &&
480+
!it.isStartDateEmpty &&
481+
!it.isEndDateEmpty
468482
}
469-
)
470-
//TODO : Kimhyunseung - 이름, 아이콘, 설명, 작업, 기간 (필수 입력 요소들) 입력되어있는지 검사 로직 추가
471-
navController.navigate("Award")
483+
) {
484+
fillOutViewModel.setEnteredProjectsInformation(
485+
projectList.filter { project ->
486+
project.name.isNotEmpty() ||
487+
project.icon != Uri.EMPTY ||
488+
project.preview.isNotEmpty() ||
489+
project.technologyOfUse.isNotEmpty() ||
490+
project.description.isNotEmpty() ||
491+
project.keyTask.isNotEmpty() ||
492+
project.endDate.isNotEmpty() ||
493+
project.startDate.isNotEmpty() ||
494+
project.relatedLinkList.first() != Pair("", "")
495+
}
496+
)
497+
navController.navigate("Award")
498+
} else {
499+
fillOutViewModel.projectsRequiredInfoData.value.forEachIndexed { index, projectRequiredDataInfo ->
500+
if (
501+
projectRequiredDataInfo.isNameEmpty ||
502+
projectRequiredDataInfo.isIconEmpty ||
503+
projectRequiredDataInfo.isDescriptionEmpty ||
504+
projectRequiredDataInfo.isTechStackEmpty ||
505+
projectRequiredDataInfo.isStartDateEmpty ||
506+
projectRequiredDataInfo.isEndDateEmpty
507+
) {
508+
scope.launch {
509+
projectListState.animateScrollToItem(index)
510+
}
511+
return@forEachIndexed
512+
}
513+
}
514+
}
472515
},
473516
onCancelButtonClick = { index ->
474517
projectList.removeAt(index)
475518
projectsDetailTechStack.removeAt(index)
519+
fillOutViewModel.removeProjectRequiredDataInformation(index)
476520
},
477521
onDateBottomSheetOpenButtonClick = { index, isStartDate ->
478522
bottomSheetValues.value = BottomSheetValues.Date
@@ -556,8 +600,8 @@ class FillOutInformationActivity : BaseActivity() {
556600
fillOutViewModel.setEnteredAwardsInformation(
557601
awardData.filter { award ->
558602
award.name.isNotEmpty() ||
559-
award.type.isNotEmpty() ||
560-
award.date.isNotEmpty()
603+
award.type.isNotEmpty() ||
604+
award.date.isNotEmpty()
561605
}
562606
)
563607

presentation/src/main/java/com/sms/presentation/main/ui/fill_out_information/component/projects/ProjectDescriptionInputComponent.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.msg.sms.design.util.AddGrayBody1Title
1111
@Composable
1212
fun ProjectDescriptionInputComponent(
1313
projectDescription: String,
14+
isDescriptionEmpty: Boolean,
1415
onValueChange: (String) -> Unit
1516
) {
1617
val description = remember {
@@ -26,7 +27,9 @@ fun ProjectDescriptionInputComponent(
2627
description.value = it
2728
onValueChange(it)
2829
},
29-
onClickButton = { description.value = "" }
30+
onClickButton = { description.value = "" },
31+
errorText = "프로젝트 내용을 입력해 주세요.",
32+
isError = isDescriptionEmpty
3033
)
3134
}
3235
}

presentation/src/main/java/com/sms/presentation/main/ui/fill_out_information/component/projects/ProjectIconInputComponent.kt

+21-11
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import androidx.activity.compose.rememberLauncherForActivityResult
77
import androidx.activity.result.contract.ActivityResultContracts
88
import androidx.compose.foundation.Image
99
import androidx.compose.foundation.background
10-
import androidx.compose.foundation.layout.Box
11-
import androidx.compose.foundation.layout.size
10+
import androidx.compose.foundation.layout.*
1211
import androidx.compose.foundation.shape.RoundedCornerShape
12+
import androidx.compose.material.Text
1313
import androidx.compose.runtime.Composable
1414
import androidx.compose.ui.Alignment
1515
import androidx.compose.ui.Modifier
@@ -25,6 +25,7 @@ import com.msg.sms.design.util.AddGrayBody1Title
2525
@Composable
2626
fun ProjectIconInputComponent(
2727
iconImageUri: Uri,
28+
isIconEmpty: Boolean,
2829
onValueChanged: (value: Uri) -> Unit
2930
) {
3031
val permission =
@@ -49,17 +50,26 @@ fun ProjectIconInputComponent(
4950
}
5051
}
5152

52-
SMSTheme { colors, _ ->
53+
SMSTheme { colors, typography ->
5354
AddGrayBody1Title(titleText = "아이콘") {
5455
if (iconImageUri == Uri.EMPTY) {
55-
Box(
56-
modifier = Modifier
57-
.size(108.dp)
58-
.clip(RoundedCornerShape(8.dp))
59-
.background(colors.N10)
60-
.smsClickable { permissionLauncher.launch(permission) }
61-
) {
62-
GalleryIcon(modifier = Modifier.align(Alignment.Center))
56+
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
57+
Box(
58+
modifier = Modifier
59+
.size(108.dp)
60+
.clip(RoundedCornerShape(8.dp))
61+
.background(colors.N10)
62+
.smsClickable { permissionLauncher.launch(permission) }
63+
) {
64+
GalleryIcon(modifier = Modifier.align(Alignment.Center))
65+
}
66+
if (isIconEmpty) {
67+
Text(
68+
text = "프로젝트 아이콘을 선택해 주세요",
69+
style = typography.caption1,
70+
color = colors.ERROR
71+
)
72+
}
6373
}
6474
} else {
6575
Image(

presentation/src/main/java/com/sms/presentation/main/ui/fill_out_information/component/projects/ProjectNameInputComponent.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.msg.sms.design.util.AddGrayBody1Title
1111
@Composable
1212
fun ProjectNameInputComponent(
1313
projectName: String,
14+
isNameEmpty: Boolean,
1415
onValueChange: (String) -> Unit,
1516
) {
1617
val name = remember {
@@ -26,7 +27,9 @@ fun ProjectNameInputComponent(
2627
name.value = it
2728
onValueChange(it)
2829
},
29-
onClickButton = { name.value = "" }
30+
onClickButton = { name.value = "" },
31+
errorText = "프로젝트 이름을 입력해 주세요.",
32+
isError = isNameEmpty
3033
)
3134
}
3235
}

presentation/src/main/java/com/sms/presentation/main/ui/fill_out_information/component/projects/ProjectScheduleInputComponent.kt

+12-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ fun ProjectScheduleInputComponent(
2222
startDateText: String,
2323
endDateText: String,
2424
isProjectProgress: Boolean,
25+
isStartDateEmpty: Boolean,
26+
isEndDateEmpty: Boolean,
2527
onStartDateCalendarClick: () -> Unit,
2628
onEndDateCalendarClick: () -> Unit,
2729
onProgressButtonClick: () -> Unit
@@ -68,9 +70,16 @@ fun ProjectScheduleInputComponent(
6870
}
6971
}
7072
}
71-
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
72-
SmsCheckBox(checked = isProjectProgress, onClick = onProgressButtonClick)
73-
SMSTheme { colors, typography ->
73+
SMSTheme { colors, typography ->
74+
if (if (isProjectProgress) isStartDateEmpty else isStartDateEmpty || isEndDateEmpty) {
75+
Text(
76+
text = "프로젝트 진행 기간을 입력해 주세요.",
77+
style = typography.caption1,
78+
color = colors.ERROR
79+
)
80+
}
81+
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
82+
SmsCheckBox(checked = isProjectProgress, onClick = onProgressButtonClick)
7483
Text(
7584
text = "진행 중",
7685
style = typography.body1,

presentation/src/main/java/com/sms/presentation/main/ui/fill_out_information/component/projects/ProjectTechStackInputComponent.kt

+12
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@ import androidx.compose.foundation.layout.*
55
import androidx.compose.foundation.lazy.staggeredgrid.LazyHorizontalStaggeredGrid
66
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
77
import androidx.compose.foundation.lazy.staggeredgrid.itemsIndexed
8+
import androidx.compose.material3.Text
89
import androidx.compose.runtime.Composable
910
import androidx.compose.ui.Modifier
1011
import androidx.compose.ui.focus.onFocusChanged
1112
import androidx.compose.ui.unit.dp
1213
import com.msg.sms.design.component.button.DetailTechStackItem
14+
import com.msg.sms.design.theme.SMSTheme
1315
import com.msg.sms.design.util.AddGrayBody1Title
1416
import com.sms.presentation.main.ui.mypage.component.profile.DisplaySearchBar
1517

1618
@OptIn(ExperimentalFoundationApi::class)
1719
@Composable
1820
fun ProjectTechStackInputComponent(
1921
techStack: List<String>,
22+
isTechStackEmpty: Boolean,
2023
onClick: () -> Unit,
2124
onProjectTechStackValueChanged: (value: List<String>) -> Unit,
2225
) {
@@ -33,6 +36,15 @@ fun ProjectTechStackInputComponent(
3336
}
3437
}
3538
)
39+
if (isTechStackEmpty) {
40+
SMSTheme { colors, typography ->
41+
Text(
42+
text = "사용 기술을 추가해 주세요.",
43+
style = typography.caption1,
44+
color = colors.ERROR
45+
)
46+
}
47+
}
3648
LazyHorizontalStaggeredGrid(
3749
modifier = Modifier
3850
.fillMaxWidth()

presentation/src/main/java/com/sms/presentation/main/ui/fill_out_information/component/projects/ProjectsComponent.kt

+12
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ import com.sms.presentation.main.ui.fill_out_information.data.ProjectInfo
1717
fun ProjectsComponent(
1818
data: ProjectInfo,
1919
detailStacks: List<String>,
20+
isNameEmpty: Boolean,
21+
isIconEmpty: Boolean,
22+
isTechStackEmpty: Boolean,
23+
isDescriptionEmpty: Boolean,
24+
isStartDateEmpty: Boolean,
25+
isEndDateEmpty: Boolean,
2026
onCancelButtonClick: () -> Unit,
2127
onDetailStackSearchBarClick: () -> Unit,
2228
onDateBottomSheetOpenButtonClick: (isStartDate: Boolean) -> Unit,
@@ -49,10 +55,12 @@ fun ProjectsComponent(
4955
) {
5056
ProjectNameInputComponent(
5157
projectName = data.name,
58+
isNameEmpty = isNameEmpty,
5259
onValueChange = onProjectNameValueChanged
5360
)
5461
ProjectIconInputComponent(
5562
iconImageUri = data.icon,
63+
isIconEmpty = isIconEmpty,
5664
onValueChanged = onProjectIconValueChanged
5765
)
5866
ProjectPreviewInputComponent(
@@ -62,11 +70,13 @@ fun ProjectsComponent(
6270
)
6371
ProjectTechStackInputComponent(
6472
techStack = detailStacks,
73+
isTechStackEmpty = isTechStackEmpty,
6574
onClick = onDetailStackSearchBarClick,
6675
onProjectTechStackValueChanged = onProjectTechStackValueChanged
6776
)
6877
ProjectDescriptionInputComponent(
6978
projectDescription = data.description,
79+
isDescriptionEmpty = isDescriptionEmpty,
7080
onValueChange = onProjectDescriptionValueChanged
7181
)
7282
ProjectKeyTaskInputComponent(
@@ -77,6 +87,8 @@ fun ProjectsComponent(
7787
startDateText = data.startDate,
7888
endDateText = data.endDate,
7989
isProjectProgress = isProjectProgress.value,
90+
isStartDateEmpty = isStartDateEmpty,
91+
isEndDateEmpty = isEndDateEmpty,
8092
onStartDateCalendarClick = { onDateBottomSheetOpenButtonClick(true) },
8193
onEndDateCalendarClick = { onDateBottomSheetOpenButtonClick(false) },
8294
onProgressButtonClick = {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.sms.presentation.main.ui.fill_out_information.data
2+
3+
data class ProjectRequiredDataInfo(
4+
val isNameEmpty: Boolean = false,
5+
val isIconEmpty: Boolean = false,
6+
val isTechStackEmpty: Boolean = false,
7+
val isDescriptionEmpty: Boolean = false,
8+
val isStartDateEmpty: Boolean = false,
9+
val isEndDateEmpty: Boolean = false
10+
)

0 commit comments

Comments
 (0)