Skip to content

Commit 0e888d1

Browse files
committed
Enable single table inheritance for maps
1 parent 111a3d0 commit 0e888d1

File tree

10 files changed

+75
-50
lines changed

10 files changed

+75
-50
lines changed

app/controllers/better_together/resource_controller.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ def create
2626
authorize_resource
2727

2828
if @resource.save
29-
redirect_to @resource.becomes(resource_class), notice: "#{resource_class.model_name.human} was successfully created."
29+
redirect_to @resource.becomes(resource_class),
30+
notice: "#{resource_class.model_name.human} was successfully created."
3031
else
3132
render :new, status: :unprocessable_entity
3233
end
@@ -36,7 +37,8 @@ def update
3637
authorize_resource
3738

3839
if @resource.update(resource_params)
39-
redirect_to @resource.becomes(resource_class), notice: "#{resource_class.model_name.human} was successfully updated."
40+
redirect_to @resource.becomes(resource_class),
41+
notice: "#{resource_class.model_name.human} was successfully updated."
4042
else
4143
render :edit, status: :unprocessable_entity
4244
end

app/helpers/better_together/form_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ def type_select_field(form:, model_class:, selected_type: nil, include_model_cla
111111
options = {
112112
required: true,
113113
class: 'form-select',
114+
data: { controller: 'better_together--slim-select' },
114115
disabled:, # Disable if the model is persisted
115116
**options
116117
}

app/models/better_together/geography/map.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ class Map < ApplicationRecord
3939
end
4040
end
4141

42+
def self.permitted_attributes(id: false, destroy: false)
43+
super + %i[type zoom center]
44+
end
45+
4246
def center
4347
super || default_center
4448
end
@@ -70,6 +74,10 @@ def spaces_for_leaflet
7074
spaces.map(&:to_leaflet_point).compact.to_json
7175
end
7276

77+
def to_partial_path
78+
'better_together/geography/maps/map'
79+
end
80+
7381
def to_s
7482
title
7583
end

app/policies/better_together/geography/map_policy.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ def create?
1616
end
1717

1818
def update?
19-
user.present? && !record.protected?
19+
user.present? && !record.protected? && (record.creator == agent || permitted_to(:manage_platform))
2020
end
2121

2222
def destroy?
23-
user.present? && !record.protected?
23+
user.present? && !record.protected? && (record.creator == agent || permitted_to(:manage_platform))
2424
end
2525

2626
class Scope < Scope # rubocop:todo Style/Documentation
Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
<%= form_with(model: map, class: "form", multipart: true, local: false, data: { controller: "better_together--form-validation" }) do |form| %>
1+
<%= form_with(model: map.becomes(BetterTogether::Geography::Map), class: "form", multipart: true, local: false, data: { controller: "better_together--form-validation" }) do |form| %>
22
<% if map.errors.any? %>
3-
<div style="color: red">
4-
<h2><%= pluralize(map.errors.count, "error") %> prohibited this map from being saved:</h2>
5-
3+
<div class="alert alert-danger">
4+
<h4 class="alert-heading"><%= pluralize(map.errors.count, "error") %> prohibited this map from being saved:</h4>
65
<ul>
76
<% map.errors.each do |error| %>
87
<li><%= error.full_message %></li>
@@ -13,24 +12,29 @@
1312

1413
<%= form.hidden_field :creator_id, value: current_person&.id %>
1514

16-
<div class="mb-3">
17-
<%= render partial: 'better_together/shared/translated_string_field', locals: { model: map, form: form, attribute: 'title' } %>
18-
</div>
15+
<div class="form-group mb-3">
16+
<%= required_label form, :type, class: "form-label" %>
17+
<%= type_select_field(form: form, model_class: ::BetterTogether::Geography::Map, include_model_class: true, required: true) %>
18+
</div>
1919

20-
<div class="mb-3">
21-
<%= render partial: 'better_together/shared/translated_rich_text_field', locals: { model: map, form: form, attribute: 'description' } %>
22-
</div>
20+
<div class="form-group mb-3">
21+
<%= render partial: 'better_together/shared/translated_string_field', locals: { model: map, form: form, attribute: 'title' } %>
22+
</div>
2323

24-
<div class="mb-3">
25-
<%= render partial: 'better_together/shared/translated_string_field', locals: { model: map, form: form, attribute: 'slug' } %>
26-
</div>
24+
<div class="form-group mb-3">
25+
<%= render partial: 'better_together/shared/translated_rich_text_field', locals: { model: map, form: form, attribute: 'description' } %>
26+
</div>
2727

28-
<div class="mb-3">
29-
<%= required_label form, :privacy, class: "form-label" %>
30-
<%= privacy_field(form:, klass: resource_class) %>
31-
</div>
28+
<div class="form-group mb-3">
29+
<%= render partial: 'better_together/shared/translated_string_field', locals: { model: map, form: form, attribute: 'slug' } %>
30+
</div>
31+
32+
<div class="form-group mb-3">
33+
<%= required_label form, :privacy, class: "form-label" %>
34+
<%= privacy_field(form:, klass: resource_class) %>
35+
</div>
3236

33-
<div>
34-
<%= form.submit %>
37+
<div class="form-group">
38+
<%= form.submit class: "btn btn-primary" %>
3539
</div>
3640
<% end %>
Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
<h1>Editing map</h1>
1+
<div class="container mt-4">
2+
<h1 class="mb-4">Editing Map</h1>
23

3-
<%= render "form", map: @geography_map %>
4+
<div class="card">
5+
<div class="card-body">
6+
<%= render "form", map: @geography_map %>
7+
</div>
8+
</div>
49

5-
<br>
6-
7-
<div>
8-
<%= link_to "Show this map", @geography_map %> |
9-
<%= link_to "Back to maps", maps_path %>
10-
</div>
10+
<div class="mt-3">
11+
<%= link_to "Show this map", map_path(@geography_map), class: "btn btn-primary" %>
12+
<%= link_to "Back to maps", maps_path, class: "btn btn-secondary" %>
13+
</div>
14+
</div></div>
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
<h1>New map</h1>
1+
<div class="container mt-4">
2+
<div class="row">
3+
<div class="col-md-8 offset-md-2">
4+
<h1 class="mb-4">New Map</h1>
25

3-
<%= render "form", map: @geography_map %>
6+
<%= render "form", map: @geography_map %>
47

5-
<br>
6-
7-
<div>
8-
<%= link_to "Back to maps", maps_path %>
8+
<div class="mt-3">
9+
<%= link_to "Back to Maps", maps_path, class: "btn btn-secondary" %>
10+
</div>
11+
</div>
12+
</div>
913
</div>

app/views/better_together/geography/maps/show.html.erb

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,11 @@
44
<div class="my-3 d-flex justify-content-between">
55
<%= link_to "Edit this map", edit_map_path(@geography_map), class: "btn btn-primary" %>
66
<%= link_to "Back to maps", maps_path, class: "btn btn-secondary" %>
7-
<%= button_to "Destroy this map", @geography_map, method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-danger" %>
7+
<%= button_to "Destroy this map", map_path(@geography_map), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-danger" %>
88
</div>
99

10-
<div class="map"
11-
data-controller="better_together--map"
12-
data-better_together--map-center-value="<%= @geography_map.center_for_leaflet %>"
13-
data-better_together--map-zoom-value="<%= @geography_map.zoom %>"
14-
data-better_together--map-extent-value="<%= @geography_map.viewport %>">
15-
<div class="map-controls">
16-
<button data-action="better_together--map#switchToOSM">OpenStreetMap</button>
17-
<button data-action="better_together--map#switchToSatellite">Satellite</button>
18-
<button data-action="better_together--map#enableGeolocation">Geolocate Me</button>
19-
</div>
20-
</div>
10+
<section id="map" class="my-4 pb-2">
11+
<h3><i class="fas fa-map-marker-alt text-warning"></i> Location Map</h3>
12+
<%= render partial: 'better_together/shared/map', locals: { map: @geography_map } %>
13+
</section>
2114
</div>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# frozen_string_literal: true
2+
3+
class AddTypeToBetterTogetherGeographyMaps < ActiveRecord::Migration[7.1]
4+
def change
5+
add_column :better_together_geography_maps, :type, :string, null: false, default: 'BetterTogether::Geography::Map'
6+
end
7+
end

spec/dummy/db/schema.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[7.1].define(version: 2025_04_09_012010) do
13+
ActiveRecord::Schema[7.1].define(version: 2025_04_10_133055) do
1414
# These are extensions that must be enabled in order to support this database
1515
enable_extension "pgcrypto"
1616
enable_extension "plpgsql"
@@ -329,6 +329,7 @@
329329
t.jsonb "metadata", default: {}, null: false
330330
t.string "mappable_type"
331331
t.uuid "mappable_id"
332+
t.string "type", default: "BetterTogether::Geography::Map", null: false
332333
t.index ["creator_id"], name: "by_better_together_geography_maps_creator"
333334
t.index ["identifier"], name: "index_better_together_geography_maps_on_identifier", unique: true
334335
t.index ["locale"], name: "by_better_together_geography_maps_locale"
@@ -861,6 +862,7 @@
861862
t.integer "position", null: false
862863
t.string "resource_type", null: false
863864
t.string "slug"
865+
t.string "type", default: "BetterTogether::Role", null: false
864866
t.index ["identifier"], name: "index_better_together_roles_on_identifier", unique: true
865867
t.index ["resource_type", "position"], name: "index_roles_on_resource_type_and_position", unique: true
866868
t.index ["slug"], name: "index_better_together_roles_on_slug", unique: true

0 commit comments

Comments
 (0)