decidim-navigation_maps 1.1.1 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -5
  3. data/Rakefile +18 -0
  4. data/app/cells/decidim/navigation_maps/content_blocks/groups_navigation_map_cell.rb +21 -0
  5. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/_tabs_content.erb +1 -1
  6. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map/show.erb +6 -6
  7. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_cell.rb +31 -0
  8. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_form.erb +4 -4
  9. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/_tabs_content.erb +0 -1
  10. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form/show.erb +7 -3
  11. data/app/cells/decidim/navigation_maps/content_blocks/navigation_map_settings_form_cell.rb +10 -1
  12. data/app/commands/decidim/navigation_maps/save_blueprints.rb +7 -1
  13. data/app/controllers/decidim/navigation_maps/admin/blueprints_controller.rb +3 -3
  14. data/app/forms/decidim/navigation_maps/area_form.rb +1 -1
  15. data/app/forms/decidim/navigation_maps/blueprint_form.rb +1 -0
  16. data/app/forms/decidim/navigation_maps/blueprint_forms.rb +1 -0
  17. data/app/jobs/decidim/navigation_maps/migrate_legacy_images_job.rb +32 -0
  18. data/app/models/decidim/navigation_maps/blueprint.rb +5 -3
  19. data/app/packs/entrypoints/decidim_admin_navigation_maps.js +4 -0
  20. data/app/packs/entrypoints/decidim_admin_navigation_maps.scss +1 -0
  21. data/app/packs/entrypoints/decidim_navigation_maps.js +7 -0
  22. data/app/packs/entrypoints/decidim_navigation_maps.scss +1 -0
  23. data/app/packs/src/decidim/navigation_maps/admin/map_editor.js +83 -0
  24. data/app/packs/src/decidim/navigation_maps/admin/navigation_maps.js +154 -0
  25. data/app/packs/src/decidim/navigation_maps/map_view.js +125 -0
  26. data/app/packs/src/decidim/navigation_maps/navigation_maps.js +43 -0
  27. data/app/{assets → packs}/stylesheets/decidim/navigation_maps/_variables.scss +0 -0
  28. data/app/{assets → packs}/stylesheets/decidim/navigation_maps/admin/navigation_maps.scss +4 -4
  29. data/app/{assets → packs}/stylesheets/decidim/navigation_maps/navigation_maps.scss +1 -2
  30. data/app/queries/decidim/navigation_maps/content_block_blueprints.rb +20 -0
  31. data/app/uploaders/decidim/navigation_maps/blueprint_uploader.rb +4 -12
  32. data/app/uploaders/decidim/navigation_maps/cw/blueprint_uploader.rb +24 -0
  33. data/config/assets.rb +41 -0
  34. data/config/locales/ca.yml +1 -0
  35. data/config/locales/cs.yml +2 -1
  36. data/config/locales/en.yml +1 -0
  37. data/config/locales/es.yml +1 -0
  38. data/db/migrate/20201105130724_add_reference_to_content_block_to_blueprints_table.rb +12 -0
  39. data/db/seeds/pla-cerda.jpg +0 -0
  40. data/db/seeds.rb +62 -11
  41. data/lib/decidim/navigation_maps/admin_engine.rb +0 -4
  42. data/lib/decidim/navigation_maps/engine.rb +16 -4
  43. data/lib/decidim/navigation_maps/navigation_map_cell_helpers.rb +4 -4
  44. data/lib/decidim/navigation_maps/test/factories.rb +1 -0
  45. data/lib/decidim/navigation_maps/version.rb +2 -2
  46. data/lib/decidim/navigation_maps.rb +0 -2
  47. data/lib/tasks/custom_seeds.rake +8 -0
  48. data/lib/tasks/decidim_navigation_maps_webpacker_tasks.rake +58 -0
  49. data/lib/tasks/navigation_maps_active_storage_migration_tasks.rake +37 -0
  50. data/package.json +197 -0
  51. metadata +39 -48
  52. data/app/assets/config/admin/decidim_navigation_maps_manifest.css +0 -3
  53. data/app/assets/config/admin/decidim_navigation_maps_manifest.js +0 -3
  54. data/app/assets/config/decidim_navigation_maps_manifest.css +0 -3
  55. data/app/assets/config/decidim_navigation_maps_manifest.js +0 -1
  56. data/app/assets/images/decidim/navigation_maps/icon.svg +0 -1
  57. data/app/assets/javascripts/decidim/navigation_maps/admin/map_editor.js +0 -88
  58. data/app/assets/javascripts/decidim/navigation_maps/admin/navigation_maps.js +0 -143
  59. data/app/assets/javascripts/decidim/navigation_maps/map_view.js +0 -123
  60. data/app/assets/javascripts/decidim/navigation_maps/navigation_maps.js +0 -44
  61. data/vendor/assets/images/draw/layers-2x.png +0 -0
  62. data/vendor/assets/images/draw/layers.png +0 -0
  63. data/vendor/assets/images/draw/marker-icon-2x.png +0 -0
  64. data/vendor/assets/images/draw/marker-icon.png +0 -0
  65. data/vendor/assets/images/draw/marker-shadow.png +0 -0
  66. data/vendor/assets/images/draw/spritesheet-2x.png +0 -0
  67. data/vendor/assets/images/draw/spritesheet.png +0 -0
  68. data/vendor/assets/images/draw/spritesheet.svg +0 -156
  69. data/vendor/assets/images/images/layers-2x.png +0 -0
  70. data/vendor/assets/images/images/layers.png +0 -0
  71. data/vendor/assets/images/images/marker-icon-2x.png +0 -0
  72. data/vendor/assets/images/images/marker-icon.png +0 -0
  73. data/vendor/assets/images/images/marker-shadow.png +0 -0
  74. data/vendor/assets/javascripts/jquery.form.js +0 -1277
  75. data/vendor/assets/javascripts/jsrender.min.js +0 -4
  76. data/vendor/assets/javascripts/jsrender.min.js.map +0 -1
  77. data/vendor/assets/javascripts/leaflet-geoman.min.js +0 -1
  78. data/vendor/assets/javascripts/leaflet.js +0 -5
  79. data/vendor/assets/stylesheets/leaflet-geoman.css +0 -164
@@ -1,88 +0,0 @@
1
- // Creates a map
2
- //= require decidim/navigation_maps/map_view
3
-
4
- function NavigationMapEditor(map_object, table_object) {
5
- var self = this;
6
- // Call constructor of superclass to initialize superclass-derived members.
7
- NavigationMapView.call(self, map_object, function() {
8
- self.createControls();
9
- if(self.blueprint) {
10
- self.createAreas();
11
- }
12
- });
13
- self.table_object = table_object;
14
- this.createAreaCallback = function () {};
15
- this.editAreaCallback = function () {};
16
- this.removeAreaCallback = function () {};
17
- }
18
-
19
- // NavigationMapEditor derives from NavigationMapView
20
- NavigationMapEditor.prototype = Object.create(NavigationMapView.prototype);
21
- NavigationMapEditor.prototype.constructor = NavigationMapEditor;
22
-
23
- NavigationMapEditor.prototype.createControls = function() {
24
- var self = this;
25
- self.map.pm.addControls({
26
- position: 'topleft',
27
- drawCircle: false,
28
- drawMarker: false,
29
- drawCircleMarker: false,
30
- drawPolyline: false,
31
- cutPolygon: false
32
- });
33
-
34
- self.map.on('pm:create', function(e) {
35
- var geojson = e.layer.toGeoJSON();
36
- self.blueprint[e.layer._leaflet_id] = geojson;
37
- self.attachEditorEvents(e.layer);
38
- self.createAreaCallback(e.layer._leaflet_id, e.layer, self);
39
- });
40
-
41
- self.map.on('pm:remove', function(e) {
42
- delete self.blueprint[e.layer._leaflet_id];
43
- self.removeAreaCallback(e.layer._leaflet_id, e.layer, self);
44
- });
45
- };
46
-
47
- NavigationMapEditor.prototype.editing = function() {
48
- var pm = this.map.pm;
49
- return pm.globalRemovalEnabled() || pm.globalDragModeEnabled() || pm.globalEditEnabled();
50
- };
51
-
52
- // register callback to handle area edits,removals and creations
53
- NavigationMapView.prototype.onCreateArea = function(callback) {
54
- this.createAreaCallback = callback;
55
- };
56
- NavigationMapView.prototype.onEditArea = function(callback) {
57
- this.editAreaCallback = callback;
58
- };
59
- NavigationMapView.prototype.onRemoveArea = function(callback) {
60
- this.removeCreateCallback = callback;
61
- };
62
-
63
- NavigationMapEditor.prototype.attachEditorEvents = function (layer) {
64
- var self = this;
65
-
66
- layer.on('mouseover', function(e) {
67
- e.target.getElement().classList.add('selected')
68
- });
69
-
70
- layer.on('mouseout', function(e) {
71
- e.target.getElement().classList.remove('selected')
72
- });
73
-
74
- layer.on('pm:edit', function(e) {
75
- self.blueprint[e.target._leaflet_id] = e.target.toGeoJSON();
76
- self.editAreaCallback(e.target._leaflet_id, e.target, self);
77
- });
78
-
79
- layer.on('click', function(e) {
80
- if(!self.editing()) {
81
- self.clickAreaCallback(e.target._leaflet_id, e.target, self);
82
- }
83
- });
84
- };
85
-
86
- NavigationMapEditor.prototype.getBlueprint = function () {
87
- return this.blueprint;
88
- };
@@ -1,143 +0,0 @@
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 jquery.form
4
- //= require decidim/navigation_maps/admin/map_editor
5
- //= require_self
6
-
7
- $(function() {
8
-
9
- var $maps = $('.navigation_maps.admin .map');
10
- var $progress = $('.navigation_maps.admin .progress');
11
- var $bar = $('.navigation_maps.admin .progress-meter');
12
- var $loading = $('.navigation_maps.admin .loading');
13
- var $callout = $('.navigation_maps.admin .callout');
14
- var $modal = $('#mapEditModal');
15
- var $form = $('form');
16
- var $tabs = $('#navigation_maps-tabs');
17
- var $accordion = $('.navigation_maps.admin .accordion');
18
- var editors = {};
19
- var new_areas = {};
20
-
21
- $maps.each(function() {
22
- var id = $(this).data('id');
23
- var table = document.getElementById("navigation_maps-table-" + id);
24
- editors[id] = new NavigationMapEditor(this, table);
25
- editors[id].onCreateArea(function(area_id) {
26
- new_areas[area_id] = true;
27
- });
28
-
29
- editors[id].onClickArea(function(area_id, area) {
30
- $modal.find('.modal-content').html('');
31
- $modal.addClass('loading').foundation('open');
32
- $callout.hide();
33
- $callout.removeClass('alert success');
34
- // "new" form insted of editing
35
- var rel = new_areas[area_id] ? 'new' : area_id;
36
- $modal.find('.modal-content').load(`/admin/navigation_maps/blueprints/${id}/areas/${rel}`, function() {
37
- var $input1 = $modal.find('input[name="blueprint_area[area_id]"]');
38
- var $input2 = $modal.find('input[name="blueprint_area[area_type]"]');
39
- var $input3 = $modal.find('input[name="blueprint_area[area]"]');
40
- var a = area.toGeoJSON();
41
- $modal.removeClass('loading');
42
- if($input1.length) $input1.val(area_id);
43
- if($input2.length) $input2.val(a.type);
44
- if($input3.length) $input3.val(JSON.stringify(a));
45
- $modal.find('ul[data-tabs=true]').each(function() {
46
- new Foundation.Tabs($(this));
47
- });
48
- });
49
- });
50
- });
51
-
52
- // Rails AJAX events
53
- document.body.addEventListener('ajax:error', function(responseText) {
54
- $callout.contents('p').html(responseText.detail[0].message + ": <strong>" + responseText.detail[0].error + "</strong>");
55
- $callout.addClass('alert');
56
- });
57
-
58
- document.body.addEventListener('ajax:success', function(responseText) {
59
- if(new_areas[responseText.detail[0].area]) {
60
- delete new_areas[responseText.detail[0].area]
61
- }
62
- var blueprint_id = responseText.detail[0].blueprint_id;
63
- var area_id = responseText.detail[0].area_id;
64
- var area = responseText.detail[0].area;
65
- editors[blueprint_id].setLayerProperties(editors[blueprint_id].map._layers[area_id], area);
66
- editors[blueprint_id].blueprint[area_id] = area;
67
- $callout.contents('p').html(responseText.detail[0].message);
68
- $callout.addClass('success');
69
- });
70
-
71
- document.body.addEventListener('ajax:complete', function() {
72
- $callout.show();
73
- $modal.foundation('close');
74
- })
75
-
76
- $tabs.on('change.zf.tabs', function(e, $tab, $content) {
77
- var id = $content.find('.map').data('id');
78
- if(id) {
79
- editors[id].reload();
80
- }
81
- });
82
-
83
- $accordion.on('down.zf.accordion', function(e, $accordion) {
84
- var id = $accordion.find('.map').data('id');
85
- if(id) {
86
- editors[id].reload();
87
- }
88
- });
89
-
90
- // If a new item si going to be created o the image is changed a reload is needed
91
- var needsReload = function() {
92
- var reload = false;
93
- if($form.find('#map-new input:checked').length) return true;
94
- if($form.find('.delete-tab input[type=checkbox]:checked').length) return true;
95
-
96
- $form.find('input[type=file],input[tabs_id=blueprints___title]').each(function() {
97
- if($(this).val()) {
98
- reload = true;
99
- return false;
100
- }
101
- });
102
- return reload;
103
- };
104
-
105
- $form.ajaxForm({
106
- url: $form.find('[name=action]').val(),
107
- beforeSerialize: function() {
108
- Object.keys(editors).forEach(function(key) {
109
- var editor = editors[key];
110
- $(`#blueprints_${editor.id}_blueprint`).val(JSON.stringify(editor.getBlueprint()));
111
- });
112
- },
113
- beforeSend: function() {
114
- var percentVal = '0%';
115
- $bar.width(percentVal).html(percentVal);
116
- $progress.show();
117
- $callout.hide();
118
- $callout.removeClass('alert success');
119
- $loading.show();
120
- },
121
- uploadProgress: function(event, position, total, percentComplete) {
122
- var percentVal = percentComplete + '%';
123
- $bar.width(percentVal).html(percentVal);
124
- },
125
- success: function(responseText) {
126
- $callout.show();
127
- $progress.hide();
128
- $callout.contents('p').html(responseText);
129
- $callout.addClass('success');
130
- $loading.hide();
131
- if(needsReload()) {
132
- $loading.show();
133
- location.reload();
134
- }
135
- },
136
- error: function(xhr) {
137
- $loading.hide();
138
- $callout.show();
139
- $callout.contents('p').html(xhr.responseText);
140
- $callout.addClass('alert');
141
- }
142
- });
143
- });
@@ -1,123 +0,0 @@
1
- // Creates a map view
2
- //= require leaflet
3
- //= require leaflet-geoman.min
4
-
5
- function NavigationMapView(map_object, callback) {
6
- var self = this;
7
- self.features = {};
8
- self.map_object = map_object;
9
- self.id = map_object.dataset.id;
10
- self.image_path = map_object.dataset.image;
11
- self.blueprint = map_object.dataset.blueprint ? JSON.parse(map_object.dataset.blueprint) : {};
12
- self.image = new Image();
13
- self.image.onload = function() {
14
- self.createMap();
15
- if(typeof callback === "function") {
16
- callback(self);
17
- } else {
18
- if(self.blueprint) {
19
- self.createAreas();
20
- }
21
- }
22
- };
23
- self.image.src = self.image_path;
24
- this.clickAreaCallback = function () {};
25
- this.setLayerPropertiesCallback = function () {};
26
- }
27
-
28
- NavigationMapView.prototype.createMap = function() {
29
- var bounds = [[0,0], [this.image.height,this.image.width]];
30
-
31
- this.map = L.map(this.map_object, {
32
- minZoom: -1,
33
- maxZoom: 2,
34
- crs: L.CRS.Simple,
35
- noWrap: true,
36
- zoomSnap: 0,
37
- // zoomDelta: 0.1,
38
- maxBounds: [[0,0], [this.image.height,this.image.width]],
39
- center: [this.image.height/2, this.image.width/2],
40
- zoom: -1,
41
- scrollWheelZoom: false
42
- });
43
-
44
- L.imageOverlay(this.image.src, bounds).addTo(this.map);
45
- this.fitBounds();
46
- };
47
-
48
- NavigationMapView.prototype.fitBounds = function() {
49
- var image_ratio = this.image.height / this.image.width;
50
- var map_ratio = this.map_object.offsetHeight / this.map_object.offsetWidth;
51
-
52
- if(image_ratio > map_ratio) {
53
- this.map.fitBounds([[0,0], [0,this.image.width]]);
54
- }
55
- else {
56
- this.map.fitBounds([[0,0], [this.image.height,0]]);
57
- }
58
- this.map.setView([this.image.height/2, this.image.width/2]);
59
- };
60
-
61
- NavigationMapView.prototype.createAreas = function() {
62
- var self = this;
63
- self.forEachBlueprint(function(id, geoarea) {
64
- new L.GeoJSON(geoarea, {
65
- onEachFeature: function(feature, layer) {
66
- layer._leaflet_id = id;
67
- self.setLayerProperties(layer, geoarea);
68
- self.attachEditorEvents(layer);
69
- }
70
- }).addTo(self.map);
71
- });
72
- };
73
-
74
- NavigationMapView.prototype.setLayerProperties = function (layer, area) {
75
- var props = area.properties;
76
- if(props) {
77
- if(props.color) {
78
- layer.setStyle({fillColor: props.color, color: props.color});
79
- }
80
- this.setLayerPropertiesCallback(layer, props);
81
- }
82
- };
83
-
84
- NavigationMapView.prototype.attachEditorEvents = function (layer) {
85
- var self = this;
86
-
87
- layer.on('mouseover', function(e) {
88
- e.target.getElement().classList.add('selected')
89
- });
90
-
91
- layer.on('mouseout', function(e) {
92
- e.target.getElement().classList.remove('selected')
93
- });
94
-
95
- layer.on('click', function(e) {
96
- self.clickAreaCallback(e.target, self);
97
- });
98
- };
99
-
100
- // register callback to handle area clicks
101
- NavigationMapView.prototype.onClickArea = function(callback) {
102
- this.clickAreaCallback = callback;
103
- };
104
-
105
- NavigationMapView.prototype.onSetLayerProperties = function(callback) {
106
- this.setLayerPropertiesCallback = callback;
107
- };
108
-
109
- NavigationMapView.prototype.forEachBlueprint = function (callback) {
110
- for (var id in this.blueprint) {
111
- var geoarea = this.blueprint[id];
112
- // avoid non-polygons for the moment
113
- if(!geoarea.geometry || geoarea.geometry.type !== 'Polygon') continue;
114
- callback(id, geoarea);
115
- }
116
- };
117
-
118
- NavigationMapView.prototype.reload = function () {
119
- if(this.map) {
120
- this.map.invalidateSize(true);
121
- this.fitBounds();
122
- }
123
- };
@@ -1,44 +0,0 @@
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
- });
Binary file
@@ -1,156 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:dc="http://purl.org/dc/elements/1.1/"
4
- xmlns:cc="http://creativecommons.org/ns#"
5
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6
- xmlns:svg="http://www.w3.org/2000/svg"
7
- xmlns="http://www.w3.org/2000/svg"
8
- xmlns:xlink="http://www.w3.org/1999/xlink"
9
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
10
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11
- viewBox="0 0 600 60"
12
- height="60"
13
- width="600"
14
- id="svg4225"
15
- version="1.1"
16
- inkscape:version="0.91 r13725"
17
- sodipodi:docname="spritesheet.svg"
18
- inkscape:export-filename="/home/fpuga/development/upstream/icarto.Leaflet.draw/src/images/spritesheet-2x.png"
19
- inkscape:export-xdpi="90"
20
- inkscape:export-ydpi="90">
21
- <metadata
22
- id="metadata4258">
23
- <rdf:RDF>
24
- <cc:Work
25
- rdf:about="">
26
- <dc:format>image/svg+xml</dc:format>
27
- <dc:type
28
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
29
- <dc:title />
30
- </cc:Work>
31
- </rdf:RDF>
32
- </metadata>
33
- <defs
34
- id="defs4256" />
35
- <sodipodi:namedview
36
- pagecolor="#ffffff"
37
- bordercolor="#666666"
38
- borderopacity="1"
39
- objecttolerance="10"
40
- gridtolerance="10"
41
- guidetolerance="10"
42
- inkscape:pageopacity="0"
43
- inkscape:pageshadow="2"
44
- inkscape:window-width="1920"
45
- inkscape:window-height="1056"
46
- id="namedview4254"
47
- showgrid="false"
48
- inkscape:zoom="1.3101852"
49
- inkscape:cx="237.56928"
50
- inkscape:cy="7.2419621"
51
- inkscape:window-x="1920"
52
- inkscape:window-y="24"
53
- inkscape:window-maximized="1"
54
- inkscape:current-layer="svg4225" />
55
- <g
56
- id="enabled"
57
- style="fill:#464646;fill-opacity:1">
58
- <g
59
- id="polyline"
60
- style="fill:#464646;fill-opacity:1">
61
- <path
62
- d="m 18,36 0,6 6,0 0,-6 -6,0 z m 4,4 -2,0 0,-2 2,0 0,2 z"
63
- id="path4229"
64
- inkscape:connector-curvature="0"
65
- style="fill:#464646;fill-opacity:1" />
66
- <path
67
- d="m 36,18 0,6 6,0 0,-6 -6,0 z m 4,4 -2,0 0,-2 2,0 0,2 z"
68
- id="path4231"
69
- inkscape:connector-curvature="0"
70
- style="fill:#464646;fill-opacity:1" />
71
- <path
72
- d="m 23.142,39.145 -2.285,-2.29 16,-15.998 2.285,2.285 z"
73
- id="path4233"
74
- inkscape:connector-curvature="0"
75
- style="fill:#464646;fill-opacity:1" />
76
- </g>
77
- <path
78
- id="polygon"
79
- d="M 100,24.565 97.904,39.395 83.07,42 76,28.773 86.463,18 Z"
80
- inkscape:connector-curvature="0"
81
- style="fill:#464646;fill-opacity:1" />
82
- <path
83
- id="rectangle"
84
- d="m 140,20 20,0 0,20 -20,0 z"
85
- inkscape:connector-curvature="0"
86
- style="fill:#464646;fill-opacity:1" />
87
- <path
88
- id="circle"
89
- d="m 221,30 c 0,6.078 -4.926,11 -11,11 -6.074,0 -11,-4.922 -11,-11 0,-6.074 4.926,-11 11,-11 6.074,0 11,4.926 11,11 z"
90
- inkscape:connector-curvature="0"
91
- style="fill:#464646;fill-opacity:1" />
92
- <path
93
- id="marker"
94
- d="m 270,19 c -4.971,0 -9,4.029 -9,9 0,4.971 5.001,12 9,14 4.001,-2 9,-9.029 9,-14 0,-4.971 -4.029,-9 -9,-9 z m 0,12.5 c -2.484,0 -4.5,-2.014 -4.5,-4.5 0,-2.484 2.016,-4.5 4.5,-4.5 2.485,0 4.5,2.016 4.5,4.5 0,2.486 -2.015,4.5 -4.5,4.5 z"
95
- inkscape:connector-curvature="0"
96
- style="fill:#464646;fill-opacity:1" />
97
- <g
98
- id="edit"
99
- style="fill:#464646;fill-opacity:1">
100
- <path
101
- d="m 337,30.156 0,0.407 0,5.604 c 0,1.658 -1.344,3 -3,3 l -10,0 c -1.655,0 -3,-1.342 -3,-3 l 0,-10 c 0,-1.657 1.345,-3 3,-3 l 6.345,0 3.19,-3.17 -9.535,0 c -3.313,0 -6,2.687 -6,6 l 0,10 c 0,3.313 2.687,6 6,6 l 10,0 c 3.314,0 6,-2.687 6,-6 l 0,-8.809 -3,2.968"
102
- id="path4240"
103
- inkscape:connector-curvature="0"
104
- style="fill:#464646;fill-opacity:1" />
105
- <path
106
- d="m 338.72,24.637 -8.892,8.892 -2.828,0 0,-2.829 8.89,-8.89 z"
107
- id="path4242"
108
- inkscape:connector-curvature="0"
109
- style="fill:#464646;fill-opacity:1" />
110
- <path
111
- d="m 338.697,17.826 4,0 0,4 -4,0 z"
112
- transform="matrix(-0.70698336,-0.70723018,0.70723018,-0.70698336,567.55917,274.78273)"
113
- id="path4244"
114
- inkscape:connector-curvature="0"
115
- style="fill:#464646;fill-opacity:1" />
116
- </g>
117
- <g
118
- id="remove"
119
- style="fill:#464646;fill-opacity:1">
120
- <path
121
- d="m 381,42 18,0 0,-18 -18,0 0,18 z m 14,-16 2,0 0,14 -2,0 0,-14 z m -4,0 2,0 0,14 -2,0 0,-14 z m -4,0 2,0 0,14 -2,0 0,-14 z m -4,0 2,0 0,14 -2,0 0,-14 z"
122
- id="path4247"
123
- inkscape:connector-curvature="0"
124
- style="fill:#464646;fill-opacity:1" />
125
- <path
126
- d="m 395,20 0,-4 -10,0 0,4 -6,0 0,2 22,0 0,-2 -6,0 z m -2,0 -6,0 0,-2 6,0 0,2 z"
127
- id="path4249"
128
- inkscape:connector-curvature="0"
129
- style="fill:#464646;fill-opacity:1" />
130
- </g>
131
- </g>
132
- <g
133
- id="disabled"
134
- transform="translate(120,0)"
135
- style="fill:#bbbbbb">
136
- <use
137
- xlink:href="#edit"
138
- id="edit-disabled"
139
- x="0"
140
- y="0"
141
- width="100%"
142
- height="100%" />
143
- <use
144
- xlink:href="#remove"
145
- id="remove-disabled"
146
- x="0"
147
- y="0"
148
- width="100%"
149
- height="100%" />
150
- </g>
151
- <path
152
- style="fill:none;stroke:#464646;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
153
- id="circle-3"
154
- d="m 581.65725,30 c 0,6.078 -4.926,11 -11,11 -6.074,0 -11,-4.922 -11,-11 0,-6.074 4.926,-11 11,-11 6.074,0 11,4.926 11,11 z"
155
- inkscape:connector-curvature="0" />
156
- </svg>
Binary file