Fix hit testing on labels, fix initially selected labels in edit labels view

This commit is contained in:
Jackson Harper 2023-01-23 14:03:46 +08:00
parent 57289cb0c4
commit 461087513b
5 changed files with 51 additions and 45 deletions

View file

@ -66,7 +66,7 @@ struct ApplyLabelsView: View {
},
label: {
HStack {
TextChip(feedItemLabel: label)
TextChip(feedItemLabel: label).allowsHitTesting(false)
Spacer()
if isSelected(label) {
Image(systemName: "checkmark")
@ -81,31 +81,32 @@ struct ApplyLabelsView: View {
}
createLabelButton
}
Spacer()
}
.listStyle(PlainListStyle())
.navigationTitle(mode.navTitle)
#if os(iOS)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
cancelButton
}
ToolbarItem(placement: .navigationBarTrailing) {
saveItemChangesButton
}
Spacer()
}
.navigationTitle(mode.navTitle)
#if os(iOS)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
cancelButton
}
#else
.toolbar {
ToolbarItemGroup {
cancelButton
saveItemChangesButton
}
ToolbarItem(placement: .navigationBarTrailing) {
saveItemChangesButton
}
#endif
.sheet(isPresented: $viewModel.showCreateLabelModal) {
CreateLabelView(viewModel: viewModel, newLabelName: viewModel.labelSearchFilter)
}
#else
.toolbar {
ToolbarItemGroup {
cancelButton
saveItemChangesButton
}
}
#endif
.sheet(isPresented: $viewModel.showCreateLabelModal) {
CreateLabelView(viewModel: viewModel, newLabelName: viewModel.labelSearchFilter)
}
}

View file

@ -23,30 +23,31 @@ struct FilterByLabelsView: View {
var innerBody: some View {
List {
ForEach(viewModel.labels.applySearchFilter(viewModel.labelSearchFilter), id: \.self) { label in
HStack {
TextChip(feedItemLabel: label, negated: isNegated(label))
Spacer()
Button(action: {
Button(
action: {
if isSelected(label) {
viewModel.negatedLabels.append(label)
viewModel.selectedLabels.removeAll(where: { $0.id == label.id })
} else if isNegated(label) {
viewModel.negatedLabels.removeAll(where: { $0.id == label.id })
} else {
viewModel.selectedLabels.append(label)
}
}, label: {
if isNegated(label) {
Image(systemName: "circle.slash")
},
label: {
HStack {
TextChip(feedItemLabel: label).allowsHitTesting(false)
Spacer()
if isSelected(label) {
Image(systemName: "checkmark")
}
}
if isSelected(label) {
Image(systemName: "checkmark")
}
})
}
}
)
.padding(.vertical, 5)
#if os(macOS)
.buttonStyle(PlainButtonStyle())
#endif
}
}
.listStyle(.plain)
.listStyle(PlainListStyle())
.navigationTitle("Filter by Label")
#if os(iOS)
.navigationBarTitleDisplayMode(.inline)

View file

@ -63,7 +63,7 @@ struct LabelsView: View {
Section(header: Text(LocalText.labelsGeneric)) {
ForEach(viewModel.labels, id: \.id) { label in
HStack {
TextChip(feedItemLabel: label)
TextChip(feedItemLabel: label).allowsHitTesting(false)
Spacer()
Button(
action: {

View file

@ -28,6 +28,14 @@ import Views
isLoading = true
await loadLabelsFromStore(dataService: dataService)
let selLabels = initiallySelectedLabels ?? item?.sortedLabels ?? []
for label in labels {
if selLabels.contains(label) {
selectedLabels.append(label)
} else {
unselectedLabels.append(label)
}
}
Task.detached(priority: .userInitiated) {
if let labelIDs = try? await dataService.labels() {
@ -80,12 +88,8 @@ import Views
try? fetchRequest.execute()
}
if fetchedLabels?.count == 0 {
await fetchLabelsFromNetwork(dataService: dataService)
} else {
setLabels(fetchedLabels ?? [])
unselectedLabels = fetchedLabels ?? []
}
setLabels(fetchedLabels ?? [])
unselectedLabels = fetchedLabels ?? []
}
func fetchLabelsFromNetwork(dataService: DataService) async {

View file

@ -181,7 +181,7 @@ struct WebReaderContainerView: View {
}
func menuItems(for item: LinkedItem) -> some View {
let hasLabels = item.labels?.count == 0
let hasLabels = item.labels?.count != 0
return Group {
Button(
action: { showHighlightsView = true },