• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

EcrituresNumeriques / stylo / 19074791088

04 Nov 2025 03:59PM UTC coverage: 39.819% (-0.002%) from 39.821%
19074791088

push

github

ggrossetie
fix: Récupère les informations de l'article à partir du router pour l'export

614 of 862 branches covered (71.23%)

Branch coverage included in aggregate %.

0 of 3 new or added lines in 1 file covered. (0.0%)

6166 of 16165 relevant lines covered (38.14%)

2.55 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/front/src/components/collaborative/CollaborativeEditorMenu.jsx
1
import clsx from 'clsx'
×
2
import { ArrowLeft, ChevronRight } from 'lucide-react'
×
3
import React, { useCallback } from 'react'
×
4
import { useTranslation } from 'react-i18next'
×
5
import { useRouteLoaderData } from 'react-router'
×
6

7
import { trackEvent } from '../../helpers/analytics.js'
×
8
import { usePreferenceItem } from '../../hooks/user.js'
×
9

10
import Export from '../Export.jsx'
×
11
import Sidebar from '../Sidebar.jsx'
×
12
import ArticleMetadata from '../Write/ArticleMetadata.jsx'
×
13
import ArticleBibliography from '../bibliography/ArticleBibliography.jsx'
×
14
import ArticleTableOfContents from './ArticleTableOfContents.jsx'
×
15
import CollaborativeVersions from './CollaborativeVersions.jsx'
×
16

17
import styles from './CollaborativeEditorMenu.module.scss'
×
18

19
export default function CollaborativeEditorMenu({
×
20
  articleId,
×
21
  className,
×
22
  versionId,
×
23
}) {
×
24
  const { user } = useRouteLoaderData('app')
×
NEW
25
  const { article } = useRouteLoaderData('article')
×
26
  const { t } = useTranslation()
×
27
  const { value: opened, toggleValue: setOpened } = usePreferenceItem(
×
28
    'expandSidebarRight',
×
29
    'article'
×
30
  )
×
31
  const { value: activeMenu, setValue: setActiveMenu } = usePreferenceItem(
×
32
    'activePanel',
×
33
    'article'
×
34
  )
×
35

36
  const handleNavigateBack = useCallback(() => {
×
37
    trackEvent('ArticleMenuNavigation', 'back', '', '', {
×
38
      articleId,
×
39
      userId: user._id,
×
40
    })
×
41
    setActiveMenu(null)
×
42
  }, [setActiveMenu])
×
43

44
  const handleNavigateTo = useCallback(
×
45
    (name) => {
×
46
      trackEvent('ArticleMenuNavigation', 'goto', name, '', {
×
47
        articleId,
×
48
        userId: user._id,
×
49
      })
×
50
      setActiveMenu(name)
×
51
    },
×
52
    [setActiveMenu]
×
53
  )
×
54

55
  return (
×
56
    <Sidebar
×
57
      className={clsx(className, opened && styles.opened)}
×
58
      opened={opened}
×
59
      setOpened={setOpened}
×
60
      labelOpened={t('editorMenu.open.label')}
×
61
      labelClosed={t('editorMenu.close.label')}
×
62
    >
63
      {!activeMenu && (
×
64
        <ul
×
65
          className={styles.entries}
×
66
          role="menubar"
×
67
          aria-orientation="vertical"
×
68
        >
69
          <li role="menuitem">
×
70
            <button onClick={() => handleNavigateTo('toc')}>
×
71
              {t('toc.title')}
×
72
              <ChevronRight
×
73
                style={{ strokeWidth: 3 }}
×
74
                height={32}
×
75
                width={32}
×
76
                aria-hidden
×
77
              />
×
78
            </button>
×
79
          </li>
×
80

81
          <li role="menuitem">
×
82
            <button onClick={() => handleNavigateTo('metadata')}>
×
83
              {t('metadata.title')}
×
84
              <ChevronRight
×
85
                style={{ strokeWidth: 3 }}
×
86
                height={32}
×
87
                width={32}
×
88
                aria-hidden
×
89
              />
×
90
            </button>
×
91
          </li>
×
92

93
          <li role="menuitem">
×
94
            <button onClick={() => handleNavigateTo('bibliography')}>
×
95
              {t('bibliography.title')}
×
96
              <ChevronRight
×
97
                style={{ strokeWidth: 3 }}
×
98
                height={32}
×
99
                width={32}
×
100
                aria-hidden
×
101
              />
×
102
            </button>
×
103
          </li>
×
104

105
          <li role="menuitem">
×
106
            <button onClick={() => handleNavigateTo('versions')}>
×
107
              {t('versions.title')}
×
108
              <ChevronRight
×
109
                style={{ strokeWidth: 3 }}
×
110
                height={32}
×
111
                width={32}
×
112
                aria-hidden
×
113
              />
×
114
            </button>
×
115
          </li>
×
116
          <li role="menuitem">
×
117
            <button
×
118
              onClick={() => handleNavigateTo('export')}
×
119
              title={t('write.title.buttonExport')}
×
120
            >
121
              {t('export.title')}
×
122
              <ChevronRight
×
123
                style={{ strokeWidth: 3 }}
×
124
                height={32}
×
125
                width={32}
×
126
                aria-hidden
×
127
              />
×
128
            </button>
×
129
          </li>
×
130
          <li role="menuitem">
×
131
            <a
×
132
              href={`/article/${articleId}/annotate`}
×
133
              title={t('article.annotate.button')}
×
134
              target="_blank"
×
135
              rel="noopener noreferrer"
×
136
              className={styles.external}
×
137
            >
138
              {t('annotate.title')}
×
139
            </a>
×
140
          </li>
×
141
        </ul>
×
142
      )}
143

144
      <div className={styles.content}>
×
145
        {activeMenu === 'metadata' && (
×
146
          <ArticleMetadata
×
147
            onBack={handleNavigateBack}
×
148
            articleId={articleId}
×
149
            versionId={versionId}
×
150
          />
×
151
        )}
152
        {activeMenu === 'toc' && (
×
153
          <ArticleTableOfContents onBack={handleNavigateBack} />
×
154
        )}
155
        {activeMenu === 'bibliography' && (
×
156
          <ArticleBibliography
×
157
            articleId={articleId}
×
158
            onBack={handleNavigateBack}
×
159
          />
×
160
        )}
161
        {activeMenu === 'export' && (
×
162
          <>
×
163
            <h2
×
164
              className={styles.title}
×
165
              onClick={handleNavigateBack}
×
166
              style={{ cursor: 'pointer', userSelect: 'none' }}
×
167
            >
168
              <span style={{ display: 'flex' }}>
×
169
                <ArrowLeft style={{ strokeWidth: 3 }} />
×
170
              </span>
×
171
              <span>{t('export.title')}</span>
×
172
            </h2>
×
173
            <Export
×
174
              articleId={articleId}
×
NEW
175
              name={article?.title}
×
NEW
176
              bib={article?.workingVersion?.bibPreview}
×
177
            />
×
178
          </>
×
179
        )}
180
        {activeMenu === 'versions' && (
×
181
          <CollaborativeVersions
×
182
            articleId={articleId}
×
183
            selectedVersion={versionId}
×
184
            showTitle={true}
×
185
            onBack={handleNavigateBack}
×
186
          />
×
187
        )}
188
      </div>
×
189
    </Sidebar>
×
190
  )
191
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc