spina 2.12.0 → 2.13.0
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.
- checksums.yaml +4 -4
- data/Rakefile +17 -17
- data/app/assets/builds/spina/tailwind.css +79 -47
- data/app/components/spina/application_component.rb +1 -1
- data/app/components/spina/forms/group_component.rb +2 -3
- data/app/components/spina/forms/label_component.rb +2 -3
- data/app/components/spina/forms/password_field_component.rb +1 -1
- data/app/components/spina/forms/switch_component.rb +2 -3
- data/app/components/spina/forms/text_field_component.rb +8 -9
- data/app/components/spina/forms/trix_toolbar_component.rb +1 -3
- data/app/components/spina/hooks/hook_component.rb +3 -5
- data/app/components/spina/hooks/partial_component.rb +4 -5
- data/app/components/spina/main_navigation/link_component.rb +1 -3
- data/app/components/spina/main_navigation/sub_nav_component.rb +6 -7
- data/app/components/spina/media_picker/image_component.rb +1 -3
- data/app/components/spina/media_picker/modal_component.rb +4 -6
- data/app/components/spina/pages/actions_component.rb +1 -3
- data/app/components/spina/pages/list_component.rb +3 -4
- data/app/components/spina/pages/location_component.rb +10 -11
- data/app/components/spina/pages/new_page_button_component.rb +4 -5
- data/app/components/spina/pages/page_component.rb +8 -9
- data/app/components/spina/pages/page_select_component.rb +3 -4
- data/app/components/spina/pages/tab_button_component.rb +1 -3
- data/app/components/spina/pages/translations_component.rb +9 -11
- data/app/components/spina/user_interface/dropdown_button_component.rb +4 -4
- data/app/components/spina/user_interface/dropdown_component.rb +8 -9
- data/app/components/spina/user_interface/flash_message_component.rb +3 -5
- data/app/components/spina/user_interface/header_component.rb +2 -2
- data/app/components/spina/user_interface/modal_component.rb +1 -3
- data/app/components/spina/user_interface/tab_link_component.rb +1 -3
- data/app/components/spina/user_interface/translations_component.rb +8 -10
- data/app/controllers/concerns/spina/api/paginable.rb +36 -37
- data/app/controllers/concerns/spina/current_spina_account.rb +1 -1
- data/app/controllers/concerns/spina/current_theme.rb +6 -7
- data/app/controllers/concerns/spina/frontend.rb +58 -44
- data/app/controllers/spina/admin/accounts_controller.rb +9 -10
- data/app/controllers/spina/admin/admin_controller.rb +18 -18
- data/app/controllers/spina/admin/attachments_controller.rb +15 -10
- data/app/controllers/spina/admin/embeds_controller.rb +17 -19
- data/app/controllers/spina/admin/images_controller.rb +24 -25
- data/app/controllers/spina/admin/layout_controller.rb +19 -20
- data/app/controllers/spina/admin/media_folders_controller.rb +4 -5
- data/app/controllers/spina/admin/media_picker_controller.rb +2 -4
- data/app/controllers/spina/admin/move_pages_controller.rb +8 -10
- data/app/controllers/spina/admin/navigation_items_controller.rb +13 -14
- data/app/controllers/spina/admin/navigations_controller.rb +26 -26
- data/app/controllers/spina/admin/page_translations_controller.rb +1 -3
- data/app/controllers/spina/admin/pages_controller.rb +34 -34
- data/app/controllers/spina/admin/parent_pages_controller.rb +1 -3
- data/app/controllers/spina/admin/password_resets_controller.rb +8 -9
- data/app/controllers/spina/admin/resources_controller.rb +14 -15
- data/app/controllers/spina/admin/sessions_controller.rb +2 -2
- data/app/controllers/spina/admin/settings_controller.rb +28 -29
- data/app/controllers/spina/admin/theme_controller.rb +10 -11
- data/app/controllers/spina/admin/users_controller.rb +28 -29
- data/app/controllers/spina/api/api_controller.rb +17 -17
- data/app/controllers/spina/api/images_controller.rb +1 -3
- data/app/controllers/spina/api/navigations_controller.rb +2 -4
- data/app/controllers/spina/api/pages_controller.rb +8 -9
- data/app/controllers/spina/api/resources_controller.rb +2 -4
- data/app/controllers/spina/application_controller.rb +4 -3
- data/app/controllers/spina/pages_controller.rb +4 -5
- data/app/controllers/spina/sitemaps_controller.rb +0 -2
- data/app/helpers/spina/admin/icons_helper.rb +151 -153
- data/app/helpers/spina/admin/images_helper.rb +0 -2
- data/app/helpers/spina/admin/pages_helper.rb +3 -5
- data/app/helpers/spina/attachments_helper.rb +1 -3
- data/app/helpers/spina/images_helper.rb +5 -7
- data/app/helpers/spina/pages_helper.rb +0 -2
- data/app/helpers/spina/spina_helper.rb +1 -3
- data/app/jobs/spina/replace_signed_id_job.rb +10 -11
- data/app/jobs/spina/resource_pages_update_job.rb +1 -1
- data/app/mailers/spina/application_mailer.rb +2 -2
- data/app/mailers/spina/user_mailer.rb +4 -6
- data/app/models/concerns/spina/gravatar.rb +11 -12
- data/app/models/concerns/spina/partable.rb +4 -6
- data/app/models/concerns/spina/translated_content.rb +5 -5
- data/app/models/spina/account.rb +9 -10
- data/app/models/spina/application_record.rb +2 -3
- data/app/models/spina/attachment.rb +3 -4
- data/app/models/spina/current.rb +1 -1
- data/app/models/spina/embeds/base.rb +2 -2
- data/app/models/spina/embeds/button.rb +4 -4
- data/app/models/spina/embeds/vimeo.rb +17 -18
- data/app/models/spina/embeds/youtube.rb +18 -19
- data/app/models/spina/image.rb +4 -4
- data/app/models/spina/media_folder.rb +1 -1
- data/app/models/spina/navigation.rb +1 -2
- data/app/models/spina/navigation_item.rb +2 -2
- data/app/models/spina/page.rb +32 -38
- data/app/models/spina/parts/attachment.rb +1 -2
- data/app/models/spina/parts/base.rb +5 -4
- data/app/models/spina/parts/image.rb +3 -4
- data/app/models/spina/parts/image_collection.rb +2 -3
- data/app/models/spina/parts/image_variant.rb +3 -4
- data/app/models/spina/parts/repeater_content.rb +2 -2
- data/app/models/spina/resource.rb +3 -4
- data/app/models/spina/rewrite_rule.rb +1 -1
- data/app/models/spina/setting.rb +0 -2
- data/app/models/spina/user.rb +3 -4
- data/app/presenters/spina/content_presenter.rb +11 -12
- data/app/presenters/spina/menu_presenter.rb +55 -55
- data/app/presenters/spina/rich_text_presenter.rb +28 -29
- data/app/serializers/spina/api/base_serializer.rb +1 -1
- data/app/serializers/spina/api/image_serializer.rb +6 -6
- data/app/serializers/spina/api/navigation_serializer.rb +4 -7
- data/app/serializers/spina/api/page_serializer.rb +9 -12
- data/app/serializers/spina/api/resource_serializer.rb +5 -5
- data/app/views/layouts/spina/admin/application.html.erb +1 -0
- data/app/views/spina/admin/parts/attachments/_attachment.html.erb +3 -0
- data/app/views/spina/admin/parts/attachments/_form.html.erb +22 -1
- data/app/views/spina/admin/parts/repeaters/_fields.html.erb +2 -2
- data/app/views/spina/admin/parts/repeaters/_form.html.erb +4 -4
- data/app/views/spina/admin/shared/_navigation.html.erb +3 -1
- data/app/views/spina/admin/shared/_version.html.erb +18 -0
- data/app/views/spina/sitemaps/show.xml.builder +1 -1
- data/config/initializers/importmap.rb +3 -3
- data/config/initializers/yaml_column_permitted_classes.rb +3 -3
- data/config/locales/de.yml +1 -0
- data/config/locales/en.yml +3 -0
- data/config/locales/nl.yml +4 -1
- data/config/routes.rb +10 -17
- data/db/migrate/1_create_spina_tables.rb +57 -57
- data/db/migrate/3_create_spina_navigations.rb +1 -1
- data/db/seeds.rb +0 -1
- data/lib/generators/spina/embed_generator.rb +5 -6
- data/lib/generators/spina/install_generator.rb +48 -41
- data/lib/generators/spina/tailwind_config_generator.rb +3 -4
- data/lib/generators/spina/templates/app/models/spina/embeds/embed.rb.tt +20 -18
- data/lib/generators/spina/templates/config/initializers/spina.rb +11 -11
- data/lib/generators/spina/templates/config/initializers/themes/default.rb +17 -17
- data/lib/generators/spina/templates/config/initializers/themes/demo.rb +22 -22
- data/lib/spina/admin_sectionable.rb +5 -8
- data/lib/spina/attr_json_monkeypatch.rb +4 -7
- data/lib/spina/attr_json_spina_parts_model.rb +1 -3
- data/lib/spina/authentication/basic.rb +9 -10
- data/lib/spina/authentication/sessions.rb +10 -11
- data/lib/spina/embeddable.rb +14 -17
- data/lib/spina/embeds/trix_conversion.rb +25 -26
- data/lib/spina/embeds.rb +1 -3
- data/lib/spina/engine.rb +18 -19
- data/lib/spina/part.rb +1 -6
- data/lib/spina/plugin.rb +9 -13
- data/lib/spina/railtie.rb +5 -7
- data/lib/spina/theme.rb +13 -17
- data/lib/spina/theme_reloader.rb +12 -13
- data/lib/spina/version.rb +1 -1
- data/lib/spina.rb +39 -40
- data/lib/tasks/install.rake +8 -14
- data/lib/tasks/tailwind.rake +10 -8
- metadata +18 -2
@@ -4,7 +4,7 @@ module Spina
|
|
4
4
|
|
5
5
|
attr_accessor :_destroy
|
6
6
|
|
7
|
-
scope :sorted, -> { order(
|
7
|
+
scope :sorted, -> { order("created_at DESC") }
|
8
8
|
|
9
9
|
def name
|
10
10
|
file.filename.to_s
|
@@ -13,7 +13,7 @@ module Spina
|
|
13
13
|
def content
|
14
14
|
file if file.attached?
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def present?
|
18
18
|
signed_blob_id.present?
|
19
19
|
end
|
@@ -21,11 +21,10 @@ module Spina
|
|
21
21
|
alias_method :old_update, :update
|
22
22
|
def update(attributes)
|
23
23
|
if attributes["_destroy"] == "1" && attributes["file"].blank?
|
24
|
-
|
24
|
+
page_part.destroy
|
25
25
|
else
|
26
26
|
old_update(attributes)
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
30
29
|
end
|
31
30
|
end
|
data/app/models/spina/current.rb
CHANGED
@@ -1,39 +1,38 @@
|
|
1
|
-
require
|
1
|
+
require "net/http"
|
2
2
|
|
3
3
|
module Spina::Embeds
|
4
4
|
class Vimeo < Base
|
5
5
|
attributes :url
|
6
|
-
|
6
|
+
|
7
7
|
heroicon "video-camera"
|
8
|
-
|
8
|
+
|
9
9
|
REGEX = /(https?:\/\/)?(www.)?(player.)?vimeo.com\/([a-z]*\/)*([0-9]{6,11})[?]?.*/
|
10
|
-
|
10
|
+
|
11
11
|
validates :url, presence: true, format: {with: REGEX}
|
12
|
-
|
12
|
+
|
13
13
|
def id
|
14
14
|
REGEX.match(url).try(:[], 5)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# Get title from Vimeo API (remote call)
|
18
18
|
def remote_title
|
19
19
|
get_vimeo_json&.dig(0, "title")
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def to_trix_partial_path
|
23
23
|
"spina/embeds/vimeos/thumbnail"
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
private
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
27
|
+
|
28
|
+
def get_vimeo_json
|
29
|
+
uri = URI("https://vimeo.com/api/v2/video/#{id}.json")
|
30
|
+
response = Net::HTTP.get(uri)
|
31
|
+
begin
|
32
|
+
JSON.parse(response)
|
33
|
+
rescue
|
34
|
+
nil
|
36
35
|
end
|
37
|
-
|
36
|
+
end
|
38
37
|
end
|
39
38
|
end
|
@@ -1,39 +1,38 @@
|
|
1
|
-
require
|
1
|
+
require "net/http"
|
2
2
|
|
3
3
|
module Spina::Embeds
|
4
4
|
class Youtube < Base
|
5
5
|
attributes :url
|
6
|
-
|
6
|
+
|
7
7
|
heroicon "video-camera"
|
8
|
-
|
8
|
+
|
9
9
|
REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/
|
10
|
-
|
10
|
+
|
11
11
|
validates :url, presence: true, format: {with: REGEX}
|
12
|
-
|
12
|
+
|
13
13
|
def id
|
14
14
|
REGEX.match(url).try(:[], 1)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# Get title from Youtube API (remote call)
|
18
18
|
def remote_title
|
19
19
|
get_youtube_json&.dig("title")
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def to_trix_partial_path
|
23
23
|
"spina/embeds/youtubes/thumbnail"
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
private
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
27
|
+
|
28
|
+
def get_youtube_json
|
29
|
+
uri = URI("https://www.youtube.com/oembed?url=http://youtube.com/watch?v=#{id}&format=json")
|
30
|
+
response = Net::HTTP.get(uri)
|
31
|
+
begin
|
32
|
+
JSON.parse(response)
|
33
|
+
rescue
|
34
|
+
nil
|
36
35
|
end
|
37
|
-
|
36
|
+
end
|
38
37
|
end
|
39
|
-
end
|
38
|
+
end
|
data/app/models/spina/image.rb
CHANGED
@@ -4,7 +4,7 @@ module Spina
|
|
4
4
|
|
5
5
|
has_one_attached :file
|
6
6
|
|
7
|
-
scope :sorted, -> { order(
|
7
|
+
scope :sorted, -> { order("created_at DESC") }
|
8
8
|
|
9
9
|
def name
|
10
10
|
file.try(:filename).to_s
|
@@ -12,7 +12,7 @@ module Spina
|
|
12
12
|
|
13
13
|
def variant(options)
|
14
14
|
return "" unless file.attached?
|
15
|
-
return file if file.content_type.include?(
|
15
|
+
return file if file.content_type.include?("svg")
|
16
16
|
return file unless file.variable?
|
17
17
|
|
18
18
|
file.variant(options)
|
@@ -22,10 +22,10 @@ module Spina
|
|
22
22
|
self
|
23
23
|
end
|
24
24
|
|
25
|
-
def thumbnail(size =
|
25
|
+
def thumbnail(size = "100x100", modifier = "^")
|
26
26
|
variant(
|
27
27
|
combine_options: {
|
28
|
-
gravity:
|
28
|
+
gravity: "center",
|
29
29
|
thumbnail: "#{size}#{modifier}",
|
30
30
|
extent: size
|
31
31
|
}
|
@@ -6,7 +6,7 @@ module Spina
|
|
6
6
|
has_ancestry
|
7
7
|
|
8
8
|
scope :regular_pages, -> { joins(:page).where(spina_pages: {resource_id: nil}) }
|
9
|
-
scope :sorted, -> { order(
|
9
|
+
scope :sorted, -> { order("spina_navigation_items.position") }
|
10
10
|
scope :live, -> { joins(:page).where(spina_pages: {draft: false, active: true}) }
|
11
11
|
scope :in_menu, -> { joins(:page).where(spina_pages: {show_in_menu: true}) }
|
12
12
|
scope :active, -> { joins(:page).where(spina_pages: {active: true}) }
|
@@ -15,4 +15,4 @@ module Spina
|
|
15
15
|
|
16
16
|
delegate :menu_title, :materialized_path, :draft?, to: :page
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
data/app/models/spina/page.rb
CHANGED
@@ -20,7 +20,7 @@ module Spina
|
|
20
20
|
belongs_to :resource, optional: true, touch: true
|
21
21
|
|
22
22
|
scope :main, -> { where(resource_id: nil) }
|
23
|
-
scope :regular_pages, ->
|
23
|
+
scope :regular_pages, -> { main }
|
24
24
|
scope :resource_pages, -> { where.not(resource: nil) }
|
25
25
|
scope :active, -> { where(active: true) }
|
26
26
|
scope :sorted, -> { order(:position) }
|
@@ -59,7 +59,7 @@ module Spina
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def homepage?
|
62
|
-
name ==
|
62
|
+
name == "homepage"
|
63
63
|
end
|
64
64
|
|
65
65
|
def custom_page?
|
@@ -75,11 +75,11 @@ module Spina
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def previous_sibling
|
78
|
-
siblings.where(
|
78
|
+
siblings.where("position < ?", position).sorted.last
|
79
79
|
end
|
80
80
|
|
81
81
|
def next_sibling
|
82
|
-
siblings.where(
|
82
|
+
siblings.where("position > ?", position).sorted.first
|
83
83
|
end
|
84
84
|
|
85
85
|
def set_materialized_path
|
@@ -98,48 +98,42 @@ module Spina
|
|
98
98
|
super + "_" + Mobility.locale.to_s
|
99
99
|
end
|
100
100
|
|
101
|
-
def view_template_config(theme)
|
102
|
-
view_template_name = view_template.presence || 'show'
|
103
|
-
theme.view_templates.find { |template| template[:name] == view_template_name }
|
104
|
-
end
|
105
|
-
|
106
101
|
private
|
107
102
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
def set_resource_from_parent
|
113
|
-
self.resource_id = parent.resource_id
|
114
|
-
end
|
103
|
+
def set_default_position
|
104
|
+
self.position ||= self.class.maximum(:position).to_i.next
|
105
|
+
end
|
115
106
|
|
116
|
-
|
117
|
-
|
118
|
-
|
107
|
+
def set_resource_from_parent
|
108
|
+
self.resource_id = parent.resource_id
|
109
|
+
end
|
119
110
|
|
120
|
-
|
121
|
-
|
122
|
-
|
111
|
+
def touch_navigations
|
112
|
+
navigations.update_all(updated_at: Time.zone.now)
|
113
|
+
end
|
123
114
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
else
|
128
|
-
[Spina.mounted_at, Mobility.locale, generate_materialized_path]
|
129
|
-
end
|
130
|
-
File.join(*segments.map(&:to_s).compact)
|
131
|
-
end
|
115
|
+
def rewrite_rule
|
116
|
+
RewriteRule.where(old_path: old_path).first_or_create.update(new_path: materialized_path) if old_path != materialized_path
|
117
|
+
end
|
132
118
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
119
|
+
def localized_materialized_path
|
120
|
+
segments = if Mobility.locale == I18n.default_locale
|
121
|
+
[Spina.mounted_at, generate_materialized_path]
|
122
|
+
else
|
123
|
+
[Spina.mounted_at, Mobility.locale, generate_materialized_path]
|
138
124
|
end
|
125
|
+
File.join(*segments.map(&:to_s).compact)
|
126
|
+
end
|
139
127
|
|
140
|
-
|
141
|
-
|
142
|
-
|
128
|
+
def generate_materialized_path
|
129
|
+
path_fragments = [resource&.slug]
|
130
|
+
path_fragments.append(*ancestors.collect(&:slug))
|
131
|
+
path_fragments.append(slug) unless homepage?
|
132
|
+
path_fragments.compact.map(&:parameterize).join("/")
|
133
|
+
end
|
143
134
|
|
135
|
+
def duplicate_materialized_path?
|
136
|
+
self.class.where.not(id: id).i18n.where(materialized_path: materialized_path).exists?
|
137
|
+
end
|
144
138
|
end
|
145
139
|
end
|
@@ -6,14 +6,15 @@ module Spina
|
|
6
6
|
attr_json_config(unknown_key: :strip)
|
7
7
|
|
8
8
|
attr_json :name, :string
|
9
|
-
|
10
|
-
attr_accessor :title, :hint
|
9
|
+
|
10
|
+
attr_accessor :title, :hint, :item_name
|
11
11
|
|
12
12
|
def label
|
13
13
|
content&.to_s
|
14
14
|
end
|
15
15
|
|
16
|
-
def content
|
16
|
+
def content
|
17
|
+
end
|
17
18
|
end
|
18
19
|
end
|
19
|
-
end
|
20
|
+
end
|
@@ -17,7 +17,7 @@ module Spina
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def svg?
|
20
|
-
filename
|
20
|
+
filename.end_with?(".svg")
|
21
21
|
end
|
22
22
|
|
23
23
|
def spina_image
|
@@ -27,15 +27,14 @@ module Spina
|
|
27
27
|
def present?
|
28
28
|
signed_blob_id.present?
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def signed_id(expires_in: nil)
|
32
32
|
signed_blob_id
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def variant(options)
|
36
36
|
Spina::Parts::ImageVariant.new(self, options)
|
37
37
|
end
|
38
|
-
|
39
38
|
end
|
40
39
|
end
|
41
40
|
end
|
@@ -2,7 +2,7 @@ module Spina
|
|
2
2
|
module Parts
|
3
3
|
class ImageCollection < Base
|
4
4
|
include AttrJson::NestedAttributes
|
5
|
-
|
5
|
+
|
6
6
|
attr_json :images, Image.to_type, array: true
|
7
7
|
attr_json_accepts_nested_attributes_for :images
|
8
8
|
|
@@ -17,7 +17,6 @@ module Spina
|
|
17
17
|
def image_ids
|
18
18
|
content.map(&:image_id)
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
22
21
|
end
|
23
|
-
end
|
22
|
+
end
|
@@ -2,18 +2,17 @@ module Spina
|
|
2
2
|
module Parts
|
3
3
|
class ImageVariant
|
4
4
|
attr_reader :blob
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(image, options)
|
7
7
|
@blob = image
|
8
8
|
@options = options
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def variation
|
12
12
|
OpenStruct.new({
|
13
13
|
key: ActiveStorage::Variation.encode(@options)
|
14
14
|
})
|
15
|
-
end
|
16
|
-
|
15
|
+
end
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
@@ -24,13 +24,12 @@ module Spina
|
|
24
24
|
ResourcePagesUpdateJob.perform_later(id)
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def order_by_options
|
29
29
|
[
|
30
|
-
[Spina::Page.human_attribute_name(:title), "title"],
|
30
|
+
[Spina::Page.human_attribute_name(:title), "title"],
|
31
31
|
[Spina::Page.human_attribute_name(:created_at), "created_at"]
|
32
32
|
]
|
33
33
|
end
|
34
|
-
|
35
34
|
end
|
36
|
-
end
|
35
|
+
end
|
data/app/models/spina/setting.rb
CHANGED
data/app/models/spina/user.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Spina
|
2
2
|
class User < ApplicationRecord
|
3
3
|
include Gravatar
|
4
|
-
|
4
|
+
|
5
5
|
has_secure_password
|
6
6
|
has_secure_token :password_reset_token
|
7
7
|
|
8
8
|
validates :name, presence: true
|
9
|
-
validates :email, uniqueness: true, presence: true, format: {
|
9
|
+
validates :email, uniqueness: true, presence: true, format: {with: /\A[^@]+@[^@]+\z/}
|
10
10
|
|
11
11
|
def admin?
|
12
12
|
admin
|
@@ -15,12 +15,11 @@ module Spina
|
|
15
15
|
def to_s
|
16
16
|
name
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def reset_passord!
|
20
20
|
regenerate_password_reset_token
|
21
21
|
self.password_reset_sent_at = Time.current
|
22
22
|
save!
|
23
23
|
end
|
24
|
-
|
25
24
|
end
|
26
25
|
end
|
@@ -35,17 +35,16 @@ module Spina
|
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
view_context.main_app.url_for(image.variant(variant_options))
|
44
|
-
end
|
45
|
-
|
46
|
-
def find_part(name)
|
47
|
-
container.find_part(name)
|
48
|
-
end
|
38
|
+
def main_app_image_url(image, variant_options = {})
|
39
|
+
# SVG's can't have variants,
|
40
|
+
# Render rails_service_blob_url directly instead
|
41
|
+
return view_context.main_app.url_for(image) if image.svg?
|
49
42
|
|
43
|
+
view_context.main_app.url_for(image.variant(variant_options))
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_part(name)
|
47
|
+
container.find_part(name)
|
48
|
+
end
|
50
49
|
end
|
51
|
-
end
|
50
|
+
end
|