@@ -12,47 +12,50 @@ import SwiftUI
12
12
13
13
/// A view presenting the list of hierarchical facets
14
14
@available ( iOS 13 . 0 , OSX 10 . 15 , tvOS 13 . 0 , watchOS 6 . 0 , * )
15
- public struct HierarchicalList : View {
15
+ public struct HierarchicalList < Row : View , NoResults : View > : View {
16
16
17
- @ObservedObject var hierarchicalController : HierarchicalObservableController
17
+ @ObservedObject public var hierarchicalObservableController : HierarchicalObservableController
18
+
19
+ /// Closure constructing a hierarchical facet row view
20
+ public var row : ( Facet , Int , Bool ) -> Row
21
+
22
+ /// Closure constructing a no results view
23
+ public var noResults : ( ( ) -> NoResults ) ?
24
+
25
+ public init ( _ hierarchicalObservableController: HierarchicalObservableController ,
26
+ @ViewBuilder row: @escaping ( Facet , Int , Bool ) -> Row ,
27
+ @ViewBuilder noResults: @escaping ( ) -> NoResults ) {
28
+ self . hierarchicalObservableController = hierarchicalObservableController
29
+ self . row = row
30
+ self . noResults = noResults
31
+ }
18
32
19
33
public var body : some View {
20
- VStack ( alignment: . leading, spacing: 5 ) {
21
- ForEach ( hierarchicalController. items. prefix ( 20 ) , id: \. facet) { item in
22
- let ( _, level, isSelected) = item
23
- let facet = self . facet ( from: item)
24
- HStack ( spacing: 10 ) {
25
- Image ( systemName: isSelected ? " chevron.down " : " chevron.right " )
26
- . font ( . callout)
27
- Text ( " \( facet. value) ( \( facet. count) ) " )
28
- . fontWeight ( isSelected ? . semibold : . regular)
29
- }
30
- . padding ( . leading, CGFloat ( level * 15 ) )
31
- . onTapGesture {
32
- hierarchicalController. toggle ( item. facet. value)
34
+ if let noResults = noResults ? ( ) , hierarchicalObservableController. hierarchicalFacets. isEmpty {
35
+ noResults
36
+ } else {
37
+ VStack {
38
+ ForEach ( hierarchicalObservableController. hierarchicalFacets, id: \. facet) { hierarchicalFacet in
39
+ let ( facet, level, isSelected) = hierarchicalFacet
40
+ row ( facet, level, isSelected)
41
+ . onTapGesture {
42
+ hierarchicalObservableController. toggle ( facet. value)
43
+ }
33
44
}
34
45
}
35
46
}
36
47
}
37
48
38
- private func maxSelectedLevel( _ hierarchicalFacets: [ HierarchicalFacet ] ) -> Int ? {
39
- return hierarchicalFacets
40
- . filter { $0. isSelected }
41
- . max { $0. level < $1. level } ?
42
- . level
43
- }
49
+ }
44
50
45
- private func facet( from hierarchicalFacet: HierarchicalFacet ) -> Facet {
46
- let value = hierarchicalFacet
47
- . facet
48
- . value
49
- . split ( separator: " > " )
50
- . map { $0. trimmingCharacters ( in: . whitespaces) } [ hierarchicalFacet. level]
51
- return Facet ( value: value, count: hierarchicalFacet. facet. count, highlighted: nil )
52
- }
51
+ @available ( iOS 13 . 0 , OSX 10 . 15 , tvOS 13 . 0 , watchOS 6 . 0 , * )
52
+ public extension HierarchicalList where NoResults == Never {
53
53
54
- public init ( hierarchicalController: HierarchicalObservableController ) {
55
- self . hierarchicalController = hierarchicalController
54
+ init ( _ hierarchicalObservableController: HierarchicalObservableController ,
55
+ @ViewBuilder row: @escaping ( Facet , Int , Bool ) -> Row ) {
56
+ self . hierarchicalObservableController = hierarchicalObservableController
57
+ self . row = row
58
+ self . noResults = nil
56
59
}
57
60
58
61
}
@@ -61,23 +64,28 @@ public struct HierarchicalList: View {
61
64
struct HierarchicalListPreview : PreviewProvider {
62
65
63
66
static var previews : some View {
64
- let controller : HierarchicalObservableController = . init( )
65
- HierarchicalList ( hierarchicalController: controller)
66
- . onAppear {
67
- controller. setItem ( [
68
- ( Facet ( value: " Category1 " , count: 10 ) , 0 , false ) ,
69
- ( Facet ( value: " Category1 > Category1-1 " , count: 7 ) , 1 , false ) ,
70
- ( Facet ( value: " Category1 > Category1-2 " , count: 2 ) , 1 , false ) ,
71
- ( Facet ( value: " Category1 > Category1-3 " , count: 1 ) , 1 , false ) ,
72
- ( Facet ( value: " Category2 " , count: 14 ) , 0 , true ) ,
73
- ( Facet ( value: " Category2 > Category2-1 " , count: 8 ) , 1 , false ) ,
74
- ( Facet ( value: " Category2 > Category2-2 " , count: 4 ) , 1 , true ) ,
75
- ( Facet ( value: " Category2 > Category2-2 > Category2-2-1 " , count: 2 ) , 2 , false ) ,
76
- ( Facet ( value: " Category2 > Category2-2 > Category2-2-2 " , count: 2 ) , 2 , true ) ,
77
- ( Facet ( value: " Category2 > Category2-3 " , count: 2 ) , 1 , false )
78
- ] )
79
- }
67
+ let demoController : HierarchicalObservableController = . init( )
68
+ HierarchicalList ( demoController) { facet, nestingLevel, isSelected in
69
+ HierarchicalFacetRow ( facet: facet,
70
+ nestingLevel: nestingLevel,
71
+ isSelected: isSelected)
72
+ }
73
+ . onAppear {
74
+ demoController. setItem ( [
75
+ ( Facet ( value: " Category1 " , count: 10 ) , 0 , false ) ,
76
+ ( Facet ( value: " Category1 > Category1-1 " , count: 7 ) , 1 , false ) ,
77
+ ( Facet ( value: " Category1 > Category1-2 " , count: 2 ) , 1 , false ) ,
78
+ ( Facet ( value: " Category1 > Category1-3 " , count: 1 ) , 1 , false ) ,
79
+ ( Facet ( value: " Category2 " , count: 14 ) , 0 , true ) ,
80
+ ( Facet ( value: " Category2 > Category2-1 " , count: 8 ) , 1 , false ) ,
81
+ ( Facet ( value: " Category2 > Category2-2 " , count: 4 ) , 1 , true ) ,
82
+ ( Facet ( value: " Category2 > Category2-2 > Category2-2-1 " , count: 2 ) , 2 , false ) ,
83
+ ( Facet ( value: " Category2 > Category2-2 > Category2-2-2 " , count: 2 ) , 2 , true ) ,
84
+ ( Facet ( value: " Category2 > Category2-3 " , count: 2 ) , 1 , false )
85
+ ] )
86
+ }
80
87
}
81
88
82
89
}
90
+
83
91
#endif
0 commit comments