Module: Alchemy::Admin::BaseHelper
- Includes:
- NavigationHelper, BaseHelper
- Included in:
- AttachmentsHelper, ContentsHelper, ElementsHelper, PagesHelper
- Defined in:
- app/helpers/alchemy/admin/base_helper.rb
Overview
This module contains helper methods for rendering dialogs, toolbar buttons and confirmation windows.
The most important helpers for module developers are:
Instance Method Summary collapse
-
#alchemy_body_class ⇒ Object
Appends the current controller and action to body as css class.
-
#alchemy_datepicker(object, method, html_options = {}) ⇒ Object
Renders a textfield ready to display a datepicker.
-
#button_with_confirm(value = "", url = "", options = {}, html_options = {}) ⇒ Object
Returns a form and a button that opens a modal confirm dialog.
-
#clipboard_select_tag_options(items) ⇒ Object
(internal) Returns options for the clipboard select tag.
-
#current_alchemy_user_name ⇒ Object
Returns a string showing the name of the currently logged in user.
-
#delete_button(url, options = {}, html_options = {}) ⇒ Object
A delete button with confirmation window.
-
#hint_with_tooltip(text, icon: 'exclamation-triangle') ⇒ String
Renders a hint with tooltip.
-
#js_filter_field(items, options = {}) ⇒ Object
Returns a javascript driven live filter for lists.
-
#link_to_confirm_dialog(link_string = "", message = "", url = "", html_options = {}) ⇒ Object
Returns a link that opens a modal confirmation to delete window.
-
#link_to_dialog(content, url, options = {}, html_options = {}) ⇒ Object
This helper renders the link to an dialog.
-
#link_url_regexp ⇒ Object
Returns the regular expression used for external url validation in link dialog.
-
#max_image_count ⇒ Object
(internal) Returns max image count as integer or nil.
-
#new_asset_path_with_session_information(asset_type) ⇒ Object
(internal) Used by upload form.
-
#page_layout_missing_warning ⇒ Object
Renders a warning icon with a hint that explains the user that the page layout is missing.
-
#render_alchemy_title ⇒ Object
(internal) Renders translated Module Names for html title element.
-
#render_hint_for(element) ⇒ Object
Render a hint icon with tooltip for given object.
-
#sites_for_select ⇒ Object
Used for site selector in Alchemy cockpit.
-
#toolbar(options = {}) ⇒ Object
Renders the toolbar shown on top of the records.
-
#toolbar_button(options = {}) ⇒ Object
Renders a toolbar button for the Alchemy toolbar.
-
#translations_for_select ⇒ Object
Used for translations selector in Alchemy cockpit user settings.
Methods included from NavigationHelper
#alchemy_main_navigation_entry, #entry_active?, #main_navigation_css_classes, #navigate_module, #sorted_alchemy_modules, #url_for_module, #url_for_module_sub_navigation
Methods included from BaseHelper
#message_icon_class, #page_or_find, #render_flash_notice, #render_icon, #render_message, #shorten, #warning
Instance Method Details
#alchemy_body_class ⇒ Object
Appends the current controller and action to body as css class.
394 395 396 397 398 399 400 401 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 394 def alchemy_body_class [ controller_name, action_name, content_for(:main_menu_style), content_for(:alchemy_body_class) ].compact end |
#alchemy_datepicker(object, method, html_options = {}) ⇒ Object
Renders a textfield ready to display a datepicker
A Javascript observer converts this into a fancy Datepicker. If you pass ‘datetime’ as :type
the datepicker will also have a Time select. If you pass ‘time’ as :type
the datepicker will only have a Time select.
The date value gets localized via I18n.l
. The format on Time and Date is datepicker
, timepicker
or datetimepicker
, if you pass another type
.
This helper always renders “text” as input type because: HTML5 supports input types like ‘date’ but Browsers are using the users OS settings to validate the input format. Since Alchemy is localized in the backend the date formats should be aligned with the users locale setting in the backend but not the OS settings.
Date Example
<%= alchemy_datepicker(@person, :birthday) %>
Datetime Example
<%= alchemy_datepicker(@page, :public_on, type: 'datetime') %>
Time Example
<%= alchemy_datepicker(@meeting, :starts_at, type: 'time') %>
373 374 375 376 377 378 379 380 381 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 373 def alchemy_datepicker(object, method, = {}) type = .delete(:type) || 'date' date = .delete(:value) || object.send(method.to_sym).presence date = Time.zone.parse(date) if date.is_a?(String) value = date ? l(date, format: "alchemy.#{type}picker".to_sym) : nil text_field object.class.name.demodulize.underscore.to_sym, method.to_sym, {type: "text", class: type, "data-datepicker-type" => type, value: value}.merge() end |
#button_with_confirm(value = "", url = "", options = {}, html_options = {}) ⇒ Object
The method option in the html_options
hash gets passed to the form_tag
helper!
Returns a form and a button that opens a modal confirm dialog.
After confirmation it proceeds to send the form’s action.
Example:
<%= button_with_confirm('pay', '/admin/orders/1/pay', message: 'Do you really want to mark this order as payed?') %>
169 170 171 172 173 174 175 176 177 178 179 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 169 def (value = "", url = "", = {}, = {}) = { message: Alchemy.t(:confirm_to_proceed), ok_label: Alchemy.t("Yes"), title: Alchemy.t(:please_confirm), cancel_label: Alchemy.t("No") }.merge() form_tag url, {method: .delete(:method), class: 'button-with-confirm'} do value, .merge('data-alchemy-confirm' => .to_json) end end |
#clipboard_select_tag_options(items) ⇒ Object
(internal) Returns options for the clipboard select tag
404 405 406 407 408 409 410 411 412 413 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 404 def (items) if @page.persisted? && @page.can_have_cells? (grouped_elements_for_select(items, :id)) else = items.map do |item| [item.respond_to?(:display_name_with_preview_text) ? item.display_name_with_preview_text : item.name, item.id] end () end end |
#current_alchemy_user_name ⇒ Object
Returns a string showing the name of the currently logged in user.
In order to represent your own User
‘s class instance, you should add a alchemy_display_name
method to your User
class
23 24 25 26 27 28 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 23 def current_alchemy_user_name name = current_alchemy_user.try(:alchemy_display_name) if name.present? content_tag :span, "#{Alchemy.t('Logged in as')} #{name}", class: 'current-user-name' end end |
#delete_button(url, options = {}, html_options = {}) ⇒ Object
A delete button with confirmation window.
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 190 def (url, = {}, = {}) = { title: Alchemy.t('Delete'), message: Alchemy.t('Are you sure?'), icon: :minus }.merge() ( render_icon([:icon]), url, { message: [:message] }, { method: 'delete', title: [:title], class: "icon_button #{.delete(:class)}".strip }.merge() ) end |
#hint_with_tooltip(text, icon: 'exclamation-triangle') ⇒ String
Renders a hint with tooltip
Example
<%= hint_with_tooltip('Page layout is missing', icon: 'info') %>
430 431 432 433 434 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 430 def hint_with_tooltip(text, icon: 'exclamation-triangle') content_tag :span, class: 'hint-with-icon' do render_icon(icon) + content_tag(:span, text, class: 'hint-bubble') end end |
#js_filter_field(items, options = {}) ⇒ Object
Returns a javascript driven live filter for lists.
The items must have a html name
attribute that holds the filterable value.
Example
Given a list of items:
<%= js_filter_field('#products .product') %>
<ul id="products">
<li class="product" name="kat litter">Kat Litter</li>
<li class="product" name="milk">Milk</li>
</ul>
100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 100 def js_filter_field(items, = {}) = { class: 'js_filter_field', data: {'alchemy-list-filter' => items} }.merge() content_tag(:div, class: 'js_filter_field_box') do concat text_field_tag(nil, nil, ) concat render_icon(:search) concat link_to(render_icon(:times, size: 'xs'), '', class: 'js_filter_field_clear', title: Alchemy.t(:click_to_show_all)) concat content_tag(:label, Alchemy.t(:search), for: [:id]) end end |
#link_to_confirm_dialog(link_string = "", message = "", url = "", html_options = {}) ⇒ Object
Returns a link that opens a modal confirmation to delete window.
Example:
<%= link_to_confirm_dialog('delete', 'Do you really want to delete this comment?', '/admin/comments/1') %>
137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 137 def link_to_confirm_dialog(link_string = "", = "", url = "", = {}) link_to(link_string, url, .merge( 'data-alchemy-confirm-delete' => { title: Alchemy.t(:please_confirm), message: , ok_label: Alchemy.t("Yes"), cancel_label: Alchemy.t("No") }.to_json ) ) end |
#link_to_dialog(content, url, options = {}, html_options = {}) ⇒ Object
This helper renders the link to an dialog.
We use this for our fancy modal dialogs in the Alchemy cockpit.
Example
<%= link_to_dialog('Edit', edit_product_path, {size: '200x300'}, {class: 'icon_button'}) %>
54 55 56 57 58 59 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 54 def link_to_dialog(content, url, = {}, = {}) = {modal: true} = .merge() link_to content, url, .merge('data-alchemy-dialog' => .to_json) end |
#link_url_regexp ⇒ Object
Returns the regular expression used for external url validation in link dialog.
416 417 418 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 416 def link_url_regexp Alchemy::Config.get(:format_matchers)['link_url'] || /^(mailto:|\/|[a-z]+:\/\/)/ end |
#max_image_count ⇒ Object
(internal) Returns max image count as integer or nil. Used for the picture editor in element editor views.
219 220 221 222 223 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 219 def max_image_count return nil if !@options image_count = @options[:maximum_amount_of_images] || @options[:max_images] image_count.blank? ? nil : image_count.to_i end |
#new_asset_path_with_session_information(asset_type) ⇒ Object
(internal) Used by upload form
326 327 328 329 330 331 332 333 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 326 def new_asset_path_with_session_information(asset_type) session_key = Rails.application.config.[:key] if asset_type == "picture" alchemy.admin_pictures_path(session_key => [session_key], request_forgery_protection_token => form_authenticity_token, :format => :js) elsif asset_type == "attachment" alchemy.(session_key => [session_key], request_forgery_protection_token => form_authenticity_token, :format => :js) end end |
#page_layout_missing_warning ⇒ Object
Renders a warning icon with a hint that explains the user that the page layout is missing
438 439 440 441 442 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 438 def page_layout_missing_warning hint_with_tooltip( Alchemy.t(:page_definition_missing) ) end |
#render_alchemy_title ⇒ Object
(internal) Renders translated Module Names for html title element.
209 210 211 212 213 214 215 216 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 209 def render_alchemy_title if content_for?(:title) title = content_for(:title) else title = Alchemy.t(controller_name, scope: :modules) end "Alchemy CMS - #{title}" end |
#render_hint_for(element) ⇒ Object
Render a hint icon with tooltip for given object. The model class needs to include the hints module
385 386 387 388 389 390 391 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 385 def render_hint_for(element) return unless element.has_hint? content_tag :span, class: 'hint-with-icon' do render_icon('question-circle') + content_tag(:span, element.hint.html_safe, class: 'hint-bubble') end end |
#sites_for_select ⇒ Object
Used for site selector in Alchemy cockpit.
69 70 71 72 73 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 69 def sites_for_select Alchemy::Site.all.map do |site| [site.name, site.id] end end |
#toolbar(options = {}) ⇒ Object
Renders the toolbar shown on top of the records.
Example
<% label_title = Alchemy.t("Create #{resource_name}", default: Alchemy.t('Create')) %>
<% toolbar(
buttons: [
{
icon: :plus,
label: label_title,
url: new_resource_path,
title: label_title,
hotkey: 'alt+n',
dialog_options: {
title: label_title,
size: "430x400"
},
if_permitted_to: [:create, resource_model]
}
]
) %>
310 311 312 313 314 315 316 317 318 319 320 321 322 323 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 310 def ( = {}) defaults = { buttons: [], search: true } = defaults.merge() content_for(:toolbar) do content = <<-CONTENT.strip_heredoc #{[:].map { || () }.join} #{render('alchemy/admin/partials/search_form', url: [:search_url]) if [:search]} CONTENT content.html_safe end end |
#toolbar_button(options = {}) ⇒ Object
Renders a toolbar button for the Alchemy toolbar
Example
<%= toolbar_button(
icon: :plus,
label: 'Create',
url: new_resource_path,
title: 'Create Resource',
hotkey: 'alt+n',
dialog_options: {
title: 'Create Resource',
size: "430x400"
},
if_permitted_to: [:create, resource_model]
) %>
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 263 def ( = {}) = { dialog: true, skip_permission_check: false, active: false, link_options: {}, dialog_options: {}, loading_indicator: false }.merge(.symbolize_keys) = render( 'alchemy/admin/partials/toolbar_button', options: ) if [:skip_permission_check] || can?(*()) else "" end end |
#translations_for_select ⇒ Object
Used for translations selector in Alchemy cockpit user settings.
62 63 64 65 66 |
# File 'app/helpers/alchemy/admin/base_helper.rb', line 62 def translations_for_select Alchemy::I18n.available_locales.sort.map do |locale| [Alchemy.t(locale, scope: :translations), locale] end end |