diff --git a/umap/static/umap/css/bar.css b/umap/static/umap/css/bar.css index c95664dc..5b1e8152 100644 --- a/umap/static/umap/css/bar.css +++ b/umap/static/umap/css/bar.css @@ -201,3 +201,28 @@ .umap-caption-bar-enabled { --current-footer-height: var(--footer-height); } +.umap-edit-bar { + position: absolute; + right: var(--panel-gutter); + display: none; + top: calc(var(--current-header-height) + var(--panel-gutter)); + flex-direction: column; + z-index: var(--zindex-panels); + width: var(--control-size); + background-color: var(--background-color); + border-radius: var(--border-radius); +} +.umap-edit-enabled .umap-edit-bar { + display: flex; +} +.umap-edit-bar li { + width: var(--control-size); + height: var(--control-size); +} +.umap-edit-bar button { + padding: 0; +} +.umap-edit-bar hr { + padding: 0; + margin: 0; +} diff --git a/umap/static/umap/css/icon.css b/umap/static/umap/css/icon.css index 77ed5191..0cfd3128 100644 --- a/umap/static/umap/css/icon.css +++ b/umap/static/umap/css/icon.css @@ -62,6 +62,9 @@ html[dir="rtl"] .icon { .icon-caption { background-position: calc(var(--tile) * 4) var(--tile); } +.icon-center { + background-position: calc(var(--tile) * 4) calc(var(--tile) * 2); +} .icon-close { background-position: var(--tile) 0px; } @@ -101,6 +104,9 @@ html[dir="rtl"] .icon { .icon-forward { background-position: calc(var(--tile) * 6) calc(var(--tile) * 6); } +.icon-help { + background-position: 0 0; +} .icon-key { background-position: calc(var(--tile) * 6) calc(var(--tile) * 5); } @@ -114,16 +120,22 @@ html[dir="rtl"] .icon { background-position: calc(var(--tile) * 7) 0; } .icon-marker { - background-position: calc(var(--tile) * 3) calc(var(--tile) * 5); + background-position: calc(var(--tile) * 7) var(--tile); +} +.icon-multipolygon { + background-position: calc(var(--tile) * 7) calc(var(--tile) * 5); +} +.icon-multiline { + background-position: calc(var(--tile) * 7) calc(var(--tile) * 7); } .icon-peers { background-position: calc(var(--tile) * 3) calc(var(--tile) * 2); } .icon-polygon { - background-position: var(--tile) calc(var(--tile) * 3); + background-position: calc(var(--tile) * 7) calc(var(--tile) * 4); } .icon-polyline { - background-position: 0 calc(var(--tile) * 3); + background-position: calc(var(--tile) * 7) calc(var(--tile) * 6); } .icon-profile { background-position: 0 calc(var(--tile) * 4); diff --git a/umap/static/umap/css/panel.css b/umap/static/umap/css/panel.css index b4e6af3f..1a09b09c 100644 --- a/umap/static/umap/css/panel.css +++ b/umap/static/umap/css/panel.css @@ -9,7 +9,7 @@ background-color: var(--background-color); color: var(--text-color); cursor: initial; - border-radius: 5px; + border-radius: var(--border-radius); border: 1px solid var(--color-lightGray); bottom: calc(var(--current-footer-height) + var(--panel-bottom)); box-sizing: border-box; diff --git a/umap/static/umap/css/popup.css b/umap/static/umap/css/popup.css index 0f53d473..c1a1f37e 100644 --- a/umap/static/umap/css/popup.css +++ b/umap/static/umap/css/popup.css @@ -89,7 +89,6 @@ span.popup-icon { .umap-popup-container ul { list-style-type: disc; } -.leaflet-control-toolbar, .leaflet-bar { box-shadow: none; } diff --git a/umap/static/umap/img/16-white.svg b/umap/static/umap/img/16-white.svg index f174deb7..268b64ee 100644 --- a/umap/static/umap/img/16-white.svg +++ b/umap/static/umap/img/16-white.svg @@ -130,9 +130,9 @@ - - - + + + diff --git a/umap/static/umap/img/16.svg b/umap/static/umap/img/16.svg index d61b04b9..3c1eb12c 100644 --- a/umap/static/umap/img/16.svg +++ b/umap/static/umap/img/16.svg @@ -1 +1 @@ -image/svg+xml   +image/svg+xml   diff --git a/umap/static/umap/img/24-white.svg b/umap/static/umap/img/24-white.svg index 65379fd1..6c85d369 100644 --- a/umap/static/umap/img/24-white.svg +++ b/umap/static/umap/img/24-white.svg @@ -1,46 +1,46 @@ - + - + - + - - - - + + + + - - + + - + - + - + - + - - + + @@ -57,9 +57,10 @@ - + + diff --git a/umap/static/umap/img/24.svg b/umap/static/umap/img/24.svg index e25615d0..a1f6f6fd 100644 --- a/umap/static/umap/img/24.svg +++ b/umap/static/umap/img/24.svg @@ -1,35 +1,35 @@ - + - + 0 1 - + - - - - + + + + - + - - + + - - + + @@ -46,15 +46,15 @@ - + - + - + @@ -64,8 +64,8 @@ - - + + @@ -82,9 +82,20 @@ - + + + + + + + + + + + + diff --git a/umap/static/umap/img/source/16-white.svg b/umap/static/umap/img/source/16-white.svg index 3ed94e15..1344048e 100644 --- a/umap/static/umap/img/source/16-white.svg +++ b/umap/static/umap/img/source/16-white.svg @@ -19,7 +19,7 @@ - + @@ -141,9 +141,9 @@ - - - + + + diff --git a/umap/static/umap/img/source/16.svg b/umap/static/umap/img/source/16.svg index 8d69b43e..fb7d31ef 100644 --- a/umap/static/umap/img/source/16.svg +++ b/umap/static/umap/img/source/16.svg @@ -1,4 +1,4 @@ -image/svg+xml   +image/svg+xml   diff --git a/umap/static/umap/img/source/24-white.svg b/umap/static/umap/img/source/24-white.svg index e4d9fd89..c9b012b3 100644 --- a/umap/static/umap/img/source/24-white.svg +++ b/umap/static/umap/img/source/24-white.svg @@ -1,8 +1,8 @@ - - + + @@ -19,42 +19,42 @@ - + - + - - - - + + + + - - + + - + - + - + - + - - + + @@ -71,9 +71,11 @@ - + - + + + diff --git a/umap/static/umap/img/source/24.svg b/umap/static/umap/img/source/24.svg index 73440189..c6eaab05 100644 --- a/umap/static/umap/img/source/24.svg +++ b/umap/static/umap/img/source/24.svg @@ -1,8 +1,8 @@ - - + + @@ -18,31 +18,31 @@ - + 0 1 - + - - - - + + + + - + - - + + - - + + @@ -59,15 +59,15 @@ - + - + - + @@ -77,8 +77,8 @@ - - + + @@ -95,9 +95,20 @@ - + + + + + + + + + + + + diff --git a/umap/static/umap/js/modules/help.js b/umap/static/umap/js/modules/help.js index 84390c50..37cbaedb 100644 --- a/umap/static/umap/js/modules/help.js +++ b/umap/static/umap/js/modules/help.js @@ -193,26 +193,28 @@ export default class Help { show(entries) { const container = DomUtil.add('div') DomUtil.createTitle(container, translate('Help')) - for (const name of entries) { - DomUtil.element({ - tagName: 'div', - className: 'umap-help-entry', - parent: container, - innerHTML: ENTRIES[name], - }) - } this.dialog.open({ template: container }) } // Special dynamic case. Do we still think this dialog is useful? showGetStarted() { - const container = DomUtil.add('div') - DomUtil.createTitle(container, translate('Where do we go from here?')) - DomUtil.element({ - tagName: 'div', - className: 'umap-help-entry', - parent: container, - }).appendChild(this._buildEditEntry()) + const [container, { ul }] = Utils.loadTemplateWithRefs(` +
+

${translate('Where do we go from here?')}

+
    +
    + `) + const elements = document.querySelectorAll('[data-getstarted]') + for (const el of elements) { + const [node, { button }] = Utils.loadTemplateWithRefs( + `
  • ` + ) + ul.appendChild(node) + button.addEventListener('click', () => { + el.click() + this.dialog.close() + }) + } this.dialog.open({ template: container }) } @@ -233,22 +235,6 @@ export default class Help { } } } - - _buildEditEntry() { - const container = DomUtil.create('div', '') - const actionsContainer = DomUtil.create('ul', 'umap-edit-actions', container) - const addAction = (action) => { - const actionContainer = DomUtil.add('li', '', actionsContainer) - DomUtil.add('i', action.options.className, actionContainer) - DomUtil.add('span', '', actionContainer, action.options.tooltip) - DomEvent.on(actionContainer, 'click', action.addHooks, action) - DomEvent.on(actionContainer, 'click', this.dialog.close, this.dialog) - } - for (const action of Object.values(Help.MENU_ACTIONS)) { - addAction(action) - } - return container - } } Help.MENU_ACTIONS = {} diff --git a/umap/static/umap/js/modules/rendering/map.js b/umap/static/umap/js/modules/rendering/map.js index 0b52454e..1226bfa9 100644 --- a/umap/static/umap/js/modules/rendering/map.js +++ b/umap/static/umap/js/modules/rendering/map.js @@ -40,20 +40,6 @@ const ControlsMixin = { if (this._umap.hasEditMode() && !this.options.noControl) { new U.EditControl(this).addTo(this) - - new U.DrawToolbar({ map: this }).addTo(this) - const editActions = [ - U.EditCaptionAction, - U.ImportAction, - U.EditLayersAction, - U.ChangeTileLayerAction, - U.UpdateExtentAction, - U.UpdatePermsAction, - U.EditPropertiesAction, - ] - if (this.options.editMode === 'advanced') { - new U.SettingsToolbar({ actions: editActions }).addTo(this) - } } this._controls.zoom = new Control.Zoom({ zoomInTitle: translate('Zoom in'), diff --git a/umap/static/umap/js/modules/ui/bar.js b/umap/static/umap/js/modules/ui/bar.js index 15e21b9c..32e17c5e 100644 --- a/umap/static/umap/js/modules/ui/bar.js +++ b/umap/static/umap/js/modules/ui/bar.js @@ -3,6 +3,7 @@ import { translate } from '../i18n.js' import { WithTemplate } from '../utils.js' import ContextMenu from './contextmenu.js' import * as Utils from '../utils.js' +import { Point, LineString, Polygon } from '../data/features.js' const TOP_BAR_TEMPLATE = `
    @@ -202,3 +203,86 @@ export class BottomBar extends WithTemplate { this.elements.filter.hidden = !showMenus || !this._umap.properties.facetKey } } + +const EDIT_BAR_TEMPLATE = ` +
      +
    • +
    • + +
    • + +
      + + + + + + + +
    +` + +export class EditBar extends WithTemplate { + constructor(umap, leafletMap, parent) { + super() + this._umap = umap + this._leafletMap = leafletMap + this.loadTemplate(EDIT_BAR_TEMPLATE) + this.parent = parent + } + + setup() { + this.parent.appendChild(this.element) + DomEvent.disableClickPropagation(this.element) + this._onClick('marker', () => this._leafletMap.editTools.startMarker()) + this._onClick('polyline', () => this._leafletMap.editTools.startPolyline()) + this._onClick('multiline', () => { + console.log('click click') + this._umap.editedFeature.ui.editor.newShape() + }) + this._onClick('polygon', () => this._leafletMap.editTools.startPolygon()) + this._onClick('multipolygon', () => this._umap.editedFeature.ui.editor.newShape()) + this._onClick('caption', () => this._umap.editCaption()) + this._onClick('import', () => this._umap.importer.open()) + this._onClick('layers', () => this._umap.editDatalayers()) + this._onClick('tiles', () => this._leafletMap.updateTileLayers()) + this._onClick('center', () => this._umap.editCenter()) + this._onClick('key', () => this._umap.permissions.edit()) + this._onClick('settings', () => this._umap.edit()) + this._addTitle('import', 'IMPORT_PANEL') + this._addTitle('marker', 'DRAW_MARKER') + this._addTitle('polyline', 'DRAW_LINE') + this._addTitle('polygon', 'DRAW_POLYGON') + this._leafletMap.on('seteditedfeature', () => this.redraw()) + } + + redraw() { + const editedFeature = this._umap.editedFeature + this.elements.multiline.hidden = !(editedFeature instanceof LineString) + this.elements.multipolygon.hidden = !(editedFeature instanceof Polygon) + this.elements.caption.hidden = this._umap.properties.editMode !== 'advanced' + this.elements.import.hidden = this._umap.properties.editMode !== 'advanced' + this.elements.layers.hidden = this._umap.properties.editMode !== 'advanced' + this.elements.tiles.hidden = this._umap.properties.editMode !== 'advanced' + this.elements.center.hidden = this._umap.properties.editMode !== 'advanced' + this.elements.key.hidden = this._umap.properties.editMode !== 'advanced' + this.elements.settings.hidden = this._umap.properties.editMode !== 'advanced' + } + + _addTitle(ref, label) { + this.elements[ref].querySelector('button').title = this._umap.help.displayLabel( + label, + false + ) + } + + _onClick(ref, action) { + // Put the click on the button, not on the li, but keep the data-ref on the li + // so to hide/show it when needed. + this.elements[ref].querySelector('button').addEventListener('click', action) + } +} diff --git a/umap/static/umap/js/modules/umap.js b/umap/static/umap/js/modules/umap.js index 4195c428..9d5926d3 100644 --- a/umap/static/umap/js/modules/umap.js +++ b/umap/static/umap/js/modules/umap.js @@ -13,7 +13,7 @@ import { LeafletMap } from './rendering/map.js' import URLs from './urls.js' import { Panel, EditPanel, FullPanel } from './ui/panel.js' import Dialog from './ui/dialog.js' -import { BottomBar, TopBar } from './ui/bar.js' +import { BottomBar, TopBar, EditBar } from './ui/bar.js' import Tooltip from './ui/tooltip.js' import ContextMenu from './ui/contextmenu.js' import { Request, ServerRequest } from './request.js' @@ -92,7 +92,8 @@ export default class Umap extends ServerStored { fullscreenControl !== undefined ? fullscreenControl : true if (center) { - this._leafletMap.options.center = this._leafletMap.latLng(center) + this._leafletMap.options.center = this.properties.center = + this._leafletMap.latLng(center) } // Needed to render controls @@ -112,6 +113,11 @@ export default class Umap extends ServerStored { this.slideshow, this._leafletMap._controlContainer ) + this.editBar = new EditBar( + this, + this._leafletMap, + this._leafletMap._controlContainer + ) this.tooltip = new Tooltip(this._leafletMap._controlContainer) this.contextmenu = new ContextMenu() this.server = new ServerRequest() @@ -131,6 +137,7 @@ export default class Umap extends ServerStored { this.fullPanel = new FullPanel(this, this._leafletMap) this._leafletMap.initEditTools() this.topBar.setup() + this.editBar.setup() } this.datalayersFromQueryString = this.searchParams.get('datalayers') @@ -761,6 +768,41 @@ export default class Umap extends ServerStored { this.editPanel.open({ content: container }) } + editCenter() { + if (!this.editEnabled) return + if (this.properties.editMode !== 'advanced') return + const container = DomUtil.create('div', 'umap-edit-container') + const metadataFields = [ + ['properties.zoom', { handler: 'IntInput', label: translate('Default zoom') }], + [ + 'properties.center.lat', + { handler: 'FloatInput', label: translate('Default latitude') }, + ], + [ + 'properties.center.lng', + { handler: 'FloatInput', label: translate('Default longitude') }, + ], + 'properties.defaultView', + ] + + DomUtil.createTitle(container, translate('Edit map default view'), 'icon-zoom') + const builder = new MutatingForm(this, metadataFields, { + className: 'map-metadata', + umap: this, + }) + const form = builder.build() + const button = Utils.loadTemplate( + `` + ) + button.addEventListener('click', () => { + this._setCenterAndZoom() + builder.fetchAll() + }) + container.appendChild(form) + container.appendChild(button) + this.editPanel.open({ content: container }) + } + _editControls(container) { let UIFields = [] for (const name of this._leafletMap.HIDDABLE_CONTROLS) { @@ -772,7 +814,6 @@ export default class Umap extends ServerStored { 'properties.miniMap', 'properties.scaleControl', 'properties.onLoadPanel', - 'properties.defaultView', 'properties.displayPopupFooter', 'properties.captionBar', 'properties.captionMenus', @@ -1236,6 +1277,7 @@ export default class Umap extends ServerStored { } enableEdit() { + this.editBar.redraw() document.body.classList.add('umap-edit-enabled') this.editEnabled = true this.drop.enable() diff --git a/umap/static/umap/js/umap.controls.js b/umap/static/umap/js/umap.controls.js index 61c43413..472dd515 100644 --- a/umap/static/umap/js/umap.controls.js +++ b/umap/static/umap/js/umap.controls.js @@ -1,159 +1,3 @@ -U.BaseAction = L.ToolbarAction.extend({ - initialize: function (map) { - this.map = map - if (this.options.label) { - this.options.tooltip = this.map._umap.help.displayLabel( - this.options.label, - (withKbdTag = false) - ) - } - this.options.toolbarIcon = { - className: this.options.className, - tooltip: this.options.tooltip, - } - L.ToolbarAction.prototype.initialize.call(this) - if (this.options.helpMenu && !U.Help.MENU_ACTIONS[this.options.className]) - U.Help.MENU_ACTIONS[this.options.className] = this - }, -}) - -U.ImportAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'upload-data dark', - label: 'IMPORT_PANEL', - }, - - addHooks: function () { - this.map._umap.importer.open() - }, -}) - -U.EditLayersAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'umap-control-browse dark', - tooltip: L._('Manage layers'), - }, - - addHooks: function () { - this.map._umap.editDatalayers() - }, -}) - -U.EditCaptionAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'umap-control-caption dark', - tooltip: L._('Edit map name and caption'), - }, - - addHooks: function () { - this.map._umap.editCaption() - }, -}) - -U.EditPropertiesAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'update-map-settings dark', - tooltip: L._('Map advanced properties'), - }, - - addHooks: function () { - this.map._umap.edit() - }, -}) - -U.ChangeTileLayerAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'dark update-map-tilelayers', - tooltip: L._('Change tilelayers'), - }, - - addHooks: function () { - this.map.updateTileLayers() - }, -}) - -U.UpdateExtentAction = U.BaseAction.extend({ - options: { - className: 'update-map-extent dark', - tooltip: L._('Save this center and zoom'), - }, - - addHooks: function () { - this.map._umap.setCenterAndZoom() - }, -}) - -U.UpdatePermsAction = U.BaseAction.extend({ - options: { - className: 'update-map-permissions dark', - tooltip: L._('Update permissions and editors'), - }, - - addHooks: function () { - this.map._umap.permissions.edit() - }, -}) - -U.DrawMarkerAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'umap-draw-marker dark', - label: 'DRAW_MARKER', - }, - - addHooks: function () { - this.map.editTools.startMarker() - }, -}) - -U.DrawPolylineAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'umap-draw-polyline dark', - label: 'DRAW_LINE', - }, - - addHooks: function () { - this.map.editTools.startPolyline() - }, -}) - -U.DrawPolygonAction = U.BaseAction.extend({ - options: { - helpMenu: true, - className: 'umap-draw-polygon dark', - label: 'DRAW_POLYGON', - }, - - addHooks: function () { - this.map.editTools.startPolygon() - }, -}) - -U.AddPolylineShapeAction = U.BaseAction.extend({ - options: { - className: 'umap-draw-polyline-multi dark', - tooltip: L._('Add a line to the current multi'), - }, - - addHooks: function () { - // FIXME: smells bad - this.map._umap.editedFeature.ui.editor.newShape() - }, -}) - -U.AddPolygonShapeAction = U.AddPolylineShapeAction.extend({ - options: { - className: 'umap-draw-polygon-multi dark', - tooltip: L._('Add a polygon to the current multi'), - }, -}) - U.BaseFeatureAction = L.ToolbarAction.extend({ initialize: function (map, feature, latlng) { this.map = map diff --git a/umap/static/umap/map.css b/umap/static/umap/map.css index 5670a1eb..6ca508f8 100644 --- a/umap/static/umap/map.css +++ b/umap/static/umap/map.css @@ -102,12 +102,12 @@ html[dir="rtl"] .leaflet-tooltip-pane > * { .umap-control-more, .umap-control-less { background-image: url('./img/24-white.svg'); - background-position: -72px -366px; + background-position: -72px -402px; text-indent: -9999px; margin-bottom: 0; } .umap-control-less { - background-position: -108px -366px; + background-position: -108px -402px; } .umap-more-controls .display-on-more, .umap-more-controls .umap-control-less { @@ -177,7 +177,6 @@ html[dir="rtl"] .leaflet-tooltip-pane > * { line-height: var(--control-size); display: block; } -.leaflet-control-toolbar .leaflet-toolbar-icon.dark:hover, .edit-enable [type="button"]:hover { background-color: #4d5759; } @@ -318,7 +317,6 @@ ul.photon-autocomplete { .leaflet-editable-drawing { cursor: crosshair; } -.leaflet-control-toolbar > li > .leaflet-toolbar-icon, .umap-toolbar a, .umap-toolbar a:hover { height: var(--control-size); @@ -332,9 +330,6 @@ ul.photon-autocomplete { background-image: url('./img/24.svg'); background-size: auto auto; } -.leaflet-control-toolbar li .leaflet-toolbar-icon.dark { - background-image: url('./img/24-white.svg'); -} .umap-toolbar { margin-top: 0; } @@ -381,7 +376,6 @@ ul.photon-autocomplete { .umap-toolbar .umap-draw-polygon-multi { background-position: 0 -108px; } -.umap-edit-enabled .leaflet-control-toolbar > li > .leaflet-toolbar-icon, .umap-edit-enabled .umap-toolbar a { display: block; } @@ -441,31 +435,8 @@ ul.photon-autocomplete { border-top: 1px solid #aaa; padding-top: 10px; } -.umap-edit-actions { - padding-top: 5px; - clear: both; -} -.umap-edit-actions li { - height: var(--control-size); - line-height: var(--control-size); - cursor: pointer; - margin-bottom: 5px; - border-radius: 2px; - border: 1px solid #222; -} -.umap-edit-actions li i { - background-image: url('./img/24-white.svg'); - background-repeat: no-repeat; - display: table-cell; - width: var(--control-size); - height: var(--control-size); -} -.umap-edit-actions li span { - display: table-cell; - vertical-align: middle; -} -.umap-edit-actions li:hover { - background-color: #353c3e; +.umap-getstarted button { + width: 100%; } .umap-help { font-style: italic; @@ -568,11 +539,11 @@ ul.photon-autocomplete { /* ********************************* */ a.umap-control-browse, .umap-control-browse [type="button"] { - background-position: -36px -72px; + background-position: -144px -180px; } a.umap-control-caption, .umap-control-caption [type="button"] { - background-position: -72px -72px; + background-position: -144px -36px; } .leaflet-inplace-toolbar a { background-repeat: no-repeat; diff --git a/umap/tests/integration/test_anonymous_owned_map.py b/umap/tests/integration/test_anonymous_owned_map.py index 85d71903..0ab2fc7e 100644 --- a/umap/tests/integration/test_anonymous_owned_map.py +++ b/umap/tests/integration/test_anonymous_owned_map.py @@ -234,7 +234,7 @@ def test_anonymous_owner_can_delete_the_map(anonymap, live_server, owner_session assert Map.objects.count() == 1 owner_session.goto(f"{live_server.url}{anonymap.get_absolute_url()}") owner_session.get_by_role("button", name="Edit").click() - owner_session.get_by_role("link", name="Map advanced properties").click() + owner_session.get_by_role("button", name="Map advanced properties").click() owner_session.get_by_text("Advanced actions").click() expect(owner_session.get_by_role("button", name="Delete")).to_be_visible() owner_session.get_by_role("button", name="Delete").click() @@ -248,6 +248,6 @@ def test_non_owner_cannot_see_delete_button(anonymap, live_server, page): anonymap.save() page.goto(f"{live_server.url}{anonymap.get_absolute_url()}") page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Map advanced properties").click() + page.get_by_role("button", name="Map advanced properties").click() page.get_by_text("Advanced actions").click() expect(page.get_by_role("button", name="Delete")).to_be_hidden() diff --git a/umap/tests/integration/test_basics.py b/umap/tests/integration/test_basics.py index edc5f546..aa89b2bc 100644 --- a/umap/tests/integration/test_basics.py +++ b/umap/tests/integration/test_basics.py @@ -26,10 +26,7 @@ def test_create_map_with_cursor(page, live_server, tilelayer): page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a marker button on a new map. - create_marker_link = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a marker" - ) - expect(create_marker_link).to_have_attribute("href", "#") + create_marker_link = page.locator(".umap-edit-bar ").get_by_title("Draw a marker") create_marker_link.click() # Check no marker is present by default. @@ -56,7 +53,7 @@ def test_cannot_put_script_tag_in_datalayer_name_or_description( ): page.goto(f"{live_server.url}{openmap.get_absolute_url()}") page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.get_by_role("button", name="Add a layer").click() page.locator('input[name="name"]').click() page.locator('input[name="name"]').fill('') diff --git a/umap/tests/integration/test_categorized_layer.py b/umap/tests/integration/test_categorized_layer.py index c3c22641..96a36f01 100644 --- a/umap/tests/integration/test_categorized_layer.py +++ b/umap/tests/integration/test_categorized_layer.py @@ -51,8 +51,8 @@ def test_basic_categorized_map_with_custom_brewer(openmap, live_server, page): expect(page.locator("path[stroke='#3288bd']")).to_have_count(7) # Now change brewer from UI - page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Edit", exact=True).click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit", exact=True).click() page.get_by_text("Categorized: settings").click() page.locator('select[name="brewer"]').select_option("Paired") @@ -98,8 +98,8 @@ def test_basic_categorized_map_with_custom_categories(openmap, live_server, page expect(page.locator("path[stroke='#f0027f']")).to_have_count(1) # Now change categories from UI - page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Edit", exact=True).click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit", exact=True).click() page.get_by_text("Categorized: settings").click() page.locator('input[name="categories"]').fill( @@ -121,10 +121,6 @@ def test_basic_categorized_map_with_custom_categories(openmap, live_server, page expect(page.locator("path[stroke='#f0027f']")).to_have_count(7) # Now go back to automatic categories - page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Manage layers").click() - page.locator(".panel").get_by_title("Edit", exact=True).click() - page.get_by_text("Categorized: settings").click() page.get_by_text("Alphabetical").click() # residential diff --git a/umap/tests/integration/test_choropleth.py b/umap/tests/integration/test_choropleth.py index 65ef4ddd..7a9e9372 100644 --- a/umap/tests/integration/test_choropleth.py +++ b/umap/tests/integration/test_choropleth.py @@ -48,7 +48,7 @@ def test_basic_choropleth_map_with_custom_brewer(openmap, live_server, page): # Now change brewer from UI page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit", exact=True).click() page.get_by_text("Choropleth: settings").click() page.locator('select[name="brewer"]').select_option("Greens") diff --git a/umap/tests/integration/test_conditional_rules.py b/umap/tests/integration/test_conditional_rules.py index 92c64702..e31a6480 100644 --- a/umap/tests/integration/test_conditional_rules.py +++ b/umap/tests/integration/test_conditional_rules.py @@ -252,7 +252,7 @@ def test_can_create_new_rule(live_server, page, openmap): markers = page.locator(".leaflet-marker-icon .icon_container") expect(markers).to_have_count(5) page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Map advanced properties").click() + page.get_by_role("button", name="Map advanced properties").click() page.get_by_text("Conditional style rules").click() page.get_by_role("button", name="Add rule").click() page.locator("input[name=condition]").click() @@ -276,7 +276,7 @@ def test_can_deactive_rule_from_list(live_server, page, openmap): colors = getColors(markers) assert colors.count("rgb(240, 248, 255)") == 3 page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Map advanced properties").click() + page.get_by_role("button", name="Map advanced properties").click() page.get_by_text("Conditional style rules").click() page.get_by_role("button", name="Show/hide layer").click() colors = getColors(markers) @@ -289,7 +289,7 @@ def test_can_deactive_rule_from_list(live_server, page, openmap): def test_autocomplete_datalist(live_server, page, openmap): DataLayerFactory(map=openmap, data=DATALAYER_DATA1) page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit#6/48.948/1.670") - page.get_by_role("link", name="Map advanced properties").click() + page.get_by_role("button", name="Map advanced properties").click() page.locator("summary").filter(has_text="Conditional style rules").click() page.get_by_role("button", name="Add rule").click() panel = page.locator(".panel.right.on") diff --git a/umap/tests/integration/test_draw_polygon.py b/umap/tests/integration/test_draw_polygon.py index 0a5b05b1..33bd3753 100644 --- a/umap/tests/integration/test_draw_polygon.py +++ b/umap/tests/integration/test_draw_polygon.py @@ -10,10 +10,8 @@ def test_draw_polygon(page, live_server, tilelayer): page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a polygon button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) - create_line.click() + create_path = page.locator(".umap-edit-bar ").get_by_title("Draw a polygon") + create_path.click() # Check no polygon is present by default. # We target with the color, because there is also the drawing line guide (dash-array) @@ -44,10 +42,8 @@ def test_clicking_esc_should_finish_polygon(page, live_server, tilelayer): page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a polygon button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) - create_line.click() + create_path = page.locator(".umap-edit-bar ").get_by_title("Draw a polygon") + create_path.click() # Check no polygon is present by default. # We target with the color, because there is also the drawing line guide (dash-array) @@ -80,10 +76,8 @@ def test_clicking_esc_should_delete_polygon_if_empty(page, live_server, tilelaye page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a polygon button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) - create_line.click() + create_path = page.locator(".umap-edit-bar ").get_by_title("Draw a polygon") + create_path.click() # Check no polygon is present by default. # We target with the color, because there is also the drawing line guide (dash-array) @@ -105,10 +99,8 @@ def test_clicking_esc_should_delete_polygon_if_invalid(page, live_server, tilela page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a polygon button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) - create_line.click() + create_path = page.locator(".umap-edit-bar ").get_by_title("Draw a polygon") + create_path.click() # Check no polygon is present by default. # We target with the color, because there is also the drawing line guide (dash-array) diff --git a/umap/tests/integration/test_draw_polyline.py b/umap/tests/integration/test_draw_polyline.py index ae10590f..d4f63dba 100644 --- a/umap/tests/integration/test_draw_polyline.py +++ b/umap/tests/integration/test_draw_polyline.py @@ -10,9 +10,7 @@ def test_draw_polyline(page, live_server, tilelayer): page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a line button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polyline" - ) + create_line = page.locator(".umap-edit-bar ").get_by_title("Draw a polyline") create_line.click() # Check no line is present by default. @@ -44,9 +42,7 @@ def test_clicking_esc_should_finish_line(page, live_server, tilelayer): page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a line button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polyline" - ) + create_line = page.locator(".umap-edit-bar ").get_by_title("Draw a polyline") create_line.click() # Check no line is present by default. @@ -80,9 +76,7 @@ def test_clicking_esc_should_delete_line_if_empty(page, live_server, tilelayer): page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a line button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polyline" - ) + create_line = page.locator(".umap-edit-bar ").get_by_title("Draw a polyline") create_line.click() # Check no line is present by default. @@ -109,9 +103,7 @@ def test_clicking_esc_should_delete_line_if_invalid(page, live_server, tilelayer page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a line button on a new map. - create_line = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polyline" - ) + create_line = page.locator(".umap-edit-bar ").get_by_title("Draw a polyline") create_line.click() # Check no line is present by default. diff --git a/umap/tests/integration/test_edit_datalayer.py b/umap/tests/integration/test_edit_datalayer.py index a14c8764..7353d25d 100644 --- a/umap/tests/integration/test_edit_datalayer.py +++ b/umap/tests/integration/test_edit_datalayer.py @@ -59,7 +59,7 @@ def test_cancel_deleting_datalayer_should_restore( markers = page.locator(".leaflet-marker-icon") expect(layers).to_have_count(1) expect(markers).to_have_count(1) - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel.right").get_by_title("Delete layer").click() page.get_by_role("button", name="OK").click() expect(markers).to_have_count(0) @@ -77,7 +77,7 @@ def test_can_clone_datalayer(live_server, openmap, login, datalayer, page): markers = page.locator(".leaflet-marker-icon") expect(layers).to_have_count(1) expect(markers).to_have_count(1) - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel.right").get_by_title("Edit", exact=True).click() page.get_by_text("Advanced actions").click() page.get_by_role("button", name="Clone").click() @@ -99,7 +99,7 @@ def test_can_change_icon_class(live_server, openmap, page): DataLayerFactory(map=openmap, data=data) page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit#6/45.3/1") expect(page.locator(".umap-div-icon")).to_be_visible() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() expect(page.locator(".umap-circle-icon")).to_be_hidden() page.locator(".panel.right").get_by_title("Edit", exact=True).click() page.get_by_text("Shape properties").click() @@ -113,7 +113,7 @@ def test_can_change_name(live_server, openmap, page, datalayer): page.goto( f"{live_server.url}{openmap.get_absolute_url()}?edit&onLoadPanel=databrowser" ) - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel.right").get_by_title("Edit", exact=True).click() expect(page.locator(".umap-is-dirty")).to_be_hidden() page.locator('input[name="name"]').click() @@ -143,7 +143,7 @@ def test_can_create_new_datalayer(live_server, openmap, page, datalayer): page.goto( f"{live_server.url}{openmap.get_absolute_url()}?edit&onLoadPanel=databrowser" ) - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.get_by_role("button", name="Add a layer").click() page.locator('input[name="name"]').click() page.locator('input[name="name"]').fill("Layer A") @@ -155,7 +155,7 @@ def test_can_create_new_datalayer(live_server, openmap, page, datalayer): assert saved.name == "Layer A" expect(page.locator(".umap-is-dirty")).to_be_hidden() # Edit again, it should not create a new datalayer - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel.right").get_by_title("Edit", exact=True).first.click() page.locator('input[name="name"]').click() page.locator('input[name="name"]').fill("Layer A with a new name") @@ -179,7 +179,7 @@ def test_can_restore_version(live_server, openmap, page, datalayer): with page.expect_response(re.compile(".*/datalayer/update/.*")): page.get_by_role("button", name="Save").click() expect(marker).to_have_class(re.compile(".*umap-div-icon.*")) - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel.right").get_by_title("Edit", exact=True).click() page.get_by_text("Versions").click() page.get_by_role("button", name="Restore this version").last.click() @@ -201,7 +201,7 @@ def test_deleting_datalayer_should_remove_from_browser_and_layers_list( panel = page.locator(".panel.left") edit_panel = page.locator(".panel.right") page.get_by_title("Open browser").click() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() expect(panel.get_by_text("test datalayer")).to_be_visible() expect(edit_panel.get_by_text("test datalayer")).to_be_visible() page.locator(".panel.right").get_by_title("Delete layer").click() @@ -216,7 +216,7 @@ def test_deleting_datalayer_should_remove_from_caption( page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") panel = page.locator(".panel.left") page.get_by_role("button", name="About").click() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() expect(panel.get_by_text("test datalayer")).to_be_visible() page.locator(".panel.right").get_by_title("Delete layer").click() page.get_by_role("button", name="OK").click() @@ -225,7 +225,7 @@ def test_deleting_datalayer_should_remove_from_caption( def test_can_edit_datalayer_name_in_list(live_server, openmap, datalayer, page): page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.get_by_text("test datalayer").click() page.get_by_text("test datalayer").fill("test datalayer foobar") page.get_by_role("button", name="Open browser").click() diff --git a/umap/tests/integration/test_edit_map.py b/umap/tests/integration/test_edit_map.py index 5d7f6d57..78e87935 100644 --- a/umap/tests/integration/test_edit_map.py +++ b/umap/tests/integration/test_edit_map.py @@ -182,7 +182,7 @@ def test_sortkey_impacts_datalayerindex(map, live_server, page): # Change the default sortkey to be "key" page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Map advanced properties").click() + page.get_by_role("button", name="Map advanced properties").click() page.get_by_text("Default properties").click() # Click "define" diff --git a/umap/tests/integration/test_edit_marker.py b/umap/tests/integration/test_edit_marker.py index 5c91863f..0f419bda 100644 --- a/umap/tests/integration/test_edit_marker.py +++ b/umap/tests/integration/test_edit_marker.py @@ -43,7 +43,7 @@ def test_marker_style_should_have_precedence(live_server, openmap, page, bootstr page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit#6/48.5/19") # Change colour at layer level - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit", exact=True).click() page.get_by_text("Shape properties").click() page.locator(".umap-field-color .define").click() @@ -65,7 +65,7 @@ def test_marker_style_should_have_precedence(live_server, openmap, page, bootstr ) # Now change again at layer level again, it should not change the marker color - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit", exact=True).click() page.get_by_text("Shape properties").click() page.locator(".umap-field-color input").click() diff --git a/umap/tests/integration/test_edit_polygon.py b/umap/tests/integration/test_edit_polygon.py index ec1ce7cc..bbfb7daf 100644 --- a/umap/tests/integration/test_edit_polygon.py +++ b/umap/tests/integration/test_edit_polygon.py @@ -57,7 +57,7 @@ def test_marker_style_should_have_precedence(live_server, openmap, page, bootstr page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") # Change colour at layer level - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit", exact=True).click() page.get_by_text("Shape properties").click() page.locator(".umap-field-color .define").click() @@ -75,7 +75,7 @@ def test_marker_style_should_have_precedence(live_server, openmap, page, bootstr ) # Now change again at layer level again, it should not change the marker color - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit", exact=True).click() page.get_by_text("Shape properties").click() page.locator(".umap-field-color input").click() diff --git a/umap/tests/integration/test_features_id_generation.py b/umap/tests/integration/test_features_id_generation.py index ca4558a5..1baa3188 100644 --- a/umap/tests/integration/test_features_id_generation.py +++ b/umap/tests/integration/test_features_id_generation.py @@ -6,9 +6,7 @@ def test_ids_generation(page, live_server, tilelayer): page.goto(f"{live_server.url}/en/map/new/") # Click on the Draw a line button on a new map. - create_polyline = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polyline" - ) + create_polyline = page.locator(".umap-edit-bar ").get_by_title("Draw a polyline") create_polyline.click() map = page.locator("#map") @@ -18,9 +16,7 @@ def test_ids_generation(page, live_server, tilelayer): map.click(position={"x": 100, "y": 100}) # Click on the Draw a polygon button on a new map. - create_polygon = page.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) + create_polygon = page.locator(".umap-edit-bar ").get_by_title("Draw a polygon") create_polygon.click() map = page.locator("#map") diff --git a/umap/tests/integration/test_import.py b/umap/tests/integration/test_import.py index 57e9b73a..449da6ad 100644 --- a/umap/tests/integration/test_import.py +++ b/umap/tests/integration/test_import.py @@ -17,15 +17,15 @@ pytestmark = pytest.mark.django_db def test_layers_list_is_updated(live_server, tilelayer, page): page.goto(f"{live_server.url}/map/new/") modifier = "Cmd" if platform.system() == "Darwin" else "Ctrl" - page.get_by_role("link", name=f"Import data ({modifier}+I)").click() + page.get_by_role("button", name=f"Import data ({modifier}+I)").click() # Should work page.locator("[name=layer-id]").select_option(label="Import in a new layer") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.get_by_role("button", name="Add a layer").click() page.locator('input[name="name"]').click() page.locator('input[name="name"]').fill("foobar") page.wait_for_timeout(300) # Time for the input debounce. - page.get_by_role("link", name=f"Import data ({modifier}+I)").click() + page.get_by_role("button", name=f"Import data ({modifier}+I)").click() # Should still work page.locator("[name=layer-id]").select_option(label="Import in a new layer") # Now layer should be visible in the options @@ -571,14 +571,14 @@ def test_create_remote_data(page, live_server, tilelayer): page.route("*/**/ajax-proxy/**", handle) page.goto(f"{live_server.url}/map/new/") expect(page.locator(".leaflet-marker-icon")).to_be_hidden() - page.get_by_role("link", name="Import data").click() + page.get_by_role("button", name="Import data").click() page.get_by_placeholder("Provide an URL here").click() page.get_by_placeholder("Provide an URL here").fill("https://remote.org/data.json") page.locator("[name=format]").select_option("geojson") page.get_by_role("radio", name="Link to the layer as remote data").click() page.get_by_role("button", name="Import data", exact=True).click() expect(page.locator(".leaflet-marker-icon")).to_be_visible() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.get_by_role("button", name="Edit", exact=True).click() page.locator("summary").filter(has_text="Remote data").click() expect(page.locator('.panel input[name="url"]')).to_have_value( @@ -608,14 +608,14 @@ def test_import_geojson_from_url(page, live_server, tilelayer): page.route("https://remote.org/data.json", handle) page.goto(f"{live_server.url}/map/new/") expect(page.locator(".leaflet-marker-icon")).to_be_hidden() - page.get_by_role("link", name="Import data").click() + page.get_by_role("button", name="Import data").click() page.get_by_placeholder("Provide an URL here").click() page.get_by_placeholder("Provide an URL here").fill("https://remote.org/data.json") page.locator("[name=format]").select_option("geojson") page.get_by_role("radio", name="Copy into the layer").click() page.get_by_role("button", name="Import data", exact=True).click() expect(page.locator(".leaflet-marker-icon")).to_be_visible() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.get_by_role("button", name="Edit", exact=True).click() page.locator("summary").filter(has_text="Remote data").click() expect(page.locator('.panel input[name="url"]')).to_have_value("") @@ -626,7 +626,7 @@ def test_overpass_import_with_bbox(page, live_server, tilelayer, settings): "overpass": {"url": "https://my.overpass.io/interpreter"} } page.goto(f"{live_server.url}/map/new/") - page.get_by_role("link", name="Import data").click() + page.get_by_role("button", name="Import data").click() page.get_by_role("button", name="Import helpers").click() page.get_by_role("button", name="Overpass").click() page.get_by_placeholder("amenity=drinking_water").fill("building") @@ -677,7 +677,7 @@ def test_overpass_import_retains_boundary(page, live_server, tilelayer, settings # Intercept the route page.route(re.compile("https://foobar.io/api.*"), handle) page.goto(f"{live_server.url}/map/new/") - page.get_by_role("link", name="Import data").click() + page.get_by_role("button", name="Import data").click() page.get_by_role("button", name="Import helpers").click() page.get_by_role("button", name="Overpass").click() page.get_by_placeholder("amenity=drinking_water").fill("building") @@ -732,7 +732,7 @@ def test_import_from_datasets(page, live_server, tilelayer, settings): page.route("https://remote.org/data.json", handle) page.goto(f"{live_server.url}/map/new/") expect(page.locator(".leaflet-marker-icon")).to_be_hidden() - page.get_by_role("link", name="Import data").click() + page.get_by_title("Import data").click() page.get_by_role("button", name="Import helpers").click() page.get_by_role("button", name="Datasets").click() page.get_by_role("dialog").get_by_role("combobox").select_option( @@ -740,7 +740,7 @@ def test_import_from_datasets(page, live_server, tilelayer, settings): ) page.get_by_role("button", name="Choose this dataset").click() page.get_by_label("Copy into the layer").check() - page.get_by_role("button", name="Import data").click() + page.get_by_role("button", name="Import data", exact=True).click() expect(page.locator(".leaflet-marker-icon")).to_be_visible() page.get_by_role("button", name="Open browser").click() expect(page.locator("h5").get_by_text("Good data")).to_be_visible() diff --git a/umap/tests/integration/test_owned_map.py b/umap/tests/integration/test_owned_map.py index 2eaa9e6a..57ed5ca0 100644 --- a/umap/tests/integration/test_owned_map.py +++ b/umap/tests/integration/test_owned_map.py @@ -239,7 +239,7 @@ def test_can_delete_datalayer(live_server, map, login, datalayer): markers = page.locator(".leaflet-marker-icon") expect(layers).to_have_count(1) expect(markers).to_have_count(1) - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel.right").get_by_title("Delete layer").click() page.get_by_role("button", name="OK").click() with page.expect_response(re.compile(r".*/datalayer/delete/.*")): diff --git a/umap/tests/integration/test_save.py b/umap/tests/integration/test_save.py index 2ffdaa0e..bab3aa8e 100644 --- a/umap/tests/integration/test_save.py +++ b/umap/tests/integration/test_save.py @@ -5,7 +5,7 @@ def test_reseting_map_would_remove_from_save_queue( live_server, openmap, page, datalayer ): page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") - page.get_by_role("link", name="Edit map name and caption").click() + page.get_by_role("button", name="Edit map name and caption").click() requests = [] def register_request(request): @@ -20,7 +20,7 @@ def test_reseting_map_would_remove_from_save_queue( page.get_by_role("button", name="OK").click() page.wait_for_timeout(500) page.get_by_role("button", name="Edit").click() - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.get_by_role("button", name="Edit", exact=True).click() page.locator('input[name="name"]').click() page.locator('input[name="name"]').fill("new datalayer name") diff --git a/umap/tests/integration/test_tableeditor.py b/umap/tests/integration/test_tableeditor.py index 003a7504..54c22745 100644 --- a/umap/tests/integration/test_tableeditor.py +++ b/umap/tests/integration/test_tableeditor.py @@ -67,7 +67,7 @@ DATALAYER_DATA = { def test_table_editor(live_server, openmap, datalayer, page): page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit properties in a table").click() page.get_by_text("Add a new property").click() page.locator("dialog").locator("input").fill("newprop") @@ -89,7 +89,7 @@ def test_table_editor(live_server, openmap, datalayer, page): def test_cannot_add_existing_property_name(live_server, openmap, datalayer, page): page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit properties in a table").click() page.get_by_text("Add a new property").click() page.locator("dialog").locator("input").fill("name") @@ -102,7 +102,7 @@ def test_cannot_add_existing_property_name(live_server, openmap, datalayer, page def test_cannot_add_property_with_a_dot(live_server, openmap, datalayer, page): page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit properties in a table").click() page.get_by_text("Add a new property").click() page.locator("dialog").locator("input").fill("foo.bar") @@ -115,7 +115,7 @@ def test_cannot_add_property_with_a_dot(live_server, openmap, datalayer, page): def test_rename_property(live_server, openmap, datalayer, page): page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit properties in a table").click() expect(page.locator("table th button[data-property=name]")).to_have_count(1) page.locator("thead button[data-property=name]").click() @@ -129,7 +129,7 @@ def test_rename_property(live_server, openmap, datalayer, page): def test_delete_selected_rows(live_server, openmap, page): DataLayerFactory(map=openmap, data=DATALAYER_DATA) page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit#6/48.093/1.890") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit properties in a table").click() expect(page.locator("tbody tr")).to_have_count(4) expect(page.locator(".leaflet-marker-icon")).to_have_count(4) @@ -143,7 +143,7 @@ def test_delete_selected_rows(live_server, openmap, page): def test_delete_all_rows(live_server, openmap, page): DataLayerFactory(map=openmap, data=DATALAYER_DATA) page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit#6/48.093/1.890") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit properties in a table").click() expect(page.locator("tbody tr")).to_have_count(4) expect(page.locator(".leaflet-marker-icon")).to_have_count(4) @@ -159,7 +159,7 @@ def test_filter_and_delete_rows(live_server, openmap, page): panel = page.locator(".panel.left.on") table = page.locator(".panel.full table") page.goto(f"{live_server.url}{openmap.get_absolute_url()}?edit#6/48.093/1.890") - page.get_by_role("link", name="Manage layers").click() + page.get_by_role("button", name="Manage layers").click() page.locator(".panel").get_by_title("Edit properties in a table").click() expect(table.locator("tbody tr")).to_have_count(4) expect(page.locator(".leaflet-marker-icon")).to_have_count(4) diff --git a/umap/tests/integration/test_websocket_sync.py b/umap/tests/integration/test_websocket_sync.py index d0999cde..15e8673e 100644 --- a/umap/tests/integration/test_websocket_sync.py +++ b/umap/tests/integration/test_websocket_sync.py @@ -107,9 +107,7 @@ def test_websocket_connection_can_sync_polygons(context, asgi_live_server, tilel b_map_el = peerB.locator("#map") # Click on the Draw a polygon button on a new map. - create_line = peerA.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) + create_line = peerA.locator(".umap-edit-bar ").get_by_title("Draw a polygon") create_line.click() a_polygons = peerA.locator(".leaflet-overlay-pane path[fill='DarkBlue']") @@ -189,14 +187,14 @@ def test_websocket_connection_can_sync_map_properties( peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit") # Name change is synced - peerA.get_by_role("link", name="Edit map name and caption").click() + peerA.get_by_role("button", name="Edit map name and caption").click() peerA.locator('input[name="name"]').click() peerA.locator('input[name="name"]').fill("it syncs!") expect(peerB.locator(".map-name").last).to_have_text("it syncs!") # Zoom control is synced - peerB.get_by_role("link", name="Map advanced properties").click() + peerB.get_by_role("button", name="Map advanced properties").click() peerB.locator("summary").filter(has_text="User interface options").click() switch = peerB.locator("div.formbox").filter( has_text=re.compile("Display the zoom control") @@ -223,14 +221,14 @@ def test_websocket_connection_can_sync_datalayer_properties( peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit") # Layer addition, name and type are synced - peerA.get_by_role("link", name="Manage layers").click() + peerA.get_by_role("button", name="Manage layers").click() peerA.get_by_role("button", name="Add a layer").click() peerA.locator('input[name="name"]').click() peerA.locator('input[name="name"]').fill("synced layer!") peerA.get_by_role("combobox").select_option("Choropleth") peerA.locator("body").press("Escape") - peerB.get_by_role("link", name="Manage layers").click() + peerB.get_by_role("button", name="Manage layers").click() peerB.locator(".panel.right").get_by_role("button", name="Edit").first.click() expect(peerB.locator('input[name="name"]')).to_have_value("synced layer!") expect(peerB.get_by_role("combobox")).to_have_value("Choropleth") @@ -254,9 +252,7 @@ def test_websocket_connection_can_sync_cloned_polygons( b_map_el = peerB.locator("#map") # Click on the Draw a polygon button on a new map. - create_line = peerA.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) + create_line = peerA.locator(".umap-edit-bar ").get_by_title("Draw a polygon") create_line.click() a_polygons = peerA.locator(".leaflet-overlay-pane path[fill='DarkBlue']") @@ -324,9 +320,7 @@ def test_websocket_connection_can_sync_late_joining_peer( peerA.wait_for_timeout(300) # Add a polygon from peer A - create_polygon = peerA.locator(".leaflet-control-toolbar ").get_by_title( - "Draw a polygon" - ) + create_polygon = peerA.locator(".umap-edit-bar ").get_by_title("Draw a polygon") create_polygon.click() a_map_el.click(position={"x": 200, "y": 200}) @@ -377,7 +371,7 @@ def test_should_sync_datalayers(new_page, asgi_live_server, tilelayer): peerB.goto(f"{asgi_live_server.url}{map.get_absolute_url()}?edit") # Create a new layer from peerA - peerA.get_by_role("link", name="Manage layers").click() + peerA.get_by_role("button", name="Manage layers").click() peerA.get_by_role("button", name="Add a layer").click() # Check layer has been sync to peerB @@ -385,7 +379,7 @@ def test_should_sync_datalayers(new_page, asgi_live_server, tilelayer): expect(peerB.get_by_text("Layer 1")).to_be_visible() # Draw a marker in layer 1 from peerA - peerA.get_by_role("link", name="Draw a marker (Ctrl+M)").click() + peerA.get_by_role("button", name="Draw a marker (Ctrl+M)").click() peerA.locator("#map").click() # Check marker is visible from peerB @@ -398,9 +392,9 @@ def test_should_sync_datalayers(new_page, asgi_live_server, tilelayer): assert DataLayer.objects.count() == 1 # Create another layer from peerA and draw a marker on it (without saving to server) - peerA.get_by_role("link", name="Manage layers").click() + peerA.get_by_role("button", name="Manage layers").click() peerA.get_by_role("button", name="Add a layer").click() - peerA.get_by_role("link", name="Draw a marker (Ctrl+M)").click() + peerA.get_by_role("button", name="Draw a marker (Ctrl+M)").click() peerA.locator("#map").click() # Make sure this new marker is in Layer 2 for peerB @@ -411,7 +405,7 @@ def test_should_sync_datalayers(new_page, asgi_live_server, tilelayer): expect(peerB.locator(".leaflet-marker-icon")).to_be_visible() # Now draw a marker from peerB - peerB.get_by_role("link", name="Draw a marker (Ctrl+M)").click() + peerB.get_by_role("button", name="Draw a marker (Ctrl+M)").click() peerB.locator("#map").click() peerB.locator('input[name="name"]').fill("marker from peerB") @@ -503,15 +497,15 @@ def test_create_and_sync_map(new_page, asgi_live_server, tilelayer, login, user) # Create a syncable map with peerA peerA = login(user, prefix="Page A") peerA.goto(f"{asgi_live_server.url}/en/map/new/") - peerA.get_by_role("link", name="Map advanced properties").click() + peerA.get_by_role("button", name="Map advanced properties").click() expect(peerA.get_by_text("Real-time collaboration", exact=True)).to_be_hidden() with peerA.expect_response(re.compile("./map/create/.*")): peerA.get_by_role("button", name="Save Draft").click() - peerA.get_by_role("link", name="Map advanced properties").click() + peerA.get_by_role("button", name="Map advanced properties").click() expect(peerA.get_by_text("Real-time collaboration", exact=True)).to_be_visible() peerA.get_by_text("Real-time collaboration", exact=True).click() peerA.get_by_text("Enable real-time").click() - peerA.get_by_role("link", name="Update permissions and editors").click() + peerA.get_by_role("button", name="Update permissions and editors").click() peerA.locator('select[name="share_status"]').select_option(str(Map.PUBLIC)) with peerA.expect_response(re.compile("./update/settings/.*")): peerA.get_by_role("button", name="Save").click()