Skip to content
This repository has been archived by the owner on Mar 8, 2024. It is now read-only.

Commit

Permalink
Merge branch 'feature/50_task_navigation_by_weel'
Browse files Browse the repository at this point in the history
There were big conflicts, so the conflict resolve and merge was manual
  • Loading branch information
mribeiro committed Apr 29, 2020
2 parents b6e633e + 58f6cbb commit 220bd35
Show file tree
Hide file tree
Showing 33 changed files with 441 additions and 230 deletions.
145 changes: 87 additions & 58 deletions Timetracker.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

File renamed without changes.
14 changes: 0 additions & 14 deletions Timetracker/TaskRunnerWindowController.swift

This file was deleted.

Large diffs are not rendered by default.

File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@ class ManualTaskViewController: NSViewController, NSComboBoxDataSource {
}

taskEnd.minDate = taskStart.dateValue
taskStart.maxDate = Date()
taskEnd.maxDate = Date()

self.taskComboBox.usesDataSource = true
self.taskComboBox.completes = true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// TaskListViewController+TaskPingReceiver.swift
// Timetracker
//
// Created by Antonio Ribeiro on 29/04/2020.
// Copyright © 2020 Antonio Ribeiro. All rights reserved.
//

import Foundation

extension TaskListViewController: TaskPingReceiver {

func taskStarted() {
filterTasks()
}

func ping(_ interval: TimeInterval) {
L.v("Ping in TaskListViewController")
let lastRow = tasks?.count
calculateTime()
tableView.reloadData(forRowIndexes: [lastRow!], columnIndexes: [TableColumns.accumulated.rawValue])
}

func taskStopped() {
filterTasks()
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@

import Foundation
import Cocoa
import SwiftDate

class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate, TaskPingReceiver {
class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

enum TableColumns: Int {
case headOfDevelopment = 0
Expand All @@ -21,30 +22,39 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi
case accumulated = 6
}

enum TimeSpan: Int {
case day = 0
case week = 1
case month = 2
}

// MARK: - Outlets
@IBOutlet var tableView: NSTableView!
@IBOutlet var startDate: NSDatePicker!
@IBOutlet var endDate: NSDatePicker!
@IBOutlet var accumulatedTime: NSTextField!
@IBOutlet weak var recordsLabel: NSTextField!

// MARK: - Vars and Lets
fileprivate var tasks: [Task]?
var tasks: [Task]?
var contentCorrupted = false
var exported: String?

var windowController: TaskListWindowController? {
return self.view.window?.windowController as? TaskListWindowController
}

// MARK: - ViewController callbacks
override func viewWillAppear() {
super.viewWillAppear()
//tasks = TaskProviderManager.instance.allTasks
startDate.dateValue = Date()
endDate.dateValue = startDate.dateValue
windowController?.startDatePicker.dateValue = Date()

tableView.dataSource = self
tableView.delegate = self
tableView.doubleAction = #selector(tableViewDoubleClick)

filterClicked(nil)
filterTasks()

TaskProviderManager.instance.addPingReceiver(self)

}

func calculateTime() {
Expand All @@ -62,26 +72,18 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi
accumulatedTime.stringValue = """
Accumulated time: \(String(format: "%02d", components.hour!))h\(String(format: "%02d", components.minute!))m
"""

}

override func viewWillDisappear() {
TaskProviderManager.instance.removePingReceiver(self)
}

func taskStarted() {
filterClicked(self)
@IBAction func timeSpanSelectorClicked(_ sender: Any) {
filterTasks()
}

func ping(_ interval: TimeInterval) {
L.v("Ping in TaskListViewController")
let lastRow = tasks?.count
calculateTime()
tableView.reloadData(forRowIndexes: [lastRow!], columnIndexes: [TableColumns.accumulated.rawValue])
@IBAction func startDateChanged(_ sender: Any) {
filterTasks()
}

func taskStopped() {
filterClicked(self)
override func viewWillDisappear() {
TaskProviderManager.instance.removePingReceiver(self)
}

// MARK: - TableViewDataSource callbacks
Expand Down Expand Up @@ -254,10 +256,7 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi

}

var exported: String?

@IBAction func exportClicked(_ sender: AnyObject) {

guard !self.contentCorrupted else {
showError("There are tasks that do not seem to be properly configured. Please check and fix them.")
return
Expand All @@ -270,18 +269,37 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi
performSegue(withIdentifier: "show_export", sender: self)

}

}

var contentCorrupted = false
@IBAction func filterClicked(_ sender: AnyObject?) {
func filterTasks() {

guard let end = endDate.dateValue.endOfDay else {
L.e("Couldn't get end date")
guard let timespan = self.windowController?.timeSpan, let startDate = self.windowController?.startDate else {
return
}

let startAndEndTime = calculateDateRangeWithStartDate(startDate, forTimeSpan: timespan)

var text: String

switch timespan {
case .day:
let dateFormatted = startAndEndTime.startDate.toFormat("dd/MM/yyyy")
text = "Showing records on \(dateFormatted)"

case .week:
let startDateFormatted = startAndEndTime.startDate.toFormat("dd/MM/yyyy")
let endDateFormatted = startAndEndTime.endDate.toFormat("dd/MM/yyyy")
text = "Showing records between \(startDateFormatted) and \(endDateFormatted)"

case .month:
text = "Showing records in \(startAndEndTime.startDate.monthName(.default))"
}

self.recordsLabel.stringValue = text

self.contentCorrupted = false
self.tasks = TaskProviderManager.instance.getTasksBetween(startDate.dateValue.startOfDay, and: end)
self.tasks = TaskProviderManager.instance.getTasksBetween(startAndEndTime.startDate,
and: startAndEndTime.endDate)
self.tableView.reloadData()
self.calculateTime()
}
Expand All @@ -295,7 +313,7 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi

if let destination = segue.destinationController as? ManualTaskViewController {
destination.onDismiss = {
self.filterClicked(nil)
self.filterTasks()
}
destination.editingTask = self.editingTask
return
Expand All @@ -309,6 +327,75 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi
}
}
}

private func calculateDateRangeWithStartDate(_ startDate: Date, forTimeSpan timeSpan: TimeSpan)
-> (startDate: Date, endDate: Date) {

var startOfFilter: Date
var endOfFilter: Date

switch timeSpan {
case .day:
startOfFilter = startDate.dateAt(.startOfDay)
endOfFilter = startDate.dateAt(.endOfDay)

case .week:
startOfFilter = startDate.dateAt(.startOfWeek)
endOfFilter = startDate.dateAt(.endOfWeek)

case .month:
startOfFilter = startDate.dateAt(.startOfMonth)
endOfFilter = startDate.dateAt(.endOfMonth)
}

return (startOfFilter, endOfFilter)
}
//swiftlint:disable shorthand_operator
@IBAction private func jumpToNext(_ sender: Any?) {

guard var date = self.windowController?.startDate, let span = self.windowController?.timeSpan else {
return
}

switch span {
case .day:
date = date + 1.days

case .week:
date = date + 1.weeks

case .month:
date = date + 1.months
}

self.windowController?.startDatePicker.dateValue = date
filterTasks()

}

@IBAction private func jumpToPrevious(_ sender: Any?) {

guard var date = self.windowController?.startDate, let span = self.windowController?.timeSpan else {
return
}

switch span {
case .day:
date = date - 1.days

case .week:
date = date - 1.weeks

case .month:
date = date - 1.months
}

self.windowController?.startDatePicker.dateValue = date
filterTasks()

}
//swiftlint:enable shorthand_operator

}

// Helper function inserted by Swift 4.2 migrator.
Expand Down
25 changes: 25 additions & 0 deletions Timetracker/Views/TaskList/TaskListWindowController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// TaskListWindowController.swift
// Timetracker
//
// Created by Antonio Ribeiro on 28/04/2020.
// Copyright © 2020 Antonio Ribeiro. All rights reserved.
//

import Foundation
import AppKit

class TaskListWindowController: NSWindowController {

@IBOutlet weak var startDatePicker: NSDatePicker!
@IBOutlet weak var timespanSelector: NSSegmentedControl!

var startDate: Date {
return startDatePicker.dateValue
}

var timeSpan: TaskListViewController.TimeSpan? {
return TaskListViewController.TimeSpan(rawValue: self.timespanSelector.selectedSegment)
}

}
File renamed without changes.
1 change: 1 addition & 0 deletions Timetracker/copyright.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ FRAMEWORKS:

SwiftyBeaver (https://github.com/SwiftyBeaver/SwiftyBeaver)
Preferences (https://github.com/sindresorhus/Preferences)
SwiftDate (https://github.com/malcommac/SwiftDate)

0 comments on commit 220bd35

Please sign in to comment.