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

EcrituresNumeriques / stylo / 19107917462

05 Nov 2025 03:54PM UTC coverage: 39.807% (-0.003%) from 39.81%
19107917462

push

github

web-flow
fix(article): lien relatif pour l'annotation (#1756)

Co-authored-by: Thomas Parisot <thom4parisot@users.noreply.github.com>

614 of 862 branches covered (71.23%)

Branch coverage included in aggregate %.

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

6166 of 16170 relevant lines covered (38.13%)

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'
×
NEW
5
import { Link, 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')
×
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">
×
NEW
131
            <Link
×
NEW
132
              to="annotate"
×
NEW
133
              relative={true}
×
134
              title={t('article.annotate.button')}
×
135
              target="_blank"
×
136
              rel="noopener noreferrer"
×
137
              className={styles.external}
×
138
            >
139
              {t('annotate.title')}
×
NEW
140
            </Link>
×
141
          </li>
×
142
        </ul>
×
143
      )}
144

145
      <div className={styles.content}>
×
146
        {activeMenu === 'metadata' && (
×
147
          <ArticleMetadata
×
148
            onBack={handleNavigateBack}
×
149
            articleId={articleId}
×
150
            versionId={versionId}
×
151
          />
×
152
        )}
153
        {activeMenu === 'toc' && (
×
154
          <ArticleTableOfContents onBack={handleNavigateBack} />
×
155
        )}
156
        {activeMenu === 'bibliography' && (
×
157
          <ArticleBibliography
×
158
            articleId={articleId}
×
159
            onBack={handleNavigateBack}
×
160
          />
×
161
        )}
162
        {activeMenu === 'export' && (
×
163
          <>
×
164
            <h2
×
165
              className={styles.title}
×
166
              onClick={handleNavigateBack}
×
167
              style={{ cursor: 'pointer', userSelect: 'none' }}
×
168
            >
169
              <span style={{ display: 'flex' }}>
×
170
                <ArrowLeft style={{ strokeWidth: 3 }} />
×
171
              </span>
×
172
              <span>{t('export.title')}</span>
×
173
            </h2>
×
174
            <Export
×
175
              articleId={articleId}
×
176
              name={article?.title}
×
177
              bib={article?.workingVersion?.bibPreview}
×
178
            />
×
179
          </>
×
180
        )}
181
        {activeMenu === 'versions' && (
×
182
          <CollaborativeVersions
×
183
            articleId={articleId}
×
184
            selectedVersion={versionId}
×
185
            showTitle={true}
×
186
            onBack={handleNavigateBack}
×
187
          />
×
188
        )}
189
      </div>
×
190
    </Sidebar>
×
191
  )
192
}
×
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