Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
da263bf
fix: remove unnecessary empty lines in help
jakubbortlik Nov 15, 2024
c403e7c
fix: remove irrelevant fields from settings
jakubbortlik Nov 15, 2024
b398df8
style: use the same ordering in docs and in state
jakubbortlik Nov 15, 2024
55dea15
fix: re-enable popup customization
jakubbortlik Nov 15, 2024
0199fbc
fix: limit popup size to screen size
jakubbortlik Nov 16, 2024
910705c
feat: make comment popups resizable
jakubbortlik Nov 16, 2024
4f0f51d
feat: make edit_comment popup resizable
jakubbortlik Nov 16, 2024
d80d615
feat: make help popup resizable
jakubbortlik Nov 16, 2024
12a26e8
feat: make create_mr popup resizable
jakubbortlik Nov 16, 2024
72f2431
feat: make summary popup resizable
jakubbortlik Nov 16, 2024
1187361
feat: focus last active window after closing popup
jakubbortlik Nov 17, 2024
2484eca
refactor: move popup-related stuff to utils.popup
jakubbortlik Nov 17, 2024
c3279b5
feat: make squash_message_popup resizable
jakubbortlik Nov 17, 2024
911cf88
feat: make pipeline popup resizable
jakubbortlik Nov 17, 2024
b5f12c9
fix: increase zindex of help popup
jakubbortlik Nov 17, 2024
a6a83f3
feat: make popup position customizable
jakubbortlik Nov 19, 2024
984de35
refactor: move popup to root level
jakubbortlik Dec 4, 2024
dc8e505
refactor: move set_popup_keymaps to popup module
jakubbortlik Dec 4, 2024
59f3e52
refactor: move helper functions to popup module
jakubbortlik Dec 4, 2024
22da41f
refactor: use clearer syntax to select popup settings
jakubbortlik Dec 4, 2024
82f509d
revert: restore the help and pipeline popup settings
jakubbortlik Dec 4, 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
10 changes: 7 additions & 3 deletions doc/gitlab.nvim.txt
Original file line number Diff line number Diff line change
Expand Up @@ -235,16 +235,20 @@ you call this function with no values the defaults will be used:
},
},
popup = { -- The popup for comment creation, editing, and replying
width = "40%",
height = "60%",
width = "40%", -- Can be a percentage (string or decimal, "40%" = 0.4) of editor screen width, or an integer (number of columns)
height = "60%", -- Can be a percentage (string or decimal, "60%" = 0.6) of editor screen width, or an integer (number of rows)
position = "50%", -- Position (from the top left corner), either a number or percentage string that applies to both horizontal and vertical position, or a table that specifies them separately, e.g., { row = "90%", col = "100%" } places popups in the bottom right corner while leaving the status line visible
border = "rounded", -- One of "rounded", "single", "double", "solid"
opacity = 1.0, -- From 0.0 (fully transparent) to 1.0 (fully opaque)
comment = nil, -- Individual popup overrides, e.g. { width = "60%", height = "80%", border = "single", opacity = 0.85 },
edit = nil,
note = nil,
pipeline = nil,
help = nil, -- Width and height are calculated automatically and cannot be overridden
pipeline = nil, -- Width and height are calculated automatically and cannot be overridden
reply = nil,
squash_message = nil,
create_mr = { width = "95%", height = "95%" },
summary = { width = "95%", height = "95%" },
temp_registers = {}, -- List of registers for backing up popup content (see `:h gitlab.nvim.temp-registers`)
},
discussion_tree = { -- The discussion tree that holds all comments
Expand Down
46 changes: 26 additions & 20 deletions lua/gitlab/actions/comment.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ local diffview_lib = require("diffview.lib")
local state = require("gitlab.state")
local job = require("gitlab.job")
local u = require("gitlab.utils")
local popup = require("gitlab.popup")
local git = require("gitlab.git")
local discussions = require("gitlab.actions.discussions")
local draft_notes = require("gitlab.actions.draft_notes")
Expand Down Expand Up @@ -197,12 +198,24 @@ M.create_comment_layout = function(opts)
end
end

local title = opts.discussion_id and "Reply" or "Comment"
local settings = opts.discussion_id ~= nil and state.settings.popup.reply or state.settings.popup.comment
local popup_settings = state.settings.popup
local title
local user_settings
if opts.discussion_id ~= nil then
title = "Reply"
user_settings = popup_settings.reply
elseif opts.unlinked then
title = "Note"
user_settings = popup_settings.note
else
title = "Comment"
user_settings = popup_settings.comment
end
local settings = u.merge(popup_settings, user_settings or {})

M.current_win = vim.api.nvim_get_current_win()
M.comment_popup = Popup(u.create_popup_state(title, settings))
M.draft_popup = Popup(u.create_box_popup_state("Draft", false))
M.comment_popup = Popup(popup.create_popup_state(title, settings))
M.draft_popup = Popup(popup.create_box_popup_state("Draft", false, settings))
M.start_line, M.end_line = u.get_visual_selection_boundaries()

local internal_layout = Layout.Box({
Expand All @@ -211,45 +224,38 @@ M.create_comment_layout = function(opts)
}, { dir = "col" })

local layout = Layout({
position = "50%",
position = settings.position,
relative = "editor",
size = {
width = "50%",
height = "55%",
width = settings.width,
height = settings.height,
},
}, internal_layout)

miscellaneous.set_cycle_popups_keymaps({ M.comment_popup, M.draft_popup })
popup.set_cycle_popups_keymaps({ M.comment_popup, M.draft_popup })
popup.set_up_autocommands(M.comment_popup, layout, M.current_win)

local range = opts.ranged and { start_line = M.start_line, end_line = M.end_line } or nil
local unlinked = opts.unlinked or false

---Keybinding for focus on draft section
state.set_popup_keymaps(M.draft_popup, function()
popup.set_popup_keymaps(M.draft_popup, function()
local text = u.get_buffer_text(M.comment_popup.bufnr)
confirm_create_comment(text, range, unlinked, opts.discussion_id)
vim.api.nvim_set_current_win(M.current_win)
end, miscellaneous.toggle_bool, miscellaneous.non_editable_popup_opts)
end, miscellaneous.toggle_bool, popup.non_editable_popup_opts)

---Keybinding for focus on text section
state.set_popup_keymaps(M.comment_popup, function(text)
popup.set_popup_keymaps(M.comment_popup, function(text)
confirm_create_comment(text, range, unlinked, opts.discussion_id)
vim.api.nvim_set_current_win(M.current_win)
end, miscellaneous.attach_file, miscellaneous.editable_popup_opts)
end, miscellaneous.attach_file, popup.editable_popup_opts)

vim.schedule(function()
local draft_mode = state.settings.discussion_tree.draft_mode
vim.api.nvim_buf_set_lines(M.draft_popup.bufnr, 0, -1, false, { u.bool_to_string(draft_mode) })
end)

--Send back to previous window on close
vim.api.nvim_create_autocmd("BufHidden", {
buffer = M.draft_popup.bufnr,
callback = function()
vim.api.nvim_set_current_win(M.current_win)
end,
})

return layout
end

Expand Down
36 changes: 20 additions & 16 deletions lua/gitlab/actions/create_mr.lua
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ local Input = require("nui.input")
local Popup = require("nui.popup")
local job = require("gitlab.job")
local u = require("gitlab.utils")
local popup = require("gitlab.popup")
local git = require("gitlab.git")
local state = require("gitlab.state")
local common = require("gitlab.actions.common")
Expand Down Expand Up @@ -277,13 +278,13 @@ M.open_confirmation_popup = function(mr)
action_before_exit = true,
}

state.set_popup_keymaps(description_popup, M.create_mr, miscellaneous.attach_file, popup_opts)
state.set_popup_keymaps(title_popup, M.create_mr, nil, popup_opts)
state.set_popup_keymaps(target_popup, M.create_mr, M.select_new_target, popup_opts)
state.set_popup_keymaps(delete_branch_popup, M.create_mr, miscellaneous.toggle_bool, popup_opts)
state.set_popup_keymaps(squash_popup, M.create_mr, miscellaneous.toggle_bool, popup_opts)
state.set_popup_keymaps(forked_project_id_popup, M.create_mr, nil, popup_opts)
miscellaneous.set_cycle_popups_keymaps(popups)
popup.set_popup_keymaps(description_popup, M.create_mr, miscellaneous.attach_file, popup_opts)
popup.set_popup_keymaps(title_popup, M.create_mr, nil, popup_opts)
popup.set_popup_keymaps(target_popup, M.create_mr, M.select_new_target, popup_opts)
popup.set_popup_keymaps(delete_branch_popup, M.create_mr, miscellaneous.toggle_bool, popup_opts)
popup.set_popup_keymaps(squash_popup, M.create_mr, miscellaneous.toggle_bool, popup_opts)
popup.set_popup_keymaps(forked_project_id_popup, M.create_mr, nil, popup_opts)
popup.set_cycle_popups_keymaps(popups)

vim.api.nvim_set_current_buf(M.description_bufnr)
end)
Expand Down Expand Up @@ -328,19 +329,20 @@ M.create_mr = function()
end

M.create_layout = function()
local title_popup = Popup(u.create_box_popup_state("Title", false))
local settings = u.merge(state.settings.popup, state.settings.popup.create_mr or {})
local title_popup = Popup(popup.create_box_popup_state("Title", false, settings))
M.title_bufnr = title_popup.bufnr
local description_popup = Popup(u.create_box_popup_state("Description", true))
local description_popup = Popup(popup.create_popup_state("Description", settings))
M.description_bufnr = description_popup.bufnr
local target_branch_popup = Popup(u.create_box_popup_state("Target branch", false))
local target_branch_popup = Popup(popup.create_box_popup_state("Target branch", false, settings))
M.target_bufnr = target_branch_popup.bufnr
local delete_title = vim.o.columns > 110 and "Delete source branch" or "Delete source"
local delete_branch_popup = Popup(u.create_box_popup_state(delete_title, false))
local delete_branch_popup = Popup(popup.create_box_popup_state(delete_title, false, settings))
M.delete_branch_bufnr = delete_branch_popup.bufnr
local squash_title = vim.o.columns > 110 and "Squash commits" or "Squash"
local squash_popup = Popup(u.create_box_popup_state(squash_title, false))
local squash_popup = Popup(popup.create_box_popup_state(squash_title, false, settings))
M.squash_bufnr = squash_popup.bufnr
local forked_project_id_popup = Popup(u.create_box_popup_state("Forked Project ID", false))
local forked_project_id_popup = Popup(popup.create_box_popup_state("Forked Project ID", false, settings))
M.forked_project_id_bufnr = forked_project_id_popup.bufnr

local boxes = {}
Expand All @@ -360,14 +362,16 @@ M.create_layout = function()
}, { dir = "col" })

local layout = Layout({
position = "50%",
position = settings.position,
relative = "editor",
size = {
width = "95%",
height = "95%",
width = settings.width,
height = settings.height,
},
}, internal_layout)

popup.set_up_autocommands(description_popup, layout, vim.api.nvim_get_current_win())

layout:mount()

return layout,
Expand Down
14 changes: 8 additions & 6 deletions lua/gitlab/actions/discussions/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ local Popup = require("nui.popup")
local NuiTree = require("nui.tree")
local job = require("gitlab.job")
local u = require("gitlab.utils")
local popup = require("gitlab.popup")
local state = require("gitlab.state")
local reviewer = require("gitlab.reviewer")
local common = require("gitlab.actions.common")
local List = require("gitlab.utils.list")
local tree_utils = require("gitlab.actions.discussions.tree")
local miscellaneous = require("gitlab.actions.miscellaneous")
local discussions_tree = require("gitlab.actions.discussions.tree")
local draft_notes = require("gitlab.actions.draft_notes")
local diffview_lib = require("diffview.lib")
Expand Down Expand Up @@ -284,7 +284,7 @@ end

-- This function (settings.keymaps.discussion_tree.edit_comment) will open the edit popup for the current comment in the discussion tree
M.edit_comment = function(tree, unlinked)
local edit_popup = Popup(u.create_popup_state("Edit Comment", state.settings.popup.edit))
local edit_popup = Popup(popup.create_popup_state("Edit Comment", state.settings.popup.edit))
local current_node = tree:get_node()
local note_node = common.get_note_node(tree, current_node)
local root_node = common.get_root_node(tree, current_node)
Expand All @@ -293,6 +293,8 @@ M.edit_comment = function(tree, unlinked)
return
end

popup.set_up_autocommands(edit_popup, nil, vim.api.nvim_get_current_win())

edit_popup:mount()

-- Gather all lines from immediate children that aren't note nodes
Expand All @@ -310,19 +312,19 @@ M.edit_comment = function(tree, unlinked)

-- Draft notes module handles edits for draft notes
if M.is_draft_note(tree) then
state.set_popup_keymaps(
popup.set_popup_keymaps(
edit_popup,
draft_notes.confirm_edit_draft_note(note_node.id, unlinked),
nil,
miscellaneous.editable_popup_opts
popup.editable_popup_opts
)
else
local comment = require("gitlab.actions.comment")
state.set_popup_keymaps(
popup.set_popup_keymaps(
edit_popup,
comment.confirm_edit_comment(tostring(root_node.id), tonumber(note_node.root_note_id or note_node.id), unlinked),
nil,
miscellaneous.editable_popup_opts
popup.editable_popup_opts
)
end
end
Expand Down
12 changes: 9 additions & 3 deletions lua/gitlab/actions/help.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
local M = {}

local u = require("gitlab.utils")
local popup = require("gitlab.popup")
local event = require("nui.utils.autocmd").event
local state = require("gitlab.state")
local List = require("gitlab.utils.list")
Expand All @@ -16,15 +17,20 @@ M.open = function()
end
return agg
end, {})

local longest_line = u.get_longest_string(help_content_lines)
local help_popup =
Popup(u.create_popup_state("Help", state.settings.popup.help, longest_line + 3, #help_content_lines + 3, 60))
local opts = { "Help", state.settings.popup.help, longest_line + 3, #help_content_lines, 70 }
local help_popup = Popup(popup.create_popup_state(unpack(opts)))

help_popup:on(event.BufLeave, function()
help_popup:unmount()
end)

popup.set_up_autocommands(help_popup, nil, vim.api.nvim_get_current_win(), opts)

help_popup:mount()

state.set_popup_keymaps(help_popup, "Help", nil)
popup.set_popup_keymaps(help_popup, "Help", nil)
local currentBuffer = vim.api.nvim_get_current_buf()
vim.api.nvim_buf_set_lines(currentBuffer, 0, #help_content_lines, false, help_content_lines)
u.switch_can_edit_buf(currentBuffer, false)
Expand Down
9 changes: 5 additions & 4 deletions lua/gitlab/actions/merge.lua
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
local u = require("gitlab.utils")
local popup = require("gitlab.popup")
local Popup = require("nui.popup")
local state = require("gitlab.state")
local job = require("gitlab.job")
local reviewer = require("gitlab.reviewer")
local miscellaneous = require("gitlab.actions.miscellaneous")

local M = {}

local function create_squash_message_popup()
return Popup(u.create_popup_state("Squash Commit Message", state.settings.popup.squash_message))
return Popup(popup.create_popup_state("Squash Commit Message", state.settings.popup.squash_message))
end

---@class MergeOpts
Expand All @@ -31,10 +31,11 @@ M.merge = function(opts)

if merge_body.squash then
local squash_message_popup = create_squash_message_popup()
popup.set_up_autocommands(squash_message_popup, nil, vim.api.nvim_get_current_win())
squash_message_popup:mount()
state.set_popup_keymaps(squash_message_popup, function(text)
popup.set_popup_keymaps(squash_message_popup, function(text)
M.confirm_merge(merge_body, text)
end, nil, miscellaneous.editable_popup_opts)
end, nil, popup.editable_popup_opts)
else
M.confirm_merge(merge_body)
end
Expand Down
64 changes: 0 additions & 64 deletions lua/gitlab/actions/miscellaneous.lua
Original file line number Diff line number Diff line change
Expand Up @@ -34,70 +34,6 @@ M.attach_file = function()
end)
end

M.editable_popup_opts = {
action_before_close = true,
action_before_exit = false,
save_to_temp_register = true,
}

M.non_editable_popup_opts = {
action_before_close = true,
action_before_exit = false,
save_to_temp_register = false,
}

-- Get the index of the next popup when cycling forward
local function next_index(i, n, count)
count = count > 0 and count or 1
for _ = 1, count do
if i < n then
i = i + 1
elseif i == n then
i = 1
end
end
return i
end

---Get the index of the previous popup when cycling backward
---@param i integer The current index
---@param n integer The total number of popups
---@param count integer The count used with the keymap (replaced with 1 if no count was given)
local function prev_index(i, n, count)
count = count > 0 and count or 1
for _ = 1, count do
if i > 1 then
i = i - 1
elseif i == 1 then
i = n
end
end
return i
end

---Setup keymaps for cycling popups. The keymap accepts count.
---@param popups table Table of Popups
M.set_cycle_popups_keymaps = function(popups)
local keymaps = require("gitlab.state").settings.keymaps
if keymaps.disable_all or keymaps.popup.disable_all then
return
end

local number_of_popups = #popups
for i, popup in ipairs(popups) do
if keymaps.popup.next_field then
popup:map("n", keymaps.popup.next_field, function()
vim.api.nvim_set_current_win(popups[next_index(i, number_of_popups, vim.v.count)].winid)
end, { desc = "Go to next field (accepts count)", nowait = keymaps.popup.next_field_nowait })
end
if keymaps.popup.prev_field then
popup:map("n", keymaps.popup.prev_field, function()
vim.api.nvim_set_current_win(popups[prev_index(i, number_of_popups, vim.v.count)].winid)
end, { desc = "Go to previous field (accepts count)", nowait = keymaps.popup.prev_field_nowait })
end
end
end

---Toggle the value in a "Boolean buffer"
M.toggle_bool = function()
local bufnr = vim.api.nvim_get_current_buf()
Expand Down
Loading
Loading