69 lines
2.1 KiB
Lua
69 lines
2.1 KiB
Lua
local Utils = require("avante.utils")
|
|
|
|
---@class avante.ui.SelectorItem
|
|
---@field id string
|
|
---@field title string
|
|
|
|
---@class avante.ui.SelectorOption
|
|
---@field provider avante.SelectorProvider
|
|
---@field title string
|
|
---@field items avante.ui.SelectorItem[]
|
|
---@field default_item_id string | nil
|
|
---@field selected_item_ids string[] | nil
|
|
---@field provider_opts table | nil
|
|
---@field on_select fun(item_ids: string[] | nil)
|
|
---@field get_preview_content fun(item_id: string): (string, string) | nil
|
|
---@field on_delete_item fun(item_id: string): (nil) | nil
|
|
---@field on_open fun(): (nil) | nil
|
|
|
|
---@class avante.ui.Selector
|
|
---@field provider avante.SelectorProvider
|
|
---@field title string
|
|
---@field items avante.ui.SelectorItem[]
|
|
---@field default_item_id string | nil
|
|
---@field provider_opts table | nil
|
|
---@field on_select fun(item_ids: string[] | nil)
|
|
---@field selected_item_ids string[] | nil
|
|
---@field get_preview_content fun(item_id: string): (string, string) | nil
|
|
---@field on_delete_item fun(item_id: string): (nil) | nil
|
|
---@field on_open fun(): (nil) | nil
|
|
local Selector = {}
|
|
Selector.__index = Selector
|
|
|
|
---@param opts avante.ui.SelectorOption
|
|
function Selector:new(opts)
|
|
local o = {}
|
|
setmetatable(o, Selector)
|
|
o.provider = opts.provider
|
|
o.title = opts.title
|
|
o.items = vim
|
|
.iter(opts.items)
|
|
:map(function(item)
|
|
local new_item = vim.deepcopy(item)
|
|
new_item.title = new_item.title:gsub("\n", " ")
|
|
return new_item
|
|
end)
|
|
:totable()
|
|
o.default_item_id = opts.default_item_id
|
|
o.provider_opts = opts.provider_opts or {}
|
|
o.on_select = opts.on_select
|
|
o.selected_item_ids = opts.selected_item_ids or {}
|
|
o.get_preview_content = opts.get_preview_content
|
|
o.on_delete_item = opts.on_delete_item
|
|
o.on_open = opts.on_open
|
|
return o
|
|
end
|
|
|
|
function Selector:open()
|
|
if type(self.provider) == "function" then
|
|
self.provider(self)
|
|
return
|
|
end
|
|
|
|
local ok, provider = pcall(require, "avante.ui.selector.providers." .. self.provider)
|
|
if not ok then Utils.error("Unknown file selector provider: " .. self.provider) end
|
|
provider.show(self)
|
|
end
|
|
|
|
return Selector
|