nitro_rails 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +18 -0
  3. data/app/assets/audio/mousetap.mp3 +0 -0
  4. data/app/assets/config/nitro_rails_manifest.js +2 -0
  5. data/app/assets/javascript/nitro_rails/application.js +4 -0
  6. data/app/assets/javascript/nitro_rails/controllers/application.js +9 -0
  7. data/app/assets/javascript/nitro_rails/controllers/audio_controller.js +16 -0
  8. data/app/assets/javascript/nitro_rails/controllers/clock_controller.js +21 -0
  9. data/app/assets/javascript/nitro_rails/controllers/editable_text_controller.js +61 -0
  10. data/app/assets/javascript/nitro_rails/controllers/index.js +21 -0
  11. data/app/assets/javascript/nitro_rails/controllers/nitro_collection_controller.js +127 -0
  12. data/app/assets/javascript/nitro_rails/controllers/nitro_controller.js +35 -0
  13. data/app/assets/javascript/nitro_rails/controllers/nitro_form_controller.js +81 -0
  14. data/app/assets/javascript/nitro_rails/controllers/panel_controller.js +70 -0
  15. data/app/assets/javascript/nitro_rails/controllers/panel_manager_controller.js +89 -0
  16. data/app/assets/javascript/nitro_rails/controllers/tabs_controller.js +81 -0
  17. data/app/assets/javascript/nitro_rails/controllers/time_zone_controller.js +47 -0
  18. data/app/assets/javascript/nitro_rails/controllers/togglable_checkbox_controller.js +9 -0
  19. data/app/assets/javascript/nitro_rails/helpers/device_info_helper.js +99 -0
  20. data/app/assets/javascript/nitro_rails/helpers/screen_info_helper.js +20 -0
  21. data/app/assets/javascript/nitro_rails/turbo_streams/clear_errors.js +22 -0
  22. data/app/assets/javascript/nitro_rails/turbo_streams/focus.js +8 -0
  23. data/app/assets/javascript/nitro_rails/turbo_streams/index.js +8 -0
  24. data/app/assets/javascript/nitro_rails/turbo_streams/insert.js +10 -0
  25. data/app/assets/javascript/nitro_rails/turbo_streams/redirect.js +10 -0
  26. data/app/assets/javascript/nitro_rails/turbo_streams/refresh_frame.js +9 -0
  27. data/app/assets/javascript/nitro_rails/turbo_streams/render_errors.js +26 -0
  28. data/app/assets/javascript/nitro_rails/turbo_streams/toggle_checkbox.js +9 -0
  29. data/app/assets/javascript/nitro_rails/turbo_streams/toggle_class.js +14 -0
  30. data/app/assets/stylesheets/nitro_rails/__reset.css +25 -0
  31. data/app/assets/stylesheets/nitro_rails/_base/_color.css +24 -0
  32. data/app/assets/stylesheets/nitro_rails/_base/_font.css +35 -0
  33. data/app/assets/stylesheets/nitro_rails/_base/_format.css +38 -0
  34. data/app/assets/stylesheets/nitro_rails/_base/_grayscale.css +79 -0
  35. data/app/assets/stylesheets/nitro_rails/_base/_utility.css +34 -0
  36. data/app/assets/stylesheets/nitro_rails/application.css +23 -0
  37. data/app/assets/stylesheets/nitro_rails/modules/action-navigation.css +24 -0
  38. data/app/assets/stylesheets/nitro_rails/modules/alert.css +31 -0
  39. data/app/assets/stylesheets/nitro_rails/modules/btn.css +57 -0
  40. data/app/assets/stylesheets/nitro_rails/modules/checkbox.css +42 -0
  41. data/app/assets/stylesheets/nitro_rails/modules/clickable.css +9 -0
  42. data/app/assets/stylesheets/nitro_rails/modules/clock.css +0 -0
  43. data/app/assets/stylesheets/nitro_rails/modules/editable-text.css +45 -0
  44. data/app/assets/stylesheets/nitro_rails/modules/forms.css +108 -0
  45. data/app/assets/stylesheets/nitro_rails/modules/hover-reveal.css +11 -0
  46. data/app/assets/stylesheets/nitro_rails/modules/inline-svg.css +14 -0
  47. data/app/assets/stylesheets/nitro_rails/modules/list.css +29 -0
  48. data/app/assets/stylesheets/nitro_rails/modules/main-navigation.css +20 -0
  49. data/app/assets/stylesheets/nitro_rails/modules/nitro-checkbox.css +42 -0
  50. data/app/assets/stylesheets/nitro_rails/modules/resource-collection.css +12 -0
  51. data/app/assets/stylesheets/nitro_rails/modules/search-bar.css +36 -0
  52. data/app/assets/stylesheets/nitro_rails/modules/settings.css +33 -0
  53. data/app/assets/stylesheets/nitro_rails/modules/tabs.css +38 -0
  54. data/app/assets/stylesheets/nitro_rails/modules/toggle-switch.css +60 -0
  55. data/app/assets/stylesheets/nitro_rails/panels/bound-card-dropdown-panel.css +0 -0
  56. data/app/assets/stylesheets/nitro_rails/panels/card-panel.css +0 -0
  57. data/app/assets/stylesheets/nitro_rails/panels/embedded-panel.css +31 -0
  58. data/app/assets/stylesheets/nitro_rails/panels/panel-display.css +111 -0
  59. data/app/assets/stylesheets/nitro_rails/panels/popup-panel.css +123 -0
  60. data/app/assets/stylesheets/nitro_rails/panels/side-panel.css +0 -0
  61. data/app/controllers/nitro_rails/sequence_controller.rb +64 -0
  62. data/app/helpers/nitro_rails/application_helper.rb +42 -1
  63. data/app/helpers/nitro_rails/color_helper.rb +23 -0
  64. data/app/helpers/nitro_rails/components_helper.rb +49 -0
  65. data/app/helpers/nitro_rails/inline_edit_helper.rb +48 -0
  66. data/app/helpers/nitro_rails/nitro_action_helper.rb +178 -0
  67. data/app/helpers/nitro_rails/nitro_collection_helper.rb +87 -0
  68. data/app/helpers/nitro_rails/nitro_edit_helper.rb +15 -0
  69. data/app/helpers/nitro_rails/nitro_form_helper.rb +104 -0
  70. data/app/helpers/nitro_rails/nitro_options_helper.rb +78 -0
  71. data/app/helpers/nitro_rails/nitro_tag_helper.rb +183 -0
  72. data/app/helpers/nitro_rails/panel_helper.rb +65 -0
  73. data/app/helpers/nitro_rails/resource_collection_helper.rb +66 -0
  74. data/app/helpers/nitro_rails/tabs_helper.rb +51 -0
  75. data/app/helpers/nitro_rails/turbo_stream_helper.rb +46 -0
  76. data/app/lib/nitro_rails/local_time.rb +51 -0
  77. data/app/lib/nitro_rails/performable_routes.rb +24 -0
  78. data/app/lib/nitro_rails/resource_collection.rb +183 -0
  79. data/app/lib/nitro_rails/sequential_routes.rb +36 -0
  80. data/app/lib/nitro_rails/time_interval.rb +88 -0
  81. data/app/lib/nitro_rails/time_string.rb +22 -0
  82. data/app/models/nitro_rails/broadcast.rb +76 -0
  83. data/app/models/nitro_rails/broadcastable_model.rb +91 -0
  84. data/app/models/nitro_rails/broadcastable_record.rb +118 -0
  85. data/app/models/nitro_rails/default_broadcasts.rb +149 -0
  86. data/app/models/nitro_rails/record.rb +50 -0
  87. data/app/pseudocode/nitro.html.erb +18 -0
  88. data/app/view_components/nitro_rails/nitro_collection/batch_selectable.rb +24 -0
  89. data/app/view_components/nitro_rails/nitro_collection.rb +66 -0
  90. data/app/view_components/nitro_rails/view_component.rb +9 -0
  91. data/app/views/layouts/nitro_rails/application.html.erb +3 -5
  92. data/app/views/nitro_rails/_editable_text.html.erb +32 -0
  93. data/app/views/nitro_rails/_nitro_checkbox.html.erb +5 -0
  94. data/app/views/nitro_rails/_nitro_form.html.erb +10 -0
  95. data/app/views/nitro_rails/_panel_frame_tag.html.erb +8 -0
  96. data/app/views/nitro_rails/_panel_template.html.erb +40 -0
  97. data/app/views/nitro_rails/_togglable_checkbox.html.erb +16 -0
  98. data/config/importmap.rb +1 -0
  99. data/config/initializers/date_formatters.rb +9 -0
  100. data/lib/nitro_rails/engine.rb +25 -0
  101. data/lib/nitro_rails/version.rb +1 -1
  102. metadata +165 -3
  103. data/app/models/nitro_rails/application_record.rb +0 -5
@@ -0,0 +1,149 @@
1
+ module NitroRails
2
+ module DefaultBroadcasts
3
+
4
+ # ------------------ #
5
+ # Generic Broadcasts #
6
+ # ------------------ #
7
+
8
+ def refresh_page
9
+ broadcast_to_user_or_public_later(:refresh) {}
10
+ end
11
+
12
+ # ------------------- #
13
+ # Creation Broadcasts #
14
+ # ------------------- #
15
+
16
+ def refresh_affiliatied_lists
17
+ affiliations.each do |affiliation|
18
+ # broadcast_to_user_or_public_later(:refresh) do |broadcast|
19
+ # broadcast.targets affiliation.nitro_data_id(collection_tag)
20
+ # end
21
+
22
+ broadcast_to_user_or_public_later(:refresh_frame) do |broadcast|
23
+ broadcast.targets affiliation.nitro_data_id(collection_tag)
24
+ end
25
+ end
26
+ end
27
+
28
+ def append_to_affiliated_lists
29
+ affiliations.each do |affiliation|
30
+ broadcast_to_user_or_public_later(:append) do |broadcast|
31
+ broadcast_attribute_tag = affiliation.nitro_data_id(collection_tag)
32
+ broadcast.targets broadcast_attribute_tag
33
+ broadcast.template(**partial_path)
34
+ broadcast.attributes(focus: true)
35
+ end
36
+ end
37
+ end
38
+
39
+ def insert_into_affiliated_lists
40
+ affiliations.each do |affiliation|
41
+ broadcast_to_user_or_public_later(:insert) do |broadcast|
42
+ broadcast.targets affiliation.nitro_data_id(collection_tag)
43
+ broadcast.template(**partial_path)
44
+ broadcast.attributes(position: 0)
45
+ end
46
+ end
47
+ end
48
+
49
+ def focus_on_new_resource
50
+ broadcast_to_user_or_public_later(:focus) do |broadcast|
51
+ broadcast.target nitro_data_id
52
+ end
53
+ end
54
+
55
+ # -------------------- #
56
+ # Attribute Broadcasts #
57
+ # -------------------- #
58
+
59
+ def update_associated_attributes
60
+ saved_changes.each do |attribute, (old_value, new_value)|
61
+ next if skipped_attributes.include?(attribute.to_sym)
62
+ broadcast_attribute(attribute)
63
+ end
64
+ end
65
+
66
+ def broadcast_attribute(attribute)
67
+ new_value = send(attribute)
68
+ replace_attribute_content(attribute, new_value)
69
+
70
+ self.class.attribute_broadcasts[attribute.to_sym].to_a.each do |attribute_broadcast|
71
+ send(*[attribute_broadcast, attribute, new_value][0..method(attribute_broadcast).arity])
72
+ end
73
+ end
74
+
75
+ def replace_attribute_content(attribute, value)
76
+ broadcast_to_user_or_public_later(:update) do |broadcast|
77
+ broadcast.targets nitro_data_id(attribute)
78
+ broadcast.template(inline: value.to_s)
79
+ end
80
+ end
81
+
82
+ def toggle_checkbox(attribute, value)
83
+ broadcast_to_user_or_public_later(:toggle_checkbox) do |broadcast|
84
+ broadcast.targets nitro_data_id(attribute)
85
+ broadcast.attributes(status: value.to_s)
86
+ end
87
+ end
88
+
89
+ def toggle_resource_attribute_class(attribute, value)
90
+ broadcast_to_user_or_public_later(:toggle_class) do |broadcast|
91
+ broadcast.targets nitro_data_id
92
+ broadcast.attributes(class: attribute, status: value)
93
+ end
94
+
95
+ broadcast_to_user_or_public_later(:toggle_class) do |broadcast|
96
+ broadcast.targets nitro_data_id
97
+ broadcast.attributes(class: "not-#{attribute}", status: !value)
98
+ end
99
+ end
100
+
101
+ # ------------------- #
102
+ # Deletion Broadcasts #
103
+ # ------------------- #
104
+
105
+ def remove_everywhere
106
+ broadcast_to_user_or_public_later(:remove) do |broadcast|
107
+ broadcast.targets nitro_data_id
108
+ end
109
+ end
110
+
111
+ # Should we just redirect back?
112
+ def redirect_to_index
113
+ broadcast_to_user_or_public_later(:redirect) do |broadcast|
114
+ broadcast.attributes(on: path_for_record, to: "/")
115
+ end
116
+ end
117
+
118
+ # ------- #
119
+ # Helpers #
120
+ # ------- #
121
+
122
+ def broadcast_to_user_later(action, &block)
123
+ Broadcast.build(self, action, &block).perform_later
124
+ end
125
+
126
+ def broadcast_to_user_or_public_later(action, &block)
127
+ if defined?(User) && self.is_a?(User)
128
+ user = self
129
+ elsif self.respond_to?(:user)
130
+ user = self.user
131
+ else
132
+ user = :public
133
+ end
134
+
135
+ Broadcast.build(user, action, &block).perform_later
136
+ end
137
+
138
+ def nitro_data_id(*attributes)
139
+ "[data-nitro-id='#{nitro_id(*attributes)}']"
140
+ end
141
+
142
+ def partial_path
143
+ {
144
+ partial: "#{collection_tag}/#{type}",
145
+ locals: { "#{type}": self, tag: :li, focus: true }
146
+ }
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,50 @@
1
+ module NitroRails
2
+ class Record < ActiveRecord::Base
3
+ include Rails.application.routes.url_helpers
4
+
5
+ self.abstract_class = true
6
+
7
+ extend NitroRails::BroadcastableModel
8
+ include NitroRails::BroadcastableRecord
9
+
10
+ after_create :broadcast_create
11
+ after_update :broadcast_update
12
+ after_destroy :broadcast_delete
13
+
14
+ def self.route_to(action)
15
+ @route ||= "/#{action.to_s.pluralize}"
16
+ end
17
+
18
+ def self.route
19
+ @route
20
+ end
21
+
22
+ def route
23
+ self.class.route || polymorphic_path(self)
24
+ end
25
+
26
+
27
+ # def self.organizable_by(methods)
28
+ # sortable_by(methods)
29
+ # filterable_by(methods)
30
+ # end
31
+
32
+ # def self.sortable_by(methods)
33
+ # @sortable_methods ||= self.column_names
34
+ # @sortable_methods += methods
35
+ # end
36
+
37
+ # def self.filterable_by(methods)
38
+ # @filterable_methods ||= self.column_names
39
+ # @filterable_methods += methods
40
+ # end
41
+
42
+ # def self.sort_methods
43
+ # @sortable_methods ||= self.column_names
44
+ # end
45
+
46
+ # def self.filter_methods
47
+ # @filterable_methods ||= self.column_names
48
+ # end
49
+ end
50
+ end
@@ -0,0 +1,18 @@
1
+ <%= nitro_resource(@project) do %>
2
+ <%= nitro_attribute(:title) %>
3
+
4
+ <%= nitro_collection(@project, :tasks) do |task| %>
5
+ <%= nitro_resource(task) do %>
6
+ <%= nitro_checkbox(:completed) %>
7
+ <%= nitro_editable_text(:description) %>
8
+ <%= nitro_panel_link("...") do %>
9
+ <%= list do %>
10
+ <%= nitro_destroy_button(task, "Delete Task") %>
11
+ <%= nitro_update_button("Archive Task", task, params: { status: "Archive" }) %>
12
+ <% end %>
13
+ <% end %>
14
+ <% end %>
15
+ <% end %>
16
+
17
+ <%= nitro_create_button("New Task", [@project, :task]) %>
18
+ <% end %>
@@ -0,0 +1,24 @@
1
+ class NitroRails::NitroCollection
2
+ module BatchSelectable
3
+ def selection_panel(**options, &block)
4
+ nitro_options(options) do |options|
5
+ options.concat(:class, "hidden")
6
+ options.concat(:data, :nitro_collection_target, "selections")
7
+ end
8
+
9
+ nitro_tag(:div, **options, &block)
10
+ end
11
+
12
+ def selection_count
13
+ content_tag(:span, id: "selection-count") do
14
+ "0"
15
+ end
16
+ end
17
+
18
+ def selection_list
19
+ content_tag(:div, id: "selection-list") do
20
+ ""
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,66 @@
1
+ class NitroRails::NitroCollection < NitroRails::ViewComponent
2
+ include NitroRails::NitroCollection::BatchSelectable
3
+
4
+ def initialize(resources, view:, **options)
5
+ @resources = resources
6
+ @view = view
7
+ @options = options
8
+ end
9
+
10
+ def render_content(&block)
11
+ container_tag(**@options) do
12
+ concat(capture(self, &block)) if block_given?
13
+ concat(render_items) unless @resources_rendered
14
+ end
15
+ end
16
+
17
+ def container_tag(**options, &block)
18
+ nitro_options(options) do |options|
19
+ options.concat(:data, :controller, "nitro-collection")
20
+ options.concat(:data, :nitro_collection_target, "container")
21
+ options.concat(:data, :nitro_collection_id, nitro_id)
22
+ end
23
+ # TODO: Probably shouldn't have to use except here
24
+ nitro_tag(:div, **options.except(:class), &block)
25
+ end
26
+
27
+ def render_items(partial = nil, **options, &block)
28
+ @resources_rendered = true
29
+
30
+ nitro_collection_tag(:ul, parent, resource_method, data: { nitro_collection_target: :collection }, class: @options.delete(:class), **options) do
31
+ @resources.each do |resource|
32
+ concat(render_item(resource, partial, &block))
33
+ end
34
+ end
35
+ end
36
+
37
+ def render_item(resource, partial, &block)
38
+ if block_given?
39
+ capture(resource, &block)
40
+ else
41
+ if partial.present?
42
+ render(partial, "#{resource.type}": resource)
43
+ else
44
+ render resource
45
+ end
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def parent
52
+ @parent ||= association&.owner
53
+ end
54
+
55
+ def resource_method
56
+ @resource_method ||= association&.reflection&.name
57
+ end
58
+
59
+ def nitro_id
60
+ @nitro_id ||= "#{parent&.nitro_id}:#{resource_method}"
61
+ end
62
+
63
+ def association
64
+ @association ||= @resources&.proxy_association
65
+ end
66
+ end
@@ -0,0 +1,9 @@
1
+ module NitroRails
2
+ class ViewComponent
3
+ delegate :content_tag, :concat, :capture, :form_tag, :hidden_field_tag, :render, :submit_tag, :turbo_stream_from, :request, :link_to, :url_for, :nitro_tag, :nitro_collection_tag, :nitro_options, to: :@view
4
+
5
+ def initialize(view:)
6
+ @view = view
7
+ end
8
+ end
9
+ end
@@ -1,15 +1,13 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <title>Nitro rails</title>
4
+ <title>Nitro Rails</title>
5
5
  <%= csrf_meta_tags %>
6
6
  <%= csp_meta_tag %>
7
7
 
8
- <%= stylesheet_link_tag "nitro_rails/application", media: "all" %>
8
+ <%= stylesheet_link_tag "nitro_rails/application", media: "all" %>
9
9
  </head>
10
10
  <body>
11
-
12
- <%= yield %>
13
-
11
+ <%= yield %>
14
12
  </body>
15
13
  </html>
@@ -0,0 +1,32 @@
1
+ <div class="editable-text-container <%= attribute_classes(resource, attribute) %>" data-controller="editable-text">
2
+ <%# <turbo-frame> %>
3
+ <%= form_with(
4
+ model: resource_path,
5
+ data: {
6
+ editable_text_target: "form",
7
+ editable_text_attribute_value: attribute,
8
+ turbo: true
9
+ }
10
+ ) do |form| %>
11
+ <%= form.hidden_field(attribute, data: { editable_text_target: "input" }) %>
12
+ <%= hidden_field_tag(:context, context) %>
13
+ <% end %>
14
+ <div class="editable-text-content">
15
+ <%= error_badge(resource, attribute) %>
16
+ <%= content_tag(tag, resource.send(attribute),
17
+ contenteditable: true,
18
+ class: "editable-text",
19
+ onfocus: "this.value = this.value;",
20
+ autofocus: focus,
21
+ placeholder: placeholder || "Enter #{resource.class.name.downcase} #{attribute.to_s.humanize.downcase} here...",
22
+ data: {
23
+ nitro_id: resource.nitro_id(attribute),
24
+ editable_text_target: "editor",
25
+ focal_point: true,
26
+ action: "blur->editable-text#blur focus->editable-text#focus keydown->editable-text#handleKeyDown"
27
+ })
28
+ %>
29
+ <%= error_message(resource, attribute) %>
30
+ </div>
31
+ <%# </turbo-frame> %>
32
+ </div>
@@ -0,0 +1,5 @@
1
+ <%= form_with(model: record, **options) do |form| %>
2
+ <label class="nitro-checkbox">
3
+ <%= form.check_box(attribute, data: { nitro_form_target: "field", nitro_effects: record.attribute_effects_string(attribute), nitro_attribute: attribute, action: "change->nitro-form#submit", nitro_id: record.nitro_id(attribute) } ) %>
4
+ </label>
5
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <%= nitro_form(model: record, **options) do |form| %>
2
+ <%= form.generate_hidden_attribute_fields %>
3
+ <%# params.each do |key, value| %>
4
+ <%# form.hidden_attribute_field(key, value) %>
5
+ <%# end %>
6
+
7
+ <%= form.submit_div do %>
8
+ <% yield %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%= turbo_frame_tag("main", target: "_top", class: "main-content-frame") do %>
2
+ <%= turbo_frame_tag("source", target: "_top") do %>
3
+ <div class="content" style="background-color: <%= content_for?(:background_color) ? yield(:background_color) : 'initial' %>;">
4
+ <%# render "aros/panel_header" if in_panel? %>
5
+ <%= yield if block_given? %>
6
+ </div>
7
+ <% end %>
8
+ <% end %>
@@ -0,0 +1,40 @@
1
+ <div class="panel-template hidden">
2
+ <div
3
+ class="panel hidden"
4
+ data-controller="panel"
5
+ data-action="visit->panel#visit"
6
+ data-panel-manager-target="panelTemplate"
7
+ >
8
+ <div class="panel-background" data-action="click->panel-manager#closeAllPanels touchend->panel-manager#closeAllPanels">
9
+ <div class="panel-display">
10
+ <%# <div class="panel-options">
11
+ <button
12
+ data-action="panel#close"
13
+ class="panel-button close-button"
14
+ >
15
+ <i class="fas fa-times"></i>
16
+ </button>
17
+ </div> %>
18
+
19
+ <div class="panel-frame-container">
20
+ <%= turbo_frame_tag("source",
21
+ target: "self",
22
+ loading: "lazy",
23
+ refresh: "morph",
24
+ prefetch: false,
25
+ data: {
26
+ "panel-target": "turboFrame",
27
+ action: "turbo:before-fetch-request->panel#beforeVisit",
28
+ class: "source",
29
+ turbo: false
30
+ }
31
+ ) do %>
32
+ <p class="load-screen">
33
+ Loading...
34
+ </p>
35
+ <% end %>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </div>
@@ -0,0 +1,16 @@
1
+ <%# CHANGE TO MATCH EDITABLE TEXT %>
2
+
3
+ <turbo-frame>
4
+ <%= form_with(model: resource_path, data: { controller: "togglable-checkbox", togglable_checkbox_target: "form" }) do |form| %>
5
+ <%= form.label(:completed, class: "checkbox", for: "task_#{resource.id}_completed") do %>
6
+ <%= form.check_box(attribute, id: "task_#{resource.id}_completed",
7
+ data: {
8
+ nitro_id: resource.nitro_id(attribute),
9
+ togglable_checkbox_target: "checkbox",
10
+ action: "change->togglable-checkbox#submit"
11
+ }
12
+ ) %>
13
+ <% end %>
14
+ <%= hidden_field_tag(:context, context) %>
15
+ <% end %>
16
+ </turbo-frame>
@@ -0,0 +1 @@
1
+ pin "nitro_rails/application", preload: true
@@ -0,0 +1,9 @@
1
+ # TODO: Move to NitroRails Engine
2
+ Time::DATE_FORMATS[:meridiem_time] = "%-l:%M %p"
3
+ DateTime::DATE_FORMATS[:weekday] = "%A"
4
+ DateTime::DATE_FORMATS[:shortened_weekday] = "%a"
5
+ Date::DATE_FORMATS[:day] = "%-d"
6
+ Date::DATE_FORMATS[:month_and_day] = "%B %-d"
7
+ Date::DATE_FORMATS[:month_day_and_year] = "%B %-d, %Y"
8
+ Date::DATE_FORMATS[:weekday_month_day_and_year] = "%A, %B %-d, %Y"
9
+ Date::DATE_FORMATS[:weekday_month_and_day] = "%A, %B %-d"
@@ -1,5 +1,30 @@
1
+ require 'importmap-rails'
2
+ require 'normalize-rails'
3
+ require 'stimulus-rails'
4
+ require 'turbo-rails'
5
+ require 'font-awesome-rails'
6
+
7
+
1
8
  module NitroRails
2
9
  class Engine < ::Rails::Engine
10
+ require "normalize-rails"
3
11
  isolate_namespace NitroRails
12
+
13
+ config.to_prepare do
14
+ helper_files = Dir.entries(NitroRails::Engine.root.join('app/helpers/nitro_rails')).each do |file|
15
+ if file =~ /_helper.rb$/
16
+ ::ApplicationController.helper("nitro_rails/#{file.gsub('.rb', '')}".camelize.constantize)
17
+ end
18
+ end
19
+ end
20
+
21
+ initializer "nitro_rails.importmap", before: "importmap" do |app|
22
+ app.config.importmap.paths << root.join("config/importmap.rb")
23
+ app.config.importmap.cache_sweepers << root.join("app/assets/javascripts")
24
+ end
25
+
26
+ initializer "nitro_rails.assets" do |app|
27
+ app.config.assets.precompile += %w[nitro_rails_manifest]
28
+ end
4
29
  end
5
30
  end
@@ -1,3 +1,3 @@
1
1
  module NitroRails
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end