Browse Source

feat: drag n drop lagged

pull/7619/head
Ruslan Semak 2 months ago
parent
commit
ae24f6c0e1
1 changed files with 42 additions and 19 deletions
  1. 61
      client/components/admin/admin-pages.vue

61
client/components/admin/admin-pages.vue

@ -119,6 +119,7 @@ export default {
selectedPage: {},
pagination: 1,
pages: [],
originalOrder: [],
pageTotal: 0,
headers: [
{ text: 'ID', value: 'id', width: 80, sortable: true },
@ -172,14 +173,22 @@ export default {
methods: {
async saveNewOrder() {
try {
const pagesToUpdate = this.filteredPages.map((page, index) => ({
// Получаем страницы текущей группы
const groupPages = this.pages
.filter(p => p.group === this.selectedGroup)
.sort((a, b) => a.orderPriority - b.orderPriority)
const pagesToUpdate = groupPages.map((page, index) => ({
id: page.id,
orderPriority: index + 1
}))
// Используем новую мутацию для массового обновления
await this.$apollo.mutate({
mutation: updatePagePriorityMutation,
variables: { pages: pagesToUpdate }
mutation: updatePagesOrderMutation,
variables: {
pages: pagesToUpdate
}
})
this.$store.commit('showNotification', {
@ -239,31 +248,45 @@ export default {
return
}
// Создаем копию массива страниц
const pagesCopy = [...this.pages]
// Находим индекс перетаскиваемого элемента в основном массиве
const draggedPageIndex = pagesCopy.findIndex(p => p.id === this.draggedItem.id)
if (draggedPageIndex === -1) return
// Получаем отфильтрованные и отсортированные страницы
const filteredSorted = this.filteredPages
// Удаляем перетаскиваемый элемент из массива
const [draggedPage] = pagesCopy.splice(draggedPageIndex, 1)
// Находим новые индексы с учетом фильтрации и сортировки
const draggedIndex = filteredSorted.findIndex(p => p.id === this.draggedItem.id)
const targetIndex = filteredSorted.findIndex(p => p.id === item.id)
// Находим индекс целевого элемента в основном массиве
const targetPageIndex = pagesCopy.findIndex(p => p.id === item.id)
if (targetPageIndex === -1) return
if (draggedIndex === -1 || targetIndex === -1) return
// Вставляем перетаскиваемый элемент перед целевым
pagesCopy.splice(targetPageIndex, 0, draggedPage)
// Создаем новый порядок ID
const newOrderIds = filteredSorted.map(p => p.id)
// Удаляем перетаскиваемый элемент из его текущей позиции
newOrderIds.splice(draggedIndex, 1)
// Вставляем его в новую позицию
newOrderIds.splice(targetIndex, 0, this.draggedItem.id)
// Обновляем orderPriority для всех элементов в группе
// Обновляем orderPriority в основном массиве
const pagesCopy = [...this.pages]
let currentPriority = 1
pagesCopy.forEach(page => {
if (page.group === this.selectedGroup) {
// Сначала обновляем порядок для выбранной группы
newOrderIds.forEach(id => {
const page = pagesCopy.find(p => p.id === id && p.group === this.selectedGroup)
if (page) {
page.orderPriority = currentPriority++
}
})
// Затем обновляем порядок для страниц без группы (если нужно)
pagesCopy.forEach(page => {
if (page.group !== this.selectedGroup) {
// Сохраняем исходный порядок для страниц других групп
const originalPage = this.originalOrder.find(p => p.id === page.id)
if (originalPage) {
page.orderPriority = originalPage.orderPriority
}
}
})
// Обновляем основной массив
this.pages = pagesCopy
},

Loading…
Cancel
Save