class Plutonium::UI::Table::Components::Toolbar
tight strip rendered above the table when shell == :modern.
inline search, and column config / overflow icon buttons into a single
Modern index toolbar combining view switcher, filter/group controls,
def active_filter_count
def active_filter_count @query ? @query.active_filter_descriptions.size : 0 end
def has_filters?
def has_filters? @query && @query.filter_definitions.present? end
def has_search?
def has_search? @query && @query.search_filter.present? end
def initialize(query:, search_url:, search_param: :q, search_value: nil, views: [:table], current_view: :table, view_cookie_name: nil, view_cookie_path: "/")
def initialize(query:, search_url:, search_param: :q, search_value: nil, views: [:table], current_view: :table, view_cookie_name: nil, view_cookie_path: "/") @query = query @search_url = search_url @search_param = search_param @search_value = search_value @views = views @current_view = current_view @view_cookie_name = view_cookie_name @view_cookie_path = view_cookie_path end
def render?
def render? @views.size > 1 || has_filters? || has_search? end
def render_divider
def render_divider div(class: "w-px h-5 bg-[var(--pu-border)]") end
def render_filter_button
def render_filter_button return unless has_filters? count = active_filter_count button( type: "button", class: "pu-btn pu-btn-outline pu-btn-sm", data: {action: "click->filter-panel#toggle"} ) do render Phlex::TablerIcons::AdjustmentsHorizontal.new(class: "w-4 h-4 shrink-0") span { "Filter" } if count > 0 span(class: "ml-1 inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 " \ "rounded-full bg-primary-600 text-white text-[10px] font-semibold leading-none") do plain count.to_s end end end end
def render_search
def render_search form(method: :get, action: @search_url) do div(class: "relative") do div(class: "absolute inset-y-0 left-0 flex items-center pl-2 pointer-events-none") do render Phlex::TablerIcons::Search.new(class: "w-4 h-4 text-[var(--pu-text-muted)]") end input( id: "pu-toolbar-search", type: "search", name: "#{@search_param}[search]", value: @search_value, placeholder: "Search...", class: "pu-input pu-input-toolbar pu-input-icon-left w-[220px]", # turbo-permanent + a stable id keep the DOM node # across Turbo morphs so focus / caret / IME state # survive the search-as-you-type submit cycle. data: { controller: "autosubmit", action: "input->autosubmit#submit search->autosubmit#submit", turbo_permanent: true } ) end end end
def view_template
def view_template div(class: "flex items-center gap-2 px-4 py-2 border-b border-[var(--pu-border)] bg-[var(--pu-surface-alt)]") do switcher = ViewSwitcher.new(views: @views, current: @current_view, cookie_name: @view_cookie_name, cookie_path: @view_cookie_path) render switcher render_divider if switcher.render? render_filter_button div(class: "flex-1") render_search if has_search? end end