From 60875ff2e2573acb728267c1e44c5869f87cfeec Mon Sep 17 00:00:00 2001 From: Ruslan Semak Date: Fri, 18 Apr 2025 13:28:10 +0300 Subject: [PATCH] feat: Page ordering --- client/components/admin/admin-pages.vue | 85 ++++++++++--------- client/graph/admin/pages/pages-query-list.gql | 1 + .../graph/admin/pages/pages-query-single.gql | 1 + .../admin/pages/update-page-priority.gql | 17 ++++ server/db/migrations/2.5.130.js | 8 ++ server/db/migrations/2.5.131.js | 8 ++ server/graph/resolvers/page.js | 78 ++++++++++------- server/graph/schemas/page.graphql | 8 ++ server/jobs/rebuild-tree.js | 3 +- server/models/pages.js | 74 +++++++++++----- 10 files changed, 194 insertions(+), 89 deletions(-) create mode 100644 client/graph/admin/pages/update-page-priority.gql create mode 100644 server/db/migrations/2.5.130.js create mode 100644 server/db/migrations/2.5.131.js diff --git a/client/components/admin/admin-pages.vue b/client/components/admin/admin-pages.vue index d2aa0d12..27aa6a4d 100644 --- a/client/components/admin/admin-pages.vue +++ b/client/components/admin/admin-pages.vue @@ -33,9 +33,9 @@ flat hide-details dense - label='Paths' - :items='paths' - v-model='selectedPath' + label='Groups' + :items='groups' + v-model='selectedGroup' style='max-width: 250px;' ) v-spacer @@ -65,30 +65,23 @@ :headers='headers' :search='search' :page.sync='pagination' - :items-per-page='50' + :items-per-page='500' :loading='loading' must-sort, - sort-by='updatedAt', - sort-desc, + sort-by='orderPriority', + sort, hide-default-footer @page-count="pageTotal = $event" ) template(slot='item', slot-scope='props') tr.is-clickable(:active='props.selected', @click='$router.push(`/pages/` + props.item.id)') td.text-xs-right {{ props.item.id }} - td - .body-2: strong {{ props.item.title }} - .caption {{ props.item.description }} - td.admin-pages-path - v-chip(label, small, :color='$vuetify.theme.dark ? `grey darken-4` : `grey lighten-4`') {{ props.item.locale }} - span.ml-2.grey--text(:class='$vuetify.theme.dark ? `text--lighten-1` : `text--darken-2`') / {{ props.item.path }} - td {{ props.item.createdAt | moment('calendar') }} - td {{ props.item.updatedAt | moment('calendar') }} td v-edit-dialog( :return-value.sync='props.item.orderPriority' + :disabled='!selectedGroup' @open='startEdit(props.item)' - @save='savePriority(props.item)' + @save='saveEdit(props.item)' @cancel='cancelEdit()' large persistent @@ -102,9 +95,18 @@ single-line autofocus :rules='[v => !!v || "Priority is required", v => v >= 0 || "Must be positive"]' + :disabled='!selectedGroup' @keydown.enter='saveEdit(props.item)' - @keydown.esc='cancelEdit' + @keydown.esc='cancelEdit()' ) + td + .body-2: strong {{ props.item.title }} + .caption {{ props.item.description }} + td.admin-pages-path + v-chip(label, small, :color='$vuetify.theme.dark ? `grey darken-4` : `grey lighten-4`') {{ props.item.locale }} + span.ml-2.grey--text(:class='$vuetify.theme.dark ? `text--lighten-1` : `text--darken-2`') / {{ props.item.path }} + td {{ props.item.createdAt | moment('calendar') }} + td {{ props.item.updatedAt | moment('calendar') }} template(slot='no-data') v-alert.ma-3(icon='mdi-alert', :value='true', outlined) No pages to display. .text-center.py-2.animated.fadeInDown(v-if='this.pageTotal > 1') @@ -114,6 +116,7 @@