yuto-oweseek 4 лет назад
Родитель
Сommit
c5003d0594

+ 2 - 1
packages/app/package.json

@@ -56,8 +56,8 @@
     "@google-cloud/storage": "^5.8.5",
     "@growi/codemirror-textlint": "^4.4.4-RC.0",
     "@growi/plugin-attachment-refs": "^4.4.4-RC.0",
-    "@growi/plugin-pukiwiki-like-linker": "^4.4.4-RC.0",
     "@growi/plugin-lsx": "^4.4.4-RC.0",
+    "@growi/plugin-pukiwiki-like-linker": "^4.4.4-RC.0",
     "@growi/slack": "^4.4.4-RC.0",
     "@promster/express": "^5.0.1",
     "@promster/server": "^6.0.0",
@@ -129,6 +129,7 @@
     "prom-client": "^13.0.0",
     "react-card-flip": "^1.0.10",
     "react-image-crop": "^8.3.0",
+    "react-tagcloud": "^2.1.1",
     "reconnecting-websocket": "^4.4.0",
     "redis": "^3.0.2",
     "rimraf": "^3.0.0",

+ 42 - 0
packages/app/src/components/TagCloudContent.tsx

@@ -0,0 +1,42 @@
+import React, { FC } from 'react';
+import PropTypes from 'prop-types';
+
+import { TagCloud } from 'react-tagcloud';
+
+type Tags = {
+  _id: string,
+  name: string,
+  count: number,
+}
+
+type Props = {
+  tags:Tags[];
+}
+
+const MIN_FONT_SIZE = 12;
+const MAX_FONT_SIZE = 36;
+
+const TagCloudContent: FC<Props> = (props:Props) => {
+
+  return (
+    <>
+      <TagCloud
+        minSize={MIN_FONT_SIZE}
+        maxSize={MAX_FONT_SIZE}
+        tags={props.tags.map((tag) => {
+          return { value: tag.name, count: tag.count };
+        })}
+        style={{ cursor: 'pointer' }}
+        className="simple-cloud"
+        onClick={(target) => { window.location.href = `/_search?q=tag:${target.value}` }}
+      />
+    </>
+  );
+
+};
+
+TagCloudContent.propTypes = {
+  tags: PropTypes.array.isRequired,
+};
+
+export default TagCloudContent;

+ 6 - 2
packages/app/src/components/TagsList.jsx

@@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
 import { withTranslation } from 'react-i18next';
 
 import PaginationWrapper from './PaginationWrapper';
+import TagCloudContent from './TagCloudContent';
 
 class TagsList extends React.Component {
 
@@ -67,8 +68,11 @@ class TagsList extends React.Component {
     const messageForNoTag = this.state.tagData.length ? null : <h3>{ t('You have no tag, You can set tags on pages') }</h3>;
 
     return (
-      <div className="text-center">
-        <div className="tag-list">
+      <div className="row text-center">
+        <div className="col-12 mb-5">
+          <TagCloudContent tags={this.state.tagData} />
+        </div>
+        <div className="col-12 tag-list">
           <ul className="list-group text-left">
             {this.generateTagList(this.state.tagData)}
           </ul>

+ 1 - 1
packages/app/src/server/views/tags.html

@@ -6,7 +6,7 @@
 
 {% block layout_main %}
 <header class="py-0">
-  <h1 class="title">{{ t('Tags') }}</h1>
+  <h1 class="title text-center mt-5 font-weight-bold">{{ t('Tags') }}</h1>
 </header>
 
 <div class="container-fluid">

+ 15 - 1
yarn.lock

@@ -17049,7 +17049,7 @@ randombytes@^2.1.0:
   dependencies:
     safe-buffer "^5.1.0"
 
-randomcolor@>=0.5.4:
+randomcolor@>=0.5.4, randomcolor@^0.5.4:
   version "0.5.4"
   resolved "https://registry.yarnpkg.com/randomcolor/-/randomcolor-0.5.4.tgz#df615b13f25b89ea58c5f8f72647f0a6f07adcc3"
   integrity sha512-nYd4nmTuuwMFzHL6W+UWR5fNERGZeVauho8mrJDUSXdNDbao4rbrUwhuLgKC/j8VCS5+34Ria8CsTDuBjrIrQA==
@@ -17400,6 +17400,15 @@ react-select@^3.0.4:
     react-input-autosize "^2.2.2"
     react-transition-group "^2.2.1"
 
+react-tagcloud@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/react-tagcloud/-/react-tagcloud-2.1.1.tgz#b8883634f76b5681c91a178689070efa0d442657"
+  integrity sha512-cM96jzUOKQqu2qlzwcO91r239MSDbFiAslFNk4Hja3MaZ4Y89goIzbTyXZwonkeJck1zY5wkNhJYeJ8YSdOwXg==
+  dependencies:
+    prop-types "^15.6.2"
+    randomcolor "^0.5.4"
+    shuffle-array "^1.0.1"
+
 react-transition-group@^2.2.0:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.2.1.tgz#e9fb677b79e6455fd391b03823afe84849df4a10"
@@ -18906,6 +18915,11 @@ should@^13.2.1:
     should-type-adaptors "^1.0.1"
     should-util "^1.0.0"
 
+shuffle-array@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/shuffle-array/-/shuffle-array-1.0.1.tgz#c4ff3cfe74d16f93730592301b25e6577b12898b"
+  integrity sha1-xP88/nTRb5NzBZIwGyXmV3sSiYs=
+
 side-channel@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"