From 4017046049c5e970aa0acee7112a3598316ac7a2 Mon Sep 17 00:00:00 2001 From: axolotle Date: Fri, 27 May 2022 20:58:20 +0200 Subject: [PATCH] fix authors sorting and add custom ordering on alphabetical list view --- src/components/nodes/NodeView.vue | 4 +++- src/components/nodes/NodeViewHeaderProd.vue | 3 ++- src/components/nodes/NodeViewHeaderRef.vue | 4 +++- src/components/nodes/NodeViewTitle.vue | 19 +++++++++++++++++-- src/pages/library/LibraryList.vue | 1 + src/store/modules/library.js | 3 +-- 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/components/nodes/NodeView.vue b/src/components/nodes/NodeView.vue index fbeca4f..588f34d 100644 --- a/src/components/nodes/NodeView.vue +++ b/src/components/nodes/NodeView.vue @@ -11,6 +11,7 @@ v-bind="{ node, mode, showOrigin }" class="node-view-header" :class="{ scrolling: scrollValue }" + :first-char="firstChar" /> @@ -63,7 +64,8 @@ export default { forceType: { type: String, default: null }, mode: { type: String, default: 'view' }, preview: { type: Boolean, default: false }, - showOrigin: { type: Boolean, default: false } + showOrigin: { type: Boolean, default: false }, + firstChar: { type: [String, null], default: null } }, data () { diff --git a/src/components/nodes/NodeViewHeaderProd.vue b/src/components/nodes/NodeViewHeaderProd.vue index aa45656..a6967a6 100644 --- a/src/components/nodes/NodeViewHeaderProd.vue +++ b/src/components/nodes/NodeViewHeaderProd.vue @@ -33,7 +33,8 @@ export default { props: { node: { type: Object, required: true }, mode: { type: String, required: true }, - showOrigin: { type: Boolean, required: true } + showOrigin: { type: Boolean, required: true }, + firstChar: { type: [String, null], default: null } }, computed: { diff --git a/src/components/nodes/NodeViewHeaderRef.vue b/src/components/nodes/NodeViewHeaderRef.vue index fa964d2..c9b0b8a 100644 --- a/src/components/nodes/NodeViewHeaderRef.vue +++ b/src/components/nodes/NodeViewHeaderRef.vue @@ -16,6 +16,7 @@ :node="node" tag="h4" block edition url class="mr-auto" + :first-char="firstChar" /> @@ -36,7 +37,8 @@ export default { props: { node: { type: Object, required: true }, - mode: { type: String, required: true } + mode: { type: String, required: true }, + firstChar: { type: [String, null], default: null } }, methods: { diff --git a/src/components/nodes/NodeViewTitle.vue b/src/components/nodes/NodeViewTitle.vue index 83403e9..62b1626 100644 --- a/src/components/nodes/NodeViewTitle.vue +++ b/src/components/nodes/NodeViewTitle.vue @@ -11,7 +11,7 @@ > - {{ toCommaList(node.authors) }}, + {{ authors }}, @@ -44,7 +44,8 @@ export default { block: { type: Boolean, default: false }, edition: { type: Boolean, default: false }, noDate: { type: Boolean, default: false }, - url: { type: Boolean, default: false } + url: { type: Boolean, default: false }, + firstChar: { type: [String, null], default: null } }, data () { @@ -52,6 +53,20 @@ export default { } }, + computed: { + authors () { + if (!this.firstChar || this.node.authors.length < 2) return toCommaList(this.node.authors) + const authors = [...this.node.authors].sort((a, b) => a.last_name.localeCompare(b.last_name)) + const first = this.node.authors.filter(author => author.last_name.startsWith(this.firstChar)) + first.forEach((author) => { + const index = authors.indexOf(author) + authors.splice(index, 1) + authors.unshift(author) + }) + return toCommaList(authors) + } + }, + methods: { trim, toCommaList, diff --git a/src/pages/library/LibraryList.vue b/src/pages/library/LibraryList.vue index ecde3bf..d4972c2 100644 --- a/src/pages/library/LibraryList.vue +++ b/src/pages/library/LibraryList.vue @@ -17,6 +17,7 @@ @open-node="$emit('open-node', $event)" @open-child="$emit('open-node', { parentId: node.id, ...$event })" :style="`--opacity: ${getStrangenessOpacity(strangeness, node)};`" + :first-char="char" /> diff --git a/src/store/modules/library.js b/src/store/modules/library.js index 84cf183..a7c7ed0 100644 --- a/src/store/modules/library.js +++ b/src/store/modules/library.js @@ -272,8 +272,7 @@ export default { return [group[0], group[1].sort((a, b) => { const prev = a.last_name.toLowerCase() const next = b.last_name.toLowerCase() - if (prev === next) return 0 - return prev < next ? -1 : 1 + return prev.localeCompare(next) }).map(node => node.node)] }) },