修复任务提交与弹窗交互问题

This commit is contained in:
2026-07-10 14:51:34 +08:00
parent df547a16dc
commit f88a85a807
48 changed files with 1065 additions and 254 deletions

View File

@ -16,9 +16,11 @@ final class TaskAddViewController: BaseViewController {
private let ossUploadService = NetworkServices.shared.ossUploadService
private let scrollView = UIScrollView()
private let formCardView = UIView()
private let contentStack = UIStackView()
private let mediaSection = TaskAddMediaSectionView()
private let prioritySection = TaskPrioritySectionView()
private let orderTitleLabel = UILabel()
private let orderButton = TaskOrderSelectButton()
private let nameField = TaskBorderTextField(placeholder: "请输入任务标题")
private let detailsField = TaskBorderTextView(placeholder: "请输入任务描述(必填)")
@ -26,6 +28,7 @@ final class TaskAddViewController: BaseViewController {
private let bottomBar = UIView()
private var remarkDialog: TaskFileRemarkDialogView?
private var uploadTypeSheet: TaskUploadTypeSheetView?
private var pickingMediaType: Int = 2
private var detailsPlaceholder = "请输入任务描述(必填)"
@ -34,37 +37,56 @@ final class TaskAddViewController: BaseViewController {
}
override func setupUI() {
view.backgroundColor = AppColor.pageBackground
scrollView.backgroundColor = AppColor.pageBackground
scrollView.keyboardDismissMode = .interactive
formCardView.backgroundColor = .white
formCardView.layer.cornerRadius = AppRadius.lg
contentStack.axis = .vertical
contentStack.spacing = AppSpacing.sm
contentStack.spacing = AppSpacing.md
orderTitleLabel.text = "关联订单(可选)"
orderTitleLabel.font = .app(.bodyMedium)
orderTitleLabel.textColor = AppColor.textPrimary
bottomBar.backgroundColor = .white
view.addSubview(scrollView)
view.addSubview(bottomBar)
scrollView.addSubview(contentStack)
scrollView.addSubview(formCardView)
formCardView.addSubview(contentStack)
contentStack.addArrangedSubview(mediaSection)
contentStack.addArrangedSubview(prioritySection)
contentStack.addArrangedSubview(orderTitleLabel)
contentStack.addArrangedSubview(orderButton)
contentStack.addArrangedSubview(nameField)
contentStack.addArrangedSubview(detailsField)
contentStack.setCustomSpacing(AppSpacing.xxs, after: orderTitleLabel)
bottomBar.addSubview(saveButton)
}
override func setupConstraints() {
bottomBar.snp.makeConstraints { make in
make.leading.trailing.bottom.equalToSuperview()
make.height.equalTo(80)
}
saveButton.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(AppSpacing.md)
make.leading.trailing.equalToSuperview().inset(AppSpacing.md)
make.centerY.equalToSuperview()
}
scrollView.snp.makeConstraints { make in
make.top.leading.trailing.equalTo(view.safeAreaLayoutGuide)
make.bottom.equalTo(bottomBar.snp.top)
}
contentStack.snp.makeConstraints { make in
formCardView.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(AppSpacing.md)
make.width.equalTo(scrollView.snp.width).offset(-AppSpacing.md * 2)
}
contentStack.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(AppSpacing.md)
}
}
override func bindActions() {
@ -91,6 +113,7 @@ final class TaskAddViewController: BaseViewController {
nameField.textField.addTarget(self, action: #selector(nameChanged), for: .editingChanged)
detailsField.textView.delegate = self
saveButton.addTarget(self, action: #selector(saveTapped), for: .touchUpInside)
applyViewModel()
}
override func viewDidAppear(_ animated: Bool) {
@ -108,11 +131,15 @@ final class TaskAddViewController: BaseViewController {
if nameField.textField.text != viewModel.taskName {
nameField.textField.text = viewModel.taskName
}
if detailsField.textView.textColor != AppColor.textTertiary,
detailsField.textView.text != viewModel.taskDetails {
if viewModel.taskDetails.isEmpty, !detailsField.textView.isFirstResponder {
detailsField.textView.text = detailsPlaceholder
detailsField.textView.textColor = AppColor.textTertiary
} else if detailsField.textView.text != viewModel.taskDetails {
detailsField.textView.text = viewModel.taskDetails
detailsField.textView.textColor = AppColor.textPrimary
}
saveButton.isEnabled = !viewModel.isUploading
saveButton.isEnabled = true
saveButton.alpha = viewModel.isUploading ? 0.6 : 1
if viewModel.showRemarkDialog, let file = viewModel.remarkTargetFile {
showRemarkDialog(file: file)
@ -151,15 +178,30 @@ final class TaskAddViewController: BaseViewController {
}
private func presentLocalImportSheet() {
let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
sheet.addAction(UIAlertAction(title: "图片", style: .default) { [weak self] _ in
guard uploadTypeSheet == nil else { return }
let sheet = TaskUploadTypeSheetView(frame: view.bounds)
sheet.onChooseImage = { [weak self] in
self?.hideUploadTypeSheet()
self?.presentMediaPicker(isImage: true)
})
sheet.addAction(UIAlertAction(title: "视频", style: .default) { [weak self] _ in
}
sheet.onChooseVideo = { [weak self] in
self?.hideUploadTypeSheet()
self?.presentMediaPicker(isImage: false)
})
sheet.addAction(UIAlertAction(title: "取消", style: .cancel))
present(sheet, animated: true)
}
sheet.onCancel = { [weak self] in
self?.hideUploadTypeSheet()
}
uploadTypeSheet = sheet
view.addSubview(sheet)
sheet.snp.makeConstraints { make in make.edges.equalToSuperview() }
sheet.show()
}
private func hideUploadTypeSheet() {
uploadTypeSheet?.dismiss { [weak self] in
self?.uploadTypeSheet?.removeFromSuperview()
self?.uploadTypeSheet = nil
}
}
private func presentMediaPicker(isImage: Bool) {
@ -257,7 +299,6 @@ final class TaskAddViewController: BaseViewController {
self?.viewModel.updateUploadProgress(uploadTaskId: uploadTaskId, progress: progress)
}
}
try await taskAPI.registerUploadedFileURL(scenicId: scenicId, fileURL: fileURL, folderId: 0)
await MainActor.run {
self.viewModel.markUploadSucceeded(
uploadTaskId: uploadTaskId,