Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ref(calendar): refactored view outside of calendar module #815

Merged
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
171 changes: 171 additions & 0 deletions lua/neorg/modules/core/ui/calendar/module.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
-- NOTICE: Consider this whole module a demo for now
-- A lot of stuff is hardcoded in order to prove that it can work

local module = neorg.modules.create("core.ui.calendar")

module.setup = function()
return {
requires = {
"core.ui",
"core.ui.calendar.views.monthly"
},
}
end

module.private = {

modes = {},
views = {},

get_mode = function(name, callback)
if module.private.modes[name] ~= nil then
local cur_mode = module.private.modes[name](callback)
cur_mode.name = name
return cur_mode
end

print("Error: mode not set or not available")
end,

get_view = function(name)
if module.private.views[name] ~= nil then
return module.private.views[name]
end

print("Error: view not set or not available")
end,

extract_ui_info = function (buffer, window)
local width = vim.api.nvim_win_get_width(window)
local height = vim.api.nvim_win_get_height(window)

local half_width = math.floor(width / 2)
local half_height = math.floor(height / 2)

return {
window = window,
buffer = buffer,
width = width,
height = height,
half_width = half_width,
half_height = half_height,
}
end,

open_window = function (options)
local buffer, window = module.required["core.ui"].create_split(
"calendar",
{},
options.height or math.floor(vim.opt.lines:get() * 0.3)
)

return buffer, window
end
}

module.public = {
add_mode = function(name, factory)
module.private.modes[name] = factory
end,

add_view = function(name, details)
module.private.views[name] = details
end,

create_calendar = function(buffer, window, options)
local callback_and_close = function (result)
if options.callback ~= nil then
options.callback(result)
end

module.required['core.ui'].delete_window(buffer)
end

local mode = module.private.get_mode(options.mode, callback_and_close)
if mode == nil then
return
end

local ui_info = module.private.extract_ui_info(buffer, window)

local view = module.private.get_view(options.view or "monthly")

view.setup(ui_info, mode, options)
end,

open = function(options)
local buffer, window = module.private.open_window(options)

options.mode = "standalone"

return module.public.create_calendar(buffer, window, options)
end,

select_date = function(options)
local buffer, window = module.private.open_window(options)

options.mode = "select_date"

return module.public.create_calendar(buffer, window, options)
end,

select_date_range = function(options)
local buffer, window = module.private.open_window(options)

options.mode = "select_range"

return module.public.create_calendar(buffer, window, options)
end,
}

module.load = function()
-- Add default calendar modes
module.public.add_mode("standalone", function(_)
return {}
end)

module.public.add_mode("select_date", function(callback)
return {
on_select = function(_, date)
if callback then
callback(date)
end
return false
end,
}
end)

module.public.add_mode("select_range", function(callback)
return {
range_start = nil,
range_end = nil,

on_select = function(self, date)
if not self.range_start then
self.range_start = date
return true
else
if os.time(date) <= os.time(self.range_start) then
print("Error: you should choose a date that is after the starting day.")
return false
end

self.range_end = date
callback({ self.range_start, self.range_end })
return false
end
end,

get_day_highlight = function(self, date, default_highlight)
if self.range_start ~= nil then
if os.time(date) < os.time(self.range_start) then
return "@comment"
end
end
return default_highlight
end,
}
end)
end

return module
Loading