From 7bcfcb9b5be70369213b507b34aae984e88f4eda Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Wed, 25 Mar 2020 09:49:29 -0400 Subject: [PATCH] Save layout options query (#246) * Add getPresetForCollection method * Add savePreset action * Add useSync composition * Sync collection presets with store / api * Clean up browse flow * Cleanup tabular code * Move portal target to browse page * Save column widths to view options * Add must-sort prop to v-table * Add saving flow for viewQuery / viewOptions * Optimize saving flow * Provide main element to sub components * Add per page option * Add field setup drawer detail --- src/components/v-table/readme.md | 1 + .../v-table/table-header/table-header.vue | 40 +- src/components/v-table/v-table.vue | 5 + src/compositions/readme.md | 3 + src/compositions/use-sync/index.ts | 4 + src/compositions/use-sync/readme.md | 31 ++ src/compositions/use-sync/use-sync.ts | 17 + src/lang/en-US/index.json | 3 - src/lang/en-US/layouts.json | 83 +-- src/layouts/tabular/tabular.vue | 518 +++++++++++++----- .../collections/routes/browse/browse.vue | 195 +++++-- .../collection-presets.test.ts | 342 +++++++++--- .../collection-presets/collection-presets.ts | 89 ++- .../default-collection-preset.ts | 14 + src/stores/collection-presets/types.ts | 2 +- .../components/header-bar/header-bar.vue | 2 - src/views/private/private-view.vue | 4 +- 17 files changed, 1050 insertions(+), 303 deletions(-) create mode 100644 src/compositions/use-sync/index.ts create mode 100644 src/compositions/use-sync/readme.md create mode 100644 src/compositions/use-sync/use-sync.ts create mode 100644 src/stores/collection-presets/default-collection-preset.ts diff --git a/src/components/v-table/readme.md b/src/components/v-table/readme.md index 90cfe4cf85..76182e8055 100644 --- a/src/components/v-table/readme.md +++ b/src/components/v-table/readme.md @@ -126,6 +126,7 @@ export default defineComponent({ | `loadingText` | What text to show when table is loading with no items | `Loading...` | | `server-sort` | Handle sorting on the parent level. | `false` | | `row-height` | Height of the individual rows in px | `48` | +| `must-sort` | Requires the sort to be on a particular column | `false` | ## Events | Event | Description | Value | diff --git a/src/components/v-table/table-header/table-header.vue b/src/components/v-table/table-header/table-header.vue index d6f292d656..21e506e32b 100644 --- a/src/components/v-table/table-header/table-header.vue +++ b/src/components/v-table/table-header/table-header.vue @@ -79,6 +79,10 @@ export default defineComponent({ type: Boolean, default: false, }, + mustSort: { + type: Boolean, + default: false, + }, }, setup(props, { emit }) { const dragging = ref(false); @@ -124,33 +128,35 @@ export default defineComponent({ return classes; } - /** - * If current sort is not this field, use this field in ascending order - * If current sort is field, reverse sort order to descending - * If current sort is field and sort is desc, set sort field to null (default) - */ function changeSort(header: Header) { if (header.sortable === false) return; if (dragging.value === true) return; if (header.value === props.sort.by) { + if (props.mustSort) { + return emit('update:sort', { + by: props.sort.by, + desc: !props.sort.desc, + }); + } + if (props.sort.desc === false) { - emit('update:sort', { + return emit('update:sort', { by: props.sort.by, desc: true, }); - } else { - emit('update:sort', { - by: null, - desc: false, - }); } - } else { - emit('update:sort', { - by: header.value, + + return emit('update:sort', { + by: null, desc: false, }); } + + return emit('update:sort', { + by: header.value, + desc: false, + }); } function toggleSelectAll() { @@ -286,6 +292,8 @@ export default defineComponent({ width: 5px; height: 100%; cursor: ew-resize; + opacity: 0; + transition: opacity var(--fast) var(--transition); &::after { position: relative; @@ -301,5 +309,9 @@ export default defineComponent({ background-color: var(--input-action-color-hover); } } + + th:hover .resize-handle { + opacity: 1; + } } diff --git a/src/components/v-table/v-table.vue b/src/components/v-table/v-table.vue index 1b9ac5dee9..3d03ab162a 100644 --- a/src/components/v-table/v-table.vue +++ b/src/components/v-table/v-table.vue @@ -15,6 +15,7 @@ :all-items-selected="allItemsSelected" :fixed="fixedHeader" :show-manual-sort="showManualSort" + :must-sort="mustSort" @toggle-select-all="onToggleSelectAll" >