decidim-decidim_geo 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +172 -0
  4. data/Rakefile +119 -0
  5. data/app/cells/decidim/geo/content_blocks/geo_maps/show.erb +15 -0
  6. data/app/cells/decidim/geo/content_blocks/geo_maps_cell.rb +114 -0
  7. data/app/cells/decidim/geo/content_blocks/geo_maps_settings_form_cell.rb +14 -0
  8. data/app/cells/decidim/geo/geo_collection_map/show.erb +4 -0
  9. data/app/cells/decidim/geo/geo_collection_map_cell.rb +102 -0
  10. data/app/commands/decidim/admin/create_scope.rb +56 -0
  11. data/app/commands/decidim/admin/create_scope_type.rb +47 -0
  12. data/app/commands/decidim/admin/update_scope.rb +60 -0
  13. data/app/commands/decidim/admin/update_scope_type.rb +62 -0
  14. data/app/commands/decidim/geo/admin/create_shapefile.rb +51 -0
  15. data/app/commands/decidim/geo/admin/update_geo_config.rb +54 -0
  16. data/app/commands/decidim/geo/command.rb +14 -0
  17. data/app/controllers/decidim/admin/scopes_controller.rb +115 -0
  18. data/app/controllers/decidim/geo/admin/application_controller.rb +21 -0
  19. data/app/controllers/decidim/geo/admin/geo_configs_controller.rb +44 -0
  20. data/app/controllers/decidim/geo/admin/shapefiles_controller.rb +41 -0
  21. data/app/controllers/decidim/geo/application_controller.rb +13 -0
  22. data/app/controllers/decidim/geo/shapefile_controller.rb +11 -0
  23. data/app/forms/decidim/admin/scope_form.rb +43 -0
  24. data/app/forms/decidim/admin/scope_type_form.rb +27 -0
  25. data/app/forms/decidim/geo/admin/geo_config_form.rb +20 -0
  26. data/app/forms/decidim/geo/admin/shapefile_form.rb +23 -0
  27. data/app/helpers/decidim/admin/scopes_helper.rb +72 -0
  28. data/app/jobs/decidim/geo/shp2pgsql_job.rb +14 -0
  29. data/app/models/decidim/debates/debate.rb +226 -0
  30. data/app/models/decidim/geo/application_record.rb +10 -0
  31. data/app/models/decidim/geo/geo_config.rb +28 -0
  32. data/app/models/decidim/geo/shapedata.rb +23 -0
  33. data/app/models/decidim/geo/shapefile.rb +27 -0
  34. data/app/models/decidim/geo/space_location.rb +16 -0
  35. data/app/models/decidim/scope.rb +111 -0
  36. data/app/models/decidim/scope_type.rb +26 -0
  37. data/app/overrides/decidim/assemblies/admin/assemblies/_form/insert_location_form.html.erb.deface +13 -0
  38. data/app/overrides/decidim/assemblies/assemblies/show/insert_location.html.erb.deface +7 -0
  39. data/app/overrides/decidim/participatory_processes/admin/participatory_processes/_form/insert_location_form.html.erb.deface +13 -0
  40. data/app/overrides/decidim/participatory_processes/participatory_process_groups/show/insert_map.html.erb.deface +6 -0
  41. data/app/overrides/layouts/decidim/_assembly_header/insert_map.html.erb.deface +25 -0
  42. data/app/overrides/layouts/decidim/_process_header/insert_map.html.erb.deface +22 -0
  43. data/app/overrides/layouts/decidim/_wrapper/insert_map.html.erb.deface +5 -0
  44. data/app/overrides/remove_default_meetings_map.rb +4 -0
  45. data/app/overrides/remove_default_proposals_map.rb +4 -0
  46. data/app/packs/entrypoints/decidim_geo.js +3 -0
  47. data/app/packs/images/decidim/geo/not-geolocated.svg +3 -0
  48. data/app/packs/src/decidim/geo/actions/index.js +25 -0
  49. data/app/packs/src/decidim/geo/api/index.js +53 -0
  50. data/app/packs/src/decidim/geo/api/queries.js +77 -0
  51. data/app/packs/src/decidim/geo/bootstrap.js +6 -0
  52. data/app/packs/src/decidim/geo/index.js +101 -0
  53. data/app/packs/src/decidim/geo/models/configStore.js +44 -0
  54. data/app/packs/src/decidim/geo/models/dropdownFilterStore.js +65 -0
  55. data/app/packs/src/decidim/geo/models/filterStore.js +121 -0
  56. data/app/packs/src/decidim/geo/models/geoDatasourceNode/GeoDatasourceNode.js +124 -0
  57. data/app/packs/src/decidim/geo/models/geoDatasourceNode/index.js +1 -0
  58. data/app/packs/src/decidim/geo/models/geoScope/GeoScope.js +128 -0
  59. data/app/packs/src/decidim/geo/models/geoScope/index.js +1 -0
  60. data/app/packs/src/decidim/geo/models/geoStore.js +118 -0
  61. data/app/packs/src/decidim/geo/models/pointStore.js +134 -0
  62. data/app/packs/src/decidim/geo/models/scopeDropdownStore.js +20 -0
  63. data/app/packs/src/decidim/geo/ui/DrawerDetail/fallback.js +42 -0
  64. data/app/packs/src/decidim/geo/ui/DrawerDetail/index.js +2 -0
  65. data/app/packs/src/decidim/geo/ui/DrawerDetail/meetings.js +75 -0
  66. data/app/packs/src/decidim/geo/ui/DrawerMenuItem/fallback.js +45 -0
  67. data/app/packs/src/decidim/geo/ui/DrawerMenuItem/index.js +2 -0
  68. data/app/packs/src/decidim/geo/ui/DrawerMenuItem/meetings.js +62 -0
  69. data/app/packs/src/decidim/geo/ui/createClasses.js +7 -0
  70. data/app/packs/src/decidim/geo/ui/createCustomMarker.js +14 -0
  71. data/app/packs/src/decidim/geo/ui/createDomElement.js +2 -0
  72. data/app/packs/src/decidim/geo/ui/createDrawer.js +170 -0
  73. data/app/packs/src/decidim/geo/ui/createDrawerActions.js +197 -0
  74. data/app/packs/src/decidim/geo/ui/createFilterDropdown.js +320 -0
  75. data/app/packs/src/decidim/geo/ui/createGeoScopeLayer.js +20 -0
  76. data/app/packs/src/decidim/geo/ui/createGeoScopeMenuItem.js +8 -0
  77. data/app/packs/src/decidim/geo/ui/createNodeMarker.js +9 -0
  78. data/app/packs/src/decidim/geo/ui/createNodeMenuItem.js +13 -0
  79. data/app/packs/src/decidim/geo/ui/index.js +8 -0
  80. data/app/packs/src/decidim/geo/ui/initMap.js +22 -0
  81. data/app/packs/src/decidim/geo/utils/index.js +30 -0
  82. data/app/packs/src/decidim/geo/utils/saveConfig.js +15 -0
  83. data/app/packs/stylesheets/decidim/geo/_geo.scss +2 -0
  84. data/app/packs/stylesheets/decidim/geo/geo/_decidim_geo_decidimGeo.scss +476 -0
  85. data/app/packs/stylesheets/decidim/geo/geo/_decidim_geo_override.scss +65 -0
  86. data/app/permissions/decidim/geo/admin/permissions.rb +24 -0
  87. data/app/permissions/decidim/geo/permissions.rb +15 -0
  88. data/app/uploaders/decidim/geo/shapefile_uploader.rb +14 -0
  89. data/app/validators/geocoding_validator.rb +30 -0
  90. data/app/views/decidim/admin/scope_types/_form.html.erb +10 -0
  91. data/app/views/decidim/admin/scope_types/index.html.erb +46 -0
  92. data/app/views/decidim/admin/scopes/_form.html.erb +20 -0
  93. data/app/views/decidim/admin/scopes/index.html.erb +55 -0
  94. data/app/views/decidim/geo/admin/geo_configs/_form.html.erb +47 -0
  95. data/app/views/decidim/geo/admin/geo_configs/index.html.erb +8 -0
  96. data/app/views/decidim/geo/admin/shapefiles/_form.html.erb +29 -0
  97. data/app/views/decidim/geo/admin/shapefiles/index.html.erb +38 -0
  98. data/app/views/decidim/geo/admin/shapefiles/new.html.erb +8 -0
  99. data/app/views/layouts/decidim/decidim_geo/admin/application.html.erb +19 -0
  100. data/config/assets.rb +9 -0
  101. data/config/i18n-tasks.yml +10 -0
  102. data/config/locales/de.yml +102 -0
  103. data/config/locales/en.yml +108 -0
  104. data/config/locales/fr.yml +102 -0
  105. data/db/migrate/20221019184712_add_postgis_extension_to_database.rb +5 -0
  106. data/db/migrate/20221025195520_create_decidim_geo.rb +22 -0
  107. data/db/migrate/20231013082325_create_decidim_geo_config.rb +11 -0
  108. data/db/migrate/20231206115531_add_spaces_config_to_decidim_geo_configs.rb +6 -0
  109. data/db/migrate/20240309004347_add_organization_to_shapefiles.rb +6 -0
  110. data/db/migrate/20240326052727_create_space_locations.rb +18 -0
  111. data/lib/decidim/api/geo_config_type.rb +15 -0
  112. data/lib/decidim/api/geo_coordinates_type.rb +22 -0
  113. data/lib/decidim/api/geo_datasource_type.rb +147 -0
  114. data/lib/decidim/api/geo_dates_type.rb +15 -0
  115. data/lib/decidim/api/geo_query_extension.rb +25 -0
  116. data/lib/decidim/api/geo_scope_api_type.rb +26 -0
  117. data/lib/decidim/api/geo_shapedata_type.rb +18 -0
  118. data/lib/decidim/api/geo_shapefile_type.rb +22 -0
  119. data/lib/decidim/api/input_filters/assembly_input_filter.rb +13 -0
  120. data/lib/decidim/api/input_filters/geo_datasource_input_filter.rb +18 -0
  121. data/lib/decidim/api/input_filters/geoencoded_input_filter.rb +13 -0
  122. data/lib/decidim/api/input_filters/has_scopeable_input_filter.rb +17 -0
  123. data/lib/decidim/api/input_filters/process_input_filter.rb +13 -0
  124. data/lib/decidim/api/input_filters/resource_type_input_filter.rb +13 -0
  125. data/lib/decidim/api/input_filters/scope_input_filter.rb +13 -0
  126. data/lib/decidim/api/input_filters/time_input_filter.rb +13 -0
  127. data/lib/decidim/api/meetings_input_filter.rb +14 -0
  128. data/lib/decidim/api/query_extension.rb +320 -0
  129. data/lib/decidim/api/shapefile_query_extention.rb +18 -0
  130. data/lib/decidim/api/shapefile_type.rb +18 -0
  131. data/lib/decidim/decidim_geo/admin.rb +10 -0
  132. data/lib/decidim/decidim_geo/admin_engine.rb +69 -0
  133. data/lib/decidim/decidim_geo/api.rb +23 -0
  134. data/lib/decidim/decidim_geo/engine.rb +58 -0
  135. data/lib/decidim/decidim_geo/load_shp/app_load_shp.rb +85 -0
  136. data/lib/decidim/decidim_geo/space_location/assembly_create_command_override.rb +26 -0
  137. data/lib/decidim/decidim_geo/space_location/assembly_form_override.rb +33 -0
  138. data/lib/decidim/decidim_geo/space_location/assembly_update_command_override.rb +21 -0
  139. data/lib/decidim/decidim_geo/space_location/participatory_process_command_override.rb +21 -0
  140. data/lib/decidim/decidim_geo/space_location/participatory_process_form_override.rb +33 -0
  141. data/lib/decidim/decidim_geo/space_location/space_override.rb +15 -0
  142. data/lib/decidim/decidim_geo/test/factories.rb +13 -0
  143. data/lib/decidim/decidim_geo/version.rb +14 -0
  144. data/lib/decidim/decidim_geo.rb +25 -0
  145. data/lib/tasks/decidim_geo_webpacker_tasks.rake +61 -0
  146. metadata +335 -0
@@ -0,0 +1,8 @@
1
+ const createGeoScopeMenuItem = ({ label, onClick }) => {
2
+ const menuItem = L.DomUtil.create("li", "decidimGeo__scopesDropdown__listItem");
3
+ menuItem.onclick = onClick;
4
+ menuItem.textContent += label;
5
+ return menuItem;
6
+ };
7
+
8
+ export default createGeoScopeMenuItem;
@@ -0,0 +1,9 @@
1
+ import { createCustomMarker } from ".";
2
+
3
+ const createNodeMarker = (node) => {
4
+ if(!node.coordinates?.latitude || !node.coordinates?.longitude) return null;
5
+ const location = [node.coordinates.latitude, node.coordinates.longitude];
6
+ return createCustomMarker(location);
7
+ };
8
+
9
+ export default createNodeMarker;
@@ -0,0 +1,13 @@
1
+ import _ from "lodash";
2
+ import { fallback, meetings } from "./DrawerMenuItem";
3
+
4
+ const createNodeMenuItem = (node) => {
5
+ switch (node.type) {
6
+ case "Decidim::Meetings::Meeting":
7
+ return meetings(node);
8
+ default:
9
+ return fallback(node);
10
+ }
11
+ };
12
+
13
+ export default createNodeMenuItem;
@@ -0,0 +1,8 @@
1
+ export { default as initMap } from "./initMap.js";
2
+ export { default as createCustomMarker } from "./createCustomMarker.js";
3
+ export { default as createNodeMarker } from "./createNodeMarker.js";
4
+ export { default as createGeoScopeLayer } from "./createGeoScopeLayer.js";
5
+ export { default as createGeoScopeMenuItem } from "./createGeoScopeMenuItem.js";
6
+ export { default as createNodeMenuItem } from "./createNodeMenuItem.js";
7
+ export { default as createDrawerActions } from "./createDrawerActions.js";
8
+ export { default as createDrawer } from "./createDrawer.js";
@@ -0,0 +1,22 @@
1
+ import configStore from "../models/configStore";
2
+ const initMap = async () => {
3
+ const {
4
+ mapID,
5
+ map_config: { lat, lng, zoom, tile_layer }
6
+ } = configStore.getState();
7
+ const map = L.map(mapID, {
8
+ center: [lat, lng],
9
+ zoom,
10
+ scrollWheelZoom: false
11
+ });
12
+ map.zoomControl.setPosition("topright");
13
+
14
+ L.tileLayer(tile_layer, {
15
+ maxZoom: 19,
16
+ attribution:
17
+ '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
18
+ }).addTo(map);
19
+
20
+ return map;
21
+ };
22
+ export default initMap;
@@ -0,0 +1,30 @@
1
+ export { default as saveConfig } from "./saveConfig";
2
+ export async function getDecidimData(query, params) {
3
+ const body = {
4
+ query,
5
+ ...params
6
+ };
7
+ var result = await window
8
+ .fetch("/api", {
9
+ method: "POST",
10
+ headers: {
11
+ "Content-Type": "application/json"
12
+ },
13
+ body: JSON.stringify(body)
14
+ })
15
+ .then(async (response) => {
16
+ const res = await response.json();
17
+ if (res.errors) {
18
+ throw new Error(JSON.stringify(res.errors));
19
+ }
20
+ return res;
21
+ }).catch((e) => {
22
+ console.error(e);
23
+ return null;
24
+ });
25
+
26
+ if (result) {
27
+ return result;
28
+ }
29
+ return [];
30
+ }
@@ -0,0 +1,15 @@
1
+ import configStore from "../models/configStore";
2
+ export default function saveConfig() {
3
+ const mapElements = document.getElementsByClassName("js-decidimgeo");
4
+ if (mapElements.length < 1) {
5
+ console.warn("no map config for this page");
6
+ return undefined;
7
+ }
8
+ const mapElement = mapElements[0];
9
+ const configString = mapElement.getAttribute("data-config");
10
+ const i18nConfigString = mapElement.getAttribute("data-i18n");
11
+ const config = JSON.parse(configString);
12
+ const i18nConfig = JSON.parse(i18nConfigString);
13
+ const { setConfig } = configStore.getState();
14
+ return setConfig({ ...config, mapID: mapElement.id, i18n: i18nConfig });
15
+ }
@@ -0,0 +1,2 @@
1
+ @import "stylesheets/decidim/geo/geo/decidim_geo_decidimGeo";
2
+ @import "stylesheets/decidim/geo/geo/decidim_geo_override";
@@ -0,0 +1,476 @@
1
+ @mixin decidimGeo__customControl {
2
+ display: block;
3
+ background: #fff;
4
+ font-size: 16px;
5
+ line-height: 20px;
6
+ padding: 4px 8px 6px;
7
+ border-radius: 18px;
8
+ border: 1px solid grey;
9
+ color: grey;
10
+
11
+ label {
12
+ input {
13
+ vertical-align: middle;
14
+ }
15
+ }
16
+ }
17
+
18
+ @mixin decidimGeo__clickableText {
19
+ font-size: 13px;
20
+ line-height: 16px;
21
+ font-weight: bold;
22
+ color: var(--primary);
23
+ cursor: pointer;
24
+ }
25
+
26
+ @mixin decidimGeo__border {
27
+ border-radius: 4px;
28
+ overflow: auto;
29
+ box-shadow: 0px 2px 4px 0px #00000014;
30
+ }
31
+
32
+ @mixin decidimGeo__meetingDateItem {
33
+ text-align: center;
34
+ color: #726a70;
35
+ padding: 0.5em;
36
+ margin-right: -1px;
37
+ margin-top: -1px;
38
+ border-top: 1px solid #e8e8e8;
39
+ }
40
+
41
+ .decidimgeo__map {
42
+ @media (max-width: 640px) {
43
+ display: none;
44
+ }
45
+ }
46
+
47
+ .decidimGeo__customControl__parent {
48
+ @include decidimGeo__customControl;
49
+ }
50
+
51
+ .decidimGeo__customControl__child {
52
+ @include decidimGeo__customControl;
53
+ margin-left: 12px;
54
+ }
55
+
56
+ .decidimGeo__scopesDropdown,
57
+ .decidimGeo__scopesDropdown.leaflet-control {
58
+ @include decidimGeo__border;
59
+ display: block;
60
+ width: 300px;
61
+ background: #fff;
62
+ position: absolute;
63
+ z-index: 9999;
64
+ }
65
+
66
+ .decidimGeo__scopesDropdown__heading {
67
+ width: 100%;
68
+ display: flex;
69
+ justify-content: space-between;
70
+ }
71
+
72
+ .decidimGeo__scopesDropdown__title {
73
+ @include decidimGeo__clickableText;
74
+ display: inline-block;
75
+ padding: 8px 32px 8px 16px;
76
+ margin: 0;
77
+ text-transform: uppercase;
78
+ letter-spacing: 0.2px;
79
+ position: relative;
80
+ overflow: hidden;
81
+ white-space: nowrap;
82
+
83
+ &:after {
84
+ display: inline-block;
85
+ content: "\25BE";
86
+ color: #0c0c0c;
87
+ transform: rotate(-180deg);
88
+ transition: 0.3s;
89
+ position: absolute;
90
+ right: 16px;
91
+ top: 7px;
92
+ }
93
+
94
+ &--button:after {
95
+ display: none;
96
+ }
97
+ &--closed {
98
+ &:after {
99
+ transform: rotate(0);
100
+ }
101
+ }
102
+ &--empty {
103
+ opacity: 0.6;
104
+ }
105
+ }
106
+
107
+ .decidimGeo__scopesDropdown__reset {
108
+ @include decidimGeo__clickableText;
109
+ padding: 8px 16px 8px 8px;
110
+ float: right;
111
+ text-transform: uppercase;
112
+ font-family: $header-font-family;
113
+ letter-spacing: 0.2px;
114
+
115
+ &.decidimGeo__scopesDropdown__reset--hidden {
116
+ display: none;
117
+ }
118
+ }
119
+ .decidimGeo__filterDropdown__container {
120
+ position: relative;
121
+ }
122
+ .decidimGeo__filterDropdown__dropdown {
123
+ width: 300px;
124
+ height: auto;
125
+ max-height: 400px;
126
+ border-top: #cccccc 1px solid;
127
+ overflow: auto;
128
+ list-style: none;
129
+ margin: 0;
130
+ padding: 0;
131
+ padding-bottom: 20px;
132
+
133
+ transition: 0.3s;
134
+
135
+ &--closed {
136
+ width: 300px;
137
+ height: 0;
138
+ overflow: hidden;
139
+ margin: 0;
140
+ padding: 0;
141
+ border-top: unset;
142
+ }
143
+ }
144
+
145
+ .decidimGeo__filterDropdown__dropdown--open {
146
+ display: block;
147
+ }
148
+ .decidimGeo__filterDropdown__counter {
149
+ border-radius: 50%;
150
+ float: right;
151
+ display: flex;
152
+ width: 20px;
153
+ height: 20px;
154
+ padding: 10px;
155
+ flex-direction: column;
156
+ justify-content: center;
157
+ align-items: center;
158
+ gap: 10px;
159
+ flex-shrink: 0;
160
+ background: rgba(var(--primary-rgb), 0.25);
161
+ &--hidden {
162
+ display: none;
163
+ }
164
+ }
165
+ .decidimGeo__filterDropdown__titleContainer {
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ padding-right: 16px;
170
+ &--disabled {
171
+ opacity: 0.25;
172
+ }
173
+ }
174
+ .decidimGeo__filterDropdown__title {
175
+ @include decidimGeo__clickableText;
176
+ padding: 8px 10px 8px 8px;
177
+ float: right;
178
+ text-transform: uppercase;
179
+ font-family: $header-font-family;
180
+ letter-spacing: 0.2px;
181
+ margin-bottom: 0;
182
+ color: #3d393c;
183
+ &:not(.decidimGeo__filterDropdown__title):hover,
184
+ &.decidimGeo__filterDropdown__title--active {
185
+ color: var(--primary);
186
+ }
187
+ }
188
+
189
+ .decidimGeo__filterDropdown__list {
190
+ display: flex;
191
+ flex-direction: column;
192
+ gap: 8px;
193
+ list-style: none;
194
+ margin: 0;
195
+ padding: 18px 8px;
196
+ }
197
+ .decidimGeo__filterDropdown__field {
198
+ display: flex;
199
+ justify-content: space-between;
200
+ align-items: center;
201
+ }
202
+ .decidimGeo__filterDropdown__label {
203
+ @include decidimGeo__clickableText;
204
+ color: #1a181d;
205
+ padding: 8px 16px 8px 8px;
206
+ font-size: 14px;
207
+ text-wrap: nowrap;
208
+ }
209
+
210
+ .decidimGeo__filterDropdown__select,
211
+ .decidimGeo__filterDropdown__select:focus {
212
+ margin-bottom: 0;
213
+ max-width: 100%;
214
+ border: 0;
215
+ text-align: right;
216
+ box-shadow: none;
217
+ color: #1a181d;
218
+ }
219
+ .decidimGeo__filterDropdown__resetBtn,
220
+ .decidimGeo__filterDropdown__applyBtn {
221
+ @include decidimGeo__clickableText;
222
+ padding: 8px 16px;
223
+ letter-spacing: 0.2px;
224
+ color: #3d393c;
225
+ text-transform: uppercase;
226
+ }
227
+ .decidimGeo__filterDropdown__applyBtn {
228
+ color: var(--primary);
229
+ float: right;
230
+ }
231
+
232
+ .decidimGeo__scopesDropdown__list,
233
+ .decidimGeo__drawer__list {
234
+ width: 300px;
235
+ height: auto;
236
+ max-height: 400px;
237
+ border-top: #cccccc 1px solid;
238
+ overflow: auto;
239
+ list-style: none;
240
+ margin: 0;
241
+ padding: 0;
242
+
243
+ transition: 0.3s;
244
+
245
+ &--closed {
246
+ width: 300px;
247
+ height: 0;
248
+ overflow: hidden;
249
+ margin: 0;
250
+ padding: 0;
251
+ }
252
+ &--hidden {
253
+ display: none;
254
+ }
255
+ }
256
+ .decidimGeo__scopesDropdown__listItem {
257
+ @include decidimGeo__clickableText;
258
+ display: block;
259
+ margin: 8px;
260
+ padding-left: 16px;
261
+ padding-right: 16px;
262
+ }
263
+ .decidimGeo__drawer__list {
264
+ transform: translateY(31px);
265
+ padding: 4px 16px;
266
+ background: #f0f0f0;
267
+ box-shadow: 0px -1px 0px 0px #e0e0e0 inset;
268
+ border-radius: 0px 0px 4px 4px;
269
+ margin-top: -2px;
270
+
271
+ &:empty {
272
+ transform: translateY(0);
273
+ }
274
+ }
275
+
276
+ .decidimGeo__drawer__listItem {
277
+ @include decidimGeo__clickableText;
278
+ display: block;
279
+ margin: 6px 8px;
280
+ padding-left: 16px;
281
+ padding-right: 16px;
282
+ }
283
+ .decidimGeo__emptyDrawer__container {
284
+ text-align: center;
285
+ }
286
+ .decidimGeo__emptyDrawer__paragraph {
287
+ padding: 24px 0;
288
+ font-size: 17px;
289
+ font-weight: 400;
290
+ line-height: 21.37px;
291
+ }
292
+ .decidimGeo__emptyDrawer__button {
293
+ @include decidimGeo__clickableText;
294
+ display: inline-block;
295
+ margin: 0 8px;
296
+ margin-bottom: 24px;
297
+ padding-left: 16px;
298
+ padding-right: 16px;
299
+ }
300
+ .decidimGeo__drawer__listCardLoader {
301
+ content: "";
302
+ width: 100%;
303
+ padding: 0 12px;
304
+ background: #eee;
305
+ }
306
+
307
+ .decidimGeo__drawer__listCard {
308
+ @include decidimGeo__border;
309
+ display: block;
310
+ background: #ffffff;
311
+ width: 100%;
312
+ overflow: hidden;
313
+ margin: 12px 0;
314
+ cursor: pointer;
315
+
316
+ &:empty {
317
+ height: 50px;
318
+
319
+ background: #ffffff;
320
+ background: linear-gradient(110deg, #ffffff 8%, #ececec 18%, #ffffff 33%);
321
+ border-radius: 5px;
322
+ background-size: 200% 100%;
323
+ animation: 1.5s shine linear infinite;
324
+ }
325
+ }
326
+ .decidimGeo__drawer__listCardIcon {
327
+ padding-left: 2px;
328
+ max-height: 16px;
329
+ transform: translateY(-2px);
330
+ &--hidden {
331
+ display: none;
332
+ }
333
+ }
334
+ .decidimGeo__drawer__listCardImg {
335
+ display: inline-block;
336
+ vertical-align: bottom;
337
+ width: 69px;
338
+ height: 69px;
339
+ padding: 0;
340
+ object-fit: cover;
341
+ &.decidimGeo__drawer__listCardImg--large {
342
+ width: 100%;
343
+ height: 180px;
344
+ position: absolute;
345
+ top: 0;
346
+ left: 0;
347
+ right: 0;
348
+ }
349
+ }
350
+
351
+ .decidimGeo__drawer__listCardInfo {
352
+ display: inline-block;
353
+ vertical-align: bottom;
354
+ max-height: 69px;
355
+ padding: 8px;
356
+ width: calc(100% - 69px);
357
+ &--image {
358
+ padding-top: calc(180px + 16px);
359
+ }
360
+ &--large {
361
+ max-height: none;
362
+ width: 100%;
363
+ position: relative;
364
+ }
365
+ &::after {
366
+ display: table;
367
+ content: "";
368
+ clear: both;
369
+ width: 100%;
370
+ height: 0;
371
+ }
372
+ }
373
+
374
+ .decidimGeo__drawer__listCardType {
375
+ color: #808080;
376
+ font-weight: bold;
377
+ font-size: 11px;
378
+ line-height: 13.83px;
379
+ text-transform: uppercase;
380
+ min-height: 16px;
381
+ }
382
+
383
+ .decidimGeo__drawer__listCardTitle {
384
+ color: var(--primary);
385
+ font-size: 17px;
386
+ font-weight: 400;
387
+ line-height: 21.37px;
388
+ max-width: 100%;
389
+ overflow: hidden;
390
+ white-space: nowrap;
391
+ text-overflow: ellipsis;
392
+ }
393
+
394
+ .decidimGeo__drawer__listCardDate {
395
+ display: inline-flex;
396
+ justify-content: space-between;
397
+ gap: 6px;
398
+ }
399
+ .decidimGeo__drawer__listCardStartDateSep,
400
+ .decidimGeo__drawer__listCardStartTime,
401
+ .decidimGeo__drawer__listCardStartDate {
402
+ font-style: normal;
403
+ font-size: 13px;
404
+ letter-spacing: 0.05em;
405
+ color: #3d393c;
406
+ text-transform: uppercase;
407
+ }
408
+ .decidimGeo__drawer__listCardStartDate {
409
+ font-weight: 600;
410
+ }
411
+ .decidimGeo__drawer__listCardDescription {
412
+ color: #3d393c;
413
+ font-size: 14px;
414
+ font-weight: 400;
415
+ line-height: 17.6px;
416
+ max-width: 100%;
417
+ overflow: hidden;
418
+ white-space: nowrap;
419
+ text-overflow: ellipsis;
420
+ &--large {
421
+ max-width: 100%;
422
+ overflow: hidden;
423
+ white-space: initial;
424
+ text-overflow: initial;
425
+ }
426
+ &--meetings {
427
+ margin-top: 8px;
428
+ }
429
+ }
430
+ a.decidimGeo__drawer__viewBtn {
431
+ @include decidimGeo__clickableText;
432
+ padding: 8px 16px;
433
+ letter-spacing: 0.2px;
434
+ color: #3d393c;
435
+ text-transform: uppercase;
436
+ text-decoration: none;
437
+ float: right;
438
+ }
439
+ .decidimGeo__scope__tooltip {
440
+ background-color: transparent !important;
441
+ border: transparent !important;
442
+ box-shadow: none !important;
443
+ font-weight: bold;
444
+ }
445
+
446
+ .decidimGeo__popup__container {
447
+ position: relative;
448
+ width: calc(100% + 44px);
449
+ left: -20px;
450
+ }
451
+
452
+ .decidimGeo__popup__content {
453
+ padding: 0 0.75rem;
454
+ }
455
+
456
+ .decidimGeo__paragraph__overflow {
457
+ width: 100%;
458
+ overflow: hidden;
459
+ text-wrap: nowrap;
460
+ text-overflow: ellipsis;
461
+ }
462
+
463
+ .leaflet-tooltip-top.decidimGeo__scope__tooltip::before {
464
+ border-top-color: transparent;
465
+ }
466
+
467
+ @keyframes shine {
468
+ to {
469
+ background-position-x: -200%;
470
+ }
471
+ }
472
+
473
+ .decidimGeo__marker {
474
+ filter: initial;
475
+ // filter: drop-shadow(0px 2px 4px rgba(0, 0, 0, 0.35));
476
+ }
@@ -0,0 +1,65 @@
1
+ /* TODO: All these classes overrides may cause other parts of decidim's ui to break due to leaflet dependency.
2
+ This module should therefore implement its own classes before being safely published, ideally by
3
+ implementing BEM (https://getbem.com/introduction/) and remove !important rules*/
4
+
5
+ .leaflet-left > .leaflet-control-zoom {
6
+ display: none;
7
+ }
8
+ .leaflet-right > .leaflet-control-zoom {
9
+ border: 0;
10
+ margin-right: 0;
11
+ }
12
+
13
+ .leaflet-control-zoom-in,
14
+ .leaflet-control-zoom-out {
15
+ box-sizing: content-box;
16
+ border: grey solid 1px;
17
+ border-bottom: grey solid 1px !important;
18
+ display: inline-block !important;
19
+ padding-inline: 2px;
20
+ padding-bottom: 4px !important;
21
+ border-radius: 2px;
22
+ margin-right: 10px;
23
+ }
24
+ .leaflet-container .leaflet-popup-tip {
25
+ border-color: transparent;
26
+ }
27
+ .leaflet-container a {
28
+ color: var(--primary) !important;
29
+ &:hover {
30
+ color: var(--primary);
31
+ opacity: 0.6;
32
+ }
33
+ }
34
+
35
+ .leaflet-top .leaflet-control-layers {
36
+ margin-top: 0;
37
+ padding-block: 0;
38
+ }
39
+
40
+ .leaflet-touch .leaflet-control-layers,
41
+ .leaflet-touch .leaflet-bar {
42
+ border: 0 !important;
43
+ }
44
+
45
+ .leaflet-control-layers {
46
+ border: 0 !important;
47
+ background: transparent !important;
48
+ }
49
+
50
+ .leaflet-control-layers-selector {
51
+ margin-bottom: 0 !important;
52
+ }
53
+
54
+ .leaflet-control-layers-overlays > label {
55
+ display: block;
56
+ background: #fff;
57
+ margin-top: 6px;
58
+ margin-left: 20px;
59
+ font-size: 16px;
60
+ line-height: 20px;
61
+ padding: 4px 8px;
62
+ border-radius: 18px;
63
+ border: 1px solid grey;
64
+ color: grey;
65
+ }
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Geo
5
+ module Admin
6
+ class Permissions < Decidim::DefaultPermissions
7
+ def permissions
8
+ return permission_action if permission_action.scope != :admin
9
+
10
+ return permission_action unless user
11
+
12
+ return permission_action if user.read_attribute("admin").blank?
13
+
14
+ case permission_action.action
15
+ when :create, :new, :update
16
+ permission_action.allow!
17
+ end
18
+
19
+ permission_action
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Geo
5
+ class Permissions < Decidim::DefaultPermissions
6
+ def permissions
7
+ return permission_action unless user
8
+
9
+ return Decidim::Geo::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
10
+
11
+ permission_action
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module Decidim
2
+ module Geo
3
+ class ShapefileUploader < ::Decidim::ApplicationUploader
4
+
5
+ def extension_allowlist
6
+ %w(zip)
7
+ end
8
+
9
+ def size_range
10
+ 0..10.megabytes
11
+ end
12
+ end
13
+ end
14
+ end