decidim-navigation_maps 1.0.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 (82) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +144 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/config/admin/decidim_navigation_maps_manifest.css +3 -0
  6. data/app/assets/config/admin/decidim_navigation_maps_manifest.js +3 -0
  7. data/app/assets/config/decidim_navigation_maps_manifest.css +3 -0
  8. data/app/assets/config/decidim_navigation_maps_manifest.js +1 -0
  9. data/app/assets/images/decidim/navigation_maps/icon.svg +1 -0
  10. data/app/assets/javascripts/decidim/navigation_maps/admin/map_editor.js +88 -0
  11. data/app/assets/javascripts/decidim/navigation_maps/admin/navigation_maps.js +143 -0
  12. data/app/assets/javascripts/decidim/navigation_maps/map_view.js +123 -0
  13. data/app/assets/javascripts/decidim/navigation_maps/navigation_maps.js +44 -0
  14. data/app/assets/stylesheets/decidim/navigation_maps/_variables.scss +3 -0
  15. data/app/assets/stylesheets/decidim/navigation_maps/admin/navigation_maps.scss +102 -0
  16. data/app/assets/stylesheets/decidim/navigation_maps/navigation_maps.scss +58 -0
  17. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/_styles.erb +18 -0
  18. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/_tabs.erb +5 -0
  19. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/_tabs_content.erb +8 -0
  20. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/_template.erb +13 -0
  21. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/show.erb +21 -0
  22. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_cell.rb +22 -0
  23. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_form.erb +36 -0
  24. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_modal.erb +12 -0
  25. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_tabs.erb +6 -0
  26. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_tabs_content.erb +11 -0
  27. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/show.erb +35 -0
  28. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form_cell.rb +32 -0
  29. data/app/commands/decidim/navigation_maps/save_area.rb +58 -0
  30. data/app/commands/decidim/navigation_maps/save_blueprints.rb +72 -0
  31. data/app/controllers/decidim/navigation_maps/admin/application_controller.rb +13 -0
  32. data/app/controllers/decidim/navigation_maps/admin/areas_controller.rb +94 -0
  33. data/app/controllers/decidim/navigation_maps/admin/blueprints_controller.rb +64 -0
  34. data/app/forms/decidim/navigation_maps/area_form.rb +37 -0
  35. data/app/forms/decidim/navigation_maps/blueprint_form.rb +39 -0
  36. data/app/forms/decidim/navigation_maps/blueprint_forms.rb +9 -0
  37. data/app/models/decidim/navigation_maps/application_record.rb +10 -0
  38. data/app/models/decidim/navigation_maps/blueprint.rb +27 -0
  39. data/app/models/decidim/navigation_maps/blueprint_area.rb +32 -0
  40. data/app/queries/decidim/navigation_maps/organization_blueprints.rb +20 -0
  41. data/app/uploaders/decidim/navigation_maps/blueprint_uploader.rb +22 -0
  42. data/app/views/decidim/navigation_maps/admin/areas/_form.html.erb +39 -0
  43. data/app/views/decidim/navigation_maps/admin/areas/new.html.erb +17 -0
  44. data/app/views/decidim/navigation_maps/admin/areas/show.html.erb +14 -0
  45. data/config/i18n-tasks.yml +10 -0
  46. data/config/locales/ca.yml +45 -0
  47. data/config/locales/cs.yml +45 -0
  48. data/config/locales/en.yml +46 -0
  49. data/config/locales/es.yml +45 -0
  50. data/db/migrate/20191022092624_create_decidim_navigation_maps_blueprints.rb +13 -0
  51. data/db/migrate/20191120185739_add_title_to_navigation_maps_blueprints.rb +10 -0
  52. data/db/migrate/20191125142751_create_decidim_navigation_maps_blueprint_areas.rb +18 -0
  53. data/db/migrate/20191126045831_add_link_type_to_decidim_navigation_maps_blueprint_areas.rb +8 -0
  54. data/db/migrate/20191126154019_add_area_id_to_decidim_navigation_maps_blueprint_areas.rb +16 -0
  55. data/db/migrate/20191127093746_add_color_to_navigation_maps_blueprint_areas.rb +7 -0
  56. data/lib/decidim/navigation_maps.rb +13 -0
  57. data/lib/decidim/navigation_maps/admin.rb +10 -0
  58. data/lib/decidim/navigation_maps/admin_engine.rb +34 -0
  59. data/lib/decidim/navigation_maps/engine.rb +34 -0
  60. data/lib/decidim/navigation_maps/navigation_map_cell_helpers.rb +28 -0
  61. data/lib/decidim/navigation_maps/test/factories.rb +29 -0
  62. data/lib/decidim/navigation_maps/version.rb +9 -0
  63. data/vendor/assets/images/draw/layers-2x.png +0 -0
  64. data/vendor/assets/images/draw/layers.png +0 -0
  65. data/vendor/assets/images/draw/marker-icon-2x.png +0 -0
  66. data/vendor/assets/images/draw/marker-icon.png +0 -0
  67. data/vendor/assets/images/draw/marker-shadow.png +0 -0
  68. data/vendor/assets/images/draw/spritesheet-2x.png +0 -0
  69. data/vendor/assets/images/draw/spritesheet.png +0 -0
  70. data/vendor/assets/images/draw/spritesheet.svg +156 -0
  71. data/vendor/assets/images/images/layers-2x.png +0 -0
  72. data/vendor/assets/images/images/layers.png +0 -0
  73. data/vendor/assets/images/images/marker-icon-2x.png +0 -0
  74. data/vendor/assets/images/images/marker-icon.png +0 -0
  75. data/vendor/assets/images/images/marker-shadow.png +0 -0
  76. data/vendor/assets/javascripts/jquery.form.js +1277 -0
  77. data/vendor/assets/javascripts/jsrender.min.js +4 -0
  78. data/vendor/assets/javascripts/jsrender.min.js.map +1 -0
  79. data/vendor/assets/javascripts/leaflet-geoman.min.js +1 -0
  80. data/vendor/assets/javascripts/leaflet.js +5 -0
  81. data/vendor/assets/stylesheets/leaflet-geoman.css +164 -0
  82. metadata +183 -0
@@ -0,0 +1,44 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
3
+ //= require decidim/navigation_maps/map_view
4
+ //= require jsrender.min
5
+ //= require_self
6
+
7
+ $(function() {
8
+
9
+ var $maps = $('.navigation_maps .map');
10
+ var $tabs = $('#navigation_maps-tabs');
11
+ var maps = {};
12
+ var tmpl = $.templates("#navigation_maps-popup");
13
+
14
+ $maps.each(function() {
15
+ var id = $(this).data('id');
16
+ maps[id] = new NavigationMapView(this);
17
+ maps[id].onSetLayerProperties(function(layer, props) {
18
+ if(!props.popup) {
19
+ var node = document.createElement("div");
20
+ var html = tmpl.render(props);
21
+ $(node).html(html);
22
+
23
+ layer.bindPopup(node, {
24
+ maxHeight: 400,
25
+ // autoPan: false,
26
+ maxWidth: 640,
27
+ minWidth: 200,
28
+ keepInView: true,
29
+ className: `navigation_map-info map-info-${id}-${layer._leaflet_id}`
30
+ });
31
+ }
32
+ });
33
+ maps[id].onClickArea(function(area) {
34
+ var popup = area.feature.properties && area.feature.properties.link && area.feature.properties.popup;
35
+ if(popup) location = area.feature.properties.link;
36
+ });
37
+ });
38
+
39
+ $tabs.on('change.zf.tabs', function(e, $tab, $content) {
40
+ var id = $content.find('.map').data('id');
41
+ maps[id].reload();
42
+ });
43
+
44
+ });
@@ -0,0 +1,3 @@
1
+ // Variables
2
+
3
+ $leaflet-background-color: 34,98,204;
@@ -0,0 +1,102 @@
1
+ //= require leaflet
2
+ //= require leaflet-geoman
3
+ //= require_self
4
+
5
+ @import "decidim/variables";
6
+ @import "decidim/utils/settings";
7
+ @import "decidim/utils/mixins";
8
+ @import "decidim/navigation_maps/variables";
9
+
10
+ .navigation_maps.admin {
11
+ .accordion-item {
12
+ .accordion-title {
13
+ border: 1px solid #ccc !important;
14
+ }
15
+ &.is-active {
16
+ .accordion-title {
17
+ background-color: #039be5;
18
+ border-color: "rgba(#{$leaflet-background-color}, 1)" !important;
19
+ }
20
+ }
21
+ }
22
+
23
+ >.content {
24
+ position: relative;
25
+ }
26
+ .loading {
27
+ display: none;
28
+ z-index: 10000;
29
+ content: "";
30
+ position: absolute;
31
+ background-color: rgba(255,255,255,.8);
32
+ top: 0;
33
+ left: 0;
34
+ width: 100%;
35
+ height: 100%;
36
+ .inner-loading {
37
+ margin-top: 25%;
38
+ width: 90%;
39
+ display: inline-block;
40
+ text-align: center;
41
+
42
+ }
43
+ .spinner {
44
+ @include spinner(25px, #aaa, var(--secondary), 800ms);
45
+ vertical-align: middle;
46
+ }
47
+ .progress {
48
+ background-color: #aaa;
49
+ display: inline-block;
50
+ width: 90%;
51
+ margin-left: 1em;
52
+ }
53
+ .progress-meter {
54
+ color: #fff;
55
+ background-color: var(--secondary);
56
+ width: 30%;
57
+ padding:0 0.5em;
58
+ font-size: 0.7em;
59
+ font-weight: bold;
60
+ }
61
+
62
+ }
63
+
64
+ .tabs-content {
65
+ .map {
66
+ height: 475px;
67
+ }
68
+ .thumbnail {
69
+ img {
70
+ max-height: 100px;
71
+ }
72
+ }
73
+ .delete-tab {
74
+ border-top: 1px solid $dark-gray;
75
+ padding: 1em 1em 0;
76
+ }
77
+ .leaflet-interactive {
78
+ fill: "rgba(#{$leaflet-background-color}, 1)";
79
+ color: "rgba(#{$leaflet-background-color}, 1)";
80
+ weight: 3;
81
+ opacity: 0.6;
82
+ fill-opacity: 0.5;
83
+ &.selected {
84
+ opacity: 1;
85
+ }
86
+ }
87
+ }
88
+
89
+ }
90
+
91
+ .navigation_maps.modal {
92
+ .spinner {
93
+ @include spinner(25px, #aaa, var(--secondary), 800ms);
94
+ vertical-align: middle;
95
+ display: none;
96
+ }
97
+ &.loading {
98
+ .spinner {
99
+ display: inline-block;
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,58 @@
1
+ //= require leaflet
2
+ //= require leaflet-geoman
3
+ //= require_self
4
+
5
+ @import "decidim/navigation_maps/variables";
6
+
7
+ .home-section {
8
+ .navigation_maps {
9
+ margin: 1em 0;
10
+ .tabs {
11
+ background-color: #f4f4f4;
12
+ }
13
+ .tabs-title {
14
+ a {
15
+ font-size: 1.2em;
16
+ color: var(--secondary);
17
+ }
18
+ }
19
+ .tabs-content {
20
+ border-color: #f4f4f4;
21
+ }
22
+ .map {
23
+ height: 475px;
24
+ @media (max-width: 480px) {
25
+ height: 240px;
26
+ }
27
+ }
28
+ .map-info__content {
29
+ padding-top: 0;
30
+ padding-left: 0;
31
+ }
32
+ .leaflet-container {
33
+ background-color: #fafafa;
34
+ border-color:#f4f4f4;
35
+ .navigation_map-info {
36
+ border-style: solid;
37
+ border-width: 3px;
38
+ border-radius: 10px;
39
+ .leaflet-popup-content-wrapper {
40
+ border-radius: 10px;
41
+ }
42
+ .leaflet-popup-tip {
43
+ border-width: 3px;
44
+ }
45
+ }
46
+ }
47
+ .leaflet-interactive {
48
+ fill: "rgba(#{$leaflet-background-color}, 1)";
49
+ color: "rgba(#{$leaflet-background-color}, 1)";
50
+ weight: 3;
51
+ opacity: 0.6;
52
+ fill-opacity: 0.5;
53
+ &.selected {
54
+ opacity: 1;
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,18 @@
1
+ <style type="text/css">
2
+ <% blueprints.each do |blueprint| %>
3
+ <% next unless blueprint.areas %>
4
+ <% blueprint.areas.each do |area| %>
5
+ .map-info-<%= blueprint.id %>-<%= area.area_id %> {
6
+ border-color: <%= area.color %> !important;
7
+ }
8
+ .map-info-<%= blueprint.id %>-<%= area.area_id %> .leaflet-popup-tip {
9
+ border-color: <%= area.color %> !important;
10
+ }
11
+ .map-info-<%= blueprint.id %>-<%= area.area_id %> .button {
12
+ background-color: <%= area.color %>;
13
+ color: #fff;
14
+ }
15
+
16
+ <% end %>
17
+ <% end %>
18
+ </style>
@@ -0,0 +1,5 @@
1
+ <ul class="tabs" data-deep-link="true" data-update-history="true" data-deep-link-smudge="true" data-deep-link-smudge-delay="500" data-tabs id="navigation_maps-tabs">
2
+ <% tabs.each_with_index do |item, index| %>
3
+ <li class="tabs-title<%= " is-active" if index.zero? %>"><a data-tabs-target="map<%= index %>" href="#map<%= index %>"><%= translated_attribute(item.title).presence || "Tab #{index + 1}" %></a></li>
4
+ <% end %>
5
+ </ul>
@@ -0,0 +1,8 @@
1
+
2
+ <div class="tabs-content admin" data-tabs-content="navigation_maps-tabs">
3
+ <% tabs.each_with_index do |item, index| %>
4
+ <div class="tabs-panel<%= " is-active" if index.zero? %>" id="map<%= index %>">
5
+ <%= content_tag(:div, "", id: "navigation_maps-map-#{item.id}", class: "map", data: { id: item.id, image: item.image.url, blueprint: item.blueprint }) %>
6
+ </div>
7
+ <% end %>
8
+ </div>
@@ -0,0 +1,13 @@
1
+ <script id="navigation_maps-popup" type="text/x-jsrender">
2
+ <div class="map-info__content">
3
+ <h3>{{:title}}</h3>
4
+ <div id="bodyContent">
5
+ <p>{{:description}}</p>
6
+ <div class="map-info__button">
7
+ <a href="{{:link}}" class="button button--sc">
8
+ <%= t(".view") %>
9
+ </a>
10
+ </div>
11
+ </div>
12
+ </div>
13
+ </script>
@@ -0,0 +1,21 @@
1
+ <%= stylesheet_link_tag "decidim/navigation_maps/navigation_maps" %>
2
+ <%= render partial: "styles", locals: { blueprints: valid_blueprints } %>
3
+
4
+ <section class="extended home-section">
5
+ <div class="wrapper-home">
6
+ <div class="row column text-center">
7
+
8
+ <% if translated_title.present? %>
9
+ <h3 class="heading3"><%= decidim_sanitize translated_title %></h3>
10
+ <% end %>
11
+
12
+ <div class="navigation_maps">
13
+ <%= render partial: "tabs", locals: { tabs: valid_blueprints } %>
14
+ <%= render partial: "tabs_content", locals: { tabs: valid_blueprints } %>
15
+ </div>
16
+ </div>
17
+ </div>
18
+ </section>
19
+
20
+ <%= render partial: "template" %>
21
+ <%= javascript_include_tag "decidim/navigation_maps/navigation_maps" %>
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module NavigationMaps
5
+ module ContentBlocks
6
+ class NavigationMapCell < Decidim::ViewModel
7
+ include NavigationMaps::NavigationMapCellHelpers
8
+ include Decidim::SanitizeHelper
9
+
10
+ view_paths << "#{Decidim::NavigationMaps::Engine.root}/app/cells/decidim/navigation_maps/content_blocks/navigation_map"
11
+
12
+ def show
13
+ render if valid_blueprints?
14
+ end
15
+
16
+ def translated_title
17
+ translated_attribute(model.settings.title)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ <ul class="accordion" data-accordion>
2
+ <li class="accordion-item<%= " is-active" unless form.image? %>" data-accordion-item>
3
+ <a href="#" class="accordion-title"><%= t ".info" %></a>
4
+
5
+ <div class="accordion-content" data-tab-content>
6
+ <%= translated_field_tag :text_field_tag, "blueprints[#{form.ident}]", :title, form.title, { tabs_id: "blueprints_#{form.ident}_title", label: t(".title") } %>
7
+
8
+ <%= label_tag t(".blueprint_image") %>
9
+ <div class="thumbnail">
10
+ <%= image_tag form.image.thumbnail.url if form.image? %>
11
+ </div>
12
+ <%= file_field_tag "blueprints[#{form.ident}][image]", { id: "blueprints_#{form.ident}_image", label: t(".title") } %>
13
+
14
+ <%= hidden_field_tag "blueprints[#{form.ident}][id]", form.id, { id: "blueprints_#{form.ident}_id" } %>
15
+ <%= hidden_field_tag "blueprints[#{form.ident}][blueprint]", form.blueprint.to_json, { id: "blueprints_#{form.ident}_blueprint" } %>
16
+
17
+ <% if form.id %>
18
+ <label class="delete-tab">
19
+ <%= check_box_tag("blueprints[#{form.ident}][remove]", form.id) %>
20
+ <%= t(".remove_blueprint") %>
21
+ </label>
22
+ <% end %>
23
+ </div>
24
+ </li>
25
+
26
+ <% if form.image? %>
27
+ <li class="accordion-item is-active" data-accordion-item>
28
+ <a href="#" class="accordion-title"><%= t ".editor" %></a>
29
+ <div class="accordion-content navigation_maps-content" data-tab-content>
30
+
31
+ <%= content_tag(:div, "", id: "navigation_maps-map-#{form.ident}", class: "map", data: { id: form.ident, image: form.image.url, blueprint: form.blueprint }) %>
32
+
33
+ </div>
34
+ </li>
35
+ <% end %>
36
+ </ul>
@@ -0,0 +1,12 @@
1
+
2
+ <div class="reveal navigation_maps modal loading" id="mapEditModal" data-reveal>
3
+ <div class="modal-content">
4
+
5
+ </div>
6
+
7
+ <div class="spinner"></div>
8
+
9
+ <button class="close-button" data-close aria-label="Close modal" type="button">
10
+ <span aria-hidden="true">&times;</span>
11
+ </button>
12
+ </div>
@@ -0,0 +1,6 @@
1
+ <ul class="tabs" data-deep-link="true" data-update-history="true" data-deep-link-smudge="true" data-deep-link-smudge-delay="500" data-tabs id="navigation_maps-tabs">
2
+ <% tabs.each_with_index do |item, index| %>
3
+ <li class="tabs-title<%= " is-active" if index.zero? %>"><a data-tabs-target="map<%= index %>" href="#map<%= index %>"><%= translated_attribute(item.title).presence || "Tab #{index + 1}" %></a></li>
4
+ <% end %>
5
+ <li class="tabs-title"><a href="#map-new">+ <%= t ".add" %></a></li>
6
+ </ul>
@@ -0,0 +1,11 @@
1
+
2
+ <div class="tabs-content" data-tabs-content="navigation_maps-tabs">
3
+ <% tabs.each_with_index do |item, index| %>
4
+ <div class="tabs-panel<%= " is-active" if index.zero? %>" id="map<%= index %>">
5
+ <%= render partial: "form", locals: { form: blueprint_form(item) } %>
6
+ </div>
7
+ <% end %>
8
+ <div class="tabs-panel" id="map-new">
9
+ <%= render partial: "form", locals: { form: blueprint_form } %>
10
+ </div>
11
+ </div>
@@ -0,0 +1,35 @@
1
+ <!-- Original settings -->
2
+ <% form.fields_for :settings, form.object.settings do |settings_fields| %>
3
+ <%= settings_fields.translated :text_field, :title %>
4
+ <% end %>
5
+
6
+ <!-- Override rails default patch (using post via ajax) -->
7
+ <%= hidden_field_tag :_method, "post" %>
8
+ <%= hidden_field_tag :action, blueprints_path %>
9
+
10
+ <div class="navigation_maps admin">
11
+ <div class="callout" style="display:none" data-closable>
12
+ <p></p>
13
+ <button class="close-button" aria-label="Dismiss alert" type="button" data-close>
14
+ <span aria-hidden="true">&times;</span>
15
+ </button>
16
+ </div>
17
+
18
+ <div class="content">
19
+ <%= render partial: "tabs", locals: { tabs: blueprints } %>
20
+ <%= render partial: "tabs_content", locals: { tabs: blueprints } %>
21
+
22
+ <div class="loading">
23
+ <div class="inner-loading">
24
+ <div class="spinner"></div>
25
+ <div class="progress" role="progressbar" tabindex="0" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
26
+ <div class="progress-meter">0%</div>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <%= render partial: "modal" %>
34
+ <%= javascript_include_tag "decidim/navigation_maps/admin/navigation_maps" %>
35
+ <%= stylesheet_link_tag "decidim/navigation_maps/admin/navigation_maps" %>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module NavigationMaps
5
+ module ContentBlocks
6
+ class NavigationMapSettingsFormCell < Decidim::ViewModel
7
+ include NavigationMaps::NavigationMapCellHelpers
8
+ alias form model
9
+
10
+ view_paths << "#{Decidim::NavigationMaps::Engine.root}/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form"
11
+
12
+ def blueprint_form(blueprint = nil)
13
+ blueprint ||= Blueprint.new
14
+ BlueprintForm.from_model(blueprint).with_context(organization: current_organization)
15
+ end
16
+
17
+ # it should come from the Engine Routes
18
+ def blueprints_path
19
+ "/admin/navigation_maps/blueprints"
20
+ end
21
+
22
+ def content_block
23
+ options[:content_block]
24
+ end
25
+
26
+ def label
27
+ I18n.t("decidim.content_blocks.html.html_content")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end