clientjs/packages/dashboard-components/src/ui/TermEntry.jsx
changeset 0 5f4fcbc80b37
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clientjs/packages/dashboard-components/src/ui/TermEntry.jsx	Fri Sep 14 17:57:34 2018 +0200
@@ -0,0 +1,84 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { NavLink } from 'react-router-dom';
+import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
+import md5 from 'md5';
+
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+
+import './TermEntry.scss';
+
+
+function getTermDefinition(annotation) {
+  if (annotation.text) {
+    return annotation.text;
+  }
+
+  let selector;
+
+  if (annotation.target[0].selector) {
+    selector = annotation.target[0].selector.find(s => s.type === 'TextQuoteSelector');
+  }
+
+  if (selector) {
+    return selector.exact;
+  }
+  return '';
+}
+
+const TermEntry = ({ term, termDef, intl }) => {
+  const key = `${md5(term)}-term-entry`;
+
+  let firstDefinition = '';
+
+  if (termDef.definitions.length > 0) {
+    firstDefinition = getTermDefinition(termDef.definitions[0]);
+  }
+  if (!firstDefinition) {
+    firstDefinition = <span className="text-muted font-italic"><FormattedMessage id="ui.termEntry.noDefinition" defaultMessage="No definition yet" /></span>;
+  }
+
+  const definitionsTitle = intl.formatMessage({ id: 'ui.termEntry.nbDefinitions', defaultMessage: 'Nb. definitions' });
+  const referencesTitle = intl.formatMessage({ id: 'ui.termEntry.nbReferences', defaultMessage: 'Nb. references' });
+  const commentsTitle = intl.formatMessage({ id: 'ui.termEntry.nbComments', defaultMessage: 'Nb. comments' });
+
+  return (
+    <tr id={key}>
+      <th scope="row" className="term-entry-term"><NavLink to={`/term/${encodeURIComponent(term)}`} className="term-entry-term-link">{term}</NavLink></th>
+      <td className="term-entry-def">
+        <p>{firstDefinition}</p>
+        <p className="glossary-table-counts align-text-bottom text-right text-muted small">
+          <span title={definitionsTitle}>
+            <NavLink to={`/term/${encodeURIComponent(term)}`} className="term-entry-term-link">
+              <FontAwesomeIcon icon="file-alt" />
+              {' '}
+              <span>{ termDef.definitions.length }</span>
+            </NavLink>
+          </span>
+          <span title={referencesTitle}>
+            <NavLink to={`/term/${encodeURIComponent(term)}/1`} className="term-entry-term-link">
+              <FontAwesomeIcon icon="share-alt" />
+              {' '}
+              <span>{ termDef.references.length }</span>
+            </NavLink>
+          </span>
+          <span title={commentsTitle}>
+            <NavLink to={`/term/${encodeURIComponent(term)}/2`} className="term-entry-term-link">
+              <FontAwesomeIcon icon="comments" />
+              {' '}
+              <span>{ termDef.messagesCount || 0 }</span>
+            </NavLink>
+          </span>
+        </p>
+      </td>
+    </tr>
+  );
+};
+
+TermEntry.propTypes = {
+  term: PropTypes.string.isRequired,
+  termDef: PropTypes.object.isRequired,
+  intl: intlShape.isRequired,
+};
+
+export default injectIntl(TermEntry);