Skip to content

Instantly share code, notes, and snippets.

@normancapule
Created March 18, 2015 12:57
Show Gist options
  • Save normancapule/8fd2a63f5abb217cc7b4 to your computer and use it in GitHub Desktop.
Save normancapule/8fd2a63f5abb217cc7b4 to your computer and use it in GitHub Desktop.
Refactor this!
'use strict'
angular.module "streams"
.controller "ClientTeamCtrl", ['$scope', '$rootScope', 'Worklog', 'Day', 'Project', 'Clients', '$pusher',
($scope, $rootScope, Worklog, Day, Project, Clients, $pusher) ->
$scope.todayDuration = {h: 0, m: 0}
$scope.weekDuration = {h: 0, m: 0, start_date: null, end_date: null}
$scope.date = moment()
$scope.week = []
$scope.worklogs = []
$scope.timeline = []
$scope.newWorklogs = []
$scope.config = { processing: false, toggleHide: true}
$scope.selectedProject = null
if $rootScope.currentUser.isClient()
pusher = $pusher(pusherClient)
channel = pusher.subscribe 'client-channel'
channel.bind 'hours', (data) ->
worklog = if $scope.selectedProject then data[$scope.selectedProject.id] else null
if worklog and _.findIndex($scope.newWorklogs, { 'id': worklog.id}) < 0
$scope.newWorklogs.push worklog
$scope.checkNewWorklogs = () ->
$scope.resetWorklogs()
createWeek()
$scope.$watch ( ->
Clients.getSelectedProject()
), ((newValue, oldValue) ->
if newValue
$scope.selectedProject = newValue
$scope.resetWorklogs()
createWeek()
), true
$scope.$watch ( ->
$scope.week
), ((newValue, oldValue) ->
duration = moment.duration()
_.forEach $scope.week, (day) ->
duration.add(day.seconds, 'seconds')
$scope.weekDuration.h = Math.floor(duration.asHours())
$scope.weekDuration.m = duration.minutes()
), true
$scope.resetWorklogs = () ->
if $scope.selectedProject
$scope.newWorklogs = []
$scope.config.processing = true
Project.worklogs (
project_id: $scope.selectedProject.slug
start_date: moment($scope.date.toDate()).startOf('day').format()
end_date: moment($scope.date.toDate()).endOf('day').format()
),
(data) ->
$scope.config.processing = false
formatscope(data.worklogs)
resetTimeline()
getDayDuration(data.seconds)
checkIfInitializeWeek()
formatscope = (data) ->
while $scope.worklogs.length > 0
$scope.worklogs.pop()
_.forEach data, (worklog) ->
unless _.find($scope.worklogs, { 'id': worklog.id})
worklog = new Worklog(worklog)
worklog.setMockStart()
worklog.setStartedFormatted()
$scope.worklogs.push(worklog)
resetTimeline = () ->
while $scope.timeline.length > 0
$scope.timeline.pop()
grouped = _.groupBy($scope.worklogs, 'cluster_id')
_.forEach grouped, (group) ->
latestGroupLog = _.last(_.sortByAll(group, ['status', 'started_at']))
$scope.timeline.push latestGroupLog
checkIfInitializeWeek = () ->
if $scope.week[0]
selectedDate = moment($scope.date.toDate()).startOf('isoWeek')
weekStart = moment($scope.week[0].date.toDate()).startOf('isoWeek')
createWeek() if selectedDate.isoWeek() != weekStart.isoWeek()
else
createWeek()
getDayDuration = (seconds) ->
duration = moment.duration(seconds, 'seconds')
$scope.todayDuration.h = Math.floor(duration.asHours())
$scope.todayDuration.m = duration.minutes()
dayIndex = _.findIndex($scope.week, { 'format': $scope.date.format("YYYY-MM-DD")})
if dayIndex >= 0
$scope.week[dayIndex] = new Day(duration, $scope.week[dayIndex].date)
createWeek = () ->
current = moment($scope.date.toDate()).startOf('isoWeek')
end = moment($scope.date.toDate()).endOf('isoWeek')
i = 0
while current.isoWeek() == end.isoWeek()
$scope.week[i] = { date: moment(current.toDate()), h: 0, m: 0}
current = current.add(1, 'day')
i+=1
$scope.week.forEach (day, i) ->
Project.worklogs (
project_id: $scope.selectedProject.slug
start_date: day.date.startOf('day').format()
end_date: day.date.endOf('day').format()
),
(data) ->
duration = moment.duration(data.seconds, 'seconds')
$scope.week[i] = new Day(duration, day.date)
]
'use strict'
angular.module "streams"
.controller "HoursCtrl", ['$scope', '$rootScope', 'User', 'Worklog', 'Event', 'Day',
($scope, $rootScope, User, Worklog, Event, Day) ->
init = () ->
$scope.todayDuration = {h: 0, m: 0}
$scope.weekDuration = {h: 0, m: 0, start_date: null, end_date: null}
$scope.date = moment()
$scope.eventSources = []
$scope.state = 'add'
$scope.worklogs = []
$scope.timeline = []
$scope.week = []
$scope.config = { processing: true}
checkIfInitializeWeek()
User.getProjects { id: $rootScope.currentUser.slug },
(data) ->
$scope.projects = _.reject(data, { status: 'Archived' })
$scope.newWorklog = '#'
if $rootScope.currentUser.favorite_id
$scope.favoriteProject = _.find($scope.projects, { id: $rootScope.currentUser.favorite_id})
$scope.newWorklog = '#' + $scope.favoriteProject.slug
$scope.$watch ( ->
$scope.week
), ((newValue, oldValue) ->
duration = moment.duration()
_.forEach $scope.week, (day) ->
duration.add(day.seconds, 'seconds')
$scope.weekDuration.h = Math.floor(duration.asHours())
$scope.weekDuration.m = duration.minutes()
), true
$scope.resetWorklogs = () ->
$scope.config.processing = true
Worklog.query (
user_id: $rootScope.currentUser.slug
start_date: moment($scope.date.toDate()).startOf('day').format()
end_date: moment($scope.date.toDate()).endOf('day').format()
),
(data) ->
$scope.config.processing = false
formatscope(data.worklogs)
resetTimeline()
getDayDuration(data.seconds)
checkIfInitializeWeek()
createWeek = () ->
$scope.week = []
current = moment($scope.date.toDate()).startOf('isoWeek')
end = moment($scope.date.toDate()).endOf('isoWeek')
while current.isoWeek() == end.isoWeek()
$scope.week.push { date: moment(current.toDate()), h: 0, m: 0}
current = current.add(1, 'day')
$scope.week.forEach (day, i) ->
Worklog.query (
user_id: $rootScope.currentUser.slug
start_date: day.date.startOf('day').format()
end_date: day.date.endOf('day').format()
),
(data) ->
duration = moment.duration(data.seconds, 'seconds')
$scope.week[i] = new Day(duration, day.date)
formatscope = (data) ->
while $scope.worklogs.length > 0
$scope.worklogs.pop()
_.forEach data, (worklog) ->
unless _.find($scope.worklogs, { 'id': worklog.id})
worklog = new Worklog(worklog)
worklog.setMockStart()
worklog.setStartedFormatted()
$scope.worklogs.push(worklog)
createEventSource()
resetTimeline = () ->
while $scope.timeline.length > 0
$scope.timeline.pop()
worklogs = _.reject($scope.worklogs, { status: 'Working'})
grouped = _.groupBy(worklogs, 'cluster_id')
_.forEach grouped, (group) ->
latestGroupLog = _.last(_.sortByAll(group, ['status', 'started_at']))
$scope.timeline.push latestGroupLog
checkIfInitializeWeek = () ->
if $scope.week[0]
selectedDate = moment($scope.date.toDate()).startOf('isoWeek')
weekStart = moment($scope.week[0].date.toDate()).startOf('isoWeek')
createWeek() if selectedDate.isoWeek() != weekStart.isoWeek()
else
createWeek()
getDayDuration = (seconds) ->
duration = moment.duration(seconds, 'seconds')
$scope.todayDuration.h = Math.floor(duration.asHours())
$scope.todayDuration.m = duration.minutes()
dayIndex = _.findIndex($scope.week, { 'format': $scope.date.format("YYYY-MM-DD")})
if dayIndex >= 0
$scope.week[dayIndex] = new Day(duration, $scope.week[dayIndex].date)
createEventSource = () ->
while $scope.eventSources.length > 0
$scope.eventSources.pop()
events = _.reject $scope.worklogs, (worklog) ->
worklog.status == 'working' && moment(worklog.started_at).startOf('day').format() != $scope.date.startOf('day').format()
_.forEach events, (worklog) ->
$scope.eventSources.push new Event(worklog, $scope.date)
getGaps() if $rootScope.currentUser.isProfessional()
getGaps = () ->
startOfDay = moment($scope.date.toDate()).startOf('day')
endOfDay = moment($scope.date.toDate()).endOf('day')
gap = {type: 'addhours'}
if $scope.eventSources.length > 0
events = _.sortBy($scope.eventSources, 'end')
_.forEach events, (event, i) ->
gap.start = event.end
if events[i+1]
gap.end = events[i+1].start
mins = events[i+1].start.diff(event.end, 'minutes')
if mins > 0 then $scope.eventSources.push Event.createGap(gap.start, gap.type, gap.end)
lastEvent = _.last(events)
if endOfDay.diff(lastEvent.end, 'minutes') > 0 and lastEvent.status == 'done'
$scope.eventSources.push Event.createGap(lastEvent.end, gap.type, endOfDay)
if events[0].start.diff(startOfDay, 'minutes') > 0
$scope.eventSources.push Event.createGap(startOfDay, gap.type, events[0].start)
else
$scope.eventSources.push Event.createGap(startOfDay, gap.type, endOfDay)
init()
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment