|
@@ -7109,6 +7109,15 @@ class ViewController: NSViewController {
|
|
|
filterBar.spacing = 10
|
|
filterBar.spacing = 10
|
|
|
filterBar.alignment = .centerY
|
|
filterBar.alignment = .centerY
|
|
|
filterBar.translatesAutoresizingMaskIntoConstraints = false
|
|
filterBar.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
+ configureResponsiveMeetingsStyleFilterRow(
|
|
|
|
|
+ filterRow: filterBar,
|
|
|
|
|
+ categoryFilter: categoryFilter,
|
|
|
|
|
+ fromDatePicker: fromDatePicker,
|
|
|
|
|
+ toDatePicker: toDatePicker,
|
|
|
|
|
+ applyFiltersButton: applyFiltersButton,
|
|
|
|
|
+ resetFiltersButton: resetFiltersButton,
|
|
|
|
|
+ refreshButton: refreshButton
|
|
|
|
|
+ )
|
|
|
container.addSubview(filterBar)
|
|
container.addSubview(filterBar)
|
|
|
|
|
|
|
|
// Hint text below filters (recording help — not Zoom API status).
|
|
// Hint text below filters (recording help — not Zoom API status).
|
|
@@ -7189,16 +7198,6 @@ class ViewController: NSViewController {
|
|
|
filterBar.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 18),
|
|
filterBar.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 18),
|
|
|
filterBar.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -18),
|
|
filterBar.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -18),
|
|
|
|
|
|
|
|
- categoryFilter.widthAnchor.constraint(equalToConstant: 170),
|
|
|
|
|
- fromDatePicker.widthAnchor.constraint(equalToConstant: 170),
|
|
|
|
|
- toDatePicker.widthAnchor.constraint(equalToConstant: 170),
|
|
|
|
|
- applyFiltersButton.widthAnchor.constraint(equalToConstant: 96),
|
|
|
|
|
- resetFiltersButton.widthAnchor.constraint(equalToConstant: 96),
|
|
|
|
|
- refreshButton.widthAnchor.constraint(equalToConstant: 44),
|
|
|
|
|
- applyFiltersButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
- resetFiltersButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
- refreshButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
-
|
|
|
|
|
status.topAnchor.constraint(equalTo: filterBar.bottomAnchor, constant: 12),
|
|
status.topAnchor.constraint(equalTo: filterBar.bottomAnchor, constant: 12),
|
|
|
status.leadingAnchor.constraint(equalTo: filterBar.leadingAnchor),
|
|
status.leadingAnchor.constraint(equalTo: filterBar.leadingAnchor),
|
|
|
status.trailingAnchor.constraint(equalTo: filterBar.trailingAnchor),
|
|
status.trailingAnchor.constraint(equalTo: filterBar.trailingAnchor),
|
|
@@ -8472,6 +8471,54 @@ class ViewController: NSViewController {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// Meetings + Ai Companion filter rows: preset + dates stay near intrinsic width; flexible gap before Apply/Reset/Refresh.
|
|
|
|
|
+ private func configureResponsiveMeetingsStyleFilterRow(
|
|
|
|
|
+ filterRow: NSStackView,
|
|
|
|
|
+ categoryFilter: NSPopUpButton,
|
|
|
|
|
+ fromDatePicker: NSDatePicker,
|
|
|
|
|
+ toDatePicker: NSDatePicker,
|
|
|
|
|
+ applyFiltersButton: NSButton,
|
|
|
|
|
+ resetFiltersButton: NSButton,
|
|
|
|
|
+ refreshButton: NSButton
|
|
|
|
|
+ ) {
|
|
|
|
|
+ filterRow.distribution = .fill
|
|
|
|
|
+ filterRow.setContentHuggingPriority(.defaultLow, for: .horizontal)
|
|
|
|
|
+
|
|
|
|
|
+ let spacer = NSView()
|
|
|
|
|
+ spacer.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
+ spacer.setContentHuggingPriority(.defaultLow, for: .horizontal)
|
|
|
|
|
+ spacer.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
|
|
|
|
|
+ filterRow.insertArrangedSubview(spacer, at: 3)
|
|
|
|
|
+
|
|
|
|
|
+ categoryFilter.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+ categoryFilter.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+
|
|
|
|
|
+ fromDatePicker.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+ fromDatePicker.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+ toDatePicker.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+ toDatePicker.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+
|
|
|
|
|
+ applyFiltersButton.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+ applyFiltersButton.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
|
|
|
+ resetFiltersButton.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
|
|
|
|
+ resetFiltersButton.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
|
|
|
+ refreshButton.setContentHuggingPriority(.required, for: .horizontal)
|
|
|
|
|
+ refreshButton.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
|
|
|
+
|
|
|
|
|
+ NSLayoutConstraint.activate([
|
|
|
|
|
+ categoryFilter.widthAnchor.constraint(greaterThanOrEqualToConstant: 120),
|
|
|
|
|
+ fromDatePicker.widthAnchor.constraint(greaterThanOrEqualToConstant: 170),
|
|
|
|
|
+ toDatePicker.widthAnchor.constraint(greaterThanOrEqualToConstant: 170),
|
|
|
|
|
+ fromDatePicker.widthAnchor.constraint(equalTo: toDatePicker.widthAnchor),
|
|
|
|
|
+ applyFiltersButton.widthAnchor.constraint(greaterThanOrEqualToConstant: 76),
|
|
|
|
|
+ resetFiltersButton.widthAnchor.constraint(greaterThanOrEqualToConstant: 76),
|
|
|
|
|
+ refreshButton.widthAnchor.constraint(equalToConstant: 44),
|
|
|
|
|
+ applyFiltersButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
+ resetFiltersButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
+ refreshButton.heightAnchor.constraint(equalToConstant: 34)
|
|
|
|
|
+ ])
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private func makeMeetingsPageView() -> NSView {
|
|
private func makeMeetingsPageView() -> NSView {
|
|
|
let root = NSView()
|
|
let root = NSView()
|
|
|
root.wantsLayer = true
|
|
root.wantsLayer = true
|
|
@@ -8558,6 +8605,15 @@ class ViewController: NSViewController {
|
|
|
filterRow.spacing = 10
|
|
filterRow.spacing = 10
|
|
|
filterRow.alignment = .centerY
|
|
filterRow.alignment = .centerY
|
|
|
filterRow.translatesAutoresizingMaskIntoConstraints = false
|
|
filterRow.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
+ configureResponsiveMeetingsStyleFilterRow(
|
|
|
|
|
+ filterRow: filterRow,
|
|
|
|
|
+ categoryFilter: categoryFilter,
|
|
|
|
|
+ fromDatePicker: fromDatePicker,
|
|
|
|
|
+ toDatePicker: toDatePicker,
|
|
|
|
|
+ applyFiltersButton: applyFiltersButton,
|
|
|
|
|
+ resetFiltersButton: resetFiltersButton,
|
|
|
|
|
+ refreshButton: refreshButton
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
let statusLabel = makeLabel("Showing 0 meetings", size: 12, color: secondaryText, weight: .medium, centered: false)
|
|
let statusLabel = makeLabel("Showing 0 meetings", size: 12, color: secondaryText, weight: .medium, centered: false)
|
|
|
statusLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
statusLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
@@ -8613,16 +8669,6 @@ class ViewController: NSViewController {
|
|
|
filterRow.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 18),
|
|
filterRow.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 18),
|
|
|
filterRow.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -18),
|
|
filterRow.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -18),
|
|
|
|
|
|
|
|
- categoryFilter.widthAnchor.constraint(equalToConstant: 170),
|
|
|
|
|
- fromDatePicker.widthAnchor.constraint(equalToConstant: 170),
|
|
|
|
|
- toDatePicker.widthAnchor.constraint(equalToConstant: 170),
|
|
|
|
|
- applyFiltersButton.widthAnchor.constraint(equalToConstant: 96),
|
|
|
|
|
- resetFiltersButton.widthAnchor.constraint(equalToConstant: 96),
|
|
|
|
|
- refreshButton.widthAnchor.constraint(equalToConstant: 44),
|
|
|
|
|
- applyFiltersButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
- resetFiltersButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
- refreshButton.heightAnchor.constraint(equalToConstant: 34),
|
|
|
|
|
-
|
|
|
|
|
statusLabel.topAnchor.constraint(equalTo: filterRow.bottomAnchor, constant: 12),
|
|
statusLabel.topAnchor.constraint(equalTo: filterRow.bottomAnchor, constant: 12),
|
|
|
statusLabel.leadingAnchor.constraint(equalTo: filterRow.leadingAnchor),
|
|
statusLabel.leadingAnchor.constraint(equalTo: filterRow.leadingAnchor),
|
|
|
statusLabel.trailingAnchor.constraint(equalTo: filterRow.trailingAnchor),
|
|
statusLabel.trailingAnchor.constraint(equalTo: filterRow.trailingAnchor),
|