Skip to content

Commit

Permalink
fix(hierarchical): deselect item (#236)
Browse files Browse the repository at this point in the history
* implement hierarchical deselection
  • Loading branch information
VladislavFitz committed Jul 25, 2022
1 parent 53bdc1d commit 804ca2b
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,11 @@ class HierarchicalDemoController {
let clearFilterConnector: FilterClearConnector
let hierarchicalConnector: HierarchicalConnector

struct HierarchicalCategory {
static var base: Attribute = "hierarchicalCategories"
static var lvl0: Attribute { "\(base).lvl0" }
static var lvl1: Attribute { "\(base).lvl1" }
static var lvl2: Attribute { "\(base).lvl2" }
}

let order = [
HierarchicalCategory.lvl0,
HierarchicalCategory.lvl1,
HierarchicalCategory.lvl2
]
let hierarchicalAttributes: [Attribute] = [
"lvl0",
"lvl1",
"lvl2"
].map { "hierarchicalCategories.\($0)" }

init<Controller: HierarchicalController>(controller: Controller) where Controller.Item == [HierarchicalFacet] {
searcher = HitsSearcher(client: .instantSearch,
Expand All @@ -36,7 +29,7 @@ class HierarchicalDemoController {
clearFilterConnector = .init(filterState: filterState)
hierarchicalConnector = .init(searcher: searcher,
filterState: filterState,
hierarchicalAttributes: order,
hierarchicalAttributes: hierarchicalAttributes,
separator: " > ",
controller: controller,
presenter: DefaultPresenter.Hierarchical.present)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,20 @@ public extension HierarchicalInteractor {

filterState[hierarchical: groupName].set(interactor.hierarchicalAttributes)

interactor.onSelectionsComputed.subscribePast(with: filterState) { [weak interactor] filterState, selections in
interactor.onSelectionsComputed.subscribePast(with: filterState) { [weak interactor] filterState, hierarchicalPath in

interactor?.selections = selections.map { $0.value.description }
interactor?.selections = hierarchicalPath.map { $0.value.description }

filterState[hierarchical: groupName].removeAll()

guard let lastSelectedFilter = selections.last else {
filterState[hierarchical: groupName].set([Filter.Facet]())
return
if let lastSelectedFilter = hierarchicalPath.last {
filterState[hierarchical: groupName].add(lastSelectedFilter)
filterState[hierarchical: groupName].set(hierarchicalPath)
} else {
let emptyFiltersList: [Filter.Facet] = []
filterState[hierarchical: groupName].set(emptyFiltersList)
}

filterState[hierarchical: groupName].add(lastSelectedFilter)
filterState[hierarchical: groupName].set(selections)
filterState.notifyChange()

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,11 @@ public class HierarchicalInteractor: ItemInteractor<[[Facet]]> {
}

public func computeSelection(key: String) {
let selections = key.subPaths(withSeparator: separator)
let hierarchicalPath = zip(hierarchicalAttributes, selections).map { Filter.Facet(attribute: $0, stringValue: $1) }
let selections = key.subpaths(withSeparator: separator)
var hierarchicalPath = zip(hierarchicalAttributes, selections).map { Filter.Facet(attribute: $0, stringValue: $1) }
if self.selections == selections {
hierarchicalPath.removeLast()
}
onSelectionsComputed.fire(hierarchicalPath)
}
}
Expand All @@ -59,7 +62,12 @@ public enum Hierarchical {}

extension String {

func subPaths(withSeparator separator: String) -> [String] {
/** Build a list of all subpaths for a path with a provided separator
Example:
- input: Clothing > Women > Bags
- output: ["Clothing", "Clothing > Women". "Clothing > Women > Bags"]
*/
func subpaths(withSeparator separator: String) -> [String] {
return components(separatedBy: separator).reduce([]) { (paths, component) in
let newPath = paths.last.flatMap { $0 + separator + component } ?? component
return paths + [newPath]
Expand Down

0 comments on commit 804ca2b

Please sign in to comment.