spina 2.12.0 → 2.13.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of spina might be problematic. Click here for more details.

Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +17 -17
  3. data/app/assets/builds/spina/tailwind.css +79 -47
  4. data/app/components/spina/application_component.rb +1 -1
  5. data/app/components/spina/forms/group_component.rb +2 -3
  6. data/app/components/spina/forms/label_component.rb +2 -3
  7. data/app/components/spina/forms/password_field_component.rb +1 -1
  8. data/app/components/spina/forms/switch_component.rb +2 -3
  9. data/app/components/spina/forms/text_field_component.rb +8 -9
  10. data/app/components/spina/forms/trix_toolbar_component.rb +1 -3
  11. data/app/components/spina/hooks/hook_component.rb +3 -5
  12. data/app/components/spina/hooks/partial_component.rb +4 -5
  13. data/app/components/spina/main_navigation/link_component.rb +1 -3
  14. data/app/components/spina/main_navigation/sub_nav_component.rb +6 -7
  15. data/app/components/spina/media_picker/image_component.rb +1 -3
  16. data/app/components/spina/media_picker/modal_component.rb +4 -6
  17. data/app/components/spina/pages/actions_component.rb +1 -3
  18. data/app/components/spina/pages/list_component.rb +3 -4
  19. data/app/components/spina/pages/location_component.rb +10 -11
  20. data/app/components/spina/pages/new_page_button_component.rb +4 -5
  21. data/app/components/spina/pages/page_component.rb +8 -9
  22. data/app/components/spina/pages/page_select_component.rb +3 -4
  23. data/app/components/spina/pages/tab_button_component.rb +1 -3
  24. data/app/components/spina/pages/translations_component.rb +9 -11
  25. data/app/components/spina/user_interface/dropdown_button_component.rb +4 -4
  26. data/app/components/spina/user_interface/dropdown_component.rb +8 -9
  27. data/app/components/spina/user_interface/flash_message_component.rb +3 -5
  28. data/app/components/spina/user_interface/header_component.rb +2 -2
  29. data/app/components/spina/user_interface/modal_component.rb +1 -3
  30. data/app/components/spina/user_interface/tab_link_component.rb +1 -3
  31. data/app/components/spina/user_interface/translations_component.rb +8 -10
  32. data/app/controllers/concerns/spina/api/paginable.rb +36 -37
  33. data/app/controllers/concerns/spina/current_spina_account.rb +1 -1
  34. data/app/controllers/concerns/spina/current_theme.rb +6 -7
  35. data/app/controllers/concerns/spina/frontend.rb +58 -44
  36. data/app/controllers/spina/admin/accounts_controller.rb +9 -10
  37. data/app/controllers/spina/admin/admin_controller.rb +18 -18
  38. data/app/controllers/spina/admin/attachments_controller.rb +15 -10
  39. data/app/controllers/spina/admin/embeds_controller.rb +17 -19
  40. data/app/controllers/spina/admin/images_controller.rb +24 -25
  41. data/app/controllers/spina/admin/layout_controller.rb +19 -20
  42. data/app/controllers/spina/admin/media_folders_controller.rb +4 -5
  43. data/app/controllers/spina/admin/media_picker_controller.rb +2 -4
  44. data/app/controllers/spina/admin/move_pages_controller.rb +8 -10
  45. data/app/controllers/spina/admin/navigation_items_controller.rb +13 -14
  46. data/app/controllers/spina/admin/navigations_controller.rb +26 -26
  47. data/app/controllers/spina/admin/page_translations_controller.rb +1 -3
  48. data/app/controllers/spina/admin/pages_controller.rb +34 -34
  49. data/app/controllers/spina/admin/parent_pages_controller.rb +1 -3
  50. data/app/controllers/spina/admin/password_resets_controller.rb +8 -9
  51. data/app/controllers/spina/admin/resources_controller.rb +14 -15
  52. data/app/controllers/spina/admin/sessions_controller.rb +2 -2
  53. data/app/controllers/spina/admin/settings_controller.rb +28 -29
  54. data/app/controllers/spina/admin/theme_controller.rb +10 -11
  55. data/app/controllers/spina/admin/users_controller.rb +28 -29
  56. data/app/controllers/spina/api/api_controller.rb +17 -17
  57. data/app/controllers/spina/api/images_controller.rb +1 -3
  58. data/app/controllers/spina/api/navigations_controller.rb +2 -4
  59. data/app/controllers/spina/api/pages_controller.rb +8 -9
  60. data/app/controllers/spina/api/resources_controller.rb +2 -4
  61. data/app/controllers/spina/application_controller.rb +4 -3
  62. data/app/controllers/spina/pages_controller.rb +4 -5
  63. data/app/controllers/spina/sitemaps_controller.rb +0 -2
  64. data/app/helpers/spina/admin/icons_helper.rb +151 -153
  65. data/app/helpers/spina/admin/images_helper.rb +0 -2
  66. data/app/helpers/spina/admin/pages_helper.rb +3 -5
  67. data/app/helpers/spina/attachments_helper.rb +1 -3
  68. data/app/helpers/spina/images_helper.rb +5 -7
  69. data/app/helpers/spina/pages_helper.rb +0 -2
  70. data/app/helpers/spina/spina_helper.rb +1 -3
  71. data/app/jobs/spina/replace_signed_id_job.rb +10 -11
  72. data/app/jobs/spina/resource_pages_update_job.rb +1 -1
  73. data/app/mailers/spina/application_mailer.rb +2 -2
  74. data/app/mailers/spina/user_mailer.rb +4 -6
  75. data/app/models/concerns/spina/gravatar.rb +11 -12
  76. data/app/models/concerns/spina/partable.rb +4 -6
  77. data/app/models/concerns/spina/translated_content.rb +5 -5
  78. data/app/models/spina/account.rb +9 -10
  79. data/app/models/spina/application_record.rb +2 -3
  80. data/app/models/spina/attachment.rb +3 -4
  81. data/app/models/spina/current.rb +1 -1
  82. data/app/models/spina/embeds/base.rb +2 -2
  83. data/app/models/spina/embeds/button.rb +4 -4
  84. data/app/models/spina/embeds/vimeo.rb +17 -18
  85. data/app/models/spina/embeds/youtube.rb +18 -19
  86. data/app/models/spina/image.rb +4 -4
  87. data/app/models/spina/media_folder.rb +1 -1
  88. data/app/models/spina/navigation.rb +1 -2
  89. data/app/models/spina/navigation_item.rb +2 -2
  90. data/app/models/spina/page.rb +32 -38
  91. data/app/models/spina/parts/attachment.rb +1 -2
  92. data/app/models/spina/parts/base.rb +5 -4
  93. data/app/models/spina/parts/image.rb +3 -4
  94. data/app/models/spina/parts/image_collection.rb +2 -3
  95. data/app/models/spina/parts/image_variant.rb +3 -4
  96. data/app/models/spina/parts/repeater_content.rb +2 -2
  97. data/app/models/spina/resource.rb +3 -4
  98. data/app/models/spina/rewrite_rule.rb +1 -1
  99. data/app/models/spina/setting.rb +0 -2
  100. data/app/models/spina/user.rb +3 -4
  101. data/app/presenters/spina/content_presenter.rb +11 -12
  102. data/app/presenters/spina/menu_presenter.rb +55 -55
  103. data/app/presenters/spina/rich_text_presenter.rb +28 -29
  104. data/app/serializers/spina/api/base_serializer.rb +1 -1
  105. data/app/serializers/spina/api/image_serializer.rb +6 -6
  106. data/app/serializers/spina/api/navigation_serializer.rb +4 -7
  107. data/app/serializers/spina/api/page_serializer.rb +9 -12
  108. data/app/serializers/spina/api/resource_serializer.rb +5 -5
  109. data/app/views/layouts/spina/admin/application.html.erb +1 -0
  110. data/app/views/spina/admin/parts/attachments/_attachment.html.erb +3 -0
  111. data/app/views/spina/admin/parts/attachments/_form.html.erb +22 -1
  112. data/app/views/spina/admin/parts/repeaters/_fields.html.erb +2 -2
  113. data/app/views/spina/admin/parts/repeaters/_form.html.erb +4 -4
  114. data/app/views/spina/admin/shared/_navigation.html.erb +3 -1
  115. data/app/views/spina/admin/shared/_version.html.erb +18 -0
  116. data/app/views/spina/sitemaps/show.xml.builder +1 -1
  117. data/config/initializers/importmap.rb +3 -3
  118. data/config/initializers/yaml_column_permitted_classes.rb +3 -3
  119. data/config/locales/de.yml +1 -0
  120. data/config/locales/en.yml +3 -0
  121. data/config/locales/nl.yml +4 -1
  122. data/config/routes.rb +10 -17
  123. data/db/migrate/1_create_spina_tables.rb +57 -57
  124. data/db/migrate/3_create_spina_navigations.rb +1 -1
  125. data/db/seeds.rb +0 -1
  126. data/lib/generators/spina/embed_generator.rb +5 -6
  127. data/lib/generators/spina/install_generator.rb +48 -41
  128. data/lib/generators/spina/tailwind_config_generator.rb +3 -4
  129. data/lib/generators/spina/templates/app/models/spina/embeds/embed.rb.tt +20 -18
  130. data/lib/generators/spina/templates/config/initializers/spina.rb +11 -11
  131. data/lib/generators/spina/templates/config/initializers/themes/default.rb +17 -17
  132. data/lib/generators/spina/templates/config/initializers/themes/demo.rb +22 -22
  133. data/lib/spina/admin_sectionable.rb +5 -8
  134. data/lib/spina/attr_json_monkeypatch.rb +4 -7
  135. data/lib/spina/attr_json_spina_parts_model.rb +1 -3
  136. data/lib/spina/authentication/basic.rb +9 -10
  137. data/lib/spina/authentication/sessions.rb +10 -11
  138. data/lib/spina/embeddable.rb +14 -17
  139. data/lib/spina/embeds/trix_conversion.rb +25 -26
  140. data/lib/spina/embeds.rb +1 -3
  141. data/lib/spina/engine.rb +18 -19
  142. data/lib/spina/part.rb +1 -6
  143. data/lib/spina/plugin.rb +9 -13
  144. data/lib/spina/railtie.rb +5 -7
  145. data/lib/spina/theme.rb +13 -17
  146. data/lib/spina/theme_reloader.rb +12 -13
  147. data/lib/spina/version.rb +1 -1
  148. data/lib/spina.rb +40 -40
  149. data/lib/tasks/install.rake +8 -14
  150. data/lib/tasks/tailwind.rake +10 -8
  151. metadata +18 -2
@@ -1,156 +1,154 @@
1
- require 'nokogiri'
1
+ require "nokogiri"
2
2
 
3
3
  module Spina::Admin
4
- module IconsHelper
5
-
6
- class FileNotFound < StandardError
7
- end
8
-
9
- def heroicon(name, style: :outline, **options)
10
- name = heroicons_naming_v1_to_v2(name)
11
- file = read_file(Spina::Engine.root.join("app/assets/icons/heroicons", style.to_s, "#{name}.svg"))
12
- return "" if file.nil?
13
- doc = Nokogiri::XML(file)
14
- svg = doc.root
15
- svg[:class] = options[:class]
16
- ActiveSupport::SafeBuffer.new(svg.to_s)
17
- end
18
-
19
- private
20
-
21
- def read_file(path)
22
- return nil unless File.exist?(path)
23
- File.read(path)
24
- end
25
-
26
- def heroicons_naming_v1_to_v2(name)
27
- lookup_table = {
28
- "adjustments" => "adjustments-vertical",
29
- "annotation" => "chat-bubble-bottom-center-text",
30
- "archive" => "archive-box",
31
- "arrow-circle-down" => "arrow-down-circle",
32
- "arrow-circle-left" => "arrow-left-circle",
33
- "arrow-circle-right" => "arrow-right-circle",
34
- "arrow-circle-up" => "arrow-up-circle",
35
- "arrow-narrow-down" => "arrow-long-down",
36
- "arrow-narrow-left" => "arrow-long-left",
37
- "arrow-narrow-right" => "arrow-long-right",
38
- "arrow-narrow-up" => "arrow-long-up",
39
- "arrow-sm-left" => nil,
40
- "arrow-sm-right" => nil,
41
- "arrow-sm-up" => nil,
42
- "arrow-sm-down" => nil,
43
- "arrows-expand" => "arrows-pointing-out",
44
- "badge-check" => "check-badge",
45
- "ban" => "no-symbol",
46
- "bookmark-alt" => "bookmark-square",
47
- "cash" => "banknotes",
48
- "chart-square-bar" => "chart-bar-square",
49
- "chat-alt-2" => "chat-bubble-left-right",
50
- "chat-alt" => "chat-bubble-left-ellipsis",
51
- "chat" => "chat-bubble-oval-left-ellipsis",
52
- "chip" => "cpu-chip",
53
- "clipboard-check" => "clipboard-document-check",
54
- "clipboard-copy" => "clipboard-document",
55
- "clipboard-list" => "clipboard-document-list",
56
- "cloud-download" => "cloud-arrow-down",
57
- "cloud-upload" => "cloud-arrow-up",
58
- "code" => "code-bracket",
59
- "collection" => "rectangle-stack",
60
- "color-swatch" => "swatch",
61
- "cube-transparent" => nil,
62
- "currency-bangladeshi" => nil,
63
- "cursor-click" => "cursor-arrow-rays",
64
- "database" => "circle-stack",
65
- "desktop-computer" => "computer-desktop",
66
- "device-mobile" => "device-phone-mobile",
67
- "document-add" => "document-plus",
68
- "document-download" => "document-arrow-down",
69
- "document-remove" => "document-minus",
70
- "document-report" => "document-chart-bar",
71
- "document-search" => "document-magnifying-glass",
72
- "dots-circle-horizontal" => "ellipsis-horizontal-circle",
73
- "dots-horizontal" => "ellipsis-horizontal",
74
- "dots-vertical" => "ellipsis-vertical",
75
- "download" => "arrow-down-tray",
76
- "duplicate" => "square-2-stack",
77
- "emoji-happy" => "face-smile",
78
- "emoji-sad" => "face-frown",
79
- "exclamation" => "exclamation",
80
- "external-link" => "arrow-top-right-on-square",
81
- "eye-off" => "eye-slash",
82
- "fast-forward" => "forward",
83
- "filter" => "funnel",
84
- "folder-add" => "folder-plus",
85
- "folder-download" => "folder-arrow-down",
86
- "folder-remove" => "folder-minus",
87
- "globe" => "globe-europe-africa",
88
- "hand" => "hand-raised",
89
- "inbox-in" => "inbox-arrow-down",
90
- "library" => "building-library",
91
- "lightning-bolt" => "bolt",
92
- "location-marker" => "map-pin",
93
- "login" => "arrow-left-on-rectangle",
94
- "logout" => "arrow-right-on-rectangle",
95
- "mail-open" => "envelope-open",
96
- "mail" => "envelope",
97
- "menu-alt-1" => "bars-3-center-left",
98
- "menu-alt-2" => "bars-3-bottom-left",
99
- "menu-alt-3" => "bars-3-bottom-right",
100
- "menu-alt-4" => "bars-2",
101
- "menu" => "bars-3",
102
- "minus-sm" => nil,
103
- "music-note" => "musical-note",
104
- "office-building" => "building-office",
105
- "pencil-alt" => "pencil-square",
106
- "phone-incoming" => "phone-arrow-down-left",
107
- "phone-missed-call" => "phone-x-mark",
108
- "phone-outgoing" => "phone-arrow-up-right",
109
- "photograph" => "photo",
110
- "plus-sm" => nil,
111
- "puzzle" => "puzzle-piece",
112
- "qrcode" => "qr-code",
113
- "receipt-tax" => "receipt-percent",
114
- "refresh" => "arrow-path",
115
- "reply" => "arrow-uturn-left",
116
- "rewind" => "backward",
117
- "save-as" => "arrow-down-on-square-stack",
118
- "save" => "arrow-down-on-square",
119
- "search-circle" => "magnifying-glass-circle",
120
- "search" => "magnifying-glass",
121
- "selector" => "chevron-up-down",
122
- "sort-ascending" => "bars-arrow-up",
123
- "sort-descending" => "bars-arrow-down",
124
- "speakerphone" => "megaphone",
125
- "status-offline" => "signal-slash",
126
- "status-online" => "signal",
127
- "support" => "lifebuoy",
128
- "switch-horizontal" => "arrow-right-left",
129
- "switch-vertical" => "arrow-up-down",
130
- "table" => "table-cells",
131
- "template" => "rectangle-group",
132
- "terminal" => "command-line",
133
- "thumb-down" => "hand-thumb-down",
134
- "thumb-up" => "hand-thumb-up",
135
- "translate" => "language",
136
- "trending-down" => "arrow-trending-down",
137
- "trending-up" => "arrow-trending-up",
138
- "upload" => "arrow-up-tray",
139
- "user-add" => "user-plus",
140
- "user-remove" => nil,
141
- "variable" => nil,
142
- "view-boards" => "view-columns",
143
- "view-grid-add" => "squares-plus",
144
- "view-grid" => "squares-2x2",
145
- "view-list" => "bars-4",
146
- "volume-off" => "speaker-x-mark",
147
- "volume-up" => "speaker-wave",
148
- "x" => "x-mark",
149
- "zoom-in" => "magnifying-glass-plus",
150
- "zoom-out" => "magnifying-glass-minus"
151
- }
152
- lookup_table[name] || name
153
- end
4
+ module IconsHelper
5
+ class FileNotFound < StandardError
6
+ end
154
7
 
155
- end
156
- end
8
+ def heroicon(name, style: :outline, **options)
9
+ name = heroicons_naming_v1_to_v2(name)
10
+ file = read_file(Spina::Engine.root.join("app/assets/icons/heroicons", style.to_s, "#{name}.svg"))
11
+ return "" if file.nil?
12
+ doc = Nokogiri::XML(file)
13
+ svg = doc.root
14
+ svg[:class] = options[:class]
15
+ ActiveSupport::SafeBuffer.new(svg.to_s)
16
+ end
17
+
18
+ private
19
+
20
+ def read_file(path)
21
+ return nil unless File.exist?(path)
22
+ File.read(path)
23
+ end
24
+
25
+ def heroicons_naming_v1_to_v2(name)
26
+ lookup_table = {
27
+ "adjustments" => "adjustments-vertical",
28
+ "annotation" => "chat-bubble-bottom-center-text",
29
+ "archive" => "archive-box",
30
+ "arrow-circle-down" => "arrow-down-circle",
31
+ "arrow-circle-left" => "arrow-left-circle",
32
+ "arrow-circle-right" => "arrow-right-circle",
33
+ "arrow-circle-up" => "arrow-up-circle",
34
+ "arrow-narrow-down" => "arrow-long-down",
35
+ "arrow-narrow-left" => "arrow-long-left",
36
+ "arrow-narrow-right" => "arrow-long-right",
37
+ "arrow-narrow-up" => "arrow-long-up",
38
+ "arrow-sm-left" => nil,
39
+ "arrow-sm-right" => nil,
40
+ "arrow-sm-up" => nil,
41
+ "arrow-sm-down" => nil,
42
+ "arrows-expand" => "arrows-pointing-out",
43
+ "badge-check" => "check-badge",
44
+ "ban" => "no-symbol",
45
+ "bookmark-alt" => "bookmark-square",
46
+ "cash" => "banknotes",
47
+ "chart-square-bar" => "chart-bar-square",
48
+ "chat-alt-2" => "chat-bubble-left-right",
49
+ "chat-alt" => "chat-bubble-left-ellipsis",
50
+ "chat" => "chat-bubble-oval-left-ellipsis",
51
+ "chip" => "cpu-chip",
52
+ "clipboard-check" => "clipboard-document-check",
53
+ "clipboard-copy" => "clipboard-document",
54
+ "clipboard-list" => "clipboard-document-list",
55
+ "cloud-download" => "cloud-arrow-down",
56
+ "cloud-upload" => "cloud-arrow-up",
57
+ "code" => "code-bracket",
58
+ "collection" => "rectangle-stack",
59
+ "color-swatch" => "swatch",
60
+ "cube-transparent" => nil,
61
+ "currency-bangladeshi" => nil,
62
+ "cursor-click" => "cursor-arrow-rays",
63
+ "database" => "circle-stack",
64
+ "desktop-computer" => "computer-desktop",
65
+ "device-mobile" => "device-phone-mobile",
66
+ "document-add" => "document-plus",
67
+ "document-download" => "document-arrow-down",
68
+ "document-remove" => "document-minus",
69
+ "document-report" => "document-chart-bar",
70
+ "document-search" => "document-magnifying-glass",
71
+ "dots-circle-horizontal" => "ellipsis-horizontal-circle",
72
+ "dots-horizontal" => "ellipsis-horizontal",
73
+ "dots-vertical" => "ellipsis-vertical",
74
+ "download" => "arrow-down-tray",
75
+ "duplicate" => "square-2-stack",
76
+ "emoji-happy" => "face-smile",
77
+ "emoji-sad" => "face-frown",
78
+ "exclamation" => "exclamation",
79
+ "external-link" => "arrow-top-right-on-square",
80
+ "eye-off" => "eye-slash",
81
+ "fast-forward" => "forward",
82
+ "filter" => "funnel",
83
+ "folder-add" => "folder-plus",
84
+ "folder-download" => "folder-arrow-down",
85
+ "folder-remove" => "folder-minus",
86
+ "globe" => "globe-europe-africa",
87
+ "hand" => "hand-raised",
88
+ "inbox-in" => "inbox-arrow-down",
89
+ "library" => "building-library",
90
+ "lightning-bolt" => "bolt",
91
+ "location-marker" => "map-pin",
92
+ "login" => "arrow-left-on-rectangle",
93
+ "logout" => "arrow-right-on-rectangle",
94
+ "mail-open" => "envelope-open",
95
+ "mail" => "envelope",
96
+ "menu-alt-1" => "bars-3-center-left",
97
+ "menu-alt-2" => "bars-3-bottom-left",
98
+ "menu-alt-3" => "bars-3-bottom-right",
99
+ "menu-alt-4" => "bars-2",
100
+ "menu" => "bars-3",
101
+ "minus-sm" => nil,
102
+ "music-note" => "musical-note",
103
+ "office-building" => "building-office",
104
+ "pencil-alt" => "pencil-square",
105
+ "phone-incoming" => "phone-arrow-down-left",
106
+ "phone-missed-call" => "phone-x-mark",
107
+ "phone-outgoing" => "phone-arrow-up-right",
108
+ "photograph" => "photo",
109
+ "plus-sm" => nil,
110
+ "puzzle" => "puzzle-piece",
111
+ "qrcode" => "qr-code",
112
+ "receipt-tax" => "receipt-percent",
113
+ "refresh" => "arrow-path",
114
+ "reply" => "arrow-uturn-left",
115
+ "rewind" => "backward",
116
+ "save-as" => "arrow-down-on-square-stack",
117
+ "save" => "arrow-down-on-square",
118
+ "search-circle" => "magnifying-glass-circle",
119
+ "search" => "magnifying-glass",
120
+ "selector" => "chevron-up-down",
121
+ "sort-ascending" => "bars-arrow-up",
122
+ "sort-descending" => "bars-arrow-down",
123
+ "speakerphone" => "megaphone",
124
+ "status-offline" => "signal-slash",
125
+ "status-online" => "signal",
126
+ "support" => "lifebuoy",
127
+ "switch-horizontal" => "arrow-right-left",
128
+ "switch-vertical" => "arrow-up-down",
129
+ "table" => "table-cells",
130
+ "template" => "rectangle-group",
131
+ "terminal" => "command-line",
132
+ "thumb-down" => "hand-thumb-down",
133
+ "thumb-up" => "hand-thumb-up",
134
+ "translate" => "language",
135
+ "trending-down" => "arrow-trending-down",
136
+ "trending-up" => "arrow-trending-up",
137
+ "upload" => "arrow-up-tray",
138
+ "user-add" => "user-plus",
139
+ "user-remove" => nil,
140
+ "variable" => nil,
141
+ "view-boards" => "view-columns",
142
+ "view-grid-add" => "squares-plus",
143
+ "view-grid" => "squares-2x2",
144
+ "view-list" => "bars-4",
145
+ "volume-off" => "speaker-x-mark",
146
+ "volume-up" => "speaker-wave",
147
+ "x" => "x-mark",
148
+ "zoom-in" => "magnifying-glass-plus",
149
+ "zoom-out" => "magnifying-glass-minus"
150
+ }
151
+ lookup_table[name] || name
152
+ end
153
+ end
154
+ end
@@ -1,6 +1,5 @@
1
1
  module Spina::Admin
2
2
  module ImagesHelper
3
-
4
3
  def ratio_tailwind_class_for_image_part(image)
5
4
  case image.options.try(:[], :ratio)
6
5
  when "portrait"
@@ -13,6 +12,5 @@ module Spina::Admin
13
12
  "w-36" # Square (default)
14
13
  end
15
14
  end
16
-
17
15
  end
18
16
  end
@@ -1,6 +1,5 @@
1
1
  module Spina::Admin
2
2
  module PagesHelper
3
-
4
3
  def asset_available?(path)
5
4
  if Rails.configuration.assets.compile
6
5
  Rails.application.precompiled_assets.include?(path)
@@ -12,19 +11,18 @@ module Spina::Admin
12
11
  def build_parts(partable, parts)
13
12
  I18n.with_locale(@locale) do
14
13
  parts.map do |part|
15
- part_attributes = current_theme.parts.find{|p|p[:name].to_s == part.to_s}
14
+ part_attributes = current_theme.parts.find { |p| p[:name].to_s == part.to_s }
16
15
  partable.part(part_attributes)
17
16
  end
18
17
  end
19
18
  end
20
19
 
21
20
  def parts_partial_namespace(part_type)
22
- part_type.tableize.sub(/\Aspina\/parts\//, '')
21
+ part_type.tableize.sub(/\Aspina\/parts\//, "")
23
22
  end
24
23
 
25
24
  def option_label(part, value)
26
- t(['options',part.name,value].compact.join('.'))
25
+ t(["options", part.name, value].compact.join("."))
27
26
  end
28
-
29
27
  end
30
28
  end
@@ -1,9 +1,7 @@
1
1
  module Spina
2
2
  module AttachmentsHelper
3
-
4
3
  def file_url(file)
5
4
  main_app.url_for(file)
6
5
  end
7
-
8
6
  end
9
- end
7
+ end
@@ -1,6 +1,5 @@
1
1
  module Spina
2
2
  module ImagesHelper
3
-
4
3
  def original_url(image)
5
4
  return "" if image.nil?
6
5
  main_app.url_for(image.file)
@@ -10,12 +9,12 @@ module Spina
10
9
  return "" if image.nil?
11
10
  main_app.url_for(image.variant(resize_to_fill: [400, 300]))
12
11
  end
13
-
12
+
14
13
  def large_thumbnail_url(image)
15
14
  return "" if image.nil?
16
15
  main_app.url_for(image.variant(resize_to_fit: [800, 600]))
17
16
  end
18
-
17
+
19
18
  def preview_url(image)
20
19
  return "" if image.nil?
21
20
  main_app.url_for(image.variant(resize_to_limit: [1600, 1200]))
@@ -26,9 +25,9 @@ module Spina
26
25
 
27
26
  # support both ImageProcessing gem macro :resize_to_limit and ImageMagick-specific :resize
28
27
  resize_key = Spina.config.embedded_image_size.is_a?(Array) ? :resize_to_limit : :resize
29
- main_app.url_for(image.variant(Hash[resize_key, Spina.config.embedded_image_size]))
28
+ main_app.url_for(image.variant({resize_key => Spina.config.embedded_image_size}))
30
29
  end
31
-
30
+
32
31
  def content_type_color(image)
33
32
  case content_type(image)
34
33
  when "png"
@@ -45,10 +44,9 @@ module Spina
45
44
  "bg-gray-400"
46
45
  end
47
46
  end
48
-
47
+
49
48
  def content_type(image)
50
49
  image.file.content_type&.split("/")&.last || I18n.t("spina.images.missing_image")
51
50
  end
52
-
53
51
  end
54
52
  end
@@ -1,6 +1,5 @@
1
1
  module Spina
2
2
  module PagesHelper
3
-
4
3
  def content(part_name = nil)
5
4
  Current.page.content(part_name)
6
5
  end
@@ -31,6 +30,5 @@ module Spina
31
30
  def current_spina_account
32
31
  Current.account
33
32
  end
34
-
35
33
  end
36
34
  end
@@ -1,5 +1,4 @@
1
1
  module Spina::SpinaHelper
2
-
3
2
  def spina_importmap_tags(entry_point = "application", shim: true)
4
3
  safe_join [
5
4
  javascript_inline_importmap_tag(Spina.config.importmap.to_json(resolver: self)),
@@ -9,5 +8,4 @@ module Spina::SpinaHelper
9
8
  javascript_import_module_tag(entry_point)
10
9
  ], "\n"
11
10
  end
12
-
13
- end
11
+ end
@@ -1,24 +1,23 @@
1
1
  module Spina
2
2
  class ReplaceSignedIdJob < ApplicationJob
3
3
  queue_as { Spina.config.queues[:page_updates] }
4
-
4
+
5
5
  def perform(old_signed_id, new_signed_id)
6
6
  return if old_signed_id.blank? || new_signed_id.blank?
7
-
7
+
8
8
  pages = get_pages(old_signed_id)
9
9
  accounts = Spina::Account.all
10
-
10
+
11
11
  [pages, accounts].each do |records|
12
- records.update_all("json_attributes = REGEXP_REPLACE(json_attributes::text, '#{old_signed_id}', '#{new_signed_id}', 'g')::jsonb")
12
+ records.update_all("json_attributes = REGEXP_REPLACE(json_attributes::text, '#{old_signed_id}', '#{new_signed_id}', 'g')::jsonb")
13
13
  end
14
14
  end
15
-
15
+
16
16
  private
17
-
18
- def get_pages(signed_id)
19
- return Spina::Page.none unless signed_id.present?
20
- Spina::Page.where("json_attributes::text LIKE ?", "%#{signed_id}%")
21
- end
22
-
17
+
18
+ def get_pages(signed_id)
19
+ return Spina::Page.none unless signed_id.present?
20
+ Spina::Page.where("json_attributes::text LIKE ?", "%#{signed_id}%")
21
+ end
23
22
  end
24
23
  end
@@ -1,7 +1,7 @@
1
1
  module Spina
2
2
  class ResourcePagesUpdateJob < ApplicationJob
3
3
  queue_as { Spina.config.queues[:page_updates] }
4
-
4
+
5
5
  def perform(resource_id)
6
6
  Page.where(resource_id: resource_id).roots.find_each(batch_size: 100) do |page|
7
7
  page.save
@@ -1,7 +1,7 @@
1
1
  module Spina
2
2
  class ApplicationMailer < ActionMailer::Base
3
3
  default Spina.config.mailer_defaults
4
-
5
- layout 'spina/mail'
4
+
5
+ layout "spina/mail"
6
6
  end
7
7
  end
@@ -1,13 +1,11 @@
1
1
  module Spina
2
2
  class UserMailer < ApplicationMailer
3
-
4
3
  def forgot_password(user, user_agent_string = nil)
5
4
  @user = user
6
5
  @browser = Browser.new(user_agent_string)
7
-
8
- mail to: @user.email,
9
- subject: t('spina.user_mailer.forgot_password.subject')
10
- end
11
6
 
7
+ mail to: @user.email,
8
+ subject: t("spina.user_mailer.forgot_password.subject")
9
+ end
12
10
  end
13
- end
11
+ end
@@ -1,20 +1,19 @@
1
1
  module Spina
2
2
  module Gravatar
3
3
  extend ActiveSupport::Concern
4
-
4
+
5
5
  def gravatar_url
6
6
  "https://www.gravatar.com/avatar/#{gravatar_hash}?d=#{fallback_url}"
7
7
  end
8
-
8
+
9
9
  private
10
-
11
- def fallback_url
12
- "https://eu.ui-avatars.com/api/#{CGI.escape(name)}/128"
13
- end
14
-
15
- def gravatar_hash
16
- Digest::MD5.hexdigest(email.to_s.strip.downcase)
17
- end
18
-
10
+
11
+ def fallback_url
12
+ "https://eu.ui-avatars.com/api/#{CGI.escape(name)}/128"
13
+ end
14
+
15
+ def gravatar_hash
16
+ Digest::MD5.hexdigest(email.to_s.strip.downcase)
17
+ end
19
18
  end
20
- end
19
+ end
@@ -5,12 +5,11 @@ module Spina
5
5
  attr_accessor :view_context
6
6
 
7
7
  included do
8
-
9
8
  def part(attributes)
10
9
  part = find_part(attributes[:name]) || attributes[:part_type].constantize.new
11
10
 
12
11
  # Copy all attributes to part
13
- %w(name title hint options).each do |attribute|
12
+ %w[name title hint options item_name].each do |attribute|
14
13
  part.public_send("#{attribute}=", attributes[attribute.to_sym]) if part.respond_to?(attribute)
15
14
  end
16
15
 
@@ -27,10 +26,9 @@ module Spina
27
26
 
28
27
  private
29
28
 
30
- def content_presenter
31
- @content_presenter ||= ContentPresenter.new(view_context, self)
32
- end
33
-
29
+ def content_presenter
30
+ @content_presenter ||= ContentPresenter.new(view_context, self)
31
+ end
34
32
  end
35
33
  end
36
34
  end
@@ -1,10 +1,10 @@
1
1
  module Spina
2
2
  module TranslatedContent
3
3
  extend ActiveSupport::Concern
4
-
4
+
5
5
  include Spina::AttrJsonMonkeypatch
6
6
 
7
- included do
7
+ included do
8
8
  # Store each locale's content in [locale]_content as an array of parts
9
9
  Spina.locales.each do |locale|
10
10
  attr_json "#{locale}_content".to_sym, AttrJson::Type::SpinaPartsModel.new, array: true, default: -> { [] }
@@ -12,9 +12,9 @@ module Spina
12
12
  attr_json_accepts_nested_attributes_for "#{locale}_content".to_sym
13
13
  end
14
14
  end
15
-
15
+
16
16
  def find_part(name)
17
- send("#{I18n.locale}_content").find{|part| part.name.to_s == name.to_s}
17
+ send("#{I18n.locale}_content").find { |part| part.name.to_s == name.to_s }
18
18
  end
19
19
  end
20
- end
20
+ end
@@ -8,7 +8,7 @@ module Spina
8
8
  serialize :preferences
9
9
 
10
10
  after_save :bootstrap_website
11
-
11
+
12
12
  validates :name, presence: true
13
13
 
14
14
  def to_s
@@ -22,12 +22,12 @@ module Spina
22
22
  def self.serialized_attr_accessor(*args)
23
23
  args.each do |method_name|
24
24
  define_method method_name do
25
- if self.preferences.try(:[], method_name.to_sym).present?
25
+ if preferences.try(:[], method_name.to_sym).present?
26
26
  ActiveSupport::Deprecation.warn("#{method_name} is stored as a symbol. Please set and save it again using #{method_name}= on your Spina::Account model to store it as a string. You can do this from the UI by saving your account preferences.")
27
27
  end
28
-
29
- self.preferences.try(:[], method_name.to_s) ||
30
- self.preferences.try(:[], method_name.to_sym)
28
+
29
+ preferences.try(:[], method_name.to_s) ||
30
+ preferences.try(:[], method_name.to_sym)
31
31
  end
32
32
 
33
33
  define_method "#{method_name}=" do |value|
@@ -73,18 +73,17 @@ module Spina
73
73
  def find_or_create_custom_pages(theme)
74
74
  theme.custom_pages.each do |page|
75
75
  Page.where(name: page[:name])
76
- .first_or_create(title: page[:title])
77
- .update(view_template: page[:view_template], deletable: page[:deletable])
76
+ .first_or_create(title: page[:title])
77
+ .update(view_template: page[:view_template], deletable: page[:deletable])
78
78
  end
79
79
  end
80
80
 
81
81
  def deactivate_unused_view_templates(theme)
82
- Page.active.where.not(view_template: theme.view_templates.map{|h|h[:name]}).update_all(active: false)
82
+ Page.active.where.not(view_template: theme.view_templates.map { |h| h[:name] }).update_all(active: false)
83
83
  end
84
84
 
85
85
  def activate_used_view_templates(theme)
86
- Page.where(active: false, view_template: theme.view_templates.map{|h|h[:name]}).update_all(active: true)
86
+ Page.where(active: false, view_template: theme.view_templates.map { |h| h[:name] }).update_all(active: true)
87
87
  end
88
-
89
88
  end
90
89
  end
@@ -1,11 +1,10 @@
1
1
  module Spina
2
2
  class ApplicationRecord < ActiveRecord::Base
3
3
  self.abstract_class = true
4
-
4
+
5
5
  # Remove Spina namespace from partial paths
6
6
  def to_partial_path
7
7
  super.gsub(/\Aspina\//, "")
8
8
  end
9
-
10
9
  end
11
- end
10
+ end