From e6ed0c0588f90b6d10d697e7ac1f6b80ec9ce985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20F=2E=20Bortl=C3=ADk?= Date: Tue, 19 Nov 2024 01:37:48 +0100 Subject: [PATCH 1/6] fix: use correct size for summary layout --- lua/gitlab/actions/summary.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/gitlab/actions/summary.lua b/lua/gitlab/actions/summary.lua index 9f75ca7d..c438d80c 100644 --- a/lua/gitlab/actions/summary.lua +++ b/lua/gitlab/actions/summary.lua @@ -184,7 +184,7 @@ M.create_layout = function(info_lines) Layout.Box({ Layout.Box(details_popup, { size = longest_line + 3 }), Layout.Box(description_popup, { grow = 1 }), - }, { dir = "row", size = "100%" }), + }, { dir = "row", size = "95%" }), }, { dir = "col" }) else internal_layout = Layout.Box({ From 3afc86fc5e74c7d1e9c5781099ad3cc7c75014be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20F=2E=20Bortl=C3=ADk?= Date: Thu, 21 Nov 2024 10:53:03 +0100 Subject: [PATCH 2/6] feat: automatically update Assignees and Reviewers in Summary --- .../actions/assignees_and_reviewers.lua | 11 ++-- lua/gitlab/actions/summary.lua | 54 +++++++++++++++---- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/lua/gitlab/actions/assignees_and_reviewers.lua b/lua/gitlab/actions/assignees_and_reviewers.lua index 329f3825..77716d1e 100644 --- a/lua/gitlab/actions/assignees_and_reviewers.lua +++ b/lua/gitlab/actions/assignees_and_reviewers.lua @@ -22,6 +22,12 @@ M.delete_reviewer = function() M.delete_popup("reviewer") end +local refresh_user_state = function(type, data, message) + u.notify(message, vim.log.levels.INFO) + state.INFO[type] = data + require("gitlab.actions.summary").update_summary_details() +end + M.add_popup = function(type) local plural = type .. "s" local current = state.INFO[plural] @@ -39,8 +45,7 @@ M.add_popup = function(type) table.insert(current_ids, choice.id) local body = { ids = current_ids } job.run_job("/mr/" .. type, "PUT", body, function(data) - u.notify(data.message, vim.log.levels.INFO) - state.INFO[plural] = data[plural] + refresh_user_state(plural, data[plural], data.message) end) end) end @@ -61,7 +66,7 @@ M.delete_popup = function(type) local body = { ids = ids } job.run_job("/mr/" .. type, "PUT", body, function(data) u.notify(data.message, vim.log.levels.INFO) - state.INFO[plural] = data[plural] + refresh_user_state(plural, data[plural], data.message) end) end) end diff --git a/lua/gitlab/actions/summary.lua b/lua/gitlab/actions/summary.lua index c438d80c..5802e4e3 100644 --- a/lua/gitlab/actions/summary.lua +++ b/lua/gitlab/actions/summary.lua @@ -35,6 +35,9 @@ M.summary = function() local info_lines = state.settings.info.enabled and M.build_info_lines() or { "" } local layout, title_popup, description_popup, info_popup = M.create_layout(info_lines) + + layout:mount() + local popups = { title_popup, description_popup, @@ -42,6 +45,9 @@ M.summary = function() } M.layout = layout + M.info_popup = info_popup + M.title_popup = title_popup + M.description_popup = description_popup M.layout_buf = layout.bufnr M.layout_visible = true @@ -55,9 +61,7 @@ M.summary = function() vim.api.nvim_buf_set_lines(title_popup.bufnr, 0, -1, false, { title }) if info_popup then - vim.api.nvim_buf_set_lines(info_popup.bufnr, 0, -1, false, info_lines) - u.switch_can_edit_buf(info_popup.bufnr, false) - M.color_details(info_popup.bufnr) -- Color values in details popup + M.update_details_popup(info_popup.bufnr, info_lines) end popup.set_popup_keymaps( @@ -87,6 +91,23 @@ M.summary = function() git.check_mr_in_good_condition() end +M.update_summary_details = function() + if not M.info_popup or not M.info_popup.bufnr then + return + end + local details_lines = state.settings.info.enabled and M.build_info_lines() or { "" } + local internal_layout = M.create_internal_layout(details_lines, M.title_popup, M.description_popup, M.info_popup) + M.layout:update(M.get_outer_layout(), internal_layout) + M.update_details_popup(M.info_popup.bufnr, details_lines) +end + +M.update_details_popup = function(bufnr, info_lines) + u.switch_can_edit_buf(bufnr, true) + vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, info_lines) + u.switch_can_edit_buf(bufnr, false) + M.color_details(bufnr) -- Color values in details popup +end + -- Builds a lua list of strings that contain metadata about the current MR. Only builds the -- lines that users include in their state.settings.info.fields list. M.build_info_lines = function() @@ -173,10 +194,22 @@ M.create_layout = function(info_lines) local description_popup = Popup(popup.create_popup_state("Description", settings)) M.description_bufnr = description_popup.bufnr local details_popup + if state.settings.info.enabled then + details_popup = Popup(popup.create_box_popup_state("Details", false, settings)) + end + + local internal_layout = M.create_internal_layout(info_lines, title_popup, description_popup, details_popup) + + local layout = Layout(M.get_outer_layout(), internal_layout) + popup.set_up_autocommands(description_popup, layout, vim.api.nvim_get_current_win()) + + return layout, title_popup, description_popup, details_popup +end + +M.create_internal_layout = function(info_lines, title_popup, description_popup, details_popup) local internal_layout if state.settings.info.enabled then - details_popup = Popup(popup.create_box_popup_state("Details", false, settings)) if state.settings.info.horizontal then local longest_line = u.get_longest_string(info_lines) internal_layout = Layout.Box({ @@ -199,20 +232,19 @@ M.create_layout = function(info_lines) Layout.Box(description_popup, { grow = 1 }), }, { dir = "col" }) end + return internal_layout +end - local layout = Layout({ +M.get_outer_layout = function() + local settings = u.merge(state.settings.popup, state.settings.popup.summary or {}) + { position = settings.position, relative = "editor", size = { 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, title_popup, description_popup, details_popup + } end M.color_details = function(bufnr) From c9cb3653c54edaaeb68714d5c05367b7ed7185c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20F=2E=20Bortl=C3=ADk?= Date: Thu, 21 Nov 2024 10:53:46 +0100 Subject: [PATCH 3/6] feat: automatically update Labels in Summary --- lua/gitlab/actions/labels.lua | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lua/gitlab/actions/labels.lua b/lua/gitlab/actions/labels.lua index da9447f6..e182df73 100644 --- a/lua/gitlab/actions/labels.lua +++ b/lua/gitlab/actions/labels.lua @@ -14,8 +14,10 @@ M.delete_label = function() M.delete_popup("label") end -local refresh_label_state = function(labels) +local refresh_label_state = function(labels, message) + u.notify(message, vim.log.levels.INFO) state.INFO.labels = labels + require("gitlab.actions.summary").update_summary_details() end local get_current_labels = function() @@ -41,9 +43,7 @@ M.add_popup = function(type) table.insert(current_labels, choice) local body = { labels = current_labels } job.run_job("/mr/" .. type, "PUT", body, function(data) - u.notify(data.message, vim.log.levels.INFO) - - refresh_label_state(data.labels) + refresh_label_state(data.labels, data.message) end) end) end @@ -59,8 +59,7 @@ M.delete_popup = function(type) local filtered_labels = u.filter(current_labels, choice) local body = { labels = filtered_labels } job.run_job("/mr/" .. type, "PUT", body, function(data) - u.notify(data.message, vim.log.levels.INFO) - refresh_label_state(data.labels) + refresh_label_state(data.labels, data.message) end) end) end From c995305e5e1c2ae75ec6a73f4c64785fb4c2b285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20F=2E=20Bortl=C3=ADk?= Date: Thu, 21 Nov 2024 10:50:03 +0100 Subject: [PATCH 4/6] feat: automatically update MR status in Summary --- lua/gitlab/actions/approvals.lua | 17 +++++++++++++++-- lua/gitlab/actions/summary.lua | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lua/gitlab/actions/approvals.lua b/lua/gitlab/actions/approvals.lua index 8ca7669c..12b3e09d 100644 --- a/lua/gitlab/actions/approvals.lua +++ b/lua/gitlab/actions/approvals.lua @@ -1,13 +1,26 @@ local job = require("gitlab.job") +local state = require("gitlab.state") +local u = require("gitlab.utils") local M = {} +local refresh_status_state = function(data) + u.notify(data.message, vim.log.levels.INFO) + state.load_new_state("info", function() + require("gitlab.actions.summary").update_summary_details() + end) +end + M.approve = function() - job.run_job("/mr/approve", "POST") + job.run_job("/mr/approve", "POST", nil, function(data) + refresh_status_state(data) + end) end M.revoke = function() - job.run_job("/mr/revoke", "POST") + job.run_job("/mr/revoke", "POST", nil, function(data) + refresh_status_state(data) + end) end return M diff --git a/lua/gitlab/actions/summary.lua b/lua/gitlab/actions/summary.lua index 5802e4e3..d045ffaf 100644 --- a/lua/gitlab/actions/summary.lua +++ b/lua/gitlab/actions/summary.lua @@ -237,7 +237,7 @@ end M.get_outer_layout = function() local settings = u.merge(state.settings.popup, state.settings.popup.summary or {}) - { + return { position = settings.position, relative = "editor", size = { From 8cdb3b0a17953f62b170b8339248378570af792b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20F=2E=20Bortl=C3=ADk?= Date: Fri, 6 Dec 2024 23:51:43 +0100 Subject: [PATCH 5/6] refactor: use better helper function name --- lua/gitlab/actions/summary.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/gitlab/actions/summary.lua b/lua/gitlab/actions/summary.lua index d045ffaf..61958fcd 100644 --- a/lua/gitlab/actions/summary.lua +++ b/lua/gitlab/actions/summary.lua @@ -97,7 +97,7 @@ M.update_summary_details = function() end local details_lines = state.settings.info.enabled and M.build_info_lines() or { "" } local internal_layout = M.create_internal_layout(details_lines, M.title_popup, M.description_popup, M.info_popup) - M.layout:update(M.get_outer_layout(), internal_layout) + M.layout:update(M.get_outer_layout_config(), internal_layout) M.update_details_popup(M.info_popup.bufnr, details_lines) end @@ -200,7 +200,7 @@ M.create_layout = function(info_lines) local internal_layout = M.create_internal_layout(info_lines, title_popup, description_popup, details_popup) - local layout = Layout(M.get_outer_layout(), internal_layout) + local layout = Layout(M.get_outer_layout_config(), internal_layout) popup.set_up_autocommands(description_popup, layout, vim.api.nvim_get_current_win()) @@ -235,7 +235,7 @@ M.create_internal_layout = function(info_lines, title_popup, description_popup, return internal_layout end -M.get_outer_layout = function() +M.get_outer_layout_config = function() local settings = u.merge(state.settings.popup, state.settings.popup.summary or {}) return { position = settings.position, From dbfc003b7ea753913873fb36dee80818bfbfa6ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20F=2E=20Bortl=C3=ADk?= Date: Fri, 6 Dec 2024 23:52:20 +0100 Subject: [PATCH 6/6] docs: add function annotations --- lua/gitlab/actions/summary.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lua/gitlab/actions/summary.lua b/lua/gitlab/actions/summary.lua index 61958fcd..f23d0d8d 100644 --- a/lua/gitlab/actions/summary.lua +++ b/lua/gitlab/actions/summary.lua @@ -187,6 +187,8 @@ M.edit_summary = function() end) end +---Create the Summary layout and individual popups that make up the Layout. +---@return NuiLayout, NuiPopup, NuiPopup, NuiPopup M.create_layout = function(info_lines) local settings = u.merge(state.settings.popup, state.settings.popup.summary or {}) local title_popup = Popup(popup.create_box_popup_state(nil, false, settings)) @@ -207,6 +209,12 @@ M.create_layout = function(info_lines) return layout, title_popup, description_popup, details_popup end +---Create the internal layout of the Summary and individual popups that make up the Layout. +---@param info_lines string[] Table of strings that make up the details content +---@param title_popup NuiPopup +---@param description_popup NuiPopup +---@param details_popup NuiPopup +---@return NuiLayout.Box M.create_internal_layout = function(info_lines, title_popup, description_popup, details_popup) local internal_layout if state.settings.info.enabled then @@ -235,6 +243,8 @@ M.create_internal_layout = function(info_lines, title_popup, description_popup, return internal_layout end +---Create the config for the outer Layout of the Summary +---@return nui_layout_options M.get_outer_layout_config = function() local settings = u.merge(state.settings.popup, state.settings.popup.summary or {}) return {