3 Commits 0f7ed99ab3 ... 7e5f88f0d5

Autor SHA1 Mensagem Data
  axolotle 7e5f88f0d5 add Debug view 3 anos atrás
  axolotle 4017046049 fix authors sorting and add custom ordering on alphabetical list view 3 anos atrás
  axolotle c027c3a8f6 reorder children by text type 3 anos atrás

+ 26 - 0
src/api/queries/debug.gql

@@ -0,0 +1,26 @@
+{
+  allmapitems {
+    type: __typename
+    id
+    ... on Creation {
+      text_en_rebond: rebonds { id }
+      text_de_depart: texte_de_depart { id }
+    }
+    ... on Textref {
+      text_de_depart { id }
+      text_produits { id }
+      text_en_rebond { id }
+      field_creations { id }
+      field_titre_regular
+      field_titre_italique
+      auteurs { id }
+    }
+    ... on Textprod {
+      text_de_depart { id }
+      text_en_rebond { id }
+      field_titre_regular
+      field_titre_italique
+      auteurs { id }
+    }
+  }
+}

+ 3 - 1
src/components/nodes/NodeView.vue

@@ -11,6 +11,7 @@
         v-bind="{ node, mode, showOrigin }"
         class="node-view-header"
         :class="{ scrolling: scrollValue }"
+        :first-char="firstChar"
       />
 
       <node-view-body v-bind="{ node, type: nodeType, mode }" :class="{ scrolling: scrollValue }"/>
@@ -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 () {

+ 7 - 3
src/components/nodes/NodeViewChildList.vue

@@ -2,7 +2,7 @@
   <nav class="node-view-child-list" :class="{ 'smartphone': smartphone }">
     <ul>
       <li
-        v-for="(child, i) in children" :key="child.id"
+        v-for="(child, i) in orderedChildren" :key="child.id"
         class="node-view-child-list-item"
       >
         <dot-button
@@ -21,7 +21,7 @@
 
 <script>
 import { mapGetters } from 'vuex'
-
+import { orderByVariant } from '@/helpers/common'
 
 export default {
   name: 'NodeViewChildList',
@@ -37,7 +37,11 @@ export default {
   },
 
   computed: {
-    ...mapGetters(['activeNodes'])
+    ...mapGetters(['activeNodes']),
+
+    orderedChildren () {
+      return orderByVariant(this.children)
+    }
   },
 
   methods: {

+ 9 - 1
src/components/nodes/NodeViewChildListGroup.vue

@@ -3,7 +3,7 @@
     <b-collapse :id="'collapse-child-list-' + id" v-model="visible">
       <b-list-group>
         <b-list-group-item
-          v-for="child in children" :key="child.id"
+          v-for="child in orderedChildren" :key="child.id"
           :variant="child.variant"
           href="javascript:;"
           @click="$parent.$emit('open-child', { childId: child.id })"
@@ -28,6 +28,8 @@
 </template>
 
 <script>
+import { orderByVariant } from '@/helpers/common'
+
 export default {
   name: 'NodeViewChildListGroup',
 
@@ -40,6 +42,12 @@ export default {
     return {
       visible: window.innerWidth > 769
     }
+  },
+
+  computed: {
+    orderedChildren () {
+      return orderByVariant(this.children)
+    }
   }
 }
 </script>

+ 2 - 1
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: {

+ 3 - 1
src/components/nodes/NodeViewHeaderRef.vue

@@ -16,6 +16,7 @@
         :node="node" tag="h4"
         block edition url
         class="mr-auto"
+        :first-char="firstChar"
       />
     </div>
   </div>
@@ -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: {

+ 17 - 2
src/components/nodes/NodeViewTitle.vue

@@ -11,7 +11,7 @@
     >
       <slot name="default" />
       <span>
-        <strong>{{ toCommaList(node.authors) }}</strong>,
+        <strong>{{ authors }}</strong>,
         <button-url v-if="url && node.piece && node.piece.url" :link="node.piece" />
         <button-url v-if="url && node.link && node.link.url" :link="node.link" />
       </span>
@@ -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,

+ 15 - 0
src/helpers/common.js

@@ -9,6 +9,21 @@ export function toCommaList (arr, key = 'name') {
   return arr.map(item => item[key]).join(', ')
 }
 
+export function orderByVariant (arr) {
+  const orderedVariants = [
+    'lecture',
+    'reflexion',
+    'critique',
+    'sensible',
+    'echo',
+    'kit',
+    'creation'
+  ]
+  return [...arr].sort((a, b) => {
+    return orderedVariants.indexOf(a.variant) > orderedVariants.indexOf(b.variant)
+  })
+}
+
 
 export function shuffle (a) {
   let j, x, i

+ 115 - 0
src/pages/Debug.vue

@@ -0,0 +1,115 @@
+<template>
+  <div class="">
+    <h1>Debug</h1>
+
+    <p v-if="!data">Loading...</p>
+
+    <div v-if="prodNoParent.length">
+      <h2>Textes produit sans parent</h2>
+      <p>Si jamais c'est pas volontaire, ceux-ci risquent de n'être jamais accessibles</p>
+
+      <ul>
+        <li v-for="node in prodNoParent" :key="node.id">
+          TextProd n°{{ node.id }}
+          <b-button
+            variant="kit" class="btn-edit"
+            :href="node.link" target="_blank"
+          >
+            Éditer
+          </b-button>
+        </li>
+      </ul>
+    </div>
+
+    <div v-if="noTitles.length">
+      <h2>Textes de référence sans titre ou sans auteur⋅ices</h2>
+
+      <ul>
+        <li v-for="node in noTitles" :key="node.id">
+          TextRef n°{{ node.id }} (manque: {{ node.miss }})
+          <b-button
+            variant="kit" class="btn-edit"
+            :href="node.link" target="_blank"
+          >
+            Éditer
+          </b-button>
+        </li>
+      </ul>
+    </div>
+
+    <div v-if="dupps.length">
+      <h2>Textes de référence avec enfants en doublons</h2>
+      <p>Ceux-ci sembleraient venir du fait qu'un texte de référence ai été renseigné dans le champs Texte Produits, et automagiquement duppliqué dans le champs Création</p>
+      <p>Il est actuellement nécessaire de supprimer les 2 références du texte (dans Textes Produits et dans Créations) car un texte de référence ne peut être défini comme un texte produit</p>
+
+      <ul>
+        <li v-for="dupp in dupps" :key="dupp.id">
+          Textref n°{{ dupp.id }} contient les doublons suivants: {{ dupp.nodes }}
+          <b-button
+            variant="kit" class="btn-edit"
+            :href="dupp.link" target="_blank"
+          >
+            Éditer
+          </b-button>
+        </li>
+      </ul>
+    </div>
+  </div>
+</template>
+
+<script>
+import DebugQuery from '@/api/queries/debug.gql'
+import api from '@/api'
+
+export default {
+  name: 'Page',
+
+  data () {
+    return {
+      data: undefined,
+      dupps: [],
+      noTitles: [],
+      prodNoParent: []
+    }
+  },
+
+  async created () {
+    const data = (await api.query(DebugQuery)).allmapitems
+    data.forEach((node) => {
+      const link = `/api/node/${node.id}/edit?destination=/api/node/${node.id}`
+      if (node.type === 'Textref') {
+        if (node.field_creations) {
+          const children = [...node.field_creations, ...(node.text_produits || [])]
+          const dupps = []
+          const uniqueChildren = new Set()
+          children.forEach(({ id }) => {
+            if (uniqueChildren.has(id)) {
+              dupps.push(id)
+            }
+            uniqueChildren.add(id)
+          })
+          if (dupps.length) {
+            this.dupps.push({ id: node.id, nodes: dupps, link })
+          }
+        }
+        const miss = {
+          titre: !node.field_titre_regular && !node.field_titre_italique,
+          'auteur⋅ices': !node.auteurs
+        }
+        if ((!node.field_titre_regular && !node.field_titre_italique) || !node.auteurs) {
+          this.noTitles.push({ ...node, link, miss: Object.keys(miss).filter(key => miss[key]) })
+        }
+      }
+      if (node.type === 'Textprod') {
+        if (!node.text_de_depart || node.text_de_depart.length < 1) {
+          this.prodNoParent.push({ ...node, link })
+        }
+      }
+    })
+    this.data = data
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 1 - 0
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"
             />
           </div>
         </div>

+ 6 - 0
src/router/routes.js

@@ -65,6 +65,12 @@ export default [
     component: () => import(/* webpackChunkName: "blog" */ '@/pages/Page')
   },
 
+  {
+    name: 'debug',
+    path: '/debug',
+    component: () => import(/* webpackChunkName: "debug" */ '@/pages/Debug')
+  },
+
   {
     name: 'notfound',
     path: '/404',

+ 1 - 2
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)]
       })
     },