clientjs/packages/dashboard-components/src/pages/term.jsx
changeset 0 5f4fcbc80b37
child 4 df751568fda6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clientjs/packages/dashboard-components/src/pages/term.jsx	Fri Sep 14 17:57:34 2018 +0200
@@ -0,0 +1,135 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
+
+import { FormattedMessage } from 'react-intl';
+import {
+  Tab,
+  Tabs,
+  TabList,
+  TabPanel,
+} from 'react-tabs';
+
+import AnnotationsCards from '../ui/AnnotationsCards';
+import DefinitionsCards from '../ui/DefinitionsCards';
+import IssoThread from '../ui/IssoThread';
+import { toBase64 } from '../utils';
+
+import './term.scss';
+
+const TermPage = ({
+  term,
+  term64,
+  defAndRef: defAndRefProp,
+  messageId,
+  activeTab,
+  location,
+  metacategories,
+  topics,
+  viaBaseUrl,
+  discussionUrl,
+}) => {
+  const defAndRef = defAndRefProp || { definitions: [], references: [] };
+  let { pathname } = location;
+  const m = pathname.match(/(\/[^/]+\/[^/]+)(?:\/\d)?(?:\/.+)?/);
+  pathname = m ? m[1] : pathname;
+  return (
+    <div className="term-entry">
+      <h2>{term}</h2>
+      <Tabs selectedTabPanelClassName="show active" selectedTabClassName="active" defaultIndex={activeTab || 0} forceRenderTabPanel>
+        <TabList className="nav nav-tabs">
+          <Tab className="nav-item nav-link">
+            <FormattedMessage id="pages.glossary.definitions" defaultMessage="Definitions" />
+            {' ('}
+            {defAndRef.definitions && defAndRef.definitions.length}
+            {')'}
+          </Tab>
+          <Tab className="nav-item nav-link">
+            <FormattedMessage id="pages.glossary.references" defaultMessage="References" />
+            {' ('}
+            {defAndRef.references && defAndRef.references.length}
+            {')'}
+          </Tab>
+          <Tab className="nav-item nav-link">
+            <FormattedMessage id="pages.glossary.discussions" defaultMessage="Discussions" />
+            {' ('}
+            {defAndRef.messagesCount}
+            {')'}
+          </Tab>
+        </TabList>
+        <div className="tab-content term-tab-content">
+          <TabPanel className="tab-pane fade">
+            <DefinitionsCards annotations={defAndRef.definitions} metacategories={metacategories}><h4 className="text-muted text-capitalize"><FormattedMessage id="page.term.noDefinition" defaultMessage="No definition yet" /></h4></DefinitionsCards>
+          </TabPanel>
+          <TabPanel className="tab-pane fade">
+            <AnnotationsCards
+              annotations={defAndRef.references}
+              viaBaseUrl={viaBaseUrl}
+              metacategories={metacategories}
+              categories={topics}
+            >
+              <h4 className="text-muted text-capitalize">
+                <FormattedMessage id="page.term.noReference" defaultMessage="No reference yet" />
+              </h4>
+            </AnnotationsCards>
+          </TabPanel>
+          <TabPanel className="tab-pane fade">
+            <IssoThread
+              issoId={term64}
+              pathname={`${pathname}/2`}
+              messageId={messageId}
+              discussionUrl={discussionUrl}
+            />
+          </TabPanel>
+        </div>
+      </Tabs>
+    </div>
+  );
+};
+
+TermPage.propTypes = {
+  location: PropTypes.object.isRequired,
+  term: PropTypes.string.isRequired,
+  term64: PropTypes.string.isRequired,
+  viaBaseUrl: PropTypes.string.isRequired,
+  discussionUrl: PropTypes.string.isRequired,
+  defAndRef: PropTypes.object,
+  messageId: PropTypes.string,
+  activeTab: PropTypes.number,
+  metacategories: PropTypes.arrayOf(PropTypes.object).isRequired,
+  topics: PropTypes.arrayOf(PropTypes.string).isRequired,
+  dashboardId: PropTypes.string, // eslint-disable-line react/no-unused-prop-types
+};
+
+TermPage.defaultProps = {
+  defAndRef: {},
+  messageId: null,
+  activeTab: 0,
+  dashboardId: '',
+};
+
+export default connect(
+  (state, props) => {
+    const { match, dashboardId } = props;
+    const { params } = match;
+
+    let { term } = (params || {});
+    term = term ? decodeURIComponent(term) : term;
+
+    const defAndRef = term ? state.terms[term] : {};
+
+    const term64 = toBase64(dashboardId ? `${dashboardId}::${term}` : term);
+
+    const { messageId } = (params || {});
+
+    const activeTab = Number((match.params || {}).activeTab || 0);
+
+    return {
+      term,
+      term64,
+      defAndRef,
+      messageId,
+      activeTab,
+    };
+  },
+)(TermPage);