Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
5a7c360
Adding projects
cristianbaluta Dec 20, 2018
11a2db3
Merge branch 'master' into projects
cristibaluta Dec 28, 2018
f9b9363
...
cristibaluta Jan 31, 2019
693a753
Merge branch 'master' into projects
cristibaluta Nov 17, 2019
8538238
Remove animations
cristibaluta Dec 23, 2019
343460b
Redesign
cristibaluta Dec 29, 2019
5214dd0
Remove NonTaskCell
cristibaluta Dec 30, 2019
32d08ed
Show reports
cristibaluta Dec 30, 2019
3fa5e78
Fix start day
cristianbaluta Jan 6, 2020
8a2ea21
Rename cell
cristibaluta Jan 7, 2020
d713859
Start day on past days with the time set in settings
cristibaluta Jan 8, 2020
09c815e
Add cli command to start date
cristibaluta Jan 8, 2020
0b5902b
Refactor and add end day command
cristianbaluta Jan 8, 2020
4eb483e
Add CopyReportCell
cristianbaluta Jan 8, 2020
d3c6b48
Remove background in cell
cristianbaluta Jan 9, 2020
64d1ab2
Fix copy report footer not being visible
cristianbaluta Jan 10, 2020
3e95844
Refresh footer when a row is removed
cristianbaluta Jan 10, 2020
1846bda
Add projects db
cristibaluta Jan 12, 2020
d7314e6
Migrate db to v2
cristianbaluta Jan 13, 2020
357482f
Add metadata repository
cristibaluta Jan 13, 2020
bda53e7
Add metadata interactors
cristibaluta Jan 19, 2020
7968a27
Create separate zones for projects and tasks
cristibaluta Jan 19, 2020
aa11724
Read projects from db
cristibaluta Jan 20, 2020
ab464d8
Add save projects method
cristibaluta Jan 20, 2020
cbf4003
Save project to db
cristianbaluta Jan 20, 2020
ee8502f
Save project to db
cristibaluta Jan 21, 2020
197e05b
Refactor
cristianbaluta Jan 21, 2020
033ffd0
Fix project save
cristianbaluta Jan 21, 2020
dcd294e
Fix git users seave
cristianbaluta Jan 21, 2020
894f658
Projects
cristibaluta Jan 21, 2020
cfd04e9
...
cristibaluta Jan 22, 2020
7b11776
Add projects list to task creation
cristibaluta Jan 23, 2020
8f8848f
Handle credentials checkbox
cristibaluta Jan 23, 2020
cf1326d
Add edit task button
cristianbaluta Jan 23, 2020
f1b44b3
Fix new task rect y position
cristibaluta Jan 27, 2020
3542d3e
...
cristianbaluta Jan 27, 2020
fe2cf57
Fix mouse over text width
cristianbaluta Jan 28, 2020
e06b5c1
Read git paths and users from projects
cristianbaluta Jan 28, 2020
e734287
Fix crash in the morning
cristianbaluta Jan 29, 2020
40da1bf
Fix crash
cristianbaluta Jan 30, 2020
22035f1
Pass jira credentials from outside
cristianbaluta Jan 30, 2020
d8c3036
Convert hours to seconds when saving worklogs
cristianbaluta Jan 31, 2020
b814340
Update cell icons
cristibaluta Feb 1, 2020
f221088
Fix editing popover
cristibaluta May 9, 2020
dda7232
Fix task type save in task editor
cristibaluta May 9, 2020
88468e4
Fix new task popup when inserting new item
cristibaluta May 12, 2020
7894089
Return better error for jira login failure
cristibaluta May 19, 2020
393cccc
...
cristibaluta Apr 5, 2021
01b10e7
Safer parsing
cristibaluta Jun 13, 2024
f3ad271
Merge branch 'master' into projects
acr7rt Jun 13, 2024
a7683eb
Merge branch 'master' into projects
acr7rt Jun 13, 2024
1d265fa
Re-add some files to project
acr7rt Jun 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions App/Entities/JiraUser.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// JiraUser.swift
// Jirassic
//
// Created by Cristian Baluta on 30/01/2020.
// Copyright © 2020 Imagin soft. All rights reserved.
//

import Foundation

struct JiraUser {
var url: String
var user: String
var password: String
var project: String
var issue: String
}
25 changes: 25 additions & 0 deletions App/Entities/Project.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// Project.swift
// Jirassic
//
// Created by Cristian Baluta on 20/12/2018.
// Copyright © 2018 Imagin soft. All rights reserved.
//

import Foundation

struct Project: Equatable {

var objectId: String?
var lastModifiedDate: Date?
var title: String
var jiraBaseUrl: String?
var jiraUser: String?
var jiraProject: String?
var jiraIssue: String?

var gitBaseUrls: [String]
var gitUsers: [String]
/// Git commits with this prefix are considered part of the project automatically
var taskNumberPrefix: String?
}
72 changes: 50 additions & 22 deletions App/Entities/Task.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

import Foundation

// Never change the indexes because they are already stored in the database
enum TaskType: Int {


/// Never change the indexes because they are already stored in the database
case issue = 0
case startDay = 1
case scrum = 2
Expand All @@ -22,35 +22,57 @@ enum TaskType: Int {
case coderev = 8
case endDay = 9
case calendar = 10
case support = 11

var defaultNotes: String {
switch self {
case .startDay: return "Working day started"
case .endDay: return "Working day ended"
case .scrum: return "Scrum meeting"
case .lunch: return "Lunch break"
case .meeting: return "Meeting"
case .waste: return "Social & Media"
case .learning: return "Learning session"
case .coderev: return "Reviewing and fixing code"
case .calendar: return "Calendar event"
default: return ""
case .startDay: return "Working day started"
case .endDay: return "Working day ended"
case .scrum: return "Scrum meeting"
case .lunch: return "Lunch break 🥑🥑🥑"
case .meeting: return "Meeting"
case .waste: return "Social & Media 👤👤👤"
case .learning: return "Learning session"
case .coderev: return "Reviewing and fixing code"
case .calendar: return "Calendar event"
case .support: return "Support"
default: return ""
}
}

// Used to group reports
/// Used to group reports together
var defaultTaskNumber: String? {
switch self {
case .scrum: return "scrum"
case .lunch: return "lunch"
case .meeting: return "meeting"
case .waste: return "waste"
case .learning: return "learning"
case .coderev: return "coderev"
case .calendar: return "meeting"
default: return nil
case .scrum: return "scrum"
case .lunch: return "lunch"
case .meeting: return "meeting"
case .waste: return "waste"
case .learning: return "learning"
case .coderev: return "coderev"
case .calendar: return "meeting"
case .support: return "support"
default: return nil
}
}

var title: String {
switch self {
case .startDay: return "Start of day"
case .endDay: return "End of day"
case .issue: return "Task"
case .scrum: return "Scrum"
case .lunch: return "Food"
case .meeting: return "Meeting"
case .waste: return "Social & Media"
case .learning: return "Learning"
case .coderev: return "Code review"
case .support: return "Support"
case .gitCommit: return "Git commit"
default: return ""
}
}

static var allValues: [TaskType] = []
}

// Object representing a task
Expand All @@ -72,6 +94,7 @@ struct Task {
/// Created locally and used for matching with the remote object
/// If objectId is missing means the task is not saved to db nor to server (eg. unsaved git and calendar items)
var objectId: String?
var projectId: String?
}

extension Task {
Expand All @@ -94,6 +117,10 @@ extension Task {
self.taskType = type
self.objectId = String.generateId()
}

var isSaved: Bool {
return objectId != nil
}
}

/// Object used to pass task data to and from the cell, for displaying and editing
Expand All @@ -102,5 +129,6 @@ typealias TaskCreationData = (
dateEnd: Date,
taskNumber: String?,
notes: String?,
taskType: TaskType
taskType: TaskType,
projectId: String?
)
37 changes: 33 additions & 4 deletions App/Extensions/DateExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ let ymdUnitFlags: Set<Calendar.Component> = [.year, .month, .day]
let ymdhmsUnitFlags: Set<Calendar.Component> = [.year, .month, .weekday, .day, .hour, .minute, .second]
let gregorian = Calendar(identifier: Calendar.Identifier.gregorian)

/// Instantiate a date
extension Date {

init (hour: Int, minute: Int, second: Int = 0) {
Expand Down Expand Up @@ -51,6 +52,7 @@ extension Date {
}
}

/// Format the date
extension Date {

func HHmmddMM() -> String {
Expand Down Expand Up @@ -90,6 +92,12 @@ extension Date {
return f.string(from: self)
}

func E() -> String {
let f = DateFormatter()
f.dateFormat = "E"
return f.string(from: self)
}

// eg. Thursday, February 01
func EEEEMMMMdd() -> String {
let f = DateFormatter()
Expand Down Expand Up @@ -139,6 +147,12 @@ extension Date {
f.dateFormat = "YYYY"
return f.string(from: self)
}

func MMMyyyy() -> String {
let f = DateFormatter()
f.dateFormat = "MMM yyyy"
return f.string(from: self)
}
}

extension Date {
Expand Down Expand Up @@ -182,10 +196,8 @@ extension Date {
}

func daysInMonth() -> Int {

let daysRange = gregorian.range(of: Calendar.Component.day, in: Calendar.Component.month, for: self)

return daysRange!.count as Int
let daysRange = gregorian.range(of: .day, in: .month, for: self)
return daysRange?.count ?? 0
}

func components() -> (hour: Int, minute: Int) {
Expand Down Expand Up @@ -234,10 +246,27 @@ extension Date {
return gregorian.date(from: comps)!
}

func dateByUpdating (day: Int) -> Date {

var comps = gregorian.dateComponents(ymdhmsUnitFlags, from: self)
comps.day = day

return gregorian.date(from: comps)!
}

func dateByKeepingTime() -> Date {
let comps = gregorian.dateComponents(ymdhmsUnitFlags, from: self)
return Date().dateByUpdating(hour: comps.hour!, minute: comps.minute!)
}

func dateByKeepingTime(from date: Date) -> Date {
let comps = gregorian.dateComponents(ymdhmsUnitFlags, from: date)
return self.dateByUpdating(hour: comps.hour!, minute: comps.minute!)
}

func dateByAddingMonths(_ numberOfMonths: Int) -> Date {
return Calendar.current.date(byAdding: .month, value: numberOfMonths, to: self) ?? self
}

static func parseHHmm (_ hhmm: String) -> (hour: Int, min: Int) {
let hm = hhmm.components(separatedBy: ":")
Expand Down
2 changes: 1 addition & 1 deletion App/Extensions/TableViewCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ extension TableViewCell {
// return UIStoryboard(name: name, bundle: nil).instantiateViewControllerWithIdentifier(self.className) as! T
#else
guard let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: className), owner: self) as? T else {
fatalError("Cell \(className) might not be registered in thsi tableView")
fatalError("Cell \(className) might not be registered in this tableView")
}
return cell
#endif
Expand Down
44 changes: 44 additions & 0 deletions App/Metadata/ReadMetadataInteractor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// ReadMetadataInteractor.swift
// Jirassic
//
// Created by Cristian Baluta on 17/01/2020.
// Copyright © 2020 Imagin soft. All rights reserved.
//

import Foundation
import CloudKit

class ReadMetadataInteractor: RepositoryInteractor {

init() {
super.init(repository: localRepository, remoteRepository: nil)
}

func tasksLastSyncDate() -> Date? {
return repository.tasksLastSyncDate()
}
func projectsLastSyncDate() -> Date? {
return repository.projectsLastSyncDate()
}

func tasksLastSyncToken() -> CKServerChangeToken? {
let stringToken = repository.tasksLastSyncToken()
return token(from: stringToken)
}
func projectsLastSyncToken() -> CKServerChangeToken? {
let stringToken = repository.projectsLastSyncToken()
return token(from: stringToken)
}

private func token (from stringToken: String?) -> CKServerChangeToken? {

guard let string = stringToken,
let data = Data(base64Encoded: string),
let token = NSKeyedUnarchiver.unarchiveObject(with: data) as? CKServerChangeToken else {
return nil
}

return token
}
}
41 changes: 41 additions & 0 deletions App/Metadata/WriteMetadataInteractor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// WriteMetadataInteractor.swift
// Jirassic
//
// Created by Cristian Baluta on 17/01/2020.
// Copyright © 2020 Imagin soft. All rights reserved.
//

import Foundation
import CloudKit

class WriteMetadataInteractor: RepositoryInteractor {

init() {
super.init(repository: localRepository, remoteRepository: nil)
}

func set (tasksLastSyncDate: Date?) {
repository.set(tasksLastSyncDate: tasksLastSyncDate)
}
func set (projectsLastSyncDate: Date?) {
repository.set(tasksLastSyncDate: projectsLastSyncDate)
}

func set (tasksLastSyncToken: CKServerChangeToken?) {
repository.set(tasksLastSyncToken: string(from: tasksLastSyncToken))
}
func set (projectsLastSyncToken: CKServerChangeToken?) {
repository.set(tasksLastSyncToken: string(from: projectsLastSyncToken))
}

private func string (from token: CKServerChangeToken?) -> String? {

guard let token = token else {
return nil
}
let data = NSKeyedArchiver.archivedData(withRootObject: token)
let string = data.base64EncodedString()
return string
}
}
Loading