From 1275b09f20bc99ced85ab88ad9d2656d93d579e9 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Thu, 5 Oct 2023 09:47:51 +0200 Subject: [PATCH] Add / Remove tag from tag groups from timeline view --- .../Localization/be.lproj/Localizable.strings | 1 + .../Localization/ca.lproj/Localizable.strings | 7 +- .../Localization/de.lproj/Localizable.strings | 1 + .../en-GB.lproj/Localizable.strings | 1 + .../Localization/en.lproj/Localizable.strings | 1 + .../Localization/es.lproj/Localizable.strings | 1 + .../Localization/eu.lproj/Localizable.strings | 1 + .../Localization/fr.lproj/Localizable.strings | 1 + .../Localization/it.lproj/Localizable.strings | 1 + .../Localization/ja.lproj/Localizable.strings | 1 + .../Localization/ko.lproj/Localizable.strings | 1 + .../Localization/nb.lproj/Localizable.strings | 1 + .../Localization/nl.lproj/Localizable.strings | 1 + .../Localization/pl.lproj/Localizable.strings | 1 + .../pt-BR.lproj/Localizable.strings | 1 + .../Localization/tr.lproj/Localizable.strings | 1 + .../Localization/uk.lproj/Localizable.strings | 1 + .../zh-Hans.lproj/Localizable.strings | 1 + .../zh-Hant.lproj/Localizable.strings | 1 + .../Sources/Timeline/TimelineView.swift | 107 ++++++++++++------ 20 files changed, 92 insertions(+), 40 deletions(-) diff --git a/IceCubesApp/Resources/Localization/be.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/be.lproj/Localizable.strings index 9f4ca2e6..0aa73a9e 100644 --- a/IceCubesApp/Resources/Localization/be.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/be.lproj/Localizable.strings @@ -613,4 +613,5 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/ca.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/ca.lproj/Localizable.strings index c4c5fffd..5a4bdf92 100644 --- a/IceCubesApp/Resources/Localization/ca.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/ca.lproj/Localizable.strings @@ -607,9 +607,4 @@ "add-tag-groups.edit.icon.field" = "Icona del Grup d'Etiquetes (SFSymbol)"; "add-tag-groups.edit.tags" = "Afegeix etiquetes al grup"; "add-tag-groups.edit.tags.add" = "Etiqueta"; - -// MARK: Tag Groups -"add-tag-groups.edit.title.field" = "Tag Group Title"; -"add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; -"add-tag-groups.edit.tags" = "Add tags to the group"; -"add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/de.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/de.lproj/Localizable.strings index 4a2764bd..33faf6b0 100644 --- a/IceCubesApp/Resources/Localization/de.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/de.lproj/Localizable.strings @@ -594,3 +594,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/en-GB.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/en-GB.lproj/Localizable.strings index f53c3daf..e0368fbd 100644 --- a/IceCubesApp/Resources/Localization/en-GB.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/en-GB.lproj/Localizable.strings @@ -608,3 +608,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/en.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/en.lproj/Localizable.strings index 76ec3861..be13f369 100644 --- a/IceCubesApp/Resources/Localization/en.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/en.lproj/Localizable.strings @@ -610,3 +610,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/es.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/es.lproj/Localizable.strings index 19c75c78..e6098153 100644 --- a/IceCubesApp/Resources/Localization/es.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/es.lproj/Localizable.strings @@ -609,3 +609,4 @@ "add-tag-groups.edit.icon.field" = "Icono del Grupo de Etiquetas (SFSymbol)"; "add-tag-groups.edit.tags" = "Añade etiquetas al grupo"; "add-tag-groups.edit.tags.add" = "Etiqueta"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/eu.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/eu.lproj/Localizable.strings index acac3638..67c57dc3 100644 --- a/IceCubesApp/Resources/Localization/eu.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/eu.lproj/Localizable.strings @@ -595,3 +595,4 @@ "add-tag-groups.edit.icon.field" = "Traola-sortaren ikonoa (SFSymbol izena)"; "add-tag-groups.edit.tags" = "Gehitu traolak sortara"; "add-tag-groups.edit.tags.add" = "Traola"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/fr.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/fr.lproj/Localizable.strings index 6f71ce2c..47bc9bc7 100644 --- a/IceCubesApp/Resources/Localization/fr.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/fr.lproj/Localizable.strings @@ -604,3 +604,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/it.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/it.lproj/Localizable.strings index 8b4af5cd..9dc93e79 100644 --- a/IceCubesApp/Resources/Localization/it.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/it.lproj/Localizable.strings @@ -610,3 +610,4 @@ "add-tag-groups.edit.icon.field" = "Icona del gruppo (nome simbolo SF)"; "add-tag-groups.edit.tags" = "Tag aggiunti al gruppo"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/ja.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/ja.lproj/Localizable.strings index 615c35bf..c8142726 100644 --- a/IceCubesApp/Resources/Localization/ja.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/ja.lproj/Localizable.strings @@ -607,3 +607,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/ko.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/ko.lproj/Localizable.strings index c7360f5c..a0e77645 100644 --- a/IceCubesApp/Resources/Localization/ko.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/ko.lproj/Localizable.strings @@ -611,3 +611,4 @@ "add-tag-groups.edit.icon.field" = "태그 모음 아이콘 (SF Symbol 이름)"; "add-tag-groups.edit.tags" = "모음에 포함할 태그"; "add-tag-groups.edit.tags.add" = "태그"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/nb.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/nb.lproj/Localizable.strings index cef02c0b..99bfe356 100644 --- a/IceCubesApp/Resources/Localization/nb.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/nb.lproj/Localizable.strings @@ -608,3 +608,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/nl.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/nl.lproj/Localizable.strings index 3b2ed51f..6cc777f0 100644 --- a/IceCubesApp/Resources/Localization/nl.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/nl.lproj/Localizable.strings @@ -605,3 +605,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/pl.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/pl.lproj/Localizable.strings index 5155d1bf..6cfd03ea 100644 --- a/IceCubesApp/Resources/Localization/pl.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/pl.lproj/Localizable.strings @@ -597,4 +597,5 @@ "add-tag-groups.edit.icon.field" = "Ikona grupy (nazwa symbolu SF)"; "add-tag-groups.edit.tags" = "Dodaj hasztagi do grupy"; "add-tag-groups.edit.tags.add" = "Hasztag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/pt-BR.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/pt-BR.lproj/Localizable.strings index 0083f827..cc7aa988 100644 --- a/IceCubesApp/Resources/Localization/pt-BR.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/pt-BR.lproj/Localizable.strings @@ -608,3 +608,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/tr.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/tr.lproj/Localizable.strings index 14d3b959..c2285f75 100644 --- a/IceCubesApp/Resources/Localization/tr.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/tr.lproj/Localizable.strings @@ -608,3 +608,4 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/uk.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/uk.lproj/Localizable.strings index cc03f250..cae02ef3 100644 --- a/IceCubesApp/Resources/Localization/uk.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/uk.lproj/Localizable.strings @@ -609,4 +609,5 @@ "add-tag-groups.edit.icon.field" = "Tag Group Icon (SFSymbol name)"; "add-tag-groups.edit.tags" = "Add tags to the group"; "add-tag-groups.edit.tags.add" = "Tag"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/zh-Hans.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/zh-Hans.lproj/Localizable.strings index 25566bc6..25ccafbb 100644 --- a/IceCubesApp/Resources/Localization/zh-Hans.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/zh-Hans.lproj/Localizable.strings @@ -610,3 +610,4 @@ "add-tag-groups.edit.icon.field" = "标签组图标(SFSymbol)"; "add-tag-groups.edit.tags" = "将标签添加到组"; "add-tag-groups.edit.tags.add" = "标签"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/IceCubesApp/Resources/Localization/zh-Hant.lproj/Localizable.strings b/IceCubesApp/Resources/Localization/zh-Hant.lproj/Localizable.strings index 98a508cb..35531a75 100644 --- a/IceCubesApp/Resources/Localization/zh-Hant.lproj/Localizable.strings +++ b/IceCubesApp/Resources/Localization/zh-Hant.lproj/Localizable.strings @@ -610,3 +610,4 @@ "add-tag-groups.edit.icon.field" = "標籤組圖示(SFSymbol 名稱)"; "add-tag-groups.edit.tags" = "把標籤加入標籤組"; "add-tag-groups.edit.tags.add" = "標籤"; +"tag-groups.edit.section.title" = "Add or remove tag from tag groups"; diff --git a/Packages/Timeline/Sources/Timeline/TimelineView.swift b/Packages/Timeline/Sources/Timeline/TimelineView.swift index 2b9898f2..c3603098 100644 --- a/Packages/Timeline/Sources/Timeline/TimelineView.swift +++ b/Packages/Timeline/Sources/Timeline/TimelineView.swift @@ -6,6 +6,7 @@ import Shimmer import Status import SwiftUI import SwiftUIIntrospect +import SwiftData @MainActor public struct TimelineView: View { @@ -25,6 +26,9 @@ public struct TimelineView: View { @Binding var timeline: TimelineFilter @Binding var selectedTagGroup: TagGroup? @Binding var scrollToTopSignal: Int + + @Query(sort: \TagGroup.creationDate, order: .reverse) var tagGroups: [TagGroup] + private let canFilterTimeline: Bool public init(timeline: Binding, @@ -88,40 +92,8 @@ public struct TimelineView: View { } } .toolbar { - ToolbarItem(placement: .principal) { - VStack(alignment: .center) { - switch timeline { - case let .remoteLocal(_, filter): - Text(filter.localizedTitle()) - .font(.headline) - Text(timeline.localizedTitle()) - .font(.caption) - .foregroundColor(.gray) - default: - Text(timeline.localizedTitle()) - .font(.headline) - } - } - .accessibilityRepresentation { - switch timeline { - case let .remoteLocal(_, filter): - if canFilterTimeline { - Menu(filter.localizedTitle()) {} - } else { - Text(filter.localizedTitle()) - } - default: - if canFilterTimeline { - Menu(timeline.localizedTitle()) {} - } else { - Text(timeline.localizedTitle()) - } - } - } - .accessibilityAddTraits(.isHeader) - .accessibilityRemoveTraits(.isButton) - .accessibilityRespondsToUserInteraction(canFilterTimeline) - } + toolbarTitleView + toolbarTagGroupButton } .navigationBarTitleDisplayMode(.inline) .onAppear { @@ -252,6 +224,73 @@ public struct TimelineView: View { bottom: 8, trailing: .layoutPadding)) } + + @ToolbarContentBuilder + private var toolbarTitleView: some ToolbarContent { + ToolbarItem(placement: .principal) { + VStack(alignment: .center) { + switch timeline { + case let .remoteLocal(_, filter): + Text(filter.localizedTitle()) + .font(.headline) + Text(timeline.localizedTitle()) + .font(.caption) + .foregroundColor(.gray) + default: + Text(timeline.localizedTitle()) + .font(.headline) + } + } + .accessibilityRepresentation { + switch timeline { + case let .remoteLocal(_, filter): + if canFilterTimeline { + Menu(filter.localizedTitle()) {} + } else { + Text(filter.localizedTitle()) + } + default: + if canFilterTimeline { + Menu(timeline.localizedTitle()) {} + } else { + Text(timeline.localizedTitle()) + } + } + } + .accessibilityAddTraits(.isHeader) + .accessibilityRemoveTraits(.isButton) + .accessibilityRespondsToUserInteraction(canFilterTimeline) + } + } + + @ToolbarContentBuilder + private var toolbarTagGroupButton: some ToolbarContent { + ToolbarItem(placement: .topBarTrailing) { + switch timeline { + case let .hashtag(tag, _): + Menu { + Section("tag-groups.edit.section.title") { + ForEach(tagGroups) { group in + Button { + if group.tags.contains(tag) { + group.tags.removeAll(where: { $0 == tag }) + } else { + group.tags.append(tag) + } + } label: { + Label(group.title, + systemImage: group.tags.contains(tag) ? "checkmark.rectangle.fill" : "checkmark.rectangle") + } + } + } + } label: { + Image(systemName: "ellipsis") + } + default: + EmptyView() + } + } + } private var scrollToTopView: some View { ScrollToView()