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

EcrituresNumeriques / stylo / 14067433582

25 Mar 2025 06:31PM UTC coverage: 31.801%. First build
14067433582

push

github

web-flow
chore: ajout d'une menu sur l'interface d'écriture collaborative (#1364)

* chore: ajout d'une menu sur l'interface d'écriture collaborative

* chore: affiche les métadonnées en lecture seule

470 of 703 branches covered (66.86%)

Branch coverage included in aggregate %.

3 of 281 new or added lines in 9 files covered. (1.07%)

4483 of 14872 relevant lines covered (30.14%)

2.26 hits per line

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

0.0
/front/src/components/Write/ArticleMetadata.jsx
NEW
1
import { Toggle } from '@geist-ui/core'
×
NEW
2
import YAML from 'js-yaml'
×
NEW
3
import React, { useCallback, useMemo, useState } from 'react'
×
NEW
4
import { ArrowLeft } from 'react-feather'
×
NEW
5
import { useTranslation } from 'react-i18next'
×
NEW
6
import { useDispatch, useSelector } from 'react-redux'
×
7

NEW
8
import styles from './articleEditorMetadata.module.scss'
×
9

NEW
10
import { toYaml } from './metadata/yaml.js'
×
NEW
11
import MonacoYamlEditor from './providers/monaco/YamlEditor'
×
NEW
12
import ArticleEditorMetadataForm from './yamleditor/ArticleEditorMetadataForm.jsx'
×
13

14
/**
15
 * @param {object} props
16
 * @param {(object) => void} props.onChange
17
 * @param {(object) => void} props.onBack
18
 * @param {boolean} props.readOnly
19
 * @param {object} props.metadata
20
 * @returns {Element}
21
 */
NEW
22
export default function ArticleMetadata({
×
NEW
23
  onChange,
×
NEW
24
  readOnly,
×
NEW
25
  onBack,
×
NEW
26
  metadata,
×
NEW
27
}) {
×
NEW
28
  const { t } = useTranslation()
×
NEW
29
  const dispatch = useDispatch()
×
NEW
30
  const selector = useSelector(
×
NEW
31
    (state) => state.articlePreferences.metadataFormMode
×
NEW
32
  )
×
NEW
33
  const yaml = useMemo(() => toYaml(metadata), [metadata])
×
NEW
34
  const [rawYaml, setRawYaml] = useState(yaml)
×
NEW
35
  const [error, setError] = useState('')
×
36

NEW
37
  const setSelector = useCallback(
×
NEW
38
    (value) =>
×
NEW
39
      dispatch({
×
NEW
40
        type: 'ARTICLE_PREFERENCES_TOGGLE',
×
NEW
41
        key: 'metadataFormMode',
×
NEW
42
        value,
×
NEW
43
      }),
×
NEW
44
    []
×
NEW
45
  )
×
46

NEW
47
  const handleFormUpdate = useCallback(
×
NEW
48
    (metadata) => {
×
NEW
49
      if (readOnly) {
×
NEW
50
        return
×
NEW
51
      }
×
NEW
52
      setRawYaml(toYaml(metadata))
×
NEW
53
      onChange(metadata)
×
NEW
54
    },
×
NEW
55
    [readOnly, setRawYaml, onChange]
×
NEW
56
  )
×
57

NEW
58
  const handleRawYamlChange = useCallback(
×
NEW
59
    (yaml) => {
×
NEW
60
      try {
×
NEW
61
        const [metadata = {}] = YAML.loadAll(yaml)
×
NEW
62
        setError('')
×
NEW
63
        onChange(metadata)
×
NEW
64
      } catch (err) {
×
NEW
65
        setError(err.message)
×
NEW
66
      } finally {
×
NEW
67
        setRawYaml(yaml)
×
NEW
68
      }
×
NEW
69
    },
×
NEW
70
    [setRawYaml]
×
NEW
71
  )
×
72

NEW
73
  const title = onBack ? (
×
NEW
74
    <h2
×
NEW
75
      className={styles.title}
×
NEW
76
      onClick={onBack}
×
NEW
77
      style={{ cursor: 'pointer', userSelect: 'none' }}
×
78
    >
NEW
79
      <span onClick={onBack} style={{ display: 'flex' }}>
×
NEW
80
        <ArrowLeft style={{ strokeWidth: 3 }} />
×
NEW
81
      </span>
×
NEW
82
      <span>{t('metadata.title')}</span>
×
NEW
83
    </h2>
×
84
  ) : (
NEW
85
    <h2 className={styles.title}>{t('metadata.title')}</h2>
×
86
  )
87

NEW
88
  return (
×
NEW
89
    <div className={styles.yamlEditor}>
×
NEW
90
      <header className={styles.header}>
×
NEW
91
        {title}
×
NEW
92
        <div
×
NEW
93
          className={styles.toggle}
×
NEW
94
          onClick={() => setSelector(selector === 'raw' ? 'basic' : 'raw')}
×
95
        >
NEW
96
          <Toggle
×
NEW
97
            id="raw-mode"
×
NEW
98
            checked={selector === 'raw'}
×
NEW
99
            title={t('metadata.showYaml')}
×
NEW
100
            onChange={(e) => {
×
NEW
101
              console.log(e)
×
NEW
102
              setSelector(e.target.checked ? 'raw' : 'basic')
×
NEW
103
            }}
×
NEW
104
          />
×
NEW
105
          <label htmlFor="raw-mode">YAML</label>
×
NEW
106
        </div>
×
NEW
107
      </header>
×
NEW
108
      {selector === 'raw' && (
×
NEW
109
        <>
×
NEW
110
          {error !== '' && <p className={styles.error}>{error}</p>}
×
NEW
111
          <MonacoYamlEditor
×
NEW
112
            readOnly={readOnly}
×
NEW
113
            height="calc(100vh - 280px)"
×
NEW
114
            fontSize="14"
×
NEW
115
            text={rawYaml}
×
NEW
116
            onTextUpdate={handleRawYamlChange}
×
NEW
117
          />
×
NEW
118
        </>
×
119
      )}
NEW
120
      {selector !== 'raw' && (
×
NEW
121
        <ArticleEditorMetadataForm
×
NEW
122
          readOnly={readOnly}
×
NEW
123
          metadata={metadata}
×
NEW
124
          error={(reason) => {
×
NEW
125
            setError(reason)
×
NEW
126
            if (reason !== '') {
×
NEW
127
              setSelector('raw')
×
NEW
128
            }
×
NEW
129
          }}
×
NEW
130
          onChange={handleFormUpdate}
×
NEW
131
        />
×
132
      )}
NEW
133
    </div>
×
134
  )
NEW
135
}
×
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