Parcourir la Source

Add Schedule page quick-create action with date selection.

This adds a header plus button on the Schedule page that lets users pick a date and immediately open the existing schedule meeting popover from that page.

Made-with: Cursor
huzaifahayat12 il y a 1 semaine
Parent
commit
af76bbde5b
1 fichiers modifiés avec 63 ajouts et 0 suppressions
  1. 63 0
      meetings_app/ViewController.swift

+ 63 - 0
meetings_app/ViewController.swift

@@ -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()