geo_labels 0.2.0 → 0.3.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -0
- data/README.md +127 -6
- data/Rakefile +6 -5
- data/app/assets/javascripts/geo_labels/application.coffee +13 -2
- data/app/assets/javascripts/geo_labels/ratings.coffee +80 -0
- data/app/assets/stylesheets/geo_labels/application.sass +21 -0
- data/app/controllers/concerns/geo_labels/shared_template_and_instance_methods.rb +3 -0
- data/app/controllers/geo_labels/application_controller.rb +3 -0
- data/app/controllers/geo_labels/contacts_controller.rb +18 -0
- data/app/controllers/geo_labels/dashboard_controller.rb +14 -9
- data/app/controllers/geo_labels/labels_controller.rb +3 -1
- data/app/controllers/geo_labels/ratings_controller.rb +30 -0
- data/app/helpers/geo_labels/application_helper.rb +73 -44
- data/app/helpers/geo_labels/rating_helper.rb +15 -0
- data/app/jobs/geo_labels/application_job.rb +1 -0
- data/app/mailers/geo_labels/application_mailer.rb +4 -2
- data/app/models/concerns/geo_labels/ratings_support.rb +102 -0
- data/app/models/geo_labels/application_record.rb +22 -0
- data/app/models/geo_labels/contact.rb +62 -20
- data/app/models/geo_labels/contact_label.rb +43 -7
- data/app/models/geo_labels/label.rb +13 -0
- data/app/views/geo_labels/contacts/_form.html.slim +22 -6
- data/app/views/geo_labels/contacts/index.html.slim +19 -7
- data/app/views/geo_labels/contacts/show.html.slim +24 -2
- data/app/views/geo_labels/dashboard/main.html.slim +27 -5
- data/app/views/geo_labels/labels/index.html.slim +10 -6
- data/app/views/geo_labels/labels/show.html.slim +15 -1
- data/app/views/layouts/geo_labels/application.html.slim +2 -0
- data/config/environment.rb +2 -0
- data/config/initializers/human_plural.rb +8 -5
- data/config/locales/geo_labels.en.yml +8 -0
- data/config/locales/geo_labels.es.yml +17 -0
- data/config/routes.rb +12 -1
- data/db/migrate/20221019150722_create_geo_labels_contacts.rb +5 -3
- data/db/migrate/20221020180213_create_geo_labels_labels.rb +2 -0
- data/db/migrate/20221020195346_create_geo_labels_contact_labels.rb +4 -2
- data/db/migrate/20230602182522_geo_labels_contacts_complex_name_to_name.rb +9 -0
- data/db/migrate/20230726154822_add_state_to_geo_labels_contacts.rb +8 -0
- data/db/migrate/20230801145902_add_food_rating_to_geo_labels_contacts.rb +7 -0
- data/lib/geo_labels/engine.rb +17 -7
- data/lib/geo_labels/exporter.rb +24 -10
- data/lib/geo_labels/importer.rb +31 -27
- data/lib/geo_labels/version.rb +3 -1
- data/lib/geo_labels.rb +2 -0
- data/lib/tasks/geo_labels_tasks.rake +1 -0
- metadata +37 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d8a1e97c9ef4f47446cd94e6077b844c2a8bd7db58f28163330c0f6188592d1
|
4
|
+
data.tar.gz: a6378b02037f5f5b39fa10bdb6e761f487889a15b03f3c33bb40bc015bd19153
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d78074f90bdace9bdb52da398d2f9a3bf057b6ef243e9eb4fdafc4397e2a62ad751bafeb605ba96a8900bdbfa7e20dbbbd953099793944550de3b5b8fa50b62c
|
7
|
+
data.tar.gz: 994ea71eecb76637ad3711b3afbf7e2c166ed6c189e2e89664f8f76a2578995574926e729adb3a0885d80e0e75eb05327e6bf4e441d506d0282011dfb6217d15
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,30 @@
|
|
1
1
|
CHANGELOG of geo\_labels
|
2
2
|
============================
|
3
3
|
|
4
|
+
2023-09-07 v0.3.2
|
5
|
+
-------------------------
|
6
|
+
* Add manual Google maps copy-paste string input option for complex locations
|
7
|
+
|
8
|
+
2023-09-05 v0.3.1
|
9
|
+
-------------------------
|
10
|
+
* Better navigation connections
|
11
|
+
* Fix the contact show map feature
|
12
|
+
* Show label's connected contacts
|
13
|
+
|
14
|
+
2023-09-04 v0.3.0
|
15
|
+
-------------------------
|
16
|
+
* Better README
|
17
|
+
* Fuzzy search for all dropdowns
|
18
|
+
* Change complex name to just name for contacts
|
19
|
+
* Make main page contacts list first, map optional
|
20
|
+
* Better label management GUI
|
21
|
+
* Spanish translation for models
|
22
|
+
* Comply with some rubocop suggestions
|
23
|
+
|
24
|
+
2023-02-14 v0.2.1
|
25
|
+
-------------------------
|
26
|
+
* Default to ENV variable for google api key
|
27
|
+
|
4
28
|
2023-02-10 v0.2.0
|
5
29
|
-------------------------
|
6
30
|
* Add importer link to menu
|
data/README.md
CHANGED
@@ -1,10 +1,21 @@
|
|
1
1
|
# GeoLabels
|
2
|
-
|
2
|
+
GeoLabels is a `rails` `engine` that allows you to create entries that will be resolved to
|
3
|
+
their geographic location so that they can be shown on a map.
|
3
4
|
|
4
|
-
|
5
|
-
|
5
|
+
The idea is to also create a hierarchical structure of labels and assign the lowest level applicable
|
6
|
+
label to the contact entry.
|
7
|
+
|
8
|
+
Now interesting queries can be made based on this organization. Examples:
|
9
|
+
|
10
|
+
* Give me the good coffee places in the state of Texas
|
11
|
+
* Give me the Vietnamese food places in Miami
|
12
|
+
|
13
|
+
The geo-contacts and their labels can be managed in the engine's GUI, but also using a text format. This can be a useful,
|
14
|
+
but also dangarous feature.
|
6
15
|
|
7
16
|
## Installation
|
17
|
+
|
18
|
+
### Add the engine to your `rails` app
|
8
19
|
Add this line to your application's Gemfile:
|
9
20
|
|
10
21
|
```ruby
|
@@ -14,15 +25,125 @@ gem "geo_labels"
|
|
14
25
|
And then execute:
|
15
26
|
```bash
|
16
27
|
$ bundle
|
28
|
+
$ bundle exec rails db:migrate
|
29
|
+
```
|
30
|
+
|
31
|
+
### Mount the engine to your routes
|
32
|
+
In your `config/routes.rb` file add:
|
33
|
+
```ruby
|
34
|
+
mount GeoLabels::Engine => '/geo-labels'
|
17
35
|
```
|
18
36
|
|
19
|
-
|
37
|
+
### Add the authorizations
|
38
|
+
In your `app/models/ability.rb` file add the authorizations.
|
39
|
+
This is a custom operation that you have to adjust to your needs.
|
40
|
+
To allow all users full controll to the contracts add:
|
41
|
+
```ruby
|
42
|
+
can :manage, GeoLabels::Contact
|
43
|
+
can :manage, GeoLabels::ContactLabel
|
44
|
+
```
|
45
|
+
|
46
|
+
If the `Ability` file does not yet exist, generate it using:
|
20
47
|
```bash
|
21
|
-
|
48
|
+
rails generate cancan:ability
|
49
|
+
```
|
50
|
+
|
51
|
+
### Other languages (i18n)
|
52
|
+
To use for a lets say Spanish based website add [rails-i18n](https://github.com/svenfuchs/rails-i18n) to your `Gemfile`
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
gem 'rails-i18n'
|
22
56
|
```
|
23
57
|
|
58
|
+
And configure your application in `config/application.rb` to handle the languages:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
config.i18n.available_locales = %i[en es]
|
62
|
+
config.i18n.default_locale = :en
|
63
|
+
```
|
64
|
+
|
65
|
+
## Customization
|
66
|
+
|
67
|
+
### The main page
|
68
|
+
The main page of this engine is the query page where the created structure can be queried.
|
69
|
+
|
70
|
+
### The link home content
|
71
|
+
The default value for `config/application.rb` is:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
config.x.geo_labels.link_home_content = -> { '<i class="arrow left icon"></i> Back' }
|
75
|
+
```
|
76
|
+
To change for example the icon, see the options at the [fomantic-ui](https://fomantic-ui.com/elements/icon.html) site.
|
77
|
+
Note that the value is a `lambda` to allow the use of for example `I18n`.
|
78
|
+
|
24
79
|
## Contributing
|
25
|
-
|
80
|
+
There are many ways to contribute. Here some example steps that should work.
|
81
|
+
|
82
|
+
### 1. Fork the repository
|
83
|
+
Go to the original repository at https://gitlab.com/benja-2/geo\_labels and [fork](https://gitlab.com/benja-2/geo_labels/-/forks/new) the project.
|
84
|
+
Then `git clone` your code on your local computer.
|
85
|
+
|
86
|
+
If you are in the git repository directory you can tell your system to use the local code when actually the
|
87
|
+
gitlab repository is specified for faster debugging. To achieve this type:
|
88
|
+
|
89
|
+
```bash
|
90
|
+
bundle config local.geo_labels .
|
91
|
+
```
|
92
|
+
|
93
|
+
### 2. Add your forked codebase to a project
|
94
|
+
To start from zero, create a new rails (> 7) project and add the `geo_labels` gem configured to use `gitlab` as a base:
|
95
|
+
|
96
|
+
```bash
|
97
|
+
rails new my_geo_labels_project
|
98
|
+
cd my_geo_labels_project
|
99
|
+
```
|
100
|
+
|
101
|
+
Then in the `Gemfile`
|
102
|
+
```ruby
|
103
|
+
git_source(:gitlab) do |repo_name|
|
104
|
+
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
|
105
|
+
"git@gitlab.com:#{repo_name}.git"
|
106
|
+
end
|
107
|
+
|
108
|
+
gem 'geo_labels', gitlab: '<your gitlab name>/geo_labels', branch: :master
|
109
|
+
```
|
110
|
+
|
111
|
+
## TESTING
|
112
|
+
### Testing against other databases
|
113
|
+
Since there are some more advanced queries in this gem and was discovered that `mysql` does not support
|
114
|
+
the `IN (SELECT ...)` syntax, support for testing against multiple databases was added.
|
115
|
+
|
116
|
+
The default test (`rspec spec`) database is `sqlite`.
|
117
|
+
|
118
|
+
#### Test against a mysql database
|
119
|
+
To setup the mysql environment type (optional new window after the `docker-compose` command):
|
120
|
+
```bash
|
121
|
+
docker-compose test_mysql up
|
122
|
+
DATABASE_URL=mysql2://root:password@127.0.0.1:33062/test rails db:create
|
123
|
+
DATABASE_URL=mysql2://root:password@127.0.0.1:33062/test rails db:migrate
|
124
|
+
```
|
125
|
+
|
126
|
+
then run the specs against the mysql database:
|
127
|
+
```bash
|
128
|
+
DATABASE_URL=mysql2://root:password@127.0.0.1:33062/test rspec spec
|
129
|
+
```
|
130
|
+
|
131
|
+
#### Test against postgresql database
|
132
|
+
To setup the postgresql environment type (optional new window after the `docker-compose` command):
|
133
|
+
```bash
|
134
|
+
docker-compose test_postgresql up
|
135
|
+
DATABASE_URL=postgres://pguser:pgpassword@127.0.0.1:54321/test rails db:create
|
136
|
+
DATABASE_URL=postgres://pguser:pgpassword@127.0.0.1:54321/test rails db:migrate
|
137
|
+
```
|
138
|
+
|
139
|
+
then run the specs against the mysql database:
|
140
|
+
```bash
|
141
|
+
DATABASE_URL=postgres://pguser:pgpassword@127.0.0.1:54321/test rspec spec
|
142
|
+
```
|
143
|
+
|
144
|
+
## CHANGELOG
|
145
|
+
The CHANGELOG can be found using
|
146
|
+
[CHANGELOG.md](/CHANGELOG.md)
|
26
147
|
|
27
148
|
## License
|
28
149
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'bundler/setup'
|
2
3
|
|
3
|
-
APP_RAKEFILE = File.expand_path(
|
4
|
-
load
|
4
|
+
APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
|
5
|
+
load 'rails/tasks/engine.rake'
|
5
6
|
|
6
|
-
load
|
7
|
+
load 'rails/tasks/statistics.rake'
|
7
8
|
|
8
|
-
require
|
9
|
+
require 'bundler/gem_tasks'
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#= require jquery
|
2
2
|
#= require jquery_ujs
|
3
3
|
#= require semantic-ui
|
4
|
+
#= require ./ratings
|
4
5
|
|
5
6
|
window.initMap = ->
|
6
7
|
if map_canvas = document.getElementById('map-canvas')
|
@@ -15,10 +16,20 @@ window.initMap = ->
|
|
15
16
|
title: map_point.title
|
16
17
|
false
|
17
18
|
$ ->
|
18
|
-
$('.ui.dropdown').dropdown
|
19
|
+
$('.ui.dropdown').dropdown
|
20
|
+
fullTextSearch: true
|
21
|
+
|
22
|
+
$('.tabular.menu .item').tab
|
23
|
+
onFirstLoad: (name) ->
|
24
|
+
initMap() if name is 'map'
|
25
|
+
true
|
26
|
+
$('.accordion').accordion()
|
27
|
+
|
28
|
+
$('[data-content],[data-html]').popup()
|
29
|
+
|
19
30
|
$('.message .close').on 'click', ->
|
20
31
|
$(@).closest('.message').transition('fade')
|
21
|
-
|
32
|
+
|
22
33
|
$('.and-or-switch-buttons .button').on 'click', ->
|
23
34
|
#debugger
|
24
35
|
container = @parentNode
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Supply a global initialization access point to load for custom actions
|
2
|
+
window.divmod = (x, y) -> [Math.floor(x / y), x % y]
|
3
|
+
window.setupRatings = ->
|
4
|
+
# For now jQuery based, but setup for easy future change to non jQuery systems
|
5
|
+
setClassForRatingDivmod = (star, whole_stars, half_star) ->
|
6
|
+
star_number = Number(star.dataset.starNumber)
|
7
|
+
if star_number + 1 > whole_stars + half_star
|
8
|
+
star.classList.add 'outline'
|
9
|
+
else
|
10
|
+
star.classList.remove 'outline'
|
11
|
+
star.classList.toggle 'half', star_number is whole_stars and half_star
|
12
|
+
#star.classList.toggle 'half', half_star
|
13
|
+
#
|
14
|
+
getStarEventRating = (star, event) ->
|
15
|
+
rect = event.target.getBoundingClientRect()
|
16
|
+
leftHalf = event.clientX < rect.x + rect.width / 2
|
17
|
+
hoverRating = event.target.dataset.starNumber * 2
|
18
|
+
hoverRating += if leftHalf then 1 else 2
|
19
|
+
hoverRating
|
20
|
+
|
21
|
+
mousemove = (event) ->
|
22
|
+
[whole_stars, half_star] = divmod(getStarEventRating(event.target, event), 2)
|
23
|
+
Array.from(event.target.parentElement.childNodes).forEach (star) ->
|
24
|
+
setClassForRatingDivmod star, whole_stars, half_star
|
25
|
+
star.classList.remove 'yellow'
|
26
|
+
star.classList.add 'orange'
|
27
|
+
|
28
|
+
mouseleave = (event) ->
|
29
|
+
rating = Number(event.target.parentElement.dataset.rating)
|
30
|
+
[whole_stars, half_star] = divmod(rating, 2)
|
31
|
+
Array.from(event.target.parentElement.childNodes).forEach (star) ->
|
32
|
+
setClassForRatingDivmod star, whole_stars, half_star
|
33
|
+
star.classList.remove 'orange'
|
34
|
+
star.classList.remove 'green'
|
35
|
+
star.classList.add 'yellow'
|
36
|
+
|
37
|
+
mouseclick = (event) ->
|
38
|
+
clickValue = getStarEventRating(event.target, event)
|
39
|
+
[whole_stars, half_star] = divmod(clickValue, 2)
|
40
|
+
Array.from(event.target.parentElement.childNodes).forEach (star) ->
|
41
|
+
star.classList.remove 'yellow'
|
42
|
+
star.classList.remove 'orange'
|
43
|
+
cdata = event.target.parentNode.dataset
|
44
|
+
post_data =
|
45
|
+
record: cdata.record
|
46
|
+
record_id: cdata.recordId
|
47
|
+
topic: cdata.topic
|
48
|
+
value: clickValue
|
49
|
+
jQuery.post geo_labels.paths.set_rating, post_data, (response, status, jqXHR) ->
|
50
|
+
event.target.parentNode.dataset.rating = clickValue
|
51
|
+
Array.from(event.target.parentElement.childNodes).forEach (star) ->
|
52
|
+
star.classList.add 'green'
|
53
|
+
setTimeout ->
|
54
|
+
mouseleave(event)
|
55
|
+
, 1000
|
56
|
+
.fail (jqXHR) ->
|
57
|
+
# jqXHR.status is probably 422 or 403
|
58
|
+
alert "The rating cannot be updated"
|
59
|
+
mouseleave(event)
|
60
|
+
|
61
|
+
|
62
|
+
jQuery(document).ready ->
|
63
|
+
containers = document.getElementsByClassName 'rating-container'
|
64
|
+
for container in containers
|
65
|
+
container.innerHTML = ''
|
66
|
+
data = container.dataset
|
67
|
+
[whole_stars, half_star] = divmod(Number(data.rating), 2)
|
68
|
+
for star_index in [0...5]
|
69
|
+
icon = document.createElement 'i'
|
70
|
+
icon.className = 'yellow star icon'
|
71
|
+
#icon.classList.add 'half' if star_index is whole_stars and half_star
|
72
|
+
#if star_index > whole_stars
|
73
|
+
# icon.classList.add 'outline'
|
74
|
+
icon.dataset.starNumber = star_index
|
75
|
+
setClassForRatingDivmod icon, whole_stars, half_star
|
76
|
+
icon.onmousemove = (event) -> mousemove(event)
|
77
|
+
icon.onmouseleave = (event) -> mouseleave(event)
|
78
|
+
icon.addEventListener 'click', (event) -> mouseclick(event)
|
79
|
+
container.appendChild icon
|
80
|
+
false
|
@@ -6,5 +6,26 @@ main
|
|
6
6
|
padding-top: 12px
|
7
7
|
> .container .page-title
|
8
8
|
padding-top: 12px
|
9
|
+
.page-title
|
10
|
+
.primary.button
|
11
|
+
float: right
|
12
|
+
.rating-container i.icon.hidden
|
13
|
+
display: none
|
14
|
+
|
15
|
+
.labels-tree
|
16
|
+
li
|
17
|
+
&:hover
|
18
|
+
background-color: #ddd
|
19
|
+
.icon
|
20
|
+
display: inline-block
|
21
|
+
.icon
|
22
|
+
float: right
|
23
|
+
margin-left: 10px
|
24
|
+
display: none
|
25
|
+
.table-link.edit
|
26
|
+
font-size: 0.5rem !important
|
27
|
+
@media (hover: none)
|
28
|
+
.labels-tree li .icon
|
29
|
+
display: inline-block
|
9
30
|
#map-canvas
|
10
31
|
height: 600px
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module GeoLabels
|
2
4
|
module SharedTemplateAndInstanceMethods
|
3
5
|
extend ActiveSupport::Concern
|
@@ -11,6 +13,7 @@ module GeoLabels
|
|
11
13
|
def record_class
|
12
14
|
result = controller_path.classify.safe_constantize
|
13
15
|
raise "Cannot determine record_class from controller_path: #{controller_path}" unless result
|
16
|
+
|
14
17
|
result
|
15
18
|
end
|
16
19
|
|
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module GeoLabels
|
2
3
|
class ContactsController < ApplicationController
|
4
|
+
|
3
5
|
include SharedTemplateAndInstanceMethods
|
4
6
|
respond_to :html
|
5
7
|
|
@@ -52,5 +54,21 @@ module GeoLabels
|
|
52
54
|
@record.destroy
|
53
55
|
redirect_to record_class, status: :see_other
|
54
56
|
end
|
57
|
+
|
58
|
+
# PUT /contacts/:id/reject
|
59
|
+
def reject
|
60
|
+
# redirect_to record_class, alert: "Only contacts of state recomm"
|
61
|
+
@record = record_class.find params[:id]
|
62
|
+
@record.update state: 'rejected'
|
63
|
+
redirect_to @record, notice: 'Rejected'
|
64
|
+
end
|
65
|
+
|
66
|
+
# PUT /contacts/:id/reject
|
67
|
+
def approve
|
68
|
+
# redirect_to record_class, alert: "Only contacts of state recomm"
|
69
|
+
@record = record_class.find params[:id]
|
70
|
+
@record.update state: 'approved'
|
71
|
+
redirect_to @record, notice: 'Approved'
|
72
|
+
end
|
55
73
|
end
|
56
74
|
end
|
@@ -1,26 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module GeoLabels
|
2
3
|
class DashboardController < ApplicationController
|
4
|
+
|
3
5
|
def main
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
return unless params[:label_ids].present?
|
7
|
+
|
8
|
+
label_ids = params[:label_ids]
|
9
|
+
# fomantic-ui uses comma separated id values
|
10
|
+
label_ids = label_ids.to_s.split(',') unless label_ids.is_a?(Array)
|
11
|
+
states_array = (params[:states].presence || 'approved').split(',')
|
12
|
+
@contacts = Contact.geocoded.for_label_ids(label_ids, predication: params[:predication], states: states_array)
|
10
13
|
end
|
11
14
|
|
12
15
|
def export
|
16
|
+
# SHOW action for the view to call the export_file action
|
13
17
|
end
|
14
18
|
|
15
19
|
def export_file
|
16
20
|
timestamp = Time.now.utc.iso8601.first(19).gsub(/-|:/, '')
|
17
21
|
send_data GeoLabels::Exporter.export_str,
|
18
|
-
|
19
|
-
|
20
|
-
|
22
|
+
filename: "GeoLabels-export-#{timestamp}.yml",
|
23
|
+
type: :text,
|
24
|
+
disposition: :attachment
|
21
25
|
end
|
22
26
|
|
23
27
|
def import
|
28
|
+
# SHOW action for the view to call the import_file action
|
24
29
|
end
|
25
30
|
|
26
31
|
def import_file
|
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module GeoLabels
|
2
3
|
class LabelsController < ApplicationController
|
4
|
+
|
3
5
|
include SharedTemplateAndInstanceMethods
|
4
6
|
respond_to :html
|
5
7
|
|
@@ -12,7 +14,7 @@ module GeoLabels
|
|
12
14
|
end
|
13
15
|
|
14
16
|
def new
|
15
|
-
@record = record_class.new
|
17
|
+
@record = record_class.new(parent_id: params[:parent_id])
|
16
18
|
authorize! :create, @record
|
17
19
|
end
|
18
20
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Separate ratings controller for easyer future extraction of functionality
|
4
|
+
# posibly gem extraction if used sufficiently
|
5
|
+
module GeoLabels
|
6
|
+
class RatingsController < ApplicationController
|
7
|
+
|
8
|
+
# Still has no application
|
9
|
+
def get
|
10
|
+
render plain: 'TODO app/controllers/geo_labels/ratings_controller.rb'
|
11
|
+
end
|
12
|
+
|
13
|
+
# PUT /geo-labels/ratings/set?record=GeoLabels::Contact&record_id=3&topic=food&value=7
|
14
|
+
def set
|
15
|
+
model = params[:record].safe_constantize
|
16
|
+
return render plain: '', status: :unprocessable_entity unless model&.include?(GeoLabels::RatingsSupport) # 422
|
17
|
+
return render plain: '', status: :unprocessable_entity unless model.rating_topics.include? params[:topic].to_sym
|
18
|
+
|
19
|
+
record = model.find(params[:record_id])
|
20
|
+
#TODO: add more sophisticated safeguard
|
21
|
+
record.rating[params[:topic]] = params[:value]
|
22
|
+
|
23
|
+
if record.save
|
24
|
+
render plain: ''
|
25
|
+
else
|
26
|
+
render plain: '', status: :unprocessable_entity
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|