|
@@ -140,6 +140,8 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
|
|
|
|
|
private var currentSidebarItems: [SidebarItem] = []
|
|
private var currentSidebarItems: [SidebarItem] = []
|
|
|
private var selectedSidebarIndex: Int = 0
|
|
private var selectedSidebarIndex: Int = 0
|
|
|
|
|
+ /// When true, the **Indeed** sidebar row is highlighted instead of `selectedSidebarIndex`.
|
|
|
|
|
+ private var isIndeedSidebarSelected = false
|
|
|
/// All jobs that have been shown in the current chat session, oldest first. Used to deduplicate continuation searches so "show more" doesn't re-display the same listings.
|
|
/// All jobs that have been shown in the current chat session, oldest first. Used to deduplicate continuation searches so "show more" doesn't re-display the same listings.
|
|
|
private var lastSearchResults: [JobListing] = []
|
|
private var lastSearchResults: [JobListing] = []
|
|
|
/// "Show more jobs" row under the latest assistant message that listed jobs; removed when a newer listing block replaces it.
|
|
/// "Show more jobs" row under the latest assistant message that listed jobs; removed when a newer listing block replaces it.
|
|
@@ -952,6 +954,15 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
|
|
|
|
|
private static let externalIndeedAppURLSchemes = ["indeed://", "indeedjobs://"]
|
|
private static let externalIndeedAppURLSchemes = ["indeed://", "indeedjobs://"]
|
|
|
|
|
|
|
|
|
|
+ private func selectIndeedSidebar() {
|
|
|
|
|
+ isIndeedSidebarSelected = true
|
|
|
|
|
+ if !isIndeedJobBrowserPresented {
|
|
|
|
|
+ openIndeedFromSidebar()
|
|
|
|
|
+ }
|
|
|
|
|
+ configureSidebar()
|
|
|
|
|
+ updateMainContentVisibility()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/// Opens the installed Indeed app when a handler is registered; otherwise loads Indeed in the embedded browser.
|
|
/// Opens the installed Indeed app when a handler is registered; otherwise loads Indeed in the embedded browser.
|
|
|
private func openIndeedFromSidebar() {
|
|
private func openIndeedFromSidebar() {
|
|
|
for scheme in Self.externalIndeedAppURLSchemes {
|
|
for scheme in Self.externalIndeedAppURLSchemes {
|
|
@@ -983,6 +994,10 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
private func dismissIndeedJobBrowserEmbedded() {
|
|
private func dismissIndeedJobBrowserEmbedded() {
|
|
|
guard isIndeedJobBrowserPresented else { return }
|
|
guard isIndeedJobBrowserPresented else { return }
|
|
|
isIndeedJobBrowserPresented = false
|
|
isIndeedJobBrowserPresented = false
|
|
|
|
|
+ if isIndeedSidebarSelected {
|
|
|
|
|
+ isIndeedSidebarSelected = false
|
|
|
|
|
+ configureSidebar()
|
|
|
|
|
+ }
|
|
|
updateMainContentVisibility()
|
|
updateMainContentVisibility()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -2397,16 +2412,19 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private func addIndeedSidebarLaunchRow() {
|
|
private func addIndeedSidebarLaunchRow() {
|
|
|
|
|
+ let isSelected = isIndeedSidebarSelected
|
|
|
|
|
+
|
|
|
let rowHost = SidebarNavRowView { [weak self] in
|
|
let rowHost = SidebarNavRowView { [weak self] in
|
|
|
- self?.openIndeedFromSidebar()
|
|
|
|
|
|
|
+ self?.selectIndeedSidebar()
|
|
|
}
|
|
}
|
|
|
rowHost.translatesAutoresizingMaskIntoConstraints = false
|
|
rowHost.translatesAutoresizingMaskIntoConstraints = false
|
|
|
rowHost.wantsLayer = true
|
|
rowHost.wantsLayer = true
|
|
|
rowHost.layer?.cornerRadius = 8
|
|
rowHost.layer?.cornerRadius = 8
|
|
|
- rowHost.restingBackgroundColor = nil
|
|
|
|
|
- rowHost.hoverBackgroundColor = Theme.sidebarRowHoverFill
|
|
|
|
|
|
|
+ rowHost.restingBackgroundColor = isSelected ? Theme.selectionFill : nil
|
|
|
|
|
+ rowHost.hoverBackgroundColor = isSelected ? Theme.selectionFillHover : Theme.sidebarRowHoverFill
|
|
|
rowHost.setAccessibilityLabel("Indeed")
|
|
rowHost.setAccessibilityLabel("Indeed")
|
|
|
rowHost.setAccessibilityRole(.button)
|
|
rowHost.setAccessibilityRole(.button)
|
|
|
|
|
+ rowHost.setAccessibilitySelected(isSelected)
|
|
|
rowHost.setAccessibilityHelp("Open Indeed to search and apply for jobs")
|
|
rowHost.setAccessibilityHelp("Open Indeed to search and apply for jobs")
|
|
|
|
|
|
|
|
let row = NSStackView()
|
|
let row = NSStackView()
|
|
@@ -2420,7 +2438,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
|
|
|
|
|
let text = NSTextField(labelWithString: "Indeed")
|
|
let text = NSTextField(labelWithString: "Indeed")
|
|
|
text.font = .systemFont(ofSize: 14, weight: .medium)
|
|
text.font = .systemFont(ofSize: 14, weight: .medium)
|
|
|
- text.textColor = Theme.secondaryText
|
|
|
|
|
|
|
+ text.textColor = isSelected ? Theme.brandBlue : Theme.secondaryText
|
|
|
text.refusesFirstResponder = true
|
|
text.refusesFirstResponder = true
|
|
|
|
|
|
|
|
row.addArrangedSubview(logo)
|
|
row.addArrangedSubview(logo)
|
|
@@ -2468,7 +2486,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
addIndeedSidebarLaunchRow()
|
|
addIndeedSidebarLaunchRow()
|
|
|
|
|
|
|
|
items.enumerated().forEach { index, item in
|
|
items.enumerated().forEach { index, item in
|
|
|
- let isSelected = index == selectedSidebarIndex
|
|
|
|
|
|
|
+ let isSelected = index == selectedSidebarIndex && !isIndeedSidebarSelected
|
|
|
|
|
|
|
|
let rowHost = SidebarNavRowView { [weak self] in
|
|
let rowHost = SidebarNavRowView { [weak self] in
|
|
|
self?.selectSidebarItem(at: index)
|
|
self?.selectSidebarItem(at: index)
|
|
@@ -2656,10 +2674,12 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private func selectSidebarItem(at index: Int) {
|
|
private func selectSidebarItem(at index: Int) {
|
|
|
|
|
+ let leavingIndeedSelection = isIndeedSidebarSelected
|
|
|
|
|
+ isIndeedSidebarSelected = false
|
|
|
dismissIndeedJobBrowserEmbedded()
|
|
dismissIndeedJobBrowserEmbedded()
|
|
|
guard index >= 0, index < currentSidebarItems.count else { return }
|
|
guard index >= 0, index < currentSidebarItems.count else { return }
|
|
|
let selectingHome = isHomeSidebarIndex(index)
|
|
let selectingHome = isHomeSidebarIndex(index)
|
|
|
- if index == selectedSidebarIndex {
|
|
|
|
|
|
|
+ if index == selectedSidebarIndex, !leavingIndeedSelection {
|
|
|
if selectingHome {
|
|
if selectingHome {
|
|
|
applyHomeState()
|
|
applyHomeState()
|
|
|
}
|
|
}
|