|
|
@@ -3084,6 +3084,8 @@ private extension ViewController {
|
|
3084
|
3084
|
titleRowSpacer.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
|
|
3085
|
3085
|
|
|
3086
|
3086
|
titleRow.addArrangedSubview(titleLabel)
|
|
|
3087
|
+ titleRow.addArrangedSubview(makeSchedulePageAddButton())
|
|
|
3088
|
+ titleRow.setCustomSpacing(12, after: titleLabel)
|
|
3087
|
3089
|
titleRow.addArrangedSubview(titleRowSpacer)
|
|
3088
|
3090
|
container.addArrangedSubview(titleRow)
|
|
3089
|
3091
|
|
|
|
@@ -3428,6 +3430,40 @@ private extension ViewController {
|
|
3428
|
3430
|
return button
|
|
3429
|
3431
|
}
|
|
3430
|
3432
|
|
|
|
3433
|
+ private func makeSchedulePageAddButton() -> NSButton {
|
|
|
3434
|
+ let diameter: CGFloat = 30
|
|
|
3435
|
+ let button = HoverButton(title: "", target: self, action: #selector(schedulePageAddMeetingPressed(_:)))
|
|
|
3436
|
+ button.translatesAutoresizingMaskIntoConstraints = false
|
|
|
3437
|
+ button.isBordered = false
|
|
|
3438
|
+ button.bezelStyle = .regularSquare
|
|
|
3439
|
+ button.wantsLayer = true
|
|
|
3440
|
+ button.layer?.cornerRadius = diameter / 2
|
|
|
3441
|
+ button.layer?.masksToBounds = true
|
|
|
3442
|
+ button.layer?.backgroundColor = palette.inputBackground.cgColor
|
|
|
3443
|
+ button.layer?.borderColor = palette.inputBorder.cgColor
|
|
|
3444
|
+ button.layer?.borderWidth = 1
|
|
|
3445
|
+ button.setButtonType(.momentaryChange)
|
|
|
3446
|
+ button.contentTintColor = palette.textSecondary
|
|
|
3447
|
+ button.image = NSImage(systemSymbolName: "plus", accessibilityDescription: "Schedule meeting")
|
|
|
3448
|
+ button.symbolConfiguration = NSImage.SymbolConfiguration(pointSize: 14, weight: .semibold)
|
|
|
3449
|
+ button.imagePosition = .imageOnly
|
|
|
3450
|
+ button.imageScaling = .scaleProportionallyDown
|
|
|
3451
|
+ button.focusRingType = .none
|
|
|
3452
|
+ button.heightAnchor.constraint(equalToConstant: diameter).isActive = true
|
|
|
3453
|
+ button.widthAnchor.constraint(equalToConstant: diameter).isActive = true
|
|
|
3454
|
+ let baseColor = palette.inputBackground
|
|
|
3455
|
+ let baseBorder = palette.inputBorder
|
|
|
3456
|
+ let hoverBlend = darkModeEnabled ? NSColor.white : NSColor.black
|
|
|
3457
|
+ let hoverColor = baseColor.blended(withFraction: 0.10, of: hoverBlend) ?? baseColor
|
|
|
3458
|
+ let hoverBorder = baseBorder.blended(withFraction: 0.16, of: hoverBlend) ?? baseBorder
|
|
|
3459
|
+ button.onHoverChanged = { [weak button] hovering in
|
|
|
3460
|
+ button?.layer?.backgroundColor = (hovering ? hoverColor : baseColor).cgColor
|
|
|
3461
|
+ button?.layer?.borderColor = (hovering ? hoverBorder : baseBorder).cgColor
|
|
|
3462
|
+ }
|
|
|
3463
|
+ button.onHoverChanged?(false)
|
|
|
3464
|
+ return button
|
|
|
3465
|
+ }
|
|
|
3466
|
+
|
|
3431
|
3467
|
private func makeScheduleRefreshButton() -> NSButton {
|
|
3432
|
3468
|
let diameter: CGFloat = 30
|
|
3433
|
3469
|
let button = HoverButton(title: "", target: self, action: #selector(scheduleReloadButtonPressed(_:)))
|
|
|
@@ -5606,6 +5642,33 @@ private extension ViewController {
|
|
5606
|
5642
|
applySchedulePageFiltersAndRender()
|
|
5607
|
5643
|
}
|
|
5608
|
5644
|
|
|
|
5645
|
+ @objc func schedulePageAddMeetingPressed(_ sender: NSButton) {
|
|
|
5646
|
+ guard requireGoogleLoginForCalendarScheduling() else { return }
|
|
|
5647
|
+
|
|
|
5648
|
+ let accessory = NSView(frame: NSRect(x: 0, y: 0, width: 230, height: 28))
|
|
|
5649
|
+
|
|
|
5650
|
+ let datePicker = NSDatePicker(frame: accessory.bounds)
|
|
|
5651
|
+ datePicker.autoresizingMask = [.width, .height]
|
|
|
5652
|
+ datePicker.datePickerMode = .single
|
|
|
5653
|
+ datePicker.datePickerStyle = .textFieldAndStepper
|
|
|
5654
|
+ datePicker.datePickerElements = [.yearMonthDay]
|
|
|
5655
|
+ datePicker.dateValue = Calendar.current.startOfDay(for: Date())
|
|
|
5656
|
+ accessory.addSubview(datePicker)
|
|
|
5657
|
+
|
|
|
5658
|
+ let alert = NSAlert()
|
|
|
5659
|
+ alert.messageText = "Select date"
|
|
|
5660
|
+ alert.informativeText = "Choose a date to schedule your meeting."
|
|
|
5661
|
+ alert.alertStyle = .informational
|
|
|
5662
|
+ alert.accessoryView = accessory
|
|
|
5663
|
+ alert.addButton(withTitle: "Continue")
|
|
|
5664
|
+ alert.addButton(withTitle: "Cancel")
|
|
|
5665
|
+
|
|
|
5666
|
+ guard alert.runModal() == .alertFirstButtonReturn else { return }
|
|
|
5667
|
+
|
|
|
5668
|
+ calendarPageSelectedDate = Calendar.current.startOfDay(for: datePicker.dateValue)
|
|
|
5669
|
+ presentCreateMeetingPopover(relativeTo: sender)
|
|
|
5670
|
+ }
|
|
|
5671
|
+
|
|
5609
|
5672
|
private func scheduleTimeText(for meeting: ScheduledMeeting) -> String {
|
|
5610
|
5673
|
if meeting.isAllDay { return "All day" }
|
|
5611
|
5674
|
let f = DateFormatter()
|