diff --git a/umap/static/umap/test/TableEditor.js b/umap/static/umap/test/TableEditor.js
deleted file mode 100644
index aa0578af..00000000
--- a/umap/static/umap/test/TableEditor.js
+++ /dev/null
@@ -1,104 +0,0 @@
-describe('L.TableEditor', () => {
- let path = '/map/99/datalayer/edit/62/',
- datalayer
-
- before(async () => {
- await fetchMock.mock(
- /\/datalayer\/62\/\?.*/,
- JSON.stringify(RESPONSES.datalayer62_GET)
- )
- this.options = {
- umap_id: 99,
- }
- map = initMap({ umap_id: 99 })
- const datalayer_options = defaultDatalayerData()
- await map.initDataLayers([datalayer_options])
- datalayer = map.getDataLayerByUmapId(62)
- enableEdit()
- })
- after(() => {
- fetchMock.restore()
- clickCancel()
- resetMap()
- })
-
- describe('#open()', () => {
- var button
-
- it('should exist table click on edit mode', () => {
- button = qs(
- '#browse_data_toggle_' + L.stamp(datalayer) + ' .layer-table-edit'
- )
- expect(button).to.be.ok
- })
-
- it('should open table button click', () => {
- happen.click(button)
- expect(qs('#umap-ui-container div.table')).to.be.ok
- expect(qsa('#umap-ui-container div.table form').length).to.eql(3) // One per feature.
- expect(qsa('#umap-ui-container div.table input').length).to.eql(3) // One per feature and per property.
- })
- })
- describe('#properties()', () => {
- var feature
-
- before(() => {
- var firstIndex = datalayer._index[0]
- feature = datalayer._layers[firstIndex]
- })
-
- it('should create new property column', () => {
- var newPrompt = () => {
- return 'newprop'
- }
- var oldPrompt = window.prompt
- window.prompt = newPrompt
- var button = qs('#umap-ui-container .add-property')
- expect(button).to.be.ok
- happen.click(button)
- expect(qsa('#umap-ui-container div.table input').length).to.eql(6) // One per feature and per property.
- window.prompt = oldPrompt
- })
-
- it('should populate feature property on fill', () => {
- var input = qs(
- 'form#umap-feature-properties_' + L.stamp(feature) + ' input[name=newprop]'
- )
- changeInputValue(input, 'the value')
- expect(feature.properties.newprop).to.eql('the value')
- })
-
- it('should update property name on update click', () => {
- var newPrompt = () => {
- return 'newname'
- }
- var oldPrompt = window.prompt
- window.prompt = newPrompt
- var button = qs('#umap-ui-container div.thead div.tcell:last-of-type .umap-edit')
- expect(button).to.be.ok
- happen.click(button)
- expect(qsa('#umap-ui-container div.table input').length).to.eql(6)
- expect(feature.properties.newprop).to.be.undefined
- expect(feature.properties.newname).to.eql('the value')
- window.prompt = oldPrompt
- })
-
- it('should update property on delete click', () => {
- var oldConfirm,
- newConfirm = () => {
- return true
- }
- oldConfirm = window.confirm
- window.confirm = newConfirm
- var button = qs(
- '#umap-ui-container div.thead div.tcell:last-of-type .umap-delete'
- )
- expect(button).to.be.ok
- happen.click(button)
- FEATURE = feature
- expect(qsa('#umap-ui-container div.table input').length).to.eql(3)
- expect(feature.properties.newname).to.be.undefined
- window.confirm = oldConfirm
- })
- })
-})
diff --git a/umap/static/umap/test/index.html b/umap/static/umap/test/index.html
index e4d2c811..9fee3dba 100644
--- a/umap/static/umap/test/index.html
+++ b/umap/static/umap/test/index.html
@@ -89,7 +89,6 @@
-
diff --git a/umap/tests/integration/test_tableeditor.py b/umap/tests/integration/test_tableeditor.py
new file mode 100644
index 00000000..cb26e511
--- /dev/null
+++ b/umap/tests/integration/test_tableeditor.py
@@ -0,0 +1,27 @@
+import json
+import re
+from pathlib import Path
+
+from playwright.sync_api import expect
+
+from umap.models import DataLayer
+
+
+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.locator("#umap-ui-container").get_by_title(
+ "Edit properties in a table"
+ ).click()
+ page.once("dialog", lambda dialog: dialog.accept(prompt_text="newprop"))
+ page.get_by_text("Add a new property").click()
+ page.locator('input[name="newprop"]').fill("newvalue")
+ page.once("dialog", lambda dialog: dialog.accept())
+ page.hover(".umap-table-editor .tcell")
+ page.get_by_title("Delete this property on all").first.click()
+ with page.expect_response(re.compile(r".*/datalayer/update/.*")):
+ page.get_by_role("button", name="Save").click()
+ saved = DataLayer.objects.last()
+ data = json.loads(Path(saved.geojson.path).read_text())
+ assert data["features"][0]["properties"]["newprop"] == "newvalue"
+ assert "name" not in data["features"][0]["properties"]