diff --git a/administrator/components/com_categories/tmpl/categories/default.php b/administrator/components/com_categories/tmpl/categories/default.php
index 1ad9151a4ca3f..a535338523e5d 100644
--- a/administrator/components/com_categories/tmpl/categories/default.php
+++ b/administrator/components/com_categories/tmpl/categories/default.php
@@ -158,7 +158,9 @@
$parentsStr = '';
}
?>
-
+
id, false, 'cid', 'cb', $item->title); ?>
|
diff --git a/administrator/components/com_menus/tmpl/items/default.php b/administrator/components/com_menus/tmpl/items/default.php
index 99368cceb23d5..3d8c157eae2d5 100644
--- a/administrator/components/com_menus/tmpl/items/default.php
+++ b/administrator/components/com_menus/tmpl/items/default.php
@@ -134,8 +134,8 @@
}
?>
+ data-item-id="id; ?>" data-parents=""
+ data-level="level; ?>">
id, false, 'cid', 'cb', $item->title); ?>
|
diff --git a/administrator/components/com_tags/tmpl/tags/default.php b/administrator/components/com_tags/tmpl/tags/default.php
index 50f837de95c02..648d1acd7ed02 100644
--- a/administrator/components/com_tags/tmpl/tags/default.php
+++ b/administrator/components/com_tags/tmpl/tags/default.php
@@ -161,7 +161,9 @@
$parentsStr = '';
}
?>
-
+
id, false, 'cid', 'cb', $item->title); ?>
|
diff --git a/build/media_source/system/js/draggable.es6.js b/build/media_source/system/js/draggable.es6.js
index 5bd329d60b255..f000b852c12e4 100644
--- a/build/media_source/system/js/draggable.es6.js
+++ b/build/media_source/system/js/draggable.es6.js
@@ -8,6 +8,7 @@ let direction;
let isNested;
let dragElementIndex;
let dropElementIndex;
+let dropElement;
let container = document.querySelector('.js-draggable');
const orderRows = container.querySelectorAll('[name="order[]"]');
@@ -91,6 +92,78 @@ if (container) {
return result;
};
+ const rearrangeChildren = ($parent) => {
+ if (!$parent.dataset.itemId) {
+ return;
+ }
+ const parentId = $parent.dataset.itemId;
+ // Get children list. Each child row should have
+ // an attribute data-parents=" 1 2 3" where the number is id of parent
+ const $children = container.querySelectorAll(`tr[data-parents~="${parentId}"]`);
+
+ if ($children.length) {
+ $parent.after(...$children);
+ }
+ };
+
+ const saveTheOrder = (el) => {
+ let orderSelector;
+ let inputSelector;
+ let rowSelector;
+
+ const groupId = el.dataset.draggableGroup;
+
+ if (groupId) {
+ rowSelector = `tr[data-draggable-group="${groupId}"]`;
+ orderSelector = `[data-draggable-group="${groupId}"] [name="order[]"]`;
+ inputSelector = `[data-draggable-group="${groupId}"] [name="cid[]"]`;
+ } else {
+ rowSelector = 'tr';
+ orderSelector = '[name="order[]"]';
+ inputSelector = '[name="cid[]"]';
+ }
+
+ const rowElements = [].slice.call(container.querySelectorAll(rowSelector));
+ const rows = [].slice.call(container.querySelectorAll(orderSelector));
+ const inputRows = [].slice.call(container.querySelectorAll(inputSelector));
+
+ dropElementIndex = rowElements.indexOf(el);
+
+ if (url) {
+ // Detach task field if exists
+ const task = document.querySelector('[name="task"]');
+
+ // Detach task field if exists
+ if (task) {
+ task.setAttribute('name', 'some__Temporary__Name__');
+ }
+
+ // Prepare the options
+ const ajaxOptions = {
+ url,
+ method: 'POST',
+ data: getOrderData(rows, inputRows, dragElementIndex, dropElementIndex).join('&'),
+ perform: true,
+ };
+
+ Joomla.request(ajaxOptions);
+
+ // Re-Append original task field
+ if (task) {
+ task.setAttribute('name', 'task');
+ }
+ }
+
+ // Update positions for a children of the moved item
+ rearrangeChildren(el);
+
+ // Reset data order attribute for initial ordering
+ const elements = container.querySelectorAll('[name="order[]"]');
+ for (let i = 0, l = elements.length; l > i; i += 1) {
+ elements[i].dataset.order = i + 1;
+ }
+ };
+
// eslint-disable-next-line no-undef
dragula([container], {
// Y axis is considered when determining where an element would be dropped
@@ -132,63 +205,14 @@ if (container) {
const rowElements = [].slice.call(container.querySelectorAll(rowSelector));
dragElementIndex = rowElements.indexOf(el);
- })
- .on('cloned', () => {
-
})
.on('drop', (el) => {
- let orderSelector;
- let inputSelector;
- let rowSelector;
-
- const groupId = el.dataset.draggableGroup;
-
- if (groupId) {
- rowSelector = `tr[data-draggable-group="${groupId}"]`;
- orderSelector = `[data-draggable-group="${groupId}"] [name="order[]"]`;
- inputSelector = `[data-draggable-group="${groupId}"] [name="cid[]"]`;
- } else {
- rowSelector = 'tr';
- orderSelector = '[name="order[]"]';
- inputSelector = '[name="cid[]"]';
- }
-
- const rowElements = [].slice.call(container.querySelectorAll(rowSelector));
- const rows = [].slice.call(container.querySelectorAll(orderSelector));
- const inputRows = [].slice.call(container.querySelectorAll(inputSelector));
-
- dropElementIndex = rowElements.indexOf(el);
-
- if (url) {
- // Detach task field if exists
- const task = document.querySelector('[name="task"]');
-
- // Detach task field if exists
- if (task) {
- task.setAttribute('name', 'some__Temporary__Name__');
- }
-
- // Prepare the options
- const ajaxOptions = {
- url,
- method: 'POST',
- data: getOrderData(rows, inputRows, dragElementIndex, dropElementIndex).join('&'),
- perform: true,
- };
-
- Joomla.request(ajaxOptions);
-
- // Re-Append original task field
- if (task) {
- task.setAttribute('name', 'task');
- }
- }
+ dropElement = el;
})
.on('dragend', () => {
- const elements = container.querySelectorAll('[name="order[]"]');
- // Reset data order attribute for initial ordering
- for (let i = 0, l = elements.length; l > i; i += 1) {
- elements[i].dataset.order = i + 1;
+ if (dropElement) {
+ saveTheOrder(dropElement);
+ dropElement = null;
}
});
}