Module: JSAdmin::ApplicationHelper

Defined in:
app/helpers/js_admin/application_helper.rb

Constant Summary collapse

CONTENT_FRAME_ID =
"js_admin_content"
CONTENT_BODY_ID =
"js_admin_content_body"
FLASH_ID =
"js_admin_flash"
"js_admin_theme"
TEXT_INPUT_CLASSES =
[
  "w-full rounded-md border border-slate-300 bg-white px-3.5 py-2.5 text-sm text-slate-950 shadow-sm",
  "placeholder:text-slate-400 focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-200",
  "dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100 dark:placeholder:text-slate-500",
  "dark:focus:border-sky-400 dark:focus:ring-sky-900"
].join(" ")
SELECT_INPUT_CLASSES =
[
  "w-full rounded-md border border-slate-300 bg-white px-3.5 py-2.5 text-sm text-slate-950 shadow-sm",
  "focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-200",
  "dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100",
  "dark:focus:border-sky-400 dark:focus:ring-sky-900"
].join(" ")
CHECKBOX_INPUT_CLASSES =
[
  "h-4 w-4 rounded border-slate-300 text-sky-600 focus:ring-sky-500",
  "dark:border-slate-700 dark:bg-slate-900 dark:focus:ring-sky-700"
].join(" ")
TEXT_INPUT_ERROR_CLASSES =
[
  "w-full rounded-md border border-rose-400 bg-white px-3.5 py-2.5 text-sm text-slate-950 shadow-sm",
  "placeholder:text-slate-400 focus:border-rose-500 focus:outline-none focus:ring-2 focus:ring-rose-200",
  "dark:border-rose-500 dark:bg-slate-900 dark:text-slate-100 dark:placeholder:text-slate-500",
  "dark:focus:border-rose-400 dark:focus:ring-rose-950"
].join(" ")
SELECT_INPUT_ERROR_CLASSES =
[
  "w-full rounded-md border border-rose-400 bg-white px-3.5 py-2.5 text-sm text-slate-950 shadow-sm",
  "focus:border-rose-500 focus:outline-none focus:ring-2 focus:ring-rose-200",
  "dark:border-rose-500 dark:bg-slate-900 dark:text-slate-100",
  "dark:focus:border-rose-400 dark:focus:ring-rose-950"
].join(" ")
CHECKBOX_INPUT_ERROR_CLASSES =
[
  "h-4 w-4 rounded border-rose-400 text-rose-600 focus:ring-rose-500",
  "dark:border-rose-500 dark:bg-slate-900 dark:focus:ring-rose-900"
].join(" ")
FIELD_LABEL_CLASSES =
"text-sm font-medium text-slate-700 dark:text-slate-300 sm:col-span-4"
FIELD_LABEL_ERROR_CLASSES =
"text-sm font-medium text-rose-700 dark:text-rose-300 sm:col-span-4"
FIELD_ERROR_TEXT_CLASSES =
"mt-2 text-sm text-rose-600 dark:text-rose-300"
FORM_ERROR_CLASSES =
"rounded-md border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-800 dark:border-rose-900 dark:bg-rose-950 dark:text-rose-200"
[
  "block rounded-md px-3 py-2 text-sm font-medium",
  "hover:bg-slate-100 hover:text-slate-950",
  "dark:hover:bg-slate-800 dark:hover:text-slate-100"
].join(" ")
"bg-sky-50 text-sky-700 dark:bg-sky-950 dark:text-sky-200"
"text-slate-700 dark:text-slate-300"
FLASH_BASE_CLASSES =
[
  "transform rounded-md border px-4 py-3 text-sm shadow-lg transition duration-300 ease-out"
].join(" ")
FLASH_CLASSES =
{
  notice: "border-emerald-200 bg-emerald-50 text-emerald-800 dark:border-emerald-900 dark:bg-emerald-950 dark:text-emerald-200",
  alert: "border-rose-200 bg-rose-50 text-rose-800 dark:border-rose-900 dark:bg-rose-950 dark:text-rose-200"
}.freeze
[
  "inline-flex h-9 min-w-9 items-center justify-center rounded-md border border-slate-300 bg-white px-3 text-sm font-medium",
  "text-slate-700 shadow-sm hover:bg-slate-50",
  "dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200 dark:hover:bg-slate-800"
].join(" ")
PAGINATION_DISABLED_CLASSES =
[
  "inline-flex h-9 min-w-9 items-center justify-center rounded-md border border-slate-200 bg-slate-100 px-3 text-sm font-medium",
  "text-slate-400 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-600"
].join(" ")
PAGINATION_STATUS_CLASSES =
[
  "inline-flex h-9 min-w-28 items-center justify-center rounded-md border border-slate-200 bg-slate-50 px-3 text-sm font-medium",
  "text-slate-700 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-200"
].join(" ")

Instance Method Summary collapse

Instance Method Details

#js_admin_asset_exists?(logical_path) ⇒ Boolean

Returns:

  • (Boolean)


245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'app/helpers/js_admin/application_helper.rb', line 245

def js_admin_asset_exists?(logical_path)
  assets = Rails.application.assets

  if assets.respond_to?(:load_path)
    assets.load_path.find(logical_path).present?
  elsif Rails.application.assets_manifest
    Rails.application.assets_manifest.assets[logical_path].present?
  else
    false
  end
rescue StandardError
  false
end

#js_admin_content_body_idObject



151
152
153
# File 'app/helpers/js_admin/application_helper.rb', line 151

def js_admin_content_body_id
  CONTENT_BODY_ID
end

#js_admin_content_frame_dataObject



159
160
161
162
163
# File 'app/helpers/js_admin/application_helper.rb', line 159

def js_admin_content_frame_data
  {
    turbo_action: "advance"
  }
end

#js_admin_content_frame_idObject



147
148
149
# File 'app/helpers/js_admin/application_helper.rb', line 147

def js_admin_content_frame_id
  CONTENT_FRAME_ID
end


165
166
167
168
169
170
# File 'app/helpers/js_admin/application_helper.rb', line 165

def js_admin_content_link_data
  {
    turbo_frame: js_admin_content_frame_id,
    turbo_action: "advance"
  }
end

#js_admin_field_error_id(form, field) ⇒ Object



117
118
119
# File 'app/helpers/js_admin/application_helper.rb', line 117

def js_admin_field_error_id(form, field)
  "#{js_admin_field_id(form, field)}_error"
end

#js_admin_field_error_text_classesObject



139
140
141
# File 'app/helpers/js_admin/application_helper.rb', line 139

def js_admin_field_error_text_classes
  FIELD_ERROR_TEXT_CLASSES
end

#js_admin_field_errors(record, field) ⇒ Object



121
122
123
# File 'app/helpers/js_admin/application_helper.rb', line 121

def js_admin_field_errors(record, field)
  record.errors[field.name].map(&:to_s)
end

#js_admin_field_id(form, field) ⇒ Object



113
114
115
# File 'app/helpers/js_admin/application_helper.rb', line 113

def js_admin_field_id(form, field)
  "#{form.object_name}_#{field.name}".tr("][", "_").delete_suffix("_")
end

#js_admin_field_input(form, field) ⇒ Object



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
# File 'app/helpers/js_admin/application_helper.rb', line 85

def js_admin_field_input(form, field)
  case field.input_kind
  when :text_area
    tag.textarea(js_admin_field_value(form, field), **js_admin_input_options(form, field, js_admin_text_input_classes(form, field)), rows: 5)
  when :check_box
    tag.div(class: "flex h-10 items-center") do
      safe_join([
        tag.input(type: "hidden", name: js_admin_field_name(form, field), value: "0", autocomplete: "off"),
        tag.input(**js_admin_input_options(form, field, js_admin_checkbox_input_classes(form, field)).merge(type: "checkbox", value: "1", checked: js_admin_checkbox_checked?(form, field)))
      ])
    end
  when :number_field
    tag.input(**js_admin_input_options(form, field, js_admin_text_input_classes(form, field)).merge(type: "number", step: field.number_step, value: js_admin_field_value(form, field)))
  when :date_field
    tag.input(**js_admin_input_options(form, field, js_admin_text_input_classes(form, field)).merge(type: "date", value: js_admin_formatted_field_value(form, field, "%Y-%m-%d")))
  when :datetime_field
    tag.input(**js_admin_input_options(form, field, js_admin_text_input_classes(form, field)).merge(type: "datetime-local", value: js_admin_formatted_field_value(form, field, "%Y-%m-%dT%H:%M:%S")))
  when :time_field
    tag.input(**js_admin_input_options(form, field, js_admin_text_input_classes(form, field)).merge(type: "time", value: js_admin_formatted_field_value(form, field, "%H:%M:%S")))
  when :enum_select
    select_tag(js_admin_field_name(form, field), options_for_select(field.enum_values, js_admin_field_value(form, field)), js_admin_select_options(form, field))
  when :association_select
    select_tag(js_admin_field_name(form, field), options_for_select(field.association_options, js_admin_field_value(form, field)), js_admin_select_options(form, field))
  else
    tag.input(**js_admin_input_options(form, field, js_admin_text_input_classes(form, field)).merge(type: "text", value: js_admin_field_value(form, field)))
  end
end

#js_admin_field_label_classes(record, field) ⇒ Object



135
136
137
# File 'app/helpers/js_admin/application_helper.rb', line 135

def js_admin_field_label_classes(record, field)
  js_admin_field_errors(record, field).any? ? FIELD_LABEL_ERROR_CLASSES : FIELD_LABEL_CLASSES
end

#js_admin_flash_classes(type) ⇒ Object



213
214
215
# File 'app/helpers/js_admin/application_helper.rb', line 213

def js_admin_flash_classes(type)
  [ FLASH_BASE_CLASSES, FLASH_CLASSES.fetch(type.to_sym) ].join(" ")
end

#js_admin_flash_idObject



155
156
157
# File 'app/helpers/js_admin/application_helper.rb', line 155

def js_admin_flash_id
  FLASH_ID
end

#js_admin_form_error_classesObject



143
144
145
# File 'app/helpers/js_admin/application_helper.rb', line 143

def js_admin_form_error_classes
  FORM_ERROR_CLASSES
end

#js_admin_form_errors(record, resource) ⇒ Object



125
126
127
128
129
130
131
132
133
# File 'app/helpers/js_admin/application_helper.rb', line 125

def js_admin_form_errors(record, resource)
  editable_attributes = resource.editable_fields.map { |field| field.name.to_sym }

  record.errors.filter_map do |error|
    next if editable_attributes.include?(error.attribute.to_sym)

    error.full_message
  end
end

#js_admin_html_classesObject



241
242
243
# File 'app/helpers/js_admin/application_helper.rb', line 241

def js_admin_html_classes
  "dark" if cookies[THEME_COOKIE_NAME] == "dark"
end

#js_admin_javascript_tagsObject



235
236
237
238
239
# File 'app/helpers/js_admin/application_helper.rb', line 235

def js_admin_javascript_tags
  return unless respond_to?(:javascript_importmap_tags)

  javascript_importmap_tags "js_admin"
end

#js_admin_pagination_disabled_classesObject



221
222
223
# File 'app/helpers/js_admin/application_helper.rb', line 221

def js_admin_pagination_disabled_classes
  PAGINATION_DISABLED_CLASSES
end


217
218
219
# File 'app/helpers/js_admin/application_helper.rb', line 217

def js_admin_pagination_link_classes
  PAGINATION_LINK_CLASSES
end

#js_admin_pagination_status_classesObject



225
226
227
# File 'app/helpers/js_admin/application_helper.rb', line 225

def js_admin_pagination_status_classes
  PAGINATION_STATUS_CLASSES
end


203
204
205
206
207
208
209
210
211
# File 'app/helpers/js_admin/application_helper.rb', line 203

def js_admin_sidebar_link_classes(resource)
  state_classes = if js_admin_sidebar_resource_active?(resource)
    SIDEBAR_LINK_ACTIVE_CLASSES
  else
    SIDEBAR_LINK_INACTIVE_CLASSES
  end

  "#{SIDEBAR_LINK_BASE_CLASSES} #{state_classes}"
end

#js_admin_sidebar_namespace_groupsObject



183
184
185
186
187
188
189
# File 'app/helpers/js_admin/application_helper.rb', line 183

def js_admin_sidebar_namespace_groups
  js_admin_sidebar_resources
    .reject { |resource| js_admin_resource_namespace(resource).blank? }
    .group_by { |resource| js_admin_resource_namespace(resource) }
    .sort_by { |namespace, _resources| namespace }
    .to_h
end

#js_admin_sidebar_namespace_label(namespace) ⇒ Object



195
196
197
# File 'app/helpers/js_admin/application_helper.rb', line 195

def js_admin_sidebar_namespace_label(namespace)
  namespace.split("::").map { |name| name.underscore.humanize }.join(" / ")
end

#js_admin_sidebar_namespace_open?(resources) ⇒ Boolean

Returns:

  • (Boolean)


199
200
201
# File 'app/helpers/js_admin/application_helper.rb', line 199

def js_admin_sidebar_namespace_open?(resources)
  resources.any? { |resource| js_admin_sidebar_resource_active?(resource) }
end

#js_admin_sidebar_resource_label(resource) ⇒ Object



191
192
193
# File 'app/helpers/js_admin/application_helper.rb', line 191

def js_admin_sidebar_resource_label(resource)
  resource.model_class.name.demodulize.underscore.humanize
end

#js_admin_sidebar_top_level_resourcesObject



179
180
181
# File 'app/helpers/js_admin/application_helper.rb', line 179

def js_admin_sidebar_top_level_resources
  js_admin_sidebar_resources.select { |resource| js_admin_resource_namespace(resource).blank? }
end


229
230
231
232
233
# File 'app/helpers/js_admin/application_helper.rb', line 229

def js_admin_stylesheet_link_tag(logical_name)
  return unless js_admin_asset_exists?("#{logical_name}.css")

  stylesheet_link_tag logical_name, "data-turbo-track": "reload"
end

#js_admin_table_value(field, record) ⇒ Object



172
173
174
175
176
177
# File 'app/helpers/js_admin/application_helper.rb', line 172

def js_admin_table_value(field, record)
  value = field.formatted_value(record)
  classes = value == "NULL" ? "text-slate-400 dark:text-slate-500" : "text-slate-700 dark:text-slate-200"

  tag.span(truncate(value, length: 80), class: classes)
end