Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
15 changes: 15 additions & 0 deletions lua/orgmode/events/types/clocked_in.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---@class OrgClockedInEvent: OrgEvent
---@field headline? OrgHeadline
local ClockedInEvent = {
type = 'orgmode.clocked_in',
}
ClockedInEvent.__index = ClockedInEvent

---@param headline OrgHeadline
function ClockedInEvent:new(headline)
return setmetatable({
headline = headline,
}, self)
end

return ClockedInEvent
15 changes: 15 additions & 0 deletions lua/orgmode/events/types/clocked_out.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---@class OrgClockedOutEvent: OrgEvent
---@field headline? OrgHeadline
local ClockedOutEvent = {
type = 'orgmode.clocked_out',
}
ClockedOutEvent.__index = ClockedOutEvent

---@param headline OrgHeadline
function ClockedOutEvent:new(headline)
return setmetatable({
headline = headline,
}, self)
end

return ClockedOutEvent
2 changes: 2 additions & 0 deletions lua/orgmode/events/types/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ return {
HeadlineDemoted = require('orgmode.events.types.headline_demoted_event'),
HeadingToggled = require('orgmode.events.types.heading_toggled'),
NoteAdded = require('orgmode.events.types.note_added_event'),
ClockedIn = require('orgmode.events.types.clocked_in'),
ClockedOut = require('orgmode.events.types.clocked_out'),
}
2 changes: 2 additions & 0 deletions lua/orgmode/files/headline.lua
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,15 @@ function Headline:clock_in()
logbook = Logbook.new_from_headline(self)
end
logbook:add_clock_in()
EventManager.dispatch(events.ClockedIn:new(self))
return self:refresh()
end

function Headline:clock_out()
local logbook = self:get_logbook()
if logbook then
logbook:clock_out()
EventManager.dispatch(events.ClockedOut:new(self))
end
return self:refresh()
end
Expand Down
92 changes: 92 additions & 0 deletions tests/plenary/ui/clock_spec.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
local helpers = require('tests.plenary.helpers')
local Date = require('orgmode.objects.date')
local orgmode = require('orgmode')
local EventManager = require('orgmode.events')
local events = EventManager.event

describe('Clock', function()
local files = {}
Expand Down Expand Up @@ -211,4 +213,94 @@ describe('Clock', function()
'* TODO Test 3',
}, vim.api.nvim_buf_get_lines(0, 0, -1, false))
end)

it('should dispatch ClockedIn event when clocking in', function()
local file = helpers.create_agenda_file({
'* TODO Clock event test',
})

local received_event = nil
local listener = function(event)
received_event = event
end
EventManager.listen(events.ClockedIn, listener)

vim.cmd('edit ' .. file.filename)
vim.fn.cursor({ 1, 1 })
vim.cmd([[norm ,oxi]])
vim.wait(100)

assert.is_not_nil(received_event)
assert.are.same('orgmode.clocked_in', received_event.type)
assert.are.same('Clock event test', received_event.headline:get_title())

-- cleanup listener
local listeners = EventManager._listeners[events.ClockedIn.type]
for i, l in ipairs(listeners) do
if l == listener then
table.remove(listeners, i)
break
end
end
end)

it('should dispatch ClockedOut event when clocking out', function()
local file = helpers.create_agenda_file({
'* TODO Clock out event test',
})

vim.cmd('edit ' .. file.filename)
vim.fn.cursor({ 1, 1 })
vim.cmd([[norm ,oxi]])
vim.wait(100)

local received_event = nil
local listener = function(event)
received_event = event
end
EventManager.listen(events.ClockedOut, listener)

vim.fn.cursor({ 1, 1 })
vim.cmd([[norm ,oxo]])

assert.is_not_nil(received_event)
assert.are.same('orgmode.clocked_out', received_event.type)
assert.are.same('Clock out event test', received_event.headline:get_title())

-- cleanup listener
local listeners = EventManager._listeners[events.ClockedOut.type]
for i, l in ipairs(listeners) do
if l == listener then
table.remove(listeners, i)
break
end
end
end)

it('should not dispatch ClockedOut event when headline has no logbook', function()
local file = helpers.create_agenda_file({
'* TODO No logbook headline',
})

local received_event = nil
local listener = function(event)
received_event = event
end
EventManager.listen(events.ClockedOut, listener)

vim.cmd('edit ' .. file.filename)
local headline = file:get_headlines()[1]
headline:clock_out()

assert.is_nil(received_event)

-- cleanup listener
local listeners = EventManager._listeners[events.ClockedOut.type]
for i, l in ipairs(listeners) do
if l == listener then
table.remove(listeners, i)
break
end
end
end)
end)
Loading