Skip to content

Commit 32e51ee

Browse files
committed
delete row
1 parent d490ae2 commit 32e51ee

5 files changed

Lines changed: 127 additions & 16 deletions

File tree

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* Handles deletion of dynamic page rows
3+
*/
4+
5+
(function () {
6+
"use strict";
7+
8+
// Initialize when DOM is loaded
9+
if (document.readyState === "loading") {
10+
document.addEventListener("DOMContentLoaded", initRowDeletion);
11+
} else {
12+
initRowDeletion();
13+
}
14+
15+
function initRowDeletion() {
16+
// Only run on dynamic-view with edit permissions
17+
if (
18+
!document.body.classList.contains("template-dynamic-view") ||
19+
!document.body.classList.contains("userrole-manager")
20+
) {
21+
console.log(
22+
"Not in dynamic-view edit mode, skipping row deletion initialization"
23+
);
24+
return;
25+
}
26+
27+
console.log("Initializing row deletion...");
28+
29+
const deleteModal = document.getElementById("deleteRowModal");
30+
if (!deleteModal) {
31+
console.error("Delete row modal not found");
32+
return;
33+
}
34+
35+
let rowToDelete = null;
36+
37+
deleteModal.addEventListener("show.bs.modal", function (event) {
38+
const button = event.relatedTarget;
39+
rowToDelete = button.closest("section.dynamic-row");
40+
console.log("Preparing to delete row:", rowToDelete?.dataset.rowid);
41+
});
42+
43+
const confirmButton = document.getElementById("confirmDeleteRow");
44+
if (confirmButton) {
45+
confirmButton.addEventListener("click", handleDeleteRow);
46+
} else {
47+
console.error("Confirm delete button not found");
48+
}
49+
50+
function handleDeleteRow() {
51+
if (!rowToDelete) {
52+
console.error("No row selected for deletion");
53+
return;
54+
}
55+
56+
const rowId = rowToDelete.dataset.rowid;
57+
const rowUrl = rowToDelete.dataset.rowurl;
58+
59+
console.log(`Deleting row ${rowId} via ${rowUrl}`);
60+
61+
fetch(rowUrl, {
62+
method: "DELETE",
63+
headers: {
64+
Accept: "application/json",
65+
"Content-Type": "application/json",
66+
"X-CSRF-TOKEN":
67+
document.querySelector('input[name="_authenticator"]')?.value || "",
68+
},
69+
credentials: "same-origin",
70+
})
71+
.then((response) => {
72+
console.log(`Received response with status: ${response.status}`);
73+
console.log("Response headers:", response.headers);
74+
console.log("Response ok:", response.ok);
75+
if (!response.ok) {
76+
const error = new Error(`HTTP error! status: ${response.status}`);
77+
console.error("Response not OK:", error);
78+
throw error;
79+
}
80+
})
81+
.finally(() => {
82+
const modal = bootstrap.Modal.getInstance(deleteModal);
83+
if (modal) {
84+
modal.hide();
85+
}
86+
// Refresh the page after successful update
87+
window.location.reload();
88+
});
89+
}
90+
}
91+
})();

src/cs_dynamicpages/browser/static/edit_dynamicpagerow.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,6 @@
136136
// Initialize when DOM is fully loaded
137137
function start() {
138138
initialize();
139-
140-
// Handle dynamically loaded content (for add forms)
141-
document.body.addEventListener("DOMNodeInserted", function (e) {
142-
const form = e.target.closest ? e.target.closest("form") : null;
143-
if (
144-
form &&
145-
(form.classList.contains("view-name-add-DynamicPageRow") ||
146-
form.id === "form")
147-
) {
148-
initialize(form);
149-
}
150-
});
151139
}
152140

153141
if (document.readyState === "loading") {

src/cs_dynamicpages/browser/static/reorder-rows.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868

6969
console.log(`Preparing to move row ${rowId} with delta ${delta}`);
7070

71-
const baseUrl = row.dataset.rowurl || "";
71+
const baseUrl = row.dataset.rowsurl || "";
7272
console.log(`Sending request to: ${baseUrl}`);
7373

7474
const requestBody = {

src/cs_dynamicpages/profiles/default/registry/dynamic_bundle.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,18 @@
1616
<value key="expression" />
1717
</records>
1818
<records interface="Products.CMFPlone.interfaces.IBundleRegistry"
19-
prefix="plone.bundles/cs_dynamicpages.dynamicpagerow_view"
19+
prefix="plone.bundles/cs_dynamicpages.dynamicpagerow_view_delete"
20+
>
21+
<value key="enabled">True</value>
22+
<value key="jscompilation">++plone++cs_dynamicpages.edit/delete-row.js</value>
23+
<value key="depends">plone</value>
24+
<value key="load_async">True</value>
25+
<value key="load_defer">False</value>
26+
<value key="expression" />
27+
</records>
28+
29+
<records interface="Products.CMFPlone.interfaces.IBundleRegistry"
30+
prefix="plone.bundles/cs_dynamicpages.dynamicpagerow_view_reorder"
2031
>
2132
<value key="enabled">True</value>
2233
<value key="jscompilation">++plone++cs_dynamicpages.edit/reorder-rows.js</value>

src/cs_dynamicpages/views/dynamic_view.pt

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<tal:featured repeat="brain rows">
1313
<div tal:define="row brain/getObject;">
1414
<section class="dynamic-row state-${row/review_state}" data-rowid="${row/id}"
15-
data-rowurl="${row/aq_parent/absolute_url}">
15+
data-rowurl="${row/absolute_url}" data-rowsurl="${row/aq_parent/absolute_url}">
1616
<div class="edit-buttons d-flex gap-2" tal:condition="row/can_edit">
1717
<small
1818
class="d-inline-flex mb-3 px-2 py-1 fw-semibold text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2 position-relative">
@@ -22,7 +22,8 @@
2222
<a class="btn btn-outline-primary btn-sm align-self-start" href="${row/absolute_url}/edit">Edit</a>
2323

2424
<div class="ms-auto d-flex gap-2 align-items-start">
25-
<a class="btn btn-sm btn-danger" href="#" data-action="delete-row">Delete row</a>
25+
<a class="btn btn-sm btn-danger" href="#" data-bs-toggle="modal" data-bs-target="#deleteRowModal"
26+
data-rowid="${row/id}">Delete row</a>
2627
<a tal:condition="python:not(repeat['brain'].start)"
2728
class="btn btn-outline-primary btn-sm align-self-start" href="#" data-action="move-up">Move up</a>
2829
<a tal:condition="python:not(repeat['brain'].end)"
@@ -65,8 +66,28 @@
6566
<a class="btn btn-primary btn-lg" href="${view/dynamic_page_folder_element_url}/++add++DynamicPageRow">Add
6667
new row</a>
6768
</div>
69+
<!-- Delete Confirmation Modal -->
70+
<div class="modal fade" id="deleteRowModal" tabindex="-1" aria-labelledby="deleteRowModalLabel"
71+
aria-hidden="true">
72+
<div class="modal-dialog">
73+
<div class="modal-content">
74+
<div class="modal-header">
75+
<h5 class="modal-title" id="deleteRowModalLabel" i18n:translate="">Confirm Deletion</h5>
76+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
77+
</div>
78+
<div class="modal-body">
79+
<p i18n:translate="">Are you sure you want to delete this row? This action cannot be undone.</p>
80+
</div>
81+
<div class="modal-footer">
82+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" i18n:translate="">Cancel</button>
83+
<button type="button" class="btn btn-danger" id="confirmDeleteRow" i18n:translate="">Delete</button>
84+
</div>
85+
</div>
86+
</div>
87+
</div>
6888
</main>
6989
</metal:main>
90+
7091
</body>
7192

7293
</html>

0 commit comments

Comments
 (0)