-
Notifications
You must be signed in to change notification settings - Fork 2
Update Task model #163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update Task model #163
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1126,7 +1126,7 @@ | |
| CLANG_ENABLE_MODULES = YES; | ||
| CODE_SIGN_ENTITLEMENTS = PomPadDoWidgetsExtension.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| INFOPLIST_FILE = "PomPadDoWatchWidgetsExtension Info.plist"; | ||
| INFOPLIST_KEY_CFBundleDisplayName = PomPadDoWidgets; | ||
|
|
@@ -1163,7 +1163,7 @@ | |
| CLANG_ENABLE_MODULES = YES; | ||
| CODE_SIGN_ENTITLEMENTS = PomPadDoWidgetsExtension.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| INFOPLIST_FILE = "PomPadDoWatchWidgetsExtension Info.plist"; | ||
| INFOPLIST_KEY_CFBundleDisplayName = PomPadDoWidgets; | ||
|
|
@@ -1195,7 +1195,7 @@ | |
| isa = XCBuildConfiguration; | ||
| buildSettings = { | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_TEAM = 9Z68336878; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| MARKETING_VERSION = 1.0; | ||
|
|
@@ -1217,7 +1217,7 @@ | |
| isa = XCBuildConfiguration; | ||
| buildSettings = { | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_TEAM = 9Z68336878; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| MARKETING_VERSION = 1.0; | ||
|
|
@@ -1243,7 +1243,7 @@ | |
| ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; | ||
| CODE_SIGN_ENTITLEMENTS = PomPadDo.mobile/PomPadDo_mobile.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_ASSET_PATHS = "\"PomPadDo.mobile/Preview Content\""; | ||
| ENABLE_APP_SANDBOX = YES; | ||
| ENABLE_PREVIEWS = YES; | ||
|
|
@@ -1284,7 +1284,7 @@ | |
| ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; | ||
| CODE_SIGN_ENTITLEMENTS = PomPadDo.mobile/PomPadDo_mobile.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_ASSET_PATHS = "\"PomPadDo.mobile/Preview Content\""; | ||
| ENABLE_APP_SANDBOX = YES; | ||
| ENABLE_PREVIEWS = YES; | ||
|
|
@@ -1323,7 +1323,7 @@ | |
| isa = XCBuildConfiguration; | ||
| buildSettings = { | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| IPHONEOS_DEPLOYMENT_TARGET = 18.1; | ||
| MARKETING_VERSION = 1.0; | ||
|
|
@@ -1341,7 +1341,7 @@ | |
| isa = XCBuildConfiguration; | ||
| buildSettings = { | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| IPHONEOS_DEPLOYMENT_TARGET = 18.1; | ||
| MARKETING_VERSION = 1.0; | ||
|
|
@@ -1363,7 +1363,7 @@ | |
| ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; | ||
| CODE_SIGN_ENTITLEMENTS = "PomPadDo.watch Watch App/PomPadDo.watch Watch App.entitlements"; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_ASSET_PATHS = "\"PomPadDo.watch Watch App/Preview Content\""; | ||
| ENABLE_PREVIEWS = YES; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
|
|
@@ -1394,7 +1394,7 @@ | |
| ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; | ||
| CODE_SIGN_ENTITLEMENTS = "PomPadDo.watch Watch App/PomPadDo.watch Watch App.entitlements"; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_ASSET_PATHS = "\"PomPadDo.watch Watch App/Preview Content\""; | ||
| ENABLE_PREVIEWS = YES; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
|
|
@@ -1427,7 +1427,7 @@ | |
| CLANG_ENABLE_MODULES = YES; | ||
| CODE_SIGN_ENTITLEMENTS = PomPadDoWidgetsExtension.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| INFOPLIST_FILE = PomPadDoWidgets/Info.plist; | ||
| INFOPLIST_KEY_CFBundleDisplayName = PomPadDoWidgets; | ||
|
|
@@ -1462,7 +1462,7 @@ | |
| CLANG_ENABLE_MODULES = YES; | ||
| CODE_SIGN_ENTITLEMENTS = PomPadDoWidgetsExtension.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| INFOPLIST_FILE = PomPadDoWidgets/Info.plist; | ||
| INFOPLIST_KEY_CFBundleDisplayName = PomPadDoWidgets; | ||
|
|
@@ -1496,7 +1496,7 @@ | |
| CODE_SIGN_IDENTITY = "Apple Development"; | ||
| "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| ENABLE_APP_SANDBOX = YES; | ||
| ENABLE_HARDENED_RUNTIME = YES; | ||
| ENABLE_USER_SELECTED_FILES = readonly; | ||
|
|
@@ -1531,7 +1531,7 @@ | |
| CODE_SIGN_IDENTITY = "Apple Development"; | ||
| "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| ENABLE_APP_SANDBOX = YES; | ||
| ENABLE_HARDENED_RUNTIME = YES; | ||
| ENABLE_USER_SELECTED_FILES = readonly; | ||
|
|
@@ -1695,7 +1695,7 @@ | |
| CODE_SIGN_ENTITLEMENTS = PomPadDo/PomPadDoMac.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| COMBINE_HIDPI_IMAGES = YES; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEAD_CODE_STRIPPING = YES; | ||
| DEVELOPMENT_ASSET_PATHS = "\"PomPadDo/Preview Content\""; | ||
| ENABLE_APP_SANDBOX = YES; | ||
|
|
@@ -1733,7 +1733,7 @@ | |
| CODE_SIGN_ENTITLEMENTS = PomPadDo/PomPadDoMac.entitlements; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| COMBINE_HIDPI_IMAGES = YES; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEAD_CODE_STRIPPING = YES; | ||
| DEVELOPMENT_ASSET_PATHS = "\"PomPadDo/Preview Content\""; | ||
| ENABLE_APP_SANDBOX = YES; | ||
|
|
@@ -1767,7 +1767,7 @@ | |
| buildSettings = { | ||
| BUNDLE_LOADER = "$(TEST_HOST)"; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEAD_CODE_STRIPPING = YES; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| MACOSX_DEPLOYMENT_TARGET = 14.0; | ||
|
|
@@ -1785,7 +1785,7 @@ | |
| buildSettings = { | ||
| BUNDLE_LOADER = "$(TEST_HOST)"; | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEAD_CODE_STRIPPING = YES; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| MACOSX_DEPLOYMENT_TARGET = 14.0; | ||
|
|
@@ -1802,7 +1802,7 @@ | |
| isa = XCBuildConfiguration; | ||
| buildSettings = { | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_TEAM = 9Z68336878; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| MACOSX_DEPLOYMENT_TARGET = 26.0; | ||
|
|
@@ -1822,7 +1822,7 @@ | |
| isa = XCBuildConfiguration; | ||
| buildSettings = { | ||
| CODE_SIGN_STYLE = Automatic; | ||
| CURRENT_PROJECT_VERSION = 109; | ||
| CURRENT_PROJECT_VERSION = 111; | ||
| DEVELOPMENT_TEAM = 9Z68336878; | ||
| GENERATE_INFOPLIST_FILE = YES; | ||
| MACOSX_DEPLOYMENT_TARGET = 26.0; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Коротко: вы просто подняли CURRENT_PROJECT_VERSION с 109 до 111 в куче конфигураций. Само по себе — ок, но есть несколько рискованных мест и поводов для упрощения. Что поправить прямо сейчас
Риски/замечания
Автоматизация, чтобы не ловить такие баги в будущем
Итог
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Коротко по делу — что стоит поправить и как упростить обслуживание версии:
Итог: сам bump с 109 до 112 — ок, но текущая схема поддержки версии трудоемкая и склонна к ошибкам. Вынесение версии в один источник + автоматизация + санитация build settings решат большинство рисков на будущие релизы. |
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -18,20 +18,55 @@ struct FocusTasksView: View { | |
| @Query(filter: TasksQuery.predicateTodayActive()) var tasksTodayActive: [Todo] | ||
|
|
||
| var body: some View { | ||
| List(selection: $selectedTask) { | ||
| ForEach(tasksTodayActive.sorted(by: TasksQuery.defaultSorting), | ||
| id: \.self) { task in | ||
| if task.hasSubtasks() { | ||
| OutlineGroup([task], | ||
| id: \.self, | ||
| children: \.visibleSubtasks) { maintask in | ||
| if tasksTodayActive.count > 0 { | ||
| List(selection: $selectedTask) { | ||
| ForEach(tasksTodayActive.sorted(by: TasksQuery.defaultSorting), | ||
| id: \.self) { task in | ||
| if task.visibleSubtasks?.isEmpty == false { | ||
| OutlineGroup([task], | ||
| id: \.self, | ||
| children: \.visibleSubtasks) { maintask in | ||
| HStack { | ||
| TaskRowView(task: maintask) | ||
| .modifier(FocusTaskRowModifier(task: maintask, viewMode: $viewMode)) | ||
| .tag(maintask) | ||
| .listRowSeparator(.hidden) | ||
|
|
||
| if let focus = focusTask.task, focus == maintask { | ||
| Button { | ||
| timer.reset() | ||
| if timer.mode == .pause || timer.mode == .longbreak { | ||
| timer.skip() | ||
| } | ||
| focusTask.task = nil | ||
| } label: { | ||
| Image(systemName: "stop.fill") | ||
| } | ||
| } else { | ||
| Button { | ||
| focusTask.task = maintask | ||
| viewMode = 1 | ||
| if timer.state == .idle { | ||
| timer.reset() | ||
| timer.start() | ||
| } else if timer.state == .paused { | ||
| timer.resume() | ||
| } | ||
| } label: { | ||
| Image(systemName: "play.fill") | ||
| } | ||
| .accessibility(identifier: "\(maintask.name)PlayButton") | ||
| } | ||
| } | ||
| } | ||
| .listRowSeparator(.hidden) | ||
| } else { | ||
| HStack { | ||
| TaskRowView(task: maintask) | ||
| .modifier(FocusTaskRowModifier(task: maintask, viewMode: $viewMode)) | ||
| .tag(maintask) | ||
| .listRowSeparator(.hidden) | ||
| TaskRowView(task: task) | ||
| .modifier(FocusTaskRowModifier(task: task, viewMode: $viewMode)) | ||
| .tag(task) | ||
|
|
||
| if let focus = focusTask.task, focus == maintask { | ||
| if let focus = focusTask.task, focus == task { | ||
| Button { | ||
| timer.reset() | ||
| if timer.mode == .pause || timer.mode == .longbreak { | ||
|
|
@@ -43,7 +78,7 @@ struct FocusTasksView: View { | |
| } | ||
| } else { | ||
| Button { | ||
| focusTask.task = maintask | ||
| focusTask.task = task | ||
| viewMode = 1 | ||
| if timer.state == .idle { | ||
| timer.reset() | ||
|
|
@@ -54,46 +89,24 @@ struct FocusTasksView: View { | |
| } label: { | ||
| Image(systemName: "play.fill") | ||
| } | ||
| .accessibility(identifier: "\(maintask.name)PlayButton") | ||
| } | ||
| } | ||
| } | ||
| .listRowSeparator(.hidden) | ||
| } else { | ||
| HStack { | ||
| TaskRowView(task: task) | ||
| .modifier(FocusTaskRowModifier(task: task, viewMode: $viewMode)) | ||
| .tag(task) | ||
|
|
||
| if let focus = focusTask.task, focus == task { | ||
| Button { | ||
| timer.reset() | ||
| if timer.mode == .pause || timer.mode == .longbreak { | ||
| timer.skip() | ||
| } | ||
| focusTask.task = nil | ||
| } label: { | ||
| Image(systemName: "stop.fill") | ||
| .accessibility(identifier: "\(task.name)PlayButton") | ||
| } | ||
| } else { | ||
| Button { | ||
| focusTask.task = task | ||
| viewMode = 1 | ||
| if timer.state == .idle { | ||
| timer.reset() | ||
| timer.start() | ||
| } else if timer.state == .paused { | ||
| timer.resume() | ||
| } | ||
| } label: { | ||
| Image(systemName: "play.fill") | ||
| } | ||
| .accessibility(identifier: "\(task.name)PlayButton") | ||
| } | ||
| .listRowSeparator(.hidden) | ||
| } | ||
| .listRowSeparator(.hidden) | ||
| } | ||
| } | ||
| } else { | ||
| VStack { | ||
| Spacer() | ||
| Image(systemName: "checkmark.circle") | ||
| .resizable() | ||
| .foregroundStyle(Color.gray) | ||
| .frame(width: 100, height: 100) | ||
|
|
||
| Text("No tasks for today") | ||
| Spacer() | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только замечания по проблемным/сомнительным местам и предложениям улучшения. Структура/дублирование
Идентичности/selection
Сепараторы списка
Логика таймера/фокуса
Состояния/пустой список
Сортировка/Query
Доступность/идентификаторы
Прочее
Рефакторинг-скетч (упрощённо, чтобы показать направления):
Эти шаги уберут дубли, стабилизируют идентичности, улучшат доступность и сделают логику таймера предсказуемой. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только те замечания, которые реально улучшат код или устранят потенциальные проблемы.
Итоговая «быстрая выжимка» того, что стоит сделать в первую очередь:
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -77,7 +77,7 @@ struct BoardView: View { | |
| .filter({ $0.status == status && $0.parentTask == nil }) | ||
| .sorted(by: TasksQuery.sortingWithCompleted), | ||
| id: \.self) { task in | ||
| if task.hasSubtasks() { | ||
| if task.visibleSubtasks?.isEmpty == false { | ||
| OutlineGroup([task], | ||
| id: \.self, | ||
| children: \.visibleSubtasks) { maintask in | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только по делу, по изменённой строке и ближайшему контексту.
Итоговое безопасное правило:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Наблюдения по изменению if task.hasSubtasks() -> if task.visibleSubtasks?.isEmpty == false:
Пример более чистого фрагмента:
Главные рекомендации к внедрению:
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -46,7 +46,7 @@ struct ProjectTasksListView: View { | |
| .filter({ $0.status == status && $0.parentTask == nil }) | ||
| .sorted(by: TasksQuery.sortingWithCompleted), | ||
| id: \.self) { task in | ||
| if task.hasSubtasks() { | ||
| if task.visibleSubtasks?.isEmpty == false { | ||
| OutlineGroup([task], | ||
| id: \.self, | ||
| children: \.visibleSubtasks) { maintask in | ||
|
|
@@ -150,7 +150,7 @@ struct ProjectTasksListView: View { | |
| )) { | ||
| ForEach(section == .completed ? searchResults.filter({ $0.completed && $0.parentTask == nil }) : searchResults.filter({ $0.completed == false }), | ||
| id: \.self) { task in | ||
| if task.hasSubtasks() { | ||
| if task.visibleSubtasks?.isEmpty == false { | ||
| OutlineGroup([task], | ||
| id: \.self, | ||
| children: \.visibleSubtasks) { maintask in | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только по делу, по текущему изменению и окружению:
Короткая рекомендация по коду (если хотите минимальными правками и предсказуемым поведением):
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только те замечания, которые действительно могут улучшить код или предотвратить проблемы.
Если кратко, основные практические шаги:
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -222,8 +222,8 @@ struct ProjectsListView: View { | |
| Button { | ||
| for project in projects.filter({ $0.group == group }) { | ||
| project.group = nil | ||
| modelContext.delete(group) | ||
| } | ||
| modelContext.delete(group) | ||
| } label: { | ||
| Image(systemName: "trash") | ||
| .foregroundStyle(Color.red) | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только содержательные замечания по сути изменения.
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -51,7 +51,7 @@ struct SubtasksListView: View { | |
| )) { | ||
| ForEach(section == .completed ? searchResults.filter({ $0.completed && ($0.parentTask == nil || $0.parentTask == mainTask) }) : searchResults.filter({ $0.completed == false }), | ||
| id: \.self) { task in | ||
| if task.hasSubtasks() { | ||
| if task.visibleSubtasks?.isEmpty == false { | ||
| OutlineGroup([task], | ||
| id: \.self, | ||
| children: \.visibleSubtasks) { maintask in | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже только то, что действительно может улучшить код и предотвратить регрессии.
Пример рефакторинга фрагмента:
Пример: let filtered: [Task] = { ForEach(filtered, id: .id) { task in Если вы осознанно хотели завязать отображение групп именно на «видимых» детях (поиск/фильтр), то ключевой момент — договориться о семантике visibleSubtasks: nil означает «нет видимых детей», [] лучше не возвращать вовсе, чтобы и условие, и OutlineGroup вели себя согласованно. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Наблюдения по изменению и коду вокруг него:
Пример направления:
Итог: текущее изменение допустимо, если вы намеренно хотите скрывать «контейнерность» узла при пустой видимости детей. Если нет — лучше убрать предварительную проверку вовсе и оставить решать OutlineGroup, одновременно избежав двойных вычислений и улучшив производительность/простоту. Обязательно рассмотрите переход на стабильный id и выравнивание логики фильтра по секциям. |
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -79,7 +79,7 @@ struct TasksListView: View { | |
| )) { | ||
| ForEach(section == .completed ? searchResults.filter({ $0.completed && ($0.parentTask == nil) }) : searchResults.filter({ $0.completed == false }), | ||
| id: \.self) { task in | ||
| if task.hasSubtasks() { | ||
| if task.visibleSubtasks?.isEmpty == false { | ||
| OutlineGroup([task], | ||
| id: \.self, | ||
| children: \.visibleSubtasks) { maintask in | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только предметные замечания по изменению hasSubtasks() → visibleSubtasks != nil и прилегающему коду.
Итоговая рекомендация по минимальным правкам, если UI листа и узла одинаков:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже — только те замечания, которые реально повлияют на корректность, читаемость и поведение.
Итоговая форма секции с учётом правок может выглядеть так:
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -20409,6 +20409,22 @@ | |
| } | ||
| } | ||
| }, | ||
| "No tasks for today" : { | ||
| "localizations" : { | ||
| "en" : { | ||
| "stringUnit" : { | ||
| "state" : "translated", | ||
| "value" : "No tasks for today" | ||
| } | ||
| }, | ||
| "ru" : { | ||
| "stringUnit" : { | ||
| "state" : "translated", | ||
| "value" : "Нет задач на сегодня" | ||
| } | ||
| } | ||
| } | ||
| }, | ||
| "None" : { | ||
| "localizations" : { | ||
| "ar" : { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ниже только предметные замечания и улучшения по добавленной строке в .xcstrings.
Итоговое предложение (пример): "tasks.emptyState.today" : { Если в проекте уже есть plural для количества задач — лучше интегрировать нулевую форму туда и не добавлять отдельный ключ. |
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Коротко: по сути это механическое повышение CURRENT_PROJECT_VERSION с 109 до 110 во всех конфигурациях/таргетах. Работать будет, но есть несколько мест, где сейчас заложены риски и лишний шум в PR.
Рекомендации:
Централизуйте версионирование, чтобы не плодить десятки правок в pbxproj при каждом инкременте:
Приведите к единому подходу работу с Info.plist:
Согласованность версий между контейнером и расширениями/виджетами:
Проверьте deployment targets:
DEVELOPMENT_TEAM:
Сократите шум в тестовых таргетах:
Итого: текущая правка допустима, но лучше упразднить дубли, выровнять политику Info.plist и deployment target’ов и автоматизировать инкремент сборочного номера. Это уменьшит вероятность расхождений и избавит от «инкрементных» PR.