diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 73e3b295a..0cee758b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,11 +15,6 @@ to it. Each subsection must contain a `Page.vue` file, used as the entry-point t - Vuex actions must be prefixed with a verb (doThing ...) - Getters must be named after the data they get. -## Events - -The event name must be prefixed with the component and suffixed with the action with `::` as separator. -Something like `security-create::create`, `filter-raw::search` or `crudl::refresh-search`. - # Coding style-guides ## Javascript diff --git a/dev/templates/Component.vue b/dev/templates/Component.vue new file mode 100644 index 000000000..0bd039d17 --- /dev/null +++ b/dev/templates/Component.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/package-lock.json b/package-lock.json index 451a1663e..3957fe74a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2583,7 +2583,6 @@ "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "5.1.1", "yallist": "3.0.2" @@ -2694,7 +2693,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1.0.2" } @@ -2878,14 +2876,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -8375,6 +8371,11 @@ "invert-kv": "1.0.0" } }, + "leaflet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.3.4.tgz", + "integrity": "sha512-FYL1LGFdj6v+2Ifpw+AcFIuIOqjNggfoLUwuwQv6+3sS21Za7Wvapq+LhbSE4NDXrEj6eYnW3y7LsaBICpyXtw==" + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -14362,6 +14363,14 @@ "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==", "dev": true }, + "vue2-leaflet": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vue2-leaflet/-/vue2-leaflet-1.0.2.tgz", + "integrity": "sha1-c+DAmjABXbmo3A6SVkQ6+xgNH9U=", + "requires": { + "leaflet": "1.3.4" + } + }, "vuex": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/vuex/-/vuex-2.5.0.tgz", diff --git a/package.json b/package.json index 2de6c7f0f..fc96b3e18 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "http-server": "^0.11.1", "lodash": "^4.17.10", "serve-static": "^1.13.2", - "vue-quill-editor": "^1.1.1" + "vue-quill-editor": "^1.1.1", + "vue2-leaflet": "^1.0.2" }, "devDependencies": { "ace-builds": "git://github.com/ajaxorg/ace-builds.git#v1.1.8", diff --git a/src/assets/images/layers-2x.png b/src/assets/images/layers-2x.png new file mode 100644 index 000000000..200c333dc Binary files /dev/null and b/src/assets/images/layers-2x.png differ diff --git a/src/assets/images/layers.png b/src/assets/images/layers.png new file mode 100644 index 000000000..1a72e5784 Binary files /dev/null and b/src/assets/images/layers.png differ diff --git a/src/assets/images/marker-icon.png b/src/assets/images/marker-icon.png new file mode 100644 index 000000000..950edf246 Binary files /dev/null and b/src/assets/images/marker-icon.png differ diff --git a/src/assets/leaflet.css b/src/assets/leaflet.css new file mode 100644 index 000000000..a0932d57a --- /dev/null +++ b/src/assets/leaflet.css @@ -0,0 +1,635 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + } + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-tile { + will-change: opacity; + } +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + will-change: transform; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a, +.leaflet-bar a:hover { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover { + text-decoration: underline; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + padding: 4px 4px 0 0; + border: none; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } +.leaflet-oldie .leaflet-popup-tip-container { + margin-top: -1px; + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-clickable { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } diff --git a/src/assets/utility.scss b/src/assets/utility.scss index eb461293d..aaea45c2a 100644 --- a/src/assets/utility.scss +++ b/src/assets/utility.scss @@ -19,3 +19,7 @@ color: #777; } } + +.pointer { + cursor: pointer; +} diff --git a/src/components/Common/Filters/BasicFilter.vue b/src/components/Common/Filters/BasicFilter.vue index cb6c958f0..44f69afa6 100644 --- a/src/components/Common/Filters/BasicFilter.vue +++ b/src/components/Common/Filters/BasicFilter.vue @@ -115,8 +115,7 @@ export default { filters: { basic: null, sorting: { ...emptySorting } - }, - throttleSearch: false + } } }, computed: { diff --git a/src/components/Common/Filters/QuickFilter.vue b/src/components/Common/Filters/QuickFilter.vue index d14043e00..eb629d207 100644 --- a/src/components/Common/Filters/QuickFilter.vue +++ b/src/components/Common/Filters/QuickFilter.vue @@ -64,7 +64,7 @@ export default { this.throttleSearch = true setTimeout(() => { this.throttleSearch = false - }, 200) + }, 50) if (this.complexFilterActive) { this.$emit('refresh') diff --git a/src/components/Data/Documents/ListActions.vue b/src/components/Data/Documents/ListActions.vue index ee1e4d282..3ae67eb84 100644 --- a/src/components/Data/Documents/ListActions.vue +++ b/src/components/Data/Documents/ListActions.vue @@ -3,6 +3,8 @@
@@ -28,16 +31,50 @@ Delete
+
+
+ Selected geopoint +
+
+ + + +
+
+ + diff --git a/src/components/Data/Documents/Page.vue b/src/components/Data/Documents/Page.vue index a790b030f..22cd9eddf 100644 --- a/src/components/Data/Documents/Page.vue +++ b/src/components/Data/Documents/Page.vue @@ -1,3 +1,4 @@ + @@ -164,6 +179,8 @@ import ListNotAllowed from '../../Common/ListNotAllowed' import CollectionDropdown from '../Collections/Dropdown' import Headline from '../../Materialize/Headline' import Pagination from '../../Materialize/Pagination' +import ViewMap from './ViewMap' +import MSelect from '../../Common/MSelect' import * as filterManager from '../../../services/filterManager' import { canSearchIndex, @@ -200,7 +217,9 @@ export default { ListViewButtons, NoResultsEmptyState, Pagination, - RealtimeOnlyEmptyState + RealtimeOnlyEmptyState, + ViewMap, + MSelect }, data() { return { @@ -213,13 +232,27 @@ export default { deleteModalIsOpen: false, deleteModalIsLoading: false, candidatesForDeletion: [], - collectionMapping: {} + collectionMapping: {}, + mappingGeopoints: [], + selectedGeopoint: null } }, computed: { + geoDocuments() { + return this.documents.filter(document => { + const [lat, lng] = this.getCoordinates(document) + + return lat && typeof lat === 'number' && lng && typeof lng === 'number' + }) + }, + latFieldPath() { + return `content.${this.selectedGeopoint}.lat` + }, + lngFieldPath() { + return `content.${this.selectedGeopoint}.lon` + }, isCollectionGeo() { - // @TODO - return true + return this.mappingGeopoints.length > 0 }, isDocumentListFiltered() { return this.currentFilter.active !== filterManager.NO_ACTIVE @@ -261,14 +294,50 @@ export default { } }, methods: { + // VIEW MAP - GEOPOINTS + // ========================================================================= + getCoordinates(document) { + return [ + this.getProperty(document, this.latFieldPath), + this.getProperty(document, this.lngFieldPath) + ] + }, + getProperty(object, path) { + if (!object) { + return object + } + + const names = path.split('.') + + if (names.length === 1) { + return object[names[0]] + } + + return this.getProperty(object[names[0]], names.slice(1).join('.')) + }, + onSelectGeopoint(selectedGeopoint) { + this.selectedGeopoint = selectedGeopoint + }, + listMappingGeopoints(mapping, path = []) { + let attributes = [] + + for (const [attributeName, { type }] of Object.entries(mapping)) { + if (type === 'geo_point') { + attributes = attributes.concat(path.concat(attributeName).join('.')) + } + } + + return attributes + }, + // CREATE - // ===================================================== + // ========================================================================= onCreateClicked() { this.$router.push({ name: 'DataCreateDocument' }) }, // UPDATE - // ===================================================== + // ========================================================================= onEditDocumentClicked(id) { this.$router.push({ name: 'DataUpdateDocument', @@ -277,7 +346,7 @@ export default { }, // DELETE - // ===================================================== + // ========================================================================= performDeleteDocuments, onDeleteConfirmed(documentsToDelete) { this.deleteModalIsLoading = true @@ -312,7 +381,7 @@ export default { }, // LIST (FETCH & SEARCH) - // ===================================================== + // ========================================================================= performSearchDocuments, onFiltersUpdated(newFilters) { try { @@ -372,7 +441,7 @@ export default { }, // PAGINATION - // ===================================================== + // ========================================================================= changePage(from) { this.onFiltersUpdated( Object.assign(this.currentFilter, { @@ -382,7 +451,7 @@ export default { }, // PERMISSIONS - // ===================================================== + // ========================================================================= canSearchIndex, canSearchDocument, canCreateDocument, @@ -390,7 +459,7 @@ export default { canEditDocument, // SELECT ITEMS - // ===================================================== + // ========================================================================= onToggleAllClicked() { if (this.allChecked) { this.selectedDocuments = [] @@ -414,7 +483,7 @@ export default { }, // LIST VIEW TYPES - // ===================================================== + // ========================================================================= onListViewClicked() { this.onFiltersUpdated( Object.assign(this.currentFilter, { @@ -435,12 +504,25 @@ export default { listViewType: filterManager.LIST_VIEW_MAP }) ) + }, + // INIT + // ========================================================================= + loadMappingInfo() { + getMappingDocument(this.collection, this.index).then(response => { + this.collectionMapping = response.mapping + + this.mappingGeopoints = this.listMappingGeopoints( + this.collectionMapping + ) + this.selectedGeopoint = this.mappingGeopoints[0] + + this.onListViewClicked() + }) } }, mounted() { - getMappingDocument(this.collection, this.index).then(response => { - this.collectionMapping = response.mapping - }) + this.loadMappingInfo() + this.currentFilter = filterManager.load( this.index, this.collection, @@ -472,6 +554,12 @@ export default { }, currentFilter() { this.fetchDocuments() + }, + collection: { + immediate: true, + handler() { + this.loadMappingInfo() + } } } } @@ -482,12 +570,15 @@ export default { // @TODO Temporarily reverted // max-width: 1080px; // margin: auto; + .ViewMap { + height: 500px; + } } .DocumentsPage-filtersAndButtons { margin-bottom: 0; } -.DocumentList-map { +.DocumentList-boxes { text-align: center; padding: 30px; diff --git a/src/components/Data/Documents/ViewMap.vue b/src/components/Data/Documents/ViewMap.vue new file mode 100644 index 000000000..2d130806f --- /dev/null +++ b/src/components/Data/Documents/ViewMap.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/main.js b/src/main.js index 9eda8d58a..20d0a8b1f 100644 --- a/src/main.js +++ b/src/main.js @@ -1,6 +1,6 @@ import Vue from 'vue' -// import router from './services/router' import VueRouter from 'vue-router' + import App from './App' import store from './vuex/store' import { initStoreWithKuzzle } from './services/kuzzleWrapper' diff --git a/static/images/marker-icon-2x-blue.png b/static/images/marker-icon-2x-blue.png new file mode 100644 index 000000000..0015b6495 Binary files /dev/null and b/static/images/marker-icon-2x-blue.png differ diff --git a/static/images/marker-icon-2x-green.png b/static/images/marker-icon-2x-green.png new file mode 100644 index 000000000..c359abb6c Binary files /dev/null and b/static/images/marker-icon-2x-green.png differ diff --git a/static/images/marker-shadow.png b/static/images/marker-shadow.png new file mode 100644 index 000000000..84c580847 Binary files /dev/null and b/static/images/marker-shadow.png differ