Module: HakumiComponents::DatePicker::SharedRendering

Extended by:
T::Helpers, T::Sig
Included in:
Component, RangePicker
Defined in:
app/components/hakumi_components/date_picker/shared_rendering.rb

Constant Summary collapse

DateTimeLike =
T.type_alias { T.any(Date, Time, DateTime) }
PlaceholderValue =
T.type_alias { T.nilable(T.any(String, T::Array[String])) }
CalendarOptionValue =
T.type_alias do
  T.nilable(T.any(
    Date,
    Types::FormFieldValue,
    Symbol,
    T::Boolean,
    Proc,
    Types::DataAttributes
  ))
end
PICKERS =
T.let([ :date, :week, :month, :quarter, :year ].freeze, T::Array[Symbol])
DEFAULT_DATE_FORMAT =
T.let("YYYY-MM-DD", String)
DEFAULT_DATETIME_FORMAT =
T.let("YYYY-MM-DD HH:mm:ss", String)
DEFAULT_DATETIME_NO_SECONDS_FORMAT =
T.let("YYYY-MM-DD HH:mm", String)

Instance Method Summary collapse

Instance Method Details

#base_wrapper_classes(base:, extra_classes: []) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 224

def base_wrapper_classes(base:, extra_classes: [])
  class_names(
    base,
    {
      lg: date_picker_size == :large,
      sm: date_picker_size == :small,
      borderless: !date_picker_bordered,
      disabled: date_picker_disabled,
      "allow-clear": date_picker_allow_clear,
      "has-value": value_present?(date_picker_value)
    },
    extra_classes
  )
end

#calendar_component_options(value:, range: nil) ⇒ Object



249
250
251
252
253
254
255
256
257
258
259
260
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 249

def calendar_component_options(value:, range: nil)
  {
    value: value,
    default_value: date_picker_default_value,
    fullscreen: false,
    mode: picker_mode,
    show_week: date_picker_picker == :week,
    static: true,
    disabled_date: date_picker_disabled_date,
    data: picker_panel_attributes(range: range)
  }
end

#date_picker_allow_clearObject



57
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 57

def date_picker_allow_clear; end

#date_picker_borderedObject



51
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 51

def date_picker_bordered; end

#date_picker_default_valueObject



63
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 63

def date_picker_default_value; end

#date_picker_disabledObject



54
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 54

def date_picker_disabled; end

#date_picker_disabled_dateObject



66
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 66

def date_picker_disabled_date; end

#date_picker_display_formatObject



36
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 36

def date_picker_display_format; end

#date_picker_formatObject



33
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 33

def date_picker_format; end

#date_picker_pickerObject



39
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 39

def date_picker_picker; end

#date_picker_placeholderObject



69
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 69

def date_picker_placeholder; end

#date_picker_show_secondsObject



45
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 45

def date_picker_show_seconds; end

#date_picker_show_timeObject



42
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 42

def date_picker_show_time; end

#date_picker_sizeObject



48
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 48

def date_picker_size; end

#date_picker_valueObject



60
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 60

def date_picker_value; end

#dayjs_to_strftime(dayjs_format) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 147

def dayjs_to_strftime(dayjs_format)
  dayjs_format
    .gsub("YYYY", "%Y")
    .gsub("YY", "%y")
    .gsub("MMMM", "%B")
    .gsub("MMM", "%b")
    .gsub("MM", "%m")
    .gsub("M", "%-m")
    .gsub("DD", "%d")
    .gsub("D", "%-d")
    .gsub("HH", "%H")
    .gsub("hh", "%I")
    .gsub("mm", "%M")
    .gsub("ss", "%S")
    .gsub("A", "%p")
    .gsub("a", "%P")
end

#default_strftime_formatObject



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 129

def default_strftime_format
  if date_picker_show_time
    show_seconds? ? "%Y-%m-%d %H:%M:%S" : "%Y-%m-%d %H:%M"
  else
    case date_picker_picker
    when :month
      "%Y-%m"
    when :year
      "%Y"
    when :week
      "%G-W%V"
    else
      "%Y-%m-%d"
    end
  end
end

#display_formatObject



121
122
123
124
125
126
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 121

def display_format
  format_value = date_picker_format
  return format_value if format_value.present?

  default_strftime_format
end

#format_quarter(date_value) ⇒ Object



202
203
204
205
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 202

def format_quarter(date_value)
  quarter = ((date_value.month - 1) / 3) + 1
  "Q#{quarter} #{date_value.year}"
end

#formatted_value(value) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 86

def formatted_value(value)
  return nil if value.blank?

  datetime_value = parse_datetime(value)
  return value.to_s if datetime_value.nil?

  if date_picker_picker == :quarter && date_picker_display_format.blank? && date_picker_format.blank?
    return format_quarter(datetime_value.to_date)
  end

  display_format_value = date_picker_display_format
  format_value = date_picker_format

  if display_format_value.present?
    datetime_value.strftime(dayjs_to_strftime(display_format_value))
  elsif format_value.present?
    datetime_value.strftime(format_value)
  else
    datetime_value.strftime(default_strftime_format)
  end
end

#iso_value(value) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 72

def iso_value(value)
  return nil if value.blank?

  datetime_value = parse_datetime(value)
  return nil if datetime_value.nil?

  if date_picker_show_time
    show_seconds? ? datetime_value.strftime("%Y-%m-%d %H:%M:%S") : datetime_value.strftime("%Y-%m-%d %H:%M")
  else
    datetime_value.strftime("%Y-%m-%d")
  end
end

#js_display_formatObject



109
110
111
112
113
114
115
116
117
118
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 109

def js_display_format
  display_format_value = date_picker_display_format
  return display_format_value if display_format_value.present?

  if date_picker_show_time
    show_seconds? ? DEFAULT_DATETIME_FORMAT : DEFAULT_DATETIME_NO_SECONDS_FORMAT
  else
    DEFAULT_DATE_FORMAT
  end
end

#parse_date(value) ⇒ Object



183
184
185
186
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 183

def parse_date(value)
  datetime_value = parse_datetime(value)
  datetime_value&.to_date
end

#parse_datetime(value) ⇒ Object



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 166

def parse_datetime(value)
  return nil if value.nil?
  return value if value.is_a?(Time) || value.is_a?(DateTime)
  return Time.parse(value.to_s) if value.is_a?(ActiveSupport::TimeWithZone)
  return date_picker_show_time ? value.to_time : value if value.is_a?(Date)

  string_value = value.to_s
  if date_picker_show_time && string_value.include?(" ")
    Time.parse(string_value)
  else
    Date.parse(string_value)
  end
rescue ArgumentError, TypeError
  nil
end

#picker_modeObject



208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 208

def picker_mode
  case date_picker_picker
  when :date, :week
    :month
  when :month
    :year
  when :quarter
    :quarter
  when :year
    :decade
  else
    :month
  end
end

#picker_panel_attributes(range: nil) ⇒ Object



240
241
242
243
244
245
246
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 240

def picker_panel_attributes(range: nil)
  data_attrs = T.let({
    action: "hakumi--calendar:select->hakumi--date-picker#handleCalendarSelect"
  }, Types::DataAttributes)
  data_attrs[:date_range] = range if range
  data_attrs
end

#placeholder_textObject



263
264
265
266
267
268
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 263

def placeholder_text
  placeholder = date_picker_placeholder
  return placeholder if placeholder.is_a?(String)

  t_default(:placeholder, default: "Select date")
end

#range_placeholdersObject



271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 271

def range_placeholders
  placeholder = date_picker_placeholder
  if placeholder.is_a?(Array)
    values = placeholder.filter_map do |item|
      next if item.nil?

      item.to_s
    end
    return values if values.length == 2
  end

  [
    t_default(:start_placeholder, default: "Start date"),
    t_default(:end_placeholder, default: "End date")
  ]
end

#show_seconds?Boolean

Returns:

  • (Boolean)


189
190
191
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 189

def show_seconds?
  date_picker_show_seconds
end

#use_12_hours?Boolean

Returns:

  • (Boolean)


194
195
196
197
198
199
# File 'app/components/hakumi_components/date_picker/shared_rendering.rb', line 194

def use_12_hours?
  display_format_value = date_picker_display_format
  return false unless display_format_value.present?

  display_format_value.include?("hh") && (display_format_value.include?("A") || display_format_value.include?("a"))
end