diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4ed61fc..467f9b8 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,166 +1,174 @@ module ApplicationHelper # Custom helper for better display of big numbers # @example number_by_magnitude(4242) # "4.2K" # # @param number[Numeric] # @return [String] human friendly respresentation def number_by_magnitude(number) number_to_human(number, units: { thousand: :K, million: :M, billion: :G }) end # Creates a bootstrap form-group div with an additional 'Add' button next to the select field # # @param object[ActiveRecord::Object] the form's subject # @param resource[Symbol] the objects class # @param attr[Symbol] the select box's attribute # @param attr_name[String] the attribute's display name # @param options[Array] the select box options # @param path[String] the add button's path def select_with_errors_and_button(object, resource, attr, attr_name, options, path) has_errors = object.errors[attr].present? content_tag(:div, class: "form-group #{' has-error' if has_errors }") do attr_label = label(resource, attr, attr_name, class: 'control-label col-xs-5 required') select_div = content_tag(:div, class: 'col-xs-5') do select_part = select_tag([resource, attr].join('_').to_sym, options, include_blank: true, name: "#{resource}[#{attr}]", class: 'form-control' ) if has_errors select_part.concat(content_tag(:span, class: 'help-block') { object.errors[attr].first }) end select_part end button_part = content_tag(:div, class: 'col-xs-1') do link_to path do content_tag(:span, class: 'glyphicon glyphicon-plus text-success') {} end end attr_label.concat(select_div).concat(button_part) end end # Returns a style class depending on the given parameter # # @param status[Char] def success_class(status) case status when 'T' then 'success' when 'E' then 'danger' when 'f' then 'fatal' end end # Fetches the html class for a given path # # @param path[String] the path to check for # @param partial[Boolean] forces a left partial match # # @return [Hash] { class: 'active' } if the given path is the current page def active_class(path, partial = false) if current_page?(path) || (partial && request.path.starts_with?(path)) { class: 'active' } else {} end end # Constructs a breadcrumb out the given options # # @param options[Hash] a hash containing the breadcrumb links in name: path sets # @return an html ol breadcrumb def breadcrumb_with(options) content_tag(:ol, class: 'breadcrumb') do options.map { |name, path| content_tag(:li, active_class(path)) do link_to name, path end }.inject { |result, element| result.concat(element) } end end # Constructs a list with the given array elements # # @example: # inline_list([:foo, :bar]) # # # # @param arr[Array] # @return an html ul list def inline_list(arr) content_tag(:ul, class: 'list-inline') do arr.map { |element| content_tag(:li) do content_tag(:span, class: 'label label-default') do element end end }.inject { |result, element| result.concat(element) } end end # Generates a span with a yes or no and the corresponding formatting # according to the value's falseness # # @param value[Integer] def yes_no(value) klass = value == 1 ? 'label label-success' : 'label label-danger' text = value == 1 ? 'yes' : 'no' content_tag(:span, class: klass) { text } end # Generates a percentage and adds some color coding for better visibility # # @param ratio [Numeric] the ratio # @param quota [Integer] the client's space quota # # @return [String] an html label tag def pretty_percentage(ratio, quota) color = ([[ratio, 0.2].max, 0.99].min * 256).to_i.to_s(16) << '0000' content_tag(:label, class: 'label', style: "background-color:##{color}") do number_to_percentage(100 * ratio, precision: 1) end end # Generates a button that may be disabled # # @param disabled[Boolean] # @param display_text[String] # @param url[String] # @param opts[Hash] - def button_or_disabled(disabled, display_text, url, opts = {}) + def button_or_disabled_with_label(disabled, display_text, url, opts = {}) + icon_class = opts.delete(:icon_class) + text_class = opts.delete(:text_class) if disabled url = '#' opts.merge!(disabled: true) opts.reverse_merge!(title: 'Client is blocked') opts.delete(:method) else opts.delete(:title) end - link_to display_text, url, opts + link_to url, opts do + [ + content_tag(:label, class: [icon_class, text_class].join(' ')) { }, + display_text + ].join(' ').html_safe + end end + # Generates a span that contains a text and a questionmark label. # hovering on that questionmark will display a helper text # # @param text[String] the displayed text # @param tooltip[String] the displayed helper text def tooltip_label(text, tooltip) content_tag(:span, class: "data-toggle", title: tooltip) do [ text, content_tag(:label, class: "glyphicon glyphicon-question-sign") { } ].join(' ').html_safe end end end diff --git a/app/views/clients/_actions.html.erb b/app/views/clients/_actions.html.erb index 89ae5b8..6c93930 100644 --- a/app/views/clients/_actions.html.erb +++ b/app/views/clients/_actions.html.erb @@ -1,47 +1,49 @@
<% if @client.is_backed_up? %> - <%= button_or_disabled(@client.host.blocked?, 'Restore Files', - restore_client_path(@client), - class: "btn btn-warning", role: "button") %> + <%= button_or_disabled_with_label( + @client.host.blocked?, 'Restore Files', + restore_client_path(@client), + class: "btn btn-default", role: "button", + icon_class: 'glyphicon glyphicon-cloud-download', text_class: 'text-warning') %> <% end %> <% if @client.host %> <%= link_to host_path(@client.host), class: "btn btn-default", role: "button" do %> Manage Client <% end %> <% end %> <%= link_to fd_config_host_path(@client.host, token: current_user.token), class: "btn btn-default", role: "button", download: 'fd_config' do %> Download Config <% end %> <%= link_to '#', data: { toggle: 'modal', target: "#js-fd-config"} do %> <% end %>

<%= link_to 'Back to clients', clients_path %> diff --git a/app/views/clients/_job.html.erb b/app/views/clients/_job.html.erb index fec0df4..9306664 100644 --- a/app/views/clients/_job.html.erb +++ b/app/views/clients/_job.html.erb @@ -1,21 +1,23 @@ <%= job.name %> <%= job.job_type %> <%= link_to job.fileset.name, '#', data: { toggle: 'modal', target: ".js-fileset-#{job.fileset_id}:first"} %> <%= link_to job.schedule_human, '#', data: { toggle: 'modal', target: ".js-schedule-#{job.schedule_id}:first"} %> <%= I18n.l(job.created_at, format: :long) %> <% if job.baculized? && job.backup? %> - <%= button_or_disabled(@client.host.blocked? || !job.enabled?, 'Full Backup Now', - backup_now_host_job_path(job.host, job), method: :post, - class: "btn btn-success", role: "button", - title: @client.host.blocked? ? 'Client is blocked' : 'Job not enabled') %> + <%= button_or_disabled_with_label( + @client.host.blocked? || !job.enabled?, 'Full Backup Now', + backup_now_host_job_path(job.host, job), method: :post, + class: "btn btn-default", role: "button", + title: @client.host.blocked? ? 'Client is blocked' : 'Job not enabled', + icon_class: 'glyphicon glyphicon-hdd', text_class: 'text-success') %> <% end %> diff --git a/app/views/jobs/_job_template_details.html.erb b/app/views/jobs/_job_template_details.html.erb index 8d358b2..83d6708 100644 --- a/app/views/jobs/_job_template_details.html.erb +++ b/app/views/jobs/_job_template_details.html.erb @@ -1,23 +1,28 @@ <%= link_to job.name, host_job_path(@host, job) %> <%= job.job_type %> <%= link_to job.fileset.name, '#', data: { toggle: 'modal', target: ".js-fileset-#{job.fileset_id}:first"} %> <%= link_to job.schedule_human, '#', data: { toggle: 'modal', target: ".js-schedule-#{job.schedule_id}:first"} %> <%= job.client_before_run_file %> <%= job.client_after_run_file %> + <%= yes_no(job.enabled? ? 1 : 0) %> <% if job.enabled? %> - <%= button_or_disabled(@host.blocked?, 'Disable', toggle_enable_host_job_path(@host, job), - method: :patch, class: "btn btn-warning", role: "button") %> + <%= button_or_disabled_with_label( + @host.blocked?, 'Disable', toggle_enable_host_job_path(@host, job), + method: :patch, class: "btn btn-default", role: "button", + icon_class: 'glyphicon glyphicon-remove', text_class: 'text-warning') %> <% else %> - <%= button_or_disabled(@host.blocked?, 'Enable', toggle_enable_host_job_path(@host, job), - method: :patch, class: "btn btn-info", role: "button") %> + <%= button_or_disabled_with_label( + @host.blocked?, 'Enable', toggle_enable_host_job_path(@host, job), + method: :patch, class: "btn btn-default", role: "button", + icon_class: 'glyphicon glyphicon-ok', text_class: 'text-success') %> <% end %> diff --git a/app/views/jobs/_job_templates.html.erb b/app/views/jobs/_job_templates.html.erb index 7752013..79b64a6 100644 --- a/app/views/jobs/_job_templates.html.erb +++ b/app/views/jobs/_job_templates.html.erb @@ -1,24 +1,27 @@
+ <%= render partial: 'jobs/job_template_details', collection: @host.job_templates, as: :job %>
Name Type FileSet Schedule Client Before Run Job Client After Run Job EnabledActions
- <%= button_or_disabled(@host.blocked?, 'Add Job', new_host_job_path(host_id: @host.id), - class: "btn btn-success", role: "button") %> + <%= button_or_disabled_with_label( + @host.blocked?, 'Add Job', new_host_job_path(host_id: @host.id), + class: "btn btn-default", role: "button", + icon_class: 'glyphicon glyphicon-plus', text_class: 'text-success') %>