From 64d84c56143283855017b055ccc369a9b6441f1a Mon Sep 17 00:00:00 2001 From: devxsby Date: Tue, 11 Apr 2023 13:21:53 +0900 Subject: [PATCH 01/29] =?UTF-8?q?[Feat]=20#137-=20String=20Literal=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Literals/StringLiterals.swift | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift index d289c40e..4bed7cae 100644 --- a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift +++ b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift @@ -174,6 +174,28 @@ public struct I18N { public static let soptamp = "SOPT AMP!" } } + + public struct Attendance { + public static let attendace = "출석" + public static let absent = "결석" + public static let tardy = "지각" + public static let leaveEarly = "조퇴" + public static let participation = "참여" + + public static let today = "오늘은" + public static let dayIs = "날이에요" + public static let unscheduledDay = "일정이 없는" + public static let notCheckedDay = "출석점수를 체크하지 않습니다" + public static let currentAttendanceScore = "현재 출석점수는" + public static let scoreIs = "입니다!" + public static let myAttendance = "나의 출결 현황" + public static let count = "회" + + public static let takeAttendance = "출석하기" + public static let beforeAttendance = "출석 전" + public static let completeAttendacne = "출석완료" + public static let giveFeedback = "세션 피드백하기" + } } extension I18N { From 9bdd868fd6c511181a37e59170abe5d929726afc Mon Sep 17 00:00:00 2001 From: devxsby Date: Tue, 11 Apr 2023 15:58:03 +0900 Subject: [PATCH 02/29] =?UTF-8?q?[Add]=20#137-=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20(=ED=8F=B4=EB=8D=94=EB=A7=81=20=EB=93=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/ShowAttendanceRepository.swift | 28 +++++++ .../Transform/ShowAttendanceTransform.swift | 19 +++++ .../Transform/Tests/Resources/dummy.txt | 1 + .../Transform/Tests/Sources/UnitTest.swift | 1 + .../Sources/Model/ShowAttendanceModel.swift | 16 ++++ .../ShowAttendanceRepositoryInterface.swift | 13 ++++ .../UseCase/ShowAttendanceUseCase.swift | 28 +++++++ .../AttendanceFeatureViewControllable.swift | 8 +- .../AttendanceFeature/Sources/Example.swift | 1 - .../ViewModel/ShowAttendanceViewModel.swift | 53 +++++++++++++ .../Views/ShowAttendanceVC.swift | 72 ++++++++++++++++++ .../Network/Sources/API/AttendanceAPI.swift | 75 +++++++++++++++++++ .../Sources/Entity/ShowAttendanceEntity.swift | 13 ++++ .../Network/Sources/Foundation/BaseAPI.swift | 8 ++ .../Sources/Service/AttendanceService.swift | 23 ++++++ .../Sources/Application/SceneDelegate.swift | 4 +- .../Sources/ModuleFactory/DIContainer.swift | 15 +++- 17 files changed, 371 insertions(+), 7 deletions(-) create mode 100644 SOPT-iOS/Projects/Data/Sources/Repository/ShowAttendanceRepository.swift create mode 100644 SOPT-iOS/Projects/Data/Sources/Transform/ShowAttendanceTransform.swift create mode 100644 SOPT-iOS/Projects/Data/Sources/Transform/Tests/Resources/dummy.txt create mode 100644 SOPT-iOS/Projects/Data/Sources/Transform/Tests/Sources/UnitTest.swift create mode 100644 SOPT-iOS/Projects/Domain/Sources/Model/ShowAttendanceModel.swift create mode 100644 SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/ShowAttendanceRepositoryInterface.swift create mode 100644 SOPT-iOS/Projects/Domain/Sources/UseCase/ShowAttendanceUseCase.swift delete mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/Example.swift create mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/ViewModel/ShowAttendanceViewModel.swift create mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift create mode 100644 SOPT-iOS/Projects/Modules/Network/Sources/API/AttendanceAPI.swift create mode 100644 SOPT-iOS/Projects/Modules/Network/Sources/Entity/ShowAttendanceEntity.swift create mode 100644 SOPT-iOS/Projects/Modules/Network/Sources/Service/AttendanceService.swift diff --git a/SOPT-iOS/Projects/Data/Sources/Repository/ShowAttendanceRepository.swift b/SOPT-iOS/Projects/Data/Sources/Repository/ShowAttendanceRepository.swift new file mode 100644 index 00000000..9da7b8d0 --- /dev/null +++ b/SOPT-iOS/Projects/Data/Sources/Repository/ShowAttendanceRepository.swift @@ -0,0 +1,28 @@ +// +// ShowAttendanceRepository.swift +// Data +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Combine + +import Core + +import Domain +import Network + +public class ShowAttendanceRepository { + + private let networkService: AttendanceService + private let cancelBag = CancelBag() + + public init(service: AttendanceService) { + self.networkService = service + } +} + +extension ShowAttendanceRepository: ShowAttendanceRepositoryInterface { + +} diff --git a/SOPT-iOS/Projects/Data/Sources/Transform/ShowAttendanceTransform.swift b/SOPT-iOS/Projects/Data/Sources/Transform/ShowAttendanceTransform.swift new file mode 100644 index 00000000..9dd73e6a --- /dev/null +++ b/SOPT-iOS/Projects/Data/Sources/Transform/ShowAttendanceTransform.swift @@ -0,0 +1,19 @@ +// +// ShowAttendanceTransform.swift +// Data +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Foundation + +import Domain +import Network + +extension ShowAttendanceEntity { + + public func toDomain() -> ShowAttendanceModel { + return ShowAttendanceModel.init() + } +} diff --git a/SOPT-iOS/Projects/Data/Sources/Transform/Tests/Resources/dummy.txt b/SOPT-iOS/Projects/Data/Sources/Transform/Tests/Resources/dummy.txt new file mode 100644 index 00000000..938179bf --- /dev/null +++ b/SOPT-iOS/Projects/Data/Sources/Transform/Tests/Resources/dummy.txt @@ -0,0 +1 @@ +Dummy \ No newline at end of file diff --git a/SOPT-iOS/Projects/Data/Sources/Transform/Tests/Sources/UnitTest.swift b/SOPT-iOS/Projects/Data/Sources/Transform/Tests/Sources/UnitTest.swift new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/SOPT-iOS/Projects/Data/Sources/Transform/Tests/Sources/UnitTest.swift @@ -0,0 +1 @@ + diff --git a/SOPT-iOS/Projects/Domain/Sources/Model/ShowAttendanceModel.swift b/SOPT-iOS/Projects/Domain/Sources/Model/ShowAttendanceModel.swift new file mode 100644 index 00000000..4f454835 --- /dev/null +++ b/SOPT-iOS/Projects/Domain/Sources/Model/ShowAttendanceModel.swift @@ -0,0 +1,16 @@ +// +// ShowAttendanceModel.swift +// Domain +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Foundation + +public struct ShowAttendanceModel { + + public init() { + + } +} diff --git a/SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/ShowAttendanceRepositoryInterface.swift b/SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/ShowAttendanceRepositoryInterface.swift new file mode 100644 index 00000000..a68dd669 --- /dev/null +++ b/SOPT-iOS/Projects/Domain/Sources/RepositoryInterface/ShowAttendanceRepositoryInterface.swift @@ -0,0 +1,13 @@ +// +// ShowAttendanceRepositoryInterface.swift +// Domain +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Combine + +public protocol ShowAttendanceRepositoryInterface { + +} diff --git a/SOPT-iOS/Projects/Domain/Sources/UseCase/ShowAttendanceUseCase.swift b/SOPT-iOS/Projects/Domain/Sources/UseCase/ShowAttendanceUseCase.swift new file mode 100644 index 00000000..85f03f4d --- /dev/null +++ b/SOPT-iOS/Projects/Domain/Sources/UseCase/ShowAttendanceUseCase.swift @@ -0,0 +1,28 @@ +// +// ShowAttendanceUseCase.swift +// Domain +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Combine +import Core + +public protocol ShowAttendanceUseCase { + +} + +public class DefaultShowAttendanceUseCase { + + private let repository: ShowAttendanceRepositoryInterface + private var cancelBag = CancelBag() + + public init(repository: ShowAttendanceRepositoryInterface) { + self.repository = repository + } +} + +extension DefaultShowAttendanceUseCase: ShowAttendanceUseCase { + +} diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Interface/Sources/AttendanceFeatureViewControllable.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Interface/Sources/AttendanceFeatureViewControllable.swift index 9c280f06..edb691c5 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Interface/Sources/AttendanceFeatureViewControllable.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Interface/Sources/AttendanceFeatureViewControllable.swift @@ -1,6 +1,6 @@ // // AttendanceFeatureViewControllable.swift -// AttendanceFeatureTests +// AttendanceFeature // // Created by 김영인 on 2023/03/18. // Copyright © 2023 SOPT-iOS. All rights reserved. @@ -8,6 +8,8 @@ import BaseFeatureDependency -public protocol AttendanceFeatureViewControllable: ViewControllable { } +public protocol ShowAttendanceViewControllable: ViewControllable { } -public protocol AttendanceFeatureViewBuildable { } +public protocol AttendanceFeatureViewBuildable { + func makeShowAttendanceVC() -> ShowAttendanceViewControllable +} diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/Example.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/Example.swift deleted file mode 100644 index fecc4ab4..00000000 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/Example.swift +++ /dev/null @@ -1 +0,0 @@ -import Foundation diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/ViewModel/ShowAttendanceViewModel.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/ViewModel/ShowAttendanceViewModel.swift new file mode 100644 index 00000000..afc48e2b --- /dev/null +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/ViewModel/ShowAttendanceViewModel.swift @@ -0,0 +1,53 @@ +// +// ShowAttendanceViewModel.swift +// AttendanceFeature +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Combine + +import Core +import Domain + +public final class ShowAttendanceViewModel: ViewModelType { + + // MARK: - Properties + + private let useCase: ShowAttendanceUseCase + private var cancelBag = CancelBag() + + // MARK: - Inputs + + public struct Input { + + } + + // MARK: - Outputs + + public struct Output { + + } + + // MARK: - init + + public init(useCase: ShowAttendanceUseCase) { + self.useCase = useCase + } +} + +extension ShowAttendanceViewModel { + + public func transform(from input: Input, cancelBag: CancelBag) -> Output { + let output = Output() + self.bindOutput(output: output, cancelBag: cancelBag) + // input,output 상관관계 작성 + + return output + } + + private func bindOutput(output: Output, cancelBag: CancelBag) { + + } +} diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift new file mode 100644 index 00000000..9928f357 --- /dev/null +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -0,0 +1,72 @@ +// +// ShowAttendanceVC.swift +// AttendanceFeature +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import UIKit + +import Combine + +import Core +import DSKit + +import SnapKit +import AttendanceFeatureInterface + +public class ShowAttendanceVC: UIViewController, ShowAttendanceViewControllable { + + // MARK: - Properties + + public var viewModel: ShowAttendanceViewModel + public var factory: AttendanceFeatureViewBuildable + private var cancelBag = CancelBag() + + // MARK: - UI Components + + // MARK: - Initialization + + public init(viewModel: ShowAttendanceViewModel, factory: AttendanceFeatureViewBuildable) { + self.viewModel = viewModel + self.factory = factory + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - View Life Cycle + + public override func viewDidLoad() { + super.viewDidLoad() + self.bindViewModels() + self.setUI() + self.setLayout() + } +} + +// MARK: - UI & Layout + +extension ShowAttendanceVC { + private func setUI() { + self.view.backgroundColor = .black + } + + private func setLayout() { + + } +} + +// MARK: - Methods + +extension ShowAttendanceVC { + + private func bindViewModels() { + let input = ShowAttendanceViewModel.Input() + let output = self.viewModel.transform(from: input, cancelBag: self.cancelBag) + } + +} diff --git a/SOPT-iOS/Projects/Modules/Network/Sources/API/AttendanceAPI.swift b/SOPT-iOS/Projects/Modules/Network/Sources/API/AttendanceAPI.swift new file mode 100644 index 00000000..4afd99a9 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/Network/Sources/API/AttendanceAPI.swift @@ -0,0 +1,75 @@ +// +// AttendanceAPI.swift +// Network +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Foundation + +import Alamofire +import Moya + +public enum AttendanceAPI { + case lecture + case score + case total +} + +extension AttendanceAPI: BaseAPI { + + public static var apiType: APIType = .attendance + + // MARK: - Header + public var headers: [String: String]? { + switch self { + case .lecture, .score, .total: + return HeaderType.authorization(accessToken: "accessToken").value + default: return HeaderType.json.value + } + } + + // MARK: - Path + public var path: String { + switch self { + case .lecture: + return "lecture" + case .score: + return "score" + case .total: + return "total" + } + } + + // MARK: - Method + public var method: Moya.Method { + switch self { + case .lecture, .score, .total: + return .get + } + } + + // MARK: - Parameters + private var bodyParameters: Parameters? { + var params: Parameters = [:] + switch self { + default: break + } + return params + } + + private var parameterEncoding: ParameterEncoding { + switch self { + default: + return JSONEncoding.default + } + } + + public var task: Task { + switch self { + default: + return .requestPlain + } + } +} diff --git a/SOPT-iOS/Projects/Modules/Network/Sources/Entity/ShowAttendanceEntity.swift b/SOPT-iOS/Projects/Modules/Network/Sources/Entity/ShowAttendanceEntity.swift new file mode 100644 index 00000000..d25c61a8 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/Network/Sources/Entity/ShowAttendanceEntity.swift @@ -0,0 +1,13 @@ +// +// ShowAttendanceEntity.swift +// Network +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Foundation + +public struct ShowAttendanceEntity { + +} diff --git a/SOPT-iOS/Projects/Modules/Network/Sources/Foundation/BaseAPI.swift b/SOPT-iOS/Projects/Modules/Network/Sources/Foundation/BaseAPI.swift index bfbf3c0a..7a52998d 100644 --- a/SOPT-iOS/Projects/Modules/Network/Sources/Foundation/BaseAPI.swift +++ b/SOPT-iOS/Projects/Modules/Network/Sources/Foundation/BaseAPI.swift @@ -11,6 +11,7 @@ import Moya import Foundation public enum APIType { + case attendance case auth case mission case rank @@ -26,8 +27,11 @@ public protocol BaseAPI: TargetType { extension BaseAPI { public var baseURL: URL { var base = Config.Network.baseURL + let operationBaseURL = Config.Network.operationBaseURL switch Self.apiType { + case .attendance: + base = operationBaseURL case .auth: base += "/auth" case .mission: @@ -59,6 +63,7 @@ public enum HeaderType { case jsonUserId(userId: Int) case userId(userId: Int) case multipart(userId: Int) + case authorization(accessToken: String) public var value: [String: String] { switch self { @@ -72,6 +77,9 @@ public enum HeaderType { case .multipart(let userId): return ["Content-Type": "multipart/form-data", "userId": String(userId)] + case .authorization(let accessToken): + return ["Content-Type": "application/json", + "Authorization": accessToken] } } } diff --git a/SOPT-iOS/Projects/Modules/Network/Sources/Service/AttendanceService.swift b/SOPT-iOS/Projects/Modules/Network/Sources/Service/AttendanceService.swift new file mode 100644 index 00000000..515516df --- /dev/null +++ b/SOPT-iOS/Projects/Modules/Network/Sources/Service/AttendanceService.swift @@ -0,0 +1,23 @@ +// +// AttendanceService.swift +// Network +// +// Created by devxsby on 2023/04/11. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import Foundation +import Combine + +import Alamofire +import Moya + +public typealias DefaultAttendanceService = BaseService + +public protocol AttendanceService { + +} + +extension DefaultAttendanceService: AttendanceService { + +} diff --git a/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift b/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift index 11d367c8..b1ee44c2 100644 --- a/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift +++ b/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift @@ -23,8 +23,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(frame: scene.coordinateSpace.bounds) window?.windowScene = scene -// let rootVC = container.makeSplashVC().viewController - let rootVC = container.makeMainVC(userType: .active).viewController + let rootVC = container.makeShowAttendanceVC().viewController +// let rootVC = container.makeMainVC(userType: .active).viewController window?.rootViewController = UINavigationController(rootViewController: rootVC) window?.makeKeyAndVisible() } diff --git a/SOPT-iOS/Projects/SOPT-iOS/Sources/ModuleFactory/DIContainer.swift b/SOPT-iOS/Projects/SOPT-iOS/Sources/ModuleFactory/DIContainer.swift index 02abc9dd..f3a818fd 100644 --- a/SOPT-iOS/Projects/SOPT-iOS/Sources/ModuleFactory/DIContainer.swift +++ b/SOPT-iOS/Projects/SOPT-iOS/Sources/ModuleFactory/DIContainer.swift @@ -17,6 +17,8 @@ import SplashFeatureInterface import SplashFeature import OnboardingFeatureInterface import OnboardingFeature +import AttendanceFeature +import AttendanceFeatureInterface import AuthFeatureInterface import AuthFeature import SettingFeatureInterface @@ -24,9 +26,10 @@ import SettingFeature import StampFeatureInterface import StampFeature -typealias Features = SplashFeatureViewBuildable & OnboardingFeatureViewBuildable & AuthFeatureViewBuildable & StampFeatureViewBuildable & SettingFeatureViewBuildable & MainFeatureViewBuildable +typealias Features = SplashFeatureViewBuildable & OnboardingFeatureViewBuildable & AttendanceFeatureViewBuildable & AuthFeatureViewBuildable & StampFeatureViewBuildable & SettingFeatureViewBuildable & MainFeatureViewBuildable final class DIContainer { + lazy var attendanceService = DefaultAttendanceService() lazy var authService = DefaultAuthService() lazy var userService = DefaultUserService() lazy var rankService = DefaultRankService() @@ -76,6 +79,16 @@ extension DIContainer: Features { return onboardingVC } + // MARK: - AttendanceFeature + + func makeShowAttendanceVC() -> ShowAttendanceViewControllable { + let repository = ShowAttendanceRepository(service: attendanceService) + let useCase = DefaultShowAttendanceUseCase(repository: repository) + let viewModel = ShowAttendanceViewModel(useCase: useCase) + let showAttendanceVC = ShowAttendanceVC(viewModel: viewModel, factory: self) + return showAttendanceVC + } + // MARK: - AuthFeature func makeSignInVC() -> SignInViewControllable { From 0b6567254de7bd51f39ea3932369f4ecd0648ab4 Mon Sep 17 00:00:00 2001 From: devxsby Date: Wed, 12 Apr 2023 14:58:47 +0900 Subject: [PATCH 03/29] =?UTF-8?q?[Add]=20#137-=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=97=90=EC=85=8B=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets.xcassets/Attendance/Contents.json | 6 ++++ .../Attendance/op_Info.imageset/Contents.json | 26 ++++++++++++++++++ .../Attendance/op_Info.imageset/Info.png | Bin 0 -> 461 bytes .../Attendance/op_Info.imageset/Info@2x.png | Bin 0 -> 776 bytes .../Attendance/op_Info.imageset/Info@3x.png | Bin 0 -> 1235 bytes .../op_arrowWhite.imageset/ArrowWhite.png | Bin 0 -> 182 bytes .../op_arrowWhite.imageset/ArrowWhite@2x.png | Bin 0 -> 261 bytes .../op_arrowWhite.imageset/ArrowWhite@3x.png | Bin 0 -> 363 bytes .../op_arrowWhite.imageset/Contents.json | 26 ++++++++++++++++++ .../Attendance/op_date.imageset/Contents.json | 26 ++++++++++++++++++ .../Attendance/op_date.imageset/Date.png | Bin 0 -> 305 bytes .../Attendance/op_date.imageset/Date@2x.png | Bin 0 -> 552 bytes .../Attendance/op_date.imageset/Date@3x.png | Bin 0 -> 645 bytes .../op_place.imageset/Contents.json | 26 ++++++++++++++++++ .../Attendance/op_place.imageset/Nav.png | Bin 0 -> 475 bytes .../Attendance/op_place.imageset/Nav@2x.png | Bin 0 -> 812 bytes .../Attendance/op_place.imageset/Nav@3x.png | Bin 0 -> 1181 bytes .../op_refresh.imageset/Contents.json | 26 ++++++++++++++++++ .../op_refresh.imageset/refresh.png | Bin 0 -> 350 bytes .../op_refresh.imageset/refresh@2x.png | Bin 0 -> 648 bytes .../op_refresh.imageset/refresh@3x.png | Bin 0 -> 1024 bytes 21 files changed, 136 insertions(+) create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Info.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Info@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Info@3x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/ArrowWhite.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/ArrowWhite@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/ArrowWhite@3x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Date.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Date@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Date@3x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_place.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_place.imageset/Nav.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_place.imageset/Nav@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_place.imageset/Nav@3x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh@3x.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Contents.json new file mode 100644 index 00000000..d30f3478 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "Info.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Info@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Info@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Info.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_Info.imageset/Info.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9ad0235fa2366d61814d9c7cc15986e8238eb8 GIT binary patch literal 461 zcmV;;0W$uHP)#%LxHC72{B|cY^qpvhg{~&s%jl_aCrDLw9X$qSi z&$LKsq6>0P63AN#1Z~L)64AHbN+if3*XMlAo7m3lx?XZQ_@y%^`qvbX3Xp4!f<)Kt zLvfpnYndvg7AVJ)JP8OK*fTQ$s4{eG<1j)d()Ei7G+{N3Ad?7yY?{s6!3JuojP+qN z+fp^CjohOn?z!t6XKO?N+ut818fk-sWHj2OI4Bdk*l6 z{>1@Q;ty=TT{dGkqRciD339xnf-u7_MufJ(!_J84NY1`-ZN|FIx${Ni;LI17*)p>npuBZS)Rc4~niMN!9XH(Wkjh4GBBs4HN_ zc)|}O_#51Z8Uo6ouT`XVYw!fOy6TwFNAN13h_ML9zM(cC!k4QBSFtVhKtMK>K5-@gjCE%CpHf;*8FiPZ6-U;maKO zT`D_xF@tdYnmho8Gp^Kp@vtE&&yy!Y6c8ESysZ$r`Y~Xv&}^FBS{~E?w5WKlzyv`a=!Av<6mVug?m&91)pUZPg`mq$v4 zX5qMeppJmKqMb)RPsfIaCKuvWVg5J^^Z<3J3wz$p6BvOE-~sZI5KgS>cz-C^#Nh1%=d~3 zf``6K(JuKU*jmaZUn=fkFZs3z(-G++(=eS*S2SS2fC1kbFlA=QB9TZW5(i2TT4cN3W-l)uXwW#TYz{pDAnCk)pWA%}| zTeZH=Ni6Zg zRLL%M3|+99h4Dk!qKtz(wFr=nj_ak@ni#5}>?^c3c^4X~wGf;$DGn00iSgnAx;ZEn&yae$(C=1DZ zDC0F2Ynqr^%Y8H`_=hIa64DknW$KgU5E(8fy%OnTP=JIq8jUVFa-$J!pI3LT%fzHJ z`veC9_NGrwnqrV@&#gN+7z{r83n=L?a5#MQeJDVy?nECGGX-SPM^AXb=4I;Pj9&9; z#bmE@0v*TdIXg!OP61iY^Z!S`?eoRHH4O)owr0ZseZX*}jh3kB$fH+{%_#ygK zFoupIhc)D1eS$%KXEkn38VgpRX>K z9nN@Z5P!?P6Zzm;q#dP-ox^L9o%!C+I}Dh^dTB=0IO%VpN8DPUKFn7GlgAG5XO$OX znSst6cVPI%F4cn<_+}~m#f9zc@TS)gDHV}$IW$3Q;ca`+dYB+B3y4)nws7cKp=qjO zq+<{gnY{H(!DE@cNrB{^RG8bcYkasrL0)>6K!a6-Eyc< z8bw;MOE6I{hca*lDhHk{yeV#zef$&;mJ7bNa-kmGQ^TZGmt@jI;~??8=CrrPy11?6 z)HYso%#}UCG1J%~Ow}csO)ToA)}6B0l3>#!_Y+A-tZzE2HrkDS$c!CY?hJ|XZ=t&QO$X8Wo36WywM7C5~u*DaBj XJM_g_N%%Pj&{zgfS3j3^P6^!YU+3)KVS1Ps&g$69*@(OY6)Y1q% yI@kNfo!+)$&Y8O}F4owX)~RRwhk@bLFQ(tq*e3e^UM~uCC4;A{pUXO@geCyI?p{{_ literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/ArrowWhite@3x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/ArrowWhite@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..462a995b9a3dc50936137a03bd02178eef378401 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!oCO|{#S9FJ79h;%I?XTvD9BhG zH`zy)F4$?IxpcYg)QGV6nX{fHy1U9WS}+x|JmNSa*r6=ouF&Uz zE)cNKLcqP_@A8?kM}GdCSHhuqvrR`xBY)ZbBagMd&Hi{iY}%wMe!-I+Pn=ZPl`I8L zHhS>66e&z%o+#7t!~tFCnNs1UduhtLb(iXdT~wHAeOym@zsZuAs!;etw(C1T$RBU6 YbN^bn{rZ_BuAe|$Pgg&ebxsLQ0C=^6$^ZZW literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/Contents.json new file mode 100644 index 00000000..59cc0103 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_arrowWhite.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "ArrowWhite.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ArrowWhite@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ArrowWhite@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Contents.json new file mode 100644 index 00000000..d16db604 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "Date.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Date@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Date@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Date.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Date.png new file mode 100644 index 0000000000000000000000000000000000000000..2143747495adf5ba196460109d85cf67f0f126f5 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{xMG%$B+ufvy*o79x@PU`(NzjIJIYjpoC)1 z0j(*T6a2Uy1-9}E2rH;5%uX=#=sfbc!%-M`t literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Date@2x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_date.imageset/Date@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7e1bd6daf06917082b617e5a376ab46c07c756 GIT binary patch literal 552 zcmV+@0@wYCP)jZhNvd+XP11}is{4~N!0YY-r;ZoK)>$JPZ1 zawotrwwv2<8f4=Enz-4PjhzPu*QqmNWC{>+W(l7ZLr_*T(4GhpXi5 zGGU` zb-l;Byr@t3kB}!Sj#DhjQUcV^-|NV8-EoZ24GALtyo``a0h1qlpP2Ed`pdQt5pC{l ze>t$0u^E-pQzi^9`sn-|J>8=Gjcp|Ci#Vd4{yJ~a@4nYQ!h$#gO6?C2-d)25X18lf zsjSQ-k3e|44p(^bawwT(0o;O@ZH<}uF=YYdkbqq7OC(mB6;1_C5b3^n97Wzncc&wC zcXX(LFV*<#VVOl<1Edda%x-L@M5(@)3b1(MK0WaA_<*Kwyns$%$|RHRER@0(Ob99< z3kV=q>YN-ml1UbjvskHfh*QaATLUTFVa3+~0x{iaiOBLsInP!Jilam+_N>J2-gWOs z3PP&3w_ZzTyC0z01bvgUwGYD1sc5t(XV=0|db<9W!WAi==Lyl1bjYpYQzwe*|k%-p%H>8ag1cTdE>xy^uGP*B=R_ls<&FvH}kgA&m#*x2+W1 zF}J*D6U?vy^df(`oTCeI{9=djI{RY>8l$qXC4?S;@eS!B?BgC0y%jbc$onT#VXMy0 z1M0Js)fg#T(Z2&mT?#Km+8#nAVZovMc{@%ETKT5*B>SUdRoX{8_Dw65uS-xF85unq z5;KD;NRw@0vwR%_i^qpdoP@b8!x8C9h)P(mKjZ$zMc{K~#7F?N?25 z(=Zf%l08$F;Rfjmn(o-)v@BTC6VRT3W&;Un+GjG5nQlUNEW-)t1xn10UCasM-oUK* znZ)8r4%5VzWVsA8%+PNpi7Y?8_vz{VC;QCTH>s54|BAa}O$oZ@M3k`MV9 zjNl*SHx7DH9xFDTRsw~zV?w2oa=kSxL?b^QsaZr;opu5xB)JZkl;pK)hMqt%oy5w0 zUS_Roxki?#-wX;wSX_rdL0Gh8Kfr!p&PQN2ekrS-N=Fr>>ng;xI|0EymFB#yJT;dT z;ktq&=XlmpL+Y3srI(ig1#7H9DjnuTqPBfyK88c`42NM>Z>w zGZZj$FBpz6FE$(EDFtGPr!U^>)`Y|JXLMIU4e^kOqi&6*8Ic$KA2V&_%N+^vp57(u znX?@_wm`;;P8LtP+a^2qcC2~=pWV70SM&}EZYLlYW(ROvh^$j}EApTM(ex?__V>Qh zb{<15$a8=Bu1czsfFkkn>T|I7=spb}fD`CqI_Py>Bwb4}<^L9%s#yUs89xR`I1@nZ zq_CuT(B67hknem^D`sl_FHl5m7gfWp#|HN!_)S3Ga7A8nH^5k@u5k&cAS{A1BM#d8 q*K`?ek`KR=@eoh+)$tDhJbnRweIGx8#}|750000VGialb7yPj7PHGM}!Um2Vx6~7fA{6E*!tH=|Ne$7W>|QgAhl20$ z%4ETx%^4ng>|DDk{@(@NThPA&n|)NaPl)5VXc6og2O9?_Bf8)}x^HK+0q;go#)_AEZd?o{aGzB{~z*o`nA!wE{sPSAelsv1w9NSFte`TQ=%9sa4eo zcAy&UjGp`%H_Ts5A*b~p+|hTz7NvbH=79pG0{q~hD-{f#Hmb@f3hiR8>({^(%9n^*Z44fBJ zjwQ%Nf#~YwTro@j=`_t}aOGlrt-|X~x`l8wv$ZKdk|kdQ!M6+&KBL_y%qlX%$JE!h z?!q)c1_{<@=od|jULKlIRM$plMwD&{(15;T2PH5h(Z!b5l=6Ta{cz9t@*vT*ircyF zI_n##G;`oZK=Z5YC%SV=b+yRrEv&Z0JIEDw$t!#BAtC9qQGaGfnZqX~N-eZE5R*uy zK$tr8MJZAKBV%}u7~BC(B6U3w7Ud8me&x>?yA()D;>+DQ=+vIGvHl0Q@hzl+oHpD4 z2Qn!@xHs27o%J^h`1m@}KoDmr{61tP$A2-k=#VolExQ;lS0M+|*Tm!a=np25iTV^o zcHbFImm~b^$qJ_59eKKeQL7NFW^vka@_Pe76&zMiBG{F7U{K3bcp|eCk25*l2#c9= vk{rjBTumrWRMgC(Q(MLHVrI&eDf#ga2#vXjcU5V_00000NkvXXu0mjfgM}X- literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json new file mode 100644 index 00000000..9974b50e --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "refresh.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "refresh@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "refresh@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6c59ae7b58ad892a4b3db6959530dd57dd4acb GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRt!3HF+tk*dLq&N#aB8wRqxP?KOkzv*x37{Zj zage(c!@6@aFM%AEbVpxD28NCO+@XcMIY{8^#(WJbi zQTYMe3zi*ClP#F?4%Ek)#%Jz0;rMjIou|J}O|PpI^j(rUEBSh*0J@0}gC-XE<@k3>O uvqaSlTX}Od#gy6HjhS*8zBas7lQ&$lTIKuXswqJ4GkCiCxvXUX}YhH@<_E%kfvo|xu- zB$r&iGvtUgO?$iD?hZeP#+U*A@8fq*KF5$HB!bL4olb~3F*N~p1jo}PN!F0mQFv}3 zL7wfnCyvuP0vnIoqS!v2SoLRJ=T;D_Y&STdY<#oXjE&}ezuzwkwlBu`3;u@PZZ|@n zqf7?|c~v9if2iro+!?-&ZF}0vSK11;+pSNIfX+y>qsf7yrUb{&rTHp=?8>`y0CsLH z=M$=lQ)kJJ_Gsl)6WXHG0Qk--r?&F8S9Sgq06S7XjHm`&owFEm7G%nNU2v7I=uBic z$#uR58QKG=0dLe2c(EQoEV=QJYJiPm7oHrZa#4GrB=^YFJ$zMR^3@0>)=-P^=%2v> z96ShZr@+fzv)b=+Q^VkjtG%>* z24Ymdxjh-X5;S=jxje&9o*Vwz2R9oiENDs%K_ezdw2j~Y#DURPg)`9+8op{O2svAU z#xKj1`iatjNMIv!L=h>q>3JdKJg8leu;U5e68n&{Q64Mnpo*NEqMaz|4JrdSV2PV` zpRc+MuRtM!!i_W`wZPl}wr(}&t_J!@%d0EL6In|?(LZJ1`Ry03=OZ;fIOBD`Jr^d# iE&2z(&l+pbFO6@>%AHZ|$L$IL0000ccK~#7F-CFH= z+At74JA~hiKqn}jpzZ{v695w=Ob|Lj%LKp#q!Zw5zy=``z;8bLzC;k>NJ6%3KJq?~ zAA$9CC!Ow2cMc>6Y&M(9YPG5dLGTs7t0-%HhpLKdGQ+zW-c3-BQ9j+=+>G&iBAy5& zBS_$Sy}m;k;cq0_5aStunK&ymsTnvR{9fKx*cUTAk6`3?T1HYa05N&Uneg|-fOyQ& zEtkuGo%^^nqFiIuhbU`u0+5j~41XkdW4T;5QT&wG1ss%0rT$R{(5a51Ck3s#2_zni z*1EmDjrm{ge&?_a>f2TZ(226{w4G|gf7CK4$C#KJhqAprH;cuhidC(lE`qFo=dQYp zi?&VlsV0e6m;@H$9}Jz6=%d|Ww^FVELlGFf!_T^SK+AvKoe4AgAAoB%Vm2IQ9q+J6qbdFOm2?)WJ0!lvFaA1tdPp0p=5` z0V31jbg-mAc&)rB5mE+4hklWwL#^XOJP}fSOimh1cvp%=Lp%|h#D_i&+}g1ei$VN(Ei1+I*9LUbrb4XI$z4rq-Pw9{2+Au{lyt56}siw8wWy8|Wz zcX6=Y1unsuF{T7sh72aq=xQ%ss2u4SV5C6K3|^=-3;RAQVhL$XRh<7Uut>-L?!Gl- za2ps2(5X``odw;0*be;?b|_(!qBP^C33q2=#FcQZ;W|KYj0qeVTg>!rpjV$NW)d3*equ^7 zsbqLl+;eU%My-wW$`O!zOneSw#>m63W2vh&Y1WgdQ3dDpmD8P=17W}~)WK3L=n=Fb zGR}#VET0-wc{Uh~lKij@RM96hU2#qD`PhSu)Uh)Sj|_fHzXo#NPfPd?xdg9NdMY9# u)G~Og$@8LI6@F^-LX8E+AF~qusqi1ei@?KG2afvy0000 Date: Wed, 12 Apr 2023 14:59:05 +0900 Subject: [PATCH 04/29] =?UTF-8?q?[Chore]=20#137=20-=20=EC=97=90=EC=85=8B?= =?UTF-8?q?=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift index 76afe364..ec640e7e 100644 --- a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift +++ b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift @@ -177,7 +177,7 @@ public struct I18N { } public struct Attendance { - public static let attendace = "출석" + public static let attendance = "출석" public static let absent = "결석" public static let tardy = "지각" public static let leaveEarly = "조퇴" From b15595d0defda0dc13cb7004968947d9c7b5a5d1 Mon Sep 17 00:00:00 2001 From: devxsby Date: Wed, 12 Apr 2023 16:59:07 +0900 Subject: [PATCH 05/29] =?UTF-8?q?[Add]=20#137-=20xmark=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Attendance/xMark.imageset/Contents.json | 26 ++++++++++++++++++ .../Attendance/xMark.imageset/xMark.png | Bin 0 -> 242 bytes .../Attendance/xMark.imageset/xMark@2x.png | Bin 0 -> 441 bytes .../Attendance/xMark.imageset/xMark@3x.png | Bin 0 -> 573 bytes 4 files changed, 26 insertions(+) create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark@3x.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/Contents.json new file mode 100644 index 00000000..008726ce --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "xMark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "xMark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "xMark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9e71e0e5c63820797cec6e33ad410e277153e8 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa&H|6fVg?3oVGw3ym^DWND9BhG z7r(~AFFts(sZ*!v zg`{tfljjEe7P<91Wu_K>(l&Y^^Gv|0CGg&F#oUM=aW^f_DXQv-LmdKI;Vst0Ca^|3jhEB literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark@2x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90ba5df4ad1a6cf784073593598c811fd6cfb193 GIT binary patch literal 441 zcmV;q0Y?6bP)duX-TxVQQvjn<@NzipKcHZy=c}geevAR_HdG3>rBI9Qys5DwY~yd@4ZIOD zGlKzFNd>{vbaO5`huOU1>C}JKwH|12=dTzVYpwfX=)a)=Muj~bkNX|+pcJ}>@in^1 zTr>u|0CUh->PQ5=}4>K8kUMG3C7=ofpLD$`g>eFvc301(xtI%|;TnW@_K5UOeyRE1 j+KI;!n2W2_JOB9~f6;2HyY)@+00000NkvXXu0mjfo=Ux4 literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark@3x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/xMark.imageset/xMark@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b13c569d0d19a3402fcbdc31cc1aa3642c8b0ff2 GIT binary patch literal 573 zcmV-D0>b@?P)n!5*4y{u1_P$alg;Lf$Fgp;$v~ak;u-^FHd{QGz!i=` z_hvlKUug5>&-m$NlIMrR{tb$0MAn{>YZ6c3iBL)lvdV}q>yxWf3)_Vx$i^H#_XXYN zGuoXxhV}XwbRp?|+3a@3((n!;UWdT?AnB#9`i*VW#)cq|pisnyBL6|5fQ>;mLeV2O z7U_hd2W$$m6$(LYDzXy_0jvbl3yK7+6w(`t2&^Qs9v>D0tO;=0a=rvoilla@7?L4M5r? zVWXfCNSkPEFx2OZL%$CQmxw`7-_K$n^{h8E^xG|s^@7G07?RjdXlfNCg*AO5A&517 zBO!z}8b}CWjTRD#SfhzV0@i3F5s5WJAQ6Ez)fzsqgfh~`2RqL5%(aFO4Wx|^)>+|e zA#M0vd`?$?;~Ks;(#DCkYxs2gPf2%9O<&abKx^hJ3>1D08a%h(Mp4&~F%Ueq00000 LNkvXXu0mjfi}CP* literal 0 HcmV?d00001 From 5077cd5b8676c3d7c6c1e7b7d4671efb9268310f Mon Sep 17 00:00:00 2001 From: devxsby Date: Wed, 12 Apr 2023 16:59:24 +0900 Subject: [PATCH 06/29] =?UTF-8?q?[Add]=20#137-=20StringLiteral=EC=97=90=20?= =?UTF-8?q?=ED=8C=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Projects/Core/Sources/Literals/StringLiterals.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift index ec640e7e..f4de0b1a 100644 --- a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift +++ b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift @@ -183,6 +183,14 @@ public struct I18N { public static let leaveEarly = "조퇴" public static let participation = "참여" + + public static let planPart = "기획파트" + public static let designPart = "디자인파트" + public static let webPart = "웹파트" + public static let iosPart = "iOS파트" + public static let aosPart = "안드로이드파트" + public static let serverPart = "서버파트" + public static let today = "오늘은" public static let dayIs = "날이에요" public static let unscheduledDay = "일정이 없는" From c425e6d746143df12a275315cf3feaa2f20271af Mon Sep 17 00:00:00 2001 From: devxsby Date: Wed, 12 Apr 2023 16:59:58 +0900 Subject: [PATCH 07/29] =?UTF-8?q?[Feat]=20#137-=20OPNavigationBar=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OperationComponents/OPNavigationBar.swift | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift diff --git a/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift b/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift new file mode 100644 index 00000000..0e45b914 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift @@ -0,0 +1,180 @@ +// +// OPNavigationBar.swift +// DSKitDemo +// +// Created by devxsby on 2023/04/12. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import UIKit + +import SnapKit + +import Core + +@frozen +public enum OPNaviType { + case oneLeftButton /// 좌측 뒤로가기 버튼 + case oneRightButton /// 우측 버튼 + case bothButtons /// 좌측 뒤로가기, 우측 버튼 +} + +public final class OPNavigationBar: UIView { + + // MARK: - Properties + + private var vc: UIViewController? + private var rightButtonClosure: (() -> Void)? + + // MARK: - UI Components + + private let titleLabel = UILabel() + private let leftButton = UIButton(type: .system) + private let rightButton = UIButton(type: .system) + private let underlineView = UIView() + + // MARK: - initialization + + public init(_ vc: UIViewController, type: OPNaviType, backgroundColor: UIColor = .black) { + super.init(frame: .zero) + self.vc = vc + self.setUI(type, backgroundColor: backgroundColor) + self.setLayout(type) + self.setLeftBackButtonAction() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Methods + +extension OPNavigationBar { + + private func setLeftBackButtonAction() { + self.leftButton.addTarget(self, action: #selector(popToPreviousVC), for: .touchUpInside) + } + + @discardableResult + public func addMiddleLabel(title: String?) -> Self { + self.titleLabel.text = title + self.titleLabel.font = UIFont.Main.body1 + self.titleLabel.textColor = .white + return self + } + + @discardableResult + public func addRightButton(with title: String?) -> Self { + self.rightButton.setTitle(title, for: .normal) + self.rightButton.titleLabel?.font = UIFont.Main.body1 + self.rightButton.setTitleColor(.white, for: .normal) + return self + } + + @discardableResult + public func addRightButton(with image: UIImage?) -> Self { + self.rightButton.setImage(image, for: .normal) + return self + } + + @discardableResult + public func addRightButtonAction(_ closure: (() -> Void)? = nil) -> Self { + self.rightButtonClosure = closure + self.rightButton.addTarget(self, action: #selector(touchupRightButton), for: .touchUpInside) + return self + } +} + +// MARK: - @objc Function + +extension OPNavigationBar { + + @objc + private func popToPreviousVC() { + self.vc?.navigationController?.popViewController(animated: true) + } + + @objc + private func touchupRightButton() { + self.rightButtonClosure?() + } +} + +// MARK: - UI & Layout + +extension OPNavigationBar { + + private func setUI(_ type: OPNaviType, backgroundColor: UIColor) { + self.backgroundColor = backgroundColor + + switch type { + case .oneLeftButton: + leftButton.setImage(UIImage(asset: DSKitAsset.Assets.opArrowWhite), for: .normal) + case .oneRightButton: + rightButton.setImage(UIImage(asset: DSKitAsset.Assets.xMark)?.withTintColor(.white), for: .normal) + case .bothButtons: + leftButton.setImage(UIImage(asset: DSKitAsset.Assets.opArrowWhite), for: .normal) + rightButton.setImage(UIImage(asset: DSKitAsset.Assets.opRefresh), for: .normal) + } + } + + private func setLayout(_ type: OPNaviType) { + self.snp.makeConstraints { + $0.height.equalTo(44) + } + + switch type { + case .oneLeftButton: + self.setOneLeftButtonLayout() + case .oneRightButton: + self.setOneRightButtonLayout() + case .bothButtons: + self.setOneLeftButtonWithOneRightButtonLayout() + } + } + + private func setOneLeftButtonLayout() { + self.addSubviews(titleLabel, leftButton) + + titleLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + leftButton.snp.makeConstraints { + $0.leading.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + } + + private func setOneRightButtonLayout() { + self.addSubviews(titleLabel, rightButton) + + titleLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + rightButton.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(20) + } + } + + private func setOneLeftButtonWithOneRightButtonLayout() { + self.addSubviews(leftButton, rightButton, titleLabel) + + titleLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + leftButton.snp.makeConstraints { + $0.leading.equalToSuperview().inset(20) + $0.centerY.equalToSuperview() + } + + rightButton.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(20) + } + } +} From d070ecadb022a292294f19b98137df053b96db70 Mon Sep 17 00:00:00 2001 From: devxsby Date: Thu, 13 Apr 2023 13:47:41 +0900 Subject: [PATCH 08/29] =?UTF-8?q?[Add]=20#137-=20=EC=B6=9C=EC=84=9D=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=204=EA=B0=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../op_refresh.imageset/Contents.json | 6 ++-- .../{refresh.png => op_refresh.png} | Bin .../{refresh@2x.png => op_refresh@2x.png} | Bin .../{refresh@3x.png => op_refresh@3x.png} | Bin .../op_state_absent.imageset/Contents.json | 26 ++++++++++++++++++ .../op_state_absent.png | Bin 0 -> 570 bytes .../op_state_absent@2x.png | Bin 0 -> 986 bytes .../op_state_absent@3x.png | Bin 0 -> 1412 bytes .../Contents.json | 26 ++++++++++++++++++ .../op_state_attendance.png | Bin 0 -> 606 bytes .../op_state_attendance@2x.png | Bin 0 -> 1069 bytes .../op_state_attendance@3x.png | Bin 0 -> 1459 bytes .../Contents.json | 26 ++++++++++++++++++ .../op_state_participation.png | Bin 0 -> 627 bytes .../op_state_participation@2x.png | Bin 0 -> 1053 bytes .../op_state_participation@3x.png | Bin 0 -> 1508 bytes .../op_state_tardy.imageset/Contents.json | 26 ++++++++++++++++++ .../op_state_tardy.png | Bin 0 -> 551 bytes .../op_state_tardy@2x.png | Bin 0 -> 954 bytes .../op_state_tardy@3x.png | Bin 0 -> 1313 bytes 20 files changed, 107 insertions(+), 3 deletions(-) rename SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/{refresh.png => op_refresh.png} (100%) rename SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/{refresh@2x.png => op_refresh@2x.png} (100%) rename SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/{refresh@3x.png => op_refresh@3x.png} (100%) create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/op_state_absent.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/op_state_absent@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/op_state_absent@3x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance@3x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@3x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/Contents.json create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/op_state_tardy.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/op_state_tardy@2x.png create mode 100644 SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/op_state_tardy@3x.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json index 9974b50e..b2710c91 100644 --- a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "refresh.png", + "filename" : "op_refresh.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "refresh@2x.png", + "filename" : "op_refresh@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "refresh@3x.png", + "filename" : "op_refresh@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/op_refresh.png similarity index 100% rename from SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh.png rename to SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/op_refresh.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh@2x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/op_refresh@2x.png similarity index 100% rename from SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh@2x.png rename to SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/op_refresh@2x.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh@3x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/op_refresh@3x.png similarity index 100% rename from SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/refresh@3x.png rename to SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_refresh.imageset/op_refresh@3x.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/Contents.json new file mode 100644 index 00000000..25083f25 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "op_state_absent.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "op_state_absent@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "op_state_absent@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/op_state_absent.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/op_state_absent.png new file mode 100644 index 0000000000000000000000000000000000000000..fbdca9e4de398c685f70667bef67a750976bfd0a GIT binary patch literal 570 zcmV-A0>%A_P)4P)ymlXefCEX7UEW8-$^xgN}+o2SoxMG?<~_(qO1y z!UP%PU}GC){}t=VLN;=;ni#BaM%G#@Eu4S%TqKK;19NZhBQf@gH^;~{WAq$hEWtk$ zr0X-Rw>MeVB^&1Pag@^ODSq;2Y9tu@LXpS}>*_MZS9}ODGMR6DMSP$}1S=*Ii9-}k z9KgzGR51W-&t#_1Waj>Uj0%Ng3IK79ip41kkc?>!?J7=qc0~*c1d;GEL!*E)0zn)E zf;ecR|3ogC6#EzL?WDD|(BB}((4$dm;+qPT36eWGDgA?PG;_mSdU`~=Xc%;{xG381 zCnhKqi#<3$e|ARs^K;Q|9T<4fZy)2$=x7}Z!o^5$ZdUAnH9TAr#0xivho$k{1n~=H zf`qxT&RHs^QgpSkA=)smnqc*UGC>dvu-W;wyZh%4Im9X$236xOn=LyR*I#dKQD%Fa z{KU7Q3L~y;OCEkMf&ZV)%~ier_Vl#W&T{v8IW#0hdQ8ZF#TP*kPcBzih2h8m5Jb8T zu+P35HwOnIs7kK+s=yc!MaC1jZiTVl-is+> z2UZyG!*vj)?gatulas=5S)f%b(m-=ZhuCYOkl179vpjZSj5fY9>=_Gv;qGoB8rpus z_)~V16oTMcOTA&QRN+cq%Xk^H09K=3Z~8Bdw2!c)vX}#_gacB zH)Lk-CuS1?X!9!*Tfglbv{_|au0xTFy z;J4kc6d*~!WtJ(xBA=hpSYO|F-kha?SvEMBw1R4(Fim&~tx>@%Rh9-;mf^}6{6L%< zbEV93SBVP^$mLnBxw8`^U7zNvp$vSU?~Wj|TFGSjK4g^m4FLmz%&Q{ZmH+?%07*qo IM6N<$f)SLl-v9sr literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/op_state_absent@3x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_absent.imageset/op_state_absent@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..11aef99a5243c9dcd5a3f0f45bb78407e567cf68 GIT binary patch literal 1412 zcmV-~1$+95P)m5N&aF>?Sw7z~- zzWsxQ$dc=3$?!ec@-TD;MCm=Q`#1X9U0Apl+*M;S?u!@G(#&Sa5C=2j#EG2O@P$#9LUe-+@lmP# zD<&qC21=M}Oo97KlOaxQN+u@}b9Q4)xjaoq6b_`TNf(K#wJec=55vP_7Hw~zCj&2v z#cLK>)}LhHg=I}yGME0H47`w47EAsyL7yA4^ktEOB}N#g7-5)Vgkg#ihABzfXE?S^ z+i&0c?Sb)e8pvd*+mz&Ylx^E@4;?u|*3b||MWn)1wzg>N_3M_8M@OJTbjqu%v~vHx z-yS)Ax+lVH%+J%t^XGnh{K}OdR~T0cqj&0FB+_Zh1cd1XjQ&q|?)Ytpd2niqIKw)| zBu7W7Uy0OWgmeWzPfRr2??^YbT`2f%jP!TcuTwt~sW9--W9QB_+`slzcyM|A9@6w@*7g@Tr z$b{K>|6X+zIy`oo)vRYisTi{Bq#}tvq<(2YOu7hg-LlIAMuKoJ1xJ zTvJiHk1*g;5K|Ib=b#jWGDr~A$(mIU5E~G$f~B94>gSK0Jxd>@rFiiJ|CevxRM&uG zxCj)PFoTB=E35Ea7v94<&>;gM!58i&%*6y#T^$7Z&-d=tZAXyzN-z-TS7{--H~<#b zt%Rc+L?(-tljcW zBXF%zW^AzugOS`x$)i&X*l)xpj2g`{W$h(maBw$PbU8Sr~(X zVB7L}9a;o;*a!nrxc@*RO4taq_2x~}a!WIs-LBrRun`88Uc5TtM-;~VM3yPBSqv)5 zhb~@cp3DMlEk7-5)#r`RM#tWoPT7jiSOov!NaDV9ku+T5(WxM zVRB@M7a?*=3)1E>)wLLnIB`*_n^LMW`&qGt1?A~tt>?o1%xk%ozG_} zk(iMu{6&Ud@(A(Wb6+~5*;z^;%Q|0O1rQ6)87ul8P-WSj(9cOhZd5bkP`&~!!V7Ty SG)05}0000rI4Kf literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/Contents.json new file mode 100644 index 00000000..a6c08942 --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "op_state_attendance.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "op_state_attendance@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "op_state_attendance@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance.png new file mode 100644 index 0000000000000000000000000000000000000000..a9afe6531ac3be2a573cc22ab28930e5582d6a54 GIT binary patch literal 606 zcmV-k0-^nhP)jK~#7F&6Z0` zBS92}PZeXD0TYIC1T)C!;0!Z3%#a@DA-E8iu5{tXrT;*Gi9f-mTg8PS_(BvPi-@AQ zP<#*{&?blq+F4lExiJq>Ob0@e14XJTx9fg=?(L=(tj2EVTA|FS0%8VuhYCr-j2oke z2i|rcDnck_;*|t=0;6zg?v<;R#z?gwC}V7HTMccD=|h!eU5RPbfapreAXnGd@O?i} zEaQU4z6lcKC6n;Hl*|{FSJBqmg65A+vTpzWH5a$C9!KMc_h|dvBJ23(4icy5=Pu74KCr2L;SJG*h($07*qoM6N<$g5A*y@c;k- literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance@2x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e896982176989740489dd2bab337a3bd868a18 GIT binary patch literal 1069 zcmV+|1k(G7P)x*kRp1eqFnUnAX7@QEs&ms_MitsPx4vMdznKrRH1(S6K-C>jc+Gh8YLK;NMO@=U~x5HY?$9zq#rXr!f;@qiwwK8L?Q=SP`JXdjtE*X5Y?b zo-*jZ(oT_cXNqbsxw9u8T!!}N-hU8jo}5IfLy}^LgqvUfwo0*uCGndMdUdrmGXL`R z8(AK1X`<>Al_KR2vgWlQwy-FLgu@ECPzA~aLHw|G0_fsJL-*xNG6ujY^B=#+I@Wr* zf-M9{tZihD;SAJ+DB;#7S(Yzm{VmD_X*^XgZxT;F7zj|~>3Zo5la7lKnb6tgl~pl| zY{>e!&I%j=C#BnLkm8{p${?Js`*v$GasnlS%zyeUpJ-j}NqLO%4>us?12F*!LkOVr z5DOiL0McC|=9p#p4~PR%ot$-)2!bb$8$K)$27;Oa7-IAoow8iU4k0iCv>BgDUJ&cp zwu7gec25m;wB_DdW0fi05?>pL(Y^|lPP?$PeWo#iDE486PFMvo#dtpbDofZx zz*QwF$juwq#duHtu^y(&LLD|;RV-N7s6weA*vRE`$U!J(6No@NF*!x5ab&lPS;86= z^MP%9F6^-;7YA|BL2yJ6tVbee!}LGmh#*)@Ar*stL-?;zDhSph=4#bxFtcEP1M&^M z!=Q8>QVw`8nQeH2*nl8$@{ouZ3Q>)x_&9l_VJxaKrj3z@gr{g&>-QTkgiA)q<#6I7 z_}(o21(9DH5_4~qTnav^^6T0V@=}ny%-Bro%y6Sq;0*KoG8|{Usg<8t5g!t&o#$ox n?TF}fJVkt*acvAC!+P#FwKJ?|^CpOc00000NkvXXu0mjf2NUJ| literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance@3x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_attendance.imageset/op_state_attendance@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca3d964519795427ae9ca5f39f6f4e7ef836169 GIT binary patch literal 1459 zcmV;k1x)&hP)pEH!~7EG{4!Iz-1(N^7GyvoNJv&N3U*;lA>Y?#q!nQmhIC$V~n46TE) zb5x~~D1ofthF{B>(~R*f8Btmf=if1lXU~_f4h47lJZ7|#IU^1pCWCqy8$O=s8*!V? z3Ot1qKTC$#5cdD!M6zFMAca9rLHH7hX(Jh8gE3JYR9PB1$IdYpoiU=s59dMyyXYde zT!GDyK^u|@_LjwYb$|?7Q7%`9EM~EzWY7!74q77n_mV+3x-FCRwWQl3gO(U!G{p#` zDMlDgF~Vrd8>AWenR`^JEV=E}zP%I&a}OR;u~>53J-c^NBGE>w&`y}_zd30Xhq#2v z-M&M)|EAsc;Eru;TbSbFqOT_gsVpt|+H?0GQZ2fK!Bzv;xcK{Jw|(HlG#&UTO**4o zn45o3`Fi4NcnuoG(D#G17BR_RQ+zjw}SilKoau9VMs{=I%f8wdWTWGFj1 zB!F;(1t7e2bZij6o1}45@9tgE$T&Y=xaZr3d*WHr@9(#-w|P^Ug8&X&Hh0qe z;{~}6v5?aszK$VHsW31+3=McA3Hx>Y+!ei`x(bve`o~Fq^Z~3+z`J!KX zf|KZRjbAQ|Npb3Z7F8${2EDVDCFqgE{nGo87bb7~<>n&?c%9>c_OsYw3eWW8&ljZV z2&1|Pq)Zq&6w^Xs5Z)lhr9ZBQ_8|vh7zRKbc!*aVfIOztFpV-{5Z~+RjloJSn0HnJ zc>>2`@xGJ5*p4U;jyT@J!tp3wP$mrGdp)2hdkqT%HUdHw@&-z3Z-p1c32Ui+dt~Jn z6fbUK8C`}UYVG%eUcC}MZ|{@>c!9ycIW|yt?{~Z`w0(!a+Do*lt=!ZLBVI7QCG2X{ zIu^zc3gc`C$UDK$2=!u@?=QqrT~cfJq3l&M|M#64DKzF=xf?8!g< z-hMf_*$j!c#=gtEPQ)$@zAiSKb3j~wZ)!EM3*-F&)(mS^7?Wc(MY+ddXrtLmNhQI5 z^Qaz@VWZ^o?!|m%oSni9r(}o~Im>L7kQPzEr zIg#u;D+&Q4PFx7vJM&?J(7em%%b6ijs+p-66@l;tPw|SfygiJZj*eCPd1x zt|arHEXz1zLWI(DCn;cr4(rcbO25$iGDQ(Yh1^hBidUF6yd)IN1{G-`-EJ3g6yI3W z$h#*mW`LBC;52~0=cC#DD(3BW2+#Gfxv`nWL{S9izk|br!|d8<%sA%q0>lQ6lbwv_ z)oK-`Qt3v__isO->l%E2AMLOWUDFZ8F=Q!xSY7=*E`T;P9vet55*#0&px$U;@!{fC zmiVSL#DfZRc=7VNnE(Cr4{;nJi+3vUIo`ziDsMa0&f)>MXY50rvm^ N002ovPDHLkV1f<)7*+rP literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@2x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa3155dcb0a60ecaa55fb0311b1510460869938 GIT binary patch literal 1053 zcmV+&1mgRNP)4`xC%mW^_2@SMzJcfmP%i2PB8i+Z(cp!8 zaJQ1MUMM}Z7wCZ$F9o~fys^7Xx3nnC5@Gk3l%3gWCOiLm?>}z=0xtB8jXS{DIAbuu zyGgi|5Q7nB(8jenO-q$pM(l>JZ{L6``!igKXW%0Uf#=W&b76Y-L?3^k7>xe>1i;eZ zONc?N>mw)%6@4BV{uKk^YZn@DX>{F8GJ3cT0YE4jp>XAJ1_A_@1rwAp;^S0lg#a6; z{`QVGk`w}32n2Bv2;$-@ctEYT5Bs&6XvY)rw(&~2BCg>`1R{|zoEBB{$ao@1etjKG z^9O&(2t0iBply6{aYtVdc6*YZaDpFwd&l@ujifn z@k9a=$3#rqT!z8tD~NV17KL;=4XHB-_b(_DB%l9!;(gr1lLT4fyS}?yb^6#|UHvHL zN^9O%2ucJAg+d~1ZHmRBSP0%vrw5(;7$My-H%&(jjEesLJ`pWjTSZt~`yxc~8g+t5 zIb5myF*|!#ar`)N=ka5EjU7#x9=Y3D(T?(zDVG;IMxknyAG`Puv#dxWV#LVAVli=Q zA#x;o5i!al1Q+!7%{#{frteQX28#KQsUa`A8$F?(mcE^G=iwnr1i>Q`YXUpuMSZ~w zrLlWsjwooDo2J=ujvmQp4(bOjWA?o6$ngRtDU%ww$-_45X0nR zWHOzLC%Mwx+1=sQ=TYB|Iuz!`{7di>Wv9%Or;j_1qff|%)f5*Ai8h6^=fG$}LoOHv ze&qIx`zQh)4#}1lg(w7y})(DGeIyd;vLHLZabS99uf;Tn+A+;vRJjor1bKV|0+Uk+@5ou zcqRxQvE_0ZE*hQ*;`V@xf>J@;Z@niGC;c8T}J2Lmv1I XpZbE%o=NR900000NkvXXu0mjfQPlgXDk{E7m&uDi6fdMP2dxld;*705Pt(m6IV%`nYglx z1UHsvoRh)~N`p)xDpY8sG%_Qd_gQhr-RT5AVco8o{Z)H^q=S9-ecxyIG|T85EbHwI zUHku`ZQFOrra69Ujx?8{MT{!EKmRcL(@*nx^KjISEbOFZ)#mJ}lWi`>UD8Ypo6(NZ zyS^1BkP$p#Rrem+#)+jxnLNyRe%J`}0_>cl1tI>)M1hR!=_%xOP={$l8!LZQH;DM?YO@aL6Zz4ko=ATkSu+hpcU zQkB?*LFd%=Yh&G$GtJ1tl*?ryN*G9;7y#`~TZpbASJIUoagz`f1+^$xk8lqRg^I)$ zG3iX2*49cx=f%i9E&k}Z`}gmKel`lhbXY7Fxv5wX?TS^U-Q8XH+Ot2Og&K%p`iq;` zguy=_bT#Y zcZ?3YY-(}bmqS>AFD%_A)sbqKz4HWz7d#Dp``tHV&rgny&VNASo~uXW)K0xsjFDLq!Z@N}gkH3uIWBN_ z-Z=_Hf>=(F;cGa!?f1I#u7vDDeh!o?BtKsf&n`USJ@QrZ8^`1ELg{ z?~tk}AxxG}AU|Z}Molkpc4qFTsAtV)lbZ#;MwT3`GQ|1*ejKj+JAd&Sc}dN;l;@#; zSEeXRL=0Y9d1v~g7-v!QQ$-13f^JEpQ<<_ziI`D8%!o>IjNh7lDCtbb=M>{!foA_y z|Fub@96FULiWWvuv@nXIg;5kOjG|~^6vbdfhon)BmSHn3jB+rl70!xc9}J( zueV!N45QzFYUJ~I>;?Q6X_Nq4{&GzQTQ9O+Z-cN|vqm;8qu1L)LkI(f?7qE48mT}7 zXo0pnkGYj!c&x>dhfVetG;ofGwvc~gRX3Tz^sch;(Lz9YMFAuB_P6G2!}yV3{+=|G zgPShYcPD-MFP#Gf>XY$6Y-l>zJ5xu|XSkM0000< KMNUMnLSTZ*H_RRY literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/Contents.json new file mode 100644 index 00000000..1a3fe7ab --- /dev/null +++ b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "op_state_tardy.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "op_state_tardy@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "op_state_tardy@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/op_state_tardy.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/op_state_tardy.png new file mode 100644 index 0000000000000000000000000000000000000000..f4647b4695d26a0c330ab98fd3953ad9c8c8d267 GIT binary patch literal 551 zcmV+?0@(eDP)K~#7F&6ZC~ zLO~S8&odRvpl2jlLA)@6qJ=Jks6{S=HZEP-H?Unxzd?P2TDG)JYgZ9%a#INrJ%~ax z)JiKXvwJ74=?^)nX}`^zdGp|&x#!IAG!T_s)W8$gp}~g=bhM8ctXS4uQBxBl%GhtS z0GT|A@mr}At2F792#DI`hJ^+}bRM4t{{y`#A*EuzsdX8v%14Du^UFKCQ^(Qv8YUJa zxX-6>bDn%#bM$%O9-k5G-ar_=ZUZe5k~)lwXE9^Kp?lC}b6{lpJzDl29nNa8tK(fd zfWJq{nlakdux~+(N9RIfF4Ilo`VF7hdHL}{jBA|4H;_7r*R7${5vFwa>Noq&9gyMT z+0z8l)VTq&M7BcJ8s)HZ1~?b#Z+3UK7sK^M5(ah4GZ{c5D0PI37bqXbYzXGgrkJ~= z_OpPjnGm6tgU#P?o>ZvY5w;>j0UV-?a2CAtVce3anpHoMBXMk-3Uxcec1#6VKFm3+ zpYI4cpf%Ff)22dG7n;qfH?=OKRWi{=j(yAFj;PJGOXzG@@+2f; p(FUU?iSdJf+uAJvh;wb$@B(ypng~O83t0dF002ovPDHLkV1i_d?py!> literal 0 HcmV?d00001 diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/op_state_tardy@2x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_tardy.imageset/op_state_tardy@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1682369f96902d47c65558898dd31fbf7bda8acf GIT binary patch literal 954 zcmV;r14aCaP)B5BQf-YUUbji}4!#9v`z|zDG?%Y{7hUjKk zV2H*zhM>h7D256FVZ7(HGntNbTId_vbmo_od1d~DckX@X-Wf)a2dkh@@n(huWyzv6 zbtVSS&!8C1i2>bo?-2ID+R_vBm!9!(mcqqz>XO0~@kI(!5#tRHCn%g4EJ_BVX!2`0 zGr}qcn5bw#g0mydU%pZV$Y^v}Rwjb6D68?0FfWyAG@5~jM1t6Go1sxe6_FqwB0)TK zQ42Uc*rVO8yd0k!NKvf2hfd1QPg8E=eF=)6Pmn5FBFOgoDy@B3l;iP-vyLFU#XKGE z@6|ldJ^3$h7vy&6+7zX(PmwB=2!e-|KuX@vg_vw_1IX+Ip+@r z>>W0NR2jDja-5_S0h3;PzvyHc#ONQsdhD@nS!KMG3Z^sO;^lK8-Pr9CdXwKQLgDk0 z6a_$xl*^xjM!6u!h#i+881Mfn*7cG6O0KF>!4ods&Qf18O=pR64{@8IJsG5bJ?t#% z<#Qke4DzhS07^6D7dL09FaYHiQQpZd$Si?D`WYjRy^(z?$LMS7neml-kIU!vscYMT zGC?55`toZzMwIP{V+)b;oH=N)hHp*Ryavj*yYFa(wlq~lKVMlYi1g(e&4!zAbuk)IT%Y1!Yy{G|x2Jk?4t;hn74bg7FSis?cdO%RXQA9kAg4 z_FEL;5G@%Gksuy45@b?@je!h#MG<8L1hJ^`8;4HkfaWxj)N`!NJcS*L=EX(bESqYK zbi!*zVa4LPm!t;eDkEPw>!M63GlesQ#mI;e*GqR*`+w+ZnK6QHQm4KX9JP);K~#7F?VQhV z+hiQZpEoU4ODmd8%Nkm3$^=Yf92f_t2@d3fG>HQ}?nb$BTlov>{0BR7qemnz-3^IL zb^uLqSatwSLx`YhqodoJP2E~`O}+PV>dbMyH1=Y@Z`SWeiefvqRlU#q{b~1A=z+WL z8%PB%5e2ZNRC2Nk6~SJUBM_;RKaPy{L~1vAZ6^}d%anKkRA%l7(q2kpj`NX z`=ELWEnJ6)l0GgLv;kaqSDnT1PhA$HMOnhG>p(Doa#V4t+S&6rJWJViFGDa#3*V}e z<7wateY1Hm3fQOIdg<{{X{HWum1 zzJy>GIebQ8&O)#Y-DROL67+4uZ3`n=RjEs%roroaH3}`)&1MCnWgHe*y64qVukaS(YdX$s40 zH`iAq1tGK)+eINpg<1c%9(jE2)-{y$0LF#aQIM!go`Ie*#nxaS##r!YFb-!(KKK8+ zhV7^ElYk>9_ouP6JX*=A&%YTOQHU{N!u13ji9Ve14Aya>2uI&L?|n09(?Z_=V$pM5 zHdgn&FyhMYYnKzW76xPXtN87A0T>_d{ZaE~dmQKji>J=Nk`TcTg(*QZ7ls3W=SFv1 z-j649XD{Hfe%|88h*fP>bZN8tc-*!O?-95CAI11|$w-qkQ(m)Ceq zkPHknnOF=hf$?KA;958nPn?TxiBK%M54s|X!i+6$?ZIw#(w0l`(XuHrb7e)HEir!3 zEgjXaVNSRAdqK;Y(EgoqCP_`h$&j=Qe5iyW-V9dg#FT@erJS(1(U>Ng3X}FD;@1gz z;m=Y;7)udhEM@54l9@VIMsU%NG~(9GnRM^p56WG0TnN@7uFO(I7)udhEG4Ha@dgCj zXy)LGFcwm$E4vE8Hm>A!B_nH;*~Si5a;o6)2~-V&9VjfTxBd0XcJMX0h?!uTCZ54t ze$f+#3hA#Z1k+Uaw0Kd+sG_$PqljaQT`fvm1CM>{F6-VI|4(iSvMN(nFobl8LZTPM z{?9361djgoD+p;)V|@4BR}j_fDo>zMZ)rxZ0?0QT#EM=8c3Ij5{Z(w>vO4L!G~s#< X@gthn<@sT?00000NkvXXu0mjf=P7b^ literal 0 HcmV?d00001 From a8b6e0c7a1baab82ffede16c76dc4af84c087eb9 Mon Sep 17 00:00:00 2001 From: devxsby Date: Thu, 13 Apr 2023 13:48:12 +0900 Subject: [PATCH 09/29] =?UTF-8?q?[Chore]=20#137-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/OperationComponents/OPNavigationBar.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift b/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift index 0e45b914..4ef3f304 100644 --- a/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift +++ b/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift @@ -31,8 +31,7 @@ public final class OPNavigationBar: UIView { private let titleLabel = UILabel() private let leftButton = UIButton(type: .system) private let rightButton = UIButton(type: .system) - private let underlineView = UIView() - + // MARK: - initialization public init(_ vc: UIViewController, type: OPNaviType, backgroundColor: UIColor = .black) { From 736cb48c2ff28ed056b32bca1dda0475866fd1b0 Mon Sep 17 00:00:00 2001 From: devxsby Date: Thu, 13 Apr 2023 13:48:28 +0900 Subject: [PATCH 10/29] =?UTF-8?q?[Add]=20#137-=20=ED=8F=B0=ED=8A=B8=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SOPT-iOS/Projects/Modules/DSKit/Sources/UIFont+.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SOPT-iOS/Projects/Modules/DSKit/Sources/UIFont+.swift b/SOPT-iOS/Projects/Modules/DSKit/Sources/UIFont+.swift index 54f77141..096ab7fa 100644 --- a/SOPT-iOS/Projects/Modules/DSKit/Sources/UIFont+.swift +++ b/SOPT-iOS/Projects/Modules/DSKit/Sources/UIFont+.swift @@ -88,10 +88,18 @@ extension UIFont { return DSKitFontFamily.Suit.bold.font(size: 16) } + @nonobjc public static var body0: UIFont { + return DSKitFontFamily.Suit.medium.font(size: 18) + } + @nonobjc public static var body1: UIFont { return DSKitFontFamily.Suit.medium.font(size: 16) } + @nonobjc public static var body2: UIFont { + return DSKitFontFamily.Suit.medium.font(size: 14) + } + @nonobjc public static var caption1: UIFont { return DSKitFontFamily.Suit.medium.font(size: 12) } From 7b64579fb25316da9eb212c6f6be73c0400fe8ff Mon Sep 17 00:00:00 2001 From: devxsby Date: Thu, 13 Apr 2023 13:49:14 +0900 Subject: [PATCH 11/29] =?UTF-8?q?[Feat]=20#137-=20=EC=83=81=EB=8B=A8=20?= =?UTF-8?q?=EC=98=A4=EB=8A=98=EC=9D=98=20=EC=9D=BC=EC=A0=95=20=EB=B7=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/TodayScheduleView.swift | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift new file mode 100644 index 00000000..beb673ee --- /dev/null +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift @@ -0,0 +1,176 @@ +// +// TodayScheduleView.swift +// AttendanceFeature +// +// Created by devxsby on 2023/04/12. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import UIKit + +import Core +import DSKit + +public enum TodayScheduleType { + case unscheduledDay /// 일정 없는 날 + case scheduledDay /// 세미나 일정 +} + +final class TodayScheduleView: UIView { + + // MARK: - UI Components + + private let dateImageView: UIImageView = { + let imageView = UIImageView() + imageView.contentMode = .scaleToFill + imageView.image = DSKitAsset.Assets.opDate.image + return imageView + }() + + private let dateLabel: UILabel = { + let label = UILabel() + label.font = .Main.body2 + label.textColor = DSKitAsset.Colors.gray60.color + return label + }() + + private let placeImageView: UIImageView = { + let imageView = UIImageView() + imageView.contentMode = .scaleToFill + imageView.image = DSKitAsset.Assets.opPlace.image + return imageView + }() + + private let placeLabel: UILabel = { + let label = UILabel() + label.textColor = DSKitAsset.Colors.gray60.color + label.font = .Main.body2 + return label + }() + + private let titleLabel: UILabel = { + let label = UILabel() + label.textColor = .white + label.text = I18N.Attendance.today + " " + I18N.Attendance.unscheduledDay + I18N.Attendance.dayIs + label.font = .Main.headline2 + return label + }() + + private let subtitleLabel: UILabel = { + let label = UILabel() + label.textColor = DSKitAsset.Colors.gray30.color + label.font = .Main.body2 + return label + }() + + private lazy var dateStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [dateImageView, dateLabel]) + stackView.axis = .horizontal + stackView.spacing = 2 + stackView.alignment = .leading + return stackView + }() + + private lazy var placeStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [placeImageView, placeLabel]) + stackView.axis = .horizontal + stackView.spacing = 2 + stackView.alignment = .leading + return stackView + }() + + private lazy var dateAndPlaceStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [dateStackView, placeStackView]) + stackView.axis = .vertical + stackView.spacing = 7 + stackView.alignment = .leading + return stackView + }() + + private lazy var todayInfoStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [dateAndPlaceStackView, titleLabel]) + stackView.axis = .vertical + stackView.spacing = 16 + stackView.alignment = .leading + return stackView + }() + + private lazy var containerStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [todayInfoStackView, subtitleLabel]) + stackView.axis = .vertical + stackView.spacing = 24 + stackView.alignment = .leading + return stackView + }() + + // MARK: - Initialization + + init(type: TodayScheduleType) { + super.init(frame: .zero) + confiureContentView() + setLayout(type) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Methods + +extension TodayScheduleView { + + private func confiureContentView() { + self.backgroundColor = DSKitAsset.Colors.black60.color + self.clipsToBounds = true + self.layer.cornerRadius = 16 + } + + private func setLayout(_ type: TodayScheduleType) { + + addSubview(containerStackView) + containerStackView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + switch type { + case .unscheduledDay: + self.setUnscheduledDayLayout() + case .scheduledDay: + self.setSeminarDayLayout() + } + } + + private func setUnscheduledDayLayout() { + + dateAndPlaceStackView.isHidden = true + + addSubview(titleLabel) + + titleLabel.snp.makeConstraints { + $0.top.bottom.equalToSuperview().inset(32) + $0.leading.equalToSuperview().offset(32) + } + + } + + private func setSeminarDayLayout() { + + containerStackView.snp.updateConstraints { + $0.edges.equalToSuperview().inset(32) + } + } +} + +extension TodayScheduleView { + + func setData(date: String, place: String, todaySchedule: String, description: String?) { + dateLabel.text = date + placeLabel.text = place + titleLabel.text = I18N.Attendance.today + " " + todaySchedule + " " + I18N.Attendance.dayIs + titleLabel.partFontChange(targetString: todaySchedule, + font: DSKitFontFamily.Suit.bold.font(size: 18)) + subtitleLabel.text = description + subtitleLabel.isHidden = ((description?.isEmpty) == nil) + } +} From 54f23c03ccb7aa24dc0927fee85e4caa472a1170 Mon Sep 17 00:00:00 2001 From: devxsby Date: Thu, 13 Apr 2023 13:49:34 +0900 Subject: [PATCH 12/29] =?UTF-8?q?[Feat]=20#137-=20=EC=B6=9C=EC=84=9D?= =?UTF-8?q?=EC=A0=90=EC=88=98=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=B7=B0=201=EC=B0=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/AttendanceScoreView.swift | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift new file mode 100644 index 00000000..11fcc3b9 --- /dev/null +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -0,0 +1,211 @@ +// +// AttendanceScoreView.swift +// AttendanceFeature +// +// Created by devxsby on 2023/04/12. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import UIKit + +import Core +import DSKit + +final class AttendanceScoreView: UIView { + + // MARK: - UI Components + + private let myInfoContainerView = UIView() + + private let nameLabel: UILabel = { + let label = UILabel() + label.text = "32기 디자인파트 김솝트" + label.font = .Main.body2 + label.textColor = DSKitAsset.Colors.gray60.color + return label + }() + + private let currentScoreLabel: UILabel = { + let label = UILabel() + label.text = I18N.Attendance.currentAttendanceScore + " 1점 " + I18N.Attendance.scoreIs + label.font = .Main.body0 + label.textColor = .white + return label + }() + + private lazy var infoButton: UIButton = { + let button = UIButton(type: .system) + button.setImage(DSKitAsset.Assets.opInfo.image, for: .normal) + button.addTarget(self, action: #selector(infoButtonDidTap), for: .touchUpInside) + return button + }() + + private let myTotalScoreContainerPreView: UIView = { + let view = UIView() + view.backgroundColor = DSKitAsset.Colors.black40.color + view.clipsToBounds = true + view.layer.cornerRadius = 8 + return view + }() + + private let myScoreContainerView: UIView = { + let view = UIView() + view.backgroundColor = DSKitAsset.Colors.black40.color + view.clipsToBounds = true + view.layer.cornerRadius = 8 + return view + }() + + + /// 추가하기 + + + private let singleAttendanceStateView = UIView() + + private let attendanceScoreDescriptiopnLabel: UILabel = { + let label = UILabel() + label.font = .Main.body2 + label.text = I18N.Attendance.myAttendance + label.textColor = DSKitAsset.Colors.gray60.color + return label + }() + + private let attendanceStateButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.title = "1차 세미나" + configuration.baseForegroundColor = .white + configuration.attributedTitle?.font = DSKitFontFamily.Suit.bold.font(size: 15) + configuration.image = DSKitAsset.Assets.opStateAttendance.image + configuration.imagePadding = 10 + configuration.titleAlignment = .leading + let button = UIButton(configuration: configuration) + button.isUserInteractionEnabled = false + return button + }() + + private let attendanceStateDateLabel: UILabel = { + let label = UILabel() + label.font = .Main.body2 + label.text = "00월 00일" + label.textColor = DSKitAsset.Colors.gray30.color + return label + }() + + private lazy var myAttendanceStateContainerStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [attendanceScoreDescriptiopnLabel, singleAttendanceStateView]) + stackView.axis = .vertical + stackView.spacing = 20 + stackView.alignment = .leading + return stackView + }() + + private lazy var containerStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [myInfoContainerView, myTotalScoreContainerPreView, myAttendanceStateContainerStackView]) + stackView.axis = .vertical + stackView.spacing = 24 + stackView.alignment = .leading + return stackView + }() + + // MARK: - Initialization + + override init(frame: CGRect) { + super.init(frame: frame) + configureContentView() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Methods + +extension AttendanceScoreView { + + private func configureContentView() { + self.backgroundColor = DSKitAsset.Colors.black60.color + self.clipsToBounds = true + self.layer.cornerRadius = 16 + } + + private func setLayout() { + addSubview(containerStackView) + containerStackView.addSubviews(myInfoContainerView, myScoreContainerView, myAttendanceStateContainerStackView) + + containerStackView.snp.makeConstraints { + $0.edges.equalToSuperview().inset(32) + } + + myInfoContainerViewLayout() + myScoreContainerViewLayout() + myAttendanceStateContainerViewLayout() + + + } + + private func myInfoContainerViewLayout () { + myInfoContainerView.addSubviews(nameLabel, currentScoreLabel, infoButton) + + myInfoContainerView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(50) + } + + nameLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + currentScoreLabel.snp.makeConstraints { + $0.top.equalTo(nameLabel.snp.bottom).offset(8) + $0.leading.equalToSuperview() + } + + infoButton.snp.makeConstraints { + $0.trailing.bottom.equalToSuperview() + } + } + + private func myScoreContainerViewLayout() { + + myTotalScoreContainerPreView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(88) + } + } + + private func myAttendanceStateContainerViewLayout() { + + myAttendanceStateContainerStackView.addSubviews(attendanceScoreDescriptiopnLabel, singleAttendanceStateView) + + singleAttendanceStateView.addSubviews(attendanceStateButton, attendanceStateDateLabel) + + myAttendanceStateContainerStackView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + } + + attendanceScoreDescriptiopnLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + singleAttendanceStateView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(30) + } + + attendanceStateButton.snp.makeConstraints { + $0.leading.equalToSuperview().offset(-10) + $0.centerY.equalToSuperview() + } + + attendanceStateDateLabel.snp.makeConstraints { + $0.trailing.centerY.equalToSuperview() + } + } + + @objc + private func infoButtonDidTap() { + print("info button did tap") + } +} From 082d5881548b626bf043cc272b53bbd6eea87f22 Mon Sep 17 00:00:00 2001 From: devxsby Date: Thu, 13 Apr 2023 13:50:49 +0900 Subject: [PATCH 13/29] =?UTF-8?q?[Feat]=20#137-=20=EC=B6=9C=EC=84=9D?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=ED=95=98=EA=B8=B0=20=EB=B7=B0=EC=BB=A8?= =?UTF-8?q?=EA=B3=BC=20=EC=BB=A4=EC=8A=A4=ED=85=80=20=EB=B7=B0=202?= =?UTF-8?q?=EA=B0=9C=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/ShowAttendanceVC.swift | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift index 9928f357..44b8f42d 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -26,9 +26,20 @@ public class ShowAttendanceVC: UIViewController, ShowAttendanceViewControllable // MARK: - UI Components + private let containerScrollView = UIScrollView() + private lazy var navibar = OPNavigationBar(self, type: .bothButtons) + .addMiddleLabel(title: I18N.Attendance.attendance) + .addRightButtonAction { + self.refreshButtonDidTap() + } + + private let headerScheduleView = TodayScheduleView(type: .scheduledDay) + private let attendanceScoreView = AttendanceScoreView() + // MARK: - Initialization - public init(viewModel: ShowAttendanceViewModel, factory: AttendanceFeatureViewBuildable) { + public init(viewModel: ShowAttendanceViewModel, + factory: AttendanceFeatureViewBuildable) { self.viewModel = viewModel self.factory = factory super.init(nibName: nil, bundle: nil) @@ -45,18 +56,55 @@ public class ShowAttendanceVC: UIViewController, ShowAttendanceViewControllable self.bindViewModels() self.setUI() self.setLayout() + self.dummy() } } // MARK: - UI & Layout extension ShowAttendanceVC { + private func setUI() { + self.navigationController?.navigationBar.isHidden = true self.view.backgroundColor = .black + containerScrollView.backgroundColor = .black } private func setLayout() { + view.addSubviews(navibar, containerScrollView) + + containerScrollView.addSubviews(headerScheduleView, attendanceScoreView) + + navibar.snp.makeConstraints { + $0.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) + } + + containerScrollView.snp.makeConstraints { + $0.top.equalTo(navibar.snp.bottom) + $0.leading.trailing.bottom.equalTo(view.safeAreaLayoutGuide) + } + headerScheduleView.snp.makeConstraints { + $0.top.equalToSuperview().offset(15) + $0.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(20) + } + + attendanceScoreView.snp.makeConstraints { + $0.top.equalTo(headerScheduleView.snp.bottom).offset(20) + $0.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(20) + } + } + + private func dummy() { + headerScheduleView.setData(date: "3월 23일 토요일 14:00 - 18:00", + place: "건국대학교 꽥꽥오리관", + todaySchedule: "2차 세미나", + description: nil) + } + + @objc + private func refreshButtonDidTap() { + print("refresh button did tap") } } From c6d6c707525c6a89e6eaf8619b45f39214ce9ca6 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 04:35:48 +0900 Subject: [PATCH 14/29] =?UTF-8?q?[Chore]=20#137-=20String=20Literals=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Projects/Core/Sources/Literals/StringLiterals.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift index f4de0b1a..08d63597 100644 --- a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift +++ b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift @@ -182,7 +182,7 @@ public struct I18N { public static let tardy = "지각" public static let leaveEarly = "조퇴" public static let participation = "참여" - + public static let all = "전체" public static let planPart = "기획파트" public static let designPart = "디자인파트" @@ -191,12 +191,12 @@ public struct I18N { public static let aosPart = "안드로이드파트" public static let serverPart = "서버파트" - public static let today = "오늘은" + public static let today = "오늘은 " public static let dayIs = "날이에요" public static let unscheduledDay = "일정이 없는" public static let notCheckedDay = "출석점수를 체크하지 않습니다" - public static let currentAttendanceScore = "현재 출석점수는" - public static let scoreIs = "입니다!" + public static let currentAttendanceScore = "현재 출석점수는 " + public static let scoreIs = " 입니다!" public static let myAttendance = "나의 출결 현황" public static let count = "회" From 0f9cd36c12f82f708a93eb3caafe1d3296045e29 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 04:36:09 +0900 Subject: [PATCH 15/29] =?UTF-8?q?[Feat]=20#137-=20=EC=B6=9C=EC=84=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=ED=95=98=EA=B8=B0=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/AttendanceScoreView.swift | 132 +++++------------- .../Components/MyAttendanceStateView.swift | 72 ++++++++++ .../MyInformationWithScoreView.swift | 104 ++++++++++++++ .../Views/Components/SingleScoreView.swift | 97 +++++++++++++ .../Views/ShowAttendanceVC.swift | 2 +- .../Views/TodayScheduleView.swift | 8 +- 6 files changed, 318 insertions(+), 97 deletions(-) create mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyAttendanceStateView.swift create mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyInformationWithScoreView.swift create mode 100644 SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/SingleScoreView.swift diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index 11fcc3b9..c62c2819 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -11,56 +11,39 @@ import UIKit import Core import DSKit +/* + 출석 조회하기 뷰의 하단 출석 점수 현황을 보여주는 뷰 입니다. + */ + final class AttendanceScoreView: UIView { // MARK: - UI Components - private let myInfoContainerView = UIView() - - private let nameLabel: UILabel = { - let label = UILabel() - label.text = "32기 디자인파트 김솝트" - label.font = .Main.body2 - label.textColor = DSKitAsset.Colors.gray60.color - return label - }() + /// 1. 나의 정보 및 현재 출석 점수 영역 - private let currentScoreLabel: UILabel = { - let label = UILabel() - label.text = I18N.Attendance.currentAttendanceScore + " 1점 " + I18N.Attendance.scoreIs - label.font = .Main.body0 - label.textColor = .white - return label - }() + private let myInfoContainerView = MyInformationWithScoreView() - private lazy var infoButton: UIButton = { - let button = UIButton(type: .system) - button.setImage(DSKitAsset.Assets.opInfo.image, for: .normal) - button.addTarget(self, action: #selector(infoButtonDidTap), for: .touchUpInside) - return button - }() + /// 2. 전체 출결 점수 영역 - private let myTotalScoreContainerPreView: UIView = { - let view = UIView() - view.backgroundColor = DSKitAsset.Colors.black40.color - view.clipsToBounds = true - view.layer.cornerRadius = 8 - return view - }() + private let allScoreView = SingleScoreView(type: .all, count: 5) + private let attendanceScoreView = SingleScoreView(type: .attendance, count: 4) + private let tardyScoreView = SingleScoreView(type: .tardy, count: 1) + private let absentScoreView = SingleScoreView(type: .absent) - private let myScoreContainerView: UIView = { - let view = UIView() - view.backgroundColor = DSKitAsset.Colors.black40.color - view.clipsToBounds = true - view.layer.cornerRadius = 8 - return view + private lazy var myScoreContainerStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [allScoreView, attendanceScoreView, tardyScoreView, absentScoreView]) + stackView.backgroundColor = DSKitAsset.Colors.black40.color + stackView.clipsToBounds = true + stackView.layer.cornerRadius = 8 + stackView.axis = .horizontal + stackView.spacing = -10 + stackView.distribution = .fillEqually + return stackView }() + /// 3. 나의 출결 현황 영역 - /// 추가하기 - - - private let singleAttendanceStateView = UIView() + private let singleAttendanceStateView = MyAttendanceStateView() private let attendanceScoreDescriptiopnLabel: UILabel = { let label = UILabel() @@ -70,27 +53,6 @@ final class AttendanceScoreView: UIView { return label }() - private let attendanceStateButton: UIButton = { - var configuration = UIButton.Configuration.plain() - configuration.title = "1차 세미나" - configuration.baseForegroundColor = .white - configuration.attributedTitle?.font = DSKitFontFamily.Suit.bold.font(size: 15) - configuration.image = DSKitAsset.Assets.opStateAttendance.image - configuration.imagePadding = 10 - configuration.titleAlignment = .leading - let button = UIButton(configuration: configuration) - button.isUserInteractionEnabled = false - return button - }() - - private let attendanceStateDateLabel: UILabel = { - let label = UILabel() - label.font = .Main.body2 - label.text = "00월 00일" - label.textColor = DSKitAsset.Colors.gray30.color - return label - }() - private lazy var myAttendanceStateContainerStackView: UIStackView = { let stackView = UIStackView(arrangedSubviews: [attendanceScoreDescriptiopnLabel, singleAttendanceStateView]) stackView.axis = .vertical @@ -99,8 +61,10 @@ final class AttendanceScoreView: UIView { return stackView }() + /// 4. 전채 묶음 스택뷰 + private lazy var containerStackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [myInfoContainerView, myTotalScoreContainerPreView, myAttendanceStateContainerStackView]) + let stackView = UIStackView(arrangedSubviews: [myInfoContainerView, myScoreContainerStackView, myAttendanceStateContainerStackView]) stackView.axis = .vertical stackView.spacing = 24 stackView.alignment = .leading @@ -120,7 +84,7 @@ final class AttendanceScoreView: UIView { } } -// MARK: - Methods +// MARK: - UI & Layout extension AttendanceScoreView { @@ -132,7 +96,8 @@ extension AttendanceScoreView { private func setLayout() { addSubview(containerStackView) - containerStackView.addSubviews(myInfoContainerView, myScoreContainerView, myAttendanceStateContainerStackView) + + containerStackView.addSubviews(myInfoContainerView, myScoreContainerStackView, myAttendanceStateContainerStackView) containerStackView.snp.makeConstraints { $0.edges.equalToSuperview().inset(32) @@ -141,45 +106,29 @@ extension AttendanceScoreView { myInfoContainerViewLayout() myScoreContainerViewLayout() myAttendanceStateContainerViewLayout() - - } private func myInfoContainerViewLayout () { - myInfoContainerView.addSubviews(nameLabel, currentScoreLabel, infoButton) - + myInfoContainerView.snp.makeConstraints { $0.leading.trailing.equalToSuperview() $0.height.equalTo(50) } - - nameLabel.snp.makeConstraints { - $0.top.leading.equalToSuperview() - } - - currentScoreLabel.snp.makeConstraints { - $0.top.equalTo(nameLabel.snp.bottom).offset(8) - $0.leading.equalToSuperview() - } - - infoButton.snp.makeConstraints { - $0.trailing.bottom.equalToSuperview() - } } private func myScoreContainerViewLayout() { - myTotalScoreContainerPreView.snp.makeConstraints { + myScoreContainerStackView.addSubviews(allScoreView, attendanceScoreView, tardyScoreView, absentScoreView) + + myScoreContainerStackView.snp.makeConstraints { $0.leading.trailing.equalToSuperview() $0.height.equalTo(88) } } private func myAttendanceStateContainerViewLayout() { - myAttendanceStateContainerStackView.addSubviews(attendanceScoreDescriptiopnLabel, singleAttendanceStateView) - singleAttendanceStateView.addSubviews(attendanceStateButton, attendanceStateDateLabel) myAttendanceStateContainerStackView.snp.makeConstraints { $0.leading.trailing.equalToSuperview() @@ -193,19 +142,14 @@ extension AttendanceScoreView { $0.leading.trailing.equalToSuperview() $0.height.equalTo(30) } + } +} - attendanceStateButton.snp.makeConstraints { - $0.leading.equalToSuperview().offset(-10) - $0.centerY.equalToSuperview() - } +// MARK: - Methods - attendanceStateDateLabel.snp.makeConstraints { - $0.trailing.centerY.equalToSuperview() - } - } +extension AttendanceScoreView { - @objc - private func infoButtonDidTap() { - print("info button did tap") + func setData() { + } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyAttendanceStateView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyAttendanceStateView.swift new file mode 100644 index 00000000..fb95f187 --- /dev/null +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyAttendanceStateView.swift @@ -0,0 +1,72 @@ +// +// MyAttendanceStateView.swift +// AttendanceFeature +// +// Created by devxsby on 2023/04/13. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import UIKit + +import Core +import DSKit + +/* + 나의 출결 현황 스택뷰에 1줄짜리 상태(출석, 1차 세미나, 00월 00일)를 나타내는 뷰입니다. + */ + +final class MyAttendanceStateView: UIView { + + // MARK: - UI Components + + private let attendanceStateButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.title = "1차 세미나" + configuration.baseForegroundColor = .white + configuration.attributedTitle?.font = DSKitFontFamily.Suit.bold.font(size: 15) + configuration.image = DSKitAsset.Assets.opStateAttendance.image + configuration.imagePadding = 10 + configuration.titleAlignment = .leading + let button = UIButton(configuration: configuration) + button.isUserInteractionEnabled = false + return button + }() + + private let attendanceStateDateLabel: UILabel = { + let label = UILabel() + label.font = .Main.body2 + label.text = "00월 00일" + label.textColor = DSKitAsset.Colors.gray30.color + return label + }() + + // MARK: - Initialization + + override init(frame: CGRect) { + super.init(frame: frame) + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - UI & Layout + +extension MyAttendanceStateView { + + private func setLayout() { + addSubviews(attendanceStateButton, attendanceStateDateLabel) + + attendanceStateButton.snp.makeConstraints { + $0.leading.equalToSuperview().offset(-10) + $0.centerY.equalToSuperview() + } + + attendanceStateDateLabel.snp.makeConstraints { + $0.trailing.centerY.equalToSuperview() + } + } +} + diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyInformationWithScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyInformationWithScoreView.swift new file mode 100644 index 00000000..e565ab6d --- /dev/null +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyInformationWithScoreView.swift @@ -0,0 +1,104 @@ +// +// MyInformationWithScoreView.swift +// AttendanceFeature +// +// Created by devxsby on 2023/04/13. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import UIKit + +import Core +import DSKit + +final class MyInformationWithScoreView: UIView { + + // MARK: - UI Components + + private let nameLabel: UILabel = { + let label = UILabel() + label.text = "32기 디자인파트 김솝트" + label.font = .Main.body2 + label.textColor = DSKitAsset.Colors.gray60.color + return label + }() + + private let currentScoreLabel: UILabel = { + let label = UILabel() + let mainText = I18N.Attendance.currentAttendanceScore + let pointText = "1점" + let subText = I18N.Attendance.scoreIs + let attributedString = NSMutableAttributedString(string: mainText + pointText + subText) + + attributedString.addAttributes([NSAttributedString.Key.font: UIFont.Main.body0, + NSAttributedString.Key.foregroundColor: UIColor.white], + range: NSRange(location: 0, length: mainText.count)) + attributedString.addAttributes([NSAttributedString.Key.font: UIFont.Main.headline1, + NSAttributedString.Key.foregroundColor: DSKitAsset.Colors.purple40.color], + range: NSRange(location: mainText.count, length: pointText.count)) + attributedString.addAttributes([NSAttributedString.Key.font: UIFont.Main.body0, + NSAttributedString.Key.foregroundColor: UIColor.white], + range: NSRange(location: mainText.count + pointText.count, length: subText.count)) + + label.attributedText = attributedString + return label + }() + + private lazy var infoButton: UIButton = { + let button = UIButton(type: .system) + button.setImage(DSKitAsset.Assets.opInfo.image, for: .normal) + button.addTarget(self, action: #selector(infoButtonDidTap), for: .touchUpInside) + return button + }() + + // MARK: - Initialization + + override init(frame: CGRect) { + super.init(frame: frame) + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - UI & Layout + +extension MyInformationWithScoreView { + + private func setLayout() { + + addSubviews(nameLabel, currentScoreLabel, infoButton) + + nameLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + currentScoreLabel.snp.makeConstraints { + $0.top.equalTo(nameLabel.snp.bottom).offset(8) + $0.leading.equalToSuperview() + } + + infoButton.snp.makeConstraints { + $0.trailing.bottom.equalToSuperview() + } + } +} + + +// MARK: - Methods + +extension MyInformationWithScoreView { + + @objc + private func infoButtonDidTap() { + if let url = URL(string: "https://sopt.org/rules") { + UIApplication.shared.open(url) + } + } + + func setData() { + + } +} diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/SingleScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/SingleScoreView.swift new file mode 100644 index 00000000..2aee3222 --- /dev/null +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/SingleScoreView.swift @@ -0,0 +1,97 @@ +// +// SingleScoreView.swift +// AttendanceFeature +// +// Created by devxsby on 2023/04/13. +// Copyright © 2023 SOPT-iOS. All rights reserved. +// + +import UIKit + +import Core +import DSKit + +public enum AttendanceStateType { + case all + case attendance + case tardy + case absent +} + +/* + 전체, 출석, 지각, 결석 횟수를 보여주는 부분입니다. + */ + +final class SingleScoreView: UIView { + + // MARK: - UI Components + + private let singleScoreTitleLabel: UILabel = { + let label = UILabel() + label.font = .Main.caption1 + label.textColor = DSKitAsset.Colors.gray60.color + return label + }() + + private let singleScoreCountLabel: UILabel = { + let label = UILabel() + label.font = .Main.body2 + label.textColor = DSKitAsset.Colors.gray30.color + return label + }() + + // MARK: - Initialization + + init(type: AttendanceStateType, count: Int = 0) { + super.init(frame: .zero) + updateScoreTypeLabel(type) + setLayout(type) + setData(count) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - UI & Layout + +extension SingleScoreView { + + private func updateScoreTypeLabel(_ type: AttendanceStateType) { + let typeToString = [ + AttendanceStateType.all: I18N.Attendance.all, + AttendanceStateType.attendance: I18N.Attendance.attendance, + AttendanceStateType.tardy: I18N.Attendance.tardy, + AttendanceStateType.absent: I18N.Attendance.absent + ] + + if let typeString = typeToString[type] { + singleScoreTitleLabel.text = typeString + } + } + + private func setLayout(_ type: AttendanceStateType) { + + addSubviews(singleScoreTitleLabel, singleScoreCountLabel) + + singleScoreTitleLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(24) + $0.centerX.equalToSuperview() + } + + singleScoreCountLabel.snp.makeConstraints { + $0.top.equalTo(singleScoreTitleLabel.snp.bottom).offset(8) + $0.centerX.equalToSuperview() + } + } +} + +// MARK: - Methods + +extension SingleScoreView { + + func setData(_ count: Int) { + singleScoreCountLabel.text = "\(count)회" + } +} diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift index 44b8f42d..476974b4 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -99,7 +99,7 @@ extension ShowAttendanceVC { headerScheduleView.setData(date: "3월 23일 토요일 14:00 - 18:00", place: "건국대학교 꽥꽥오리관", todaySchedule: "2차 세미나", - description: nil) + description: "행사도 참여하고, 출석점수도 받고, 일석이조!") } @objc diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift index beb673ee..590c0e56 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift @@ -13,9 +13,13 @@ import DSKit public enum TodayScheduleType { case unscheduledDay /// 일정 없는 날 - case scheduledDay /// 세미나 일정 + case scheduledDay /// 일정(세미나, 행사) 있는 날 } +/* + 출석 조회하기 뷰의 상단 오늘의 일정을 보여주는 뷰 입니다. + */ + final class TodayScheduleView: UIView { // MARK: - UI Components @@ -51,7 +55,7 @@ final class TodayScheduleView: UIView { private let titleLabel: UILabel = { let label = UILabel() label.textColor = .white - label.text = I18N.Attendance.today + " " + I18N.Attendance.unscheduledDay + I18N.Attendance.dayIs + label.text = I18N.Attendance.today + I18N.Attendance.unscheduledDay + I18N.Attendance.dayIs label.font = .Main.headline2 return label }() From 777d6a6b34f5cc1016237af3cf374524a8bededb Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 05:14:57 +0900 Subject: [PATCH 16/29] =?UTF-8?q?[Chore]=20#137-=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyAttendanceStateView.swift | 1 - .../MyInformationWithScoreView.swift | 4 +++ .../SingleScoreView.swift | 2 +- .../Views/AttendanceScoreView.swift | 35 ++++++++++++++----- .../Views/ShowAttendanceVC.swift | 14 ++++---- .../Views/TodayScheduleView.swift | 4 +-- 6 files changed, 40 insertions(+), 20 deletions(-) rename SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/{Components => AttendanceScoreComponents}/MyAttendanceStateView.swift (99%) rename SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/{Components => AttendanceScoreComponents}/MyInformationWithScoreView.swift (97%) rename SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/{Components => AttendanceScoreComponents}/SingleScoreView.swift (96%) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyAttendanceStateView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateView.swift similarity index 99% rename from SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyAttendanceStateView.swift rename to SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateView.swift index fb95f187..71014b9f 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyAttendanceStateView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateView.swift @@ -69,4 +69,3 @@ extension MyAttendanceStateView { } } } - diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyInformationWithScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift similarity index 97% rename from SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyInformationWithScoreView.swift rename to SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift index e565ab6d..496ae3ca 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/MyInformationWithScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift @@ -11,6 +11,10 @@ import UIKit import Core import DSKit +/* + 상단 이름, 현재 출석 점수, 인포 버튼이 있는 뷰입니다. + */ + final class MyInformationWithScoreView: UIView { // MARK: - UI Components diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/SingleScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift similarity index 96% rename from SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/SingleScoreView.swift rename to SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift index 2aee3222..ec88788d 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/Components/SingleScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift @@ -19,7 +19,7 @@ public enum AttendanceStateType { } /* - 전체, 출석, 지각, 결석 횟수를 보여주는 부분입니다. + (전체: 00회)를 표현하는 단일 영역 뷰입니다. */ final class SingleScoreView: UIView { diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index c62c2819..6b71c3fe 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -25,9 +25,9 @@ final class AttendanceScoreView: UIView { /// 2. 전체 출결 점수 영역 - private let allScoreView = SingleScoreView(type: .all, count: 5) - private let attendanceScoreView = SingleScoreView(type: .attendance, count: 4) - private let tardyScoreView = SingleScoreView(type: .tardy, count: 1) + private let allScoreView = SingleScoreView(type: .all, count: 1) + private let attendanceScoreView = SingleScoreView(type: .attendance, count: 1) + private let tardyScoreView = SingleScoreView(type: .tardy) private let absentScoreView = SingleScoreView(type: .absent) private lazy var myScoreContainerStackView: UIStackView = { @@ -42,8 +42,15 @@ final class AttendanceScoreView: UIView { }() /// 3. 나의 출결 현황 영역 + /// + private let attedncanceStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 20 + return stackView + }() - private let singleAttendanceStateView = MyAttendanceStateView() +// private let singleAttendanceStateView = MyAttendanceStateView() private let attendanceScoreDescriptiopnLabel: UILabel = { let label = UILabel() @@ -54,14 +61,14 @@ final class AttendanceScoreView: UIView { }() private lazy var myAttendanceStateContainerStackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [attendanceScoreDescriptiopnLabel, singleAttendanceStateView]) + let stackView = UIStackView(arrangedSubviews: [attendanceScoreDescriptiopnLabel, attedncanceStackView]) stackView.axis = .vertical stackView.spacing = 20 stackView.alignment = .leading return stackView }() - /// 4. 전채 묶음 스택뷰 + /// 4. 전체 묶음 private lazy var containerStackView: UIStackView = { let stackView = UIStackView(arrangedSubviews: [myInfoContainerView, myScoreContainerStackView, myAttendanceStateContainerStackView]) @@ -127,8 +134,19 @@ extension AttendanceScoreView { } private func myAttendanceStateContainerViewLayout() { - myAttendanceStateContainerStackView.addSubviews(attendanceScoreDescriptiopnLabel, singleAttendanceStateView) + myAttendanceStateContainerStackView.addSubviews(attendanceScoreDescriptiopnLabel, attedncanceStackView) + // 반복문을 통해 뷰 생성 후 스택뷰에 추가 + for _ in 0..<3 { + let singleAttendanceStateView = MyAttendanceStateView() + + attedncanceStackView.addArrangedSubview(singleAttendanceStateView) + + singleAttendanceStateView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(30) + } + } myAttendanceStateContainerStackView.snp.makeConstraints { $0.leading.trailing.equalToSuperview() @@ -138,9 +156,8 @@ extension AttendanceScoreView { $0.top.leading.equalToSuperview() } - singleAttendanceStateView.snp.makeConstraints { + attedncanceStackView.snp.makeConstraints { $0.leading.trailing.equalToSuperview() - $0.height.equalTo(30) } } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift index 476974b4..e64b87c7 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -98,14 +98,9 @@ extension ShowAttendanceVC { private func dummy() { headerScheduleView.setData(date: "3월 23일 토요일 14:00 - 18:00", place: "건국대학교 꽥꽥오리관", - todaySchedule: "2차 세미나", + todaySchedule: "1차 행사", description: "행사도 참여하고, 출석점수도 받고, 일석이조!") } - - @objc - private func refreshButtonDidTap() { - print("refresh button did tap") - } } // MARK: - Methods @@ -116,5 +111,10 @@ extension ShowAttendanceVC { let input = ShowAttendanceViewModel.Input() let output = self.viewModel.transform(from: input, cancelBag: self.cancelBag) } - + + + @objc + private func refreshButtonDidTap() { + print("refresh button did tap") + } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift index 590c0e56..4543271a 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift @@ -133,6 +133,7 @@ extension TodayScheduleView { private func setLayout(_ type: TodayScheduleType) { addSubview(containerStackView) + containerStackView.snp.makeConstraints { $0.edges.equalToSuperview() } @@ -148,7 +149,6 @@ extension TodayScheduleView { private func setUnscheduledDayLayout() { dateAndPlaceStackView.isHidden = true - addSubview(titleLabel) titleLabel.snp.makeConstraints { @@ -171,7 +171,7 @@ extension TodayScheduleView { func setData(date: String, place: String, todaySchedule: String, description: String?) { dateLabel.text = date placeLabel.text = place - titleLabel.text = I18N.Attendance.today + " " + todaySchedule + " " + I18N.Attendance.dayIs + titleLabel.text = I18N.Attendance.today + todaySchedule + I18N.Attendance.dayIs titleLabel.partFontChange(targetString: todaySchedule, font: DSKitFontFamily.Suit.bold.font(size: 18)) subtitleLabel.text = description From f0009ba89cad8160ab5dcb5a7a2a64e8d6dd5bf4 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 05:15:16 +0900 Subject: [PATCH 17/29] =?UTF-8?q?[Chore]=20#137-=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Projects/Core/Sources/Literals/StringLiterals.swift | 2 +- .../ShowAttendanceScene/Views/AttendanceScoreView.swift | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift index 08d63597..3523aaf7 100644 --- a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift +++ b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift @@ -192,7 +192,7 @@ public struct I18N { public static let serverPart = "서버파트" public static let today = "오늘은 " - public static let dayIs = "날이에요" + public static let dayIs = " 날이에요" public static let unscheduledDay = "일정이 없는" public static let notCheckedDay = "출석점수를 체크하지 않습니다" public static let currentAttendanceScore = "현재 출석점수는 " diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index 6b71c3fe..3e1a3b4e 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -42,16 +42,14 @@ final class AttendanceScoreView: UIView { }() /// 3. 나의 출결 현황 영역 - /// + private let attedncanceStackView: UIStackView = { let stackView = UIStackView() stackView.axis = .vertical - stackView.spacing = 20 + stackView.spacing = 15 return stackView }() - -// private let singleAttendanceStateView = MyAttendanceStateView() - + private let attendanceScoreDescriptiopnLabel: UILabel = { let label = UILabel() label.font = .Main.body2 From 7c402b7eeddbc51284d3d033c0e6c3870d55058d Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 12:16:15 +0900 Subject: [PATCH 18/29] =?UTF-8?q?[Chore]=20#137-=20MyAttendance=20UIView?= =?UTF-8?q?=EC=97=90=EC=84=9C=20TVC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eView.swift => MyAttendanceStateTVC.swift} | 25 +++- .../Views/AttendanceScoreView.swift | 108 +++++++----------- 2 files changed, 62 insertions(+), 71 deletions(-) rename SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/{MyAttendanceStateView.swift => MyAttendanceStateTVC.swift} (74%) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift similarity index 74% rename from SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateView.swift rename to SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift index 71014b9f..1f764940 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift @@ -12,10 +12,10 @@ import Core import DSKit /* - 나의 출결 현황 스택뷰에 1줄짜리 상태(출석, 1차 세미나, 00월 00일)를 나타내는 뷰입니다. + 나의 출결 현황 스택뷰에 1줄짜리 상태(출석, 1차 세미나, 00월 00일)를 나타내는 테이블뷰 셀입니다. */ -final class MyAttendanceStateView: UIView { +final class MyAttendanceStateTVC: UITableViewCell { // MARK: - UI Components @@ -41,9 +41,16 @@ final class MyAttendanceStateView: UIView { }() // MARK: - Initialization - - override init(frame: CGRect) { - super.init(frame: frame) + + override func prepareForReuse() { + super.prepareForReuse() + attendanceStateDateLabel.text = nil +// attendanceStateButton.titleLabel?.text = nil +// attendanceStateButton.imageView?.image = nil + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) setLayout() } @@ -54,7 +61,7 @@ final class MyAttendanceStateView: UIView { // MARK: - UI & Layout -extension MyAttendanceStateView { +extension MyAttendanceStateTVC { private func setLayout() { addSubviews(attendanceStateButton, attendanceStateDateLabel) @@ -69,3 +76,9 @@ extension MyAttendanceStateView { } } } + +// MARK: - Methods + +extension MyAttendanceStateTVC { + +} diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index 3e1a3b4e..1b1e2e46 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -43,13 +43,8 @@ final class AttendanceScoreView: UIView { /// 3. 나의 출결 현황 영역 - private let attedncanceStackView: UIStackView = { - let stackView = UIStackView() - stackView.axis = .vertical - stackView.spacing = 15 - return stackView - }() - + private lazy var myAttendanceStateContainerView = UIView() + private let attendanceScoreDescriptiopnLabel: UILabel = { let label = UILabel() label.font = .Main.body2 @@ -58,29 +53,20 @@ final class AttendanceScoreView: UIView { return label }() - private lazy var myAttendanceStateContainerStackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [attendanceScoreDescriptiopnLabel, attedncanceStackView]) - stackView.axis = .vertical - stackView.spacing = 20 - stackView.alignment = .leading - return stackView + private lazy var attendanceTableView: UITableView = { + let tableView = UITableView() + tableView.showsVerticalScrollIndicator = true + tableView.backgroundColor = .yellow + tableView.showsVerticalScrollIndicator = false + return tableView }() - /// 4. 전체 묶음 - - private lazy var containerStackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [myInfoContainerView, myScoreContainerStackView, myAttendanceStateContainerStackView]) - stackView.axis = .vertical - stackView.spacing = 24 - stackView.alignment = .leading - return stackView - }() - // MARK: - Initialization override init(frame: CGRect) { super.init(frame: frame) configureContentView() + registerCells() setLayout() } @@ -100,62 +86,35 @@ extension AttendanceScoreView { } private func setLayout() { - addSubview(containerStackView) - - containerStackView.addSubviews(myInfoContainerView, myScoreContainerStackView, myAttendanceStateContainerStackView) - - containerStackView.snp.makeConstraints { - $0.edges.equalToSuperview().inset(32) - } - myInfoContainerViewLayout() - myScoreContainerViewLayout() - myAttendanceStateContainerViewLayout() - } - - private func myInfoContainerViewLayout () { + addSubviews(myInfoContainerView, myScoreContainerStackView, myAttendanceStateContainerView) + myScoreContainerStackView.addSubviews(allScoreView, attendanceScoreView, tardyScoreView, absentScoreView) + myAttendanceStateContainerView.addSubviews(attendanceScoreDescriptiopnLabel, attendanceTableView) myInfoContainerView.snp.makeConstraints { - $0.leading.trailing.equalToSuperview() + $0.top.equalToSuperview().offset(32) + $0.leading.trailing.equalToSuperview().inset(32) $0.height.equalTo(50) } - } - - private func myScoreContainerViewLayout() { - - myScoreContainerStackView.addSubviews(allScoreView, attendanceScoreView, tardyScoreView, absentScoreView) myScoreContainerStackView.snp.makeConstraints { - $0.leading.trailing.equalToSuperview() + $0.top.equalTo(myInfoContainerView.snp.bottom).offset(32) + $0.leading.trailing.equalToSuperview().inset(32) $0.height.equalTo(88) } - } - - private func myAttendanceStateContainerViewLayout() { - myAttendanceStateContainerStackView.addSubviews(attendanceScoreDescriptiopnLabel, attedncanceStackView) - - // 반복문을 통해 뷰 생성 후 스택뷰에 추가 - for _ in 0..<3 { - let singleAttendanceStateView = MyAttendanceStateView() - - attedncanceStackView.addArrangedSubview(singleAttendanceStateView) - - singleAttendanceStateView.snp.makeConstraints { - $0.leading.trailing.equalToSuperview() - $0.height.equalTo(30) - } - } - myAttendanceStateContainerStackView.snp.makeConstraints { - $0.leading.trailing.equalToSuperview() + myAttendanceStateContainerView.snp.makeConstraints { + $0.top.equalTo(myScoreContainerStackView.snp.bottom).offset(32) + $0.leading.trailing.bottom.equalToSuperview().inset(32) } attendanceScoreDescriptiopnLabel.snp.makeConstraints { $0.top.leading.equalToSuperview() } - attedncanceStackView.snp.makeConstraints { - $0.leading.trailing.equalToSuperview() + attendanceTableView.snp.makeConstraints { + $0.top.equalTo(attendanceScoreDescriptiopnLabel.snp.bottom).offset(20) + $0.leading.trailing.bottom.equalToSuperview() } } } @@ -164,7 +123,26 @@ extension AttendanceScoreView { extension AttendanceScoreView { - func setData() { - + private func registerCells() { + attendanceTableView.delegate = self + attendanceTableView.dataSource = self + attendanceTableView.register(MyAttendanceStateTVC.self, forCellReuseIdentifier: MyAttendanceStateTVC.className) + } +} + +extension AttendanceScoreView: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + 30 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + 10 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: MyAttendanceStateTVC.className, for: indexPath) as? MyAttendanceStateTVC else { return UITableViewCell() } +// cell.setData(model: model[safe: indexPath.row]!) + return cell } } From 063a5f948e63a0877a76081860e79bb9bf7f4ce6 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 15:02:01 +0900 Subject: [PATCH 19/29] =?UTF-8?q?[Fix]=20#137-=20tvc=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyAttendanceStateTVC.swift | 17 ++++++++-- .../Views/AttendanceScoreView.swift | 33 +++++++++++++++---- .../Views/ShowAttendanceVC.swift | 1 + 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift index 1f764940..d0b4ff1a 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift @@ -21,7 +21,7 @@ final class MyAttendanceStateTVC: UITableViewCell { private let attendanceStateButton: UIButton = { var configuration = UIButton.Configuration.plain() - configuration.title = "1차 세미나" + configuration.title = "" configuration.baseForegroundColor = .white configuration.attributedTitle?.font = DSKitFontFamily.Suit.bold.font(size: 15) configuration.image = DSKitAsset.Assets.opStateAttendance.image @@ -35,7 +35,6 @@ final class MyAttendanceStateTVC: UITableViewCell { private let attendanceStateDateLabel: UILabel = { let label = UILabel() label.font = .Main.body2 - label.text = "00월 00일" label.textColor = DSKitAsset.Colors.gray30.color return label }() @@ -51,6 +50,7 @@ final class MyAttendanceStateTVC: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) + setUI() setLayout() } @@ -63,6 +63,10 @@ final class MyAttendanceStateTVC: UITableViewCell { extension MyAttendanceStateTVC { + private func setUI() { + backgroundColor = .clear + } + private func setLayout() { addSubviews(attendanceStateButton, attendanceStateDateLabel) @@ -81,4 +85,13 @@ extension MyAttendanceStateTVC { extension MyAttendanceStateTVC { + func setData(title: String, image: UIImage, date: String) { + + attendanceStateButton.configuration?.title? = title + attendanceStateButton.configuration?.image = image + attendanceStateDateLabel.text = date + + attendanceStateButton.configuration?.attributedTitle?.font = DSKitFontFamily.Suit.bold.font(size: 15) + attendanceStateButton.configuration?.attributedTitle?.foregroundColor = .white + } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index 1b1e2e46..2f33db91 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -17,6 +17,11 @@ import DSKit final class AttendanceScoreView: UIView { + // MARK: - Properties + + private let tableViewHeight: CGFloat = 40 + private var tableViewDataSourceCount: Int = 5 + // MARK: - UI Components /// 1. 나의 정보 및 현재 출석 점수 영역 @@ -55,8 +60,9 @@ final class AttendanceScoreView: UIView { private lazy var attendanceTableView: UITableView = { let tableView = UITableView() - tableView.showsVerticalScrollIndicator = true - tableView.backgroundColor = .yellow + tableView.isScrollEnabled = false + tableView.backgroundColor = .clear + tableView.separatorStyle = .none tableView.showsVerticalScrollIndicator = false return tableView }() @@ -113,8 +119,9 @@ extension AttendanceScoreView { } attendanceTableView.snp.makeConstraints { - $0.top.equalTo(attendanceScoreDescriptiopnLabel.snp.bottom).offset(20) + $0.top.equalTo(attendanceScoreDescriptiopnLabel.snp.bottom).offset(10) $0.leading.trailing.bottom.equalToSuperview() + $0.height.equalTo(1) } } } @@ -128,21 +135,33 @@ extension AttendanceScoreView { attendanceTableView.dataSource = self attendanceTableView.register(MyAttendanceStateTVC.self, forCellReuseIdentifier: MyAttendanceStateTVC.className) } + + func updateTableviewHeight() { + + attendanceTableView.snp.updateConstraints { + $0.height.equalTo(tableViewDataSourceCount * Int(tableViewHeight)) + } + } + } extension AttendanceScoreView: UITableViewDelegate, UITableViewDataSource { - + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - 30 + tableViewHeight } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - 10 + tableViewDataSourceCount } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: MyAttendanceStateTVC.className, for: indexPath) as? MyAttendanceStateTVC else { return UITableViewCell() } -// cell.setData(model: model[safe: indexPath.row]!) + cell.selectionStyle = .none + updateTableviewHeight() + cell.setData(title: "\(indexPath.row+1)차 세미나", + image: DSKitAsset.Assets.opStateAttendance.image, + date: "4월 \(indexPath.row+1)일") return cell } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift index e64b87c7..141f117f 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -92,6 +92,7 @@ extension ShowAttendanceVC { attendanceScoreView.snp.makeConstraints { $0.top.equalTo(headerScheduleView.snp.bottom).offset(20) $0.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(20) + $0.bottom.equalToSuperview() } } From 12d481cc3199af9641a4e8707c9b14885824f681 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 18:50:27 +0900 Subject: [PATCH 20/29] =?UTF-8?q?[Chore]=20#137-=20=EC=97=90=EC=85=8B?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Literals/StringLiterals.swift | 2 +- .../MyInformationWithScoreView.swift | 2 +- .../Views/AttendanceScoreView.swift | 29 +++++++++++++----- .../Contents.json | 0 .../op_state_participation.png | Bin .../op_state_participation@2x.png | Bin .../op_state_participation@3x.png | Bin 7 files changed, 24 insertions(+), 9 deletions(-) rename SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/{op_state_participation.imageset => op_state_participate.imageset}/Contents.json (100%) rename SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/{op_state_participation.imageset => op_state_participate.imageset}/op_state_participation.png (100%) rename SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/{op_state_participation.imageset => op_state_participate.imageset}/op_state_participation@2x.png (100%) rename SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/{op_state_participation.imageset => op_state_participate.imageset}/op_state_participation@3x.png (100%) diff --git a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift index 3523aaf7..4fee3330 100644 --- a/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift +++ b/SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift @@ -181,7 +181,7 @@ public struct I18N { public static let absent = "결석" public static let tardy = "지각" public static let leaveEarly = "조퇴" - public static let participation = "참여" + public static let participate = "참여" public static let all = "전체" public static let planPart = "기획파트" diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift index 496ae3ca..fa44f4fe 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift @@ -30,7 +30,7 @@ final class MyInformationWithScoreView: UIView { private let currentScoreLabel: UILabel = { let label = UILabel() let mainText = I18N.Attendance.currentAttendanceScore - let pointText = "1점" + let pointText = "1.5점" let subText = I18N.Attendance.scoreIs let attributedString = NSMutableAttributedString(string: mainText + pointText + subText) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index 2f33db91..ae61a025 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -30,10 +30,10 @@ final class AttendanceScoreView: UIView { /// 2. 전체 출결 점수 영역 - private let allScoreView = SingleScoreView(type: .all, count: 1) - private let attendanceScoreView = SingleScoreView(type: .attendance, count: 1) - private let tardyScoreView = SingleScoreView(type: .tardy) - private let absentScoreView = SingleScoreView(type: .absent) + private let allScoreView = SingleScoreView(type: .all, count: 5) + private let attendanceScoreView = SingleScoreView(type: .attendance, count: 3) + private let tardyScoreView = SingleScoreView(type: .tardy, count: 1) + private let absentScoreView = SingleScoreView(type: .absent, count: 1) private lazy var myScoreContainerStackView: UIStackView = { let stackView = UIStackView(arrangedSubviews: [allScoreView, attendanceScoreView, tardyScoreView, absentScoreView]) @@ -159,9 +159,24 @@ extension AttendanceScoreView: UITableViewDelegate, UITableViewDataSource { guard let cell = tableView.dequeueReusableCell(withIdentifier: MyAttendanceStateTVC.className, for: indexPath) as? MyAttendanceStateTVC else { return UITableViewCell() } cell.selectionStyle = .none updateTableviewHeight() - cell.setData(title: "\(indexPath.row+1)차 세미나", - image: DSKitAsset.Assets.opStateAttendance.image, - date: "4월 \(indexPath.row+1)일") + if indexPath.row == 2 { + cell.setData(title: "\(indexPath.row+1)차 세미나", + image: DSKitAsset.Assets.opStateTardy.image, + date: "4월 \(indexPath.row*7+1)일") + } else if indexPath.row == 0 { + cell.setData(title: "\(indexPath.row+1)차 세미나", + image: DSKitAsset.Assets.opStateAttendance.image, + date: "4월 \(indexPath.row*7+1)일") + + } else if indexPath.row == 3 { + cell.setData(title: "\(indexPath.row+1)차 세미나", + image: DSKitAsset.Assets.opStateAbsent.image, + date: "4월 \(indexPath.row*7+1)일") + } else { + cell.setData(title: "\(indexPath.row+1)차 세미나", + image: DSKitAsset.Assets.opStateAttendance.image, + date: "4월 \(indexPath.row*7+1)일") + } return cell } } diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/Contents.json b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/Contents.json similarity index 100% rename from SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/Contents.json rename to SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/Contents.json diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/op_state_participation.png similarity index 100% rename from SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation.png rename to SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/op_state_participation.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@2x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/op_state_participation@2x.png similarity index 100% rename from SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@2x.png rename to SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/op_state_participation@2x.png diff --git a/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@3x.png b/SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/op_state_participation@3x.png similarity index 100% rename from SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participation.imageset/op_state_participation@3x.png rename to SOPT-iOS/Projects/Modules/DSKit/Resources/Assets.xcassets/Attendance/op_state_participate.imageset/op_state_participation@3x.png From 537e8505a6ba3ff28f5a9b19e69e1dd6f2a46ccf Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 18:57:08 +0900 Subject: [PATCH 21/29] =?UTF-8?q?[Chore]=20#137-=20=EB=8D=94=EB=AF=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyAttendanceStateTVC.swift | 7 ----- .../MyInformationWithScoreView.swift | 4 --- .../SingleScoreView.swift | 9 ------ .../Views/AttendanceScoreView.swift | 29 +++++-------------- .../Views/ShowAttendanceVC.swift | 1 - .../Views/TodayScheduleView.swift | 1 - 6 files changed, 8 insertions(+), 43 deletions(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift index d0b4ff1a..d588ad25 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift @@ -41,13 +41,6 @@ final class MyAttendanceStateTVC: UITableViewCell { // MARK: - Initialization - override func prepareForReuse() { - super.prepareForReuse() - attendanceStateDateLabel.text = nil -// attendanceStateButton.titleLabel?.text = nil -// attendanceStateButton.imageView?.image = nil - } - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setUI() diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift index fa44f4fe..fa575ac7 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyInformationWithScoreView.swift @@ -101,8 +101,4 @@ extension MyInformationWithScoreView { UIApplication.shared.open(url) } } - - func setData() { - - } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift index ec88788d..d85af5f4 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift @@ -86,12 +86,3 @@ extension SingleScoreView { } } } - -// MARK: - Methods - -extension SingleScoreView { - - func setData(_ count: Int) { - singleScoreCountLabel.text = "\(count)회" - } -} diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index ae61a025..10bf6aff 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -31,9 +31,9 @@ final class AttendanceScoreView: UIView { /// 2. 전체 출결 점수 영역 private let allScoreView = SingleScoreView(type: .all, count: 5) - private let attendanceScoreView = SingleScoreView(type: .attendance, count: 3) - private let tardyScoreView = SingleScoreView(type: .tardy, count: 1) - private let absentScoreView = SingleScoreView(type: .absent, count: 1) + private let attendanceScoreView = SingleScoreView(type: .attendance, count: 5) + private let tardyScoreView = SingleScoreView(type: .tardy) + private let absentScoreView = SingleScoreView(type: .absent) private lazy var myScoreContainerStackView: UIStackView = { let stackView = UIStackView(arrangedSubviews: [allScoreView, attendanceScoreView, tardyScoreView, absentScoreView]) @@ -145,6 +145,8 @@ extension AttendanceScoreView { } +// MARK: - UITableViewDelegate, UITableViewDataSource + extension AttendanceScoreView: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { @@ -158,25 +160,10 @@ extension AttendanceScoreView: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: MyAttendanceStateTVC.className, for: indexPath) as? MyAttendanceStateTVC else { return UITableViewCell() } cell.selectionStyle = .none + cell.setData(title: "\(indexPath.row+1)차 세미나", + image: DSKitAsset.Assets.opStateAttendance.image, + date: "4월 \(indexPath.row*7+1)일") updateTableviewHeight() - if indexPath.row == 2 { - cell.setData(title: "\(indexPath.row+1)차 세미나", - image: DSKitAsset.Assets.opStateTardy.image, - date: "4월 \(indexPath.row*7+1)일") - } else if indexPath.row == 0 { - cell.setData(title: "\(indexPath.row+1)차 세미나", - image: DSKitAsset.Assets.opStateAttendance.image, - date: "4월 \(indexPath.row*7+1)일") - - } else if indexPath.row == 3 { - cell.setData(title: "\(indexPath.row+1)차 세미나", - image: DSKitAsset.Assets.opStateAbsent.image, - date: "4월 \(indexPath.row*7+1)일") - } else { - cell.setData(title: "\(indexPath.row+1)차 세미나", - image: DSKitAsset.Assets.opStateAttendance.image, - date: "4월 \(indexPath.row*7+1)일") - } return cell } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift index 141f117f..b0f8bf8f 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -113,7 +113,6 @@ extension ShowAttendanceVC { let output = self.viewModel.transform(from: input, cancelBag: self.cancelBag) } - @objc private func refreshButtonDidTap() { print("refresh button did tap") diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift index 4543271a..4d8224eb 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift @@ -155,7 +155,6 @@ extension TodayScheduleView { $0.top.bottom.equalToSuperview().inset(32) $0.leading.equalToSuperview().offset(32) } - } private func setSeminarDayLayout() { From f7b9b0fd6757e2a4ca7b69c24dff2de9265f813b Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 20:43:21 +0900 Subject: [PATCH 22/29] =?UTF-8?q?[Chore]=20#137-=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/OperationComponents/OPNavigationBar.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift b/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift index 4ef3f304..9df29cdb 100644 --- a/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift +++ b/SOPT-iOS/Projects/Modules/DSKit/Sources/Components/OperationComponents/OPNavigationBar.swift @@ -1,6 +1,6 @@ // // OPNavigationBar.swift -// DSKitDemo +// DSKit // // Created by devxsby on 2023/04/12. // Copyright © 2023 SOPT-iOS. All rights reserved. From 25547cd170b5982dd2029b2da428e0f9bd8bf4f7 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 20:44:05 +0900 Subject: [PATCH 23/29] =?UTF-8?q?[Feat]=20#137-=20=EB=B7=B0=EC=BB=A8=20fin?= =?UTF-8?q?al=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift index b0f8bf8f..6ece608b 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -16,7 +16,7 @@ import DSKit import SnapKit import AttendanceFeatureInterface -public class ShowAttendanceVC: UIViewController, ShowAttendanceViewControllable { +public final class ShowAttendanceVC: UIViewController, ShowAttendanceViewControllable { // MARK: - Properties From 741f3b98d400bd820b76fe1365ccbd8c952e9aaa Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 21:15:12 +0900 Subject: [PATCH 24/29] =?UTF-8?q?[Fix\=20#137-=20=EC=9E=98=EB=AA=BB=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=EB=90=9C=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AttendanceScoreComponents/SingleScoreView.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift index d85af5f4..ec88788d 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift @@ -86,3 +86,12 @@ extension SingleScoreView { } } } + +// MARK: - Methods + +extension SingleScoreView { + + func setData(_ count: Int) { + singleScoreCountLabel.text = "\(count)회" + } +} From 11d88b5b721080943bd17175f48ad61dd00f4ba6 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 21:27:35 +0900 Subject: [PATCH 25/29] =?UTF-8?q?[Chore]=20#137-=20tvc=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyAttendanceStateTVC.swift | 46 +++++++++---------- .../Views/ShowAttendanceVC.swift | 10 +++- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift index d588ad25..9ed26f4b 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/MyAttendanceStateTVC.swift @@ -18,21 +18,17 @@ import DSKit final class MyAttendanceStateTVC: UITableViewCell { // MARK: - UI Components - - private let attendanceStateButton: UIButton = { - var configuration = UIButton.Configuration.plain() - configuration.title = "" - configuration.baseForegroundColor = .white - configuration.attributedTitle?.font = DSKitFontFamily.Suit.bold.font(size: 15) - configuration.image = DSKitAsset.Assets.opStateAttendance.image - configuration.imagePadding = 10 - configuration.titleAlignment = .leading - let button = UIButton(configuration: configuration) - button.isUserInteractionEnabled = false - return button + + private let stateImageView = UIImageView() + + private let titleLabel: UILabel = { + let label = UILabel() + label.font = DSKitFontFamily.Suit.bold.font(size: 15) + label.textColor = .white + return label }() - private let attendanceStateDateLabel: UILabel = { + private let dateLabel: UILabel = { let label = UILabel() label.font = .Main.body2 label.textColor = DSKitAsset.Colors.gray30.color @@ -61,14 +57,20 @@ extension MyAttendanceStateTVC { } private func setLayout() { - addSubviews(attendanceStateButton, attendanceStateDateLabel) + addSubviews(stateImageView, titleLabel, dateLabel) - attendanceStateButton.snp.makeConstraints { - $0.leading.equalToSuperview().offset(-10) + stateImageView.snp.makeConstraints { + $0.leading.centerY.equalToSuperview() + $0.width.equalTo(34) + $0.height.equalTo(20) + } + + titleLabel.snp.makeConstraints { + $0.leading.equalTo(stateImageView.snp.trailing).offset(8) $0.centerY.equalToSuperview() } - attendanceStateDateLabel.snp.makeConstraints { + dateLabel.snp.makeConstraints { $0.trailing.centerY.equalToSuperview() } } @@ -79,12 +81,8 @@ extension MyAttendanceStateTVC { extension MyAttendanceStateTVC { func setData(title: String, image: UIImage, date: String) { - - attendanceStateButton.configuration?.title? = title - attendanceStateButton.configuration?.image = image - attendanceStateDateLabel.text = date - - attendanceStateButton.configuration?.attributedTitle?.font = DSKitFontFamily.Suit.bold.font(size: 15) - attendanceStateButton.configuration?.attributedTitle?.foregroundColor = .white + stateImageView.image = image + titleLabel.text = title + dateLabel.text = date } } diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift index 6ece608b..b360f81a 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/ShowAttendanceVC.swift @@ -27,6 +27,8 @@ public final class ShowAttendanceVC: UIViewController, ShowAttendanceViewControl // MARK: - UI Components private let containerScrollView = UIScrollView() + private let contentView = UIView() + private lazy var navibar = OPNavigationBar(self, type: .bothButtons) .addMiddleLabel(title: I18N.Attendance.attendance) .addRightButtonAction { @@ -72,8 +74,8 @@ extension ShowAttendanceVC { private func setLayout() { view.addSubviews(navibar, containerScrollView) - - containerScrollView.addSubviews(headerScheduleView, attendanceScoreView) + containerScrollView.addSubview(contentView) + contentView.addSubviews(headerScheduleView, attendanceScoreView) navibar.snp.makeConstraints { $0.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) @@ -84,6 +86,10 @@ extension ShowAttendanceVC { $0.leading.trailing.bottom.equalTo(view.safeAreaLayoutGuide) } + contentView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + headerScheduleView.snp.makeConstraints { $0.top.equalToSuperview().offset(15) $0.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(20) From e736e4909b70ca4cb84dce13d972766e8b51e0b1 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 21:34:01 +0900 Subject: [PATCH 26/29] =?UTF-8?q?[Chore]=20#137-=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SingleScoreView.swift | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift index ec88788d..48ca249f 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreComponents/SingleScoreView.swift @@ -11,11 +11,11 @@ import UIKit import Core import DSKit -public enum AttendanceStateType { - case all - case attendance - case tardy - case absent +public enum AttendanceStateType: String, CaseIterable { + case all = "전체" + case attendance = "출석" + case tardy = "지각" + case absent = "결석" } /* @@ -59,16 +59,7 @@ final class SingleScoreView: UIView { extension SingleScoreView { private func updateScoreTypeLabel(_ type: AttendanceStateType) { - let typeToString = [ - AttendanceStateType.all: I18N.Attendance.all, - AttendanceStateType.attendance: I18N.Attendance.attendance, - AttendanceStateType.tardy: I18N.Attendance.tardy, - AttendanceStateType.absent: I18N.Attendance.absent - ] - - if let typeString = typeToString[type] { - singleScoreTitleLabel.text = typeString - } + singleScoreTitleLabel.text = type.rawValue } private func setLayout(_ type: AttendanceStateType) { From 3f34f99a6384ddd00592b6f6c4ab73c9c345ffd1 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 21:37:33 +0900 Subject: [PATCH 27/29] =?UTF-8?q?[Chore]=20#137-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift index 10bf6aff..5074b7a0 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/AttendanceScoreView.swift @@ -94,7 +94,6 @@ extension AttendanceScoreView { private func setLayout() { addSubviews(myInfoContainerView, myScoreContainerStackView, myAttendanceStateContainerView) - myScoreContainerStackView.addSubviews(allScoreView, attendanceScoreView, tardyScoreView, absentScoreView) myAttendanceStateContainerView.addSubviews(attendanceScoreDescriptiopnLabel, attendanceTableView) myInfoContainerView.snp.makeConstraints { From 883b93711e471db9a123b3fb34bd983bc6cd4078 Mon Sep 17 00:00:00 2001 From: devxsby Date: Fri, 14 Apr 2023 22:01:27 +0900 Subject: [PATCH 28/29] =?UTF-8?q?[Chore]=20#137-=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/TodayScheduleView.swift | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift index 4d8224eb..4a0087be 100644 --- a/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift +++ b/SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/Views/TodayScheduleView.swift @@ -92,21 +92,22 @@ final class TodayScheduleView: UIView { }() private lazy var todayInfoStackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [dateAndPlaceStackView, titleLabel]) + let stackView = UIStackView(arrangedSubviews: [placeStackView, dateAndPlaceStackView, titleLabel]) stackView.axis = .vertical - stackView.spacing = 16 + stackView.spacing = 8 stackView.alignment = .leading + stackView.setCustomSpacing(15, after: dateAndPlaceStackView) return stackView }() private lazy var containerStackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [todayInfoStackView, subtitleLabel]) + let stackView = UIStackView(arrangedSubviews: [todayInfoStackView, subtitleLabel]) stackView.axis = .vertical stackView.spacing = 24 stackView.alignment = .leading return stackView }() - + // MARK: - Initialization init(type: TodayScheduleType) { @@ -131,36 +132,20 @@ extension TodayScheduleView { } private func setLayout(_ type: TodayScheduleType) { - addSubview(containerStackView) containerStackView.snp.makeConstraints { - $0.edges.equalToSuperview() - } - - switch type { - case .unscheduledDay: - self.setUnscheduledDayLayout() - case .scheduledDay: - self.setSeminarDayLayout() - } - } - - private func setUnscheduledDayLayout() { - - dateAndPlaceStackView.isHidden = true - addSubview(titleLabel) - - titleLabel.snp.makeConstraints { - $0.top.bottom.equalToSuperview().inset(32) - $0.leading.equalToSuperview().offset(32) + $0.edges.equalToSuperview().inset(32) } - } - - private func setSeminarDayLayout() { - containerStackView.snp.updateConstraints { - $0.edges.equalToSuperview().inset(32) + if case .unscheduledDay = type { + todayInfoStackView.isHidden = true + + addSubview(titleLabel) + titleLabel.snp.makeConstraints { + $0.top.bottom.equalToSuperview().inset(32) + $0.leading.equalToSuperview().offset(32) + } } } } From d0bb475cd08460ac9fcc2642975c9d8aa3ddeb73 Mon Sep 17 00:00:00 2001 From: devxsby Date: Sat, 15 Apr 2023 00:04:18 +0900 Subject: [PATCH 29/29] =?UTF-8?q?[Chore]=20#137-=20=EB=A3=A8=ED=8A=B8?= =?UTF-8?q?=EB=B7=B0=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift b/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift index b1ee44c2..556124eb 100644 --- a/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift +++ b/SOPT-iOS/Projects/SOPT-iOS/Sources/Application/SceneDelegate.swift @@ -23,8 +23,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(frame: scene.coordinateSpace.bounds) window?.windowScene = scene - let rootVC = container.makeShowAttendanceVC().viewController -// let rootVC = container.makeMainVC(userType: .active).viewController +// let rootVC = container.makeShowAttendanceVC().viewController + let rootVC = container.makeMainVC(userType: .active).viewController window?.rootViewController = UINavigationController(rootViewController: rootVC) window?.makeKeyAndVisible() }