Class: ScheduleInput
- Inherits:
-
SimpleForm::Inputs::Base
- Object
- SimpleForm::Inputs::Base
- ScheduleInput
- Defined in:
- app/inputs/schedule_input.rb
Overview
SimpleForm input wrapper: schedule.
Instance Method Summary collapse
Instance Method Details
#input(_wrapper_options) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'app/inputs/schedule_input.rb', line 4 def input() # Init options ||= {} # I18n weekdays = Date::DAYNAMES.map(&:downcase) weekdays = weekdays.slice(1..7) << weekdays.slice(0) day_names = I18n.t('date.day_names', default: "") day_names = day_names.blank? ? weekdays.map(&:capitalize) : day_names.slice(1..7) << day_names.slice(0) day_labels = weekdays.zip(day_names).to_h # Pass in default month names when missing in translations month_names = I18n.t('date.month_names', default: "") month_names = Date::MONTHNAMES if month_names.blank? # Pass in default order when missing in translations date_order = I18n.t('date.order', default: "") date_order = %i[year month day] if date_order.blank? # Setup date_options = { order: date_order, use_month_names: month_names } # Input html options [:type] ||= input_type if html5? # Get config options = Schedulable.config.simple_form.presence || {} # Merge input options = .merge() # Input options [:interval] = [:interval].nil? ? false : [:interval] [:until] = [:until].nil? ? false : [:until] [:count] = [:count].nil? ? false : [:count] # Setup input types input_types = { date: :date, time: :time, datetime: :datetime }.merge([:input_types] || {}) @builder.simple_fields_for(attribute_name.to_sym, @builder.object&.send(attribute_name.to_s) || @builder.object&.send("build_#{attribute_name}")) do |b| # Javascript element id field_id = b.object_name.to_s.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "") b.template.content_tag("div", { id: field_id }) do b.input(:rule, collection: %w[singular daily weekly monthly], label_method: ->(v) { I18n.t("schedulable.rules.#{v}", default: v.capitalize) }, label: 'Schedule', include_blank: false) << template.content_tag("div", { data: { group: 'singular' } }) do b.input :date, .merge({ as: input_types[:date] }) end << template.content_tag("div", { data: { group: 'weekly' } }) do b.input :day, collection: weekdays, label_method: ->(v) { " #{day_labels[v]}".html_safe }, boolean_style: :nested, as: :check_boxes end << template.content_tag("div", { data: { group: 'monthly' } }) do b.simple_fields_for :day_of_week, OpenStruct.new(b.object&.day_of_week || {}) do |db| template.content_tag("div", class: "form-group#{" has-error" if b.object&.errors.try(:[], :day_of_week).present?}") do b.label(:day_of_week, error: true) << template.content_tag("div", nil, style: 'min-width: 280px; display: table') do template.content_tag("div", nil, style: 'display: table-row') do template.content_tag("span", nil, style: 'display: table-cell;') << %w[1st 2nd 3rd 4th last].reduce(''.html_safe) do |content, item| content << template.content_tag("span", I18n.t("schedulable.monthly_week_names.#{item}", default: item.to_s), style: 'display: table-cell; text-align: center') end end << weekdays.reduce(''.html_safe) do |content, weekday| content << template.content_tag("div", nil, style: 'display: table-row') do template.content_tag("span", day_labels[weekday] || weekday, style: 'display: table-cell') << db.collection_check_boxes(weekday.to_sym, [1, 2, 3, 4, -1], ->(i) { i }, ->(_i) { " ".html_safe }, boolean_style: :inline, label: false, checked: db.object&.send(weekday), inline_label: false, item_wrapper_tag: nil) do |cb| template.content_tag("span", style: 'display: table-cell; text-align: center;') { cb.check_box(class: "check_box") } end end end end << b.error(:day_of_week) end end end << template.content_tag("div", data: { group: 'singular,daily,weekly,monthly' }) do b.input :time, .merge({ as: input_types[:time] }) end << template.content_tag("div", data: { group: 'singular,daily,weekly,monthly' }) do b.input :time_end, .merge({ as: input_types[:time] }) end << (if [:interval] template.content_tag("div", data: { group: 'daily,weekly,monthly' }) do b.input :interval end else b.input(:interval, as: :hidden, input_html: { value: 1 }) end) << (if [:until] template.content_tag("div", data: { group: 'daily,weekly,monthly' }) do b.input :until, .merge({ as: input_types[:datetime] }) end else b.input(:until, as: :hidden, input_html: { value: nil }) end) << if [:count] template.content_tag("div", data: { group: 'daily,weekly,monthly' }) do b.input :count end else b.input(:count, as: :hidden, input_html: { value: 0 }) end end << template.javascript_tag( "(function() { " \ "var container = document.querySelectorAll('##{field_id}'); container = container[container.length - 1]; " \ "var select = container.querySelector(\"select[name*='rule']\"); " \ "function update() { " \ "var value = this.value; " \ "[].slice.call(container.querySelectorAll(\"*[data-group]\")).forEach(function(elem) { " \ "var groups = elem.getAttribute('data-group').split(','); " \ "if (groups.indexOf(value) >= 0) { " \ "elem.style.display = '' " \ "} else { " \ "elem.style.display = 'none' " \ "} " \ "}); " \ "} " \ "select.addEventListener('change', update); " \ "update.call(select);" \ "})()" ) end end |